New Wip!
ChangeLog:
*World 3 Driving stage(The Long Road) (almost) same as before
*Stage 3-2 (On the Walk Again?) redone with new strategy
*Added brief Pause at Stage 3-4 (Yoodle a Sea Doo) that replaces a slight delay during the next stage
*Boss Battle redone
*Applied Pause Trick to save one frame.
Sad, Happy? News:
I found yet another improvement to the run, this time for every single boss battle. Unfortunately, when I tried to hex it in, it caused more lag in every stage, thus meaning I have to redo worlds 2 - 4 again. The improvement btw, involves pausing during a Boss Battle to speed it up. Thanks to this trick, it is now possible to enter a battle regardless of the length of the battle intro.
Edit: Wip
Great news! The newest VBA version removes alot of lag from the game! I know emulation flaws shouldn't count as an "improvement", but since it is supposingly more accurate, I guess I can use it!
Here's a WIP of the first world made from scratch, using all the tricks I know so far along with vba-v24m-svn422.
Edit: And here's world 2.
Am I the only one who is interested in Spongebob? LOL
Anyway, I'm almost done world 5.
One more thing. I discovered that the run is HIGHLY improvable. It not due to unused tricks or sloppiness however. I found out that completing a stage differently, despite ending the same frame, causes different amounts of lag in the future. It could be in the next stage, or even the next world. This seems to happen alot in the autoscrollers, giving me another reason why to hate them; the can't be easily hexed in. >.>
I haven't been watching the WIPs, since I've been working on my own TAS, but I'm glad you're making such progress improving the published run! I'm planning to watch the run when it's done, so I look forward to the submission!
It's too bad the autoscrollers cause you so much trouble with lag, but it's a good thing there aren't more of them. The GBA version of Creature from the Krusty Krab is mostly autoscrollers, so I fear that game won't ever make for an interesting TAS.
Good luck reducing the lag!
Thanks for the reply, CoolKirby!
I've been trying for at least an hour trying to find an exit or something useful at the OoB areas in the Clyclops battle, but without luck.
The WIP is here.
I'm going to just fight the boss normally, since I can't seem to find a glitched exit.
How does the game determine if a glitched exit will appear out of bounds or not? Can it be manipulated somehow?
(I've never TASed this game, so I don't know how it works.)
Idk. All I'm sure is that for the same stage, they appear in similar places. For example, I was lucky enough to save alot of frames in the world 4 stage "Trench Bottom" because the glitched exit appeared at a closer spot.
In World 3, the stage "Sea Cave" had several glitched exits, but most of them were too far away.
So I guess it depends on the stage and luck.
Edit: Here's the Wip for World 5.
I can't find a single glitched exit at the second last stage of World 6. I'll continue on to the last boss.
Edit: Ok, done! I'm writing the submission text now.
So apparently the Spanish text is the fastest text in this game.
https://www.speedrun.com/The_SpongeBob_SquarePants_Movie_GBA/thread/dafua
I don't know if it's any faster on a TAS since you have to select the language first at the start of a TAS timed run. It seems a cutscene is missing on the non English versions as well.
There's some cool new stuff that us non-TAS runners have discovered.
In any level with the wind mechanic, you can glitch yourself into a wall that's to the left of you by just dashing into it at a specific point of the wind cycle. This will transport you to the top of the wall immediately.
In the Trench Bottom stage, this trick can be used at the very beginning of the stage to get out of bounds and find the exit trigger fairly quickly.
Here's a video of that:
https://www.youtube.com/watch?v=pF-mONtCHHo
So, I can't say I know a lot about how games actually work, but isn't this out of bounds area the game's RAM? I'm probably too optimistic here, but if that's the case, it might be possible to edit the memory values in that area to achieve some fancy stuff, like a credits warp, for example...
Nice find. I have no idea if there's any memory corruption OoB, but if anyone could figure it out, it would be nice, since it's possible to go OoB at the very first stage.
If you ever encounter that again, can you please post which X/Y location did you encounter that from? So far on the first stage, I've seen:
* Infinite shell spot at X 65251, Y 1057279 (need to land on an OOB platform to the far left of the stage, then walk a bit to the right to X == 10, fall a bit, then move back left to get there. Jumping and moving left resets the game.
* A non reset crash at X 65048 Y 1051344 (Use Patrick's pants and fly left).
Edit: Input file reaching it for 2.8 BizHawk
https://cdn.discordapp.com/attachments/537350250805985301/1057858832468037662/SpongeBob_SquarePants_Movie_The_USA_OoB_1-1.bk2
* Infinite shell + some wierd downward warp thing at X 58200 Y 1059770. Touching it warps you to 268446719 in Y.
The X/Y addresses I used are 0x1642, 0x1702, both in IWRAM. Changing them don't change Spongebob's position though. Do you know any addresses that does?
Edit: X: 0x3728, Y: 0x372C seems to work for this purpose (at least for 1st stage I tried). The number is huge in comparison though. Can make a script to fly around and see what other things are there.
Download sp.lua
Language: lua
memory.usememorydomain("IWRAM")
local Addresses = {
display_x = 0x1642,
display_y = 0x1702,
game_state = 0x25C0,
x = 0x3728,
y = 0x372C
}
--function for checking an input with how many frames to delay
function inputdelay(inputs, delay)
local is = input.get()
local start = false
if inputs ~= nil and (is[tostring(inputs)] ~=nil) then
--console.log(is) --debugging
while (delay > 0) do
emu.frameadvance()
delay = delay -1
end
start = true
return start
end
return start
end
while true do
local x = memory.read_u32_le(Addresses.x)
local y = memory.read_u32_le(Addresses.y)
local display_x = memory.read_u32_le(Addresses.display_x)
local display_y = memory.read_u32_le(Addresses.display_y)
local x_speed = 6
local y_speed = 16
if (joypad.getimmediate().R == true) then
if (joypad.getimmediate().Left == true) then
x = memory.read_u32_le(Addresses.x)-65536*x_speed
elseif (joypad.getimmediate().Right == true) then
x = memory.read_u32_le(Addresses.x)+65536*x_speed
else
x = memory.read_u32_le(Addresses.x)
end
if (joypad.getimmediate().Down == true) then
y = memory.read_u32_le(Addresses.y)+65536*y_speed
elseif (joypad.getimmediate().Up == true) then
y = memory.read_u32_le(Addresses.y)-65536*y_speed
else
y = memory.read_u32_le(Addresses.y)
end
memory.write_u32_le(Addresses.x,x)
memory.write_u32_le(Addresses.y,y)
end
gui.text(0,20, "X:"..display_x.." Y:"..display_y)
gui.text(0,40, "State: "..memory.read_u8(Addresses.game_state))
emu.frameadvance()
end
Hold R then move around to "Fly". Change x_speed/y_speed to make spongebob move around faster. Use this to explore OoB quickly
Using this script, I discovered a end stage trigger at Netpune's Wrath, but I have no idea how to reach it legit.
If you can somehow go OoB, there's also an end stage trigger at:
* Dennis (Very far from stage, to the left)
* Ice Cream Monster (Very close to stage, both sides)
* Return of Dennis
Can't find any at Thug Fish, Thug Tug Thug, Cyclops
Will do! If I remember correcty, it happened in level 6-4.
That script is awesome btw. There are some interesting addresses I've found myself:
For me, the Y address that can change Sponge's position is 0300372E.
There are addresses that determine how far the camera will follow Sponge, even OoB - 03001650 (downward), 030015FC, 03001D80, 030025B0
When Sponge hits an exit trigger: 030072AC (I like setting a breakpoint there, so I can take my time to write down the coordinates of an OoB exit)
Also, here is a list of all OoB exits I've found so far (coordinates are taken from the 0300372A/E addresses):
https://drive.google.com/open?id=1gRJtfXyrY7JgvrZ7sJzRSFaR0_mMubZ6
Thanks. In addition to the above, it appears 0x3710 IWRAM is Spongebob's ID.
For the bosses (except the first), all IWRAM.
0x383C - ID
0x3854 - X
0x3858 - Y
Regarding your coordinates, I'm not sure if 0x372E is good for Y; That's half the address for 0x372C, so when I go up/down hill or jump out of bounds, the number goes crazy and jumps to some large value. Also, using the address, I realize the lowest I managed to go in terms of 0x372E is 11263 in stage 1, yet the values in the document are in the 30 and 40 thousands. How did you manage to do that? There seems to be either a large "kill zone", or a large area of flat land at this Y coordinate. If possible, can you please make an input file on how you managed to get there?
Huh, that's pretty strange. Here's a video of me exploring the oob area with the camera following me. https://youtu.be/Hs8T_zDGJx0
I've slightly altered your script so it goes like this:
memory.usememorydomain("IWRAM")
local Addresses = {
display_x = 0x3728,
display_y = 0x372E,
game_state = 0x25C0,
x = 0x3728,
y = 0x372C
}
--function for checking an input with how many frames to delay
function inputdelay(inputs, delay)
local is = input.get()
local start = false
if inputs ~= nil and (is[tostring(inputs)] ~=nil) then
--console.log(is) --debugging
while (delay > 0) do
emu.frameadvance()
delay = delay -1
end
start = true
return start
end
return start
end
while true do
local x = memory.read_u32_le(Addresses.x)
local y = memory.read_u32_le(Addresses.y)
local display_x = memory.read_u32_le(Addresses.display_x)
local display_y = memory.read_u32_le(Addresses.display_y)
local x_speed = 6
local y_speed = 16
-- if inputdelay("C",30) then
-- memory.writebyte(Addresses.State,7) --Instant recruit
-- elseif inputdelay("V",30) then
-- memory.writebyte(Addresses.State,8) --Instant win (5 for xp, 8 for item interface)
-- elseif inputdelay("B",10) then
-- memory.writebyte(Addresses.Win,1)
-- memory.writebyte(Addresses.State,5)
-- --toggle = (toggle == 0) and 1 or 0
-- --if toggle == 0 then toggle = 1 else toggle = 0 end
-- end
if (joypad.getimmediate().R == true) then
if (joypad.getimmediate().Left == true) then
x = memory.read_u32_le(Addresses.x)-65536*x_speed
elseif (joypad.getimmediate().Right == true) then
x = memory.read_u32_le(Addresses.x)+65536*x_speed
else
x = memory.read_u32_le(Addresses.x)
end
if (joypad.getimmediate().Down == true) then
y = memory.read_u32_le(Addresses.y)+65536*y_speed
elseif (joypad.getimmediate().Up == true) then
y = memory.read_u32_le(Addresses.y)-65536*y_speed
else
y = memory.read_u32_le(Addresses.y)
end
memory.write_u32_le(Addresses.x,x)
memory.write_u32_le(Addresses.y,y)
end
gui.text(0,40, "X:"..display_x.." Y:"..display_y)
gui.text(0,60, "State: "..memory.read_u8(Addresses.game_state))
emu.frameadvance()
end
Just realized you were talking specifically about stage 1-1.
I found these exits using a method I call "drilling". Basically, I freeze the value of 030071B0 (spongebob's damage state) to be permanently 1, that way you can bypass the kill layers. Then I freeze 03003737 (downward momentum) to a high number, so spongebob is clipping through everything.
It's quite an efficient way to find the coordinates of oob exit, but of course says nothing about whether or how they are actually reachable.
So I went and timed every single cutscene + language select:
https://docs.google.com/spreadsheets/d/1MDCpHPKPsZwSwkdnv0sDYyfh9pTGp5Zq5Zws9YJZXoo/edit#gid=0
At a glance, Spanish is fastest. There's 1 giant problem however. In the EU version, the game lags more than U. Which means in reality it's very possible the time difference is extremely close. I have to sync the game twice to truly find out.
I managed to sync the game up to 1-4. I saved 60 frames so far on 1-1, so I need to check the other stages a bit.
The fastest RTA run right now is 33 minutes compared to the TAS 28 minutes, so there's definitely more improvements.
https://www.speedrun.com/tssmgba/run/yo7g380m
Some stuff
On Yoodle a Seadle (3-4), you can clip out of bounds using those bones, but you instantly die.
If you used the moustache, you can avoid instant death since you go through the bones:
There's some addresses in EWRAM that is related to OoB tiles. Testing on 1-3, this spot
At X: 7312, Y: 11775, corresponds to this address in EWRAM 0x02F7F1
values 0xF8-0xFF makes it a goal
0x10-0x17 is damage
0x20-0x27 is that secret passage reveal jingle if you press Up
0x30-0x37 - small 12 unit hill
The addresses starting from 0x02D4A0 to 0x035490 seems to start from 0 on start, then gets slowly filled up with something. I don't understand what it is, but it changes to a different address once everything gets filled up.
https://cdn.discordapp.com/attachments/537350250805985301/1058622153475493918/SpongeBob_SquarePants_Movie_The_USA_2-3_Oob.bk2
There's an OoB exit 17,000 units under the stage. it takes so long to the point by the time I reach there I would've beaten both 2-3, 2-4 normally.
I wasn't able to replicate this using passwords to directly skip to the stage, so I suspect it's likely in the area above (0x02D4A0)
There's an infinite shell spot in 1-1 OoB
https://cdn.discordapp.com/attachments/537350250805985301/1057858832468037662/SpongeBob_SquarePants_Movie_The_USA_OoB_1-1.bk2
The 5-1 cutscene that gets skipped in EU actually exists translated:
There are scenes in which EU (english) is actually slower than (U). For instance: