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