Skip to content

Creating A New Character

WarpedEdge edited this page Dec 16, 2024 · 25 revisions

Note: This guide walks through creating a character and playing Vanilla. If you want to make your character compatible with other mods that add character's you will need to work with other modders.

Pre-Requisites

  1. Allowing Model Exports
  2. Enabling AllCharacterAvailable under [Hacks] in Memoria.ini
  3. Numpad (For Model Viewer)

Creating the folder structure

Please follow Creating and publishing a mod down to the description. You do not have to publish your mod but at least make the structure it requires to be read from Memoria. For now, create the following structure inside of your FFIX folder:

MyMod/
├── DictionaryPatch.txt
├── ModDescription.xml

Creating the Character

Hades Workshop Part 1

First, pick a character you would like to make playable and then find the character you would like that one to imitate. In this example I will be using Haagen who will be imitating Blank. Launch HadesWorkshop and go to the Party -> Stats section

PartyStat

Make note the last ID is for Beatrix which is 11. Right Click on Blank and select Add. Base refers to what base model you want to copy, and the ID is for how the character will be recognized which here is 12. You can change the Default Name if you would like, but it will be later defined in the DictionaryPatch.txt. Set some commands and initial equipment for the character to use, and make sure to add those items also to the Equipments section so the character can actually use them.

Advanced Parameters

Select the Change Advanced Parameters and you will see the setup Blank has, has been copied over to this new section. For now change the Model and Trance Model to Pluto KnightA which is Haagen then hit okay, then relaunch the Change Advanced Parameters. You will see the Battle Animations on the right is empty. In the image below there are several fields we have to adjust.

ChangeAdvancedParameters

Name Keyword: HAGN <--- This can be whatever you want it to

Avatar Sprite: face13 <--- Best to choose the latest (12 is used by beatrix) or any higher number

No Trance: 🔲 or <--- Up to you

Trance Color: 255 160 128 <--- Uses RGB that you can make from https://encycolorpedia.com/ Color Space Conversions section

Attack Sequence: 116 <--- Uses the ef116 folder for the given character (helpful especially for garnet Racket due to less animations on attack) refer to Battle SFX Sequence here for more information

Attack Sounds: 902 63 <--- Replicates the sound for when Blank hits the target

Weapon Bone: 14 <--- Where the weapon will be equipped to (later in Model Viewer section)

Status Icons: 5 sets of 3 <--- Uses the face bone for where the status will overlay

Battle Animations: ____ <--- Set these to random animations the model should have, just make sure every slot is filled or the game will crash/soft lock

Once set, hit okay go to File -> Save Mod and save it on your desktop for example as MyMod_v1. Every time we go back and save this mod again append a letter to it like a, then b, etc. until the finished product (helps so if it corrupts you just open the last prev working one).

Next save again as a Steam Mod, browse to MyMod in the FFIX folder and keep the options Spreadsheets (Memoria) and Raw Assets. If you happen to get an error about ItemEquipPatch.txt, in HWS go to Inventory and change for example Hammer description to remove the period and re-add it, then try saving again.

Your MyMod should now look like this

MyMod
├── FF9_Data
├── StreamingAssets
├── DictionaryPatch.txt
└── ModDescription.xml

Face Atlas

Next is to create the Atlas directory where we will need to grab the Face Atlas file and Face Atlas.tpsheet (Easy one to grab is from the PlayableCharacterPack mod).

Portrait size is 132x190 (For this put the Picture over the first one) and in the tpsheet if using the PCP mod it already will be set to face13.

MyMod
├── FF9_Data
│   └── embeddedasset
│       └── UI
│           └── Atlas
│               ├── Face Atlas
│               └── Face Atlas.tpsheet
├── StreamingAssets
├── DictionaryPatch.txt
└── ModDescription.xml

Dictionary Patch Part 1

In your DictionaryPatch.txt add the following lines and save it.

CharacterDefaultName 12 US Haagen
CharacterDefaultName 12 UK Haagen
CharacterDefaultName 12 JP Haagen
CharacterDefaultName 12 GR Haagen
CharacterDefaultName 12 FR Haagen
CharacterDefaultName 12 IT Haagen
CharacterDefaultName 12 ES Haagen

Enable your mod and when you load into your save and either go into Form Party in the menu or hit Alt + F2 you should see the character appear.

Model Viewer Part 1

  1. Launch FF9_Launcher.exe
  2. Select Advanced then Model Viewer

Model Viewer

  1. Find your two models
