예제 #1
0
        public override void Parse(VoidPtr address)
        {
            //Get header values
            sDataMisc *hdr = (sDataMisc *)address;

            misc = *hdr;

            //Parse all misc entries.
            //If an offset is 0, the entry will be set to null.
            _unknown1       = Parse <EntryList <IndexValue> >(misc[0], 4);
            _finalSmashAura = Parse <EntryList <MiscFinalSmashAura> >(misc[1], 0x14, misc[2]);
            _hurtBoxes      = Parse <EntryList <MiscHurtBox> >(misc[3], 0x20, misc[4]);
            _ledgeGrabs     = Parse <EntryList <MiscLedgeGrab> >(misc[5], 0x10, misc[6]);
            _unknown7       = Parse <EntryList <MiscUnknown7Entry> >(misc[7], 0x20, misc[8]);
            _boneRefs       = Parse <EntryList <BoneIndexValue> >(misc[9], 4, 10);
            _unknown10      = Parse <MiscUnknown10>(misc[10]);
            _soundData      = Parse <MiscSoundData>(misc[11]);
            _unkSection5    = Parse <MiscUnknown12>(misc[12]);
            _multiJump      = Parse <MiscMultiJump>(misc[13]);
            _glide          = Parse <MiscGlide>(misc[14]);
            _crawl          = Parse <MiscCrawl>(misc[15]);
            _collisionData  = Parse <CollisionData>(misc[16]);
            _tether         = Parse <MiscTether>(misc[17]);
            _unknown18      = Parse <EntryListOffset <IndexValue> >(misc[18], 4);
        }
        public override void Build(VoidPtr address)
        {
            dataHeader = (DataHeader *)(address + _data._childLength);

            //Action arrays are at the start of part 3
            actionArrays[0] = (bint *)(address + _lengths[0] + _lengths[1]);
            actionArrays[1] = actionArrays[0] + _moveset._actions.Count;

            //Subaction arrays are at the start of part 4
            subActionArrays[0] = (bint *)(address + (_lengths[0] + _lengths[1] + _lengths[2]));
            subActionArrays[1] = (bint *)(subActionArrays[0] + _data._subActions.Count);
            subActionArrays[2] = (bint *)(subActionArrays[1] + _data._subActions.Count);
            subActionArrays[3] = (bint *)(subActionArrays[2] + _data._subActions.Count);

            //Misc is right before the data header
            miscHeader = (sDataMisc *)(address + (_data._childLength - sDataMisc.Size));

            dataHeader->MiscSectionOffset   = Offset(miscHeader);
            dataHeader->SubactionMainStart  = Offset(subActionArrays[0]);
            dataHeader->SubactionGFXStart   = Offset(subActionArrays[1]);
            dataHeader->SubactionSFXStart   = Offset(subActionArrays[2]);
            dataHeader->SubactionOtherStart = Offset(subActionArrays[3]);
            dataHeader->EntryActionsStart   = Offset(actionArrays[0]);
            dataHeader->ExitActionsStart    = Offset(actionArrays[1]);

            base.Build(address);

            dataHeader->Unknown27 = _data.Unknown27;
            dataHeader->Unknown28 = _data.Unknown28;
            dataHeader->Flags1    = _data.Flags1uint;
            dataHeader->Flags2    = _data.Flags2int;

            List <VoidPtr> lookup = _extraDataOffsets.Write(_data, (VoidPtr)dataHeader + DataHeader.Size);

#if DEBUG
            foreach (VoidPtr addr in lookup)
            {
                if ((int)addr < (int)_baseAddress)
                {
                    throw new Exception("Offset value set in lookup, not the address of the offset value.");
                }
            }
#endif

            _lookupAddresses.AddRange(lookup);
        }