Lil_Gecko
He/Him
Player (94)
Joined: 4/7/2011
Posts: 520
Already said it on Youtube, but this is highly impressive. Damn, we've had so many good Mario TASes lately !
Editor, Skilled player (1404)
Joined: 3/31/2010
Posts: 2086
"What the-...!?" ...was my reaction to more than one instance watching the WIP. This is awesome.
Editor, Player (163)
Joined: 4/7/2015
Posts: 330
Location: Porto Alegre, RS, Brazil
Language: lua

while true do print("HYPE") end
Games are basically math with a visual representation of this math, that's why I make the scripts, to re-see games as math. My things: YouTube, GitHub, Pastebin, Twitter
Editor, Skilled player (1410)
Joined: 12/28/2013
Posts: 396
Location: Rio de Janeiro, Brasil
This video from nathanisbored explains very deeply an interesting SMW trick, which we now call 'Yoshification'. https://www.youtube.com/watch?v=2fLOZrQzDnQ
My YouTube channel: https://www.youtube.com/channel/UCVoUfT49xN9TU-gDMHv57sw Projects: SMW 96 exit. SDW any%, with Amaraticando. SMA2 SMW small only Kaizo Mario World 3
Editor, Skilled player (1410)
Joined: 12/28/2013
Posts: 396
Location: Rio de Janeiro, Brasil
Amaraticando has found a new way to abuse the Yoshification glitch. This new variant doesn't involve ACE at all, and it can be used to obtain credits or to finish the level. So, by TASVideos rules, would it be valid to use it in 96-exit to finish Cheese Bridge Area quicker? Everything happens inside the ROM (thus there is no ACE), but doing the same trick a few pixels to the side would lead to credits instead. EDIT: I linked the wrong video the last time. Here's the correct link: https://www.youtube.com/watch?v=3KY5rcp3V24
My YouTube channel: https://www.youtube.com/channel/UCVoUfT49xN9TU-gDMHv57sw Projects: SMW 96 exit. SDW any%, with Amaraticando. SMA2 SMW small only Kaizo Mario World 3
Post subject: Valley of Bowser 4 secret exit as Small Mario
Editor, Skilled player (1410)
Joined: 12/28/2013
Posts: 396
Location: Rio de Janeiro, Brasil
Another exit has been obtained as Small Mario and it will be in the next small only TAS. Valley of Bowser 4, secret exit: https://youtu.be/iF0eTz8_Hko
My YouTube channel: https://www.youtube.com/channel/UCVoUfT49xN9TU-gDMHv57sw Projects: SMW 96 exit. SDW any%, with Amaraticando. SMA2 SMW small only Kaizo Mario World 3
Challenger
He/Him
Skilled player (1638)
Joined: 2/23/2016
Posts: 1036
Impressive stuff!
My homepage --Currently not much motived for TASing as before...-- But I'm still working.
Editor, Skilled player (1410)
Joined: 12/28/2013
Posts: 396
Location: Rio de Janeiro, Brasil
There is a challenge in SMW of clearing levels without pressing the jump buttons, A or B. Today the 50th exit was achieved, Awesome, so I think I should post it here as well: https://www.youtube.com/watch?v=v7O7Oo5dLmA There is a playlist if you want to see the other levels: https://www.youtube.com/playlist?list=PL7195269BE54CC3CF
My YouTube channel: https://www.youtube.com/channel/UCVoUfT49xN9TU-gDMHv57sw Projects: SMW 96 exit. SDW any%, with Amaraticando. SMA2 SMW small only Kaizo Mario World 3
Editor, Skilled player (1404)
Joined: 3/31/2010
Posts: 2086
BrunoVisnadi wrote:
There is a challenge in SMW of clearing levels without pressing the jump buttons, A or B. Today the 50th exit was achieved, Awesome, so I think I should post it here as well: https://www.youtube.com/watch?v=v7O7Oo5dLmA There is a playlist if you want to see the other levels: https://www.youtube.com/playlist?list=PL7195269BE54CC3CF
Man, this is seriously cool to look at. The ingenuity required to beat some of these levels is simply incredible. I also find it pretty interesting to see how more and more levels became beatable as new tricks and strategies were found. Thanks for sharing!
Editor, Player (163)
Joined: 4/7/2015
Posts: 330
Location: Porto Alegre, RS, Brazil
BrunoVisnadi wrote:
Triple-Stun
Games are basically math with a visual representation of this math, that's why I make the scripts, to re-see games as math. My things: YouTube, GitHub, Pastebin, Twitter
Editor, Skilled player (1410)
Joined: 12/28/2013
Posts: 396
Location: Rio de Janeiro, Brasil
Two more levels - and 3 exits were obtained. Vanilla Secret 1 was the one that took the most work so far. Vanilla Dome 2 secret exit: https://youtu.be/mk3MFyW155E Vanilla Secret 1 both exits: https://youtu.be/V6t29b1z1u0 Now we are at 53/96 exits, only 5 away of the arbitrary 3/5 goal. But it's very hard to think of 5 levels that are remotely viable.
My YouTube channel: https://www.youtube.com/channel/UCVoUfT49xN9TU-gDMHv57sw Projects: SMW 96 exit. SDW any%, with Amaraticando. SMA2 SMW small only Kaizo Mario World 3
Amaraticando
It/Its
Editor, Player (158)
Joined: 1/10/2012
Posts: 673
Location: Brazil
There's a new glitch in town. I discovered it while investigating the stun glitch routines, but Masterjun already used a form of this glitch at Games Done Quick. Sprite table $C2 is a 12-bytes region used by each possible sprite slot as a miscellaneous sprite table. Its mostly used as a sprite phase pointer or as a mirror of the stun timer ($1540 table) or for some other purpose. Kaizoman666 documented most of the usage in this link. When used as a phase pointer, it means that this address serves as an index for the routine that will be executed for said sprite. As $C2 is expected to be a low value and SMW offers no exception handling, then executing higher values than intended will always result in garbage code being executed. If you corrupt $C2 for some sprites, the game will likely crash, but sometimes it will execute code from "neighbors" sprites in the ROM. Rarely, it will execute misaligned code without crashing afterward. It's important to state that $C2 is an action pointer when the sprite is in status ($14C8) = 8, which is normal status. The stun routine has the following code:
Language: asm

