public override CGObject ReadObject(BinaryReader reader, int objectId, MapPosition objectPosition) { CGGarrison garrison = new CGGarrison(); EPlayerColor color = (EPlayerColor)reader.ReadByte(); garrison.SetOwner(color); reader.Skip(3); CreatureSet creatureSet = ReadCreatureSet(reader, 7); if (MapHeader.Version > EMapFormat.ROE) { garrison.RemovableUnits = reader.ReadBoolean(); } else { garrison.RemovableUnits = true; } reader.Skip(8); return(garrison); }
protected CreatureSet ReadCreatureSet(BinaryReader reader, int numberToRead) { bool isHighVersion = this.MapHeader.Version > EMapFormat.ROE; int maxID = isHighVersion ? 0xffff : 0xff; CreatureSet creatureSet = new CreatureSet(); for (int ir = 0; ir < numberToRead; ++ir) { ECreatureId creatureId; if (isHighVersion) { creatureId = (ECreatureId)(reader.ReadUInt16()); } else { creatureId = (ECreatureId)(reader.ReadByte()); } int amount = reader.ReadUInt16(); // Empty slot if ((int)creatureId == maxID) { continue; } // Create StackInstance //auto hlp = new CStackInstance(); // hlp->count = count; if ((int)creatureId > maxID - 0xf) { //this will happen when random object has random army //hlp->idRand = maxID - (int)creatureId - 1; } else { //hlp->setType((int)creatureId); } // out->putStack(SlotID(ir), hlp); } //out->validTypes(true); return(creatureSet); }