.db $1, $2
#endmacro
-collision_player:
+collision_player_top:
col_head 1
; center left
col_point 0, 0
ld a, [de] ; load loop counter
inc de ; de + 1 = first point y coordinate
@loop:
- push af
- push de
-
- ld a, [de]
- ld l, a
- ld a, [ct_poy]
- add a, l ; a = y + collision y offset
- inc de
-
- ld a, [de]
- ld h, a
- ld a, [ct_pox]
- add a, h ; a = x + collision x offset
+ push af
+
+ ld a, [de]
+ ld l, a
+ ld a, [ct_poy]
+ add a, l ; a = y + collision y offset
+ ld l, a ; store y result in l for now
+ inc de ; de++ == x pos
+
+ ld a, [de]
+ ld h, a
+ ld a, [ct_pox]
+ add a, h ; a = x + collision x offset
+ inc de ; de++ == next y
+ push de ; save de for next iteratin
+
+ ld d, l ; d = y
+ ld e, a ; e = x
+
+ call collision_tile
+ cp a, 0
+ jr nz, @done REL
- ld d, l
- ld e, h
-
- call collision_tile
+ pop de
+ pop af
- pop af
- pop de
-
- dec a ; a--
- cp a, 0 ; again if not 0
+ dec a ; a--
+ cp a, 0 ; again if not 0
jp nz, @loop
ret
+@done:
+ ; we need to pop before ret!
+ ; the register values
+ ; do not matter too much at this point
+ ; but a needs to be preserved
+ pop de
+ pop de
+ ret
; checks a point
; with a map's meta tile
ld a, [hl]
dec a
ld [hl], a
+
+ ; check collision
+ ; 1) save registers
+ push hl
+ push de
+
+ ; 2) hl = player_y already
+ ; 3) load correct collision points
+ ld de, collision_player_top
+ call collision_tile_table_check
+ pop de
+ pop hl
+
+ cp a, 0
+ jr z, @no_collision_up REL
+ ld a, [hl]
+ inc a
+ ld [hl], a
+@no_collision_up:
+
+
@notup:
; store y in d