public static Xdf ParseXdf(string filename) { using (Bwd2Reader br = new Bwd2Reader(filename)) { Xdf xdf = new Xdf(); br.FindNext("WDFC"); return(xdf); } }
public static void WriteMission(string filename, FSM fsm, string outputFilename) { var tagList = new List <TagChunk>(); using (var msn = new Bwd2Reader(new FileStream(filename, FileMode.Open))) { var current = msn.Current; while (current != null) { var data = new byte[current.DataLength]; msn.BaseStream.Position = current.DataPosition; msn.Read(data, 0, (int)current.DataLength); var tag = new TagChunk { TagName = current.Name, Data = data }; tagList.Add(tag); current = current.Next; } } var adefTag = tagList.SingleOrDefault(x => x.TagName == "ADEF"); if (adefTag == null) { throw new System.Exception("No ADEF tag in mission file"); } var fsmData = CompileFSMData(fsm); adefTag.Data = CompileADEFData(fsmData); using (var bw = new BinaryWriter(new FileStream(outputFilename, FileMode.Create))) { foreach (var tag in tagList) { bw.WriteCString(tag.TagName, 4); bw.Write(tag.Data.Length + 8); bw.Write(tag.Data); } } }
public static FSM ReadMission(string filename) { using (var msn = new Bwd2Reader(new FileStream(filename, FileMode.Open))) { msn.FindNext("ADEF"); using (var adef = new Bwd2Reader(msn)) { adef.FindNext("FSM"); var fsm = new FSM(); fsm.ActionTable = new string[adef.ReadUInt32()]; for (int i = 0; i < fsm.ActionTable.Length; i++) { fsm.ActionTable[i] = adef.ReadCString(40); } var numEntities = adef.ReadUInt32(); fsm.EntityTable = new List <FSMEntity>(); var uniqueValues = new Dictionary <string, int>(); for (int i = 0; i < numEntities; i++) { var label = adef.ReadCString(40); var value = adef.ReadCString(8); var valueIndex = 0; if (uniqueValues.ContainsKey(value)) { valueIndex = uniqueValues[value] + 1; } uniqueValues[value] = valueIndex; var uniqueValue = value + "_" + valueIndex; fsm.EntityTable.Add(new FSMEntity { Label = label, Value = value, UniqueValue = uniqueValue }); } fsm.SoundClipTable = new string[adef.ReadUInt32()]; for (int i = 0; i < fsm.SoundClipTable.Length; i++) { fsm.SoundClipTable[i] = adef.ReadCString(40); } var numPaths = adef.ReadUInt32(); fsm.Paths = new List <FSMPath>(); for (int i = 0; i < numPaths; i++) { var name = adef.ReadCString(40); var nodes = new I76Vector3[adef.ReadUInt32()]; for (int p = 0; p < nodes.Length; p++) { nodes[p] = new I76Vector3(adef.ReadSingle(), adef.ReadSingle(), adef.ReadSingle()); } fsm.Paths.Add(new FSMPath { Name = name, Nodes = nodes }); } fsm.StackMachines = new List <StackMachine>(); var numMachines = adef.ReadUInt32(); for (int i = 0; i < numMachines; i++) { var next = adef.BaseStream.Position + 168; var machine = new StackMachine(); machine.StartAddress = adef.ReadUInt32(); machine.InitialArguments = new int[adef.ReadUInt32()]; for (int j = 0; j < machine.InitialArguments.Length; j++) { machine.InitialArguments[j] = adef.ReadInt32(); } adef.BaseStream.Position = next; fsm.StackMachines.Add(machine); } fsm.Constants = new int[adef.ReadUInt32()]; for (int i = 0; i < fsm.Constants.Length; i++) { fsm.Constants[i] = adef.ReadInt32(); } fsm.ByteCode = new ByteCode[adef.ReadUInt32()]; for (int i = 0; i < fsm.ByteCode.Length; i++) { var byteCode = fsm.ByteCode[i] = new ByteCode(); byteCode.OpCode = (OpCode)adef.ReadUInt32(); byteCode.Value = adef.ReadInt32(); } return(fsm); } } }