コード例 #1
0
        public WatchVariableLock(
            string name,
            BaseAddressTypeEnum baseAddressType,
            bool isSpecial,
            Type memoryType,
            int?byteCount,
            uint?mask,
            int?shift,
            uint address,
            uint baseAddress,
            string specialType,
            Func <object, bool, uint, bool> setterFunction,
            object value)
        {
            Name            = name;
            BaseAddressType = baseAddressType;
            IsSpecial       = isSpecial;
            MemoryType      = memoryType;
            ByteCount       = byteCount;
            Mask            = mask;
            Shift           = shift;
            Address         = address;
            BaseAddress     = baseAddress;
            SpecialType     = specialType;
            SetterFunction  = setterFunction;

            Value = value;
        }
コード例 #2
0
        public WatchVariableControlPrecursor(XElement element)
        {
            /// Watchvariable params
            string typeName    = (element.Attribute(XName.Get("type"))?.Value);
            string specialType = element.Attribute(XName.Get("specialType"))?.Value;
            BaseAddressTypeEnum baseAddressType = WatchVariableUtilities.GetBaseAddressType(element.Attribute(XName.Get("base")).Value);
            uint?offsetUS      = ParsingUtilities.ParseHexNullable(element.Attribute(XName.Get("offsetUS"))?.Value);
            uint?offsetJP      = ParsingUtilities.ParseHexNullable(element.Attribute(XName.Get("offsetJP"))?.Value);
            uint?offsetSH      = ParsingUtilities.ParseHexNullable(element.Attribute(XName.Get("offsetSH"))?.Value);
            uint?offsetEU      = ParsingUtilities.ParseHexNullable(element.Attribute(XName.Get("offsetEU"))?.Value);
            uint?offsetDefault = ParsingUtilities.ParseHexNullable(element.Attribute(XName.Get("offset"))?.Value);
            uint?mask          = element.Attribute(XName.Get("mask")) != null ?
                                 (uint?)ParsingUtilities.ParseHex(element.Attribute(XName.Get("mask")).Value) : null;
            int?shift = element.Attribute(XName.Get("shift")) != null?
                        int.Parse(element.Attribute(XName.Get("shift")).Value) : (int?)null;

            bool handleMapping = (element.Attribute(XName.Get("handleMapping")) != null) ?
                                 bool.Parse(element.Attribute(XName.Get("handleMapping")).Value) : true;
            string name = element.Value;

            WatchVar =
                new WatchVariable(
                    name,
                    typeName,
                    specialType,
                    baseAddressType,
                    offsetUS,
                    offsetJP,
                    offsetSH,
                    offsetEU,
                    offsetDefault,
                    mask,
                    shift,
                    handleMapping);

            Name            = name;
            Subclass        = WatchVariableUtilities.GetSubclass(element.Attribute(XName.Get("subclass"))?.Value);
            GroupList       = WatchVariableUtilities.ParseVariableGroupList(element.Attribute(XName.Get("groupList"))?.Value);
            BackgroundColor = (element.Attribute(XName.Get("color")) != null) ?
                              ColorUtilities.GetColorFromString(element.Attribute(XName.Get("color")).Value) : (Color?)null;
            string displayTypeName = (element.Attribute(XName.Get("display"))?.Value);

            DisplayType   = displayTypeName != null ? TypeUtilities.StringToType[displayTypeName] : null;
            RoundingLimit = (element.Attribute(XName.Get("round")) != null) ?
                            ParsingUtilities.ParseInt(element.Attribute(XName.Get("round")).Value) : (int?)null;
            UseHex = (element.Attribute(XName.Get("useHex")) != null) ?
                     bool.Parse(element.Attribute(XName.Get("useHex")).Value) : (bool?)null;
            InvertBool = element.Attribute(XName.Get("invertBool")) != null?
                         bool.Parse(element.Attribute(XName.Get("invertBool")).Value) : (bool?)null;

            IsYaw = (element.Attribute(XName.Get("yaw")) != null) ?
                    bool.Parse(element.Attribute(XName.Get("yaw")).Value) : (bool?)null;
            Coordinate = element.Attribute(XName.Get("coord")) != null?
                         WatchVariableUtilities.GetCoordinate(element.Attribute(XName.Get("coord")).Value) : (Coordinate?)null;

            FixedAddresses = element.Attribute(XName.Get("fixed")) != null?
                             ParsingUtilities.ParseHexList(element.Attribute(XName.Get("fixed")).Value) : null;

            VerifyState();
        }