CODE_01965C: LDA.w $1540,X ORA.w $1558,X ;$01965F | STA $C2,X ;$019662 | LDA.w $1558,X ;$019664 | BEQ CODE_01969C ;$019667 | CMP.b #$01 ;$019669 | BNE CODE_01969C ;$01966B | LDY.w $1594,X ;$01966D | LDA.w $15D0,Y ;$019670 | BNE CODE_01969C ;$019673 | JSL LoadSpriteTables ;$019675 | JSR FaceMario ;$019679 | ASL.w $15F6,X ;$01967C | LSR.w $15F6,X ;$01967F | LDY.w $160E,X ;$019682 | LDA.b #$08 ;$019685 | CPY.b #$03 ;$019687 | BNE CODE_019698 ;$019689 | INC.w $187B,X ;$01968B | LDA.w $166E,X ;$01968E | ORA.b #$30 ;$019691 | STA.w $166E,X ;$019693 | LDA.b #$0A ;$019696 | CODE_019698: STA.w $14C8,X Return01969B: RTS
It occurs when the sprite is at status 9 (carryable/stationary). It's easy to force this situation with Yoshi, using the double tongue glitch that is present in many TASes. At the end, it can make this sprite return to status 8 (normal/usual). At the beginning, it sets $C2 to $1540 OR $1558 = stun timer BINARY OR dying lava timer. The latter part, that I will call normalization, only occurs if $1558 is exactly 1. Therefore we have: if a sprite is in status 9, then $C2 is overwritten. If also $1558 is 1, the sprite status will be set to normal. If this $C2 is used, a glitch will occur. If this $C2 is a phase pointer, a severe glitch will occur! Setting $1558 If a sprite can be burned on lava, $1558 will be set to 0x40. Usually, you can't do a thing with the sprite after that, unless: 1) you were carrying the sprite and throws it at the last possible frame. This way, the sprite will get status 9 and avoid death. 2) you have this slot on Yoshi's mouth and spit (holding down): the sprite is also going to get status 9, even if it's already burning for a while. Some rare sprites also use $1558 for other purposes. Putchin' Chuck uses it for throwing baseballs. Corrupting $C2 In order to corrupt $C2, you have to use the previous methods. When $1558 reachs value 1, then $C2 will get value $1540 OR 1. It means that $C2 = $1540 or $1540 + 1, the one the results in odd. Setting $1540 while $1558 is decrementing We have many ways to set the stun timer for sprites: hitting it with the cape, stomping some sprites, the sprite sometimes uses $1540 on it own, etc. In rare cases, we can use a Lakitu on a cloud: hitting it with the cape will set the stun timer for whatever sprite is on slot 9. $1558 is harder. Even if you set this timer, hitting the sprite with the cape will zero it. The setup 1) Use the stun glitch method to store a slot X on Yoshi's mouth. 2) Make an interesting sprite spawn on slot X. 3) Set its stun timer using any known method and let it sink on lava: this will set $1540 and $1558. 4) Spit the sprite, making it carryable/stationary. As $1540 decreases slower than $1558, when $1558 gets 1, $C2 will have a higher value than usual. Without lava It's possible to do it without lava, IF the sprite uses $1558 on its own. Example: Using koopas entering a shell When a koopa reaches a shell, it jumps into it. That sets $1558 to 0x10 and forces normalization of the shell. If, however, the shell vanishes after the jump and another sprite spawns on the exact same slot, the the new sprite will be normalized. We can combine this old glitch with the stun timer and Yoshi spit. Example: Side effects There're thousands of possible side effects. We're interested in the ones that don't crash the game and don't execute any sort of arbitrary code. We're still studying the good sprites and possible applications. This one deserves attention. https://twitter.com/Bruno_Visnadi/status/1052081591898558464 Nathan is probably making a long video on this topic soon...
Amaraticando
It/Its
Editor, Player (158)
Joined: 1/10/2012
Posts: 673
Location: Brazil
I didn't notice an extra glitch that can occur. It's written in the previous code too:
Language: asm

