Exemple #1
0
        public static Xdf ParseXdf(string filename)
        {
            using (Bwd2Reader br = new Bwd2Reader(filename))
            {
                Xdf xdf = new Xdf();

                br.FindNext("WDFC");


                return(xdf);
            }
        }
Exemple #2
0
        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);
                }
            }
        }
Exemple #3
0
        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);
                }
            }
        }