Posts for jlun2

Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
One thing that would be nice would to be having access to debugging tools on more cores. Currently, mgba for instance lacks code logger, and trace logger: Similarly, both NESHawk & QuickNES lacks code-data logger. vba-next lacks code-data logger. Sameboy lacks debugger, trace logger, and code-data logger. Snes9x lacks debugger, trace logger, and code-data logger. I think the gb core has all however. BSNES has access to all those tools too. Haven't checked other console cores yet.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Not sure if it is just me, but on the GBA cores, if I opened and closed TAStudios over and over, gradually, BizHawk uses more and more RAM. This happened last night after opening TAStudios, editting parts of a movie, then closing it and running a lua bot, then reopening TAStudios and repeat. It doesn't happen immediately; the first time I closed TAStudios to run a bot script it was at 600MB for the entire time. Every time repeat the above, it creeps slightly higher.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
That's pretty much how pokemon were cloned in g2. I'm rather surprised it still works in platinum. I wonder how precise this is, given how it wasn't noticed until now.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
2 plans in case the run gets rejected for using secret Denjuu: 1. Use Scrippa, glitch to Cotta, then Cotta all the way 2. Use Scrippa, and follow the route until Cotta later Using 1) will save 13 turns compared to 2). Assuming each turn I just spam A, they take like 600 (1000, if ally appears) frames. To make it simple, 600x13=7800 ~8000 frames. However, it would take ~08:53.33 (32,000 frames) to glitch to Cotta early and then leave, so in the end, it's worth using option 2) Also, recruiting Scrippa costs 8695 frames, or 02:24.92 Main differences: * Mystacea (Basic) & cohorts takes 3 turns, all OHKO since Scrippa's slower speed allows other enemies to appear * Mentalis (Basic) & cohorts takes 3 turns, same reasons as above * Hermit (Desert) & cohorts takes 2 turns, same reasons as above * Demerus (Desert) & cohorts takes 4 turns, same reason as above (sadly) * Rival fight 2 & 3 both take 4 turns due to typing (cannot OHKO Gyuun this time) There's no speed boost item until rival 2, and even then it ended up not helping. Also somehow I counted using 10 11 drinks. Edit: Power version is still worse off for this plan due to rival typing. Edit2: I believe I can skip the speed bracelet if I did not use secret denjuu, since it appears to do absolutely nothing. Scrippa inflicts 18 damage on crit using special on Diablos, so it makes little sense to use it there. Bracelet with Cotta alone is the same as none, so might as well skip. Edit3: Reconfirmed it's indeed 10 drinks; Scrippa uses 8 of them, and Cotta uses the last 2. Cotta does the last bosses after Easydog alone, due to Scrippa's DP being 10/100. I fucked up. It's actually 11 drinks. Turns out to 2TKO Easydog fight, you need to heal Scrippa, since at that point it's DP would be 10/100. Luckily, it only needs to spec one last time, so it's possible to manipulate a DP snack or juicebag that gives "only" 30/60 DP for it. Edit4: For Rupicola run, since you will heal before Rival 2, might as well go spec 4 times disregarding crit. Edit5: If anyone cares, here's the areas that had randomly moving NPCs which were relevant to the run https://docs.google.com/spreadsheets/d/1DMwXqUgWF6V_Arabm3AOhf5IUhvMYM11N2GB1izF9po/edit?usp=sharing
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
http://tasvideos.org/userfiles/info/42429598609356850 It's been 7 years, but I'm almost finally done a TAS of this game! The final fight has 3 enemies with 221, 138, 110 HP. Once I'm done, I'll upload a temp encode, then write the notes before submitting. Ornithogalum has 110 HP, and can be OTKO (one turn knockout) with ally + crit Cotta spec. Kanzou has 138 HP, can has to be 2TKO. A crit with ally deals 18 damage, and Cotta hits at max 118, which means at max I can deal 136 damage in 1 turn to it. This means I forced to spec it, then use the normal rock attack to land 23 damage. Diablos has 221 HP, and every crit spec deals 63-67 damage. My ally deals only 1 damage sadly, so I'm forced to use at least 4 turns. Getting Rupicola can work, but it would take 3 turns to arrive, which by then the 2 other enemies above would be dead already. Rupicola would arrive the turn after I KO Kanzou. Additionally, after hitting Kanzou once, due to Diablos' speed being far higher than mine, it ends up hitting me twice (Diablos, Kanzou, Diablos) before it's my turn again. Since Diablos hits 50's, I must get them to miss me. Rupicola crit'd spec can deal 32-36 damage. Sadly, it's ally also deals only 1 damage, so that means the most I can meaningfully do is 103 damage per turn on Diablos. The good news is however, that 221/4 = 55.25, so that means if I only use Cotta, I don't need to land 4 crits in a row on Diablos. Same applies for Rupicola actually, since 221/3 = 73.67 damage, which is also possible without crit. Edit: It curiously takes the same amount of turns with or without Rupicola since Diablos would hit twice if Rupicola wasn't involved. Rupicola's speed item given earlier allows it to land 1 hit in the middle. However, if I gave the bracelet to Cotta, then recruited Rupicola, I can save like 1 turn, but I would require Cotta to crit twice three times (or twice, and Rupicola crits once) on Diablos. Edit 2: I rewrote the battle script to check if you're in a specific state, then mass check values. I also added the ability to check if an ally would appear on pressing A before your turn. Edit3: Turns out I have enough DP to spec Kanzou twice. This would help a lot, since now I don't need to manipulate a crit, followed by 2 misses in 1 turn. Edit4: So far, battle took 6580 frames (from first lag, to the "WIN!" screen). Will try to improve it. Edit5: So I won't confuse myself: If using Rupicola + Cotta with bracelet, manip these events: 1. Diablos hits first, then Ornithogalum appears 2. Get ally to appear and hit Ornithogalum, no need to crit 3. Land a critical spec on Ornithogalum. This should KO it. (70 DP left) 4. Daiblos attacks 2nd time. Do not use drink yet. Kanzou appears. 5. Spec on Kanzou. DO NOT CRIT (40 DP left) 6. Diablos will attack 3rd time 7. Kanzou will attack 8. Spec Kanzou. DO NOT CRIT (10 DP left) 9. Diablos attacks 4th time. Heal DP. Rupicola arrives 10. Diablos attacks 5th time. 11. Cotta critical spec on Diablos (70 DP left) 12. Diablos attacks 6th time. No more drinks to use. 13. Cotta critical spec on Diablos (40 DP left) 14. Rupicola specs Diablos (70 DP left) 15. Diablos attacks 7th time. 16. Cotta specs Diablos w/o crit. (10 DP left) Done If using Cotta only without bracelet, manip these events: In this case, you need to crit Kanzou, since else you won't have enough DP to kill Diablos. 1. Diablos hits first, then Ornithogalum appears 2. Get ally to appear and hit Ornithogalum, no need to crit. Hits 31 with Akrito 3. Land a spec on Ornithogalum. This should deal 79 dmg, and KO it. (70 DP left) 4. Daiblos attacks 2nd time. Kanzou appears. Do not use drink yet 5. Land a crit spec on Kanzou. (40 DP left) 6. Daiblos attacks 3rd time 7. Kanzou will attack 8. Diablos attacks 4th time 9. Use normal hit on Kanzou. Do not use drink yet 10. Diablos attacks 5th time 11. Attack Diablos (10 DP left) 12. Diablos attacks 6th time. Heal DP now 13. Attack Diablos (70 DP left) 14. Diablos attacks 7th time 15. Diablos attacks 8th time 16. Attack Diablos (40 DP left). No more drinks to heal 17. Diablos attacks 9th time 18. Attack Diablos (10 DP left) Each crit does 71 damage maxed to Diablos, which means there's no way to kill him in 3 attacks since 71x3 = 213. Using Cotta only, I can deal the max non-critical damage of 57 4 times, dealing 228 damage. In other words, no need to crit Diablos IF I'm using only Cotta, since even with all crits, it would still take 4 turns. For what to do when Diablos attacks, it depends. It's non-damaging move is "Cursed Song", which inflicts a status condition. While that can be manipulated easily to not affect me, it will give a 50+ frame popup once it's my turn regardless if it has affected me. If I get hit, Diablos has 2 moves: Melting Fluids and Big Electric Current. The former hits 60ish (80s in crit) and the latter hits 50ish (80? in crit). This means it can only be done once for the entire fight, or else Cotta dies. Missing is technically the fastest option of the three, but poor luck may make it slower. If it needs to wait 100+ frames for it, Cursed Song is faster. For Kanzou, it's non-damaging move is "Avoid". This makes it very difficult to land a hit on it. Whether or not it's worth it depends on how lucky you are. It's damaging move is ? and Kamaitachi. The former does ? and the latter inflicts 20 (? in crit). While that seems "good", since Kanzou only gets to attack once, 20 damage makes it enough such that Diablos's "weakest" attack will kill me. So again, getting hit can only be done once in the entire fight. This time, Missing is slightly slower than non-damaging, but may be worth it if hits don't land. For Rupicola, it appears after Kanzou dies, and Diablos basically OHKO's it.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
feos wrote:
Save a normal state on that frame outside tastudio and see what happens. Such things have chance close to 0 to be caused by tastudio, it just makes them obvious.
Oh. You're right. Sorry about that.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Just posting this here, since I noticed it does not affect vba-next: From this post:
jlun2 wrote:
1. Select m-gba core 2. Open SpongeBob SquarePants - Lights, Camera, Pants! (USA).gba 3. Open TAStudios 4. Open this file in TAStudios: https://drive.google.com/open?id=0B-2O13fpsnI4akZwMWJ3ZFd2QUk 5. Play it until frame 1500 or so; you should see: 6. In the piano roll, click on frame 1158 or so and make a marker. (Do not change the input!) 7. Click on the marker to go back to the frame in step 6. 8. Play the movie to 1500 or so again. This time this message appears: Even though literally nothing was changed. No idea what happened, but loading a savestate in TAStudios completely changed the result.
I think something went wrong with savestates for that game. Edit: Tried mgba 0.6.1; seems fine there, so ignore this please, sorry.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
feos wrote:
jlun2 wrote:
Found a bug: 1. Open a rom 2. Open TAStudios interface 3. Go to File > Open and select a bk2 file 4. When a popup asking about converting the movie to a tasproj file occurs, select cancel 5. http://i.imgur.com/gzg6Has.png
Fixed.
Thanks!
feos wrote:
jlun2 wrote:
Another bug: Right click the branches box here: http://i.imgur.com/ngd1Y50.png Move the mouse slightly next to the tooltip shown, and right click again on the branch box. It will give an error: https://pastebin.com/UkHjJdnr http://i.imgur.com/qgNTAxq.png
I don't understand this.
Right on that area to make the box appear, then move cursor away from the tooltip, and right click again on the exact same area as before, without closing the tooltip. The error would then appear. Still occurs in the latest version of BizHawk. Also 2nd bug: 1. Select m-gba core 2. Open SpongeBob SquarePants - Lights, Camera, Pants! (USA).gba 3. Open TAStudios 4. Open this file in TAStudios: https://drive.google.com/open?id=0B-2O13fpsnI4akZwMWJ3ZFd2QUk 5. Play it until frame 1500 or so; you should see: 6. In the piano roll, click on frame 1158 or so and make a marker. (Do not change the input!) 7. Click on the marker to go back to the frame in step 6. 8. Play the movie to 1500 or so again. This time this message appears: Even though literally nothing was changed. No idea what happened, but loading a savestate in TAStudios completely changed the result.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Hey, the movie is out (sorta). So far, for the first day, it has 6.3/10 in IMDB. It'll probably change in the future, but hey, maybe your views may differ.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
For Easydog, the plan is as follows: 1. Rupicola crits Cotta (Natural) by hitting 77+ 2. Akretto appears, and crits 31 on Easydog. Cotta then crits 70+ on Easydog 3. Rupicola crits Kanzou (T2) by hitting 80+ Now I have no idea how to deal the last hit. I have 2 options: 1. Have Akretto appear again, hit 31, then use Cotta's normal attack to KO easydog. 2. Ignore Akretto, and just use spec on Easydog The former will save me 30 DP, but manipulating is hard as hell. The latter will save me frames, but that makes my DP before Entio (2nd last fight) to 40/100 I can crit 47 with ally (Akretto) on Ryuugu, and hit 27 with Cotta, both via crit. This is just enough to land 74, allowing me to 2TKO. I'm going to mess around first. Edit: So it turns out, in terms of speed, Cotta is somewhat faster than Entio and cohorts, so it only allows me 1 chance to heal before I'm able to hit again. So this pretty much means I'm forced to choose option 2 in Easydog. Also, it technically doesn't matter, since I'll heal before the last boss anyways, but Akretto is strong enough to 2TKO Ornithogalum. lol Edit2: It seems even with hitting 67's, the final boss still requires 3.4 (or 4 turns) to defeat, while the cohorts can all be OHKO'd. That means 6 spec's are needed, or 2 DP drinks. I think I can get that final drink while running to Ryuugu. Edit3: Turns out its 411 frames or so faster to ignore ally in Easydog fight, and just crit 4 times instead. http://tasvideos.org/userfiles/info/42147740708672456 Edit4: https://imgur.com/a/bntNL The 2nd last cave is large as hell. bleh.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Download Chef modern.lua
Language: lua

