Document GAME_COMPLETION_COUNT
This commit is contained in:
parent
d2e6d9996c
commit
def22881be
|
@ -0,0 +1,181 @@
|
|||
# Overview
|
||||
|
||||
_Contra_ is already a challenging game. However, it gets even more difficult
|
||||
the more times you beat the game. This documents the ways in which beating the
|
||||
game affects the behavior of subsequent playthoughs.
|
||||
|
||||
The game keeps track of the number of times the player(s) beat the game in the
|
||||
variable `GAME_COMPLETION_COUNT`, located at CPU memory address `$31`.
|
||||
|
||||
Many of the HP modifications are also based on the player's "weapon strength".
|
||||
This variable, called `PLAYER_WEAPON_STRENGTH`, is stored at CPU memory address
|
||||
`$2f` and depends on which weapon player 1 has.
|
||||
|
||||
| Weapon | Strength |
|
||||
|---------|----------|
|
||||
| Default | 0 |
|
||||
| M | 2 |
|
||||
| F | 1 |
|
||||
| S | 3 |
|
||||
| L | 2 |
|
||||
|
||||
# Soldier Generation
|
||||
|
||||
Random soldiers are generated more quickly the more you beat the game up until
|
||||
you've beaten the game 3 times. The actual delay depends on the level. Each
|
||||
time you beat the game, the delay is lowered by 40 (assuming the weapon player
|
||||
1 has is the same).
|
||||
|
||||
Soldier generation delay is calculated by the following formula
|
||||
|
||||
```
|
||||
DELAY = INITIAL_LEVEL_DELAY - (40 * GAME_COMPLETION_COUNT) - (5 * PLAYER_WEAPON_STRENGTH)
|
||||
```
|
||||
|
||||
| Completion Count | Result (hex) | Result (decimal) |
|
||||
|------------------|--------------|------------------|
|
||||
| 0 | #$81 | 129 |
|
||||
| 1 | #$59 | 89 |
|
||||
| 2 | #$31 | 49 |
|
||||
| 3 | #$09 | 9 |
|
||||
| 4 | #$09 | 9 |
|
||||
|
||||
All sample results assume the player's `PLAYER_WEAPON_STRENGTH` is 3 (S weapon)
|
||||
and the level is 1 where the initial delay is 144. The initial level delays are
|
||||
as follows (defined in `level_soldier_generation_timer`)
|
||||
|
||||
| Level | Delay (decimal) |
|
||||
|-------|-----------------|
|
||||
| 1 | 144 |
|
||||
| 2 | n/a |
|
||||
| 3 | 216 |
|
||||
| 4 | n/a |
|
||||
| 5 | 208 |
|
||||
| 6 | 200 |
|
||||
| 7 | 192 |
|
||||
| 8 | n/a |
|
||||
|
||||
# Red Turret Attack Delay
|
||||
|
||||
Red turret attack delay is shorter if you've beaten the game once. It doesn't
|
||||
get any short for subsequent wins.
|
||||
|
||||
| Completion Count | Result (hex) | Result (decimal) |
|
||||
|------------------|--------------|------------------|
|
||||
| 0 | #$28 | 40 |
|
||||
| 1 | #$08 | 8 |
|
||||
|
||||
# Alien Fetus (Bundle) HP
|
||||
|
||||
The level 8 alien fetus (bundle) HP goes up as you beat the game more and more.
|
||||
It is the number of times you've beaten the game + 2, so the HP goes up by 1
|
||||
every time the game is beaten (until max 255 due to memory limit).
|
||||
|
||||
```
|
||||
GAME_COMPLETION_COUNT + 2
|
||||
```
|
||||
|
||||
| Completion Count | Result (hex) | Result (decimal) |
|
||||
|------------------|--------------|------------------|
|
||||
| 0 | #$02 | 2 |
|
||||
| 1 | #$03 | 3 |
|
||||
| 2 | #$04 | 4 |
|
||||
| 3 | #$05 | 5 |
|
||||
| 4 | #$06 | 6 |
|
||||
| 5 | #$07 | 7 |
|
||||
| ... | ... | ... |
|
||||
| 253 | #$ff | 255 |
|
||||
| 254 | #$00 | 0 (invincible) |
|
||||
| 255 | #$01 | 1 |
|
||||
|
||||
# Alien Mouth (Wadder) HP
|
||||
|
||||
The level 8 alien mouth (wadder) HP goes up as you beat the game more and more.
|
||||
The HP is calculated by the following formula
|
||||
|
||||
```
|
||||
(2 * GAME_COMPLETION_COUNT) + PLAYER_WEAPON_STRENGTH + 4
|
||||
```
|
||||
|
||||
| Completion Count | Result (hex) | Result (decimal) |
|
||||
|------------------|--------------|------------------|
|
||||
| 0 | #$07 | 7 |
|
||||
| 1 | #$09 | 9 |
|
||||
| 2 | #$0b | 11 |
|
||||
| 3 | #$0d | 13 |
|
||||
| 4 | #$0f | 15 |
|
||||
| 5 | #$11 | 17 |
|
||||
| ... | ... | ... |
|
||||
| 124 | #$ff | 255 |
|
||||
| 125 | #$01 | 1 |
|
||||
| ... | ... | ... |
|
||||
| 252 | #$00 | 0 (invincible) |
|
||||
|
||||
All sample results assume the player's `PLAYER_WEAPON_STRENGTH` is 3 (S weapon).
|
||||
|
||||
# Alien Spider (Bugger) HP
|
||||
|
||||
Level 8 alien spiders (buggers) HP goes up as you beat the game more and more.
|
||||
The HP is calculated by the following formula
|
||||
|
||||
```
|
||||
PLAYER_WEAPON_STRENGTH + GAME_COMPLETION_COUNT + 2
|
||||
```
|
||||
|
||||
| Completion Count | Result (hex) | Result (decimal) |
|
||||
|------------------|--------------|------------------|
|
||||
| 0 | #$05 | 5 |
|
||||
| 1 | #$06 | 6 |
|
||||
| 2 | #$07 | 7 |
|
||||
| 3 | #$08 | 8 |
|
||||
| 4 | #$09 | 9 |
|
||||
| 5 | #$0a | 11 |
|
||||
| ... | ... | ... |
|
||||
| 250 | #$ff | 255 |
|
||||
| 251 | #$00 | 0 (invincible) |
|
||||
| 252 | #$02 | 2 |
|
||||
|
||||
All sample results assume the player's `PLAYER_WEAPON_STRENGTH` is 3 (S weapon).
|
||||
|
||||
# Alien Spider Spawn (Eggron) HP
|
||||
|
||||
```
|
||||
(GAME_COMPLETION_COUNT * 2) + (PLAYER_WEAPON_STRENGTH * 2) + 24
|
||||
```
|
||||
|
||||
| Completion Count | Result (hex) | Result (decimal) |
|
||||
|------------------|--------------|------------------|
|
||||
| 0 | #$1e | 30 |
|
||||
| 1 | #$20 | 32 |
|
||||
| 2 | #$22 | 34 |
|
||||
| 3 | #$24 | 36 |
|
||||
| 4 | #$26 | 38 |
|
||||
| 5 | #$28 | 40 |
|
||||
| ... | ... | ... |
|
||||
| 112 | #$fe | |
|
||||
| 113 | #$00 | 0 (invincible) |
|
||||
| 114 | #$02 | 2 |
|
||||
|
||||
All sample results assume the player's `PLAYER_WEAPON_STRENGTH` is 3 (S weapon).
|
||||
|
||||
# Alien Guardian & Boss Heart HP
|
||||
|
||||
The level 8 alien guardian and boss heart (final boss) HP are both calculated
|
||||
according to the same formula below until the calculated HP is greater than or
|
||||
equal to #$a0 (160 decimal). 160 is the max HP the alien guardian and boss
|
||||
heart can be.
|
||||
|
||||
```
|
||||
(PLAYER_WEAPON_STRENGTH * 16) + 55 + (GAME_COMPLETION_COUNT * 16)
|
||||
```
|
||||
|
||||
| Completion Count | Result (hex) | Result (decimal) |
|
||||
|------------------|--------------|------------------|
|
||||
| 0 | #$67 | 103 |
|
||||
| 1 | #$77 | 119 |
|
||||
| 2 | #$87 | 135 |
|
||||
| 3 | #$97 | 151 |
|
||||
| 4 | #$a0 | 160 |
|
||||
| 5 | #$a0 | 160 |
|
||||
|
||||
All sample results assume the player's `PLAYER_WEAPON_STRENGTH` is 3 (S weapon).
|
|
@ -9539,10 +9539,11 @@ alien_mouth_routine_ptr_tbl:
|
|||
.addr enemy_routine_remove_enemy ; CPU address $e806 from bank 7
|
||||
|
||||
; set mouth hp and draw open mouth super-tile
|
||||
; alien mouth hp = (#$02 * GAME_COMPLETION_COUNT) + (PLAYER_WEAPON_STRENGTH + #$03)
|
||||
; alien mouth hp = (#$02 * GAME_COMPLETION_COUNT) + (PLAYER_WEAPON_STRENGTH + #$04)
|
||||
alien_mouth_routine_00:
|
||||
lda PLAYER_WEAPON_STRENGTH ; load player's weapon strength
|
||||
adc #$03 ; add #$03 to player weapon strength
|
||||
adc #$03 ; add #$04 to player weapon strength (carry is always set here)
|
||||
; because the carry flag is set from the cmp #$10 check before to run `exec_level_enemy_routine`
|
||||
sta $08 ; store PLAYER_WEAPON_STRENGTH + #$03 in $08
|
||||
lda GAME_COMPLETION_COUNT ; load the number of times the game has been completed
|
||||
asl ; double the number of times the game has been completed
|
||||
|
@ -9919,12 +9920,14 @@ alien_spider_set_ground_vel_and_routine:
|
|||
lda #$04 ; a = #$04
|
||||
jmp set_enemy_routine_to_a ; set routine to alien_spider_routine_03
|
||||
|
||||
; alien spider hp = weapon strength + completion count + 1
|
||||
; alien spider hp = weapon strength + completion count + 2
|
||||
;
|
||||
set_alien_spider_hp_sprite_attr:
|
||||
lda PLAYER_WEAPON_STRENGTH ; load player weapon strength
|
||||
adc GAME_COMPLETION_COUNT ; add with the number of times the game has been completed
|
||||
adc #$01 ; add #$01
|
||||
sta ENEMY_HP,x ; set enemy hp (weapon strength + completion count + 1)
|
||||
sta ENEMY_HP,x ; set enemy hp (weapon strength + completion count + 2)
|
||||
; 2 because the carry flag is set from the cmp #$10 check before to run `exec_level_enemy_routine`
|
||||
lda #$60 ; a = #$60
|
||||
sta ENEMY_ANIMATION_DELAY,x ; set enemy animation frame delay counter
|
||||
lda ENEMY_Y_POS,x ; load enemy y position on screen
|
||||
|
|
|
@ -4062,13 +4062,12 @@ set_player_weapon_strength:
|
|||
rts
|
||||
|
||||
; table for weapon strength code (#$05 bytes)
|
||||
; Regular = Weak
|
||||
; M = Strong
|
||||
; F = Medium
|
||||
; S = Very Strong
|
||||
; L = Strong
|
||||
weapon_strength:
|
||||
.byte $00,$02,$01,$03,$02
|
||||
.byte $00 ; Regular = Weak
|
||||
.byte $02 ; M = Strong
|
||||
.byte $01 ; F = Medium
|
||||
.byte $03 ; S = Very Strong
|
||||
.byte $02 ; L = Strong
|
||||
|
||||
; run logic based on players current state
|
||||
; #$00 falling into level
|
||||
|
|
|
@ -32,7 +32,8 @@ DELAY_TIME_HIGH_BYTE = $2b ; the high byte of the delay
|
|||
LEVEL_ROUTINE_INDEX = $2c ; the index into level_routine_ptr_tbl of the routine to run
|
||||
END_LEVEL_ROUTINE_INDEX = $2d ; offset into either end_level_sequence_ptr_tbl or end_game_sequence_ptr_tbl
|
||||
DEMO_FIRE_DELAY_TIMER = $2e ; the number of frames to delay before starting to fire when demoing
|
||||
PLAYER_WEAPON_STRENGTH = $2f ; the damage strength of the player's current weapon (see weapon_strength) bits 0-2 of P1_CURRENT_WEAPON,x
|
||||
PLAYER_WEAPON_STRENGTH = $2f ; the damage strength of the player's current weapon (see weapon_strength) based on bits 0-2 of P1_CURRENT_WEAPON,x
|
||||
; Default = #$00, M = #$02, F = #$01, S = #$03, L = #$02
|
||||
CURRENT_LEVEL = $30 ; #$00-#$09, #$00 to #$07 represent levels 1 through 8. #$9 is interpreted as game over sequence
|
||||
GAME_COMPLETION_COUNT = $31 ; the number of times the game has been completed (final boss defeated)
|
||||
P1_NUM_LIVES = $32 ; P1 number of lives, #$00 is last life, on game over stays #$00, but P1_GAME_OVER_STATUS becomes #$01
|
||||
|
|
Loading…
Reference in New Issue