コード例 #1
0
        public void UpdateOperand(PapyrusInstruction instruction, PapyrusInstructionCollection instructions)
        {
            var allmethods = States.SelectMany(m => m.Methods);
            var papyrusMethodDefinitions = allmethods.ToList();
            var i = instruction;

            if (i.OpCode == PapyrusOpCodes.Jmpt || i.OpCode == PapyrusOpCodes.Jmpf)
            {
                i.Operand = instructions.FirstOrDefault(i2 => i2.Offset == i.Offset + int.Parse(i.GetArg(1)));
                if (i.Operand == null)
                {
                    i.Operand = instructions.FirstOrDefault(i2 => i2.Offset == i.Offset + (int.Parse(i.GetArg(1)) - 1));
                }
            }
            else if (i.OpCode == PapyrusOpCodes.Jmp)
            {
                i.Operand = instructions.FirstOrDefault(i2 => i2.Offset == i.Offset + int.Parse(i.GetArg(0)));
                if (i.Operand == null)
                {
                    i.Operand = instructions.FirstOrDefault(i2 => i2.Offset == i.Offset + (int.Parse(i.GetArg(0)) - 1));
                }
            }

            else if (i.OpCode == PapyrusOpCodes.Callparent)
            {
                var arg = i.GetArg(0);
                i.Operand = papyrusMethodDefinitions
                            .FirstOrDefault(m => m.Name.Value.ToLower() == arg.ToLower());
                if (i.Operand == null)
                {
                    i.Operand = "<Method Reference Not Loaded>";
                }
            }
            else if (i.OpCode == PapyrusOpCodes.Callmethod)
            {
                var arg = i.GetArg(0);
                i.Operand = papyrusMethodDefinitions
                            .FirstOrDefault(m => m.Name.Value.ToLower() == arg.ToLower());
                if (i.Operand == null)
                {
                    i.Operand = "<Method Reference Not Loaded>";
                }
            }
            else if (i.OpCode == PapyrusOpCodes.Callstatic)
            {
                var arg = i.GetArg(0);
                i.Operand = papyrusMethodDefinitions
                            .FirstOrDefault(m => m.Name.Value.ToLower() == arg.ToLower());
                if (i.Operand == null)
                {
                    i.Operand = "<Method Reference Not Loaded>";
                }
            }

            else
            {
                i.Operand = null;
            }
        }