This game has interesting routing quirks. Certain level patterns lock out certain other level patterns, leading to losing a few frames in some levels to guarantee a good pattern in other levels. Though it looks like I'm bleeding frames out of stage 1 vs the current TAS, it is necessary to use a slightly slower level 1 to obtain a faster level 2 which is the bulk of the timesave. There were other minor optimizations through beginning stages sooner. I ran through various permutations and couldn't find a faster path.
Technically there is actually a faster path through the game but it is not viable in a TAS due to time beginning at power on. It involves starting on a different level which is a free menu in RTA timing.
I opted not to use the eye-straining display glitch for ease of viewing and "enjoyment."
Samsara: Hey, hi, hello there! I've replaced the submission file with a version truncated to the last input, for better comparison with the published run. Oh, also, judging!
feos: This movie is 22 frames shorter than the previous, but if you only count pure gameplay it's 24 frames: some frames seem to be spent on RNG manipulation between the first 2 levels, and the fade-out itself has slightly different timing. All in all, accepting over [2792] NES The Great Waldo Search by MESHUGGAH in 00:51.83.
fsvgm777: Processing. despoa is handling the encodes for this one.
After truncating the empty space on the input file, I think this comes in at 51.44 51.47 seconds.
For such a short game, it's nice to see new time saves being found and I always find it funny that going slower can make a run faster overall. It's one of those quirks about "seeded" games that is easy to overlook.
I have watched ShesChardcore do RTA speedruns for years on Twitch and am looking forward to more submissions from this author!
Joined: 11/13/2006
Posts: 2822
Location: Northern California
I've replaced the file to reflect this.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family.
Now infrequently posting on Bluesky
Good job for your first TAS which improves another TAS!
So this game is a quest to TAS by sacrificing frames for:
- most optimal starting level (0 or N number of delays)
- most optimal Waldo location (0 or N number of delays)
- most optimal next level (0 or N number of frames to wait until the new selection is registered)
I guess will take a look at this inside an emu within the next days.
edit: ah, mistook this Waldo "2" TAS with the original Where's Waldo? TAS. In this case, I just moved on the sequel with the followings in mind.
Obvious yes vote!
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
Thanks! The RTA Route is interesting as well. It can unlock a super fast level 2. Basically you pick normal, menu to level 4 quickly and hope you hit the frame window to get the best 4 pattern (scroll onscreen, Waldo top right) which is a time save over the "castle scroll." You then want right Waldo/right scroll in level 1. Then you menu again to level 3 to get the same pattern we do. Then you hope you hit a good frame for the godly level 2 pattern and get the "god sock" in 5. My RTA run on SRC showcases this route which is unfortunately not TAS friendly due to not getting the free menu to 4 before time starts. I did try it and it's just not good enough for TAS timing. I dunno why I put so much effort into this game haha
This submission file uses QuickNes. Syncs on NesHawk by inserting 1 frame in the beginning. Have no idea how to open a QuickNes movie and make it use NesHawk without getting multiple different errors while using TAStudio and doing this.
T- HQ screen - You can press buttons S/s/B/A to get a sound effect. 1 sound / 3 frames, S _ _ _ S _ _ _ but maximum played 5 times at once
Menu - 2 frame delay used in this TAS
Now you mentioned level patterns. I guess I can find the RNG and dump every possible patterns and calculate the distance from the starting position to Waldo position with Lua.
I think there is nothing else than waiting / delaying start (edit) at each stage for changing RNG, so I assume I can start debugging.
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
Joined: 10/12/2011
Posts: 6439
Location: The land down under.
MESHUGGAH wrote:
Have no idea how to open a QuickNes movie and make it use NesHawk without getting multiple different errors while using TAStudio and doing this.
Basically just make an NESHawk movie and then extract contents of both of them and move the input and select parts of the header file (so author name, rerecord count) and then rezip it up again.
Converted to NESHawk input.
WebNations/Sabih wrote:
+fsvgm777 never censoring anything.
Disables Comments and Ratings for the YouTube account.Something better for yourself and also others.
Thanks for doing the conversion. I was using an old version of bizhawk (which I have since upgraded to the latest) because I thought I had updated more recently than I had. I had also forgotten to change the core, which I have since done as well. Basically, sorry am noob but I'm working on it 😂
Scripting out all the different patterns sounds like a good idea and hopefully we can figure out how to access each one. The best level 2 is awesome but I've never been able to access it without the specific path of 4-1-3-2 and I believe the level 2 in my submission is the second best one, faster than the ones where the scroll is super far left.
There is also an "alternate god sock" in 5 that I've never encountered (Overswarm gets it in his Rta WR) which probably won't show up using the linear 1-2-3-4 path but the original god sock is probably just as fast.
Meshuggah: thanks for your original TAS and helping with this one! I hope you find something I might have missed!
Have no idea how to open a QuickNes movie and make it use NesHawk without getting multiple different errors while using TAStudio and doing this.
Basically just make an NESHawk movie and then extract contents of both of them and move the input and select parts of the header file (so author name, rerecord count) and then rezip it up again.
Converted to NESHawk input.
- If I opened up QuickNes movie as tasproj and changed core through TAStudio Header settings, it gave me problems for syncing options not having some values
- If I opened up QuickNes movie file as zip and copy pasted to a new NesHawk movie, I've got thousands (number of N frames) of oops and some fatal errors
- If I opened up QuickNes movie file as (edited) tasproj and copied the Input Log from TAStudio to a new NesHawk movie, "invalid mnemonic" and some fatal errors, probably because I get 2 players NesHawk movie and the original movie was 1 player QuickNes
Thanks for converting the input!
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
Scripting out all the different patterns sounds like a good idea and hopefully we can figure out how to access each one.
Final edit for this post
- 0x00A7 == 0x00C5 is holding the variation as in the value 1, 2, 3, 4 (4 variations)
- Stage 1 of this TAS: 1
- Stage 2 snake: 3 and the variation blocked is 1
- Stage 3: 2
- Stage 4: 4
- Stage 5: 1
NesHawk first lag frame after Stage Select
1510 - Starting as soon as possible Variation 2
1542 - Default P Stage Start
1622 - Down/Left Old Man Stage Start 3 3 3 2 1 4 1 3 3 3 1 4 3 2 2 1 -116
1622 - Up/Right/Select Snake Stage Start -116
Variations after frame 1510 for 1st stage
2 2 2 3 1 1 3 3 4 4 2 1 2 4 3 1 1 2 3 2 1 4 4 2 2
- Variation generated at the lag frame right before starting the stage RNG subroutine $C43D uses 0x00C1, C2, C3... C7 and stores result in A7
Addresses
0051 w u 0 RAM CAM X
0052 b u 0 RAM CAM X - 1
0051 b u 0 RAM CAM X - 2
00A7 b u 0 RAM Variation
00A3 b u 0 RAM Cursor X
00A4 b u 0 RAM Cursor Y
My TODOs:
- Find Waldo and Scroll X Y
- Verify number of variations (Only 4 variation of Waldo and Scroll or 4 variation of Waldo and 4 variation of Scroll)
- First just dump distance from
Starting Cam X Y + Starting Cursor X Y to Waldo X Y
Starting Cam X Y + Starting Cursor X Y to Scroll X Y
Scroll X Y to Waldo X Y
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
I nearly finished mapping out all Waldo and Scroll positions with the help of this TAS.
edit: the sheet contains currently assumed level / variations logic and the absolute frame distance between camera X Y at the beginning of a level and Waldo XY and Scroll XY
Public google drive sheet:
https://docs.google.com/spreadsheets/d/1zw1OsULvof_ozyipmykztuWJSefXIX56RqOgKhGKNKw/edit?usp=sharingPersonal TODOs:
- Dump Variation 0s for remaining levels
- Dump Variation 2,3,4 for final Waldos (if there is any)
Best strategy assuming I made the math right (I used my own made up level names of crystal ball picture over the ones from the manual, which has names like "Land of the Gargantuas" and "The Enchanted Underground"):
Dumping in progress
Old text
- First level Variations: 1, 2, 3, 4 (0 blocked)
- Fastest First levels: Waving Man Persia 3 then 2, Snake 4 then 1, DarkKobold 3 then 2, Man Head 4 then 0
- Fastest Variation patterns for each starting levels not counting faithfully Waldo (requires more data for precise final strategy):
Waving Man Persia 3, Snake 1, DarkKobold 2, Man Head 4, Waldo 1
Waving Man Persia 2, Snake 4, DarkKobold 3, Man Head 0, Waldo 1
edit: moar addresses
00A3 b u 0 RAM Cursor X
00A4 b u 0 RAM Cursor Y
000C b u 0 RAM
002F b u 0 RAM
003B b u 0 RAM
0042 b u 0 RAM
0066 b u 0 RAM Fade Timer
0 S _ 1
0607 b h 0 RAM
0608 b u 0 RAM
0609 b u 0 RAM
060A b u 0 RAM
060B w u 0 RAM Waldo X
060D b u 0 RAM Waldo Y
060E b u 0 RAM
0 S _ 1
060F b h 0 RAM
0610 b u 0 RAM
0611 b u 0 RAM
0612 b u 0 RAM
0613 w u 0 RAM Scroll X
0615 b u 0 RAM Scroll Y
0616 b u 0 RAM
0617 b u 0 RAM
Lua script used to dump distances at lag frame
Language: nasm
-- Waldo X - (Cursor X + Cam X)
local XDistanceWaldo = memory.read_u16_le(0x60b) - (memory.readbyte(0xa3) + memory.read_u16_le(0x51))
-- Scroll X - (Cursor X - Cam X)
local XDistanceScroll = memory.read_u16_le(0x613) - (memory.readbyte(0xa3) + memory.read_u16_le(0x51))
-- Waldo Y - cursor Y
local YDistanceWaldo = memory.readbyte(0x60d) - memory.readbyte(0xa4)
-- Scroll Y - cursor Y
local YDistanceScroll = memory.readbyte(0x615) - memory.readbyte(0xa4)
local WaldoScrollDiff = math.abs(XDistanceWaldo - XDistanceScroll)
console.log(XDistanceWaldo)
console.log(XDistanceScroll)
console.log(YDistanceWaldo)
console.log(YDistanceScroll)
console.log(WaldoScrollDiff)
Lua script used to dump variations by running the script when you would press the final A to start a level
Language: nasm
local Start = 1500
local End = 1600
local Buttons = {["P1 A"] = true}
local Values = 0xa7
local Cycle = 0
savestate.saveslot(3)
while i < 50 do
savestate.loadslot(3)
while emu.framecount() < End do
if emu.framecount() - Start == Cycle then
joypad.set(Buttons)
end
emu.frameadvance()
end
Cycle = Cycle + 1
console.log(memory.readbyte(Values))
end
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
Thank you again for the work you are putting into this. I think it's important to remember that we have to double back in some levels and keep going in others.
If Waldo is left 100 and scroll is right 100, the total distance is 300 since when we get to Waldo we're now 200 away from the scroll.
If both are in the same direction then only the farthest one matters since we're picking the other one up along the way.
I'm glad you figured out how the variation lock outs actually work.
edit: looks like I failed at math, so I'm currently redumping with correct math. this also affects theoretical fastest strategy in my previous post
Old text
I think my math is OK, just named them a bit confusing regarding my google sheet:
2nd row XDistanceWaldo = memory.read_u16_le(0x60b) + memory.readbyte(0xa3) - memory.read_u16_le(0x51) = Distance from starting camera + cursor X position to Waldo X position
3rd row XDistanceScroll = memory.read_u16_le(0x613) + memory.readbyte(0xa3) - memory.read_u16_le(0x51) = Distance from starting caemra + cursor X position to Scroll X position
If the distance is negative, it's on the left side from starting point, or else right side
edit: yes, as you mention, the following value need to be changed to respect 2 positive values being subtracted. Yeah I think ABS(value-value) should fix that problem.
5th row Waldo + Scroll = The absolute value of the previous two values subtracted
Now that's where I think my math might be faulty. I currently used ABS(value) - ABS(value) but this might be just ABS(value-value) for total number of pixels between the two objects. But I'm confident in the other values/math being OK.
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
Now that's where I think my math might be faulty. I currently used ABS(value) - ABS(value) but this might be just ABS(value-value) for total number of pixels between the two objects. But I'm confident in the other values/math being OK.
The distance between the scroll and Waldo should not actually matter if we're calculating each one from starting the cursor on 0
There are two scenarios at play here. Either the scroll and Waldo are in the same direction or they're in opposite directions.
Same direction example - Persia 1 variation 1:
Waldo (603) and Scroll (147)
As we move right, we hit the scroll at coordinate 147 and we then continue from 147 to 603. We shouldn't be subtracting these numbers since the total travel distance from the cursor start is 603
Opposite direction example - Persia 1 variation 2:
Waldo (-317) and scroll (171)
The cursor is closer to the scroll so we move 171 right to grab it. At this point Waldo was -317 from 0 but we're not at 0 now, we're at 171 so we have to move -488 from our location (-171 to get back to 0 and -317 to Waldo.) In this instance the total distance traveled is 659 (171+488)
Oh thanks, so I need to do something along the lines after renaming that line as "Total distance required":
- 2 positive values: use MAX
- 1 negative 1 positive: ABS(MIN) * 2 + MAX
- 2 negative values: use MIN
I usually not that bad at distance calculations, don't know what was I thinking...
Can you verify my math being ok?
edit: Thanks! I will continue working on this in the following days, just saying.
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
- 2 positive values: use MAX
- 1 negative 1 positive: ABS(MIN) * 2 + MAX
- 2 negative values: use MIN
This should work and cover all relevant scenarios. Y location and distance probably don't matter outside of a very minor fringe case that wouldn't change the outcome of the rankings (but we can look into it if it happens).
Edit: thanks again for diving into this with me!
After truncating the empty space on the input file, I think this comes in at 51.44 51.47 seconds.
For such a short game, it's nice to see new time saves being found and I always find it funny that going slower can make a run faster overall. It's one of those quirks about "seeded" games that is easy to overlook.
I have watched ShesChardcore do RTA speedruns for years on Twitch and am looking forward to more submissions from this author!
And I did overlook it. I've thought it's similar to the previous Waldo game where it's position can be nearly everywhere, while this game only has 5 variations for each level.
ShesChardcore wrote:
Edit: thanks again for diving into this with me!
I'm always happy when I see someone improving a TAS I've made/worked on which I've thought at some time it's the fastest! I mean of course I feel a little shame and don't like to commit mistakes, but that's something part of human life.
Also I like to help new TASers especially if they are doing a great job like you!
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
I picked up a lot of knowledge about the game when I was running it RTA with Overswarm. It was a fun grind. I learned what the game did with the different levels and lockouts but not necessarily why (at the code level) it was doing it.
This has been fun to see it picked apart and whether or not my TAS is approved it's nice that we'll have a road map for the perfect path systematically.
Okay, dumped every variations. Since I couldn't find a way to cheat/freeze address to get variation, I used a joystick (edit: sorry, force of habit. Controller, a simple Logitech Precision G-UG15) to beat the levels. This game is so much easier than the previous Where's Waldo NES game! Especially that I cheated using my sheet. Okay, I admit it, the color palette bug on Man Head did confuse me for a second.
Public sheet link again with bolded column for given level's fastest time (shortest total horizontal distance required to beat given level): https://docs.google.com/spreadsheets/d/1zw1OsULvof_ozyipmykztuWJSefXIX56RqOgKhGKNKw/edit?usp=sharing
Notes:
- Total Distance is the math we talked above this post. So it's not 100% but very close to be correct distance, because first the objects position is Top + Left, so objects will be picked up Waldo's Width many pixels earlier when going from the right and Waldo's Height when going from bottom, same for Scroll. The other thing is when moving to one direction and than the other direction, (edit) could have 2-4 pixel difference because of B and changing direction.
- Camera and cursor speed is the "same" when scrolling the screen, pattern: 2, 4
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
I'm looking at my actual video (which I realized I never uploaded and can be found here) https://youtu.be/87cuwLOHfA4
It looks like my path was 1, 3, 2, 4, 1
603+517+357+685+907 = 3069
These should be the available variations by level with that path:
Persia: 1, 2, 3, 4
Snake: 2, 3, 4
Kobold: 2, 4
Man Head: 0, 1, 4
Waldo: 0, 1, 3, 4
From my testing, Man Head 0 is only 3 frames faster than variation 4 so IIRC I took 4 because it showed up quicker than 0 did when hunting for the level frames.
You are right, this submission uses variation which you wrote, not mine, edited out it from earlier post.
I'm thinking about am I an idiot for writing down the values by hand or I could use some Excel Solver stuffs to go through all possible permutations. Going to think about this.
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
Luckily we're dealing with a very constrained data set. We know we have to start on level 1 as changing the level loses too much time. We know that we only have have 4 possible starting patterns and we know that we need either variation 1 or 2 for the final level.
Snake variation 3 is very valuable since we can't get 0. This was the big time save in my TAS.
Kobold level variation 2 is the best option through the pattern. This locks out variation 2 on the final level so we know what we need (variation 1)
At this point we're at:
Persia
Snake 3
Kobold 2
Man head
Waldo 1
Filling in the blanks - Persia has to be 1 or 4. However we need to get 1 back into the pool for eventually getting it on the Waldo stage. So Persia needs to be 1
Man head needs to be 0 or 4 since 1 is terribly slow. I opted for 4 as mentioned above. So we ended up with 1,3,2,4,1 which makes the most logical sense to me. We can always try to bang it out in excel to cover our bases though.
I will try tomorrow a solver (optimal solution finder) like https://opensolver.org/ which supports google sheet. I guess just a few additional table need to be written out, the time it takes to change a level, the possible variation paths and possible level paths.
I mean I've made enough silly math mistakes that I rather trust in the computer.
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...