(Link to video)
Submission Text Full Submission Page
WARNING: Obnoxious tape loading noises until 2:29 in the encode.
ENCODING INSTRUCTIONS: This is my first ever submission using BizHawk, which means that this is a lot simpler than every other video I've submitted so far.
  • Rom File: You need the file "Jet Pac (1983)(Ultimate Play The Game)(16K).tzx", following the TOSEC naming convention and matching the following SHA-1 hash:
    • SHA-1: 4EC1BAC1C1AF18DED30D7DB864928BC337F69BED
ABOUT GAME: Jet Pac (also released as and more commonly known as Jetpac, so feel free to add that as an alt name to the game database) is a 1983 arcade platformer game released for the ZX Spectrum by Ultimate Play The Game, the company that would later become Rare. This game is notable for many reasons; it is one of the finest games for the ZX Spectrum platform, even more remarkable when you consider that it is one of the few such near-exclusives for the platform (only receiving contemporary ports to the Commodore VIC-20 and BBC Micro), being targeted at the potato-tier 16k Spectrum model as opposed to the more popular 48k version, and for being the very first game released by the company at all, coming out of the gate with a smash hit. It is also famous for its appearance as a minigame in Donkey Kong 64, being mandatory for acquiring the Rareware coin and completing the game.
NOTES/GAMEPLAY: When I decided to make this recording based off the game's appearance in the ZX Spectrum wishlist, I was hoping to skip the minutes-long, ear-splitting tape loading sequence by taking advantage of the game's status as one of the few released as a ROM cartridge for the Spectrum Interface 2. However, as I soon learned, ZX Spectrum ROM file dumping conventions are inherently incompatible with TASing guidelines. ROM don't take the form of a dedicated ROM file with a header, but rather as a generic dump of system memory. While this is technically a correct way to go about things, as the Interface 2 merely breaks out the Spectrum's system bus and allows a ROM cartridge to map directly to memory, it means that these .Z80 dumps are identical to a form of emulator savestate, making it not a form of PowerOn. This is worsened by the fact that 99% of .Z80 files are not actual legitimate Spectrum 2 cartridges, of which there were only 10, but working memory dumps of loaded casette games for the convenience of emulator users. Thus, tape version it is.
In the game, you play as Jetman, tasked with building and fueling your rocket in order to explore alien worlds, defending yourself against ambiguous local beings that would fit right in in VVVVVV and collecting various treasures for extra points along the way. The game has 16 unique cycles divided into 4 stages, with the game increasing in difficulty until looping back to the first cycle. For each 4 cycles, you are first tasked with acquiring and dropping 2 rocket parts (with fixed spawn locations) onto your rocket to build it, then fueling it by dropping 5 fuel items to fuel it and liftoff. For the last 3 stages you don't have to rebuild your rocket, just refuel it, and each stage of 4 cycles has a visually unique rocket. Additionally, different enemies appear in each cycle, all with different movement patterns.
If you have a rocket part or fuel tank in hand, then hovering above the rocket will automatically drop it, letting it fall onto the rocket; however, this is extremely slow, so the primary speedrunning strategy is to instead bring the part down to the ground ourselves, using RNG manipulation to try and ensure favorable fuel spawn locations. Walking is much slower than flying with the Jetpac, so we spend the entire game flying, taking advantage of the hover control to maintain a stable altitude when needed. We also avoid using the laser unless absolutely necessary, as it impacts our flight, isn't instant, and in most cases will fail to fire when we try to use it too close to an enemy. While the screen does wrap, enemies spawn at the edges of the screen, and inconvenient enemy spawns mean I am often forced to avoid using the screen wrapping to move and instead stay inside the screen borders. The branch name comes from the RTA speedrunning convention, where the category is named after the number of rockets that the player fuels and launches, with the options being 1 Rocket, 4 Rocket, and 16 Rocket. This recording beats the RTA world record by 4 minutes, and even more when subtracting the tape loading time.
POTENTIAL IMPROVEMENTS: The only potential improvements in the run arise from further micro-optimized movement, shaving off individual frames, and better RNG rolls, being totally indeterminate. Fuel spawns are HIGHLY pseudorandom, with their drop location and time to drop being based off player inputs, but it is EXTREMELY difficult to make cooperate and reads your inputs up to the very last frame before spawning, meaning that you can't just move to try and anticipate a future drop (it will just appear somewhere else). The rerecord count is also HIGHLY deceptive and incorrect, as I spent much more time navigating the movie by seeking using the TASStudio Piano Roll than by loading specific branches. In terms of trivial timesave or fixable mistakes nothing exists, and I thus believe that this recording fulfills the optimization threshold.

