1 2 3 4
8 9
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
I'm attempting a second run now, and I'm finding it rough to manipulate 0xC30B into becoming exactly 0xF2. In a timely manner, anyway. My current plans involve getting exactly that RNG value so that I can defeat the ALBATROS, followed by going into a forest tile and getting into a battle on the very next step, against ASIGARU. Two battles already, and well on my way to a highly-desired P-BLAST. Hopefully I can get a mana boost or two along the way on my main mutant. GAZE and TELEPOR should follow, in whichever order. I may pick up a second P-BLAST, so that my abilities will be P-BLAST P-BLAST GAZE TELEPOR. My mutant buddies are now fodder for upcoming bosses. Prior to leaving World I, I will grab an ALBATROS from the guild. This ALBATROS will be on a diet until I hit SEI-RYU dead, where it becomes DRAGON 1, then backtrack to eat a SLIME for a BEETLE to make use of SAW on BYAK-KO. Unfortunately, the plan completely falls apart if I can't get the needed 0xF2 first thing! Eyah... I'll keep trying... As for the gold, that's actually a pretty common way (At least, from what I saw in a few other games) to store some numbers -- As a decimal-represented digit each packed in nybbles. If I tell you to convert the hexadecimal number A378C53D into decimal, by hand, you're going to have a hard time. Or at least take quite some time to get the result of 2742601021. If you try changing just one of the more significant hex digits, you end up changing numerous decimal digits, and vice versa. If, however, I "waste" some of the possible hex digits, A through F, we would have a rather familiar range of 0 to 9, and knowing our self-imposed limit for each hex digit, we can very quickly convert it into a graphics tile representing a digit. However, slightly more processing must take place when adding up these digits, since they don't flow so neatly in the more familiar language of binary our computers so love. However, showing us such a number in decimal is trivial, no matter how big it gets. Whatever the case, it's good that you found how the gold is stored in memory. I wouldn't suggest using items we can't actually buy, but if you can somehow get the cash, then by all means, go ahead and try it. Another address for you, by the way: 0xCC00 This marks the start of the addresses governing your basic character stats. Things like name, current HP, max HP, Str, Def, Agl, Mana, and various item IDs and uses are here. Each character uses up 31 bytes to hold this information, so the second character starts at 0xCC1F, the third at 0xCC3E, and the fourth at 0xCC5D. If you want to cheat those to help more of your tests, may as well point out where they are for you. You should be able to find the individual stats on your own, especially if you decide to modify some of them. Be careful around the name, though. By the way, there's none of that crazy numbery stuff that gold uses. 99 Agl here is indeed 0x63 and not 0x99. BYAK-KO has indeed made quite the wall for us, eh? I've also made attempts at finding the battle RNG. I haven't been successful. SAW apparently uses your strength as part of a to-hit formula. Too high, and our strength exceeds the enemy's defense and we can't ever hit. Too low, and it's so unlikely to hit that the enemy may as well be immune. Might not be a bad idea to pick up strength as well, so we can beat the unwieldy RNG, but not too much that we exceed the later bosses. Though, SU-ZAKU has 77 defense, and all the ones after that go even higher. We shouldn't have to worry about having too much strength.
Player (80)
Joined: 8/5/2007
Posts: 865
BYAK-KO defeated!!! Without taking so much as a scratch, either! Man, that was difficult! I won't spoil the strategy for you because it's a real "Duh! Why didn't I think of that?" moment. I realized whipping him would cancel his ICE attack, but it didn't solve all my problems. BYAK-KO has a decent chance (about 1 in 4) of striking first, so if he opens with an ICE attack, I'm screwed. Same goes for SWORD attacks, although it's more forgiving because I can use ARMOR and heal to get around it if necessary. I thought the player's and enemies' actions were on separate RNGs, but it appears I was wrong. By using different attacks, I can manipulate BYAK-KO's actions. One would think you could just use L-SABER whenever he uses SPHERE, but if that causes him to strike first with SWORD or ICE in a subsequent round, then you have to whip him instead and hope that it produces more favorable results. The real beauty of this is that because the RNG is so easily manipulated, we can probably use this strategy in our final run if we wish.
FatRatKnight wrote:
I'm finding it rough to manipulate 0xC30B into becoming exactly 0xF2. In a timely manner, anyway.
That's why I think we should manipulate luck "on the run". Just fight a battle, check if you can manipulate F2 to appear immediately after, if not, take a few steps, check again, if not soon at all, manipulate luck instead to fight a battle that gives you a bonus. It'll work eventually, and in the meantime, you get plenty of stat bonuses for use later.
FatRatKnight wrote:
However, slightly more processing must take place when adding up these digits, since they don't flow so neatly in the more familiar language of binary our computers so love.
Well that was my take on it. The whole hexadecimal stuff is really for the user to fiddle around with-- the computer's doing everything in binary. That means the computer first has to convert each byte from binary to hexadecimal, then check if the hexadecimal representation is valid, then perform some "strange" arithmetic that has to be specially programmed in. So if you gain or lose any money the algorithm should go something like this: •Start with three bytes of binary representing your current GP, three bytes representing whatever you add to it. •Convert each byte to hexadecimal, examining each digit separately. •Treat this string of digits as a decimal number. •To add these numbers, convert back to binary. •Add them in binary. •Convert to decimal. •Treat this string of digits as a hexadecimal number. •Convert this hexadecimal number to binary, storing it in the original three bytes. Suddenly converting an eight digit hexadecimal number to decimal by hand doesn't seem so bad! But if you've seen it used in other games, I really can't dispute that it's probably valid. Maybe my algorithm is flawed or there's some sort of advantage to doing it the way they did (you suggested it's to display graphics more efficiently). Even so, it doesn't make much sense to me.
FatRatKnight wrote:
I wouldn't suggest using items we can't actually buy, but if you can somehow get the cash, then by all means, go ahead and try it.
That was the thing-- I could have bought the FLAME SHIELD before I picked up the L-SABER. I suppose I could have instead replayed my movie and stopped it just before picking up the L-SABER, but it's taking far too long to replay at this point.
FatRatKnight wrote:
Another address for you, by the way:
Heh heh, character stats were literally the first thing I found when RAM searching this game. Guess I forgot to pass that info on to you.
Joined: 7/2/2007
Posts: 3960
I just want to say that I'm enjoying reading about you two tearing this game apart, even though I've never played it myself (only ever played FFL3). Good luck with the run(s)!
Pyrel - an open-source rewrite of the Angband roguelike game in Python.
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
Spent a thousand rerecords and still no luck. Take the meaning however you like. Found an HP boost at 0xF0 that I previously missed as well. In order to catch both Mana boosts at 0xF2 en route to P-BLAST, it seems I must let my fodder get hit twice. Together, they barely have enough HP to survive just those (The ALBATROS deals 19 out of the 20 HP one has got). Finally picking up P-BLAST means my main character takes a hit, but she has twice the HP as either one of the fodder, so hopefully I'm fine. Rather than manipulate the stuffing out of the luck, I'll waste all the time in the world to get the exact luck! I want to see if it'll even work out. Expect extremely long resets if I decide to release such a movie. (minutes wouldn't be a bad estimate; I don't care right now) I'll also be reworking how to chart out the RNG, so that I can get a one-size-fits-all table. I notice some unusual similarities in a few of our charts (Example: The run away field, the NPC directions field). Sure, I don't see any exact 0~255 numbers, and I have no way of seeing these internal numbers, but that's not going to stop me from making attempts. Anyway, I'll keep trying. I've actually been lazy these past few days, and I wouldn't say a thousand rerecords during that time is a lot. EDIT: Just when I thought I had things covered, the game threw me a slot-3 P-BLAST. Obviously, searching for memory.readbyte(0xC30B) == 0xF2 isn't enough. I can only "..." at this point, but I'll keep at it, somehow.
Player (80)
Joined: 8/5/2007
Posts: 865
Derakon wrote:
I just want to say that I'm enjoying reading about you two tearing this game apart, even though I've never played it myself (only ever played FFL3). Good luck with the run(s)!
Thanks! It's a quirky little game. It's not a good game by most measures, but it has so many nuances that it just keeps pulling you back.
FatRatKnight wrote:
Rather than manipulate the stuffing out of the luck, I'll waste all the time in the world to get the exact luck! I want to see if it'll even work out. Expect extremely long resets if I decide to release such a movie.
Hmm? I've been using my script to manipulate luck and it's never taken more than a few seconds to get the result I'm looking for (even when it's one particular value out of 256). Granted, a few idle seconds is a lot in a TAS, but spending minutes on a reset is out of the question. I'm a little confused by what you're trying to do.
FatRatKnight wrote:
I notice some unusual similarities in a few of our charts
Holy crap, you're right! That's really interesting!
FatRatKnight wrote:
Anyway, I'll keep trying. I've actually been lazy these past few days, and I wouldn't say a thousand rerecords during that time is a lot.
I hear ya. I'm a little wiped out myself, especially since I don't have enough Str. to SAW anything in World 4. Progress has been slow, so I've been holding off posting until I have something substantial to report. Instead, I have a hodgepodge of little things. I realized I should check the effects of ability shuffling when you have less than four abilities. Suppose you have abilities in slots 2 and 4 and C30B is 93 before you fight a battle. Do your abilities shuffle to + | + (as indicated by my current analysis) or to - | + (as would happen if the RNG for ability shuffling is rolled sequentially)? I'll look into it eventually. I found the values of C30B that boost your Str. If you want a bonus of 5 Str., choose 62, 113, or 191 for C30B. For 4 Str., 119, 210, 213, and 236 work. We now know how to boost the three main stats, so we have nine possible values for C30B such that we can get some stat boost. This means we shouldn't have to wait more than a second or so to manipulate luck for most resets. I tried blinding my character and it didn't help at all. I reread the GameFAQs post and noticed that it actually only doubles your Agl. for strength-based attacks. Oops. I'm trying to figure out just what that means and if it would help us at all. Finally, you had wondered if you can skip saving So-Cho's sister. I punched in a new cheat that eliminates random battles so I could test this. It doesn't work. So-Cho doesn't appear at the pub unless you save his sister first. Along the same lines, however, I discovered an interesting route. You don't need to follow So-Cho's sister through the subway and you can instead take the surface path to the subway near Southwest Town. Walk back through the subway until you reach the first stairs and you'll turn around and save her, even though she and the enemies aren't there! Because the surface path requires you to fight SU-ZAKU every few steps and would likely require some luck manipulation along the way to get a new set of runnable battles, it may not be worth it, but be sure to check it out when you next get to World 4. (As a side note, you can pick up the ROM and BOARD without meeting So-Cho and getting the bike, but I can't imagine why you would want to. It almost certainly takes a lot longer.) Now for an update on long term strategy. I've changed my mind yet again. I think it might be best to pick up four mutants and get both P-BLAST and TELEPOR, contrary to what I'd indicated earlier. Both abilities save a substantial amount of time and I think it should offset the time spent conscripting and using the additional mutants. One thing I'm not sure about is whether Agl. affects attack order within your party. So if I have one mutant with 99 Agl. and three with 10, will my pumped up mutant always go first? If so, the other three won't see much action (just the way I like it). My goal would be to reach World 4 with 50 Str., 99 Mana, and 99 Agl. I've thought about how many opportunities we have to fight battles along the way and I'm uncertain as to whether there would be enough to achieve those stats. For that reason, I've considered spamming the ATOMCRABs in SEI-RYU's room. The text that shows up before the battle slows things down a little bit, but it probably would be faster than walking to the next battle. I'm going to wait and think about strategies for another day or two, then I'll probably start that run.
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
Bobo the King wrote:
FatRatKnight wrote:
Rather than manipulate the stuffing out of the luck, I'll waste all the time in the world to get the exact luck! I want to see if it'll even work out. Expect extremely long resets if I decide to release such a movie.
[...] I'm a little confused by what you're trying to do.
I want to see if it'll even work out. I'm making zero attempt at optimizing. It will show.
Bobo the King wrote:
I realized I should check the effects of ability shuffling when you have less than four abilities. Suppose you have abilities in slots 2 and 4 and C30B is 93 before you fight a battle. Do your abilities shuffle to + | + (as indicated by my current analysis) or to - | + (as would happen if the RNG for ability shuffling is rolled sequentially)? I'll look into it eventually.
My belief is that it rolls once per adjustable ability. There should be no rolls for blank spots or passive, - use abilities, but I can be wrong.
Bobo the King wrote:
[...] You don't need to follow So-Cho's sister through the subway and you can instead take the surface path to the subway near Southwest Town. Walk back through the subway until you reach the first stairs and you'll turn around and save her, even though she and the enemies aren't there! [...]
It's either take the extra steps through the subway or deal with the SU-ZAKU encounters. Either way, it's a good idea to check. I'll investigate this at some point.
Bobo the King wrote:
Now for an update on long term strategy. I've changed my mind yet again. I think it might be best to pick up four mutants and get both P-BLAST and TELEPOR, contrary to what I'd indicated earlier. [...]
Four might be a bit much. On the other hand, here's how many battles you'd have to face, at best, for each arrangement of mutants:
Mutants: 1 : 2 : 3 : 4 :
-------:---:---:---:---:
GAZE   : 4 : 2 : 2 : 1 :
P-BLAST: 7 : 4 : 3 : 2 :
TELEPOR:14 : 7 : 5 : 4 :
Compared to a 3-mutant party, a 4-mutant party can earn each of these abilities 1 battle earlier. You lose the slot for a potential monster that I so adore. By the way, I keep saying that the extra mutants are fodder and can just drop dead after their usefulness ends, after you get all the abilities you need. Once dead, they can't eat up any more turns, can they? Then again, they can act as a really nice humanoid shield, soaking up a hit that you can't take.
Bobo the King wrote:
I'm going to wait and think about strategies for another day or two, then I'll probably start that run.
If it's going to be a "finalized" run, let me get a chance at optimizing it. EDIT: I think I see better how the RNG works. Apparently, the RNG is asked for a number within a range. It divides up the random numbers such that 0x00 is mapped to the lowest value and 0xFF is mapped to the highest value, and all other values are distributed evenly in between the extremes. After finding the random value it wants to give, it picks the nearest integer and returns that. I don't know if it's really doing that internally, but I want a frame that I can think in that effectively matches the result here. The problem with doing all this is that, while all the inner numbers tend to have fractions above and below themselves, the numbers on the extreme ends only have fractions on one side, since there are no values beyond the extreme. As a result, the extreme values tend to have half as many results as any other number in the middle. See the NPC direction finder? South and East have values 0 and 3, while North and West have 1 and 2, respectively. There are 43 results each for 0 and 3, while there's nearly twice as much, 85, for 1 and 2. No wonder I was able to see a bias where NPCs love going northwest! It's also a good thing if we want to manipulate that NPC's movement like I did in my test run. I'll be making measurements to fine-tune my all-purpose RNG table. Here's hoping I get something always useful, no matter what new random number stuff we crash into. If it fails somewhere, we just adjust the table values a little to see if it matches, or look for a different RNG seed. With the way it should work, this adjustment should never break any old tests we made.
Player (80)
Joined: 8/5/2007
Posts: 865
FatRatKnight wrote:
I want to see if it'll even work out.
Sorry, still don't understand. What wouldn't work out? I mean, as long as you know what you're doing, feel free to ignore me.
FatRatKnight wrote:
Four might be a bit much.
Yeah, it's a tough call. I figure whatever battles we spend learning abilities are battles we aren't pumping stats, so if I'm going with a 3-mutant party, I have to fight two additional battles to make up for it down the line. Those two battles will take a few seconds to fight. How does it compare with the time spent picking an additional mutant and giving him commands in every fight? I don't know. We could probably work it out mathematically once we get an idea of how many battles need to be fought (for perfect stats, we'll need roughly 60) and how long those extra commands take.
FatRatKnight wrote:
You lose the slot for a potential monster that I so adore.
Since BYAK-KO can be manipulated with a WHIP, I'm fairly certain that monsters won't be needed. That's not to discourage or disparage your love of them-- healthy skepticism is always good in planning a TAS. You may demonstrate that it truly is faster to use SAW, cutting several rounds off our SEI-RYU and BYAK-KO fights.
FatRatKnight wrote:
Once dead, they can't eat up any more turns, can they?
You mean off the RNG? Good question. They shouldn't, since dead characters generally don't accumulate experience points in RPGs, but there's only one way to be sure. I'm sure it'll naturally arise in one of our test runs.
FatRatKnight wrote:
If it's going to be a "finalized" run, let me get a chance at optimizing it.
Not finalized. Not even close. I think before we start work on a final run, we should and will be in agreement on what strategy to use.
FatRatKnight wrote:
I think I see better how the RNG works.
Yeah, after you pointed out that our charts seem to use the same RNG, I started my own investigation. I'm actively searching for the RNG in the ROM (I'll get to that in a bit), but if I can't find it, my biggest question is about the "completeness" of the RNG. The central question is this: does the RNG turn up every value from 0 to 255? My guess is that the answer is "yes", but results are inconclusive. For example, you have a 127 out of 255 chance of not being able to run from battle but a 129 out of 255 chance of being able to. Either some numbers are accounted for twice, or 127 counts as a "yes" for whatever reason. (The other possibility is that I screwed up in making the table.) Your theory about fractions and rounding off to the nearest integer makes sense to me and I think they probably did exactly that for NPC movements. I don't think that's the complete picture for everything they did, however. I've started exploring the ROM itself-- not with VBA's memory viewer (which seems to be broken as it only has half of the game's information), but with a hex editor, XVI32. With the hex editor, I can finally see what Alex Jackson was talking about when he referred to these ROM addresses. I saw for myself the bins he was referring to in 0x1BF00 to 0x1BF07 (as well as the other addresses he mentioned). These bins indicate two things to me: 1) Not everything in the game is done in fractions, since the valid range is explicitly spelled out in those addresses. 2) It's quite likely that the RNG spans all possible values from 0 to 255. It seems awfully "coincidental" that the bin size for each possibility is exactly equal to the number of instances we see in your Growth table. For example, the bin for learning a new ability is 0 to 34 and-- surprise surprise!-- we see exactly 35 out of 256 instances of learning a new ability. Since I was exploring the ROM in a hex editor, I assumed the RNG is stored in a table somewhere and I searched for that table. What I did was change all of the values except those in the range of 8F-92 to 00. According to Alex Jackson and the bin defined by 0x1BF05 and 0x1BF06, these values define ability shuffling, which happens to be the smallest bin I can discern (if we can come up with more RNG tables, I might be able to find a smaller one). I figured the RNG values would be stored sequentially with one byte per roll. By focusing on the values that shuffle abilities, I knew just what to look for-- at 0x56 is YY, seven addresses later at 0x5D is another YY, and 80 addresses later (five addresses "below" it) is a third YY. I just had to scan the entire ROM for this pattern. Nothing turned up. Barring any mistakes on my part, this means one of two things: the numbers are stored in a different format from what I was expecting (perhaps two bytes per roll or something) or the numbers are actually being calculated by the game. Unfortunately, I don't know all that much about random number generation, so I can't fathom an algorithm for generating them. But that may not matter. As long as we're only interested in deconstructing the RNG for growth, abilities, running, and NPC movement, we can get by with just the bins. Here's a summary of the bins as I understand them: Running: 0 to 126 = N, 127 to 255 = Y NPC walking: 0 to 42 = S, 43 to 127 = N, 128 to 212 = W, 213 to 255 = E Bonuses: 0 to 34 = XX, 35 to 68 = HP, 69 to 98 = Mn, 99 to 116 = Ag, 117 to 134 = St, 135 to 142 = Df, 143 to 146 = YY, 147 to 255 = __ Abilities: 0 to 228 = __, 229 to 255 = YY Or to put it all in one big table
  Bin  |Run?|NPC dir|Bonus|Ability
