ACE

From Yoshi's Island Speedrunning Wiki
Jump to: navigation, search


Introduction

ACE stands for Arbitrary Code Execution, which can be used to trigger the credits sequence to be played.

To perform the credits warp, a glitch called "Tongue Glitch" is used. This causes Yoshi's tongue to stretch infinitely, eating up the game's memory. If manipulated correctly, the tongue glitch can cause the game to execute instructions from the memory addresses associated with the positions of recently spawned sprites. This is great, because sprite positions can be manipulated. By positioning various sprites at subpixel perfect locations, a sequence of instructions is used to run the credits. This run was made possible by the work of ArneTheGreat.


Explanation

Go here for a (very old) google doc with in-depth explanation: https://docs.google.com/document/d/1lAHhQQaJB5SqCFbg9U0optka4f2xF2Xo8jINmevbv-Y/edit
Do only go here to read up on the technical explanation of how/why this works, not how to actually do the run, since the route explained in there is outdated (slow).


DLC

Go to the DLC page for a useful package of Emu+Tools to use. This will help you learning this category a lot (Use LUA_sprite_slots & RAM_watch_ACE).


Video Tutorial

The following video tutorial will explain how to do the egg shots etc. without even having to know why it works.

Important info not covered in the video:

  • The Trick won't work if the W6 title screen was playing - it HAS to be the 'original' title screen (This only happens if the last file you played on has W6 unlocked). This is easily fixed by starting a new file and then resetting.
  • The file slot that you chose doesn't matter, neither does the version of the game (NTSC U/J 1.0/1.1/1.2 at least... no idea about PAL... probably not?)


>>> Use the line-ups from this picture for reference <<<


Original .txt for today's route (unedited)

 Open ROM in snes9x
 Run the lua script
 Open the ramwatch file and scroll down so you can see the values for 15, 16, 17, and 18
 
 Start new file
 
 Make 6 eggs and go down the pipe (don't get the flower)
 Go up the pipe with a red egg in front of the other 5 (you can set this up before or after you go down the pipe, doesn't matter)
 
 This is the setup to spawn sprites in the correct sprite slots (this requires pretty specific camera scrolling, but it's not very difficult):
 Uptongue the yellow shyguy and shoot the green one with the red egg (we do this to create 2 sprites that won't leave despawn when they move offscreen)
 Run left, jump, make egg from the shyguy in yoshi's mouth
 Make an egg from the dayzee and the shyguy
 Shoot an egg without destroying a sprite (coins don't count)
 Move over to the left side and scroll the screen up
 Jump OVER the info block
 Make an egg from the dayzee and the shyguy
 Shoot two eggs since they're not needed
 
 At this point, looking at the lua script, your 4 eggs should be sprites 15, 16, 17, 18 (although not in that order)
 
 Values in these 4 sprite slots are what is executed as code in 1-2
 For each sprite, we will be despawning an egg at specific x subpixel, x pixel, and screen values (ignore the last one if you want, screens are big square grids so if you use the same lineups it's impossible to get the wrong value)
 
 Here are the values you should have after the egg has gone offscreen
 
 00 	18 subpixel
 A9 	18 pixel
 0D	18 screen
 18 	17 subpixel
 0A 	17 pixel
 02	17 screen
 99	16 subpixel 
 4C 	16 pixel
 00	16 screen
 00 	15 subpixel
 6B 	15 pixel
 02	15 screen
 
 Shooting an egg straight up will give you a X subpixel value of 00 (DONT HOLD UP THROUGH THE SHOOTING ANIMATION, lock the cursor and let go of up)
 The first two shots are screen 02, the third is screen 00, the last is 0D
 
 You'll have to check the WR video for the lineups.
 If you want, you can use yoshi current pos to find the right x pixel, the 1st shot is at pos 78, the 2nd shot is pos 79, etc (iirc)
 
 1st shot: straight up, 
 	
 	(after shot 15 pixel = 6B)
 
 2nd shot: lock cursor lined up with the top of the hill background, move right ONE pixel 
 	
 	(after shot 17 subpixel = 18,  17 pixel = 0A)
 
 SWAP EGGS ONE TIME (A, Y)
 
 3rd shot: lock cursor straight up, hold up to scroll the camera up. move yoshi so there is no gap between the black of the shoe and the black line on the ground.
 	advance cursor ONE tick, should overlap the hill in the background a tiny bit
 	
 	(after shot 16 subpixel = 99, 16 pixel = 4c)
 
 4rd shot: straight up, the visual cue i use is the first pixel yoshi moves down. there is a curve on the ground, but sometimes it's covered by the random stage decoration.
 	
 	(after shot 18 pixel = A9. there are two other AX pixels that work but A9 is the easiest imo)
 
 Once you shoot the eggs, DONT SPAWN ANYTHING ELSE IN THOSE SPRITE SLOTS. It's not very hard to spawn a sprite in slot 15 after the save ring in 1-2.
 
 You have to do something specific in 1-2 OR THE CREDITS WARP WONT WORK. I don't have anything 100% consistent yet.
 Carl's strat is to jump right after the sign. Make sure you're mashing to speed up the intro.
 
 
 Grab an enemy and spit it after the save ring to get tongue glitch. run into the pipe to kill time (shyguys can only spawn at set intervals and you can't be too close), jump over and run to the foam. wait 10-20(?) frames then run back to the pipe and face right. DONT MOVE RIGHT, just tap right to turn. 
 Uptongue so yoshi's tongue is extended when the shyguy hits.
 If the tongue flys away and sprites disappear, that's it. I jump shortly after just in case the shyguy decides to move left. Use the lua script to see it while invisible to learn the timing.
 Don't do any more inputs here. Sometimes the shyguy moves left and hits you, it's ok, if you did everything else right it'll still work.
 If the screen snaps left and moves right a little before crashing you did the tongue glitch part correctly and messed something else up.
 Sometimes you'll get really unlucky and the shyguy will move left AGAIN and hit you, causing the timer to run out. My condolences.
 	
 There's other stuff to be careful about but I'll try to cover that in a stream or youtube video later.