View Page Source

Back to Page
Revision 17 (current)
Edited by Samsara on 8/7/2023 3:23 AM
!!! Rockman technical data

!! Introduction

This is technical data that has been analyzed from the Rockman game ROM
for the purpose of making Rockman tool-assisted speedruns as precise as possible.

The [http://bisqwit.iki.fi/jutut/megamansource/|disassembly] of the game
has been an invaluable help in discovering these.

All numbers on this page are ''hexadecimal'' unless otherwise mentioned.

%%TOC%%

!! Coordinate system

In Rockman and Rockman 2, every object of the game has the following properties:
* Screen number (00―FF), it tells which screen the object resides in.
* X position (00.00―FF.FF), it tells where in the screen the object is in.
* Y position (00.00―FF.FF), it tells where in the screen the object is in.
* X speed (−80.00―7F.FF).
* Y speed (−80.00―7F.FF).

The position of the object has 8 bits of decimal part,
but only the integer part can be observed on the screen.

* Y coordinates increase towards the bottom of the screen
* X coordinates increase towards the right
* Negative Y speed means falling, positive Y speed means ascending
* X speed is always positive. It is subtracted or added depending on Rockman’s facing.

!! Vertical motion

! Jump curve

* In Rockman 1 and 2, when Rockman jumps, his Y speed is set to 04.DF.
* In Rockman 3, when Rockman jumps, his Y speed is set to 04.A5.
* In Rockman 4, when Rockman jumps, his Y speed is set to 04.C0.
* Every frame, 00.40 is subtracted from his Y speed (0.25 in decimal).
* In Rockman 1 and 2, if the Y speed grows smaller than −0C.00 (−12 in decimal), it is set to −0C.00.
* In Rockman 3 and 4, if the Y speed grows smaller than −07.00, it is set to −07.00.
* In Rockman 1 and 2, if the Y speed is larger than 02.1F and the player is not holding the A button, the speed is immediately set to 01.00.
* In Rockman 3 if [[rules unknown and] the player is not holding the A button, the speed is immediately set to −00.80.
* In Rockman 4 if [[rules unknown and] the player is not holding the A button, the speed is immediately set to −00.00.

! Walking on lifts / magnet beam

During walking on a magnet beam or a lift, Rockman’s Y speed grows
continuously as if he was falling. However the lift/beam forces
his Y position (actually, only the integer part of it) to be stable.

This effect happens in Rockman, but not in Rockman 2.
* In Rockman 2, Item 1 forces Rockman’s Y speed to be 01.00.
* In Rockman 3, RC makes Rockman’s Y speed first 06.AE, then the rest is decided by gravity.

! Walking on solid ground

Every frame when Rockman bumps into an platform either from top or below
(magnet beams and lifts don’t count), Rockman’s Y speed is set into a constant.
* Rockman 1: −00.C0.
* Rockman 2: −00.40.

Top collision checked only when moving upwards, bottom collision
checked only when moving downwards.

If he has an obstacle below him, his Y position is adjusted accordingly.

! Magical Y coordinates

* Y coordinate F8 (−08) means a dead object.
* When Rockman jumps, the game prevents the coordinate from decreasing below −04 (FC). (Only true in Rockman 1.)
** However it is possible to land on a beam that forces the coordinate to be −05. This is the highest possible coordinate where Rockman can be.
* To zip through ceiling at screen top, Y speed must be −08.C0 or faster. (Smaller speed leads to death on attempt to zip.)
* To survive the spikes in Bombman stage when performing [user:finalfighter]’s {{r1bombsuper.mpg}} trick, Y speed must be −01.C0 or faster before scrolling.

! Climbing

* In Rockman 1 and 2, Rockman climbs at speed of 00.C0.
* In Rockman 3, Rockman climbs at speed of 01.4C.

! Transforming

* In Rockman 1, Rockman’s Y speed and position are accumulated even during transforming. (Which allows him to pass through enemies without hurting himself.)
* In Rockman 2, Y speed is reset when pausing. During transforming, enemies move. (Which allows them to pass through Rockman without hurting him.)
* In Rockman 3, transformation is an extension to pause. Game continues after transformation from the same situation that was before pause.
* Since Rockman 4, Rockman no longer transforms after pause/weapon switch.

!! Horizontal motion

! Jumping

* In Rockman 1 and 2, during jumping/falling into some direction, Rockman’s X speed is 01.50.
* In Rockman 3 and 4, during jumping/falling, Rockman’s X speed is the same as when walking.
* If the player stops pressing the directional button, the speed falls immediately into 00.00.
* In Rockman 1, if Rockman starts moving after not moving, his X speed first goes to 00.20, then back to 01.50.
* In Rockman 2, if Rockman starts moving after not moving, his X speed goes immediately back to 01.50.

! Walking

__Walking speed__
* In Rockman 1 and 2, during walking, Rockman’s X speed is 01.60.
* In Rockman 3 and 4, during walking, Rockman’s X speed is 01.4C.

__Sliding speed__
* In Rockman 3 and 4, during sliding, Rockman’s X speed is 02.80.

__Acceleration__
* In Rockman 1, when Rockman accelerates from non-full speed (full halt or deacceleration), his X speed is 00.20 for 9 frames before gaining full speed.
* In Rockman 2, when Rockman accelerates from non-full speed (full halt or deacceleration, item-throwing halt excluded), his X speed is 00.20 for 7 frames before gaining full speed.
* In Rockman 3, when Rockman accelerates from non-full speed, he walks normally the first frame (as far as speed is concerned), then is completely in stall for 8 frames, after which he has the full speed again.

__Deceleration__
* In Rockman 1, when Rockman decelerates from full speed (not from acceleration), his X speed is 00.80 for 13 (decimal) frames before halting completely.
* In Rockman 2, when Rockman decelerates from full speed (not from acceleration), his X speed is 00.80 for 8 (decimal) frames before halting completely.
* In Rockman 3, when Rockman decelerates from full speed (not from acceleration), he moves normally for 1 frame, after which he halts immediately (though the sprite indicates deceleration for 8 frames).

!! Magnet beams (Rockman 1)

There may be at maximum 5 magnet beams simultaneously active.

Every magnet beam has the following properties:
* Screen number where the ''center'' of the beam is anchored in
* X position within that screen (00―FF)
* Y position within that screen (00―FF)
* Length (00―41)
* Life (00―9C)
* Cycle position (00―10) 

! Lifecycle

__Beams die when__
* Their Life is 00
* A boss battle starts
* A stage is loaded (death for example)

__Beams don’t die when__
* Screen scrolls

__When a new magnet beam is created:__
* Length=1
* Cycle=0
* Life=9C

__As long as B button is held:__
* Life does not decrease
* Length increases by 1 every frame, unless it is already 41
* Beam center position is readjusted, see below
* If the beam far end is inside a wall, the beam is released (as if B button was no longer held)

__When B button is no longer held:__
* Life decreases by 1 every frame, unless it is already 00
* If Life is 0, the beam is forgotten

__Every frame when the beam exists:__
* Cycle position is increased by 1
* If (Cycle_position×8) == (Length×2), Cycle position is reset to 0

! Beam center position

Note: All numbers in this section are decimal, not hexadecimal.

As long as the player holds B, the beam center is adjusted according to Rockman’s position.
* Beam Y position is set to Rockman’s Y position
* A temporary variable is calculated:
** Temp = (Beam_length_before_growth × 2 + 16)
** If(Temp & 7)==0, then Temp = Temp+8
* If Rockman looks to the right, then Beam X position = Rockman’s X position + Temp
* If Rockman looks to the left, then Beam X position = Rockman’s X position − Temp

For lengths 1-65, the X position of the beam is therefore adjusted in the following ways:
  1:+24[[1]M>32  17:+56[[5]M>96    33:+88[[9]M>160   49:+120[[13]M>224 65:+152[[17]M>288  
  2:+18[[1]>26   18:+50[[5]>90     34:+82[[9]>154    50:+114[[13]>218  65:+146[[17]>282   
  3:+20[[1]>28   19:+52[[5]>92     35:+84[[9]>156    51:+116[[13]>220  
  4:+22[[2]m>38  20:+54[[6]m>102   36:+86[[10]m>166  52:+118[[14]m>230 
  5:+24[[2]>40   21:+56[[6]>104    37:+88[[10]>168   53:+120[[14]>232  
  6:+26[[2]>42   22:+58[[6]>106    38:+90[[10]>170   54:+122[[14]>234  
  7:+28[[2]>44   23:+60[[6]>108    39:+92[[10]>172   55:+124[[14]>236  
 ''''
  8:+30[[3]m>54  24:+62[[7]m>118   40:+94[[11]m>182  56:+126[[15]m>246 
  9:+40[[3]M>64  25:+72[[7]M>128   41:+104[[11]M>192 57:+136[[15]M>256 
 10:+34[[3]>58   26:+66[[7]>122    42:+98[[11]>186   58:+130[[15]>250  
 11:+36[[3]>60   27:+68[[7]>124    43:+100[[11]>188  59:+132[[15]>252  
 12:+38[[4]m>70  28:+70[[8]m>134   44:+102[[12]m>198 60:+134[[16]m>262 
 13:+40[[4]>72   29:+72[[8]>136    45:+104[[12]>200  61:+136[[16]>264  
 14:+42[[4]>74   30:+74[[8]>138    46:+106[[12]>202  62:+138[[16]>266  
 15:+44[[4]>76   31:+76[[8]>140    47:+108[[12]>204  63:+140[[16]>268  
 16:+46[[5]m>86  32:+78[[9]m>150   48:+110[[13]m>214 64:+142[[17]m>278 


Note: The second “65” is when the beam no longer grows. The number in [[brackets]] is the beam length in units.
* Add 1 and multiply by 16 to get the carrying width of the beam.
** 32 at minimum, 272 at maximum.
** The game actually uses half of this value (range for each side from the center of the beam), so it does not overflow even when ≥ 256.

* m = nearest distance of beam for each length (important when operating on next screen (different than displayed))
* M = biggest distance of beam (often the optimal choice for zipping)
* >number = location of the far end of the beam

!! Randomness

See the [GameResources/NES/Rockman#Rockman1|main article].

!! Memory addresses

Read from the [http://bisqwit.iki.fi/jutut/megamansource/|disassembly].

|| Game    || Screen# || X (hi,lo) || Xspd (hi,lo) || Y (hi,lo) || Yspd (hi,lo)
| Rockman 1 | $460     | $480:$4A0  | $4C0:$4E0     | $600:$620  | $660:$680
| Rockman 2 | $440     | $460:$480  | $600:$620     | $4A0:$4C0  | $640:$660
| Rockman 3 | $380     | $360:$340  | no RAM address? | $3C0:$3A0  | $460:$440
| Rockman 4 | $348     | $330:$318  | no RAM address? | $378:$360  | $3F0:$3D8
| Rockman 5 | | | | |
| Rockman 6 | | | | |
The variables for object #{{n}} can be found by adding {{n}} to each address.%%%
Boss has {{n}}=1 in RM1/2, Rockman always has {{n}}=0.

 

* [GameResources/NES/Rockman|Rockman Tricks]