-------+----+-------+-----+-------
   0-34|  N |   S   | XX  |  __
  35-42|  N |   S   | HP  |  __
  43-68|  N |   N   | HP  |  __
  69-98|  N |   N   | Mn  |  __
 99-116|  N |   N   | Ag  |  __
117-126|  N |   N   | St  |  __
    127|  Y |   N   | St  |  __
128-134|  Y |   W   | St  |  __
135-142|  Y |   W   | Df  |  __
143-146|  Y |   W   | YY  |  __
147-212|  Y |   W   | __  |  __
213-228|  Y |   E   | __  |  __
229-255|  Y |   E   | __  |  YY
I hope I got that all right. (After making this table, I realized that the smallest bin is the one that only holds 127, not 143-146 as I previously thought. While looking for a RNG index that corresponds to that bin, I noticed that there were only five instances of "Run?" being "Y" while "Bonus" is "St" instead of the eight predicted by the bin size. This is a strong indication that the RNG is not complete and it does have some duplicate values and omissions in it. I'm rather surprised by this. I'm leaving my previous comments unedited because I think there is still some valid analysis in it.) Edit: I miscounted. Badly. There are in fact eight instances of "Run?" being "Y" while "Bonus" is "St". I'm back to believing that the RNG spans all possible values. The index where the RNG is 127 is 0x3E. If you look through the tables we've already constructed, you should be able to create a new table based on the table I've constructed above. For example, the first value 0x00 corresponds to N | N | HP | __, which corresponds to the bin 43-68. Any value between 43 and 68 will therefore suffice for that element, so you can set it to, say, 55. Would you like to construct the master table, or shall I?
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
Bobo the King wrote:
Sorry, still don't understand. What wouldn't work out? I mean, as long as you know what you're doing, feel free to ignore me.
The basic plan I'm thinking about. Here's where things can go wrong: - The plan of growth involves fights that ultimately kills off my fodder prematurely, slowing down acquisition of other desired abilities, notably TELEPOR, putting a rather solid wrench into my plans. - The RNG plan just happens to summon baddies I'd rather not face, like a REDBULL. And the game picks a run value that disallows me from just skipping it. - I fight for stats too much and don't get my TELEPOR at a convenient time, like right at KINGSWRD. - The manipulation is impossible within a reasonable time-span. Stuff like that. Since the RNG is so... Not random, it is crucial to come up with a plan down to the very step count on any reset.
Bobo the King wrote:
FatRatKnight wrote:
Once dead, they can't eat up any more turns, can they?
You mean off the RNG? Good question. They shouldn't, since dead characters generally don't accumulate experience points in RPGs, but there's only one way to be sure. I'm sure it'll naturally arise in one of our test runs.
Well, the menu time from actually selecting their commands is what I mean, but it's also true that they don't eat up any more RNG values for growth as well.
Bobo the King wrote:
Would you like to construct the master table, or shall I?
0x3C,0x97,0x97,0x8B,0x13,0xE0,0x4F,0x93,0x69,0xA9,0xB5,0x1C,0xBA,0x0D,0x9C,0xD7,
0x9C,0xB5,0x06,0x4F,0x71,0xFE,0xED,0x46,0xCB,0xC6,0xA4,0xC2,0x57,0x10,0xBE,0x45,
0xFA,0xD7,0xA4,0xCB,0xD3,0xDC,0x6F,0xD5,0xD3,0xE9,0x08,0x5C,0x04,0x31,0x20,0x97,
0xA2,0xF7,0xB5,0x10,0xCB,0xBE,0x2D,0x09,0x71,0xF5,0x97,0x82,0x64,0x4F,0x7F,0x82,
0x42,0xE6,0x17,0xF1,0x69,0x9C,0xCF,0xE9,0x13,0xD5,0xC6,0x9C,0xC4,0x71,0xE0,0x57,
0x1C,0xC6,0x87,0x2D,0x0B,0x7E,0x8F,0x35,0x4B,0xB5,0x24,0x42,0xD7,0x91,0x40,0xC4,
0x7A,0xA4,0xD7,0xB1,0x53,0x5E,0x0F,0xA9,0xA9,0x93,0x75,0xDC,0x7A,0xB1,0x5E,0x1A,
0xDC,0x86,0x35,0x6D,0xB3,0x3E,0xAD,0x75,0xF1,0x75,0xE6,0x02,0x1A,0xCF,0xFE,0xFA,
0xC2,0x64,0x64,0x71,0xE9,0x1C,0xAD,0x69,0x93,0x53,0x46,0xE0,0x42,0xF1,0x60,0x24,
0x63,0x46,0xF7,0xAD,0x8B,0x00,0x10,0xB5,0x31,0x35,0x57,0x3C,0xA4,0xED,0x3E,0xBA,
0x02,0x24,0x57,0x31,0x2B,0x20,0x8F,0x29,0x2B,0x15,0xF7,0xA2,0xFA,0xCB,0xDC,0x64,
0x5C,0x06,0x46,0xED,0x31,0x40,0xCF,0xF5,0x8B,0x09,0x64,0x7A,0x97,0xAD,0x80,0x7A,
0xBA,0x17,0xE6,0x0D,0x93,0x60,0x2D,0x15,0xE9,0x29,0x35,0x60,0x3A,0x8B,0x1C,0xA4,
0xE0,0x35,0x75,0xCF,0xF1,0x80,0x6F,0xC6,0xB3,0x46,0xD7,0xBA,0x24,0x6D,0xBE,0x3A,
0x82,0x57,0x24,0x4D,0xA9,0xA0,0xED,0x53,0x53,0x69,0x87,0x20,0x82,0x4D,0xA0,0xE5,
0x23,0x75,0xC6,0x91,0x4B,0xBE,0x4F,0x87,0x0B,0x87,0x17,0xFA,0xE4,0x2D,0x00,0x05
You mean this? But it isn't ready yet! ... On the other hand, I don't think I'd ever be satisfied enough anyway, so here it is now. The numbers seen above are the lowest possible values while still fulfilling all RNG stuff I've investigated. In particular, these are what I tried against it: - Ability chart (GameFAQs, oh you're so nice!) - HP200 on a Human (16 possible values!) - Small bits of data from 0xC343 0xC33B, steps for random encounters. - NPC step direction (no new info separate from the HP200 tests.) The Master Table, as is, should fail in several places when looking at mutant stat growth. We'll eventually clean those up, hopefully. EDIT:Updated Master Table to fit HP200, run away, and random encounter tests. 89 different numbers identified.
Player (80)
Joined: 8/5/2007
Posts: 865
I edited my previous post because it appears that the RNG does span all possible values. Be sure to catch that. Because we're so interested in the RNG, I decided I would search from the other end of things: What are the random numbers being rolled by the game and what do they affect? I played a short game, trekking around World 1, getting into battles, buying various potions, etc. I then did a RAM search, first isolating the sector with the RNG indices, then looking for values that had changed more than once. The RNG is (potentially) rolled by RAM addresses 0xC300 to 0xC37F-- 128 different indices. The significance of 128 is not lost on me, so I suspect that not all of them are actively rolled to determine something in the game. Here are the values that changed and my notes on each of them. Most parenthetical comments are just notes to myself indicating that I'm still not sure how it works. C309: (End of ALBATROS battle, frame 18200, during fade to world map.) C30B: Next mutant bonus earned. Rolled after battles, once per mutant. C30D: Direction NPCs walk. Rolled periodically for each NPC on screen. C31B: How much HP cap is raised by HP200. Rolled whenever HP200 used. (Different RNG for HP400?) C323: Whether the battle can be escaped or not. Rolled once per execution of the RUN command. C325: Rolled at start of battle (twice?). C33B: Random encounters. Rolled once per step (in monster areas only). C343: Rolled at start of battle. C347: How much additional Str. and Agl. earned from STRENGTH and AGILITY potions. Rolled every time STRENGTH or AGILITY potion is used. (These potions offer a random bonus if the character's Str. or Agl. is below a certain point.) C34B: Bonus amount. Rolled whenever a mutant gets a stat bonus. C34F: Rolled once per frame if not moving, about once per step if moving. C352: Appears to affect the animation of the STENCH ability. (Rolled 4 times during GOBLIN battle around 20500 just after using STENCH, following ZOMBIE battle starting at 62550.) C353: Rolled at start of battle. C358: How much HP a POTION restores. Whenever POTION is used. (Different RNG for X-POTION?) C35A: Rolled at start of each battle turn. C35C: Rolled at end of battle. C369: Rolled periodically in town. C36F: (Around 15500, end of battle with ZOMBIE.) C379: Rolled at start of battle. If you're wondering about the specific frames I refer to, here is the movie that I'm working off of: http://dehacked.2y.net/microstorage.php/info/528047701/rngtest.vbm Although I'm interested in the composition of the RNG, from a practical standpoint, I'm most interested in finding the RAM addresses that determine whether a monster drops meat and whether you strike first or the enemy does. I should be able to find them by writing some cheats. Feel free to explore these and other addresses. Are there any other random numbers that are used by the game that you know of and we haven't discussed already?
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
Here's my notes thus far: C309 Mutant HP growth RNG. C30B We know this already! What type of bonus the mutant gets. C30D Which way the NPC will step next. C30E Used for the Ability Uses Shuffler, for each ability. C31B HP200 RNG C323 Run away RNG C325 Flashy enemy fade-in RNG C326 Broken; Incremented every time the Uses Shuffler picks a full decrease C334 Broken; Incremented every time the Uses Shuffler picks a full increase C33B Which step triggers a random battle. C343 Monster group RNG C347: How much additional Str. and Agl. earned from STRENGTH and AGILITY potions. Rolled every time STRENGTH or AGILITY potion is used. (These potions offer a random bonus if the character's Str. or Agl. is below a certain point.) No notes. You seem to have it covered. C34B Double-burdened: Mutant stat bonus for Str, Def, Agl, or Mana; Determines which ability is selected C34F Apparently used for NPCs. Increments 0xC369 at certain values if an NPC is around. C352: Appears to affect the animation of the STENCH ability. (Rolled 4 times during GOBLIN battle around 20500 just after using STENCH, following ZOMBIE battle starting at 62550.) No notes. Odd RNG, though... C353 Number of monsters in groups RNG. C358: How much HP a POTION restores. Whenever POTION is used. (Different RNG for X-POTION?) No notes. C35A: Rolled at start of each battle turn. No notes. C35C Yummy meat RNG C369 Determines when an NPC will take a step. C36F Selects which one of 4 positions where an ability goes. C379: Rolled at start of battle. No notes. EDIT: Discovered what C325 does and realized that C3A4 is the "repeat" counter for when holding down buttons, not for C369.
Player (80)
Joined: 8/5/2007
Posts: 865
Long story: I ran through the RNG values for C358, which is rolled whenever you give a character a POTION or X-POTION. I cheated to give my mutant a huge HP cap and infinite potions, then recorded all the values. The base amount that an X-POTION heals is 90 and whatever is added onto that is based on the output of the RNG (up to 60 HP). Short story: I've divided the RNG into 61 bins.
14,36,36,33, 5,53,19,35,25,40,43, 7,44, 3,37,51,
37,43, 2,19,27,60,56,17,48,47,39,46,21, 4,45,16,
59,51,39,48,50,52,26,50,50,55, 2,22, 1,12, 8,36,
38,58,43, 4,48,45,11, 2,27,58,36,31,24,19,30,31,
16,54, 6,57,25,37,49,55, 5,50,47,37,46,27,53,21,
 7,47,32,11, 3,30,34,13,18,43, 9,16,51,34,15,46,
29,39,51,42,20,22, 4,40,40,35,28,52,29,42,22, 6,
52,32,13,26,42,15,41,28,57,28,54, 1, 6,49,60,59,
46,24,24,27,55, 7,41,25,35,20,17,53,16,57,23, 9,
23,17,58,41,33, 0, 4,43,12,13,21,14,39,56,15,44,
 1, 9,21,12,10, 8,34,10,10, 5,58,38,59,48,52,24,
22, 2,17,56,12,15,49,58,33, 2,24,29,36,41,30,29,
44, 6,54, 3,35,23,11, 5,55,10,13,23,14,33, 7,39,
53,13,28,49,57,30,26,47,42,17,51,44, 9,26,45,14,
31,21, 9,18,40,38,56,20,20,25,32, 8,31,18,38,54,
 8,28,47,34,18,45,19,32, 3,32, 6,59,54,11, 0, 1
I'm sorry it's not in hex and not very well formatted. I hope you don't mind (I can change it if you'd like). It looks like this RNG is subject to the same "round off to the nearest integer" flaw that you pointed out in the NPC movement RNG; you'll notice that there are two 0s and two 60s, but four 1s and five 2s. To refine the master table, multiply this table by 4.25, then round off to the nearest integer. You can probably also find the bin sizes explicitly with a little work, but I'm too tired to figure it out myself right now. I think every 4th bin should have five elements.
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
Heh, I'm fine even if it isn't in hex format. Fact is, you got a bunch of numbers for me to crunch through, so I went and processed them. Even if you recorded them as cats, flying spaceships, negative Q, etc, I'd still be able to process them (and wonder what in the world made you record them as such), so long as equal entries were given the same keywords, and I knew the relative values of each keyword, like ninja > flying spaceship or something. I've also launched my plan to implement the master table (after the above processing) in the mutant growth. It should be absolutely precise in identifying the basic growth types and what abilities show up, and mostly precise in finding the exact numbers for growth and where the ability is placed. So basically... My masterful code, it lives!! I trust that you can break it several dozen times on your next stroll through a (monster-infested) park.
local range= 16

local SuperRNGTable={
  0x3C,0x97,0x97,0x8B,0x13,0xE0,0x4F,0x93,0x69,0xA9,0xB5,0x1C,0xBA,0x0D,0x9C,0xD7,
  0x9C,0xB5,0x06,0x4F,0x71,0xFE,0xED,0x46,0xCB,0xC6,0xA4,0xC2,0x57,0x10,0xBE,0x45,
  0xFA,0xD7,0xA4,0xCB,0xD3,0xDC,0x6F,0xD5,0xD3,0xE9,0x08,0x5C,0x04,0x31,0x20,0x97,
  0xA2,0xF7,0xB5,0x10,0xCB,0xBE,0x2D,0x09,0x71,0xF5,0x97,0x82,0x64,0x4F,0x7F,0x82,
  0x42,0xE6,0x17,0xF1,0x69,0x9C,0xCF,0xE9,0x13,0xD5,0xC6,0x9C,0xC4,0x71,0xE0,0x57,
  0x1C,0xC6,0x87,0x2D,0x0B,0x7E,0x8F,0x35,0x4B,0xB5,0x24,0x42,0xD7,0x91,0x40,0xC4,
  0x7A,0xA4,0xD7,0xB1,0x53,0x5E,0x0F,0xA9,0xA9,0x93,0x75,0xDC,0x7A,0xB1,0x5E,0x1A,
  0xDC,0x86,0x35,0x6D,0xB3,0x3E,0xAD,0x75,0xF1,0x75,0xE6,0x02,0x1A,0xCF,0xFE,0xFA,
  0xC2,0x64,0x64,0x71,0xE9,0x1C,0xAD,0x69,0x93,0x53,0x46,0xE0,0x42,0xF1,0x60,0x24,
  0x63,0x46,0xF7,0xAD,0x8B,0x00,0x10,0xB5,0x31,0x35,0x57,0x3C,0xA4,0xED,0x3E,0xBA,
  0x02,0x24,0x57,0x31,0x2B,0x20,0x8F,0x29,0x2B,0x15,0xF7,0xA2,0xFA,0xCB,0xDC,0x64,
  0x5C,0x06,0x46,0xED,0x31,0x40,0xCF,0xF5,0x8B,0x09,0x64,0x7A,0x97,0xAD,0x80,0x7A,
  0xBA,0x17,0xE6,0x0D,0x93,0x60,0x2D,0x15,0xE9,0x29,0x35,0x60,0x3A,0x8B,0x1C,0xA4,
  0xE0,0x35,0x75,0xCF,0xF1,0x80,0x6F,0xC6,0xB3,0x46,0xD7,0xBA,0x24,0x6D,0xBE,0x3A,
  0x82,0x57,0x24,0x4D,0xA9,0xA0,0xED,0x53,0x53,0x69,0x87,0x20,0x82,0x4D,0xA0,0xE5,
  0x23,0x75,0xC6,0x91,0x4B,0xBE,0x4F,0x87,0x0B,0x87,0x17,0xFA,0xE4,0x2D,0x00,0x05
}

