public RbyTrainerClass(Rby game, byte id, int length, ByteStream data, ByteStream name) { Id = id; Name = game.Charmap.Decode(name.Until(Charmap.Terminator)); Teams = new List <List <RbyPokemon> >(); long initial = data.Position; while (data.Position - initial < length) { List <RbyPokemon> team = new List <RbyPokemon>(); byte format = data.u8(); byte level = format; byte speciesIndex; while ((speciesIndex = data.u8()) != 0x00) { if (format == 0xff) { level = speciesIndex; speciesIndex = data.u8(); } team.Add(new RbyPokemon(game.Species[speciesIndex], level)); } Teams.Add(team); } }
public RbyTileset(Rby game, byte id, ByteStream data) { Game = game; Id = id; Bank = data.u8(); BlockPointer = data.u16le(); GfxPointer = data.u16le(); CollisionPointer = data.u16le(); CounterTiles = data.Read(3); GrassTile = data.u8(); data.Seek(1); TilePairCollisionsLand = new List <RbyTilePairCollision>(); TilePairCollisionsWater = new List <RbyTilePairCollision>(); LandPermissions = new PermissionSet(); LandPermissions.AddRange(game.ROM.From((game is Yellow ? 0x01 : 0x00) << 16 | CollisionPointer).Until(0xff)); WaterPermissions = new PermissionSet(); WaterPermissions.Add(0x14); WaterPermissions.Add(0x32); if (id == 14) { WaterPermissions.Add(0x48); } }
public void ExecuteAfterIGT(Rby gb) { int lastTitleSkip = LastIndexOf(RbyStrat.TitleSkip); for (int i = lastTitleSkip + 1; i < Count; i++) { this[i].Execute(gb); } }
public RbyItem(Rby game, byte id, string name) { Game = game; Name = name; Id = id; ExecutionPointer = 0x3 << 16 | game.ROM.u16le(game.SYM["ItemUsePtrTable"] + (byte)(id - 1) * 2); if (game.SYM.Contains(ExecutionPointer)) { ExecutionPointerLabel = game.SYM[ExecutionPointer]; } }
public RbyMove(Rby game, ReadStream data, ReadStream name) { Game = game; Name = game.Charmap.Decode(name.Until(Charmap.Terminator)); Id = data.u8(); Effect = (RbyEffect)data.u8(); Power = data.u8(); Type = (RbyType)data.u8(); Accuracy = data.u8(); PP = data.u8(); }
public RbyWarp(Rby game, RbyMap map, byte index, ByteStream data) { Map = map; Index = index; Y = data.u8(); X = data.u8(); DestinationIndex = data.u8(); DestinationMap = data.u8(); Allowed = false; if (!(game is Yellow) && DestinationMap == 0xff) { DestinationMap = RedBlue.wLastMapDestinations[(map.Name, index)];
public void ExecuteUntilIGT(Rby gb) { int lastTitleSkip = LastIndexOf(RbyStrat.TitleSkip); for (int i = 0; i <= lastTitleSkip; i++) { this[i].Execute(gb); } if (gb.RunUntil("LoadSAV", "MainMenu.mainMenuLoop") == gb.SYM["LoadSAV"]) { gb.RunUntil(gb.SYM["LoadSAV0.checkSumsMatched"] + 0x18); } }
public RbySprite(Rby game, RbyMap map, byte spriteId, ReadStream data) { Map = map; SpriteId = spriteId; PictureId = data.u8(); Y = (byte)(data.u8() - 4); X = (byte)(data.u8() - 4); Movement = (RbySpriteMovement)data.u8(); byte rangeOrDirection = data.u8(); TextId = data.u8(); IsTrainer = (TextId & 0x40) != 0; IsItem = (TextId & 0x80) != 0; if (IsTrainer) { TextId &= 0xbf; } if (IsItem) { TextId &= 0x7f; } if (Movement == RbySpriteMovement.Walk) { Range = rangeOrDirection; } else { switch ((RbySpriteMovement)rangeOrDirection) { case RbySpriteMovement.Down: Direction = Action.Down; break; case RbySpriteMovement.Up: Direction = Action.Up; break; case RbySpriteMovement.Left: Direction = Action.Left; break; case RbySpriteMovement.Right: Direction = Action.Right; break; case RbySpriteMovement.None: Movement = RbySpriteMovement.Turn; goto default; default: Direction = Action.None; break; } } }
public void ExecuteUntilIGT(Rby gb) { gb.HardReset(false); int lastTitleSkip = IndexOfLastTitleSkip(); for (int i = 0; i <= lastTitleSkip; i++) { this[i].Execute(gb); } if (gb.RunUntil("LoadSAV", "MainMenu.mainMenuLoop") == gb.SYM["LoadSAV"]) { gb.RunUntil(gb.SYM["LoadSAV0.checkSumsMatched"] + 0x18); } }
public RbyTileset(Rby game, byte id, ReadStream data) { Game = game; Id = id; Bank = data.u8(); BlockPointer = data.u16le(); GfxPointer = data.u16le(); CollisionPointer = data.u16le(); CounterTiles = data.Read(3); GrassTile = data.u8(); data.Seek(1); TilePairCollisionsLand = new List <int>(); TilePairCollisionsWater = new List <int>(); LandPermissions = new PermissionSet(); LandPermissions.AddRange(game.ROM.From((game.IsYellow ? 0x01 : 0x00) << 16 | CollisionPointer).Until(0xff, false)); WaterPermissions = new PermissionSet(); WaterPermissions.Add(0x14); WaterPermissions.Add(0x32); if (id == 14) { WaterPermissions.Add(0x48); } WarpTiles = game.ROM.From(3 << 16 | game.ROM.u16le(game.SYM["WarpTileIDPointers"] + id * 2)).Until(0xff, false); ReadStream stream = game.ROM.From("DoorTileIDPointers"); DoorTiles = new byte[0]; for (; ;) { byte tileset = stream.u8(); ushort pointer = stream.u16le(); if (tileset == 0xff) { break; } if (tileset == Id) { DoorTiles = game.ROM.From(6 << 16 | pointer).Until(0x00, false); } } }
public RbySpecies(Rby game, byte indexNumber, ReadStream data) : this(game, indexNumber) { Game = game; PokedexNumber = data.u8(); BaseHP = data.u8(); BaseAttack = data.u8(); BaseDefense = data.u8(); BaseSpeed = data.u8(); BaseSpecial = data.u8(); Type1 = (RbyType)data.u8(); Type2 = (RbyType)data.u8(); CatchRate = data.u8(); BaseExp = data.u8(); FrontSpriteWidth = data.Nybble(); FrontSpriteHeight = data.Nybble(); FrontSpritePointer = data.u16le(); BackSpritePointer = data.u16le(); BaseMoves = new RbyMove[] { Game.Moves[data.u8()], Game.Moves[data.u8()], Game.Moves[data.u8()], Game.Moves[data.u8()] }; GrowthRate = (GrowthRate)data.u8(); data.Seek(8); // TODO: HMs/TMs }
// Missingno data public RbySpecies(Rby game, byte indexNumber) { Game = game; Name = game.Charmap.Decode(game.ROM.Subarray(game.SYM["MonsterNames"] + (indexNumber - 1) * 10, 10)); Id = indexNumber; }
public void Execute(Rby gb) { ExecuteUntilIGT(gb); ExecuteAfterIGT(gb); }
public static void Execute(this RbyStrat strat, Rby gb) { bool yellow = gb is Yellow; Debug.Assert(!(yellow && ((strat >= RbyStrat.Hop0 && strat <= RbyStrat.Hop6) || (strat > RbyStrat.NoPal && strat <= RbyStrat.PalRel))), "Tried to use red/blue exclusive intro strats!"); Debug.Assert(!(!yellow && strat >= RbyStrat.Intro0 && strat <= RbyStrat.IntroWait), "Tried to use yellow exclusive intro strats!"); switch (strat) { case RbyStrat.NoPal: gb.RunUntil(0x100); break; case RbyStrat.NoPalAB: gb.Hold(Joypad.A, 0x100); break; case RbyStrat.Pal: gb.RunUntil(BiosJoypad); gb.AdvanceFrame(Joypad.Up); gb.RunUntil(0x100); break; case RbyStrat.PalHold: gb.Hold(Joypad.Up, 0x100); break; case RbyStrat.PalAB: gb.RunUntil(BiosJoypad); gb.AdvanceFrames(70, Joypad.Up); gb.RunUntil(BiosJoypad); gb.Hold(Joypad.Up | Joypad.A, 0x100); break; case RbyStrat.PalRel: gb.RunUntil(BiosJoypad); gb.AdvanceFrame(Joypad.Up); gb.AdvanceFrames(70); gb.Hold(Joypad.Up | Joypad.A, 0x100); break; case RbyStrat.GfSkip: gb.Press(yellow ? Joypad.Start : Joypad.Up | Joypad.B | Joypad.Select); break; case RbyStrat.GfWait: gb.RunUntil("PlayShootingStar.next"); break; case RbyStrat.Hop0: case RbyStrat.Hop1: case RbyStrat.Hop2: case RbyStrat.Hop3: case RbyStrat.Hop4: case RbyStrat.Hop5: for (int i = 0; i < strat - RbyStrat.Hop0; i++) { gb.RunUntil("AnimateIntroNidorino"); gb.RunUntil("CheckForUserInterruption"); } gb.Press(Joypad.Up | Joypad.Select | Joypad.B); break; case RbyStrat.Intro0: case RbyStrat.Intro1: case RbyStrat.Intro2: case RbyStrat.Intro3: case RbyStrat.Intro4: case RbyStrat.Intro5: case RbyStrat.Intro6: if (strat > RbyStrat.Intro0) { gb.RunUntil("YellowIntroScene" + (strat - RbyStrat.Intro0) * 2); } gb.Press(Joypad.A); break; case RbyStrat.Hop6: case RbyStrat.IntroWait: gb.RunUntil("DisplayTitleScreen"); break; case RbyStrat.TitleSkip: gb.Press(Joypad.Start); break; case RbyStrat.Continue: case RbyStrat.NewGame: gb.Press(Joypad.A); break; case RbyStrat.Backout: gb.Press(Joypad.B); break; } }
public static void Execute(this RbyStrat strat, Rby gb) { switch (strat) { case RbyStrat.NoPal: gb.RunUntil(0x100); break; case RbyStrat.NoPalAB: gb.Hold(Joypad.A, 0x100); break; case RbyStrat.Pal: gb.RunUntil(BiosJoypad); gb.AdvanceFrame(Joypad.Up); gb.RunUntil(0x100); break; case RbyStrat.PalHold: gb.Hold(Joypad.Up, 0x100); break; case RbyStrat.PalAB: gb.RunUntil(BiosJoypad); gb.AdvanceFrames(70, Joypad.Up); gb.RunUntil(BiosJoypad); gb.Hold(Joypad.Up | Joypad.A, 0x100); break; case RbyStrat.PalRel: gb.RunUntil(BiosJoypad); gb.AdvanceFrame(Joypad.Up); gb.AdvanceFrames(70); gb.Hold(Joypad.Up | Joypad.A, 0x100); break; case RbyStrat.GfSkip: gb.Press(gb.IsYellow ? Joypad.Start : Joypad.Up | Joypad.Select | Joypad.B); break; case RbyStrat.GfWait: gb.RunUntil("PlayShootingStar.next"); break; case RbyStrat.Hop0: case RbyStrat.Hop1: case RbyStrat.Hop2: case RbyStrat.Hop3: case RbyStrat.Hop4: case RbyStrat.Hop5: for (int i = 0; i < strat - RbyStrat.Hop0; i++) { gb.RunUntil("AnimateIntroNidorino"); gb.RunUntil("CheckForUserInterruption"); } gb.Press(Joypad.Up | Joypad.Select | Joypad.B); break; case RbyStrat.Hop0Reset: case RbyStrat.Hop1Reset: case RbyStrat.Hop2Reset: case RbyStrat.Hop3Reset: case RbyStrat.Hop4Reset: case RbyStrat.Hop5Reset: for (int i = 0; i < strat - RbyStrat.Hop0Reset; i++) { gb.RunUntil("AnimateIntroNidorino"); gb.RunUntil("CheckForUserInterruption"); } break; case RbyStrat.Intro0: case RbyStrat.Intro1: case RbyStrat.Intro2: case RbyStrat.Intro3: case RbyStrat.Intro4: case RbyStrat.Intro5: case RbyStrat.Intro6: if (strat > RbyStrat.Intro0) { gb.RunUntil("YellowIntroScene" + (strat - RbyStrat.Intro0) * 2); } gb.Press(Joypad.A); break; case RbyStrat.Intro1Reset: case RbyStrat.Intro2Reset: case RbyStrat.Intro3Reset: case RbyStrat.Intro4Reset: case RbyStrat.Intro5Reset: case RbyStrat.Intro6Reset: gb.RunUntil("YellowIntroScene" + (strat - RbyStrat.Intro0Reset) * 2); break; case RbyStrat.Hop6: case RbyStrat.IntroWait: gb.RunUntil("DisplayTitleScreen"); break; case RbyStrat.Title0: case RbyStrat.Title1: case RbyStrat.Title2: case RbyStrat.Title3: case RbyStrat.Title4: case RbyStrat.Title5: case RbyStrat.Title6: case RbyStrat.Title7: for (int i = 0; i < strat - RbyStrat.Title0; i++) { gb.RunUntil("TitleScreenPickNewMon"); gb.AdvanceFrame(); } gb.Press(Joypad.Start); break; case RbyStrat.Title0Scroll: case RbyStrat.Title1Scroll: case RbyStrat.Title2Scroll: case RbyStrat.Title3Scroll: case RbyStrat.Title4Scroll: case RbyStrat.Title5Scroll: case RbyStrat.Title6Scroll: case RbyStrat.Title7Scroll: for (int i = 0; i < strat - RbyStrat.Title0Scroll + 1; i++) { gb.RunUntil("TitleScreenScrollInMon"); gb.RunUntil("CheckForUserInterruption"); } gb.Press(Joypad.Start); break; case RbyStrat.Title0Reset: case RbyStrat.Title1Reset: case RbyStrat.Title2Reset: case RbyStrat.Title3Reset: case RbyStrat.Title4Reset: case RbyStrat.Title5Reset: case RbyStrat.Title6Reset: case RbyStrat.Title7Reset: for (int i = 0; i < strat - RbyStrat.Title0Reset; i++) { gb.RunUntil("TitleScreenPickNewMon"); gb.RunUntil("CheckForUserInterruption"); } break; case RbyStrat.Title0Usb: case RbyStrat.Title1Usb: case RbyStrat.Title2Usb: case RbyStrat.Title3Usb: case RbyStrat.Title4Usb: case RbyStrat.Title5Usb: case RbyStrat.Title6Usb: case RbyStrat.Title7Usb: for (int i = 0; i < strat - RbyStrat.Title0Usb; i++) { gb.RunUntil("TitleScreenPickNewMon"); gb.RunUntil("CheckForUserInterruption"); } gb.Press(Joypad.Up | Joypad.Select | Joypad.B); break; case RbyStrat.Title: gb.Press(Joypad.Start); break; case RbyStrat.TitleUsb: gb.Press(Joypad.Up | Joypad.Select | Joypad.B); break; case RbyStrat.Continue: case RbyStrat.NewGame: gb.Press(Joypad.A); break; case RbyStrat.Backout: gb.Press(Joypad.B); break; case RbyStrat.Options: gb.Press(Joypad.Down | Joypad.A, Joypad.Start); break; case RbyStrat.OptionsReset: gb.Press(Joypad.Down | Joypad.A); break; } if (strat.LogString().Contains("reset")) { gb.Hold(Joypad.A | Joypad.B | Joypad.Start | Joypad.Select, "SoftReset"); gb.RunFor(1); } }