Posts for DarkKobold


Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Acheron86 wrote:
A lot of people have an overriding need for static categorization. That's basically the argument that's being had (re-had?) here. I still see no reason not to have a variety of runs for every game, as long as they don't suck.
Thats sort of the entire way this site works. If we didn't have categories, then nothing would ever be obsoleted. As much as Bisqwit intended this site to be a machinma site, it turned into a competition site. When klmz discovered the flag pole glitch in Super Mario 1, it could have been considered a different run from all previous iterations of the video, and therefore not obsoleted the older run. The same rings true for any glitch/alteration/etc to a run. This site would be overloaded with silly movies, and no way to separate the wheat from the chaff.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Here is a movie that takes you all the way to Darksol. This will be the last public WIP until the final submission. I've figured out how I'm going to beat Darksol. (No, it has nothing to do with the magic mirrors I picked up.) Now, I just have to go back and maximize all the levels, based on the info I've learned, as far as what stats are most important in the run. I was (thankfully) wrong. Dark Knight can be reduced to one attack per turn. Granted, it took about 10-20 minutes per round of Lua-run brute forcing to get those rounds to work as well as they did. Wachunga! Oh, as usual, I've written a ton of Lua scripts for the game, and I'll share those once the run is submitted. My favorite is pair of scripts, one which grab all of the walking done in a finished run, and the other that executes the same walking pattern while still avoiding encounters. Lag: I'm going to try and use those for a script that goes with the publication. It will make watching more fun, hopefully. Thanks!
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
maTO wrote:
Dark Knight in two turns? Z does perhaps 250 (a number from hat) with critical. Pyra does 64 with FireStaff and Gila whoops for 75. That's barely in three turns if DK regenerates for 100 / turn.
I mean per round. I think DK has a forced 2 attack minimum. I've yet to get that far in my testing. [/quote] -Crystal Ooze level ups. Get Forbidden Box from Serpi and manipulate instakill for 8 Crystal Oozes. -Magic Ring (Lokjaw) abuse. I don't know if Magic Ring has limited amount of charges or is the breaking based on luck.[/quote] 8*30K? Too much boring leveling, IMO. I'd rather take DarkSol down at the lowest level possible. I've got one trick up my sleeve that may or may not work... We shall see. Also, DAMMIT: I love the script, and I'm using it. It replaced my current location monitor.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Warp wrote:
Personally I don't find the idea of a non-glitched minimum-% run an absolutely abhorrent idea. I think we could have these Super Metroid categories: 1) Fastest completion, period. (As it happens, this is also the lowest-% completion.) 2) Fastest completion without using the save corruption glitch. 3) Lowest-% completion without using the save corruption glitch (AFAIK this would be the 14% completion). 4) 100% completion. Would still be 4 categories like now, but with a lot more variety.
I sorta agree with you. Except, I think it should be: 1) Fastest completion, period. and 2) 100% completion. I'm sure I'm in the minority, but that game just isn't that damn interesting. In reality, its a bunch of dark caverns, fighting a bunch of non-descript aliens, in repetitive black backgrounds. The 6% run and the 100% run are sufficient. Since it is such a popular game, it already has 4 categories. How much weight is going to be given to a single popular game? To be fair, I did enjoy the 6% run, mainly for the cool glitching through walls and offset graphics. Also, if there HAD to be 4 categories, I think Warp's idea is better than the current.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
maTO wrote:
I didn't know Blackbone could be skipped (end of Lab 3). And I was also surprised to see you rushing straight to Lab level 4. So, Z needs to get hp+def to withstand one hit from Dark Knight without defending and Milo be alive to heal Z (with healerfruits)? Also, isn't Light Blade needed from Lab 4. It doesn't take much time. Frost Armor could be the fastest armor to grab from a chest.
You read my mind. Creepy. A few changes - Light Helm also isn't far off the route. Also, the Healing Ring is right next to the Frost Armor. My last attempt has me getting the Sword from the unavoidable KromeBall. This weapon is far too weak to effectively kill Dark Knight. (It would be doable, but I estimate it will take more time than picking up Light Blade would, even with the extra fight required.) Also, he probably needs to survive 2 hits. I have no idea how I'm going to take down Darksol. Demon Breath will kill the entire party in one cast.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Agreed ComicalFlop - Encoding is difficult, and extremely difficult to do well. It has it's own language associated with it. I've failed miserably every time I try and encode. Gens produces horrible sounds (possibly due to onboard audio instead of an external card?) Snes9x, sounds desync quickly. I can't even get to compressing....
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Here is another iteration. This run takes you all the way to the Dark Knight, in 34 minutes. Unfortunately, in my current state, he is far too impossible to beat. I may have developed a strategy to take him down, but it will require a redo of the last 'section' of the game, or more. He is completely invulnerable to status effects, he starts with around 1K Hp (the previous boss only had 400), and he gains a fixed 100 Hp back per round, which maxes at 1K Hp. This means I need to do greater than 100 Hp per round to even have the ability to Oops! Sorry, here it is A few notes: I did alter parts of the strategy for the KK take down, but not much. It turns out getting the jump on the Pit Worms was slower than just confronting them. Also, Z with the Bronze Knife takes 5 rounds of hits to take KK down, which means too many herbs to make it worthwhile. It is down to 6:01 now, however. Pyra needs to hit level 4, but beyond that she is sort of useless compared to Z. She also needs to hit 50+ Hp by Floor 3 of the Labrynith. Whether to level her or Z in the Trials will be a big decision. (Also, why the two characters level different will be apparent when watching the current test run) The 2nd firestaff may be totally useless. All the bosses pre-Dark Knight can be killed with a single staff, and a little extra manipulation for Doppler. There is a TON of walking in this run, which will make mmbossman cry. Also, I figure the run time is going to be closer to 40 minutes at the same point, given the amount of extra prep DarkKnight will take. Also, WangChung is pinnacle to this run. He's required some interesting Lua coding to manipulate his appearance.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Saturn wrote:
As everybody can see, the decision which runs to revive was once again based on mmbossman's/adelikat's individual opinions, not the amount of suggestions other people did for the runs. Makes me wonder why we even had to start this thread to waste other peoples times after all... To make the best out of this situation, maybe we should at least delete any paragraph in guidelines (such as this one) that state that the "audience has voice", to not fool the people who read them before deciding to work on/submit their runs here? Since obviously this is not the case in this days anymore. Really sad to see why TASvideos has to deserve this fate, being such a great site in the past. I only hope Bisqwit will be more careful in the future when deciding to whom he gives judging powers.
I wouldn't be surprised if your attitude may have played a part in the decision. Simply stated, it would set a precedent - whine long and loud enough, and the moderators will bend to whatever you want. Perhaps if you had been slightly more polite, respectful, and courteous, your submission may have had another chance. Guess we will never know.
Saturn wrote:
Really sad to see why TASvideos has to deserve this fate, being such a great site in the past. I only hope Bisqwit will be more careful in the future when deciding to whom he gives judging powers.
Quoted again for emphasis. Your humility knows no bounds </sarcasm>. You really think your run decides the quality of this site. Amusing.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
kchrules wrote:
I do love this movie but: Why the hell hasn't it been published yet? Just make it an any% glitched run like Chrono Trigger, and move on. It's been like 2 months.
We lost our most prolific encoder. Between that, and the WB being filled with 'back-from-the-grue' movies... There is going to be a lot of sitting for a lot of movies. Once again, this site is run by volunteers. This happens, when people decide to stop volunteering.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Everything in my other posts still stands. This is a Yay for publication.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
This game is pretty easy to manipulate via brute forcing. Here is up to GrimWall- you were sort of right about level 6. http://dehacked.2y.net/microstorage.php/info/99860035/Shining%20in%20the%20Darkness%20(U)%20%5B!%5D.gmv Also, I think Kaiser could go down in 5 minutes, with a revised strategy. Option 1: No Short Sword 2 Pit worms/Bronze Knife (2Exp) Sell off all, buy Fur Robe/Gauntlet Return to Labrinyth, get Bronze Knife in Chest Pick up (4??) Angel Wings (for later) (10Exp) Level up to 2 Fighting 2x DarkOozes (16Exp) Fight 2x DarkBat, get HERB. (22Exp) Fight 2x and 1x KillerBee, level reaches 3 (34Exp) Pluses: No need for extra Herb in battle. Less Defense going in. Option 2: No Short Sword 4 Pitworms/Bronze Knife (4 Exp) Sell off all, buy Fur Robe/Leather Shield Return to Labrinyth, get Bronze Knife in Chest Pick up 3 Angel Wings (for later) (10Exp) Fight 1x Dark Ooze, Level 2. Fight 2 1x DarkBat/HERBs Possibly the fastest... but will Kasier go down with only a bronze knife? (Need to deal at least 14 damage to a 42 Hp Krab)
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
maTO - you were right, fighting Kaiser Krab at Level 3 was definitely not the way to go. However, this should still be entertaining. http://dehacked.2y.net/microstorage.php/info/364801196/Shining%20in%20the%20Darkness%20(U)%20%5B!%5D.gmv
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Stella http://stella.sourceforge.net/ If you look 3 threads down in this forum group, you'll see the Stella developers may already be adding some of the features for TAS recording. Unfortunately, when it comes to coding at anything above the scripting/microcontroller level, I'm about as useful as an ice maker to an eskimo.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Wow. This is all very interesting... Are we going to see a TAS that opens the cover, replaces the disc, and beats a totally different game halfway through? Or did something special have to happen with the game to keep the code running when the lid opens?
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
theenglishman wrote:
DarkKobold wrote:
theenglishman wrote:
And what about an easy-to-use, in-emulator, ISO-based disc switching?
Have you tried just saving to a memory card, then loading that memory card in a separate movie file?
a) I believe submitting two movie files in one submission is not allowed under TASvideos rules and b) there's no way to save in between discs. You can only save before and after.
Did MGS actually require a disk swap without a memory card? All of the Final Fantasy games forced you to save, power the console off, and then put in the next disc. I think for those games, swapping discs may not work, so multiple movie files maybe required - I'm sure the rules would change to accommodate new technologies. However, if MGS is like you say, that is bizarre. Interesting, I never knew that it could even be done.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
nineko wrote:
Bah, you disappointed me.
Because they aren't going to rewrite the site for your canceled, unpublishable submission? That is some gall you have there. Step off your throne, and realize that the world isn't going to bend to your desires. This site is run by volunteers, and you should be thankful of what they do to keep the site running.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
theenglishman wrote:
And what about an easy-to-use, in-emulator, ISO-based disc switching?
Have you tried just saving to a memory card, then loading that memory card in a separate movie file?
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
BadPotato wrote:
I've watch the run and enjoy it. So, almost 75% of the game was from your lua script with brute force and other stuff? I would love have more detail about how this work.
Actually, the majority wasn't brute force- First off, MATLAB was still used in this run to determine which 'battle orders' to use. I plug everything relevant into matlab (Character Start/End Locations, Agility Changes, Rules, Kills (dead enemies don't get the cursor), and targets.) My matlab script cuts the 2^16 battle orders down to a subset that pass all the Rules, and then computes the amount of cursor movement. Then, it calculates which group of orders produce the smallest amount of cursor movement for a battle. MATLAB spits out a list like this
MATLAB wrote:
Round 1 Loc: 45125 Order: 0 4 5 3 6 7 9 11 14 16 2 8 10 12 15 17 1 13 Round 2 Loc: 4666 Order: 1 10 8 2 0 3 4 5 6 7 11 13 14 15 9 Round 3 Loc: 55105 Order: 11 10 1 2 0 3 4 5 6 7 8 9 Round 4 Loc: 12773 Order: 1 2 0 4 5 6 3 10 11 Round 5 Loc: 3219 Order: 1 2 0 4 6 3 5 Loc: 5346 Order: 1 2 0 4 6 3 5 Loc: 6158 Order: 1 2 0 4 6 3 5 Loc: 23726 Order: 1 2 0 4 6 3 5 Loc: 28160 Order: 1 2 0 4 6 3 5 Round 6 Loc: 4263 Order: 0 6 2 3 4 1 Loc: 8490 Order: 0 6 2 3 4 1 Loc: 57773 Order: 0 6 2 3 4 1 Loc: 60437 Order: 0 6 2 3 4 1 Battle Length: 196
I then get to move on to actual TASing. Let say we are at the end of Round 2, and its about to be 9's turn. To make my life easier, I simply put "target = 55105" in the BattleOrderExecute script, and press run - and the next Battle Order for round 3 is manipulated to be 55105. The way it works: First, the RNG is a 2^16 number, or 0 to 65535. Each frame, it can change by 0, -256, or a single or multiple RNG execution(s), if there is no controller input. The current state of the controller is a 0-255 number, that is added every frame. So, you can change the RNG per (non-execution) frame by either 0-255, or -1 to -256. The # of frames between where I start the script, and when the next order is determined by the game is locked. Additionally, how the RNG moves on those frames (sans controller) is also locked. Thus, the script makes 1 pass, and determines how the RNG is moving per frame, and saves that info. Then, based on that info, it makes a second pass, and figures out the input for the next frame that will move the RNG closer to the target value, and actually creates that per-frame input.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Itstoearly wrote:
I fail at not desyncing. When I watch, Z fails to exit the town. Hopefully this will be encoded soon :)
Are you using Gens11a? Are you sure that use clear SRAM is checked?
Aitamen wrote:
congrats, dude, on an obliteration that makes me say "Yeah, and we thought the LAST one was perfect!"
DarkKobold wrote:
The goal of re-doing this movie for a 3rd time was to see if the 2 hour barrier could be broken. The answer is a resounding No. Now, I am thoroughly convinced that this is not possible without a major bug found, or some massive strategy change I missed.
Yeah, the egg on my face is pretty bad. :)
Flygon wrote:
By the way, someone upload this onto youtube, or that other site. Googles quality was invented by the devil himself, and curses this game. Otherwise I would upload it there. Bloody loved the circus battle by the way. IN YOUR FACE MARIONETTE! I think I orgasmed at Shade Abbey. An unfitting place, but dear god. That battle was BRILLIANT!
Funny, I thought that Battle 22 was the only real stroke of genius I had for the run. The shade abbey battle was more a lucky discovery than any smarts on my part :) Also, I'd REALLY REALLY appreciate it, if someone with a Youtube director account could post it as a reply to this movie, since it is incomplete and way out dated. Also, Flygon, I can't bump the thread in SFC. Maybe you could? :)
Kofiman,Rick,mat0,Aitamen,Sticky,Flygon wrote:
General Congrats...
Thanks for watching, and letting me know you enjoyed it![/quote]
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
alden wrote:
In a re-release of the game, Nintendo turned the Minus World into a reward. In place of the repeating, boring water level were three new ones that the player could actually finish, and when they completed them they unlocked a “stage select” feature that let them jump anywhere in the game.
I always thought that the different FDS "minus world" was a result of the code being in a different format (or some such other technical mumbo jumbo). Was it really intentional as the article suggests?
According to Wikipedia, SMB1 was released in Japan in 1985 for FDS, and North America in 1986 for NES. The youtube video he links to specifically states that it is the FDS version of the game, and according to themushroomkingdom.com, the effect he describes (level select) has always occurred in the FDS version. Thus, unless the programmers at Nintendo are time-traveling telekinetic fish-men with the ability to summon the God Poseidon at will, I'd say that this man doesn't have a clue in Hades what he is talking about. He most likely realized he had an article to post, after a long night of drinking and picking fights with inanimate objects, while claiming they made off-color remarks about his mother.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Post subject: An article that SHOULD have mentioned the TAS community.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
http://www.wired.com/gamelife/2009/05/fallout-baby Seriously, what are we? Chopped liver?
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Crits Allows you to select the critical, miss, double hit/double critical (Doesn't work on Dark Dragon, or when Balbaroy has the doom blade equipped.) The attack portion all assume that you will achieve the correct value of the RNG before the attack is initiated with C (not A!). Thus, if you want to use this 1 frame after C is pressed, you must memorize the previous noted value. [code lua]local crit_rate = 3; local level =5; local miss_rate = 8; local count; local X; local D7; miss={}; crits={}; dhsc = {}; crit_dmg = {}; dhdc = {}; dhdc_dmg ={}; doublehit = math.floor((level*2)/3)+7; count = 2; count2 = 2; count3 = 2; count4 = 2; miss[1] = 0; crits[1] = 0; dhsc[1] = 0; dhdc[1] = 0; for D7 = 1,65535,1 do X = 13 * D7; X = 7+X; X = X % 65536; X = 13 * X; X = 7+X; X = X % 65536; y = 100*X; y = math.floor(y/65536); if (y <= 7) then miss[count] = D7; count = count + 1; elseif (y > miss_rate) then X = 13 * X; X = 7+X; X = X % 65536; X = 13 * X; X = 7+X; X = X % 65536; Y = 100*X; Y = math.floor(Y/65536); X = 13 * X; X = 7+X; X = X % 65536; A = 21*X; A = math.floor(A/65536); X = 13 * X; X = 7+X; X = X % 65536; B = 21*X; B = math.floor(B/65536); if (Y<crit_rate) then crits[count2] = D7-224; crit_dmg[count2] = 80+math.floor((A+B)/2); count2 = count2 + 1; end; end; end; for D7 = 1,65535,1 do X = 13 * D7; X = 7+X; X = X % 65536; y = 100*X; y = math.floor(y/65536); if (y < doublehit) then X = 13 * X; X = 7+X; X = X % 65536; y = 100*X; y = math.floor(y/65536); if (y > miss_rate) then X = 13 * X; X = 7+X; X = X % 65536; X = 13 * X; X = 7+X; X = X % 65536; C1 = 100*X; C1 = math.floor(C1/65536); X = 13 * X; X = 7+X; X = X % 65536; A = 21*X; A = math.floor(A/65536); X = 13 * X; X = 7+X; X = X % 65536; B = 21*X; B = math.floor(B/65536); X = 13 * X; X = 7+X; X = X % 65536; Y = 100*X; Y = math.floor(Y/65536); X = 13 * X; X = 7+X; X = X % 65536; X = 13 * X; X = 7+X; X = X % 65536; C2 = 100*X; C2 = math.floor(C2/65536); X = 13 * X; X = 7+X; X = X % 65536; C = 21*X; C = math.floor(C/65536); X = 13 * X; X = 7+X; X = X % 65536; D = 21*X; D = math.floor(D/65536); if ((y > miss_rate) and (Y > miss_rate) and ((C1 < crit_rate) or (C2 < crit_rate))) then dhsc[count3] = D7-224; count3 = count3 + 1; end; if ((y > miss_rate) and (Y > miss_rate) and (C1 < crit_rate) and (C2 < crit_rate)) then dhdc[count4] = D7-224; dhdc_dmg[count4] = (math.floor(80+(A+B)/2)+math.floor(80+(C+D)/2))/2; count4 = count4 + 1; end; end; end; end; control = {"Up ", "Down ", "Left ", "Right ", "B ", "C ", "A ", "Start "}; gui.register( function () curr_rng = memory.readwordunsigned(0xff0ec2); for i = 2,#miss,1 do if ((miss[i-1] < curr_rng) and (miss >= curr_rng)) then target = miss; end; end; cnt_in = target - curr_rng; frameup = 0; while (cnt_in > 255) do cnt_in = cnt_in - 255; frameup = frameup + 1; end; precont = curr_rng+frameup*255; new_targ = 256-cnt_in; outs = "Miss: "; if (frameup>0) then outs = outs.."^"..string.format('%d',frameup).." "; end; for x= 1,8,1 do if (new_targ%2) == 1 then outs = outs..control[x]; end; new_targ = math.floor(new_targ/2); end; print(outs); for i = 2,#crits,1 do if ((crits[i-1] < curr_rng) and (crits >= curr_rng)) then target = crits; temp = crit_dmg; end; end; cnt_in = target - curr_rng; frameup = 0; while (cnt_in > 255) do cnt_in = cnt_in - 255; frameup = frameup + 1; end; precont = curr_rng+frameup*255; new_targ = 256-cnt_in; outs = "Crit: "; if (frameup>0) then outs = outs.."^"..string.format('%d',frameup).." "; end; for x= 1,8,1 do if (new_targ%2) == 1 then outs = outs..control[x]; end; new_targ = math.floor(new_targ/2); end; outs = outs.." Dmg:"..string.format('%d',temp); print(outs); target = curr_rng; for i = 2,#dhsc,1 do if ((dhsc[i-1] < curr_rng) and (dhsc > curr_rng)) then target = dhsc; end; end; cnt_in = target - curr_rng; frameup = 0; while (cnt_in > 255) do cnt_in = cnt_in - 255; frameup = frameup + 1; end; precont = curr_rng+frameup*255; new_targ = 256-cnt_in; outs = "DHSC: "; if (frameup>0) then outs = outs.."^"..string.format('%d',frameup).." "; end; for x= 1,8,1 do if (new_targ%2) == 1 then outs = outs..control[x]; end; new_targ = math.floor(new_targ/2); end; print(outs); target = curr_rng; for i = 2,#dhdc,1 do if ((dhdc[i-1] < curr_rng) and (dhdc > curr_rng)) then target = dhdc; temp = dhdc_dmg; end; end; targetsv = target+224; cnt_in = target - curr_rng; frameup = 0; while (cnt_in > 255) do cnt_in = cnt_in - 255; frameup = frameup + 1; end; precont = curr_rng+frameup*255; new_targ = 256-cnt_in; outs = "DHDC: "; if (frameup>0) then outs = outs..string.format('%d',targetsv).." ^"..string.format('%d',frameup).." "; end; for x= 1,8,1 do if (new_targ%2) == 1 then outs = outs..control[x]; end; new_targ = math.floor(new_targ/2); end; outs = outs.." Dmg:"..string.format('%d',temp); print(outs); print(""); end) [/code] Dump Dumps all the current Enemy locations to a file on the C drive called End_Loc.txt. This is a matlab ready copy and paste. Allows for faster optimization of battles, since matlab can be updated quicker with the ending positions of a round. [code lua] start_ag_add = 0xFFA1BB; start_x_add = 0xFFA1B7; start_y_add = 0xFFA1B8; outs = "End_Loc = [" count = 0; done = 0; while (done == 0) do z = memory.readbytesigned(start_ag_add+count*16); if (z == -1) then done = 1; else count = count + 1; end; end; for i = 0,count-1,1 do outs = outs..string.format("%d %d;",memory.readbyte(start_x_add+16*i), memory.readbyte(start_y_add+16*i)); end; outs = outs.."];"; x = io.open("C:\\end_loc.txt", "w"); x:write(outs); x:close(); [/code]
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Level Modifier Run the script during a (non-spell) attack animation. Start it at the first character of "Enemy is defeated!" Let the script run, unpause, then select the level up. If distance is longer than the # of characters in "nemy is defeated", the script will fail. [code lua] target =11365 ; LEVEL = 0xFF9C9D; START = savestate.create(); local buttonmap = {[1]='up',[2]='down',[4]='left',[8]='right',[16]='B',[32]='C',[64]='A',[128]='start'} TURN_COUNT = 0xFF9C07; TURN_PLACE = 0xFF9C08; RNG = 0xFF0EC2; STAT_HEX = {0xFF9C9E, 0xFF9C9F, 0xFF9CA0, 0xFF9CA5, 0xFF9CA8,0xFF9CA2}; MAPPLAYER = 0xFFA1B6; savestate.save(START); --Get all RNG values up to location, figure out # of changes. framecnt = 0; RNG_Move_Type = {}; RNG_EX = 0; currchar = memory.readbyte(MAPPLAYER + 16*memory.readbyte(TURN_PLACE + 2*memory.readbyte(TURN_COUNT))); currlev = memory.readbyte(40*currchar + LEVEL); ZeroCheck = 27751; ZeroResult = 12975; last_RNG = memory.readword(RNG); start_RNG = memory.readword(RNG); currstats = {}; for i = 1,6,1 do currstats = memory.readbyte(STAT_HEX + currchar*40); memory.writebyte(STAT_HEX + currchar*40,0); end; joypad.set(1,{up=true}); gens.emulateframefast(); done = false; print('Finding Level Up'); while not done do framecnt = framecnt+1; memory.writeword(RNG,ZeroCheck); joypad.set(1,{up=true}); gens.emulateframefast(); if memory.readbyte(40*currchar + LEVEL) == currlev+1 then done = true; end; end stats = {}; max_stats = {}; min_stats = {}; for i = 1,6,1 do stats = memory.readbyte(STAT_HEX + currchar*40); max_stats = math.max(math.min(math.floor(stats/4),5)-1,0) + stats; min_stats = math.max(-1*math.min(math.floor(stats/4),4) + stats, currstats); end; done = false currcolor = 1; ccount = 0; currloc = 1; plusr = true; minusr = true; leftr = true; rightr = true; savestate.load(START); colors = {'white','gray','black'}; while not done do input_state = input.get(); gens.frameadvance(); gui.text(10,50, ' ATT DEF AGI HP MP CRIT'); gui.text(10,60,string.format('MAX: %02d %02d %02d %02d %02d %02d', max_stats[1], max_stats[2], max_stats[3], max_stats[4], max_stats[5], max_stats[6])); gui.text(6,70,string.format('CURR: %02d %02d %02d %02d %02d %02d', currstats[1], currstats[2], currstats[3], currstats[4], currstats[5], currstats[6])); gui.text(10,80,string.format('MIN: %02d %02d %02d %02d %02d %02d', min_stats[1], min_stats[2], min_stats[3], min_stats[4], min_stats[5], min_stats[6])); gui.text(currloc*24+18,70,'<-'); if input_state.enter then done = true; end; if input_state.numpad8 and plusr then plusr = false; currstats[currloc] = math.min((currstats[currloc] + 1), max_stats[currloc]); end; if input_state.numpad2 and minusr then minusr = false; currstats[currloc] = math.max((currstats[currloc] - 1), min_stats[currloc]); end; if input_state.numpad4 and leftr then leftr = false; currloc = math.max(currloc-1,1); end; if input_state.numpad6 and rightr then rightr = false; currloc = math.min(currloc+1,6); end; if (not input_state.numpad8) then plusr = true; end; if (not input_state.numpad2) then minusr = true; end; if (not input_state.numpad6) then rightr = true; end; if (not input_state.numpad4) then leftr = true; end; end; start_RNG = start_RNG - framecnt; destat = {}; offst = {}; for i = 1,6,1 do destat = currstats - stats; offst = max_stats - stats; end; i = start_RNG-255; done = false; while not done do x = i; fail = false for z=1,6,1 do x = math.mod((x*13 + 7),65536); Y1 = math.floor(x*(offst[z]+1)/65536); x = math.mod((x*13 + 7),65536); Y2 = math.floor(x*(1+offst[z])/65536); Y = Y1 - Y2; if (Y + stats[z]) < math.min(min_stats[z]) then Y = 0; end; if Y ~= destat[z] then fail = true; end; end; if not fail then target = i; done = true; else i = i - 1; if i < 0 then i = 65536; end; end; end; print(string.format("Target: %d Distance: %d",target,math.floor((start_RNG-target)/255))); savestate.load(START); for i = 1,framecnt-1,1 do if memory.readword(RNG)-target < (framecnt-i)+255 then joypad.set(1,{up=true}); end; gens.emulateframefast(); end; temp = memory.readword(RNG)-target; for bit,button in pairs(buttonmap) do if AND(temp,bit) ~= 0 then joypad.set({[button]=true}) end end gens.emulateframefast(); gens.emulateframefast(); gens.emulateframefast(); test = 1; for i = 1,6,1 do if (currstats ~= memory.readbyte(STAT_HEX + currchar*40)) then test = 0; end; end; if (test == 0)then print("Normal method failed - Trying secondary"); savestate.load(START); for i = 1,framecnt-1,1 do if memory.readword(RNG)-(target-255) < (framecnt-i)+255 then joypad.set(1,{up=true}); end; gens.emulateframefast(); end; temp = memory.readword(RNG)-target; for bit,button in pairs(buttonmap) do if AND(temp,bit) ~= 0 then joypad.set({[button]=true}) end end; test = 1; gens.emulateframefast(); gens.emulateframefast(); gens.emulateframefast(); test = 1; for i = 1,6,1 do if (currstats ~= memory.readbyte(STAT_HEX + currchar*40)) then test = 0; end; end; end if (test==0) then print('Level up failed'); end; gens.pause(); [/code] Move Character A fun script that allows you to move characters around the battlefield. The top 2 numbers tell you the X and Y position of a character. The bottom numbers are Character Position in the current battle order, and that characters assigned number in the Battle. Also, [ and ] move a selected character around in the battle order. [code lua] CamPosX =0xFF9C48; CamPosY =0xFF9C49; Alive = 0xFFA1B6; LocX = 0xFFA1B7; LocY = 0xFFA1B8; OL = 0xFF9C08; SizeX = 24; SizeY = 24; Holding = false; leftclickrelease = true; lbrelease = true; lbrelease = true; gens.registerbefore(function() CamX = memory.readbyte(CamPosX); CamY = memory.readbyte(CamPosY); OnScreen = {}; PosX = {}; PosY = {}; Ord = {}; for n = 0,31,1 do Ord[memory.readbyte(OL+n*2)] = n; end; i=0; for c = 0,31,1 do if memory.readbyte(Alive+c*16) ~= 255 then X = memory.readbyte(LocX+c*16); Y = memory.readbyte(LocY+c*16); if ((X > CamX-1) and (X < CamX+11) and (Y > CamY-1) and (Y < CamY+10)) then i = i+1; OnScreen = c; PosX = (X-CamX)*SizeX-4; PosY = (Y-CamY)*SizeY+7; gui.drawbox(PosX,PosY,PosX+SizeX,PosY-SizeY,"clear","white") gui.text(PosX+3,PosY-8,string.format("%d %d",c,Ord[c])); gui.text(PosX+3,PosY-21,string.format("%d %d",X,Y)); end; end; end; input_state = input.get(); xmouse = input_state.xmouse+1; ymouse = input_state.ymouse+1; Mx = math.floor((xmouse+4)/SizeX)+CamX; My = math.floor((ymouse-7)/SizeY)+CamY+1; MDx = (Mx-CamX)*SizeX-4; MDy = (My-CamY)*SizeY+7; if ((xmouse > 0) and (xmouse < 320) and (ymouse > 0) and (ymouse < 224)) then if (not Holding) then gui.drawbox(MDx,MDy,MDx+SizeX,MDy-SizeY,"opaque","black") if (input_state.leftclick) and leftclickrelease then leftclickrelease = false; for m = 1,i,1 do if ((xmouse>=PosX[m]) and (xmouse<=PosX[m]+SizeX) and (ymouse<=PosY[m]) and (ymouse>=PosY[m]-SizeY)) then Holding=true; CharHold = OnScreen[m]; CharOrd = Ord[CharHold]; end; end; end; elseif (Holding) then gui.drawbox(MDx,MDy,MDx+SizeX,MDy-SizeY,"opaque","red") memory.writebyte(LocX+CharHold*16,Mx); memory.writebyte(LocY+CharHold*16,My); if (input_state.leftbracket) and (CharOrd > 0) and lbrelease then lbrelease = false; temp = memory.readbyte(OL+CharOrd*2-2); memory.writebyte(OL+CharOrd*2-2,CharHold); memory.writebyte(OL+CharOrd*2,temp); CharOrd = CharOrd-1; end; if (input_state.rightbracket) and (CharOrd < 31) and rbrelease then rbrelease = false; temp = memory.readbyte(OL+CharOrd*2+2); memory.writebyte(OL+CharOrd*2+2,CharHold); memory.writebyte(OL+CharOrd*2,temp); CharOrd = CharOrd+1; end; if (input_state.leftclick) and leftclickrelease then leftclickrelease = false; Holding = false; end; end; end; if (not input_state.leftclick) then leftclickrelease = true; end; if (not input_state.leftbracket) then lbrelease = true; end; if (not input_state.rightbracket) then rbrelease = true; end; end); [/code]
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Experienced Forum User, Published Author, Skilled player (1637)
Joined: 11/15/2004
Posts: 2202
Location: Killjoy
Time for a code dump! Start Battle Use this one at the start of a battle, when Nova or other (FACED!) character finishes speech. Press A or C on the correct frame (last character printed frame) then execute the script. The RNG should stay stable for 1 frame past the A or C (check this), and then execute 8 times. This script will find the correct target. [code lua] target = 49258 START = savestate.create(); local buttonmap = {[1]='up',[2]='down',[4]='left',[8]='right',[16]='B',[32]='C',[64]='A',[128]='start'} RNG = 0xFF0EC2; savestate.save(START); --Get all RNG values up to location, figure out # of changes. gens.emulateframefast(); last_RNG = memory.readword(RNG); RNG_Count = 0; gens.emulateframefast(); while (last_RNG ~= memory.readword(RNG)) do last_RNG = memory.readword(RNG); gens.emulateframefast(); RNG_Count = RNG_Count + 1; end; print(RNG_Count); --Calculate the backwards RNG. savestate.load(START); curr_RNG = memory.readword(RNG); multiplier = 1; for t = 1,RNG_Count,1 do multiplier = math.mod((13*multiplier),65536); end; print(multiplier) if last_RNG > target then dist = target + 65536 - last_RNG; else dist = target - last_RNG; end; done = FALSE; offst = 0; print(dist) while not done do if math.mod(dist+offst*65536,multiplier) < (765) then done = true; else offst = offst + 1; end; end temp = 256-math.floor((dist+offst*65536)/multiplier); for bit,button in pairs(buttonmap) do if AND(temp,bit) ~= 0 then joypad.set({[button]=true}) end end for i=1,RNG_Count+1,1 do gens.emulateframefast(); end; while (target ~= memory.readword(RNG)) do if memory.readword(RNG) < (target - 255) then joypad.set(1,{up=true}); else temp = 256 - target + memory.readword(RNG); for bit,button in pairs(buttonmap) do if AND(temp,bit) ~= 0 then joypad.set({[button]=true}) end end end gens.emulateframefast(); end; [/code] BattleOrderExecute Works for any round that ends in either an enemy turn, or a character attack or movement. For character based control, the RNG value must be relatively close (+/- 1000) For an enemy turn, the RNG can be anything, start the program > 20 or so frames from the last enemy turn. For player turn, start at the last input required to end the turn as fast as possible. If it fails, try it with F_Offst = 1. This depends on the round/number of enemies left. [code lua] target = 58680 F_Offst = 2; START = savestate.create(); local buttonmap = {[1]='up',[2]='down',[4]='left',[8]='right',[16]='B',[32]='C',[64]='A',[128]='start'} TURN_COUNT = 0xFF9C07; RNG = 0xFF0EC2; savestate.save(START); --Get all RNG values up to location, figure out # of changes. RNG_Pre = {}; framecnt = 1; RNG_Pre[framecnt] = memory.readword(RNG); gens.emulateframefast(); WasLag = gens.lagged(); RNG_Move_Type = {}; RNG_EX = 0; posdist = 0; negdist = 0; print('Finding Battle Transition'); --and (memory.readbyte(TURN_COUNT) ~= 32) while (memory.readbyte(TURN_COUNT) ~= 0) and (memory.readbyte(TURN_COUNT) ~= 32) do framecnt = framecnt+1; RNG_Pre[framecnt] = memory.readword(RNG); if (RNG_Pre[framecnt] == RNG_Pre[framecnt-1]) then if WasLag then RNG_Move_Type[framecnt-1] = -1; else RNG_Move_Type[framecnt-1] = 0; end; elseif (math.fmod(RNG_Pre[framecnt]+256, 65536) == RNG_Pre[framecnt-1]) then RNG_Move_Type[framecnt-1] = 1; negdist = negdist + 256; elseif (math.fmod(RNG_Pre[framecnt]+512, 65536) == RNG_Pre[framecnt-1]) then RNG_Move_Type[framecnt-1] = 2; negdist = negdist + 512; elseif (RNG_Pre[framecnt] == math.fmod(RNG_Pre[framecnt-1]*13+7,65536)) then RNG_Move_Type[framecnt-1] = 3; RNG_EX = RNG_EX + 1; elseif (RNG_Pre[framecnt] == math.fmod((RNG_Pre[framecnt-1]-256)*13+7,65536)) then RNG_Move_Type[framecnt-1] = 4; RNG_EX = RNG_EX + 1; elseif (RNG_Pre[framecnt]+256 == math.fmod((RNG_Pre[framecnt-1])*13+7,65536)) then RNG_Move_Type[framecnt-1] = 5; RNG_EX = RNG_EX + 1; end; gens.emulateframefast(); WasLag = gens.lagged(); end print(string.format('Battle Transition is %d frames away. RNG Executions: %d', framecnt,RNG_EX)); savestate.load(START); if RNG_EX == 0 then for i = 1,framecnt-F_Offst,1 do curr_RNG = memory.readword(RNG); targtemp = target; if targtemp < curr_RNG then upframes = math.floor((targtemp + 65536 - curr_RNG)/255); downframes = math.floor((curr_RNG-targtemp)/256); else upframes = math.floor((targtemp - curr_RNG)/255); downframes = math.floor((curr_RNG - targtemp + 65536)/255); end; if ((RNG_Move_Type == 0) and (upframes < 40)) then joypad.set(1,{up=true}); elseif ((RNG_Move_Type == 1) and ((downframes > 40) or (downframes == 0))) then joypad.set(1,{up=true}); elseif ((RNG_Move_Type == 2) and ((downframes > 40) or (downframes == 0))) then joypad.set(1,{up=true}); end; gens.emulateframefast(); end; curr_RNG = memory.readword(RNG); temp = curr_RNG-target; for bit,button in pairs(buttonmap) do if AND(temp,bit) ~= 0 then joypad.set({[button]=true}) end end gens.frameadvance(); elseif RNG_EX == 1 then Preframe = 1; curr_RNG = memory.readword(RNG); --Find the RNG execution while (RNG_Move_Type[Preframe+1] < 3) do Preframe = Preframe+1; end; nxtRNG = math.fmod(curr_RNG*13+7,65536); if nxtRNG > target then upframes = math.floor((128+target+65536-nxtRNG)/3315); newtarg = math.fmod(curr_RNG+upframes*255,65536); else upframes = math.floor((128+target-nxtRNG)/3315); newtarg = math.fmod(curr_RNG+upframes*255,65536); end; for i = 1,Preframe,1 do curr_RNG = memory.readword(RNG); if newtarg < curr_RNG then upframes = math.floor((newtarg + 65536 - curr_RNG)/255); downframes = math.floor((curr_RNG-newtarg)/256); else upframes = math.floor((newtarg - curr_RNG)/255); downframes = math.floor((curr_RNG - newtarg + 65536)/255); end; if ((RNG_Move_Type == 0) and (upframes < 40)) then joypad.set(1,{up=true}); elseif ((RNG_Move_Type == 1) and (downframes > 10)) then joypad.set(1,{up=true}); elseif ((RNG_Move_Type == 2) and (downframes > 10)) then joypad.set(1,{up=true}); end; gens.emulateframefast(); end; gens.emulateframefast(); for i = Preframe+2,framecnt-F_Offst,1 do curr_RNG = memory.readword(RNG); targtemp = target; if targtemp < curr_RNG then upframes = math.floor((targtemp + 65536 - curr_RNG)/255); downframes = math.floor((curr_RNG-targtemp)/256); else upframes = math.floor((targtemp - curr_RNG)/255); downframes = math.floor((curr_RNG - targtemp + 65536)/255); end; if ((RNG_Move_Type == 0) and (upframes < 40)) then joypad.set(1,{up=true}); elseif ((RNG_Move_Type == 1) and ((downframes > 40) or (downframes == 0))) then joypad.set(1,{up=true}); elseif ((RNG_Move_Type == 2) and ((downframes > 40) or (downframes == 0))) then joypad.set(1,{up=true}); end; gens.emulateframefast(); end; curr_RNG = memory.readword(RNG); temp = curr_RNG-target; if gens.lagged() then if temp/2 ~= math.floor(temp/2) then print('Script will fail - Wrong parity encountered.') else print('Lag frame encountered.') temp = temp/2; end; end; print(temp) for bit,button in pairs(buttonmap) do if AND(temp,bit) ~= 0 then joypad.set({[button]=true}) end end gens.frameadvance(); end; [/code]
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.