local mutRNG= {}
local mutAddr= {0xC30B,0xC34B,0xC309,0xC36F,0xC30E}
local mutName= {"main","plus","HP"  ,"pos" ,"shfl"}
--*****************************************************************************
local function RefreshMutantRNG()
--*****************************************************************************
    local T= false
    for i= 1, #mutAddr do
        local val= memory.readbyte(mutAddr[i])
        T= T or (val ~= mutRNG[mutName[i]])   -- I'm searching for any change
        mutRNG[mutName[i]]= val
    end
    return T 
end

-- After calling the above function, I can refer to the following:
--   mutRNG.main  Main mutant RNG. Determines what we get.
--   mutRNG.plus  For what ability and most stat growths
--   mutRNG.HP    Specifically for HP growth
--   mutRNG.pos   Picks what slot an ability goes into
--   mutRNG.shfl  For the Uses Shuffler

local AbilityList={
"ESP",    "BARRIER","FORSEEN","ELECTRO",
"STENCH", "FLAME",  "MIRROR 10","ARMOR",
"ICE",    "STEALTH","KINESIS","THUNDER",
"POWER",  "HEAL",   "GAS",    "xFIRE",
"oFIRE",  "BURNING","SL-GAZE","TELEPOR",
"P-FANGS","HYPNOS", "LEECH",  "P-BLAST",
"oPAR/WP","MIRROR  3","GAZE(s)","GAZE(c)",
"QUAKE",  "GAZE(d)","oDAMAGE","oCHANGE",
}

--*****************************************************************************
local function Inc(A)   return (A%256)+1   end
--*****************************************************************************

--*****************************************************************************
local function GenRange(R,D)
--*****************************************************************************
-- Returns an integer from 0 to D.
-- Might be imprecise. If so, we'll come up with something different!
    return math.floor((SuperRNGTable[R]*(D)/255)+.5)
end

local MutantTable={}
--*****************************************************************************
local function CompleteMutantGrowth()
--*****************************************************************************
    if not RefreshMutantRNG() then return end

    local main= mutRNG.main
    local plus= mutRNG.plus
    local HP  = mutRNG.HP
    local pos = mutRNG.pos
    local shfl= mutRNG.shfl

    for i= 1, range do  -- range is set at top of file
        main= Inc(main)
        local Str= ""
        local test= SuperRNGTable[main]

        if     test <=  34 then -- Ability
            Str= "AB "
            pos= Inc(pos)
            Str= Str .. GenRange(pos,3)+1
            local AB= 1
            while true do
                plus= Inc(plus)
                if SuperRNGTable[plus] >= 0xE5 then  break  end
                AB= (AB%32)+1
            end
            Str= Str .. " " .. AbilityList[AB]

        elseif test <=  68 then -- HP
            HP= Inc(HP)
            Str= "hp+" .. GenRange(HP,5)+10

        elseif test <=  98 then -- Mana
            plus= Inc(plus)
            Str= "mn+" .. GenRange(plus,4)+1

        elseif test <= 116 then -- Agility
            plus= Inc(plus)
            Str= "ag+" .. GenRange(plus,4)+1

        elseif test <= 134 then -- Strength
            plus= Inc(plus)
            Str= "st+" .. GenRange(plus,4)+1

        elseif test <= 142 then -- Defense
            plus= Inc(plus)
            Str= "df+" .. GenRange(plus,2)+1

        elseif test <= 146 then -- Shuffle uses
            Str= "!!"
            -- ... Uh, To Be Determined...

        else -- No effect
            Str= "__"

        end
        MutantTable[i]= Str
    end
end

local function Disp()
    for i= 1, range do
        gui.text(1, 9*i - 8 ,MutantTable[i])
    end
end
gui.register(Disp)

while true do
    CompleteMutantGrowth()
    emu.frameadvance()
end
EDIT: Removed an erroneous -1 from my GenRange. EDIT2: Updated SuperRNGTable
Player (80)
Joined: 8/5/2007
Posts: 865
Progress has been slow, mostly because I'm intimidated by the prospect of starting a new run (like typing an English paper, I tells ya!). I instead directed my energy towards updating my Lua script. Give this a run:
movie.rerecordcounting(false)

