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: