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

  • Thread starter Thread starter Tirlititi
  • Start date Start date
Status
Not open for further replies.
I hope he's still working on it. I'm waiting the steam version of HW sooo much.
He might have some life things to do, so I'll be patient. Doing the same stuff for long periods of time will burn out a person. So I completely understand.

He will come back to it eventually sometime.
 
Actually, I do have an important work to do in the following month and I neglected it too much, so I won't work on HW for some time (unless there's a incredibly bad bug that can be fixed without too much effort).

Also, I lost my magic stick that makes modding games a piece o' cake  :'(

I let another WIP here, more interesting though, cause you can mod a bunch of things with it. I call it a beta release, because there will be much more bugs than usual.

Link removed ; the program has been updated in the first post

Special Warnings

  • I'm not sure that you can open modded versions of the game. I only know for sure that it's not compatible with Albeoris's Memoria (maybe applying Memoria after HW mods would work, but not the other way around).
  • You can't export your mod informations into .hws files as for the PSX version (it will come next though). That means there's no guarantee that you can create a mod, close the program and come back editing it, since I'm not sure HW will correctly read your modded game. You can try though.
  • The program creates no backup. You must create them yourself. More infos in the Save Instructions below.
  • You can't modify texts or Cards, only read them.
  • You can't modify the Battle Scenes in the "Enemies" panel, and they display wrong.
  • Editing things in the "Regular Items" and in the party's "Stats" panels will most likely make your game unplayable. Avoid it.
  • Modifying the game script's size strangely makes the game unplayable as well. Modifying the arguments of functions, such as "SetPartyReserve", should be fine, but don't add/remove lines of code. Remember the scripts are language-dependant.
  • The features under the menus "Batch" and "Tools" will likely bug.
  • I have absolutely no idea of how the PSX file edition fares... Safest plan for it is to use the last version of HW.

Everything else should work fine, unless it is disabled, like MIPS code edition. Also, contrary to the last WIP, it should still work after a SquareEnix update.

Saving Instructions
As said, you have to backup your files yourself. The program reads a "FF9_Launcher.exe" file and ask you a folder where you want to save your modded files. In any case, never choose the folder in which the selected "FF9_Launcher.exe" lies, either create a new folder either save it in a folder containing another "FF9_Launcher.exe".

Here are the 2 safest possible choices :
1) Start by creating a backup of your "FINAL FANTASY IX" folder. When you use HW, only open the backup files and choose the non-backup "FINAL FANTASY IX" folder when you save (it's important that you keep that default name). As that's the game launched by Steam, you'll have your game directly modded.
2) Start by creating a backup of your "FINAL FANTASY IX" folder and use that backup for HW, but create a new folder somewhere else for the saving. To apply the mod, you need to replace manually the files in the "FINAL FANTASY IX" folder by the modded ones.

In any case, a 3rd backup is not a bad idea, unless you don't mind downloading the game again in case of problems.

For the wisest of you, I'll see you when I release a stable version  :P
 
Last edited:
Heeey nice move there Tir, That should keep people composed awhile on the wait. Sorry to hear you lost your magic stick, hopefully you find it.  Thank's for the beta release and your time. Can't wait to see it evolve in the future.
 
Good job! Do you change Assembly-CSharp.dll? If you don't - yes, you can apply Memoria after HW. But items and abilities data will be loaded from external CSV-tables. Otherwise, you get a checksum error.
Any ideas about integration? (:
https://github.com/Albeoris/Memoria
 
Tirlititi i can't figure out scripts. I took a look and couldn't find Starting inventory in Cargo Room/Prima Vista's script. can you show me what it looks like? it looks too much like code to me. i wish it were menu driven, but oh! well!  Finally, You said before that changing starting equips, makes the game glitch up. Is this true for psx or just steam. Now REALLY finally, can Blank,Cinna, & Marcus be given Beatrix's moveset? and Beatrix's moveset be given support abilities? Heck! even the equip ability option be enabled for her?
 
All of what you said is possible, even making their movesets completely customizable, except marcus bugs at treno with garnet. Problem is, as far as I know on HW I cannot get the equip for beatrix or the other 3 to be available and all skills are automatically learned..That is what I have ran into and I have no fix to it.
 
oh? Marcus bugs? I can do without starting equips and custom abilities, then. Forget that! Now I wanna have a few items available from the beginning in inventory. Can you help. Tirlititi told me it's in the script, for Cargo Room/Prima Vista.
 
Last edited:
I didn't say it was in the script (it's not). I said that it was easy to write lines in the code to replace them :
Code: [Select]
Code:
    RemoveItem( 236, 7 )    RemoveItem( 237, 2 )    RemoveItem( 238, 2 )    RemoveItem( 240, 2 )    RemoveItem( 247, 2 )    RemoveItem( 249, 1 )    RemoveItem( 253, 1 )    AddItem( .... )
Put them in the main function of the first Prima Vista's Cargo Room, it's fine (out of any "if" block).

The starting equipements are in the "Party -> Stats" panel, search harder :p

As for temporary characters' abilities, uzoko stated the problem : the game doesn't allow the Supporting Abilities menu to be enabled for temporary characters. A fix for that would require to modify the equip menu's MIPS code (which is not accessible using HW yet).

Here is the fix to have Beatrix & co equip supporting abilities using an hex-editor :
1) Search for the hexadecimal sequence : 00 00 00 00 01 00 42 2c 21 28 40 00 21 20 80 02
2) The following bytes should be something like 8c d2 00 0c     (the 00 0c is important ; the 8c d2 is an offset and changes from disc to disc)
3) Replace those 4 bytes by 01 00 02 20
4) Repeat for all the discs

This allows all temporary characters to get in their "Equip Abilities" menu. However, they still automatically learn any supporting abilities you give to them (I think you'd have to corrupt the memory card saving process to fix that). Also, a few tooltips will be wrong in-game (when you press "Select" on the "Equip Abilities", the moogle tells you that you can't use them ; and the 3-stars mastery icon is not displayed on supporting abilities).
 
Thanks, Now i saw something about how if one were to link Dagger's Eidolons & Beatrix's Seiken, one would get 12 free slots to put spells anywhere? is this still true?
Here's the quote:
- Commands spell lists are also limited. You may link 2 commands to increase the limit (they would share the same spells). White Magic and White Magic+ are linked by default, as well as Black Magic and Black Magic+ but you can link Dagger's eidolons (trance and normal) and the 2 Beatrix Seikens (dunno why there is 2 of them) so you win 12 spells to put anywhere for free.
 
Last edited:
[...] you can link Dagger's eidolons (trance and normal) and the 2 Beatrix Seikens (dunno why there is 2 of them) [...]
How many commands am I describing here?

No, linking Dagger's commands with Beatrix's commands is not a good idea. And yes, what I said about linking Dagger's summoning commands together and linking Beatrix's Seikens together to gain 12 spell slots still holds.
 
Hey any updates on HW for steam? I have been trying to work with Alberos on his thing, but I love your layout much better haha.
 
there is a special issue for stream HadesWorkshop_beta But the problem if you ran the program then the program shut down Then if you tried to open the game ff9  through a program HadesWorkshop_beta will not be able Except If deleted a file (hwf) and here download hades work shop beta for stream    https://www.ff7catalog.com/posts/174321/
 
This is the day !

Update to v0.34 :
 - Hades Workshop is now compatible with the Steam version of the game.

You can also use the .hws files created by HW for a PSX file and apply it to the Steam version.

Pretty much everything has been tested and works fine. However, there are the following limitations :
 - MIPS code and Battle Scenes models can't be modified,
- The battle scene of the different battles can't be changed,
 - Text opcodes are displayed raw ; that's not so different from the text tags you can find in any forum,
 - The texts may be imported from a .hws file created for the PSX version, but that's not recommended as the opcodes are not handled,
 - The fields' preloading datas are not the same as for the PSX and can't be imported,
 - Contrary to the PSX version, the spell lists in the "Command" and the "Stats" panels must match (if a character has a command, he must be able to learn all the spells inside it). The exceptions are the temporary characters' commands and Steiner's Sword Magic which don't need to be learnable,
 - The two unused item shops can't be used for now,
 - There's some bug with the fields : I think that's a RAM problem, as fields need a lot of memory to be read. If you look at too many fields without closing/reopening the program, it will likely crash. Same problem for the background batching : you shouldn't be able to export all the background images in one shot.

