Beispiel #1
0
        public TrifanSet ParseTrifanSet(bool doTaggedRecord, uint trifanCount, TrifanType triType, int?dungeonUnk3)
        {
            TrifanSet set = new TrifanSet();

            // trifan count & data
            set.TrifanCount = trifanCount;
            set.TrifanData  = new TrifanInfo[set.TrifanCount];

            //int hasFlagFourCount = 0; // amount of trifans with flag bit 0x04 set
            for (int i = 0; i < set.TrifanCount; i++)
            {
                set.TrifanData[i] = ParseTrifanInfo();
                //if ((set.TrifanData[i].Flags & 0x04) == 0x04)
                //{
                //    hasFlagFourCount++;
                //}
            }

            if (m_sourceFile.Position % 4 != 0)
            {
                //Debugger.Break();
            }

            if (m_sourceFile.DatType != DatType.Portal_ToD)
            {
                m_sourceFile.AlignToDwordBoundary();
            }

            if (dungeonUnk3.HasValue)
            {
                int skipCount = dungeonUnk3.Value * sizeof(UInt16);
                m_sourceFile.Skip(skipCount);
                m_sourceFile.AlignToDwordBoundary();
            }

            //ushort[] UnkShorts = new ushort[hasFlagFourCount];
            //if (hasFlagFourCount > 0)
            //{
            //    for (int i = 0; i < UnkShorts.Length; i++)
            //    {
            //        UnkShorts[i] = m_sourceFile.ReadUInt16();
            //    }
            //}
            //else
            //{
            //    uint unkUint32 = m_sourceFile.ReadUInt32();      // should be 0x00
            //    if (unkUint32 != 0x00)
            //    {
            //        Debugger.Break();
            //    }
            //}


            if (doTaggedRecord)
            {
                set.BP = ParseTaggedRecord(triType);
            }
            return(set);
        }
Beispiel #2
0
 public TrifanSet ParseTrifanSet(bool doTaggedRecord, uint trifanCount, TrifanType triType)
 {
     return(ParseTrifanSet(doTaggedRecord, trifanCount, triType, null));
 }
Beispiel #3
0
        // node list:
        //
        // 0x4250464C   BPFL
        // 0x4250494E   BPIN
        // 0x4250496E   BPIn
        // 0x42504F4C   BPOL
        // 0x42506E4E   BPnN
        // 0x42506E6E   BPnn
        // 0x4270494E   BpIN
        // 0x4270496E   BpIn
        // 0x4C454146   LEAF
        // 0x504f5254   PORT

        public BP ParseTaggedRecord(TrifanType triType)
        {
            int num;
            //depth++;
            uint bpType = m_sourceFile.ReadUInt32();

            switch (bpType)
            {
            case 0x42506e4e:
            case 0x4250494e:
                m_sourceFile.Skip(16);
                ParseTaggedRecord(triType);
                ParseTaggedRecord(triType);
                break;

            case 0x42506e6e:
            case 0x4250496e:
            case 0x4270494e:
            case 0x42706e4e:
                m_sourceFile.Skip(16);
                ParseTaggedRecord(triType);
                break;

            case 0x4c454146:
                uint unkFlag = m_sourceFile.ReadUInt32();
                if (triType != TrifanType.T1)
                {
                    return(null);
                }
                m_sourceFile.Skip(20);
                num = m_sourceFile.ReadInt32();
                m_sourceFile.Skip(num * 2);

                if (m_sourceFile.DatType == DatType.Portal_ToD)
                {
                    //if (unkFlag == 0x01)
                    //{
                    //    m_sourceFile.Skip(4 * sizeof(uint));
                    //}
                }
                else
                {
                    m_sourceFile.AlignToDwordBoundary();
                }
                return(null);

            case 0x504f5254:
            {
                m_sourceFile.Skip(16);
                ParseTaggedRecord(triType);
                ParseTaggedRecord(triType);
                //if ((triType == TrifanType.T1) || (triType == TrifanType.T2))
                {
                    m_sourceFile.Skip(16);
                }
                num = m_sourceFile.ReadInt32();
                int num2 = m_sourceFile.ReadInt32();
                m_sourceFile.Skip((num * 2) + (num2 * 4));
                m_sourceFile.AlignToDwordBoundary();
                return(null);
            }

            case 0x42504f4c:
            case 0x4270496e:
            case 0x4250464c:
            {
                m_sourceFile.Skip(16);
                break;
            }

            default:
            {
                m_sourceFile.Skip(16);
                break;
            }
            }
            if ((triType == TrifanType.T0) || (triType == TrifanType.T1))
            {
                m_sourceFile.Skip(16);
            }
            if (triType == TrifanType.T0)
            {
                num = m_sourceFile.ReadInt32();
                m_sourceFile.Skip(num * 2);
            }
            if (m_sourceFile.DatType != DatType.Portal_ToD)
            {
                m_sourceFile.AlignToDwordBoundary();
            }
            return(null);
        }