Final Fantasy 9 > FF9 Tools

[PSX/PC] General editor - Hades Workshop (0.50b)

<< < (4/404) > >>

JBedford128:
Oh, that makes a lot more sense. ^_^

Death is tied to this, as both worked on Parasite Cage when I set it to 00. It also allowed Scan to work (it just seems to Miss otherwise), which allowed me to see the true HP. Everything else was Guarded (but I didn't test Venom (no player ability natively has it) or Vanish (which natively targets only allies)).

I don't understand Eat's relationship to it. I could Eat Parasite Cage (well, i didn't (i don't think i could given its HP), but it said "I can no eat until weaker"), but for Garnet it just plain said "I no can eat".

Edit: Oh wait, Garnet gets immunity from Eat because she is of the Humanoid class. Remove the class and she can be Eaten.

So I did some more digging.

Part of the enemy file:
----------------
00 00 00 00 [first-status-set. Status immunity]
00 00 00 00 [second-status-set. Status evasion, and sometimes auto-status]
00 00 00 00 [third-status-set. Status at beginning of battle/sort-of auto-status]
00 00 [HP]
00 00 [MP]
--------------------

Now, with regards to the status immunities:
Byte1 (01=Break, 02=Venom, 04=Virus. 08=Silence, 10=Blind. 20=Annoy, 40=Zombie, 80=??)
Byte2 (01=Death (but not Eat), 02[messes up targetting?], 04=Confuse, 08=Berserk, 10=Stop, 20=Auto-Life, 40=??, 80=Defend)
Byte3 (01=Poison, 02=Sleep, 04=Regen, 08=Haste, 10=Slow, 20=Float, 40=Shell, 80=Protect)
Byte4 (01=Heat, 02=Freeze, 04=Vanish, 08=Doom, 10=Mini,20=Reflect, 40=???, 80=Gradual Petrify)

It's the same statuses with all three sets of status thingies. 80000000 seems to do nothing, but the third-status-set uses 80000000 as a Death immunity. 00020000 is odd as an immunity. I'm not sure I could actually hit the enemy with it on.

So the first-status-set is Guard immunities.

The second-status-set work the same as immunities, but instead of saying "Guard" it says "Miss". Its other benefit is auto-statuses. The ones I've noted are Auto-Float, Auto-Haste, Auto-Reflect, Auto-Slow, Auto-Berserk, Auto-Poison, and Auto-Regen. I didn't go through each one individually, since I got the gist, so there may be more. However, I think Auto-Poison may be purely cosmetic. Unless I've forgotten how Poison worked, I sat waiting for the enemy to take damage but never did. I also suspect Auto-Slow may be cosmetic. I do know that Auto-Reflect works though.

There is also something interesting about Auto-Haste and Auto-Slow. When both are on, both the Haste and Slow indicators will appear next to the enemy. If one is on, and the one that is not on is inflicted on the enemy, both indicators appear then also. This could just be evidence that both are cosmetic and do not function as Auto-Statuses. But I don't know for sure.

The third-status-set inflicts the status at the start of the battle, however the effectiveness of this changes:
-If Stop is a selected status, then it can be removed. Unlike the second-status-set, there's no forced Miss.
-If a status is a temporary status (is removed after a duration) then the status does not stick. A graphic will be seen on start-up but that's it.
-For the countdown statuses, the countdowns are removed. If Doom is a selected status, the enemy will get Death instantly.
-00400000 seems to be Trance. The Masked Man was glowing, but it didn't do anything.
-00010000 and 00000040 have the enemy disappear and commands are never completed.
I also looked at other unknowns in an attempt to find out what they were. The two-bytes after the Animation IDs: Only of the bits in these bytes seems to do anything. "01" makes Prison Cave (the enemy I was testing on at the time) invisible.
-80000000 is the oddest. As discussed before, this is what bosses have. It Guards Instant Death, it makes Scan Miss, it makes Eat Miss (No can  eat), and a new revelation is that it makes Demi Miss too.

Also, after the Steal data, there are two unknown bytes, and then another set of two unknown bytes. For that second set of two unknown bytes, I set it to FF and it meant that when my characters attacked, they actually passed through the Prison Cage and attacked behind it. So these bytes may decide which part of a model the characters should attack.

