Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I found out this game while searching for games with percentage counters. I started a test run last month, and then started TASing it. I paused on it a bit since I'm busy, but I discovered there was a speedrun of it already on youtube. The run misses tons of tricks, which motivated me to post a WIP and share my discoveries so far. WIP. First 2 medallion pieces obtained. Tricks: 1. Instant acceleration In the platforming stages (not overworld), being in the air immediately makes you move at the fastest speed available. This means most of the time, hopping around is the fastest way to move, since landing also decelerates you. 2. Transitioning the tent faster The transition countdown triggers as soon as you pass a certain point back to the tent. By landing from a jump, you can retain a bit of speed and slide closer to the tent. This ends the stage ~100 frames faster. 3. Corner boosting You can boost horizontally on green blocks and the serpent at the corners of those 2 platforms. 4. Delaying death https://youtu.be/BaKoP8c7eSc Unused, but if you placed a Blubba (the purple bear you bounce on) next to an enemy, and land on the bear at the same frame you die, you can remain alive as long as you jump/move. However, stage objects become uninteractable, so this was not used in the run. 5. Moving away from the wulf If you pressed left and jumped right before you grabbed an item in front of the Wulf, you can move a bit away before said NPC wakes up. This is not always faster however. This area here: initially saves 2 frames doing this, but then due to worse positioning loses 3 frames by the end. 6. Instant death to NPCs https://youtu.be/OP1mKN2_cDI?t=1295 The fan NPCs spontaneously die offscreen when you pause a bit here. 7. Avoiding the Wulf When the Wulf pauses to turn, or stops after jumping up to a platform, he does not harm you. Since (especially later in game) he can run almost x2 faster than you, sometimes, turning back then going forward again in midair will cause him to pause a bit. You can then run away once you land. 8. The Phoenix It takes quite some time in comparison to swtich to phoenix, so it should be used only if it's indeed faster, and the next helpful monster you wish to use is located next to said phoenix menu-wise. One useful application of the phoenix is that it allows you to land from high places without flinching. 9. Manipulating luck The springy enemy is required in the following stages: Lookout Ledge Hobbled Hamlet Viper Vines Industrial Carnage The direction you (and other creatures) you bounce off from is RNG based. The addresses are 0x06D0, 0x0718 in IWRAM. You can manipulate this by jumping. Unfortunately, there's not much places you can really jump differently enough to change the RNG, but 2 places which are "easy" spots is the final jump in the laboratories stages along with the final jump when grabbing the treasure. Changing RNG also potentially changes the lag later, since it appears other things in the background are influenced by RNG, so it may (or may not) be faster. 10. Walking past tornadoes If you get damaged or had just used the pheonix, you can jump into the tornado without being caught. 11. Boosting speed with water puddles You can land from high places without flinching if you land on a puddle. Additionally, the puddle is able to boost your speed above the normal value, so jumping at the very end of the puddle is recommended. It doesn't work if you just got damaged, during the invulnerable phase. Lua script that displays fadeout frame + positions and speed Download sabrewulf.lua
Language: lua

memory.usememorydomain("IWRAM") --[[ Pointer at 0x1418 +0x0 - X pos +0x4 - Y pos +0x20 - pheonix +0x38 - X speed +0x3C - Y speed ]]-- local player = {X = 0, Y = 0, Z = 0, XSpeed = 0, YSpeed = 0, Phoenix = 0, Pointer = 0x1418} local wolf = {X = 0, Y = 0, Z = 0, XSpeed = 0, YSpeed = 0, Pointer = 0x42FC} local area = {[0] = "Campsite Clearing", "River Crossing", "Blown Away", "Blackwyche Swamp", "Outlaw Inn", "Eastern Karnath", "Wishing Well", "Blackwyche Laboratory", "Karnath Canopy", "Tangle Terror", "Lower Karnath Mines", "Overgrown Outpost", "Knightlore Falls", "Upper Karnath Mines", "Tangle Terror Lookout", "Karnath Laboratory", "Torchlight Torment", "Deep Dark Dugout", "Stinky Cavern", "Mining Mayhem", "Lookout Ledge", "Crumble Crevice", "Stranglehold Swamp", "Underwurlde Laboratory", "Stinger Strangle", "Frantic Fissure", "Hobbled Hamlet", "Stinkhorn Swamp", "Rocky Mount", "Viper Vines", "Terror Temple", "Entombed Laboratory", "Snowy Knoll", "Frosty's Grotto", "Shivery Peaks", "Wafty Shaft", "Icy Nook", "Gusty Gully", "Coalhouse Climb", "Knightlore Laboratory", "Flames of Fury", "Ritval Ruins", "Filthy Factory", "Mortar Mountain", "Industrial Carnage", "House on the Hill", "Heavy Metal", "Nightshade Laboratory", "Tumbledown Temple", "Watch Out Below", "Magical Mayhem", "Town and Out", "Wings of Steel", "Craggy Crack", "This Old House", "Imhotep Laboratory", "Rooftop Rampage", "Temple Plains", "Cluster Keep", "Factory Furnace", "Bind Alley", "Firing Squad", "Cobbled Courtyard", "Dragonskulle Laboratory"} local fade_frame = 0 function update(address) local pointer = memory.read_u32_le(address) if pointer > 0x3000000 and pointer <0x4000000> 0 and memory.readbyte(pointer_wolf+0x66) == 3 then --Wolf is present, and also awake wolf.X = memory.read_u32_le(pointer_wolf) --Address pointed by pointer + 0x0 wolf.Y = memory.read_u32_le(pointer_wolf+0x4) --Address pointed by pointer + 0x4 wolf.Z = memory.read_u32_le(pointer_wolf+0x8) --Address pointed by pointer + 0x8 wolf.XSpeed = memory.read_s32_le(pointer_wolf+0x38) --Address pointed by pointer + 0x38 wolf.YSpeed = memory.read_s32_le(pointer_wolf+0x3C) --Address pointed by pointer + 0x3C gui.drawText(0,70,"wolf",null,null,10,null,null) gui.drawText(0,80,"X"..string.format('%.6f',wolf.X/65536.0).." Y"..string.format('%.6f',wolf.Y/65536.0),null,null,10,null,null) gui.drawText(0,90,"SpdX"..string.format('%.6f',wolf.XSpeed/65536.0).." SpdY"..string.format('%.6f',wolf.YSpeed/65536.0),null,null,10,null,null) gui.drawText(0,100,"Z"..string.format('%.6f',wolf.Z/65536.0),null,null,10,null,null) gui.drawText(0,110,bizstring.hex(pointer_wolf),null,null,10,null,null) --Predict when will screen fade if fade_timer > 0 then fade_frame = fade_timer+emu.framecount()+22 --frame ends on 21, but lags 1 frame end gui.drawText(0,120,"Fade frame:"..fade_frame,null,null,10,null,null) end end gui.drawText(0,30,"X"..string.format('%.6f',player.X/65536.0).." Y"..string.format('%.6f',player.Y/65536.0),null,null,10,null,null) gui.drawText(0,40,"SpdX"..string.format('%.6f',player.XSpeed/65536.0).." SpdY"..string.format('%.6f',player.YSpeed/65536.0),null,null,10,null,null) gui.drawText(0,50,"Z"..string.format('%.6f',player.Z/65536.0),null,null,10,null,null) --Pointer for debugging gui.drawText(50,10,bizstring.hex(pointer),null,null,10,null,null) --Frame counter thing that determines end acceleration gui.drawText(0,60,"Frame:"..frame,null,null,10,null,null) if (player.Phoenix > 0) then --Since when wulf appears, you cannot use the pheonix, this shouldn't be able to overlap. Probably. gui.drawText(0,70,"Birb:"..player.Phoenix,null,null,10,null,null) end --lab lift gui.drawText(50,20,memory.read_s8(0x57AA),null,null,10,null,null) end emu.frameadvance() end
Data structure: Referring to IWRAM locations (so 0x03000000 region in vba): 0x1418 - pointer to address for player's location Player struct: Using the value from above add the following for: * +0x0 - X position (fixed point version) * +0x4 - Y pos * +0x8 - Z pos (for overworld) * +0x1C - X (simplified int version) * +0x20 - Pheonix timer * +0x38 - X speed * +0x3C - Y speed 0x42FC - pointer to address for wulf location Wulf struct: Using the value from above, add the following for: +0x0 - X pos +0x4 - Y pos +0x2E (1 byte) - No idea, but turning this to 0 moves camera to it's location +0x38 - X speed +0x3C - Y speed +0x40 (1 byte) - ID +0x41 (1 byte) - Item flag (0 for NPC, 1 for item) +0x63 (1 byte) - Direction +0x66 - Awake? +0x6B (1 byte) - No idea, but turning this to 0 moves YOU to it's location +0xD0 - Next NPC/Object X 0x0190 - frames since last transition 0x0230 - timer for when treasure converts to silver/bronze. Curiously stops at 60,000 even if the other timer can go higher. 0x02C2 - armour bool (64 means you have armour) 0x01A4 - the area id 0x5354 - frames left before fadeout 0x53AE - invincibility after damage? 0x53BA - Treasure state (Gold/Silver/Bronze) 0x57AA - the lab elevator state Edit: Things that affect splicing are: 1. Lag frames can sometimes spontaneously disappear (or appear) later, when you improve an earlier stage. 2. Springy can either eject you left, up or right. In any stage where you have to land on it, a change of 1 frame in the previous stage can affect which direction it bounces. By delaying the tent transition from the previous stage, you can somewhat manipulate the direction. Delaying before entering the stage does not seem to work however. 3. The tent transition speedup trick seems to occasionally fail for whatever reason if spliced in, even if the input appears to be the same. So far, every occurrence of this was "fixed" by modifying the input at the tent, but not sure if this works every single time. Edit 2: https://docs.google.com/spreadsheets/d/1rmYdGHPpAbha9eFiMUP4GPH_kiyfsX6pQKIxo_zVFmc/edit?usp=sharing Google docs for game stages, items, areas, etc.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
The transition countdown triggers as soon as you pass a certain point back to the tent. By landing from a jump, you can retain a bit of speed and slide closer to the tent. This ends the stage ~100 frames faster.
Ok, I investigated this a bit, and it appears there's some kind of frame rule regarding acceleration while falling at the goal area. Every acceleration is followed by 3 frames of 0 speed. When you acceleration appears independent of when you reach the goal. This appears to be the cause of occasional desyncs; a minor improvement that doesn't save time in intervals of 4 frames (taking lag into account) will likely cause a stage latter to desync at the goal post due to landing at speed of 0. I'll try and find what address that frame rule resides. Edit: Appears to be 0x0190 in IWRAM, but it resets to 0 every new stage. Not sure how an improvement from a previous stage affects current stage; need to check something. Edit2: Freezing either 0x06D0 or 0x0718 seems to affect the "RNG" for the springs; They change every frame while I'm in midair in platforming stages, but apparently only several times a second in overworld. Edit3: 0x0190 in IWRAM as each level's frame counter, I made a list of stage's time and fadeout: https://docs.google.com/spreadsheets/d/1CeSEBWXX1q790vkpJCCh2HMvOXCdZSHl4fXRnDQyTeM/edit?usp=sharing Disregarding the labs, the shortest time taken from camp to fadeout is 327 frames, and longest is 361 frames. I think it's possible to make each of them shorter as well.
Player (138)
Joined: 8/27/2004
Posts: 165
Ooh, cool to see you working on it - seems like a good game for a TAS. As far as avoiding the wolf, it seems like in the later stages he can often be tricked to fall into a gap by jumping or briefly letting go of left/right at the right time. If it's a death pit, you don't have to do anything else to avoid him for that level and can just run as fast as possible. It doesn't make sense from a publishable-movies standpoint (since it only exists as part of 100% and that's too repetitive), but I think it would also be really cool to see time-attack mode TAS'd. It's the same levels, but with no story and a very restricted set of animals, plus each level has an ingame timer.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
qqwref wrote:
Ooh, cool to see you working on it - seems like a good game for a TAS. As far as avoiding the wolf, it seems like in the later stages he can often be tricked to fall into a gap by jumping or briefly letting go of left/right at the right time. If it's a death pit, you don't have to do anything else to avoid him for that level and can just run as fast as possible. It doesn't make sense from a publishable-movies standpoint (since it only exists as part of 100% and that's too repetitive), but I think it would also be really cool to see time-attack mode TAS'd. It's the same levels, but with no story and a very restricted set of animals, plus each level has an ingame timer.
Was thinking of doing that for 100%, once I finish the any% and figure out the order to do the sidequests. Btw, are you aware of any tricks for this game outside the ones listed?
Blazephlozard
He/Him
Banned User
Joined: 2/27/2013
Posts: 175
Location: Ohio
Ahhh, you're who commented on my run <3 Great to have such an experienced TASer working on this! I see you already noticed that jumping constantly is fast (I felt like that was the case but it's not very viable real-time except in swamps), and wanting to slide closer to the tent, and of course collecting the item as far left as possible (but that's not always for the best), that's the basics I had in mind for TASing. The Bloater animal buddy seems like it might be kind of fast as well, it floats you upward and can temporarily give you movement speed much faster than running (followed by movement speed much slower). Not sure if there's a good one in the way to grab, though. That's the only animal buddy I remember thinking "this could be faster for some levels in a TAS" The weird way you can despawn the fan enemies sometimes is definitely something to look more into of course! One thing I remember that's worth knowing about and isn't really documented is how the Phoenix works; I think you still have normal invuln frames start whenever you touch an enemy with it. This is important for tornados; you can't walk through tornados with a Phoenix on unless you're currently "invulnerable". This can also matter for getting a bit more invulnerability after it ends. I'd also look for more time-saving oddities in overworld movement, like walking against this slope here: https://youtu.be/OP1mKN2_cDI?t=2112 Did you try despawning the blower on Stranglehold Swamp (final level of world 3)? I tried and was able to despawn him, but not sure yet if it can be faster than using a boomer if done right since it seems to be a lot more picky than the one I do in the run. The magic X position seems to be 834, then I have to wait until the camera fully pans over. The other 3 numbers in this are camera-related, the blower is despawned if I move right from here: https://i.gyazo.com/0fe4470a88c071556241314ec7816125.png It's odd, this doesn't KILL the blower, it only despawns it; no coin comes out, and it'll still be alive if you go left and come back. Unlike the one used in the real-time run, which full on kills them. Aside from that nothing stands out as being improvable, except possibly for a few of the wolf chases where you slowed down, since there's many many ways to avoid the wulf (as qq mentioned).
Player (138)
Joined: 8/27/2004
Posts: 165
jlun2 wrote:
Was thinking of doing that for 100%, once I finish the any% and figure out the order to do the sidequests.
Ah, cool that you're considering 100%! I don't know if there's a writeup on the internet of exactly what you need, but I have one from a few years ago when I was thinking of maybe doing a speedrun. You do need to buy the compass and all animals (what's available differs by vendor, so you probably need to visit each one). If you can't afford the camera the first time you're in the village, it probably makes sense to get it before world 7 and do the photos as you clean up some fetch quests. You don't get more % for finishing a level with a better treasure, but you do need all gold treasures for the challenge mode later, so if a level has an item as its treasure or the chests take too long, you'll need to run through it twice.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I forgot to post this, but here's a basic script that displays a list of the NPCs/Objects and their addresses along with their ID in the stages Download sabre wulf npclist.lua
Language: lua