コード例 #3
0
        public WatchVariableControlPrecursor(
            string typeName    = null,
            string specialType = null,
            BaseAddressTypeEnum baseAddressType = BaseAddressTypeEnum.Relative,
            uint?offsetUS                  = null,
            uint?offsetJP                  = null,
            uint?offsetSH                  = null,
            uint?offsetEU                  = null,
            uint?offsetDefault             = null,
            uint?mask                      = null,
            int?shift                      = null,
            bool handleMapping             = true,
            string name                    = null,
            WatchVariableSubclass subclass = WatchVariableSubclass.Number,
            Color?backgroundColor          = null,
            Type displayType               = null,
            int?roundingLimit              = null,
            bool?useHex                    = null,
            bool?invertBool                = null,
            bool?isYaw                     = null,
            Coordinate?coordinate          = null,
            List <VariableGroup> groupList = null,
            List <uint> fixedAddresses     = null)
        {
            WatchVar =
                new WatchVariable(
                    name,
                    typeName,
                    specialType,
                    baseAddressType,
                    offsetUS,
                    offsetJP,
                    offsetSH,
                    offsetEU,
                    offsetDefault,
                    mask,
                    shift,
                    handleMapping);
            Name            = name;
            Subclass        = subclass;
            BackgroundColor = backgroundColor;
            DisplayType     = displayType;
            RoundingLimit   = roundingLimit;
            UseHex          = useHex;
            InvertBool      = invertBool;
            IsYaw           = isYaw;
            Coordinate      = coordinate;
            GroupList       = groupList;
            FixedAddresses  = fixedAddresses;

            VerifyState();
        }
コード例 #4
0
        private WatchVariableControl CreateWatchVariableControl()
        {
            string name       = textBoxNameValue.Text;
            string memoryType = comboBoxTypeValue.SelectedItem.ToString();
            BaseAddressTypeEnum baseAddressType = (BaseAddressTypeEnum)comboBoxBaseValue.SelectedItem;
            uint offset = ParsingUtilities.ParseHexNullable(textBoxOffsetValue.Text) ?? 0;

            bool useOffsetDefault =
                baseAddressType != BaseAddressTypeEnum.Absolute &&
                baseAddressType != BaseAddressTypeEnum.Relative &&
                baseAddressType != BaseAddressTypeEnum.None;

            WatchVariable watchVar = new WatchVariable(
                name: name,
                memoryTypeName: memoryType,
                specialType: null,
                baseAddressType: baseAddressType,
                offsetUS: useOffsetDefault ? (uint?)null : offset,
                offsetJP: useOffsetDefault ? (uint?)null : offset,
                offsetSH: useOffsetDefault ? (uint?)null : offset,
                offsetEU: useOffsetDefault ? (uint?)null : offset,
                offsetDefault: useOffsetDefault ? offset : (uint?)null,
                mask: null,
                shift: null,
                handleMapping: !_disableMapping);
            WatchVariableControlPrecursor precursor = new WatchVariableControlPrecursor(
                name: name,
                watchVar: watchVar,
                subclass: WatchVariableSubclass.Number,
                backgroundColor: null,
                displayType: null,
                roundingLimit: null,
                useHex: null,
                invertBool: null,
                isYaw: null,
                coordinate: null,
                groupList: new List <VariableGroup>()
            {
                VariableGroup.Custom
            });

            return(precursor.CreateWatchVariableControl());
        }
