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

walk_engine: ; hl:map addr
 push hl
 call fade_out
 bcall _grbufclr
 pop hl
 ld a,(hl)
 ld (mapWidth),a
 inc hl
 ld a,(hl)
 ld (mapHeight),a
 inc hl
 ld (mapAddr),hl
 ld hl,tiles
 ld (tileAddr),hl
 call gbaInitMap
 call draw_map
 call fade_in

walk_engine_loop:
 ld a,$fe   ;groupe 1
 out (1),a   ;-les fleches
 in a,(1)
 bit 0,a    ;on pourrait aussi utiliser rra et v�rifier nc (rra \ call nc,walk_down)
 push af
 call z,walk_down
 pop af
 bit 1,a
 push af
 call z,walk_left
 pop af
 bit 2,a
 push af
 call z,walk_right
 pop af
 bit 3,a
 call z,walk_up

 ld a,$bf   ;groupe 7
 out (1),a   ;-[2nd][Mode][Del],[Y=]->[Graph]
 in a,(1)
 bit 4,a    ;[Y=]?
 call z,menu_start

 ld a,$fd   ;groupe 2
 out (1),a   ;[Enter]->[Clear]
 in a,(1)
 bit 6,a    ;[Clear]
 jr nz,walk_engine_loop
 ret

walk_down:
 ld hl,player_down ;l'addresse du sprite du joueur � afficher
 ld (player_direction),hl
;;
;pourquoi ne pas faire (7 octets) :
; ld bc,(player_y)
; ld a,8
; add a,c
; ld c,a
;;
 ld a,(player_y)
 add a,8    ;v�rifier qu'il n'y a rien dessous
 ld bc,(player_y) ;c = player y, b = player x
 ld c,a
;;
 call gbaCollision ;a = no. de tile
 call check_tile
 jp nz,draw_map  ;nz = un tile walkable n'a pas �t� rencontr�

walk_down_no_collision:
 ld hl,no_scroll
 ld (hl),0   ;0 = d�placer la carte
 ld a,(player_y)
 cp 24
 jp p,walk_down2
 ld (hl),1   ;!= 0 = il ne faut pas d�placer la carte

walk_down2:
 ld hl,gbaScrollDown
 ld (scroll_addr),hl ;la routine � �x�cuter
 ld hl,inc_walk_y ;l'adresse d'une routine
 ld (no_scroll_addr),hl
 jp walk_and_scroll

walk_left:
player_left = $+1
 ld hl,0
 ld (player_direction),hl
 ld a,(player_x)
 dec a
 ld bc,(player_y)
 ld b,a
 call gbaCollision
 call check_tile
 jp nz,draw_map

walk_left_no_collision:
 ld hl,no_scroll
 ld (hl),0
 ld a,(player_x)
 cp 56
 jp m,walk_left2
 ld (hl),1

walk_left2:
 ld hl,gbaScrollLeft
 ld (scroll_addr),hl
 ld hl,dec_walk_x
 ld (no_scroll_addr),hl
 jr walk_and_scroll

walk_right:
player_right = $+1
 ld hl,0
 ld (player_direction),hl
 ld a,(player_x)
 add a,8
 ld bc,(player_y)
 ld b,a
 call gbaCollision
 call check_tile
 jp nz,draw_map

walk_right_no_collision:
 ld hl,no_scroll
 ld (hl),0
 ld a,(player_x)
 cp 40
 jp p,walk_right2
 ld (hl),1

walk_right2:
 ld hl,gbaScrollRight
 ld (scroll_addr),hl
 ld hl,inc_walk_x
 ld (no_scroll_addr),hl
 jr walk_and_scroll

walk_up:
player_up = $+1
 ld hl,0
 ld (player_direction),hl
 ld a,(player_y)
 dec a
 ld bc,(player_y)
 ld c,a
 call gbaCollision
 call check_tile
 jr nz,draw_map
 ld hl,no_scroll
 ld (hl),0
 ld a,(player_y)
 cp 40
 jp m,walk_up2
 ld (hl),1

walk_up2:
 ld hl,gbaScrollUp
 ld (scroll_addr),hl
 ld hl,dec_walk_y
 ld (no_scroll_addr),hl

walk_and_scroll:
 ld b,8

walk_and_scroll_loop:
 push bc
 call inc_walk_count ;il g�re l'animation du joueur ?
no_scroll = $+1
 ld a,0    ;mis dans les routines de mouvement
 or a    ;=0 pour scroller la carte, !=0 pour ne pas scroller
 jr nz,walk_and_scroll_skip
scroll_addr = $+1
 ld hl,0    ;l'adresse de la routine pour scroller la carte
 call jp_hl
 jr nc,walk_and_scroll_loop_2 ;c = routine n'a pas pu scroller la carte

walk_and_scroll_skip:
no_scroll_addr = $+1
 ld hl,0
 call jp_hl

walk_and_scroll_loop_2:
 call draw_map
 pop bc
 djnz walk_and_scroll_loop ;scroller 8 fois
 xor a
 ld (walk_anim),a
 call draw_map
 ld bc,(player_y)
 call gbaCollision
 jr check_event

inc_walk_y:
 ld hl,player_y
 inc (hl)
 ret

dec_walk_x:
 ld hl,player_x
 dec (hl)
 ret

inc_walk_x:
 ld hl,player_x
 inc (hl)
 ret

dec_walk_y:
 ld hl,player_y
 dec (hl)
 ret

draw_map:
 call gbaRestoreMap
player_direction = $+1
 ld hl,0    ;contient l'adresse du sprite selon la direction du joueur
;;
;ou (11 octets) :
; ld a,(walk_anim)
; add a,a
; add a,a
; add a,a
; add a,a
; ld e,a
; ld d,0    ;ou ld d,b, vu que b devrait �tre 0 apr�s gbaRestoreMap
; add hl,de
;;
 ld de,16
 ld a,(walk_anim)
 or a
 jr z,draw_map_3
 sub 1    ;mieux serait 'dec a'
 jr z,draw_map_2
 add hl,de
draw_map_2:
 add hl,de
draw_map_3:
;;
 ld bc,(player_y)
 ld de,$0108
 call gbaClipSprite
 call gbaDrawMaskSprite
 jp ionFastCopy

inc_walk_count:
walk_count = $+1
 ld a,0
 inc a
 ld (walk_count),a
 cp walk_frequency
 ret nz
 xor a
 ld (walk_count),a
walk_anim = $+1
 ld a,0
 inc a
 ld (walk_anim),a
 cp 4
 ret nz
 ld (walk_anim),a
 ret

check_tile: ; z if tile is walkable
 ld hl,walkable_tiles
 ld b,walkable_tiles_end-walkable_tiles

check_tile_loop:
 cp (hl)
 ret z
 inc hl
 djnz check_tile_loop

check_event_block_tile:
 ld hl,event_block_tiles  ;pour le moment, pas n�cessaire (apr�s check_tile_loop hl pointe sur event_block_tiles)
 ld b,(event_block_tiles_end-event_block_tiles)/3
 jr check_event_tile_loop

check_event:  ;grass/door
 ld hl,event_tiles
 ld b,(event_tiles_end-event_tiles)/3 ;chaque �v�nement occupe trois octets

check_event_tile_loop:
 cp (hl)
  jr nz,$+7 ; jr nz,$+8
  inc hl
  bcall _ldhlind ; ld a,(hl) \ inc hl \ ld h,(hl) \ ld l,a
  jp (hl)
 inc hl
 inc hl
 inc hl
 djnz check_event_tile_loop
 ret

walkable_tiles: ; walkable tiles
 .db 0,2,3,4,18
walkable_tiles_end: