Tool-assisted speed run for The Great Giana Sisters on the Commodore 64, famous for its overall quality but infamous for its similarities to Super Mario Bros. Still, even though similarities exist, the game physics feels quite different, especially regarding TAS. Unfortunately many of the tricks used aren't obvious to people who have never played this game themselves.
I aimed for frame perfection in this run which was rather easy thanks to BizHawk and shaved off 15 seconds compared to a test run I did years ago with VICE. Even though the sound is not completely right (lack of filters) emulation quality is in my opinion good enough for this game.
The game was officially published on tape and on disc, I'm using the tape version as tape support was quite easy to add to the emulator. The downside of not having an (official) cartridge version is that loading takes quite some time, 3:42 seconds in this case, leaving 6:30 seconds of actual gameplay. I also went for PAL as this game was (to my best knowledge) only released in Europe (but it runs just fine on NTSC apart from the usual speedup).
There is also an Amiga version but game physics are somewhat different in that one.
Game objectives
- Emulator used: BizHawk 1.11.3
- Aims for shortest time
- Abuses programming errors
- Uses warps
- Might abuse death but not sure whether that actually counts as death
Tricks and glitches used
- Faster speed up: This game does not use subpixels, instead position increments are read from a lookup table based on the current velocity (0 to 32). Velocities 28, 29, 30 and 32 have an increment of 2 whereas velocity 31 as an increment of just 1. By alternatingly pressing forward and letting go I keep the velocity in range 28 to 30 and never let it reach 31 in order to not lose a pixel here which gains one frame in most (possibly all) levels. (Pressing forward in the direction of motion increases velocity by 1 as long as it is not yet 32, pressing backward decreases it by 2, not pressing anything decreases it by 1.) A variant of this trick is used for shooting backwards without losing speed: press left just for a single frame when velocity is 30 and shoot at the same time, velocity will decrease to 28 but no pixels are lost.
- Movement pattern optimisation: In a few places where obstacles force Giana to slow down I let a bot search for the optimal input sequence. Still this looks a bit clumsy sometimes due to the lousy game physics that make it difficult to cut corners, and sometimes Giana needs to slow down for a jump of maximum height because reaching the platform without losing speed needs frame perfection here.
- Dragon skipping: when running right across the middle of the screen the game changes from moving Giana and keeping the screen static to scrolling the screen and keeping Giana static, however this change only happens if right is being pressed too. So by letting go of right just before reaching the middle of the screen Giana can move a bit beyond that point without starting the screen to scroll. This helps skipping some of the dragons; normally they fly down after spawning to block Giana's path, but running further to the right means that they spawn later and don't have enough time for that so Giana can run right across underneath.
- Stomping enemies from below: similar to Super Mario Bros the decision whether the enemy or Giana dies is made based on Giana's vertical velocity; as long as she is falling downwards the enemy will die, otherwise Giana will die. This can even cause an enemy to die which is falling onto Giana's head while she is slowly falling downwards.
- Warp time optimisation: after hitting a warp stone the game counts down using a busy loop that runs when there's nothing else to do for the game so the aim here is to reduce the amount of CPU time the game needs to spend. The best option is to "die" because that stops the game physics from running (normally the death handler would kick in here but the game is already busy with warping so the death handler is never executed); running forwards to make the screen scroll is the worst thing one could do because scrolling needs about an entire frame of CPU time for every 8 pixels. That is why it's not always the best choice to run forward to hit an enemy or reach a pit.
- Sneaking through gaps: while walking only Giana's foot level is checked for collisions, this allows for walking underneath some obstacles.
- Enemy omission: the game reserves only 4 sprites for both enemies and powerups. Further enemies/powerups won't spawn when all 4 sprites are still in use.
- Enemy despawning: big objects (dragons, spiders (not seen in this movie), lifts, big diamond) will however always spawn and despawn all other objects that are on screen at that moment as they need all 4 sprite slots for themselves.
- Early lift glitch: the game evaluates enemy collisions one frame after they occur; when a lift is spawned at the end of level and in the previous frame an enemy (whether dead or alive) collided with anything (another enemy or Giana) the game assumes that Giana collided with the lift and depending on her vertical position and velocity it makes Giana either land on the lift or bounce off it. In the 1st case Giana is positioned on the lift and the lift takes her to the bottom of the screen, however the code for positioning assumes that Giana is far right on the screen and because she isn't her horizontal position is set incorrectly (only the lower 8 bits of her horizontal position are set).
- Stage 1: nothing special. Just notice how similar this level is to SMB's first level. And don't trust the in-game timer as it counts down too fast (every 41/50 seconds).
- Stage 2: collecting the 1st powerup (smash bricks) because I will need it for later.
- Stage 3: warping to stage 6
- Stage 6: warping to stage 9 and collecting the 2nd powerup (fireballs) for free whilst doing so. A trick I could not use is to collect the 1st powerup here instead as that skips its animation and gives a funny sound effect, however this would be slower since I need both powerups by the end of stage 9 and collecting the 2nd powerup in stage 9 would be slower than having to wait for the animation in stage 2.
- Stage 9: killing an enemy with a fireball to position it on top of the ramp so I can touch it while the lift is spawning to trigger the early lift glitch which saves more frames than I spent on collecting both powerups.
- Stages 10, 11: nothing special
- Stage 12: notice that I stomp the 1st crocodile without touching it. The game normally uses pixel perfect collision detection but since the video chip only says who was involved in a collision but doesn't tell who touched who the game follows up with a bounding box check and makes the game incorrectly assume the wrong enemy to be affected. Later on the dragon is skipped as described above.
- Stage 13: I jump over the 1st enemy by purpose so it won't stay on screen and the next 4 enemies will all find a sprite slot to spawn in; stomping the first 2 of those in turn ensures that all 4 slots are still occupied when the game wants to spawn a bouncing bubble on one of the pillars which would slow me down but as all the sprite slots are occupied the bubble doesn't spawn.
- Stages 14, 15, 16: nothing special, just some tricky movements and another skipped dragon at the end of stage 16.
- Stage 17: warping to stage 20
- Stage 20: this dragon is skipped by sneaking through a gap at the bottom of a wall which does not reach all the way down to the floor. Skipping the dragon this way is one or 2 frames faster.
- Stage 21: nothing special
- Stages 22, 25, 28: warping 3 stages ahead each
- Stage 31: nothing special
- Stage 32: this pit is the official exit, going ahead instead would just take you to a dead end.
- Stage 33: the end dragon is forcefully despawned when reaching the wall as the game loads the big crystal. Deliberately ending input early so Giana's momentum takes her to the crystal and end the game.
feos: Nice movie, clever execution, accepting to Moons.
Spikestuff:
That was a Twisted Dream. Publishing.
Well this is one Twisted Dream. I keep desyncing on every version I stumbled across. Dropped.
Also, feos you forgot to give it the Moon tier.
Fog:
Hot Potato! Dropped Potato!
Spikestuff: "In case you were wondering: Yes. I'm still a potato."
Reclaimed, "BECAUSE I'M A POTATO."