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);
}
}
}