mysimulation/server/tso.files/Formats/IFF/Chunks/NGBH.cs

118 lines
3.7 KiB
C#
Raw Permalink Normal View History

using FSO.Files.Utils;
using System.Collections.Generic;
using System.IO;
namespace FSO.Files.Formats.IFF.Chunks
{
/// <summary>
/// This chunk type contains general neighbourhood data within a neighbourhood.iff file.
/// The only thing this was used for initially was tracking the tutorial.
///
/// As of hot date, it also includes inventory data, which was added as something of an afterthought.
/// </summary>
public class NGBH : IffChunk
{
public short[] NeighborhoodData = new short[16];
public Dictionary<short, List<InventoryItem>> InventoryByID = new Dictionary<short, List<InventoryItem>>();
public uint Version;
/// <summary>
/// Reads a NGBH chunk from a stream.
/// </summary>
/// <param name="iff">An Iff instance.</param>
/// <param name="stream">A Stream object holding a OBJf chunk.</param>
public override void Read(IffFile iff, Stream stream)
{
using (var io = IoBuffer.FromStream(stream, ByteOrder.LITTLE_ENDIAN))
{
io.ReadUInt32(); //pad
Version = io.ReadUInt32(); //0x49 for latest game
string magic = io.ReadCString(4); //HBGN
for (int i=0; i<16; i++)
{
NeighborhoodData[i] = io.ReadInt16();
}
if (!io.HasMore) return; //no inventory present (yet)
var count = io.ReadInt32();
for (int i = 0; i < count; i++)
{
if (io.ReadInt32() != 1) { }
var neighID = io.ReadInt16();
var inventoryCount = io.ReadInt32();
var inventory = new List<InventoryItem>();
for (int j=0; j<inventoryCount; j++)
{
inventory.Add(new InventoryItem(io));
}
InventoryByID[neighID] = inventory;
}
}
}
public override bool Write(IffFile iff, Stream stream)
{
using (var io = IoWriter.FromStream(stream, ByteOrder.LITTLE_ENDIAN))
{
io.WriteInt32(0);
io.WriteInt32(0x49);
io.WriteCString("HBGN", 4);
for (int i=0; i<NeighborhoodData.Length; i++)
{
io.WriteInt16(NeighborhoodData[i]);
}
io.WriteInt32(InventoryByID.Count);
foreach (var item in InventoryByID)
{
io.WriteInt32(1);
io.WriteInt16(item.Key);
io.WriteInt32(item.Value.Count);
foreach (var invent in item.Value)
{
invent.SerializeInto(io);
}
}
}
return true;
}
}
public class InventoryItem
{
public int Type;
public uint GUID;
public ushort Count;
public InventoryItem() { }
public InventoryItem(IoBuffer io)
{
Type = io.ReadInt32();
GUID = io.ReadUInt32();
Count = io.ReadUInt16();
}
public void SerializeInto(IoWriter io)
{
io.WriteInt32(Type);
io.WriteUInt32(GUID);
io.WriteUInt16(Count);
}
public InventoryItem Clone()
{
return new InventoryItem() { Type = Type, GUID = GUID, Count = Count };
}
public override string ToString()
{
return "Type: "+Type+", GUID: "+GUID+", Count: "+Count;
}
}
}