diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/enemies.s | 2 | ||||
| -rw-r--r-- | src/jetpac.s | 1 | ||||
| -rw-r--r-- | src/prng.s | 35 |
3 files changed, 37 insertions, 1 deletions
diff --git a/src/enemies.s b/src/enemies.s index 6201416..2208758 100644 --- a/src/enemies.s +++ b/src/enemies.s @@ -244,7 +244,7 @@ ;; The Y coordinate is also set at random within the bounds of the ;; playable screen. - jsr Prng::random_valid_y_coordinate + jsr Prng::random_non_repeated_valid_y_coordinate ldx Globals::zp_tmp0 inx sta Enemies::zp_pool_base, x diff --git a/src/jetpac.s b/src/jetpac.s index f99c8b0..3cf8f0a 100644 --- a/src/jetpac.s +++ b/src/jetpac.s @@ -130,6 +130,7 @@ sta Joypad::zp_prev sta Player::zp_state sta Items::zp_state + sta Prng::zp_last_rand ;; 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 @@ -9,6 +9,14 @@ ;; Current random value. Initialized on the title to game transition. zp_rand = $0A + ;; Last random value as stored by + ;; Prng::random_non_repeated_valid_y_coordinate(). + zp_last_rand = $12 + + ;; How many attempts should Prng::random_non_repeated_valid_y_coordinate() + ;; take to find a unique value. + RAND_ATTEMPTS = 3 + ;; Updates the 'a' register with the next random number set after the ;; current value of `zp_rand`, while also making sure that it is a valid ;; screen Y coordinate. @@ -21,6 +29,33 @@ sta zp_rand rts .endproc + + ;; Calls Prng::random_valid_y_coordinate() multiple times until we get a + ;; different value than what we got the last time we called this + ;; function. Realistically this should just take 1 attempt for most cases, + ;; and in the worst case just 2. Nevertheless, we have set a generous value + ;; to 'RAND_ATTEMPTS' just in case. + ;; + ;; NOTE: the 'y' register is preserved. + .proc random_non_repeated_valid_y_coordinate + tya + pha + ldy #RAND_ATTEMPTS + + @again: + jsr Prng::random_valid_y_coordinate + cmp Prng::zp_last_rand + bne @end + dey + bne @again + + @end: + sta Prng::zp_last_rand + pla + tay + lda Prng::zp_last_rand + rts + .endproc .endscope |
