summaryrefslogtreecommitdiff
path: root/engine/overworld
diff options
context:
space:
mode:
authorRangi <35663410+Rangi42@users.noreply.github.com>2020-07-03 09:38:52 -0400
committerGitHub <noreply@github.com>2020-07-03 09:38:52 -0400
commitc85050497c1bd062e9cd40bf5b32fa3beca366cc (patch)
tree9593ddd3ab820223ab580d5fc0ae133b485b8315 /engine/overworld
parent5559d51c863b6fb529ea0494d857950a36fe85b7 (diff)
parent87ef75c173b5d5f227912860487600b6f53d1d1f (diff)
Merge pull request #256 from Rangi42/master
Add subdirectories to engine/ similar to pokecrystal
Diffstat (limited to 'engine/overworld')
-rwxr-xr-xengine/overworld/auto_movement.asm (renamed from engine/overworld/npc_movement.asm)0
-rwxr-xr-xengine/overworld/cable_club_npc.asm151
-rwxr-xr-xengine/overworld/card_key.asm112
-rwxr-xr-xengine/overworld/cinnabar_lab.asm123
-rwxr-xr-xengine/overworld/dust_smoke.asm (renamed from engine/overworld/ssanne.asm)0
-rwxr-xr-xengine/overworld/hidden_items.asm161
-rw-r--r--engine/overworld/item.asm54
-rwxr-xr-xengine/overworld/oaks_aide.asm71
-rw-r--r--engine/overworld/oam.asm189
-rw-r--r--engine/overworld/pathfinding.asm201
-rwxr-xr-xengine/overworld/pewter_guys.asm102
-rw-r--r--engine/overworld/poison.asm112
-rwxr-xr-xengine/overworld/pokecenter.asm68
-rwxr-xr-xengine/overworld/pokemart.asm272
-rwxr-xr-xengine/overworld/saffron_guards.asm15
-rw-r--r--engine/overworld/set_blackout_map.asm25
-rw-r--r--engine/overworld/special_warps.asm149
-rw-r--r--engine/overworld/sprite_collisions.asm (renamed from engine/overworld/map_sprite_functions1.asm)0
-rw-r--r--engine/overworld/tilesets.asm (renamed from engine/overworld/tileset_header.asm)0
-rwxr-xr-xengine/overworld/trainer_sight.asm (renamed from engine/overworld/trainers.asm)0
-rwxr-xr-xengine/overworld/turn_sprite.asm25
21 files changed, 375 insertions, 1455 deletions
diff --git a/engine/overworld/npc_movement.asm b/engine/overworld/auto_movement.asm
index e478c9ad..e478c9ad 100755
--- a/engine/overworld/npc_movement.asm
+++ b/engine/overworld/auto_movement.asm
diff --git a/engine/overworld/cable_club_npc.asm b/engine/overworld/cable_club_npc.asm
deleted file mode 100755
index bb0f7680..00000000
--- a/engine/overworld/cable_club_npc.asm
+++ /dev/null
@@ -1,151 +0,0 @@
-CableClubNPC::
- ld hl, CableClubNPCWelcomeText
- call PrintText
- CheckEvent EVENT_GOT_POKEDEX
- jp nz, .receivedPokedex
-; if the player hasn't received the pokedex
- ld c, 60
- call DelayFrames
- ld hl, CableClubNPCMakingPreparationsText
- call PrintText
- jp .didNotConnect
-.receivedPokedex
- ld a, $1
- ld [wMenuJoypadPollCount], a
- ld a, 90
- ld [wLinkTimeoutCounter], a
-.establishConnectionLoop
- ld a, [hSerialConnectionStatus]
- cp USING_INTERNAL_CLOCK
- jr z, .establishedConnection
- cp USING_EXTERNAL_CLOCK
- jr z, .establishedConnection
- ld a, CONNECTION_NOT_ESTABLISHED
- ld [hSerialConnectionStatus], a
- ld a, ESTABLISH_CONNECTION_WITH_EXTERNAL_CLOCK
- ld [rSB], a
- xor a
- ld [hSerialReceiveData], a
- ld a, START_TRANSFER_EXTERNAL_CLOCK
- ld [rSC], a
- ld a, [wLinkTimeoutCounter]
- dec a
- ld [wLinkTimeoutCounter], a
- jr z, .failedToEstablishConnection
- ld a, ESTABLISH_CONNECTION_WITH_INTERNAL_CLOCK
- ld [rSB], a
- ld a, START_TRANSFER_INTERNAL_CLOCK
- ld [rSC], a
- call DelayFrame
- jr .establishConnectionLoop
-.establishedConnection
- call Serial_SendZeroByte
- call DelayFrame
- call Serial_SendZeroByte
- ld c, 50
- call DelayFrames
- ld hl, CableClubNPCPleaseApplyHereHaveToSaveText
- call PrintText
- xor a
- ld [wMenuJoypadPollCount], a
- call YesNoChoice
- ld a, $1
- ld [wMenuJoypadPollCount], a
- ld a, [wCurrentMenuItem]
- and a
- jr nz, .choseNo
- callab SaveSAVtoSRAM
- call WaitForSoundToFinish
- ld a, SFX_SAVE
- call PlaySoundWaitForCurrent
- ld hl, CableClubNPCPleaseWaitText
- call PrintText
- ld hl, wUnknownSerialCounter
- ld a, $3
- ld [hli], a
- xor a
- ld [hl], a
- ld [hSerialReceivedNewData], a
- ld [wSerialExchangeNybbleSendData], a
- call Serial_SyncAndExchangeNybble
- ld hl, wUnknownSerialCounter
- ld a, [hli]
- inc a
- jr nz, .connected
- ld a, [hl]
- inc a
- jr nz, .connected
- ld b, 10
-.syncLoop
- call DelayFrame
- call Serial_SendZeroByte
- dec b
- jr nz, .syncLoop
- call CloseLinkConnection
- ld hl, CableClubNPCLinkClosedBecauseOfInactivityText
- call PrintText
- jr .didNotConnect
-.failedToEstablishConnection
- ld hl, CableClubNPCAreaReservedFor2FriendsLinkedByCableText
- call PrintText
- jr .didNotConnect
-.choseNo
- call CloseLinkConnection
- ld hl, CableClubNPCPleaseComeAgainText
- call PrintText
-.didNotConnect
- xor a
- ld hl, wUnknownSerialCounter
- ld [hli], a
- ld [hl], a
- ld hl, wd72e
- res 6, [hl]
- xor a
- ld [wMenuJoypadPollCount], a
- ret
-.connected
- xor a
- ld [hld], a
- ld [hl], a
- jpab LinkMenu
-
-CableClubNPCAreaReservedFor2FriendsLinkedByCableText:
- TX_FAR _CableClubNPCAreaReservedFor2FriendsLinkedByCableText
- db "@"
-
-CableClubNPCWelcomeText:
- TX_FAR _CableClubNPCWelcomeText
- db "@"
-
-CableClubNPCPleaseApplyHereHaveToSaveText:
- TX_FAR _CableClubNPCPleaseApplyHereHaveToSaveText
- db "@"
-
-CableClubNPCPleaseWaitText:
- TX_FAR _CableClubNPCPleaseWaitText
- TX_DELAY
- db "@"
-
-CableClubNPCLinkClosedBecauseOfInactivityText:
- TX_FAR _CableClubNPCLinkClosedBecauseOfInactivityText
- db "@"
-
-CableClubNPCPleaseComeAgainText:
- TX_FAR _CableClubNPCPleaseComeAgainText
- db "@"
-
-CableClubNPCMakingPreparationsText:
- TX_FAR _CableClubNPCMakingPreparationsText
- db "@"
-
-CloseLinkConnection:
- call Delay3
- ld a, CONNECTION_NOT_ESTABLISHED
- ld [hSerialConnectionStatus], a
- ld a, ESTABLISH_CONNECTION_WITH_EXTERNAL_CLOCK
- ld [rSB], a
- xor a
- ld [hSerialReceiveData], a
- ld a, START_TRANSFER_EXTERNAL_CLOCK
- ld [rSC], a
- ret
diff --git a/engine/overworld/card_key.asm b/engine/overworld/card_key.asm
deleted file mode 100755
index c77d5fcd..00000000
--- a/engine/overworld/card_key.asm
+++ /dev/null
@@ -1,112 +0,0 @@
-PrintCardKeyText:
- ld hl, SilphCoMapList
- ld a, [wCurMap]
- ld b, a
-.silphCoMapListLoop
- ld a, [hli]
- cp $ff
- ret z
- cp b
- jr nz, .silphCoMapListLoop
- predef GetTileAndCoordsInFrontOfPlayer
- ld a, [wTileInFrontOfPlayer]
- cp $18
- jr z, .cardKeyDoorInFrontOfPlayer
- cp $24
- jr z, .cardKeyDoorInFrontOfPlayer
- ld b, a
- ld a, [wCurMap]
- cp SILPH_CO_11F
- ret nz
- ld a, b
- cp $5e
- ret nz
-.cardKeyDoorInFrontOfPlayer
- ld b, CARD_KEY
- call IsItemInBag
- jr z, .noCardKey
- call GetCoordsInFrontOfPlayer
- push de
- tx_pre_id CardKeySuccessText
- ld [hSpriteIndexOrTextID], a
- call PrintPredefTextID
- pop de
- srl d
- ld a, d
- ld b, a
- ld [wCardKeyDoorY], a
- srl e
- ld a, e
- ld c, a
- ld [wCardKeyDoorX], a
- ld a, [wCurMap]
- cp SILPH_CO_11F
- jr nz, .notSilphCo11F
- ld a, $3
- jr .replaceCardKeyDoorTileBlock
-.notSilphCo11F
- ld a, $e
-.replaceCardKeyDoorTileBlock
- ld [wNewTileBlockID], a
- predef ReplaceTileBlock
- ld hl, wCurrentMapScriptFlags
- set 5, [hl]
- ld a, SFX_GO_INSIDE
- jp PlaySound
-.noCardKey
- tx_pre_id CardKeyFailText
- ld [hSpriteIndexOrTextID], a
- jp PrintPredefTextID
-
-SilphCoMapList:
- db SILPH_CO_2F
- db SILPH_CO_3F
- db SILPH_CO_4F
- db SILPH_CO_5F
- db SILPH_CO_6F
- db SILPH_CO_7F
- db SILPH_CO_8F
- db SILPH_CO_9F
- db SILPH_CO_10F
- db SILPH_CO_11F
- db $FF
-
-CardKeySuccessText::
- TX_FAR _CardKeySuccessText1
- TX_SFX_ITEM_1
- TX_FAR _CardKeySuccessText2
- db "@"
-
-CardKeyFailText::
- TX_FAR _CardKeyFailText
- db "@"
-
-; d = Y
-; e = X
-GetCoordsInFrontOfPlayer:
- ld a, [wYCoord]
- ld d, a
- ld a, [wXCoord]
- ld e, a
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
- and a
- jr nz, .notFacingDown
-; facing down
- inc d
- ret
-.notFacingDown
- cp SPRITE_FACING_UP
- jr nz, .notFacingUp
-; facing up
- dec d
- ret
-.notFacingUp
- cp SPRITE_FACING_LEFT
- jr nz, .notFacingLeft
-; facing left
- dec e
- ret
-.notFacingLeft
-; facing right
- inc e
- ret
diff --git a/engine/overworld/cinnabar_lab.asm b/engine/overworld/cinnabar_lab.asm
deleted file mode 100755
index e642840d..00000000
--- a/engine/overworld/cinnabar_lab.asm
+++ /dev/null
@@ -1,123 +0,0 @@
-GiveFossilToCinnabarLab::
- ld hl, wd730
- set 6, [hl]
- xor a
- ld [wCurrentMenuItem], a
- ld a, A_BUTTON | B_BUTTON
- ld [wMenuWatchedKeys], a
- ld a, [wFilteredBagItemsCount]
- dec a
- ld [wMaxMenuItem], a
- ld a, 2
- ld [wTopMenuItemY], a
- ld a, 1
- ld [wTopMenuItemX], a
- ld a, [wFilteredBagItemsCount]
- dec a
- ld bc, 2
- ld hl, 3
- call AddNTimes
- dec l
- ld b, l
- ld c, $d
- coord hl, 0, 0
- call TextBoxBorder
- call UpdateSprites
- call PrintFossilsInBag
- ld hl, wd730
- res 6, [hl]
- call HandleMenuInput
- bit 1, a ; pressed B?
- jr nz, .cancelledGivingFossil
- ld hl, wFilteredBagItems
- ld a, [wCurrentMenuItem]
- ld d, 0
- ld e, a
- add hl, de
- ld a, [hl]
- ld [$ffdb], a
- cp DOME_FOSSIL
- jr z, .choseDomeFossil
- cp HELIX_FOSSIL
- jr z, .choseHelixFossil
- ld b, AERODACTYL
- jr .fossilSelected
-.choseHelixFossil
- ld b, OMANYTE
- jr .fossilSelected
-.choseDomeFossil
- ld b, KABUTO
-.fossilSelected
- ld [wFossilItem], a
- ld a, b
- ld [wFossilMon], a
- call LoadFossilItemAndMonName
- ld hl, LabFossil_610ae
- call PrintText
- call YesNoChoice
- ld a, [wCurrentMenuItem]
- and a
- jr nz, .cancelledGivingFossil
- ld hl, LabFossil_610b3
- call PrintText
- ld a, [wFossilItem]
- ld [hItemToRemoveID], a
- callba RemoveItemByID
- ld hl, LabFossil_610b8
- call PrintText
- SetEvents EVENT_GAVE_FOSSIL_TO_LAB, EVENT_LAB_STILL_REVIVING_FOSSIL
- ret
-.cancelledGivingFossil
- ld hl, LabFossil_610bd
- call PrintText
- ret
-
-LabFossil_610ae:
- TX_FAR _Lab4Text_610ae
- db "@"
-
-LabFossil_610b3:
- TX_FAR _Lab4Text_610b3
- db "@"
-
-LabFossil_610b8:
- TX_FAR _Lab4Text_610b8
- db "@"
-
-LabFossil_610bd:
- TX_FAR _Lab4Text_610bd
- db "@"
-
-PrintFossilsInBag:
-; Prints each fossil in the player's bag on a separate line in the menu.
- ld hl, wFilteredBagItems
- xor a
- ld [hItemCounter], a
-.loop
- ld a, [hli]
- cp $ff
- ret z
- push hl
- ld [wd11e], a
- call GetItemName
- coord hl, 2, 2
- ld a, [hItemCounter]
- ld bc, SCREEN_WIDTH * 2
- call AddNTimes
- ld de, wcd6d
- call PlaceString
- ld hl, hItemCounter
- inc [hl]
- pop hl
- jr .loop
-
-; loads the names of the fossil item and the resulting mon
-LoadFossilItemAndMonName::
- ld a, [wFossilMon]
- ld [wd11e], a
- call GetMonName
- call CopyStringToCF4B
- ld a, [wFossilItem]
- ld [wd11e], a
- call GetItemName
- ret
diff --git a/engine/overworld/ssanne.asm b/engine/overworld/dust_smoke.asm
index 6c26b712..6c26b712 100755
--- a/engine/overworld/ssanne.asm
+++ b/engine/overworld/dust_smoke.asm
diff --git a/engine/overworld/hidden_items.asm b/engine/overworld/hidden_items.asm
deleted file mode 100755
index e40b0ac7..00000000
--- a/engine/overworld/hidden_items.asm
+++ /dev/null
@@ -1,161 +0,0 @@
-HiddenItems:
- ld hl, HiddenItemCoords
- call FindHiddenItemOrCoinsIndex
- ld [wHiddenItemOrCoinsIndex], a
- ld hl, wObtainedHiddenItemsFlags
- ld a, [wHiddenItemOrCoinsIndex]
- ld c, a
- ld b, FLAG_TEST
- predef FlagActionPredef
- ld a, c
- and a
- ret nz
- call EnableAutoTextBoxDrawing
- ld a, 1
- ld [wDoNotWaitForButtonPressAfterDisplayingText], a
- ld a, [wHiddenObjectFunctionArgument] ; item ID
- ld [wd11e], a
- call GetItemName
- tx_pre_jump FoundHiddenItemText
-
-INCLUDE "data/hidden_item_coords.asm"
-
-FoundHiddenItemText::
- TX_FAR _FoundHiddenItemText
- TX_ASM
- ld a, [wHiddenObjectFunctionArgument] ; item ID
- ld b, a
- ld c, 1
- call GiveItem
- jr nc, .bagFull
- ld hl, wObtainedHiddenItemsFlags
- ld a, [wHiddenItemOrCoinsIndex]
- ld c, a
- ld b, FLAG_SET
- predef FlagActionPredef
- ld a, SFX_GET_ITEM_2
- call PlaySoundWaitForCurrent
- call WaitForSoundToFinish
- jp TextScriptEnd
-.bagFull
- call WaitForTextScrollButtonPress ; wait for button press
- xor a
- ld [wDoNotWaitForButtonPressAfterDisplayingText], a
- ld hl, HiddenItemBagFullText
- call PrintText
- jp TextScriptEnd
-
-HiddenItemBagFullText::
- TX_FAR _HiddenItemBagFullText
- db "@"
-
-HiddenCoins:
- ld b, COIN_CASE
- predef GetQuantityOfItemInBag
- ld a, b
- and a
- ret z
- ld hl, HiddenCoinCoords
- call FindHiddenItemOrCoinsIndex
- ld [wHiddenItemOrCoinsIndex], a
- ld hl, wObtainedHiddenCoinsFlags
- ld a, [wHiddenItemOrCoinsIndex]
- ld c, a
- ld b, FLAG_TEST
- predef FlagActionPredef
- ld a, c
- and a
- ret nz
- xor a
- ld [hUnusedCoinsByte], a
- ld [hCoins], a
- ld [hCoins + 1], a
- ld a, [wHiddenObjectFunctionArgument]
- sub COIN
- cp 10
- jr z, .bcd10
- cp 20
- jr z, .bcd20
- cp 40
- jr z, .bcd20 ; should be bcd40
- jr .bcd100
-.bcd10
- ld a, $10
- ld [hCoins + 1], a
- jr .bcdDone
-.bcd20
- ld a, $20
- ld [hCoins + 1], a
- jr .bcdDone
-.bcd40 ; due to a typo, this is never used
- ld a, $40
- ld [hCoins + 1], a
- jr .bcdDone
-.bcd100
- ld a, $1
- ld [hCoins], a
-.bcdDone
- ld de, wPlayerCoins + 1
- ld hl, hCoins + 1
- ld c, $2
- predef AddBCDPredef
- ld hl, wObtainedHiddenCoinsFlags
- ld a, [wHiddenItemOrCoinsIndex]
- ld c, a
- ld b, FLAG_SET
- predef FlagActionPredef
- call EnableAutoTextBoxDrawing
- ld a, [wPlayerCoins]
- cp $99
- jr nz, .roomInCoinCase
- ld a, [wPlayerCoins + 1]
- cp $99
- jr nz, .roomInCoinCase
- tx_pre_id DroppedHiddenCoinsText
- jr .done
-.roomInCoinCase
- tx_pre_id FoundHiddenCoinsText
-.done
- jp PrintPredefTextID
-
-INCLUDE "data/hidden_coins.asm"
-
-FoundHiddenCoinsText::
- TX_FAR _FoundHiddenCoinsText
- TX_SFX_ITEM_2
- db "@"
-
-DroppedHiddenCoinsText::
- TX_FAR _FoundHiddenCoins2Text
- TX_SFX_ITEM_2
- TX_FAR _DroppedHiddenCoinsText
- db "@"
-
-FindHiddenItemOrCoinsIndex:
- ld a, [wHiddenObjectY]
- ld d, a
- ld a, [wHiddenObjectX]
- ld e, a
- ld a, [wCurMap]
- ld b, a
- ld c, -1
-.loop
- inc c
- ld a, [hli]
- cp $ff ; end of the list?
- ret z ; if so, we're done here
- cp b
- jr nz, .next1
- ld a, [hli]
- cp d
- jr nz, .next2
- ld a, [hli]
- cp e
- jr nz, .loop
- ld a, c
- ret
-.next1
- inc hl
-.next2
- inc hl
- jr .loop
diff --git a/engine/overworld/item.asm b/engine/overworld/item.asm
deleted file mode 100644
index 9f19100a..00000000
--- a/engine/overworld/item.asm
+++ /dev/null
@@ -1,54 +0,0 @@
-PickUpItem:
- call EnableAutoTextBoxDrawing
-
- ld a, [hSpriteIndexOrTextID]
- ld b, a
- ld hl, wMissableObjectList
-.missableObjectsListLoop
- ld a, [hli]
- cp $ff
- ret z
- cp b
- jr z, .isMissable
- inc hl
- jr .missableObjectsListLoop
-
-.isMissable
- ld a, [hl]
- ld [$ffdb], a
-
- ld hl, wMapSpriteExtraData
- ld a, [hSpriteIndexOrTextID]
- dec a
- add a
- ld d, 0
- ld e, a
- add hl, de
- ld a, [hl]
- ld b, a ; item
- ld c, 1 ; quantity
- call GiveItem
- jr nc, .BagFull
-
- ld a, [$ffdb]
- ld [wMissableObjectIndex], a
- predef HideObject
- ld a, 1
- ld [wDoNotWaitForButtonPressAfterDisplayingText], a
- ld hl, FoundItemText
- jr .print
-
-.BagFull
- ld hl, NoMoreRoomForItemText
-.print
- call PrintText
- ret
-
-FoundItemText:
- TX_FAR _FoundItemText
- TX_SFX_ITEM_1
- db "@"
-
-NoMoreRoomForItemText:
- TX_FAR _NoMoreRoomForItemText
- db "@"
diff --git a/engine/overworld/oaks_aide.asm b/engine/overworld/oaks_aide.asm
deleted file mode 100755
index f5068fda..00000000
--- a/engine/overworld/oaks_aide.asm
+++ /dev/null
@@ -1,71 +0,0 @@
-OaksAideScript:
- ld hl, OaksAideHiText
- call PrintText
- call YesNoChoice
- ld a, [wCurrentMenuItem]
- and a
- jr nz, .choseNo
- ld hl, wPokedexOwned
- ld b, wPokedexOwnedEnd - wPokedexOwned
- call CountSetBits
- ld a, [wNumSetBits]
- ld [hOaksAideNumMonsOwned], a
- ld b, a
- ld a, [hOaksAideRequirement]
- cp b
- jr z, .giveItem
- jr nc, .notEnoughOwnedMons
-.giveItem
- ld hl, OaksAideHereYouGoText
- call PrintText
- ld a, [hOaksAideRewardItem]
- ld b, a
- ld c, 1
- call GiveItem
- jr nc, .bagFull
- ld hl, OaksAideGotItemText
- call PrintText
- ld a, $1
- jr .done
-.bagFull
- ld hl, OaksAideNoRoomText
- call PrintText
- xor a
- jr .done
-.notEnoughOwnedMons
- ld hl, OaksAideUhOhText
- call PrintText
- ld a, $80
- jr .done
-.choseNo
- ld hl, OaksAideComeBackText
- call PrintText
- ld a, $ff
-.done
- ld [hOaksAideResult], a
- ret
-
-OaksAideHiText:
- TX_FAR _OaksAideHiText
- db "@"
-
-OaksAideUhOhText:
- TX_FAR _OaksAideUhOhText
- db "@"
-
-OaksAideComeBackText:
- TX_FAR _OaksAideComeBackText
- db "@"
-
-OaksAideHereYouGoText:
- TX_FAR _OaksAideHereYouGoText
- db "@"
-
-OaksAideGotItemText:
- TX_FAR _OaksAideGotItemText
- TX_SFX_ITEM_1
- db "@"
-
-OaksAideNoRoomText:
- TX_FAR _OaksAideNoRoomText
- db "@"
diff --git a/engine/overworld/oam.asm b/engine/overworld/oam.asm
deleted file mode 100644
index 68128413..00000000
--- a/engine/overworld/oam.asm
+++ /dev/null
@@ -1,189 +0,0 @@
-PrepareOAMData::
-; Determine OAM data for currently visible
-; sprites and write it to wOAMBuffer.
-
- ld a, [wUpdateSpritesEnabled]
- dec a
- jr z, .updateEnabled
-
- cp -1
- ret nz
- ld [wUpdateSpritesEnabled], a
- jp HideSprites
-
-.updateEnabled
- xor a
- ld [hOAMBufferOffset], a
-
-.spriteLoop
- ld [hSpriteOffset2], a
-
- ld d, wSpriteStateData1 / $100
- ld a, [hSpriteOffset2]
- ld e, a
- ld a, [de] ; c1x0
- and a
- jp z, .nextSprite
-
- inc e
- inc e
- ld a, [de] ; c1x2 (facing/anim)
- ld [wd5cd], a
- cp $ff ; off-screen (don't draw)
- jr nz, .visible
-
- call GetSpriteScreenXY
- jr .nextSprite
-
-.visible
- cp $a0 ; is the sprite unchanging like an item ball or boulder?
- jr c, .usefacing
-
-; unchanging
- and $f
- add $10 ; skip to the second half of the table which doesn't account for facing direction
- jr .next
-
-.usefacing
- and $f
-
-.next
- ld l, a
-
-; get sprite priority
- push de
- inc d
- ld a, e
- add $5
- ld e, a
- ld a, [de] ; c2x7
- and $80
- ld [hSpritePriority], a ; temp store sprite priority
- pop de
-
-; read the entry from the table
- ld h, 0
- ld bc, SpriteFacingAndAnimationTable
- add hl, hl
- add hl, hl
- add hl, bc
- ld a, [hli]
- ld c, a
- ld a, [hli]
- ld b, a
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
- call GetSpriteScreenXY
-
- ld a, [hOAMBufferOffset]
- ld e, a
- ld d, wOAMBuffer / $100
-
-.tileLoop
- ld a, [hSpriteScreenY] ; temp for sprite Y position
- add $10 ; Y=16 is top of screen (Y=0 is invisible)
- add [hl] ; add Y offset from table
- ld [de], a ; write new sprite OAM Y position
- inc hl
- ld a, [hSpriteScreenX] ; temp for sprite X position
- add $8 ; X=8 is left of screen (X=0 is invisible)
- add [hl] ; add X offset from table
- inc e
- ld [de], a ; write new sprite OAM X position
- inc e
- ld a, [bc] ; read pattern number offset (accommodates orientation (offset 0,4 or 8) and animation (offset 0 or $80))
- inc bc
- push bc
- ld b, a
-
- ld a, [wd5cd] ; temp copy of c1x2
- swap a ; high nybble determines sprite used (0 is always player sprite, next are some npcs)
- and $f
-
- ; Sprites $a and $b have one face (and therefore 4 tiles instead of 12).
- ; As a result, sprite $b's tile offset is less than normal.
- cp $b
- jr nz, .notFourTileSprite
- ld a, $a * 12 + 4
- jr .next2
-
-.notFourTileSprite
- ; a *= 12
- sla a
- sla a
- ld c, a
- sla a
- add c
-
-.next2
- add b ; add the tile offset from the table (based on frame and facing direction)
- pop bc
- ld [de], a ; tile id
- inc hl
- inc e
- ld a, [hl]
- bit 1, a ; is the tile allowed to set the sprite priority bit?
- jr z, .skipPriority
- ld a, [hSpritePriority]
- or [hl]
-.skipPriority
- inc hl
- ld [de], a
- inc e
- bit 0, a ; OAMFLAG_ENDOFDATA
- jr z, .tileLoop
-
- ld a, e
- ld [hOAMBufferOffset], a
-
-.nextSprite
- ld a, [hSpriteOffset2]
- add $10
- cp $100 % $100
- jp nz, .spriteLoop
-
- ; Clear unused OAM.
- ld a, [hOAMBufferOffset]
- ld l, a
- ld h, wOAMBuffer / $100
- ld de, $4
- ld b, $a0
- ld a, [wd736]
- bit 6, a ; jumping down ledge or fishing animation?
- ld a, $a0
- jr z, .clear
-
-; Don't clear the last 4 entries because they are used for the shadow in the
-; jumping down ledge animation and the rod in the fishing animation.
- ld a, $90
-
-.clear
- cp l
- ret z
- ld [hl], b
- add hl, de
- jr .clear
-
-GetSpriteScreenXY:
- inc e
- inc e
- ld a, [de] ; c1x4
- ld [hSpriteScreenY], a
- inc e
- inc e
- ld a, [de] ; c1x6
- ld [hSpriteScreenX], a
- ld a, 4
- add e
- ld e, a
- ld a, [hSpriteScreenY]
- add 4
- and $f0
- ld [de], a ; c1xa (y)
- inc e
- ld a, [hSpriteScreenX]
- and $f0
- ld [de], a ; c1xb (x)
- ret
diff --git a/engine/overworld/pathfinding.asm b/engine/overworld/pathfinding.asm
new file mode 100644
index 00000000..ba052d38
--- /dev/null
+++ b/engine/overworld/pathfinding.asm
@@ -0,0 +1,201 @@
+FindPathToPlayer:
+ xor a
+ ld hl, hFindPathNumSteps
+ ld [hli], a ; hFindPathNumSteps
+ ld [hli], a ; hFindPathFlags
+ ld [hli], a ; hFindPathYProgress
+ ld [hl], a ; hFindPathXProgress
+ ld hl, wNPCMovementDirections2
+ ld de, $0
+.loop
+ ld a, [hFindPathYProgress]
+ ld b, a
+ ld a, [hNPCPlayerYDistance] ; Y distance in steps
+ call CalcDifference
+ ld d, a
+ and a
+ jr nz, .asm_f8da
+ ld a, [hFindPathFlags]
+ set 0, a ; current end of path matches the player's Y coordinate
+ ld [hFindPathFlags], a
+.asm_f8da
+ ld a, [hFindPathXProgress]
+ ld b, a
+ ld a, [hNPCPlayerXDistance] ; X distance in steps
+ call CalcDifference
+ ld e, a
+ and a
+ jr nz, .asm_f8ec
+ ld a, [hFindPathFlags]
+ set 1, a ; current end of path matches the player's X coordinate
+ ld [hFindPathFlags], a
+.asm_f8ec
+ ld a, [hFindPathFlags]
+ cp $3 ; has the end of the path reached the player's position?
+ jr z, .done
+; Compare whether the X distance between the player and the current of the path
+; is greater or if the Y distance is. Then, try to reduce whichever is greater.
+ ld a, e
+ cp d
+ jr c, .yDistanceGreater
+; x distance is greater
+ ld a, [hNPCPlayerRelativePosFlags]
+ bit 1, a
+ jr nz, .playerIsLeftOfNPC
+ ld d, NPC_MOVEMENT_RIGHT
+ jr .next1
+.playerIsLeftOfNPC
+ ld d, NPC_MOVEMENT_LEFT
+.next1
+ ld a, [hFindPathXProgress]
+ add 1
+ ld [hFindPathXProgress], a
+ jr .storeDirection
+.yDistanceGreater
+ ld a, [hNPCPlayerRelativePosFlags]
+ bit 0, a
+ jr nz, .playerIsAboveNPC
+ ld d, NPC_MOVEMENT_DOWN
+ jr .next2
+.playerIsAboveNPC
+ ld d, NPC_MOVEMENT_UP
+.next2
+ ld a, [hFindPathYProgress]
+ add 1
+ ld [hFindPathYProgress], a
+.storeDirection
+ ld a, d
+ ld [hli], a
+ ld a, [hFindPathNumSteps]
+ inc a
+ ld [hFindPathNumSteps], a
+ jp .loop
+.done
+ ld [hl], $ff
+ ret
+
+CalcPositionOfPlayerRelativeToNPC:
+ xor a
+ ld [hNPCPlayerRelativePosFlags], a
+ ld a, [wSpriteStateData1 + 4] ; player's sprite screen Y position in pixels
+ ld d, a
+ ld a, [wSpriteStateData1 + 6] ; player's sprite screen X position in pixels
+ ld e, a
+ ld hl, wSpriteStateData1
+ ld a, [hNPCSpriteOffset]
+ add l
+ add $4
+ ld l, a
+ jr nc, .noCarry
+ inc h
+.noCarry
+ ld a, d
+ ld b, a
+ ld a, [hli] ; NPC sprite screen Y position in pixels
+ call CalcDifference
+ jr nc, .NPCSouthOfOrAlignedWithPlayer
+.NPCNorthOfPlayer
+ push hl
+ ld hl, hNPCPlayerRelativePosFlags
+ bit 0, [hl]
+ set 0, [hl]
+ pop hl
+ jr .divideYDistance
+.NPCSouthOfOrAlignedWithPlayer
+ push hl
+ ld hl, hNPCPlayerRelativePosFlags
+ bit 0, [hl]
+ res 0, [hl]
+ pop hl
+.divideYDistance
+ push hl
+ ld hl, hDividend2
+ ld [hli], a
+ ld a, 16
+ ld [hli], a
+ call DivideBytes ; divide Y absolute distance by 16
+ ld a, [hl] ; quotient
+ ld [hNPCPlayerYDistance], a
+ pop hl
+ inc hl
+ ld b, e
+ ld a, [hl] ; NPC sprite screen X position in pixels
+ call CalcDifference
+ jr nc, .NPCEastOfOrAlignedWithPlayer
+.NPCWestOfPlayer
+ push hl
+ ld hl, hNPCPlayerRelativePosFlags
+ bit 1, [hl]
+ set 1, [hl]
+ pop hl
+ jr .divideXDistance
+.NPCEastOfOrAlignedWithPlayer
+ push hl
+ ld hl, hNPCPlayerRelativePosFlags
+ bit 1, [hl]
+ res 1, [hl]
+ pop hl
+.divideXDistance
+ ld [hDividend2], a
+ ld a, 16
+ ld [hDivisor2], a
+ call DivideBytes ; divide X absolute distance by 16
+ ld a, [hQuotient2]
+ ld [hNPCPlayerXDistance], a
+ ld a, [hNPCPlayerRelativePosPerspective]
+ and a
+ ret z
+ ld a, [hNPCPlayerRelativePosFlags]
+ cpl
+ and $3
+ ld [hNPCPlayerRelativePosFlags], a
+ ret
+
+ConvertNPCMovementDirectionsToJoypadMasks:
+ ld a, [hNPCMovementDirections2Index]
+ ld [wNPCMovementDirections2Index], a
+ dec a
+ ld de, wSimulatedJoypadStatesEnd
+ ld hl, wNPCMovementDirections2
+ add l
+ ld l, a
+ jr nc, .loop
+ inc h
+.loop
+ ld a, [hld]
+ call ConvertNPCMovementDirectionToJoypadMask
+ ld [de], a
+ inc de
+ ld a, [hNPCMovementDirections2Index]
+ dec a
+ ld [hNPCMovementDirections2Index], a
+ jr nz, .loop
+ ret
+
+ConvertNPCMovementDirectionToJoypadMask:
+ push hl
+ ld b, a
+ ld hl, NPCMovementDirectionsToJoypadMasksTable
+.loop
+ ld a, [hli]
+ cp $ff
+ jr z, .done
+ cp b
+ jr z, .loadJoypadMask
+ inc hl
+ jr .loop
+.loadJoypadMask
+ ld a, [hl]
+.done
+ pop hl
+ ret
+
+NPCMovementDirectionsToJoypadMasksTable:
+ db NPC_MOVEMENT_UP, D_UP
+ db NPC_MOVEMENT_DOWN, D_DOWN
+ db NPC_MOVEMENT_LEFT, D_LEFT
+ db NPC_MOVEMENT_RIGHT, D_RIGHT
+ db $ff
+
+; unreferenced
+ ret
diff --git a/engine/overworld/pewter_guys.asm b/engine/overworld/pewter_guys.asm
deleted file mode 100755
index 532fa4bf..00000000
--- a/engine/overworld/pewter_guys.asm
+++ /dev/null
@@ -1,102 +0,0 @@
-PewterGuys:
- ld hl, wSimulatedJoypadStatesEnd
- ld a, [wSimulatedJoypadStatesIndex]
- dec a ; this decrement causes it to overwrite the last byte before $FF in the list
- ld [wSimulatedJoypadStatesIndex], a
- ld d, 0
- ld e, a
- add hl, de
- ld d, h
- ld e, l
- ld hl, PointerTable_37ce6
- ld a, [wWhichPewterGuy]
- add a
- ld b, 0
- ld c, a
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [wYCoord]
- ld b, a
- ld a, [wXCoord]
- ld c, a
-.findMatchingCoordsLoop
- ld a, [hli]
- cp b
- jr nz, .nextEntry1
- ld a, [hli]
- cp c
- jr nz, .nextEntry2
- ld a, [hli]
- ld h, [hl]
- ld l, a
-.copyMovementDataLoop
- ld a, [hli]
- cp $ff
- ret z
- ld [de], a
- inc de
- ld a, [wSimulatedJoypadStatesIndex]
- inc a
- ld [wSimulatedJoypadStatesIndex], a
- jr .copyMovementDataLoop
-.nextEntry1
- inc hl
-.nextEntry2
- inc hl
- inc hl
- jr .findMatchingCoordsLoop
-
-PointerTable_37ce6:
- dw PewterMuseumGuyCoords
- dw PewterGymGuyCoords
-
-; these are the four coordinates of the spaces below, above, to the left and
-; to the right of the museum guy, and pointers to different movements for
-; the player to make to get positioned before the main movement.
-PewterMuseumGuyCoords:
- db 18, 27
- dw .down
- db 16, 27
- dw .up
- db 17, 26
- dw .left
- db 17, 28
- dw .right
-
-.down
- db D_UP, D_UP, $ff
-.up
- db D_RIGHT, D_LEFT, $ff
-.left
- db D_UP, D_RIGHT, $ff
-.right
- db D_UP, D_LEFT, $ff
-
-; these are the five coordinates which trigger the gym guy and pointers to
-; different movements for the player to make to get positioned before the
-; main movement
-; $00 is a pause
-PewterGymGuyCoords:
- db 16, 34
- dw .one
- db 17, 35
- dw .two
- db 18, 37
- dw .three
- db 19, 37
- dw .four
- db 17, 36
- dw .five
-
-.one
- db D_LEFT, D_DOWN, D_DOWN, D_RIGHT, $ff
-.two
- db D_LEFT, D_DOWN, D_RIGHT, D_LEFT, $ff
-.three
- db D_LEFT, D_LEFT, D_LEFT, $00, $00, $00, $00, $00, $00, $00, $00, $ff
-.four
- db D_LEFT, D_LEFT, D_UP, D_LEFT, $ff
-.five
- db D_LEFT, D_DOWN, D_LEFT, $00, $00, $00, $00, $00, $00, $00, $00, $ff
diff --git a/engine/overworld/poison.asm b/engine/overworld/poison.asm
deleted file mode 100644
index 5d8eb9fd..00000000
--- a/engine/overworld/poison.asm
+++ /dev/null
@@ -1,112 +0,0 @@
-ApplyOutOfBattlePoisonDamage:
- ld a, [wd730]
- add a
- jp c, .noBlackOut ; no black out if joypad states are being simulated
- ld a, [wPartyCount]
- and a
- jp z, .noBlackOut
- call IncrementDayCareMonExp
- ld a, [wStepCounter]
- and $3 ; is the counter a multiple of 4?
- jp nz, .noBlackOut ; only apply poison damage every fourth step
- ld [wWhichPokemon], a
- ld hl, wPartyMon1Status
- ld de, wPartySpecies
-.applyDamageLoop
- ld a, [hl]
- and (1 << PSN)
- jr z, .nextMon2 ; not poisoned
- dec hl
- dec hl
- ld a, [hld]
- ld b, a
- ld a, [hli]
- or b
- jr z, .nextMon ; already fainted
-; subtract 1 from HP
- ld a, [hl]
- dec a
- ld [hld], a
- inc a
- jr nz, .noBorrow
-; borrow 1 from upper byte of HP
- dec [hl]
- inc hl
- jr .nextMon
-.noBorrow
- ld a, [hli]
- or [hl]
- jr nz, .nextMon ; didn't faint from damage
-; the mon fainted from the damage
- push hl
- inc hl
- inc hl
- ld [hl], a
- ld a, [de]
- ld [wd11e], a
- push de
- ld a, [wWhichPokemon]
- ld hl, wPartyMonNicks
- call GetPartyMonName
- xor a
- ld [wJoyIgnore], a
- call EnableAutoTextBoxDrawing
- ld a, TEXT_MON_FAINTED
- ld [hSpriteIndexOrTextID], a
- call DisplayTextID
- pop de
- pop hl
-.nextMon
- inc hl
- inc hl
-.nextMon2
- inc de
- ld a, [de]
- inc a
- jr z, .applyDamageLoopDone
- ld bc, wPartyMon2 - wPartyMon1
- add hl, bc
- push hl
- ld hl, wWhichPokemon
- inc [hl]
- pop hl
- jr .applyDamageLoop
-.applyDamageLoopDone
- ld hl, wPartyMon1Status
- ld a, [wPartyCount]
- ld d, a
- ld e, 0
-.countPoisonedLoop
- ld a, [hl]
- and (1 << PSN)
- or e
- ld e, a
- ld bc, wPartyMon2 - wPartyMon1
- add hl, bc
- dec d
- jr nz, .countPoisonedLoop
- ld a, e
- and a ; are any party members poisoned?
- jr z, .skipPoisonEffectAndSound
- ld b, $2
- predef ChangeBGPalColor0_4Frames ; change BG white to dark grey for 4 frames
- ld a, SFX_POISONED
- call PlaySound
-.skipPoisonEffectAndSound
- predef AnyPartyAlive
- ld a, d
- and a
- jr nz, .noBlackOut
- call EnableAutoTextBoxDrawing
- ld a, TEXT_BLACKED_OUT
- ld [hSpriteIndexOrTextID], a
- call DisplayTextID
- ld hl, wd72e
- set 5, [hl]
- ld a, $ff
- jr .done
-.noBlackOut
- xor a
-.done
- ld [wOutOfBattleBlackout], a
- ret
diff --git a/engine/overworld/pokecenter.asm b/engine/overworld/pokecenter.asm
deleted file mode 100755
index f340e06d..00000000
--- a/engine/overworld/pokecenter.asm
+++ /dev/null
@@ -1,68 +0,0 @@
-DisplayPokemonCenterDialogue_::
- call SaveScreenTilesToBuffer1 ; save screen
- ld hl, PokemonCenterWelcomeText
- call PrintText
- ld hl, wd72e
- bit 2, [hl]
- set 1, [hl]
- set 2, [hl]
- jr nz, .skipShallWeHealYourPokemon
- ld hl, ShallWeHealYourPokemonText
- call PrintText
-.skipShallWeHealYourPokemon
- call YesNoChoicePokeCenter ; yes/no menu
- ld a, [wCurrentMenuItem]
- and a
- jr nz, .declinedHealing ; if the player chose No
- call SetLastBlackoutMap
- call LoadScreenTilesFromBuffer1 ; restore screen
- ld hl, NeedYourPokemonText
- call PrintText
- ld a, $18
- ld [wSpriteStateData1 + $12], a ; make the nurse turn to face the machine
- call Delay3
- predef HealParty
- callba AnimateHealingMachine ; do the healing machine animation
- xor a
- ld [wAudioFadeOutControl], a
- ld a, [wAudioSavedROMBank]
- ld [wAudioROMBank], a
- ld a, [wMapMusicSoundID]
- ld [wLastMusicSoundID], a
- ld [wNewSoundID], a
- call PlaySound
- ld hl, PokemonFightingFitText
- call PrintText
- ld a, $14
- ld [wSpriteStateData1 + $12], a ; make the nurse bow
- ld c, a
- call DelayFrames
- jr .done
-.declinedHealing
- call LoadScreenTilesFromBuffer1 ; restore screen
-.done
- ld hl, PokemonCenterFarewellText
- call PrintText
- jp UpdateSprites
-
-PokemonCenterWelcomeText:
- TX_FAR _PokemonCenterWelcomeText
- db "@"
-
-ShallWeHealYourPokemonText:
- TX_DELAY
- TX_FAR _ShallWeHealYourPokemonText
- db "@"
-
-NeedYourPokemonText:
- TX_FAR _NeedYourPokemonText
- db "@"
-
-PokemonFightingFitText:
- TX_FAR _PokemonFightingFitText
- db "@"
-
-PokemonCenterFarewellText:
- TX_DELAY
- TX_FAR _PokemonCenterFarewellText
- db "@"
diff --git a/engine/overworld/pokemart.asm b/engine/overworld/pokemart.asm
deleted file mode 100755
index 177e8a09..00000000
--- a/engine/overworld/pokemart.asm
+++ /dev/null
@@ -1,272 +0,0 @@
-DisplayPokemartDialogue_::
- ld a, [wListScrollOffset]
- ld [wSavedListScrollOffset], a
- call UpdateSprites
- xor a
- ld [wBoughtOrSoldItemInMart], a
-.loop
- xor a
- ld [wListScrollOffset], a
- ld [wCurrentMenuItem], a
- ld [wPlayerMonNumber], a
- inc a
- ld [wPrintItemPrices], a
- ld a, MONEY_BOX
- ld [wTextBoxID], a
- call DisplayTextBoxID
- ld a, BUY_SELL_QUIT_MENU
- ld [wTextBoxID], a
- call DisplayTextBoxID
-
-; This code is useless. It copies the address of the pokemart's inventory to hl,
-; but the address is never used.
- ld hl, wItemListPointer
- ld a, [hli]
- ld l, [hl]
- ld h, a
-
- ld a, [wMenuExitMethod]
- cp CANCELLED_MENU
- jp z, .done
- ld a, [wChosenMenuItem]
- and a ; buying?
- jp z, .buyMenu
- dec a ; selling?
- jp z, .sellMenu
- dec a ; quitting?
- jp z, .done
-.sellMenu
-
-; the same variables are set again below, so this code has no effect
- xor a
- ld [wPrintItemPrices], a
- ld a, INIT_BAG_ITEM_LIST
- ld [wInitListType], a
- callab InitList
-
- ld a, [wNumBagItems]
- and a
- jp z, .bagEmpty
- ld hl, PokemonSellingGreetingText
- call PrintText
- call SaveScreenTilesToBuffer1 ; save screen
-.sellMenuLoop
- call LoadScreenTilesFromBuffer1 ; restore saved screen
- ld a, MONEY_BOX
- ld [wTextBoxID], a
- call DisplayTextBoxID ; draw money text box
- ld hl, wNumBagItems
- ld a, l
- ld [wListPointer], a
- ld a, h
- ld [wListPointer + 1], a
- xor a
- ld [wPrintItemPrices], a
- ld [wCurrentMenuItem], a
- ld a, ITEMLISTMENU
- ld [wListMenuID], a
- call DisplayListMenuID
- jp c, .returnToMainPokemartMenu ; if the player closed the menu
-.confirmItemSale ; if the player is trying to sell a specific item
- call IsKeyItem
- ld a, [wIsKeyItem]
- and a
- jr nz, .unsellableItem
- ld a, [wcf91]
- call IsItemHM
- jr c, .unsellableItem
- ld a, PRICEDITEMLISTMENU
- ld [wListMenuID], a
- ld [hHalveItemPrices], a ; halve prices when selling
- call DisplayChooseQuantityMenu
- inc a
- jr z, .sellMenuLoop ; if the player closed the choose quantity menu with the B button
- ld hl, PokemartTellSellPriceText
- lb bc, 14, 1 ; location that PrintText always prints to, this is useless
- call PrintText
- coord hl, 14, 7
- lb bc, 8, 15
- ld a, TWO_OPTION_MENU
- ld [wTextBoxID], a
- call DisplayTextBoxID ; yes/no menu
- ld a, [wMenuExitMethod]
- cp CHOSE_SECOND_ITEM
- jr z, .sellMenuLoop ; if the player chose No or pressed the B button
-
-; The following code is supposed to check if the player chose No, but the above
-; check already catches it.
- ld a, [wChosenMenuItem]
- dec a
- jr z, .sellMenuLoop
-
-.sellItem
- ld a, [wBoughtOrSoldItemInMart]
- and a
- jr nz, .skipSettingFlag1
- inc a
- ld [wBoughtOrSoldItemInMart], a
-.skipSettingFlag1
- call AddAmountSoldToMoney
- ld hl, wNumBagItems
- call RemoveItemFromInventory
- jp .sellMenuLoop
-.unsellableItem
- ld hl, PokemartUnsellableItemText
- call PrintText
- jp .returnToMainPokemartMenu
-.bagEmpty
- ld hl, PokemartItemBagEmptyText
- call PrintText
- call SaveScreenTilesToBuffer1
- jp .returnToMainPokemartMenu
-.buyMenu
-
-; the same variables are set again below, so this code has no effect
- ld a, 1
- ld [wPrintItemPrices], a
- ld a, INIT_OTHER_ITEM_LIST
- ld [wInitListType], a
- callab InitList
-
- ld hl, PokemartBuyingGreetingText
- call PrintText
- call SaveScreenTilesToBuffer1
-.buyMenuLoop
- call LoadScreenTilesFromBuffer1
- ld a, MONEY_BOX
- ld [wTextBoxID], a
- call DisplayTextBoxID
- ld hl, wItemList
- ld a, l
- ld [wListPointer], a
- ld a, h
- ld [wListPointer + 1], a
- xor a
- ld [wCurrentMenuItem], a
- inc a
- ld [wPrintItemPrices], a
- inc a ; a = 2 (PRICEDITEMLISTMENU)
- ld [wListMenuID], a
- call DisplayListMenuID
- jr c, .returnToMainPokemartMenu ; if the player closed the menu
- ld a, 99
- ld [wMaxItemQuantity], a
- xor a
- ld [hHalveItemPrices], a ; don't halve item prices when buying
- call DisplayChooseQuantityMenu
- inc a
- jr z, .buyMenuLoop ; if the player closed the choose quantity menu with the B button
- ld a, [wcf91] ; item ID
- ld [wd11e], a ; store item ID for GetItemName
- call GetItemName
- call CopyStringToCF4B ; copy name to wcf4b
- ld hl, PokemartTellBuyPriceText
- call PrintText
- coord hl, 14, 7
- lb bc, 8, 15
- ld a, TWO_OPTION_MENU
- ld [wTextBoxID], a
- call DisplayTextBoxID ; yes/no menu
- ld a, [wMenuExitMethod]
- cp CHOSE_SECOND_ITEM
- jp z, .buyMenuLoop ; if the player chose No or pressed the B button
-
-; The following code is supposed to check if the player chose No, but the above
-; check already catches it.
- ld a, [wChosenMenuItem]
- dec a
- jr z, .buyMenuLoop
-
-.buyItem
- call .isThereEnoughMoney
- jr c, .notEnoughMoney
- ld hl, wNumBagItems
- call AddItemToInventory
- jr nc, .bagFull
- call SubtractAmountPaidFromMoney
- ld a, [wBoughtOrSoldItemInMart]
- and a
- jr nz, .skipSettingFlag2
- ld a, 1
- ld [wBoughtOrSoldItemInMart], a
-.skipSettingFlag2
- ld a, SFX_PURCHASE
- call PlaySoundWaitForCurrent
- call WaitForSoundToFinish
- ld hl, PokemartBoughtItemText
- call PrintText
- jp .buyMenuLoop
-.returnToMainPokemartMenu
- call LoadScreenTilesFromBuffer1
- ld a, MONEY_BOX
- ld [wTextBoxID], a
- call DisplayTextBoxID
- ld hl, PokemartAnythingElseText
- call PrintText
- jp .loop
-.isThereEnoughMoney
- ld de, wPlayerMoney
- ld hl, hMoney
- ld c, 3 ; length of money in bytes
- jp StringCmp
-.notEnoughMoney
- ld hl, PokemartNotEnoughMoneyText
- call PrintText
- jr .returnToMainPokemartMenu
-.bagFull
- ld hl, PokemartItemBagFullText
- call PrintText
- jr .returnToMainPokemartMenu
-.done
- ld hl, PokemartThankYouText
- call PrintText
- ld a, 1
- ld [wUpdateSpritesEnabled], a
- call UpdateSprites
- ld a, [wSavedListScrollOffset]
- ld [wListScrollOffset], a
- ret
-
-PokemartBuyingGreetingText:
- TX_FAR _PokemartBuyingGreetingText
- db "@"
-
-PokemartTellBuyPriceText:
- TX_FAR _PokemartTellBuyPriceText
- db "@"
-
-PokemartBoughtItemText:
- TX_FAR _PokemartBoughtItemText
- db "@"
-
-PokemartNotEnoughMoneyText:
- TX_FAR _PokemartNotEnoughMoneyText
- db "@"
-
-PokemartItemBagFullText:
- TX_FAR _PokemartItemBagFullText
- db "@"
-
-PokemonSellingGreetingText:
- TX_FAR _PokemonSellingGreetingText
- db "@"
-
-PokemartTellSellPriceText:
- TX_FAR _PokemartTellSellPriceText
- db "@"
-
-PokemartItemBagEmptyText:
- TX_FAR _PokemartItemBagEmptyText
- db "@"
-
-PokemartUnsellableItemText:
- TX_FAR _PokemartUnsellableItemText
- db "@"
-
-PokemartThankYouText:
- TX_FAR _PokemartThankYouText
- db "@"
-
-PokemartAnythingElseText:
- TX_FAR _PokemartAnythingElseText
- db "@"
diff --git a/engine/overworld/saffron_guards.asm b/engine/overworld/saffron_guards.asm
deleted file mode 100755
index 091cfa1a..00000000
--- a/engine/overworld/saffron_guards.asm
+++ /dev/null
@@ -1,15 +0,0 @@
-RemoveGuardDrink::
- ld hl, GuardDrinksList
-.drinkLoop
- ld a, [hli]
- ld [$ffdb], a
- and a
- ret z
- push hl
- ld b, a
- call IsItemInBag
- pop hl
- jr z, .drinkLoop
- jpba RemoveItemByID
-
-INCLUDE "data/guard_drink_items.asm"
diff --git a/engine/overworld/set_blackout_map.asm b/engine/overworld/set_blackout_map.asm
deleted file mode 100644
index 14f0ba28..00000000
--- a/engine/overworld/set_blackout_map.asm
+++ /dev/null
@@ -1,25 +0,0 @@
-SetLastBlackoutMap:
-; Set the map to return to when
-; blacking out or using Teleport or Dig.
-; Safari rest houses don't count.
-
- push hl
- ld hl, SafariZoneRestHouses
- ld a, [wCurMap]
- ld b, a
-.loop
- ld a, [hli]
- cp -1
- jr z, .notresthouse
- cp b
- jr nz, .loop
- jr .done
-
-.notresthouse
- ld a, [wLastMap]
- ld [wLastBlackoutMap], a
-.done
- pop hl
- ret
-
-INCLUDE "data/rest_house_maps.asm"
diff --git a/engine/overworld/special_warps.asm b/engine/overworld/special_warps.asm
new file mode 100644
index 00000000..eee85402
--- /dev/null
+++ b/engine/overworld/special_warps.asm
@@ -0,0 +1,149 @@
+SpecialWarpIn::
+ call LoadSpecialWarpData
+ predef LoadTilesetHeader
+ ld hl, wd732
+ bit 2, [hl] ; dungeon warp or fly warp?
+ res 2, [hl]
+ jr z, .next
+; if dungeon warp or fly warp
+ ld a, [wDestinationMap]
+ jr .next2
+.next
+ bit 1, [hl]
+ jr z, .next3
+ call EmptyFunc
+.next3
+ ld a, 0
+.next2
+ ld b, a
+ ld a, [wd72d]
+ and a
+ jr nz, .next4
+ ld a, b
+.next4
+ ld hl, wd732
+ bit 4, [hl] ; dungeon warp?
+ ret nz
+; if not dungeon warp
+ ld [wLastMap], a
+ ret
+
+; gets the map ID, tile block map view pointer, tileset, and coordinates
+LoadSpecialWarpData:
+ ld a, [wd72d]
+ cp TRADE_CENTER
+ jr nz, .notTradeCenter
+ ld hl, TradeCenterSpec1
+ ld a, [hSerialConnectionStatus]
+ cp USING_INTERNAL_CLOCK ; which gameboy is clocking determines who is on the left and who is on the right
+ jr z, .copyWarpData
+ ld hl, TradeCenterSpec2
+ jr .copyWarpData
+.notTradeCenter
+ cp COLOSSEUM
+ jr nz, .notColosseum
+ ld hl, ColosseumSpec1
+ ld a, [hSerialConnectionStatus]
+ cp USING_INTERNAL_CLOCK
+ jr z, .copyWarpData
+ ld hl, ColosseumSpec2
+ jr .copyWarpData
+.notColosseum
+ ld a, [wd732]
+ bit 1, a
+ jr nz, .notFirstMap
+ bit 2, a
+ jr nz, .notFirstMap
+ ld hl, FirstMapSpec
+.copyWarpData
+ ld de, wCurMap
+ ld c, $7
+.copyWarpDataLoop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .copyWarpDataLoop
+ ld a, [hli]
+ ld [wCurMapTileset], a
+ xor a
+ jr .done
+.notFirstMap
+ ld a, [wLastMap] ; this value is overwritten before it's ever read
+ ld hl, wd732
+ bit 4, [hl] ; used dungeon warp (jumped down hole/waterfall)?
+ jr nz, .usedDunegonWarp
+ bit 6, [hl] ; return to last pokemon center (or player's house)?
+ res 6, [hl]
+ jr z, .otherDestination
+; return to last pokemon center or player's house
+ ld a, [wLastBlackoutMap]
+ jr .usedFlyWarp
+.usedDunegonWarp
+ ld hl, wd72d
+ res 4, [hl]
+ ld a, [wDungeonWarpDestinationMap]
+ ld b, a
+ ld [wCurMap], a
+ ld a, [wWhichDungeonWarp]
+ ld c, a
+ ld hl, DungeonWarpList
+ ld de, 0
+ ld a, 6
+ ld [wDungeonWarpDataEntrySize], a
+.dungeonWarpListLoop
+ ld a, [hli]
+ cp b
+ jr z, .matchedDungeonWarpDestinationMap
+ inc hl
+ jr .nextDungeonWarp
+.matchedDungeonWarpDestinationMap
+ ld a, [hli]
+ cp c
+ jr z, .matchedDungeonWarpID
+.nextDungeonWarp
+ ld a, [wDungeonWarpDataEntrySize]
+ add e
+ ld e, a
+ jr .dungeonWarpListLoop
+.matchedDungeonWarpID
+ ld hl, DungeonWarpData
+ add hl, de
+ jr .copyWarpData2
+.otherDestination
+ ld a, [wDestinationMap]
+.usedFlyWarp
+ ld b, a
+ ld [wCurMap], a
+ ld hl, FlyWarpDataPtr
+.flyWarpDataPtrLoop
+ ld a, [hli]
+ inc hl
+ cp b
+ jr z, .foundFlyWarpMatch
+ inc hl
+ inc hl
+ jr .flyWarpDataPtrLoop
+.foundFlyWarpMatch
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+.copyWarpData2
+ ld de, wCurrentTileBlockMapViewPointer
+ ld c, $6
+.copyWarpDataLoop2
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .copyWarpDataLoop2
+ xor a ; OVERWORLD
+ ld [wCurMapTileset], a
+.done
+ ld [wYOffsetSinceLastSpecialWarp], a
+ ld [wXOffsetSinceLastSpecialWarp], a
+ ld a, $ff ; the player's coordinates have already been updated using a special warp, so don't use any of the normal warps
+ ld [wDestinationWarpID], a
+ ret
+
+INCLUDE "data/special_warps.asm"
diff --git a/engine/overworld/map_sprite_functions1.asm b/engine/overworld/sprite_collisions.asm
index 0e6b2d06..0e6b2d06 100644
--- a/engine/overworld/map_sprite_functions1.asm
+++ b/engine/overworld/sprite_collisions.asm
diff --git a/engine/overworld/tileset_header.asm b/engine/overworld/tilesets.asm
index 6e33974f..6e33974f 100644
--- a/engine/overworld/tileset_header.asm
+++ b/engine/overworld/tilesets.asm
diff --git a/engine/overworld/trainers.asm b/engine/overworld/trainer_sight.asm
index 5a68b627..5a68b627 100755
--- a/engine/overworld/trainers.asm
+++ b/engine/overworld/trainer_sight.asm
diff --git a/engine/overworld/turn_sprite.asm b/engine/overworld/turn_sprite.asm
new file mode 100755
index 00000000..c7f7712b
--- /dev/null
+++ b/engine/overworld/turn_sprite.asm
@@ -0,0 +1,25 @@
+UpdateSpriteFacingOffsetAndDelayMovement::
+ ld h, $c2
+ ld a, [H_CURRENTSPRITEOFFSET]
+ add $8
+ ld l, a
+ ld a, $7f ; maximum movement delay
+ ld [hl], a ; c2x8 (movement delay)
+ dec h
+ ld a, [H_CURRENTSPRITEOFFSET]
+ add $9
+ ld l, a
+ ld a, [hld] ; c1x9 (facing direction)
+ ld b, a
+ xor a
+ ld [hld], a
+ ld [hl], a ; c1x8 (walk animation frame)
+ ld a, [H_CURRENTSPRITEOFFSET]
+ add $2
+ ld l, a
+ ld a, [hl] ; c1x2 (facing and animation table offset)
+ or b ; or in the facing direction
+ ld [hld], a
+ ld a, $2 ; delayed movement status
+ ld [hl], a ; c1x1 (movement status)
+ ret