Practice hack for Yoshi's Island designed to be used on a SNES console
Features:
- Savestates
- Re-zone to last room/level
- Debug Menu
- HUD
- Warp to (almost) any room entrance
- User Preset Warps - Set with your current position
- Egg editor (and null egg setter)
- Frame advance/slowdown
- Music on/off toggle
- Removal of slow score screen and world map animations
- Enabling built-in Debug functions
- Button configuration
- Exception Handler (Recover from fatal crashes)
- Arbitrary Sprite Spawner by ID
- Memory Viewer
and more.
Bug reports highly appreciated!
Supports J1.0 and U1.0 versions.
Acquire a Yoshi's Island J1.0 and/or U1.0 ROM.
Then, visit https://cbrgray.github.io/yoshisisland-practice-hack to use an online patcher for the latest release.
Alternatively, check the latest Releases for .bps patches, which you can apply to your clean ROMs with a patcher such as flips or beat or SMWCs Online Patcher.
To enter menu press Start while holding L & R on controller 1 or just press Start on controller 2. To leave menu press Start on either controller.
Use the d-pad to navigate, B to go back, and Y/A to select options and set values.
The heads-up display can be toggled on/off from the menu. It may cause some minor graphical glitches and increase lag when enabled. It displays:
| Column 1 | Column 2 | Column 3 | Column 4 | Column 5 |
|---|---|---|---|---|
| Yoshi's horizontal velocity | Red coin amount | Stars amount | Level timer | |
| Most recent egg-aiming angle | Amount of sprites loaded | Flowers amount | Room timer | Input display |
| Miscellaneous data1 | RAM watch2 | Slow movement counter3 | Lag frame counter |
If Yoshi's egg inventory contains a non-standard sprite (either by null egg manipulation, or via the debug menu editor), then the HUD will display different data:
| Column 1 | Column 2 | Column 3 | Column 4 | Column 5 |
|---|---|---|---|---|
| Yoshi's horizontal velocity | Yoshi x position | Yoshi x subpixel | Level timer | |
| Most recent egg-aiming angle | Amount of sprites loaded | BG3 vertical offset | Room timer | Input display |
| Miscellaneous data1 | RAM watch2 | Slow movement counter3 | Lag frame counter |
Note
The HUD data are currently only switched when visiting the world map.
1: The misc. data appear in certain rooms, showing:
- Prince Froggy's damage value during the fight
- A trainer for the rockless key clip in 6-6
-
[tongue frame | jump frame | move left frame]The values indicate how early or late the input was, with 8 being frame-perfect (e.g.
888)- starting from the left corner, begin holding right
- press tongue after 49 frames
- press jump after 3 frames
- stop holding right and start holding left after 6 frames
-
2: Reads from an arbitrary little-endian address set from the debug menu. The read value appears in the indicated HUD position when the address is set to a value other than $000000.
3: Counts the number of frames that Yoshi spends being slowed while running on slopes, stairs, mud, or snow, or by tonguing, spitting, or swallowing while holding a direction.
Use A/Y to cycle the sprite in the selected, loaded slot. The previous/next eggs in the cycle are displayed beside the cursor. Current supported sprites:
- Green/yellow/red/flashing eggs
- Green/red giant eggs
- Key
- NON-STANDARD - boss key (flashing upside-down key), boss explosion, seesaw log, skull mouser
- Chicken
Use Null Egg Setter under Shenanigans to set any Null Egg Sprite ID
Save your current state while in a level.
Normal (fast) load: works while in the same level as the savestate. Restores changes made to terrain. Certain tiles such as sand may appear visually incorrect, but should still be functional. Full load: re-loads the room, regenerates all terrain. This can be toggled to the opposite in menu.
Loading can be done from anywhere in the same level (but not always guaranteed to work). An after-load delay can be set from the debug menu. The byte value indicates the number of frames the game will be paused for when a savestate is finished loading.
Reset to your last room or level entrance depending on the RE-ZONE LEVEL menu option. Your eggs are saved.
Quite simply choose World, level and what room you want to go to, it will use your chosen egg inventory and automatically choose File 3.
Presets are user chosen Warps, they default to 00 (1-1 warp) if not saved. They save Yoshis X and Y position (by tile), current level & room and his egg inventory (in level, not menu). To use, simply have Yoshi be at the position and level you want to save and choose SAVE by the preset you want to use. To load simply choose the preset. All Presets are saved between resets and in Save RAM, if corrupted they default to 00.
More presets can be added if requested.
NOTE: These are not savestates and will just load the level at that position so any sprite state will not be restored and boss rooms might have issues.
Enable/disable music (sound effects play as normal).
Enable noclip. Holding A on controller 1 makes you move faster. Yoshi can't collide with terrain in this mode.
Hold L or R while entering File 3 to enter a fully unlocked save file. Note that the file 3 save can get strange (copy file over and erase it fixes this) Warping before selecting a file will automatically load this save file.
Hold L while pressing select in pause menu and you'll leave any level as well as mark it as cleared. This doesn't save until you beat a level legit.
Increase or decrease frames to skip per frame (amount of slow down). Game will run at 1/n speed where n is slowdown amount. Frame advance mode pauses the game and advances a single frame each time the frame advance input bind is triggered thereafter. It can be disabled via the menu option or by using a bind to change the slow down value. Inputs are buffered in between frames.
Stage intro will end as soon as the level has finished loading, if there's user input.
Hold any button to load level as fast as possible.
Note
Only applies if the egg inventory doesn't contain a null egg.
Frees the camera if used during an autoscroller.
Sets the control scheme to hasty while enabled, otherwise, the controls can be changed in-game as usual.
Hold L+R+Start+Select on controller 1 for 32 frames to reset the game. This can be useful if you have configured the SD2SNES to load when resetting with the console button, for example.
Practice functions can be bound to combinations of buttons on both controllers.
- Press X to remove a binding.
- Press A to start recording a binding.
- Once recording begins, press and hold the desired buttons in sequential order, then release them to stop recording.
- The last button in the sequence is the final trigger, meaning you must hold the other buttons (in any order) and then press the last one to trigger the function.
- This also means that you should avoid pressing more than one button on a frame when recording.
- Bindings must be unique for a given function and controller, e.g. you can't bind X on controller 1 to both Save and Load.
- Note that bindings for controller 2 are recorded using controller 1.
The default bindings are shown below, and may be restored at any time by selecting "reset default":
| Controller 1 | Controller 2 | Function |
|---|---|---|
| Select | - | Save |
| X | - | Load |
| L+X | - | Load full |
| R+X | - | Re-zone |
| - | B | Free movement |
| - | L | Slowdown decrease |
| - | R | Slowdown increase |
| - | A | Frame advance |
| - | Y | Disable autoscroll |
The palette editor accepts values in BGR555 format. It's recommended to generate values with https://orangegb.com/BGR555/ using big endian byte order.
Now Found under Shenanigans/
Set any arbitrary Null Egg you want. Use Count for how many eggs you'll have and then edit the Sprite IDs as you'd like. Use SET EGG IDS to save. You'll find a complete list of all Sprite IDs at: https://github.com/brunovalads/yoshisisland-disassembly/wiki/Sprite-IDs
NOTE: After setting and going to main menu, eggs will display as xxxxxx in main menu even if regular eggs. This is deliberate (For now).
Spawn any Sprite you want. Choose your ID for what Sprite and X and Y for position, note that it is counted from top left corner of screen so a X: 80 / Y: 80 is about in the middle of the screen and FF / FF bottom right. Slots tell you how many sprite slots are used, you can't spawn more after 18/18 is done. You'll find a complete list of all Sprite IDs at: https://github.com/brunovalads/yoshisisland-disassembly/wiki/Sprite-IDs
NOTE: If you spawn all full sprite slots they WILL replace your egg inventory. Might be fixed. NOTE: Not all sprites behave properly, some sprites might require more setup or be spawned as active state immediately.
Set the Memory Address to anything you want and it will display 36 bytes starting from that address. Might be implemented with an editor as well so you can crash your game for fun.
Detects if game had a fatal crash (by use of BRK/COP instructions) and if so goes to debug menu where you can load latest save or rezone level. It also displays values at $700F00 as information for Tongue Glitch Cancel Setups.
Exception Menu has a toggle to enable or disable, as well a Return To Crash option where it tries to return to the state you were in when the crash occured. For Tongue Glitch Cancel, getting A2/BC values does make the Exception Handler trigger every frame due to how it works. By disabling Exceptions and choosing Return To Crash you can check if your setup would work, however you will properly crash as if your setup is wrong. TODO: Find a better way around this maybe...?
Currently you can choose it as submenu in debug menu but it will probably be replaced by other page later.
NOTE: This is not guaranteed to catch all crashes due to its chaotic nature NOTE: Save States may become corrupted by a crash and stability is not guaranteed
First, clone this repo.
This project uses the asar assembler so download it if needed.
Run asar.exe assemble.asm path/to/your_rom.sfc from the root directory to apply the patch.
Warning
This will overwrite the clean ROM.
Alternatively, place the clean ROM(s) you wish to patch into the ROMs/ dir (they should be called JP_clean.sfc for J1.0 and NA_clean.sfc for U1.0)
then run either of the build scripts [build.sh, build.ps1] which preserve the clean ROMs by copying them before patching. Additionally, the build scripts can directly launch Mesen for debugging with a symbol file.