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 - Tirlititi

Pages: [1]
Before retiring from FF9 modding, one of the last things I worked on was how SFX are handled by the game. I previously had to decipher a couple of 3D model formats but I couldn't recognize anything as such when looking at the hexadecimal files supposedly containing the SFX models (it applies to all the versions of the game since, except for the sounds, the PC remaster uses the exact same files as the PSX version).

In PC, though, the game uses an unified model format (it's made with Unity) so we can export the SFX models as they are used by the game at runtime. Unfortunatly, an important part of the conversion from "PSX-formatted models" to "Unity models" is hidden in an external DLL that I don't know how to read either.
Anyway, when exporting the Unity models, here is what we get:

... which is not as great as it could be.
I made a little video to give more examples and write some informations about that.

I know that 3D models of summons are a real thing at least in a version of FF8 because I have seen a few of them. However, that way of playing at the middle between false 3D and true 3D seems to be typical of PSX Final Fantasies (backgrounds are pretty much similar). For the SFX, though, I have no idea. I think I remember someone saying that SFX modding was very difficult in FF7. Are SFX formats a known thing for FF7 or FF8? Are they actually rendered and/or stored as planar pieces with depth?

Troubleshooting / Double-checking translations
« on: 2018-06-22 09:26:15 »
I would like to make an international version of my FF9 mod.

For now, the mod only works with the English version but I have translated the content added by the mod in the other languages supported by the game:
Japanese, German, French, Italian and Spanish.

However, because I have little to no knowledge in these languages (except for french) and mostly did that with auto-translating, I'm afraid that there are errors and nonsensical sentences in these translations. I am especially afraid with the japanese translations: I've learned a few tips regarding how to handle auto-translations but there still may be a lot of problems with the way the sentences are made.

So, if you speak any of these languages, could you be kind enough to check whether there are issues with these translation? You'd get my eternal gratitude :D

You can see the translations here in a (hopefully) convenient way:
Alternate Fantasy Translation

I am available for any question you have regarding this script but, in general, you should see that I've tried to fit with the work of the original translators.

Thank you for reading.

Scripting and Reverse Engineering / FF9 script syntax
« on: 2015-12-13 23:28:45 »
Hello everyone !

I'm going smoothly with the update of my tool, but I would like your opinions about how I should establish scripting conventions.
You don't need to know of Final Fantasy IX or anything to give your opinion, so I ask it here.

I'm about to choose what should be the final syntax for FF9 coding scripts. Up to now, I used a syntax which was thought to look like assembly, but I don't think that's relevant anymore. I naturally came, without thinking too much about it, to this :

1) code control keywords are lower case
Examples : if, then, while

2) function names are capitalized. Most of the time, the first part of the name is a verb, but that's not the case for very fundamental functions of one of the game's system.
Examples : AddItem, MoveCamera, RunScript
Other examples : Battle, Field, Menu

3) unknown variable names look like "VAR_AX_Y" where X and Y are numbers, and A is a letter (A, B, C or D).
Examples : VAR_A1_10, VAR_B7_95, VAR_C3_1816

4) known global variable names are capitalized and can be prefixed either with their category, or with something they are related to.
Examples : SV_PlayerTeam, SV_Target, MV_WorldPositionX
Other examples : Chocobo_BeakLevel, Global_ScenarioCounter, World_CurrentTransport

5) there are also getters, for which the syntax is like the one of a variable (ie. with no parenthesis) but with no prefix and a "Get" instead.
Examples : GetTime, GetDialogProgression, GetRandom

6) known local variable names are lower case.
Examples : i, attackamount, attacklist1

7) some operations are a bit obscure and not in the standard operation list of many programming languages. The boolean XOR operation is noted ^ and there are list operators which are normal operators with a $ appended.
Examples : =$, >$, >=$

8 ) unknown functions and operations obviously have gibberish names, but if you have an idea to make them more convenient, you're also welcome.
Examples : 0x0E, 0xA4, 0x39
Other examples : Op43, Op2B, OpF

