File: engine.inc - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off

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: