|
Post by UrQuan on Feb 25, 2014 8:18:31 GMT
First, I prefer Kaze, as Kami is a bit closer to megalomaniac, which I try to avoid. ;-) Second, this isn't the first time I've had to defend my dumb luck- the Final Fantasy boards took offense to my Lowest Level Possible run (four Level 8 White Magi). I tried playing the lottery after that run, but am sorry to report my annual income has only been around $17k, consisting of 40 hour weeks LOL Anyways, the math involving the probabilities during that run reached the astronomical considering all the different factors that went into each dungeon and encounter (least of which was beating Chaos with one party member surviving with 1 HP after surviving a couple NUKEs). Chatting with a couple people who dissected the RNG code helped alleviate the tension, though it still didn't dismiss the fact I had lucked out. That's mostly due to the fact that I still don't understand how the RNG actually operates on that game. Aside from the encounter manipulation and battle strategy, I have no idea how I pulled it off besides luck. With Lone Wolf, there are quite a few more factors under my control. Taking the paths with the fewest or most opportune combats, minimizing damage, meta-game strategies (left the Swerd at home in Book 10), etc. Granted, with the 5/15, I made a few mistakes (especially later on), but my familiarity with the books paid off. Honestly, no CS boosting abilities is the best way to avoid as much combat as possible. Healing, on the other hand, would've come in handy (especially in finding more potions/herbs). That's about where my actual control ends. Most combats, I abused the fact that two-handed weapons conferred no EP loss in the first round, switching to a one-handed weapon for the other bonuses in the second round. Aside from that, once again, dumb luck was my ally. The RNT offers better than true odds at racking up some zeroes in some books, worse in others. I left the number-picking animations on because of this. But that still doesn't change the fact it was luck. I often wish my real-life luck was as good as it is when playing games, but at least my in-game luck gives me something to fantasize about as a break from the daily grind. Your path does not take the fewest combats (not even close). You did not minimize damage. Skipping CS-boosting Disciplines might be the best way to avoid combats, yes. But wouldn't it be more effective if you then took some Disciplines that actually avoided combats (Sixth Sense), instead of two completely useless ones? (Tracking, Mindshield) Of course, skipping CS-boosting Disciplines most certainly does NOT help with the combats that you cannot avoid, which there happens to be quite a few of. Including several impossible ones. Okay, is this some sort of joke? Why does everyone keep talking about the two-handed rule? Most peculiar. Leaving the number-picking animation on does nothing. Even though I'm going at you like this I can say I appreciate that you posted here. I don't want to belittle you, I just want your run to be discredited. Interestingly, I might be able to provide actual proof soon, mostly thanks to Seventh Sense somewhat flawed RNG (very small range of possible seeds). As I explained in my previous post the idea is to get all relevant sequences (let's say seeds 3000-5000 to begin with) from the RNG and match them with the Lone Wolf RNT's for specific books. This would very clearly show if the sequence of rolls from Kamikaze's run exists at all. My programming skills have really run out at this point but I have asked other people for help.
|
|
|
Post by saladdays on Feb 25, 2014 15:35:46 GMT
Second, this isn't the first time I've had to defend my dumb luck- the Final Fantasy boards took offense to my Lowest Level Possible run (four Level 8 White Magi). I tried playing the lottery after that run, but am sorry to report my annual income has only been around $17k, consisting of 40 hour weeks LOL Anyways, the math involving the probabilities during that run reached the astronomical considering all the different factors that went into each dungeon and encounter (least of which was beating Chaos with one party member surviving with 1 HP after surviving a couple NUKEs). Chatting with a couple people who dissected the RNG code helped alleviate the tension, though it still didn't dismiss the fact I had lucked out. That's mostly due to the fact that I still don't understand how the RNG actually operates on that game. Aside from the encounter manipulation and battle strategy, I have no idea how I pulled it off besides luck. This is obviously off topic, but was this the original Final Fantasy or a remake?
|
|
|
Post by kamikaze1900666 on Feb 25, 2014 23:30:08 GMT
Your path does not take the fewest combats (not even close). You did not minimize damage. Skipping CS-boosting Disciplines might be the best way to avoid combats, yes. But wouldn't it be more effective if you then took some Disciplines that actually avoided combats (Sixth Sense), instead of two completely useless ones? (Tracking, Mindshield) Of course, skipping CS-boosting Disciplines most certainly does NOT help with the combats that you cannot avoid, which there happens to be quite a few of. Including several impossible ones. Okay, is this some sort of joke? Why does everyone keep talking about the two-handed rule? Most peculiar. Leaving the number-picking animation on does nothing. Even though I'm going at you like this I can say I appreciate that you posted here. I don't want to belittle you, I just want your run to be discredited. Interestingly, I might be able to provide actual proof soon, mostly thanks to Seventh Sense somewhat flawed RNG (very small range of possible seeds). As I explained in my previous post the idea is to get all relevant sequences (let's say seeds 3000-5000 to begin with) from the RNG and match them with the Lone Wolf RNT's for specific books. This would very clearly show if the sequence of rolls from Kamikaze's run exists at all. My programming skills have really run out at this point but I have asked other people for help. Going without Sixth Sense was part of the challenge, and also why I expected to die much earlier than I did. I wasn't really trying to make it a serious attempt, just go until I died as a pet project I continued off-and-on. So it may help your research to know I stopped mid-book sometimes, picking up where I left off anywhere from a couple hours later to the next day. That's assuming the time and date play a role in the RNG. As I said before, I made some mistakes. As this run was started just to humor me, I really didn't take it seriously until I made it to Book 12. Even then, there was some sloppy play. I do remember making a few decisions as if I had Sixth Sense/Divination (I almost always choose it when I do Hardcore runs), only to slap myself in the head for my own stupidity LOL I didn't know Seventh Sense still picked the numbers as if it was using the RNT without the animation being on. That'll speed up things a tad on future playthroughs. The two-handed rule saved me a few times on a lot of runs (rolling a 1 or 2 in the first round with the ratio well below -12), so it was a bit of a security blanket. Both of these could be placed under the umbrella of a gambler's fallacy, as "lucky charms" don't do more than the placebo effect will let them. This is obviously off topic, but was this the original Final Fantasy or a remake? I could ask "which remake?" but it was the original NES version (the only version where Level 8 is possible however improbable, Level 9 is the lowest on Origins, and Level 16 is the lowest on other ports). Here's the playlist: www.youtube.com/playlist?list=PLCD4853244EC01369I've got a few others up of my Level 9 runs too. If you're up for the challenge, there's a faq about how to manipulate random encounters on the NES version (although some of its battle strategy is flawed). Though I do advise trying a Level 9 run- you can at least have a decent party AND complete the class change quest for that. Four White Magi without any class change benefits is brutal. Yeah, you can see where defending dumb luck can be a problem with that many improbabilities: a couple characters got almost all random stat boosts each level-up, escaping most normal combats with minimal damage, successful saves in quick succession, etc. It would be easier to defend if I knew how my actions affected the RNG while I was doing it, but luck is the only descriptor I have.
|
|
|
Post by saladdays on Feb 26, 2014 18:32:14 GMT
I could ask "which remake?" but it was the original NES version (the only version where Level 8 is possible however improbable, Level 9 is the lowest on Origins, and Level 16 is the lowest on other ports). Here's the playlist: www.youtube.com/playlist?list=PLCD4853244EC01369I've got a few others up of my Level 9 runs too. If you're up for the challenge, there's a faq about how to manipulate random encounters on the NES version (although some of its battle strategy is flawed). Though I do advise trying a Level 9 run- you can at least have a decent party AND complete the class change quest for that. Four White Magi without any class change benefits is brutal. Yeah, you can see where defending dumb luck can be a problem with that many improbabilities: a couple characters got almost all random stat boosts each level-up, escaping most normal combats with minimal damage, successful saves in quick succession, etc. It would be easier to defend if I knew how my actions affected the RNG while I was doing it, but luck is the only descriptor I have. I will have to take a look at it.
|
|
|
Post by UrQuan on Feb 28, 2014 4:02:05 GMT
I have acquired the seed checker program! It's working great. Many thanks to hemulen, who did almost all of the work. Really incredible job!
First of all, layman's explanation of RNG's in case any of you are confused about the discussion in this thread:
A computer is a purely logical machine, so it needs some source of randomness to make a Random Number Generator work (a seed). The constantly changing system time is a common seed. The seed is run through some algorithms and you get a sequence of "random" numbers from that. There is a relatively small (65536 for a 16-bit RNG) amount of possible sequences (compared to the almost infinite amount of theoretically possible ones).
When you start Seventh Sense the RNG is seeded with a specific seed which results in a specific sequence of numbers, and for every roll (combat or otherwise) the rand() function is called twice, which results in a specific number from the RNT (X= 0-9, Y= 0-9 and the corresponding number is picked from the RNT). Among other things this means that if you die to the last bolt-thrower instadeath in book 14, after a no-death 1-14 run (this happened to me) you were really doomed from the very beginning at the Kai Monastery! (maybe not if you would have taken a different path) If it's any remedy (it's not) you can chalk it up as destiny.
Anyway, it's then of course possible to check if a specific sequence of numbers exists in a specific sequence, or in any possible one. I checked a couple of resume files I found in the 1.13 Bug Report thread: (both sequences are from the CM fight)
jdubs1211: Sequence: 1666266640 Seed: Somewhere between 4100-4200 Result: Found! (about 300 numbers into the sequence)
Honza: Sequence: 3626248 Seed: Somewhere between 4300-4400 Result: Found! (about 150 numbers into the sequence)
Good job, you guys did not cheat! 
As you can see the range of possible seeds even between different computers is very small. I get 37xx almost every time, so across different computers the total range is maybe 3500-4500, and for any specific computer there should be less than a hundred possible seeds. However, it turns out that this was not really relevant since I was easily able to check thousands of numbers from tens of thousands of sequences.I checked the sequences from all of the longer fights in book 11 from Kamikaze's run. The sequences from the CM and Villains fights do not exist at all, let alone in the relevant range (seeds 3500-4500).All of you who asked for evidence, there it is. Finally.
If you really wanted to hammer more nails into the coffin you could enter RNT's for other books and show that those sequences don't exist either (for example the Altan fight), but there is no point really. However, a version of this program with all of the RNT's would be useful for future cheating detection of incredible runs.
And here is the program and source code so that you may check all of this for yourself: (only the book 11 RNT available at this point)Phone Wolf.exe (23 KB) #include <iostream> #include <sstream> #include <string> #include <iomanip> #include <locale> using namespace std;
int main() { int **bok11;
// Allocate memory bok11 = new int*[10]; for (int i = 0; i < 10; ++i) bok11[i] = new int[10];
bok11[0][0] = 4; bok11[1][0] = 0; bok11[2][0] = 9; bok11[3][0] = 7; bok11[4][0] = 5; bok11[5][0] = 8; bok11[6][0] = 2; bok11[7][0] = 6; bok11[8][0] = 8; bok11[9][0] = 6; bok11[0][1] = 6; bok11[1][1] = 5; bok11[2][1] = 6; bok11[3][1] = 0; bok11[4][1] = 2; bok11[5][1] = 3; bok11[6][1] = 0; bok11[7][1] = 8; bok11[8][1] = 4; bok11[9][1] = 6; bok11[0][2] = 0; bok11[1][2] = 4; bok11[2][2] = 7; bok11[3][2] = 4; bok11[4][2] = 5; bok11[5][2] = 8; bok11[6][2] = 0; bok11[7][2] = 2; bok11[8][2] = 7; bok11[9][2] = 3; bok11[0][3] = 8; bok11[1][3] = 2; bok11[2][3] = 6; bok11[3][3] = 5; bok11[4][3] = 4; bok11[5][3] = 3; bok11[6][3] = 8; bok11[7][3] = 6; bok11[8][3] = 5; bok11[9][3] = 8; bok11[0][4] = 3; bok11[1][4] = 8; bok11[2][4] = 2; bok11[3][4] = 9; bok11[4][4] = 5; bok11[5][4] = 0; bok11[6][4] = 8; bok11[7][4] = 4; bok11[8][4] = 6; bok11[9][4] = 1; bok11[0][5] = 7; bok11[1][5] = 9; bok11[2][5] = 8; bok11[3][5] = 2; bok11[4][5] = 8; bok11[5][5] = 4; bok11[6][5] = 0; bok11[7][5] = 4; bok11[8][5] = 8; bok11[9][5] = 7; bok11[0][6] = 1; bok11[1][6] = 3; bok11[2][6] = 5; bok11[3][6] = 6; bok11[4][6] = 9; bok11[5][6] = 7; bok11[6][6] = 6; bok11[7][6] = 3; bok11[8][6] = 6; bok11[9][6] = 9; bok11[0][7] = 5; bok11[1][7] = 1; bok11[2][7] = 7; bok11[3][7] = 9; bok11[4][7] = 4; bok11[5][7] = 5; bok11[6][7] = 8; bok11[7][7] = 9; bok11[8][7] = 3; bok11[9][7] = 8; bok11[0][8] = 1; bok11[1][8] = 6; bok11[2][8] = 8; bok11[3][8] = 2; bok11[4][8] = 6; bok11[5][8] = 2; bok11[6][8] = 7; bok11[7][8] = 0; bok11[8][8] = 4; bok11[9][8] = 6; bok11[0][9] = 0; bok11[1][9] = 1; bok11[2][9] = 6; bok11[3][9] = 9; bok11[4][9] = 5; bok11[5][9] = 4; bok11[6][9] = 8; bok11[7][9] = 2; bok11[8][9] = 4; bok11[9][9] = 2;
int rx; int ry; int result; string text;
int minSeed; int maxSeed; string temp; cout << "Lone Wolf Cheat Detection.. Checks a range of random seeds for specific strings. So far only book11.\n"; cout << "Random Seed: lowest value: "; getline(cin, temp); minSeed = atoi(temp.c_str()); cout << "Random Seed: highest value: "; getline(cin, temp); //string to int conversion maxSeed = atoi(temp.c_str()); cout << "Generate how many random numbers / seed? "; getline(cin, temp); int rndRange = atoi(temp.c_str()); string lookForThis; cout << "Look for which string of numbers? (ex: '20788909000049'): "; getline(cin, lookForThis);
for (int j = minSeed; j <= maxSeed; ++j){ srand(j); text = ""; //rx = rand() % 10; for (int i = 0; i < rndRange; ++i){ rx = rand() % 10; ry = rand() % 10; result = bok11[rx][ry]; // convert int to string text += static_cast<ostringstream*>(&(ostringstream() << result))->str(); } if (text.find(lookForThis) != std::string::npos) { std::cout << "\n\n\nString found!!!!\n\n"; cout << text << "\n\nSeed: " << j << " "; } } // And now, let's do it one more time, just be be safe, but starting the pairs (x,y) with the second number instead.
for (int j = minSeed; j <= maxSeed; ++j){ srand(j); text = ""; //taking away the first number rx = rand() % 10; for (int i = 0; i < rndRange; ++i){ rx = rand() % 10; ry = rand() % 10; result = bok11[rx][ry]; // convert int to string text += static_cast<ostringstream*>(&(ostringstream() << result))->str(); } if (text.find(lookForThis) != std::string::npos) { std::cout << "\n\n\nString found!!!!\n\n"; cout << text << "\n\nSeed: " << j << " "; } }
//cout << text; system("pause");
}
|
|
|
Post by saladdays on Feb 28, 2014 5:32:22 GMT
|
|
|
Post by Dave on Feb 28, 2014 5:53:08 GMT
That sounds like an interesting program. How many seeds did you check? I think it's critical to check well into the 10000s, in case a slow computer or slow disk access make the program take longer to initialize than the "average".
I think one thing is clear - I need to improve the seeding of the RNG!
|
|
|
Post by hemulen on Feb 28, 2014 8:32:43 GMT
I just enter the random number table of book5 into the program, and tried with seed from 1-20000 and a sequence of 200 numbers. I did find my own run (seed 5684), checking against crypt spawn + haakon fights, but nothing from Kamikaze (elix or haakon) so far.
The last time I programmed c++ was some 15+ years ago in school so the code is a bit of a mess as I did it in an evening, but it seems to work.
|
|
|
Post by hemulen on Feb 28, 2014 10:12:05 GMT
Ok, So I did find matching seeds from book 5 for individual fights (no complete matching sequence though) when using seeds in the range of 30000-50000. But nothing from book 11, even using seeds in the range of 1-50000 and a sequence of 2000 numbers. The book 5 combat sequences are still much shorter than 11 so it could be just chance. And I'm not sure if you can get seeds that large.
|
|
|
Post by Dave on Feb 28, 2014 15:43:46 GMT
Of course, we must allow for the option of someone not doing an entire run in one sitting. If they quit mid-book and resume later, it will, of course, have a different seed. It's even possible to quit mid-combat, and resume later, thereby using a different seed...
Perhaps I ought to store the seed(an improved one) in the resumeX file for any given campaign, a seed which is reset upon starting a new campaign? and then track how many times the RNG is accessed in a given game, and upon loading mid-game, reseed with that particular seed, and progress the RNG manually by the number of times it was used in the last game? That would allow for greater consistency in Random Number generation in general, I think. And would allow an extra measure of anti-cheat checking, as I could incorporate hemulen's code into the routines for Hall of Fame validation, to check that all of the RNG sequences were indeed part of the run.
So, because we don't have that info (actual seed), the largest chunk of numbers we should check for would be a single combat sequence, not an entire book (after all, if one is searching for multiple combats combined together, that would ignore any in-between RNT access, like bow shots, insta-death avoidance sections, and the like.)
---------------
Also, just to double check - is the sequence of numbers generated by a specific seed at all hardware specific or affected by OS/hardware? Would results be consistent across 32 and 64 bit CPUs, Windows/MacOS/Linux? If that could be confirmed, then it would be worth the work to incorporate the above into my program code, but if those factors would change the result, it would not be worth adding in.
|
|
|
Post by UrQuan on Mar 1, 2014 2:35:39 GMT
That sounds like an interesting program. How many seeds did you check? I think it's critical to check well into the 10000s, in case a slow computer or slow disk access make the program take longer to initialize than the "average". I think one thing is clear - I need to improve the seeding of the RNG! CM and Villains are both checked for over 60000 seeds and 10000 numbers per seed.
|
|
|
Post by UrQuan on Mar 1, 2014 2:35:51 GMT
Of course, we must allow for the option of someone not doing an entire run in one sitting. If they quit mid-book and resume later, it will, of course, have a different seed. It's even possible to quit mid-combat, and resume later, thereby using a different seed... Perhaps I ought to store the seed(an improved one) in the resumeX file for any given campaign, a seed which is reset upon starting a new campaign? and then track how many times the RNG is accessed in a given game, and upon loading mid-game, reseed with that particular seed, and progress the RNG manually by the number of times it was used in the last game? That would allow for greater consistency in Random Number generation in general, I think. And would allow an extra measure of anti-cheat checking, as I could incorporate hemulen's code into the routines for Hall of Fame validation, to check that all of the RNG sequences were indeed part of the run. So, because we don't have that info (actual seed), the largest chunk of numbers we should check for would be a single combat sequence, not an entire book (after all, if one is searching for multiple combats combined together, that would ignore any in-between RNT access, like bow shots, insta-death avoidance sections, and the like.) --------------- Also, just to double check - is the sequence of numbers generated by a specific seed at all hardware specific or affected by OS/hardware? Would results be consistent across 32 and 64 bit CPUs, Windows/MacOS/Linux? If that could be confirmed, then it would be worth the work to incorporate the above into my program code, but if those factors would change the result, it would not be worth adding in. No one quits mid-combat though, and no one in the world quits in the middle of/in between every combat in a run. None of the combats/series of combats from Kamikaze's run exist in the range that I checked so far (3000-6000), and the CM and Villains fight sequences do not exist at all, anywhere. You could say that those two were due to mid-combat restarts, but I hope no one will argue that he restart over 10 times per book (and specifically mid-combat every time). Well, maybe that is exactly what he did if he used the more manual cheating method that I PM'd you about. Either way, the vast majority of sequences from combats need to exist, otherwise a run is most certainly fake. It would be most convenient for cheating detection if the RNG is reseeded on a campaign restart, yes (currently its good that it doesn't do that though with the narrow range of seeds), since then you have to check only the first few hundred numbers and can easily check all seeds by brute force. Storing the seed in the resume file seems like a good idea, but if it's too much work to implement all that stuff then it's still very useful just to be able to manually check a particularly incredible run, which can be done even without knowing the seed (also I updated the code in my earlier post with a version that gives you the seed of the sequence that it finds). In most cases you can check a series of several combats though. It's not hardware specific. It should only be dependent on the libraries used.
|
|
|
Post by kamikaze1900666 on Mar 1, 2014 11:21:58 GMT
If quitting mid-combat is to be considered cheating, then take the run down. I only did it a couple times due to unexpectedly busy days, but I can see where this may lead to problems. Though I do think the cheat-checks should be limited to single combats, as things do arise (especially with shared computers that have low resources).
|
|
|
Post by UrQuan on Mar 1, 2014 13:51:46 GMT
If quitting mid-combat is to be considered cheating, then take the run down. I only did it a couple times due to unexpectedly busy days, but I can see where this may lead to problems. Though I do think the cheat-checks should be limited to single combats, as things do arise (especially with shared computers that have low resources). I'm sorry but you are not going to guilt trip me. Where those "couple" of times exactly the CM and Villains fight? In that case why doesn't Altan, Kraagenskul and Mind Reaper exist either? Again, hopefully you won't argue that you not only restarted mid-combat in every longer fight (Altan, CM, Villains, Kraagenskul, Mind Reaper), but also between every other combat in the rest of the run. Of course, if there was a mid-combat restart in the CM fight for example, then the sequences for the Giant Guakor Lizard and Shadow Reavers fight need to be right at the beginning of a seed. I again checked over 60000 seeds and they don't exist. (there is one for Giant Guakor Lizard at the beginning of seed 53775, but probably your client doesn't take 50 seconds to start) Similarly, as hemulen said, the Elix and Dhorgaan fight sequences will exist somewhere (as they are only 7/8 numbers long), but not on the same seed so there would have to have been a restart here too, and checking the Dhorgaan fight sequence for only the first 50 numbers it also does not exist. We have to look at series of combats though as most 8-number sequences and lower will exist somewhere. Of course looking at only a smaller range of seeds you can look at most single combats (and see that they don't exist), but I thought people would jump on me if I only did that. It should be completely impossible to get seeds in the 10000 range though. For future cheating detection hopefully none of this will be a concern.
|
|
|
Post by UrQuan on Mar 1, 2014 14:48:49 GMT
 Very layman's version: The "random" rolls in Seventh Sense are in fact part of certain predetermined sequences of numbers. There is a limited amount of these available (currently a little bit too limited in Seventh Sense due to... stuff). You can check if a sequence of rolls (for example from a combat) exists within any of these sequence. Again due to stuff, only about 3000 different sequences are really used in Seventh Sense, and for any specific computer there is less than a hundred possible. Not great but this will be fixed in the future. Anyway if a sequence of rolls does from the game does not match up with any of these available sequences the run is fake (unless the client was restarted which would result in a different sequence being used).
|
|