Additionally, further down, the seventh and eighth bytes after the bytes deciding Blue Magic: These dictate where the cursor appears in relation to the enemy. I switched it to FF and it made the cursor jump all over the screen, but I also set it to a more stable figure that moved the cursor a couple feet upward from its original position. Additionally, my characters attacks towards the cursor. So this is like the bytes I mentioned before, except the offset effects the cursor too, which is not the case for the other ones.

Sorry if any of that wasn't clear, I'm not good with explaining things or words.

Tirlititi:
It's clear enough, thanks.
I know a bit more than what the programs currently displays. I'll try to write it down.
The Enemy Chunk data has an ID of 10 and begins like every other chunk (see the wiki for that).
Then there is the "groups" datas :

--- Code: ---1 byte Unknown
1 byte NbGroups
1 byte NbEnemyTypes
1 byte NbAttacks
2 bytes Battle Flags
2 bytes Unknown
--- End code ---

Then comes [Nb Groups] times this :

--- Code: ---1 byte Group Frequency
1 byte Nb Enemies
2 bytes Engaging camera ID
2 bytes AP
2 bytes Unknown
[
1 byte Enemy ID
1 byte Targetable Flag
2 bytes Unknown
2 bytes Position X
2 bytes Position Z
2 bytes Position Y
2 bytes Facing Angle
] (x4)
--- End code ---

Then come the enemy's stats (the part you investigated). There are [NbEnemyTypes] of them (thx to you : I didn't know the purpose of the first 12 datas) :

