001: walk_engine: ; hl:map addr
002: push hl
003: call fade_out
004: bcall _grbufclr
005: pop hl
006: ld a,(hl)
007: ld (mapWidth),a
008: inc hl
009: ld a,(hl)
010: ld (mapHeight),a
011: inc hl
012: ld (mapAddr),hl
013: ld hl,tiles
014: ld (tileAddr),hl
015: call gbaInitMap
016: call draw_map
017: call fade_in
018:
019: walk_engine_loop:
020: ld a,$fe ;groupe 1
021: out (1),a ;-les fleches
022: in a,(1)
023: bit 0,a ;on pourrait aussi utiliser rra et v�rifier nc (rra \ call nc,walk_down)
024: push af
025: call z,walk_down
026: pop af
027: bit 1,a
028: push af
029: call z,walk_left
030: pop af
031: bit 2,a
032: push af
033: call z,walk_right
034: pop af
035: bit 3,a
036: call z,walk_up
037:
038: ld a,$bf ;groupe 7
039: out (1),a ;-[2nd][Mode][Del],[Y=]->[Graph]
040: in a,(1)
041: bit 4,a ;[Y=]?
042: call z,menu_start
043:
044: ld a,$fd ;groupe 2
045: out (1),a ;[Enter]->[Clear]
046: in a,(1)
047: bit 6,a ;[Clear]
048: jr nz,walk_engine_loop
049: ret
050:
051: walk_down:
052: ld hl,player_down ;l'addresse du sprite du joueur � afficher
053: ld (player_direction),hl
054: ;;
055: ;pourquoi ne pas faire (7 octets) :
056: ; ld bc,(player_y)
057: ; ld a,8
058: ; add a,c
059: ; ld c,a
060: ;;
061: ld a,(player_y)
062: add a,8 ;v�rifier qu'il n'y a rien dessous
063: ld bc,(player_y) ;c = player y, b = player x
064: ld c,a
065: ;;
066: call gbaCollision ;a = no. de tile
067: call check_tile
068: jp nz,draw_map ;nz = un tile walkable n'a pas �t� rencontr�
069:
070: walk_down_no_collision:
071: ld hl,no_scroll
072: ld (hl),0 ;0 = d�placer la carte
073: ld a,(player_y)
074: cp 24
075: jp p,walk_down2
076: ld (hl),1 ;!= 0 = il ne faut pas d�placer la carte
077:
078: walk_down2:
079: ld hl,gbaScrollDown
080: ld (scroll_addr),hl ;la routine � �x�cuter
081: ld hl,inc_walk_y ;l'adresse d'une routine
082: ld (no_scroll_addr),hl
083: jp walk_and_scroll
084:
085: walk_left:
086: player_left = $+1
087: ld hl,0
088: ld (player_direction),hl
089: ld a,(player_x)
090: dec a
091: ld bc,(player_y)
092: ld b,a
093: call gbaCollision
094: call check_tile
095: jp nz,draw_map
096:
097: walk_left_no_collision:
098: ld hl,no_scroll
099: ld (hl),0
100: ld a,(player_x)
101: cp 56
102: jp m,walk_left2
103: ld (hl),1
104:
105: walk_left2:
106: ld hl,gbaScrollLeft
107: ld (scroll_addr),hl
108: ld hl,dec_walk_x
109: ld (no_scroll_addr),hl
110: jr walk_and_scroll
111:
112: walk_right:
113: player_right = $+1
114: ld hl,0
115: ld (player_direction),hl
116: ld a,(player_x)
117: add a,8
118: ld bc,(player_y)
119: ld b,a
120: call gbaCollision
121: call check_tile
122: jp nz,draw_map
123:
124: walk_right_no_collision:
125: ld hl,no_scroll
126: ld (hl),0
127: ld a,(player_x)
128: cp 40
129: jp p,walk_right2
130: ld (hl),1
131:
132: walk_right2:
133: ld hl,gbaScrollRight
134: ld (scroll_addr),hl
135: ld hl,inc_walk_x
136: ld (no_scroll_addr),hl
137: jr walk_and_scroll
138:
139: walk_up:
140: player_up = $+1
141: ld hl,0
142: ld (player_direction),hl
143: ld a,(player_y)
144: dec a
145: ld bc,(player_y)
146: ld c,a
147: call gbaCollision
148: call check_tile
149: jr nz,draw_map
150: ld hl,no_scroll
151: ld (hl),0
152: ld a,(player_y)
153: cp 40
154: jp m,walk_up2
155: ld (hl),1
156:
157: walk_up2:
158: ld hl,gbaScrollUp
159: ld (scroll_addr),hl
160: ld hl,dec_walk_y
161: ld (no_scroll_addr),hl
162:
163: walk_and_scroll:
164: ld b,8
165:
166: walk_and_scroll_loop:
167: push bc
168: call inc_walk_count ;il g�re l'animation du joueur ?
169: no_scroll = $+1
170: ld a,0 ;mis dans les routines de mouvement
171: or a ;=0 pour scroller la carte, !=0 pour ne pas scroller
172: jr nz,walk_and_scroll_skip
173: scroll_addr = $+1
174: ld hl,0 ;l'adresse de la routine pour scroller la carte
175: call jp_hl
176: jr nc,walk_and_scroll_loop_2 ;c = routine n'a pas pu scroller la carte
177:
178: walk_and_scroll_skip:
179: no_scroll_addr = $+1
180: ld hl,0
181: call jp_hl
182:
183: walk_and_scroll_loop_2:
184: call draw_map
185: pop bc
186: djnz walk_and_scroll_loop ;scroller 8 fois
187: xor a
188: ld (walk_anim),a
189: call draw_map
190: ld bc,(player_y)
191: call gbaCollision
192: jr check_event
193:
194: inc_walk_y:
195: ld hl,player_y
196: inc (hl)
197: ret
198:
199: dec_walk_x:
200: ld hl,player_x
201: dec (hl)
202: ret
203:
204: inc_walk_x:
205: ld hl,player_x
206: inc (hl)
207: ret
208:
209: dec_walk_y:
210: ld hl,player_y
211: dec (hl)
212: ret
213:
214: draw_map:
215: call gbaRestoreMap
216: player_direction = $+1
217: ld hl,0 ;contient l'adresse du sprite selon la direction du joueur
218: ;;
219: ;ou (11 octets) :
220: ; ld a,(walk_anim)
221: ; add a,a
222: ; add a,a
223: ; add a,a
224: ; add a,a
225: ; ld e,a
226: ; ld d,0 ;ou ld d,b, vu que b devrait �tre 0 apr�s gbaRestoreMap
227: ; add hl,de
228: ;;
229: ld de,16
230: ld a,(walk_anim)
231: or a
232: jr z,draw_map_3
233: sub 1 ;mieux serait 'dec a'
234: jr z,draw_map_2
235: add hl,de
236: draw_map_2:
237: add hl,de
238: draw_map_3:
239: ;;
240: ld bc,(player_y)
241: ld de,$0108
242: call gbaClipSprite
243: call gbaDrawMaskSprite
244: jp ionFastCopy
245:
246: inc_walk_count:
247: walk_count = $+1
248: ld a,0
249: inc a
250: ld (walk_count),a
251: cp walk_frequency
252: ret nz
253: xor a
254: ld (walk_count),a
255: walk_anim = $+1
256: ld a,0
257: inc a
258: ld (walk_anim),a
259: cp 4
260: ret nz
261: ld (walk_anim),a
262: ret
263:
264: check_tile: ; z if tile is walkable
265: ld hl,walkable_tiles
266: ld b,walkable_tiles_end-walkable_tiles
267:
268: check_tile_loop:
269: cp (hl)
270: ret z
271: inc hl
272: djnz check_tile_loop
273:
274: check_event_block_tile:
275: ld hl,event_block_tiles ;pour le moment, pas n�cessaire (apr�s check_tile_loop hl pointe sur event_block_tiles)
276: ld b,(event_block_tiles_end-event_block_tiles)/3
277: jr check_event_tile_loop
278:
279: check_event: ;grass/door
280: ld hl,event_tiles
281: ld b,(event_tiles_end-event_tiles)/3 ;chaque �v�nement occupe trois octets
282:
283: check_event_tile_loop:
284: cp (hl)
285: jr nz,$+7 ; jr nz,$+8
286: inc hl
287: bcall _ldhlind ; ld a,(hl) \ inc hl \ ld h,(hl) \ ld l,a
288: jp (hl)
289: inc hl
290: inc hl
291: inc hl
292: djnz check_event_tile_loop
293: ret
294:
295: walkable_tiles: ; walkable tiles
296: .db 0,2,3,4,18
297: walkable_tiles_end: