Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - Terence Fergusson

Pages: [1]
1
Little argument on the GameFAQs boards, and I don't have the tools to properly do this.  I need to know if there's any difference between Super Nova on the PC and PSX versions.  I have the PC data:
Code: [Select]
FF FF 02 FF 00 00 FF FF FF FF FF FF 05 8F 23 1E FF 08 FF FF C0 02 00 00 00 00 FF FF

You'll recognise Super Nova in the data by that '23 1E' part there.  Don't confuse it with the '23 1F' that follows a couple of lines down; that's for final Sephiroth's standard attack.  All this should be found after the standard enemy data for Safer*Sephiroth and final Sephiroth.

If you or someone else with the data could answer this, I'd be grateful.

Thanks.

 ===

Edit: Actually, that might be a job for someone: collect all the possible Scene.bins for all versions of FF7, and see which (if any) enemies have differences.  Most differences would be expected: names of attacks and enemies.  For the most part, these are in predefined locations that we can trap and ignore.  The only major problems would be the Japanese version differences and messages stored in AI scripts.

But if anyone wants to get on that, it'd be useful.  I hate having to say "This is how it works in this version, but I've no idea if it's the same in this other version".

2
Well, this has been my task for the last few days.

I've managed to work out enough about AI from the disassembled EXE and the actual AI data in the Scene.bin to get a handle on most parts of the AI and write a quick dumper to get hold of translated AI scripts.  I'm not going to post it since it's kinda shoddy and you really wouldn't learn much from it.

What I *will* talk about is the way AI is handled.  First, let's talk about the language type.  The AI Engine is a *stack-based* language, while still allowing opcodes and arguments.  While arguments are possible though, 90% of the commands expect variables on the stack and will use them, not the arguments.

Now, the opcodes themselves.  They're divided into categories:
  0x: Load Values from Address
  1x: Load Address
  3x: Operators
  4x: Comparison
  5x: Logical Operators
  6x: Load Constant
  7x: Jumps
  8x: Math Logic
  9x: Commands
  Ax: Dummy

These are then split down further.  Before we go over the opcodes, it's necessary to go over the stack...

============================================
  THE STACK
============================================
The Stack stores variables, and different opcodes will use these in different ways.  There are three types of variables:
  0x: 1-, 2- or 4-byte variables which take up a single DWord.
  1x: 2-byte variables specifying an address that will later be used.  Takes up a single DWord.
  2x: Multi-Word variables, taking up anywhere from 1 to 10 DWords.  These are used to contain the value of a single stat for *ALL* objects on the field at once.  For example, it might hold the current HP of all objects, so that we can decide who has the highest.

The 'x' part of the variable dictates how many bytes the variable was, and can be anywhere from 1 to 3 (byte, word or dword).  If it's equal to 0, then that means it was a 'bit'.

When a variable is pushed onto the stack, the values go first, followed by the variable *type* as explained above.

Now, let's look over the opcodes, which will help us explain these better.


============================================
  0x: LOAD VALUES
============================================

  0x: Argument of 2 bytes, "PushAddr wr:addr"
        () -- (xx)

This opcode is designed to look up an address and then push its contents onto the stack.  The address must first be translated though:

   0x0000 - 0x1FFF: Section start = 009CB9C+ID*0x80
   0x2000 - 0x3FFF: Section start = 009C750
   0x4000 - 0xFFFF: Section start = 009C78C+ID*0x68
(You may recognise that last section as the Battle Player Block)

The address itself must also be translated.  The address after the first nibble (0-4, generally) can be expressed like so in binary:
                                  xxxx xxxx x:yyy
The 'x' part is the actual byte address.  The 'y' part is reserved for individual bits.  In other words, we must divide the address by 8 to get the real offset to add to the start of the section.

The low nibble of the command dictates the size of the value to return: 1-3 returns a number either byte, word or dword, while a value of 0 will utilise that 'y' part of the address to return an individual bit.

In addition to all this, any call to the Battle Player Block (0x4000+) will grab the specific value for *all* Objects in the battle.  This automatically makes the variable returned into a '2x'-type Var.

Once the values have been returned, they are pushed onto the stack as a '0x'-Var if the Address was between 0000 and 3FFF, and as a '2x'-Var if the Address was 4000 or above.


============================================
  1x: LOAD ADDRESS
============================================

  1x: Argument of 2 bytes, "PushWord wr:addr"
        () -- (xx)

Very simple: this pushes on a '1x'-type Var onto the stack using the next two bytes.  This is used to store the location of an address that will be used down the line for, say, storing a value.


============================================
  3x: OPERATORS
============================================

These series of opcodes take variables off the stack, apply an operator to their values, and then place a new combined variable back on the stack.

  30: No arguments, "Add"
 (xx yy) -- (zz)
    'z = x + y'

  31: No arguments, "Sub"
 (xx yy) -- (zz)
    'z = x - y'

  32: No arguments, "Mul"
 (xx yy) -- (zz)
    'z = x * y'

  33: No arguments, "Div"
 (xx yy) -- (zz)
    'z = x / y'

  34: No arguments, "Mod"
 (xx yy) -- (zz)
    'z = x MOD y'

  35: No arguments, "And"
 (xx yy) -- (zz)
    'z = x AND y'

  36: No arguments, "Orr"
 (xx yy) -- (zz)
    'z = x OR y'

  37: No arguments, "Not"
    (xx) -- (zz)
    'z = NOT x'

The Var 'z' is a '2x'-Var if either of the components are a '1x' or a '2x'-Var.  In that case, the Masks of both Vars are ANDed together.  In *all* cases, the highest variable size is used to determine the new variable's size.


============================================
  4x: COMPARISONS
============================================

Very similar to the last category, except that these are meant to compare two values.

  40: No arguments, "=="
 (xx yy) -- (zz)
    Returns 'x == y'

  41: No arguments, "!="
 (xx yy) -- (zz)
    Returns 'x != y'

  42: No arguments, ">="
 (xx yy) -- (zz)
    Returns 'x >= y'

  43: No arguments, "<="
 (xx yy) -- (zz)
    Returns 'x <= y'

  44: No arguments, ">"
 (xx yy) -- (zz)
    Returns 'x > y'

  45: No arguments, "<"
 (xx yy) -- (zz)
    Returns 'x < y'

The new Var 'z' will be an '00'-type Var if either component is a '1x' or a '2x' Var.  It will only have a single value: 1 or 0.

