/// <summary> /// Removes all light objects. /// </summary> public void Clear() { WaterPlanes.Clear(); Objects.Clear(); NPCs.Clear(); Buildings.Clear(); Sounds.Clear(); Effects.Clear(); Animations.Clear(); MonsterSpawns.Clear(); WarpPoints.Clear(); CollisionObjects.Clear(); EventObjects.Clear(); }
/// <summary> /// Adds a region to the appropriate list for its type; returns the region. /// </summary> public Region Add(Region region) { switch (region) { case Region.InvasionPoint r: InvasionPoints.Add(r); break; case Region.EnvironmentMapPoint r: EnvironmentMapPoints.Add(r); break; case Region.Sound r: Sounds.Add(r); break; case Region.SFX r: SFX.Add(r); break; case Region.WindSFX r: WindSFX.Add(r); break; case Region.SpawnPoint r: SpawnPoints.Add(r); break; case Region.Message r: Messages.Add(r); break; case Region.PatrolRoute r: PatrolRoutes.Add(r); break; case Region.MovementPoint r: MovementPoints.Add(r); break; case Region.WarpPoint r: WarpPoints.Add(r); break; case Region.ActivationArea r: ActivationAreas.Add(r); break; case Region.Event r: Events.Add(r); break; case Region.Logic r: Logic.Add(r); break; case Region.EnvironmentMapEffectBox r: EnvironmentMapEffectBoxes.Add(r); break; case Region.WindArea r: WindAreas.Add(r); break; case Region.MufflingBox r: MufflingBoxes.Add(r); break; case Region.MufflingPortal r: MufflingPortals.Add(r); break; case Region.Other r: Others.Add(r); break; default: throw new ArgumentException($"Unrecognized type {region.GetType()}.", nameof(region)); } return(region); }
internal override Region ReadEntry(BinaryReaderEx br) { RegionType type = br.GetEnum32 <RegionType>(br.Position + 8); switch (type) { case RegionType.InvasionPoint: return(InvasionPoints.EchoAdd(new Region.InvasionPoint(br))); case RegionType.EnvironmentMapPoint: return(EnvironmentMapPoints.EchoAdd(new Region.EnvironmentMapPoint(br))); case RegionType.Sound: return(Sounds.EchoAdd(new Region.Sound(br))); case RegionType.SFX: return(SFX.EchoAdd(new Region.SFX(br))); case RegionType.WindSFX: return(WindSFX.EchoAdd(new Region.WindSFX(br))); case RegionType.SpawnPoint: return(SpawnPoints.EchoAdd(new Region.SpawnPoint(br))); case RegionType.Message: return(Messages.EchoAdd(new Region.Message(br))); case RegionType.PatrolRoute: return(PatrolRoutes.EchoAdd(new Region.PatrolRoute(br))); case RegionType.MovementPoint: return(MovementPoints.EchoAdd(new Region.MovementPoint(br))); case RegionType.WarpPoint: return(WarpPoints.EchoAdd(new Region.WarpPoint(br))); case RegionType.ActivationArea: return(ActivationAreas.EchoAdd(new Region.ActivationArea(br))); case RegionType.Event: return(Events.EchoAdd(new Region.Event(br))); case RegionType.Logic: return(Logic.EchoAdd(new Region.Logic(br))); case RegionType.EnvironmentMapEffectBox: return(EnvironmentMapEffectBoxes.EchoAdd(new Region.EnvironmentMapEffectBox(br))); case RegionType.WindArea: return(WindAreas.EchoAdd(new Region.WindArea(br))); case RegionType.MufflingBox: return(MufflingBoxes.EchoAdd(new Region.MufflingBox(br))); case RegionType.MufflingPortal: return(MufflingPortals.EchoAdd(new Region.MufflingPortal(br))); case RegionType.Other: return(Others.EchoAdd(new Region.Other(br))); default: throw new NotImplementedException($"Unsupported region type: {type}"); } }
internal override Region ReadEntry(BinaryReaderEx br) { RegionType type = br.GetEnum32 <RegionType>(br.Position + 8); switch (type) { case RegionType.Region0: var region0 = new Region.Region0(br); Region0s.Add(region0); return(region0); case RegionType.InvasionPoint: var invasionPoint = new Region.InvasionPoint(br); InvasionPoints.Add(invasionPoint); return(invasionPoint); case RegionType.EnvironmentMapPoint: var environmentMapPoint = new Region.EnvironmentMapPoint(br); EnvironmentMapPoints.Add(environmentMapPoint); return(environmentMapPoint); case RegionType.Sound: var sound = new Region.Sound(br); Sounds.Add(sound); return(sound); case RegionType.SFX: var sfx = new Region.SFX(br); SFXs.Add(sfx); return(sfx); case RegionType.WindSFX: var windSFX = new Region.WindSFX(br); WindSFXs.Add(windSFX); return(windSFX); case RegionType.SpawnPoint: var spawnPoint = new Region.SpawnPoint(br); SpawnPoints.Add(spawnPoint); return(spawnPoint); case RegionType.WalkRoute: var walkRoute = new Region.WalkRoute(br); WalkRoutes.Add(walkRoute); return(walkRoute); case RegionType.WarpPoint: var warpPoint = new Region.WarpPoint(br); WarpPoints.Add(warpPoint); return(warpPoint); case RegionType.ActivationArea: var activationArea = new Region.ActivationArea(br); ActivationAreas.Add(activationArea); return(activationArea); case RegionType.Event: var evt = new Region.Event(br); Events.Add(evt); return(evt); case RegionType.EnvironmentMapEffectBox: var environmentMapEffectBox = new Region.EnvironmentMapEffectBox(br); EnvironmentMapEffectBoxes.Add(environmentMapEffectBox); return(environmentMapEffectBox); case RegionType.WindArea: var windArea = new Region.WindArea(br); WindAreas.Add(windArea); return(windArea); case RegionType.MufflingBox: var mufflingBox = new Region.MufflingBox(br); MufflingBoxes.Add(mufflingBox); return(mufflingBox); case RegionType.MufflingPortal: var mufflingPortal = new Region.MufflingPortal(br); MufflingPortals.Add(mufflingPortal); return(mufflingPortal); case RegionType.Region23: var region23 = new Region.Region23(br); Region23s.Add(region23); return(region23); case RegionType.Region24: var region24 = new Region.Region24(br); Region24s.Add(region24); return(region24); case RegionType.PartsGroup: var partsGroup = new Region.PartsGroup(br); PartsGroups.Add(partsGroup); return(partsGroup); case RegionType.AutoDrawGroup: var autoDrawGroup = new Region.AutoDrawGroup(br); AutoDrawGroups.Add(autoDrawGroup); return(autoDrawGroup); case RegionType.Other: var other = new Region.Other(br); Others.Add(other); return(other); default: throw new NotImplementedException($"Unimplemented region type: {type}"); } }
/// <summary> /// Saves the file to the specified stream. /// </summary> /// <param name="stream">The stream to save to.</param> public override void Save(Stream stream) { BinaryWriter writer = new BinaryWriter(stream, Encoding.GetEncoding("EUC-KR")); writer.Write(BLOCK_COUNT); for (int i = 0; i < BLOCK_COUNT; i++) { writer.Write(0); writer.Write(0); } long[] offsets = new long[BLOCK_COUNT]; offsets[0] = stream.Position; writer.Write(MapPosition.X); writer.Write(MapPosition.Y); writer.Write(ZonePosition.X); writer.Write(ZonePosition.Y); writer.Write(World); writer.Write(Name); offsets[1] = stream.Position; writer.Write(Objects.Count); Objects.ForEach(@object => { @object.Write(writer); }); offsets[2] = stream.Position; writer.Write(NPCs.Count); NPCs.ForEach(npc => { npc.Write(writer); }); offsets[3] = stream.Position; writer.Write(Buildings.Count); Buildings.ForEach(building => { building.Write(writer); }); offsets[4] = stream.Position; writer.Write(Sounds.Count); Sounds.ForEach(sound => { sound.Write(writer); }); offsets[5] = stream.Position; writer.Write(Effects.Count); Effects.ForEach(effect => { effect.Write(writer); }); offsets[6] = stream.Position; writer.Write(Animations.Count); Animations.ForEach(animation => { animation.Write(writer); }); offsets[7] = stream.Position; WaterPatches.Write(writer); offsets[8] = stream.Position; writer.Write(MonsterSpawns.Count); MonsterSpawns.ForEach(monsterSpawn => { monsterSpawn.Write(writer); }); offsets[9] = stream.Position; writer.Write(WaterSize); writer.Write(WaterPlanes.Count); WaterPlanes.ForEach(waterPlane => { waterPlane.Write(writer); }); offsets[10] = stream.Position; writer.Write(WarpPoints.Count); WarpPoints.ForEach(warpPoint => { warpPoint.Write(writer); }); offsets[11] = stream.Position; writer.Write(CollisionObjects.Count); CollisionObjects.ForEach(collisionObject => { collisionObject.Write(writer); }); offsets[12] = stream.Position; writer.Write(EventObjects.Count); EventObjects.ForEach(eventObject => { eventObject.Write(writer); }); stream.Seek(4, SeekOrigin.Begin); for (int i = 0; i < BLOCK_COUNT; i++) { writer.Write(i); writer.Write((int)offsets[i]); } }
/// <summary> /// Loads the file from the specified stream. /// </summary> /// <param name="stream">The stream to read from.</param> public override void Load(Stream stream) { BinaryReader reader = new BinaryReader(stream, Encoding.GetEncoding("EUC-KR")); int blockCount = reader.ReadInt32(); for (int i = 0; i < blockCount; i++) { MapBlockType type = (MapBlockType)reader.ReadInt32(); if (!Enum.IsDefined(typeof(MapBlockType), type)) { throw new InvalidMapBlockTypeException((int)type); } int offset = reader.ReadInt32(); long nextBlock = stream.Position; stream.Seek(offset, SeekOrigin.Begin); if (type == MapBlockType.MapInformation) { MapPosition = new IntVector2(reader.ReadInt32(), reader.ReadInt32()); ZonePosition = new IntVector2(reader.ReadInt32(), reader.ReadInt32()); World = reader.ReadMatrix(); Name = reader.ReadString(); } else if (type == MapBlockType.WaterPatch) { WaterPatches = new MapWaterPatches(); WaterPatches.Read(reader); } else { if (type == MapBlockType.WaterPlane) { WaterSize = reader.ReadSingle(); } int entryCount = reader.ReadInt32(); Type classType = type.GetAttributeValue <MapBlockTypeAttribute, Type>(x => x.Type); for (int j = 0; j < entryCount; j++) { IMapBlock block = (IMapBlock)Activator.CreateInstance(classType); block.Read(reader); switch (type) { case MapBlockType.Object: Objects.Add((MapObject)block); break; case MapBlockType.NPC: NPCs.Add((MapNPC)block); break; case MapBlockType.Building: Buildings.Add((MapBuilding)block); break; case MapBlockType.Sound: Sounds.Add((MapSound)block); break; case MapBlockType.Effect: Effects.Add((MapEffect)block); break; case MapBlockType.Animation: Animations.Add((MapAnimation)block); break; case MapBlockType.MonsterSpawn: MonsterSpawns.Add((MapMonsterSpawn)block); break; case MapBlockType.WaterPlane: WaterPlanes.Add((MapWaterPlane)block); break; case MapBlockType.WarpPoint: WarpPoints.Add((MapWarpPoint)block); break; case MapBlockType.CollisionObject: CollisionObjects.Add((MapCollisionObject)block); break; case MapBlockType.EventObject: EventObjects.Add((MapEventObject)block); break; } } } if (i < blockCount - 1) { stream.Seek(nextBlock, SeekOrigin.Begin); } } }