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.

Since v6.0 (Steam), Alternate Fantasy must be installed using Memoria's Mod Manager, for the PC version.
§ Alternate Fantasy v6.0 through Memoria §
§ Direct link to Memoria.Patcher.exe (same as above) §

If you are playing the PSX emulated version, use one of these links instead (the mod didn't update since v3.2 on PSX due to console limitations):
§  Alternate Fantasy v3.2 (PSX - US)  §
§  Alternate Fantasy v3.2 (PSX - FR)  §
§  Alternate Fantasy v3.2 (PSX - IT)  §

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, the mod can be downloaded and installed automatically by Memoria's Mod Manager. Below are a couple of screenshots detailing the installation process step by step.

Download and run Memoria.Patcher.exe

Hopefully the patching process goes fine
If your game is not installed in the standard Steam directory, or in a external hard drive, try moving the patcher to your game directory before running it

When launching the game, the "Install Mods" button opens Memoria's Mod Manager

Download "Alternate Fantasy" from the catalog

Don't forget to activate it after installation
In most situations, the Moguri Mod should be moved to the bottom of the list (this is because Moguri Mod packs a couple of assets that are duplicates of the game's default assets; placing it at the bottom has no impact or very small impacts on Moguri's features)

The following is a description of the Steam's latest version (v6.0).
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.

Changes in the abilities

An extended description of each ability can be found in this 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.
• Beatrix has a double-cast Seiken + White Magic trance.
• Quina's trance has changed to Double Blue.
• 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].
• Using a Soft on a stone-type enemy cuts its current HP in half. It deals 1/8 of a boss's current HP against a boss instead [in vanilla, using a Soft on a stone-type enemy immediatly kills it].

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, Cheat Fate (immunes against Doom) and Fidget are added to several characters.
When Fidget is activated, the character changes row everytime s/he attacks.
Bright Eyes, Restore HP, Reflectx2 and Gamble Defence 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.]

Blind makes the target selection unreliable, for both the enemies and the player characters:

In this situation, Garnet is blinded:
- single-targeting Vivi or Zidane is unreliable (either one can be aimed at in the end) because they are both on Garnet's right side,
- single-targeting oneself is reliable,
- single-targeting Quina is reliable because s/he is the only one on Garnet's left side,
- single-targeting any enemy is unreliable (any enemy can be aimed at in the end),
- multi-targeting is reliable.

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].
Silence drastically lowers trance increase.

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 compatible with Albeoris's Memoria Engine Modification tool for the Steam version of the game. When using Hades Workshop with Memoria installed, mods are exported directly as mod folders for that can be identified and enabled by Memoria's mod manager.

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.
  • Moguri Mod (PC): A huge collaborative work, made by Ze_PilOt and Snouz amongst other people. Hades Workshop was used to extract the field backgrounds from the PSX version and re-import them in the PC version after all the work done on them.
  • Trance Seek (PC): A very advanced and ambitious gameplay mod made by DV. From reworking in-depth some aspects of the battle system to adding extra scenes and boss fights, passing through changing Tetra Master into Triple Triad, it completly changes the experience of the game.
  • Alternate Fantasy (PSX/PC): My own mod. It modifies a wide variety of things in the game but mostly focus on the abilities and the gameplay in battles.

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

Also, for the Steam version of the game, make sure to install the Memoria Engine mod and check out its mod catalog.

//============== 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 "Raw Assets".
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)
Making a system for key items that unlock synthesis recipes (Steam - Memoria)

//================ 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 [Unused small chats]
Alleyway Jack “There are 100 types of cards, altogether, but remember, you can only hold 100 cards total.”
Alleyway Jack “Hmm... No can do. I still got work to do.”
Boy “Only nobles are allowed inside the castle, so us commoners hafta watch from the rooftops.”
Dante the Signmaker “Break time!”
Dante the Signmaker “Sure don’t feel like workin’!”
Dante the Signmaker “Well... Time to get back to work!”
Dante the Signmaker “I just finished a day’s work. Save it for later, kid!”
Ruby “There was sumthin’ funny ’bout that girl...”

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!”

