Exemple #1
0
        protected override void OnWrite(VoidPtr address)
        {
            int off = 0;

            foreach (Event e in _children)
            {
                off += e.Count * 8;
            }

            sParameter *paramAddr = (sParameter *)address;
            sEvent *    eventAddr = (sEvent *)(address + off);

            RebuildAddress = eventAddr;

            foreach (Event e in _children)
            {
                if (e._name == "FADEF00D" || e._name == "FADE0D8A")
                {
                    continue;
                }

                e.RebuildAddress = eventAddr;
                *eventAddr = new sEvent()
                {
                    _id = e.ID, _nameSpace = e.NameSpace, _numArguments = (byte)e.Count, _unk1 = e._unknown
                };
                if (e.Count > 0)
                {
                    eventAddr->_argumentOffset = (uint)Offset(paramAddr);
                    Lookup(&eventAddr->_argumentOffset);
                }
                else
                {
                    eventAddr->_argumentOffset = 0;
                }
                eventAddr++;
                foreach (Parameter p in e)
                {
                    p.RebuildAddress = paramAddr;
                    if (p.ParamType != ParamType.Offset)
                    {
                        *paramAddr = new sParameter()
                        {
                            _type = (int)p.ParamType, _data = p.Data
                        }
                    }
                    ;
                    else
                    {
                        SakuraiArchiveNode.Builder._postProcessNodes.Add(p);
                    }
                    paramAddr++;
                }
            }

            eventAddr++; //Terminate
        }
Exemple #2
0
        public override void Parse(VoidPtr address)
        {
            _build = true;
            sEvent *ev = (sEvent *)address;

            while (ev->_nameSpace != 0 || ev->_id != 0)
            {
                Event e = Parse <Event>(ev++);
                e._script = this;
                _children.Add(e);
            }
        }
Exemple #3
0
        protected override void OnParse(VoidPtr address)
        {
            sEvent *e = (sEvent *)address;

            _eventOffset = e->_argumentOffset;
            _nameSpace   = e->_nameSpace;
            _id          = e->_id;
            _numArgs     = e->_numArguments;
            _unknown     = e->_unk1;

            _event = ((uint)*(buint *)address) & 0xFFFFFF00;
            _name  = Manager.Events.ContainsKey(_event) ? Manager.Events[_event]._name : Helpers.Hex8(_event);

            if (_name == "FADEF00D" || _name == "FADE0D8A")
            {
                return;
            }

            sParameter *args = (sParameter *)Address((int)e->_argumentOffset);

            for (int i = 0; i < _numArgs; i++)
            {
                sParameter *arg = &args[i];

                Parameter parameter = null;
                ParamType type      = (ParamType)(int)arg->_type;

                //First check for special event parameters
                if ((_event == 0x06000D00 || _event == 0x06150F00 || _event == 0x062B0D00) && i == 12)
                {
                    parameter = Parse <HitboxFlagsNode>(arg);
                }
                else if (((_event == 0x06000D00 || _event == 0x06150F00 || _event == 0x062B0D00) && (i == 0 || i == 3 || i == 4)))
                {
                    parameter = Parse <EventValue2Half>(arg);
                }
                else if (((_event == 0x11150300 || _event == 0x11001000 || _event == 0x11010A00 || _event == 0x11020A00) && i == 0))
                {
                    parameter = Parse <EventValueGFX>(arg);
                }
                else if (i == 14 && _event == 0x06150F00)
                {
                    parameter = Parse <SpecialHitboxFlagsNode>(arg);
                }
                else
                {
                    switch (type)
                    {
                    case ParamType.Scalar:
                        parameter = Parse <EventScalar>(arg);
                        break;

                    case ParamType.Boolean:
                        parameter = Parse <EventBool>(arg);
                        break;

                    case ParamType.File:
                        parameter = Parse <EventFile>(arg);
                        break;

                    case ParamType.Variable:
                        parameter = Parse <EventVariable>(arg);
                        break;

                    case ParamType.Requirement:
                        parameter = Parse <EventRequirement>(arg);
                        break;

                    case ParamType.Value:
                        if (Info != null && Info._enums != null && Info._enums.ContainsKey(i))
                        {
                            parameter = Parse <EventEnumValue>(arg);
                            ((EventEnumValue)parameter).Enums = Info._enums[i].ToArray();
                        }
                        else
                        {
                            parameter = Parse <EventValue>(arg);
                        }
                        break;

                    case ParamType.Offset:

                        //The offset stored in the offset parameter
                        int offset = arg->_data;

                        //If the offset is -1, this is probably an external reference.
                        //Otherwise, check to see if the offset point to an external entry.
                        TableEntryNode ext;
                        if (offset == -1)
                        {
                            ext = _root.TryGetExternal((int)_eventOffset + i * 8 + 4);
                        }
                        else
                        {
                            ext = _root.TryGetExternal(offset);
                        }

                        //Add ID node
                        parameter = Parse <EventOffset>(arg);
                        if (ext != null)
                        {
                            parameter._externalEntry = ext;
                            ext.References.Add(parameter);
                        }
                        else if (offset > 0)
                        {
                            _root._postParseEntries.Add(parameter);
                        }

                        break;
                    }
                }

                parameter._event = this;
                _children.Add(parameter);
            }
        }
