; actor runtime values
- ; last collision flags
-.de act_rt_collision_cf, 1
; last collision tile position
.de act_rt_collision_pos_y, 1
.de act_rt_collision_pos_x, 1
+ ; last collision flags
+.de act_rt_collision_cf, 1
; last collision with actor
; set during unit_collision_woth_any_other
.de act_rt_collided_with, 2
.db $4 ; x pos
.db $5 ; p0
- ; act rt collision cf, pos y, pos x
+ ; act rt pos y, pos x, collision cf
.db 0, 0, 0
; act_rt_collided_with
dw 0
; inputs:
; a: tile flags
; b: tile index
- ; unit_test_collision_pos_y/x
; de: actor
objanim_door_open:
push de
pop bc
pop de
+ ld hl, act_rt_collision_pos_y
+ add hl, de ; hl = col pos y
+
; clear flags
ld de, objanim+obja_flags
xor a, a
ld [de], a
inc de ; de = y pos
- ld a, [unit_test_collision_pos_y]
+ ld a, [hl+]
ld [de], a
inc de ; de = x pos
- ld a, [unit_test_collision_pos_x]
+ ld a, [hl]
ld [de], a
inc de ; de = dat
push de
push bc
; test last collision flags
- ld a, [unit_test_collision_cf_flags]
+ push de
+ ld hl, act_rt_collision_cf
+ add hl, de
+ ld a, [hl]
+ pop de
and a, CF_DOOR
call nz, unit_player_remove_door
pop bc
; removes the door tile the player is currently
; standing on
; inputs:
- ; unit_test_collision_pos_y/x
; de: actor
unit_player_remove_door:
; get tile of last collision
- ld a, [unit_test_collision_pos_y]
+ push de
+ ld hl, act_rt_collision_pos_y
+ add hl, de
+ ld a, [hl+] ; load y
ld b, a
- ld a, [unit_test_collision_pos_x]
+ ld a, [hl] ; load x
ld c, a
call map_get_tile
+ pop de
; schedule animation
push_all
- call objanim_door_open
+ ; call objanim_door_open
pop_all
; remove door tile, door flag
ld [hl+], a
ld a, CF_COVERED
ld [hl], a
-
- ld a, [unit_test_collision_pos_y] ; load y offset
+
+ ld hl, act_rt_collision_pos_y
+ add hl, de
+ ld a, [hl] ; load y offset
call map_request_redraw_at
ret
$1
; write y and x pos
+ ld hl, act_rt_collision_pos_y
+ add hl, de ; de = collision vars y pos
ld a, b
- ld [unit_test_collision_pos_y], a
+ ld [hl+], a ; write y
ld a, c
- ld [unit_test_collision_pos_x], a
+ ld [hl+], a ; write x
push bc
+ push hl ; save hl = rt cf value
call map_get_tile
; set flags result
- ld [unit_test_collision_cf_flags], a
+ pop hl
+ ld [hl], a ; store last cf
and a, $2
pop bc
pop de
ret nz
- ; set to 0 if we did not collide
- xor a, a
- ld [unit_test_collision_cf_flags], a
-
push de
call unit_collides_with_any_other
; TODO: write collided unit here as well
; status text buffer
status_text: .adv 32
-
- ; stores the last collision flag result
- ; that was performed by a test collision call
-unit_test_collision_cf_flags: .adv 1
-unit_test_collision_pos_y: .adv 1
-unit_test_collision_pos_x: .adv 1
; self modifying code
; the vblank interrupt jumps here