Shippu Mahou Daisakusen/Reverse engineering notes

From Shmups Wiki -- The Digital Library of Shooting Games
< Shippu Mahou Daisakusen
Revision as of 21:08, 2 April 2026 by Sylvie (talk | contribs) (Some more address info, new section about speed and boosting values/mechanics)
Jump to navigation Jump to search

TODO: clean up addresses below pointing directly to bytes when code is operating on them as words. e.g., P1 lives @ 100555.b is probably referenced in the code as 100554.w

  • 1006C6 - seems to consistently hold boss HP value when one is on screen
  • 1006AA - base address of the boss enemy object
  • object+$04 - animation frame
  • object+$06 - animation related flags (sprite rotation, hit flash and/or palette?, etc.)
  • object+$08 - y-coord
  • object+$0A - x-coord
  • object+$1C - HP value for enemies. Damage value for projectiles/player, to apply against target enemy up to their specified durability cap
  • object+$36 - i-frames
  • Code @ 13D78 - damage calculation for durable enemies
  • Code @ 13F6A - damage calculation for zakos (uncapped)
  • 100551 - current play state?
  • 100553 - current play flags?
  • 100555 - current P1 lives
  • 10055c - current P1 character

10055c character values:

Gain Chitta Miyamoto Bornnam Nirvana Kickle & Laycle Honest John Bul-Gin
0 1 2 3 4 5 6 7
  • 10058C = current calculated rank
  • 10058E = base rank for current stage
  • 100590 = survival rank (resets on stage start or player death)
  • 1006A4 = survival rank increment timer (does not reset on stage start)
  • 102C4A + $44 (102C8E) = maximum unboosted speed
  • 102C4A + $46 (102C90) = minimum unboosted speed
  • 102C4A + $22 (102c6c) = current speed
  • 1012DE = P1 main shot power
  • 1012D6 = P1 bomb count
  • 1012DA = P1 sub-weapon type
  • 1012D8 = P1 sub-weapon power
  • 1005B1 - current stage
  • 1005B3 - current track
  • 1005B5 - current loop (0 = first, 1 = second)
  • 100656 - table of P1 track times
  • 10066E - table of track selections

Speed and Boost Mechanics

(To be pared down and moved elsewhere later; some of this can probably go on the main page, or a racing-focused subpage)

These are the maximum and minimum unboosted speed values for each track (obtained by observing 102C8E and 102C90 while playing the game). Some short sections are omitted (for example, when the wave of water comes in Deeply Dungeon, max and min speed are both briefly set to 1024).

Track Min Max
Basalna City 256 512
Air Circus 384 640
Air Circus (Boss) 256 512
Velmatic Ocean 256 512
Outcast Castle 128 256
Outcast Castle (Worms) 64 192
Outcast Castle (After Boss) 256 512
Cross Fire 512 1024
Deeply Dungeon 96 192
Deeply Dungeon (Boss) 160 224
Deeply Dungeon (After Boss) 160 320
Cold Corridor 256 512
Cold Corridor (Boss) 192 256
Cold Corridor (After Boss) 192 512
Strato Storm 640 1280
Forest of Dead! 192 384
Forest of Dead! (After Boss) 256 512
Kingdom Grandprix 512 768
Yashiki of Ninja 128 256
Yashiki of Ninja (After Boss) 256 512
Kobolds Tower 192 384
Kobolds Tower (Rocks) 128 256

Boosting increases your speed beyond the unboosted maximum by up to 128 units, regardless of stage. This means boosting has a more significant effect on slow stages. For example, on Strato Storm, boosting can only increase your speed by up to 110%, while in Outcast Castle, it can increase your speed by up to 150% (early on) or ~167% (worm section).

Whether the maximum boost of +128 is actually reachable depends on three factors:

  • Per-character per-stage base boost speed (see table below)
  • Main shot power bonus (grants a small bonus for each power level)
  • Bomb count modifier (grants a bonus for less than 4 bombs, or a penalty for more than 4 bombs)

The extra speed from boosting is calculated by adding together the values from the following tables. If the value exceeds 128, it is capped at 128.

As an example, Chitta has a base boost speed of 48 on Air Circus. If she has full shot power, she gets a +6 bonus, and if she has the default 3 bombs, she gets a +8 bonus. This means boosting on Air Circus will only increase her speed by 48 + 6 + 8 = 62 units. Even if Chitta use all her bombs to get the +32 bomb count bonus, that only gets her to 86 units. In general, if a character's base boost speed is lower than 96, they can't reach the maximum boost of 128 for that stage.

Base Boost Speed (depends on stage and character)

Track Gain Chitta Miyamoto Bornnam Nirvana Kickle & Laycle Honest John Bul-Gin
Basalna City 96 96 96 96 96 96 96 96
Air Circus 128 48 96 32 80 128 112 64
Velmatic Ocean 80 128 96 64 128 48 32 80
Outcast Castle 80 64 128 128 96 48 112 32
Cross Fire 128 112 32 80 48 96 64 128
Deeply Dungeon 32 112 96 128 80 128 48 64
Cold Corridor 64 128 48 96 32 80 128 112
Strato Storm 96 32 80 80 128 64 112 128
Forest of Dead! 80 64 112 128 96 32 128 48
Kingdom Grandprix 128 96 96 96 112 128 128 112
Yashiki of Ninja 112 128 128 128 96 112 112 96
Kobolds Tower 96 112 128 112 128 96 96 128

Main Shot Power Bonus

Level 0 Level 1 Level 2 Level 3
0 +2 +4 +6

Bomb Count Modifier

0 1 2 3 4 5 6 7+
+32 +24 +16 +8 0 -8 -16 -32

The relevant routines are at 7AD6 and 174D0. The routine at 7AD6 reads from a table stored at 718C2, which contains the base boost speed values for each character and stage. The routine at 174D0 applies the main shot power bonus and the bomb count modifier, using tables stored at 17568 (shot power bonus) and 175AE (bomb count modifier). This routine also seems to do some stuff related to subweapons (probably damage calculations?) and there's a big table of subweapon-related values at 1756E.