If both were '0x'-Vars though, the result will be an '02'-Var which contains the Mask of all the objects in the variables that passed the comparison (yes, I'm aware that objects are identified with '2x'-Vars, but this is precisely what it appears to do... it doesn't matter much in the end though, as you'll see....)


============================================
  5x: LOGICAL OPERATORS
============================================

Strictly speaking, these are really Non-Zero operators.  Instead of applying the operator to each bit in a value in turn, all they care about is if the value in the variable is zero or non-zero.

  50: No arguments, "LogAND"
 (xx yy) -- (zz)
    Returns 1 if both 'x' and 'y' are non-zero, 0 if either is zero.

  51: No arguments, "LogOR"
 (xx yy) -- (zz)
    Returns 1 if either 'x' or 'y' is non-zero, 0 if they're both zero.

  52: No arguments, "LogNOT"
    (xx) -- (zz)
    Returns 0 if 'x' is non-zero, 1 if 'x' is zero.

In all cases, the new Var 'z' will be an '00'-type Var.



============================================
  6x: CONSTANTS
============================================

These take arguments, depending on the opcode:

  60: Argument of 1 byte, "Push1Con by:constant"
        () -- (xx)

  61: Argument of 2 byte, "Push2Con wr:constant"
        () -- (xx)

  62: Argument of 3 bytes, "Push3Con 3by:constant"
        () -- (xx)

In each case, the new variable pushed onto the stack will either be a '01', '02' or '03'-type variable, with a single value equal to the constant defined by the arguments.


============================================
  7x: JUMPS
============================================

Now we start hitting the more difficult categories.  I'll go over each individual opcode one by one.

  70: Argument of 2 bytes, "!IfGoto wr:addr"
      (xx) -- ()
If the Var 'x' is zero, then jump to the specified location in the AI script.  A non-zero value will cause no jump to occur.


  71: Argument of 2 bytes, "!EqGoto wr:addr"
   (xx yy) -- (xx)
Although 'x' is checked, it is not popped from the stack.
The vars 'x' and 'y' are compared; if they are different, then we jump to the specified location in the AI script.  If either 'x' or 'y' were '2x'-type Vars, then we only look at the value of the *1st* Object defined by the Mask.


  72: Argument of 2 bytes, "Goto wr:addr"
        () -- ()
An unconditional goto to the selected address.


  73: No arguments, "END"
        () -- ()
Ends the AI script section.


74 and 75 are valid opcodes, but they are dummied out; both will pop a variable from the stack, however, and 75 will store the value of that Var as a byte into [008F4E3D].


============================================
  8x: MATH LOGIC
============================================

These opcodes are designed to aid battle logic.

  80: No arguments, "MaskSet"
   (xx yy) -- (zz)
Will update the Mask of Var 'y' by ANDing it with the value of 'x'.  The updated Var is then pushed back onto the stack.
Absolutely *NOTHING* happens (not even popping variables off) if 'y' is a '1x'-type Var.


  81: No arguments, "Random"
        () -- (xx)
Creates a random number between 0 and 65535.  This will be pushed onto the stack as the value of a new '02'-Var.


  82: No arguments, "PickRndBit"
      (xx) -- (zz)
'z' is a '02'-type Var, which takes the value of 'x' and picks one of the bits in the 0xFFFF region at random.  For example, a value of 0x0718 could result in a value of 0x0100, 0x0200, 0x0400, 0x0010 or 0x0008.  The formula used is "Rnd(0..255) Mod (Number of Bits Set)", and counting from the Least Significant Bit first.  This *does* mean that the lesser bits tend to have a slightly higher chance of being picked.


  83: No arguments, "CountBits"
      (xx) -- (zz)
The function of the opcode depends on the type of Var 'x' is.  For '0x' and '1x'-type Vars, 'z' is a '01' Var containing a single integer which is a count of how many bits in the 0x3FF region 'x' had turned on in its value.
If 'x' is a '2x'-type Var however, then 'z' is a '0x'-type Var containing the DWord in 'x' indicated by the first bit set in 'x''s Mask.


  84: No arguments, "GetHighMask"
      (xx) -- (zz)
A nice little function which expects a '2x'-type Var.  It will go through the values of 'x' and pick only the *equal highest* values indicated by 'x''s Mask.  The result is a new Mask that indicates which objects had the highest of that value.  This new Mask is the value of an '02'-Var which is pushed onto the stack as 'z'.


  85: No arguments, "GetLowMask"
      (xx) -- (zz)
Identical to the previous function, except that only the *equal lowest* values count.


  86: No arguments, "GetMPCost"
      (xx) -- (zz)
Will get the MP Cost of the ability refenced in Var 'x'.  The value of 'x' is referenced to the following areas:

  If Value >= 0xFFFF, return 0
  If Value <= 0x00FF, Addr = 00DAAC78 + Value*0x1C
  If Value >= 0x0100, match Value with wr[0099AAF4+(ID=[0..31])*2]
     First ID it matches, Addr = 0099A774 + ID*0x1C
  If no Addr is found, return 0
  Otherwise, return wr[Addr + 4]

The returned value is, thus, the cost of the defined ability.  Note that 0x00 to 0xFF are standard magic and always loaded, while 0x100+ are the unique abilities loaded through scene.bin.  The MP Cost is stored in an '02'-Var pushed onto the stack.


  87: No arguments, "ConvToBit"
      (xx) -- (zz)
This simply takes the value of 'x' (first DWord yadayada if it's a '2x'-type Var) and convert it to a bit.  For example, 0 converts to 0x000001, 2 converts to 0x000004, 7 converts to 0x000080.  The returned bit is used as the value of an '02'-type Var which is pushed onto the stack.


============================================
  9x: COMMANDS
============================================

Finally, where everything comes together.  But I'm not sure of the use of some of these... heh....

  90: No arguments, "SetAddr"
   (xx yy) -- ()
(zz xx yy) -- ()
This strange opcode has two formats, depending on what it's passed.  'x' is expected to be a '1x'-type Var, containing an address value.  If the Address is 0000-3FFF, then the first format is used, using the Object ID of the monster running the AI script.
If the Address is 4000 and above though, then the second format is used, where 'z' is an Address that points to the location of a Mask that should be used to dictate which Battle Objects will be updated by the command.
In either case, the Value 'y' will be stored in the Address 'x'.


  92: No arguments, "RunCmd"
   (xx yy) -- ()
One of the most important commands.  'y' contains the ID of the move being used, while 'x' contains... well, it's usually '0x20' for standard attacks, but sometimes it's '0x24' for... animations?  Unsure.  Maybe I'll find out more later.

  93: Variable arguments, "LoadString var:string"
       ??? -- ???
Loads a string into memory.  Possible displays it immediately too; unsure.  FF is the terminator, and EA-F1 means a 2-byte char follows.  Standard FF7 string rules.

91 is a dummy opcode that merely pops the topmost variable from the stack and does nothing with it.  However, it's actually used by a fair number of scripts, so perhaps a translation as "Pop" will do; maybe it's just there for cleanliness in keeping the stack down... though I'd suspect that FF7 resets the stack after every AI run.

94-96 are opcodes similar to 92, taking the top two variables from the stack and calling something with their values; however, I do not know what they do as of yet.  They have no arguments though.

And finally, A0 and A1 both appear to be dummy commands.  A1 pops the top two Vars from the Stack, doing nothing with them.  A0, however, is a confusing mess that looks like it *should* be doing something, but then does nothing with the data (that I can see).  In fact, let me cover it properly:

  A0: Variable arguments, "Unknown by:size var:data"
      (??) -- ()
The first byte after the opcode is the 'size', and is the number of variables that will be popped from the stack, eventually.  The data afterwards is... unknown, but is terminated when a '00' is found.  The 'size' is stored at EBP-0x168, a pointer to the start of the 'data' in the AI Script is stored at EBP-0x1B0, and the value of each Var popped from the stack are stored as DWords sequentially from EBP-0x1AC.  So, the maximum 'size' has to be 17 (0x11).
Only Ultimate Weapon and Safer*Sephiroth use this command, so it's kinda low priority at the moment.  The *data* passed as arguments, when looking at them, look similar to 'printf' statements... perhaps Debug strings?  Yes... makes sense.  It's stuff like saying how much Safer's stats have increased, or Ultimate Weapons' escapes and HP and the like.  Fun.  Ah well.

============================================

That's pretty much the entire AI script in a nutshell.  There's still lots to do; I need to nail down where some of these variables are stored, especially since FF7 is something being very annoying and using virtual addresses, making them hard to nail down.  Will get there in the end though...

Enjoy.

3
Scripting and Reverse Engineering / Scene.bin Revisited
« on: 2004-07-18 02:16:28 »
Thought I'd go back over this since... well... we *knew* the basic monster data before hand, but there's a lot more interesting stuff to the Scene.bin structure to be looked at.  Here's what I know.  (Note: this is not going to go over Scene.bin *itself*, but rather the 256 files it holds, each of which relate to certain groups of monsters....)

First, battle numbers.  We have 1024 possible battle numbers: 0 - 1023.  Each group of *4* Battle Numbers refers to a particular Scene file: for instance, Battles 0-3 refer to File 0 in Scene.bin, Battles 4-7 refer to File 1 in Scene.bin, and so forth.

Now, here's the basic structure of the individual files that are compressed and contained within Scene.bin:
Code: [Select]
0x0000: Enemy IDs (2 bytes each, 3 records)
0x0006: FF Padding (2 bytes)
0x0008: Battle Setup 1 (20 bytes each, 4 records)
0x0058: Battle Setup 2 (48 bytes each, 4 records)
0x0118: Battle Formation (16 bytes each, 4 sets of 6 records)
0x0298: Enemy Data (184 bytes each, 3 records)
0x04C0: Attack Data (28 bytes each, 32 records)
0x0840: Attack IDs (2 bytes each, 32 records)
0x0880: Attack Names (32 bytes each, 32 records)
0x0C80: FF Padding (512 bytes)
0x0E80: Enemy AI Offsets (2 bytes each, 3 records)
0x0E86: Unknown (26 bytes)
0x0EA0: Beginning of AI Data, starts with 6 bytes of FF
0x1E7F: End of Scene.bin

And... that's pretty much it.  So far, I know that Battle Setup 1 includes information for multiple battles; 0x08-0x0F is a group of four words that say which possible four battles will occur *after* defeating the current battle (note: it may be that there's more information here that prevents sequential battles from happening unless the battle engine is assigned to a particular mode, since sequential battles are mainly used for Battle Arena).  The battle ID 999 (0x3E7) is generally used as padding, and should never be called... though I'm not sure whether that's hard coding or a different bit set in Battle Setup.  The next battle is picked randomly out of the four IDs given, anyhow.

Most of the rest is self-explanatory or I haven't looked deep enough into.  Have fun!

4
...ugh.  That was more code heavy than I expected.  However, determination won out, and I've completed a draft document.  Unfortunately, it's (1) big and (2) table heavy, so I'm going to have to use those wonderful Code tags.

The document's *33KB* on my harddrive, and has all three parts of the Chocobo Ranch enclosed (Catching, Feeding, Mating).

Before you start reading and stuff, I'd like to ask for a little help: there's a stat that I've decided to call RunType for now (it'll likely be called Personality in later versions though).  Now, it has three possible values: 0, 1 or 2.  I've noticed that RunType 2 chocobos look like they're forever dashing on the setup screen when you play Chocobo Racing.  However, RunType 2 chocobos are *rarer* with the better Ratings (only a 1/16 chance to get a RunType 2 Wonderful Chocobo).  In addition, there's a Green that allows you to *remove* RunType 1 and 2 and replace it with 0 after enough feeding (and if you feed it enough to cause that, you'll get a fanfare and Billy will say that "their personality's improved!").  So... I'm assuming that RunType 1/2 are *BAD*.

