From my point of view, Photoshop is faulty there, cause I found the .tiff layer format in some official .tiff documentation. I don't see why Photoshop doesn't support that feature (as said, Gimp does).
Well then, since SE decided to keep the release of the Steam version for later, here is the v0.33 :
- Added a MIPS editing feature. MIPS is the coding language shared by all the PSX games. It's the deepest level of game modifications and shouldn't be used carefree. More infos below.
- You can now add and remove several things, so you don't need to recycle another item to create a new one :
--- Add/Remove texts in text blocks and battles,
--- Add/Remove enemy groups,
--- Add/Remove enemy spells.
- Completed the list of spell effects, though I only know the effect of "Defless" among the new ones : it unconditionally divides both defences by 2.
- You can now use the field models of most of the playable characters. Indeed, the problem was that you don't only need to add the character's model in the preloading list, but also link it to a script's entry. The related "InitObject" call is a necessary step to preload the 3D model.
- Added a background artwork image. It was made by
Maxa' and I'm really glad of it
Here is the step-by-step method to use one of the playable character's model on the field :
1) In the target field's script, choose an object's entry. You'll replace that object by your playable character's model, so you need to choose one you won't use anymore. Modify the scripted events and whatever you want in that object's script ; don't touch the "Init" function yet.Note : in some future version, you'll be able to add new entries, so you won't have to dummy one. You may also keep the old entry's script and thus use both objects (the old one + the new character's) using a trick : use a global variable and increment it in the object's "Init" function. This way, you'll be able to identify different instances of the same entry and give them different models. See the script of Linblum Soldiers in "Brahne's Fleet/Event" in disc 2 for an example of that system : there's only 1 entry for 2 different soldiers.
In any case, the important thing there is to note the chosen entry's ID (the number used in the related "InitObject" call).
2) Change the Preloading stuff of that field and add your character's model. Here is the list of the ones that can be used for now :
Vivi (8)
Dagger_Bis (76)
Zidane (98)
Dagger (185)
Freya (192)
Beatrix (204)
Quina (273)
Eiko (443)
Amarant (509)
Steiner (5489)
I don't think you can use battle models ; there seems to be a problem when using them.
When you add the model, you're asked for a number : enter the ID of the previously chosen entry.
If you don't have enough space, you need to remove some other object.
3) Return to the field's script and modify the "Init" function of your character's entry. Here are the different setups for the animations and sizes :
// Vivi
SetModel( 8, 61 )
SetStandAnimation( 148 )
SetWalkAnimation( 571 )
SetRunAnimation( 419 )
SetLeftAnimation( 917 )
SetRightAnimation( 918 )
SetObjectLogicalSize( 20, 30, 44 )
SetAnimationStandSpeed( 14, 16, 18, 20 )
SetHeadAngle( 65, 57 )
// Dagger Bis
SetModel( 76, 91 )
SetStandAnimation( 2089 )
SetWalkAnimation( 2086 )
SetRunAnimation( 2091 )
SetLeftAnimation( 2088 )
SetRightAnimation( 2084 )
SetObjectLogicalSize( 20, 26, 42 )
SetAnimationStandSpeed( 14, 16, 18, 20 )
SetHeadAngle( 89, 4 )
// Zidane
SetModel( 98, 93 )
SetStandAnimation( 200 )
SetWalkAnimation( 25 )
SetRunAnimation( 38 )
SetLeftAnimation( 40 )
SetRightAnimation( 41 )
SetObjectLogicalSize( 20, 24, 40 )
SetAnimationStandSpeed( 14, 16, 18, 20 )
SetHeadAngle( 97, 61 )
// Dagger
SetModel( 185, 91 )
SetStandAnimation( 2089 )
SetWalkAnimation( 2086 )
SetRunAnimation( 2091 )
SetLeftAnimation( 2088 )
SetRightAnimation( 2084 )
SetObjectLogicalSize( 20, 26, 42 )
SetAnimationStandSpeed( 14, 16, 18, 20 )
SetHeadAngle( 89, 4 )
// Freya
SetModel( 192, 94 )
SetStandAnimation( 2556 )
SetWalkAnimation( 2553 )
SetRunAnimation( 2558 )
SetLeftAnimation( 2555 )
SetRightAnimation( 2551 )
SetObjectLogicalSize( 26, 34, 48 )
SetAnimationStandSpeed( 14, 16, 18, 20 )
SetHeadAngle( 105, 53 )
// Beatrix
SetModel( 204, 100 )
SetStandAnimation( 2978 )
SetWalkAnimation( 2975 )
SetRunAnimation( 2981 )
SetLeftAnimation( 2980 )
SetRightAnimation( 2974 )
SetObjectLogicalSize( 20, 20, 30 )
SetAnimationStandSpeed( 14, 16, 18, 20 )
SetHeadAngle( 104, 48 )
// Quina
SetModel( 273, 92 )
SetStandAnimation( 3228 )
SetWalkAnimation( 3237 )
SetRunAnimation( 3230 )
SetLeftAnimation( 3235 )
SetRightAnimation( 3227 )
SetObjectLogicalSize( 40, 48, 60 )
SetAnimationStandSpeed( 14, 16, 18, 20 )
SetHeadAngle( 65, 45 )
// Eiko
SetModel( 443, 63 )
SetStandAnimation( 7503 )
SetWalkAnimation( 7518 )
SetRunAnimation( 7506 )
SetLeftAnimation( 7516 )
SetRightAnimation( 7514 )
SetObjectLogicalSize( 20, 24, 38 )
SetAnimationStandSpeed( 14, 16, 18, 20 )
SetHeadAngle( 65, 5 )
// Amarant
SetModel( 509, 122 )
SetStandAnimation( 8307 )
SetWalkAnimation( 8316 )
SetRunAnimation( 8312 )
SetLeftAnimation( 8310 )
SetRightAnimation( 8314 )
SetObjectLogicalSize( 30, 35, 50 )
SetAnimationStandSpeed( 14, 16, 18, 20 )
SetHeadAngle( 65, 0 )
// Steiner
SetModel( 5489, 104 )
SetStandAnimation( 2001 )
SetWalkAnimation( 1996 )
SetRunAnimation( 2005 )
SetLeftAnimation( 1986 )
SetRightAnimation( 2010 )
SetObjectLogicalSize( 30, 35, 50 )
SetAnimationStandSpeed( 14, 16, 18, 20 )
SetHeadAngle( 97, 32 )
You can unfortunatly only use those 5 animations each time. The other character animations are field-dependant.
Now, about MIPS.
The available MIPS code is the one from the battle system. Every time you're in battle, that's the code running in the background and processing everything. A convenient part of it handles the spell effects and that's the main modifiable thing for now. You can modify the different assembly-like instructions and they are displayed a bit more readably on the right. The spell effect scripts are called at the "Effect Point" of spell animations. Be sure to check the help ; though it is far from complete, it's still a first introduction to it.
Let's start with a relatively simple example : the effect of "Pure Damage". It consists of these lines.
$2 = $29[51] & 0xFF
nothing
$2 = $2 | 0x1
$29[51] = $2 & 0xFF
$4 = $17[8]
nothing
$3 = $4[5] & 0xFF
nothing
$2 = $3 << 1
$2 = $2 + $3
$2 = $2 << 3
$2 = $2 + $3
$3 = $4[7] & 0xFF
$2 = $2 << 2
jump 0xB4CC0
$3 = $3 + $2
// What lies at 0xB4CC0 :
jump 0xB7918
$29[54] = $3 & 0xFFFF
The $ things are placeholder for variables (RAM registries actually). There are 31 of them, most of which that have special purposes.
The brackets are used to retrieve or store a data from the memory. While non-brackets can be seen as temporary variables, for calculation purpose, the brackets ones are used to communicate with the whole system.
Let's get a closer look :
$2 = $29[51] & 0xFF
nothing
$2 = $2 | 0x1
$29[51] = $2 & 0xFF
These lines are adding the bitflag 0x1 to $29[51]. That "$29[51]" is a special data that will be used latter by the "jump 0xB7918" call. Note that a lot of spell effects (all I think) end with a "jump 0xB7918" call : it resolves the effect by applying the damage, the statuses, checking if the target should die or change state, run the "hit" animations, etc...
The bitflags "$29[51]" are flags about the effect on the target. The bitflag 0x1 is the one saying "This spell deals damage" so now all you have left to do is to set the amount of damage dealt.
The following lines :
$4 = $17[8]
nothing
$3 = $4[5] & 0xFF
nothing
are used to retrieve the spell's power. "$17[8]" is the casted spell's data offset and the 5th data is the spell power (its written in 8 bits, just like the "$29[51]" flags, hence the 0xFF). Now the variable $3 holds the spell power.
Next are those lines :
$2 = $3 << 1
$2 = $2 + $3
$2 = $2 << 3
$2 = $2 + $3
$2 = $2 << 2
You can translate them by "$2 = (($3 * 2 + $3) * 8 + $3) * 4" or, shortly, by "$2 = $3 * 100". Since the raw multiplications are slow operations (or were at the time), the devs prefered to use shifts and sums instead.
Next to it, there's also :
$3 = $4[7] & 0xFF
$3 = $3 + $2
$29[54] = $3 & 0xFFFF
The spell's accuracy is stored into $3, then added to $2 and stored into "$29[54]", which is the memory place where you need to store the damage number before the "0xB7918" call. Note that the line following a jump call is always executed before the jump actually occurs (there's a delay of one instruction).
To sum up, this code explicitely does that :
1) Add a flag "deals damage" to the effect,
2) Set the damage to 100 * Spell Power + Spell Accuracy,
3) Run the "Apply Effect" code (0xB7918 ; note that it can differ depending on your version of the game).
Check the help to have a list of useful known data addresses. You'll know how to retrieve data such as caster's or target's stats. If you're interested in modifying raw spell effects, I encourage you to check out how most simplest are done. Namely, you should check out these spell effects :
Minus Strike, Lucky Seven, Thievery, Frog Drop, Dragon Crest and Grudge (other "Pure Damage" like effects, with more complex damage formulas),
Defless, Absorb Magic/Strength (another effect than damage, but quiet simple),
Darkside, Drain and Osmose (damage/heal on the caster and use of the different flags),
Chakra (HP and MP heal, and also an example of an effect using a supporting ability),
Curse (change the elemental weakness of the target and display a special text. I suspect the element of the spell Curse to be specially randomized the same way that Roulette's target is randomized ; that's something specially handled by the battle script, but not at the "spell effect" place).
Note that there are a lot of "jump" calls that lead out of the spell effect's range - sometimes to another spell effect's function part, sometimes to another part of the battle script and even sometimes to another part of the RAM script, not battle-related -. You can try to guess what's their purpose (mainly : they do the standard damage and dodge calculations) and treat them as black boxes. You can also copy the address offset and paste it in the "Full Code" area to see the target code.
Since that's complicate even to understand the code (and even more to write one), I'll do samples of custom spell effects and post them here. If you have ideas, you can ask and I'll see if it's reasonably easy to make ^^"
Fiou, I hope some of you will find interests in this version. I'm both glad to be able to modify spell effects and disappointed to have it so complicated ^^"
By the way, to add to the masochism, that MIPS coding thing will surely be useless for the Steam version ; that's one of the first thing they'll have updated for sure.