summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rw-r--r--engine/battle/consume_held_item.asm57
-rw-r--r--engine/battle/returntobattle_useball.asm19
-rw-r--r--engine/events/prof_oaks_pc.asm193
-rwxr-xr-xengine/items/item_effects.asm6
-rw-r--r--engine/overworld/decorations.asm1168
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