summaryrefslogtreecommitdiff
path: root/engine/overworld/cut.asm
blob: 6c888e7fd1da79348a65aceb113b51f8d090f7a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
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