Posts for jlun2

Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
You can punch 256-byte sized "0x00 holes" into a savegame that was filled with 0xFF - by copying, delete & hard-reset, copy& hard-reset - and come out with the correct checksum. That's because the checksum is only 1 byte and overflows (The checksum plus 0x256 is the same value).
Nice. Does this also occur for the latter Mario & Luigi games?
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I decided to investigate addresses again. Turns out battles also move around. There are 2 IDs First one can be values at 0, 1, 2, 255 Second one ranges from 0 to 68. First ID means if it's the player, or npc. 0 = Harry 1 = Hermione 2 = Ron 255 = NPC List of npcs and areas here https://docs.google.com/spreadsheets/d/196AiBW0Mi_z_8V6ZsxTuXqWkpQGUyHCaEuziBEyWhmM/edit?usp=sharing I updated the script, incomplete, to add battle. Will edit this post. Download Harry3.lua
Language: lua

client.SetGameExtraPadding(0, 0, 200, 100) console.clear() local text local read8 local read16 local read32 if vba then text = text read8 = memory.readbyteunsigned read16 = memory.readwordunsigned read32 = memory.readlongunsigned else text = gui.pixelText memory.usememorydomain("System Bus") read8 = memory.read_u8 read16 = memory.read_u16_le read24 = memory.read_u24_be read32 = memory.read_u32_le end local Addresses = { Harry_pointer_x = 0x03002118, Battle_pointer = 0x030024E8, Lumos_pointer1 = 0x03001C0C, --only when not cast; value + 0x80 Lumos_pointer2 = 0x03001C1C, --only when cast; value + 0x80 Harry_SP = 0x030024F4, Harry_MP = 0x030024F6, Harry_XP = 0x030024F8, --XP to next level Harry_Level = 0x030024FA, Harry_Spells_Unlocked = 0x030024FB, --What tier of spell unlocked Harry_Flipendo_Level = 0x030024FC, Harry_Informus_Level = 0x030024FD, --doesnt normal go above 1 Harry_Vermdimillous_Level = 0x030024FE, Harry_Diffindo_Level = 0x030024FF, --doesnt normal go above 1 Harry_Incendio_Level = 0x03002500, Harry_Wingardium_Level = 0x03002501, --doesnt normal go above 1 Harry_Petrificus_Level = 0x03002502, --doesnt normal go above 1 --How many times cast. Duo counts as 2 Harry_Flipendo_XP = 0x03002506, Harry_Vermdimillous_XP = 0x03002508, Harry_Incendio_XP = 0x0300250A, Harry_Petrificus_XP = 0x0300250C, Harry_Max_SP = 0x03002510, Harry_Max_MP = 0x03002512, Harry_Agility = 0x03002516, Harry_Defense = 0x0300251A, Harry_Magic_Defense = 0x0300251B, Hermione_SP = 0x0300253C, Hermione_MP = 0x0300253E, Hermione_XP = 0x03002540, --XP to next level Hermione_Level = 0x03002542, Hermione_Spells_Unlocked = 0x03002543, --What tier of spell unlocked Hermione_Flipendo_Level = 0x03002544, Hermione_Informus_Level = 0x03002545, --doesnt normal go above 1 Hermione_Vermdimillous_Level = 0x03002546, Hermione_Incendio_Level = 0x03002548, Hermione_Wingardium_Level = 0x03002549, --doesnt normal go above 1 Hermione_Petrificus_Level = 0x0300254A, Hermione_Glacius_Level = 0x0300254B, Hermione_Fumos_Level = 0x0300254C, --How many times cast. Duo counts as 2 Hermione_Flipendo_XP = 0x0300254E, Hermione_Vermdimillous_XP = 0x03002550, Hermione_Incendio_XP = 0x03002552, Hermione_Petrificus_XP = 0x03002554, Hermione_Glacius_XP = 0x03002555, Hermione_Fumos_XP = 0x03002556, Ron_SP = 0x03002584, Ron_MP = 0x03002586, Ron_Level = 0x0300258A, --What tier of spell unlocked Ron_Flipendo_Level = 0x0300258C, Ron_Informus_Level = 0x0300258D, --doesnt normal go above 1 Ron_Vermdimillous_Level = 0x0300258E, Ron_Incendio_Level = 0x03002590, Ron_Wingardium_Level = 0x03002591, --doesnt normal go above 1 Ron_Petrificus_Level = 0x03002592, Ron_Spongify_Level = 0x03002595, --doesnt normal go above 1 --How many times cast. Duo counts as 2 Ron_Flipendo_XP = 0x03002596, Ron_Vermdimillous_XP = 0x03002598, Ron_Incendio_XP = 0x0300259A, Ron_Petrificus_XP = 0x0300259C, Damage_dealt = 0x0300274A, Story = 0x030027B9, Sickles = 0x03003180, Wiggenweld_Potion = 0x030037E8, Area = 0x03003B50, Game_State1 = 0x03003EF4, Game_State2 = 0x03003F18, Overworld_Spell = 0x0304338F } local Harry = {ptr = 0x03002118, x = 0x000000, y = 0x000000, lumos = 0x000000} local Battle = { Address = {0,0,0,0,0,0}, Is_NPC = {0,0,0,0,0,0}, ID = {0,0,0,0,0,0}, SP = {0,0,0,0,0,0}, MP = {0,0,0,0,0,0}, Level = {0,0,0,0,0,0}, Max_SP = {0,0,0,0,0,0}, Max_MP = {0,0,0,0,0,0}, Flipendo_Multiplier = {0,0,0,0,0,0}, Incendio_Multiplier = {0,0,0,0,0,0}, Verdimillious_Multiplier = {0,0,0,0,0,0}, Wingardium_Multiplier = {0,0,0,0,0,0}, Glacius_Multiplier = {0,0,0,0,0,0}, Diffindo_Multiplier = {0,0,0,0,0,0}, Status = {0,0,0,0,0,0}, Status_Meter = {0,0,0,0,0,0} } local NPC = { [0] = 'Ruby Fire Crab', [1] = 'Emerald Fire Crab', [2] = 'Sapphire Fire Crab', [3] = 'Cornish Pixie', [4] = 'Rat', [5] = 'Albino Rat', [6] = 'Plague Rat', [7] = 'Clabbert', [8] = 'Suit of Armor (Footman)', [9] = 'Suit of Armor (Cavalier)', [10] = 'Suit of Armor (Paladin)', [11] = 'Suit of Armor (Squire)', [12] = 'Suit of Armor (Swordsman)', [13] = 'Suit of Armor (Crusader)', [14] = 'Suit of Armor (Knight)', [15] = 'Funnelweb Spider', [16] = 'Brown Recluse Spider', [17] = 'Large Spider', [18] = 'Redback Spider', [19] = 'Giant Spider', [20] = 'Cocoon Spider', [21] = 'Whitetail Spider', [22] = 'Flobberworm', [23] = 'Snail', [24] = 'Large Orange Snail', [25] = 'Flailtail Snail', [26] = 'Bat', [27] = 'Fruitbat', [28] = 'Mortis Bat', [29] = 'Dragonfly', [30] = 'Imperial Dragonfly', [31] = 'Horklump', [32] = 'Snake', [33] = 'Spitting Snake', [34] = 'Wasp', [35] = 'Tarantula Hawk Wasp', [36] = 'Bowtruckle', [37] = 'Oaken Bowtruckle', [38] = 'Doxy', [39] = 'Doxy Queen', [40] = 'Hinkypunk', [41] = 'Gytrash', [42] = 'Grindylow', [43] = 'Red Cap', [44] = 'Armored Red Cap', [45] = 'Salamander', [46] = 'Amazonian Salamander', [47] = 'Peruvian Salamander', [48] = 'Charmed Skeleton', [49] = 'Jinxed Skeleton', [50] = 'Tree Frog', [51] = 'Wide-mouth Toad', [52] = 'Bullfrog', [53] = 'Flesh-eating Slug (not in game, needs to be in file for coders - no need to translate)', [54] = 'Whomping Willow', [55] = 'Forest Troll', [56] = 'River Troll', [57] = 'Venemous Tentacula', [58] = "The Monster Book of Monsters'", [59] = 'Giant Rat', [60] = 'Crabbe', [61] = 'Draco', [62] = 'Goyle', [63] = 'Lupin Werewolf', [64] = 'Snake', [65] = 'Brown Recluse Spider', [66] = "The Monster Book of Monsters'", [67] = "The Monster Book of Monsters'", [68] = 'Native of Fiji. Has a heavily jeweled shell.' } local Is_NPC = {[0] = "Harry", "Hermione", "Ron", "Buckbeak", [255] = "Yes"} local Story = { [0] = "Talk to Cornelius Fudge", [1] = "Find Harry's room", [2] = "Greet the Weasleys", [3] = "Talk to Tom", [4] = "Find the Rat Tonic", [5] = "Deliver the Rat Tonic to Ron", [6] = "Find Scabbers", [7] = "Find Crookshanks", [8] = "Leave the cellar", [9] = "Find your seat", [10] = "Find Trevor", [11] = "Block the doors", [12] = "Find chocolate", [13] = "Find the conductor", [14] = "Find the Gryffindor common room", [15] = "Go to Transfiguration class", [16] = "Find McGonagall", [17] = "Go to Care of Magical Creatures class", [18] = "Find the five escaped books", [19] = "Go to Potions class", [20] = "Find the five potion ingredients", [21] = "Return the ingredients to Snape", [22] = "Go to the staff room", [23] = "Go to the Gryffindor common room", [24] = "Find Scabbers", [25] = "Find the Fat Lady", [26] = "Go to Defense Against the Dark Arts class", [27] = "Go to the library", [28] = "Find the five book pages", [29] = "Return to Defense Against the Dark Arts class", [30] = "Go to the Gryffindor common room", [31] = "Go to Hagrid's hut", [32] = "Go to the library", [33] = "Find Hermione", [34] = "Go to the Great Hall", [35] = "Go to Professor Lupin's office", [36] = "Go to the Gryffindor common room", [37] = "Go to the Gryffindor boy's dormitory", [38] = "Go to the Gryffindor common room", [39] = "Go to the Gryffindor boy's dormitory", [40] = "Go to the Entrance Hall", [41] = "Return to the Gryffindor common room", [42] = "Go to the Gryffindor boy's dormitory", [43] = "Find Ron and Hermione", [44] = "Go to Hagrid's hut", [45] = "Go to the Whomping Willow", [46] = "Find the path beneath the Whomping Willow", [47] = "Follow the path to the Shrieking Shack", [48] = "Return to Hogwarts", [49] = "Walk to the lake", [50] = "Take the secret path to Hagrid's hut", [51] = "Go to Hagrid's hut", [52] = "Go back to the lake", [53] = "Go to the Hogwarts rooftop", [54] = "Speak to the Weasleys", [55] = "Find Ron", [56] = "Return to Lupin", [57] = "Rescue Sirius Black", [58] = "Find the book on Hippogriff-baiting", [59] = "Flipendo", [60] = "Informus", [61] = "Vermdimillous", [62] = "Diffindo", [63] = "Incendio", [64] = "Wingardium Leviosa", [65] = "Petrificus Totalus", [66] = "Glacius", [67] = "Fumos", [68] = "Spongify", [69] = "Uno", [70] = "Duo", [71] = "Tria", [72] = "Harry casts a spell:", [73] = "Hermione casts a spell:", [74] = "Ron casts a spell:", [75] = "Buckbeak attacks!", [76] = "Harry performs a Special Move:", [77] = "Hermione performs a Special Move:", [78] = "Ron performs a Special Move:", [79] = "Harry uses a potion:", [80] = "Hermione uses a potion:", [81] = "Ron uses a potion:", [82] = "Harry is poisoned.", [83] = "Hermione is poisoned.", [84] = "Ron is poisoned.", [85] = "Buckbeak is poisoned.", [86] = "Harry is paralyzed.", [87] = "Hermione is paralyzed.", [88] = "Ron is paralyzed.", [89] = "Buckbeak is paralyzed.", [90] = "Harry can't move.", [91] = "Hermione can't move.", [92] = "Ron can't move.", [93] = "Harry can move again!", [94] = "Hermione can move again!", [95] = "Ron can move again!", [96] = "Buckbeak can move again!", } local Area = { [0] = "Defence Against the Dark Arts Classroom", [1] = "Potions Classroom", [2] = "Potions Classroom Maze", [3] = "Transfiguration Classroom", [4] = "Transfiguration Classroom Maze", [5] = "Hogwarts Express - Baggage Car", [6] = "Hogwarts Express - Passenger Car", [7] = "Hogwarts Express - Buffet Car", [8] = "Hogwarts Grounds - Castle Doors", [9] = "Hogwarts Grounds - Boathouse", [10] = "Hogwarts Grounds - Greenhouses", [11] = "Hagrid's Hut", [12] = "Hagrid's Garden Maze", [13] = "Hogwarts Grounds - Lake", [14] = "Path to Hagrid's Hut", [15] = "Hogwarts Grounds - Whomping Willow", [16] = "Entrance Hall", [17] = "Great Hall", [18] = "Hogwarts Dungeons", [19] = "Second Floor", [20] = "Third Floor", [21] = "Fourth Floor", [22] = "Fifth Floor", [23] = "Sixth Floor", [24] = "Seventh Floor", [25] = "Rooftop", [26] = "Lupin's Office", [27] = "Staff Room", [28] = "Gryffindor Boys' Dormitory", [29] = "Gryffindor Common Room", [30] = "Grand Staircase", [31] = "Portrait Room", [32] = "Portrait Room Passage", [33] = "Hospital Wing", [34] = "Library", [35] = "Library", [36] = "Fred amd George's Shop", [37] = "Wizard Card Collectors' Club", [38] = "Leaky Cauldron - Cellar 1", [39] = "Leaky Cauldron - Cellar 2", [40] = "Leaky Cauldron - Hallway", [41] = "Leaky Cauldron - Harry's Room", [42] = "Leaky Cauldron (Main)", [43] = "Shrieking Shack Interior", [44] = "Shrieking Shack Path", [45] = "Shrieking Shack - Path 2", [46] = "Shrieking Shack - Path 3", [47] = "Shrieking Shack - Path 4", [48] = "Shrieking Shack - Path 5", [49] = "Shrieking Shack - Path 6", [50] = "Diagon Alley Test Map1", [51] = "Diagon Alley Test Map 2", [52] = "Diagon Alley Test Map 3", [53] = "Diagon Alley Test Map 4", [54] = "Diagon Alley Test Map 5" } function update() Harry.ptr = read32(Addresses.Harry_pointer_x) Harry.lumos = Harry.ptr - 0x16A0 Harry.x = Harry.ptr + 0x2C Harry.y = Harry.ptr + 0x30 end function update_lumos() Harry.lumos = read32(Addresses.Lumos_pointer1) end function update_battle() local ptr_battle = read32(Addresses.Battle_pointer) for i = 1, 6 do Battle.Address[i] = ptr_battle + 0x14E0 + (0x48 * (i-1)) Battle.Is_NPC[i] = read8(Battle.Address[i]) Battle.ID[i] = read8(Battle.Address[i]+ 0x1) Battle.SP[i] = read16(Battle.Address[i]+ 0x8) Battle.MP[i] = read16(Battle.Address[i]+ 0xA) Battle.Level[i] = read8(Battle.Address[i]+ 0xE) Battle.Max_SP[i] = read16(Battle.Address[i]+ 0x24) Battle.Max_MP[i] = read16(Battle.Address[i]+ 0x26) Battle.Flipendo_Multiplier[i] = read8(Battle.Address[i]+ 0x34) Battle.Incendio_Multiplier[i] = read8(Battle.Address[i]+ 0x35) Battle.Verdimillious_Multiplier[i] = read8(Battle.Address[i]+ 0x36) Battle.Wingardium_Multiplier[i] = read8(Battle.Address[i]+ 0x37) Battle.Glacius_Multiplier[i] = read8(Battle.Address[i]+ 0x38) Battle.Diffindo_Multiplier[i] = read8(Battle.Address[i]+ 0x39) Battle.Status[i] = read8(Battle.Address[i]+ 0x42) --binary flags Battle.Status_Meter[i] = read8(Battle.Address[i]+ 0x44) --was for petrified end end function Status(value) --[[ Status 0 0 0 0 0 0 0 0 7 6 5 4 3 2 1 0 So print the above in binary Followed by Status? 0 = ? 1 = ? 2 = ? 3 = Spongify 4 = Petrified 5 = ? 6 = ? 7 = immune to petrified ]]-- --2CE38 for i = 0, 8 do if bit.check(value, i) == true then temp = 1 .. temp else temp = 0 .. temp end end return temp end update_battle() local i = 3 console.log(string.format("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t",Battle.Level[i],Battle.Max_SP[i],Battle.Flipendo_Multiplier[i], Battle.Verdimillious_Multiplier[i], Battle.Incendio_Multiplier[i], Battle.Wingardium_Multiplier[i], Battle.Diffindo_Multiplier[i], Battle.Glacius_Multiplier[i])) while true do local pointer = read32(Addresses.Harry_pointer_x) local state = read8(Addresses.Game_State2) local story = read8(Addresses.Story) local area = read8(Addresses.Area) local text_y = 160 if (pointer ~= Harry.x-0x2c and pointer ~= 0 and state ~= 9) then --this will happen if changed rooms or just started script update() --placing this here as to not lag my computer :P end local text_x = 240 if Story[story] ~= nil then text(0, text_y, story .. ": " .. Story[story]) else text(0, text_y, story) end text_y = text_y + 8 if Area[area] ~= nil then text(0, text_y, area .. ": " .. Area[area]) else text(0, text_y, area) end text_y = text_y + 8 if (state == 8) then text(text_x,0,string.format('%.6f,%.6f\nPTR: %08X\nX: %08X\nY: %08X',read32(Harry.x)/65536.0, read32(Harry.y)/65536.0,read32(Addresses.Harry_pointer_x), Harry.x, Harry.y)) end if (state == 9) then update_battle() text_y = 0 for i = 1, 6 do if Battle.Max_SP[i] > 0 then if Battle.Is_NPC[i] < 4 then text(text_x,text_y, Is_NPC[Battle.Is_NPC[i]] .. " " .. bizstring.hex(Battle.Address[i])) elseif Battle.Is_NPC[i] == 255 then text(text_x,text_y, "(" .. Battle.ID[i] .. ") " .. NPC[Battle.ID[i]] .. " " .. bizstring.hex(Battle.Address[i]), "red") end text_y = text_y + 8 text(text_x,text_y, string.format('LV: %d SP: %d/%d MP: %d/%d', Battle.Level[i], Battle.SP[i], Battle.Max_SP[i], Battle.MP[i], Battle.Max_MP[i])) text_y = text_y + 8 text(text_x,text_y, string.format('Flip: %d Verd: %d Ince: %d', Battle.Flipendo_Multiplier[i], Battle.Verdimillious_Multiplier[i], Battle.Incendio_Multiplier[i])) text_y = text_y + 8 text(text_x,text_y, string.format('Wing: %d Diff: %d Glac: %d', Battle.Wingardium_Multiplier[i], Battle.Diffindo_Multiplier[i], Battle.Glacius_Multiplier[i])) text_y = text_y + 8 end end end emu.frameadvance() end
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Potato wrote:
Did some TASing today. I managed to be 10 frames ahead of your input file going into the Fawful fight, through some optimizations for camera scrolling and better mashing during textboxes. Unfortunately RNG did not change for the Toad in the first room of Toad Town or for the baddie in the last room of Koopa Cruiser to NPC boost off of them. I will try to see if we can incorporate even more teleports than in your encode with Firedash glitch. From my testing, Firedash glitch works exactly the same as hat teleportation except the setup is a lot faster, as in you don't have to cycle through any of these glitched commands to begin glitched movement. That opens the door to many opportunities for teleports especially in Hoohoo Mountain. The only thing I am curious about is if it's possible to trigger the end credits earlier using the Save block. Also regarding ACE and our research, RETIRE coded a bruteforcing script and I left it running an entire night a few months ago but even after 2 million attempts it didn't find a single combination of inputs that would yield a credits warp. From our research, the memory addresses that we have to modify are stored in BIOS which means we can't really change them during gameplay.
RIP. What was the current strategy to almost ACE? I don't think it was posted here? Can you please elaborate?
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Some discoveries: 1. It turns out that getting OoB from the troll in washroom doesn't mess with position address, so it can be used for ACE. This means RTA-wise, there's more items available for payload. 2. I investigated the stores. Weasley Twins Bargain stocks the following when you first arrive at Hogwarts: Superior Work Robe Superior Gloves Dragonclaw Gloves Superior Pointed Hat Lined Hat Fine Fettle Belt Stamina Belt Superior Boots Hardened Boots Copper Cauldron Brass Cauldron After one of the 5 classses post potions is done, it changes to Superior Work Robe Buckram Robe Dragonclaw Gloves Sorcerous Gloves Lined Hat High Hard Hat Stamina Belt Robust Belt Hardened Boots Brass Cauldron Silver Cauldron That means there's only a short opportunity to obtain Superior Gloves, Superior Pointed Hat, Fine Fettle Belt, Superior Boots. On the 2nd visit to Diagon Alley, Potage's Cauldrons stocks the following: Brass Cauldron Self-stirring Cauldron Madamn Malkin's stock the following: Leather Belt Plain Boots Superior Winter Cloak Nimble Gloves Superlative Hat Vigorous Belt Superlative Boots This makes it very difficult to stock them before you can't buy them again. I'm thinking duping money drops from blue turtle in 6th Floor Secret Hallway https://alpha.vgatlas.net/hp1/enemies/49 These drop 250-500 sickles per fight. 3. You can't sell Bastion Belts to stores. Wandwaving Gloves, Optimum Hat, Blizzard Cloak, Optimum Boots only appear as drop near the very end. 4. You can grind herbs by pausing right infront of respawn points for it. There's 16 herbs, so 16 bytes for payload. 5. 0E01 WRAM is recipies flag 6. 0DDF WRAM is minigames 7. House points are strange. It appears while there are certain points it awards all houses randomly, by the end, it is hardcoded so that either Ravenclaw would be ahead, or Hufflepuff. It doesn't seem possible for Slytherin to win. The shortest dialogue for any% no ACE would be to have Ravenclaw still be ahead after rewarded 170 points at the end.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
https://tasvideos.org/UserFiles/Info/638650778628629060 I was investigating the use of save/reset to get npcs to appear in different places. On the U version, I found out that Darck's overworld ID at CB9E happened to be 1. This value appears for a a npc in Oasis village 1 (Kalka), as well as an npc in Water village 1 (Yold). None of the npcs in GreatLog appear to have this id. By saving at Yold, then save/reset at Limbo Shrine, I can talk to an invisible NPC to trigger the fight with Darck. This saves 2075 frames (00:34.58) since I don't need to buy the journal, nor visit Limbo itself outside the shrine now. For some reason, on J, the IDs are different, but it still works. On reset however, an invisible npc would appear at your house you can talk to to access the arena. I wasn't able to find a npc in GreatLog that would allow me to skip almost everything in Oasis. I did find out that saving in Asiya top left corner, then save/reset in GreatLog would give me an npc that can be talked to repeatedly for tiny medals in U at least.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Link to video Since I can't seem to get a high follower index in (U) (every attempt so far gets me a value of 51, which is worthless), I tried making a run on U instead. It still uses save bugs, but it at least shows more of the game? I'm not sure if it should obsolete the longer run, but I think there's some value in this, given a 100% run would probably still need to actually visit other worlds. I'm not exactly sure how to proceed with the tournament however. The lamp fight would simply be using the last cancelled run strat. Pirate should be beatable using OoB to get to last area; the long run for some reason doesn't do this. Ice/Sky can be mostly glitched using save bugs. Not sure how to beat Limbo.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Woah, a glitched run finally exists! I looked through this thread every time it got an update, and I knew a glitched run was attempted for years without success. Congrats! 1. Does save corruption exist for the other Mario & Luigi games? 2. Assuming a run that does this gets published, would you or others still try to do that ACE run as a "no save glitch" category? 3. What other stuff can you do with this? Anything fun?
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
MUGG wrote:
@BioSpark Thank you. But I guess I'm not experienced enough to understand it. Anyway, as it turns out, the 4 bytes before the in-game timer are actually not counted towards the checksum... (!!!) That means, happy glitch run. I don't see how it should not be possible now. Unless it turns out those 0xFF (unitialized values) are not going to be considered legitimate somehow. I'm asking about it here. In the meantime, I will be investigating and then doing a testrun. After that, perhaps the other MLSS runners will agree to collaborate on a run?
If I understand right, you want to start a game where the save file is all 0xFF, except for the 4 bytes before the timer? What are those bytes for? Do they ever change when saving in game?
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I thought Telefang 2 was a gameboy advance game? Clicking on the game however gave the original telefang. What? Also I'm really curious of an encode if anyone syncs it, given the current unglitched run is almost 2 hours long, while the ACE version is 5 minutes. The original submission of telefang was a glitched, non-ACE run that took 15 minutes. I don't see how there's a category that gives a 49 minute run.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I made my run as a joke, without even knowing a thing about X/Y positions. I know there was discussion on discord regarding rng, x/y values in the game. Can you please post information + lua script of that here? I remember it turned out more complicated than expected.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I'm not sure if it was asked here, but are the Pokemon runs console verifiable? I'm especially interestested in the ACE ones.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Is there documentation on the save file structure for this game? Like what every single byte does in SRAM for Mario and Luigi? I had a thought that maybe if you find all the corresponding addresses in EWRAM responsible for each byte in SRAM, then checking which addresses failed to trigger the breakpoints. Maybe there's something special about them, like some pattern on why it wont.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Alyosha wrote:
Cool run. I admire your dedication in being able to keep redoing things and still finish the TAS. After dialing in EEPROM timing and resyncing to GBAHawk I was able to console verify this: Link to video
Wow, that's incredible! How hard was it to resync it? Was it mostly add/remove frames?
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Nice work not only redoing the entire run for BizHawk, but also improving it! It must be rather tricky remember everything that has been discovered over the years, given you took breaks from it. Were there any tricks discovered during that time that you weren't able to add back?
In past TASes, this has just been trial and error. Though knowing that this time around I would have to get additional 5 Kinstone Pieces than past run (later dropped to 4), I knew that trial and error wouldn't cut it, as these are rare drops to get. This is where the amazing Henny022 comes in and develops a script to calculate drop rates! The rates themselves differ depending on which area you are in, as well as your inventory state, like how much health, bombs and arrows you got.
Is there more information about this? This sounds super painful to juggle all at once. How do RTA runners get 100%? This sounds almost unapproachable to route. The only thing I can imagine right now would be "follow RTA, but with savestates" then hope one day someone figures the rest out.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Thanks for checking this out!
However, I tried dumping memory at the time when the game starts executing 0xc000, and it looks like the above code is not mapped at that point. (At least I think—I don't know Game Boy architecture that well.) So this idea may be a dead end.
The trace stops making sense as code at 0x4ca9 rlca. What it looks like, to me, is that the instructions before that point come from one part of the ROM, and the instructions after that come from a different part of the ROM. Here's the code that starts at 0x1f4ca1 in the ROM. Notice how it agrees with the above trace up through 0x1f4ca8 ld [hl], a, and disagrees thereafter:
It's due to
4CA8:  77        ld [hl], a          A:78 F:00 B:78 C:80 D:20 E:71 H:20 L:71 LY:28 SP:dfe9  Cy:4465421838
https://retrocomputing.stackexchange.com/questions/11732/how-does-the-gameboys-memory-bank-switching-work
Switching to a ROM Bank < $20 Switching to banks $01-$1F is very simple. We only need to write our intended bank to $2000-$3FFF. Here we are switching to bank $05: ld $2000, $05 ; Now able to read data from bank $05
In this case, HL was $2071, so the memory right afterwards points to a different location after execution. That actually sounds like a good idea, if you could somehow get the rom bank where ld a, 0x06; ld [0xd70a], a is. The earlier parts of the memory before C500 changes from the minigames (the one where you guess the npc in the card, and the one you guess the number). I don't think I managed to get much out of it though. I recall at least 2 bytes, separate from each other, act as a timer that can have any value from 00 to FF, but I'm not sure if it would be useful. Another idea I had was get register A to shift right 6 times somehow using the minigame values, but I don't know if that is possible.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
https://tasvideos.org/UserFiles/Info/638616165666042151 Link to video I wasn't able to replicate the trigger from my previous input file, so I found a new spot right below an exit tile that jumps to 0xC000 once you ground pound on it. The game then jumps back to the main loop, and I beat the stage with ending id set to 6. This plays the real final chapter ending credits after saving. This took 35 minutes, so it is completely unpractical for any%. It is also slower than just reaching stage 49 (Awaiting Syrup!) and beating it using an OoB exit to reach the real final stage, since that takes 22 stages, rather than 35+ here. It does execute arbitrary code via stage flags, so I hope someone finds a better way than beating half the game + actually beat the game at least once to jump to credits.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Nice recording this! Do off screen kirby helpers "exist"? Or do they, at random points, just spontaneously transform to say, Parasol at 11% of the time? If you froze the rng right before they transform in a different room, do they keep transforming?
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Sand wrote:
Exploit code constructed out of treasure and puzzle flags, that's amazing :) It's not every day you have to think about the Hamming weight of your shellcode. I'm enjoying reading about this. If the contents of the a register are predictable, it may be possible to replace ld a, $06 (3e06) with add a, $XX (c6XX), where XX is the difference between 0x06 and the value of a. 0xc6 saves one bit relative to 0x3e, but whether it requires fewer treasures overall depends on what XX is.
jlun2 wrote:
The following applies to gameboy. I found out that when you ground pound in certain areas below the stage, you can crash the game. I checked why, and it was because it jumped to 0xE200. 0xC504, and thus 0xE504 is the treasure flags. So there's a small spot to manipulate for a credits warp.
I see why the contents of 0xe504 are the same as 0xc504—that's echo RAM. But how does the program counter get from 0xe200 to 0xe504? Is it all NOPs in between?
Thanks for the comment! https://tasvideos.org/UserFiles/Info/638320581598112959 I think this was the input file that had it. I meant C200, sorry. There's a section in memory around there that seems to be based on the tiles in the treasure/number guessing minigame. I would love to somehow get 3E 06 to appear there, but I don't think I succeeded. I do not know if register A would be predictable, so I had 3E 06 just to at least get a run working first.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
CasualPokePlayer wrote:
This more means there's really 2 separate issues brought up by this thread. 1. Site staff are overworked. 2. The current rules still end up limiting TASers too much for interacting with the site. Solving one doesn't necessarily solve the other. An improved userfiles with a leaderboard like system while keeping Standard over to the current system I would think at most helps "solve" 2, without actually addressing 1.
This is a great Tl;Dr actually. Given how it seems some are still unaware of this thread, I think this should be brought up to the rest of the staff brainstorm more ideas. Maybe get some of the more active TASers on discord to post on this thread? I'm not sure who are they though.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
CasualPokePlayer wrote:
If self-judgements are fundementally disallowed, then a regular judge (or fundementally someone from the site staff team) would be in charge of handling the submission and deciding if it can be published. This would then comprise the bulk of the work for judges, leaving us ultimately back to square one. If self-judgements are allowed, then practically many TASes would just be approved by the same person who created them. Which also fundementally goes against needing to sync with another person (besides the TAS author) in order to be accepted. Although granted, that somewhat is implicit with the publisher syncing the submission, but if the publisher can't sync it... the submission normally has to come under more scrutiny to figure out how to sync it, something normally best done by a judge (or literally anyone else) and not of course by the TAS author themself, leading back to work for site staff.
Maybe rather than everything self judged, you have a improved userfiles that would allow a leader board like system for self made categories, while the main standard categories and playarounds can get the current system. A way to frictionlessly upload input files for "easy" comparison for a similar category for "small(ish)" runs (game modes, single stage/lap/whatever, alt goals) that basically is like current userfiles but has some ranking system. They don't need a playground thread, nor a publication video, just like current userfiles. They can be as serious/official as they want. It sounds kinda easy to abuse given 0 checks, but at the same time this already kinda occurs in speedrun.net, with record holders of niche runs that are dead links. The example I linked for instance, has 3 runs, and 2 of them are dead links. That 1 remaining video is literally the only thing encode of the glitch anywhere online. I assume a lot of speedrun links would be similar. Even in the case of just 1 TASer interested in the game, it still has a use. For instance, it can act as a personal best leaderboard for individual level runs, with input files included. So even if the 1 person interested in the game quits before they make a full game run, there's still something to show of, in a nice list (rather than the current userfiles, where you can't exactly go search "runs of stage X). A full blown playground thread for every single submission for individual stage would be overkill. For instance, if I did that for the current game I'm working on (Wario Land 2), that would be 200 threads (50 stages, any/100 gltich/less). Dumping them on userfiles would 1. Make me run out of space, just for 1 single game 2. No way to compare improvements easily. Newbies can also submit their mario runs there I guess, instead of the over 100 submissions that get rejected. Like you can treat it as "good job, here's how you did in comparison to the rest", rather than "your run doesn't beat the WR, rejecting". They don't need a thread, nor a publication. Just a entry on a list as record keeping. If they do beat all records, they can "upgrade" it to an actual submission that gets published.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
KusogeMan wrote:
This is basically my experience with almost everything i TASed and it's aggravated by the verification movie debacle and bizarre rulesets which tell me what is and isn't valid in the dead game I put my time into. Nowadays i want to help Judges get through the stuff faster but I don't want be part of the Staff because you prioritize site rules to the game's communities rules and judgements. All accomodations are RULE BREAKING and will effectively stop people from publishing pikmin 2, mario kart TASes and so on.
the rules have become so obtuse (to no ones fault to be fair, they have kind of evolved that way over the years and we also have the site legacy) but more importantly BLOCK TASES FROM HAVING A PLACE ON THE SITE WHEN THEY ARE REJECTED BECAUSE REJECTIONS ARE EFFECTIVELY UNSEARCHABLE (playground is a good step in this direction btw but lets take it further see dwangoac proposal)
I rambled a bit on discord, so posting here: Let's find out what genres of games a game specific community(ish) approach would make sense, and what may be their categories: Fighting games
  • Fighting (Different characters/game mode)
  • Racing (Different tracks, first lap only, different vehicles, different modes)
  • Platformer (Every stage it's own run, like SM64)
  • Adventure (Hard to describe, but I had zelda individual dungeons TASes in mind)
  • Puzzle (depends on the game)
  • Shooter (depends on game, likely challenge modes)
  • Misc. (Games that by itself won't make sense, but have modes that can have runs themselves, like Pikmin challenges)
The generic categories I could think of that can apply for all are:
  • Any%
  • Glitched, varies by game
  • 100%
  • Glitched 100%, varies by game
  • Game specific objectives that only apply to 1 game (for instance, master sword%, 16 stars in SM64, in game time vs. real time, high score, minigames, etc)
Right now, these types of runs are either Youtube/Twitch exclusive, with no input file provided (so for highly optimized/technical runs, it is almost impossible to beat, or even replicate the glitches at all), or posted only Discord as some offhand thing (Discord links expire; this is also very hard if not impossible to search; if server owner nukes server rip all info). This means one of the greatest values the site has currently that others don't provide are searchable forums, and input file hosting. A number of runs I mentioned (individual stages/characters/etc) do not follow movie rules whatsoever. At the same time, they are rather "small" for a full blown Playground entry (Wario Land 2 for instance has 50 stages. Glitches take several seconds per stage potentially. This would immediately be 200 playground submissions if I submitted each one individually, each starting from savestate, with ideal RNG that wont make sense in any%/100%). Right now, we have userfiles. But this is not suitable for the types of runs I mentioned above. For starters, if I uploaded say, a run that gets all coins in a stage, userfiles won't be able to compare a run of the same category if there was an improvement, or a slower submission. If there was some system where you can make a game sub site like speedrun.net that you can (somewhat easily) upload input files, that immediately gets listed into some leaderboard with different categories, that would be great. They don't need to explicitly have a thread for each entry. Just a list of input files, and their times, would be satisfactory. A problem with this is moderation. For more active communities, these effectively self regulate. I am not sure who should be responsible for handling disputes for some niche game category disagreement, or some other drama regarding what should be in what category. Similarly applies if a troll uploads an input file that doesn't do what it says it does (for instance, time says it beats the WR, but the input file itself is literally idling in the menu for the entire time, or any april fools joke submissions). I am not saying we should abolish judging. For the vast majority of games, the current system is fine. But for certain cases, it would be nice if there was both a "lightly, community(ish) moderated subsite that allows basically whatever they want (like literally upload input file, it immediately appears there, let community(ish) judge if it's valid, no thread is created at all unlike playground), while at the same time having the current system for the usual submissions (any%/100%/glitched(ish)/etc). This would allow more runs to appear on the site, since TASing a single stage/mode/whatever is both relevant to the site, and small enough to actually have a run, rather than spend months on it just for it to be rejected because it was slower for a handful of stages. If anyone ever makes a full run, it can be "upgraded" to a normal submission as well. * Community(ish) since I am aware most games, the TASer is the entire community.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I can see that it is rather unsustainable, especially with the deluge of flash submissions for judging. I do not know a good solution. Abolishing judging completely will likely result in even more spam (like SMB runs, repeatedly).
dwangoAC wrote:
I feel strongly, and have felt for a long time, that we need ways for communities to be self-regulating with their own community categories that meet their needs, such as the fighting game folks or individual communities like Celeste. If we give them a home similar to a speedrun.com page where they can make categories and hash though their own requirements, they'll do a lot of the hard work without requiring a huge amount of staff oversight. Encoders would continue and expand as needed, publishers would continue to handle descriptions and other aspects of promoted runs, and judges would primarily move into curator roles focused on highlighting runs with far less frequent adjudication.
Reading this makes me immensely envious of speedrunning communities of popular games. I TAS a range of games, and I actually join the discord servers listed in the game's speedrun.net page if possible. Almost all the time, due to sheer luck, it appears there's almost no activity anymore (because almost everything has been discovered, somewhere hidden in the discord server, so runs basically become stale), or there's like 1 other person who just also happens to be interested in the game that I am. I really wish there was a way to have a community page that isn't just 1 guy uploading everything, but that's just my luck I guess. I do not know how to solve this; it seems great for more active game communities, but for niche-ish games, I'm not sure how that helps. I would like a way to document stuff easier though. I'm guilty of posting everything on Discord as notes, then when I need to actually write down what I did I go "uh I can't find anything rip". Let me clarify, that I do like the idea of game communities go handle their own stuff, but at the same time, the focus on communities seems to forget the fact most games do not have a community. In fact, it's likely that the TAS, or that 1 playthrough on youtube is the only thing you get for most games. That should be taken into account.
Dimon12321 wrote:
To add to what DrD2k9 said, I'm worried about the future submissions too. In the last couple of years the forum audience has shrinked in 2-3 times. It's already common to see a TAS discussion thread where the first post is "This movie has been published". So concerns the polls too, like nobody is interested is what you have done! Veterans are gone. Most of active players visit the site just to submit TASes and respond to posts in their discussion threads. By not having a big audience on the site, the role of subjectiveness and ignorance becomes very significant. If I got your suggestions rights, publishers will basically become "gods" since they will decide which synced runs to publish. That's a freaking wonderful perspective! I looked through my submissions and, seeing how little feedback I had got for various works, it would be no wonder if some of them would end up being just "synced". I've been spending months to make a TAS, frame advance all the time, replaying sections in case of discovered improvements, and all I would get is "Synced"? That's not what I was striving for, and I think people will agree with this.
Right now, I completely get it. I really fucking hate how all feedback is on Discord, and the forums, the one place you can still search for shit, is like a ghost town. It's demoralizing as hell, but at the same time I'm not sure how to fix it. I really don't want the site to die, since there's no place else that I can upload input files that I know for certain will sync back and replay. I really fucking hate how other speedrun communities just post glitches on discord, linking to a dead twitch link, with literally 0 information on how to reproduce. That really kills me even more than 0 feedback. I had to spend hours, sometimes months replicating things others already found, because the only information of it was on Discord/Twitch. And even on said discord/twitch, I get 0 feedback anyways. I got burnt out from TASing multiple times like this, yet every single time I eventually come back because I really want to see a run of a game I like, and there's no where to share input files that others can reproduce.
alexheights1 wrote:
If each game has a wiki page that the community can freely edit, then lots of problems are solved. Random featured articles should be on the front page, like Minecraft/Terraria/Doom TAS pages where the community will improve the article over the decades to incorporate literally everything that is known about the game and its TAS history. I think information would be more easy to find if each game page looked like a regular Wikipedia article. Another idea: The front page might be good if it had an alphabetical list of all games immediately available. People often know what they are looking for so just give an alphabetical list of links to all games at once. Only add links to the list when a published TAS has been made for the game. Wiki is a powerful tool for collaborative optimization challenges, one amazing example being the Busy Beaver challenge which is forever ongoing and very TAS-like: https://wiki.bbchallenge.org/wiki/Main_Page Have a nice day!
That's the problem. We do have a wiki. It's just that posting on Discord is super easy and convenient. Me, and many other speedrunners, just post their stream of conscious thoughts directly there. The problem is that gathering that back into 1 coherent documentation is extremely painful. https://x.com/LukeCorreiaVA/status/1475220844456652802
the discordization of the internet is fucking brutal i hate trying to find information about any remotely niche topic only to discover its hidden somewhere within a discord server with 80 channels at 50k posts per second
This makes glitch documentation completely impossible, especially if the only time it was recorded was during some 5 hour livestream clip, and no one else preserved it. Even in the "lucky" times I do find an active community, I end up having to refind basically everything. And that's when there's a community. If not, unless wiki editing has some magic AI that converts your discord posts into a coherent glitch description, I don't expect people to do that. I'm probably just rambling now, but reading some of the posts here makes me go like "damn you guys all participate in popular game communities that have tons of activity in other livelier sites, while my experience here is that every site, discord included, is a ghost town. It's so miserable at times everywhere. Sorry about that. Edit: Just curious, is there any off site discussion on this? Like on Discord or similar? I'm very curious for more perspectives on this, since right now it seems I'm like the only one here who keeps getting into mostly one man communities. The current site situation is rather depressing, but at the same time, I'm having a hard time thinking how some of these changes would benefit TASing for games in general, and not just a select few popular games with active communities, while everything else gets 0 feedback. I mentioned at start about having no submission queue will result in a deluge of runs. For active communities, this is absolutely not a problem; they can moderate it themselves like speedrun.net. For niche games, it basically floods the site with potentially spam, making it harder to find an actual improvement, and not some run where it's input file doesn't even work, or uses some outdated emulator version. This isn't even some "theoretical" thing; every april fools, the site gets a bunch of joke submissions that get rejected. It is entirely possible some obscure game around that time suddenly becomes viral, causing a deluge of spam.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I am still working on a run for this. The current payload idea is
C503Number of times saved-VariesI'm not going to save/reset repeatedly; ignoring this.
C504Treasure flags for stages 0-70x3Eld a, $06loads 6 (real final chapter ending) in to register A
C505Treasure flags for stages 8-150x06
C506Treasure flags for stages 16-230xEAld [$D70A], aloads ending 6 to ending id
C507Treasure flags for stages 24-310x0A
C508Treasure flags for stages 32-390xD7
C509Treasure flags for stages 40-470x00nop
C50ATreasure flags for stages 48-49 (only bits 0,1 possible)0x00nop
C50BCoins bank0x00nop
C50CCoins bank0x18jr $05jump to C513 to avoid stage select opcode 0x01
C50DCoins bank0x05
C50ECoins overworld0x00nopSkipped
C50FCoins overworld0x00nopSkipped
C510Stage ID?VariesSkipped
C5110x00nopSkipped
C512Stage select flag0x01ld bc, _ _ _ _Skipped
C513Puzzle flags for stages 0-70xC2jp $4000jumps to somewhere not crash
C514Puzzle flags for stages 8-150x00
C515Puzzle flags for stages 16-230x04
C516Puzzle flags for stages 24-310x00nop
C517Puzzle flags for stages 32-390x00nop
C518Puzzle flags for stages 40-470x00nop
C519Puzzle flags for stages 48-49 (only bits 0,1 possible)0x00nop
This means the following stages are needed :
0One Noisy MorningTurn off the alarm clock!
1One Noisy MorningTurn off the giant faucet!
2One Noisy MorningLet the water out!
3One Noisy MorningGo down to the cellar
4One Noisy MorningDefeat the giant snake
5SS Tea CupReturn the hen to her nest
6SS Tea CupEscape from the woods!
7SS Tea CupGet in the Tea Cup
8SS Tea CupDrop the anchor!!
9SS Tea CupDefeat Bobo!!
10Maze WoodsGet to Maze Woods
15In TownStop that train!
16In TownUp on the rooftop!!
17In TownDown in the cellar
18In TownEscape from the factory!
19In TownAnyone for B-ball?
20Syrup CastleGet to the Castle!!
21Syrup CastleStorm the castle!!
22Syrup CastleDefeat four ducks!
23Syrup CastleFind the hidden door!!
25Invade Wario CastleTo the castle!!
26Invade Wario CastleStorm the castle!!
27Invade Wario CastleDefeat the giant spear man
28Invade Wario CastleGo through the grand hall
30Go to the cellar!Defeat the giant spear man
31Go to the cellar!Avoid the rocks!
32Go to the cellar!Stop that train!
33Go to the cellar!Find the exit!!
34Go to the cellar!Defeat the cave master!!
35Ruins at the Bottom of the seaEscape from the Tea Cup!
36Ruins at the Bottom of the seaDefeat the giant spear man
37Ruins at the Bottom of the seaInside the ruins!
38Ruins at the Bottom of the seaEscape fromt the ruins!
39Ruins at the Bottom of the seaCaptured Syrup!
I end the game at stage 28 below the stage, where a certain block when I swim at jumps to C000, then nops to C503. This sets the ending ID to 6, but more importantly, doesn't crash the game. I then need to beat the stage somehow, then the final ending plays. It would be around 7 times longer than beating the game normally (at least 33 stages, some repeats to unlock alt paths), but would be game end glitch. Notes: * Technically, I could've shorten the number of stages used by makign C503 be 0x3E, then shifting the payload up by 1 byte, allowing me to skip stages 32-39. Then get C509 to be 0xC3, have C50A be 0, and C50B to be 04, for the final jump, but that would need 62 (0x3E) saves, and 4000 coins. I save at least 33 times, so that leaves the run save/reset another 30 times. I would also need to manipulate multiple silver coins every single stage (they give 100, but I use 50 for treasure in some stages). * Right now, the path reaches the stage select screen using stage 39 Captured Syrup!. I could technically reach that using underground by beating stage 34 OoB, which if I haven't unlocked stage select yet, will take me to stage 35 Escape from the Tea Cup!. However, after unlocking stage select, I would be blocked from going back, since I never beaten stage 8 (Drop the anchor!!) * An alternate path, using the exact same payload above, would be to do what the any% does and unlock stage select using stage 29 (Kick 'em out!), then doing that again to unlock underground. Then beat stage 34 (Defeat the cave master!!) OoB to unlock underwater. This skips beating stage 4 (Defeat the giant snake) and stage 8 (Drop the anchor!!) twice, but at the cost of doing 2 extra stages (28, 29) + I'm forced to see stage select screen. But it also allows me to skip cutscenes. * The OoB area is harder to reach if you haven't unlocked stage select. A number of stages have the section 1 tile above reach, so I have to either reset, or find some innovative way to get up. This also meant the 100% GB input file wasn't as helpful as I thought.
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
MUGG wrote:
Shadow Kirby skip I have always wondered why Shadow Kirby doesn't show up some times, but does show up other times.
Submission #2366: MUGG's GBA Kirby & The Amazing Mirror (100%) "100%" in 58:10.02 wrote:
Skip dark Kirby Sometimes you don't encounter Dark Kirby, so you basicly don't have to deal with him and thus skip him. It seems to be another random bug though. But luck-manipulating it to happen must happen about ten rooms before this encounter, and the luck-manipulation itself takes a ton of idle frames, so I didn't use it.
But today, the WR RTA runner hirahira told me Shadow Kirby doesn't show up if your lives count is 2 or less (except in Rainbow Road). (It always surprises me when I find some new obscure mechanics in this game... Such as Ice Kirby not sliding on ice, or lives not getting detracted if you die in the Tutorial...)
That's actually quite nice finally knowing how it works. Regarding RNG, how does this game generate the values, and how does it use them? Is that documented anywhere?
Experienced Forum User, Published Author, Skilled player (1741)
Joined: 9/17/2009
Posts: 4981
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
MUGG wrote:
I did a bit more investigation into cook glitch, specifically the technique I used here: https://www.youtube.com/watch?v=2TQXPbAsqTg I did it near a door like 50 times, then had a helper kirby stay there to keep those 50 food null actors active while I left the room and came back. The interesting part: The food item or 1-up that spawned when helper kirby appeared - which would eventually start flickering and despawn - could be prevented from flickering and despawning by giving up my ability. As soon as I press select to ditch my ability, the item would stop flickering (it could turn invisible but still be able to pick up) and stay there forever. Also said item (or food items spawned by actually using cook ability) could assume a glitched sprite when leaving the room and coming back while helper kirby keeps the actors alive. I might look into it again and make a video.
Nice. Given more tools for debugging are available now for gameboy advance, would trace logging, or using Ghidra help figuring out bugs? Also nice discovery regarding above post. How did you find that video, given it was in japanese?