Active player, Editor, Experienced Forum User (295)
Joined: 3/8/2004
Posts: 7468
Location: Arzareth
Thanks. With more action than before, this movie certainly looks interesting. And the lack of extra thrusters brings up the challenge more to the level I usually observe when I play it myself.
Active player, Editor, Experienced Forum User (295)
Joined: 3/8/2004
Posts: 7468
Location: Arzareth
New WIP please!
Experienced Forum User, Player (66)
Joined: 3/11/2004
Posts: 1058
Location: Reykjaví­k, Ísland
Unfortunately, I have not made any real progress on this at all since the last WIP, because of lack of time/motivation. I also feel like the part with the spinning orange crystal is lacking in optimization. :( I have not abandoned this completely, but if someone else who is more productive wants to give it a try, please do so.
Experienced Forum User
Joined: 1/13/2006
Posts: 109
I was going to post the level 1 warp here, but it looks like you're already on it. In real time, I simply reach the area as fast as possible, and the warp is there. I don't know why it's not always there for you. Anyhow, anybody plan on finishing the improvement, so it can be posted? BTW, is there any way to ram the boulder that leads to the warp, and will anything special happen if you do, or will it just shatter and reveal the warp as usual?
Life is like a box of chocolates-when you want peanut butter, all you get is coconut.
Experienced Forum User
Joined: 11/9/2008
Posts: 108
Location: New Orleans, LA U.S.A.
i know it has been mentioned, with a (not) surprising lack of interest, but since the thread has jumped up i might as well test the waters one more time. if anybody did want to try a 100% run they would have to realize that it would almost certainly not be published, but that you would make SJ fools like Fihlvein and I reeeally happy :D:D:D kind of like a charity run i bet bisqwit would watch it.. EDIT: oh yea no warps a must
__--N0ISE
Experienced Forum User, Player (97)
Joined: 7/16/2005
Posts: 34
With the crystal spinning trick you've got now two possible routes that might be best, and it's not totally clear to me which one wins. One is 1 -> 7 + spinning -> Nippon Pod -> 8 -> 13 -> 12, that is, BluBlu's route in his WIP and definitely the shortest in terms of levels. The other is 1 -> 2 + spinning 2 crystals and treasure -> Italian Pod -> 3 -> 7 -> 8 -> 13 -> 12. The latter would lose probably 4 or 5 minutes to get through all of level 2 and the warp to 7. On the other hand you'd have the freaking Italian pod for levels 7, 13, and 12! Especially in 12 you could save massive time with it. You could also grab thrusters. Whether this is enough to make up for the delay in getting the money and equipment, I don't know. BluBlu's might still be somewhat faster. What I do know is that the latter route would definitely be the optimal start for a 100% run, so if someone wanted to just test both possibilities and see which turns out faster, the effort of doing the level 2 stuff could be reused in a 100% run someday. I might get around to this sometime, but sadly it's not that likely.
Experienced Forum User
Joined: 1/13/2006
Posts: 109
Would it be time-saving to do the bonus stage on Planet 1? Also, does anybody have copies of the game's maps, either the real ones or the mapping device ones? I'd live to review them for the areas you can fly through the rocks, though I don't know if such a glitch would be feasible to set up, especially since going to the ship parts isn't possible until the mothership is full of fuel.
Life is like a box of chocolates-when you want peanut butter, all you get is coconut.
Experienced Forum User
Joined: 11/9/2008
Posts: 108
Location: New Orleans, LA U.S.A.
well i have nothing to offer, but if someone did do a 100% run or at least a run that shows off a bit of the potential for power ups..... i was never good enough at this game to get any cool stuff, this would be in my top 100% runs definately, probably mainly because of the game's nostalgia value for me.. anyways.., please?
__--N0ISE
Experienced Forum User
Joined: 1/13/2006
Posts: 109
Now are we talking all planets beat (except 13), or, do we mean grabbing every single treasure there is, beating every bonus stage there is, etc? If the secodn option, this game would take a very long time, but it would still be fun to watch by us fans. Back when I played it, I always grabbed everything there was (even grabbing extra fuel, just because it was there). And it would also give a chance to show off the little lives/jetpod appearance glitch. I would also love to see a more "active" run through the final stage, with the ship wildly dodging a meteor mess. One thing I always wondered story-wise...why does the guy want that golden warpship? Sure, it looks nice, but a simple jetpod is far more durable (Dying because I TOUCHED a rock!? I mean, come on...).
Life is like a box of chocolates-when you want peanut butter, all you get is coconut.
Experienced Forum User
Joined: 11/9/2008
Posts: 108
Location: New Orleans, LA U.S.A.
Now are we talking all planets beat (except 13), or, do we mean grabbing every single treasure there is, beating every bonus stage there is, etc?
honestly if just all planets are completed I think it would be fine. As you mentioned, us die hard jetman fans would watch either or probably both; I think any kind of run that is substantial enough to show off some items I have never come close to obtaining myself would be a valuable and worthwhile endeavor. There seemed to be some interest in a more complete run, especially before the 1 to 7 warp was discovered........ by the way, anybody know of a compiled run that doesn't use said warp early on and plays more of the game? I would kill to see one, but i can't read the emu files referenced in the beginning of the thread. thanks
__--N0ISE
Experienced Forum User
Joined: 1/22/2008
Posts: 319
Location: Brasil
cand ownload here too Forbidden You do not have permission to access this page or file Data files must be stored on the same site they are linked from.
Run..Run...Run.....
Experienced Forum User
Joined: 11/9/2008
Posts: 108
Location: New Orleans, LA U.S.A.
wicked wrote:
cand ownload here too Forbidden You do not have permission to access this page or file Data files must be stored on the same site they are linked from.
j/k ?
__--N0ISE
Experienced Forum User
Joined: 1/22/2008
Posts: 319
Location: Brasil
forget it i was trying to download the firt atemp by Animadverto http://liquidperspective.20m.com/solarjetmanTA.fmv
Run..Run...Run.....
Experienced Forum User
Joined: 11/9/2008
Posts: 108
Location: New Orleans, LA U.S.A.
so i'm sure this is a pain and i'm buggin the hell out of all of you experienced TASers, but if anybody has some time to kill and wants to compile one of these more extensive runs for me, I would appreciate it. thanks
__--N0ISE
Active player, Editor, Experienced Forum User (295)
Joined: 3/8/2004
Posts: 7468
Location: Arzareth
wicked wrote:
forget it, i was trying to download the firt atemp by Animadverto http://liquidperspective.20m.com/solarjetmanTA.fmv
Oh, that's the movie from 2004. 6 years ago. Two years older than the currently published movie.
Experienced Forum User
Joined: 1/13/2006
Posts: 109
The current published movie is nice. Don't forget to watch the obsolete. I also find it interesting, and I love watching how the improvement was done. It's sad that the current WIP is going to be an FM2 video though. While I understand that FCEUX has advantages, the file sizes of the videos still are horrendous. Would there be any way that these latest videos being produced could still be FCMs, or does the FCEUX's advantages simply mandate the upgrade?
Life is like a box of chocolates-when you want peanut butter, all you get is coconut.
Experienced Forum User, Experienced player (821)
Joined: 11/18/2006
Posts: 2426
Location: Back where I belong
kolechovski wrote:
While I understand that FCEUX has advantages, the file sizes of the videos still are horrendous. Would there be any way that these latest videos being produced could still be FCMs, or does the FCEUX's advantages simply mandate the upgrade?
10 years ago the file size would be horrendous, nowadays they're a drop in the bucket. And they compress down to a small fraction of the space, so that's always an option.
Living Well Is The Best Revenge My Personal Page
Post subject: Thread revival post. A post that revives threads, of course!
Editor, Experienced Forum User, Skilled player (1157)
Joined: 9/27/2008
Posts: 1084
I've distracted myself on this game for a bit. The resulting .fm2 I got the .fcm to sync on FCEUX -- Convert to .fm2, then insert four blank frames prior to the immediate reset. I was making my own run without the ability to see that .fcm for a while, until I realized how to make the darn thing sync. A nice surprise, then, that I found I beat Blublu's WIP by over 700 frames by the time I collect that second fuel unit. I've developed my own script for this game as well. It reveals locations of off-screen objects by drawing a single pixel with a specified scaling. Also, by holding down space, it blacks out the screen so that these pixels can be more easily seen. Regardless, it reports an object that exists right above the second fuel unit in world 7. I've flown through this invisible object and shot it, and also waited around it for a while, and didn't get it to react. I have not done any digging into memory to see what makes this mystery object work. It's invisible, and resides in the empty space somewhere above the second fuel unit. Anyway, my current script as is: Download SJ.lua
Language: lua

local R1u, R1s= memory.readbyte, memory.readbytesigned --***************************************************************************** local function R2u(a) return R1u(a) + R1u(a+1)*256 end local function R2s(a) return R1u(a) + R1s(a+1)*256 end --***************************************************************************** local lastkeys, keys= input.get(), input.get() --***************************************************************************** local function UpdateKeys() lastkeys= keys; keys= input.get() end --***************************************************************************** local function Limits(V,l,h) return math.max(math.min(V,h),l) end --***************************************************************************** --***************************************************************************** local Draw= {} --***************************************************************************** --Coordinates is the top-left pixel of the 3x5 digit. --Used for drawing compact, colored numbers. local Px,Li= gui.pixel, gui.line Draw[0]= function(x,y,c) -- ### Li(x ,y ,x ,y+4,c)-- # # Li(x+2,y ,x+2,y+4,c)-- # # Px(x+1,y ,c) -- # # Px(x+1,y+4,c) -- ### end Draw[1]= function(x,y,c) -- # Li(x ,y+4,x+2,y+4,c)-- ## Li(x+1,y ,x+1,y+3,c)-- # Px(x ,y+1,c) -- # end -- ### Draw[2]= function(x,y,c) -- ### Li(x ,y ,x+2,y ,c)-- # Li(x ,y+3,x+2,y+1,c)-- ### Li(x ,y+4,x+2,y+4,c)-- # Px(x ,y+2,c) -- ### Px(x+2,y+2,c) end Draw[3]= function(x,y,c) -- ### Li(x ,y ,x+1,y ,c)-- # Li(x ,y+2,x+1,y+2,c)-- ### Li(x ,y+4,x+1,y+4,c)-- # Li(x+2,y ,x+2,y+4,c)-- ### end Draw[4]= function(x,y,c) -- # # Li(x ,y ,x ,y+2,c)-- # # Li(x+2,y ,x+2,y+4,c)-- ### Px(x+1,y+2,c) -- # end -- # Draw[5]= function(x,y,c) -- ### Li(x ,y ,x+2,y ,c)-- # Li(x ,y+1,x+2,y+3,c)-- ### Li(x ,y+4,x+2,y+4,c)-- # Px(x ,y+2,c) -- ### Px(x+2,y+2,c) end Draw[6]= function(x,y,c) -- ### Li(x ,y ,x+2,y ,c)-- # Li(x ,y+1,x ,y+4,c)-- ### Li(x+2,y+2,x+2,y+4,c)-- # # Px(x+1,y+2,c) -- ### Px(x+1,y+4,c) end -- ### Draw[7]= function(x,y,c) -- # Li(x ,y ,x+1,y ,c)-- ## Li(x+2,y ,x+1,y+4,c)-- # end -- # Draw[8]= function(x,y,c) -- ### Li(x ,y ,x ,y+4,c)-- # # Li(x+2,y ,x+2,y+4,c)-- ### Px(x+1,y ,c) -- # # Px(x+1,y+2,c) -- ### Px(x+1,y+4,c) end Draw[9]= function(x,y,c) -- ### Li(x ,y ,x ,y+2,c)-- # # Li(x+2,y ,x+2,y+3,c)-- ### Li(x ,y+4,x+2,y+4,c)-- # Px(x+1,y ,c) -- ### Px(x+1,y+2,c) end Draw[10]=function(x,y,c) -- # Li(x ,y+1,x ,y+4,c)-- # # Li(x+2,y+1,x+2,y+4,c)-- # # Px(x+1,y ,c) -- ### Px(x+1,y+3,c) -- # # end Draw[11]=function(x,y,c) -- ## Li(x ,y ,x ,y+4,c)-- # # Li(x+1,y ,x+2,y+1,c)-- ## Li(x+1,y+4,x+2,y+3,c)-- # # Px(x+1,y+2,c) -- ## end Draw[12]=function(x,y,c) -- # Li(x ,y+1,x ,y+3,c)-- # # Li(x+1,y ,x+2,y+1,c)-- # Li(x+1,y+4,x+2,y+3,c)-- # # end -- # Draw[13]=function(x,y,c) -- ## Li(x ,y ,x ,y+4,c)-- # # Li(x+2,y+1,x+2,y+3,c)-- # # Px(x+1,y ,c) -- # # Px(x+1,y+4,c) -- ## end Draw[14]=function(x,y,c) -- ### Li(x ,y ,x ,y+4,c)-- # Li(x+1,y ,x+2,y ,c)-- ## Li(x+1,y+4,x+2,y+4,c)-- # Px(x+1,y+2,c) -- ### end Draw[15]=function(x,y,c) -- ### Li(x ,y ,x ,y+4,c)-- # Li(x+1,y ,x+2,y ,c)-- ## Px(x+1,y+2,c) -- # end -- # --***************************************************************************** local function __DN_AnyBase(right, y, Number, c, bkgnd, div) --***************************************************************************** -- Works with any base from 2 to 16. Paints the input number. -- Returns the x position where it would paint another digit. -- It only works with integers. Rounds fractions toward zero. if div < 2 then return end -- Prevents the function from never returning. local Digit= {} local Negative= false if Number < 0 then Number= -Number Negative= true end Number= math.floor(Number) c= c or "white" bkgnd= bkgnd or "clear" local i= 0 if Number < 1 then Digit[1]= 0 i= 1 end while (Number >= 1) do i= i+1 Digit[i]= Number % div Number= math.floor(Number/div) end if Negative then i= i+1 end local x= right - i*4 gui.box(x+1, y-1, right+1, y+5,bkgnd,bkgnd) i= 1 while Draw[Digit[i]] do Draw[Digit[i]](right-2,y,c) right= right-4 i=i+1 end if Negative then gui.line(right, y+2,right-2,y+2,c) right= right-4 end return right end --***************************************************************************** local function DrawNum(right, y, Number, c, bkgnd) --***************************************************************************** -- Paints the input number as right-aligned. Decimal version. return __DN_AnyBase(right, y, Number, c, bkgnd, 10) end --***************************************************************************** local function DrawNumx(right, y, Number, c, bkgnd) --***************************************************************************** -- Paints the input number as right-aligned. Hexadecimal version. return __DN_AnyBase(right, y, Number, c, bkgnd, 16) end local OC= { [0]= "white", "white", "white", "green", "green", "green", "green", "green", "green", "green", "green", "blue", "blue", "blue", "blue", "red", "red", "red", "red", "red", "red", "red", "red", "yellow", "yellow", "yellow", "yellow", "yellow", "grey", "grey", "grey" } --***************************************************************************** local function ObjRadar(Factor) -- What factor to scale radar? --***************************************************************************** local CamX, CamY= R2u(0x004C), R2u(0x004E) local OffX= math.floor((1-1/Factor)*128) local OffY= math.floor((1-1/Factor)*100) local count= 0 for i= 0, 0x1E do if R1u(0x0317+i) ~= 0 then count= count+1 gui.pixel( math.floor((R1u(0x0200+i)+R1s(0x021F+i)*256-CamX)/Factor + OffX), math.floor((R1u(0x025D+i)+R1s(0x027C+i)*256-CamY)/Factor + OffY), OC[i] ) end end DrawNum(90,12,count) end --***************************************************************************** local function ObjCount() --***************************************************************************** local P, B, E, A, I, S= 0,0,0,0,0,0 for i= 0, 2 do if R1u(0x0317+i) ~= 0 then P= P+1 end end for i= 3, 10 do if R1u(0x0317+i) ~= 0 then B= B+1 end end for i= 11, 14 do if R1u(0x0317+i) ~= 0 then E= E+1 end end for i= 15, 22 do if R1u(0x0317+i) ~= 0 then A= A+1 end end for i= 23, 27 do if R1u(0x0317+i) ~= 0 then I= I+1 end end for i= 28, 30 do if R1u(0x0317+i) ~= 0 then S= S+1 end end gui.box(238,8,252,56,"black",0) Draw[P](240,10,"white"); Draw[3](248,10,"white") Draw[B](240,18,"white"); Draw[8](248,18,"white") Draw[E](240,26,"white"); Draw[4](248,26,"white") Draw[A](240,34,"white"); Draw[8](248,34,"white") Draw[I](240,42,"white"); Draw[5](248,42,"white") Draw[S](240,50,"white"); Draw[3](248,50,"white") end local DirX={ [0]= 0, 3, 6, 8, 11, 13, 14, 15, 16, 15, 14, 13, 11, 8, 6, 3, 0, -3, -6, -8,-11,-13,-14,-15, -16,-15,-14,-13,-11, -8, -6, -3 } local DirX2={ [0]= 0, 12, 24, 35, 45, 53, 59, 62, 64, 62, 59, 53, 45, 35, 24, 12, 0,-12,-24,-35,-45,-53,-59,-62, -64,-62,-59,-53,-45,-35,-24,-12 } --***************************************************************************** local function DirPow(v) --***************************************************************************** return DirX[v], DirX[(v+8)%32] end -- 0 1 2 3 4 5 6 7 8 -- 0 3 6 8 11 13 14 15 16 --***************************************************************************** local function Fn() --***************************************************************************** UpdateKeys() --BlackBox, to see the dot radar better. if keys.space then gui.box(-1,7,256,200,"black",0) end --BasicHUD DrawNum( 20,10,R2u(0x00C6),"white","black") -- Fuel DrawNum( 20,40,R1u(0x0374),"white","black") -- Direction DrawNum(230,10,R2u(0x004C),"white","black") -- Cam X DrawNum(230,30,R1u(0x0200) + R1u(0x021F)*256,"white","black") -- Player X DrawNum(230,40,R1u(0x025D) + R1u(0x027C)*256,"white","black") -- Player Y --X Velocity local N= 1 if R1u(0x0336) == 1 then N= -1 end DrawNum( 20,20,(R1u(0x029B)+R1u(0x02BA)*256)*N,"white","black") DrawNum( 40,20,DirX[R1u(0x0374)%32] ,"white","black") DrawNum( 54,20,DirX2[R1u(0x0374)%32],"white","black") --Y Velocity N= 1 if R1u(0x0355) == 1 then N= -1 end DrawNum( 20,30,(R1u(0x02D9)+R1u(0x02F8)*256)*N,"white","black") DrawNum( 40,30,DirX[(R1u(0x0374)+8)%32] ,"white","black") DrawNum( 54,30,DirX2[(R1u(0x0374)+8)%32],"white","black") ObjRadar(3) ObjCount() end gui.register(Fn) --***************************************************************************** local function DumpStats() --***************************************************************************** for obj= 0, 0x1E do local color= "white" if R1u(0x0200+obj+0x1F*9) == 0 then color= "grey" end for st= 0, 16 do DrawNumx(9+st*10, 9+obj*7, R1u(0x0200+obj+st*0x1F),color,"black") end end end --gui.register(DumpStats)
Experienced Forum User, Player (208)
Joined: 8/10/2008
Posts: 113
I've toyed around with the idea of a console speedrun of this game. To try out how hard this would be, I made real-time emulator movies of each level. When I came to the final boss, only 4 out of 5 eyes spawned. The eyes are kind of slow to kill, so this saves time both in a tas and a console speedrun. The movie: http://dehacked.2y.net/microstorage.php/info/311107433/12Solar%20Jetman%20-%20Hunt%20for%20the%20Golden%20Warpship%20%28E%29%20%5B%21%5D.fcm . It was recorded with fceu-0.98.15 with the (E) [!]-version of the game. Sorry for the old emulator, but the gameplay gets choppy on my computer if I use something else. I also apologize for the 13 minutes or so with not-so-hot gameplay (as mentioned, this was just a "feasibility study" and not intended to be optimized). Anyways, if anyone is interested in this game and decides to figure out what causes the despawning of the last boss' eyes, if it can be done consistently and if it's possible to despawn more eyes, I'd be very interested to know about it.
Experienced Forum User, Player (208)
Joined: 8/10/2008
Posts: 113
I've continued playing this game on console. Today, I finished the game in what at least looked kind of like a speedrun. I think the run itself is of limited interest for this site, so I won't link it here (it's on my youtube channel, which can be found through my profile if anyone is interested though). The reason I'm posting is that I've come across a few ideas that could be used in an improvement of the current tas and I figured it'd be worth documenting them: * I've managed to despawn one of the final boss's eyes a couple of more times and also got it recorded with a newer emu (fceux 2.1.4a, (E) [!]-rom): http://dehacked.2y.net/microstorage.php/info/1267680606/Solar%20Jetman%20-%20Hunt%20for%20the%20Golden%20Warpship%20%28E%29.fm2 The addresses 0461, 0C61, 1461 and 1C61 all change value from 94 to 0 at frame 640 and that's what triggers the despawning. The other eyes have neighboring addresses, but I've never managed to despawn any of them. Unfortunately, I lack enough knowledge in the deeper arts of tasing to pursue the task of understanding why the value changes. * There is a faster route through the level 12 labyrinth than in the current tas. It's kind of obvious by watching a map of the labyrinth, but if anyone is still wondering about it, I used the faster route in my console speedrun. * I'd like to suggest the use of star bullets instead of time bombs in a tas. Star bullets can take out all the required enemies in a game through 1-7-8-13-12. The advantage is that gravity balls can be shot from afar and thus preventing them to slow the ship down. * I've somehow managed to squeeze past the first huge enemy ship in level 7 while carrying the first fuel cell (on the left side) a few times. I don't have a recording of it, but it's definitely faster than shooting the enemy ship with the standard gun, which is the only other alternative. Needless to say, I'd be VERY interested in seeing progress on a new tas of this game (preferably both one with warps and one without warps).
Editor, Experienced Forum User, Skilled player (1157)
Joined: 9/27/2008
Posts: 1084
http://tasvideos.org/userfiles/info/8080525146486850 Warps route. I've distracted myself on this game again. I've managed to improve on my own warp by a few more frames, which is on display in the movie. What's also on display is my trouble at that first big enemy after picking up the first fuel cell. I can't seem to slip past it without the enemy's destruction. Makes me wonder if I'm doing something wrong or if it's region specific. Maybe I should hunt down the (E) version and see if it's easier there. In any case, for planet 1, Preludon, I figured out that ricocheting off that wall is slightly faster than my earlier direct approach. In fact, it was too fast horizontally -- I needed to avoid thrusting to full speed after the ricochet in order to begin thrusting upward sooner. The warp was reached pretty quickly, I believe. As for other tricks, apparently there's a spot near the top of the level in the sky where gravity changes. I sit in a spot where it's minimal to save on fuel, though most likely trivial amounts. Rapidly disconnecting and reconnecting the tether to the fuel cell (rapid-fire down) causes its weight to be ignored completely, as well as pulling the object closer to your ship. Understandably, thrust works better when weight isn't being noticed by the game. The pull has limits on how fast you can go, but you've likely built up the momentum to tether the object normally without being so sluggish. I still have no clue how to get past that enemy without shooting it, though.
Editor, Experienced Forum User, Skilled player (1157)
Joined: 9/27/2008
Posts: 1084
I've been taking a look at the RNG of this game. Nothing major, yet, but I have a few suspicious addresses: 005A - Apparently incremented by controller stuff 005B - "Upper half" of the RNG(?). Bits are left-shifted once per frame 005C - "Lower half" of the RNG(?). Bits left-shifted out of this are shifted into 005B The RNG controls a variety of enemy actions and spawning. Of which, I have not analyzed. So I have very little to give here. However, button presses do affect the RNG. The game is directly reading from the controller to change the RNG in some fashion. As if this wasn't enough, it'll also read from player 2, who serves no other purpose whatsoever. In short, I have a full manipulation controller independent of all activities with the game, should I choose to use P2. I suppose it's time we figure out how to spawn enemies like crazy... As for that barrier at the enemy I'm stopped by, my plans involve spawning seemingly-infinite enemies to see if it stops the barrier. As my prior attempts, slipping through cracks both through the left and the right, have ended in failure, I'm hoping that spawn-crazy gets around the problem. But first, the RNG needs further analysis before that happens.
AnS
Emulator Coder, Experienced Forum User, Experienced player (722)
Joined: 2/23/2006
Posts: 682
FatRatKnight wrote:
However, button presses do affect the RNG. The game is directly reading from the controller to change the RNG in some fashion. As if this wasn't enough, it'll also read from player 2, who serves no other purpose whatsoever. In short, I have a full manipulation controller independent of all activities with the game, should I choose to use P2.
Whoa, now this is luck!
Editor, Experienced Forum User, Skilled player (1157)
Joined: 9/27/2008
Posts: 1084
I took a look at the disassembly of the game, trying to figure out what makes the RNG tick.
Language: asm6502

;Function $00:920A LDA $005A AND #$48 ; Get XOR of bits $40 and $08 from address $005A ADC #$38 ASL ASL ; Now it's in our carry bit. ROL $005C ; And shifted into the big-endian RNG bytes at $005B and $005C ROL $005B ; Upper bit that's shifted out is thrown away INC $005A ; +$01 LDA $005A ; Many things are added to $005A... ADC $0018 ; P1 immediate - Mirror of controller state ADC $0019 ; P1 pressed - Bits are set if pressed now, but not held before ADC $001A ; P2 immediate ADC $001B ; P2 pressed ADC $005D ; Frame timer low-byte ADC $005E ; Frame timer high-byte ADC $005F ; ? Unknown. Looks to be always zero so far... ADC $0060 ; ? Unknown. Looks identical to $005D MOD 8 ADC #$0D ; +$0D STA $005A RTS
There is a two-byte shifter at address 0x005B that merely shifts its bits to the left. It is big-endian in its shifts, for whatever reason. The upper bit that gets shifted out looks to be thrown away, as the following INC instruction messes with the carry bit (unless I missed some detail in 6502 assembly in an embarrassing manner). The low bit that gets shifted in is an XOR of 0x005A bits 0x48. If 0x40 and 0x08 are different (01 or 10), we shift in a 1; If the same (11 or 00), we shift in a 0. Seeing as it doesn't feed back into the RNG, I must assume its used elsewhere, such as spawning position of enemies or something. As for what feeds 0x005A, it looks to be a sum of controller data and timers, plus an extra 14. The carry bit is always added in every time, with a constant added in the end, so the effective period of 0x005A is 255, not 256. Can't get 255 with carry set, and can't get 0 with carry clear, so with the constant added, we'll never get a result of 13 sitting in 0x005A. Controller data includes what's being held at the moment and whether or not you just now pressed it and not have done so before this frame. Updates to the controller addresses are, of course, skipped during lag frames. The game intentionally inserts a lag frame following every normal frame for speed consistency, so half the frames come up lag according to FCEUX. Even so, every frame, both normal and lag, uses the controller data for RNG purposes, and since I only have control every other frame, this slightly reduces my RNG-controlling abilities. As for other addresses of note, 0x005D is a two-byte little-endian frame timer that resets to zero whenever a new area is loaded. 0x005F looks to be always zero so far. 0x0060 is a frame timer that simply runs from 0 to 7 then resets to zero. All these timers run every frame, both normal and lag. It looks like most of these have a variety of purposes to the game in some fashion. I'll have to figure out the timer, since I've spotted in one spawning routine, that it looks for a very particular time before letting it spawn. In any case, with P2, I should be able to control the RNG very nicely, as it's simply added in along with all the other stuff, giving access to a wide range of possible values for address 0x005A. Other, less-RNG-related things that come to mind: The X and Y axis of your ship's speed are limited independent of one another. In other words, it's a rectangular restriction rather than a circular one. You can max out your speed (3.0 pixels/frame) in one axis before dealing with the other axis, and this will not slow you down one bit. This is the reason why I point exactly to the right at the start of planet 7 for a bit before facing straight up to maintain height. While your thrusters and the gravity are limited in how fast you can move, the game forgets to apply this limitation when a tethered object drags you along. This means your X-speed can exceed 3.0 pixels/frame for an extended period as long as you do not thrust with any force to the left or right. You can thrust straight up or straight down without losing the boosted speed. Motion downward or upward often has gravity often getting in the way, so except for tiny fractions of 1/256, a boosted Y-speed isn't happening when gravity is affecting you. In other news, I haven't yet put the effort into bypassing that big enemy. So it's still a wall to me. But I have been spending time optimizing the route through the start of planet 7, and get myself walled by that same enemy several frames earlier as well as picking up a little extra cash from shooting stuff. So at least I'm richer by the time I get stuck.
Experienced Forum User, Player (208)
Joined: 8/10/2008
Posts: 113
Great to see someone working on this again. I saw you had trouble bypassing the big enemy on planet 7. I just tried it out and managed to get it after a few tries. I have it recorded (on the U-version). Unfortunately, I don't remember how to upload movies here anymore... If you're still interested, let me know where I can put the fm2-file.