Haagen (Pluto Knight)
Category: ACTORS
Model#: 25/43
Model Name: GEO_SUB_F0_SSB
AnimationFolder: (5488)

Blank
Category: ACTORS (MAIN)
Model#: 16/83
Model Name: GEO_MAIN_B0_015
AnimationFolder: (42)
  1. On Haagen's model Anim 1/24 (T-Pose), Press B to show the bones and zoom in/out to where you can see all the bones properly and take a screenshot for later use, then press E and your Text Editor should open providing you with the Bone hierarchy and the ExportPath

ExportAnim

  1. Make sure to copy the Bone hierarchy to a separate notepad with the characters name; Do the same with Blank (T-Pose) and then add a final section called Haagen into Blank with Blank's Bone hierarchy there as well. In the end it should look like below:

BoneStructure

Identifying Bones

The next step is to now identify the bones. If you read carefully the paths of both Haagen and Blank's bones, they seem to be going deeper into a path like how you do with folder structures. Now look at each of their bones in the screenshots you took before and you see they have a pattern. For Example

bone000/bone001/bone002
bone000/bone001/bone002/bone003
bone000/bone001/bone002/bone003/bone004
bone000/bone001/bone002/bone003/bone004/bone005

These lead up to Haagen's left arm. For Blank

bone000/bone001/bone005
bone000/bone001/bone005/bone006
bone000/bone001/bone005/bone006/bone007
bone000/bone001/bone005/bone006/bone007/bone008 
bone000/bone001/bone005/bone006/bone007/bone008/bone009 

He has more bones but ultimately it also leads to his left arm. We will talk more about extra bones later.

Models

It is good to then label the sections of where the Left Arm, Right Arm, Left Leg, Right Leg, and Head ends for each character. Some characters also have additional bones, like weapon bones, Zidane's Tail, Garnets' Ponytail and/or Pendant. for Blank and a lot of main cast characters, he also has weapon bones bone009 & bone014 and a head bone bone004. Example below of Labeling the bones.

BoneStructureLabeled

What is next is to copy over the same paths of Haagen's bones into Blank'. For example Haagen's bone path for his Right Arm needs to be pasted over the same path as Blank' Right Arm, but since Blank' Right Arm has 5 paths starting at bone002 to the ending bone006 compared to Haagen's 4 paths starting at bone008 to the ending bone011 we will need to delete 1 lines from there, keeping the line breaks in there (This is very important). What you end up with is below. The reason why blank line breaks are needed are to follow the same path, but you are telling Haagen to not use that bone path. Deleting the line break will warp results.

BoneStructureModified

Exporting the Animation & Configuring the DictionaryPatch

Create the folder structure below using the Animation folder specified earlier

MyMod/
├── FF9_Data/
│   ├── embeddedasset/
│   │   ├── UI/
│   │   │   ├── Atlas/
│   │   │   │   ├── Face Atlas
│   │   │   │   └── Face Atlas.tpsheet
├── StreamingAssets/
│   ├── Assets/
│   │   ├── Resources/
│   │   │   ├── Animations/
│   │   │   │   └── 5488/
├── DictionaryPatch.txt
├── ModDescription.xml

For the DictionaryPatch.txt We will be using the template below. Please NOTE the 3DModelAnimation lines are only to view them in the model viewer

CharacterDefaultName {ID} US {Name}
CharacterDefaultName {ID} UK {Name}
CharacterDefaultName {ID} JP {Name}
CharacterDefaultName {ID} GR {Name}
CharacterDefaultName {ID} FR {Name}
CharacterDefaultName {ID} IT {Name}
CharacterDefaultName {ID} ES {Name}