--- Code: ---4 bytes Status immunity
4 bytes Status evasion/auto-status
4 bytes Status initial cast
2 bytes HP
2 bytes MP
2 bytes Gils
2 bytes Exp
4 bytes Drop Item
4 bytes Steal Item
1 byte Unknown
1 byte Collision size (it tells how large some effects must be, such as scan)
2 bytes Aiming position, as you said (though I don't know more how it should be interpreted)
2 bytes Model ID (thx Zande for this and the followings)
2 bytes Animation ID 1
2 bytes Animation ID 2
2 bytes Animation ID 3
2 bytes Animation ID 4
2 bytes Animation ID 5
2 bytes Animation ID 6
4 bytes Unknown
2 bytes Attack Power
1 byte Speed
1 byte Strength
1 byte Magic
1 byte Spirit
4 bytes Unknown
1 byte Elemental guard
1 byte Elemental absorb
1 byte Elemental half
1 byte Elemental weak
1 byte Level
1 byte Class
1 byte Unknown
1 byte Physical defence
1 byte Physical evade
1 byte Magic defence
1 byte Magic evade
1 byte Blue magic
2 bytes Unknown
2 bytes Cursor position (not the one you mentioned but pretty much the same thing if I remember well)
2 bytes AKAO death ID (sound when he dies)
2 bytes Cursor position (the one you mentioned)
16 bytes Unknown
2 bytes Shadow Gap Y (didn't investigate it...)
7 bytes Unknown
1 byte Drop card
10 bytes Unknown
--- End code ---

Finally come the attack stats. [NbAttacks] times this :

--- Code: ---1 byte Unknown
2 bytes Model ID (though it seems unused ; the real model ID is in the 0x11 chunk file with the attack animations)
1 byte Unknown (often 1F or 5F)
1 byte Effect
1 byte Power
1 byte Element
1 byte Accuracy
1 byte Flags ("use reflect", "is magic" and I don't know the others, unfortunatly :/)
1 byte Status
1 byte MP cost
5 bytes Unknown
--- End code ---
And finally, 4 bytes end the whole thing, but I don't know what it might be.

About opcodes, since that's the most interesting thing I would want to hack next. Here is what I know :
The arguments of most opcodes can be either raw values or variable codes. A variable code is a list of variable operations terminated by 7F. I won't list operations here but there is a sample :

--- Code: ---D40D 7D0200 20 D809 7D0000 18 27 7F
--- End code ---
is translated into :

--- Code: ---( Var_D40D == 2 ) && ( Var_D809 < 0 )
--- End code ---
20 is the == operation, 18 is the < operation and 27 is the && operation and 7D announce a short numerical value. So it is read like that :

--- Code: ---D40D 7D0200 20 -> ( Var_D40D == 2 )
D809 7D0000 18 -> ( Var_D809 < 0 )
27 -> ( Var_D40D == 2 ) && ( Var_D809 < 0 )
--- End code ---
The result is put on the stack (for a following conditional jump, for instance).

The list of opcodes and their effect (for those I know of) can be seen in the file "Hades_Strings.h" of the source code. I don't list them cause there are a lot of them...

I'll update this post if you or me find more informations. Now I just discovered that the US version and the french version have a huge difference : in the french version, some important datas are compressed (with a compression method called RNC) in a sub-file, making them impossible for me to edit. But that's not the case in the US version... So I guess I'll end up making this program only open the US version...

JBedford128:
The third set of status bytes do not have anything to do with immunity, they are just initial cast, and the status can be removed by standard means (like Remedy).

The fifth byte (first unknown byte, after number of attacks) of the data:
- 01 = When the battle ends in a non-standard way, do not continue battle.(used for bosses and friendly enemies--allows to continue fighting boss after death sequence if turned off)
- 02 = Always back attack
- 04 = [Unknown]
- 08 = [Unknown]
- 10 = no victory pose/no fanfare.
- 20 = cannot escape
- 40 = enemies are out of reach? (Masked Man could still hit me for full damage, i could not hit him)
- 80 = Cannot use magic (greyed out in menu, party members at least)
Sixth byte:
- 01 = Attacks take off a lot: I assume this is the Ipsen effect- weak weapons do more damage
- 02 = [Unknown]
- 04 = [Unknown]
- 08 = prevents the battle results screen.
- 10 = [Unknown]
- 20 = [Unknown]
- 40 = [Unknown]
- 80 = [Unknown]

Since my tests were against Masked Man I could have missed things, like if the unknowns were to effect EXP or Drop, or if the victory poses of some of the characters played or not (although it wouldn't make sense to decide that in the battle data- i thought the same about Magic block and the reverse weapons though).

For the first unknown (byte5) in Attack stats, you state it can only be 1F, but I have seen 5F frequently.

And I am using the PAL UK version and it seems to match up to the US version quite well. I've seen some differences, but most are translation.

Tirlititi:
Ah, that's a good thing to know. I thought that RNC thing would be used by every european versions.
The header begins with "RNC\1" so if you search the hexadecimal sequence "52 4E 43 01" and find no results, it's sure that's not used. But I trust your test, it may just be a cleaner way to know it.
But for now, I don't seek datas written in this part of the file. That'll become a problem when I'll look for items, characters' stats and supporting abilities.

Thanks for testing the flags :)
I can't do as much testing as I would like to and I'm really grateful you take care of some. I'll release a new version soon, but I would like to make that backup system before.

By the way, the 3rd status set is used for death/eat/scan immunity, no? Even if it's only 1 bit. Also, what is break? You meant petrify?

JBedford128:
Oh yeah, I forgot about that one bit. :p

And by Break I do mean Petrify. Break is the name of the spell. I did the same with Annoy: the status is actually "Trouble" but at the time my main source for status name was ability name.

Also I think I've very likely found the value that stores the card. Dendrobium and Fang both store "01" (both holding the Fang card, the second card) in the byte, and Goblin stores "00" (Goblin card, the first), Beatrix stores "FF" (no card), and Ironite stores 08 and Basilisk stores 05, which match up.


--- Code: ---16 bytes  Unknown
2 bytes   Shadow Gap Y (didn't investigate it...)
7 bytes   Unknown
1 byte    Card drop (00 to 63, FF is none)
9 bytes   Unknown

--- End code ---

I'll confirm this in an edit later (EDIT: Confirmed. I had a Fang drop an Airship card).

Above you may notice that I dropped a byte from what you originally wrote. The total I wrote would be 35 bytes in this section, but you have 36.

So take the Goblin/Fang one for example: After Goblin, there are 36 bytes in this section, then Fang's enemy-block starts. For Fang, there are 35 bytes in this section before the Attacks/Abilities block starts.

So there is an additional byte here between two enemies in the same scene? Or am I missing something?

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version