state("GSR") { } state("GSE") { } state("gambatte_speedrun") { } startup { //-------------------------------------------------------------// settings.Add("split_end", true, "Splits"); settings.Add("subsplits", true, "Subsplits"); settings.CurrentDefaultParent = "split_end"; settings.Add("nidoran", true, "Catch Nido"); settings.Add("gym1", true, "Pewter Gym (Brock)"); settings.Add("enterMtMoon", true, "Enter Mt. Moon"); settings.Add("exitMtMoon", true, "Exit Mt. Moon"); settings.Add("nuggetBridge", true, "Nugget Bridge (Rocket)"); settings.Add("gym2", true, "Cerulean Gym (Misty)"); settings.Add("gym3", true, "Vermilion Gym (Lt. Surge)"); settings.Add("hm02", true, "Obtain HM02"); settings.Add("flute", true, "Obtain Poké Flute"); settings.Add("gym5", true, "Fuchsia Gym (Koga)"); settings.Add("gym4", true, "Celadon Gym (Erika)"); settings.Add("gym7", true, "Cinnabar Gym (Blaine)"); settings.Add("gym6", true, "Saffron Gym (Sabrina)"); settings.Add("gym8", true, "Viridian Gym (Giovanni)"); settings.Add("elite4_1", true, "Lorelei"); settings.Add("elite4_2", true, "Bruno"); settings.Add("elite4_3", true, "Agatha"); settings.Add("elite4_4", true, "Lance"); settings.Add("elite4_5", true, "Champion"); settings.Add("hof", true, "HoF Fade Out"); settings.CurrentDefaultParent = "subsplits"; settings.Add("intro_subsplits", true, "Early Game Subsplits"); settings.Add("fly_subsplits", true, "Fly Subsplits"); settings.Add("flute_subsplits", true, "Flute Subsplits"); settings.Add("koga_subsplits", true, "Koga Subsplits"); settings.Add("gym_rush_subsplits", true, "Gym Rush Subsplits"); settings.Add("late_game_subsplits", true, "Late Game Subsplits"); settings.Add("intro_tile", true, "Intro Tile", "intro_subsplits"); settings.Add("enter_lab", false, "Enter Lab", "intro_subsplits"); settings.Add("rival_one_start", true, "Rival 1 Tile", "intro_subsplits"); settings.Add("rival", true, "Leave Oak's Lab", "intro_subsplits"); settings.Add("route1_pass", true, "Route 1 Pass 1", "intro_subsplits"); settings.Add("deliver_parcel", true, "Deliver Parcel", "intro_subsplits"); settings.Add("route1_pass_2", true, "Route 1 Pass 2", "intro_subsplits"); settings.Add("pidgey", true, "Catch Bird", "intro_subsplits"); settings.Add("forest_bc", true, "Forest Bug Catcher", "intro_subsplits"); settings.Add("pewter_enter", true, "Enter Pewter", "intro_subsplits"); settings.Add("enter_gym_1", true, "Enter Brock's Gym", "intro_subsplits"); settings.Add("pewter_exit", true, "Exit Pewter", "intro_subsplits"); settings.Add("beat_shorts_guy", true, "Beat Shorts Guy", "intro_subsplits"); settings.Add("route3", true, "Route 3 Last Bug Catcher", "intro_subsplits"); settings.Add("moon_rocket", true, "Moon Rocket", "intro_subsplits"); settings.Add("fossil", true, "Get Fossil", "intro_subsplits"); settings.Add("paras_catch", true, "Paras Catch", "intro_subsplits"); settings.Add("bridge_rival", true, "Beat Bridge Rival", "intro_subsplits"); settings.Add("bridge_youngster", true, "bridge_youngster", "intro_subsplits"); settings.Add("bill_house", true, "Bill's House", "intro_subsplits"); settings.Add("enter_gym_2", true, "Enter Misty's Gym", "intro_subsplits"); settings.Add("boat_rival", true, "Beat Boat Rival", "intro_subsplits"); settings.Add("route_6", true, "Route 6 Grass", "intro_subsplits"); settings.Add("enter_gym_3", true, "Enter Surge's Gym", "intro_subsplits"); settings.Add("enter_rock_tunnel", true, "Enter Rock Tunnel", "fly_subsplits"); settings.Add("exit_rock_tunnel", true, "Exit Rock Tunnel", "fly_subsplits"); settings.Add("enter_celadon_mart", true, "Enter Celadon Mart", "fly_subsplits"); settings.Add("enter_pkmn_tower", true, "Enter Pokemon Tower", "flute_subsplits"); settings.Add("tower_rival", true, "Beat Tower Rival", "flute_subsplits"); settings.Add("channeler_3", true, "Beat Channeler 3", "flute_subsplits"); settings.Add("tippy", true, "Tippy", "flute_subsplits"); settings.Add("silph_rival", true, "Beat Silph Rival", "koga_subsplits"); settings.Add("silph_gio", true, "Beat Silph Gio", "koga_subsplits"); settings.Add("enter_safari", true, "Enter Safari Zone", "koga_subsplits"); settings.Add("enter_koga_gym", true, "Enter Koga's Gym", "koga_subsplits"); settings.Add("enter_mansion", true, "Enter Pokemon Mansion", "gym_rush_subsplits"); settings.Add("enter_erika_gym", true, "Enter Erika's Gym", "gym_rush_subsplits"); settings.Add("enter_blaine_gym", true, "Enter Blaine's Gym", "gym_rush_subsplits"); settings.Add("q1", true, "1st Question", "gym_rush_subsplits"); settings.Add("q2", true, "2nd Question", "gym_rush_subsplits"); settings.Add("q3", true, "3rd Question", "gym_rush_subsplits"); settings.Add("q4", true, "4th Question", "gym_rush_subsplits"); settings.Add("q5", true, "5th Question", "gym_rush_subsplits"); settings.Add("q6", true, "6th Question", "gym_rush_subsplits"); settings.Add("enter_sabrina_gym", true, "Enter Sabrina's Gym", "gym_rush_subsplits"); settings.Add("enter_giovanni_gym", true, "Enter Giovanni's Gym", "late_game_subsplits"); settings.Add("blackbelt", true, "Blackbelt", "late_game_subsplits"); settings.Add("viridian_rival", true, "Beat Viridian Rival", "late_game_subsplits"); settings.Add("exit_victory_road", true, "Exit Victory Road", "late_game_subsplits"); //-------------------------------------------------------------// refreshRate = 0.5; Assembly.Load(File.ReadAllBytes("Components/emu-help-v2")).CreateInstance("GBC"); vars.Helper.Load = (Func)(emu => { emu.Make("wSoundID", 0x0001); emu.Make("hofTile", 0x0490); emu.Make("wCurrentMenuItem", 0x0C26); emu.Make("wHoFMonOrPlayer", 0x0D40); emu.Make("wEnemyMonSpecies2", 0x0FD8); emu.Make("wEnemyMonNick", 0x0FDA); emu.Make("wBattleMonHP", 0x1016); emu.Make("wTrainerName", 0x104A); emu.Make("wTrainerNo", 0x105D); emu.Make("wPartyCount", 0x1163); emu.Make("wPartyMon1Exp", 0x117A); emu.Make("wPlayerID", 0x1359); emu.Make("wCurMap", 0x135E); emu.Make("wYCoord", 0x1361); emu.Make("wXCoord", 0x1362); emu.Make("wStack", 0x1FFD); // iohram starts 0xff00 emu.Make("rBGP", 0xFF47); emu.Make("hJoyHeld", 0xFFB4); emu.Make("wTextDest", 0x0C3A); return true; }); vars.Current = (Func)((name, value) => { return vars.Helper[name].Current == value; }); vars.IsOnTile = (Func)((MapID, YCoord, XCoord) => { return vars.Current("wCurMap", MapID) && vars.Current("wYCoord", YCoord) && vars.Current("wXCoord", XCoord); }); var enterMapBreakpoint = 0xAE03u; var itemJingleID = 0x94u; vars.GetSplitList = (Func>)(() => { bool battleOver = vars.Current("wEnemyMonSpecies2", 0) && vars.Current("wStack", enterMapBreakpoint); bool fadeWhite = vars.Current("rBGP", 0); return new Dictionary { {"nidoran", vars.Current("wCurMap", 0x21) && vars.Current("wPartyCount", 2) && vars.Current("wStack", enterMapBreakpoint)}, {"gym1", vars.Current("wTrainerName", 0x81918E82) && battleOver}, {"enterMtMoon", vars.IsOnTile(0x3B, 0x05, 0x12)}, {"exitMtMoon", vars.IsOnTile(0x0F, 0x03, 0x1B)}, {"nuggetBridge", vars.Current("wTrainerName", 0x918E828A) && vars.Current("wCurMap", 0x23) && battleOver}, {"gym2", vars.Current("wTrainerName", 0x8C889293) && battleOver}, {"gym3", vars.Current("wTrainerName", 0x8B93E892) && battleOver}, {"hm02", vars.Current("wSoundID", itemJingleID) && vars.Current("wCurMap", 0xBC)}, {"flute", vars.Current("wSoundID", itemJingleID) && vars.Current("wCurMap", 0x95)}, {"gym5", vars.Current("wTrainerName", 0x8A8E8680) && battleOver}, {"gym4", vars.Current("wTrainerName", 0x8491888A) && battleOver}, {"gym7", vars.Current("wTrainerName", 0x818B8088) && battleOver}, {"gym6", vars.Current("wTrainerName", 0x92808191) && battleOver}, {"gym8", vars.Current("wTrainerName", 0x86888E95) && vars.Current("wCurMap", 0x2D) && battleOver}, {"elite4_1", vars.Current("wTrainerName", 0x8B8E9184) && battleOver}, {"elite4_2", vars.Current("wTrainerName", 0x8191948D) && battleOver}, {"elite4_3", vars.Current("wTrainerName", 0x80868093) && battleOver}, {"elite4_4", vars.Current("wTrainerName", 0x8B808D82) && battleOver}, {"elite4_5", vars.Current("wEnemyMonNick", 0x95848D94) && vars.Current("wCurMap", 0x78) && battleOver}, {"hof", vars.Current("wCurMap", 0x76) && vars.Current("wHoFMonOrPlayer", 0x01000000) && vars.Current("hofTile", 0x79) && fadeWhite}, {"intro_tile", vars.IsOnTile(0x25, 0x1, 0x7)}, {"enter_lab", vars.IsOnTile(0x28, 0xB, 0xC)}, {"rival_one_start", vars.IsOnTile(0x28, 0x06, 0x05) && vars.Current("wPartyCount", 1)}, {"rival", vars.Current("wCurMap", 0) && vars.Current("wPartyCount", 1)}, {"route1_pass", vars.IsOnTile(0xC, 0x2, 0xE)}, {"deliver_parcel", vars.IsOnTile(0x28, 0x02, 0x04) && vars.Current("wSoundID", itemJingleID)}, {"route1_pass_2", vars.IsOnTile(0xC, 0x4, 0xC)}, {"pidgey", vars.Current("wCurMap", 0x0D) && vars.Current("wPartyCount", 3) && vars.Current("wStack", enterMapBreakpoint)}, {"forest_bc", vars.Current("wTrainerName", 0x8194867F) && vars.Current("wTrainerNo", 3) && battleOver}, {"pewter_enter", vars.IsOnTile(0x02, 0x22, 0x12)}, {"enter_gym_1", vars.IsOnTile(0x36, 0x11, 0x10)}, {"pewter_exit", vars.IsOnTile(0x0E, 0x08, 0x0B)}, {"beat_shorts_guy", vars.IsOnTile(0x0E, 0x04, 0x0D) && vars.Current("wStack", enterMapBreakpoint)}, {"route3", vars.Current("wTrainerName", 0x8194867F) && vars.Current("wTrainerNo", 6) && battleOver}, {"paras_catch", vars.Current("wCurMap", 0x3D) && vars.Current("wPartyCount", 4) && vars.Current("wStack", enterMapBreakpoint)}, {"moon_rocket", vars.IsOnTile(0x3D, 0x11, 0x0B) && vars.Current("wStack", enterMapBreakpoint)}, {"fossil", vars.IsOnTile(0x3D, 0x07, 0x0D) && vars.Current("wSoundID", itemJingleID)}, {"bridge_rival", vars.Current("wEnemyMonNick", 0x81948B81) && vars.Current("wCurMap", 0x03) && battleOver}, {"bridge_youngster", vars.IsOnTile(0x23, 0x1A, 0x0B) && vars.Current("wStack", enterMapBreakpoint)}, {"bill_house", vars.IsOnTile(0x58, 0x03, 0x2D)}, {"enter_gym_2", vars.IsOnTile(0x41, 0x13, 0x1E)}, {"route_6", vars.IsOnTile(0x11, 0x1C, 0x0F)}, {"boat_rival", vars.Current("wEnemyMonNick", 0x88959892) && vars.Current("wCurMap", 0x60) && battleOver}, {"enter_gym_3", vars.IsOnTile(0x5C, 0x13, 0x0C)}, {"enter_rock_tunnel", vars.IsOnTile(0x52, 0x11, 0x08)}, {"exit_rock_tunnel", vars.IsOnTile(0x15, 0x21, 0x0F)}, {"enter_celadon_mart", vars.IsOnTile(0x7A, 0x0D, 0x0A)}, {"enter_pkmn_tower", vars.IsOnTile(0x8E, 0x05, 0x0E)}, {"tower_rival", vars.Current("wEnemyMonNick", 0x88959892) && vars.Current("wCurMap", 0x8F) && battleOver}, {"channeler_3", vars.Current("wTrainerName", 0x8287808D) && vars.IsOnTile(0x93, 0x05, 0x0A) && battleOver}, {"tippy", vars.IsOnTile(0x94, 0x10, 0x09)}, {"silph_rival", vars.Current("wEnemyMonNick", 0x95848D94) && vars.IsOnTile(0xD4, 0x02, 0x03) && battleOver}, {"silph_gio", vars.Current("wTrainerName", 0x86888E95) && vars.Current("wCurMap", 0xEB) && battleOver}, {"enter_safari", vars.IsOnTile(0xDC, 0x00, 0x04)}, {"enter_koga_gym", vars.IsOnTile(0x9D, 0x1B, 0x05)}, {"enter_mansion", vars.IsOnTile(0xA5, 0x03, 0x06)}, {"enter_erika_gym", vars.IsOnTile(0x86, 0x1B, 0x0C)}, {"enter_blaine_gym", vars.IsOnTile(0xA6, 0x03, 0x12)}, {"q1", vars.IsOnTile(0xA6, 0x06, 0x12)}, {"q2", vars.IsOnTile(0xA6, 0x06, 0x0C)}, {"q3", vars.IsOnTile(0xA6, 0x0C, 0x0C)}, {"q4", vars.IsOnTile(0xA6, 0x10, 0x06)}, {"q5", vars.IsOnTile(0xA6, 0x0C, 0x04)}, {"q6", vars.IsOnTile(0xA6, 0x06, 0x04)}, {"enter_sabrina_gym", vars.IsOnTile(0xB2, 0x03, 0x22)}, {"enter_giovanni_gym", vars.IsOnTile(0x0B, 0x07, 0x20)}, {"blackbelt", vars.IsOnTile(0x2D, 0x04, 0x0A) && vars.Current("wStack", enterMapBreakpoint)}, {"viridian_rival", vars.Current("wEnemyMonNick", 0x95848D94) && vars.IsOnTile(0x21, 0x05, 0x1D) && battleOver}, {"exit_victory_road", vars.IsOnTile(0x22, 0x1F, 0x0E)}, }; }); vars.PrintVar = (Func)(name => { print(vars.Helper[name].Current.ToString()); return; }); vars.PrintHex = (Func)(name => { print(vars.Helper[name].Current.ToString("X")); return; }); } init { vars.pastSplits = new HashSet(); refreshRate = 200 / 3.0; } update { if(timer.CurrentPhase == TimerPhase.NotRunning && vars.pastSplits.Count > 0) { vars.pastSplits.Clear(); } } start { return current.wCurrentMenuItem == 0 && current.wPlayerID == 0 && current.wStack == 0x915B && (current.hJoyHeld & 0x80) == 0; } reset { var isRaceRun = timer.CurrentTime.ToString().StartsWith("-"); return current.wCurrentMenuItem == 1 && current.wPlayerID == 0 && current.wStack == 0x915B && !isRaceRun; } split { var splits = vars.GetSplitList(); foreach(var split in splits) { if (settings[split.Key] && split.Value && !vars.pastSplits.Contains(split.Key)) { vars.pastSplits.Add(split.Key); print("[AutoSplitter] Split: " + split.Key); return true; } } } exit { refreshRate = 0.5; }