; SL0P MENU - a top-level cheat menu opened with SELECT in the overworld ; (hooked in home/overworld.asm). Table-driven: each entry has a name in ; SlopMenuText and a handler in SlopMenuHandlers. A handler returns: ; carry SET -> a map warp was started; exit the menu and let it proceed ; carry CLEAR -> return to the SL0P menu (redraw) ; Handlers may be submenus (WarpSubmenu, GiveItemSubmenu) or direct actions. ; ; To add an entry: add a "NAME" line to SlopMenuText, a `dw Handler` to ; SlopMenuHandlers, and bump SLOP_MENU_COUNT. DEF SLOP_MENU_COUNT EQU 9 SECTION "Slop Menu", ROMX SlopMenu:: ; ---- open the menu display (shared by the top menu and every submenu) ---- ldh a, [hUILayoutFlags] set BIT_SINGLE_SPACED_LINES, a set BIT_DOUBLE_SPACED_MENU, a ldh [hUILayoutFlags], a ld a, $ff ld [wUpdateSpritesEnabled], a call ClearSprites .redraw call ClearScreen hlcoord 5, 0 ld de, SlopMenuTitle call PlaceString hlcoord 4, 2 lb bc, SLOP_MENU_COUNT + 2, 11 call TextBoxBorder hlcoord 6, 3 ld de, SlopMenuText call PlaceString ; ON marker for the NOWILD toggle (item 7 -> row 10) ld a, [wSlopNoWild] and a jr z, .nowildOff hlcoord 13, 10 ld de, SlopOnText call PlaceString .nowildOff call SlopMenuShow xor a ld [wCurrentMenuItem], a ld [wLastMenuItem], a ld [wMenuWatchMovingOutOfBounds], a ld [wMenuJoypadPollCount], a ld a, 5 ld [wTopMenuItemX], a ld a, 3 ld [wTopMenuItemY], a ld a, PAD_A | PAD_B ld [wMenuWatchedKeys], a ld a, SLOP_MENU_COUNT - 1 ld [wMaxMenuItem], a call HandleMenuInput bit B_PAD_B, a jr nz, .close ; dispatch: call SlopMenuHandlers[wCurrentMenuItem] ld a, [wCurrentMenuItem] add a ld e, a ld d, 0 ld hl, SlopMenuHandlers add hl, de ld a, [hli] ld h, [hl] ld l, a ld de, .afterHandler push de jp hl .afterHandler jr c, .exitProceed jr .redraw .exitProceed call SlopMenuRestoreFlags ret .close call SlopMenuRestoreFlags ld a, $01 ld [wUpdateSpritesEnabled], a call LoadScreenTilesFromBuffer2 jp CloseTextDisplay SlopMenuRestoreFlags: ldh a, [hUILayoutFlags] res BIT_SINGLE_SPACED_LINES, a res BIT_DOUBLE_SPACED_MENU, a ldh [hUILayoutFlags], a ret ; push wTileMap into VRAM and switch on the menu window display SlopMenuShow: ld b, HIGH(vBGMap1) call CopyScreenTileBufferToVRAM xor a ldh [hWY], a call LoadFontTilePatterns ld a, $01 ldh [hAutoBGTransferEnabled], a ret SlopMenuTitle: db "SL0P MENU@" SlopMenuText: db "WARP" next "HEAL" next "MONEY" next "BADGES" next "DEX" next "MAXTEAM" next "ITEMS" next "NOWILD" next "REPEL@" SlopOnText: db "ON@" SlopMenuHandlers: dw WarpSubmenu dw SlopHealParty dw SlopMaxCash dw SlopAllBadges dw SlopDex dw SlopMaxTeam dw GiveItemSubmenu dw SlopToggleNoWild dw SlopRepel ; =========================================================================== ; WARP submenu ; =========================================================================== DEF WARP_COUNT EQU 13 WarpSubmenu: call ClearScreen hlcoord 4, 0 ld de, WarpTitleText1 call PlaceString hlcoord 5, 1 ld de, WarpTitleText2 call PlaceString hlcoord 3, 2 lb bc, 13, 11 call TextBoxBorder hlcoord 5, 3 ld de, WarpMenuText call PlaceString call SlopMenuShow xor a ld [wCurrentMenuItem], a ld [wLastMenuItem], a ld [wMenuWatchMovingOutOfBounds], a ld [wMenuJoypadPollCount], a ld a, 4 ld [wTopMenuItemX], a ld a, 3 ld [wTopMenuItemY], a ld a, PAD_A | PAD_B ld [wMenuWatchedKeys], a ld a, WARP_COUNT - 1 ld [wMaxMenuItem], a call HandleMenuInput bit B_PAD_B, a jr nz, .cancel ld a, [wCurrentMenuItem] ld e, a ld d, 0 ld hl, WarpMapTable add hl, de ld a, [hl] ld [wDestinationMap], a ld hl, wStatusFlags6 set BIT_FLY_WARP, [hl] scf ret .cancel and a ret WarpTitleText1: db "SECRET SL0P@" WarpTitleText2: db "WARP MENU@" WarpMenuText: db "PALLET" next "VIRIDIAN" next "PEWTER" next "CERULEAN" next "LAVENDER" next "VERMILION" next "CELADON" next "FUCHSIA" next "CINNABAR" next "INDIGO" next "SAFFRON" next "ROUTE 4" next "ROUTE 10@" WarpMapTable: db PALLET_TOWN, VIRIDIAN_CITY, PEWTER_CITY, CERULEAN_CITY, LAVENDER_TOWN db VERMILION_CITY, CELADON_CITY, FUCHSIA_CITY, CINNABAR_ISLAND, INDIGO_PLATEAU db SAFFRON_CITY, ROUTE_4, ROUTE_10 ; =========================================================================== ; ITEMS submenu: give 99 of the chosen item (stacks via GiveItem) ; =========================================================================== DEF GIVE_COUNT EQU 8 GiveItemSubmenu: call ClearScreen hlcoord 6, 0 ld de, GiveTitleText call PlaceString hlcoord 1, 1 lb bc, GIVE_COUNT + 2, 16 call TextBoxBorder hlcoord 3, 2 ld de, GiveItemText call PlaceString call SlopMenuShow xor a ld [wCurrentMenuItem], a ld [wLastMenuItem], a ld [wMenuWatchMovingOutOfBounds], a ld [wMenuJoypadPollCount], a ld a, 2 ld [wTopMenuItemX], a ld [wTopMenuItemY], a ld a, PAD_A | PAD_B ld [wMenuWatchedKeys], a ld a, GIVE_COUNT - 1 ld [wMaxMenuItem], a call HandleMenuInput bit B_PAD_B, a jr nz, .back ld a, [wCurrentMenuItem] ld e, a ld d, 0 ld hl, GiveItemTable add hl, de ld b, [hl] ld c, 99 call GiveItem .back and a ret GiveTitleText: db "GIVE x99@" GiveItemText: db "MASTER BALL" next "ULTRA BALL" next "RARE CANDY" next "FULL RESTORE" next "MAX REVIVE" next "MAX ELIXER" next "PP UP" next "NUGGET@" GiveItemTable: db MASTER_BALL, ULTRA_BALL, RARE_CANDY, FULL_RESTORE db MAX_REVIVE, MAX_ELIXER, PP_UP, NUGGET ; =========================================================================== ; Direct-action cheats (return carry clear -> back to the SL0P menu) ; =========================================================================== ; HEAL: full HP + clear status for the whole party. SlopHealParty: ld a, [wPartyCount] and a jr z, .done ld c, a ld hl, wPartyMon1 .loop push hl ld de, $04 add hl, de xor a ld [hl], a ; status = 0 pop hl push hl ld de, $22 add hl, de ; -> maxHP ld a, [hli] ld b, a ld e, [hl] ld d, b pop hl push hl inc hl ; -> curHP ld a, d ld [hli], a ld a, e ld [hl], a pop hl ld de, $2C add hl, de dec c jr nz, .loop .done and a ret ; MONEY: 999999 (BCD) SlopMaxCash: ld a, $99 ld [wPlayerMoney], a ld [wPlayerMoney + 1], a ld [wPlayerMoney + 2], a and a ret ; NOWILD toggle: no wild encounters (hooked in TryDoWildEncounter) SlopToggleNoWild: ld a, [wSlopNoWild] xor $01 ld [wSlopNoWild], a and a ret ; REPEL: refill repel steps SlopRepel: ld a, 255 ld [wRepelRemainingSteps], a and a ret ; BADGES: all 8 SlopAllBadges: ld a, $ff ld [wObtainedBadges], a and a ret ; DEX: mark every Pokemon owned + seen (19-byte flag arrays; last byte = 7 bits) SlopDex: ld hl, wPokedexOwned call .fill ld hl, wPokedexSeen call .fill and a ret .fill ld c, 18 .floop ld a, $ff ld [hli], a dec c jr nz, .floop ld [hl], $7f ret ; MAXTEAM: level 100, perfect DVs, maxed EVs, 999 stats + HP, exp = lvl 100 SlopMaxTeam: ld a, [wPartyCount] and a jr z, .done ld c, a ld hl, wPartyMon1 .loop push bc push hl ; current HP (+$01) = 999 inc hl ld a, $03 ld [hli], a ld a, $E7 ld [hl], a pop hl push hl ; exp (+$0E) = 1,000,000 ld de, $0E add hl, de ld a, $0F ld [hli], a ld a, $42 ld [hli], a ld a, $40 ld [hli], a ; EVs (+$11..$1A) = FFFF x5, then DVs (+$1B..$1C) = FFFF -> 12 bytes of $FF ld b, 12 .ffloop ld a, $ff ld [hli], a dec b jr nz, .ffloop pop hl push hl ; level (+$21) = 100 ld de, $21 add hl, de ld a, 100 ld [hli], a ; maxHP + 4 stats (+$22..$2B) = 999 x5 ld b, 5 .statloop ld a, $03 ld [hli], a ld a, $E7 ld [hli], a dec b jr nz, .statloop pop hl ld de, $2C add hl, de pop bc dec c jr nz, .loop .done and a ret