But... I don't know what they do.  I've watched the effects of Intelligence and Co-Operation first hand in Chocobo Racing... but RunType doesn't *seem* to affect anything that noticable.  Maybe Intelligence overwrites it on auto... but... eh.  I dunno.

If anyone wants to solve this puzzle, be my guest.

Anyhow, on to the data....

Code: [Select]
=============================================================================
                          S T A T   G L O S S A R Y
=============================================================================

First, let's define the stats a Chocobo has:
  Dash:      The Chocobo's current sprinting speed
  Max Dash:  The maximum sprinting speed this Chocobo will ever aspire to
  Run:       The Chocobo's normal running speed
  Max Run:   The maximum running speed this Chocobo will ever aspire to
  Stamina:   The Chocobo's stamina, maxes at 9999
  Accel:     The Chocobo's acceleration
  Co-Op:     The Chocobo's co-operation (How well it obeys Manual Control)
  Int:       The Chocobo's intelligence (How well it uses Auto Control)
  RunType:   The Chocobo's running type (0:Normal to 2:Sprinter)
                                           Normal is better?
  RT Count:  A counter connected to RunType regarding feeding
  Races Won: The number of races the Chocobo has won
  Gender:    The gender of the Chocobo
  Color:     The color of the Chocobo
  Rating:    How *good* the Chocobo is.  1 is the best(Wonderful!), 8 is
               the worst
 

  [   Dash / 34] is the Speed that Chocobo Racing will report
  [Stamina / 10] is the Stamina that Chocobo Racing will report



=============================================================================
                          B A S E   C H O C O B O S
=============================================================================

When you catch a Chocobo, it is placed in the yard.  The *only* stat stored
for it is the Rating: Wonderful, Great, Good, etc.  The stats are not decided
until you confirm with Billy that you'll move them into the stable.

The Ratings we will call them by are: Wonderful, Great, Good, So-So, Average,
  Poor, Bad, Terrible

Naturally, all Chocobos caught will be Yellow Chocobos with the Rating they
  were given when you caught them.  As for the rest of the stats, they are
  covered in the following sections:


=============================================================================
 Max Dash and Stamina
======================
For each Rating, the base value of Max Dash and Stamina can be each have up
  to 8 different values.  The values are linked: if you get a certain value
  for Max Dash, you will get the corresponding value for Stamina as well.
  Here's a table showing the 8 choices for each Rating:


                        1      2      3      4      5      6      7      8
Wonderful    MDash   3500   3600   3700   3800   3800   3900   4000   4000
             Stam    4500   4300   4200   4000   4000   4000   3800   3500

Great        MDash   3000   3000   3100   3200   3300   3400   3500   3600
             Stam    3800   3600   3500   3400   3300   3200   3200   3000

Good         MDash   2800   2800   3000   3000   3100   3100   3200   3300
             Stam    3500   3300   3200   3100   3000   2900   2800   2600

So-So        MDash   2400   2500   2600   2700   2800   3000   3000   3000
             Stam    3300   3100   3000   3000   2800   2700   2600   3000

Average      MDash   2000   2200   2300   2400   2600   2800   2500...2500
             Stam    2500   2300   2200   2100   1900   1800   2000...2000

Poor         MDash   1800   1900   2100   2200   2300   2000...2000...2000
             Stam    2000   1700   1500   1300   1000   1600...1600...1600

Bad          MDash   1500   1600   1700   1900   2000   1800...1800...1800
             Stam    1300   1200   1100    900    800   1000...1000...1000

Terrible     MDash   1300   1400   1600   1700   1800   1500...1500...1500
             Stam    1000    900    700    600    500    800....800....800



Once the base values for Max Dash and Stamina have been determined, they
  will be adjusted seperately:

               1/2 chance of being increased by Rnd(0..127)
               1/2 chance of being decreased by Rnd(0..127)



=============================================================================
 Dash
======
A lot simpler than the previous section, Dash is set to merely a percentage
  of the Max Stat.  The formula used depends on the Rating:

  Wonderful, Great, Good and So-So:
                   Dash = [Max Dash / 10] * Rnd(5..8)

  Average, Poor, Bad and Terrible:
                   Dash = [Max Dash / 10] * ([Rnd(0..255) / 50] + 3)



=============================================================================
 Run and Max Run
=================
These are again related, so we will deal with them together.

First, we must define a modifier we will be using.  It differs depending on
 the Rating of the Chocobo:

  Wonderful, Great, Good and So-So:    x = 100 * Rnd(2..4)
  Average, Poor, Bad and Terrible:     x = 100 * Rnd(2..5)


Once this is defined, then:
                         Max Run = Max Dash - x
                             Run =     Dash - x

And that's the base stats done.



=============================================================================
 The Rest of the Stats
=======================
Let's go over the rest.

Co-Op, RT Count and Races Won are all set to 0, naturally.


Gender is randomly determined between Male and Female, 50/50 chance of
  either.


Acceleration and Intelligence are randomly determined multiples of 10, again
  based on the Rating:
                               Acceleration         Intelligence
    Wonderful/    Great:      10 * Rnd(6..7)       10 * Rnd(5..6)  
         Good/    So-So:      10 * Rnd(5..6)       10 * Rnd(3..4)
      Average/     Poor:      10 * Rnd(3..5)       10 * Rnd(0..2)
          Bad/ Terrible:      10 * Rnd(2..5)       10 * Rnd(0..2)


And finally, RunType is randomly determined.  First, you have a chance at
  RunType 0 - the Normal RunType - and this depends on the Rating again:

                                   Chance of RunType 0
    Wonderful/    Great:                    7/8
         Good/    So-So:                    3/4
      Average/     Poor:                    1/2
          Bad/ Terrible:                    1/2


If you don't get RunType 0, then you have a 50/50 chance each of RunTypes
  1 and 2.



And that's that!  The new Chocobo is created.  All that remains is to name
  it and put in the stable.  And then we can get to feeding it...



=============================================================================
                         F E E D I N G   G R E E N S
=============================================================================

Fairly simple: each Green increases certain stats by random amounts per
  Green.  Here's how each of the Greens change a Chocobo's stats.


Gysahl
======
  x = Rnd(0..3)
  Dash increases by x, Maximum of Max Dash
  Run increases by Rnd(0..2), Maximum of Max Run
  Stamina increases by 3 - x, Maximum of 9999

  Co-Op increases by 1, Maximum of 100


Krakka
======
  Int increases by Rnd(1..2), Maximum of 100
  Co-Op increases by 1, Maximum of 100


Tantal
======
  Dash increases by Rnd(1..4), Maximum of Max Dash
  Run increases by Rnd(1..4), Maximum of Max Run
  Stamina increases by Rnd(1..2), Maximum of 9999

  Int increases by 1, Maximum of 100
  Co-Op increases by 1, Maximum of 100