memory.usememorydomain("Combined WRAM") food_address = {[1] = 0x03C748, [2] = 0x03C75C, [3] = 0x03C770, [4] = 0x03C784} x_yoshi = 0x03C358 --[[ Peach 03C351 Peach direction 03C352 0 is left, 1 is right If food is at col 0, peach should be at col 0 and 0 direction If food is at col 1, peach should be at col 0 and 1 direction If food is at col 1, peach should be at col 1 and 0 direction If food is at col 2, peach should be at col 1 and 1 direction If food is at col 2, peach should be at col 2 and 0 direction If food is at col 3, peach should be at col 2 and 1 direction If food is at col 3, peach should be at col 3 and 0 direction If food is at col 4, peach should be at col 3 and 1 direction Yoshi should be at whatever col food is if its the target ]]-- local function move(direction) if direction == "right" then joypad.set({Right = true}) emu.frameadvance() emu.frameadvance() emu.frameadvance() elseif direction == "left" then joypad.set({Left = true}) emu.frameadvance() emu.frameadvance() emu.frameadvance() end end local function travel(destination) local peach = memory.readbyte(0x03C351) local direction = memory.readbyte(0x03C352) local left = {[0]=true,[2]=true,[8]=true,[12]=true} local right = {[1]=true,[3]=true,[9]=true,[13]=true} if destination == 0 then --food is far left side if peach > 0 then repeat move("left") until memory.readbyte(0x03C351) == 0 --otherwise "peach" never updates elseif peach == 0 then if left[direction] == nil then joypad.set({A = true}) emu.frameadvance() end end elseif destination == 4 then --food is far right side if peach <3> 1 then repeat move("left") until memory.readbyte(0x03C351) == 1 --otherwise "peach" never updates end elseif destination == 2 then --food is 2 steps to the right if peach > 2 then repeat move("left") until memory.readbyte(0x03C351) == 2 --otherwise "peach" never updates end if peach < 1 then repeat move("right") until memory.readbyte(0x03C351) == 1 --otherwise "peach" never updates end if peach == 1 then if right[direction] == nil then joypad.set({A = true}) emu.frameadvance() end end if peach == 2 then if left[direction] == nil then joypad.set({A = true}) emu.frameadvance() end end elseif destination == 3 then --food is 3 steps to the right if peach <2> 0 then repeat move("left") until memory.readbyte(0x03C351) == 0 --otherwise "peach" never updates elseif peach == 0 then if right[direction] == nil then joypad.set({A = true}) emu.frameadvance() end end elseif destination == 4 then --food is far right side if peach <3> 1 then repeat move("left") until memory.readbyte(0x03C351) == 1 --otherwise "peach" never updates end elseif destination == 2 then --food is 2 steps to the right if peach > 2 then repeat move("left") until memory.readbyte(0x03C351) == 2 --otherwise "peach" never updates end if peach < 1 then repeat move("right") until memory.readbyte(0x03C351) == 1 --otherwise "peach" never updates end if peach == 1 then if left[direction] == nil then joypad.set({A = true}) emu.frameadvance() end end if peach == 2 then if right[direction] == nil then joypad.set({A = true}) emu.frameadvance() end end elseif destination == 3 then --food is 3 steps to the right if peach <2> 0 and food[nearest_i].state == 1 then travel2(nearest_x) end gui.drawText(0,85,nearest_i..": Time:"..nearest_y.." X:"..nearest_x) gui.drawText(0,100,"Yoshi:"..memory.readbyte(x_yoshi).."Food:"..memory.readbyte(0x03C35B)) gui.drawText(0,115,"Peach:"..memory.readbyte(0x03C351)) emu.frameadvance() end
My attempt at botting Chef (Modern). In comparison, the classic script looks like this: Download Chef Classic.lua
Language: lua