Exemple #4
0
        public override void Parse(VoidPtr address)
        {
            sEvent *e = (sEvent *)address;

            _eventOffset = e->_argumentOffset;
            _nameSpace   = e->_nameSpace;
            _id          = e->_id;
            _numArgs     = e->_numArguments;
            _unknown     = e->_unk1;

            //Merge values to create ID and match with events to get name
            _event = uint.Parse(String.Format("{0:X02}{1:X02}{2:X02}{3:X02}", _nameSpace, _id, _numArgs, 0), System.Globalization.NumberStyles.HexNumber);
            if (Manager.Events.ContainsKey(_event))
            {
                _name = Manager.Events[_event]._name;
            }
            else
            {
                _name = Helpers.Hex8(_event);
            }

            sParameter *args = (sParameter *)Address((int)e->_argumentOffset);

            for (int i = 0; i < _numArgs; i++)
            {
                sParameter *arg = &args[i];

                Parameter parameter = null;
                ParamType type      = (ParamType)(int)arg->_type;

                //First check for special event parameters
                if ((_event == 0x06000D00 || _event == 0x06150F00 || _event == 0x062B0D00) && i == 12)
                {
                    parameter = Parse <HitboxFlagsNode>(arg);
                }
                else if (((_event == 0x06000D00 || _event == 0x06150F00 || _event == 0x062B0D00) && (i == 0 || i == 3 || i == 4)))
                {
                    parameter = Parse <EventValue2Half>(arg);
                }
                else if (((_event == 0x11150300 || _event == 0x11001000 || _event == 0x11010A00 || _event == 0x11020A00) && i == 0))
                {
                    parameter = Parse <EventValueGFX>(arg);
                }
                else if (i == 14 && _event == 0x06150F00)
                {
                    parameter = Parse <SpecialHitboxFlagsNode>(arg);
                }
                else
                {
                    switch (type)
                    {
                    case ParamType.Scalar:
                        parameter = Parse <EventScalar>(arg);
                        break;

                    case ParamType.Boolean:
                        parameter = Parse <EventBool>(arg);
                        break;

                    case ParamType.File:
                        parameter = Parse <EventFile>(arg);
                        break;

                    case ParamType.Variable:
                        parameter = Parse <EventVariable>(arg);
                        break;

                    case ParamType.Requirement:
                        parameter = Parse <EventRequirement>(arg);
                        break;

                    case ParamType.Value:
                        if (Info != null && Info._enums != null && Info._enums.ContainsKey(i))
                        {
                            parameter = Parse <EventEnumValue>(arg);
                            ((EventEnumValue)parameter).Enums = Info._enums[i].ToArray();
                        }
                        else
                        {
                            parameter = Parse <EventValue>(arg);
                        }
                        break;

                    case ParamType.Offset:

                        //The offset stored in the offset parameter
                        int offset = arg->_data;

                        //If the offset is -1, this is probably an external reference.
                        //Otherwise, check to see if the offset point to an external entry.
                        ExternalEntry ext;
                        if (offset == -1)
                        {
                            ext = _root.TryGetExternal((int)_eventOffset + i * 8 + 4);
                        }
                        else
                        {
                            ext = _root.TryGetExternal(offset);
                        }

                        //Add ID node
                        parameter = Parse <EventOffset>(arg);
                        if (ext != null)
                        {
                            parameter._externalEntry = ext;
                            ext.References.Add(parameter);
                        }
                        else if (offset > 0)
                        {
                            _root._postProcessEntries.Add(parameter);
                        }

                        break;
                    }
                }

                parameter._event = this;
                _children.Add(parameter);
            }
        }