I write the saving instructions again as they are still valid.

Saving Instructions
You have to backup your files yourself. The program asks for the "FF9_Launcher.exe" file when opening the game, and then for a folder where you want to save your modded files. In any case, never choose the folder in which the selected "FF9_Launcher.exe" lies, either create a new folder either save it in a folder containing another "FF9_Launcher.exe".

The files created this way are intended to replace the files in the sub-folders of your "FINAL FANTASY IX" folder.

Here are the 2 safest possible choices :
1) Start by creating a backup of your "FINAL FANTASY IX" folder. When you use HW, only open the backup files and choose the non-backup "FINAL FANTASY IX" folder when you save (it's important that you keep that default name). As that's the game launched by Steam, you'll have your game directly modded.
2) Start by creating a backup of your "FINAL FANTASY IX" folder and use that backup for HW, but create a new folder somewhere else for the saving. To apply the mod, you need to replace manually the files in the "FINAL FANTASY IX" folder by the modded ones.

In any case, a 3rd backup is not a bad idea, unless you don't mind downloading the game again in case of problems.

About texts
The support for texts (in the Steam version) is quiet minimal, as the formatting is displayed as it is in the game's files. In particular, you have to write the size of the text box yourself in the 【STRT】 tag when needed, as well as the hexadecimal code to add color, etc...
As said, you shouldn't import the texts from PSX-saved .hws (just unckeck the related boxes), as only the text will be imported and the opcodes will be lost. This is particulary important for text blocks as the game bugs if the texts there don't start by the 【STRT】 tag.

The text preview window doesn't display the opcodes' effect either for now.

Also, there's a special UI text block, called "Localization", which contains generic texts of all the languages available. I let you guess how to properly modify them, but know only that the texts here must be single-line (use the escape character '\n' if you want to add a new line). Also, the format is so easy that the devs themselves messed up with it and there are a few help texts that don't work the intended way :p (I'm thinking of the "OrderTargetHelp" field, which doesn't work in languages other than english and japanese).

About localization
You're asked to choose language when you open the game files. In general, your mod will work only for the chosen language.
More precisely, there are files that are shared by all the languages and files that are not. In this second category, there are all the texts, off course, but also the game's script (AI of enemies, World Map scripts and Field scripts). If you either change a text or a script, it will be ok only for the chosen language.

Handling several languages at once will surely be possible in the future.


What's next?
I'll upload the program's source code on github and create a community project for that. I'll also import my mod Alternate Fantasy to Steam. Don't hesitate to ask if you have troubles importing your own mod to Steam.

I also have a project idea of a Boss-rush mode. It's an idea I've had since a long time, but the 4 discs of the PSX and the preloading system was problematic.

I'll also soon improve a bit the script editor (again) and allow to add entries (and not just functions) ; you'll then have full control over the NPC and so a real mod including Beatrix as a playable character (consistent story-wise) will become possible.
A CIL code editor, similar to the MIPS editor, is also planned. I don't think I'll implement a "CIL <-> C Sharp" converter, but since there are other tools doing that, it'll undoubtly be more simple and more efficient to use.

Fiou, I think I said everything I wanted... Enjoy and see you soon !  8)

EDIT : I forgot to say that there's no check about the file access rights. Verify that HW has the write to read and/or write the files you're manipulating with it or it may crash (or worse, it may bug without telling you anything !).
 
Last edited:
Thank you very much for your job, Tirlitity!!!!!

I have a questions. Are limitations still works? I mean 192 spells total and 48 ability slots for one character or now we can exceed them?
 
The limitations of texts, scripts, number of enemy attacks or groups are no more.
The others are still there. The ones you're talking about are hardcoded in the game, and I mean really hard coded. It would require to rewrite a big part of the game's engine and the game's script to change these numbers. I don't think that'll ever be possible :/
 
