private void ReadEvents(BinaryReader reader) { mapObject.Events = new List <MapEvent>(); uint numberOfEvents = reader.ReadUInt32(); for (int yyoo = 0; yyoo < numberOfEvents; ++yyoo) { MapEvent mEvent = new MapEvent(); mEvent.Name = reader.ReadStringWithLength(); mEvent.Message = reader.ReadStringWithLength(); mEvent.Resources = MapObjectReader.ReadResources(reader); mEvent.Players = reader.ReadByte(); if (mapObject.Header.Version > EMapFormat.AB) { mEvent.HumanAffected = reader.ReadByte(); } else { mEvent.HumanAffected = 0xff; } mEvent.ComputerAffected = reader.ReadByte(); mEvent.FirstOccurence = reader.ReadUInt16(); mEvent.NextOccurence = reader.ReadByte(); reader.Skip(17); Console.WriteLine(string.Format("Map Event: {0} Name={1} Message={2}", yyoo, mEvent.Name, mEvent.Message)); mapObject.Events.Add(mEvent); } }
private void ReadObjects(BinaryReader reader) { int objectCount = (int)reader.ReadUInt32(); Console.WriteLine(string.Format("Totally {0} objects.", objectCount)); this.mapObject.Objects = new List <CGObject>(objectCount); for (int ww = 0; ww < objectCount; ww++) { int objectId = this.mapObject.Objects.Count(); /* * if (objectId >= 2351) * { * for (int i = 0; i < 20; i++) * { * byte[] data = reader.ReadBytes(10); * Console.WriteLine(StringUtils.ByteArrayToString(data)); * } * * reader.BaseStream.Seek(-200, SeekOrigin.Current); * } */ MapPosition objectPosition = reader.ReadPosition(); int objectTemplateIndex = (int)reader.ReadUInt32(); ObjectTemplate objTemplate = mapObject.ObjectTemplates[objectTemplateIndex]; reader.Skip(5); MapObjectReader objectReader = MapObjectReaderFactory.GetObjectReader(objTemplate.Type); CGObject resultObject = null; if (objectReader != null) { objectReader.Map = this.mapObject; objectReader.MapHeader = this.mapObject.Header; objectReader.ObjectTemplate = objTemplate; resultObject = objectReader.ReadObject(reader, objectId, objectPosition); if (resultObject == null) { continue; } } else { // Normal Object, load from JSON resultObject = new CGObject(); } resultObject.Position = objectPosition; resultObject.Identifier = (uint)objectId; resultObject.Template = objTemplate; if (resultObject.Template.Type != EObjectType.HERO && resultObject.Template.Type != EObjectType.HERO_PLACEHOLDER && resultObject.Template.Type != EObjectType.PRISON) { resultObject.SubId = resultObject.Template.SubId; } resultObject.InstanceName = string.Format("{0}_{1}", resultObject.Identifier, resultObject.Template.Type); //// Console.WriteLine(string.Format(@"Readed object {0}, Position: [{1}, {2}, {3}]", resultObject.InstanceName, objectPosition.PosX, objectPosition.PosY, objectPosition.Level)); mapObject.Objects.Add(resultObject); } }
public static MapObjectReader GetObjectReader(EObjectType objectType) { MapObjectReader readerObject = null; switch (objectType) { case EObjectType.EVENT: return(new CGEventReader()); case EObjectType.HERO: case EObjectType.RANDOM_HERO: case EObjectType.PRISON: return(new CGHeroReader()); case EObjectType.MONSTER: //Monster case EObjectType.RANDOM_MONSTER: case EObjectType.RANDOM_MONSTER_L1: case EObjectType.RANDOM_MONSTER_L2: case EObjectType.RANDOM_MONSTER_L3: case EObjectType.RANDOM_MONSTER_L4: case EObjectType.RANDOM_MONSTER_L5: case EObjectType.RANDOM_MONSTER_L6: case EObjectType.RANDOM_MONSTER_L7: return(new CGCreatureReader()); case EObjectType.OCEAN_BOTTLE: case EObjectType.SIGN: return(new CGSignBottleReader()); case EObjectType.SEER_HUT: return(new CGSeerHutReader()); case EObjectType.WITCH_HUT: return(new CGWitchHutReader()); case EObjectType.SCHOLAR: return(new CGScholarReader()); case EObjectType.GARRISON: case EObjectType.GARRISON2: return(new CGGarrisonReader()); case EObjectType.ARTIFACT: case EObjectType.RANDOM_ART: case EObjectType.RANDOM_TREASURE_ART: case EObjectType.RANDOM_MINOR_ART: case EObjectType.RANDOM_MAJOR_ART: case EObjectType.RANDOM_RELIC_ART: case EObjectType.SPELL_SCROLL: return(new CGArtifactReader()); case EObjectType.RANDOM_RESOURCE: case EObjectType.RESOURCE: return(new CGResourceReader()); case EObjectType.RANDOM_TOWN: case EObjectType.TOWN: return(new CGTownReader()); case EObjectType.MINE: case EObjectType.ABANDONED_MINE: return(new CGMineReader()); case EObjectType.CREATURE_GENERATOR1: case EObjectType.CREATURE_GENERATOR2: case EObjectType.CREATURE_GENERATOR3: case EObjectType.CREATURE_GENERATOR4: return(new CGDwellingSimpleReader()); case EObjectType.SHRINE_OF_MAGIC_GESTURE: case EObjectType.SHRINE_OF_MAGIC_INCANTATION: case EObjectType.SHRINE_OF_MAGIC_THOUGHT: return(new CGShrineReader()); case EObjectType.PANDORAS_BOX: return(new CGPandoraBoxReader()); case EObjectType.GRAIL: return(new CGGrailReader()); case EObjectType.RANDOM_DWELLING: case EObjectType.RANDOM_DWELLING_FACTION: case EObjectType.RANDOM_DWELLING_LVL: return(new CGDwellingReader()); case EObjectType.QUEST_GUARD: return(new CGQuestGuardReader()); case EObjectType.SHIPYARD: return(new CGShipyardReader()); case EObjectType.HERO_PLACEHOLDER: return(new CGHeroPlaceholderReader()); case EObjectType.BORDERGUARD: return(new CGBorderGuardReader()); case EObjectType.BORDER_GATE: return(new CGBorderGateReader()); case EObjectType.PYRAMID: return(new CGPyramidReader()); case EObjectType.LIGHTHOUSE: return(new CGLightHouseReader()); default: break; } return(readerObject); }