diff --git a/src/collision.s b/src/collision.s index eeea510..7aa4179 100644 --- a/src/collision.s +++ b/src/collision.s @@ -2,8 +2,12 @@ INCLUDE "oam.inc" SECTION "Collision", ROM0 +DEF COLLF_WALK EQU (1 << 0) +DEF COLLF_LADDER EQU (1 << 1) +DEF COLLF_PORTAL EQU (1 << 2) + ; Determines if player has hit the background -; @return NZ = true, Z = false +; @return NZ = false, Z = true player_bg_collides:: ; C = MAP X = PLAYER X / 8 + CAMERA X ld a, [PLAYER_X] @@ -15,16 +19,16 @@ player_bg_collides:: ld c, a ; C < 0 - bit 7, c - ret nz + ld a, c + cpl + bit 7, a + ret z ; C >= MAP WIDTH ld a, [CURRENT_MAP_WIDTH] cp c jr nz, .load_y - ; Set NZ - or $ff ret .load_y: @@ -38,8 +42,10 @@ player_bg_collides:: ld b, a ; B < 0 - bit 7, b - ret nz + ld a, b + cpl + bit 7, a + ret z ; B >= MAP HEIGHT ld a, [CURRENT_MAP_HEIGHT] @@ -53,18 +59,18 @@ player_bg_collides:: .check_tiles: ; top left call can_move_to - ret nz + ret z ; top right inc c call can_move_to - ret nz + ret z ; bottom left dec c inc b call can_move_to - ret nz + ret z ; bottom right inc c @@ -73,7 +79,7 @@ player_bg_collides:: ret ; Check if the player is in mid-air -; @note NZ = false, Z = true +; @note NZ = true, Z = false player_in_air:: ; c = x % 8 == 0 ? x/8 : x/8 + 1 ld a, [PLAYER_X] @@ -97,7 +103,7 @@ player_in_air:: inc b call can_move_to - ret nz + ret z inc c call can_move_to @@ -108,7 +114,7 @@ player_in_air:: ; @param b y-coordinate ; @param c x-coordinate ; @destroy a, d, e -; @note NZ = false, Z = true +; @note NZ = true, Z = false can_move_to: push bc push hl @@ -129,9 +135,8 @@ can_move_to: jr nz, .mul_y_width add hl, bc - ; check [hl] = 1 ld a, [hl] - cp 1 + and COLLF_WALK pop hl pop bc diff --git a/src/player.s b/src/player.s index 839e913..390325a 100644 --- a/src/player.s +++ b/src/player.s @@ -13,7 +13,7 @@ PLAYER_DIR:: db PLAYER_STATE:: db PLAYER_VY:: dw -PLAYER_INV:: DS (2 * PLAYER_INV_SIZE) +PLAYER_INV:: ds (2 * PLAYER_INV_SIZE) Section "Player Code", ROM0 @@ -62,7 +62,7 @@ Player_Update:: ; initialize jump state if not already jumping ld a, [PLAYER_STATE] - cp PLAYER_STATEF_JUMP + and PLAYER_STATEF_JUMP jr nz, .jump_update ld a, PLAYER_STATEF_JUMP @@ -74,7 +74,7 @@ Player_Update:: ; todo: deduplicate .jump_update_check: ld a, [PLAYER_STATE] - cp PLAYER_STATEF_JUMP + and PLAYER_STATEF_JUMP jr z, .right .jump_update: @@ -92,17 +92,17 @@ Player_Update:: sbc HIGH(GRAVITY) ld b, a - ; we only need to clamp when moving down - bit 7, b - jr z, .no_clamp + ; ; we only need to clamp when moving down + ; bit 7, b + ; jr z, .no_clamp - ; vy = MIN(MAX_VY, vy) - ld a, b - cp HIGH(MAX_VY) - jr c, .no_clamp + ; ; vy = MIN(MAX_VY, vy) + ; ld a, b + ; cp HIGH(MAX_VY) + ; jr c, .no_clamp - ld b, HIGH(MAX_VY) - ld c, LOW(MAX_VY) + ; ld b, HIGH(MAX_VY) + ; ld c, LOW(MAX_VY) .no_clamp: ld hl, PLAYER_VY @@ -119,7 +119,7 @@ Player_Update:: ; roll back jump if there was a collision call player_bg_collides - jr nz, .jump_rollback + jr nz, .jump_Player_UpdateOAM ; TODO: Enable once scroll zones are implemented ; ld a, [PLAYER_VY] @@ -139,7 +139,7 @@ Player_Update:: .jump_rollback_check: call player_bg_collides - jr nz, .jump_rollback + jr z, .jump_rollback ; set PLAYER_STATE = PLAYER_STATEF_WALK if VY < 0 (fell into ground) ld hl, PLAYER_VY @@ -177,7 +177,7 @@ Player_Update:: ld [PLAYER_X], a call player_bg_collides - jr nz, .right_rollback + jr z, .right_rollback ; TODO: Enable once scroll zones are implemented ; ld d, PLAYER_SPEED @@ -211,7 +211,7 @@ Player_Update:: ld [PLAYER_X], a call player_bg_collides - jr nz, .left_rollback + jr z, .left_rollback ; TODO: Enable once scroll zones are implemented ; ld d, PLAYER_SPEED @@ -230,12 +230,12 @@ Player_Update:: .fall: call player_in_air - ret nz + ret z ; only set jump state if not already jumping ld hl, PLAYER_STATE ld a, [hl] - or PLAYER_STATEF_JUMP + and PLAYER_STATEF_JUMP ret nz ld [hl], PLAYER_STATEF_JUMP