0007b720 is the adress of a pointer. it's 4 bytes and in hexadecimal. When you start the game its value should be 8007b724.
Then from 7b724 to 7b92f it's a table containing 523 numbers that will be used for the random purpose.
When the game needs a random number it will look at 7b720 and will go to the adress corresponding to that value.
For exemple if the value of 7b720 is 8007b724, the game will use the numbers stored at 7b724 , 7b725 , 7b726 , 7b727 as random numbers. If 7b720 is 8007b7d0 it will use 7b7d0 , 7b7d1 , 7b7d2 , 7b7d3, and so on...
The value of 7b720 increased by 1 every X frames. I'm not sure how exactly X is being calculated but during FMV, and when your in the menu X=0 and the RNG is freezed. In the world map X=1. As far as I can tell there is no way to make it moves faster or slower.
When 7b720 reaches the value 8007b92e its value is reset to 8007b724 and all the numbers stored in the table are changed then the process described above restart.
So that's why the ATB has to be put on WAIT style, so you can delay the moment the ennemy is taking its action and make it use a different RN, where not in WAIT style no matter what you do it'll always make the same move.
Having the ATB on wait makes sense for manipulating enemy commands. When I was testing this last year I tried stealing on every frame for 10 seconds and never got the correct item. It didn't seem to matter what the pointers address value was. I'm curious how anyone was able to steal the mage masher at all. I think about 100 people have done a test run of the first battle.
When you press X to choose the target of your steal attempt, the game will wait 73 frames then it will look at a random number to choose what object you will steal.
If this number is 0 you steal the very rare item.
If this number is between 0 and 15 you'll steal the rare item
If this number is between 0 and 63 you'll steal the normal item
Otherwise you'll steal the common one.
The pointer at 7b720 gives you a 4 bytes adress on the table of random numbers.
The 3rd byte of this adress is the number used for the stolen object.
Let's take an exemple.
I want to steal the Mage Masher. It's a rare item so I'll need the random number to be between 0 and 15 (0 can be included since the Masked Man doesn't have a very rare item).
Now I'll look at 7b720 to see where the pointer is on the table. Let's say it gives me 8007b866.
So I go to Memory Search and go down to 7b866 and start to browse the table to find what next random number is between 0 and 15.
I find 5 at the adress 7b871.
Since I need this adress to be the third byte of the adress pointed by 7b720, I now know that I'll need the value 8007b86f (7b871 - 0x2) in 7b720 to steal the Mage Masher.
Also remember that you'll need this value 73 frames after you've pressed X to choose the target of your steal attempt.
To summarize :
Find the next number in the table that is between 0 and 15.
Substract 0x2 to its adress and you got the value you'll need in 7b720,4h
Go back to your game and find on which frame 7b720,4h will have that value using Memory Watch.
Substract 73 frames and you got the first frame where you can press X to choose the target of your steal attempt and steal the Mage Masher.
Finally, I've tried to be the more clear possible but my english isn't very good so excuse me if I wasn't.
I've never done this ram watching or searching before and after messing around with it I understand enough to do what you explained. I guess the 2nd thing to learn is how random battles work.
If I understand this correctly you (Lil_Gecko) quit because the world map displays models as white and Zanoab quit because the manipulation took too long/didn't seem optimized.
All I have is time and I'm willing to help get this run somewhere.
Well it's not exactly that, it's just that I don't have enough knowledge of the game to know what strategy would be faster, what item I should pick to have the more powerful characters and so on. So yeah I could probably make a TAS of it, but it would be extremely far from optimized.
About random battles :
Every X frames (X depending on what place you are) the game will perform 2 checks
- Are you moving or not ? If not, obviously nothing happened and the game continues normally. If you are then a second check is performed.
- We have got 3 values here :
* Distance variable => it increases everytime you move and can be find at 7AE50 when you are on the world map and at 7AE4C everywhere else.
* Location variable => the probability of a random encounter on the place you are. It's located at 7954F
* Random number => As seen on the previous post. Still the 3rd byte that is being used for that purpose.
Now that we got those 3 values, here is the formula (thanks to o I O I 00 I O I o from gamefaqs for that) : if (Distance variable * Location variable)/8 > Random Number then you got a battle.
But honestly, as distance variable and random number will change constantly, it would be impossible to optimised the "avoid random battles" without a lua script doing it for you.
I quit the first time because I couldn't find the RNG. Now that I have them, lag is starting to become a random problem on PSXjin which has a bad effect on the RNG. I checked and 4 less lag frames than the original record doesn't mean I can do input 4 frames sooner (not even a single frame saved). I'm not sure what is going on but something is changing every time I replay my movie and the lag counter is the only thing that proved this besides the RNG.
I'm learning LUA right now and planning on gathering some interesting information with it. My current goal is to display the last set of values that were sampled during a single frame. If I can get the script to dump the set to a file along with the frame number, I can keep a complete history of RNG advancement to reduce rewinding (and maybe find out how lag frames influence the RNG and when my desync occurs).
With a little bit of dedication (and a love for programming), I got most of the script done.
http://pastebin.com/SCU8XgCR
Lua is almost as strange as Unix but I got it working. If anybody knows how to convert the ints to hex/byte form, I'm ready to learn more. Feel free to add more to it.
Also, I'm aware that I could remove the leading 0s in the addresses but I prefer full addresses so it is obviously an address.
EDIT This is my first time touching Lua and it is 239 AM so I think I did pretty good
I have to admit I'm kinda confuse with your desync problem. I don't know anything about emulators so I can't help with that but I've now tried for myself to play 2 differents movies on 3 differents computers over and over, and I always got the exact same lag frames and RNG, no desync at all.
Do you use the latest version of psxjin ?
Edit : I don't know anything about lua either but I hope that is going to help you solve your problem.
Also I've made a little test run up to the sword fight :
http://www.youtube.com/watch?v=c2Px_LUaivA
and the sound is sometimes really annoying. Is there any way to correct that even if it's just for the encode and not while playing ?
Eternal SPU is one of the best for quality. I think all it would do for a TAS is desync your encode. I was expecting it to sound like the reverb buffer was broken like the old SPU that came with epsxe. I've never heard the background noise present in your video before.
Strangely enough in my test run Zidane goes first in the masked man battle.
Joined: 11/22/2004
Posts: 1468
Location: Rotterdam, The Netherlands
Lil_Gecko, could you send me your movie file? I presume you're using the NTSC version (a CD-ROM version identifier would be nice)? I'd like to give this a try to see if I get the same result and if I can fix it. Also, I presume you're using PSXjin?
I must be really dumb. It took me 6400 frames (54 increases of the pointer) before a value fell into the 0-15 range. I did indeed steal the mage masher making me think I partially understand this. You guys seem to be doing it in 2 seconds max.
I have RAM watch on address 0007B720.
The value of that address (0007B720) at the start of my battle is 8007B857.
I open RAM Search. I check the "Greater than or equal to" option button. (to get the full table of numbers... I think)
Under "Specific address" I type 7B857.
My results show: Address (0007B857). Value (11).
.
.
My next (0-15) value isn't until Address (0007B88D). Value (0).
Is this list static and created when I start a new game? Is my only option to find ways to increase the pointer faster?
EDIT: After watching your input file and staring at all kinds of memory viewers I realize I have no clue what I'm doing.
Actually you did everything right. You just had a different list of numbers than me, and your list was pretty bad for stealing the Mage Masher.
What numbers are going to be in the list is determined based on which frame you pressed "New Game". Just delaying the moment you pressed new game by one frame is gonna give you a whole new list of numbers which may result on a faster steal. If not try delaying by 2 frames and so on.
EDIT : I've redone the beginning using a 3 frames delay before selecting "New Game". The list of random numbers was WAY better. The first fight is now faster and better looking as the Masked Man only use his turn to kill Cinna. The second battle is also faster as Zidane can act right away and the ennemies still don't use magic. A few frames are also gain on the sword fight by having more left and right that are slightly faster. I think this one is good enough to start with.
http://www.megaupload.com/?d=BCH9TXFY
Joined: 11/22/2004
Posts: 1468
Location: Rotterdam, The Netherlands
That must be incredibly tedious. That's actually the same thing I went through when I made a brief test of FF3j for NES, for every single battle. I can't imagine how much time pirohiko must have spent to get his battles right when he made the full run.
I just wrote a lua program that let me know how to make critical hits and here's what I got.
If Spirit is between........................................Random Number needed in the 4th byte
18-23.............................................................No critical hit possible
24-27.............................................................079 086 093 100 193 200
28-31.............................................................086 093 100 165 172 179 186 193 200
32-35.............................................................079 086 093 100
36-39.............................................................079 086 093 100 151 158 165 172 179 186 193 200
40-43.............................................................No critical hit possible
44-47.............................................................065 079 086 093 100 151 172 186 193 200
48-50.............................................................079 086 093 100 151 158 165 172 179 186 193 200
So my question is where would be the earliest place I can find something to boost the spirit of my characters ?
Thanks. The Leather Wrist is gonna be enough for Zidane to make critical hits as shown right away in the Baku fight.
So here it goes : up to World Map.
http://www.megaupload.com/?d=EL4NEXQF
Ideas for the next parts ? Things I've missed I should have take ?
Desync around frame 44000-46000 :(
Dialog box
King Leo: "Thou hast not seen the last of me, Marcus!"
is skipped a few frames too early and its the last thing I see.
The battle commands before the desync seemed to be frame precise.
Edit: I have tried a few more times and it desyncs every time I watch it. I hope the next 130k frames can be salvaged....
I've had problems when I tried to make movies of this game, too. Every once in a while, it seems you have to watch from the beginning (don't fast forward) and make a savestate while playing the movie to continue properly.