player: Added turning mechanics
authorLukas Krickl <lukas@krickl.dev>
Mon, 15 Dec 2025 07:31:08 +0000 (08:31 +0100)
committerLukas Krickl <lukas@krickl.dev>
Mon, 15 Dec 2025 07:31:08 +0000 (08:31 +0100)
src/defs.s
src/jmp.inc
src/macros.inc
src/player.s
src/ui.s
src/video.s

index 06ceff794bb79d69d46dda2a089bbc2d36e42fac..a9e4585c615777d1c390b1dd3f1a544c38ed44c1 100644 (file)
@@ -36,6 +36,8 @@
 .de ACT_T_NULL, 1
 .de ACT_T_PLAYER, 1
 .de ACT_T_BAT, 1
+
+.def int ACT_DIR_MASK = 0b00000011
        
        ; actor struct 
        ; stats are defined by looking up the type in a table
 .de t_type, 1
 .de t_flags, 1
        ; actor currently 
-       ; standing on tile
-       ; 0 = player, 1-N = map actors
-.de t_actor, 1
+       ; standing on tile (ptr)
+.de t_actor, 2
 .de t_p0, 1
 .de t_size, 0
 
index e5eafaca1444a6075137b75703e6e8178dc53005..7d6cc713157c9697e3ae1c4ae124fbf241f9a984 100644 (file)
@@ -41,6 +41,7 @@ vec_vblank:
 ; STA 0x48
 ;=============
 vec_stat:
+       reti
   ; disable objects
   push af
   ld a, [RLCD]
index 04bfd618a55d61704e7f8d1cacaff48d03d70390..0d2c2630576749419af1171d2064eec56b812f6c 100644 (file)
@@ -173,7 +173,7 @@ $1:
 #macro tiledef
        .db $1, $2 
        ; t_actor
-       .db 0
+       .db 0, 0
        .db $3
 #endmacro
 
index 1aac9b68ba3fe0b00ca00f59be4e20fc07293800..1fcb7cebfbea406253f012ca9dab73b3673f0964 100644 (file)
@@ -1,5 +1,20 @@
 #define PLAYER_CURSOR_L 0x88
 #define PLAYER_CURSOR_R 0x8A
+       
+       ; table of direction to pick on right turn
+player_direction_turn_right:
+       .db EAST ; SOUTH
+       .db WEST ; NORTH
+       .db SOUTH ; EAST
+       .db NORTH ; WEST
+       
+       ; table of directions to pick on left turn
+player_direction_turn_left:
+       .db WEST ; SOUTH  
+       .db EAST ; NORTH
+       .db NORTH ; EAST
+       .db SOUTH ; WEST
+
 
        ; sets up the player actor
 player_init:
@@ -19,13 +34,42 @@ player_update:
 
        ret
        
-       ; draws the players current facing direction
-       ; as a compass
-compass_draw:
-       ret
-       
        ; moves the player 
        ; does not move out of bounds
        ; based on the last queued input
 player_handle_move:
+       ld b, DIRLEFT
+       input_just
+       jr z, @not_left REL
+               ld hl, player_direction_turn_left
+               ld a, [player+act_dir]
+               and a, ACT_DIR_MASK
+               ld d, 0
+               ld e, a
+               add hl, de ; hl = direction table offset
+
+               ld b, [hl] ; new direction
+               ld a, [player+act_dir]
+               and a, ~ACT_DIR_MASK & 0xFF
+               or a, b
+               ld [player+act_dir], a
+@not_left:
+
+       ld b, DIRRIGHT
+       input_just
+       jr z, @not_right REL
+               ld hl, player_direction_turn_right
+               ld a, [player+act_dir]
+               and a, ACT_DIR_MASK
+               ld d, 0
+               ld e, a
+               add hl, de ; hl = direction table offset
+
+               ld b, [hl] ; new direction
+               ld a, [player+act_dir]
+               and a, ~ACT_DIR_MASK & 0xFF
+               or a, b
+               ld [player+act_dir], a
+@not_right:
+       
        ret
index 4507858bbae740884d84700b8cf67dfef00f0847..28dc93ee30c1be749dd29ac6138120ad3b5bbc43 100644 (file)
--- a/src/ui.s
+++ b/src/ui.s
@@ -1,5 +1,10 @@
 #define UI_TILE_NAME SCRN1+33
 
+#define TILE_SOUTH 0xEC
+#define TILE_NORTH 0xE7
+#define TILE_EAST 0xDE
+#define TILE_WEST 0xF0
+
 ; one tile after 'Z'
 #define UI_WINDOW_BACKGROUND 0xF4  
 
@@ -31,3 +36,40 @@ ui_update:
 ui_draw:
        ret
 
+compass_tiles:
+       .db TILE_SOUTH, TILE_NORTH, TILE_EAST, TILE_WEST
+
+       ; draws the players current facing direction
+       ; as a compass
+compass_draw:
+       ld a, 1
+       call oamalloc
+
+       
+       ; y
+       ld a, 136
+       ld [hl+], a
+       
+       ; x
+       ld a, 64
+       ld [hl+], a
+
+       ; tile
+       push hl
+       ld a, [player+act_dir]
+       and a, ACT_DIR_MASK
+
+       ld d, 0
+       ld e, a
+       ld hl, compass_tiles
+       add hl, de
+       ld a, [hl] ; a = tile
+       pop hl
+       ld [hl+], a
+
+       ; flags
+       xor a, a
+       ld [hl], a
+
+
+       ret
index 3de459d70631d0d13f84cd5dc59d12b4058800ca..c6e86127da929d81bac38804e05ab9b7dd41aa21 100644 (file)
@@ -115,7 +115,7 @@ lcd_off:
 
   ; turns on the lcd 
 lcd_on:
-  ld a, LCDCF_ON | LCDCF_BGON | LCDCF_OBJON | LCDF_WINDOWON | LCDF_WINBANKSELECT | LCDF_OBJ_SIZE
+  ld a, LCDCF_ON | LCDCF_BGON | LCDCF_OBJON | LCDF_WINDOWON | LCDF_WINBANKSELECT  
   ld [RLCD], a
 
   ret