Pahsana
=======
  Int increases by Rnd(1..8), Maximum of 100
  If RunType > 0, Then RT Count increases by Rnd(1..4)
    If RT Count reaches the maximum of 100, RunType = 0
  Co-Op increases by 1, Maximum of 100
  75% chance Co-Op will increase by 1 again, Maximum of 100


Curiel
======
  Dash increases by Rnd(0..3), Maximum of Max Dash
  Run increases by Rnd(0..3), Maximum of Max Run
  Stamina increases by Rnd(3..10), Maximum of 9999

  Co-Op increases by 2, Maximum of 100


Mimett
======
  Dash increases by Rnd(1..16), Maximum of Max Dash
  Run increases by Rnd(3..10), Maximum of Max Run

  25% chance: Accel increases by 1, Maximum of 80
  Co-Op increases by 2, Maximum of 100


Reagan
======
  x = [Dash / 20]
  y = [Rnd(0..255) / 25]
  50% chance: x = x + y
  50% chance: x = x - y, Minimum of 0
  Increase Dash by x, Maximum of Max Dash
  x = [Run / 20]
  y = [Rnd(0..255) / 25]
  50% chance: x = x + y
  50% chance: x = x - y, Minimum of 0
  Increase Run by x, Maximum of Max Run
  x = [Stamina / 100]
  y = [Rnd(0..255) / 25]
  50% chance: x = x + y
  50% chance: x = x - y, Minimum of 0
  Increase Stamina by x, Maximum of 9999

  Co-Op increases by 3, Maximum of 100


Sylkis
======
  x = [Dash / 10]
  y = [Rnd(0..255) / 25]
  50% chance: x = x + y
  50% chance: x = x - y, Minimum of 0
  Increase Dash by x, Maximum of Max Dash
  x = [Run / 10]
  y = [Rnd(0..255) / 25]
  50% chance: x = x + y
  50% chance: x = x - y, Minimum of 0
  Increase Run by x, Maximum of Max Run
  x = [Stamina / 50]
  y = [Rnd(0..255) / 25]
  50% chance: x = x + y
  50% chance: x = x - y, Minimum of 0
  Increase Stamina by x, Maximum of 9999

  Int increases by Rnd(1..4), Maximum of 100
  Co-Op increases by 4, Maximum of 100



And now, on to the final section: breeding....


   
=============================================================================
                          B R E E D I N G   D A T A
=============================================================================

When you're ready to mate two Chocobos to create a newborn one... well, the
  most important choice you get to make is which Nut you'll feed them.
  Therefore, we will go over each Nut in turn.

A few notes before we begin.  The first Chocobo you pick is very important
  when determining the stats of a baby for most of the Nuts.  You'll also
  notice the following:

     1) It is impossible to make your first Green or Blue Chocobo without a
          Carob Nut.
     2) However, it *IS* possible to make a Black Chocobo with any Nut except
          a Zeio.
     3) While it's possible to get a guaranteed Gold Chocobo when mating a
          Black and a Wonderful Chocobo (providing they have won enough
          total races), mating a Black and a Gold is *NOT* a guarantee
          unless the Gold has a Wonderful Rating.

So, some fairly interesting things to see.


In addition, the code is very complicated, and I can't guarantee I haven't
  made any mistakes with translating it into readable form.  This document
  was difficult enough to compile.



=============================================================================
 Pepio Nut
===========
                                 Basic Stats
                                 -----------

  Max Dash : Average of Parents' Max Dash - 100*Rnd(1..2)
             Minimum of 300

  Dash     : Average of Parents' Dash - 100*Rnd(1..2)
             Minimum of 300

  Max Run  : Average of Parents' Max Run - 100*Rnd(1..4)
             Minimum of 300

  Run      : Average of Parents' Run - 100*Rnd(1..2)
             Minimum of 300

  Stamina  : Average of Parents' Stamina - Rnd(0..255)
             Minimum of 1

  Note that the minimums only apply for the initial values; further
    reductions can safely ignore them

  If Dash is greater than or equal to Max Dash, subtract 100 from it until it
    is lower than Max Dash
  If Max Run is greater than or equal to Max Dash, subtract 100 from it until
    it is lower than Max Dash
  If Run is greater than or equal to either Dash or Max Run, subtract 100
    from it until it is lower than both

  If the baby chocobo's Max Dash is under 4000, there is a 1/512 chance that
    a bonus will be applied to the Chocobo's Dash stats, using the following:

                       1/128: Max Dash is set to 4000
                       1/128: Max Dash is set to 4100
                       2/128: Max Dash is set to 4200
                       3/128: Max Dash is set to 4300
                       1/128: Max Dash is set to 4500
                     120/128: No change to Max Dash

    Its Dash is then set to its Max Dash, and then 6 random numbers each
      between 0 and 255 (Rnd(0..255)) are subtracted from it.  That means
      that it could end up anywhere between 0 to 1530 beneath your Max Dash.



                                 Extra Stats
                                 -----------

  Accel    : Average of Parents' Accel
  Co-Op    : 0
  Int      : Average of Parents' Int
  RunType  : See Notes
  RT Count : 0
  Races Won: 0
  Gender   : 50% chance of Male or Female

  Color/Rating:
    If mating a Green and Blue Chocobo together, there is a 25% chance of a
      Black Chocobo

    If that fails or you're not using a Green and Blue, then it's 50% chance
      of the father's color and 50% chance of the mother's color

    In all cases, the baby's Rating has a 50% chance of being equal to the
      father's, and 50% chance of being equal to the mother's



=============================================================================
 Luchile Nut
=============
                                 Basic Stats
                                 -----------
 
  Max Dash :  50% chance of Average of Parents' Max Dash
              50% chance of Average of Parents' Max Dash - Rnd(0..255)
                            Minimum of 300
             
  Dash     :  50% chance of Average of Parents' Dash
              50% chance of Average of Parents' Dash - Rnd(0..255)
                            Minimum of 300

  Max Run  :  50% chance of Average of Parents' Max Run
              50% chance of Average of Parents' Max Run - 2*Rnd(0..255)
                            Minimum of 300

  Run      :  50% chance of Average of Parents' Run
              50% chance of Average of Parents' Run - 2*Rnd(0.255)
                            Minimum of 300

  Stamina  : Average of Parents' Stamina

  Note that the minimums only apply for the initial values; further
    reductions can safely ignore them

  If Dash is greater than or equal to Max Dash, subtract 100 from it until it
    is lower than Max Dash
  If Max Run is greater than or equal to Max Dash, subtract 100 from it until
    it is lower than Max Dash
  If Run is greater than or equal to either Dash or Max Run, subtract 100
    from it until it is lower than both



                                 Extra Stats
                                 -----------

  Accel    : Average of Parents' Accel
  Co-Op    : 0
  Int      : Average of Parents' Int
  RunType  : See Notes
  RT Count : 0
  Races Won: 0
  Gender   : 50% chance of Male or Female

  Color/Rating:
    If mating a Green and Blue Chocobo together, there is a 25% chance of a
      Black Chocobo

    If that fails or you're not using a Green and Blue, then it's 50% chance
      of the father's color and 50% chance of the mother's color

    In all cases, the baby's Rating has a 50% chance of being equal to the
      father's, and 50% chance of being equal to the mother's



=============================================================================
 Saraha Nut
============
                                 Basic Stats
                                 -----------

  Max Dash :   3/32 chance of the *first* Parent's Max Dash increased by
                                        1/33rd, maximum of 6000
               3/32 chance of the *first* Parent's Max Dash decreased by
                                        1/33rd, minimum of 1
              26/32 chance of average of Parent's Max Dash

  Dash     : Average of Parents' Dash
             
  Max Run  :   3/32 chance of the *first* Parent's Max Run increased by
                                        1/33rd, maximum of 6000
               3/32 chance of the *first* Parent's Max Run decreased by
                                        1/33rd, minimum of 1
              26/32 chance of average of Parent's Max Run
             
  Run      : Average of Parents' Run

  Stamina  :   3/32 chance of the *first* Parent's Stamina increased by
                                        1/33rd, maximum of 9999
               3/32 chance of the *first* Parent's Stamina decreased by
                                        1/33rd, minimum of 100
              26/32 chance of average of Parent's Stamina
             
  If Max Run got the 3/32 chance of a 1/33rd increase and Max Run is greater
    than or equal to Max Dash, subtract 100 from it until it is lower than
    Max Dash
  If Run is greater than or equal to Max Run, subtract 100 from it until it
    is lower than Max Run



                                 Extra Stats
                                 -----------

  Accel    : Average of Parents' Accel
  Co-Op    : 0
  Int      : Average of Parents' Int
  RunType  : See Notes
  RT Count : 0
  Races Won: 0
  Gender   : 50% chance of Male or Female

  Color/Rating:
    If mating a Green and Blue Chocobo together, there is a 50% chance of a
      Black Chocobo

    If that fails or you're not using a Green and Blue, then it's 50% chance
      of the father's color and 50% chance of the mother's color

    In all cases, the baby's Rating has a 50% chance of being equal to the
      father's, and 50% chance of being equal to the mother's