I'm very glad that it works very well even in thai language.

A big thanks to you. :)
 
You're welcome, Gine :)

Update to v0.34b :
- Fixed the crash that occured sometimes when you are writing texts or when you use incomplete tags,
- Fixed a bug with the .hws saving of item texts, resulting in loss of data inside the .hws,
- Fixed a crash when editing the preferences (they are not useful for the Steam version yet however),
- Fixed various other minor bug,
- You can now add/remove script entries, thus NPC on the field.

When adding/removing entries, the script will be updated so that functions still refer to the right entries. If an entry is deleted but was still used in the script (if it was initialized in the "Main" function, for instance), the reference changes to the "Main" entry and a warning will be prompted.

So, how do you handle NPCs and the PC with this?

A model on the field is linked to an entry. I will only discuss of the case when there is only 1 model per entry, but using the UID, one can have several models on the field handled by only one entry.
An entry linked to a model must be of type 2 and initialized with an "InitObject" call in the main function.

To create a new NPC (not for Beatrix, see below), you must create a new entry for it. In the field panel, choose "Edit Entries" and add a new one with the entry type 2. By default, the created entry will have the ID number 1 (and the entries that were already there are displaced except for the Main entry). Its ID is its position in the list.

Then, to create functions for this NPC, choose "Edit Script", right-click on the list in the left, then "Add", then choose the created entry and set the function type to a number depending on the function's purpose (let the mouse on the "Function Type" field to have a list of specially handled function types).

It can have several useful functions.
1) The Init function
This is the one defining the object's 3D model as well as its position on the field, animations and such... A standard Init function looks like this for an object's entry :
Code: [Select]
Code:
Function ManA_Init    set VAR_B10_0 = 58    set VAR_B10_4 = 65163    set VAR_B10_6 = 192    set VAR_B10_2 = 65518    SetModel( 111, 100 )    CreateObject( VAR_B10_0, VAR_B10_4 )    TurnInstant( VAR_B10_6 )    SetStandAnimation( 555 )    SetWalkAnimation( 599 )    SetRunAnimation( 598 )    SetLeftAnimation( 597 )    SetRightAnimation( 601 )    SetObjectLogicalSize( 20, 20, 30 )    SetAnimationStandSpeed( 14, 16, 18, 20 )    SetHeadAngle( 64, 1 )    EnableHeadFocus( 0 )    SetObjectLogicalSize( 1, 40, 150 )    return
The first numbers are the object's initial position (the coordinates X, Y, the facing angle and then the Z coordinate respectively). For the "SetModel" code, a list of known model IDs is available ; note that the model gives its name to the entry, so the model 111 is "ManA".
Unlike the PSX version, the Steam version can use any model any time. The animations, however, must match with the model. As there is no list of animations yet (if you want to help doing one, that would be cool ^^), you'll have to grab the animation ID from other field scripts, where you know that the animations you seek are used.
It seems that there's no need to add the animation in the "Preload" list of the field. I don't actually know that list's purpose then.

2) The SpeakBTN function
This one is executed when the player approches the model and speaks to him. A standard SpeakBTN function looks like this :
Code: [Select]
Code:
Function ManA_SpeakBTN    ifnot ( IsMovementEnabled ) {        return    }    set VAR_A6_158 = 0    if ( VAR_A6_159 == 1 ) {        DisableMove(  )        if ( VAR_A6_144 == 0 ) {            DisableMenu(  )        } else {            Wait( 1 )        }    }    0x27( 127 )    TurnTowardObject( 250, 32 )    WaitTurn(  )    WindowSync( 0, 128, 199 )    set VAR_A6_158 = 1    if ( VAR_A6_159 == 1 ) {        if ( VAR_A6_156 == 0 ) {            EnableMove(  )            0x27( 255 )            if ( VAR_A6_144 == 0 ) {                EnableMenu(  )            }        }    }    return
If the player is in a cutscene, we don't want him to be able to speak with the NPC that he's facing, thus the "IsMovementEnabled" check. The following 10 lines are standard for everytime the game removes the control from the player, and the last ones are their counterpart to give it back. The "TurnTowardObject( 250, 32 )" forces the NPC to face the player's character, and the "WindowSync" displays a bubble of dialog.

