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