=============================================================================
 Lasan Nut
===========
                                 Basic Stats
                                 -----------
 
  Max Dash :  50/256 chance of the *first* Parent's Max Dash increased by
                                        1/20th, maximum of 6000
              25/256 chance of the *first* Parent's Max Dash decreased by
                                        1/20th, minimum of 1
             181/256 chance of average of Parent's Max Dash

  Dash     : Average of Parents' Dash
             
  Max Run  :  50/256 chance of the *first* Parent's Max Run increased by
                                        1/20th, maximum of 6000
              25/256 chance of the *first* Parent's Max Run decreased by
                                        1/20th, minimum of 1
             181/256 chance of average of Parent's Max Run
             
  Run      : Average of Parents' Run

  Stamina  :  50/256 chance of the *first* Parent's Stamina increased by
                                        1/20th, maximum of 9999
              25/256 chance of the *first* Parent's Stamina decreased by
                                        1/20th, minimum of 100
             181/256 chance of average of Parent's Stamina

  If Max Run got the 50/256 chance of a 1/20th increase and Max Run is
    greater than or equal to Max Dash, subtract 100 from it until it is lower
    than Max Dash
  If Run is greater than or equal to Max Run, subtract 100 from it until it
    is lower than Max Run



                                 Extra Stats
                                 -----------

  Accel    : Average of Parents' Accel
  Co-Op    : 0
  Int      : Average of Parents' Int
  RunType  : See Notes
  RT Count : 0
  Races Won: 0
  Gender   : 50% chance of Male or Female

  Color/Rating:
    If mating a Green and Blue Chocobo together, there is a 50% chance of a
      Black Chocobo

    If that fails or you're not using a Green and Blue, then it's 50% chance
      of the father's color and 50% chance of the mother's color

    In all cases, the baby's Rating has a 50% chance of being equal to the
      father's, and 50% chance of being equal to the mother's



=============================================================================
 Pram Nut
==========
                                 Basic Stats
                                 -----------
 
  Max Dash :  50/256 chance of the *first* Parent's Max Dash increased by
                                        1/18th, maximum of 6000
              25/256 chance of the *first* Parent's Max Dash decreased by
                                        1/33rd, minimum of 1
             181/256 chance of average of Parent's Max Dash

  Dash     : Average of Parents' Dash
             
  Max Run  :  50/256 chance of the *first* Parent's Max Run increased by
                                        1/18th, maximum of 6000
             206/256 chance of average of Parent's Max Run
             
  Run      : Average of Parents' Run

  Stamina  :  50/256 chance of the *first* Parent's Stamina increased by
                                        1/18th, maximum of 9999
              35/256 chance of the *first* Parent's Stamina decreased by
                                        1/10th, minimum of 100
             171/256 chance of average of Parent's Stamina

  If Max Run got the 50/256 chance of a 1/18th increase and Max Run is
    greater than or equal to Max Dash, subtract 100 from it until it is lower
    than Max Dash
  If Run is greater than or equal to Max Run, subtract 100 from it until it
    is lower than Max Run



                                 Extra Stats
                                 -----------

  Accel    : Average of Parents' Accel
  Co-Op    : 0
  Int      : Average of Parents' Int
  RunType  : See Notes
  RT Count : 0
  Races Won: 0
  Gender   : 50% chance of Male or Female

  Color/Rating:
    If mating a Green and Blue Chocobo together, there is a 50% chance of a
      Black Chocobo

    If that fails or you're not using a Green and Blue, then it's 50% chance
      of the father's color and 50% chance of the mother's color

    In all cases, the baby's Rating has a 50% chance of being equal to the
      father's, and 50% chance of being equal to the mother's



=============================================================================
 Porov Nut
===========
                                 Basic Stats
                                 -----------
 
  Max Dash :  70/256 chance of the *first* Parent's Max Dash increased by
                                        1/15th, maximum of 6000
             186/256 chance of average of Parent's Max Dash

  Dash     : Average of Parents' Dash
             
  Max Run  :  50/256 chance of the *first* Parent's Max Run increased by
                                        1/15th, maximum of 6000
              25/256 chance of the *first* Parent's Max Run decreased by
                                        1/20th, minimum of 1
             181/256 chance of average of Parent's Max Run
             
  Run      : Average of Parents' Run

  Stamina  :  50/256 chance of the *first* Parent's Stamina increased by
                                        1/20th, maximum of 9999
             206/256 chance of average of Parent's Stamina

  If Max Run got the 50/256 chance of a 1/15th increase and Max Run is
    greater than or equal to Max Dash, subtract 100 from it until it is lower
    than Max Dash
  If Run is greater than or equal to Max Run, subtract 100 from it until it
    is lower than Max Run



                                 Extra Stats
                                 -----------

  Accel    : Average of Parents' Accel
  Co-Op    : 0
  Int      : Average of Parents' Int
  RunType  : See Notes
  RT Count : 0
  Races Won: 0
  Gender   : 50% chance of Male or Female

  Color/Rating:
    If mating a Green and Blue Chocobo together, there is a 25% chance of a
      Black Chocobo

    If that fails or you're not using a Green and Blue, then it's 50% chance
      of the father's color and 50% chance of the mother's color

    In all cases, the baby's Rating has a 50% chance of being equal to the
      father's, and 50% chance of being equal to the mother's



=============================================================================
 Carob Nut
===========

                                 Basic Stats
                                 -----------

  Max Dash : See below

  Dash     : Average of Parent's Dash

  Max Run  :  30/256 chance of highest of Parents' Max Run increased by
                                        1/10th, maximum of 6000
              55/256 chance of highest of Parents' Max Run decreased by
                                        1/20th, minimum of 1
             161/256 chance of average of Parents' Max Run

  Run      : Average of Parent's Run

  Stamina  :  50/256 chance of highest of Parents' Stamina increased by
                                        1/20th, maximum of 9999
             216/256 chance of average of Parents' Stamina
             
  If a Black Chocobo was born (see below for what causes this) and the
    average of the Parents' Max Dash is less than 4000, then the following
    'bonuses' will be applied:

        7/16: Max Dash is set to 4000
        4/16: Max Dash is set to 4200
        1/16: Max Dash is set to 4300
        1/16: Max Dash is set to 4400
        2/16: Max Dash is set to 4500
        1/16: Max Dash is set to 4800

    After this bonus, the Max Dash is further modified:
           x = [Rnd(0..255) / 5]
          50% chance that Max Dash is increased by 'x'
               otherwise, Max Dash is decreased by 'x'

  Otherwise (the baby is not a Black Chocobo or the average Max Dash was
    greater or equal to 4000):
      60/256: The baby's Max Dash will be set to the highest of the Parents'
                Max Dash increased by 1/10th, maximum of 6000
     196/256: The baby's Max Dash will be set to the average of the Parents'
                Max Dash

  If the Chocobo's Max Run is greater or equal to its Max Dash, then Max Run
    is reduced by 100 repeatedly until it is lower than Max Dash.

  Finally, if the baby Chocobo's Run is greater or equal to its Max Run, the
    Run value is reduced by 100 repeatedly until it is lower than Max Run.



                                 Extra Stats
                                 -----------

  Accel    : Average of Parents' Accel
  Co-Op    : 0
  Int      : Average of Parents' Int
  RunType  : See Notes
  RT Count : 0
  Races Won: 0
  Gender   : 50% chance of Male or Female

  Color/Rating:
    If a Blue and a Green Chocobo are being mated, then:
        If the total number of races won by its parents is 9 or more, then
          the baby is automatically a Black Chocobo
        If it's less than 9:
                   10/256 chance: Black Chocobo
                  128/256 chance: Blue Chocobo
                  118/256 chance: Green Chocobo
        The baby's Rating will be either Great (50%) or Good (50%)

    Otherwise, if both of the parents are Great or Good Chocobos:
        If the total number of races won by the parents is 4 or more, then
          the baby is automatically either a Blue (50%) or Green (50%)
          Chocobo
        If it's less:
                   69/256 chance: Blue Chocobo
                   69/256 chance: Green Chocobo
                  118/256 chance: Yellow Chocobo
        The Rating of the newborn Chocobo will be Great if both parents have
          the same Rating, and will have an equal chance of Great or Good if
          the parents were of different Ratings

    If the *first* Parent you picked was a Great or Good Chocobo, but the
      second isn't, then there's a 25% chance that it won't matter, and it'll
      use the above condition (both parents are Great/Good) to work out Color
      and Rating.  The Rating of the newborn in this case will be the same as
      the first Parent

    If *everything else* fails, then the baby will be a Yellow Chocobo, and
      have a 50/50 chance of getting either its mother's or its father's
      Rating