3DModelAnimation {Anim#} {ModelName}_BTL_IDLE
3DModelAnimation {Anim#} {ModelName}_BTL_STAND_READY
3DModelAnimation {Anim#} {ModelName}_BTL_STAND_WEAK
3DModelAnimation {Anim#} {ModelName}_BTL_READY_STAND
3DModelAnimation {Anim#} {ModelName}_BTL_IDLEREADY
3DModelAnimation {Anim#} {ModelName}_BTL_WEAK_STAND
3DModelAnimation {Anim#} {ModelName}_BTL_WEAK_READY
3DModelAnimation {Anim#} {ModelName}_BTL_IDLEWEAK
3DModelAnimation {Anim#} {ModelName}_BTL_WEAK_KO
3DModelAnimation {Anim#} {ModelName}_BTL_KO_WEAK
3DModelAnimation {Anim#} {ModelName}_BTL_IDLEKO
3DModelAnimation {Anim#} {ModelName}_BTL_MOVEFORWARD
3DModelAnimation {Anim#} {ModelName}_BTL_MOVEBACKWARD
3DModelAnimation {Anim#} {ModelName}_BTL_READY_ATTACK
3DModelAnimation {Anim#} {ModelName}_BTL_ATTACKRUN
3DModelAnimation {Anim#} {ModelName}_BTL_ATTACK1
3DModelAnimation {Anim#} {ModelName}_BTL_ATTACK2
3DModelAnimation {Anim#} {ModelName}_BTL_JUMPBACK1
3DModelAnimation {Anim#} {ModelName}_BTL_JUMPBACK2
3DModelAnimation {Anim#} {ModelName}_BTL_READY_CAST
3DModelAnimation {Anim#} {ModelName}_BTL_IDLE_CAST
3DModelAnimation {Anim#} {ModelName}_BTL_CAST_STAND
3DModelAnimation {Anim#} {ModelName}_BTL_ITEM
3DModelAnimation {Anim#} {ModelName}_BTL_HIT
3DModelAnimation {Anim#} {ModelName}_BTL_HITSTRONG
3DModelAnimation {Anim#} {ModelName}_BTL_READY_DEFEND
3DModelAnimation {Anim#} {ModelName}_BTL_IDLEDEFEND
3DModelAnimation {Anim#} {ModelName}_BTL_DEFEND_STAND
3DModelAnimation {Anim#} {ModelName}_BTL_COVER
3DModelAnimation {Anim#} {ModelName}_BTL_DODGE
3DModelAnimation {Anim#} {ModelName}_BTL_FLEE
3DModelAnimation {Anim#} {ModelName}_BTL_VICTORY
3DModelAnimation {Anim#} {ModelName}_BTL_VICTORYLOOP
3DModelAnimation {Anim#} {ModelName}_BTL_SPECIAL_CAST

This order of Animation follows Hades Workshop's order to avoid confusion (seen earlier). Let's start with one animation and confirm everything works, the 3DModelAnimation {Anim#} {ModelName}_BTL_IDLE which is stance the character will have in battle. (You can name it BTL_*** whatever you want)

Relaunch Model Viewer and go to Blank model again and find his idle battle stance you would see in game which is ANH_MAIN_B0_015_000 and Press E which should open your text editor with his bone hierarchy like we did earlier, except this time we want to take our new bone pattern that we did earlier and paste it over his bones and also change the Export path to our new location. Be sure to change the animation to something that you can understand. For example, ANH_SUB_F0_SSB_BTL_ATKTONORMAL.anim or ANH_SUB_F0_SSB_BTL_JUMPBACK2.anim

ExportAnimModified

Save the file, then go back to the model viewer and press E again and it should save the animation file to the location MyMod\StreamingAssets\Assets\Resources\Animations\5488\25466.anim. You then open your DictionaryPatch.txt file and adjust 3DModelAnimation {Anim#} {ModelName}_BTL_IDLE to 3DModelAnimation 25466 ANH_SUB_F0_SSB_BTL_IDLE and save; you will then be able to see it in the model viewer.

Hades Workshop Part 2

Re-open your mod in HWS and go to Haagen's Change Advanced Parameters. Add the ANH_SUB_F0_SSB_BTL_IDLE into the field where Stand is and hit Ok. Save as a "Steam Mod" again and confirm in battle that your character is now copying Blank's animation. Now repeat those steps for each animation. Don't forget to also change the weapon bone to the correct position Bone011 and adjust the Status Icons from 3 to 7 (Haagen's face). All that is left is to now set the weapon to the proper location

Model Viewer Part 2

Due to the 3DModelAnimation added in the DictionaryPatch.txt, you should see the new animations appear for Haagen. Refer to the Model Viewer Wiki for keyboard shortcuts. When getting the weapon to the proper placement, on your NUMPAD (Not the top row keys), press 5 and inside your memoria.log should appear the weapon position which looks something like this:

29.11.2024 08:34:57 |M| [WEAPON] GEO_WEP_B1_027.offset = (-10.200000000, -10.600000000, 31.000000000, 285.076600000, 113.683500000, 244.101400000)

Position: -10.200000000, -10.600000000, 31.000000000

Rotation: 285.076600000, 113.683500000, 244.101400000

We need to set these coordinates in your MyMod/StreamingAssets/Data/Characters/BattleParameters.csv which should originally look like this:

#! IncludeWeaponSound
# This file define battle parameters of characters.
# -----------------------------------------------
# Id;AvatarSprite;ModelId;TranceModelId;TranceGlowingColor;MP_IDLE_NORMAL;MP_IDLE_DYING;MP_DAMAGE1;MP_DAMAGE2;MP_DISABLE;MP_GET_UP_DYING;MP_GET_UP_DISABLE;MP_DOWN_DYING;MP_DOWN_DISABLE;MP_IDLE_CMD;MP_NORMAL_TO_CMD;MP_DYING_TO_CMD;MP_IDLE_TO_DEF;MP_DEFENCE;MP_DEF_TO_IDLE;MP_COVER;MP_AVOID;MP_ESCAPE;MP_WIN;MP_WIN_LOOP;MP_SET;MP_RUN;MP_RUN_TO_ATTACK;MP_ATTACK;MP_BACK;MP_ATK_TO_NORMAL;MP_IDLE_TO_CHANT;MP_CHANT;MP_MAGIC;MP_STEP_FORWARD;MP_STEP_BACK;MP_ITEM1;MP_CMD_TO_NORMAL;MP_SPECIAL;AttackSequence;WeaponBone;ShadowData;StatusBones;StatusOffsetsY;StatusOffsetsZ;WeaponSounds
# Int32;String;String;String;UInt8[];String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;Int32;UInt8;UInt8[];UInt8[];Int8[];Int8[];Int32[]
# -----------------------------------------------
19;face13;GEO_SUB_F0_SSB;GEO_SUB_F0_SSB;255, 160, 128;ANH_SUB_F0_SSB_BTL_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_RUN;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;116;14;16, 20, 140, 144, 0;3, 3, 3, 3, 3, 1;-12, 0, -8, -2, -8, -19;-1, -1, -8, -8, -5, 0;902, 63;# Custom battle parameters 19

What needs to be added is the #! IncludeWeaponOffsets field, 1, 1, 1; at the end of the line (this is for the scaling of the weapon), then finally after the coordinates -10.200000000, -10.600000000, 31.000000000; 285.076600000, 113.683500000, 244.101400000; with the end result being:

#! IncludeWeaponSound
# This file define battle parameters of characters.
# -----------------------------------------------
# Id;AvatarSprite;ModelId;TranceModelId;TranceGlowingColor;MP_IDLE_NORMAL;MP_IDLE_DYING;MP_DAMAGE1;MP_DAMAGE2;MP_DISABLE;MP_GET_UP_DYING;MP_GET_UP_DISABLE;MP_DOWN_DYING;MP_DOWN_DISABLE;MP_IDLE_CMD;MP_NORMAL_TO_CMD;MP_DYING_TO_CMD;MP_IDLE_TO_DEF;MP_DEFENCE;MP_DEF_TO_IDLE;MP_COVER;MP_AVOID;MP_ESCAPE;MP_WIN;MP_WIN_LOOP;MP_SET;MP_RUN;MP_RUN_TO_ATTACK;MP_ATTACK;MP_BACK;MP_ATK_TO_NORMAL;MP_IDLE_TO_CHANT;MP_CHANT;MP_MAGIC;MP_STEP_FORWARD;MP_STEP_BACK;MP_ITEM1;MP_CMD_TO_NORMAL;MP_SPECIAL;AttackSequence;WeaponBone;ShadowData;StatusBones;StatusOffsetsY;StatusOffsetsZ;WeaponSounds
# Int32;String;String;String;UInt8[];String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;String;Int32;UInt8;UInt8[];UInt8[];Int8[];Int8[];Int32[]
# -----------------------------------------------
#! IncludeWeaponOffsets
19;face13;GEO_SUB_F0_SSB;GEO_SUB_F0_SSB;255, 160, 128;ANH_SUB_F0_SSB_BTL_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_RUN;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;ANH_SUB_F0_SSB_IDLE;116;14;16, 20, 140, 144, 0;3, 3, 3, 3, 3, 1;-12, 0, -8, -2, -8, -19;-1, -1, -8, -8, -5, 0;902, 63;1, 1, 1;-10.200000000, -10.600000000, 31.000000000; 285.076600000, 113.683500000, 244.101400000;# Custom battle parameters 19

That should be it. Your character is now playable.

IMPORTANT NOTE: Because Hades Workshop does not have the option to put in weapon offsets yet, every time you use Save Steam Mod it will overwrite your BattleParameters.csv, so make sure to have the adjustments saved as a backup.

Resources