memory.usememorydomain("EWRAM") local m = {[0]=0x03C62A,[1]=0x03C6A6,[2]=0x03C722,[3]=0x03C79E} while true do for i = 0, 3 do if (memory.readbyte(m[i]) == 0) then local p = memory.readbyte(0x03C1D8) if (i == 0) and (p == 1) then joypad.set({Left = 1}) elseif (i == 0) and (p == 2) then joypad.set({B = 1}) elseif (i == 0) and (p == 3) then joypad.set({Left = 1}) elseif (i == 1) and (p == 0) then joypad.set({Right = 1}) elseif (i == 1) and (p == 2) then joypad.set({B = 1}) elseif (i == 1) and (p == 3) then joypad.set({Left = 1}) elseif (i == 2) and (p == 0) then joypad.set({Right = 1}) elseif (i == 2) and (p == 1) then joypad.set({A = 1}) elseif (i == 2) and (p == 3) then joypad.set({Left = 1}) elseif (i == 3) and (p == 0) then joypad.set({Right = 1}) elseif (i == 3) and (p == 1) then joypad.set({A = 1}) elseif (i == 3) and (p == 2) then joypad.set({Right = 1}) end end end emu.frameadvance() end
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
How accurate is the mednafen core BizHawk used first? I'm not exactly familiar with emulation of PSX, but I recall it's not exactly at a state where any emulator is far more accurate than the others. Think it might be worth waiting longer (eventually).
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I'm not sure how it would be accepted, but apparently it's possible to TAS with a actual wiiu using homebrew: Thread #19525: The Legend of Zelda: Twilight Princess HD It's only for zelda games for now, but just posting this here if there's any ideas on using this in the future.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
That's amazing! How feasible is making something like this on other consoles? It would greatly help testing bugs that rely on accurate emulation. How was this done?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Can someone please make an encode of this on what exactly I should be looking at, and how it would look like without the glitch? I tried clicking the twitch links, but it's 18 minutes long, and I'm not sure what I'm looking at.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Kinda late, but since I got stuck in Telefang 2, I decided to check which day 2 route is faster. I made an unoptimized playthrough and got: ~09:38.33 (34700 frames) to reach end using house path ~07:11.67 (25900 frames) to reach end using subway path The reason for the time saved is due to the sequence break with the guard regret. I will upload a vid of what I meant. I can check which day 3 (hotel/karaoke club) path is faster later. ~08:41.67 (31300 frames) to reach end using hotel path ~ 06:51.67 (24700 frames) to reach end using karaoke club Last branch: ~07:43.17 (27790 frames) to reach end using Kenta's grave path. ~08:54.83 (32090 frames) to reach end using Naoki's grave path. Edit: https://www.youtube.com/watch?v=tv9U654d9Rk Edit2: I found out that the hotel level's basement has 3 regrets possible. Since a bunch of X/Y positions are hard for me (and probably others) to visualize, I made a script that tries to display where the enemies are, along with their direction, relative to the player being center: Download namelessdisplay.lua
Language: lua

