Mechanic · combat · platformer
Boss weakness
Each weapon deals its own damage to each boss, so one weapon is the key to each fight.
On this page
A weakness table turns each boss into a lock with a weapon for its key. In Mega Man 2 each weapon has 14 bytes, one per boss: Metal Blade’s byte for Metal Man is 14 (doubled on one difficulty setting) and 0 for Air Man, and Atomic Fire refills Heat Man1. Mega Man 3 folds bosses into one 256-entry table per weapon, indexed by the target’s routine id2.
- Boss tableMega Man 2 (1988). Each weapon does its own damage to each boss, nothing to some, and heals one.1
- Every enemyMega Man 3 (1990). Every weapon does a set damage to each enemy and boss alike.2
Games
| Game | Year | How | Note |
|---|---|---|---|
| Mega Man 2 | 1988 | Boss table | each weapon does its own damage to each boss, nothing to some, and heals one |
| Mega Man 3 | 1990 | Every enemy | every weapon does a set damage to each enemy and boss alike |
Every claim about this mechanic, by game (2)
References
- ^ abEach weapon has a 14-byte table with one damage value per boss, in the order of
zcurrent_boss: 0 makes the boss immune, a negative value refills its health, and other values are subtracted, doubled whenzdifficultyis 0. Metal Blade's byte for Metal Man is 14 ($0E), so 14 damage, or 28 when doubled, and 0 for Air Man and Quick Man; the Mega Buster's bytes for the Robot Masters are 1 or 2; Atomic Fire refills Heat Man.Codelsmmega/mm2revisedHow we know
1@mega_buster_damage_table: 2 .BYTE $02 ;heatman 3 .BYTE $02 ;airman 4 .BYTE $01 ;woodman 5 .BYTE $01 ;bubbleman 6 .BYTE $02 ;quickman 7 .BYTE $02 ;flashman 8 .BYTE $01 ;metalman 9 .BYTE $01 ;crashman
data/weapons_bosses_damage_table.asm lines 1–9 at 94f0bf3 · upstream ↗ 113@metal_blade_damage_table: 114 .BYTE $01 ;heatman 115 .BYTE $00 ;airman 116 .BYTE $02 ;woodman 117 .BYTE $04 ;bubbleman 118 .BYTE $00 ;quickman 119 .BYTE $04 ;flashman 120 .BYTE $0E ;metalman 121 .BYTE $00 ;crashman
data/weapons_bosses_damage_table.asm lines 113–121 at 94f0bf3 · upstream ↗ 388 LDA aobject_flag + 1 389 AND #objects_can_recoiled 390 BNE @immune_8 391 LDY z:zcurrent_boss 392 LDA @metal_blade_damage_table, Y 393 STA z:z00 394 BEQ @immune_8 395 BPL @not_refilled_8 396 JMP @refill_boss ⋮ 398@not_refilled_8: 399 JSR @calc_difficulty
engine/weapons_bosses_damage.asm lines 388–399 at 94f0bf3 · upstream ↗ 452@calc_difficulty: 453 LDA z:zdifficulty 454 BNE @difficult 455 ASL z:z00 ⋮ 457@difficult: 458 RTS
engine/weapons_bosses_damage.asm lines 452–458 at 94f0bf3 · upstream ↗ 60@atomic_fire: 61 LDA z:zcurrent_boss 62 CMP #$00 63 BNE @not_heatman 64 JMP @refill_boss
engine/weapons_bosses_damage.asm lines 60–64 at 94f0bf3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abMega Man 3 indexes each weapon's 256-byte damage table by the target's main routine id, one table for regular enemies and bosses alike, where Mega Man 2 gives each weapon a separate 14-entry boss table. In the Spark Shock table the entry for routine id
$C1is 7, and$58marks targets the shock freezes instead of damaging. That$C1is Magnet Man is the disassembly's labeling, not checked here.Codeplasticsmoke/megaman3-disassembly-ca65 · lsmmega/mm2revisedHow we know
290 ldy current_weapon ; weapon ID as table index 291 lda weapon_damage_ptr_lo,y ; grab damage table pointer for 292 sta temp_00 ; currently equipped weapon 293 lda weapon_damage_ptr_hi,y ; high byte of damage ptr 294 sta $01 ; store to pointer at $00-$01 295 ldy ent_routine,x ; if damage for main routine index 296 lda (temp_00),y ; is nonzero, do stuff 297 bne check_weapon_hit_spark_check ; nonzero damage → check weapon type 298 jsr check_weapon_hit_tink_sound ; else tink shot 299 jmp check_weapon_hit_restore_bank ; zero damage → tink and exit
src/bank1C_1D_entity_ai.asm lines 290–299 at 58ca1c3 · upstream ↗ 562weapon_damage_ptr_lo: .byte $00,$00,$00,$00,$00 ; Buster, Gemini, Needle, Hard, Magnet 563weapon_damage_ptr_lo_special: .byte $00,$00,$00,$00,$00,$00,$00 ; TopSpin, Snake, RushCoil, Spark, RushMarine, Shadow, RushJet 564weapon_damage_ptr_hi: .byte $A1,$A4,$A2,$A5,$A3 ; Buster, Gemini, Needle, Hard, Magnet 565weapon_damage_ptr_hi_special: .byte $A6,$A7,$A1,$A8,$A1,$A9,$A1 ; TopSpin, Snake, RushCoil, Spark, RushMarine, Shadow, RushJet
src/bank1C_1D_entity_ai.asm lines 562–565 at 58ca1c3 · upstream ↗ 424spark_damage_table: 425 .byte $00,$00,$58,$58,$58,$58,$00,$58 ; $00-$07: $58=freeze
src/bank0A_damage_tables.asm lines 424–425 at 58ca1c3 · upstream ↗ 451 .byte $00,$07,$01,$01,$00,$00,$00,$00 ; $C0: Needle=0, Magnet=7 (weakness!), Top=1, Shadow=1src/bank0A_damage_tables.asm line 451 at 58ca1c3 · upstream ↗ 301check_weapon_hit_spark_check: lda current_weapon ; if weapon is 302 cmp #WPN_SPARK ; anything but spark 303 bne check_weapon_hit_ack_check ; apply normal damage 304 lda (temp_00),y ; if damage value is zero, 305 beq check_weapon_hit_spark_freeze_done ; don't do anything 306 cmp #$58 ; if damage isn't magic number $58, 307 bne check_weapon_hit_ack_check ; apply normal damage
src/bank1C_1D_entity_ai.asm lines 301–307 at 58ca1c3 · upstream ↗ 388 LDA aobject_flag + 1 389 AND #objects_can_recoiled 390 BNE @immune_8 391 LDY z:zcurrent_boss 392 LDA @metal_blade_damage_table, Y
engine/weapons_bosses_damage.asm lines 388–392 at 94f0bf3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
Sources
Code
- lsmmega. 2026. “mm2: Mega Man 2 disassembly (lsmmega/mm2).” Commit 94f0bf3. lsmmega/mm2 @ 94f0bf3 · licence, all uses
- plasticsmoke. 2026. “Mega Man 3 (U), annotated ca65 disassembly (plasticsmoke).” Commit 58ca1c3. plasticsmoke/megaman3-disassembly-ca65 @ 58ca1c3 · licence, all uses