Joined: 9/12/2014
Posts: 540
Location: Waterford, MI
Its also rather suboptimal. Guard scorpion could be done better. Critical hits unless bad RNG occurs. About the goal choice, wouldn't "no slots" be a bit arbitrary too? According to the rules, a goal choice that avoids a weapon or something the game has to offer is not allowed. No slots is just as arbitrary as no escape. I've uploaded my WIP1 file to movie storage.
Joined: 1/26/2009
Posts: 558
Location: Canada - Québec
Honestly, I'll rather see a TAS with arbitrary rules than waiting for an optimal run that may "never happen"(despite a huge personal/community effort). Why? Well, the process of getting everything optimized is always bound to create a need to redo previous part of the game as new technique could be uncovered only at later part of the game... So keep up the good works and have fun! Even if you attempt to run a RNG script to escape all battle, this will probably be tedious and may even kill your motivation if you have to redo important parts of the game for unpredictable reason. As for the publication value of the run, wait why does anyone care about the publication? Anyway, I guess there's always the vault... (tip: describe the arbitrary objectives more as "possible improvements" in the improvement section in your submission text) Thought, even if this gets completely rejected, I believe your run shall definitely help to build a second run with sane base. That being said, why do you want to do a "no slots" run?
Samsara
She/They
Senior Judge, Site Admin, Expert player (2238)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
InfamousKnight wrote:
About the goal choice, wouldn't "no slots" be a bit arbitrary too? According to the rules, a goal choice that avoids a weapon or something the game has to offer is not allowed. No slots is just as arbitrary as no escape.
At this point, who knows? "No slots" might add enough entertainment value to the run due to battles requiring actual strategy, and that could make it a solid Moon contender, but if using Slots is the fastest way to end battles, then a run that uses them is almost guaranteed to be accepted no matter what, even if it's to Vault. As far as I'm concerned, if you're going to make and submit a run for any game that doesn't have a TAS yet, you might as well take the safest option possible. In this case, the safest option is using anything and everything that speeds up the run. Escaping from random battles, using Slots, whatever leads to the fastest overall result. As long as that run is optimized, it's guaranteed to be published. If people in the submission thread decide they want to see a "no slots" run, or a run that doesn't escape from any battles, then that's when you have the go-ahead to start making an optimized version intended for site submission.
BadPotato wrote:
As for the publication value of the run, wait why does anyone care about the publication?
Anyone can create any TAS they want at any time, but there are specific rules in place that prevent all of them from being publishable. All I said there is that if he intends to submit this run to the site in hopes of it getting published, the "no escapes" category is much too arbitrary to be accepted. I would much rather shoot something down now than shoot down the submission after weeks/months of work, all because of a single choice the author made.
(tip: describe the arbitrary objectives more as "possible improvements" in the improvement section in your submission text)
No. Don't do this. That's not going to help it get published. "Possible improvements" are for when you have ideas after watching the completed run, or when you find improvements way back in the run and don't have the motivation to redo weeks of work to implement them, or when you find improvements in the earlier parts of the run but they end up leading to losses later down the road. Intentionally not using things isn't a "possible improvement", it's a definite improvement that you're choosing not to use, which by itself is already grounds for rejection even before the category is factored in.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Joined: 9/12/2014
Posts: 540
Location: Waterford, MI
About optimization, would it be okay if I used an RTA route with "bad luck" removed and just had tas precision? Like first turns in every battle, random battles escaped immediately, avoiding world map encounters, getting hit on the first turn(to lower HP(for the powersoul)) or (get hit on the first turn(slots))? Or limit break before guard scorpion's tail. Things disregarded: critical hits, stealing, and item drops. That was kinda garlands idea in the first place. Production will be a lot faster, as getting crits in this game is a pain. I just hate Bad RNG. Gecko sent me a lua script on getting criticals, I haven't used it though in this run. I may restart this run using it.
Samsara
She/They
Senior Judge, Site Admin, Expert player (2238)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
InfamousKnight wrote:
About optimization, would it be okay if I used an RTA route with "bad luck" removed and just had tas precision? Like first turns in every battle, random battles escaped immediately, avoiding world map encounters, getting hit on the first turn(to lower HP(for the powersoul)) or (get hit on the first turn(slots))? Or limit break before guard scorpion's tail. Things disregarded: critical hits, stealing, and item drops.
For site submission? ...What? No. No, that's not okay at all. You don't get a free pass because you don't feel like dealing with RNG. ...How about I just say don't submit this run to the site at all? Do whatever you want in it, just don't submit it.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Pokota
He/Him
Joined: 2/5/2014
Posts: 779
InfamousKnight wrote:
About optimization, would it be okay if I used an RTA route with "bad luck" removed and just had tas precision? Like first turns in every battle, random battles escaped immediately, avoiding world map encounters, getting hit on the first turn(to lower HP(for the powersoul)) or (get hit on the first turn(slots))? Or limit break before guard scorpion's tail. Things disregarded: critical hits, stealing, and item drops.
It's a starting point, but for a full-on submission you'll need to account for the RNG. With how thoroughly this game's been disassembled, there's very little excuse to not.
That was kinda garlands idea in the first place. Production will be a lot faster, as getting crits in this game is a pain. I just hate Bad RNG. Gecko sent me a lua script on getting criticals, I haven't used it though in this run. I may restart this run using it.
That's probably your best bet for making a solid starting point for a publishable TAS. Specifically for criticals, I found this thread over on qhimm. So far that's been my best lead on finding a disassembly of the rng that wasn't the lua script.
Adventures in Lua When did I get a vest?
Joined: 9/12/2014
Posts: 540
Location: Waterford, MI
The idea of this speedrun is to compete with the "longplay" on cubex55 by RickyC. Despite being intentionally slow, he still beat the game in less than 20 hours. Same thing happened in my 2nd playthrough of this game. I had no idea what I doing during this playthrough. The only thing I knew was "where to go" and didn't know how the bosses fight. I've had trouble with Jenova Birth, Dyne, Gi nattack, materia keeper, Demons gate(this fight is hell if you don't know how he fights), Schizo, and then it was a breeze. So I'm just curios about the time at the end with "knowing exactly what you're doing and TAS precision". There are still some mistakes and obvious improvement but this is nothing serious.
Pokota
He/Him
Joined: 2/5/2014
Posts: 779
InfamousKnight wrote:
The idea of this speedrun is to compete with the "longplay" on cubex55 by RickyC.
For our community, you should at the very minimum be competing against a speedrun instead of a longplay. While I wouldn't object to watching your results (I love watching oddball runs), what you're proposing is very much outside the scope of the community here. Also, Longplays and Speedruns/TASes are at exactly opposite ends of the Showoff Spectrum. A Longplay goes out of its way to show off the game as it expects to be presented, while a TAS (should) be pushing the game to its limits, whether in terms of completion or technical exploitation.
Adventures in Lua When did I get a vest?
XkyRauh
He/Him
Joined: 6/9/2005
Posts: 171
Location: Southern California
A Longplay would take the time to read all the dialogue, explore all the scenery, and generally soak in the game as it is presented; a Tool Assisted Speedrun would skip or interrupt as much dialogue as possible, take any known shortcuts, and generally never stop moving.
Pokota
He/Him
Joined: 2/5/2014
Posts: 779
Working on updating a script I found further back in the thread for use with BizHawk/Octoshock.
Language: lua

function generateCrit(luck, level, foelevel) sum = mainmemory.read_u8(luck) + mainmemory.read_u8(level) - mainmemory.read_u8(foelevel) div = math.floor(sum / 4) return div end function generateRNG(addr1, addr2, addr3) step1 = mainmemory.read_u8((addr2 + mainmemory.read_s32_le(addr3) + 1) % 8) step2 = mainmemory.read_u8(addr1 + step1) step3 = mainmemory.read_u8((addr2 + mainmemory.read_s32_le(addr3) + 2) % 8) step4 = mainmemory.read_u8(addr1 + step3) step5 = step4 * 256 step6 = step2 + step5 return math.floor((step6*99)/65535)+1 end while true do crit1 = generateCrit(0xf83f5, 0xf83e9, 0xf8589) crit2 = generateCrit(0xf845d, 0xf8451, 0xf8589) crit3 = generateCrit(0xf84c5, 0xf84b9, 0xf8589) crit_rng = generateRNG(0x83084, 0x62e10, 0x62e18) if crit1>=crit_rng then gui.text(0,50,"Critical Hit from Character 1!") else gui.text(0,50,"") end if crit2>=crit_rng then gui.text(0,60,"Critical Hit from Character 2!") else gui.text(0,60,"") end if crit3>=crit_rng then gui.text(0,70,"Critical Hit from Character 3!") else gui.text(0,70,"") end gui.text(0,30,"Enemy 1 crit% = " .. crit1 .. " " .. crit2 .. " " ..crit3) gui.text(0,40,"crit_rng = " .. crit_rng) emu.frameadvance() end
Addresses should mostly be right (they're known values for the most part) but the script as implemented here is probably very wrong, which a large part of that can be attributed to me not constantly checking against the asm as I converted the script. I need to better learn the underlying asm so that I can reimplement this accurately.
Adventures in Lua When did I get a vest?
Pokota
He/Him
Joined: 2/5/2014
Posts: 779
I took another look through the first movie; how much time is lost from field message speed not being set to the fastest setting?
Adventures in Lua When did I get a vest?
Joined: 9/12/2014
Posts: 540
Location: Waterford, MI
Heh, I'm interesting in knowing that too. Its hard to say. Looking forward to this becoming a "matter of execution" where we don't need patience to manipulate luck. Draqon quest 4 is being reworked on because of all the luck manipulation tools. What I would like: critical hit script, steal script, first turn script(I can probably make this), elevator battle script if you want. For all that to work with bizhawk.
Pokota
He/Him
Joined: 2/5/2014
Posts: 779
I'll need the ram addresses and algorithms for most of that. The critical hit script I was working off of only looked at one monster, and there are as many as five enemy slots. What I have:
Language: lua

-- Definitions and relative addresses are referencing http://wiki.qhimm.com/view/FF7/Battle/Battle_Mechanics rng_index = 0x62e18 rng_table = 0x62e10 enemies = { ["levels"] = { [0]=0xf8589, [1]=0x0, [2]=0x0, [3]=0x0, [4]=0x0 }, ["health"] = { [0]=0x0, [1]=0x0, [2]=0x0, [3]=0x0, [4]=0x0 }, ["ATB"] = { [0]=0x0, [1]=0x0, [2]=0x0, [3]=0x0, [4]=0x0 } } team = { ["levels"] = { [0]=0xf83e9, [1]=0xf8451, [2]=0xf84b9 }, ["luck"] = { [0]=0xf83f5, [1]=0xf845d, [2]=0xf84c5 }, ["charindex"] = { [0]=0x0, [1]=0x0, [2]=0x0 }, ["ATB"] = { [0]=0x0, [1]=0x0, [2]=0x0 }, ["Limit"] = { [0]=0x0, [1]=0x0, [2]=0x0 } } function getAeri(value) if (value >= 0x100) then newvalue = value % 256 getAeri(newvalue) elseif (value >=0) then timer = bit.band(bit.ror(value,4),1) if timer == 0 then return "Aeris" elseif timer == 1 then return "Aerith" else return "error in function getAeri() - timer is neither odd nor even" end else return "error in function getAeri() - was passed negative value" end end protags = { [0] = "Cloud", [1] = "Barret", [2] = "Tifa", [3] = "The Slum Drunk", -- This gets overwritten by the GetAeri() function anyway [4] = "Red XIII", [5] = "Cait Sith", [6] = "Cid", [7] = "Yuffie", -- The Young Cloud/Sephiroth flags are unneccesary for the purposes of this script, [8] = "Vincent" -- as those battles should only slow down to Sephiroth reviving Young Cloud. } function generateCrit(luck, level, foelevel) sum = mainmemory.read_u8(luck) + mainmemory.read_u8(level) - mainmemory.read_u8(foelevel) div = math.floor(sum / 4) return div end function generateRNG(addr1, addr2, addr3) table_offset = mainmemory.read_s32_le(addr3) step1 = mainmemory.read_u8(addr2 + (table_offset + 1)) % 8 step2 = mainmemory.read_u8(addr1 + step1) step3 = mainmemory.read_u8(addr2 + (table_offset + 2)) % 8 step4 = mainmemory.read_u8(addr1 + step3) step5 = bit.lshift(step4, 0x8) step6 = step2 + step5 return math.floor((step6*99)/0xFFFF)+1 end while true do --[[crit_table = {} for i = 0, 2 do for j = 0, 4 do crit_table[i][j] = generateCrit(team.luck[i], team.level[i], enemies.level[j] end end]] rindex = mainmemory.read_u8(rng_index) rvalue = mainmemory.read_u8(rng_table + rindex) crit_rng = generateRNG(0x83084, rng_table, rng_index) gui.text(0, 20, "RNG Index " .. rindex .. " = " .. rvalue) gui.text(0, 40, " Crit RNG = " .. crit_rng) gui.text(0, 60, " " .. getAeri(rvalue)) -- Pass rindex for version 1 behavior, pass rvalue for version 2 behaviour, pass crit_rng for version 3 bahevir. emu.frameadvance() end
Adventures in Lua When did I get a vest?
Joined: 9/12/2014
Posts: 540
Location: Waterford, MI
"The slumdrunk" lol, did you get that from my test speedrun(any%) or xerokynos hardmod speedrun joke thing? Anyways, people have already found the memory addresses for ATB for ally and enemies. I haven't done programming in a while, so I might not be very helpful with this. I think its safe to say luck manipulation sucks. My biggest aggravation is bad RNG. I mean, you could just make a savestate, keep on retrying until you lose your patience. Go up to the last frame, savestate again, try again later. Until you get it. Not to mention sometimes luck manipulation looks ugly.
Pokota
He/Him
Joined: 2/5/2014
Posts: 779
I got fed up with the Aeris/Aerith argument and decided to just use a placeholder name (that and it's usually the option I pick on my casual runs). Once everything else is in place and ready for production protags[3] really will get overwritten by getAeri(crit_rng). Regarding addresses, if you have them please share them and save me the time of researching them myself so that I can implement/test. Even if you're just linking to a page that someone else put up. E: Do you have a movie file up through getting the PHS? I don't really want to play my own way through Midgar and the Flashback.
Adventures in Lua When did I get a vest?
Joined: 9/12/2014
Posts: 540
Location: Waterford, MI
Well, I have the memory addresses in a wch file: https://www.dropbox.com/s/gg3ketpsoxnt0kk/atb.wch?dl=0 For PHS, do you just want a movie that plays through the kalm flashback up to PHS? Like it stops right before you get PHS?
Pokota
He/Him
Joined: 2/5/2014
Posts: 779
Right before PHS is fine; I just don't want to play through the flashback. You can upload wch files to userfiles, by the way.
Adventures in Lua When did I get a vest?
Joined: 9/12/2014
Posts: 540
Location: Waterford, MI
Alright. Right before getting PHS is on my userfiles. Why do you want to know about obtaining PHS? Is there some ram in there that looks useful?
Pokota
He/Him
Joined: 2/5/2014
Posts: 779
Nah, I just want to have some good control over party composition so that I can pin down the addresses for team.charindex. The PHS is just the first time we have full-ish on-demand party composition control. If you're interested, we could use a github repository to coordinate this work better instead of clogging up the thread with it.
Adventures in Lua When did I get a vest?
Joined: 5/13/2013
Posts: 3
I made a test run on psxfin 2.0.2 and use U version and ended the game in about 7 hours after I finished it I learned about many things can make the run too shorter # i can change the cd to make the FMVs very short and not get the please insert CD screen # the walk on last frame during running which make the random encounter less by 25% but therethere are problems I couldn't solve # in Shinra's elevatorelevator I can't get only 1 encounter (on my 1st run i get only 1 encounter) # on the marshing minigame the % start very low (13%) so I can't get the money (also on my 1st run I start with about 30%) # on the slap minigame I cant get Tifa make perfect 5-0 (on my 1st run I get a PERFECT slap) # Tifa base strength is very low compared to my 1st run Anyone have any ideas how thesethese randomness occur ?
Joined: 9/12/2014
Posts: 540
Location: Waterford, MI
Do you have the video dumped anywhere? As for answers to those problems, the elevator outcomes are manipulated by changing frames. You have to get certain numbers. Can't remember what they were.. I have also had difficulties with the marching % numbers. I tried waiting frames, but that did nothing.. You can also try walking around.
Former player
Joined: 11/25/2009
Posts: 77
turgish wrote:
# i can change the cd to make the FMVs very short and not get the please insert CD screen
I hope you weren't planning on submitting a movie file for a (and I'm not exaggerating it) modded game? Other people would have to edit the game data exactly the way you did... If you want to shorten the video as a whole (not the recorded time), I'd suggest you do it in post instead. They've done that with a TAS of The Legend of Zelda: Majora's Mask also.
JosJuice
She/They
Editor, Emulator Coder
Joined: 7/3/2010
Posts: 193
Location: Sweden
Nisto wrote:
turgish wrote:
# i can change the cd to make the FMVs very short and not get the please insert CD screen
I hope you weren't planning on submitting a movie file for a (and I'm not exaggerating it) modded game? Other people would have to edit the FMV data exactly the way you did... If you want to shorten the video as a whole (not the recorded time), I'd suggest you do it in post instead. They've done that with a TAS of The Legend of Zelda: Majora's Mask also.
I think "change the cd" means to for instance eject disc 1 and insert disc 2, not to edit the data on the CD.
Pokota
He/Him
Joined: 2/5/2014
Posts: 779
Yeah if the "wrong" cd is in it'll still play but it'll play the wrong PRVs when they come up. It can be a decent time-save if you get the right ones, and I think there are PRVs on the first two discs that can be skipped entirely by inserting disc 3.
Adventures in Lua When did I get a vest?
Joined: 9/12/2014
Posts: 540
Location: Waterford, MI
During my latest testrun, I accidentally changed disc too early, and some FMVs were skipped. However, eventually the game froze, so I had to make a save file and reboot. Going back to normal FMVs on disc 2.