From 0ddae2eac07d890bad3bfe79fa9e59cb9d214040 Mon Sep 17 00:00:00 2001 From: Pokeglitch Date: Sat, 16 Jun 2018 15:44:10 -0400 Subject: More field moves, need to clean up names and constants --- constants/script_constants.asm | 2 + data/predef_pointers.inc | 2 +- engine/events/overworld.asm | 299 ++++++++++++++++++++++++++++++++++++++++- engine/pokemon/health.asm | 222 +++++++++++++++++++++++++++++- home/copy.asm | 6 +- home/items.asm | 2 +- home/menu.asm | 2 +- home/music.asm | 26 ++++ home/names.asm | 17 +++ shim.sym | 5 +- wram.asm | 45 +++++-- 11 files changed, 604 insertions(+), 24 deletions(-) create mode 100755 home/music.asm 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 -- cgit v1.2.3