summaryrefslogtreecommitdiff
path: root/engine/overworld/cut.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/overworld/cut.asm')
-rwxr-xr-xengine/overworld/cut.asm258
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