mirror of
https://github.com/simtactics/mysimulation.git
synced 2025-03-20 08:41:21 +00:00
138 lines
5.1 KiB
C#
Executable file
138 lines
5.1 KiB
C#
Executable file
using FSO.Files.Utils;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
|
|
namespace FSO.Files.Formats.IFF.Chunks
|
|
{
|
|
public class OBJM : IffChunk
|
|
{
|
|
//work in progress
|
|
|
|
//data body starts with 0x01, but what is after that is unknown.
|
|
|
|
//empty body from house 0:
|
|
// 01 00 00 00 | 00 00 00
|
|
//
|
|
|
|
public ushort[] IDToOBJT;
|
|
|
|
public Dictionary<int, MappedObject> ObjectData;
|
|
|
|
public override void Read(IffFile iff, Stream stream)
|
|
{
|
|
using (var io = IoBuffer.FromStream(stream, ByteOrder.LITTLE_ENDIAN))
|
|
{
|
|
io.ReadUInt32(); //pad
|
|
var version = io.ReadUInt32();
|
|
|
|
//house 00: 33 00 00 00
|
|
//house 03: 3E 00 00 00
|
|
//house 79: 45 00 00 00
|
|
//completec:49 00 00 00
|
|
//corresponds to house version?
|
|
|
|
var MjbO = io.ReadUInt32();
|
|
|
|
var compressionCode = io.ReadByte();
|
|
if (compressionCode != 1) throw new Exception("hey what!!");
|
|
|
|
var iop = new IffFieldEncode(io);
|
|
|
|
/*
|
|
var test1 = iop.ReadInt16();
|
|
var testas = new ushort[test1*2];
|
|
for (int i=0; i<test1*2; i++)
|
|
{
|
|
testas[i] = iop.ReadUInt16();
|
|
}*/
|
|
|
|
var table = new List<ushort>();
|
|
while (io.HasMore)
|
|
{
|
|
var value = iop.ReadUInt16();
|
|
if (value == 0) break;
|
|
table.Add(value);
|
|
}
|
|
IDToOBJT = table.ToArray();
|
|
|
|
var list = new List<short>();
|
|
while (io.HasMore)
|
|
{
|
|
list.Add(iop.ReadInt16());
|
|
}
|
|
|
|
var offsets = SearchForObjectData(list);
|
|
for (int i=1; i<offsets.Count; i++)
|
|
{
|
|
Console.WriteLine(offsets[i] - offsets[i-1]);
|
|
}
|
|
|
|
ObjectData = new Dictionary<int, MappedObject>();
|
|
int lastOff = 0;
|
|
foreach (var off in offsets)
|
|
{
|
|
// 58 behind the object data...
|
|
// [-12, 0, -12, 0, -4, 0, -4, 0, -8, 0, -8, 0, 0, 210, 0, 0, 0, 0, 146, 0, -1, -1, 0, 0, 164, 13, 0, 1, 0, 0, 0, 1, 1, 0, 99, 0, 0, 0, 9, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
|
|
// [-12, 0, -12, 0, -4, 0, -4, 0, -8, 0, -8, 0, 0, 210, 0, 0, 0, 0, 146, 0, -1, -1, 0, 0, 197, 13, 0, 1, 0, 0, 0, 1, 1, 0, 79, 0, 4, 2, 9, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
|
|
// [-12, 0, -12, 0, -4, 0, -4, 0, -8, 0, -8, 0, 0, 210, 0, 0, 0, 0, 146, 0, -1, -1, 0, 0, 197, 13, 0, 1, 0, 0, 0, 1, 1, 0, 71, 0, 3, 2, 9, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0]
|
|
// [ 1, 0, 1, 0, 0, 0,256, 0, 48, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 19493, 0, 0, -122, -8, 83, 0, 0, 0, 0, -23174, 0, 0, 0, 0, 0, 0, 196, 0, 2, 0, 0, 0, 0, 0,
|
|
var endOff = off + 72;
|
|
var size = endOff - lastOff;
|
|
var data = list.Skip(lastOff).Take(size).ToArray();
|
|
|
|
var bas = size - 72;
|
|
var objID = data[bas+11]; //object id
|
|
var dir = data[bas + 1];
|
|
var parent = data[bas + 26];
|
|
var containerid = data[bas + 2];
|
|
var containerslot = data[bas + 2];
|
|
|
|
ObjectData[objID] = new MappedObject() { ObjectID = objID, Direction = dir, Data = data, ParentID = parent, ContainerID = containerid, ContainerSlot = containerslot };
|
|
|
|
lastOff = endOff;
|
|
}
|
|
}
|
|
}
|
|
|
|
public class MappedObject {
|
|
public string Name;
|
|
public uint GUID;
|
|
public int ObjectID;
|
|
public int Direction;
|
|
public int ParentID;
|
|
|
|
public int ContainerID;
|
|
public int ContainerSlot;
|
|
|
|
public short[] Data;
|
|
|
|
public int ArryX;
|
|
public int ArryY;
|
|
public int ArryLevel;
|
|
|
|
public override string ToString()
|
|
{
|
|
return Name ?? "(unreferenced)";
|
|
}
|
|
}
|
|
|
|
public List<int> SearchForObjectData(List<short> data)
|
|
{
|
|
//we don't know exactly where the object data is in the format...
|
|
//but we know objects should have a birth date, basically always 1997 or (1997-36) for npcs.
|
|
//this should let us extract some important attributes like the structure of the data and object directions.
|
|
|
|
var offsets = new List<int>();
|
|
for (int i=0; i<data.Count-3; i++)
|
|
{
|
|
if ((data[i] == 1997 || data[i] == 1998 || data[i] == (1997-36)) && (data[i + 1] > 0 && data[i+1] < 13) && (data[i + 2] > 0 && data[i + 2] < 32)) {
|
|
offsets.Add(i - 45);
|
|
}
|
|
}
|
|
|
|
return offsets;
|
|
}
|
|
}
|
|
}
|