=============================================================================
 Zeio Nut
==========
                                 Basic Stats
                                 -----------

  Max Dash : See below

  Dash     : Average of Parent's Dash

  Max Run  :  80/256 chance of highest of Parents' Max Run increased by
                                        1/8th, maximum of 6000
              15/256 chance of highest of Parents' Max Run decreased by
                                        1/20th, minimum of 1
             161/256 chance of average of Parents' Max Run

  Run      : Average of Parent's Run

  Stamina  : 175/256 chance of highest of Parents' Stamina increased by
                                        1/20th, maximum of 9999
              81/256 chance of average of Parents' Stamina

  If a Gold Chocobo was born (see below for what causes this) and the average
    of the Parents' Max Dash is less than 5000, then the following 'bonuses'
    will be applied:

        7/16: Max Dash is set to 5000
        2/16: Max Dash is set to 5100
        2/16: Max Dash is set to 5200
        1/16: Max Dash is set to 5300
        1/16: Max Dash is set to 5400
        2/16: Max Dash is set to 5500
        1/16: Max Dash is set to 5950

    After this bonus, the Max Dash is further modified:
           x = [Random(0..255) / 10]
          50% chance that Max Dash is increased by 'x'
               otherwise, Max Dash is decreased by 'x'

  Otherwise (the baby is not a Gold Chocobo or the average Max Dash was
    greater or equal to 5000):
      55/256: The baby's Max Dash will be set to the highest of the Parents'
                Max Dash increased by 1/10th, maximum of 6000
     201/256: The baby's Max Dash will be set to the average of the Parents'
                Max Dash


  If the Chocobo's Max Run is greater or equal to its Max Dash, then Max Run
    is reduced by 100 repeatedly until it is lower than Max Dash.

  If a Gold Chocobo was born and its Max Run is less than 4000, then it gets
    a bonus of 1000 to its Max Run.  This can potentially cause it to go
    above Max Dash.

  Finally, if the baby Chocobo's Run is greater or equal to its Max Run, the
    Run value is reduced by 100 repeatedly until it is lower than Max Run.



                                 Extra Stats
                                 -----------

  Accel    : Average of Parents' Accel
  Co-Op    : 0
  Int      : Average of Parents' Int
  RunType  : See Notes
  RT Count : 0
  Races Won: 0
  Gender   : 50% chance of Male or Female

  Color/Rating:
    First, if you are mating a Black and a Wonderful Chocobo, then:
                  1/32 chance: Gold Chocobo
                 31/32 chance: Gold Chocobo *ONLY* if the total number of
                               Races Won by the parents add up to 12 or more

           If you get a Gold Chocobo by this method, then it will have a
             Rating of Great
             
    If you don't get an automatic Gold Chocobo or aren't mating a Black and a
      Wonderful Chocobo in the first place, then you have a 50% chance of the
      father's color and a 50% chance of the mother's color

    Under those circumstances, there's a 50/50 chance it'll get either the
      father's or the mother's Rating



=============================================================================
 FINAL BREEDING NOTES
======================
   
The Parent Chocobos must wait 3-10 battles before they recover.
The Baby Chocobo must wait 3-18 battles before it matures.


There is a 17/256 chance that the new Chocobo will be naturally more adapt at
  dashing than running, which places penalties on its Run stats and grants
  bonuses to its Dash stats.  However, it requires a couple of extra
  conditions:

    First, x = 100 * Rnd(3..10)

    Now, the modifications will only go ahead if the Baby's Run stat is
      greater than x, and that the Baby's Max Dash stat, when increased
      by x, does not exceed 6000.

    If this is true, then:
         Baby's Run and Max Run stats are reduced by x.
         Baby's Dash and Max Dash stats are increased by x.



  Finally, the RunType of the Baby Chocobo is determined like so:

    If both of the parents had a RunType that was not 0, then the Baby has
      a 50% chance each of RunTypes 1 and 2.
    If at least one of them had a RunType that was 0, there is a 50% chance
      that the baby will have either RunTypes 1 or 2 (equal chance).
    Otherwise, what the baby gets becomes slightly more complicated.  It
      *should* be RunType 0, but because FF7 does not reinitialise the
      variable, it is *possible* for the baby to get the RunType of the
      previous chocobo that was born provided you haven't left the screen
      since the last breeding.  Since it's only possible to get two babies
      without leaving the ranch, this generally has very little effect...
      but it is, at least, possible.
    In general though, you should get RunType 0 if the previous conditions
      failed.



=============================================================================



And... uh... I'm done.  Think I'll get some sleep now....

