Happy C3, guys! Since last C3, I've been working on quite a bit of ASM related stuff for my next SMW hack (it's a kaizo hack tentatively titled "I Wanna Be The SMW Hack"), and I've got a lot to show off. Anyway, lets cut to the chase and get straight to all the stuff I've coded in the past 6 months:
- Dynamic SMW sprites
I'll let this .gif speak for itself:
What you're seeing is a single test level with a large chunk of SMW's normal sprites all present and none showing any glitched graphics. How did I do this? By both creating a system that allows SMW to dynamically upload sprite graphics as needed and converting many of SMW's regular sprites to make them use said system. However, rather than simply move their graphics routines and make some changes to them (which was the initial plan), I instead created a generic graphics routine that any normal sprite can call to handle their graphics (it combines the function of Suboffscreen0X, GetDrawInfo, and FinishOAMWrite, and it's called after doing some setup that tells the routine where to look for the sprite graphics data) due to this way being an overall better way of implementing this than the previous way I did it.
If you guys would like a demonstration of this functionality, here is a download of an alpha version of my next hack:
Link
Go ahead, place almost any regular sprite into 105 and load it up and it should appear with its correct graphics even though the wrong graphics are intentionally displayed in Lunar Magic. However, these sprites have not been converted yet: Chucks, Ball n' Chain, Wiggler, Big Boo Boss, Magic, Stunned Fish, Sumo Lightning, Climbing Door, Peach, Koopalings, Chained Platforms, Reznor, Stunned Throw Block, Sprite Berry, Stunned Yoshi egg, sprite coins (level end), Flying item sprites, Koopa shell with eyes peeking, All extended, score, cluster, minor extended, bounce, overworld, and coin sprites, and any miscellaneous sprite tiles drawn by routines. Also, some sprites, like Big Boo and Lakitu, show up with the correct graphics, but are glitched in some way or not fully converted yet. In addition, there also seems to be some flaws with the tile allocation system currently, meaning sprites sometimes glitch up when used together. I'll be sure to fix these issues though.
Also, here is a link to a beta version of the patch:
Link
Note: This patch will not work correctly if you try to apply it to a clean SMW ROM because I haven't gotten this to work quite yet in normal SMW. This download is intended to give you guys an idea of the scope of this patch as well as allow the more experienced ASM coders to give feedback (which I'd really appreciate). However, just a quick note if you're going to give feedback on the code:
- The RAM addresses the patch uses are the ones I'm currently using in my hack, as they're basically freeRAM in my hack. They'll likely be changed in the final patch.
- Any routine where this is a comment consisting of three #s basically means that that routine is unfinished.
- Some stuff in this patch is a little experimental (like moving the code that gets the OAM slot to use to within the generic routine rather than have that done in the main sprite loop) and may not be in the final patch if it breaks things horribly.
By the way, because of how big of a patch this is, if anyone wants to help me out with this, let me know.
Chances of this being released as a patch: High (It's going to be a while and it will likely be incompatible with a lot of things, but it will be released eventually.)
- More Extended Sprites
Basically, I've increased the limit of the number that can exist at once by converting minor extended, spinning coins, score, and bounce sprites into extended sprites and changing the RAM addresses used by the extended sprite tables so that the expanded tables can fit. With this change, I can not only have more enemy projectiles on screen, but I can also have more bounce and smoke sprites as well (normally you can only have 4 of either). Of course, because these sprites are now all the same type in my hack, I created a priority system so that the less important sprites (like the graphical effects sprites) can be overwritten by more important sprites, though not every sprite is set to use it at the moment. The current limit is 32 extended sprites, with 3 slots reserved for Mario's fireballs.
In addition, in order for me to make SMW be able to more easily handle having more of these sprites at once, I've made it so that every type of sprite besides regular ones and Mario run their code every other frame instead of every frame. Among the ones that I've converted to work correctly while running at 30 FPS, you shouldn't be able to notice it, neither visually or gameplay wise.
Chances of this being released as a patch: Unknown (I haven't fully finished the implementation of this in my hack, and even if I did, I'm not sure if it'd be worth the compatibility issues).
- Custom Stun State for Sprites:
Basically, what this is is that I've implemented a custom state for sprites that Yoshi puts sprites in when he spits them out. This will allow me to recreate a mechanic from Yoshi's Island that is absent from YSQ where Yoshi is able to hold enemies in his mouth and spit them out, sometimes causing the enemy to do some special behavior, such as swoopers flying away from you at an upwards angle. Currently, I haven't made that many sprites use this, but I plan on giving more sprites custom behaviors. I also plan on adding a custom state for sprites when Yoshi swallows them which will cause different effects depending on what Yoshi swallows.
Also, if you plan on testing this out in the alpha of my hack, know that only the sprites shown in the .gif have any special behaviors. For any other sprite Yoshi can hold in his mouth, their custom stun state is putting them in their normal or regular stunned state.
Chances of this being released as a patch: Low (I'd have to think of a different way of implementing this for the average hack).
- MSU1 Idea
Back in October, I was having an argument with Alcaro about the MSU-1, mainly due to some issues with using the MSU-1 in hacks. One of the issues was that the file size of the PCMs would make hosting them difficult, either here or eleswhere (though for different reasons). I thought of an idea recently that would help a lot with this issue, and that is that, instead of distributing the PCMs directly, why not distribute the songs as MP3s (or another compressed audio format) and provide an easy, automatic way of converting the files into PCMs? To give you guys an idea of how much this saves, I've included 11 MP3s of songs I'm thinking of using in my hack in the download for the alpha of my next hack, which total up to 16.9 MB in size. After double clicking the included .bat file I made and waiting for the conversion to finish, the newly generated PCMs total up to a whopping 186 MB. So basically, I've just reduced the download size to roughly 1/10th of what it would be if you downloaded the PCMs directly. So, not only would this make hosting easier, but it will also make it a lot easier for those with bad internet connections to download the MSU-1 songs. Of course, the there are some issues with this method (won't work on non-windows computers, filesize is still too high if you have a lot of songs, etc.) and there is still the issue of the other two things mentioned (BSNES/Higan only currently, and the unstable format used by the MSU-1), but it's a step in the right direction. I feel more discussion is needed in order for this idea to improve, though. One suggestion I have is that someone ought to make a tool that performs the function of the .bat file and the two programs included in the download, as well as perhaps the tool being able to convert a more compressed audio format than MP3 into PCMs.
Also, if you want to try out the .bat file, you need to go download lame.exe and wav2msu.exe somewhere as well as put these programs, the MP3s, and cmd.exe in the same folder as the .bat file. You'll also need to rename the ROM you apply the IPS patch to to smw.smc.
Chances of this being released as a patch: N/A (This isn't really a patch...)
Name Entry Screen:
Pretty self explanatory. Because this is something that should only come up for a blank save file, I made it so that the game automatically skips the name entry (and the difficulty selection) if you select a used save file. Currently, this doesn't do much, but I do plan on making it so that the name you enter has some effects, such as appearing in place of "Mario" on the save file and possibly having certain names act like cheat codes.
Controls:
D-Pad - Move cursor (Cursor wraps around if you move it where there is no letter)
Y/X - Delete letter, go back to difficulty selection
A/B - Select letter
Start - Make cursor jump to END.
Chances of this being released as a patch: High (If I change how this handles slightly, I can release this, However, the custom name won't be saved unless you use a different patch that lets you save it. Also, any functions that the custom name will have in game are going to be the responsibility of the user to implement).
Custom Save System:
You know how in I Wanna Be The Guy when you reload your last save, it reloads the level and the position you were at when you last saved? Well, that's what I implemented in my hack. Because of this, I've also rewritten SMW's save system so it can handle this.
If you want to test this out in the alpha version of my hack, simply place a regular message box anywhere you want and then place map16 tile 200 under it, and the message box will turn into a save block.
Chances of this being released as a patch: Unknown (While this would be very useful, the current implementation of this in my hack may not be suitable for the average hack).
Anyway, that's it for the new stuff I have to show. Here's a quick update on all the stuff I showed off last C3:
- Lunar Magic ASM Hack Dissassembly
I've dissassembled a bug fix that was made in 2.41 and also updated a few things, like the VRAM patch disassembly. Unless I missed something, the only thing that hasn't been disassembled are the compression patches.
Chances of this being released as a patch: Depends (If Fusoya isn't against it, I'll post all the LM ASM hacks I disassembled so others can better document the ASM hacks as well as have an easier time making patches that won't break compatibility with LM).
- Dynamic Level Loading
Hasn't been touched much. The only thing I did for it recently was further optimize the routine at $058126, which is a routine that stores the BG tilemap to $7EB900 during level load. However, ZSNES doesn't seem to like this change as the BG often ends up garbled and I have no idea why. Also, I seemed to mess something up at one point in the latest aplha, as the X/Y position Mario is placed when the game loads a new area is wrong for some reason.
Chances of this being released as a patch: High (Too awesome for it not to be released eventually)
Edit: Well, I guess the day after C3 started is eventually I guess.
For information on how to use this beta patch, check this post:
Link
- Screen Scrolling Pipes
Haven't been touched aside from maybe a bux fix or two.
Chances of this being released as a patch: Depends (If you guys mess around with the ones I have in my hack and find that my screen scrolling pipes are better than the existing ones, then I'll release my screen scrolling pipes).
- Custom Yoshi
I've re-coded the Mario GFX routine to use my generic sprite GFX routine. In addition, I can now specify what pose Mario shows for each pose Yoshi can display as well as the order in which Mario, Yoshi's head, and Yoshi's body are drawn in.
Chances of this being released as a patch: Very Unlikely (This was something I made specifically for my hack)
- IWBTG Style Death Routine
I've made the Mario head be a special state for Mario instead of it being a custom sprite, and I've altered several Mario routines to reflect this. This change made this routine run faster, have less bugs, and allows the Mario head to interact with stuff without any additional code. Also, my custom save system now allows you to reset to where you last saved, and I added an Easter egg if you try to save after Mario has already died.
Chances of this being released as a patch: Unlikely (I might release this, but some aspects of it wouldn't be ported over due to issues with getting my implementation of this working in normal SMW.
- Dynamic SMW Sprites
Scroll up.
Chances of this being released as a patch: Maybe (It's a secret. )
- Trigger Spikes
Haven't been touched at all.
Chances of this being released as a patch: High (They'll eventually have a lot of utility as they will have functions besides acting as traps).
Also, here is something that I made a while ago for Yoshi's Strange Quest that I can release, specifically a patch that enables you to scroll the screen vertically with up and down:
Link
Edit: This is how far the camera scrolls down by default:
In the .gif, the screen doesn't scroll down as far because the camera reached the bottom of the level.
Anyway, that's it for what I wanted to show you guys for this C3. I hope you guys liked what I had to show! If any of you have any questions, let me know.
My Hacks:
Mario's Strange Quest V1.6
Yoshi's Strange Quest V1.3 / V1.3.1 Beta 4.6
Mario & Yoshi's Strange Quests (2/10/2023 Build)
Other stuff:
My SMW/SMAS/SMAS+W disassembly
Yoshifanatic's Discord Server: A place for fans of my stuff and/or Yoshi to chat with others.
- Dynamic SMW sprites
I'll let this .gif speak for itself:
What you're seeing is a single test level with a large chunk of SMW's normal sprites all present and none showing any glitched graphics. How did I do this? By both creating a system that allows SMW to dynamically upload sprite graphics as needed and converting many of SMW's regular sprites to make them use said system. However, rather than simply move their graphics routines and make some changes to them (which was the initial plan), I instead created a generic graphics routine that any normal sprite can call to handle their graphics (it combines the function of Suboffscreen0X, GetDrawInfo, and FinishOAMWrite, and it's called after doing some setup that tells the routine where to look for the sprite graphics data) due to this way being an overall better way of implementing this than the previous way I did it.
If you guys would like a demonstration of this functionality, here is a download of an alpha version of my next hack:
Link
Go ahead, place almost any regular sprite into 105 and load it up and it should appear with its correct graphics even though the wrong graphics are intentionally displayed in Lunar Magic. However, these sprites have not been converted yet: Chucks, Ball n' Chain, Wiggler, Big Boo Boss, Magic, Stunned Fish, Sumo Lightning, Climbing Door, Peach, Koopalings, Chained Platforms, Reznor, Stunned Throw Block, Sprite Berry, Stunned Yoshi egg, sprite coins (level end), Flying item sprites, Koopa shell with eyes peeking, All extended, score, cluster, minor extended, bounce, overworld, and coin sprites, and any miscellaneous sprite tiles drawn by routines. Also, some sprites, like Big Boo and Lakitu, show up with the correct graphics, but are glitched in some way or not fully converted yet. In addition, there also seems to be some flaws with the tile allocation system currently, meaning sprites sometimes glitch up when used together. I'll be sure to fix these issues though.
Also, here is a link to a beta version of the patch:
Link
Note: This patch will not work correctly if you try to apply it to a clean SMW ROM because I haven't gotten this to work quite yet in normal SMW. This download is intended to give you guys an idea of the scope of this patch as well as allow the more experienced ASM coders to give feedback (which I'd really appreciate). However, just a quick note if you're going to give feedback on the code:
- The RAM addresses the patch uses are the ones I'm currently using in my hack, as they're basically freeRAM in my hack. They'll likely be changed in the final patch.
- Any routine where this is a comment consisting of three #s basically means that that routine is unfinished.
- Some stuff in this patch is a little experimental (like moving the code that gets the OAM slot to use to within the generic routine rather than have that done in the main sprite loop) and may not be in the final patch if it breaks things horribly.
By the way, because of how big of a patch this is, if anyone wants to help me out with this, let me know.
Chances of this being released as a patch: High (It's going to be a while and it will likely be incompatible with a lot of things, but it will be released eventually.)
- More Extended Sprites
Basically, I've increased the limit of the number that can exist at once by converting minor extended, spinning coins, score, and bounce sprites into extended sprites and changing the RAM addresses used by the extended sprite tables so that the expanded tables can fit. With this change, I can not only have more enemy projectiles on screen, but I can also have more bounce and smoke sprites as well (normally you can only have 4 of either). Of course, because these sprites are now all the same type in my hack, I created a priority system so that the less important sprites (like the graphical effects sprites) can be overwritten by more important sprites, though not every sprite is set to use it at the moment. The current limit is 32 extended sprites, with 3 slots reserved for Mario's fireballs.
In addition, in order for me to make SMW be able to more easily handle having more of these sprites at once, I've made it so that every type of sprite besides regular ones and Mario run their code every other frame instead of every frame. Among the ones that I've converted to work correctly while running at 30 FPS, you shouldn't be able to notice it, neither visually or gameplay wise.
Chances of this being released as a patch: Unknown (I haven't fully finished the implementation of this in my hack, and even if I did, I'm not sure if it'd be worth the compatibility issues).
- Custom Stun State for Sprites:
Basically, what this is is that I've implemented a custom state for sprites that Yoshi puts sprites in when he spits them out. This will allow me to recreate a mechanic from Yoshi's Island that is absent from YSQ where Yoshi is able to hold enemies in his mouth and spit them out, sometimes causing the enemy to do some special behavior, such as swoopers flying away from you at an upwards angle. Currently, I haven't made that many sprites use this, but I plan on giving more sprites custom behaviors. I also plan on adding a custom state for sprites when Yoshi swallows them which will cause different effects depending on what Yoshi swallows.
Also, if you plan on testing this out in the alpha of my hack, know that only the sprites shown in the .gif have any special behaviors. For any other sprite Yoshi can hold in his mouth, their custom stun state is putting them in their normal or regular stunned state.
Chances of this being released as a patch: Low (I'd have to think of a different way of implementing this for the average hack).
- MSU1 Idea
Back in October, I was having an argument with Alcaro about the MSU-1, mainly due to some issues with using the MSU-1 in hacks. One of the issues was that the file size of the PCMs would make hosting them difficult, either here or eleswhere (though for different reasons). I thought of an idea recently that would help a lot with this issue, and that is that, instead of distributing the PCMs directly, why not distribute the songs as MP3s (or another compressed audio format) and provide an easy, automatic way of converting the files into PCMs? To give you guys an idea of how much this saves, I've included 11 MP3s of songs I'm thinking of using in my hack in the download for the alpha of my next hack, which total up to 16.9 MB in size. After double clicking the included .bat file I made and waiting for the conversion to finish, the newly generated PCMs total up to a whopping 186 MB. So basically, I've just reduced the download size to roughly 1/10th of what it would be if you downloaded the PCMs directly. So, not only would this make hosting easier, but it will also make it a lot easier for those with bad internet connections to download the MSU-1 songs. Of course, the there are some issues with this method (won't work on non-windows computers, filesize is still too high if you have a lot of songs, etc.) and there is still the issue of the other two things mentioned (BSNES/Higan only currently, and the unstable format used by the MSU-1), but it's a step in the right direction. I feel more discussion is needed in order for this idea to improve, though. One suggestion I have is that someone ought to make a tool that performs the function of the .bat file and the two programs included in the download, as well as perhaps the tool being able to convert a more compressed audio format than MP3 into PCMs.
Also, if you want to try out the .bat file, you need to go download lame.exe and wav2msu.exe somewhere as well as put these programs, the MP3s, and cmd.exe in the same folder as the .bat file. You'll also need to rename the ROM you apply the IPS patch to to smw.smc.
Chances of this being released as a patch: N/A (This isn't really a patch...)
Name Entry Screen:
Pretty self explanatory. Because this is something that should only come up for a blank save file, I made it so that the game automatically skips the name entry (and the difficulty selection) if you select a used save file. Currently, this doesn't do much, but I do plan on making it so that the name you enter has some effects, such as appearing in place of "Mario" on the save file and possibly having certain names act like cheat codes.
Controls:
D-Pad - Move cursor (Cursor wraps around if you move it where there is no letter)
Y/X - Delete letter, go back to difficulty selection
A/B - Select letter
Start - Make cursor jump to END.
Chances of this being released as a patch: High (If I change how this handles slightly, I can release this, However, the custom name won't be saved unless you use a different patch that lets you save it. Also, any functions that the custom name will have in game are going to be the responsibility of the user to implement).
Custom Save System:
You know how in I Wanna Be The Guy when you reload your last save, it reloads the level and the position you were at when you last saved? Well, that's what I implemented in my hack. Because of this, I've also rewritten SMW's save system so it can handle this.
If you want to test this out in the alpha version of my hack, simply place a regular message box anywhere you want and then place map16 tile 200 under it, and the message box will turn into a save block.
Chances of this being released as a patch: Unknown (While this would be very useful, the current implementation of this in my hack may not be suitable for the average hack).
Anyway, that's it for the new stuff I have to show. Here's a quick update on all the stuff I showed off last C3:
- Lunar Magic ASM Hack Dissassembly
I've dissassembled a bug fix that was made in 2.41 and also updated a few things, like the VRAM patch disassembly. Unless I missed something, the only thing that hasn't been disassembled are the compression patches.
Chances of this being released as a patch: Depends (If Fusoya isn't against it, I'll post all the LM ASM hacks I disassembled so others can better document the ASM hacks as well as have an easier time making patches that won't break compatibility with LM).
- Dynamic Level Loading
Hasn't been touched much. The only thing I did for it recently was further optimize the routine at $058126, which is a routine that stores the BG tilemap to $7EB900 during level load. However, ZSNES doesn't seem to like this change as the BG often ends up garbled and I have no idea why. Also, I seemed to mess something up at one point in the latest aplha, as the X/Y position Mario is placed when the game loads a new area is wrong for some reason.
Chances of this being released as a patch: High (Too awesome for it not to be released eventually)
Edit: Well, I guess the day after C3 started is eventually I guess.
For information on how to use this beta patch, check this post:
Link
- Screen Scrolling Pipes
Haven't been touched aside from maybe a bux fix or two.
Chances of this being released as a patch: Depends (If you guys mess around with the ones I have in my hack and find that my screen scrolling pipes are better than the existing ones, then I'll release my screen scrolling pipes).
- Custom Yoshi
I've re-coded the Mario GFX routine to use my generic sprite GFX routine. In addition, I can now specify what pose Mario shows for each pose Yoshi can display as well as the order in which Mario, Yoshi's head, and Yoshi's body are drawn in.
Chances of this being released as a patch: Very Unlikely (This was something I made specifically for my hack)
- IWBTG Style Death Routine
I've made the Mario head be a special state for Mario instead of it being a custom sprite, and I've altered several Mario routines to reflect this. This change made this routine run faster, have less bugs, and allows the Mario head to interact with stuff without any additional code. Also, my custom save system now allows you to reset to where you last saved, and I added an Easter egg if you try to save after Mario has already died.
Chances of this being released as a patch: Unlikely (I might release this, but some aspects of it wouldn't be ported over due to issues with getting my implementation of this working in normal SMW.
- Dynamic SMW Sprites
Scroll up.
Chances of this being released as a patch: Maybe (It's a secret. )
- Trigger Spikes
Haven't been touched at all.
Chances of this being released as a patch: High (They'll eventually have a lot of utility as they will have functions besides acting as traps).
Also, here is something that I made a while ago for Yoshi's Strange Quest that I can release, specifically a patch that enables you to scroll the screen vertically with up and down:
Link
Edit: This is how far the camera scrolls down by default:
In the .gif, the screen doesn't scroll down as far because the camera reached the bottom of the level.
Anyway, that's it for what I wanted to show you guys for this C3. I hope you guys liked what I had to show! If any of you have any questions, let me know.
My Hacks:
Mario's Strange Quest V1.6
Yoshi's Strange Quest V1.3 / V1.3.1 Beta 4.6
Mario & Yoshi's Strange Quests (2/10/2023 Build)
Other stuff:
My SMW/SMAS/SMAS+W disassembly
Yoshifanatic's Discord Server: A place for fans of my stuff and/or Yoshi to chat with others.