diff options
Diffstat (limited to 'engine/overworld/cut.asm')
-rwxr-xr-x | engine/overworld/cut.asm | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/engine/overworld/cut.asm b/engine/overworld/cut.asm new file mode 100755 index 00000000..6c888e7f --- /dev/null +++ b/engine/overworld/cut.asm @@ -0,0 +1,258 @@ +UsedCut: ; ef54 (3:6f54) + xor a + ld [$cd6a], a + ld a, [W_CURMAPTILESET] ; $d367 + and a ; OVERWORLD + jr z, .asm_ef6b + cp GYM + jr nz, .asm_ef77 + ld a, [$cfc6] + cp $50 ; gym cut tree + jr nz, .asm_ef77 + jr asm_ef82 +.asm_ef6b + dec a + ld a, [$cfc6] + cp $3d ; cut tree + jr z, asm_ef82 + cp $52 ; grass + jr z, asm_ef82 +.asm_ef77 + ld hl, NothingToCutText + jp PrintText + +NothingToCutText: ; ef7d (3:6f7d) + TX_FAR _NothingToCutText + db "@" + +asm_ef82: ; ef82 (3:6f82) + ld [$cd4d], a + ld a, $1 + ld [$cd6a], a + ld a, [wWhichPokemon] ; $cf92 + ld hl, W_PARTYMON1NAME ; $d2b5 + call GetPartyMonName + ld hl, $d730 + set 6, [hl] + call GBPalWhiteOutWithDelay3 + call CleanLCD_OAM + call Func_3dbe + ld a, $90 + ld [$ffb0], a + call Delay3 + call LoadGBPal + call LoadCurrentMapView + call SaveScreenTilesToBuffer2 + call Delay3 + xor a + ld [$ffb0], a + ld hl, UsedCutText + call PrintText + call LoadScreenTilesFromBuffer2 + ld hl, $d730 + res 6, [hl] + ld a, $ff + ld [$cfcb], a + call AnimateCutTree + ld de, CutTreeBlockSwaps ; $7100 + call Func_f09f + call Func_eedc + callba Func_79e96 + ld a, $1 + ld [$cfcb], a + ld a, (SFX_02_56 - SFX_Headers_02) / 3 + call PlaySound + ld a, $90 + ld [$ffb0], a + call UpdateSprites + jp Func_eedc + +UsedCutText: ; eff2 (3:6ff2) + TX_FAR _UsedCutText + db "@" + +AnimateCutTree: ; eff7 (3:6ff7) + xor a + ld [$cd50], a + ld a, $e4 + ld [rOBP1], a ; $ff49 + ld a, [$cd4d] + cp $52 + jr z, .asm_f020 + ld de, Overworld_GFX + $2d0 ; $42d0 ; cuttable tree sprite top row + ld hl, $8fc0 + ld bc, (BANK(Overworld_GFX) << 8) + $02 + call CopyVideoData + ld de, Overworld_GFX + $3d0 ; $43d0 ; cuttable tree sprite bottom row + ld hl, $8fe0 + ld bc, (BANK(Overworld_GFX) << 8) + $02 + call CopyVideoData + jr asm_f055 +.asm_f020 + ld hl, $8fc0 + call LoadCutTreeOAM + ld hl, $8fd0 + call LoadCutTreeOAM + ld hl, $8fe0 + call LoadCutTreeOAM + ld hl, $8ff0 + call LoadCutTreeOAM + call asm_f055 + ld hl, $c393 + ld de, $4 + ld a, $30 + ld c, e +.asm_f044 + ld [hl], a + add hl, de + xor $60 + dec c + jr nz, .asm_f044 + ret + +LoadCutTreeOAM: ; f04c (3:704c) + ld de, AnimationTileset2 + $60 ; $474e ; tile depicting a leaf + ld bc, (BANK(AnimationTileset2) << 8) + $01 + jp CopyVideoData +asm_f055: ; f055 (3:7055) + call Func_f068 + ld a, $9 + ld de, CutTreeOAM ; $7060 + jp WriteOAMBlock + +CutTreeOAM: ; f060 (3:7060) + db $FC,$10,$FD,$10 + db $FE,$10,$FF,$10 + +Func_f068: ; f068 (3:7068) + ld hl, $c104 + ld a, [hli] + ld b, a + inc hl + ld a, [hli] + ld c, a ; bc holds ypos/xpos of player's sprite + inc hl + inc hl + ld a, [hl] ; a holds direction of player (00: down, 04: up, 08: left, 0C: right) + srl a + ld e, a + ld d, $0 ; de holds direction (00: down, 02: up, 04: left, 06: right) + ld a, [$cd50] + and a + ld hl, CutTreeAnimationOffsets ; $708f + jr z, .asm_f084 + ld hl, CutTreeAnimationOffsets2 ; $7097 +.asm_f084 + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld a, b + add d + ld b, a + ld a, c + add e + ld c, a + ret + +CutTreeAnimationOffsets: ; f08f (3:708f) +; Each pair represents the x and y pixels offsets from the player of where the cut tree animation should be drawn + db 8, 36 ; player is facing down + db 8, 4 ; player is facing up + db -8, 20 ; player is facing left + db 24, 20 ; player is facing right + +CutTreeAnimationOffsets2: ; f097 (3:7097) +; Not sure if these ever get used. CutTreeAnimationOffsets only seems to be used. +; Each pair represents the x and y pixels offsets from the player of where the cut tree animation should be drawn +; These offsets represent 2 blocks away from the player + db 8, 52 ; player is facing down + db 8, -12 ; player is facing up + db -24, 20 ; player is facing left + db 40, 20 ; player is facing right + +Func_f09f: ; f09f (3:709f) + push de + ld a, [W_CURMAPWIDTH] ; $d369 + add $6 + ld c, a + ld b, $0 + ld d, $0 + ld hl, $d35f + ld a, [hli] + ld h, [hl] + ld l, a + add hl, bc + ld a, [$c109] + and a + jr z, .asm_f0c7 + cp $4 + jr z, .asm_f0cf + cp $8 + jr z, .asm_f0d7 + ld a, [W_XBLOCKCOORD] ; $d364 + and a + jr z, .asm_f0e0 + jr .asm_f0ec +.asm_f0c7 + ld a, [W_YBLOCKCOORD] ; $d363 + and a + jr z, .asm_f0e0 + jr .asm_f0df +.asm_f0cf + ld a, [W_YBLOCKCOORD] ; $d363 + and a + jr z, .asm_f0e1 + jr .asm_f0e0 +.asm_f0d7 + ld a, [W_XBLOCKCOORD] ; $d364 + and a + jr z, .asm_f0e6 + jr .asm_f0e0 +.asm_f0df + add hl, bc +.asm_f0e0 + add hl, bc +.asm_f0e1 + ld e, $2 + add hl, de + jr .asm_f0f0 +.asm_f0e6 + ld e, $1 + add hl, bc + add hl, de + jr .asm_f0f0 +.asm_f0ec + ld e, $3 + add hl, bc + add hl, de +.asm_f0f0 + pop de + ld a, [hl] + ld c, a +.asm_f0f3 + ld a, [de] + inc de + inc de + cp $ff + ret z + cp c + jr nz, .asm_f0f3 + dec de + ld a, [de] + ld [hl], a + ret + +CutTreeBlockSwaps: ; f100 (3:7100) +; first byte = tileset block containing the cut tree +; second byte = corresponding tileset block after the cut animation happens + db $32, $6D + db $33, $6C + db $34, $6F + db $35, $4C + db $60, $6E + db $0B, $0A + db $3C, $35 + db $3F, $35 + db $3D, $36 + db $FF ; list terminator |