5
Finished latest project: map out Fort Condor.  Was kinda fun, but more tricky in some areas than Bone Village (mostly since it involved more variable manipulation, and had some *really* nasty systems I had to go through... you'll see)

So.  You first get to access this minigame when you emerge from the Mythril Mines.  Fair enough.  I'm not going to cover the tactics of the Fort Condor people; they're well documented enough.  Let's cover Shinra's tactics instead.

So, how many times do they attack?  You'd be surprised.  Very surprised.

The attacks are based on our old friend, the Plot Progression Variable.  Now, here's a couple of important numbers.  You can first visit Fort Condor when the PPV (new acronym for the duration of this post!) is 387.  The Huge Materia battle occurs anytime after or at 1102 PPV (the earliest you can actually *get* there for that battle is 1110).

Now.  Here's what dictates when Shinra attacks.  Shinra will be back ready for another round... if 6 or more ticks have passed since the last battle!  Simple, right?  However, for ever *70* ticks that have passed since the last battle, they get a free attack, forcing the Fort Condor people to repel them themselves.

Sounds like a lot of battles available.  There really aren't.  Plot Progression only happens in key locations, and a lot of the time, you can't get back to Fort Condor while you're in the middle of a plot point.  Which means there are lots of potential battles you have to skip.  However, if you're *sensible*, then you can get back and be able to fight a total of 14 battles (not including Huge Materia battle).  How the hell do you manage that?  Well, here's the best times to backtrack:

Code: [Select]
  #1: As soon as you get through Mythril Mines
   #2: After resting in Junon
   #3: After Priscilla shows you how to make Mr.Dolphin jump
   #4: After getting the Buggy
   #5: After selecting your party for the Gi Caves (YOU MUST NOT CAUSE THE BUGGY TO BREAK DOWN)
   #6: After finishing Cosmo Canyon
   #7: After meeting Shera in Rocket Town
   #8: After getting the Tiny Bronco
   #9: After leaving Gold Saucer where Cait Sith gave away the Keystone
  #10: After completing the Temple of the Ancients
  #11: After awakening the Sleeping Forest
  #12: After sleeping in the Forgotten City in Disc 1
  #13: After Disc 2 starts
  #14: After you get the Highwind


                      =========================

Okay, back to Shinra's tactics.  The minigame gets more difficult the more times you win.  Winning includes beating the minigame properly, defeating the Commander, or letting Fort Condor handle it themselves when they have 3000 gil or more.  One proviso for that last one: if Shinra attacked one or more times while you're away, the battle you fight when you come back will not include the ones Fort Condor won in the meantime; their wins are only added *after* you beat Shinra's current attack.  So if you'd completed Battle 4 the last time you were there, and Shinra attacked twice in your abcense (and Fort Condor had enough gil to repel both of those), you'd return to fight Battle 5, and the next battle in the sequence would be Battle 8.

Note, of course, that if you lose a battle (by the commander defeating you or letting Fort Condor handle it when they have less than 3000 gil), it will count as a loss, and the Battle Counter will not increase.

The difficulty of the battle is Ranked:
Code: [Select]
Battles 1-3: Rank 1
Battles 4-6: Rank 2
Battles 7-9: Rank 3
Battles 10-12: Rank 4
Battles 13+: Rank 5


The Huge Materia battle is a special case and is considered to be Rank 6.

The Rank of the battle dictates how many enemies will attempt to climb Fort Condor.  In addition, you will gain Fire Catapults from Rank 2 battles onwards, and Tristoners from Rank 3 battles onwards.

                      =========================

Prizes!  It's what we all want!  However, the Fort Condor battles are stingy.  They only give you their prizes if you *beat* the minigame without allowing any enemies to make it to the top.  The only condition necessary to beat the game, though, is to destroy all enemies that are *CURRENTLY* on the screen.  That means if you can wipe out the first wave quick enough before you get overrun or the Commander shows up, you automatically win!

Anyhow, if you *do* win without being invaded, then you get 200 gil for each surviving ally.  And then, you may be given a prize found on the battle field!  The prizes depends on the Rank of the battle, and are as follows:

Code: [Select]
   Magic Comb     (first time)
    Peace Ring     (after Magic Comb, win your next  Rank 1 Battle)
    3 Ethers       (after Peace Ring, subsequent Rank 1 Battles)
    Megalixir      (after Peace Ring, win your first Rank 2 Battle)
    5 Hi-Potions   (after Megalixir,  subsequent Rank 2 Battles)
    Super Ball     (after Megalixir,  win your first Rank 3 Battle)
    3 Turbo Ethers (after Super Ball, subsequent Rank 3 Battles)
    5 X-Potions    (after Super Ball, subsequent Rank 4 Battles)
    3 Elixirs      (after Super Ball, subsequent Rank 5 Battles)


Note: If you get to Rank 2 before getting Peace Ring, Rank 3 before getting Megalixir or Rank 4 before getting Super Ball... then you can no longer earn prizes for beating Fort Condor properly.

2nd Note: Due to several bugs in the dialog and scripts, the following amusing things happen:
  The 3 Ethers are listed as you receiving 3 Tinctures.
  The 5 Hi-Potions are listed as you receiving 5 Potions.
  The 5 X-Potions are listed as you receiving 3 Elixirs, but the window is too small to see *ANY* text anyways.

                      =========================

Finally, if you allow the Shinra forces to reach the top of Fort Condor, Cloud's party must repel the invasion themselves.  This involves a battle with CMD.Grand Horn.  There are three types of CMD.Grand Horn, a L19 one (drops Vagyrisk Claw), a L25 one (drops nothing) and a final L37 one (drops Imperial Guard).

Now, the very first time you fight in Fort Condor, it will automatically be the L19 CMD.Grand Horn.  But after that, there are several requirements.  Here's the list:

  If there are less than three members in your current battle party, you will face the L19 Commander.
  Otherwise, if the average level of your battle party is less than 19, you will face the L19 Commander.
  Otherwise, if the average level of your battle party is greater than 24, you will face the L25 Commander.
  Otherwise, the Commander you face will depend on the Battle Rank and how many enemies you killed before they reached the top:

Code: [Select]
   Battle Rank 1: Always face the L19 Commander
    Battle Rank 2: Kill more than 15 enemies to face the L19 Commander, otherwise you get the L25 Commander
    Battle Rank 3: Kill more than 20 enemies to face the L19 Commander, otherwise you get the L25 Commander
    Battle Rank 4 and 5: Kill more than 25 enemies to face the L19 Commander, otherwise you get the L25 Commander


A few things to note: Aeris does not count when working out the average level of your battle party in this minigame.  Having a battle party comprised of a L10 Aeris, L40 Cloud and an L20 Barret would be a three person party with an average level of 30.

Also, in the Huge Materia Battle, you will finally face the L37 Commander.

                      =========================

Finally.  Some useful info for those you guys doing scripting.  Compiling all this required me to find out *lots* of PPV values, so here's a list from Mythril Mines to when Cid takes over as leader in Disc 2!  (And here's where a large majority of the spoilers are held, so remember: you were warned)

Code: [Select]
0x183:  387 = Met Turks in Mythril Mines
0x184:  388 = Defeated Bottomswell
0x18A:  394 = After deciding to rest in Junon
0x190:  400 = After Priscilla explains about Mr.Dolphin and the whistle
0x193:  403 = Descend elevator after seeing the Highwind
0x196:  406 = After wearing Shinra Uniform
0x199:  409 = Dismissed after Junon Military Reception (Formation Minigame)
0x19F:  415 = After alarm on Cargo Ship sounds
0x1A6:  422 = Entering Mt.Corel for the first time
0x1AB:  427 = Watching Barret get hit in North Corel
0x1AE:  430 = Corel Flashback
0x1B1:  433 = Boarding the Ropeway
0x1B4:  436 = Exiting the Ropeway
0x1B8:  440 = After Barret runs off in Gold Gate
0x1BA:  442 = Cait Sith joins
0x1BD:  445 = Waking up in Corel Prison
0x1BE:  446 = Barret runs off in Corel Prison
0x1C0:  448 = Beginning of Dyne Flashback
0x1C3:  451 = After Barret watches Corel burn
0x1C6:  454 = After Dyne Flashback
0x1C9:  457 = Barret rejoins party
0x1CF:  463 = After Dyne's suicide, about to ask Mr Coates to go 'up'
0x1D2:  466 = Coates sends you up the elevator
0x1D3:  467 = After the call for the jockeys
0x1D5:  469 = Received the Buggy (Unlocks Cargo Ship travel)
0x1ED:  493 = After leaving Bugenhagen's holographic demonstration
0x1F6:  502 = After selecting your party for the Gi Caves
0x202:  514 = Defeated Gi Nattak
0x20B:  523 = Red XIII rejoins your party (Fixes Buggy as well)
0x217:  535 = Meeting Shera for the first time at the Tiny Bronco
0x21A:  538 = Meeting Cid
0x226:  550 = Shera finishes telling the flashback
0x229:  553 = Cid talks to Rufus
0x22D:  557 = Shera tells Cloud about Palmer
0x236:  566 = Received the Tiny Bronco
0x244:  580 = Cloud accepts Dio's challenge and enters the Battle Arena
0x247:  583 = Received the Keystone
0x24A:  586 = The meeting in the Ghost Hotel
0x24D:  589 = End of the meeting
0x250:  592 = The beginning of the date
0x253:  595 = End of the Gondola Ride
0x256:  598 = Chasing Cait Sith
0x259:  601 = After Cait Sith returns to the Ghost Hotel
0x25C:  604 = Leaving the Ghost Hotel after picking your TotA party
0x261:  609 = After placing the Keystone on the altar
0x264:  612 = After completing the rolling boulder challenge
0x267:  615 = After witnessing Sephiroth stabbing Tseng
0x26A:  618 = Finished talking by the scrying pool
0x26D:  621 = Cloud laughing at the Meteor mural
0x270:  624 = Examining the Black Materia
0x273:  627 = After agreeing to meet Cait Sith at the entrance
0x276:  630 = Cait Sith reaches the mural room
0x27E:  638 = Cloud awakes in Gongaga
0x281:  641 = Barret and Tifa convince Cloud to follow Aeris
0x28C:  652 = The Sleeping Forest awakes
0x298:  664 = Cloud awakes in the Forgotten City
0x29B:  667 = Cloud reaches Aeris at the Water Altar
0x29D:  669 = Cloud feels a sensation on approaching Aeris
0x29F:  671 = Cloud draws his sword
0x2A1:  673 = Defeated Jenova*LIFE
0x2A5:  677 = Scene after Aeris' "burial"
  == DISC 2 ==