player = {x = 0x21347FC, y = 0x2134804, camx = 0x2134820, camy = 0x2134822} --camx in terms of upright view; same for camy. so camx looks up/down regret = 0x2133828 local centerx = 127 local centery = 96 local abs = math.abs --[[ These are not needed, since they are all offset by each other. Here for reference: regret1 = {x = 0x2133828, y = 0x2133830, destx = 0x21338B8, desty = 0x21338C0, angle = 0x213384C} regret2 = {x = 0x2133AD8, y = 0x2133AE0, destx = 0x2133B68, desty = 0x2133B70, angle = 0x2133AFC} regret3= {x = 0x2133D88, y = 0x2133D90, angle = 0x2133DAC} regret4= {x = 0x2134038, y = 0x2134040, angle = 0x213405C} --the following when moving forward --camy = 12.000 x decreases --camy = 4.000 x increases; 0 degrees? --camy = 8.000 y decreases --camy = 0.000 y increases (this is same as 16); so this means 270 degrees ]]-- --Declarations here --[[ GetStats by FatRatKnight http://tasvideos.org/forum/viewtopic.php?p=458672#458672 ]]-- local function GetStats(addr,o) o = o or {} --Construct a table if we didn't get one o.X = memory.readlongsigned(addr)/4096.0 o.Y = memory.readlongsigned(addr+0x8)/4096.0 o.destX = memory.readlongsigned(addr+0x90)/4096.0 o.destY = memory.readlongsigned(addr+0x98)/4096.0 o.Angle = memory.readlongsigned(addr+0x24)/4096.0 --... And so on return o end function to_Radian(cam) local short = 65535/4096.0 --short to 20.12 format local radian = short/math.rad(360) --Divide this to convert to radians return (cam/radian)-math.rad(90) --Apparently to make "0" point up end --function to return coords based on their position function return_coords_x(player_x, enemy_x, enemy_diffx) if player_x == enemy_x then return centerx end if player_x <enemy_x> enemy_x then --Enemy is to the left of player return centerx - enemy_diffx end end function return_coords_y(player_y, enemy_y, enemy_diffy) if player_y == enemy_y then return centery end if player_y <enemy_y> enemy_y then --Enemy is "below" player (lower y == higher up in screen) return centery + enemy_diffy end end --returns difference depending on conditions function difference(num1, num2) if num1 <0>= 0 then return abs(num1 - num2) elseif num1 >= 0 and num2 < 0 then return abs(num2 - num1) else return abs(abs(num1) - abs(num2)) end end function display() local Enemy = {} local playerx = memory.readlongsigned(player.x)/4096.0 local playery = memory.readlongsigned(player.y)/4096.0 local playercamx = memory.readshort(player.camx)/4096.0 local playercamy = memory.readshort(player.camy)/4096.0 local regret_difx local regret_dify --for their target destination coords local regret_difx_dest local regret_dify_dest local directionx = 20*math.cos(to_Radian(playercamy))+centerx local directiony = 20*math.sin(to_Radian(playercamy))+centery local regret_color = "white" for i= 1, 3 do Enemy[i] = GetStats(regret + (i-1)*0x2B0) --i-1 for 1 offset array with 0 offset addresses. Horrifying, I know. --if end --For reference gui.drawtext(0,0,"Player: ("..string.format('%.6f',playerx)..","..string.format('%.6f',playery)..")") gui.drawtext(0,10,"Camera: ("..string.format('%.6f',playercamx)..","..string.format('%.6f',playercamy)..")") gui.drawtext(0,20,"Regret 1: ("..string.format('%.6f',Enemy[1].X)..","..string.format('%.6f',Enemy[1].Y)..")"..string.format('%.6f',Enemy[1].Angle)) gui.drawtext(0,30,"Regret 2: ("..string.format('%.6f',Enemy[2].X)..","..string.format('%.6f',Enemy[2].Y)..")"..string.format('%.6f',Enemy[2].Angle)) gui.drawtext(0,40,"Regret 3: ("..string.format('%.6f',Enemy[3].X)..","..string.format('%.6f',Enemy[3].Y)..")"..string.format('%.6f',Enemy[3].Angle)) --Drawing for player gui.line(centerx-5,centery-5,centerx+5,centery+5,"white") gui.line(centerx-5,centery+5,centerx+5,centery-5,"white") gui.line(centerx,centery,directionx,directiony,"white") --My direction --Display location of regrets relative to you, at the center for i = 1, 3 do --Shitty heurestic to determine if present if (Enemy[i].X ~= 0) and (Enemy[i].Y ~= 0) then regret_difx = difference(playerx,Enemy[i].X) regret_dify = difference(playery,Enemy[i].Y) regret_difx_dest = difference(playerx,Enemy[i].destX) regret_dify_dest = difference(playery,Enemy[i].destY) --Placement relative to player --Placement relative to player regret_difx = return_coords_x(playerx, Enemy[i].X, regret_difx) regret_dify = return_coords_y(playery, Enemy[i].Y, regret_dify) regret_difx_dest = return_coords_x(playerx, Enemy[i].destX, regret_difx_dest) regret_dify_dest = return_coords_y(playery, Enemy[i].destY, regret_dify_dest) --Destination if (Enemy[i].X ~= Enemy[i].destX) or (Enemy[i].Y ~= Enemy[i].destY) then regret_color = "red" gui.line(regret_difx,regret_dify, regret_difx_dest, regret_dify_dest,regret_color) else regret_color = "white" end regret_dirx = 20*math.cos(to_Radian(Enemy[i].Angle)) + regret_difx regret_diry = 20*math.sin(to_Radian(Enemy[i].Angle)) + regret_dify gui.drawtext(math.floor(regret_difx), math.floor(regret_dify),"R"..i,regret_color) gui.drawtext(math.floor(regret_difx_dest), math.floor(regret_dify_dest),"D"..i,regret_color) gui.line(regret_difx,regret_dify,regret_dirx,regret_diry,regret_color) end end end gui.register(display)
The other places with 3 regrets are the school, and the grave paths. Edit3: At the school location, it doesn't appear possible to sequence break sadly. Either the regrets were too close to the doors, or said doors were locked. Also it took ~13:29.17 (~48,550 frames) to beat the school stage. Edit4: Choose Subway, then Karaoke club, then finally Kenta's grave for optimal any%. Edit 5: Things attempted, but failed to skip at the hospital: -Attempting to reach the curtain in the first room and skipping the red girl (doesnt work; curtain non-interactable) -Attempting to skip the red girl in the first cursed game section (stairs not interactable) -Attempting to skip the part where the 3 red girls gang up on you in the cursed game (stairs not interactable) -Can skip the cursed platformer section if you can somehow cross the gap -Attempting to skip the detour to the surgery room after the nursery fails, since the hallway doors would be locked until you entered and interacted with the white girl. Also the Hospital takes ~09:49.27 (35356 frames) to get through.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
FatRatKnight wrote:
Oh, now that's an interesting page. What's this metatable thing? I'll admit there's a few things I still don't know. Well, I get the impression you want to do something like this: Enemy[1].HP_Now Enemy[6].Attack This would require another table. In this sense, you can do a for loop to create each thing. This is sort of what I'm thinking of. Is this the right sort of direction you want? Or would you prefer full-blown class style treating each table like a full object?
Yes, this is what I had in mind. Thanks very much!
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I found out the some friend denjuu work very well against Ryuuguu. For instance, even without boosts, having Kaya attack it would result in this: That's a 30% damage per hit. I'm gonna try different friends on the last 4 bosses to see if it has any time saver. I don't think I managed to get a 3 turn KO with Easydog boss like this however. Edit: Kaya's rocket punch move hits like 7 at final boss. Ruccus falling rocks hit 5 Edit2: Managed to recruit Cotta + Kaya, but takes like 323 frames of waiting. Since this seems to benefit no bosses but Ryuuguu. it would be helpful to find a similar ally that can also 3 turn kill Ryuuguu. Ryuuguu - 148 HP Right now: Kaya hits 43, Cotta hits 20, dealing 63 damage a turn. To maintain the 3 turn kill, I need an ally to hit at least 30. http://tasvideos.org/userfiles/info/41613913841286133 Input file that recruits Cotta with Kaya. I'm uploading this here in case wasting time to achieve 2 turn KO ends up faster. Edit: I'm still trying to manipulate Kaya to appear quicker. Here's a list of other allies possible; all which cannot 2HKO Ryuuguu Download blocklist.lua
Language: lua

memory.usememorydomain("IWRAM") local blocklist = { [0] = "Muscovy (Basic)",[1] = "Muscovy (Natural)",[2] = "Muscovy (Aquatic)",[5] = "Fraby (Basic)",[6] = "Fraby (Mountain)",[7] = "Fraby (Sky)",[8] = "Kagu (Basic)",[9] = "Kagu (Natural)", [10] = "Purchera (Basic)",[11] = "Purchera (Sky)",[12] = "Purchera (Forest)",[13] = "Mentalis (Basic)",[15] = "Mentalis (Forest)",[16] = "Mentalis (Grassland)",[17] = "Karinota (Basic)",[18] = "Karinota (Grassland)",[19] = "Karinota (Mountain)", [28] = "Anpipitto (Basic)",[29] = "Anpipitto (Sky)",[34] = "Cotta (Basic)",[35] = "Cotta (Natural)",[36] = "Cotta (Desert)", [40] = "Willcock (Basic)",[42] = "Willcock (Forest)",[43] = "Skrippa (Basic)",[44] = "Skrippa (Aquatic)",[45] = "Cabot (Basic)",[46] = "Cabot (Natural)",[47] = "Makyuretto (Basic)",[48] = "Makyuretto (Natural)",[49] = "Makyuretto (Grassland)", [51] = "Coronet (Basic)",[52] = "Coronet (Aquatic)",[53] = "Coronet (Grassland)",[54] = "Tataupa (Basic)",[55] = "Tataupa (Desert)",[56] = "Tataupa (Forest)",[58] = "Chigomozu (Natural)",[59] = "Koikaru (Basic)", [60] = "Koikaru (Natural)",[61] = "Koikaru (Forest)",[62] = "Pewee (Basic)",[64] = "Pewee (Aquatic)",[65] = "Pewee (Mountain)",[66] = "Chapmani (Basic)",[67] = "Chapmani (Natural)",[68] = "Hyuming (Basic)",[69] = "Hyuming (Natural)", [71] = "Pamirio (Basic)",[72] = "Pamirio (Natural)",[73] = "Pamirio (Sky)",[74] = "Pamirio (Desert)",[75] = "Mistashi (Basic)",[76] = "Mistashi (Forest)",[77] = "Mistashi (Aquatic)",[85] = "Penelope (Basic)",[86] = "Penelope (Aquatic)",[87] = "Penelope (Mountain)", [94] = "Alpina (Basic)",[97] = "Alpina (Sky)",[100] = "Bicolour (Basic)",[101] = "Bicolour (Natural)",[102] = "Hermit (Basic)",[106] = "Phoebe (Basic)",[107] = "Phoebe (Aquatic)",[108] = "Phoebe (Desert)", [111] = "Rabricol (Basic)",[112] = "Rabricol (Natural)",[113] = "Rabricol (Aquatic)",[114] = "Demerus (Basic)",[117] = "Sparsa (Basic)",[119] = "Sparsa (Forest)", [120] = "Purprea (Basic)",[121] = "Purprea (Sky)",[122] = "Purprea (Grassland)",[126] = "Regulus (Basic)",[127] = "Regulus (Desert)",[128] = "Regulus (Sky)",[129] = "Akretto (Basic)", [130] = "Akretto (Natural)",[131] = "Akretto (Grassland)",[135] = "Tectus (Basic)",[136] = "Tectus (Natural)",[137] = "Serrata (Basic)",[138] = "Serrata (Sky)",[139] = "Serrata (Forest)", [140] = "Kaya (T2)",[141] = "Beebalm (T2)",[142] = "Easydog (T2)",[143] = "Ruscus (T2)",[145] = "Kanzou (T2)",[146] = "Ornithogalum (T2)",[149] = "Suguri (T2)", [150] = "Suguline (T2)",[151] = "Saiguliger (T2)",[152] = "Punica (T2)",[153] = "Punisto (T2)",[154] = "Oshe (T2)",[57] = "Chigomozu (Basic)",[159] = "Gust (T2)", [165] = "Waratah (T2)",[166] = "Enteiou (T2)",[167] = "Gumi (T2)" } while true do currentID = memory.readbyte(0x4207) if blocklist[currentID] ~= nil then currentNPC = blocklist[currentID].."("..currentID..")" gui.text(50,50,currentNPC) end gui.text(50,70,"IGNORE THIS:"..currentID) emu.frameadvance() end
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Fog wrote:
It's emulating the GPU pipeline, which helps eliminate the stutters in normal playback.
Sorry for bothering you again, but reading the latest dev blog, I googled "what is gpu pipeline" gave this link https://en.wikipedia.org/wiki/Graphics_pipeline
A computer graphics pipeline, rendering pipeline or simply graphics pipeline, is a conceptual model in computer graphics that describes what steps a graphics system needs to perform to render a 3D scene to a 2D screen.
How exactly does one emulate a conceptional model? This probably sounds very ignorant, but how does one emulate a concept?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I wish to keep track of individual enemies. Right now, I have a for loop that starts from some beginning address to some final one, but attempting to toggle it to display individual npcs made it confusing. I'm trying to instead make it like classes:
Language: lua

local Enemy_data = { Level, HP_Max, HP_Now, DP, Speed, Attack, Defence, Special, Nature, FD, Friend, Attack1, Attack2, Attack3, Attack4 }
Then have npcs 1,2,3...N all refer to copies of that class. I realized I have no idea how to do this other than copypasting the above N amount of times. Searching for lua classes gave this, but I'm not exactly sure how to implement it. Any hints please?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Ultimatesaber27 wrote:
this one: https://youtu.be/JI7wzJm4zys?t=52m28s
Reminds me of what I did in the Jurrasic Park NES TAS. I think you should include it if there's no way to skip it.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I haven't followed this in a while, but after realizing all the new discoveries along with 0 B press strats this game actually starts looking quite different in general compared to the original outside "no BLJ + more characters". Nice!🙂
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Ultimatesaber27 wrote:
What about a game that has a mini-level that plays until after the credits? Should i leave it at the last input before the credits or do i have to complete that level?
Well, the Kirby & the Amazing Mirror run along with the Smash Bros Melee run both do it, so you can complete it I guess? What game do you have in mind?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Really_Tall wrote:
This saves another 35 minutes by skipping Gritzy Desert, the Koopaseum and Gritzy Caves, for about 1:30 saved total. https://youtube.com/watch?v=dQZPOhA5cqM
Not exactly how desert skip was imagined, but hey, at least it's skippable now. 1. What versions should the run be done on now? 2. If you were to beat the game up to the UFO battle at the Princess Shroob statue, and then went back outside the castle to play the game's story "normally", would it allow you? 3. With every area before the desert out of the way, any more other potential skips? 4. How viable is it in real time? Not just the execution, but the final fights due to severe underleveled.