summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconstants/script_constants.asm2
-rw-r--r--data/predef_pointers.inc2
-rwxr-xr-xengine/events/overworld.asm299
-rwxr-xr-xengine/pokemon/health.asm222
-rw-r--r--home/copy.asm6
-rwxr-xr-xhome/items.asm2
-rw-r--r--home/menu.asm2
-rwxr-xr-xhome/music.asm26
-rw-r--r--home/names.asm17
-rw-r--r--shim.sym5
-rw-r--r--wram.asm45
11 files changed, 604 insertions, 24 deletions
diff --git a/constants/script_constants.asm b/constants/script_constants.asm
index 57dfbdf..8045cc4 100755
--- a/constants/script_constants.asm
+++ b/constants/script_constants.asm
@@ -5,6 +5,8 @@
const SCRIPT_ID_01 ; 01
const SCRIPT_ID_02 ; 02
const SCRIPT_ID_03 ; 03
+ const SCRIPT_ID_04 ; 04
+ const SCRIPT_ID_05 ; 05
; Flags
SCRIPT_FINISHED_FLAG EQU 7
diff --git a/data/predef_pointers.inc b/data/predef_pointers.inc
index 46b648d..57a30e5 100644
--- a/data/predef_pointers.inc
+++ b/data/predef_pointers.inc
@@ -35,7 +35,7 @@ GiveItemPredef::
add_predef Functiondc16
add_predef Functiondd5c
add_predef Functionde79
- add_predef Functionce7c
+ add_predef UpdateHPBar
add_predef Functiondf7d ; 18
add_predef Functiondf91
add_predef Function1128f
diff --git a/engine/events/overworld.asm b/engine/events/overworld.asm
index d3d099d..6b5bbc7 100755
--- a/engine/events/overworld.asm
+++ b/engine/events/overworld.asm
@@ -1,6 +1,297 @@
INCLUDE "constants.asm"
-SECTION "FlyFunction", ROMX[$51af], BANK[$03]
+SECTION "CutFunction", ROMX[$4fab], BANK[$03]
+
+CutFunction: ; 03:4fab
+ call .reset
+.loop
+ call .next
+ jr nc, .loop
+ ld [wFieldMoveSucceeded], a
+ ret
+.reset
+ xor a
+ ld [wFieldMoveScriptID], a
+ ret
+.next
+ ld a, [wFieldMoveScriptID]
+ ld hl, CutTable
+ jp CallJumptable
+
+CutTable
+ dw TryCut
+ dw CheckMapForSomethingToCut
+ dw CheckMapForSomethingToCut2
+ dw DoCut
+ dw DoCut
+ dw FailCut
+
+TryCut: ; 03:4fd1
+ call GetMapEnvironment
+ cp ROUTE
+ jr z, .success
+ cp TOWN
+ jr z, .success
+ ld a, SCRIPT_ID_05
+ ld [wFieldMoveScriptID], a
+ xor a
+ ret
+.success
+ ld a, SCRIPT_ID_01
+ ld [wFieldMoveScriptID], a
+ xor a
+ ret
+
+CheckMapForSomethingToCut: ; 03:4fea
+ call GetFacingTileCoord
+ cp $80 ; TODO - Constant
+ jr nz, .fail
+ call GetBlockLocation
+ ld a, l
+ ld [wMapBlocksAddress], a
+ ld a, h
+ ld [wMapBlocksAddress + 1], a
+ ld a, [hl]
+ call GetCutReplacementBlock
+ jr nc, .fail
+ dec hl
+ ld a, [hl]
+ ld [wReplacementBlock], a
+ ld a, SCRIPT_ID_04
+ ld [wFieldMoveScriptID], a
+ xor a
+ ret
+.fail
+ ld a, SCRIPT_ID_02
+ ld [wFieldMoveScriptID], a
+ xor a
+ ret
+
+GetCutReplacementBlock:
+ ld c, a
+ ld hl, CutReplacementBlocks
+.loop
+ ld a, [hli]
+ cp -1
+ ret z
+ inc hl
+ cp c
+ jr nz, .loop
+ scf
+ ret
+
+CutReplacementBlocks:
+; replacement block, facing block
+ db $30, $25
+ db $31, $2A
+ db $32, $34
+ db $33, $35
+ db -1
+
+; TODO - Better name
+CheckMapForSomethingToCut2: ; 03:502c
+ call GetFacingTileCoord
+ call CheckCuttableTile
+ jr nc, .fail
+ call GetBlockLocation
+ ld a, [hl]
+ cp $3b ; TODO - constant?
+ jr nz, .fail
+ ld a, l
+ ld [wMapBlocksAddress], a
+ ld a, h
+ ld [wMapBlocksAddress + 1], a
+ ld a, $04
+ ld [wReplacementBlock], a
+ ld a, SCRIPT_ID_03
+ ld [wFieldMoveScriptID], a
+ xor a
+ ret
+.fail
+ ld a, SCRIPT_ID_05
+ ld [wFieldMoveScriptID], a
+ xor a
+ ret
+
+CheckCuttableTile:
+ ld hl, CuttableTiles
+ ld c, a
+.loop
+ ld a, [hli]
+ cp -1
+ ret z
+ cp c
+ jr nz, .loop
+ scf
+ ret
+
+CuttableTiles:
+ db $81
+ db $82
+ db $8A
+ db $8B
+ db -1
+
+FailCut: ; 03:5069
+ ld hl, Text_CantUseCutHere
+ call MenuTextBoxBackup
+ scf
+ ld a, SCRIPT_FAIL
+ ret
+
+Text_CantUseCutHere: ; 03:5073
+ text "ここでは つかえません"
+ prompt
+
+DoCut: ; 03:5080
+ ld hl, CutScript
+ ld a, BANK(CutScript)
+ call QueueScript
+ scf
+ ld a, SCRIPT_SUCCESS
+ ret
+
+CutScript: ; 03:508C
+ call RefreshScreen
+ ld hl, wPartyMonNicknames
+ ld a, 2 ; TODO - constant
+ ld [wMonType], a
+ ld a, [wWhichPokemon]
+ call GetNick
+ call CopyStringToStringBuffer2
+ ld hl, Text_CutItDown
+ call MenuTextBoxBackup
+ ld de, $62 ; TODO - constant
+ call PlaySFX
+ ld hl, wMapBlocksAddress
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wReplacementBlock]
+ ld [hl], a
+ call LoadMapPart
+ call UpdateSprites
+ call WaitBGMap
+ call Function1fea
+ scf
+ ret
+
+Text_CutItDown: ; 03:50c4
+ text_from_ram wStringBuffer2
+ text " は "
+ line "くさかりを つかった!"
+ prompt
+
+SurfFunction: ; 03:50d8
+ call .reset
+.loop
+ call .next
+ jr nc, .loop
+ ld [wFieldMoveSucceeded], a
+ ret
+.reset
+ xor a
+ ld [wFieldMoveScriptID], a
+ ret
+.next
+ ld a, [wFieldMoveScriptID]
+ ld hl, SurfTable
+ jp CallJumptable
+
+SurfTable:
+ dw TrySurf
+ dw DoSurf
+ dw FailSurf
+
+TrySurf: ; 03:50f8
+ call GetFacingTileCoord
+ and $f0 ; todo - mask constant
+ cp $20 ; todo -constant
+ jr z, .success
+ cp $40 ; todo - constant
+ jr z, .success
+ ld a, SCRIPT_ID_02
+ ld [wFieldMoveScriptID], a
+ xor a
+ ret
+.success
+ ld a, SCRIPT_ID_01
+ ld [wFieldMoveScriptID], a
+ xor a
+ ret
+
+DoSurf: ; 03:5113
+ ldh a, [hROMBank]
+ ld hl, SurfScript
+ call QueueScript
+ ld a, SCRIPT_FINISHED
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_SUCCESS
+ ret
+
+FailSurf: ; 03:5124
+ ld hl, Text_CantSurfHere
+ call MenuTextBoxBackup
+ ld a, SCRIPT_FINISHED
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_FAIL
+ ret
+
+Text_CantSurfHere: ; 03:5133
+ text "ここでは のることが"
+ next "できません"
+ prompt
+
+SurfScript: ; 03:5145
+ call RefreshScreen
+ ld hl, wPartyMonNicknames
+ ld a, 2 ; TODO - constant
+ ld [wMonType], a
+ ld a, [wWhichPokemon]
+ call GetNick
+ call CopyStringToStringBuffer2
+ ld hl, Text_UsedSurf
+ call MenuTextBoxBackup
+ ld a, $04 ; TODO - constant
+ ld [wPlayerBikeSurfState], a
+ call Function0d02
+ call PlayMapMusic
+ call Function_d185
+ call Function1fea
+ ret
+
+Text_UsedSurf: ; 03:5171
+ text_from_ram wStringBuffer2
+ text " は "
+ line "@"
+ text_from_ram wPlayerName
+ text "を のせた!"
+ prompt
+
+Function_d185: ; 03:5185
+ call InitMovementBuffer
+ call .sub_d19b
+ call AppendToMovementBuffer
+ ld a, $32 ; TODO - constant
+ call AppendToMovementBuffer
+ ld a, 0 ; TODO - constant
+ ld hl, wMovementBuffer
+ call LoadMovementDataPointer
+.sub_d19b
+ ld a, [wPlayerWalking]
+ srl a
+ srl a
+ ld e, a
+ ld d, $00
+ ld hl, Table_Unknown_d1ab
+ add hl, de
+ ld a, [hl]
+ ret
+
+Table_Unknown_d1ab:
+ db 4, 5, 6, 7
; Sets wFieldMoveSucceeded to $f if successful, $0 if not
FlyFunction: ; 03:51af
@@ -129,13 +420,13 @@ DigTable: ; 03:527D
CheckCanDig: ; 03:5283
call GetMapEnvironment
cp INDOOR
- jr z, .fail
+ jr z, .success
cp CAVE
- jr z, .fail
+ jr z, .success
ld a, SCRIPT_ID_02
ld [wFieldMoveScriptID], a
ret
-.fail
+.success
ld a, SCRIPT_ID_01
ld [wFieldMoveScriptID], a
ret
diff --git a/engine/pokemon/health.asm b/engine/pokemon/health.asm
index 59ec4db..96616ae 100755
--- a/engine/pokemon/health.asm
+++ b/engine/pokemon/health.asm
@@ -95,7 +95,7 @@ HealParty: ; 03:4d6f
jr nz, .pp_up
ret
-SECTION "ComputeHPBarPixels", ROMX[$4e3c], BANK[$03]
+SECTION "HP Bar", ROMX[$4e3c], BANK[$03]
ComputeHPBarPixels: ; 03:4e3c
push hl
@@ -138,4 +138,222 @@ ComputeHPBarPixels: ; 03:4e3c
and a
ret nz
ld e, 1
- ret \ No newline at end of file
+ ret
+
+UpdateHPBar: ; 03:4e7c
+ ld a, [wHPBarOldHP]
+ ld c, a
+ ld a, [wHPBarOldHP + 1]
+ ld b, a
+ ld a, [wHPBarNewHP]
+ ld e, a
+ ld a, [wHPBarNewHP + 1]
+ ld d, a
+ push de
+ push bc
+ call UpdateHPBar_CalcHPDifference
+ ld a, e
+ ld [wHPBarHPDifference + 1], a
+ ld a, d
+ ld [wHPBarHPDifference], a
+ pop bc
+ pop de
+ call UpdateHPBar_CompareNewHPToOldHP
+ ret z
+ ld a, -1
+ jr c, .hp_decrease
+ ld a, 1
+.hp_decrease
+ ld [wHPBarDelta], a
+ ld a, [wHPBarNewHP]
+ ld e, a
+ ld a, [wHPBarNewHP + 1]
+ ld d, a
+.animate_hp_bar_loop
+ push de
+ ld a, [wHPBarOldHP]
+ ld c, a
+ ld a, [wHPBarOldHP + 1]
+ ld b, a
+ call UpdateHPBar_CompareNewHPToOldHP
+ jr z, .animate_hp_bar_done
+ jr nc, .hp_increase
+
+;hp_decrease
+ dec bc
+ ld a, c
+ ld [wHPBarNewHP], a
+ ld a, b
+ ld [wHPBarNewHP + 1], a
+ call UpdateHPBar_CalcOldNewHPBarPixels
+ ld a, e
+ sub d
+ jr .apply
+.hp_increase
+ inc bc
+ ld a, c
+ ld [wHPBarNewHP], a
+ ld a, b
+ ld [wHPBarNewHP + 1], a
+ call UpdateHPBar_CalcOldNewHPBarPixels
+ ld a, d
+ sub e
+.apply
+ call UpdateHPBar_PrintHPNumber
+ and a
+ jr z, .no_pixel_difference
+ call UpdateHPBar_AnimateHPBar
+.no_pixel_difference
+ ld a, [wHPBarNewHP]
+ ld [wHPBarOldHP], a
+ ld a, [wHPBarNewHP + 1]
+ ld [wHPBarOldHP + 1], a
+ pop de
+ jr .animate_hp_bar_loop
+.animate_hp_bar_done
+ pop de
+ ld a, e
+ ld [wHPBarOldHP], a
+ ld a, d
+ ld [wHPBarOldHP + 1], a
+ or e
+ jr z, .mon_fainted
+ call UpdateHPBar_CalcOldNewHPBarPixels
+ ld d, e
+.mon_fainted
+ call UpdateHPBar_PrintHPNumber
+ ld a, 1 ; TODO - Constant
+ call UpdateHPBar_AnimateHPBar
+ jp WaitBGMap
+
+; animates the HP bar going up or down for (a) ticks (two waiting frames each)
+; stops prematurely if bar is filled up
+; e: current health (in pixels) to start with
+UpdateHPBar_AnimateHPBar: ; 03:4F11
+ push hl
+
+.bar_animation_loop
+ push af
+ push de
+ ld d, 6 ; TODO - constant
+ ld a, [wHPBarType]
+ and $01 ; TODO - what mask is this?
+ ld b, a
+ call DrawBattleHPBar
+ ld c, 2
+ call DelayFrames
+ pop de
+ ld a, [wHPBarDelta]
+ add e
+ cp $31 ; TODO - constant
+ jr nc, .bar_filled_up
+ ld e, a
+ pop af
+ dec a
+ jr nz, .bar_animation_loop
+ pop hl
+ ret
+.bar_filled_up
+ pop af
+ pop hl
+ ret
+
+; compares old HP and new HP and sets c and z flags accordingly
+UpdateHPBar_CompareNewHPToOldHP: ; 03:4F37
+ ld a, d
+ sub b
+ ret nz
+ ld a, e
+ sub c
+ ret
+
+; calcs HP difference between bc and de (into de)
+UpdateHPBar_CalcHPDifference: ; 03:4F3D
+ ld a, d
+ sub b
+ jr c, .old_hp_greater
+ jr z, .test_lower_byte
+.new_hp_greater
+ ld a, e
+ sub c
+ ld e, a
+ ld a, d
+ sbc b
+ ld d, a
+ ret
+.old_hp_greater
+ ld a, c
+ sub e
+ ld e, a
+ ld a, b
+ sbc d
+ ld d, a
+ ret
+.test_lower_byte
+ ld a, e
+ sub c
+ jr c, .old_hp_greater
+ jr nz, .new_hp_greater
+ ld de, 0
+ ret
+
+UpdateHPBar_PrintHPNumber: ; 03:4F5B
+ push af
+ push de
+ ld a, [wHPBarType]
+ and a
+ jr z, .done
+ ld a, [wHPBarOldHP]
+ ld [wHPBarTempHP + 1], a
+ ld a, [wHPBarOldHP + 1]
+ ld [wHPBarTempHP], a
+ push hl
+ ld de, $15 ; TODO - Constant
+ add hl, de
+ push hl
+ ld a, " "
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ pop hl
+ ld de, wHPBarTempHP
+ lb bc, 2, 3
+ call PrintNumber
+ call DelayFrame
+ pop hl
+.done
+ pop de
+ pop af
+ ret
+
+; calcs number of HP bar pixels for old and new HP value
+; d: new pixels
+; e: old pixels
+UpdateHPBar_CalcOldNewHPBarPixels: ; 03:4F8B
+ push hl
+ ld hl, wHPBarMaxHP
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ push hl
+ push de
+ call ComputeHPBarPixels
+ ld a, e
+ pop de
+ pop bc
+ push af
+ call ComputeHPBarPixels
+ pop af
+ ld d, e
+ ld e, a
+ pop hl
+ ret
+
diff --git a/home/copy.asm b/home/copy.asm
index c916cbd..e5ba9cf 100644
--- a/home/copy.asm
+++ b/home/copy.asm
@@ -99,9 +99,9 @@ ReloadTilesFromBuffer:: ; 3361
ldh [hBGMapMode], a
ret
-CopyStringToCD31::
-; copies a string from [de] to [wcd31]
- ld hl, wcd31
+CopyStringToStringBuffer2::
+; copies a string from [de] to [wStringBuffer2]
+ ld hl, wStringBuffer2
; fallthrough
CopyString::
diff --git a/home/items.asm b/home/items.asm
index 46f510c..dd4e8d3 100755
--- a/home/items.asm
+++ b/home/items.asm
@@ -64,6 +64,6 @@ GiveItem::
call ReceiveItem
ret nc
call GetItemName
- call CopyStringToCD31
+ call CopyStringToStringBuffer2
scf
ret
diff --git a/home/menu.asm b/home/menu.asm
index 4c8e957..f84554c 100644
--- a/home/menu.asm
+++ b/home/menu.asm
@@ -92,7 +92,7 @@ CopyNameFromMenu::
call GetNthString
ld d, h
ld e, l
- call CopyStringToCD31
+ call CopyStringToStringBuffer2
pop bc
pop hl
ret
diff --git a/home/music.asm b/home/music.asm
new file mode 100755
index 0000000..79bffea
--- /dev/null
+++ b/home/music.asm
@@ -0,0 +1,26 @@
+SECTION "PlayMapMusic", ROM0[$3de1]
+
+PlayMapMusic: ; 00:3de1
+ push hl
+ push de
+ push bc
+ push af
+ call GetMapMusic
+ ld a, [wMapMusic]
+ cp e
+ jr z, .dont_play
+ push de
+ ld de, $0000
+ call PlayMusic
+ call DelayFrame
+ pop de
+ ld a, e
+ ld [wMapMusic], a
+ call PlayMusic
+
+.dont_play
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret \ No newline at end of file
diff --git a/home/names.asm b/home/names.asm
index f0ee433..162154d 100644
--- a/home/names.asm
+++ b/home/names.asm
@@ -243,3 +243,20 @@ Unreferenced_GetMoveName:: ; 00:37fc
ld de, wStringBuffer1
pop hl
ret
+
+SECTION "GetNick", ROM0[$3a97]
+
+GetNick: ; 00:3a97
+; Get nickname a from list hl.
+ push hl
+ push bc
+ call SkipNames
+ ld de, wStringBuffer1
+ push de
+ ld bc, MON_NAME_LENGTH
+ call CopyBytes
+ pop de
+ callab CorrectNickErrors
+ pop bc
+ pop hl
+ ret \ No newline at end of file
diff --git a/shim.sym b/shim.sym
index ffe9c8a..374af8b 100644
--- a/shim.sym
+++ b/shim.sym
@@ -15,8 +15,6 @@
00:3DB6 UpdateSoundNTimes
00:3DBE FadeToMapMusic
00:3DDC FadeToMapMusic.dontfade
-00:3DE1 PlayMapMusic
-00:3E00 PlayMapMusic.dontplay
00:3E05 SpecialMapMusic
00:3E14 SpecialMapMusic.state2
00:3E19 SpecialMapMusic.normal
@@ -38,6 +36,7 @@
01:6445 Function6445
01:66B1 Function66b1
01:6713 Function6713
+01:67d5 CorrectNickErrors
01:776E Function776e
02:4000 Function8000
@@ -63,7 +62,6 @@
03:4000 Functionc000
03:47D5 SpawnPoints
03:488D Tilesets
-03:4E7C Functionce7c
03:54E6 Functiond4e6
03:56E4 Functiond6e4
03:5886 Functiond886
@@ -463,7 +461,6 @@
3F:6755 PicTestMenu.loop
00:CB6F wPlayerStepDirection
-00:CE67 wPlayerName
01:D19E wItems
01:D258 wRivalName
diff --git a/wram.asm b/wram.asm
index c845bf5..09e72fa 100644
--- a/wram.asm
+++ b/wram.asm
@@ -389,12 +389,19 @@ wStringBuffer1:: ds 1 ; How long is this? ; cd26
SECTION "CD31", WRAM0[$CD31]
-wStartDay::
-wcd31:: ; cd31
- db
+UNION
+wStartDay:: db ;cd31
+wStartHour:: db ;cd32
+wStartMinute:: db ;cd33
+
+NEXTU
+wHPBarTempHP:: dw ; cd31
+
+NEXTU
+wStringBuffer2:: db ; How long is this? ; cd31
+
+ENDU
-wStartHour:: db
-wStartMinute:: db
SECTION "CD3E", WRAM0[$CD3D]
@@ -442,7 +449,11 @@ wItemIndex:: db ;cd77
wMonDexIndex: db ; cd78
wWhichPokemon: db ; cd79
-SECTION "CD7D", WRAM0[$CD7D]
+SECTION "CD7B", WRAM0[$CD7B]
+
+wHPBarType:: db ; cd76
+
+ ds 1
wItemQuantity:: db ; cd7d
wItemQuantityBuffer:: db ; cd7e
@@ -476,9 +487,22 @@ wPrevWarp:: db ; cdc1
ds 1
-wFieldMoveScriptID:: db ; cdc3
+UNION
+wFieldMoveScriptID:: db; cdc3
+wMapBlocksAddress:: dw ; cdc4
+wReplacementBlock:: db ; cdc6
- ds 9
+NEXTU
+
+wHPBarMaxHP:: dw ; cdc3
+wHPBarOldHP:: dw ; cdc5
+
+ENDU
+
+wHPBarNewHP:: dw ; cdc7
+wHPBarDelta:: db ; cdc9
+wcdca:: db ; cdca
+wHPBarHPDifference:: dw ; cdcb
wLinkBattleRNs:: ds 10 ; cdcd
; cddd
@@ -595,6 +619,11 @@ wce63:: db ; ce63
; 76543210
; \-- global debug enable
+ ds 3
+
+wPlayerName:: db ; ce67
+
+
SECTION "Mom's Name", WRAM0[$CE6D]
wMomsName:: ds 6 ; ce6d