BoardSpaceScripts:: ; used only for BANK(BoardSpaceScripts) BlueSpaceScript:: scall ArriveToRegularSpaceScript iftrue .not_landed scall LandedInRegularSpaceScript_BeforeSpaceEffect givecoins CUR_LEVEL_COINS, BLUE_RED_SPACE_COINS playsound SFX_TRANSACTION special PrintGainCoins scall LandedInRegularSpaceScript_AfterSpaceEffect .not_landed end RedSpaceScript:: scall ArriveToRegularSpaceScript iftrue .not_landed scall LandedInRegularSpaceScript_BeforeSpaceEffect takecoins CUR_LEVEL_COINS, BLUE_RED_SPACE_COINS playsound SFX_TRANSACTION special PrintLoseCoins scall LandedInRegularSpaceScript_AfterSpaceEffect .not_landed end GreenSpaceScript:: scall ArriveToRegularSpaceScript iftrue .not_landed scall LandedInRegularSpaceScript_BeforeSpaceEffect scall LandedInRegularSpaceScript_AfterSpaceEffect .not_landed end ItemSpaceScript:: scall ArriveToRegularSpaceScript iftrue .not_landed scall LandedInRegularSpaceScript_BeforeSpaceEffect opentext verbosegiveitem POTION closetext scall LandedInRegularSpaceScript_AfterSpaceEffect .not_landed end PokemonSpaceScript:: scall ArriveToRegularSpaceScript iftrue .not_landed scall LandedInRegularSpaceScript_BeforeSpaceEffect wait 200 loadpikachudata startbattle reloadmapafterbattle wait 100 scall LandedInRegularSpaceScript_AfterSpaceEffect .not_landed end MinigameSpaceScript:: scall ArriveToRegularSpaceScript iftrue .not_landed scall LandedInRegularSpaceScript_BeforeSpaceEffect wait 200 scall LandedInRegularSpaceScript_AfterSpaceEffect .not_landed end EndSpaceScript:: ; fading out will kick before reaching HandleMapBackground, so update sprites after any change scall ArriveToRegularSpaceScript scall LandedInRegularSpaceScript_BeforeSpaceEffect playmusic MUSIC_TRAINER_VICTORY wait 600 callasm .FadeOutSlow ; 800 ms wait 400 exitoverworld CLEARED_LEVEL endall .FadeOutSlow: ; clear spaces left sprites ld hl, wDisplaySecondarySprites res SECONDARYSPRITES_SPACES_LEFT_F, [hl] call UpdateActiveSprites ; stop map anims xor a ld [hMapAnims], a ; fade out slow to white ld b, RGBFADE_TO_WHITE_8BGP_8OBP jp DoRGBFadeEffect GreySpaceScript:: scall ArriveToRegularSpaceScript iftrue .not_landed scall LandedInRegularSpaceScript_BeforeSpaceEffect scall LandedInRegularSpaceScript_AfterSpaceEffect .not_landed end ArriveToRegularSpaceScript: playsound SFX_PRESENT callasm .ArriveToRegularSpace end .ArriveToRegularSpace: ; load new space ld a, [wCurSpaceNextSpace] ld [wCurSpace], a call LoadCurSpaceData ; decrease wSpacesLeft and copy to hScriptVar ld hl, wSpacesLeft dec [hl] ld a, [hl] ld [hScriptVar], a ; if landed, clear spaces left sprites and a jr nz, .not_landed ld hl, wDisplaySecondarySprites res SECONDARYSPRITES_SPACES_LEFT_F, [hl] .not_landed ; update sprites jp UpdateActiveSprites LandedInRegularSpaceScript_BeforeSpaceEffect: wait 300 turnobject PLAYER, DOWN wait 100 end LandedInRegularSpaceScript_AfterSpaceEffect: callasm .LandedInRegularSpace end .LandedInRegularSpace: ; disable the space effect (turn the space into a grey space) ld a, [wCurSpaceXCoord] add 4 ld d, a ld a, [wCurSpaceYCoord] add 4 ld e, a call GetBlockLocation ld a, [hl] and UNIQUE_SPACE_METATILES_MASK add FIRST_GREY_SPACE_METATILE ld [hl], a ; backup the disabled space to preserve it on map reload call BackupDisabledSpace ; trigger end of turn ld a, BOARDEVENT_END_TURN ldh [hCurBoardEvent], a ret BranchSpaceScript:: scall ArriveToBranchSpaceScript BranchSpaceScript_PromptPlayer:: callasm PromptPlayerToChooseBranchDirection iffalse .print_technique_required wait 200 end .print_technique_required opentext writetext .TechniqueRequiredText waitbutton closetext sjump BranchSpaceScript_PromptPlayer .TechniqueRequiredText: text "A new TECHNIQUE is" line "required!" done ArriveToBranchSpaceScript: playsound SFX_TWINKLE wait 400 callasm .ArriveToBranchSpace end .ArriveToBranchSpace: ; load new space ld a, [wCurSpaceNextSpace] ld [wCurSpace], a ; unlike in other cases, wCurSpaceNextSpace will not yet ; contain the next space after calling LoadCurSpaceData. ; it will be defined after the player has chosen which direction to take. call LoadCurSpaceData ; load the space's branch data call LoadTempSpaceBranchData call .DisableDirectionsRequiringLockedTechniques ; draw arrows for valid directions farcall LoadBranchSpaceGFX ld hl, wDisplaySecondarySprites set SECONDARYSPRITES_BRANCH_SPACE_F, [hl] ; update sprites jp UpdateActiveSprites .DisableDirectionsRequiringLockedTechniques: ; set to BRANCH_DIRECTION_UNAVAILABLE each next space byte of the branch struct ; that has an unavailable direction due to required techniques not yet unlocked. for curdir, 0, NUM_DIRECTIONS ld e, (NUM_TECHNIQUES + 7) / 8 ld hl, wTempSpaceBranchStruct + NUM_DIRECTIONS + curdir * (NUM_TECHNIQUES + 7) / 8 ld bc, wUnlockedTechniques .loop\@ ld a, [bc] and [hl] cp [hl] jr nz, .unavailable_next\@ dec e jr z, .available_next\@ inc bc inc hl jr .loop\@ .unavailable_next\@ ld a, BRANCH_DIRECTION_UNAVAILABLE ld [wTempSpaceBranchStruct + curdir], a .available_next\@ endr ret PromptPlayerToChooseBranchDirection: ; sample a dpad press or SELECT button call DelayFrame ld hl, wTempSpaceBranchStruct call GetJoypad ldh a, [hJoyPressed] and D_PAD | SELECT jr z, PromptPlayerToChooseBranchDirection cp SELECT ; check if SELECT pressed along with no dpad key jr nz, .not_select jp .EnterViewMapMode .not_select ; determine the status (ok/invalid/unavailable) of the chosen direction bit D_RIGHT_F, a jr z, .not_right ld a, [hl] inc a ; cp BRANCH_DIRECTION_INVALID jr z, PromptPlayerToChooseBranchDirection inc a ; cp BRANCH_DIRECTION_UNAVAILABLE jr z, .technique_required jr .direction_chosen .not_right inc hl bit D_LEFT_F, a jr z, .not_left ld a, [hl] inc a ; cp BRANCH_DIRECTION_INVALID jr z, PromptPlayerToChooseBranchDirection inc a ; cp BRANCH_DIRECTION_UNAVAILABLE jr z, .technique_required jr .direction_chosen .not_left inc hl bit D_UP_F, a jr z, .not_up ld a, [hl] inc a ; cp BRANCH_DIRECTION_INVALID jr z, PromptPlayerToChooseBranchDirection inc a ; cp BRANCH_DIRECTION_UNAVAILABLE jr z, .technique_required jr .direction_chosen .not_up inc hl ld a, [hl] inc a ; cp BRANCH_DIRECTION_INVALID jr z, PromptPlayerToChooseBranchDirection inc a ; cp BRANCH_DIRECTION_UNAVAILABLE jr z, .technique_required ; fallthrough .direction_chosen ; save the next space of the chosen direction to wCurSpaceNextSpace ld a, [hl] ld [wCurSpaceNextSpace], a ld hl, wDisplaySecondarySprites res SECONDARYSPRITES_BRANCH_SPACE_F, [hl] ld a, TRUE ldh [hScriptVar], a jp PlayClickSFX .technique_required xor a ; FALSE ldh [hScriptVar], a jp PlayClickSFX .EnterViewMapMode: call BackupMapObjectsOnEnterViewMapMode ld a, BOARDEVENT_VIEW_MAP_MODE ldh [hCurBoardEvent], a ld a, 100 ld [wViewMapModeRange], a ld a, [wMapGroup] ld [wBeforeViewMapMapGroup], a ld a, [wMapNumber] ld [wBeforeViewMapMapNumber], a ld a, [wXCoord] ld [wBeforeViewMapXCoord], a ld a, [wYCoord] ld [wBeforeViewMapYCoord], a ld a, [wPlayerDirection] ld [wBeforeViewMapDirection], a xor a ld [wViewMapModeDisplacementY], a ld [wViewMapModeDisplacementX], a call DisableOverworldHUD ld hl, wPlayerFlags set INVISIBLE_F, [hl] ld hl, wDisplaySecondarySprites res SECONDARYSPRITES_SPACES_LEFT_F, [hl] res SECONDARYSPRITES_BRANCH_SPACE_F, [hl] farcall MockPlayerObject call UpdateSprites farcall LoadViewMapModeGFX ld hl, wDisplaySecondarySprites set SECONDARYSPRITES_VIEW_MAP_MODE_F, [hl] ld a, TRUE ldh [hScriptVar], a jp PlayClickSFX UnionSpaceScript:: callasm .ArriveToUnionSpace end .ArriveToUnionSpace: ; these are just transition spaces, so simply load the next space ld a, [wCurSpaceNextSpace] ld [wCurSpace], a call LoadCurSpaceData ret PrintGainCoins: ld a, PAL_OW_MISC_BOARD_COINS | 0 ld [wCurOverworldMiscPal], a ld hl, wStringBuffer1 ld a, "" ld [hli], a ld a, "" ld [hli], a jr PrintGainOrLoseCoins PrintLoseCoins: ld a, PAL_OW_MISC_BOARD_COINS | 1 ld [wCurOverworldMiscPal], a ld hl, wStringBuffer1 ld a, "" ld [hli], a ld a, "" ld [hli], a ; fallthrough PrintGainOrLoseCoins: push hl farcall LoadOverworldMiscObjPal_ToObPals2 ld a, TRUE ldh [hCGBPalUpdate], a pop hl ; fill string space with "@" to ensure that it is terminated with at least one "@" push hl ld a, "@" ld c, MAX_DELTA_COINS_DIGITS + 1 .loop ld [hli], a dec c jr nz, .loop pop hl ; copy coins amount string to wStringBuffer1 + $2 ld de, hCoinsTemp lb bc, 3 | 1 << 6, MAX_DELTA_COINS_DIGITS ; 3 bytes, left aligned, no leading zeros, 5 digits call PrintNum ld hl, wDisplaySecondarySprites set SECONDARYSPRITES_GAIN_OR_LOSE_COINS_F, [hl] ; refresh overworld HUD, and show coins string 750 ms call UpdateActiveSprites call RefreshOverworldHUD ld c, 45 ; 750 ms call DelayFrames ld hl, wDisplaySecondarySprites res SECONDARYSPRITES_GAIN_OR_LOSE_COINS_F, [hl] ret INCLUDE "engine/board/disabled_spaces.asm"