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: