Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
http://tasvideos.org/Addresses-40.html Addresses for the latest version of BizHawk should instead use the last 4 digits for the address and set memory region to EWRAM. Example "37D4" instead of 020037D4. Also, I was always curious about the completion percentage, so I went and investigated a bit. The following range from 0x3EA5 to 0x3ED3 turns out all to be the map flags for displaying visited areas on your map. For some reason, even editing them all to 0xFF doesn't affect the percent counter, despite all maps now show. Makes me wonder if something else is responsible for the percent counter. Also, the save file from VBA can be used on BizHawk. :) Edit: Changing 0x3EA2 or 0x3EA3 to 0xFF gives me 18% completion along with warping me to chapter 10 (last one). Also blindly making everything to 0xFF gave 0X3030 - Freezing this allows me to turbo through dialogue. 0x37DA - Floor 0x3DB8 - Flashlight On/Off 0x3DE4 - Frames passed 0x3DE5 - Seconds passed 0x3DE6 - Minutes passed 0x3DE7 - Hours passed 0x3DE8 - Which character I'm using 0x3DE9 - Peppermint candy obtained (1% each, not a binary, 6 total) 0x3DF6 - Water gun capacity 0x3E02 - DJ useable 0x3E03 - Chowder useable 0x3E04 - Jenny useable 0x3E05 - Water balloon capacity 0x3E06 - Water balloons 0x3E07 - Medicine capacity 0x3E08 - Medicine 0x3E09 - Marble capacity 0x3E0A - Marbles 0x3E0B - Camera flash capacity 0x3E0C - Camera flashes 0x3E11 - In order: ??, Bottle 1 Filled, Bottle 2 Filled, Bottle 3 Filled, ?? (0%), Bottle 1 (1%), Bottle 2 (1%), Bottle 3 (1%) 0x3E12 - Current item equipped 0x3E13 - Brass heart part (2% each, 6% total, not a binary) 0x3E14 - Key count 0x3E15 - Music volume 0x3E16 - Sound volume 0x3E17 - Language (Eng/Fr) 0x3E9E - Damage taken by DJ 0x3E9F - Damage taken by Chowder 0x3EA0 - Damage taken by Jenny 0x3EA2 - Event counter (not a binary) 0x3EA3 - ?? Raises percent 0x3EA4 - Hard Mode 0x3EA5 to 0x3ED3 - Visited areas 0x3EE8 is level music and jingle. 0x4730 - In order: Flash dialogue (0%), Marbles dialogue (0%), ??? (0%), Soda dialogue (0%), Candy dialogue (0%), Candy box unlocked (1%); ??? (0%, always cleared on load) 0x4731 - In order: Fuse (3%), Dynamite (3%), Elevator Gear (3%), Walkie-Talkie (1%), Flashlight (1%), Toys tab (0%), ?? (0%), Water dropplet dialogue (0%) 0x4732 - In order: Rover's bone (2%), RC Car (2%), Chicken doll (2%), Boomerang (2%), Chowder's basketball (2%), Skull's action figure (2%), ??? (0%), Ruby key (0%) 0x4733 - In order: Watergun ugrade (DJ 1, 1%), Watergun upgrade (DJ Doombringer, 0%), ?? (0%), Wendy the Dancing Walrus doll (1%), Jenny's wagon (2%), Tricycle (2%), Penguin doll (2%), Bone's kite (2%), 0x4734 - In order: Watergun ugrade (Jenny 1, 2%), Watergun ugrade (Jenny 2, 2%), Watergun ugrade (Jenny 3, 2%), Watergun upgrade (Chowder 1, 2%), Watergun upgrade (Chowder 2, 2%), Watergun upgrade (Chowder 3, 2%), Watergun ugrade (DJ 2, 2%), Watergun ugrade (DJ 3, 2%) 0x4735 - In order: Trash can (1%), Slingshot upgrade (3%), Slingshot (1%), Cold Syrup (1%), Water balloon upgrade (3%), Water balloon (1%), Brass Key (1%), Camera (1%) 0x4736 - In order: Blueprints (F1, F2, F3, F4, Attic, Roof, 0%), Water bottle obtained once (0%), Gold camera upgrade (3%) 0x4737 - Seemingly nothing (0%) In order is from left -> right 0x3E11 is somewhat glitched, so checking off bottle 1 or 2 automatically gives the rest, but the percentage doesn't increase unless you get the others as well The doombringer is lost if the game is saved; saving automatically clears the flag. 0x473F and onward appears to be door/chests/obstacle flags Edit2: Things that don't affect percentage: * Visiting rooms * Opening chests * Getting blueprints * Unlocking doors * Killing the carpet boss * Getting the Doombringer * Getting the Ruby Key I visited 23 rooms and no percent was raised. I did found out that the first time entering the save bathrooms unlocks the ability to save; skipping it makes the rest of the other bathrooms not able to save. Edit3: Percent total 0x3DE9 - 6% 0x3E11 - 3% 0x3E13 - 6% 0x3EA2 - 17% 0x4730 - 1% 0x4731 - 11% 0x4732 - 12% 0x4733 - 10% 0x4734 - 16% 0x4735 - 12% 0x4736 - 3% only 71% :| I believe getting the chocolate and certain other events might raise percent. Only 97%. What the heck am I missing??? Edit4: I was right. 0x3DE9 and 0x3E13, unlike other flags, are treated as an unsigned integer, and the percent is value*1 (or 2 for the brass hearts). Curiously, despite being only a limited amount of each item, the value is not capped other than max integer value, so if a way to either dupe or trick the game into giving me more peppermints/hearts I could technically go over 100%. Finally, it seems 0x3EA2 is an event counter that raises by 1 every time a certain story related objective is completed. I noticed 2 things: 1. You don't have to complete the objectives in order (see any% TAS) 2. Rooms, blueprints and keys don't count for percentage Which means I should be able to skip a number of puzzles and locked doors and still get 100% using the camera glitch. I should also test if the counter can be tricked into reactivating a boss fight. Yes it can, but while the whole room will be locked down, Mrs. Nebbercracker won't respawn, so you'll be stuck. 0x3EA2 values - Changing these affect's the story's progression. 0 - New game 1 - Skipped Chapter 1 2 - Beginning intro scene 3 - Locked at 2nd room 4 - Getting the walkie talkie and activating the trap 6 - Reaching the first bathroom 7 - Unlocking the ability to save 9 - Get the blueprints for F1 and Basement 10 - Entering the basement's dark room for the first time 12 - Getting the flashlight and setting off the trap 13 - Breaking the covered up door 14 - Basement and intro to chapter 2 Chapter 2 15 - Reach the first vent only Jenny can enter (1% increase) 16 - Reach the wall only DJ can climb 17 - Reach the wardrobe only Chowder can push 18 - Pick up the brass key 19 - Open the red door at the first floor lobby (1% increase) Chapter 3 20 - Pick up the F3/Attic blueprints 21 - Reach the blocked door at F4 between 2 mirrors 22 - Chowder gets kidnapped 23 - Break the mirror right after getting the slingshot Chapter 4 24 - Reach the attic 25 - Rescue Chowder from the chairs (1% increase) 26 - Chowder rejoins the team 27 - Reach the elevator room 28 - Reunite with DJ and Chowder after getting the key inside the vents 29 - Obtain the Gear on the Roof 30 - Start the fight with Mrs. Nebbercracker 31 - Defeat Mrs. Nebbercracker (2% increase) 32 - Enter the elavator 33 - Enter the Furnace floor (1% increase) Chapter 5 34 - Push the bookcase south after using DJ to clear the blue/purple blocks at F2 35 - Trigger the carpet to drag the blue chest away at F1 36 - Have the carpet open the door to the basement 37 - Start the carpet boss fight 38 - Skipped 39 - Unlock the door at F1 to reunite with DJ and Chowder 40 - Skipped 41 - Obtain the first piece of Brass Heart 42 - Push the giant switch to face elsewhere (1% increase) 43 - Enter the room with the giant switch in F4 44 - Skipped 45 - Obtain the water pump Chapter 6 46 - Use the water pump and drain the water in Basement 3 (1% increase) 47 - Read the note regarding the water pump 48 - Jenny gets flushed away 49 - Reunite with Jenny 50 - Drain the water to Mrs. Nebbercracker v2's room 51 - Defeat Mrs. Nebbercracker v2 (2% increase) 52 - Get the Trash Can 53 - Get the 2nd piece of Brass Heart Chapter 7 54 - Go to Basement 2 55 - Skipped (3% increase) 56 - Get the 3rd Brass Heart piece 57 - Open the furnace door Chapter 8 58 - Reach the entrance of the final boss 59 - Check the final boss door 61 - Skipped Chapter 9 Escape 62 - Destroy the furnace 63 - Escape Edit5: http://i.imgur.com/6UWFidK.png This peppermint on F3 was never mentioned on the GameFaqs guide for some reason. https://youtu.be/tsMTD84fBno?t=89 method to obtain. Can also be camera glitched. https://youtu.be/2j1ukpaVPFU?t=401 This candy is missed as well. https://www.youtube.com/watch?v=YV-fKYVQZHQ gold camera
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Ok, here's some tricks discovered so far: 1. Walk through obstacles By pressing start right before entering a doorway, the game doesn't load any objects and you can walk pretty much anywhere. To load back the door objects simply move far away from that location then move back. The main problem with this is that the camera gets stuck, and some rooms can't be reloaded. Stairs and empty holes in the ground still work even at this state. 2. Delaying cutscenes Same as above, but need to pause over and over. Also cutscenes and force walk have higher priority than moving through doorways, so if you delayed one of the two, then move to some door, you'll also trigger the walk through obstacles glitch. 3. Skipping the "get water/candy/camera flash" cutscene By grabbing it before another cutscene plays, this will skip the first time dialogue for picking it up. 4. Dealing more damage from throwing objects Normally, the vases/buckets/jars are destroyed as soon as it lands on an enemy. At specific distances, this does not happen, and it instead goes through the enemy, dealing damage more than once. This also works with more than 1 npc, and a very well aimed shot can kill multiple foes with 1 object at the very beginning. After chapter 3 however all npcs have far more health, but this glitch is still useful for dealing damage quickly to more than 1 opponent. 5. Disabling the ability to save By skipping the dialogue inside the first washroom, every subsequent save room cannot be used to save. 6. Get stuck in Mrs. Nebbercracker's room Use the camera glitch to get to this boss early, then activate a past event and come back. The room will now lock up, but the boss fight won't start since the boss is still dead. 7. Get stuck in Mrs. Nebbercracker v2's room By raising the water back up before the 2nd fight, you lock yourself from being able to reenter the water pump room AND the fight won't start. This requires a reset to fix, or immediately walking back to the pump room as soon as the dialogue ends (else the blocking prevents progress). 8. Create tons of objects Using the camera glitch while splitting up with the team with Jenny or DJ, then while alone, activating a cutscene will cause the "missing" 2 other party members to mass spawn. 9. Opening chests while using an item 1. Get in front of a chest 2. Press START 3. Press B 4. Hold R After opening the chest, the character will be able to move. Now any actions will be delayed until the message box is gone. For some reason, it seems items can be used regardless if you still had it or if you had ammo. You can also spray water, but it'll only appear after the dialogue ends. This can lead to crashing. Since the screen's frozen as well, the camera bug somewhat applies, except monsters exists. Note: Does not work on all chests (first chest in game for example). 10. Going OoB via switch room During one of the 3 switch rooms, use the camera glitch to make one of the doors disappear, then walk through. You can now move through walls, and after far enough, press Start and get rid of the menu to have the camera back on you. Oh, and since the new game+ content doesn't apply to the percentage, I think I'll do the 100% at a new file. Edit: So...it seems 100% isn't as simple as get all items then complete x. Since 3 super peppermints (worth 1% each) are dropped by Mrs. Nebbercracker fights, I tried visiting her after changing the value of 0x3EA2 to be at the end. The boss fight won't start. It seems to trigger it the value has to be 30, 50, and whatever the last one is. The carpet boss luckily doesn't have this problem since the value isn't affected by it's defeat, and simply making it higher than 38+ should be able to skip it to grab Jenny's gun upgrade north of that room. The 2nd Nebbercracker would be more annoying, since the closest trigger to it (value 49) is near the beginning of the chapter. TODO: Note down the locations of every single chocolate bar/soda, since the game gives 1% as soon as you get either one for the first time, so knowing the closest ones will be helpful.
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Language: lua

memory.usememorydomain("EWRAM") gui.DrawNew("native") client.setwindowsize(2) --Sets size so that everything fits client.SetGameExtraPadding(0, 0, 0, 20) local peppermints = 0x3DE9 --6%+ total local bottles = 0x3E11 --3% total local brassHeart = 0x3E13 --6% total local events = 0x3EA2 --17% total local candyBox = 0x4730 --1% total local keyItems = 0x4731 --11% total local toys = 0x4732 --12% total local toys2 = 0x4733 -- 10% total local waterguns = 0x4734 --16% total local gear = 0x4735 --12% total + 3% at gear+1 local characters = {'DJ','Chowder','Jenny'} local water = {0x37D0,0x37D2,0x37D4} --Water supply local water2 = {0x3DF6,0x3DF8,0x3DFA} --Water capacity; only updates when gun is upgrade via chest --Checks the bit of 'mem' at position 'pos' and returns 'value' if it's 1 function addFlags(mem,pos,value) if bit.check(mem,pos) then return value else return 0 end end function percent() local percent = 0 --Checks if the player has the peppermints percent = memory.read_s8(peppermints) + percent --Check if the player has all 3 bottles (1% each) percent = addFlags(memory.read_s8(bottles),0,1) + percent --All Bottles are 1% percent = addFlags(memory.read_s8(bottles),1,2) + percent --But getting the 2nd bottle makes the value for the above 0 --Check if the player has a brass heart (2% each) percent = memory.read_s8(brassHeart) * 2 + percent --Check if the player has the Candy box (1%) percent = addFlags(memory.read_s8(candyBox),1,1) + percent --Checks if the player has the following: Fuse (3%), Dynamite (3%), Elevator Gear (3%), Walkie-Talkie (1%), Flashlight (1%) percent = addFlags(memory.read_s8(keyItems),3,1) + percent --Flashlight percent = addFlags(memory.read_s8(keyItems),4,1) + percent --Walkie-Talkie percent = addFlags(memory.read_s8(keyItems),5,3) + percent --Elevator Gear percent = addFlags(memory.read_s8(keyItems),6,3) + percent --Dynamite percent = addFlags(memory.read_s8(keyItems),7,3) + percent --Fuse --Checks if the player has the following: Rover's bone (2%), RC Car (2%), Chicken doll (2%), Boomerang (2%), Chowder's basketball (2%), Skull's action figure (2%) percent = addFlags(memory.read_s8(toys),2,2) + percent --Skull's action figure percent = addFlags(memory.read_s8(toys),3,2) + percent --Chowder's basketball percent = addFlags(memory.read_s8(toys),4,2) + percent --Boomerang percent = addFlags(memory.read_s8(toys),5,2) + percent --Chicken doll percent = addFlags(memory.read_s8(toys),6,2) + percent --RC Car percent = addFlags(memory.read_s8(toys),7,2) + percent --Rover's bone --Checks if the player has the following: Watergun ugrade (DJ 1, 1%), ?? (1%), Wendy the Dancing Walrus doll (1%), Jenny's wagon (2%), Tricycle (2%), Penguin doll (2%), Bone's kite (2%) percent = addFlags(memory.read_s8(toys2),0,2) + percent --Bone's kite percent = addFlags(memory.read_s8(toys2),1,2) + percent --Penguin doll percent = addFlags(memory.read_s8(toys2),2,2) + percent --Tricycle percent = addFlags(memory.read_s8(toys2),3,2) + percent --Jenny's wagon percent = addFlags(memory.read_s8(toys2),4,1) + percent --Wendy the Dancing Walrus doll percent = addFlags(memory.read_s8(toys2),5,0) + percent --Doombringer unlocked; placeholder for this script percent = addFlags(memory.read_s8(toys2),7,1) + percent --Watergun upgrade for DJ --Checks if the player has the following: Watergun ugrade (Jenny 1, 2%), Watergun ugrade (Jenny 2, 2%), Watergun ugrade (Jenny 3, 2%), Watergun upgrade (Chowder 1, 2%), Watergun upgrade (Chowder 2, 2%), Watergun upgrade (Chowder 3, 2%), Watergun ugrade (DJ 2, 2%), Watergun ugrade (DJ 3, 2%) percent = addFlags(memory.read_s8(waterguns),0,2) + percent --Watergun upgrade for DJ percent = addFlags(memory.read_s8(waterguns),1,2) + percent --Watergun upgrade for DJ percent = addFlags(memory.read_s8(waterguns),2,2) + percent --Watergun upgrade for Chowder percent = addFlags(memory.read_s8(waterguns),3,2) + percent --Watergun upgrade for Chowder percent = addFlags(memory.read_s8(waterguns),4,2) + percent --Watergun upgrade for Chowder percent = addFlags(memory.read_s8(waterguns),5,2) + percent --Watergun upgrade for Jenny percent = addFlags(memory.read_s8(waterguns),6,2) + percent --Watergun upgrade for Jenny percent = addFlags(memory.read_s8(waterguns),7,2) + percent --Watergun upgrade for Jenny --Checks if the player has the following: Trash can (1%), Slingshot upgrade (3%), Slingshot (1%), Cold Syrup (1%), Water balloon upgrade (3%), Water balloon (1%), Brass Key (1%) percent = addFlags(memory.read_s8(gear),0,1) + percent --Camera percent = addFlags(memory.read_s8(gear),1,1) + percent --Brass Key percent = addFlags(memory.read_s8(gear),2,1) + percent --Water balloon percent = addFlags(memory.read_s8(gear),3,3) + percent --Water balloon upgrade percent = addFlags(memory.read_s8(gear),4,1) + percent --Cold Syrup percent = addFlags(memory.read_s8(gear),5,1) + percent --Slingshot percent = addFlags(memory.read_s8(gear),6,3) + percent --Slingshot upgrade percent = addFlags(memory.read_s8(gear),7,1) + percent --Trash Can percent = addFlags(memory.read_s8(gear+1),0,3) + percent --Camera upgrade --Checks the story events done if memory.read_s8(events) > 14 then percent = percent + 1 end if memory.read_s8(events) > 18 then percent = percent + 1 end if memory.read_s8(events) > 24 then percent = percent + 1 end if memory.read_s8(events) > 30 then percent = percent + 2 end if memory.read_s8(events) > 32 then percent = percent + 1 end if memory.read_s8(events) > 37 then percent = percent + 2 end if memory.read_s8(events) > 41 then percent = percent + 1 end if memory.read_s8(events) > 45 then percent = percent + 1 end if memory.read_s8(events) > 50 then percent = percent + 2 end if memory.read_s8(events) > 54 then percent = percent + 3 end if memory.read_s8(events) > 57 then percent = percent + 1 end if memory.read_s8(events) > 62 then percent = percent + 1 end gui.text(0, client.screenheight()-42, 'Percent: '..percent) end function miscflags() local y = client.screenheight()-10 gui.text(0, y-18, 'Flags: ') --Checks if the player has obtained the Camera flash at least once if bit.check(memory.read_s8(candyBox),7) then gui.drawRectangle(0, y, 4, 10, 'WHITE', 'WHITE') end --Checks if the player has obtained candy at least once if bit.check(memory.read_s8(candyBox),2) then gui.drawRectangle(5, y, 4, 10, 'RED', 'RED') end --Checks if the player has obtained soda at least once if bit.check(memory.read_s8(candyBox),3) then gui.drawRectangle(10, y, 4, 10, 'GREEN', 'GREEN') end --Checks if the player has obtained marbles at least once if bit.check(memory.read_s8(candyBox),6) then gui.drawRectangle(15, y, 4, 10, 'BLUE', 'BLUE') end --Checks if the player has obtained water at least once if bit.check(memory.read_s8(keyItems),0) then gui.drawRectangle(20, y, 4, 10, 'AQUA', 'AQUA') end --Checks if the player has obtained water bottle at least once if bit.check(memory.read_s8(gear+1),1) then gui.drawRectangle(25, y, 4, 10, 'DARKCYAN', 'DARKCYAN') end --Checks if the player has unlocked the Toys tab if bit.check(memory.read_s8(keyItems),2) then gui.drawRectangle(30, y, 4, 10, 'DARKKHAKI', 'DARKKHAKI') end end function displaypos() local x = (memory.read_u32_le(0xF9D8)+30720)/65536.0 --Adds 30720 for actual X local y = (memory.read_u32_le(0xF9DC)+20480)/65536.0 --Adds 20480 for actual Y gui.text(0, 60, 'X: '..string.format('%.5f',x) ..' Y: '..string.format('%.5f',y)) local char = memory.read_s8(0x3DE8) if char < 3 then -- just in case local supply = memory.read_s16_le(water[char+1]) --Char uses 0,1,2 but lua arrays are 1,2,3 local capacity = memory.read_s16_le(water2[char+1]) gui.text(0, 75, characters[char+1]..'('..supply..'/'..capacity..')') end end while true do percent() miscflags() displaypos() emu.frameadvance() end
Not complete, but posting just in case. Changes: 1. Added more known values 2. Add a quick way to check if the dialogue for obtaining certain consumables has been shown 3. Changed the consumables to a rectangle flag to save space. 4. Added checking if a toy/water bottle has been obtained as well along with positions 5. Added water, characters, more comments, and rearranged the location of displays
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I'm not sure how to proceed. I think I obtained everything, but somehow, I'm still missing 3%. Does anyone know what I may be missing? I tried actually filling the map, but cheats or not it doesn't seem to affect the counter. Same with manually getting all blueprints. Edit: I'm fairly positive 100% is intended to be possible, since the beginning screen changes base on percentage: 0%: 75%: 100%
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
No new updates on the missing 3%, but... Maybe I'm jumping the gun, but I believe I found a method to find the position address. On ERAM, 0xF9D8 seems to be a value 30720 smaller than the X position. I assume it's related to the camera positions, since the addresses before it affect the camera. 0xF9DC appears to be a value 20480 smaller than the Y position. So add 30720 and search that value for the true X position, and similar for Y. Positions seems to be 4 Bytes, Fixed Point 16.16. Unsigned also works is using the above method to find addresses. The addresses after it appears to be horizontal/vertical speed, but changing them doesn't affect me. I need to investigate how NPC memory works since the addresses I found for them only corresponds to X/Y, but not health. Edit: Sample code:
Language: lua

memory.usememorydomain("EWRAM") while true do local x = (memory.read_u32_le(0xF9D8)+30720)/65536.0 --Adds 30720 for actual X local y = (memory.read_u32_le(0xF9DC)+20480)/65536.0 --Adds 20480 for actual Y gui.text(0, 30, 'X: '..string.format('%.5f',x) ..' Y: '..string.format('%.5f',y)) emu.frameadvance() end
It get's out of sync while moving due to how lua updates, and I can't seem to fix it with event.onframeend, so it might still be better to use the RAM watch instead. Edit2:
0x473F and onward appears to be door/chests/obstacle flags
Seems that also includes certain cutscenes and events. 0x4773 is a binary which holds flags for the 3rd Nebbercracker. The doors in the rooms nearby along with the cutscenes triggered are for this. Edit3: https://www.youtube.com/watch?v=FGxI7OPn65Q DoomBringer without Hard Mode. Edit4: It appears I vastly underestimated Chowder's watergun; he's capable of 2HKOing bees and the floor monsters even at the beginning without needing to charge. Charging up can kill later monsters very quickly as well. Edit5: Things that I tried and failed to trick the game to giving me more peppermints: 1. Killing Nebbercracker then pressing Start 2. Killing a latter Nebbercracker before going to a past one 3. Skipping a Nebbercracker, triggering a future event, then come back. 4. Pressing start before a peppermint 5. Using the chest delay glitch Edit6: Each and every single Nebbercracker fight has glitches, but none are abusable for percentage. It turns out Chowder's watergun and waterballoons are VERY powerful; I managed to beat the latter bosses in 30 seconds or less. I'm tempted to improve the current TAS, but I can't seem to find the values for NPC hp, oddly enough. Also, I found out I can't simply camera glitch every room; it turns out for cases like Basement 3, the rooms have such a long "door" that by the time I reach the next room, half of it is already loaded. Worse is that if I tried glitching a different room to inch slowly there, it would either not be enough to unload the doors, or I get stuck (Trying to skip to Nebbercracker v2 for example). Finally, it appears the position address uses a different location when I open interfaces. Which means the script won't help at all if I used the chest glitch unless I update it. Edit7: ToDO: Find if the Thou Art Dead minigame affects percentage. Likely not since the key and DoomBringer doesn't, but I'm running low on ideas. Edit 8: Thou Art Dead minigame score caps at 100,007 if done "legit". Legit as in without editing the score, but allowing say, grabbing the gold axe and freezing 0x30C02 for an hour or so and come back. It remains at 100,007 even after the killing the dragon (which usually hands out 10,000 points). Btw, it also loops over and over after a certain stage. Also it still doesn't affect percentage even after reaching 100,007. Edit 9: Technically says 100,007, but hex is says 9F 86 01
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Viewing the savefile reveals the following: Offset - values from this address 0x02 - Number of bytes from the right save if it overflows 0x03 - Number of bytes from the right save 0x04 - Number of bytes from the left save if it overflows 0x05 - Number of bytes from the left save 0x06 - Number of bytes in this file excluding itself if it overflows 0x07 - Number of bytes in this file excluding itself 0x0B - 0x3E17 (Language (Eng/Fr)) 0x0C - Binary flag for how many save files are there The rest are very long, so I placed on Google docs: https://docs.google.com/spreadsheets/d/1geZ1gV5U3fqSEEmVxeVEbIDEfK8GEVM2xRUdVjIM_DI/edit?usp=sharing I believe offsets 0x4-0x7 are hash values, since changing anything else without changing these make the file unusable. I know that it's related to the above, but there appears to be something else in addition. I'll post more notes as I find out. Edit: Currently known influences to 0x4-0x7: Basically everything listed so far. :| Oh, and hiscore for Thou Art Dead isn't saved. eh. Despite both X and Y are 32 bit addresses and values, the save file ignores the highest and lowest pairs of bytes. Which means it's completely possible to go OoB and somehow save, and the game could potentially disregard it. 0x4-0x7 seems to be the sum of the above. Not sure how having 2 savefiles affect it however.
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Done. Mapped every single address with something in the savefile. It appears this confirms my feeling about something being missed. Even taking account with that seemingly unreachable bottle address's 1% extra, it's still 98% completion.
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Not sure if this may lead to something new, but: https://youtu.be/xdZKVhgGmOM After "Luigi The Best" discovered OoB objects, I went ahead and explored the Basement 3 OoB area by holding A+B after dialogue and drowning. I ended up getting stairs to spawn, and went from Basement 3 -> Roof -> Attic -> Floor 4 -> Floor 3 -> Floor 2 -> Floor 1 -> Basement 1 -> Basement 2 and back into the main game area without using the elevator. I wonder what else could be spawned? Edit: I managed to get Out of Bounds in Basement 1 by holding A+B then falling off the ledge. I'm certain the TAS can be improved now by using this trick to warp to the furnace from Basement 1. There's also invisible objects at the north east corner of the map. Edit2: I can confirm that if you somehow entered the final boss without dynamite, you could still deposit it as if you owned one. Edit3: You can go OoB at the room right before the tongue. Press the switch with Jenny, and if you stand in the right spot you'll be pushed into the garbage pile, allowing you to move OoB. :D
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
http://tasvideos.org/userfiles/info/27445847694358048 Technically not "stuck", since I found out if I went to the furnace, delayed pausing a bit, then unpause, I can spawn a stairwell to appear near me, allowing me to go back to the first floor. Doing this again somehow gets me in bounds, at the room left of Mr. Nebbercracker. Edit: I did it. Sorta. I managed to instead spawn a block, then clip in it and reach the staircase to the Furnace. Now what I had in mind, but it works. This improves the current TAS by 3,000 or so frames now. It's faster than the above trick since it gets to the dynamite section as well. Edit2: It's now obsolete! I managed to finally spawn a set of stairs, and went straight to the dynamite room! :D Edit3: If I tried to go OoB and spawn a stairs or hole to get to another floor during the final boss, it seems to always crash when I enter it.
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Hey, I found out how NPC "HP" is determined! It's the same as the playerable characters; a counter stores damage taken, and subtracts that with their health. If it reaches negative they die. Eg. Say we have a chair. HP value is 0. You shoot using Chowder, dealing 8 damage. Value is now 8. Shoot again, it becomes 16. Once it reaches 72 or higher, it dies. So we can say it has 72 HP. Some notes: Mrs. NebberCracker v1 - 500 damge - Going over 376 damage makes the screen shake, and she becomes invulnerable. Chowder deals the most damage per turn. Carpet boss - 600 Chairs 72 Candle 48 Monster House TV: 120 Lamp: 72 Lamp (pink): 120 Floorboard monster: 24 Floorboard monster (gold): 72 "Wall bugs": 24 "Wall bugs" (purple): 66 "Wall bugs" (gold): 150 Flying books: 6 (It's possible to damage them by having another flying book collide at it while it's rising. This deals 1 damage to it, and you can also shoot at it while rising) Bookcase: 272 Fake door monster: 125 Non enemies: The following all have 77 HP: Cracks in rooms 5, floor 3 confirmed Cracks in rooms 23, floor 3 confirmed Cracks in rooms 6, floor 4 confirmed Door boards in room 4, floor 3 confirmed Door boards in room 5, floor 3 (if you fell down from above)confirmed 78 HP Door boards in rooms 45, basement 1 Door boards in rooms 49, basement 1 -Throwing pots inflict 48 damage. The throw glitch that makes them hit more than once makes it inflict 96 damage. -Pots in certain situations only deal 2 damage (16 with glitch). This includes: Floor 3: -Rooms 21 -Rooms 23 -Rooms 25 -Rooms 26 excludes room 1, 3, 4, 8, 11, 18, 22, 24, 29 Attic: -Rooms 2 -Rooms 3 -Rooms 7 -Rooms 13 -Rooms 19 excludes room 1, 8, 10, 12, 14, 15, 17 Roof: -Rooms 3 -Rooms 12 -Rooms 13 excludes room 5, 14, 19 Note: If they bumped into you, and you dropped a pot/vase on them, that will still deal heavy damage. Only thrown things (including the pot going through it, does 2 damage) -Normal slingshot deals 32 damage, and can hit lamps even if they don't strike at you
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Really really late, but I believe I found the pointer to the player's x/y position: B3D8 B530 Both in EWRAM. If using BizHawk, read one of the address, then subtract that value by 0x02000000 and make the memory region also be for EWRAM. If using VBA, simply read it again. Offset by +0x14 to get X, and +0x18 for Y. The lua script used an address that "mirrors" the X/Y to an extent, but changing it will not affect your position, and fails during OoB. This pointer allows you to change X/Y for testing purposes, and also works OoB. :) ccfc - dialogue box? 2e78 - no idea; softlocks when changed and frozed
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Not sure if this will ever be used, but I just realized the "Hold A+B and respawn" glitch can be used in other places. If you just entered the floor and hold A+B then walk over a hole or water, you'll respawn in coordinates 0,0. Turns out however, holding A+B completely pauses the current position in which you're supposed to respawn in. In other words, if I moved to a corner, then held A+B and walked off a hole, I will respawn in that corner rather than next to the hole. This also applies to literally any place in the floor (eg. hold A+B, then move 5 rooms to a room with a hole, then fall off it. You'll respawn in the first room you started holding A+B in). A limitation of this however is that there's no way to open doors with R if you held A+B. Edit: Would anyone be interested in a all bosses run using glitches?
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
https://www.youtube.com/watch?v=d_3hkYuEvgM https://www.youtube.com/watch?v=jA9fTzuwzjI Following these 2 playthroughs always seems to somehow either 1. Kick me out of bounds as soon as I enter the basement the first time 2. Warp me back to the washroom as soon as I obtain the map and defeat the chairs in the room. After messing around, it appears to be caused by saving in the washroom. This happens on both cores (vba-next, mgba) as well, so I have no idea why this is happening compared to the youtube video guides. Additionally, there seems to be a flag triggered in those videos that prevent Skull from constantly talking to you when you change floors. I need to investigate that, since a seeming change from the videos route causes Skull to constantly talk every floor change. Edit: Skull does not appear to be the room flags. Starting from the washroom: 1. Refuse saving (B or A doesn't matter) 2. Grab key 3. Unlock door in the room east of washroom 4. Glitch to downstairs This fails to warp me. This triggers Skull speech. 1. Refuse saving 2. Skip key 3. Skip unlock door in the room east of washroom 4. Glitch to downstairs This fails to warp me. This triggers Skull speech. 1. Save the game 2. Skip key 3. Skip unlock door in the room east of washroom 4. Glitch to downstairs This warp me. This triggers Skull speech. 1. Save the game 2. Reset the game (or menu and quit) 2. Skip key 3. Skip unlock door in the room east of washroom 4. Glitch to downstairs This does not warp me. This does not trigger Skull speech. Additionally, even after obtaining the flashlight, then backtrack to save and go downstairs, it does not warp me, nor trigger speech. This leads me to believe the runs were potentially spliced. Edit: Double tap sprinted up a stair. Then held B and tried to move up right pass a corner. The game then forced me to walk OoB. This occurred on the roof. This sets the address ptr + 0xB8 to 1, causing movement to get locked until an item is used. I have no idea what situations set this however; during door transitions and cutscenes it remains 0 like everywhere else.
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Trying to investigate the glitch in the gif gave something: 1. Under normal circumstances, the jump status is set when jumping off platforms such as the ground floor balcony at the very first room. 2. If you used cheats to increase your speed, this glitch can also occur, but the address for it is set in a different instruction. 3. This glitch is simply walking upright at the corner of a stairs, yet I can't seem to replicate it on other stairways. I'll assign the 3 cases as A. Glitch B. Cheats C. Jump For A, the value 1 is set at the following trace log line: 0800DB11: 00007008 STRB r0, [r1] For B, the value is set at: 0800DA55: 00007018 STRB r0, [r3] For C, the value is set at: 08004FD5: 00007408 STRB r0, [r1, #16] Curiously, all 3 cases don't share the same code: All 3 cases executes ```08049A7B: 00004708 BX r1 0800D94B: 00002001 MOV r0, #1 ``` But it diverges later at ```0800D967: 0000BC02 POP {r1} 0800D969: 00004708 BX r1``` This is the block segment before the divergence:
08049A77:  0000BC30  POP     {r4,r5}
08049A79:  0000BC02  POP     {r1}
08049A7B:  00004708  BX      r1

0800D94B:  00002001  MOV     r0, #1
0800D94D:  0000E005  B       #+10
0800D95B:  0000B023  ADD     SP, SP, #140
0800D95D:  0000BC38  POP     {r3-r5}
0800D95F:  00004698  MOV     r8, r3
0800D961:  000046A1  MOV     r9, r4
0800D963:  000046AA  MOV     r10, r5
0800D965:  0000BCF0  POP     {r4-r7}
0800D967:  0000BC02  POP     {r1}
0800D969:  00004708  BX      r1  
Case A becomes:
0800DB05:  00000600  LSL     r0, r0, #24
0800DB07:  00002800  CMP     r0, #0
0800DB09:  0000D100  BNE     #+0
0800DB0D:  00002001  MOV     r0, #1
0800DB0F:  00004651  MOV     r1, r10
Glitch here
0800DB11:  00007008  STRB    r0, [r1]
Case B becomes:
0800DA4B:  00000600  LSL     r0, r0, #24
0800DA4D:  00002800  CMP     r0, #0
0800DA4F:  0000D0B6  BEQ     #+-148
0800DA51:  00002001  MOV     r0, #1
0800DA53:  00004653  MOV     r3, r10
Glitch here
0800DA55:  00007018  STRB    r0, [r3]
Case C becomes:
08004F3D:  00000600  LSL     r0, r0, #24
08004F3F:  00002800  CMP     r0, #0
08004F41:  0000D049  BEQ     #+146
08004F43:  00006970  LDR     r0, [r6, #20]
08004F45:  000069B1  LDR     r1, [r6, #24]
08004F47:  0000F030  
08004F49:  0000F8B4
3000 more lines later
0800989F:  0000BCF0  POP     {r4-r7}
080098A1:  0000BC01  POP     {r0}
080098A3:  00004700  BX      r0
08004FD1:  00002001  MOV     r0, #1
08004FD3:  00009909  LDR     r1, [SP, #36]
Set value here
08004FD5:  00007408  STRB    r0, [r1, #16]
Need to investigate what's the common thing that calls all 3, and how does the 1st 2 cases occur. The function that the glitch calls starts at 0800D96B: 0000B5F0 PUSH {r4-r7,LR}
Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Posting it here so it doesn't get lost: The user "quakish" discovered that using the walkie talkie right before a chest or cutscene, you have a very small window where you can pause the game, then select "quit". Upon loading the file again, the event will playback. https://discord.com/channels/692615675369226330/693072038448988258/909107823022067773
Ok to summarize some things about the new glitches. Walkie-talkie glitch is easy and useful. If you are at any point where the character would pickup an item in the hand the moment you press 'r'. Then go into start select walkie-talkie and press b to cancel out into game, and hold a+r to trigger it. Can be used on key chests and key doors. So far I found a improved flashlight skip and first boss skip with it. but could be some more skips. I'll do a video about more detail I think.
Cutscene storage on the other hand... Is very difficult, hardest glitch to do in game. And sadly you only have 1 really try at it. But it is also very powerful. So there are 3 variations on it depending on what type of cutscene: 1. Chest cutscenes: Need to use start before the chest, then time a quick r input at a very precise timing as the game fades back, and directly press start again after, The timing window is very small and made harder by the fact that I think that start input don't work while 'r' is being held down. But if you get it you see see a short bit as the chest start opening, partway, before you get into start menu, then you just use it to quit to menu and load your save, and the cutscene will play after loading back in. 2. Grounded cutscenes: For most of them you have to start a dash at the trigger, then press start before the trigger. This makes it so the dash can go thro the trigger and the cutscene will start playing after the dash ends instead. And after that you just need to get a start input before the cutscene start, and do quit same as before. This works on all grounded cutscenes I think, but some are much much more difficulty to time it on then others, not sure why start inputs sometimes feels easier to get before cutscene starts on some cutscenes triggers compared to others. The cutscene storage can save massive amount of time since we never really have to worry about return trips, and also we don't need to spend keys to get somewhere, they will be returnd The key duplication can only, to my knowledge, be preformed on the first key chest since it has a textbox. And you need to get the save to use it, so that means we have to store it back to the start and redo the first 2 rooms, before we can use the stored key to unlock save. Makes it much less worth while, specially since we don't need that many keys for a run, specially with cutscene storage. But even without we can save a lot of keys to the point that it is only worth going for the fastest keys.
So how is this important? It means finally after all these years, a 100% run can actually be accomplished by getting the brass heart/peppermint 2-3 more times than normal! I realized that however, the only time the 100% screen would be displayed is on reset, so I'm not sure how would the run show it. A big thanks to "quakish" once again for discovering this!