0x302:  770 = Upon viewing the photograph in Sephiroth's illusion
0x316:  790 = After scene where Hojo witnesses Weapon in Maze Center
0x318:  792 = Start of 2nd Shinra scene in Maze Center
0x31A:  794 = Cloud upside down next to the encased Sephiroth
0x3E7:  999 = The Weapons are unleashed...
0x3E8: 1000 = Entering the Junon Office for first time, heading for execution
0x3E9: 1001 = Entering Junon Branch, 2f for first time, heading for execution
0x3EA: 1002 = Entering Junon Branch, 1f for first time, heading for execution
0x3EB: 1003 = Entering junction (Path 2) for first time, heading for execution
0x3F0: 1008 = After Scarlet puts Tifa in the gas chair
0x3F2: 1010 = After Cait Sith frees Barret
0x3F4: 1012 = After Barret has tried to open the door a few times
0x3F6: 1014 = After Junon panarama of Shinra soldiers at attention
0x3F7: 1015 = Cait Sith joins after suggesting they try another room
0x3F8: 1016 = Sapphire Weapon stands upright
0x3F9: 1017 = Tifa stopped the gas
0x3FC: 1020 = Tifa gets to the name Sister Ray
0x3FE: 1022 = Scarlet catches up with Tifa
0x401: 1025 = Tifa boards the Highwind
0x403: 1027 = After Cait Sith mentions that everyone is waiting
0x405: 1029 = On the cockpit, Tifa notices there's "not enough crew"
0x407: 1031 = Tifa mentions her depression, and wants to see Cloud again
0x409: 1033 = After selecting Tifa's party in the Operation Room
0x44C: 1100 = Outside the Clinic, after Tifa's seen Cloud's condition
0x44D: 1101 = Back inside the Clinic, for Tifa's announcement
0x44E: 1102 = Back on the Highwind after Tifa leaves
0x452: 1106 = Eavesdropping on the Shinra meeting
0x454: 1108 = Outside the Cockpit, Cid as new leader!
0x456: 1110 = After selecting Cid's party in the Operation Room


Enjoy.

6
Success!  Thanks to lasyan's script dumper, I've pieced together how Bone Village digging works.  So, without further ado, here's the details.

NOTE: I will be posting this on the GameFAQs message board, since it *is* a useful bit of information for gamers.

First off, there are 8 spots that are pre-determined and located around the village.  These spots are numbered, and here are their exact locations (GameFAQs will only get the descriptive versions).

1: (-319, 608, 326): Top floor, right-side of smoke plume, Cloud's body half covered by the smoke, Cloud's head touching the tent
2: (368, 634, 327): Top floor, between the two black marks on the right-hand area
3: (-108, 81, -48): Bottom floor, *JUST* east of the tent door, right next to the piece of wood sticking out next to the door.
4: (26, 132, -40): Bottom floor, center of the dirt X to the east of the tent door.
5: (-61, -113, -110): Bottom floor, between the airplane and the skeleton, with Cloud's head touching the tip of the airplane's nose.
6: (21, 513, 328): Top floor, Cloud's foot barely touching the top-right corner of the burnt out campfire.
7: (-227, 500, 328): Top floor, halfway between the smoke plume and the campfire, near the southern edge of the area.
8: (-223, -252, -105): Bottom floor, due south of where you start, a little NE of the edge of the leaves.

These spots never change.  Now, when you search for treasure, one of these spots will be chosen randomly.  What you search for helps determine which spot is chosen:

Lunar Harp: Spot 1
Good Treasure: 80/256 chance each of Spots 2 and 3; 96/256 chance of Spot 4
Normal Treasure: 60/256 chance each of Spots 5, 6 and 7; 76/256 chance of Spot 8

This is the spot that the diggers will face when the bomb explodes.  However, you don't have to dig there.  Providing you're close enough to any of the listed spots, you'll be able to get the results of that spot.  For instance, you can dig for Lunar Harp but still dig up Spot 4 quite easily.

Now, here's what's hidden under each of the spots:

Spot 1: Lunar Harp (if you haven't dug it up yet) or Nothing.

Good Treasure Spots:
  Spot 2: Buntline (if you haven't dug it up yet), Phoenix Materia (if you're on Disc 3, you've already found the Buntline and have never collected the Phoenix Materia) or Nothing.
  Spot 3: Megalixir (if you haven't dug it up yet), Bahamut ZERO Materia (if you're on Disc 3, you've already found the Megalixir and have never collected the Bahamut ZERO Materia... but you only have a 10/256 chance of getting it each time you try) or Nothing.
  Spot 4: Mop (if you haven't dug it up yet), W-Item Materia (if you're on Disc 3, you've already found the Mop and have never collected the W-Item Materia) or Nothing.

Normal Treasure Spots:
  Spot 5: Key to Sector 5 (if you haven't found it yet and Cloud's recovered from his Mako Poisoning), Elixir (36/256 chance if you didn't find the Key or already have it) or Nothing.
  Spot 6: Key to Sector 5 (if you haven't found it yet and Cloud's recovered from his Mako Poisoning), Turbo Ether (20/256 chance if you didn't find the Key or already have it) or Ether.
  Spot 7: Key to Sector 5 (if you haven't found it yet and Cloud's recovered from his Mako Poisoning), Ether (76/256 chance if you didn't find the Key or already have it) or Nothing.
  Spot 8: Potion (128/256 chance) or Nothing.

If you fail to search near enough to a Spot, you will get the results of Spot 8 (Potion or Nothing).

And that's all there is to it.  Hope it was useful to you.

8
...and I thought the elemental system was sussed.

It would appear that dear Ruby throws a spanner in all the works.  A normal enemy dump shows him as being immune to Gravity and Water (and his Poison Status Immune makes him automatically immune to Poison Element too).  However, once you can actually harm him, you learn that he *ALSO* Absorbs Fire, Ice, Lightning and Earth (but not Wind, interestingly enough).

This change is not reflected by a second dump at that point, and Ruby's Tentacles have the exact same immunes (without the Poison Status immune, too), and still take damage from Fire, Ice, Lightning, etc.

So, a right puzzle that.  Doesn't look like he's affected by any status for it either (not that there's a status that selectively absorbs the four elements I mentioned).  If anyone figures out how and why this is occuring, I'd be grateful.

9
If you're interested, there are a number of features that can be unlocked in FF7PC... providing you're good enough to get down to the nitty-gritty and hack through the main EXE.  What I'm going to give you is the features themselves... but I have no idea how they can be unlocked.  I only know of their presence.  (But note that anyone who manages to do this will probably have their praises sung far and wide....)

1. Misprint: Materia that add to Magic Def actually add to Spirit, like they should do; this is a mis-labelling of Materia abilities.

2. Bug: Magic Defense is not used at all to determine battle mechanics defense against magic.  Only the Spirit value is used.  Thus, any piece of armor that adds to Magic Defense gives *NO* benefit whatsoever.

3. Forgotten Feature: Every weapon in the game has an element out of the following: Cut, Hit, Punch and Shoot.  Shoot is probably facilitated only to demonstrate Long Range ability, but the other three have no seeming use at all, even though a few enemies list weaknesses against them (Desert Sahagin are weak vs Punch).  These weaknesses do not work, that I've seen.  (In addition, the element names should really be something like Edged, Blunt and Pierce, or something similar; the current names are misleading)


Those three challenges should be enough.  They're listed in order of difficulty (though even (1) should be reasonably tricky to fix, unless you know your code).  Just thought it was worth bringing these to your attention, is all.


Have fun.


10
Scripting and Reverse Engineering / Battle Mechanics 101
« on: 2001-05-10 05:57:00 »
I'm really not going to say much about this right now, but figured it was due an update.

This is for physical attacks only, by the way.


First, know that the most important aspect of damage is the Base Damage.  It is derived from two stats: Attack and Level.  (And note that Attack = Strength + Weapon Attack modifier)

The formula used is:
Base = Att + [(Att + Lvl) / 32] * [(Att * Lvl) / 32]
(note that

  • means the integer portion of x)

    Once you have the Base damage, most modifiers are placed on top of this.  Back Row damage halves it, for instance, while a Critical Hit (or Deathblow) would double it.  Also, modifiers due to the actual attack will be used here (example: the Braver Limit Break is 3x Base).

    (Note: Mini affects Attack only; it reduces it to 0)

    Once that's done, Enemy Defense is handled.  First, the Damage Modifier is worked out, then it is applied to the base damage:


Dam Modifier = (512 - Enemy Defense)/512
New Damage = Damage * Dam Modifier

(Note: Piercing Attacks ignore Defense)

Next, if the attack warrants it, random variation kicks in.  The variant gives a number between: [Damage * 15/16] ... (Damage - 1)

At this point, damage is sanity-checked: if Damage < 1, then Damage = 1.

Finally, multi-hit bonuses from stuff like the Yoshiyuki, Master Fist and Goblin Punch are added if they're needed.  The damage is again sanity-checked: this time, if Damage > 9999, then Damage = 9999.

(Note: Not sure of the order some of these things are done in, especially that last... need to test a few more special cases)

Whatever number you end up with is your final damage.

HTH.  HAND.


Pages: [1]