local state1 = savestate.create()
local state2 = savestate.create()

local Aglvals={8,56,130,221,233}
local Strvals={62,113,191,210,213,236}
local Manvals={6,23,28,31,43,61,88,100,137,138,142,162,203}
local Runvals={14,24,32,33,34,47,125,148,170,171}
local Abilvals={89,234,242}

local goodvals={56,130,221,23,137,203,62,113,191,32}
local okayvals={8,233,210,213,236,6,28,31,43,61,88,100,138,142,162,33,170}
local badvals={14,24,34,47,125,148,171}

local AglTable={}
local StrTable={}
local ManTable={}
local RunTable={}
local AbilTable={}
local RNGTable={}
local FTI = 1

-- Modeled after Matlab's "any" function.  Returns "true" if any element of "vector" matches "value".
local function any(vector,value)
	match=false
	for i=1, #vector do
		match=(match or vector[i]==value)
	end
	return match
end

savestate.save(state1)

while #RNGTable<3 do
	emu.frameadvance()
	savestate.save(state2)

	frame = emu.framecount()

	for k = 1, 8 do
		joypad.set(1, {A = 1, B = 1, select = 1, start = 1})
		emu.frameadvance()
	end

	local rng = memory.readbyte(0xC30B)
	local canrun=memory.readbyte(0xC323)

	-- Agl
	if any(Aglvals,rng) then
		RNGTable[FTI] = rng
		AglTable[FTI] = frame%1000
		StrTable[FTI] = " "
		ManTable[FTI] = " "
		RunTable[FTI] = " "
		AbilTable[FTI] = " "
		FTI = FTI + 1
	end

	-- Mana
	if any(Manvals,rng) then
		RNGTable[FTI] = rng
		ManTable[FTI] = frame%1000
		AglTable[FTI] = " "
		StrTable[FTI] = " "
		RunTable[FTI] = " "
		AbilTable[FTI] = " "
		FTI = FTI + 1
	end

	-- Str
	if any(Strvals,rng) then
		RNGTable[FTI] = rng
		StrTable[FTI] = frame%1000
		ManTable[FTI] = " "
		AglTable[FTI] = " "
		RunTable[FTI] = " "
		AbilTable[FTI] = " "
		FTI = FTI + 1
	end

	-- Running
	-- (Note the use of "canrun" instead of "rng".)
	if any(Runvals,canrun) then
		RNGTable[FTI] = canrun
		RunTable[FTI] = frame%1000
		ManTable[FTI] = " "
		AglTable[FTI] = " "
		StrTable[FTI] = " "
		AbilTable[FTI] = " "
		FTI = FTI + 1
	end		

	-- Abilities
	if any(Abilvals,rng) then
		RNGTable[FTI] = rng
		AbilTable[FTI] = frame%1000
		RunTable[FTI] = " "
		ManTable[FTI] = " "
		AglTable[FTI] = " "
		StrTable[FTI] = " "
		FTI = FTI + 1
	end

	savestate.load(state2)
end

savestate.load(state1)

gui.text(5,1,"RNG")
gui.text(30,1,"Agl")
gui.text(55,1,"Str")
gui.text(80,1,"Mana")
gui.text(105,1,"Run")
gui.text(130,1,"Abil")

for i = 1, #RNGTable do
	if any(goodvals,RNGTable[i]) then
		color = "green"
	elseif any(okayvals,RNGTable[i]) then
		color = "yellow"
	elseif any(badvals,RNGTable[i]) then
		color = "red"
	else
		color = "white"
	end
		
	gui.text(5, 9*i + 1, RNGTable[i],color)
	gui.text(30, 9*i + 1, AglTable[i],color)
	gui.text(55, 9*i + 1, StrTable[i],color)
	gui.text(80, 9*i + 1, ManTable[i],color)
	gui.text(105, 9*i + 1, RunTable[i],color)
	gui.text(130, 9*i + 1, AbilTable[i],color)