コード例 #5
0
ファイル: WatchVariable.cs プロジェクト: mkdasher/STROOP
        public WatchVariable(string memoryTypeName, string specialType, BaseAddressTypeEnum baseAddress,
                             uint?offsetUS, uint?offsetJP, uint?offsetPAL, uint?offsetDefault, uint?mask)
        {
            BaseAddressType = baseAddress;

            OffsetUS      = offsetUS;
            OffsetJP      = offsetJP;
            OffsetPAL     = offsetPAL;
            OffsetDefault = offsetDefault;

            SpecialType = specialType;

            MemoryTypeName = memoryTypeName;
            MemoryType     = memoryTypeName == null ? null : WatchVariableUtilities.StringToType[MemoryTypeName];
            ByteCount      = memoryTypeName == null ? (int?)null : WatchVariableUtilities.TypeSize[MemoryType];
            NibbleCount    = memoryTypeName == null ? (int?)null : WatchVariableUtilities.TypeSize[MemoryType] * 2;
            SignedType     = memoryTypeName == null ? (bool?)null : WatchVariableUtilities.TypeSign[MemoryType];

            Mask = mask;

            // Created getter/setter functions
            if (IsSpecial)
            {
                (_getterFunction, _setterFunction) = WatchVariableSpecialUtilities.CreateGetterSetterFunctions(SpecialType);
            }
            else
            {
                _getterFunction = (uint address) =>
                {
                    return(Config.Stream.GetValue(MemoryType, address, UseAbsoluteAddressing, Mask).ToString());
                };
                _setterFunction = (string value, uint address) =>
                {
                    return(Config.Stream.SetValueRoundingWrapping(
                               MemoryType, value, address, UseAbsoluteAddressing, Mask));
                };
            }
        }