memory.usememorydomain("IWRAM") --[[ Player pointer at 0x1418 +0x0 - X pos +0x4 - Y pos +0x38 - X speed +0x3C - Y speed ]]-- --[[Wulf Pointer at 0x42FC +0x0 - X pos +0x4 - Y pos +0x2E (1 byte) - No idea, but turning this to 0 moves camera to it's location +0x38 - X speed +0x3C - Y speed +0x40 (1 byte) - ID +0x41 (1 byte) - Item flag (0 for NPC, 1 for item) +0x63 (1 byte) - Direction +0x66 - Awake? +0x6B (1 byte) - No idea, but turning this to 0 moves YOU to it's location +0xD0 - Next NPC/Object X ]]-- local wolf = {X = 0, Y = 0, Z = 0, XSpeed = 0, YSpeed = 0, Pointer = 0x42FC} while true do local pointer_wolf = update(wolf.Pointer) if pointer_wolf ~= nill then NPC1 = pointer_wolf+0xD0 for i=1,0x1c,1 do gotocam = pointer_wolf+(i*0xD0)+0x2E id = pointer_wolf+(i*0xD0)+0x40 goto = pointer_wolf+(i*0xD0)+0x6B gui.drawText(0,30+i*10,bizstring.hex(gotocam).." "..bizstring.hex(goto).. " "..bizstring.hex(id).."("..memory.readbyte(id)..","..(memory.readbyte(id+0x1) > 0 and "Itm" or "Obj")..")" ,null,null,10,null,null) end --[[ debug j = 0x1D gotocam = pointer_wolf+(j*0xD0)+0x2E id = pointer_wolf+(j*0xD0)+0x40 goto = pointer_wolf+(j*0xD0)+0x6B gui.drawText(0,50,bizstring.hex(goto).." "..bizstring.hex(gotocam).." "..bizstring.hex(id),null,null,10,null,null) ]]-- end emu.frameadvance() end function update(address) local pointer = memory.read_u32_le(address) if pointer > 0x3000000 and pointer < 0x4000000 then return pointer-0x3000000 --Minus (0x3000000) since BizHawk memory domains end return nill end
Here's a spreadsheet of IDs for area, objects, npcs, etc. https://docs.google.com/spreadsheets/d/1rmYdGHPpAbha9eFiMUP4GPH_kiyfsX6pQKIxo_zVFmc/edit?usp=sharing The IDs for the areas are from 0x01A4 in IWRAM. I made a very rough playthrough https://drive.google.com/open?id=0B-2O13fpsnI4bGs0Z29XaEpkejQ which beats the game to generate a savefile with the levels already beaten.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Blazephlozard wrote:
Did you try despawning the blower on Stranglehold Swamp (final level of world 3)? I tried and was able to despawn him, but not sure yet if it can be faster than using a boomer if done right since it seems to be a lot more picky than the one I do in the run. The magic X position seems to be 834, then I have to wait until the camera fully pans over. The other 3 numbers in this are camera-related, the blower is despawned if I move right from here: https://i.gyazo.com/0fe4470a88c071556241314ec7816125.png It's odd, this doesn't KILL the blower, it only despawns it; no coin comes out, and it'll still be alive if you go left and come back. Unlike the one used in the real-time run, which full on kills them. Aside from that nothing stands out as being improvable, except possibly for a few of the wolf chases where you slowed down, since there's many many ways to avoid the wulf (as qq mentioned).
Thanks! I haven't managed to succeed, but are you able to despawn the one in "Torchlight Torment" at the start of the stage, and "Deep Dark Dugout" before the Wulf, and "Crumble Crevice" at the bottom section? Eliminating those 3 with this glitch may help save time. Edit: Nevermind, succeed the one in the image. Needed to use X pos + 0x1C for the address and get that to 834 to get it to work. Thanks :) Edit2: If I waited long enough, it despawns and "dies", turning into a coin. Else it does this: Edit3: This appears to waste at least 20 frames, since the Hopper on the block's timing forces me to delay more to avoid him. Also longer time spent landing to get to the treasure.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
http://tasvideos.org/userfiles/info/39187193599645030 My times so far https://docs.google.com/spreadsheets/d/1CeSEBWXX1q790vkpJCCh2HMvOXCdZSHl4fXRnDQyTeM/edit?usp=sharing I finished Mount Knightmore. Some notes: 1. Using Blubba to obtain the pheonix appears to be the fastest, even taking account switching back from the Serpent. 2. Almost every single stage required me to delay going to the camp by a frame or so to transit faster. 3. In Shivery Peaks, there's 4 locations which using Blubba would be faster than jumping up the cliffs, but only I only had 2 Blubbas. The spots I chose appear to be the 2 fastests (saving 85 and 41 frames over jumping without Blubba). 4. The Phoenix was used in Icy Nook to prevent the "hurt" animation when falling off high places. I only had 1 phoenix, so I used it on the first fall. Using it on the 2nd fall doesn't save as much time, so I instead fell on the platform below the beehive. 5. In Gusty Gully, I wasted ~5 frames to preserve the armour. I'm not sure how worth it that would be however. This also affects the Coalhouse Climb stage, since I now have a set of armour by the end. 6. The fan npcs in Gusty Gully would benefit from that disappearing glitch if it could be triggered there. Same applies to the one in Coalhouse Climb. 7. I managed to trigger a glitch where using the phoenix, and jumping at a certain frame allowed me to not get caught by the tornado. Sadly, it seems slower than using Serpent twice.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
http://tasvideos.org/userfiles/info/39187193599645030 My times so far https://docs.google.com/spreadsheets/d/1CeSEBWXX1q790vkpJCCh2HMvOXCdZSHl4fXRnDQyTeM/edit?usp=sharing I finished Mount Knightmore. Some notes: 1. Using Blubba to obtain the pheonix appears to be the fastest, even taking account switching back from the Serpent. 2. Almost every single stage required me to delay going to the camp by a frame or so to transit faster. 3. In Shivery Peaks, there's 4 locations which using Blubba would be faster than jumping up the cliffs, but only I only had 2 Blubbas. The spots I chose appear to be the 2 fastests (saving 85 and 41 frames over jumping without Blubba). 4. The Phoenix was used in Icy Nook to prevent the "hurt" animation when falling off high places. I only had 1 phoenix, so I used it on the first fall. Using it on the 2nd fall doesn't save as much time, so I instead fell on the platform below the beehive. 5. In Gusty Gully, I wasted ~5 frames to preserve the armour. I'm not sure how worth it that would be however. This also affects the Coalhouse Climb stage, since I now have a set of armour by the end. 6. The fan npcs in Gusty Gully would benefit from that disappearing glitch if it could be triggered there. Same applies to the one in Coalhouse Climb. 7. I managed to trigger a glitch where using the phoenix, and jumping at a certain frame allowed me to not get caught by the tornado. Sadly, it seems slower than using Serpent twice. Edit: 8. The run desyncs on BizHawk 1.12.2 and 1.13.0 at the Lower Karnath Mines, so I'll sync it back first. Edit 2: Fixed the file. Lost 1 frame in Frosty's Grotto for some inexplicable reason. I also fixed the google sheet times to make it more consistent regarding when does it count as reaching the camp. 9. It turns out for going to the docks from Knightlore, it's faster to backtrack to the map guy and get warped to Blackwyche Village then move south rather than walk through Knightlore Valley. 10. I accidentally clipped into the middle fire barrel in Flames of Fury at the section with 3 barrels in a row. Doesn't save time, but hey it's a glitch. 11. The puddles in Ritval Ruins are interesting. If you haven't gotten hurt yet and became "slippery", then stepping on a puddle speeds you up every frame you're on it. Else it acts as "normal" flooring. Unfortunately, I cannot stall this by jumping, but at least each puddle can potentially act as a minor speed boost.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Does anyone know how the type of creatures a store stocks is determined? For instance, the store in Blackwyche Village. On one savestate, it stocks Blubba, Serpent, Sucker, Club and Golem. On another state, it instead stocks Blubba, Serpent, Boomer, Club and Golem. In both states, they were derived from the movie file I uploaded, so I know for certain I never bought anything yet. I know things like the compass, camera, and armour disappears once you buy it, but when I bought say, Boomer then left and reenter the shop, it still lists Boomer, but as sold. What do I do to change it to display Sucker instead? Same applies to other shops.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
For the labs, since the goal is to get to the top of the place, placing Blubba at the top of you, then jumping up to reach it would be faster than placing it on the floor. This ends up saving 60-100 frames per lab, so I'm going to restart a bit. http://tasvideos.org/userfiles/info/39788339582314062 The previous WIP, up to Nightshade Laboratory. While resycning, I also managed to apply that trick to Torchlight Torment. This does not apply however if the goal is horizontal distance, hence for places like Knightlore Falls it's still faster to place Blubba on the floor. For the labs, when the elevator gets triggered, 0x57AA in IWRAM gets set to 1, so I'll use that for timing from now on. Edit: I saved 3 frames in Deep Dark Dugout, but then lost it all at the transition. Gonna check what else to do. Messed around a bit and saved 5 frames. Also Lookout Ledge desynced at the spring due to different RNG. Rip. Edit 2: Saved 4 frames in Lookout Ledge but then for some reason it took 3 frames longer to recover from the fall. I saved 4 frames in Underwurlde Laboratory, and 18 frames in Frantic Fissure. Now I desynced in Hobbkled Hamlet again. Edit 3: Forgot to implement a minor trick involving using Blubba to trigger the falling pigs. I will try doing that after the temple stages. Edit 4: Does not work in Crumble Crevice; the first piggy is too far away to save time, and the last 2 are too close to me. Nor does it seem to apply to Rocky Mount, since the pig is too close to the crumbly platform. It's also too close to me at Icy Nook. While this may be a letdown, at least I can confirm the run seems fine for now.
Blazephlozard
He/Him
Banned User
Joined: 2/27/2013
Posts: 175
Location: Ohio
Ah, I forgot about this, I'll be sure to watch the submission and see if I notice anything that I feel could be faster (since improving levels is relatively pain-free). Right now I'll just look through your notes here... A Blubba to get the Phoenix bag? That sounds fun and dangerous, good thinking to save menu and placement time. I'm not sure I ever thought to use Phoenixes to prevent hurt animations, that sounds neat! I could try to do the despawn glitch at more locations, but, I'd assume you already tried pretty thoroughly where it would be useful; the info I gave about the Stranglehold Swamp one is the most I know about it, seeming to require a pixel-perfect Sabreman location as well as letting the camera fully finish panning. Yeah, using puddles as often as possible is good (it's especially neat how you can touch a mid-air one from below and get the speedup still, if I recall) I don't have any memory of stores stocking different things randomly, but it's been a long time since I cared (esp. since I never did a non-any% speedrun). My only guess is, Blackwhyce is town 1, right? Was the Sucker shop from a state later on? Perhaps the stock changes when you get later in the game. I seem to recall shops sharing stock as well (Like, store 2 might be selling the same Serpent as store 1, but drop Blubba for something else). Just faint memories here though.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Blazephlozard wrote:
I could try to do the despawn glitch at more locations, but, I'd assume you already tried pretty thoroughly where it would be useful; the info I gave about the Stranglehold Swamp one is the most I know about it, seeming to require a pixel-perfect Sabreman location as well as letting the camera fully finish panning.
Please do if you have time; I probably miss some given the fact I missed the note on speedup. Also I've been thinking on how to record the times for Silver/Bronze treasures, so I made a script that checks the times and state of said treasure: Download sabre wulf treasure.lua
Language: lua

memory.usememorydomain("IWRAM") local area = {[0] = "Campsite Clearing", "River Crossing", "Blown Away", "Blackwyche Swamp", "Outlaw Inn", "Eastern Karnath", "Wishing Well", "Blackwyche Laboratory", "Karnath Canopy", "Tangle Terror", "Lower Karnath Mines", "Overgrown Outpost", "Knightlore Falls", "Upper Karnath Mines", "Tangle Terror Lookout", "Karnath Laboratory", "Torchlight Torment", "Deep Dark Dugout", "Stinky Cavern", "Mining Mayhem", "Lookout Ledge", "Crumble Crevice", "Stranglehold Swamp", "Underwurlde Laboratory", "Stinger Strangle", "Frantic Fissure", "Hobbled Hamlet", "Stinkhorn Swamp", "Rocky Mount", "Viper Vines", "Terror Temple", "Entombed Laboratory", "Snowy Knoll", "Frosty's Grotto", "Shivery Peaks", "Wafty Shaft", "Icy Nook", "Gusty Gully", "Coalhouse Climb", "Knightlore Laboratory", "Flames of Fury", "Ritval Ruins", "Filthy Factory", "Mortar Mountain", "Industrial Carnage", "House on the Hill", "Heavy Metal", "Nightshade Laboratory", "Tumbledown Temple", "Watch Out Below", "Magical Mayhem", "Town and Out", "Wings of Steel", "Craggy Crack", "This Old House", "Imhotep Laboratory", "Rooftop Rampage", "Temple Plains", "Cluster Keep", "Factory Furnace", "Bind Alley", "Firing Squad", "Cobbled Courtyard", "Dragonskulle Laboratory"} local silver = 0 local bronze = 0 local prev = 0 while true do local state = memory.read_s8(0x53BA) local timer = memory.read_u32_le(0x0230) local map = memory.read_s8(0x01A4) gui.drawText(0,30,area[map],null,null,10,null,null) gui.drawText(0,40,"State "..state,null,null,10,null,null) gui.drawText(0,50,"Time "..timer,null,null,10,null,null) gui.drawText(0,60,"Silver: "..silver.."Bronze: "..bronze) gui.drawText(0,70,"Prev: "..prev) if area[map] ~= nil and state > 0 then if prev ~= state then if state == 2 then silver = timer end if state == 3 then bronze = timer end prev = state end end if state == 0 then silver = 0 bronze = 0 prev = 0 end emu.frameadvance() end
I ran this on every stage, and got these frames https://docs.google.com/spreadsheets/d/1rmYdGHPpAbha9eFiMUP4GPH_kiyfsX6pQKIxo_zVFmc/edit?usp=sharing See the "Treasure" sheet for the times. Gold is worth 50GP each, silver 35GP, and bronze 20GP. Buying one of everything from the store costs 5600GP however. Additionally, some of the treasure only appear the 2nd time you play through the stage, so that makes it only 40 stages worth of gold, or 2000GP. Where would I get the rest of 3600GP? One good thing at least is that this leaves 16 stages where I can ignore the timer, since there's no treasure there for the first run of it.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I just realized a problem for the first set of stages. 1. You really want to buy the camera before the Karnath Jungle, since its needed for a sidequest. 2. It seems shop stocks don't exactly "change" just by leaving and reentering, so chances are, I'm going to be forced to visit at least every shop once to get everything (n eed to recheck). 3. Entering a shop takes time, so its not recommended to buy from the same store twice. Which means I need to somehow get enough cash to buy everything from Blackwich in 1 visit. Naively, I'd simply redo the first stage several times (or the first treasure stage), but even the shortest one (Blown Away) takes 1000+ frames per attempt, and that'd only give 40gp/gold. I also need to take account the chests that respawn and give an extra 10 coins to utilize as much of the stage as possible (ignoring coins from running away, since that's 1gp). Gonna have to check which stage to grind. Edit: At the very least, check if it is possible to get everything in a stage in 1 attempt without buying anything.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
While testing to see if it's possible to obtain everything in 1 go, I managed to got through a platform using Bloater: Link to video I have no idea why it works here, and no where else so far. If it can be done elsewhere such as Mortar Mountain, it may be worth obtaining Bloater for any%. Any help on investigating this would be helpful. I also checked stages up to Mortar Mountain and can confirm everything so far can be obtained in 1 pass of the stage, without buying anything from stores. Edit: http://tasvideos.org/userfiles/info/46515602174076637 Every single item can be collected in 1 pass. This ends with 74.5% of the game completed. No sidequests were done, and the store was unused. I obtained 40 gold treasures, and 8 keys. This gives 2000 GP + however many you get from keys. I need 5600 GP however for 100% completion.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
100% things: * Completing the orchid post-credits triggers the credits again. ** Completing the orchid pre-credits however, just allows you to view the marriage after the final stage is completed * You can start the miniquest even without ever talking to the marriage guy * Every item counts towards % * Unlocking bonus stages does not count toward %; you have to actually beat them Blue orchid route 1. Cookie's Shop (Obtain Camera; costs 200 GP) 2. Photography Shop (Allows you to take photos) 3. The Campsite (Photo 1) 4. Karnath Jungle (Photo 2) 5. Entombed Swamp (Photo 3) 6. Mount Knightlore (Photo 4) 7. Blackwyche Docks (Photo 5) 8. Nightshade Mining Company (Photo 6, 7) 9. Temple of Imhotep (Photo 8) 10. Dragonskulle Town (Photo 9, 10) 11. Photography Shop (Obtain orchid) Purple orchid route 1. Nightshade Mining Company (Starts miniquest; Obtain Map) 2. Underwurlde Mines 3 (Obtain orchid) Red orchid route 1. Library (Starts miniquest) 2. Blackwyche Docks 3. Outlaw Inn (Obtain Cake) 4. Blackwyche Docks (Obtain Fish) 5. Library (Obtain Shrunken head) 6. Temple of Imhotep (Obtain orchid) White orchid route: 1. Mount Knightlore (Starts miniquest) 2. Entombed Swamp (Request to get cage) 3. Karnath Jungle (Obtain cage; cost 20 GP) 4. Entombed Swamp (Obtain fur suit) 5. Mount Knightlore (Obtain orchid) Yellow orchid route: 1. Dragonskulle Town (Obtain Parcel; Starts miniquest) 2. Knightlore Valley 3. Library (Obtain orchid) Cow Costume route 1. Mount Knightlore (Obtain Mayor's key) 2. Town Hall (Obtain Costume) 3. Blackwyche Docks (Obtain 1000 GP) Bonus Rooms location 1. Town Hall 2. West Blackwyche 3. Woody's Shack 4. Knightlore Valley 5. Entombed Hovel 6. Nightshade Office 7. Temple of Imhotep 8. Town House (House that connects Nightshade with Dragonskulle) GP: +1000 from cow costume miniquest +2000 from 40 gold treasure +800 from redoing story stages to unlock challenge mode +100 from Bonus Room (Town Hall) collect 15 stars +100 from Bonus Room (Woody's Shack) collect 20 stars +100 from Bonus Room (West Blackwyche) collect 25 stars +100 from Bonus Room (Knightlore Valley) collect 30 stars +100 from Bonus Room (Entombed Hovel) collect 35 stars +100 from Bonus Room (Nightshade Office) collect 40 stars +100 from Bonus Room (Temple of Imhotep) collect 45 stars +100 from Bonus Room (Town House) collect 50 stars -20 from white orchid miniquest -200 from blue orchid miniquest -50 from buying a compass (counts towards %) -5600 from buying creatures This gives a deficit of 1270 GP. About 1000 of that could probably be obtained while being chased by the Wulf. Edit: https://docs.google.com/spreadsheets/d/1kenEN4icwW_51a-LWA4zKAuXvg5vhEFsQkViVglSlTU/edit?usp=sharing Completing every single platforming stage gives 74.50% completion. The tasks about gives 19.90%. This means 94.40% of the game. Edit2: Challenge Mode appears to be 0.1% each. Edit 3:For the creature shop route: 1. Blubba only appears in 1st town, and I need camera as well, so buy those there 2. Serpent appears only in first 2 towns, so that must be bought at 2nd area since I dont have enough money at start 3. Sucker, Club, Boomer, Sticky do not appear at latter stages, so those must also be bought with Serpent 4. Phoenix and Wizard appear only at last area, so those and 3 others must be bought at said area 5. The remaining can be bought at one of the last 3 areas (since Misti only appears at last 3) Came up with this plan.
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
So while playing casually, I accidentally skipped the cutscene for grabbing the medallion: https://youtu.be/v3O67XmmNNI It appears to be due to the fact the timer ended as soon as I left, causing it to skip the cutscene. Not sure if it's applicable in real time, but there's a 15 frame window to do this. Edit: This can only be done once, since subsequent times don't give the timer end dialogue. Applying it in the following saves: Blackwyche Laboratory 318 frames Karnath Laboratory 202 frames
Skilled player (1738)
Joined: 9/17/2009
Posts: 4980
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
So apparently, in order to unlock all stages for challenge mode, you have to beat the story stages twice for it to be available in challenge mode. At least this means more chances for GP. That still only gives 800 GP however, but at least it lowers the amount needed from other sources to 1270. Completing the story stage again does not seem to affect the % counter at least. Edit: In most areas, the loading zone doesn't exist until you have the requirements. For The Campsite's loading zone to Blackwyche Village and Entombed Swamp's loading zone to Mount Knightlore, they exist, but for the latter, it won't have any stages appear. You can pass through these platforms if you somehow go fast enough vertically: There's a walkable, invisible platform on the top right corner of Entombed Laboratory.
Player (138)
Joined: 8/27/2004
Posts: 165
I just finished a low-optimization run of 100%, which you can see at User movie #638166865030533079. Encode: Link to video I extensively used the info from this thread, so thanks a lot jlun2! I lost a few minutes collecting chests that were near my way, because it turns out you can get enough coins in the levels without losing time, especially with the chain/hit system which seems to give you at least 2 coins per thing you destroy on your way to the Wulf. To make an optimized TAS, you would also want to understand RNG better for things like shop contents (I had to go to one more shop than I wanted for the Drooler) and bonus levels, as well as look into the level-end transitions, and test out a lot of route options since many more animals are available. Fun fact, selling treasure doesn't actually give you the same amount for every shop. It's 50G for the first two shops, then 45G for two, 40G for two, and 35G for the last two. Really weird since you can just warp to the first shop for 10G.