Super Mario Bros.: [TAS] Custom cutscenes through ACE

Поділитися
Вставка
  • Опубліковано 21 лис 2024

КОМЕНТАРІ • 53

  • @100thCoin
    @100thCoin  10 місяців тому +69

    I ran out of space in the video description to mention this, but sorry for not adding any commentary to the side explaining what's going on. I know I usually do that for these kinds of videos, but I decided that can wait for whatever this TAS looks like when it's finished. Anyway, I'm having fun with this and I plan to make this a couple minutes longer. I don't usually share my work in progress projects, but I thought it was too good not to.

    • @TheNoSwearGuy
      @TheNoSwearGuy 10 місяців тому +1

      Hey, just an FYI, to italicize your text on UA-cam, surround your text with one underscore on each end. Surrounding your text with one asterisk on each end does bold, as you've already found out.

  • @Pixelcraftian
    @Pixelcraftian 10 місяців тому +69

    SMB has ACE?????? And nobody told me??
    Looks incredible :O Can’t wait to see the finished product!!

    • @SquidPartyDude
      @SquidPartyDude 7 місяців тому +1

      I see you every popular video.

  • @Patashu
    @Patashu 10 місяців тому +57

    There's something delightful about hearing Famitracker cracktro music over SMB1 graphics

  • @ac31048
    @ac31048 10 місяців тому +24

    I hadn't realized we have discovered ACE in SMB.

    • @100thCoin
      @100thCoin  10 місяців тому +4

      Here's the video I made in April after discovering a way to set up a payload an execute it: ua-cam.com/video/xoDakIA31jc/v-deo.html

  • @Gustyguy
    @Gustyguy 4 місяці тому +7

    They made a entire Mario game in a TAS
    HOLY COW!

  • @Kosmicd12
    @Kosmicd12 10 місяців тому +30

    lol this is amazing. I assume you need DPCM bug or something too precise to start to do anything like this RTA? (I mean just to start the ACE, I know writing the payload is probably way too much)

    • @100thCoin
      @100thCoin  10 місяців тому +15

      Starting the ACE is simply killing Bowser with fireballs in world 'N'. (You also need to be holding the A button and _Not_ the B button when the final fireball hits Bowser, but that's certainly doable RTA.) But yeah, writing the payload required subframe inputs in SMB3, and utilizing the payload required subframe inputs in SMB1.

    • @Kosmicd12
      @Kosmicd12 10 місяців тому +12

      @@100thCoin ok, yeah that's pretty much what I thought. Doing anything useful with the exploit seems out of the scope of RTA at the moment. Thanks!

  • @mattb8075
    @mattb8075 10 місяців тому +15

    I have actually played a Next Fest demo of your game at some point, pretty wild you're working on that and made this. That gives me some confidence of the quality the final game will have, considering the technical knowledge something like this project requires. Impressive work.

    • @100thCoin
      @100thCoin  10 місяців тому +5

      Oh wow, that's awesome! I really appreciate the kind words!

  • @ronichoudhury
    @ronichoudhury 16 днів тому +1

    I mean this as a compliment: this is so surprising and amazing and good that I can't shake the feeling that it's an April Fools joke or something.

    • @100thCoin
      @100thCoin  15 днів тому +1

      That's why I always provide a link to download the TAS in the description. If you're skeptical, you can download the sequence of inputs and watch it run on your own computer.
      I appreciate the compliment!

  • @burritoman2k
    @burritoman2k 10 місяців тому +10

    Don't have much to say about the video itself (other than the ACE is cool) but your game seems pretty interesting and I'll probably play the demo tomorrow
    Edit: The game was indeed pretty interesting and I ended up 100%ing it. Looking forward to the full release!

    • @100thCoin
      @100thCoin  10 місяців тому +3

      I'm glad to hear you enjoyed the demo! The game will be coming out on Leap Day, Feb 29! I'm probably going to upload a video soon about it.

  • @snoworange5358
    @snoworange5358 10 місяців тому +4

    This is so cool, nice work!

  • @KabAudio
    @KabAudio 10 місяців тому +1

    YESS!!! Love it when you drop new videos!!!!!! This one is awesome!!!! GG 100th Coin!

  • @Mizumaririn
    @Mizumaririn 10 місяців тому +4

    love your creativity

  • @alephnull127
    @alephnull127 10 місяців тому +3

    It is genuinely criminal how underrated of a creator you are. keep up the good work mate!
    Also, question, do you happen to know how the game actually jumps to arbitrary code when killing bowser? i don't quite understand that.

    • @100thCoin
      @100thCoin  10 місяців тому +8

      Okay, so when bowser is killed with fireballs, his sprite is replaced with another sprite. The sprite Bowser transforms into is different for each world, so in world 1 he becomes a Goomba, in world 2 a Buzzy Beetle, and so on. This is an intended feature of the game, and I think the "lore" is that it's just one of his minions in disguise, and burning him to death "Reveals his true form". This effect works perfectly fine for the 8 worlds of the game, but if Mario is beyond world 8 things go wrong. This can be done through manipulating RAM in another game and swapping cartridges.
      World 'N' is what you get if the byte that determines the world number has a value of hex 0x16. (22 in base ten) So when bowser dies via fireballs, we grab the 23rd value in a table only 8 bytes long. This returns an unrelated byte with a value of 0xC9, so bowser becomes "Object C9". Now on the next frame, the game needs to run the code for each of the existing objects. This works through a "Jump Table", essentially the game has a list of addresses to jump to corresponding to the ID of each object. C9 is once again out of the bounds of the list, so unrelated bytes are used for this jump instruction. This doesn't go directly to running the ACE, but it's going to set up what does. Object C9 jumps the PC to address $D007, which normally runs at the end of the level loading routine. Level loading is in it's own "Game state", indicated by address $0772, and level loading ends by incrementing $0772 from a value of 2 to 3. '3" being the value of $0772 for the main game loop.
      This is also done through a jump table. The "Game State" jump table only has 4 entries with a 0 based index, so the highest value is 3. Since Object C9 takes us to the routine that increments $0772, the game state is now set to 4. On the following frame, the game uses a value of 4 in that jump table, and jumps to address $53AE, which isn't mapped to anything. When fetching data from an address that isn't mapped to anything, we call that "Open Bus". Essentially, when the PC fetches an opcode, nothing replaces the data that already exists on the consoles databus, so whatever was already there is interpreted as the opcode. In this case, by jumping to address $53AE, "0x53" is on the databus. This forms the instruction "SRE ($53), Y". To make a long story short, this ends up shifting the byte at address $000A to the right, and that new value is then on the databus. Miraculously, I can manipulate the value of $000A. If I simply hold down the A button (and not the B button) on the frame the last fireball hits Bowser, this byte will have the value 0x80. This shifts to the right to become 0x40, and since 0x40 is on the databus, the next instruction to execute will be the instruction corresponding to a byte with the value of 0x40, the RTI instruction. This pulls 3 bytes off the stack, and ends up sending the PC to address $1181, which is a location in RAM Super Mario bros never writes to.
      Since SMB1 never writes there, I can use an ACE exploit in another game (Super Mario Bros. 3) to write custom code at address $1181 (or just address $0181, since those are mirrors of eachother) and then killing Bowser in world 'N' of SMB1 leads to a series of events ending with a return to the custom code I wrote.

  • @lior_haddad
    @lior_haddad 10 місяців тому +4

    ACE, quite a funny thing...
    Is that really the best way to wait for vblank? Feels a little bad...
    Also, making a game sounds quite hard, so good luck!

    • @100thCoin
      @100thCoin  10 місяців тому +2

      The way I have it working, it should sync up pretty fast even if the CPU/PPUs aren't aligned exactly in the same way the emulator was when making this TAS. Assuming a TAS like this *can* be verified on console with a replay device, the worst case scenario would be a few lag frames during the "Bowser is defeated" screen.
      But yeah, not being able to use the NMI to check for V-Blank is pretty rough. In my ASM code for the main loop, the lowest bit of the first input read every frame is either going to be a "0" or a "1" depending on if I need to waste a single CPU cycle to prevent the false-negative read from $2002. I set up a LUA script to automatically add a button press there if the lag frame occurs when working on this TAS.

  • @zetorux
    @zetorux 10 місяців тому +1

    Oh my GOD

  • @BraydenMuzio-k5h
    @BraydenMuzio-k5h Місяць тому

    Right after I saw that Pokemon Yellow video 💀

  • @sanderbos4243
    @sanderbos4243 10 місяців тому +2

    This is amazing! How much of your 2 KiB did you use up, and up to how many more minutes of fun TASing do you think will fit?

    • @100thCoin
      @100thCoin  10 місяців тому +3

      So far I've using about 32 bytes on the zero page, about 80% of the stack is replaced with my controller reading and code writing routines, I''m using the $200 page for OAM, the entire $300 page is dedicated to my graphics changing code (I'm using 128 bytes starting at $380 dedicated for writing a large series of bytes to be copy-pasted into the PPU), the entire $400 page is dedicated to my main loop that happens each frame, about half the $500 page is my audio code. So far I'm not using the $600 or $700 page.
      Edit: Oh, and I'll probably make this 4 minutes longer? That's a rough estimate, I have no idea what I'm going to do with this yet.

    • @sanderbos4243
      @sanderbos4243 10 місяців тому +1

      @@100thCoin Wow, that's amazing, and I got what you said due to having written a little for the NES a few months back using NesHacker's tutorials. It could be fun to see more computer science references that you could connect with Mario, like Game of -Life- Luigi, Bo(g)o Sort, etc. :)

  • @WindowsDrawer
    @WindowsDrawer 10 місяців тому +3

    Hold up, ACE can be done in SMB? I always thought it was impossible.. When did it get discovered?

    • @100thCoin
      @100thCoin  10 місяців тому +3

      It was discovered in April last year. It requires writing a payload in RAM that SMB1 doesn't initialize, and swapping cartridges so you can start the game in world 'N'.

    • @BooeythePatooie
      @BooeythePatooie 10 місяців тому

      @@100thCoincan you also do so using a cheat code that lets you start in World N?

    • @100thCoin
      @100thCoin  10 місяців тому

      @@BooeythePatooie You would still be able to kill bowser with fireballs, thus leading the to PC executing code at $181, but unless you also have a significant list of cheats to write a payload at address $181, you would just crash the game.

  • @filicz1563
    @filicz1563 9 місяців тому +1

    Would it be possible to set up the payload RTA? Like using similar method to the 7-1 wrong warp.
    Also do you think it will ever be possible to set up a payload in smb1?

    • @100thCoin
      @100thCoin  9 місяців тому +1

      In theory, the payload could be set up RTA, though in practice it would be tedious, near impossible, and likely take multiple hours of manually storing specific bytes inside the stack (since SMB3 doesn't clear that region) to create an advanced payload for SMB3, run it, then have it set up the RAM for you. Alternatively, you could create a custom cartridge to just set up the RAM, which would be easy and RTA viable to just power on and swap carts.

  • @silverwolflee6978
    @silverwolflee6978 10 місяців тому +2

    Any chance for the release of the music? Would love to listen to them.

    • @100thCoin
      @100thCoin  10 місяців тому

      Sure! Give me a little bit, I'll upload the tracks...

    • @100thCoin
      @100thCoin  10 місяців тому +1

      Here you go!
      ua-cam.com/video/4KB7-td0X1M/v-deo.html

  • @alectrona6400
    @alectrona6400 4 місяці тому +1

    are you able to make this into a rom hack by any chance? i love this.

    • @100thCoin
      @100thCoin  4 місяці тому +1

      A rom hack that has a game similar to this would certainly be possible. Keep in mind, this was the prototype of what would become the bad apple TAS. The "game" shown in this TAS is very much not playable, and it's just a music engine that can move sprites around the screen and update the background.

  • @justsomeguy5628
    @justsomeguy5628 Місяць тому +1

    Okay, now make it compute the optimal path for all graphs

  • @lolsaw14
    @lolsaw14 Місяць тому

    i wanna ask, why when i try playing any tas like this its slowed down? speeding it up doesnt help

  • @YF501
    @YF501 10 місяців тому +1

    Woah

  • @670839245
    @670839245 6 місяців тому +1

    Can we have OST?

    • @100thCoin
      @100thCoin  6 місяців тому +1

      Here you go!
      ua-cam.com/video/4KB7-td0X1M/v-deo.html

  • @Alexs23743
    @Alexs23743 4 місяці тому

    I shudder to think what the optimal route is.
    Aw, no 2hues and bad apples in this one. :(

  • @ncrecc6040
    @ncrecc6040 10 місяців тому +2

    i suppose it's now theoretically possible to play back cory arcangel's 2010 hack Super Mario Movie (ua-cam.com/video/f0sBjNp0Z-Q/v-deo.html) inside the actual super mario bros

    • @100thCoin
      @100thCoin  10 місяців тому

      With the way my TAS is set up, in theory, yes! I *could* recreate that in an unmodified version of SMB1.

  • @SuperM789
    @SuperM789 10 місяців тому +2

    wtf how

    • @100thCoin
      @100thCoin  10 місяців тому +3

      So many button presses. Essentially, with an ACE exploit jumping the PC to uninitialized RAM, I'm able to put any custom payload there before swapping cartridges. The code I write lets me write more code through reading the controller a whole bunch, and it cascades from there. I added code for changing the Nametables (the backgrounds), the APU Registers (The music) and the OAM data (sprites). Everything is updated via reading the controller a bunch.
      I only have 2kib or RAM so I don't actually have space to program a whole "Travelling Salesman The Game" so it's just pretending there's gameplay by manually writing data to the screen and audio chip.

    • @SuperM789
      @SuperM789 10 місяців тому +1

      @@100thCoin epic

  • @zigludo
    @zigludo 5 місяців тому

    when is the optimal route speedrun for nerds :((

  • @NCXDKG
    @NCXDKG 4 місяці тому

    Oh, sure, just (GARBAGE NOISE) your way into becoming a sailsman.