/// <summary> /// Constructs a new UnitObject. /// </summary> /// <param name="reader">The SaveReader to read from.</param> /// <param name="entry">The object entry data.</param> internal UnitObject(Liberty.SaveIO.SaveReader reader, ObjectEntry entry) : base(reader, entry) { _roWeapons = _weapons.AsReadOnly(); }
/// <summary> /// Constructs a new VehicleObject. /// </summary> /// <param name="reader">The SaveReader to read from.</param> /// <param name="entry">The object entry data.</param> internal VehicleObject(Liberty.SaveIO.SaveReader reader, ObjectEntry entry) : base(reader, entry) { }
/// <summary> /// Reads the data stored in the file header and some of the chunk data. /// </summary> /// <exception cref="ArgumentException">Thrown if the file format is invalid.</exception> /// <seealso cref="Verify"/> /// <seealso cref="ReadObjects"/> private void Process(Stream stream) { Liberty.SaveIO.SaveReader reader = new Liberty.SaveIO.SaveReader(stream); // Map name reader.Seek(8, SeekOrigin.Begin); _mapName = reader.ReadAscii(); // Difficulty reader.Seek(0xFAFF, SeekOrigin.Begin); _difficulty = (Difficulty)reader.ReadByte(); // Skulls reader.Seek(0xFB0C, SeekOrigin.Begin); _skulls = (Skulls)reader.ReadUInt32(); // Gamertag reader.Seek(0x1D668, SeekOrigin.Begin); _gamertag = reader.ReadUTF16(); // Service tag reader.Seek(0x1D6AC, SeekOrigin.Begin); _serviceTag = reader.ReadUTF16(); // Gravity reader.Seek(0x68EBF4, SeekOrigin.Begin); _gravity = reader.ReadFloat(); // Target locator ammo reader.Seek(0x915E1A, SeekOrigin.Begin); _targetLocatorAmmo = reader.ReadInt16(); // Message reader.Seek(0x9DF9E0, SeekOrigin.Begin); _checkpointMsg = reader.ReadUTF16(); // Read objects Chunk objectChunk = new Chunk(reader, ChunkOffset.Object); if (objectChunk.Name != "object") { throw new ArgumentException("The file format is invalid: the \"object\" chunk is missing or is at the wrong offset"); } ReadObjects(reader, objectChunk); // Read players Chunk playersChunk = new Chunk(reader, ChunkOffset.Players); if (playersChunk.Name != "players") { throw new ArgumentException("The file format is invalid: the \"players\" chunk is missing or is at the wrong offset"); } ReadPlayers(reader, playersChunk); // Read squads Chunk squadChunk = new Chunk(reader, ChunkOffset.Squad); if (squadChunk.Name != "squad") { throw new ArgumentException("The file format is invalid: the \"squad\" chunk is missing or is at the wrong offset"); } ReadSquads(reader, squadChunk); // Read actors Chunk actorChunk = new Chunk(reader, ChunkOffset.Actor); if (actorChunk.Name != "actor") { throw new ArgumentException("The file format is invalid: the \"actor\" chunk is missing or is at the wrong offset"); } ReadActors(reader, actorChunk); // Resolve actor references foreach (GameObject obj in _objects) { UnitObject unit = obj as UnitObject; if (unit != null) { unit.ResolveActor(_actors); } } }
/// <summary> /// Constructs a new WeaponObject. /// </summary> /// <param name="reader">The SaveReader to read from.</param> /// <param name="entry">The object entry data.</param> internal WeaponObject(Liberty.SaveIO.SaveReader reader, ObjectEntry entry) : base(reader, entry) { }
/// <summary> /// Constructs a new EquipmentObject. /// </summary> /// <param name="reader">The SaveReader to read from.</param> /// <param name="entry">The object entry data.</param> internal EquipmentObject(Liberty.SaveIO.SaveReader reader, ObjectEntry entry) : base(reader, entry) { }