Beispiel #1
0
    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);
        }
    }
Beispiel #2
0
    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);
        }
    }
Beispiel #3
0
    public void ExecuteAfterIGT(Rby gb)
    {
        int lastTitleSkip = LastIndexOf(RbyStrat.TitleSkip);

        for (int i = lastTitleSkip + 1; i < Count; i++)
        {
            this[i].Execute(gb);
        }
    }
Beispiel #4
0
 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];
     }
 }
Beispiel #5
0
 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();
 }
Beispiel #6
0
    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)];
Beispiel #7
0
    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);
        }
    }
Beispiel #8
0
    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;
            }
        }
    }
Beispiel #9
0
    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);
        }
    }
Beispiel #10
0
    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);
            }
        }
    }
Beispiel #11
0
 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
 }
Beispiel #12
0
 // 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;
 }
Beispiel #13
0
 public void Execute(Rby gb)
 {
     ExecuteUntilIGT(gb);
     ExecuteAfterIGT(gb);
 }
Beispiel #14
0
    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;
        }
    }
Beispiel #15
0
    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);
        }
    }