Русские видео

Сейчас в тренде

Иностранные видео


Скачать с ютуб Super Mario Bros. 3: ACE by kicking the goal around в хорошем качестве

Super Mario Bros. 3: ACE by kicking the goal around 2 года назад


Если кнопки скачивания не загрузились НАЖМИТЕ ЗДЕСЬ или обновите страницу
Если возникают проблемы со скачиванием, пожалуйста напишите в поддержку по адресу внизу страницы.
Спасибо за использование сервиса savevideohd.ru



Super Mario Bros. 3: ACE by kicking the goal around

In this video, I'm going to demonstrate how a series of new discoveries almost lead to ACE. In summary, when the goal spawns in, it overwrites anything in the first bumped block sprite slot. When an object spawns in (including the goal) it's sprite state get's incremented by one. Normally this is done to set state 0 to state 1, but in this case, we can use a bumped block in a different state to make some wild things happen. This is called Sprite State Incrementation. The goal uses address $DF to track its internal state. This address is also used for tile detection if the sprite could be in states 3 through 6. If the goal wakes up while detecting tiles, the goal's internal state will keep this information from the tile detection, and use that as its new goal state. By waking the goal up while it detects a ceiling, the jump table is indexed out of bounds, which begins executing code at $5A5. It's most certainly TAS only, but from there I can write jumps and branches to enemy X positions where I write JSR $8FE3 and win the game. ---------------- What's the deal with the koopa in slot 2? There are 8 sprite slots, and a large list of variables that these sprites can use, such as their ID, Internal Timers, and other variables. Some of these are only intended for certain sprite slots, so there might be only 5 bytes allocated for these variables instead of 8. There isn't any space between these tables, so a sprite in slot 7 utilizing a table with only 5 entries will bleed into the table after it. In the video, address $6AC is the wiggle timer of slot 2, but I'm using it as the wake up timer for slot 7, since the table for wake up timers is only 5 entries long. This lets me wake up the goal any number of frames after I set it into state 3, which lets me time the wake up to a frame while it detects a ceiling. ---------------- What's the code that kicks slot 7? Using the X and Y positions of the "point bubbles" I write: (using southbird's disassembly's name for variables) LDA Pad_Holding (zero page) STA Player_Suit (zero page) LDA #5 STA $676 (Slot 7 State) RTS I ran out of space with the video description to go into detail with that the code does for people who don't program in 6502 Assembly, but for those of you who can follow along, this code should make perfect sense. ---------------- What was that at the end about goal state 2 running ACE? Okay, so this one is kinda exciting, but also really dumb. So the game is trying to draw fireworks, but the pointer to the fireworks graphics data was never set, and is currently being used for another purpose. Using it as a pointer points to garbage data, and it will keep drawing until it hits a terminator. Now, this drawing routing happens inside the NMI but in bank 26, and it takes so long that a new frame begins, firing another NMI. This happens for many frames, but at the end, it will eventually finish drawing garbage, which is where the problem occurs. at the end of the NMI, the game swaps out the $A000 and $C000 banks to bank 7 and 8, and then we hit RTI. But the RTI is supposed to point back inside the drawing routing from bank 26, but bank 26 isn't loaded anymore, bank 7 is! Depending on where the execution pointer was during the graphics loop inside bank 26, the pointer could land inside an operations arguments, and read those as code instead. That has a good chance of crashing the game, but there's the possibility that it hits a TXS instruction if the RTI takes us to address $B2BF, which destroys the stack pointer, and then hits RTS which will point us to $0000. Now from there you would think you need to be holding start or whatever to make a branch past the majority of the zero page, but get this, (and this is the really cool part) the data on address $0009 happens to write JSR $007A, which skips all the parts that could cause a crash or jump elsewhere, and it just happens to land right before the X position of enemies! All of that without any manipulation with the level timer, or frame perfect button presses! Now, I doubt it would be possible to manipulate the clock-cycle-perfect NMI that lands on the TSX when running RTI, but if it could be manipulated and there's an RTA viable method to kick a bumped block, you could probably see some route changes to the any% run. ---------------- So why does any of this matter? I could've just won the game inside 7-1, or even with the glitch powerup. Why go through all the effort to kick a block, just for another way to win the game? It's fun. I like thinking up new ways to break this game, and if by some miracle, any of these outrageous setups could be achieved without prior ACE, then we have a golden ticket to a new speedrun route. I don't know if this will be the one, but my goodness it's so close! ---------------- Here's the bizhawk movie file for the TAS that I show at the end of the video. https://drive.google.com/file/d/1UAm_...

Comments