aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <mssola@mssola.com>2026-03-04 23:44:47 +0100
committerMiquel Sabaté Solà <mssola@mssola.com>2026-03-04 23:44:47 +0100
commitdbcbd43287a28bf087e20e660edd5ba40b5c27ec (patch)
treeae69b710c3b06bae58c18273af105855b3071ded /src
parent0c5af85cc0cb9bb39a3a72548e735b92daf0a28f (diff)
downloadjetpac.nes-dbcbd43287a28bf087e20e660edd5ba40b5c27ec.tar.gz
jetpac.nes-dbcbd43287a28bf087e20e660edd5ba40b5c27ec.zip
Update lifes left for player 1
The whole handling of player 2 will come whenever I set to implement multi-player for this game. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
Diffstat (limited to 'src')
-rw-r--r--src/driver.s8
-rw-r--r--src/interrupts.s22
-rw-r--r--src/jetpac.s1
-rw-r--r--src/player.s23
4 files changed, 52 insertions, 2 deletions
diff --git a/src/driver.s b/src/driver.s
index 8a0d452..b90cabe 100644
--- a/src/driver.s
+++ b/src/driver.s
@@ -80,6 +80,14 @@
lda #PLAYER_TIMER_VALUE
sta zp_player_timer
+ ;; Initialize lifes for both players.
+ lda #4
+ sta Player::zp_lifes
+ sta Player::zp_lifes + 1
+ lda Player::zp_state
+ ora #%00001000
+ sta Player::zp_state
+
;; Mark the state of the game as "game". That is, the player has
;; started. Also set the `ppu` flag and unset the `title over` one.
lda #%01000001
diff --git a/src/interrupts.s b/src/interrupts.s
index 8c53af7..b5120b4 100644
--- a/src/interrupts.s
+++ b/src/interrupts.s
@@ -34,6 +34,28 @@
jsr Driver::pal_handler
.endif
+ ;; Do we need to update the lifes from players on the HUD?
+ lda Player::zp_state
+ and #%00001000
+ beq @global_flags
+
+ ;; Yeah! TODO: this is only done for player 1.
+ bit PPU::m_status
+ lda #$28
+ sta PPU::m_address
+ lda #$4B
+ sta PPU::m_address
+ lda Player::zp_lifes
+ clc
+ adc #$10
+ sta PPU::m_data
+
+ ;; And unset the 'life' flag from the player.
+ lda Player::zp_state
+ and #%11110111
+ sta Player::zp_state
+
+@global_flags:
;; TODO: some actions here will depend on the status of the game...
lda Globals::zp_flags
and #%00000001
diff --git a/src/jetpac.s b/src/jetpac.s
index b6b44e2..2e55771 100644
--- a/src/jetpac.s
+++ b/src/jetpac.s
@@ -122,6 +122,7 @@
sta Globals::zp_flags
sta Joypad::zp_buttons1
sta Joypad::zp_buttons2
+ sta Player::zp_state
;; Initialize the level. We allow the build system to pass its own value for
;; this in `LEVEL`, just in case we want to debug the enemy of a specific
diff --git a/src/player.s b/src/player.s
index a821f0e..73ff20e 100644
--- a/src/player.s
+++ b/src/player.s
@@ -86,7 +86,8 @@
;; |-----+------------+-----------------------------------------------|
;; | 7 | thrust | Player is hitting the thrust |
;; | 6 | heading | heading right |
- ;; | 5-3 | - | Unused |
+ ;; | 5-4 | - | Unused |
+ ;; | 3 | life | Lifes should be updated on screen |
;; | 2 | update | Sprite (animation or heading) must be updated |
;; | 1-0 | walk | 0: still; 1: animation 1; 2: animation 2 |
zp_state = $50
@@ -102,6 +103,9 @@
zp_step_on_pal = $52
.endif
+ ;; Lifes for both players.
+ zp_lifes = $53 ; asan:reserve $02
+
;; How many animations are there for walking?
WALK_ANIMATION_NR = 3
@@ -830,7 +834,13 @@
;; That's just german for "the Bart, the".
.proc die_bart_die
- ;; TODO: dec lifes
+ ;; Decrement the life.
+ ;; TODO: this is just considering the first player only!.
+ dec Player::zp_lifes
+ beq @over
+ lda Player::zp_state
+ ora #%00001000
+ sta Player::zp_state
;; Move the player's sprites out of the screen.
ldx #0
@@ -853,5 +863,14 @@
lda Player::zp_screen_x
sta Globals::zp_arg3
JAL Explosions::create
+
+ @over:
+ ;; Set the proper flag for game over.
+ ;; TODO: game over (coin)
+ lda Globals::zp_flags
+ ora #%00000010
+ sta Globals::zp_flags
+
+ rts
.endproc
.endscope