Here is a sample of 3 functions (2 from an IA and 1 from a world map character creation) written with these conventions, as they would be displayed in the tool.
Code: [Select]
Function Adamantoise_Init
    set attackamount = 6
    set attacklist1 = 262144L
    set attacklist2 = 130
    set attackmplist1 = 3145728L
    set attackmplist2 = 1300
    set i = 0
    while ( i < attackamount ) {
        set tmp1 |= ( i << ( i * 3 ) )
        set i++
    set i = attackamount
    while ( i > 1 ) {
        set tmp2 = ( GetRandom % i )
        set tmp3 = ( 7 << ( tmp2 * 3 ) )
        set tmp3 &= tmp1
        set attackshuffledlist |= ( tmp3 << ( ( ( i - tmp2 ) - 1 ) * 3 ) )
        set tmp2 = ( ( 1 << ( tmp2 * 3 ) ) - 1 )
        set tmp3 = ( tmp2 & tmp1 )
        set tmp2 ^= 16777215L
        set tmp1 = ( ( tmp1 >> 3 ) & tmp2 )
        set tmp1 |= tmp3
        set i--
    set attackshuffledlist |= ( tmp1 & 7 )

Function Adamantoise_ATB
    set attacklistselection = ( attackshuffledlist & 7 )
    set tmp2 = GetRandom
    set tmp3 = 128
    set i = ( attackamount - 1 )
    while ( i >= 0 ) {
        if ( tmp2 > tmp3 ) {
        set tmp3 >>= 1
        set i--
    if ( i == 65535 ) {
        set i = ( attackamount - 1 )
    if ( i == ( attackamount - 1 ) ) {
        set attackshuffledlist = ( ( attackshuffledlist >> 3 ) & 2097151L )
        set attackshuffledlist |= ( attacklistselection << ( i * 3 ) )
    } else {
        if ( i ) {
            set tmp1 = ( attacklistselection << ( i * 3 ) )
            set tmp2 = ( ( 1 << ( ( i + 1 ) * 3 ) ) - 1 )
            set tmp3 = ( ( tmp2 & attackshuffledlist ) >> 3 )
            set tmp3 |= tmp1
            set tmp2 ^= 16777215L
            set attackshuffledlist &= tmp2
            set attackshuffledlist |= tmp3
    set i = attackamount
    while ( i >= 0 ) {
        switch 8 ( attacklistselection ) from 0 {
        case +0:
            set #( SV_Target = RandomInTeam(SV_PlayerTeam) )
        case +1:
            set #( SV_Target = RandomInTeam(SV_PlayerTeam) )
        case +2:
            set #( SV_Target = RandomInTeam(SV_PlayerTeam) )
        case +3:
            set #( SV_Target = RandomInTeam(SV_PlayerTeam) )
        case +4:
            set #( SV_Target = SV_PlayerTeam )
        case +5:
            set #( SV_Target = SV_PlayerTeam )
        case +6:
            set #( SV_Target = SV_FunctionEnemy )
        case +7:
            set #( SV_Target = SV_FunctionEnemy )
        if ( attacklistselection >= 4 ) {
            set tmp2 = ( ( attackmplist2 >> ( ( attacklistselection - 4 ) * 6 ) ) & 63 )
        } else {
            set tmp2 = ( ( attackmplist1 >> ( attacklistselection * 6 ) ) & 63 )
        set tmp1 = ( #SV_Target )
        set tmp3 = Op2B(SV_FunctionEnemy[MP])
        if ( tmp1 && ( tmp2 <= tmp3 ) ) {
        if ( i <= 0 ) {
        set attacklistselection = ( attackshuffledlist & 7 )
        set attackshuffledlist = ( ( attackshuffledlist >> 3 ) & 2097151L )
        set attackshuffledlist |= ( attacklistselection << ( ( attackamount - 1 ) * 3 ) )
        set i--
    if ( attacklistselection >= 4 ) {
        set selectedattack = ( ( attacklist2 >> ( ( attacklistselection - 4 ) * 6 ) ) & 63 )
    } else {
        set selectedattack = ( ( attacklist1 >> ( attacklistselection * 6 ) ) & 63 )
    if ( ( #( SV_FunctionEnemy[HP] ==$ 1 ) ) && ( #( SV_FunctionEnemy[MP] >$ 10 ) ) ) {
        set #( SV_Target = RandomInTeam(SV_PlayerTeam) )
        set selectedattack = 3
    Attack( selectedattack )

Function World_Zidane_Init
    0x3B( 1 )
    SetModel( 310, 100 )
    0x93( 5 )
    SetObjectLogicalSize( 0, 50, 100 )
    SetObjectSize( 7, 67, 67, 67 )
    SetStandAnimation( 4724 )
    SetWalkAnimation( 4727 )
    SetRunAnimation( 4727 )
    MoveInstant( 241934L, -1254, 4294713142L )
    TurnInstant( 77 )

What do you think?

Final Fantasy IX: Alternate Fantasy is a mod aiming to increase the difficulty and, above all, to give a new experience of FF9 for those who already know the game well.

Here are different download links. You only need to download 1 of them, depending on your platform and whether you want the full mod or only the Beatrix incorporation.
Note that Beatrix is not recruitable in the PSX versions of the mod due to modding limitations.

§  Alternate Fantasy v3.2 (PSX - US)  §
§  Alternate Fantasy v3.2 (PSX - FR)  §
§  Alternate Fantasy v3.2 (PSX - IT)  §
§ Alternate Fantasy v5.2 (PC - International) §
§ Beatrix-only v5.2 (PC - International) §

For the PSX version, you install it by applying a PPF patch to the original game files. You can use the tool PPF-O-MATIC that is included in the mod archive.

For the Steam version, you must first install the Moguri or Memoria Engine mod, then install Alternate Fantasy (that is done mainly by moving the right files at the right place and registering it in "Memoria.ini" as explained in the Readme).

The following is a description of the Steam's latest version (v5.2).
Several features are not present in the PSX version of the mod.

What are the modifications?
A lot of them. Most are gameplay related but a few of them are also about the screenplay. There are two kinds of scenario-related changes:
1) A few dialogs that were suppressed during the game's development are put back in this mod. It includes the dialogs from the "Hidden Dialogs" patch plus a few others for which only the texts were kept.
2) Beatrix can be permanently recruited after getting the airship (optional), cutscenes are changed from this point onward to include Beatrix in them.

Here is a list of the dialogs suppressed by the developpers and put back:
Spoiler: show
• Extra dialog between Puck and Vivi over Alexandria's roofs, unmissable
• A small line in the ATE "Time To Escape", missable
• An extended dialog between Steiner and Morrid, unmissable
• An extra ATE in Cleyra's cathedral, missable
• A few lines in Pinnacle Rocks, after the first meeting with Ramuh, unmissable
• An extra minigame in the occupied Linblum Castle, unmissable
• A couple of lines in the base level of the occupied Linblum Castle, unmissable
• An extra minigame when controlling Vivi in Alexandria for the 2nd time, missable

Also, there are 4 new bosses that can be fought at the end of the game.
For that, speak to Hades after defeating Lich and obtaining a Pumice: he will challenge you with new fights.
Spoiler: show
• The 3 Black Waltzes fighting together
• The 2nd opus of Tantarian, available only if you defeated it in Alexandria's Castle
• Meltigemini, with pieces of real twins inside
• The 4 Guardians fighting together

And Excalibur II can now be acquired by two different methods:
1) Reach and beat Hades in less than 14 hours,
2) Get all the collectable treasures of the game (there are 3 little mistakes allowed) to obtain the highest treasure rank.
Including a few Mimics, that makes 404 unique treasures to find.
The list is the same as in vanilla (for the locations at least) and can be found in this topic.

Gameplay-wise, there are a lot of changes. The battle system has been reworked, always with the aim of having more balanced mechanics and open to diverse strategies.

Here is a list of these changes: it is more or less written in decreasing order of importance, which allows you to stop reading whenever you don't want to know any more.

List of abilities (spreadsheet)

In particular:
• Some abilities are short-ranged, meaning that they are influenced by the character's row [in vanilla, only the attack command is] and back attacks. They also can't be used against out-of-range enemies.
• Some abilities can deal critical strikes [in vanilla, only the attack command can], which doubles their damage.
• Some abilities use the properties of the character's weapon, which includes its element (if the ability has an element, both are taken into account) [in vanilla, only No Mercy, Stock Break and Shock does that], the bonus given by killer abilities and the weapon's status if the supporting ability Add Status is enabled [in vanilla, only the attack command does that].

• With Bandit enabled, stealing all the 4 items of an enemy cannot take more than 10 attempts:
The super-common item is stolen at the 1st attempt,
The common item is stolen for sure after 1 unsuccessful steal,
The rare item is stolen for sure after 2 other unsuccessful steals,
The super-rare item is stolen for sure after 3 other unsuccessful steals.
When Master Thief is also enabled, only 1 unsuccessful steal can be done between each successful steals (so all the items are stolen after 7 attempts maximum), and the most rare items have the priority.
When Bandit is not enabled and the first steal's random check fails, the counter of unsuccessful steals is not increased [as in vanilla, the first random check is "Random(0, Caster's level + spirit - 1) ≥ Random(0, Target's level - 1)" ; this check is bypassed by Bandit].
Zidane can still steal items with luck, in which case the counter of unsuccessful steals neither increase or reset.

• The trance of any ally can be manually triggered using Zidane's Transcend skill provided that the gauge is already at 50% at least.
• Added a double-cast-like trance to Beatrix.
• Scan cannot miss anymore [in vanilla, it misses against most bosses and several special enemies],
Summons are special for 3 reasons:
 1) As in Vanilla, their power increases with the number of jewels that you own (except for Odin for which it is a penalty), up to a +49 bonus [+99 in vanilla],
 2) Their power increases each time you cast them, up to 50 times for a bonus of +50,
 3) The first time you cast a summon in a battle, it gets priority over the other commands: it is summoned before the other commands in queue, even if the ATB gauge was filled after. When Dagger and Eiko are both in the battle, summons get priority once for both of them.
• Stellar Circle 5 and Meo Twister increase the critical rate on the enemies, adding a 33% chance to the default critical chance (non cumulative).
Gravity damage are now effective against all the enemies, including bosses. Their power is divided by 4 against bosses [in vanilla, Gravity spells always miss on most bosses].

Note that some weapons get a special power bonus with the Attack command (thief swords and knight swords are empowered by spirit, rackets are empowered by speed and Save The Queen is empowered by level). As in vanilla, this bonus only applies when using the Attack command.

Supporting Abilities

Auto-Shell, Auto-Protect and Cheat Fate (immunes against Doom) are added to several characters.
Bright Eyes, Restore HP and Reflectx2 are removed.
Accuracy+ now immunes against Blind [in vanilla, physical attacks cannot miss with Accuracy+ even under Blind, the only effect of which is then to remove the character's evasion against enemy attacks].
Protect Girls triggers anytime [in vanilla, it triggers only under 50% of Max HP].
Cover triggers under 50% of Max HP [in vanilla, it triggers only under 17% of Max HP (yellow HP)].

The way that most damage modifiers work has changed:
• When accumulated, the damage bonuses give +50%, +100%, +125%, +150%, +162%, +175%, etc... (the theoretical limit is a bonus of +200%, which is 3 times the base power),
• For Steiner's trance, these bonuses are doubled to +100%, +200%, +250%, +300%, +325%, +350%, etc... [in vanilla, Steiner's attack command gets a +200% bonus instead of the usual +50% given by Trance; it is not the case anymore],
• The damage penalties cancel damage bonuses,
• If there are more damage penalties than bonuses, the damage are halved that many times.
Damage bonuses include Killer abilities, elemental equipment boosts, target's elemental weaknesses, Berserk or Trance, target's Sleep, target's Mini, back attack, special supporting abilities (High Jump, Concentrate, Power Throw) and MP Attack (Attack command only).
Damage penalties include Mini (for most of magic attacks), short-ranged attacks from back row, multi-targeting a spell that can be single-target, target's elemental resistances, target's defend, target's shell or protect.
Critical strikes (damage x2), summon short forms (damage x0.67) and physical attacks under Mini (damage drastically lowered) are not concerned by the above.
[In vanilla, the damage are multiplied by 1.5 for each bonus instead, except that killer abilities, elemental boosts, weaknesses and resistances are applied no more than once each.]

Fixed Return Magic non working on Necron or behaving differently than in the PSX version of the game (multi-target spells are now multi-target returned).


The duration and speed of statuses has been reworked.
They are now independant of the fighter's spirit, except for Doom and Gradual Petrify (the more spirit you have, the longer it takes).
Haste and Slow respectively decreases and increases the status duration and respectively speed up and slow down the ticks of Poison, Venom and Regen.
[In vanilla, the more spirit you have, the longer statuses last, except for Doom and Gradual Petrify that are running faster with higher spirit. The ticks of Regen are also faster while the ticks of Poison and Venom are slower.]

Float gives a +30% evasion bonus against physical attacks if the attacker doesn't float.
Remedies cure Poison, Venom, Silence, Blind, Stop, Mini, Gradual Petrify, Confuse, Heat and Freeze [in vanilla, it doesn't cure Confuse, Heat and Freeze].
Phoenix Pinions cure Doom (they also cost and sell cheaper).
Vanish is efficient against more attacks (all the short-ranged physical attacks).
Defending protects against many negative statuses: Silence, Blind, Confuse, Berserk, Sleep, Heat, Freeze and GradualPetrify.
Confuse triggers a back attack bonus half of the time [in vanilla, only back attacks at the start of battles and running away can trigger a back attack bonus].

Poison and Doom can now be inflicted to several bosses.
For Poison, the damage per tick on bosses is 1/64 of Max HP instead of 1/16.
For Doom, a boss doesn't die at the end of the countdown but looses 1/5 of its Max HP instead.

Heat and Freeze last only a short time. Freeze lasts 1.5 times longer than Heat.
Vanish and Sleep last longer.
The ticks of venom are 1.5 times slower than the ticks of Regen or Poison [in vanilla, they are 2 times slower].

Steiner's Break abilities can be used against bosses but are less effective [in vanilla, they are just as effective as usual]:
• Power/Magic Break: bring to 80% of the boss's normal stat, instead of 67%.
• Armor/Mental Break: bring to 67% of the boss's normal stat, instead of 50%.
These can be used again if the enemy somehow changes its stat through a special ability.


Reasonably increased the stats of enemies and made them harder through their AI.
The Max MP of the enemies have been drastically lowered in order to get emptied in a decent amount of time through MP damage.

Changes to the party's abilities reflect on the enemies' abilities.
More statuses are inflicted by enemy attacks and spells.
More abilities can be critical strikes, especially the physical attacks [in vanilla, a non-missable physical attack, like Ark's Boomerang, doesn't have critical] or the breaths.

The class of several enemies has been changed. Enemies are not automatically "birds" as soon as they are floating or flying, and there are more "humanoids".
Classification is less restricted by gameplay constraints [in vanilla, a few bosses are not "stone" or "zombie" despite the evidence because it would mean a free win; it is no longer the case].

Ragtime Mouse's questions are modified.
Quina may eat humanoids [in vanilla, they are non edible, like most bosses].


A few chests have a changed content. In particular:
• The Dragon's Hair and the Kain Lance are switched, making Dragon's Hair only available in late game,
• The Tiger Racket is only available after the return of the mist and seeing a cutscene with Quan (this specific optional cutscene is thus delayed),
• Several Hammers can be obtained; Hammers can be used by Vivi, Eiko and Dagger to improve their strength,
• Several acclaimed prices in Treno's Auction House have a delayed availability (Dark Matter in particular).

The elemental weakness given by pieces of equipment are now given in their description [in vanilla, they are hidden].
The Cotton Robe money trick was removed (they sell a bit less).
A couple of weapons can be used by several characters (for instance, Dagger can use the... dagger).
The ultimate weapons give a big boost to main characteristics (Strength, Magic, Speed and Spirit).
A few minigames have been tweaked.

Note about the version "Beatrix-only"

That version is meant to provide additional content without changing the difficulty or the gameplay of the vanilla (non-modded) game. It includes:
• Recruitable Beatrix (with cutscenes, abilities, trance etc.),
• Hidden scenes cut by the devs,
• The optional stuff that Hades offers (4 extra bosses and their rewards; the extra bosses are slightly easier since they inflict less statuses, but their damage and HP are the same as in the main version of the mod),
• Thunder Slash fix (that's the only non-optional gameplay aspect I kept in that version).


Hey !

The last tool of mine is a FF randomizer. It's a kind of tools that quickly refreshes the game by randomizing some of its content. That's a bit popular in the speedrunning scene where there are already runners taking a break on randomized versions of other Final Fantasies (I discovered it myself with FFX, as there's a tool for randomizing the sphere grids).

The spells are randomized among the spells used by the party in the vanilla game. For instance, Vivi can get Stock Break or Dagger can get Doomsday.
The weapons and armors also teach random abilities.

Another thing it can do is randomizing both the cards that the enemies drop and the cards used by the opponents during Treno's tournament.

Here is the download link :
Meteor On Final Fantasy IX

UPDATE NOTE: I included the Randomizer inside my other FF9 modding tool, though there are several differences.
I suggest to use that other tool, Hades Workshop, instead of this one when playing with the PC version of the game or a non-US PSX version. The only problem with Hades Workshop's Randomizer is that it's complicated to randomize properly the 4 discs of the PSX version with coherency (you'd need to save the modifications as .hws between each disc). Hades Workshop's version also adds an option to randomize the enemies' spells.
Documentation about the Randomizer integrated in Hades Workshop can be found here.

It only works with the american version of the game. Don't forget to apply the changes on all the 4 discs !

Code: [Select]
// How to Use //
1) Launch "MeteorOnFF9.exe",
2) On each of the panels, toggle the options to what you wish (options are detailed in the Readme file),
3) [Optional] Go to "File -> Choose random seed" and input a number ; if several people input the same number and have the same settings, they will have the same randomized game (for a race for instance),
4) On each of the panels, click on "Go" to trigger the randomization,
5) [Optional] You may click on the characters to see which abilities they obtained,
6) Go to "File -> Save" and select the game's ISO file(s) (you may select all the 4 discs at once by holding Ctrl),
7) Enjoy!

You may revert to un-randomized game by clicking on "File -> Reset to normal game" and then save.

Have fun  8-)

Troubleshooting / Modeling quads
« on: 2013-09-12 20:33:38 »

I've got some problems exporting 3D models for my program. I use .obj as the output format and I thought it would support quads for its faces.
But it doesn't work well...

So I have several questions : does .obj really support quads? May the problem comes from my 3D editing tool (Blender) ? Or is that my graphic card that doesn't support quads (how do I check it?)

When trying to open .obj with quads (TITS lines like "f 1/1 2/2 3/3 4/4"), I end up with those quads being displayed with glitches. I attached screenshots...
It may also be because of the ordering of the vertices in the faces (it should be standardized though)... I'll test it tomorrow.

Quads displayed in "Solid" mode

Quads displayed in "Texture" mode

Quads as they should be displayed

What do you guys think?

Hi there!

I'm working on a Final Fantasy IX modding tool called Hades Workshop. It is aiming to allow to edit most of Final Fantasy IX's content. Quite a big project and I don't know if I will ever decide when it's finished  ;D

//============== THE TOOL =================//

The features so far:
- Can mod Final Fantasy IX PSX files, in .bin format and in any language version,
- Can mod Final Fantasy IX Steam games,
- Read and edit datas about:
--- Spells the party can cast,
--- Supporting abilities the party can use,
--- Commands the party has,
--- Default stats of the party members,
--- Items' features,
--- Items sold in shops,
--- Statistics, attacks and AI of enemies,
--- Tetra Master cards,
--- Text, dialogs and charmap,
--- Game's script,
--- MIPS script and CIL script,
--- Model exporting/importing (exporting Battle Scenes only for PSX, more for Steam),
--- Backgrounds (view only in PSX, view/replace in Steam),
--- Steam resources exporter/importer,
--- Spell animation sequencing,
--- Includes a game Randomizer (more infos here).
- Works under Windows only (you may recompile the source code I redistribute or use wine under linux).

It may be a good idea to have a look at the help (F2).

Since the version 0.41, Hades Workshop is partly compatible with Albeoris's Memoria Engine Modification tool for the Steam version of the game:
- It can produce .csv files suitable for Memoria's usage,
- It can produce independant asset files and, using the incorporated tool "Unity Assets Viewer", can import those assets into modded archives,
- However, it cannot use Memoria's modded DLL to read game's data: a backup of a non-Memoria Assembly-CSharp.dll has to be used as input (it tries to search for one, but if it doesn't find it, you should put one with the name "Assembly-CSharp_Vanilla.dll" either in the game's Managed directory or in Hades Workshop's folder).

I made the program, obviously, but I got helped a lot by your wiki ( for cluster datas format of the PSX version and by occasionally.

Other than that, LandonRay and Zande made quite an useful work in data finding, Zidane_2 wrote most of the other tools about FFIX before me.

The launcher image on has been drawn by Maxa'. You can check his Deviant-Art page here.

Please tell me if you get any suggestion/bug report/feedback to share.

Here are the download links:


Github project

The older versions can be found here

Thank you for your attention  :)

//=============== THE MODS =================//

Here are some of the mods that were made using this tool by various people. Go see their description for more detailed informations.
Difficulty Tweak (PSX/PC): Made by Iamthehorker, this mod increases the MP cost of the abilities and make the battles tougher. The gameplay itself is preserved, so it really is an increase of difficulty for an augmented playthrough. If you think that the boss battles end too quickly or if you never saw the use of the ethers/elixirs, this mod is a way to go. It also allows Steiner to equip the Save of the Queen in the end-game.
Save The Queen (PSX): A mod made by ThisGuyAreSick2. It allows Steiner to use the allmighty Save The Queen. It also changes the way you synthesize it (it's made in the Black Mage Village in disc 4).
FF9.2.2 (PSX/PC): A mod made by Vir to improve the Perfect Stats challenge balancing. It removes the forced exp battle so a true lvl 1 game can be made. It also fixes the Thunder Slash glitch. Vir also made a Fixed Stats Mod which removes the primary stat variations from games to games and have a normalized stat progression.
HD Background (PC): This mod made by Fraggoso for the Steam version of the game improves the backgrounds on the field and make it fit more with the upscale of the characters. There is also a Highres Texture mod, applying the same process to the other textures of the game.
David Bowie Edition (PC): A mod made by Clem Fandango.
Alternate Fantasy (PSX/PC): My own mod. It modifies a bit of everything in the game but mostly change the abilities and the gameplay in battles.

Also, you can find here the different tiny mods I made over the years.

//============== HELP AND TIPS =================//

This topic is now more than 30 pages long. Different people asked for help at different points and I always tried to give a complete answer. You can thus find details in this topic about subtilities of the game, or how a feature of HW works, or how to do some precise thing. Since I don't want everyone to read the whole topic thoroughly, here are links to answers to these kind of questions.

Compatibility with Albeoris's Memoria tool (Steam version)

Here is how the compatibility with Memoria works (easiest setting):
1) Have a backup of the non-modded Assembly-CSharp.dll. By default, Memoria keeps it as "Assembly-CSharp.bak", which is fine. If that backup is still available and usable, Hades Workshop will use it and you have nothing more to do. If it doesn't exist, you need to get an Assembly-CSharp.dll by uninstalling Memoria (using Steam's option "Check the integrity of local files" does that) and keep it safe by renaming it "Assembly-CSharp_Vanilla.dll". This DLL is found in "x64/FF9_Data/Managed" and "x86/FF9_Data/Managed" of the game's directory (both are exactly the same).

2) When saving Steam mods, choose the options "Spreadsheets" and "Unity archives".
3) The folder generated by Hades Workshop ("HadesWorkshopMod" by default) then goes in the game's directory.
4) In that same directory, there is a file "Memoria.ini" that can be edited with a text editor such as the Notepad (if that file doesn't exist, that probably means that you don't have Memoria installed properly). Edit that file and add your mod folder's name to the list in "[Mod] FolderNames".

Very useful informations

A list of spells specially handled by the engine
About the random encounter rate
How to use "GetRandom" to generate a random number in a range
Declaring local and global variables in scripts
Basic example of reading a field script
Detailed example of adding a cutscene and a hunt sidequest
Changing properly the content of a chest
Typical NPC dialog script
Add a (N)PC on the field
Triggering conditions of special functions (Main, Loop, Counter, etc.)
Helping with the development of HW
Using Field 3D Models for enemies (Steam)
Making temporary characters available in the party menu (Part 1 - Part 2)
Using the Background Editor (Steam)
Properly adding a new enemy to a battle (Steam)
Changing the battle music of specific battles (Steam)
Making sure that a specific playable character is always in the party (Steam and PSX) + changing Zidane's model on the field (Steam)
Modding spell effect: explanation (Steam)
Modding Supporting Abilities: HP/MP +X% (Steam)
Modding Supporting Abilities: Auto-status and Immunes (Steam)
Modding Statuses: changing the tick of Poison/Venom/Regen (Steam)
dnSpy: Add a trance to Cinna, Blank, Marcus and/or Beatrix (Steam)
dnSpy: Bypass the limit of spells in different commands + separating the temporary/permanent character slots (Steam)
dnSpy & Memoria: Add a new music to the game without replacing an existing one

Less but still useful informations

Side effects of Initial/Auto-statuses
Bypass the enemies' Max HP limit
Checking if a character is in the team in-battle
Enabling an enemy attack depending on the party stats
Make Zorn & Thorn battle more difficult
Removing Dagger's depression effect in-battle
About Ragtime Mouse quizz and reward script
Unlocking manually a few of the "Hidden Scenes"
Skipping the script that makes Dagger unlearn her summons
Make Mini-Theater Ship obtainable as a key item
Removing Excalibur II time condition manually
Ensure that characters enter the party at level 1
List of animation IDs and who use them
Delay the availability of some chocographs
Manually extracting a Beatrix mod out of Alternate Fantasy
How to mix some of the standard mods
A word about background and walkmeshes
HW format for text file batching
List of Music ID
Bug when making a multi-hit spell animation (PSX)
Adding custom text font (PSX)
Using Memory card saves after modding (PSX)
Fixing "The Collector" Tetra Master bug (PSX)
Change the initial items + hex-hack to give supporting abilities to Beatrix (PSX)
MIPS editing + controlling someone else than Zidane in fields for PSX
Grudge's MIPS spell formula (PSX)
Adding/Replacing 3D Models - buggy (Steam)
Removing (some of) the bubbles appearing when you get close to NPC on Steam
Removing the stat growth of characters (Steam)
Modding Magic Stone growth of characters (Steam)
Modding the stat growth and upper bound of characters (Steam)
Skipping the last two cinematics of the game (Steam)
A few informations about Special Effects models and why they are maybe the most difficult thing to mod (Explanation message - Explanation video)
dnSpy: fixing a bug with weapons floating mid-air at the start of some battles (Steam)
dnSpy: Fixing the descriptions of Carbuncle's and Fenrir's alternate forms (Steam)

//================ BONUS =================//

Simplified Game Scripts

Here are some scripts of systems or mini-games that are of some interest if you wish to know how the game works in-depth.
FFIX Code Folder

Hidden dialogs

Here are some few interesting secret dialogs, never used in the game.
I've also made a patch to enable some of them in-game:
Hidden Dialogs (PSX)
Hidden Dialogs (PC)
And a video showing the patch's content.

Don't hesitate to tell me if you find more unused dialogs: I'll add them to the list ^^

Alexandria [Over the roofs...]
Puck “So, Vivi... Is this your first time in Alexandria?”
Vivi “Uh...  Um...  Yeah. I bought my ticket from a moogle wearing a hat...”
Puck “Bad luck!  If I ever find that moogle, I'll hurt him plenty!”
Vivi “Uh... Thanks...”
Puck “Alright!  Just a little farther 'til we can see the stage!”

Ruined Prima Vista [Steiner's bitterness]
Steiner “Those bastards... If they plan to demand a ransom, they're wasting their time.  I'll see to it that they receive nothing!”
Steiner “Wretched thieves... I'll see them all hanged!”
Steiner “Those bastards... They will never get away with this!”

Dali's Inn [Do you need a reason to kidnap a princess?]
Zidane “Okay, maybe it’s none of my business.”
Zidane “But can’t you at least tell me where you’re going?”
[Later on the cutscene]
Zidane “Oh, it’s only a drag because of Rusty.”

Observatory Mountain [Good and Evil with Grampa Morrid]
Steiner “Alexandria, off course! Burmecia started the war, and we lost our king as a result.”
Morrid “Many wars were fought before the Lindblum Airship Revolution.”
Morrid “Alexandria intiated some of the wars against Burmecia. Now, can you tell me who was right or wrong?”
Steiner “I-I am not talking about the past! I am talking about the future!”
Morrid “What will you do if Alexandria starts a war?”
Steiner “When will the cargo ship arrive!?”

Gizamaluke's Grotto [Entering Burmecia]
Burmecian Soldier “This is the Gizamaluke's Grotto. It is Burmecia's border.”
Burmecian Soldier “No one is allowed inside without the king's permission.”

Qu's Marsh [Quina in apprenticeship]
Qu “Six month already since my disciple left for Alexandria...”
Qu “I wonder how s/he doing...”
Qu “My disciple still far from mastering art of eating.”
Qu “Might never master it...”
[Also, isolated]
Steiner “You still do not have my approval to be with the princess!”

Cleyra [Meeting with the King and the High Priest] translated from japanese by luksy
Freya “It has been some time, Your Majesty.”
King of Burmecia “Ah, Freya, well met.”
King of Burmecia “The High Priest and I welcome you.”
High Priest of Cleyra “My Lady.”
High Priest of Cleyra “It would appear that this predicament no longer concerns Burmecia alone.”
Freya “I understand, Your Holiness.”
Freya “And yet...”
Freya “I fear my strength alone may not suffice.”
King “Freya...I know what troubles you.”
King “I must apologize for earlier.”
King “Can you ever forgive me?”
King “No! off course you cannot.”
King “But the fate of the people of Burmecia now hangs by but a thread.”

Occupied Lindblum Castle [Reaching Cid]
Don't get caught by the enemy!
Jump out when she looks away!
Man “The regent is waiting for you at the Base Level.”
Man “The enemy is busy loading supplies. Go down on the lift, now!”
Man “Once you get on the lift, my comrades will take care of the rest.”
Zidane “So, I just take the lift to the Base Level without getting caught?”
Zidane “Piece o' cake! Leave everything to me.”
Is anybody there...?
A tail?
Oh, it's only a cat...
Zidane (Wow, that was a close one.)
Man “(You idiot!)”
Man “Whatever you do, don't get caught!”
Man “What's wrong? The regent is waiting at the Base Level.”
Man “Go now, or you'll get caught!”
Zidane “I gotta run while she's looking away.”

Occupied Lindblum Castle [The Ancient World Map]
Regent Cid “That is a national treasure of Lindblum!”
Regent Cid “It was passed down through my ancestors, since the days of the first regent.”
Regent Cid “It was probably made before our continent was covered in the Mist...”
Regent Cid “That is an ancient map of the entire world!”

Alexandria [Balloon Mini-game] translated from french by me
Girl “You want to play with us?”
Girl “You've got some time to gather balloons and give them to the boys behind us!”
Girl “You get more time depending on the color of the balloon that you bring.”
Green → 5 more seconds
Yellow → 10 more seconds
Blue → 15 more seconds
Red → 30 more seconds
Girl “All the three of us have a balloon and we are somewhere on the square.”
Girl “Well... Start!”
Boy “X more seconds! You have Y points!”

Final [The 2 worlds' fusion]
The Iifa Tree could not be stopped...
Gaia and Terra's fusion
caused global chaos,
destroying many cities and
taking many lives...

Pages: [1]