コード例 #6
0
        public static List <uint> GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum baseAddressType)
        {
            switch (baseAddressType)
            {
            case BaseAddressTypeEnum.None:
                return(BaseAddressListZero);

            case BaseAddressTypeEnum.Absolute:
                return(BaseAddressListZero);

            case BaseAddressTypeEnum.Relative:
                return(BaseAddressListZero);

            case BaseAddressTypeEnum.Mario:
                return(new List <uint> {
                    MarioConfig.StructAddress
                });

            case BaseAddressTypeEnum.MarioObj:
                return(new List <uint> {
                    Config.Stream.GetUInt32(MarioObjectConfig.PointerAddress)
                });

            case BaseAddressTypeEnum.Camera:
                return(new List <uint> {
                    CameraConfig.CameraStructAddress
                });

            case BaseAddressTypeEnum.File:
                return(new List <uint> {
                    Config.FileManager.CurrentFileAddress
                });

            case BaseAddressTypeEnum.Object:
                return(Config.ObjectManager.CurrentAddresses);

            case BaseAddressTypeEnum.Triangle:
            {
                uint triangleAddress = Config.TriangleManager.TriangleAddress;
                return(triangleAddress != 0 ? new List <uint>()
                    {
                        triangleAddress
                    } : BaseAddressListEmpy);
            }

            case BaseAddressTypeEnum.TriangleExertionForceTable:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Triangle)
                       .ConvertAll(triangleAddress =>
                {
                    uint exertionForceIndex = Config.Stream.GetByte(triangleAddress + TriangleOffsetsConfig.ExertionForceIndex);
                    return TriangleConfig.ExertionForceTableAddress + 2 * exertionForceIndex;
                }));

            case BaseAddressTypeEnum.InputCurrent:
                return(new List <uint> {
                    InputConfig.CurrentInputAddress
                });

            case BaseAddressTypeEnum.InputJustPressed:
                return(new List <uint> {
                    InputConfig.JustPressedInputAddress
                });

            case BaseAddressTypeEnum.InputBuffered:
                return(new List <uint> {
                    InputConfig.BufferedInputAddress
                });

            case BaseAddressTypeEnum.Graphics:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Object)
                       .ConvertAll(objAddress => Config.Stream.GetUInt32(objAddress + ObjectConfig.BehaviorGfxOffset)));

            case BaseAddressTypeEnum.Animation:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Object)
                       .ConvertAll(objAddress => Config.Stream.GetUInt32(objAddress + ObjectConfig.AnimationOffset)));

            case BaseAddressTypeEnum.Waypoint:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Object)
                       .ConvertAll(objAddress => Config.Stream.GetUInt32(objAddress + ObjectConfig.WaypointOffset)));

            case BaseAddressTypeEnum.Water:
                return(new List <uint> {
                    Config.Stream.GetUInt32(MiscConfig.WaterPointerAddress)
                });

            case BaseAddressTypeEnum.Area:
                return(new List <uint> {
                    Config.AreaManager.SelectedAreaAddress
                });

            case BaseAddressTypeEnum.HackedArea:
                return(new List <uint> {
                    MiscConfig.HackedAreaAddress
                });

            case BaseAddressTypeEnum.CamHack:
                return(new List <uint> {
                    CameraHackConfig.CameraHackStruct
                });

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
コード例 #7
0
        public static List <uint> GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum baseAddressType)
        {
            switch (baseAddressType)
            {
            case BaseAddressTypeEnum.None:
                return(BaseAddressListZero);

            case BaseAddressTypeEnum.Absolute:
                return(BaseAddressListZero);

            case BaseAddressTypeEnum.Relative:
                return(BaseAddressListZero);

            case BaseAddressTypeEnum.Mario:
                return(new List <uint> {
                    MarioConfig.StructAddress
                });

            case BaseAddressTypeEnum.MarioObj:
                return(new List <uint> {
                    Config.Stream.GetUInt32(MarioObjectConfig.PointerAddress)
                });

            case BaseAddressTypeEnum.Camera:
                return(new List <uint> {
                    CameraConfig.StructAddress
                });

            case BaseAddressTypeEnum.File:
                return(new List <uint> {
                    Config.FileManager.CurrentFileAddress
                });

            case BaseAddressTypeEnum.MainSave:
                return(new List <uint> {
                    Config.MainSaveManager.CurrentMainSaveAddress
                });

            case BaseAddressTypeEnum.Object:
                return(Config.ObjectSlotsManager.SelectedSlotsAddresses.ToList());

            case BaseAddressTypeEnum.ProcessGroup:
                return(Config.ObjectSlotsManager.SelectedObjects.ConvertAll(
                           obj => obj.CurrentProcessGroup ?? uint.MaxValue));

            case BaseAddressTypeEnum.Triangle:
            {
                uint triangleAddress = Config.TriangleManager.TriangleAddress;
                return(triangleAddress != 0 ? new List <uint>()
                    {
                        triangleAddress
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.TriangleExertionForceTable:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Triangle)
                       .ConvertAll(triangleAddress =>
                {
                    uint exertionForceIndex = Config.Stream.GetByte(triangleAddress + TriangleOffsetsConfig.ExertionForceIndex);
                    return TriangleConfig.ExertionForceTableAddress + 2 * exertionForceIndex;
                }));

            case BaseAddressTypeEnum.InputCurrent:
                return(new List <uint> {
                    InputConfig.CurrentInputAddress
                });

            case BaseAddressTypeEnum.InputJustPressed:
                return(new List <uint> {
                    InputConfig.JustPressedInputAddress
                });

            case BaseAddressTypeEnum.InputBuffered:
                return(new List <uint> {
                    InputConfig.BufferedInputAddress
                });

            case BaseAddressTypeEnum.Graphics:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Object)
                       .ConvertAll(objAddress => Config.Stream.GetUInt32(objAddress + ObjectConfig.BehaviorGfxOffset)));

            case BaseAddressTypeEnum.Animation:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Object)
                       .ConvertAll(objAddress => Config.Stream.GetUInt32(objAddress + ObjectConfig.AnimationOffset)));

            case BaseAddressTypeEnum.Waypoint:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Object)
                       .ConvertAll(objAddress => Config.Stream.GetUInt32(objAddress + ObjectConfig.WaypointOffset)));

            case BaseAddressTypeEnum.Water:
            {
                uint waterAddress = Config.Stream.GetUInt32(MiscConfig.WaterPointerAddress);
                return(waterAddress != 0 ? new List <uint>()
                    {
                        waterAddress
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.Snow:
                return(new List <uint> {
                    Config.Stream.GetUInt32(SnowConfig.SnowArrayPointerAddress)
                });

            case BaseAddressTypeEnum.Area:
                return(new List <uint> {
                    Config.AreaManager.SelectedAreaAddress
                });

            case BaseAddressTypeEnum.LastCoin:
            {
                List <uint> coinAddresses = Config.ObjectSlotsManager.GetLoadedObjectsWithPredicate(
                    o => o.BehaviorAssociation?.Name == "Yellow Coin" || o.BehaviorAssociation?.Name == "Blue Coin")
                                            .ConvertAll(objectDataModel => objectDataModel.Address);
                return(coinAddresses.Count > 0 ? new List <uint>()
                    {
                        coinAddresses.Last()
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.Ghost:
                return(Config.ObjectSlotsManager.GetLoadedObjectsWithName("Mario Ghost")
                       .ConvertAll(objectDataModel => objectDataModel.Address));

            case BaseAddressTypeEnum.HackedArea:
                return(new List <uint> {
                    MiscConfig.HackedAreaAddress
                });

            case BaseAddressTypeEnum.CamHack:
                return(new List <uint> {
                    CamHackConfig.StructAddress
                });

            case BaseAddressTypeEnum.GfxNode:
            {
                GfxNode node = Config.GfxManager.SelectedNode;
                return(node != null ? new List <uint>()
                    {
                        node.Address
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.GhostHack:
                return(new List <uint>
                {
                    GhostHackConfig.MemoryAddress +
                    GhostHackConfig.FrameDataStructSize *
                    (Config.Stream.GetUInt32(GhostHackConfig.NumFramesAddress) + GhostHackConfig.FrameOffset)
                });

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
コード例 #8
0
            private WatchVariableControlPrecursor CreatePrecursor(bool useObjAddress, bool useHex, bool useObj, bool useRelativeName)
            {
                WatchVariableSubclass subclass = useObj
                    ? WatchVariableSubclass.Object
                    : WatchVariableSubclass.Number;

                if (Keyboard.IsKeyDown(Key.A))
                {
                    subclass = WatchVariableSubclass.Angle;
                }
                if (Keyboard.IsKeyDown(Key.B))
                {
                    subclass = WatchVariableSubclass.Boolean;
                }
                if (Keyboard.IsKeyDown(Key.Q))
                {
                    subclass = WatchVariableSubclass.Object;
                }
                if (Keyboard.IsKeyDown(Key.T))
                {
                    subclass = WatchVariableSubclass.Triangle;
                }

                bool isObjectOrTriangle =
                    subclass == WatchVariableSubclass.Object ||
                    subclass == WatchVariableSubclass.Triangle;

                Type effectiveType = isObjectOrTriangle
                    ? typeof(uint)
                    : MemoryType;
                string typeString = TypeUtilities.TypeToString[effectiveType];

                bool?hexValue = null;

                if (useHex)
                {
                    hexValue = true;
                }
                if (isObjectOrTriangle)
                {
                    hexValue = null;
                }

                BaseAddressTypeEnum baseAddressType =
                    useObjAddress ? BaseAddressTypeEnum.Object : BaseAddressTypeEnum.Relative;
                uint offset     = useObjAddress ? (uint)ByteIndex : MemoryAddress;
                uint nameOffset = useRelativeName ? (uint)ByteIndex : MemoryAddress;

                WatchVariable watchVar = new WatchVariable(
                    memoryTypeName: typeString,
                    specialType: null,
                    baseAddressType: baseAddressType,
                    offsetUS: null,
                    offsetJP: null,
                    offsetSH: null,
                    offsetEU: null,
                    offsetDefault: offset,
                    mask: null,
                    shift: null,
                    handleMapping: true);

                return(new WatchVariableControlPrecursor(
                           name: typeString + " " + HexUtilities.FormatValue(nameOffset),
                           watchVar: watchVar,
                           subclass: subclass,
                           backgroundColor: null,
                           displayType: null,
                           roundingLimit: null,
                           useHex: hexValue,
                           invertBool: null,
                           isYaw: null,
                           coordinate: null,
                           groupList: new List <VariableGroup>()
                {
                    VariableGroup.Custom
                }));
            }
コード例 #9
0
        public static List <uint> GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum baseAddressType)
        {
            switch (baseAddressType)
            {
            case BaseAddressTypeEnum.None:
                return(BaseAddressListZero);

            case BaseAddressTypeEnum.Absolute:
                return(BaseAddressListZero);

            case BaseAddressTypeEnum.Relative:
                return(BaseAddressListZero);

            case BaseAddressTypeEnum.Mario:
                return(new List <uint> {
                    MarioConfig.StructAddress
                });

            case BaseAddressTypeEnum.MarioObj:
                return(new List <uint> {
                    Config.Stream.GetUInt32(MarioObjectConfig.PointerAddress)
                });

            case BaseAddressTypeEnum.Camera:
                return(new List <uint> {
                    CameraConfig.StructAddress
                });

            case BaseAddressTypeEnum.CameraSettings:
            {
                uint a1 = 0x8033B910;
                uint a2 = Config.Stream.GetUInt32(a1);
                uint a3 = Config.Stream.GetUInt32(a2 + 0x10);
                uint a4 = Config.Stream.GetUInt32(a3 + 0x08);
                uint a5 = Config.Stream.GetUInt32(a4 + 0x10);
                return(new List <uint> {
                        a5
                    });
            }

            case BaseAddressTypeEnum.File:
                return(new List <uint> {
                    Config.FileManager.CurrentFileAddress
                });

            case BaseAddressTypeEnum.MainSave:
                return(new List <uint> {
                    Config.MainSaveManager.CurrentMainSaveAddress
                });

            case BaseAddressTypeEnum.Object:
                return(Config.ObjectSlotsManager.SelectedSlotsAddresses);

            case BaseAddressTypeEnum.ProcessGroup:
                return(Config.ObjectSlotsManager.SelectedObjects.ConvertAll(
                           obj => obj.CurrentProcessGroup ?? uint.MaxValue));

            case BaseAddressTypeEnum.Triangle:
            {
                List <uint> triangleAddresses = Config.TriangleManager.TriangleAddresses;
                if (triangleAddresses.Count == 1 && triangleAddresses[0] == 0)
                {
                    return(BaseAddressListEmpty);
                }
                return(triangleAddresses);
            }

            case BaseAddressTypeEnum.TriangleExertionForceTable:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Triangle)
                       .ConvertAll(triangleAddress =>
                {
                    uint exertionForceIndex = Config.Stream.GetByte(triangleAddress + TriangleOffsetsConfig.ExertionForceIndex);
                    return TriangleConfig.ExertionForceTableAddress + 2 * exertionForceIndex;
                }));

            case BaseAddressTypeEnum.CellsTriangle:
            {
                uint triangleAddress = Config.CellsManager.TriangleAddress;
                return(triangleAddress != 0 ? new List <uint>()
                    {
                        triangleAddress
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.CellsTriangleExertionForceTable:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.CellsTriangle)
                       .ConvertAll(triangleAddress =>
                {
                    uint exertionForceIndex = Config.Stream.GetByte(triangleAddress + TriangleOffsetsConfig.ExertionForceIndex);
                    return TriangleConfig.ExertionForceTableAddress + 2 * exertionForceIndex;
                }));

            case BaseAddressTypeEnum.Floor:
            {
                uint floorAddress = Config.Stream.GetUInt32(MarioConfig.StructAddress + MarioConfig.FloorTriangleOffset);
                return(floorAddress != 0 ? new List <uint>()
                    {
                        floorAddress
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.Wall:
            {
                uint wallAddress = Config.Stream.GetUInt32(MarioConfig.StructAddress + MarioConfig.WallTriangleOffset);
                return(wallAddress != 0 ? new List <uint>()
                    {
                        wallAddress
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.Ceiling:
            {
                uint ceilingAddress = Config.Stream.GetUInt32(MarioConfig.StructAddress + MarioConfig.CeilingTriangleOffset);
                return(ceilingAddress != 0 ? new List <uint>()
                    {
                        ceilingAddress
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.InputCurrent:
                return(new List <uint> {
                    InputConfig.CurrentInputAddress
                });

            case BaseAddressTypeEnum.InputJustPressed:
                return(new List <uint> {
                    InputConfig.JustPressedInputAddress
                });

            case BaseAddressTypeEnum.InputBuffered:
                return(new List <uint> {
                    InputConfig.BufferedInputAddress
                });

            case BaseAddressTypeEnum.Graphics:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Object)
                       .ConvertAll(objAddress => Config.Stream.GetUInt32(objAddress + ObjectConfig.BehaviorGfxOffset)));

            case BaseAddressTypeEnum.Animation:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Object)
                       .ConvertAll(objAddress => Config.Stream.GetUInt32(objAddress + ObjectConfig.AnimationOffset)));

            case BaseAddressTypeEnum.Waypoint:
                return(GetBaseAddressListFromBaseAddressType(BaseAddressTypeEnum.Object)
                       .ConvertAll(objAddress => Config.Stream.GetUInt32(objAddress + ObjectConfig.WaypointOffset)));

            case BaseAddressTypeEnum.Water:
            {
                uint waterAddress = Config.Stream.GetUInt32(MiscConfig.WaterPointerAddress);
                return(waterAddress != 0 ? new List <uint>()
                    {
                        waterAddress
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.Snow:
                return(new List <uint> {
                    Config.Stream.GetUInt32(SnowConfig.SnowArrayPointerAddress)
                });

            case BaseAddressTypeEnum.Area:
                return(new List <uint> {
                    Config.AreaManager.SelectedAreaAddress
                });

            case BaseAddressTypeEnum.Whirlpool1:
            {
                uint whirlpoolArrayAddress = Config.Stream.GetUInt32(Config.AreaManager.SelectedAreaAddress + 0x2C);
                if (whirlpoolArrayAddress == 0)
                {
                    return(BaseAddressListEmpty);
                }
                return(new List <uint>()
                    {
                        whirlpoolArrayAddress + 0x00
                    });
            }

            case BaseAddressTypeEnum.Whirlpool2:
            {
                uint whirlpoolArrayAddress = Config.Stream.GetUInt32(Config.AreaManager.SelectedAreaAddress + 0x2C);
                if (whirlpoolArrayAddress == 0)
                {
                    return(BaseAddressListEmpty);
                }
                return(new List <uint>()
                    {
                        whirlpoolArrayAddress + 0x08
                    });
            }

            case BaseAddressTypeEnum.Painting:
            {
                uint?paintingAddress = Config.PaintingManager.GetPaintingAddress();
                return(paintingAddress != null ? new List <uint>()
                    {
                        paintingAddress.Value
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.Music:
            {
                uint?musicAddress = Config.MusicManager.GetMusicAddress();
                return(musicAddress != null ? new List <uint>()
                    {
                        musicAddress.Value
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.LastCoin:
            {
                List <uint> coinAddresses = Config.ObjectSlotsManager.GetLoadedObjectsWithPredicate(
                    o => o.BehaviorAssociation?.Name == "Yellow Coin" || o.BehaviorAssociation?.Name == "Blue Coin")
                                            .ConvertAll(objectDataModel => objectDataModel.Address);
                return(coinAddresses.Count > 0 ? new List <uint>()
                    {
                        coinAddresses.Last()
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.WarpDestination:
                return(new List <uint>()
                {
                    MiscConfig.WarpDestinationAddress
                });

            case BaseAddressTypeEnum.HackedArea:
                return(new List <uint> {
                    MiscConfig.HackedAreaAddress
                });

            case BaseAddressTypeEnum.CamHack:
                return(new List <uint> {
                    CamHackConfig.StructAddress
                });

            case BaseAddressTypeEnum.GfxNode:
            {
                GfxNode node = Config.GfxManager.SelectedNode;
                return(node != null ? new List <uint>()
                    {
                        node.Address
                    } : BaseAddressListEmpty);
            }

            case BaseAddressTypeEnum.GhostHack:
                return(new List <uint>
                {
                    GhostHackConfig.CurrentGhostStruct
                });

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
コード例 #10
0
            private WatchVariableControlPrecursor CreatePrecursor(bool useObjAddress, bool useHex, bool useObj)
            {
                WatchVariableSubclass subclass = useObj
                    ? WatchVariableSubclass.Object
                    : WatchVariableSubclass.Number;

                if (Keyboard.IsKeyDown(Key.A))
                {
                    subclass = WatchVariableSubclass.Angle;
                }
                if (Keyboard.IsKeyDown(Key.B))
                {
                    subclass = WatchVariableSubclass.Boolean;
                }
                if (Keyboard.IsKeyDown(Key.Q))
                {
                    subclass = WatchVariableSubclass.Object;
                }
                if (Keyboard.IsKeyDown(Key.T))
                {
                    subclass = WatchVariableSubclass.Triangle;
                }

                bool isObjectOrTriangle =
                    subclass == WatchVariableSubclass.Object ||
                    subclass == WatchVariableSubclass.Triangle;

                Type effectiveType = isObjectOrTriangle
                    ? typeof(uint)
                    : MemoryType;
                string typeString = TypeUtilities.TypeToString[effectiveType];

                bool?hexValue = null;

                if (useHex)
                {
                    hexValue = true;
                }
                if (isObjectOrTriangle)
                {
                    hexValue = null;
                }

                BaseAddressTypeEnum baseAddressType =
                    useObjAddress ? BaseAddressTypeEnum.Object : BaseAddressTypeEnum.Relative;
                uint offset = useObjAddress ? (uint)ByteIndex : MemoryAddress;

                WatchVariable watchVar = new WatchVariable(
                    typeString,
                    null /* specialType */,
                    baseAddressType,
                    null /* offsetUS */,
                    null /* offsetJP */,
                    null /* offsetPAL */,
                    offset,
                    null /* mask */,
                    null /* shift */);

                return(new WatchVariableControlPrecursor(
                           typeString + " " + HexUtilities.FormatValue(offset),
                           watchVar,
                           subclass,
                           null /* backgroundColor */,
                           null /* displayType */,
                           null /* roundingLimit */,
                           hexValue,
                           null /* invertBool */,
                           null /* isYaw */,
                           null /* coordinate */,
                           new List <VariableGroup>()
                {
                    VariableGroup.Custom
                }));
            }
コード例 #11
0
        public WatchVariable(string memoryTypeName, string specialType, BaseAddressTypeEnum baseAddressType,
                             uint?offsetUS, uint?offsetJP, uint?offsetPAL, uint?offsetDefault, uint?mask, int?shift)
        {
            if (offsetDefault.HasValue && (offsetUS.HasValue || offsetJP.HasValue || offsetPAL.HasValue))
            {
                throw new ArgumentOutOfRangeException("Can't have both a default offset value and a rom-specific offset value");
            }

            if (specialType != null)
            {
                if (baseAddressType != BaseAddressTypeEnum.None &&
                    baseAddressType != BaseAddressTypeEnum.Object &&
                    baseAddressType != BaseAddressTypeEnum.ProcessGroup &&
                    baseAddressType != BaseAddressTypeEnum.Ghost &&
                    baseAddressType != BaseAddressTypeEnum.LastCoin &&
                    baseAddressType != BaseAddressTypeEnum.File &&
                    baseAddressType != BaseAddressTypeEnum.MainSave &&
                    baseAddressType != BaseAddressTypeEnum.Triangle)
                {
                    throw new ArgumentOutOfRangeException("Special var cannot have base address type " + baseAddressType);
                }

                if (offsetDefault.HasValue || offsetUS.HasValue || offsetJP.HasValue || offsetPAL.HasValue)
                {
                    throw new ArgumentOutOfRangeException("Special var cannot have any type of offset");
                }

                if (mask != null)
                {
                    throw new ArgumentOutOfRangeException("Special var cannot have mask");
                }
            }

            BaseAddressType = baseAddressType;

            OffsetUS      = offsetUS;
            OffsetJP      = offsetJP;
            OffsetPAL     = offsetPAL;
            OffsetDefault = offsetDefault;

            SpecialType = specialType;

            MemoryTypeName = memoryTypeName;
            MemoryType     = memoryTypeName == null ? null : TypeUtilities.StringToType[MemoryTypeName];
            ByteCount      = memoryTypeName == null ? (int?)null : TypeUtilities.TypeSize[MemoryType];
            NibbleCount    = memoryTypeName == null ? (int?)null : TypeUtilities.TypeSize[MemoryType] * 2;
            SignedType     = memoryTypeName == null ? (bool?)null : TypeUtilities.TypeSign[MemoryType];

            Mask  = mask;
            Shift = shift;

            // Created getter/setter functions
            if (IsSpecial)
            {
                (_getterFunction, _setterFunction) = WatchVariableSpecialUtilities.CreateGetterSetterFunctions(SpecialType);
            }
            else
            {
                _getterFunction = (uint address) =>
                {
                    return(Config.Stream.GetValue(
                               MemoryType, address, UseAbsoluteAddressing, Mask, Shift));
                };
                _setterFunction = (object value, uint address) =>
                {
                    return(Config.Stream.SetValueRoundingWrapping(
                               MemoryType, value, address, UseAbsoluteAddressing, Mask, Shift));
                };
            }
        }