private void ParseScripts(bint *hdr, int[] sizes) { Script s = null; int size, count; bint * actionOffset; List <List <int> > list; MovesetNode node = _root as MovesetNode; sSubActionFlags *sflags = (sSubActionFlags *)Address(hdr[0]); sActionFlags * aflags = (sActionFlags *)Address(hdr[6]); //Collect offsets first size = sizes[9]; for (int i = 9; i < 11; i++) { if (hdr[i] < 0) { continue; } actionOffset = (bint *)Address(hdr[i]); for (int x = 0; x < size / 4; x++) { node._scriptOffsets[0][i - 9].Add(actionOffset[x]); } } size = sizes[12]; for (int i = 12; i < 16; i++) { if (hdr[i] < 0) { continue; } actionOffset = (bint *)Address(hdr[i]); for (int x = 0; x < size / 4; x++) { node._scriptOffsets[1][i - 12].Add(actionOffset[x]); } } //Now parse scripts using collected offsets //The offsets are stored in the root in order to find scripts later //Actions first ActionEntry ag; list = node._scriptOffsets[0]; count = list[0].Count; node._actions = new BindingList <ActionEntry>(); for (int i = 0; i < count; i++) { sActionFlags flag = aflags[i]; node.Actions.Add(ag = new ActionEntry(flag, i, i + 274)); for (int x = 0; x < 2; x++) { if (i < list[x].Count && list[x][i] > 0) { s = Parse <Script>(list[x][i]); } else { s = new Script(); } ag.SetWithType(x, s); } } //Now subactions SubActionEntry sg; list = node._scriptOffsets[1]; count = list[0].Count; _subActions = new BindingList <SubActionEntry>(); for (int i = 0; i < count; i++) { sSubActionFlags flag = sflags[i]; _subActions.Add(sg = new SubActionEntry(flag, flag._stringOffset > 0 ? new String((sbyte *)Address(flag._stringOffset)) : "<null>", i)); for (int x = 0; x < 4; x++) { if (i < list[x].Count && list[x][i] > 0) { s = Parse <Script>(list[x][i]); } else { s = new Script(); } sg.SetWithType(x, s); } } }
private void ParseScripts(bint *hdr, int[] sizes) { Script s = null; int size, count, offset; bint * actionOffset; MovesetNode node = _root as MovesetNode; //Collect offsets first for (int i = 0; i < 2; i++) { if ((offset = hdr[i + 4]) < 0) { continue; } actionOffset = (bint *)Address(offset); for (int x = 0; x < sizes[i + 4] / 4; x++) { node._scriptOffsets[0][i].Add(*actionOffset++); } } List <uint>[] flags = new List <uint>[] { new List <uint>(), new List <uint>() }; for (int i = 0; i < 2; i++) { size = _root.GetSize(offset = hdr[i + 19]); if (offset > 0) { actionOffset = (bint *)Address(offset); for (int x = 0; x < size / 16; x++) { node._scriptOffsets[i + 3][0].Add(*actionOffset++); flags[i].Add((uint)(int)*actionOffset++); } } } //Now parse scripts ActionEntry ag; List <List <int> > actionOffsets = node._scriptOffsets[0]; count = Math.Max(actionOffsets[0].Count, actionOffsets[1].Count); node._actions = new BindingList <ActionEntry>(); for (int i = 0; i < count; i++) { node.Actions.Add(ag = new ActionEntry(new sActionFlags(), i, i)); for (int x = 0; x < 2; x++) { if (i < actionOffsets[x].Count && actionOffsets[x][i] > 0) { s = Parse <Script>(actionOffsets[x][i]); } else { s = new Script(); } ag.SetWithType(x, s); } } _flashOverlays = new BindingList <CommonAction>(); _screenTints = new BindingList <CommonAction>(); BindingList <CommonAction>[] lists = new BindingList <CommonAction>[] { _flashOverlays, _screenTints }; CommonAction ca; for (int x = 0; x < 2; x++) { List <int> offsets = node._scriptOffsets[x + 3][0]; count = offsets.Count; for (int i = 0; i < count; i++) { uint flag = flags[x][i]; ca = i < offsets.Count && offsets[i] > 0 ? Parse <CommonAction>(offsets[i], flag) : new CommonAction(flag); ca._index = i; lists[x].Add(ca); } } }