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 --- engine/events/overworld.asm | 299 +++++++++++++++++++++++++++++++++++++++++++- engine/pokemon/health.asm | 222 +++++++++++++++++++++++++++++++- 2 files changed, 515 insertions(+), 6 deletions(-) (limited to 'engine') 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 + -- cgit v1.2.3