diff options
Diffstat (limited to 'engine')
-rw-r--r-- | engine/battle/consume_held_item.asm | 57 | ||||
-rw-r--r-- | engine/battle/returntobattle_useball.asm | 19 | ||||
-rw-r--r-- | engine/events/prof_oaks_pc.asm | 193 | ||||
-rwxr-xr-x | engine/items/item_effects.asm | 6 | ||||
-rw-r--r-- | engine/overworld/decorations.asm | 1168 |
5 files changed, 1440 insertions, 3 deletions
diff --git a/engine/battle/consume_held_item.asm b/engine/battle/consume_held_item.asm new file mode 100644 index 00000000..c5e3b204 --- /dev/null +++ b/engine/battle/consume_held_item.asm @@ -0,0 +1,57 @@ +ConsumeHeldItem: + push hl + push de + push bc + ldh a, [hBattleTurn] + and a + ld hl, wOTPartyMon1Item + ld de, wEnemyMonItem + ld a, [wCurOTMon] + jr z, .theirturn + ld hl, wPartyMon1Item + ld de, wBattleMonItem + ld a, [wCurBattleMon] + +.theirturn + push hl + push af + ld a, [de] + ld b, a + farcall GetItemHeldEffect + ld hl, ConsumableEffects +.loop + ld a, [hli] + cp b + jr z, .ok + inc a + jr nz, .loop + pop af + pop hl + pop bc + pop de + pop hl + ret + +.ok + xor a + ld [de], a + pop af + pop hl + call GetPartyLocation + ldh a, [hBattleTurn] + and a + jr nz, .ourturn + ld a, [wBattleMode] + dec a + jr z, .done + +.ourturn + ld [hl], NO_ITEM + +.done + pop bc + pop de + pop hl + ret + +INCLUDE "data/battle/held_consumables.asm" diff --git a/engine/battle/returntobattle_useball.asm b/engine/battle/returntobattle_useball.asm new file mode 100644 index 00000000..fd138ae6 --- /dev/null +++ b/engine/battle/returntobattle_useball.asm @@ -0,0 +1,19 @@ +_ReturnToBattle_UseBall: + call ClearBGPalettes + call ClearTilemap + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jr z, .gettutorialbackpic + farcall GetBattleMonBackpic + jr .continue + +.gettutorialbackpic + farcall GetTrainerBackpic +.continue + farcall GetEnemyMonFrontpic + farcall _LoadBattleFontsHPBar + call GetMemSGBLayout + call CloseWindow + call LoadStandardMenuHeader + call WaitBGMap + jp SetPalettes diff --git a/engine/events/prof_oaks_pc.asm b/engine/events/prof_oaks_pc.asm new file mode 100644 index 00000000..40230d5b --- /dev/null +++ b/engine/events/prof_oaks_pc.asm @@ -0,0 +1,193 @@ +ProfOaksPC: + ld hl, OakPCText1 + call MenuTextbox + call YesNoBox + jr c, .shutdown + call ProfOaksPCBoot ; player chose "yes"? +.shutdown + ld hl, OakPCText4 + call PrintText + call JoyWaitAorB + call ExitMenu + ret + +ProfOaksPCBoot: + ld hl, OakPCText2 + call PrintText + call Rate + call PlaySFX ; sfx loaded by previous Rate function call + call JoyWaitAorB + call WaitSFX + ret + +ProfOaksPCRating: + call Rate + push de + ld de, MUSIC_NONE + call PlayMusic + pop de + call PlaySFX + call JoyWaitAorB + call WaitSFX + ret + +Rate: +; calculate Seen/Owned + ld hl, wPokedexSeen + ld b, wEndPokedexSeen - wPokedexSeen + call CountSetBits + ld [wceed], a + ld hl, wPokedexCaught + ld b, wEndPokedexCaught - wPokedexCaught + call CountSetBits + ld [wceee], a + +; print appropriate rating + call .UpdateRatingBuffers + ld hl, OakPCText3 + call PrintText + call JoyWaitAorB + ld a, [wceee] + ld hl, OakRatings + call FindOakRating + push de + call PrintText + pop de + ret + +.UpdateRatingBuffers: + ld hl, wStringBuffer3 + ld de, wceed + call .UpdateRatingBuffer + ld hl, wStringBuffer4 + ld de, wceee + call .UpdateRatingBuffer + ret + +.UpdateRatingBuffer: + push hl + ld a, "@" + ld bc, ITEM_NAME_LENGTH + call ByteFill + pop hl + lb bc, PRINTNUM_LEFTALIGN | 1, 3 + call PrintNum + ret + +FindOakRating: +; return sound effect in de +; return text pointer in hl + nop + ld c, a +.loop + ld a, [hli] + cp c + jr nc, .match +rept 4 + inc hl +endr + jr .loop + +.match + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld h, [hl] + ld l, a + ret + +INCLUDE "data/events/pokedex_ratings.asm" + +OakPCText1: + text_far _OakPCText1 + text_end + +OakPCText2: + text_far _OakPCText2 + text_end + +OakPCText3: + text_far _OakPCText3 + text_end + +OakRating01: + text_far _OakRating01 + text_end + +OakRating02: + text_far _OakRating02 + text_end + +OakRating03: + text_far _OakRating03 + text_end + +OakRating04: + text_far _OakRating04 + text_end + +OakRating05: + text_far _OakRating05 + text_end + +OakRating06: + text_far _OakRating06 + text_end + +OakRating07: + text_far _OakRating07 + text_end + +OakRating08: + text_far _OakRating08 + text_end + +OakRating09: + text_far _OakRating09 + text_end + +OakRating10: + text_far _OakRating10 + text_end + +OakRating11: + text_far _OakRating11 + text_end + +OakRating12: + text_far _OakRating12 + text_end + +OakRating13: + text_far _OakRating13 + text_end + +OakRating14: + text_far _OakRating14 + text_end + +OakRating15: + text_far _OakRating15 + text_end + +OakRating16: + text_far _OakRating16 + text_end + +OakRating17: + text_far _OakRating17 + text_end + +OakRating18: + text_far _OakRating18 + text_end + +OakRating19: + text_far _OakRating19 + text_end + +OakPCText4: + text_far _OakPCText4 + text_end diff --git a/engine/items/item_effects.asm b/engine/items/item_effects.asm index e5a0960b..3b31aef8 100755 --- a/engine/items/item_effects.asm +++ b/engine/items/item_effects.asm @@ -996,8 +996,8 @@ Text_AskNicknameNewlyCaughtMon: text_far Text_AskNicknameNewlyCaughtMon_ db "@" -ReturnToBattle_UseBall: ; ee4e (3:6e4e) - farcall ReturnToBattle_UseBall_ ; 9:7307 +ReturnToBattle_UseBall: + farcall _ReturnToBattle_UseBall ret TownMap: ; ee55 (3:6e55) @@ -2413,7 +2413,7 @@ NormalBox: ; f7aa (3:77aa) GorgeousBox: ; f7ae (3:77ae) ld c, DECOFLAG_GOLD_TROPHY_DOLL asm_f7b0: - farcall ReceiveDecorationC ; 9:70d5 + farcall SetSpecificDecorationFlag ld hl, Text_TrophyInside ; $77bf call PrintText jp Functionf7dc diff --git a/engine/overworld/decorations.asm b/engine/overworld/decorations.asm new file mode 100644 index 00000000..c9889472 --- /dev/null +++ b/engine/overworld/decorations.asm @@ -0,0 +1,1168 @@ +InitDecorations: + ld a, DECO_FEATHERY_BED + ld [wDecoBed], a + ld a, DECO_TOWN_MAP + ld [wDecoPoster], a + ret + +_PlayerDecorationMenu: + ld a, [wWhichIndexSet] + push af + ld hl, .MenuHeader + call LoadMenuHeader + xor a + ld [wBuffer5], a + ld a, $1 + ld [wBuffer6], a +.top_loop + ld a, [wBuffer6] + ld [wMenuCursorBuffer], a + call .FindCategoriesWithOwnedDecos + call DoNthMenu + ld a, [wMenuCursorY] + ld [wBuffer6], a + jr c, .exit_menu + ld a, [wMenuSelection] + ld hl, .pointers + call MenuJumptable + jr nc, .top_loop + +.exit_menu + call ExitMenu + pop af + ld [wWhichIndexSet], a + ld a, [wBuffer5] + ld c, a + ret + +.MenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 5, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default option + +.MenuData: + db STATICMENU_CURSOR | STATICMENU_WRAP ; flags + db 0 ; items + dw wceed + dw PlaceNthMenuStrings + dw .pointers + +.pointers + dw DecoBedMenu, .bed + dw DecoCarpetMenu, .carpet + dw DecoPlantMenu, .plant + dw DecoPosterMenu, .poster + dw DecoConsoleMenu, .game + dw DecoOrnamentMenu, .ornament + dw DecoBigDollMenu, .big_doll + dw DecoExitMenu, .exit + +.bed db "BED@" +.carpet db "CARPET@" +.plant db "PLANT@" +.poster db "POSTER@" +.game db "GAME CONSOLE@" +.ornament db "ORNAMENT@" +.big_doll db "BIG DOLL@" +.exit db "EXIT@" + +.FindCategoriesWithOwnedDecos: + xor a + ld [wWhichIndexSet], a + call .ClearStringBuffer2 + call .FindOwndDecos + ld a, 7 + call .AppendToStringBuffer2 + ld hl, wStringBuffer2 + ld de, wceed + ld bc, ITEM_NAME_LENGTH + call CopyBytes + ret + +.ClearStringBuffer2: + ld hl, wStringBuffer2 + xor a + ld [hli], a + ld bc, ITEM_NAME_LENGTH - 1 + ld a, -1 + call ByteFill + ret + +.AppendToStringBuffer2: + ld hl, wStringBuffer2 + inc [hl] + ld e, [hl] + ld d, 0 + add hl, de + ld [hl], a + ret + +.FindOwndDecos: + ld hl, .dw +.loop + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + or e + jr z, .done + push hl + call _de_ + pop hl + jr nc, .next + ld a, [hl] + push hl + call .AppendToStringBuffer2 + pop hl +.next + inc hl + jr .loop +.done + ret + +.dw + dwb FindOwnedBeds, 0 ; bed + dwb FindOwnedCarpets, 1 ; carpet + dwb FindOwnedPlants, 2 ; plant + dwb FindOwnedPosters, 3 ; poster + dwb FindOwnedConsoles, 4 ; game console + dwb FindOwnedOrnaments, 5 ; ornament + dwb FindOwnedBigDolls, 6 ; big doll + dw 0 ; end + +Deco_FillTempWithMinusOne: + xor a + ld hl, wceed + ld [hli], a + ld a, -1 + ld bc, $10 + call ByteFill + ret + +CheckAllDecorationFlags: +.loop + ld a, [hli] + cp -1 + jr z, .done + push hl + push af + ld b, CHECK_FLAG + call DecorationFlagAction + ld a, c + and a + pop bc + ld a, b + call nz, AppendDecoIndex + pop hl + jr .loop + +.done + ret + +AppendDecoIndex: + ld hl, wceed + inc [hl] + ld e, [hl] + ld d, $0 + add hl, de + ld [hl], a + ret + +FindOwnedDecosInCategory: + push bc + push hl + call Deco_FillTempWithMinusOne + pop hl + call CheckAllDecorationFlags + pop bc + ld a, [wceed] + and a + ret z + + ld a, c + call AppendDecoIndex + ld a, 0 + call AppendDecoIndex + scf + ret + +DecoBedMenu: + call FindOwnedBeds + call PopulateDecoCategoryMenu + xor a + ret + +FindOwnedBeds: + ld hl, .beds + ld c, BEDS + jp FindOwnedDecosInCategory + +.beds + db DECO_FEATHERY_BED ; 2 + db DECO_PINK_BED ; 3 + db DECO_POLKADOT_BED ; 4 + db DECO_PIKACHU_BED ; 5 + db -1 + +DecoCarpetMenu: + call FindOwnedCarpets + call PopulateDecoCategoryMenu + xor a + ret + +FindOwnedCarpets: + ld hl, .carpets + ld c, CARPETS + jp FindOwnedDecosInCategory + +.carpets + db DECO_RED_CARPET ; 7 + db DECO_BLUE_CARPET ; 8 + db DECO_YELLOW_CARPET ; 9 + db DECO_GREEN_CARPET ; a + db -1 + +DecoPlantMenu: + call FindOwnedPlants + call PopulateDecoCategoryMenu + xor a + ret + +FindOwnedPlants: + ld hl, .plants + ld c, PLANTS + jp FindOwnedDecosInCategory + +.plants + db DECO_MAGNAPLANT ; c + db DECO_TROPICPLANT ; d + db DECO_JUMBOPLANT ; e + db -1 + +DecoPosterMenu: + call FindOwnedPosters + call PopulateDecoCategoryMenu + xor a + ret + +FindOwnedPosters: + ld hl, .posters + ld c, POSTERS + jp FindOwnedDecosInCategory + +.posters + db DECO_TOWN_MAP ; 10 + db DECO_PIKACHU_POSTER ; 11 + db DECO_CLEFAIRY_POSTER ; 12 + db DECO_JIGGLYPUFF_POSTER ; 13 + db -1 + +DecoConsoleMenu: + call FindOwnedConsoles + call PopulateDecoCategoryMenu + xor a + ret + +FindOwnedConsoles: + ld hl, .consoles + ld c, CONSOLES + jp FindOwnedDecosInCategory + +.consoles + db DECO_FAMICOM ; 15 + db DECO_SNES ; 16 + db DECO_N64 ; 17 + db DECO_VIRTUAL_BOY ; 18 + db -1 + +DecoOrnamentMenu: + call FindOwnedOrnaments + call PopulateDecoCategoryMenu + xor a + ret + +FindOwnedOrnaments: + ld hl, .ornaments + ld c, DOLLS + jp FindOwnedDecosInCategory + +.ornaments + db DECO_PIKACHU_DOLL ; 1e + db DECO_SURF_PIKACHU_DOLL ; 1f + db DECO_CLEFAIRY_DOLL ; 20 + db DECO_JIGGLYPUFF_DOLL ; 21 + db DECO_BULBASAUR_DOLL ; 22 + db DECO_CHARMANDER_DOLL ; 23 + db DECO_SQUIRTLE_DOLL ; 24 + db DECO_POLIWAG_DOLL ; 25 + db DECO_DIGLETT_DOLL ; 26 + db DECO_STARMIE_DOLL ; 27 + db DECO_MAGIKARP_DOLL ; 28 + db DECO_ODDISH_DOLL ; 29 + db DECO_GENGAR_DOLL ; 2a + db DECO_SHELLDER_DOLL ; 2b + db DECO_GRIMER_DOLL ; 2c + db DECO_VOLTORB_DOLL ; 2d + db DECO_WEEDLE_DOLL ; 2e + db DECO_UNOWN_DOLL ; 2f + db DECO_GEODUDE_DOLL ; 30 + db DECO_MACHOP_DOLL ; 31 + db DECO_TENTACOOL_DOLL ; 32 + db DECO_GOLD_TROPHY_DOLL ; 33 + db DECO_SILVER_TROPHY_DOLL ; 34 + db -1 + +DecoBigDollMenu: + call FindOwnedBigDolls + call PopulateDecoCategoryMenu + xor a + ret + +FindOwnedBigDolls: + ld hl, .big_dolls + ld c, BIG_DOLLS + jp FindOwnedDecosInCategory + +.big_dolls + db DECO_BIG_SNORLAX_DOLL ; 1a + db DECO_BIG_ONIX_DOLL ; 1b + db DECO_BIG_LAPRAS_DOLL ; 1c + db -1 + +DecoExitMenu: + scf + ret + +PopulateDecoCategoryMenu: + ld a, [wceed] + and a + jr z, .empty + cp 8 + jr nc, .beyond_eight + xor a + ld [wWhichIndexSet], a + ld hl, .NonscrollingMenuHeader + call LoadMenuHeader + call DoNthMenu + jr c, .no_action_1 + call DoDecorationAction2 + +.no_action_1 + call ExitMenu + ret + +.beyond_eight + ld hl, wceed + ld e, [hl] + dec [hl] + ld d, 0 + add hl, de + ld [hl], -1 + call LoadStandardMenuHeader + ld hl, .ScrollingMenuHeader + call CopyMenuHeader + xor a + ldh [hBGMapMode], a + call InitScrollingMenu + xor a + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuJoypad] + cp 2 + jr z, .no_action_2 + call DoDecorationAction2 + +.no_action_2 + call ExitMenu + ret + +.empty + ld hl, .NothingToChooseText + call MenuTextboxBackup + ret + +.NothingToChooseText: + text_far _NothingToChooseText + text_end + +.NonscrollingMenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .NonscrollingMenuData + db 1 ; default option + +.NonscrollingMenuData: + db STATICMENU_CURSOR | STATICMENU_WRAP ; flags + db 0 ; items + dw wceed + dw DecorationMenuFunction + dw DecorationAttributes + +.ScrollingMenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 1, 1, SCREEN_WIDTH - 2, SCREEN_HEIGHT - 2 + dw .ScrollingMenuData + db 1 ; default option + +.ScrollingMenuData: + db SCROLLINGMENU_DISPLAY_ARROWS ; flags + db 8, 0 ; rows, columns + db SCROLLINGMENU_ITEMS_NORMAL ; item format + dbw 0, wceed ; text pointer + dba DecorationMenuFunction + dbw 0, 0 + dbw 0, 0 + +GetDecorationData: + ld hl, DecorationAttributes + ld bc, 6 + call AddNTimes + ret + +GetDecorationName: + push hl + call GetDecorationData + call GetDecoName + pop hl + call CopyName2 + ret + +DecorationMenuFunction: + ld a, [wMenuSelection] + push de + call GetDecorationData + call GetDecoName + pop hl + call PlaceString + ret + +DoDecorationAction2: + ld a, [wMenuSelection] + call GetDecorationData + ld de, 2 ; function 2 + add hl, de + ld a, [hl] + ld hl, .DecoActions + rst JumpTable + ret + +.DecoActions: + dw DecoAction_nothing + dw DecoAction_setupbed + dw DecoAction_putawaybed + dw DecoAction_setupcarpet + dw DecoAction_putawaycarpet + dw DecoAction_setupplant + dw DecoAction_putawayplant + dw DecoAction_setupposter + dw DecoAction_putawayposter + dw DecoAction_setupconsole + dw DecoAction_putawayconsole + dw DecoAction_setupbigdoll + dw DecoAction_putawaybigdoll + dw DecoAction_setupornament + dw DecoAction_putawayornament + +GetDecorationFlag: + call GetDecorationData + ld de, 3 ; event flag + add hl, de + ld a, [hli] + ld d, [hl] + ld e, a + ret + +DecorationFlagAction: + push bc + call GetDecorationFlag + pop bc + call EventFlagAction + ret + +GetDecorationSprite: + ld a, c + call GetDecorationData + ld de, 5 ; sprite + add hl, de + ld a, [hl] + ld c, a + ret + +INCLUDE "data/decorations/attributes.asm" + +INCLUDE "data/decorations/names.asm" + +GetDecoName: + ld a, [hli] + ld e, [hl] + ld bc, wStringBuffer2 + push bc + ld hl, .NameFunctions + rst JumpTable + pop de + ret + +.NameFunctions: + dw .invalid + dw .plant + dw .bed + dw .carpet + dw .poster + dw .doll + dw .bigdoll + +.invalid + ret + +.plant + ld a, e + jr .getdeconame + +.bed + call .plant + ld a, _BED + jr .getdeconame + +.carpet + call .plant + ld a, _CARPET + jr .getdeconame + +.poster + ld a, e + call .getpokename + ld a, _POSTER + jr .getdeconame + +.doll + ld a, e + call .getpokename + ld a, _DOLL + jr .getdeconame + +.bigdoll + push de + ld a, BIG_ + call .getdeconame + pop de + ld a, e + jr .getpokename + +.getpokename + push bc + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + pop bc + jr .copy + +.getdeconame + call ._getdeconame + jr .copy + +._getdeconame + push bc + ld hl, DecorationNames + call GetNthString + ld d, h + ld e, l + pop bc + ret + +.copy + ld h, b + ld l, c + call CopyName2 + dec hl + ld b, h + ld c, l + ret + +DecoAction_nothing: + scf + ret + +DecoAction_setupbed: + ld hl, wDecoBed + jp DecoAction_TrySetItUp + +DecoAction_putawaybed: + ld hl, wDecoBed + jp DecoAction_TryPutItAway + +DecoAction_setupcarpet: + ld hl, wDecoCarpet + jp DecoAction_TrySetItUp + +DecoAction_putawaycarpet: + ld hl, wDecoCarpet + jp DecoAction_TryPutItAway + +DecoAction_setupplant: + ld hl, wDecoPlant + jp DecoAction_TrySetItUp + +DecoAction_putawayplant: + ld hl, wDecoPlant + jp DecoAction_TryPutItAway + +DecoAction_setupposter: + ld hl, wDecoPoster + jp DecoAction_TrySetItUp + +DecoAction_putawayposter: + ld hl, wDecoPoster + jp DecoAction_TryPutItAway + +DecoAction_setupconsole: + ld hl, wDecoConsole + jp DecoAction_TrySetItUp + +DecoAction_putawayconsole: + ld hl, wDecoConsole + jp DecoAction_TryPutItAway + +DecoAction_setupbigdoll: + ld hl, wDecoBigDoll + jp DecoAction_TrySetItUp + +DecoAction_putawaybigdoll: + ld hl, wDecoBigDoll + jp DecoAction_TryPutItAway + +DecoAction_TrySetItUp: + ld a, [hl] + ld [wBuffer1], a + push hl + call DecoAction_SetItUp + jr c, .failed + ld a, 1 + ld [wBuffer5], a + pop hl + ld a, [wMenuSelection] + ld [hl], a + xor a + ret + +.failed + pop hl + xor a + ret + +DecoAction_SetItUp: +; See if there's anything of the same type already out + ld a, [wBuffer1] + and a + jr z, .nothingthere +; See if that item is already out + ld b, a + ld a, [wMenuSelection] + cp b + jr z, .alreadythere +; Put away the item that's already out, and set up the new one + ld a, [wMenuSelection] + ld hl, wStringBuffer4 + call GetDecorationName + ld a, [wBuffer1] + ld hl, wStringBuffer3 + call GetDecorationName + ld hl, PutAwayAndSetUpText + call MenuTextboxBackup + xor a + ret + +.nothingthere + ld a, [wMenuSelection] + ld hl, wStringBuffer3 + call GetDecorationName + ld hl, SetUpTheDecoText + call MenuTextboxBackup + xor a + ret + +.alreadythere + ld hl, AlreadySetUpText + call MenuTextboxBackup + scf + ret + +DecoAction_TryPutItAway: +; If there is no item of that type already set, there is nothing to put away. + ld a, [hl] + ld [wBuffer1], a + xor a + ld [hl], a + ld a, [wBuffer1] + and a + jr z, .nothingthere +; Put it away. + ld a, $1 + ld [wBuffer5], a + ld a, [wBuffer1] + ld [wMenuSelection], a + ld hl, wStringBuffer3 + call GetDecorationName + ld hl, PutAwayTheDecoText + call MenuTextboxBackup + xor a + ret + +.nothingthere + ld hl, NothingToPutAwayText + call MenuTextboxBackup + xor a + ret + +DecoAction_setupornament: + ld hl, WhichSidePutOnText + call DecoAction_AskWhichSide + jr c, .cancel + call DecoAction_SetItUp_Ornament + jr c, .cancel + ld a, $1 + ld [wBuffer5], a + jr DecoAction_FinishUp_Ornament + +.cancel + xor a + ret + +DecoAction_putawayornament: + ld hl, WhichSidePutAwayText + call DecoAction_AskWhichSide + jr nc, .incave + xor a + ret + +.incave + call DecoAction_PutItAway_Ornament + +DecoAction_FinishUp_Ornament: + call QueryWhichSide + ld a, [wSelectedDecoration] + ld [hl], a + ld a, [wOtherDecoration] + ld [de], a + xor a + ret + +DecoAction_SetItUp_Ornament: + ld a, [wSelectedDecoration] + and a + jr z, .nothingthere + ld b, a + ld a, [wMenuSelection] + cp b + jr z, .failed + ld a, b + ld hl, wStringBuffer3 + call GetDecorationName + ld a, [wMenuSelection] + ld hl, wStringBuffer4 + call GetDecorationName + ld a, [wMenuSelection] + ld [wSelectedDecoration], a + call .getwhichside + ld hl, PutAwayAndSetUpText + call MenuTextboxBackup + xor a + ret + +.nothingthere + ld a, [wMenuSelection] + ld [wSelectedDecoration], a + call .getwhichside + ld a, [wMenuSelection] + ld hl, wStringBuffer3 + call GetDecorationName + ld hl, SetUpTheDecoText + call MenuTextboxBackup + xor a + ret + +.failed + ld hl, AlreadySetUpText + call MenuTextboxBackup + scf + ret + +.getwhichside + ld a, [wMenuSelection] + ld b, a + ld a, [wOtherDecoration] + cp b + ret nz + xor a + ld [wOtherDecoration], a + ret + +WhichSidePutOnText: + text_far _WhichSidePutOnText + text_end + +DecoAction_PutItAway_Ornament: + ld a, [wSelectedDecoration] + and a + jr z, .nothingthere + ld hl, wStringBuffer3 + call GetDecorationName + ld a, $1 + ld [wBuffer5], a + xor a + ld [wSelectedDecoration], a + ld hl, PutAwayTheDecoText + call MenuTextboxBackup + xor a + ret + +.nothingthere + ld hl, NothingToPutAwayText + call MenuTextboxBackup + xor a + ret + +WhichSidePutAwayText: + text_far _WhichSidePutAwayText + text_end + +DecoAction_AskWhichSide: + call MenuTextbox + ld hl, MenuHeader_0x2707e + call GetMenu2 + call ExitMenu + call CopyMenuData + jr c, .nope + ld a, [wMenuCursorY] + cp 3 + jr z, .nope + ld [wBuffer2], a + call QueryWhichSide + ld a, [hl] + ld [wSelectedDecoration], a + ld a, [de] + ld [wOtherDecoration], a + xor a + ret + +.nope + scf + ret + +QueryWhichSide: + ld hl, wDecoRightOrnament + ld de, wDecoLeftOrnament + ld a, [wBuffer2] + cp 1 + ret z + push hl + ld h, d + ld l, e + pop de + ret + +MenuHeader_0x2707e: + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 12, 7 + dw MenuData_0x27086 + db 1 ; default option + +MenuData_0x27086: + db STATICMENU_CURSOR ; flags + db 3 ; items + db "RIGHT SIDE@" + db "LEFT SIDE@" + db "CANCEL@" + +PutAwayTheDecoText: + text_far _PutAwayTheDecoText + text_end + +NothingToPutAwayText: + text_far _NothingToPutAwayText + text_end + +SetUpTheDecoText: + text_far _SetUpTheDecoText + text_end + +PutAwayAndSetUpText: + text_far _PutAwayAndSetUpText + text_end + +AlreadySetUpText: + text_far _AlreadySetUpText + text_end + +GetDecorationName_c_de: + ld a, c + ld h, d + ld l, e + call GetDecorationName + ret + +DecorationFlagAction_c: + ld a, c + jp DecorationFlagAction + +GetDecorationName_c: + ld a, c + call GetDecorationID + ld hl, wStringBuffer1 + push hl + call GetDecorationName + pop de + ret + +SetSpecificDecorationFlag: + ld a, c + call GetDecorationID + ld b, SET_FLAG + call DecorationFlagAction + ret + +GetDecorationID: + push hl + push de + ld e, a + ld d, 0 + ld hl, DecorationIDs + add hl, de + ld a, [hl] + pop de + pop hl + ret + +SetAllDecorationFlags: + ld hl, DecorationIDs +.loop + ld a, [hli] + cp -1 + jr z, .done + push hl + ld b, SET_FLAG + call DecorationFlagAction + pop hl + jr .loop + +.done + ret + +INCLUDE "data/decorations/decorations.asm" + +DescribeDecoration:: + ld a, b + ld hl, .JumpTable + rst JumpTable + ret + +.JumpTable: +; entries correspond to DECODESC_* constants + dw DecorationDesc_Poster + dw DecorationDesc_LeftOrnament + dw DecorationDesc_RightOrnament + dw DecorationDesc_GiantOrnament + dw DecorationDesc_Console + +DecorationDesc_Poster: + ld a, [wDecoPoster] + ld hl, DecorationDesc_PosterPointers + ld de, 3 + call IsInArray + jr c, .nope + ld de, DecorationDesc_NullPoster + ld b, BANK(DecorationDesc_NullPoster) + ret + +.nope + ld b, BANK(DecorationDesc_TownMapPoster) + inc hl + ld a, [hli] + ld d, [hl] + ld e, a + ret + +DecorationDesc_PosterPointers: + dbw DECO_TOWN_MAP, DecorationDesc_TownMapPoster + dbw DECO_PIKACHU_POSTER, DecorationDesc_PikachuPoster + dbw DECO_CLEFAIRY_POSTER, DecorationDesc_ClefairyPoster + dbw DECO_JIGGLYPUFF_POSTER, DecorationDesc_JigglypuffPoster + db -1 + +DecorationDesc_TownMapPoster: + opentext + writetext .LookTownMapText + waitbutton + special OverworldTownMap + closetext + end + +.LookTownMapText: + text_far _LookTownMapText + text_end + +DecorationDesc_PikachuPoster: + jumptext .LookPikachuPosterText + +.LookPikachuPosterText: + text_far _LookPikachuPosterText + text_end + +DecorationDesc_ClefairyPoster: + jumptext .LookClefairyPosterText + +.LookClefairyPosterText: + text_far _LookClefairyPosterText + text_end + +DecorationDesc_JigglypuffPoster: + jumptext .LookJigglypuffPosterText + +.LookJigglypuffPosterText: + text_far _LookJigglypuffPosterText + text_end + +DecorationDesc_NullPoster: + end + +DecorationDesc_LeftOrnament: + ld a, [wDecoLeftOrnament] + jr DecorationDesc_OrnamentOrConsole + +DecorationDesc_RightOrnament: + ld a, [wDecoRightOrnament] + jr DecorationDesc_OrnamentOrConsole + +DecorationDesc_Console: + ld a, [wDecoConsole] + jr DecorationDesc_OrnamentOrConsole + +DecorationDesc_OrnamentOrConsole: + ld c, a + ld de, wStringBuffer3 + call GetDecorationName_c_de + ld b, BANK(.OrnamentConsoleScript) + ld de, .OrnamentConsoleScript + ret + +.OrnamentConsoleScript: + jumptext .LookAdorableDecoText + +.LookAdorableDecoText: + text_far _LookAdorableDecoText + text_end + +DecorationDesc_GiantOrnament: + ld b, BANK(.BigDollScript) + ld de, .BigDollScript + ret + +.BigDollScript: + jumptext .LookGiantDecoText + +.LookGiantDecoText: + text_far _LookGiantDecoText + text_end + +ToggleMaptileDecorations: + ; tile coordinates work the same way as for changeblock + lb de, 0, 4 ; bed coordinates + ld a, [wDecoBed] + call SetDecorationTile + lb de, 7, 4 ; plant coordinates + ld a, [wDecoPlant] + call SetDecorationTile + lb de, 6, 0 ; poster coordinates + ld a, [wDecoPoster] + call SetDecorationTile + call SetPosterVisibility + lb de, 0, 0 ; carpet top-left coordinates + call PadCoords_de + ld a, [wDecoCarpet] + and a + ret z + call _GetDecorationSprite + ld [hl], a + push af + lb de, 0, 2 ; carpet bottom-left coordinates + call PadCoords_de + pop af + inc a + ld [hli], a ; carpet bottom-left block + inc a + ld [hli], a ; carpet bottom-middle block + dec a + ld [hl], a ; carpet bottom-right block + ret + +SetPosterVisibility: + ld b, SET_FLAG + ld a, [wDecoPoster] + and a + jr nz, .ok + ld b, RESET_FLAG + +.ok + ld de, EVENT_PLAYERS_ROOM_POSTER + jp EventFlagAction + +SetDecorationTile: + push af + call PadCoords_de + pop af + and a + ret z + call _GetDecorationSprite + ld [hl], a + ret + +ToggleDecorationsVisibility: + ld de, EVENT_PLAYERS_HOUSE_2F_CONSOLE + ld hl, wVariableSprites + SPRITE_CONSOLE - SPRITE_VARS + ld a, [wDecoConsole] + call ToggleDecorationVisibility + ld de, EVENT_PLAYERS_HOUSE_2F_DOLL_1 + ld hl, wVariableSprites + SPRITE_DOLL_1 - SPRITE_VARS + ld a, [wDecoLeftOrnament] + call ToggleDecorationVisibility + ld de, EVENT_PLAYERS_HOUSE_2F_DOLL_2 + ld hl, wVariableSprites + SPRITE_DOLL_2 - SPRITE_VARS + ld a, [wDecoRightOrnament] + call ToggleDecorationVisibility + ld de, EVENT_PLAYERS_HOUSE_2F_BIG_DOLL + ld hl, wVariableSprites + SPRITE_BIG_DOLL - SPRITE_VARS + ld a, [wDecoBigDoll] + call ToggleDecorationVisibility + ret + +ToggleDecorationVisibility: + and a + jr z, .hide + call _GetDecorationSprite + ld [hl], a + ld b, RESET_FLAG + jp EventFlagAction + +.hide + ld b, SET_FLAG + jp EventFlagAction + +_GetDecorationSprite: + ld c, a + push de + push hl + farcall GetDecorationSprite + pop hl + pop de + ld a, c + ret + +PadCoords_de: +; adjusts coordinates, the same way as Script_changeblock + ld a, d + add 4 + ld d, a + ld a, e + add 4 + ld e, a + call GetBlockLocation + ret |