diff --git a/docs/Enemy Glossary.md b/docs/Enemy Glossary.md index 74b8ac5..4a32af3 100644 --- a/docs/Enemy Glossary.md +++ b/docs/Enemy Glossary.md @@ -669,6 +669,14 @@ Fire ring emitted from #$10 Boss Eye (Garmakilma). Other Names: Boss Gemini, Boss Metal Helmet +![sprite_68](sprite_library/contra_sprites/sprite_68.png?raw=true "sprite_68") +![sprite_69](sprite_library/contra_sprites/sprite_69.png?raw=true "sprite_69") +![sprite_6a](sprite_library/contra_sprites/sprite_6a.png?raw=true "sprite_6a") +![sprite_6b](sprite_library/contra_sprites/sprite_6b.png?raw=true "sprite_6b") +![sprite_6c](sprite_library/contra_sprites/sprite_6c.png?raw=true "sprite_6c") + +**ENEMY HP**: 10 + No attributes exist for this enemy. #### Logic @@ -682,12 +690,12 @@ not for anything with the y velocity, but rather to control speed of x movement and keep track of x distance from initial position respectively. * `ENEMY_FRAME` - offset into `boss_gemini_sprite_tbl`, which contains the exact - sprite code: `sprite_68`, `sprite_69`, `sprite_6b`, `sprite_6c`. + sprite code: `sprite_68`, `sprite_69`, `sprite_6a`, `sprite_6b`, `sprite_6c`. * `ENEMY_VAR_1` - initial x position * `ENEMY_VAR_2` - timer after being hit - #$10 down to #$00 * `ENEMY_VAR_3` - whether or not the boss gemini's health is low (less than #$07). Used to show a red brain instead of a green one. -* `ENEMY_VAR_4` - actual representation of ENEMY_HP +* `ENEMY_VAR_4` - actual representation of ENEMY_HP, initialized to #$0a * `ENEMY_X_VELOCITY_FRACT` - always #$80 (.50). Used with `ENEMY_Y_VELOCITY_FRACT` to move gemini by 1 every #$02 frames * `ENEMY_X_VELOCITY_FAST` - x direction of boss gemini @@ -713,6 +721,15 @@ Red and blue molecule-like orbs that are created by #$1c Boss Gemini (Godomuga). They seek the player for a determined amount of time. If after set number of seeks (#$13), then the bubble pair will continue in last direction. +![sprite_6d](sprite_library/contra_sprites/sprite_6d.png?raw=true "sprite_6d") +![sprite_6e](sprite_library/contra_sprites/sprite_6e.png?raw=true "sprite_6e") +![sprite_6f](sprite_library/contra_sprites/sprite_6f.png?raw=true "sprite_6f") +![sprite_70](sprite_library/contra_sprites/sprite_70.png?raw=true "sprite_70") +![sprite_71](sprite_library/contra_sprites/sprite_71.png?raw=true "sprite_71") +![sprite_72](sprite_library/contra_sprites/sprite_72.png?raw=true "sprite_72") + +**ENEMY HP**: 1 + #### Attributes * `.... .xxx` - specifies how frequently the bubbles will spin. Initialized in @@ -733,6 +750,16 @@ Value is an offset into `spinning_bullet_spin_tbl`. Other Names: Blue Jumping Guy, Boss Blue Soldier, Blue Soldier +![sprite_85](sprite_library/contra_sprites/sprite_85.png?raw=true "sprite_85") +![sprite_86](sprite_library/contra_sprites/sprite_86.png?raw=true "sprite_86") +![sprite_87](sprite_library/contra_sprites/sprite_87.png?raw=true "sprite_87") +![sprite_88](sprite_library/contra_sprites/sprite_88.png?raw=true "sprite_88") +![sprite_89](sprite_library/contra_sprites/sprite_89.png?raw=true "sprite_89") +![sprite_8a](sprite_library/contra_sprites/sprite_8a.png?raw=true "sprite_8a") +![sprite_8b](sprite_library/contra_sprites/sprite_8b.png?raw=true "sprite_8b") + +**ENEMY HP**: 1 + #### Attributes * `.... ..xx` - specifies initial position (see `red_blue_soldier_init_pos_tbl`) @@ -754,6 +781,14 @@ Other Names: Blue Jumping Guy, Boss Blue Soldier, Blue Soldier Other Names: Red Shooting Guy, Boss Red Soldier, Red Soldier +![sprite_8c](sprite_library/contra_sprites/sprite_8c.png?raw=true "sprite_8c") +![sprite_8d](sprite_library/contra_sprites/sprite_8d.png?raw=true "sprite_8d") +![sprite_8e](sprite_library/contra_sprites/sprite_8e.png?raw=true "sprite_8e") +![sprite_8f](sprite_library/contra_sprites/sprite_8f.png?raw=true "sprite_8f") +![sprite_90](sprite_library/contra_sprites/sprite_90.png?raw=true "sprite_90") + +**ENEMY HP**: 1 + #### Attributes * `.... ..xx` - specifies initial position (see `red_blue_soldier_init_pos_tbl`) @@ -774,6 +809,8 @@ Other Names: Red Shooting Guy, Boss Red Soldier, Red Soldier Other Names: Red Blue Soldier Generator +**ENEMY HP**: n/a + Generates Garth and Rangel enemies following a pattern specified in `red_blue_solider_data_tbl`. @@ -801,6 +838,10 @@ No attributes exist for this enemy. Floats back and forth to allow players to jump higher in level. This enemy is very similar to the moving flame enemy, which is also in the vertical level. +![sprite_48](sprite_library/contra_sprites/sprite_48.png?raw=true "sprite_48") + +**ENEMY HP**: n/a + #### Attributes * `000` - platform starts out moving left at 1 unit per frame @@ -811,6 +852,10 @@ very similar to the moving flame enemy, which is also in the vertical level. Flame that goes back and forth over bridge. This enemy is very similar to the floating rock platform enemy, which is also in the vertical level +![sprite_49](sprite_library/contra_sprites/sprite_49.png?raw=true "sprite_49") + +**ENEMY HP**: n/a + #### Attributes * `010` - Flame starts out moving left at 1 unit per frame @@ -820,10 +865,16 @@ floating rock platform enemy, which is also in the vertical level Generates #13 Falling Rocks +**ENEMY HP**: n/a + ### 13 - Falling Rock Other Names: Boulder +![sprite_4a](sprite_library/contra_sprites/sprite_4a.png?raw=true "sprite_4a") + +**ENEMY HP**: n/a + #### Logic * `ENEMY_VAR_1` - y position of most recent ground collision @@ -832,6 +883,8 @@ Other Names: Boulder Other Names: Boss Mouth, Gromaides +**ENEMY HP**: 32 + #### Logic * `ENEMY_VAR_1` - dragon HP, used to keep track of HP between opening and @@ -851,6 +904,11 @@ for each arm. Each side then spawns 4 additional dragon arm orb enemies. Loops through 5 different attack patterns. This is the most complicated enemy in the game. +![sprite_7a](sprite_library/contra_sprites/sprite_7a.png?raw=true "sprite_7a") +![sprite_7b](sprite_library/contra_sprites/sprite_7b.png?raw=true "sprite_7b") + +**ENEMY HP**: 16 + #### Attributes * `.... ...x` - dragon arm orb side @@ -913,8 +971,17 @@ simplify defining the enemy vars. No attributes exist for this enemy. +**ENEMY HP**: n/a + ### 11 - Ice Grenade +![sprite_74](sprite_library/contra_sprites/sprite_74.png?raw=true "sprite_74") +![sprite_75](sprite_library/contra_sprites/sprite_75.png?raw=true "sprite_75") +![sprite_76](sprite_library/contra_sprites/sprite_76.png?raw=true "sprite_76") +![sprite_77](sprite_library/contra_sprites/sprite_77.png?raw=true "sprite_77") + +**ENEMY HP**: n/a + No attributes exist for this enemy. #### Logic @@ -925,6 +992,8 @@ No attributes exist for this enemy. Other Names: Dogra +**ENEMY HP**: 71 + #### Attributes * `.... ...x` - tank attack delay index into `tank_attack_delay_tbl` @@ -949,16 +1018,22 @@ Other Names: Dogra Other Names: Pipe Joint, Ice Joint +![sprite_c4](sprite_library/contra_sprites/sprite_c4.png?raw=true "sprite_c4") + +**ENEMY HP**: n/a + No attributes exist for this enemy. ### 14 - Alien Carrier Other Names: Guldaf, Boss UFO +**ENEMY HP**: 32 + No attributes exist for this enemy. Appears randomly and creates flying saucers (enemy type - #$15) and drop bombs -(enemy type - #$16). One of the few enemies that use BG_PALETTE_ADJ_TIMER to +(enemy type - #$16). One of the few enemies that use `BG_PALETTE_ADJ_TIMER` to create a fading in effect. #### Logic @@ -972,6 +1047,12 @@ create a fading in effect. Other Names: Mini UFO +![sprite_7c](sprite_library/contra_sprites/sprite_7c.png?raw=true "sprite_7c") +![sprite_7d](sprite_library/contra_sprites/sprite_7d.png?raw=true "sprite_7d") +![sprite_7e](sprite_library/contra_sprites/sprite_7e.png?raw=true "sprite_7e") + +**ENEMY HP**: 1 + No attributes exist for this enemy. Direction of flying saucer is determined by Alien Carrier. @@ -979,6 +1060,10 @@ Alien Carrier. Bombs dropped from the Alien Carrier +![sprite_22](sprite_library/contra_sprites/sprite_22.png?raw=true "sprite_22") + +**ENEMY HP**: 1 + ## Level 6 - Energy Zone ### 10 - 12 - Fire Beam @@ -1011,20 +1096,29 @@ These 4 enemy types are very similar. They differ in the direction they fire Other Names: Gordea, JJ, Jumping Joey, Jumping Jack Flash, Giant Boss Robot, Giant Armored Soldier, Boss Giant -No attributes exist for this enemy. His health is calculated based on player's -`PLAYER_WEAPON_STRENGTH` value. The formula is below +![sprite_b7](sprite_library/contra_sprites/sprite_b7.png?raw=true "sprite_b7") +![sprite_b8](sprite_library/contra_sprites/sprite_b8.png?raw=true "sprite_b8") +![sprite_b9](sprite_library/contra_sprites/sprite_b9.png?raw=true "sprite_b9") +![sprite_ba](sprite_library/contra_sprites/sprite_ba.png?raw=true "sprite_ba") +![sprite_c3](sprite_library/contra_sprites/sprite_c3.png?raw=true "sprite_c3") + +**ENEMY HP**: ``` (PLAYER_WEAPON_STRENGTH * #$08) + #$40 ``` -| Weapon | Strength | -|---------|----------| -| Default | 0 | -| M | 2 | -| F | 1 | -| S | 3 | -| L | 2 | +| Weapon | Strength | HP | +|---------|----------|----| +| Default | 0 | 64 | +| M | 2 | 80 | +| F | 1 | 72 | +| S | 3 | 88 | +| L | 2 | 80 | + +No attributes exist for this enemy. His health is calculated based on player's +`PLAYER_WEAPON_STRENGTH` value. The formula is below + #### Logic @@ -1054,6 +1148,8 @@ Other Names: Saucer, Spiked Disk Projectile Other Names: Moving Claw +**ENEMY HP**: n/a + Mechanical claw similar to arcade claw machines #### Attributes @@ -1082,6 +1178,8 @@ Other Names: Spiked Wall A spiked wall that rises from the ground in front of the player +**ENEMY HP**: 16 + #### Attributes * `.... ..xx` - bits 0 and 1 are an index into `rising_spike_wall_delay_tbl`, @@ -1111,6 +1209,8 @@ rising spiked wall by using offset 16 into `collision_code_f_adj_tbl`. Similar to Rising Spiked Wall (#$11), but taller and stationary +**ENEMY HP**: 16 + #### Attributes * `.... ..xx` - index into `spiked_wall_destroyed_data_tbl` @@ -1130,12 +1230,19 @@ rising spiked wall by using offset 16 into `collision_code_f_adj_tbl`. Other Names: Mine Cart Generator +**ENEMY HP**: n/a + ### 14 - Mining Cart Other Names: Moving Cart Moving mining cart that can be destroyed. +![sprite_2a](sprite_library/contra_sprites/sprite_2a.png?raw=true "sprite_2a") +![sprite_2b](sprite_library/contra_sprites/sprite_2b.png?raw=true "sprite_2b") + +**ENEMY HP**: 3 + #### Attributes This enemy is only ever created by #$13 (Mining Cart Generator), so enemy @@ -1151,6 +1258,11 @@ Other Names: Immobile Cart Stationary mining cart that can start moving when a player lands on it +![sprite_2a](sprite_library/contra_sprites/sprite_2a.png?raw=true "sprite_2a") +![sprite_2b](sprite_library/contra_sprites/sprite_2b.png?raw=true "sprite_2b") + +**ENEMY HP**: 3 + #### Attributes * #$80 - the cart should be destroyed when colliding with background (only @@ -1162,12 +1274,16 @@ Stationary mining cart that can start moving when a player lands on it Other Names: Armored Door With Siren +**ENEMY HP**: 32 + ### 17 - Mortar Launcher Other Names: Boss Mortar Launches mortar shots (enemy type #$0b) on the boss screen. +**ENEMY HP**: 8 + ### Attributes * `...x` - initial attack delay. bit 0 set is a #$10 delay, bit 0 clear is a @@ -1194,6 +1310,8 @@ one mortar launcher is destroyed, or if 20 waves of soldier attack have occurred, then even if the player is close to the left side, soldiers will randomly be generated on the left side. +**ENEMY HP**: n/a + #### Logic * `ENEMY_VAR_1` - number of soldiers to generate for current attack wave diff --git a/src/bank0.asm b/src/bank0.asm index c96a64f..7022753 100644 --- a/src/bank0.asm +++ b/src/bank0.asm @@ -5519,7 +5519,7 @@ boss_gemini_routine_02: tay ; transfer random number between 0 and 3 to offset register lda boss_gemini_attack_delay_tbl,y ; load random attack delay sec ; set carry flag in preparation for subtraction - sbc $08 ; subtract multiplied weapon strength from attack delay. the strong the weapon, the shorter the attack delay + sbc $08 ; subtract multiplied weapon strength from attack delay. the stronger the weapon, the shorter the attack delay sta ENEMY_ATTACK_DELAY,x ; set delay between attacks lda #$1d ; a = #$1d (#$1d = spinning bubbles) jsr generate_enemy_a ; generate #$1d enemy (spinning bubbles) @@ -5594,7 +5594,7 @@ boss_gemini_routine_02: ; ENEMY_FRAME is #$00, #$01, or #$02, but if ENEMY_VAR_3 is #$01, then #$03 is added so ; ENEMY_VAR_3 = #$00 -> sprite_68, sprite_69, sprite_6a ; ENEMY_VAR_3 = #$01 -> sprite_68, sprite_6b, sprite_6c (hit by bullet, or almost dead, red brain) -; sprite_68, sprite_69, sprite_6b, sprite_6c +; sprite_68, sprite_69, sprite_6a, sprite_6b, sprite_6c boss_gemini_sprite_tbl: .byte $68,$69,$6a ; ENEMY_VAR_3 is #$00 .byte $68,$6b,$6c ; ENEMY_VAR_3 is #$01