end
emu.pause()
The left hand column of the output is the RNG index (either C30B or, for running, C323). This can be used to look up specifically what you're getting. The header for each column refers to what kind of bonus you can expect to get. The entries are the last three digits of the frame number at which you should start to reset the game to get that bonus. If the row is in green, it's a "good" bonus-- i.e., it gives you a stat boost of 5 or you can run from the following six battles. If the row is yellow, it's an "okay" bonus and gives you a stat boost of 4 or you can run from the following five battles. If the row is red, it's a "bad" bonus and you can only run from four battles (I didn't bother including stat bonuses that boost your stats by 3 or less). My program could probably benefit from formatting everything in an array and programming a subfunction that checks for specific bonuses, but I say if it ain't broke, don't fix it. If I were to improve it, however, it would be a lot easier to exclude certain bonuses by simply commenting out a line or two. Are you familiar with the mechanics for when random encounters occur? I've been puzzled by it for a while. For example, a random encounter pops up in an open area on the world map if 0xC33B is 255. If you're in a forest though, you also get into a random encounter if 0xC33B is 0. According to our master RNG table, the RNG is roughly 5 at index 255, but 60 at index 0. Now, I assumed that (like almost everything else in this game) a random battle would occur if the RNG is above or below a certain value determined by your environment. That can't be possible with the values that have come up. So I guess I'm wondering if the battle RNG is completely different, or if they simply use a different criterion for determining whether you get into a battle or not. For example, they could read the RNG's output "backwards" either in hexadecimal or binary and if that number is above or below a certain value, then you fight a battle. I don't think that's what they did, but it's just one of many possibilities. Anyway, as curious as I am about that, it doesn't have all that much practical purpose. We can just determine the values that cause random encounters from context and/or through trial and error. I only bring it up because if it does indeed use the same RNG, there's a small chance that it might narrow down some of the RNG values to a small number of possibilities-- perhaps just one or two. If you're interested in deciphering the encounter RNG, I suggest running around World 4 since the SU-ZAKU encounter rate is huge (it's something like 1 in 4 for each step-- just be sure to enable a cheat that allows you to run from every battle!). On the other end of the spectrum, the encounter rate seems to be lowest in the glider in World 3. I'll be starting my run tonight and attempting to manipulate the hell out of luck. As I said earlier, my goal stats for World 3 are 99 Agl., 99 Mana, and 50 Str.
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
My Master Table is actually "off by 1", with how I'm using it. Rather than using 0~255, I've decided to roll with lua's way of beginning tables at 1, so I'm using a range of 1~256. Look at all the other values that random encounters show up, and compare it to my table, and they will all look "off by one". The lookup value 0 is actually index 256 in my table. If it weren't for that "off by one" thing, you would easily see that the two numbers we should be looking at are 0x00 and 0x05. Which should look fine for the random encounters thing. As far as I know, there is a random encounter if it picks a random number less than whatever the encounter threshold is. In world I, the pure-white tiles is 5, forest is 6, and grassy lands is 14, by my measurements. ... I guess with the way I suddenly switched without an explanation, confusion is sure to show up. Would you prefer if I switch back to the old way? Here's what the old-style table would look:
local SuperRNGTable={[0]= 0x05,
       0x3C,0x97,0x97,0x8B,0x13,0xE0,0x4F,0x93,0x69,0xA9,0xB5,0x1C,0xBA,0x0D,0x9C,
  0xD7,0x9C,0xB5,0x06,0x4F,0x71,0xFE,0xED,0x46,0xCB,0xC6,0xA4,0xC2,0x57,0x0F,0xBE,
  0x45,0xFA,0xD7,0xA4,0xCB,0xD3,0xDC,0x6F,0xD5,0xD3,0xE9,0x06,0x5C,0x02,0x31,0x20,
  0x97,0xA2,0xF7,0xB5,0x0F,0xCB,0xBE,0x2D,0x09,0x71,0xF5,0x97,0x82,0x64,0x4F,0x7E,
  0x82,0x42,0xE6,0x17,0xF1,0x69,0x9C,0xCF,0xE9,0x13,0xD5,0xC6,0x9C,0xC4,0x71,0xE0,
  0x57,0x1C,0xC6,0x87,0x2D,0x0B,0x7E,0x8F,0x35,0x4B,0xB5,0x24,0x42,0xD7,0x91,0x3E,
  0xC4,0x7A,0xA4,0xD7,0xB1,0x53,0x5E,0x0F,0xA9,0xA9,0x93,0x75,0xDC,0x7A,0xB1,0x5E,
  0x1A,0xDC,0x86,0x35,0x6D,0xB3,0x3E,0xAD,0x75,0xF1,0x75,0xE6,0x02,0x1A,0xCF,0xFE,
  0xFA,0xC2,0x64,0x64,0x71,0xE9,0x1C,0xAD,0x69,0x93,0x53,0x46,0xE0,0x42,0xF1,0x60,
  0x24,0x63,0x46,0xF7,0xAD,0x8B,0x00,0x0F,0xB5,0x31,0x35,0x57,0x3C,0xA4,0xED,0x3E,
  0xBA,0x02,0x24,0x57,0x31,0x2B,0x20,0x8F,0x29,0x2B,0x15,0xF7,0xA2,0xFA,0xCB,0xDC,
  0x64,0x5C,0x06,0x46,0xED,0x31,0x3E,0xCF,0xF5,0x8B,0x09,0x64,0x7A,0x97,0xAD,0x80,
  0x7A,0xBA,0x17,0xE6,0x0D,0x93,0x60,0x2D,0x15,0xE9,0x29,0x35,0x60,0x3A,0x8B,0x1C,
  0xA4,0xE0,0x35,0x75,0xCF,0xF1,0x80,0x6F,0xC6,0xB3,0x46,0xD7,0xBA,0x24,0x6D,0xBE,
  0x3A,0x82,0x57,0x24,0x4D,0xA9,0xA0,0xED,0x53,0x53,0x69,0x87,0x20,0x82,0x4D,0xA0,
  0xE5,0x23,0x75,0xC6,0x91,0x4B,0xBE,0x4F,0x87,0x0B,0x87,0x17,0xFA,0xE4,0x2D,0x00
}
I'll be taking a look at your script. I have not made any attempts at botting, so looking at something like this should be a good experience. Plus, it should do a good job at making things more convenient. I know the feeling about the fact you haven't started yet. I want to try, knowing things won't get done if I don't, but I just have trouble getting myself into it. There's a lot to be done in this sort of run, with how its RNG works, that much is certain.
Player (80)
Joined: 8/5/2007
Posts: 865
FatRatKnight wrote:
My Master Table is actually "off by 1", with how I'm using it.
Oh, oh, OH! Stupid me! I actually noticed it was off by 1 because Lua doesn't normally allow 0 as an index, but I didn't put two and two together. I figured that your 1 index corresponded to the 0 index in game. Now everything makes sense. Furthermore, this is good news because we can deduce at least some of the RNG values just by looking at the encounter rates in different areas. I'm pretty sure there are some areas with only one or two additional encounters over other areas. You can keep the table as-is since you've already programmed it that way. I've been curious about it for a while, but what exactly does the "[0]=" at the start of the vector do? Does that indicate to Lua that 0 is an acceptable index?
FatRatKnight wrote:
I'll be taking a look at your script.
Just be sure to replay the video every time you use it! It'll desync on you like it's trying to make your life miserable! Here's my latest run: World 1 in 10 minutes. I think you'll find it muy rapido. Good things: •TELEPOR and P-BLAST both picked up, probably saving a lot of time down the line. •Much better luck manipulation. After every battle, I would immediately save and use my program to see if and when I should restart. If the results weren't good (no good restart opportunities within about 30 frames), I rewound the game, walked a few steps, tested luck again. It was a bit tedious, but you'll see the results are very sleek. •HUGE stat boosts already. My Agl/Mana/Str is at 77/52/24. I should have no problem maxing those stats by the end of World 2. Bad things (and there are a whole lot of little bad things nagging at me): •I think I overdid it with the Agl boosting before Bandit Cave. I found myself playing catch-up with Mana for a while after. Specialization (i.e., boosting only one or two stats for an extended length of time) is bad for luck manipulation, so I should be more even-handed with my stats next time. •I suspect it's faster to TELEPOR out of Bandit Cave, then walk from the tower to King Armor... •... but even if it isn't, I shouldn't have picked up P-BLAST first. By giving my mutant an ability, I have to scroll past it in battle to get to SABER, wasting some time. P-BLAST should be picked up as late as possible before Castle Sword. •My menu navigation remains a little sloppy. Deal. •I had to switch my main mutant back from the third slot to the first, technically wasting time (in fact, I marched all the way to King Sword before realizing I was stat boosting the wrong mutant and had to redo that entire segment). Because I've only looked into stat boosts for the party leader, I have to put her in front. I have this nagging suspicion that if we manipulate luck for, say, the third or fourth mutant, we'll find there are slightly better stat boosts for them, such as four Agl +5 boosts instead of three. •I meant to buy a WHIP at some point to have on hand for BYAK-KO, but I forgot that it's in Town of Hero. I actually don't think that's a mistake (although I maybe should have picked it up before dressing the statue). I'll just pick one up later. •I'm a little concerned I've actually fought too many battles. I've got to rely on P-BLAST more from here until BYAK-KO. Had I put off fighting battles until later, I could pick up an L-SABER with no problem since later battles award more GP. If I fall short on cash at that point, I'll have to use the regular SABER and pick up the CATCRAW in World 4. It'll probably work as long as I'm careful and it may even be the best strategy, but I'm nervous about it. •Not that it shows in the finished product, but this run is desyncing like mad. My first run didn't desync many times as I was making it. I think this run desyncs more often than not. It should become tolerable once I start running from battles since I can go about 200 steps before restarting. I think World 1 may be the most important and hardest world to plan, so for better or for worse, I'm out of it, and that's the important thing. At some point, I did a test comparing the number of frames it takes to run from battle versus the number of frames to reset the game (in both cases, I measured the number of frames until you regain control of your character). I found it takes 152 frames to run from battle but just 137 frames to reset. The caveat here is that those 137 frames don't include luck manipulation, so I imagine it's almost a wash. Nevertheless, it would seem the fastest strategy would be to manipulate luck so that you have a large number of steps until the next battle, then as you approach that battle, manipulate luck to do it again. I'm very suspicious of this, however, since it seems so much more logical to just manipulate luck so that you can run from a long string of battles. I'll test it at some point. Oh yeah, I realized that if you want to remove a bonus from the script I wrote, just comment out the "FTI = FTI + 1" line under whatever bonus you want to remove. The index won't increment so it'll just overwrite that data with the next valid frame.
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
Definitely one swift stat-gaining run. It was fun watching you start damaging things in the hundreds after just a few swiftly manipulated battles. I note you were thinking about grabbing TELEPOR for use after the P-FROG bandit battle. I then started looking at the number of steps we have and the soonest we can possibly manipulate TELEPOR into existence. Here are the numbers: The 0x59 TELEPOR starts at step 0x60, while the 0xEB TELEPOR starts at step 0xF2. With a four mutant party, you need four battles to get TELEPOR. Presumably, you want 3 random battles and finish by using the P-FROG bandit battle. The 0x59 TELEPOR needs 64 steps, while the 0xEB TELEPOR needs only 58 steps when involving the forest encounter at step 0x00. Not too bad, eh? With a three mutant party, you need five battles for TELEPOR. So four randoms plus the P-FROG should do. However, there's a severe jump in steps! The 0x59 TELEPOR needs 158 steps, and the 0xEB TELEPOR takes 137 steps using the 0x00 step forest encounter. There's only 172 steps between the TOWER and the P-FROG bandit. A three mutant party would be hard-pressed to get TELEPOR while still handily defeating the P-FROG. There's a conveniently located NPC in the bandit cave we can pick a fight with, but LIZARDs aren't the squishiest things to be hitting, and we'd likely fight more than 1 at a time from this sort of encounter. Probably not a good solution for our three mutant party. In any case, the open land and Bandit Cave encounter rates are 5, while the forest is 6. No sneaky high-encounter rates anywhere along the way we can take advantage of, to my knowledge. Notably, TELEPOR doesn't appear as a battle option. You can pick this ability up without need to do any scrolling for your favorite SABER. Silly step counters if you need it (as a bonus, it cheats an RNG that shouldn't cause any encounters):
local EnCounter= 0
local StCounter= 0
local LastLoc= memory.readword(0xCCC8)
while true do
    if memory.readbyte(0xC33B) ~= 0x80 then
        memory.writebyte(0xC33B,0x80)
        EnCounter= EnCounter+1
    end
    local Loc= memory.readword(0xCCC8)
    if Loc ~= LastLoc then
        StCounter= StCounter+1
        LastLoc= Loc
    end
    gui.text(120,1,EnCounter)
    gui.text(120,9,StCounter)

    local z= input.get()
    if z.Z then
        EnCounter= 0
    end
    if z.X then
        StCounter= 0
    end

    emu.frameadvance()
end
EDIT: The [0]= thing I do in lua is just saying "put this object into index 0". It's not saying "allow this thing to be put in index 0", but rather declaring that the object must be placed there. Some table-related built-in functions of lua does not handle this well, for whatever reason, but we shouldn't need to worry about them in this case. EDIT2: I took a look at the random encounter groups, address 0xC343. The thresholds appear to be 0x04, 0x08, 0x10, 0x20, 0x40, and 0x80. A value in the range 0~3 gets one rare group, the range 4~7 gets another rare group, and so forth. The open lands of World I seem to have these encounters: 0x00 ~ 0x03 - REDBULL (1.5625%; Very rare) 0x04 ~ 0x07 - SKELETON (1.5625%; Very rare) 0x08 ~ 0x0F - ASIGARU (3.125%; Quite rare) 0x10 ~ 0x1F - ALBATROS (6.25%; Uncommon) 0x20 ~ 0x3F - ZOMBIE (12.5%; Somewhat common) 0x40 ~ 0x7F - GOBLIN (25%; Quite common) 0x80 ~ 0xFF - LIZARD (50%; Extremely common) I'm hoping this scale is a "one size fits all" kind of a deal, in that all locations have 7 possible types of encounters with these exact chances. Updated the old Master Table with values that fit with these ranges, in case you need it to analyze enemy groups.
Player (80)
Joined: 8/5/2007
Posts: 865
After a looooong night, I'm done with World 2. It was plagued with desyncs and I made some stupid mistakes along the way. In particular, I was through learning abilities, so I commented that section of my script out. Then I realized I'd want to shuffle abilities, but I forgot to uncomment that section, so I ended up only scanning for abilities that show up in the last row of my script. Once I got that straightened out, I discovered that abilities are in fact shuffled one by one from first to last. Since STEALTH (which has infinite uses) was my first ability, my second ability, P-BLAST was always knocked down to zero uses. I had to go back and fight an extra battle to get a useless ability so that P-BLAST was second on the list. My run is about 78,000 frames, a whole 19,000 frames slower than your effort. It just amazes me that I can put in all this effort into luck manipulation while putting up with frequent desyncs and it's a full 30% slower than a little run you threw together. I'm hoping I can make up for lost time by running from battles from here on out, but I've got to hand it to you-- your first attempt remains the time to beat. If you'd like to pick it up again, you've got a whole 5 minute head start with which to fight battles, pump yourself up, and catch up with me. I don't think I made any real mistakes this time around. I stopped at the inn in Port Town because I figured it would be faster than manipulating a battle for abilities. Whether that's true or not, I wasn't set up at that point to replenish abilities through battle, so it seems to have been the right strategy. My teammates are getting on my nerves, mostly because I keep holding A through battles so they use their abilities and waste time. I realized I wasn't running from battles to better manipulate luck. Since running from a battle costs about 140 frames, it may be more efficient to just go with whatever the RNG throws at you after the previous battle. Still, I should be more thorough about these things. I'm thinking of writing a script that would cover all the luck manipulation for me. Part of writing the script would include incorporating "waypoints" that specify where to go at all times. I have the know-how to write it, but it'll take a fair amount of work, so I'm putting it off.
FatRatKnight wrote:
With a four mutant party, you need four battles to get TELEPOR. Presumably, you want 3 random battles and finish by using the P-FROG bandit battle. The 0x59 TELEPOR needs 64 steps, while the 0xEB TELEPOR needs only 58 steps when involving the forest encounter at step 0x00. Not too bad, eh?
Sounds like it's barely doable. It's worth looking into for next time.
FatRatKnight wrote:
The [0]= thing I do in lua is just saying "put this object into index 0". It's not saying "allow this thing to be put in index 0", but rather declaring that the object must be placed there. Some table-related built-in functions of lua does not handle this well, for whatever reason, but we shouldn't need to worry about them in this case.
Ah, so can I follow it up by writing [147]=... and have it place that value in index 147? Would that leave the 146 intermediate values as "nil"? Just curious.
FatRatKnight wrote:
I took a look at the random encounter groups. The thresholds appear to be 0x04, 0x08, 0x10, 0x20, 0x40, and 0x80. A value in the range 0~3 gets one rare group, the range 4~7 gets another rare group, and so forth.
Verrrrry interesting and qualitatively consistent with what I've observed. Are rarer encounters generally more difficult? This could be very useful in a subsequent run, but for this run, I'm fleeing most of the remaining battles. Ah crap! Come to think of it, I have some forced battles coming up and I don't have any results I particularly want to manipulate from them. If I'd put off a little stat boosting until this point, I'd be able to work on that. Looks like I'll end up amassing 20 charges of P-BLAST or something ridiculous like that.
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
Part of the speed of my run is likely due to how swiftly I work the menus. I can imagine minutes wasted on laziness of just holding A instead. For whatever reason, I also take the time to set speed 1, in the re-order party Select menu, but I'm not sure if that saves any time. This is what my text file looks like, attempting to plan a route just getting to the P-FROG. Yes, I saved this text as part of my lua script, which is why the -- heading each line.
--Enc Denisty:
-- World 1, open land:  5
-- World 1, Forests  :  6
-- World 1, Grassy   : 13

--Enc!!!                2C                7B 95    A0             FE
--Enc!!                                                              FF
--Enc!         12    2A       37    54                B1 B9    F8
--Enc    04 0D    1D       33    48    66       96          C3

--172 (AC) steps from Tower to P-FROG bandit
--    Um, it will be difficult to learn TELEPOR within that time...
--144 (90) from P-FROG bandit to Castle Armor
--    TELEPOR seems quite possible with 316 steps plus the P-FROG battle
-- 77 (4D) from Tower to Castle Armor
--    If you get TELEPOR at P-FROG, this could save a few seconds...
--154 (9A) from Castle Armor to Castle Sword
--130 (82) from Tower to Castle Sword
-- 49 (31) Castle Sword 1F
-- 31 (1F) Castle Sword 2F
--  8 (08) Castle Sword 3F
-- 48 (30) from Tower to Castle Shield
--  5 (05) from Castle Shield to Town of Hero

-- The (EB) TELEPOR starts at step F2;
-- The (59) TELEPOR starts at step 60.
-- 4 mutant party (3 rnds + P-FROG), it will take the (59) TELEPOR 64 steps.
-- 3 mutant party (4 rnds + P-FROG), it will take the (59) TELEPOR 158 steps.
-- 4 mutant party (3 rnds + P-FROG), it will take the (EB) TELEPOR 58 steps.
-- 3 mutant party (4 rnds + P-FROG), it will take the (EB) TELEPOR 137 steps.

-- 4 mutant party, (51) GAZE in one, 36 steps (plains, please)
-- 3 mutant party, (51) GAZE in two, 62 steps (plains, then forest)

-- 4 mutant party, (F1) P-BLAST in two,    8 steps (forest-worthy)
-- 3 mutant party, (F2) P-BLAST in three, 53 steps (plains,forest,any)

-- (17) [1] Mana+5, 15 steps
-- (89) [1] Mana+5,  5 steps (No forest; Mana+4 follows)
-- (CB) [1] Mana+5, 45 steps (No forest, bad number of steps)
-- (A1) [2] Mana+5, 93 steps (No. Just, no.)
-- (E6) [2] Mana+5, 18 steps (No forest)
-- (F3) [2] Mana+5,  5 steps
-- (04) [3] Mana+5, 33 steps
-- (88) [3] Mana+5,  6 steps (No forest)
-- (F2) [3] Mana+5,  5 steps (inline with (F2) P-BLAST)
-- (03) [4] Mana+5, 34 steps
-- (87) [4] Mana+5,  7 steps (No forest)
-- (AD) [4] Mana+5, 74 steps (No. Just, no.)
-- (F1) [4] Mana+5,  6 steps (inline with (F1) P-BLAST)

-- 3 mutant party:
-- GAZE first thing: 110 steps to P-FROG left
-- P-BLAST next: 48 steps left (inside cave)  ... No, ZOMBIE blocks GAZE

-- 3 mutant party:
-- P-BLAST first thing: Wait, first forest is 27 steps away, we've got 6...

-- 3 mutant party:
-- Waste a pile of steps first?
-- P-BLAST: 99 steps left (re-order for both Mana+5s)
-- GAZE: 37 steps (in cave. Nuts, a durable ZOMBIE.)
-- Perhaps manipulate quick mana after P-BLAST? Will +10~15 mana cut it?
-- Even with 0 P-BLAST uses after P-FROG, we should have GAZE.
-- I sometimes see the encounters "shift". Maybe SKELETON instead?

--      OpenLand    Forest       Bandit Cave
--A  4, REDBULL     LIZARD       FLY     +SKELETON
--B  4, SKELETON    REDBULL      LIZARD
--C  8, ASIGARU     SKELETON     REDBULL
--D 10, ALBATROS    ASIGARU      SKELETON
--E 20, ZOMBIE      ALBATROS     ASIGARU
--F 40, GOBLIN      ZOMBIE       ALBATROS
--G 80, LIZARD      GOBLIN       ZOMBIE
EDIT: Might also help to paste some functions I've been playing around with... Just include the Master Table (The SuperRNGTable I posted a short while ago), a bit of code to actually call these functions, and we should be good.
--*****************************************************************************
local function Inc(r)   return (r%256)+1   end
--*****************************************************************************

--*****************************************************************************
local function NextRN(r)  r=(r%256)+1; return r,SuperRNGTable[r] end
--*****************************************************************************

--*****************************************************************************
local function GenRange(R,D)
--*****************************************************************************
-- Returns an integer from 0 to D. Expects the RNG index, not value.
-- Might be imprecise. If so, we'll come up with something different!
    return math.floor((SuperRNGTable[R]*(D)/255)+.5)
end


--*****************************************************************************
local function ShowNextBattle(x,y)
--*****************************************************************************
    local RN= memory.readbyte(0xC343)
    local Val
    for i= 0, 9 do
        local Str
        RN, Val= NextRN(RN)
        if     Val < 0x04 then Str= "A"
        elseif Val < 0x08 then Str= "B"
        elseif Val < 0x10 then Str= "C"
        elseif Val < 0x20 then Str= "D"
        elseif Val < 0x40 then Str= "E"
        elseif Val < 0x80 then Str= "F"
        else                   Str= "G" end
        gui.text(x+5*i,y,Str)
    end
    gui.box(x-2,y-1,x+4,y+7,0,"red")
end

--*****************************************************************************
local function ShowNextRun(x,y)
--*****************************************************************************
    local RN= memory.readbyte(0xC323)
    local Val
    for i= 0, 9 do
        local Str
        RN, Val= NextRN(RN)
        if     Val < 0x7F then Str= "N"
        else                   Str= "Y" end
        gui.text(x+5*i,y,Str)
    end
    gui.box(x-2,y-1,x+4,y+7,0,"yellow")
end

local NPCdir= {"S","N","W","E"}
--*****************************************************************************
local function ShowNextNPCDir(x,y)
--*****************************************************************************
    local RN= memory.readbyte(0xC30D)
    for i= 0, 9 do
        RN= Inc(RN)
        local Val= GenRange(RN,3)+1
        gui.text(x+5*i,y,NPCdir[Val])
    end
    gui.box(x-2,y-1,x+4,y+7,0,"green")
end
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
Okay, so I didn't even come close to bothering with faster luck manipulation. However, it seems my basic plan that I'm thinking about has merit. 9 and a half minutes, even when I said "anything less than 1000 frames per reset is good," on top of other lack of optimizations. The horribly slow code I've been using to manipulate what I want is basically this:
-- This was stuck in along with my mutant RNG stat revealer code.

local Rs= {start=true,select=true,A=true,B=true}

local function ResetLoop(fn)
    while fn() do
        joypad.set(1,Rs)
        emu.frameadvance()
    end
end

local function Stuff()
    if (mutRNG.main == 0x89) then -- Or whatever insane condition...
        return false  -- Stop, we're done.
    end
    return true  -- Keep going.
end

while true do
    local z= input.get()
    if z.Z then
        ResetLoop(Stuff)
    end
    emu.frameadvance()
end
Four mutants look extremely doable, while I can still get my monster. I replaced a dead buddy with the ALBATROS with no problems. I'm finding how incorrect the disorganized notes I've posted up there are. I've got some work to do on them, it seems. Besides, they're just random notes I'm jotting down, mostly for myself. But... I just have 51 HP... I might need something more to survive SEI-RYU's first hit. Maybe another pile of cannon fodder valued ally can help me out here, since I am getting an ALBATROS anyway.
Player (80)
Joined: 8/5/2007
Posts: 865
Well, I was hoping to have a completed run for you, but I've run into a little snag. The game has lost its mind and won't let me enter the second tower. I say it's "lost its mind" because it actually will let me enter, but only when it feels like it. Here's my progress: Stuck. You may wish to watch it at 1x or 2x speed once I get to frame 150,000 or so. To be honest, I think the culprit here is the GEN-BU skip, which is a shame since I thought it was exceptionally clever. Even so, the game seems really confused as to whether I should be allowed to advance or not. You'll see I repeatedly waltz in and out of tower 1, then without any significant action on my part, it admits me to tower 2. Your insight would be greatly appreciated. Do you think I should finish off this run? We can just subtract out the frames I spent wandering aimlessly. I have some notes on my run anyway and I think I've learned some good lessons here. From what I can tell, attack order gets "scrambled" if you use a spell (or possibly in the presence of multiple enemies). You'll see that despite my leading mutant having much more agility, she frequently is the last to attack in battle. I'm trying to think of ways we can get around that-- perhaps we can teach ESP to the supporting cast since it works very quickly. There's a P-KNIFE in the tower that has one more attack power (7) than the SABER. Since both my Agl. and Mana were maxed out, I didn't know if I should pick it up or not and I spent a lot of time thinking about whether it was worth it. Basically, there was a very low probability that it could save one turn against BYAK-KO. Then I realized that since this is a test run, I should just pick it up so I could, you know, test it. It didn't save a turn, so no P-KNIFE for us. I pick up the CATCRAW for much the same reason. I haven't used it, so no CATCRAW for us either. I found it was faster by about 590 frames to TELEPOR out of jail (I timed how long it took to reach the Floating Castle). Heh, now that I think about it, it also keeps our inventory slightly less cluttered, saving us an additional handful of frames. Using TELEPOR after fighting BYAK-KO as opposed to flying back to the tower saves about 500 frames. It's about 1,000 frames faster to go through the abandoned subway to save Sayaka. It's a very minor time save, but I found it nontrivial to move around So-Cho when he catches up with you in the power plant. You start out facing the wrong way and on the bike, so you have to turn yourself around and get off in a timely manner. I tested two strategies: left two, right one; and up one, right one. Left two, right one was faster by 11 frames (although it's possible that another method is even faster). You can "jump off" an elevator moving down in the skyscraper by pushing right as you pass a door. You'll see me use that twice, though I missed it the first time (I was lazy and didn't go back to correct it). I found it was a few frames faster to walk from So-Cho's grave rather than TELEPOR. It wasn't much, so it may be faster to TELEPOR if we can scroll through the floors faster in the menu. I doubt it, though. I had to TELEPOR back to World 1 to get EYEDROPS before the ASHURA battle. I couldn't get through the SU-ZAKU battle without him blinding me, so I tried to carry on despite that handicap. Once I reached ASHURA, I found that I couldn't defeat him and I needed EYEDROPS to raise my hit%. In subsequent runs, it may be faster to pick up the EYEDROPS before starting our ascent. Unfortunately, that assumes that we will be blinded at some point, but we can only hope! I have changed my preferred strategy yet again. I now think it's inefficient to load up on stat boosts for just one mutant when they won't be using them simultaneously. There's no purpose for the same mutant having both high Mana and high Str. Therefore, I think the best strategy would be to find some point in the RNG where two mutants get decent stat boosts-- one in Agl., the other in Mana. Your second mutant is then your designated spellcaster while your first is the bruiser. This has the added bonus of allowing almost twice as much damage against bosses and tough enemies through BYAK-KO. I watched your latest run and I'm encouraged that these little pieces are starting to fall in place. It's good to know we can use TELEPOR early. Once again, your sloppy luck manipulation has bested my run by about 3,000 frames. I'm eager to see if you stay ahead of my pace. Well, I'm probably going to take a break for a couple of days to think about this and plan a two-mutant run. I'll be scouring the RNG for regions that give good stat boosts to two mutants. I think it'll carve a huge chunk of time off the run. Edit: I was just thinking about how you mentioned that you set the text speed to 1. I thought it wouldn't save time, but now I think it might. After finishing the game, the characters talk for a bit. I don't know exactly when the game accepts input, but if that text is affected by the text speed and we don't need to press A or B to close any text boxes, it will save a little time (off the movie) to have the text speed maximized. We could always end the input at the same time and just have the text wrap up at a slow crawl, but I don't like it stylistically. Am I making sense?
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
Bobo the King wrote:
Well, I was hoping to have a completed run for you, but I've run into a little snag. The game has lost its mind and won't let me enter the second tower.
Obviously, an NPC stole the game's mind! For whatever reason, it seems that a certain NPC must vanish from the town here before you can enter Tower2. I spoke with this NPC, then entered and left Tower1, so that I reenter the town with the NPC no longer there. Thus, I can enter Tower2. No need to fight GEN-BU!
Bobo the King wrote:
Do you think I should finish off this run? We can just subtract out the frames I spent wandering aimlessly.
We can subtract the "wandering aimlessly" part from the movie itself, now. And of course we should finish it! It will give us some idea on what to shoot for in the final climb.
Bobo the King wrote:
I have some notes on my run anyway and I think I've learned some good lessons here.
And they are all good. This is giving us more and more what to expect, so that we're not tripped at any points. So even with 99 Agility, you don't act first? This implies that Agility isn't used in the turn order algorithm. Just an implication, however, not actual proof. Also good to note that most late-game weapons are useless, other than the E-WHIP. And I've noticed your SAW missed several times even with a Strength just under 70. That thing must be highly inaccurate! And it's nice knowing how useful TELEPOR is. It doesn't seem to have any use in World IV or anything after that. And after World IV, it looks like it will be one big boss rush that involves repeated application of SAW, everything else we have is apparently useless.
Bobo the King wrote:
I have changed my preferred strategy yet again. I now think it's inefficient to load up on stat boosts for just one mutant when they won't be using them simultaneously.
You're either wiping out entire groups or slaying single baddies. Splitting up Agility and Mana into different mutants for this purpose doesn't seem productive in my eyes, since you're not going to use one or the other in many situations anyway. On the other hand, one mutant can only get one stat boost at a time. Two mutants have the potential to boost different stats from the same battle, hopefully a matter of finding the right spots in the RNG. And, of course, there's the fact that you can use both P-BLAST and SABER in the same turns and have both be high-powered. I see a possibility that it can help. A good chance. You're the one that made the near-full test run, your experience should tell you what my theory doesn't.
Bobo the King wrote:
I watched your latest run and I'm encouraged that these little pieces are starting to fall in place. It's good to know we can use TELEPOR early. Once again, your sloppy luck manipulation has bested my run by about 3,000 frames. I'm eager to see if you stay ahead of my pace.
I'm probably going to turn around, talk to that NPC while I'm still there, and pick up two more humanoid body shields- I mean, champions of justice. We'll see how far I get this time...
Bobo the King wrote:
I was just thinking about how you mentioned that you set the text speed to 1. [...]
It may save media time at the ending, or perhaps there's sneaky frames we're not normally aware of saved due to it. It's worth testing (and maybe we can set it without wasting time in an attempt at manipulating luck).
Joined: 5/9/2008
Posts: 35
Location: USA
FWIW, I'm really enjoying reading about the planning and watching the WIPs for this run. Can't wait for the final product!
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
ntclark wrote:
FWIW, I'm really enjoying reading about the planning and watching the WIPs for this run. Can't wait for the final product!
Thanks! Another person waiting in eager anticipation of what we'll do! Among insta-deaths, I've been looking at petrifying the enemies. According to some FAQ on GameFAQs, most bosses are immune to the PARA element, which stops the death gaze, but not the STONE element, which would stop things like the STONE book. Sure, I saw GAZE (stone) in that Mutant Ability list. Problem is, I recall investigating each and every possible RNG value and came up empty for GAZE (stone). Upon further investigation, I can conclude it's completely impossible to even get GAZE (stone), or for that matter, oDAMAGE as well. No amount of soft-resetting will solve this problem. We can pick up a STONE book from a shop in World III. Slightly out of the way, but if it means we can insta-win versus BYAK-KO, SU-ZAKU, SEI-RYU2, BYAK-KO2, and SU-ZAKU2 without the unwieldy SAW, that might actually be worth the detour. With 99 Mana, we'd have a 21% chance to miss a few of these enemies. We shouldn't have trouble hitting. This also means my monster idea is now obsolete, if we prove the STONE book can cover our needs in insta-deaths. All this leaves are fights against multiple groups, SEI-RYU, MACHINE, ASHURA, GEN-BU2, and CREATOR. The SAW is available to insta-kill the latter four, P-BLAST for the multi-groups, leaving SEI-RYU as the one barrier in the way. A monster just doesn't seem like it would work out here, anymore. But before I start crunching down on a new RNG plan based on this book of STONE, I want to try out the spell first and see how it works. EDIT: I have a feeling that one would like to see the results. They're spectacular. Now, is there any doubt about the detour? On a side note, DRAGON armor will stop fire, ice, elec, and poison. It's also available in World III, in a different shop, in case we end up needing some resistance somewhere.
Editor, Skilled player (1202)
Joined: 9/27/2008
Posts: 1085
I re-beat World II. My old time is still faster, but this run has 99 Mana to abuse GAZE, P-BLAST, and book of STONE. As nice as P-BLAST may be, my plans indicate I'll only be using it once more. My plans look kind of like this, right now:
GAZE     P-FROG
GAZE     KINGSWRD
P-BLAST  1-2 SKELETON + 0-2 ASIGARU
Attack!  STEWARD
Skip     GEN-BU

Hrm...   SEI-RYU

GAZE     1-3 MOSQUITO
P-BLAST  1-1 GARLIC   + 1-1 SABERCAT + 1-1 P-WORM
GAZE     1-3 SABERCAT
bSTONE   BYAK-KO

GAZE     1-3 ATOM ANT
GAZE     EVIL EYE
SAW      MACHINE
bSTONE   SU-ZAKU

SAW      ASHURA
SAW      GEN-BU2
bSTONE   SEI-RYU2
bSTONE   BYAK-KO2
bSTONE   SU-ZAKU2
SAW      CREATOR
I'm hoping for more input from Bobo the King right now, but I'll keep thinking more about my plans and see if I can't shave off a few battles (and hope that anything less than 99 Mana doesn't cripple my instant deaths). As for SAW, I plan to recruit a MUTANT M who starts with 54 Strength, which should save on many battles for Strength. I will ignore Agility gains.
Player (80)
Joined: 8/5/2007
Posts: 865
Sweet mother of mercy! My ISP is really flaky, so I haven't been able to access tasvideos for the better part of the past week (I was able to access other sites, though). Hopefully I'm back for the foreseeable future, but I'm writing this mini-post so you know what's up just in case it conks out again. Expect updates... eventually...
1 2 3 4
8 9