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 }
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); } }
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); } }
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); } }