nymx: Claiming for judging.
nymx: I'm making the decision to delay this for the author. RNG is not a quick and easy task in this game.
nymx: I've had a hard time, knowing how to handle this situation, but I've come to a conclusion that I think will be accepted across the board.
First off, welcome Technoturnovers. I see that you are very ambitious and enjoying the world of TASing. It's good to see that our community interests you enough to want to participate.
In regards to your submission, my first review revealed some things that I had questions about. If it hadn't been for the discussion thread responses, things would different today. For one, a number of people have supported your work and declared it to be well optimized. Coming from DigitalDuck, who I highly respect and does great work on the ZX Spectrum, I figured that the run was good to go; however, EZGames69 came on the scene...having done previous work that demonstrates the concerns that I had. Even though it was a demo of the first stage...it shows how the control of RNG was precise enough to zip through that round, cutting seconds off. After having a discussion with EZGames69, I got the impression that RNG is quite difficult to change and could be easily forgiven. From my perspective, I have seen that some games are just hard to deal with....and that's just the way it is. For "Jet Pac", it seems that this is quite the monster to overcome. I have personally discovered the dedication it takes to alter a game into being as fast as possible. On particular situation is my very own #7362: nymx's SNES F-Zero in 39:30.36 submission. In this case, it was the combined effort of almost 5 years, eventually requiring a BOT to handle the arduous process. Another case, is sniq's #6381: Sniq's SNES Super Metroid "100%" in 1:01:47.03 submission...where I personally witnessed the creation of this run over multiple years, having a re-record count of 700K+ of manual work.
Some games are just easier to deal with, while others...you just have to dig to figure it out. For this submission, my judgement comes down to one of our rules "Must beat all known times", which has been shown by EZgames69 work. Now I know that he only had two stages solved, but the pattern of optimization is clear...which I am not seeing in this submission. I really wanted this submission to succeed, which is why a few of us were providing you the opportunity and game details to do so. Its a great choice, but we have to consider the optimization. The other concept that I'm measuring this against, is the stress that our publishers are going through. Knowing that it can be improved, i would be doing our staff an injustice by adding more work to their load. Even though EZGames69 may have stopped for now, it is likely to be taken up again soon.
I don't want to be discouraging, but in this case I'm rejecting this submission...based on optimization issues brought up by the community and my own review.

TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 14888
Location: 127.0.0.1
This topic is for the purpose of discussing #8630: Technoturnovers's ZXS Jet Pac "16 Rocket" in 12:58.57
Active player (291)
Joined: 12/20/2022
Posts: 32
Location: UK
Nice run! It looks relatively optimised to me, I think some scripting is required to get the most out of the RNG given both fuel and enemy spawns utilise it heavily. A quick note for judges on goal choice: strictly speaking, levels 9-16 are identical in gameplay to 1-8 (minus RNG), and there's an argument that the run should stop there; however, the rockets themselves are labelled U1 for levels 1-4, U2 for levels 5-8, U3 for levels 9-12, and U4 for levels 13-16 before looping back to U1. I'd argue that the game itself considers this to be one loop and therefore 16 is the correct goal choice.
Former player
Joined: 6/30/2010
Posts: 1094
Location: Zurich, Switzerland
I only know this game from DK64 and always found it a baffling decision that they made it a mandatory part of beating the main game. So having played at least some version of Jetpac, I can definitely appreciate this TAS a lot more. It looks well optimized from what I can tell, but it's probably not the easiest game to TAS. I don't want to hold the awful loading sequence against the game here, so I give this TAS a "yes" vote.
Current project: Gex 3 any% Paused: Gex 64 any% There are no N64 emulators. Just SM64 emulators with hacky support for all the other games.
EZGames69
He/They
Publisher, Reviewer, Expert player (3969)
Joined: 5/29/2017
Posts: 2709
Location: Michigan
So I had actually worked on a movie of this back in Bizhawk 2.6.2 but got demotivated to work on it. The first rocket screen I tried to manipulate the fuel to spawn as close to the rocket as I could in order to save x movement time. This first screen from a very rough estimate saved around 7 seconds compared to the first screen in this submission: Link to video Here's my abandoned bk2 file which completes the first two screens (although keep in mind I haven't tested to see if it syncs in BizHawk 2.9.1): https://tasvideos.org/UserFiles/Info/638315980447033759
[14:15] <feos> WinDOES what DOSn't 12:33:44 PM <Mothrayas> "I got an oof with my game!" Mothrayas Today at 12:22: <Colin> thank you for supporting noble causes such as my feet MemoryTAS Today at 11:55 AM: you wouldn't know beauty if it slapped you in the face with a giant fish [Today at 4:51 PM] Mothrayas: although if you like your own tweets that's the online equivalent of sniffing your own farts and probably tells a lot about you as a person MemoryTAS Today at 7:01 PM: But I exert big staff energy honestly lol Samsara Today at 1:20 PM: wouldn't ACE in a real life TAS just stand for Actually Cease Existing
Player (58)
Joined: 9/15/2023
Posts: 71
EZGames69 wrote:
So I had actually worked on a movie of this back in Bizhawk 2.6.2 but got demotivated to work on it. The first rocket screen I tried to manipulate the fuel to spawn as close to the rocket as I could in order to save x movement time. [snip] https://tasvideos.org/UserFiles/Info/638315980447033759
Okay, I get that any gameplay can demonstrate improved optimization to have a submission be rejected, but it would kinda suck to have that happen because of one RNG-manip intensive screen of a WIP recording out of an entire 16 screen run, especially when said first screen could feasibly be grafted onto the whole recording and still sync for the rest of it. And I thought I was done 4 days ago, which is a real bruh moment, although I guess I'll see what I can do here.
Player (58)
Joined: 9/15/2023
Posts: 71
EZGames69 wrote:
So I had actually worked on a movie of this back in Bizhawk 2.6.2 but got demotivated to work on it. The first rocket screen I tried to manipulate the fuel to spawn as close to the rocket as I could in order to save x movement time. This first screen from a very rough estimate saved around 7 seconds compared to the first screen in this submission: Link to video Here's my abandoned bk2 file which completes the first two screens (although keep in mind I haven't tested to see if it syncs in BizHawk 2.9.1): https://tasvideos.org/UserFiles/Info/638315980447033759
I just checked, and this movie doesn't sync on the latest version of BizHawk, the movements are totally screwed up. That might be down to more accurate tape loading times, although I'm certain that that would have knock-on effects as to the RNG seed as well. I actually did make use of RNG manipulation in my own recording, it's just that I didn't aim for perfect results (ie, always the closest fuel spawn) because RNG is really, REALLY stubborn in this game, and it always seemed to want to spawn the fuel in the same one or two locations unless I really went far off my intended route. As such, I just generally tried to make sure that the fuel spawned closeer to me than it would have otherwise. I'll still go back and see if I can make better RNG manipulation work, though. EDIT: I managed to get close fuel spawns for all of the first screen/rocket, but with only a timesave of 26 frames (due to the spawns not being instant) and at the cost of desyncing the entire rest of the movie. This is definitely NOT a trivial task
nymx
He/Him
Editor, Judge, Skilled player (1646)
Joined: 11/14/2014
Posts: 814
Location: South Pole, True Land Down Under
Ok...so I have finally sat down to start looking at this submission. My normal approach is to avoid looking at the discussion thread, until I make my own analysis. I do this so that my review will not be tainted by others. Now that I have made my own assessment, I do see concerns. These concerns were validated by EZGanes69's effort. It is obvious that RNG manipulation is painful here and that some games are going to require a level of effort that others don't. So here is what I would like to do. Technoturnovers, can you please explain your methods of controlling RNG? This will help me to identify how much time it would require to redo any work. Also, for ending input early...I do see that manipulating the last fuel object, to drop directly over the rocket should be performed. This should save a good chunk of frames. Additionally, if RNG is controlled better...you might get more than one fuel object to drop directly over the rocket without having to do any extra inputs. This would be even more impressive. As it stands, these optimization errors are enough to reject this submission; however, I do not want to put you through that. If you want to take a bit more time to get this right, please do and I can set the submission to "Delayed". On the other hand you have the option to "Cancel" this yourself...but I would try and improve it before you take that route. I do believe this is a run that is worth putting time in and I'm willing to wait. Just let me know how you want to proceed. Thanks!
I recently discovered that if you haven't reached a level of frustration with TASing any game, then you haven't done your due diligence. ---- SOYZA: Are you playing a game? NYMX: I'm not playing a game, I'm TASing. SOYZA: Oh...so its not a game...Its for real? ---- Anybody got a Quantum computer I can borrow for 20 minutes? Nevermind...eien's 64 core machine will do. :) ---- BOTing will be the end of all games. --NYMX
Active player (291)
Joined: 12/20/2022
Posts: 32
Location: UK
nymx wrote:
Also, for ending input early...I do see that manipulating the last fuel object, to drop directly over the rocket should be performed. This should save a good chunk of frames. Additionally, if RNG is controlled better...you might get more than one fuel object to drop directly over the rocket without having to do any extra inputs. This would be even more impressive.
If I remember rightly, fuel can't fall directly onto the rocket, it has to be touched and dropped by Jetman to count; in addition, you do have to enter the rocket at the end of every level, and since the last level's enemies home in on you, you can't just stand outside the rocket and wait.
nymx
He/Him
Editor, Judge, Skilled player (1646)
Joined: 11/14/2014
Posts: 814
Location: South Pole, True Land Down Under
DigitalDuck wrote:
nymx wrote:
Also, for ending input early...I do see that manipulating the last fuel object, to drop directly over the rocket should be performed. This should save a good chunk of frames. Additionally, if RNG is controlled better...you might get more than one fuel object to drop directly over the rocket without having to do any extra inputs. This would be even more impressive.
If I remember rightly, fuel can't fall directly onto the rocket, it has to be touched and dropped by Jetman to count; in addition, you do have to enter the rocket at the end of every level, and since the last level's enemies home in on you, you can't just stand outside the rocket and wait.
Ok...this is fair. I went back to check the "Casual" play that I've been using to see the differences between TAS and RTA. I think what I was seeing was an illusion, where the fuel was being dragged over and dropped...giving the appearance of falling from that location.
I recently discovered that if you haven't reached a level of frustration with TASing any game, then you haven't done your due diligence. ---- SOYZA: Are you playing a game? NYMX: I'm not playing a game, I'm TASing. SOYZA: Oh...so its not a game...Its for real? ---- Anybody got a Quantum computer I can borrow for 20 minutes? Nevermind...eien's 64 core machine will do. :) ---- BOTing will be the end of all games. --NYMX
Player (58)
Joined: 9/15/2023
Posts: 71
nymx wrote:
So here is what I would like to do. Technoturnovers, can you please explain your methods of controlling RNG? This will help me to identify how much time it would require to redo any work.
Since I lack any relevant memory watch or prior reverse engineering effort, my RNG manipulation takes the form of randomly spamming all available controls (left, right, thrust, hover, and fire) between the last fuel entering the rocket and the next one actually spawning. This is visible as me constantly changing directions while I'm flying. Most of the time, I'm successful in getting the fuel to spawn closer than it would have otherwise with a dozen or couple dozen attempts; sometimes, this doesn't work out and it takes even longer, sometimes it REALLY doesn't work out and I end up needing to change my actual trajectory on my route outright. And I'm effectively never able to guarantee instant fuel spawns, and the required movements would probably end up wasting away that timesave anyways. For reference, EZGames69's honestly jaw-dropping first screen recording encompasses over two THOUSAND rerecords, I can only assume all done manually rather than with the help of a script. He says that he lost motivation to work on the project after that, and I can really only say, yeah, no shit lmfao, how did you even get that far in the first place? So, if I end up getting rejected because of this, I honestly won't even be mad, it just is what it is really. But I'm not putting over 2000 rerecords solely into RNG manipulation for each individual screen of this game, because I value my sanity (ignore the fact that I TASed SMB Special).
nymx
He/Him
Editor, Judge, Skilled player (1646)
Joined: 11/14/2014
Posts: 814
Location: South Pole, True Land Down Under
Technoturnovers wrote:
nymx wrote:
So here is what I would like to do. Technoturnovers, can you please explain your methods of controlling RNG? This will help me to identify how much time it would require to redo any work.
Since I lack any relevant memory watch or prior reverse engineering effort, my RNG manipulation takes the form of randomly spamming all available controls (left, right, thrust, hover, and fire) between the last fuel entering the rocket and the next one actually spawning. This is visible as me constantly changing directions while I'm flying. Most of the time, I'm successful in getting the fuel to spawn closer than it would have otherwise with a dozen or couple dozen attempts; sometimes, this doesn't work out and it takes even longer, sometimes it REALLY doesn't work out and I end up needing to change my actual trajectory on my route outright. And I'm effectively never able to guarantee instant fuel spawns, and the required movements would probably end up wasting away that timesave anyways. For reference, EZGames69's honestly jaw-dropping first screen recording encompasses over two THOUSAND rerecords, I can only assume all done manually rather than with the help of a script. He says that he lost motivation to work on the project after that, and I can really only say, yeah, no shit lmfao, how did you even get that far in the first place? So, if I end up getting rejected because of this, I honestly won't even be mad, it just is what it is really. But I'm not putting over 2000 rerecords solely into RNG manipulation for each individual screen of this game, because I value my sanity (ignore the fact that I TASed SMB Special).
Ok...that helps. Please remember, this submission can be put on delayed. I would like to see this through. If you don't mind, please take a few weeks and see what you can do. I find that taking a segment of a game each day helps in keeping up the motivation. Perhaps a stage a day? So are we in agreement for setting this to "Delayed'?
I recently discovered that if you haven't reached a level of frustration with TASing any game, then you haven't done your due diligence. ---- SOYZA: Are you playing a game? NYMX: I'm not playing a game, I'm TASing. SOYZA: Oh...so its not a game...Its for real? ---- Anybody got a Quantum computer I can borrow for 20 minutes? Nevermind...eien's 64 core machine will do. :) ---- BOTing will be the end of all games. --NYMX
Player (58)
Joined: 9/15/2023
Posts: 71
nymx wrote:
Ok...that helps. Please remember, this submission can be put on delayed. I would like to see this through. If you don't mind, please take a few weeks and see what you can do. I find that taking a segment of a game each day helps in keeping up the motivation. Perhaps a stage a day? So are we in agreement for setting this to "Delayed'?
Well, see, that really does depend on the level of improvement that you want to see- because over 2000 rerecords in a single day is kind of a LOT, even for me. I could optimize Stage 1 to the level apparent in EZGames69's recording, and that would technically bring the entire recording up to known peak play since that level of RNG manip has only ever been demonstrated for, well, Stage 1. But if I seriously wanted to break the fuck out of this game, then I need scripting to do that, and the total lack of memory watch address for the fuel's current X-position is a major, MAJOR obstacle. If I did have memory watch and probably some more help from people more experienced in Lua scripting, then I could write a script that, between each fuelling, would thrust up and randomly spam left/right and reload the branch until the fuel spawns between a given desired range and by a certain desired deadline, but that's all contingent on me A: figuring out the memory address and B: successfully writing such a script.
nymx
He/Him
Editor, Judge, Skilled player (1646)
Joined: 11/14/2014
Posts: 814
Location: South Pole, True Land Down Under
Technoturnovers wrote:
nymx wrote:
Ok...that helps. Please remember, this submission can be put on delayed. I would like to see this through. If you don't mind, please take a few weeks and see what you can do. I find that taking a segment of a game each day helps in keeping up the motivation. Perhaps a stage a day? So are we in agreement for setting this to "Delayed'?
Well, see, that really does depend on the level of improvement that you want to see- because over 2000 rerecords in a single day is kind of a LOT, even for me. I could optimize Stage 1 to the level apparent in EZGames69's recording, and that would technically bring the entire recording up to known peak play since that level of RNG manip has only ever been demonstrated for, well, Stage 1. But if I seriously wanted to break the fuck out of this game, then I need scripting to do that, and the total lack of memory watch address for the fuel's current X-position is a major, MAJOR obstacle. If I did have memory watch and probably some more help from people more experienced in Lua scripting, then I could write a script that, between each fuelling, would thrust up and randomly spam left/right and reload the branch until the fuel spawns between a given desired range and by a certain desired deadline, but that's all contingent on me A: figuring out the memory address and B: successfully writing such a script.
Ok. Well...we are not expecting perfection, but we can certainly work with you on this. How about this? Can you at least try the first stage and report back? If it looks much better, then we can decide on continuing.
I recently discovered that if you haven't reached a level of frustration with TASing any game, then you haven't done your due diligence. ---- SOYZA: Are you playing a game? NYMX: I'm not playing a game, I'm TASing. SOYZA: Oh...so its not a game...Its for real? ---- Anybody got a Quantum computer I can borrow for 20 minutes? Nevermind...eien's 64 core machine will do. :) ---- BOTing will be the end of all games. --NYMX
EZGames69
He/They
Publisher, Reviewer, Expert player (3969)
Joined: 5/29/2017
Posts: 2709
Location: Michigan
For the record, I'm not really expecting you to be faster than my WIP. I'm mostly hoping you can use the same strategy I used, by spawning the fuel as close as possible to the ship, as that can save a ton of time. Actually trying to optimize those fuel spawns to be optimal every time is not something I'd expect anyone to do without a script of some sort.
[14:15] <feos> WinDOES what DOSn't 12:33:44 PM <Mothrayas> "I got an oof with my game!" Mothrayas Today at 12:22: <Colin> thank you for supporting noble causes such as my feet MemoryTAS Today at 11:55 AM: you wouldn't know beauty if it slapped you in the face with a giant fish [Today at 4:51 PM] Mothrayas: although if you like your own tweets that's the online equivalent of sniffing your own farts and probably tells a lot about you as a person MemoryTAS Today at 7:01 PM: But I exert big staff energy honestly lol Samsara Today at 1:20 PM: wouldn't ACE in a real life TAS just stand for Actually Cease Existing
Player (58)
Joined: 9/15/2023
Posts: 71
EZGames69 wrote:
For the record, I'm not really expecting you to be faster than my WIP. I'm mostly hoping you can use the same strategy I used, by spawning the fuel as close as possible to the ship, as that can save a ton of time. Actually trying to optimize those fuel spawns to be optimal every time is not something I'd expect anyone to do without a script of some sort.
Unless I'm drastically missing out on some key game mechanic here to guarantee spawn locations, spawning fuel as close to the ship as possible is really the issue- spawn time too, of course, but even just getting it to spawn at the middle island every time is a major obstacle even if you accept some seriously delayed spawns. Again, I did use RNG manipulation on every fuel spawn, I just mainly stopped at accepting getting the fuel closer to the player and/or rocket.
EZGames69
He/They
Publisher, Reviewer, Expert player (3969)
Joined: 5/29/2017
Posts: 2709
Location: Michigan
Technoturnovers wrote:
but even just getting it to spawn at the middle island every time is a major obstacle even if you accept some seriously delayed spawns.
I’m almost certain even in my own WIPs for this game, I had to sacrifice a few frames just to manipulate the spawns.
[14:15] <feos> WinDOES what DOSn't 12:33:44 PM <Mothrayas> "I got an oof with my game!" Mothrayas Today at 12:22: <Colin> thank you for supporting noble causes such as my feet MemoryTAS Today at 11:55 AM: you wouldn't know beauty if it slapped you in the face with a giant fish [Today at 4:51 PM] Mothrayas: although if you like your own tweets that's the online equivalent of sniffing your own farts and probably tells a lot about you as a person MemoryTAS Today at 7:01 PM: But I exert big staff energy honestly lol Samsara Today at 1:20 PM: wouldn't ACE in a real life TAS just stand for Actually Cease Existing
Player (58)
Joined: 9/15/2023
Posts: 71
EZGames69 wrote:
Technoturnovers wrote:
but even just getting it to spawn at the middle island every time is a major obstacle even if you accept some seriously delayed spawns.
I’m almost certain even in my own WIPs for this game, I had to sacrifice a few frames just to manipulate the spawns.
Well yeah, but you get my point, it's kind of a problem just in general lmao
Player (58)
Joined: 9/15/2023
Posts: 71
I tried the first stage again, forcing center fuel spawns, and I didn't gain any time. hhhhhhhhhhhhhurrrrrrgh. I literally entered the rocket at the exact same frame as I did in the current submission. EDIT: To elaborate, a lot of that was because of bad enemy spawns, which are another RNG-based frustration, except this time I don't even know when the roll occurs for selecting the spawn location. The fastest route from the middle fuel spawn to the rocket has you go directly through a location where recently-spawned enemies will also be passing through, with absolutely no clearance to either side of them and forcing you to piss away time by waiting a hovering. The longer routes I take in the current submission actually allow me to largely avoid this issue, because I have MUCH more flexibility with where I choose to drop in to the lower part of the stage and being able to actually shoot enemies.
Active player (291)
Joined: 12/20/2022
Posts: 32
Location: UK
Technoturnovers wrote:
I tried the first stage again, forcing center fuel spawns, and I didn't gain any time. hhhhhhhhhhhhhurrrrrrgh. I literally entered the rocket at the exact same frame as I did in the current submission. EDIT: To elaborate, a lot of that was because of bad enemy spawns, which are another RNG-based frustration, except this time I don't even know when the roll occurs for selecting the spawn location. The fastest route from the middle fuel spawn to the rocket has you go directly through a location where recently-spawned enemies will also be passing through, with absolutely no clearance to either side of them and forcing you to piss away time by waiting a hovering. The longer routes I take in the current submission actually allow me to largely avoid this issue, because I have MUCH more flexibility with where I choose to drop in to the lower part of the stage and being able to actually shoot enemies.
So I've taken a quick look at the game and I think this is the relevant code, starting from $6614 :
ld a,($5dcc)
cpl
and $0f
ret nz
ldir
call $65db
ld ($5d39),a
ret
This bit of code runs only in the period between one block of fuel being added and the next spawning. $5dcc appears to be the game timer, so it looks like fuel can only spawn every 16 ticks. It then calls a function at $65db and stores the value in $5d39; it looks like $5d39 is the fuel x-position. So let's look at the code at $65db:
ld hl,$65e9
ld a,($5dce)
and $0f
ld c,a
ld b,$00
add hl,bc
ld a,(hl)
ret
This is indexing into the array at $65e9, which contains the following values: 8, 32, 40, 48, 56, 64, 88, 96, 120, 128, 136, 192, 224, 8, 120, 128 These look like the possible drop positions. They seem to be placed so they don't land on the very edge of a platform, or anywhere near the rocket. 136 appears to be the optimal position, but I don't think you'd lose any time on 128 because there's a 16-tick rule in place anyway. The index is determined by the last four bits of $5dce, which is the random number we're looking for. This number is also rolled by enemies spawning and generally existing so it's not going to be very controllable, but the smoke effect when you first launch into the air also rolls this, as well as explosions caused by killing enemies, and shooting in general without hitting anything. If you set up a watch on these places (for BizHawk and +2A you'll want BANK 5 and subtract 0x4000 from all of these - e.g. the fuel x-position is 0x1D39) it should help things go a bit faster. I'm not great at making efficient scripts but this should be enough to go on for someone who wants to take on that task.
nymx
He/Him
Editor, Judge, Skilled player (1646)
Joined: 11/14/2014
Posts: 814
Location: South Pole, True Land Down Under
DigitalDuck wrote:
Technoturnovers wrote:
I tried the first stage again, forcing center fuel spawns, and I didn't gain any time. hhhhhhhhhhhhhurrrrrrgh. I literally entered the rocket at the exact same frame as I did in the current submission. EDIT: To elaborate, a lot of that was because of bad enemy spawns, which are another RNG-based frustration, except this time I don't even know when the roll occurs for selecting the spawn location. The fastest route from the middle fuel spawn to the rocket has you go directly through a location where recently-spawned enemies will also be passing through, with absolutely no clearance to either side of them and forcing you to piss away time by waiting a hovering. The longer routes I take in the current submission actually allow me to largely avoid this issue, because I have MUCH more flexibility with where I choose to drop in to the lower part of the stage and being able to actually shoot enemies.
So I've taken a quick look at the game and I think this is the relevant code, starting from $6614 :
ld a,($5dcc)
cpl
and $0f
ret nz
ldir
call $65db
ld ($5d39),a
ret
This bit of code runs only in the period between one block of fuel being added and the next spawning. $5dcc appears to be the game timer, so it looks like fuel can only spawn every 16 ticks. It then calls a function at $65db and stores the value in $5d39; it looks like $5d39 is the fuel x-position. So let's look at the code at $65db:
ld hl,$65e9
ld a,($5dce)
and $0f
ld c,a
ld b,$00
add hl,bc
ld a,(hl)
ret
This is indexing into the array at $65e9, which contains the following values: 8, 32, 40, 48, 56, 64, 88, 96, 120, 128, 136, 192, 224, 8, 120, 128 These look like the possible drop positions. They seem to be placed so they don't land on the very edge of a platform, or anywhere near the rocket. 136 appears to be the optimal position, but I don't think you'd lose any time on 128 because there's a 16-tick rule in place anyway. The index is determined by the last four bits of $5dce, which is the random number we're looking for. This number is also rolled by enemies spawning and generally existing so it's not going to be very controllable, but the smoke effect when you first launch into the air also rolls this, as well as explosions caused by killing enemies, and shooting in general without hitting anything. If you set up a watch on these places (for BizHawk and +2A you'll want BANK 5 and subtract 0x4000 from all of these - e.g. the fuel x-position is 0x1D39) it should help things go a bit faster. I'm not great at making efficient scripts but this should be enough to go on for someone who wants to take on that task.
This is excellent! Hopefully this can be helpful to Techno...I really want to see this submission succeed.
I recently discovered that if you haven't reached a level of frustration with TASing any game, then you haven't done your due diligence. ---- SOYZA: Are you playing a game? NYMX: I'm not playing a game, I'm TASing. SOYZA: Oh...so its not a game...Its for real? ---- Anybody got a Quantum computer I can borrow for 20 minutes? Nevermind...eien's 64 core machine will do. :) ---- BOTing will be the end of all games. --NYMX
Player (58)
Joined: 9/15/2023
Posts: 71
Oh, sick, yeah this should make things WAY easier. I'm actually in the middle of something else right now (Arcade Gorf), but I don't see that taking terribly long, so I'll try to take advantage of this soon.
Player (58)
Joined: 9/15/2023
Posts: 71
Alright, I set up the RAM Watch, but current progress is NOT terribly promising. DigitalDuck was basically right that the RNG seed is effectively impossible to intentionally influence towards any given outcome, and while having access to the Fuel X-pos and Game Timer is useful in avoiding some small amount of repeat work in bruteforcing, scripting it is totally infeasible because the enemies just do NOT cooperate; any attempt to automate movement would just result in you ramming some random dick meteor or whatnot. And I still can't get fuel spawn RNG manipulation to amount to ANY real timesave, because enemy spawns are STILL a problem, attempting to RNG manipulate them just increases the luck factor by several orders of magnitude, and more often than not attempting to force the fuel to spawn at 128 or 136 actually just loses time over taking a longer route because of needing to hover to wait out the meteors passing by. The whole point of comparison here is EZGames69's stage 1 recording, but to be completely explicit here, sustaining anything CLOSE to that pace over the course of an entire run is impossible, for all intents and purposes. Fuel spawns at 128 and 136 need to be perfect in order to avoid losing time over further away spawns; they NEED to be fast and there has to be no enemies that will get in the way several seconds after the spawn occurs, or you WILL piss away all of your timesave waiting. EZGames69 said that he doesn't expect me to be any faster than his WIP, but the way enemy spawns work means that that level of perfect RNG is more or less required for spawns at 128 and 136 to work, period, no in-between.
nymx
He/Him
Editor, Judge, Skilled player (1646)
Joined: 11/14/2014
Posts: 814
Location: South Pole, True Land Down Under
Got a question for you Technoturnovers. I've studied your inputs and it appears you are recording with a controller. Is this correct? If so...this can explain the reason why you are not able to easily manipulate the game's RNG.
I recently discovered that if you haven't reached a level of frustration with TASing any game, then you haven't done your due diligence. ---- SOYZA: Are you playing a game? NYMX: I'm not playing a game, I'm TASing. SOYZA: Oh...so its not a game...Its for real? ---- Anybody got a Quantum computer I can borrow for 20 minutes? Nevermind...eien's 64 core machine will do. :) ---- BOTing will be the end of all games. --NYMX
Player (58)
Joined: 9/15/2023
Posts: 71
nymx wrote:
Got a question for you Technoturnovers. I've studied your inputs and it appears you are recording with a controller. Is this correct? If so...this can explain the reason why you are not able to easily manipulate the game's RNG.
I am not recording with a controller, I am recording with the keyboard. And effectively every keyboard button on the ZX Spectrum does something in this game due to its antiquated, spread-out control scheme, so I'm not able to use non-input keys to manipulate RNG even if the game polled such non-input keys for the seed to begin with. See also EZGames69's recording, which uses basically the same amount of keys as mine.
nymx
He/Him
Editor, Judge, Skilled player (1646)
Joined: 11/14/2014
Posts: 814
Location: South Pole, True Land Down Under
Technoturnovers wrote:
nymx wrote:
Got a question for you Technoturnovers. I've studied your inputs and it appears you are recording with a controller. Is this correct? If so...this can explain the reason why you are not able to easily manipulate the game's RNG.
I am not recording with a controller, I am recording with the keyboard. And effectively every keyboard button on the ZX Spectrum does something in this game due to its antiquated, spread-out control scheme, so I'm not able to use non-input keys to manipulate RNG even if the game polled such non-input keys for the seed to begin with. See also EZGames69's recording, which uses basically the same amount of keys as mine.
Ok, so you are using the "TAS Studio Editor"?
I recently discovered that if you haven't reached a level of frustration with TASing any game, then you haven't done your due diligence. ---- SOYZA: Are you playing a game? NYMX: I'm not playing a game, I'm TASing. SOYZA: Oh...so its not a game...Its for real? ---- Anybody got a Quantum computer I can borrow for 20 minutes? Nevermind...eien's 64 core machine will do. :) ---- BOTing will be the end of all games. --NYMX