LDY.w $160E,X ;$019682 | get Naked Koopa id LDA.b #$08 ;$019685 | CPY.b #$03 ;$019687 | if it's a yellow one, then... BNE CODE_019698 ;$019689 | INC.w $187B,X ;$01968B | increment the "follow Mario flag" LDA.w $166E,X ;$01968E | change the 3rd tweaker, to make the sprite invulnerable to cape or fireballs ORA.b #$30 ;$019691 | STA.w $166E,X ;$019693 | LDA.b #$0A ;$019696 | set kicked status CODE_019698: STA.w $14C8,X
That means: if a Yellow Koopa Troopa without shell jumps into another sprite, then the sprite will act like a disco shell and change colors. Link to videoLink to video
Active player (420)
Joined: 3/21/2011
Posts: 127
Location: Virginia (United States)
It's also worth noting that I looked into Bruno's movie (this one) and found that the effect shown there at least is not at all ACE, despite how it looks. There are, of course, many paths that enter ACE territory, but not all of them. To explain that particular code path, it causes the Chuck's phase pointer to jump into the sprite load loop ($C2 = 0x51 jumps to $02A9AA). What happens from there is that the game tries to load some sprite data (from [$CE + Y], which happens to have Y = 0x51 from before) into sprite slots 03-15 (note that the normal sprite slot cap is only 0B). As it happens, the "positions" of all those invalid sprites end up being to the left of the screen, so the game just skips over them and does nothing with the data, and finally returns back to the Chuck without issue. It ends at X = 0x15 because that one is considered to be to the "right" of the screen so it determines the loop is done. However, the value of X is still retained from that loop; that is, the Chuck's is returned to with X = 0x15. In SMW, sprites use the X index to determine the sprite slot currently being processed, and it then decrements until it hits 0, which means... we're now dealing with sprite slot 15, which doesn't exist. And before anything returns back to normal, there are invalid sprite slots 0C-14 in the way, which also have to be processed. Thankfully, SMW happens to put its sprite status table (which determines what routine to run for a sprite) at $14C8, and immediately following that at $14D4 is the the sprite Y position high byte table. In a horizontal level, every value in that table will be either 0 or 1; 0 corresponds to "no sprite", and 1 corresponds to "initialize sprite". So no main sprite routines will end up being run with this invalid index, and only sprite's whose "real" counterpart indices (that is, the sprite slot minus 0x0C) had a high Y position of 1 will actually end up doing anything. And thankfully, the initialization routines for most sprites are extremely short; usually only a few lines at best, which means there won't be many adverse effects. However, some of these routines do end up being run, and with that invalid X index no less, which causes some bad indexing to sprite tables during that initialization. Fortunately, most sprite tables are immediately followed by other sprite tables, which means we can't really do anything openly game-breaking to RAM. At best, we can only write some values to existing sprite tables, messing with the sprites that are currently spawned. For that most part, that's harmless, but this particular effect is the result of one of those misc table writes. Specifically, during the processing, the slot whose "real" counterpart is Yoshi ends up running the initialization routine for sprite 0B, the buzzy beetle (because the sprite ID table at $9E is immediately followed by the sprite Y speed table at $AA, and Yoshi's "Y speed" is 0B at the time). The buzzy beetle's initialization routine doesn't do much, but one thing it does do is that it sets a random value to the sprite table at $1570 (which then indexes into another sprite table at $157C). Yoshi uses $157C as his direction; 0 = left, 1 = right. And here's where the real bug actually happens. While Mario is riding Yoshi, Yoshi's direction is transfered to Mario's direction every frame. As a result, Mario ends up getting this weird direction value written to him as well. And, of course, that causes everything you see in Bruno's video. His direction is used during indexing of Mario's tilemap tables, so an invalid value ends up there and Mario looks like he's now having a really weird day. And Mario's direction is also used during flight, to determine the index to the Mario X speed acceleration tables. So that pulls an invalid value, and later when indexing the speed tables, it pulls "80FF" as his X speed (an extremely high leftward speed). To then get the rightward speed, you then have to press >+B to "decelerate" Mario. That, of course, also throws out an invalid value due to Mario's wack direction, resulting in a new speed of "6100" (an still-extremely-high rightwards speed). So you basically have freedom to go really fast left or really fast right like this. That said, you can only really abuse this while flying. When not flying, Mario's directly gets reset from any left/right inputs; it can also get reset by capespinning, so you can't do that. However, relanding on Yoshi (who got shoved way over to the right as another side effect of this glitch) will break Mario's direction again. So, that's that particular effect. And there's a huge range of similar effects you can probably get from just this one particular code path, by e.g. messing with Yoshi's Y speed do run different sprite initialization routines. So the question is, how legal is this? There's theoretically a wide range of effects, assuming we can find code paths that don't enter ACE territory. We can at least note that: - With the lava method, there's a limited number of levels that both have lava and allow Yoshi to enter. The only ones that come to mind are VD1 (useless), VD3 (no viable sprites, probably), CI4 (useless), CIS (useless), and VoB4. I might be forgetting a few there, but VoB4 seems like it'd be the only one this method work be useful in. - The number of sprites that naturally both use $1558 and use $C2 as a phase pointer is limited. There is only the Diggin'/Pitchin' chuck, Monty Moles, Fishbones, and the Bowser statue; the last two can't even be reached with a Yoshi anyway. - The Koopa method depends on the value of $1540 during or close to initialization, and the number of sprites that both use $C2 as a phase pointer and set $1540 relatively early is pretty small. A preliminary search led to this list of sprites that potentially can be used to trigger the glitch in the original game: Volcano Lotuses, Chargin' Chucks, Splittin' Chucks, Bouncin' Chucks, Clappin' Chucks, Pitchin' Chucks, Diggin' Chucks, Sumo Bros., Pipe Lakitus, and Monty Moles. A quick search for all instances of these led to the following list of viable locations for application in the original game:
volcano lotus: DP1, Groovy
chargin': YI2
pitchin': DP1, Funky
diggin': VoB4
sumo: Funky
pipe lakitu: VS2, FoI4
monty mole: YI2
All other instances of the sprite either would likely not be useful (e.g. right at the end of the level) or were not reachable with both a Yoshi and Koopa (e.g. in castle or not a level with a shell). So you can essentially consider that the potential scope of application within the original game, at least as far as I'm aware of. Exactly what kind of applications each of those sprites can have is still a mystery, though; we know about the VoB4 application with the Diggin' Chuck, but that's only one sprite with one pointer. How much mileage we can get out of other code paths is still up for investigation, and it's something we should probably decide on before considering its use in any runs.
YouTube Channel - Twitter Current projects: Sutte Hakkun, Hyper VI, RTDL, own hacking projects
Post subject: Missing files
jmosx36
He/Him
Player (123)
Joined: 12/7/2013
Posts: 98
Location: Colombia
http://bin.smwcentral.net/u/18906/smwplayer_display.lua SMWPlayer_display I tried to use that lua and says there are missing files (gd.lua, gd.dll and others) Plz help me (Snes9x rr 1.51)
Currently making a route for Super Bomberman 5 200% TASes i'm planning: aero fighters, tg3000 (again), gradius 3, bust a move, bust a move plus, gradius rebirth, smg, smg2, mp9, gh3 (wii)
Post subject: Re: Missing files
Editor, Player (163)
Joined: 4/7/2015
Posts: 330
Location: Porto Alegre, RS, Brazil
jmosx36 wrote:
missing files (gd.lua, gd.dll and others)
Not sure what this script is supposed to do but here are the GD files needed, unzip in the same folder where you have the script.
Games are basically math with a visual representation of this math, that's why I make the scripts, to re-see games as math. My things: YouTube, GitHub, Pastebin, Twitter
jmosx36
He/Him
Player (123)
Joined: 12/7/2013
Posts: 98
Location: Colombia
Thanks, but i found this link with all my needed files http://bin.smwcentral.net/u/19823/smwplayer_smwutils.lua.rar
Currently making a route for Super Bomberman 5 200% TASes i'm planning: aero fighters, tg3000 (again), gradius 3, bust a move, bust a move plus, gradius rebirth, smg, smg2, mp9, gh3 (wii)
GameBreaker64
He/Him
Joined: 11/27/2018
Posts: 10
Location: United States
I'd like to begin work on making ACE for this game. My brother is very good at programming, and he found a C compiler for the SNES. The only problem I have is trying to understand the ins and outs of the game and how it works. My brother said that in order to take control of the game, I'd have to learn and understand it.
Laying in bed, thinking about how many rerecords I will go through the next day.
Amaraticando
It/Its
Editor, Player (158)
Joined: 1/10/2012
Posts: 673
Location: Brazil
I'm not aware of any C compiler for the SNES. Do you have a link? BTW, it's not relevant for ACE, since the game was written directly in assembly back in the day. You should first read the SMW resources page on this site and play/glitch hunt in the game. We have a huge glitch list. Then, get familiarity with the SNES assembly. Then, have a copy of the SMW disassembly and get used to the WRAM map. Using Lua in the process is useful too. http://tasvideos.org/GameResources/SNES/SuperMarioWorld.html https://github.com/kaizoman666/SMW-Data/blob/master/Glitch%20List.md http://www.smwcentral.net/?p=nmap&m=smwram https://wiki.superfamicom.org/learning-65816-assembly https://www.smwcentral.net/?p=section&a=details&id=18706
Post subject: Ceiling Clip with ONE solid item and one normal sprite
Amaraticando
It/Its
Editor, Player (158)
Joined: 1/10/2012
Posts: 673
Location: Brazil
It's possible to clip a ceiling of solid blocks (1 block of height) with one solid item and another auxiliary sprite. We always had to use two solid blocks, each one touching and shifting Mario in two consecutive frames. It's not possible with only one because Mario Y position (last frame) needs to be at least 20 pixels less than the solid item Y position. And Mario's Y position is already limited by the ceiling: you can only touch the head in the last (16th) pixels of a solid block when going from below. The solid shifts Mario up 31 pixels relative to its Y position. Then, with Mario was ducking, the gets big again and only 1 pixel remains from being able to clip. Link to video However, there's a way to rick the game, as follows: 1) start a flight while ducking. Mario will straighten up if the Y speed gets non-negative (or positive, I don't remember the zero) or after hitting a ceiling. So, don't touch the ceiling, but get near. 2) let a p-switch (or the key which doesn't vanish) be around 20 pixels below. 3) let any killable sprite be around and slightly higher then the solid. That sprite must occupy a lower slot than the solid. 4) holding B will make mario touch the ceiling. So start pressing B in the very last moment. 5) the normal sprite can only touch Mario every other frame. So you might want to pause and unpause to manipulate this oscillation. 6) in the frame that Mario will stand up, step on the solid and on the sprite. The following sequence happens in the middle of the frame:
    Mario updates its position as if sprites were not present. As he's not touching the ceiling, the blocked status doesn't change. Mario stand up (increases its height) Mario steps on the solid and is shifted up Mario touches the sprite (with this new position) and gets Y speed -88.
7) In the next frame, the game computes the new position using this speed. Hopefully, the head will be higher than the block. BTW, you can clip without the cape similarly. But a 2nd normal sprite is needed.
Doomsday31415
He/Him
Active player (292)
Joined: 8/28/2018
Posts: 75
Location: United States
I should probably read all this, but while I'm here... I've been working on optimizing the existing credits warp TAS, and discovered you can start moving with Yoshi a frame earlier if your Y subpixel is sufficiently high when you snap to him. Unfortunately, that frame is lost because the Koopa shell is only kicked every other frame and the Chuck only spawns every other frame, not to mention the fireballs only activate every four frames... Any ideas?
Editor, Skilled player (1410)
Joined: 12/28/2013
Posts: 396
Location: Rio de Janeiro, Brasil
Very nice find, I'm surprised we missed that. It should be possible to fix this by changing the parity of the green shell's slot. I'll try to make you a movie of it. EDIT: Nevermind, the shell must be in slot 9 in order to the eat swap to work. I'll still try to figure out a solution.
My YouTube channel: https://www.youtube.com/channel/UCVoUfT49xN9TU-gDMHv57sw Projects: SMW 96 exit. SDW any%, with Amaraticando. SMA2 SMW small only Kaizo Mario World 3
Doomsday31415
He/Him
Active player (292)
Joined: 8/28/2018
Posts: 75
Location: United States
Oh yeah, I forgot that it only happened after I re-added the grabbing of the first red shell (when the shell was at 0x73 instead of 0x72, there was no way to avoid landing on it). Like you said, the shell had to be in slot 9 or else a berry (?) that happens to despawn at a bad time would be where the chuck goes. So wait, does that mean it's checking collision with half the objects each frame? That's pretty clever. I also came up with a significantly smaller payload and a way to make it work in only two frames instead of five (at least starting from the end of submission #2604's movement), but I'd rather not have the only improvement be shrinking the payload... The new payload basically calls into the part of the game end logic that sets the two flags, so it only has to decrement X and do a JSR instead of the 9 bytes normally needed to accomplish the same. That combined with taking another trip on open bus instead of waiting properly for the next frame makes it possible to do in only two frames. I'm not sure how well it'll work on real hardware, but it has enough leeway that it should be at least possible.
Editor, Skilled player (1410)
Joined: 12/28/2013
Posts: 396
Location: Rio de Janeiro, Brasil
As I said on Discord, I found a better strat for the item swap as I was testing this. I believe it must save more than 5 frames. However, I couldn't get the credits with Masterjun's inputs. I'm on phone right now so I can't give the movie file. It's in #tas in SMW Discord.
My YouTube channel: https://www.youtube.com/channel/UCVoUfT49xN9TU-gDMHv57sw Projects: SMW 96 exit. SDW any%, with Amaraticando. SMA2 SMW small only Kaizo Mario World 3
Post subject: What's your discord server link?
Banned User
Joined: 5/27/2019
Posts: 136
Location: Gensokyo
I joined the SMW competition server but otherwise, can you give me a link?
i think i got banned again... I don't know if I can do TASing at the moment. May in summer or something? Soon-ish... Aka. Chuterix, formerly ChutacoackoTAS (did I even address that name?) Check out my RTA's and TASes here: https://www.youtube.com/channel/UCx6JXd3XDSkJqREaLQDYlDg P.S. I have school on weekdays unless break or something. So I will not read messages until the weekends or until further notice.