Alexandria Castle [Promoting sign for Treno]
§ Treno, Alexandria §
Kingdom’s sole town of freemen.
Home to many nobles.

Prima Vista [Unpopular opinion: bugs are cute]
Garnet “Why does everyone fear these cute little bugs so...?”

Prima Vista [Garnet thinks Zidane plays Marcus] (found by janglingargot)
Zidane “(I-I'm not Marcus!)”
Garnet “(Oh dear, I'm sorry!)”

Ruined Prima Vista [Disastrous crash]
Blank “Sheez... This baby’s never gonna fly again. That’s for sure.”
Cinna “Is the princess alright?”
Blank “What? I thought she was with you!”
Cinna “No! I haven’t seen her!”
Blank “Oh, man. Maybe she got thrown off the ship.”
Blank “I’ll look for her inside the ship. You look outside.”
Cinna “Alright.”

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!”

Ruined Prima Vista [<Whisper, whisper...>]
Steiner “Without your help, saving the princess will be most difficult.”
Steiner “As you know, magic attack is more effective than physical attack against some enemies.”
Vivi “Oh yeah...”
Steiner “With your black magic, can you turn my sword into a magic sword?”
Vivi “What!?”
Steiner “It will add variety to my attack.”

Evil Forest [Blank's better acuity]
Blank “Zidane, go!”
Blank “Hey, Zidane...”
Blank “You hear that...?”
Zidane “...Something’s coming.”
Zidane “Let’s go! We’re gonna get surrounded!”

Ice Cavern [Quan's wisdom]
Vivi “My grandpa was the one who told me to go out and see the world.”

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!?”

Lindblum Castle [Cargo Ship lore]
Student Engineer “Today, airships are used for all kinds of things. Long ago, they were used only for transporting cargo.”
Student Engineer “This cargo ship was built a long time ago by Regent Cid and Dr. Zebolt.”

Lindblum [Air Cab lore]
Attendant “The air cab is like a mini airship. The regent himself designed it.”
Attendant “It flies to the Theater District and the Industrial District in a matter of seconds.”
Attendant “Convenient, isn’t it?”

Lindblum [Preparing for the Hunt]
Zidane “Oh yeah! Today’s the Festival of the Hunt! I’m gonna win this year for sure!”
Zidane “I’d better buy some stuff.”

Lindblum Castle [Participants are numbered]
“You all have different starting points.”
Elite Guard “Zidane, Hunter No. 4. You will start in the Theater District.”
Elite Guard “Freya, Hunter No. 9. Your starting point will be the Industrial District.”
Elite Guard “Vivi, Hunter No. 2. You’ll start hunting in the Business District.”
Steiner “Master Vivi! No matter what happens, you must not lose to him!”

Lindblum [Wimpy bragger]
Wimpy Guy “I was watching the hunting festival. You sucked pretty bad.”
Wimpy Guy “I could’ve easily scored 500 points <hack-hack>!”

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 [Mene the knowledgeable]
Howdy! I’m Mene!
I’m just another moogle who’s wandered all over the world─you know...been there, done that.
I’ve battled monsters the size of mountains...
...discovered very rare chocobos...
...and explored forbidden dungeons in search of treasures.
Those were the good old days...
I know pretty much everything there is to know about the world.
So, if you have any questions, feel free to ask me.
Hey, what’s up?

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!”

South Gate [There's only one man I call 'Bro']
Marcus “You already forgot? He got petrified in Evil Forest!”

Treno [A card tournament on the first visit?]
Card Game Usher “There’s a tournament going on right now! You must first register at the booth to your left!”

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.”

Cleyra [Tantalus play in Cleyra?!] translated from french by me
“Tonight, for the first time in a while, we will see the play of the Tantalus.”
“I'm looking forward to it!”
“Are you going too?”

Alexandria Castle [The "good" Jesters] translated from french by me
Zorn “Princess, we don't mean any harm.”
Thorn “That's because...”

Occupied Lindblum Castle [Royal funds]
Received 1 Million Gil!
Bring the item I asked for.

Occupied Lindblum [More reactions to the seizing of the city]
Alexandrian Soldier “The air cab will soon be under our control.”
Lindblum Soldier “I can’t believe we lost against soulless dolls...”
Alexandrian Soldier “War is hell. I just wanna go home...”
Alexandrian Soldier “I can’t follow the queen anymore...”
Alexandrian Soldier “Alexandria is invincible as long as we possess the black mage soldiers and our eidolon!”
Alexandrian Soldier “We took Lindblum in just one night!”
Alexandrian Soldier “Don’t you dare resist us if you wanna live.”
Soldier “We should’ve killed Brahne when we had the chance!”
Zidane “Even the air cabs got shot down...”

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!”

Occupied Lindblum Castle [News reach the Dragon's Gate]
Merchant “What now?”
Merchant “What!? Lindblum got invaded!? Oh man!”
Merchant “I’m gonna have even less business now!”
Merchant “I’ll be here for a while. Come back if you need anything.”

Iifa Tree [Alternative fighting call against Soulcage]
Zidane “Shut up! You’re through!”
Zidane “Vivi, Don’t think, just fight!”

Madain Sari [The surprise attack with Mog]
Zidane “I’m gonna surprise her. Then, she’ll be all ours. Just leave it to me, okay?”
Zidane “You understand what I’m saying, right? Eiko needs help!”
Morrison “Mog! They need you, kupo!”
[Later on...]
Lani “Trying to distract me? No go, joe. I’m havin’ a great day.”
Zidane (Time to get it on!)
Lani “Stop dilly-dallying!”

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!”

Lindblum [A smith and his apprentice]
Torres “Wayne saved me during the attack on Lindblum.”
Torres “Maybe it’s time for me to retire...”
Torres “He is so humble!”

Lindblum [A card master and his apprentice]
Card Freak “It’s hard, ’cause you don’t wanna lose rare cards, but that’s the only way to get better at it!”
Card Boy “I wanna get better!”
Card Freak “I’ll think about it after I beat this guy with the tail.”
You jerk!

Lindblum Castle [Toxic working conditions]
Soldier “Watching the dull, heavy Mist really gets me down.”
Soldier “Oh, I hate my job.”

Oeilvert [Doppelgänger extra lines]
Zidane: How have you been? | I’m gonna mug you! | Do you like my tail?
Vivi: I don’t like magic barriers. | That’s enough! | Stop! You’re hurting me!
Garnet: I’m sixteen, a full-grown woman. | Do you know who I am? | I want to use White Magic.
Steiner: I shall not forgive you! | Hey! Hey!!! | I will go!
Freya: Wanna go out with me? | What are you doing here? | I must buy a new spear.
Quina: You taste delicious? | Ouch! I bite my tongue. | This fork too heavy!
Eiko: I’m bored of moogles. | Isn’t my horn the cutest? | I wanna summon!
Amarant: No one understands... | This is silly... | Darn it...

Mount Gulug [Rumbling]
Kuja “Ah, Garland... He sure threw a wrench into my plans.”
[During the extraction]
Zorn “Come forth!”
Thorn “Odin, demon of the dark!”
[After the extraction failed]
Zorn “We will double our efforts!”
Thorn “Double our efforts, we will!”

Mount Gulug [Comprehensive lady Hilda]
[After noticing Cid's moustache]
Hilda “Forgive me, my darling. I failed to notice.”
[After Eiko says she's gonna make Kuja pay]
Hilda “Oh, so this fine young lady wishes to avenge my honor?”

Bran Bal [Bio engineering subtleties]
So the souls of Terra may begin a balanced cycle, it was necessary to preset age, the amount of time before the body fails.
Gravity on Terra and Gaia is identical so that our ambulation senses may apply.

Final [Impossible love] partly translated from french by me
[When Blank plots behind the stairs]
Blank “Forgive me, Marcus, for thy dear love will not see thee at the docks.”
Marcus “Dawn comes anon.”
Cinna “She who you waited for is not here?”
[After "She told me that she could not live without me."]
Marcus “But for that reason a war will break out and many lives will be lost...”

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]