The same kind of function can be made with the CardBTN function but using a "TetraMaster" line of code instead of the "WindowSync" line. For chests, the SpeakBTN function is perfect to allow the player opening the chest and taking the item inside.

3) The other functions
The other functions are used for the rest of the NPC's behavior. The Loop function often ends by the two following lines.
Code: [Select]
Code:
Wait(1)loop
Which means that the function is executed every frame. There's a Range function that runs when the player's character comes in range of the NPC but don't necessarily speaks to him.
And all other, numbered, functions can be used by the previous ones or by other part of the field's script. They may be used for a tiny part of a cutscene, or a special movement such as a jump, non synchronised dialog (ie. dialog bubbles that are displayed while the player still has the control on his character), or one-time walks...
Note that the cutscene scripts are often writen in a Loop function :
- Either the Main_Loop function is used, manage the cutscene's progression and calls parts of the NPC's script,
- Either the Loop functions of NPC and/or PC are used and comunicate with each other using variables.

NPC models corresponding to a Party's member

There is a special case of entries that normally are present in all the scripts of the game (even if most of them don't have any function and thus are invisible). Indeed, the last 9 entries are each assigned to a potential member of the party, namelly
Zidane,
Vivi,
Dagger,
Steiner,
Freya,
Quina or Cinna,
Eiko or Marcus,
Amarant or Blank,
Beatrix

These entries have nothing special - you can use any model you want, for instance - but one thing : they can be refered to with special entry IDs and be used if they are in the player's team.
For instance, if the following lines are present in Main_Init function, then up to 3 of these entries will be initialized accordingly to the characters in the player's team :
Code: [Select]
Code:
InitObject( 252, 0 )InitObject( 253, 0 )InitObject( 254, 0 )
They can then be refered using the same special entry IDs for cutscenes and such. An example of use can be found in the script of the field "Oeilvert/Planetarium". In the function "Zidane_17" of this field, there's the cutscene when Zidane reads terran letters and the present characters are amazed. The different calls of "RunScriptAsync( ..., 252, ... )" are used to handle the reactions of the 2nd party member, whoever he is, at the different points of the cutscene.

So, in order to implement Beatrix in these cutscene, you need to create functions for her. Add a new function of type 0 chosing the last of the entries, then write the Init function :
Code: [Select]
Code:
Function Beatrix_Init    set VAR_B10_0 = 364    set VAR_B10_4 = 63977    set VAR_B10_6 = 252    set VAR_B10_2 = 65456    SetModel( 204, 100 )    CreateObject( VAR_B10_0, VAR_B10_4 )    TurnInstant( VAR_B10_6 )    SetStandAnimation( 2978 )    SetWalkAnimation( 2975 )    SetRunAnimation( 2981 )    SetLeftAnimation( 2980 )    SetRightAnimation( 2974 )    SetObjectLogicalSize( 20, 20, 30 )    SetHeadAngle( 104, 48 )    return
Replace the first numbers by coordinates (or you can remove those 4 lines and put the coordinates inside the "CreateObject" and "TurnInstant" lines).

With this, Beatrix will be created for this kind of cutscene if and only if she is in your party. You may also need to hide her in the Init function because she shouldn't appear before the cutscene. The line "SetObjectFlags( 14 )" does that.
Then you need to create other functions corresponding to her behavior during the cutscene. Look at the numbered functions for the other characters and create functions for Beatrix with the same ID (type) and with a similar pattern (adapt the dialogs and animations, off course).
By the way, you can add a new text in the corresponding text block beforehand with a right-click on it.

Once everything's done, don't forget to parse your functions and save. Congratulations : you have created cutscene elements for Beatrix !


PS. : contact me if you want to be part of the Github project.
 
Last edited:
Status
Not open for further replies.
Back
Top