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);
                }
            }
        }
Beispiel #2
0
        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);
                }
            }
        }