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

  • Thread starter Thread starter Tirlititi
  • Start date Start date
Status
Not open for further replies.
I thought it would be a pain to solve this problem but you just need one Tirlititi to solve it in a few minutes... incredible, you impress me ahah!

It works perfectly  ;D... except during my tests : I've just learned something... SFX does the damage too! (I get double damage for each hit, i didn't understand at first  ???)

So, when I use SFX instead of Effect Point, I have the same problem: the damage is only shown for the last SFX applied.

EDIT : I just read again your sentence =>
The "Run Spell Animation" and "SFX" codes should give the hand to a generic "Spell Animation" and thus show the numbers every time. However, for both of them, it's not possible to have two different generic "Spell Animations" running at the same time.
I suppose that's works too when you use same multiples "SFX" on same animation so. I just realized that it's the SFX that triggers the damage report.

I'll see if I can find a way to do it without breaking everything, otherwise I'll just use the Effect Point ^^. I think i will use Effect Point instead xD Too sad.

Thanks again Tirlititi.
 
Last edited:
Hello Tirlititi, long time I'm not writing here! I write this little post to ask your help another time.

So, I'm trying to modify the DISC 4 from PSX version and I'm making this thing you suggest time ago about swap Blank Amarant Dialogue Window

So i made something like this

Code: [Select]
Code:
    case +1:        if ( 1 ) {            SetCharacterData( 8, 0, 255, 5, 7 ) <-- this one I made to not make Beatrix temporary and let the passive ability on            WindowSync( 0, 128, 175 )            if ( GetDialogChoice == 0 ) {                SetPartyReserve( 4095 )                SetCharacterData( 7, 0, 255, 5, 7 )                 Party( 4, 0 )                UpdatePartyUI(  )            } else {                if ( GetDialogChoice == 1 ) {                    SetPartyReserve( 4095 )                    SetCharacterData( 11, 0, 255, 21, 7 ) <-- Blank (I could not remove the temporary flag like Marcus and Cinna because if I remove it turns back in Amarant, Eiko and Quina.. I don't know why)                    SetName( 11, 74 )                }                WindowSync( 0, 128, 176 )                if ( GetDialogChoice == 0 ) {                    SetPartyReserve( 4095 )                    SetCharacterData( 6, 1, 255, 21, 6 )                    Party( 4, 0 )                    UpdatePartyUI(  )                } else {                    if ( GetDialogChoice == 1 ) {                        SetPartyReserve( 4095 )                        SetCharacterData( 10, 1, 255, 21, 0 ) <--Marcus                        SetName( 10, 73 )                    }                    WindowSync( 0, 128, 177 )                    if ( GetDialogChoice == 0 ) {                        SetPartyReserve( 4095 )                        SetCharacterData( 5, 0, 255, 5, 5 )                        Party( 4, 0 )                        UpdatePartyUI(  )                    } else {                        if ( GetDialogChoice == 1 ) {                            SetPartyReserve( 4095 )                            SetCharacterData( 9, 0, 255, 21, 5 ) <--Cinna                            SetName( 9, 72 )                            Party( 4, 0 )                            UpdatePartyUI(  )                        }                    }                }            }        } else {            Party( 0, 0 )            UpdatePartyUI(  )        }        if ( IsInParty(5) ) {            set Setting_OptionalQuina = 1        }        break    }
But something is wrong and I'm messin with something because is not working right it isn't all in the right place..can I say.
I've seen in the Text is quite different from Steam in fact I had to add the "MULTICHOICE" voice, and so that's what I did.

And then is coming out something like

(“Who?”
µEiko
Marcus)

but I guess i'm still wrong with something..what's it? Thank you as always for the reply!
 
I don't get what's your problem, ToraCarol.

Is that something with the text formatting? If yes, then that's the text you use that you should show, not the script.
Usually, you must have a [MULTICHOICE] and
opcode at the start of the first line of the multiple choice, then an
at the start of each subsequent line, so it would be something like this in the editor:
“Who?”
µµEiko
µMarcus
In-game, µ is not a printable character (in the PSX version), so I guess that what you showed was the text in HW.

The
opcode is there to give some space to the hand image and avoid it to be placed over the text.​
 
Oh! Ok! So I did correctly first the step of the TEXT! I solved and change back i was not sure about the
opcode but it seems I get right.

Sorry I did not explain right...my fault.

The fact is that I wanted 3 Window that appear one after another to choose which character you want to take with you in the party, and it ends with the "Cinna-Quina Window" that at the end of this last choice it opens the window party based on all your choices.
The problem was that the event does not work correctly. But while I fixed the text and two little things it seems it's finally solved!

So as always, even for a little..thanks for all the help!!​
 
Hello everyone, I hope you're well!

I have a small question that does not concern HW but Memoria Scripts (precisely C#, because I'm a beginner in this...)

I'm trying to modify a magic, which basically takes into account the PV difference but i want to use a logarithm function instead.

Here is the test code i am using :

Code: [Select]
Code:
   double factor = Math.Abs(Math.Round(Math.Log((double)(this._v.Caster.CurrentHp / this._v.Caster.MaximumHp)), 2));   this._v.NormalMagicParams();   this._v.Caster.PenaltyMini();   this._v.Target.PenaltyShellAttack();   this._v.PenaltyCommandDividedAttack();   this._v.CasterCommand.BonusElement();   if (this._v.CanAttackMagic())   {    this._v.TargetCommand.CalcHpDamage();    this._v.TargetCommand.TryAlterMagicStatuses();    this._v.Target.HpDamage = (short)factor;   }
The final formula will be something like this : Code: [Select]
Code:
short hpDamage = (short)Math.Min(9999, this._v.Context.PowerDifference * (int)this._v.Context.EnsureAttack * factor);
However, on my first code, the HpDamage always shows 0.
Trying with/without Math.Round (to have more precision) and Convert.ToInt16 => That's doesn't work.

Can't the game use this kind of complex functions or am I on the wrong way ?

Thanks in advance  :lol:

EDIT : Whatever... i found it. Sorry for this useless post  :-[

Code: [Select]
Code:
  public void Perform()  {   int factor = (int)Math.Abs(Math.Floor(Math.Log((double)this._v.Caster.CurrentHp / (double)this._v.Caster.MaximumHp)));   this._v.NormalMagicParams();   this._v.Caster.PenaltyMini();   this._v.Target.PenaltyShellAttack();   this._v.PenaltyCommandDividedAttack();   this._v.CasterCommand.BonusElement();   if (this._v.CanAttackMagic())   {    this._v.TargetCommand.CalcHpDamage();    this._v.TargetCommand.TryAlterMagicStatuses();    short hpDamage = (short)Math.Min(9999, this._v.Context.PowerDifference * (int)this._v.Context.EnsureAttack * factor);    this._v.Target.HpDamage = hpDamage;   }  }
 
Last edited:
Sorry for double post but i have a little question about Spell Animations : is it possible to duplicate an existing animation ?

For example, i want to create a "Slow (Multi)", without changing the existing one (Slow).

I see some unused spell animation but how can we interact with them ?
 
Hum... It might be possible with a new feature of Memoria.
Even if it works though, it could only be used for adding new spell animations to abilities of player's characters because you can't pick unused spell animation IDs for enemy attacks with the "Set Spell Animation" code (you can do that when the "SFX" code is used though and I'm not sure of the difference between those two).

If you have the latest version of Memoria (the launcher was updated to show several options from the Memoria.ini so it is easy to see; it looks more like this currently), you can:
0) Pick the ID of one of the unused spell animation... careful because there are many IDs that do not appear in HW and are still used (everything that goes directly after "[Attack-1...]" or "[Weapon-Attack-1...]"; I guess that 379 is really unused though),
1) Modify "Slow" as you wish in HW without worrying of overwriting the existing one,
2) "Save Steam Mod" and export things as "Raw assets" instead of archives,
3) In the created files, search for "Resources/SpecialEffects/efXXX" where XXX is the ID of the Spell Animation you changed (for Slow, it's ef126),
4) Copy that file into a new subfolder inside the game's folder; the path should be something like "Final Fantasy IX/MyMod/SpecialEffects/efXXX" where "MyMod" can be replaced by whatever you want; also rename the file so that the XXX id fits the unused one (379 for instance),
5) In Memoria.ini, add "MyMod" to the list of mod folder names (the field should be something like:
FolderNames = "MyMod"
6) In the .csv files that are generated for your final mod, modify the "Actions.csv" to use your custom spell animation ID instead (in the column "animationId1" or "animationId2").

Hopefully, the efXXX file is the only thing required for such spell animation and it will not bug in-game... but I'm not even sure that will work at all.
 
Thank you again for your quick and detailed response Tirlititi  ;)

I didn't update Memoria yet (i don't want to break something....  :-X) but I'm almost done finishing the CD1 (I'll make a demo I think).

As soon as I finish this first part, I'll do a last run and I'll make some tests with your proposition (because I have a mob that uses a kind of "Slowaga" and I'd like to make the animation cooler ^^)

Need to make both .dll from Moguri (which I am currently using) and Memoria too...  :'(
 
Just wait for the Moguri mod to update to the forthcoming Memoria update: compiling everything from your end is rather tedious (plus there are a few bugs).
 
Hi! I hope you're having a good weekend :)

I come back with a little question : how does translation works on HW? Since I've been using it, everything is grayed out ^^ It's not implemented yet?
 
Hi DV.
You need to go to the "File -> Preferences -> Steam" and disable the "Single language mode".
When enabled, only one language is loaded, which makes it faster (in particular when loading the fields), but then you can't change the option after opening the game.
The "auto-translate" thing is always grayed out though and will probably never be done, unless someone else codes it.
 
Hello everyone!

I'm interested in getting into modding FFIX on Steam with Hades Workshop. While I have a lot of grand ideas, I have a fairly simple idea to start me off and get practiced with the process of modding the game. I would like to create a "True Solo Run" mod for characters in FFIX, starting with Freya.

From my understanding, at the most basic level, this would require me to at least:

1) Change the battle party member given to you at the start of the game to whatever character you want to play the whole game with (in this case, Freya).
2) Make the game ignore any attempts to change your party setup (for example, if I don't do this, even if I make the game give me Freya at the start, she will be removed the next time the game forces a change to the party such as when you switch to controlling Vivi in Alexandria, unless I make the game not do that).

Also, as a bonus if at all possible, I would like to also change the character that is controlled in exploration throughout the game. I noticed there is a guide for doing this in the PSX version, but I didn't see any information on doing it in the Steam version.

If using the Steam version for this kind of mod is not possible then I don't mind trying the PSX version too, but the Steam version would be preferable since it's more accessible to people if I were to release such a mod.

Any insight on doing any of this would be much appreciated. I'm new to this and while I had a look around at the scripts in Hades Workshop (noticed a lot of listing referring to "Party" in CIL Code), I'm not sure exactly what I need to change to accomplish what I want, so I could really use the help. :P
 
I just answered on the Steam forum. I reproduce my answer here if other people are interested:

0) [Optionally] Configure the languages in "File -> Preferences"; the single-language mode will make loadings go faster (and the script file smaller in size),
1) Open the game's FF9_Launcher,
2) Go to the "Environment -> Fields" panel,
3) Use "Batch -> Export Field Scripts", let all the fields ticked and export them into a single file for simplicity,
4) Using a good text editor, open that script file and search/replace regex expressions using the followings:

search:
set Setting_PartyReserve = [0-9]*
replace:
set Setting_PartyReserve = 255

search:
AddParty\(([1-9][0-9]*)\)
replace:
\( AddParty\(4\) || AddParty\($1\) \)

search (no regex):
AddParty(0)
replace:
( AddParty(0) || AddParty(4) )

... and I think that should be good,
5) In Hades Workshop, "Batch -> Import Field Scripts"; there shouldn't be any error but tell me if there is,
6) "File -> Save Steam Mod" will generate a couple of files but you are interested only in the p0data7.bin (that's the archive containing all the scripts): replace the game's file with it, having a backup for safety.

I *think* this should counter all the problems you can have with this kind of party modifications. Indeed, there are parts of the game (Oeilvert, Ispen Castle...) in which you are supposed to have 4 party members for the cutscenes, so you can't just remove everyone but Freya. The battles that would normally be solo Zidane (Baku, Black Waltz 1 and Amarant... I don't see any other) will be with both Zidane and Freya (again, that's not a good idea to remove Zidane from the team carelessly). And I think that the battle against Plant Brain should be without Blank then... but Plant Brain's AI script seem to be able to handle that case without problem (it will simply be a battle with 1 phase instead of 2).


Of course, you can replace Freya by any other character. In the 2nd and 3rd search/replace,
use "0" instead of "4" for Zidane,
use "1" instead of "4" for Vivi,
use "2" instead of "4" for Dagger,
use "3" instead of "4" for Steiner,
use "5" instead of "4" for Quina,
use "6" instead of "4" for Eiko,
use "7" instead of "4" for Amarant,
use "8" instead of "4" for Beatrix, also use "511" instead of "255" in the "Setting_PartyReserve" line.

I am not sure of how it would work for Quina/Eiko/Amarant because of the shared slot character though...

For replacing the character on the field, that's more complicated because Freya doesn't have all the animations that Zidane has (I don't think that Freya can climb ladders for instance)... It would go pretty much the same way as above but searching for lines:
"SetModel( 98, 93 )", replace by "SetModel( 192, 94 )", but also
"RunAnimation( [Some Animation ID] )", replace with a corresponding animation ID for Freya,
the same for "SetStandAnimation", "SetWalkAnimation", "SetRunAnimation", "SetLeftAnimation", "SetRightAnimation", "SetInactiveAnimation", "SetJumpAnimation", "RunAnimationEx".

The list of animation IDs can be found there (Freya's animation file names start with "ANH_MAIN_F0_FRJ_" and Zidane's start mainly with "ANH_MAIN_F0_ZDN_" (sometimes it's another number after the "F")).

As you can see, your questions are everything but simple :p
It's a hard problem to determine whether a problem is hard or not.
 
Hey, thank you for the quick response, didn't see the message on Steam before I typed this lol.

So I got an unhandled exception error when trying to import back in but I'm pretty sure I know why.

I had no trouble with:

search:
set Setting_PartyReserve = [0-9]*
replace:
set Setting_PartyReserve = 255

search (no regex):
AddParty(0)
replace:
( AddParty(0) || AddParty(4) )

However, when it came to:

search:
AddParty\(([1-9][0-9]*)\)
replace:
\( AddParty\(4\) || AddParty\($1\) \)

I got a bit confused as I couldn't find anything resembling that. I'm a bit confused by the syntax here. Is "AddParty\(([1-9][0-9]*)\)" supposed to be two different values that I need to change?

And yeah, I'm aware nothing is really easy here but I figure what I'm doing here would be far easier than making a "custom game" like FFIX Ascension (which is my end goal but it's a way's off obviously lol).
 
"AddParty\(([1-9][0-9]*)\)" as a regex should read as:

"AddParty" -> simply the string,
"\(" and "\)" -> catch a parenthesis,
"(something)" -> save the string inside the parentheses for replacing it using the "$1" code in the replacement string,
"[1-9]" -> catch exactly one figures but not 0,
"[0-9]*" -> catch 0 or more figures.

So the whole expression catches "AddParty( some number but not 0 )" and puts back that number in the replacement string in place of $1.

Regex (regular expressions) may vary from one program to another (most of the thing is standard though). This syntax works well with Notepad++ for instance.
 
Turns out my issue there was I didn't click the Regular Extension box in Find & Replace in Notepad++, got it working now.

However I've hit another wall. When I try to Import Field Data in Hades Workshop now, Hades Workshop just goes into a "Not Responding" state. Has this ever happened before?
 
Importing and compiling the scripts of all the fields takes some time; you have to wait.
 
OK, so I was going to leave it to compile on my home PC while I worked today on my work PC. Last night I tried it for about an hour but I guess it was supposed to take longer, so I figured 8-9 hours over my work period would be more than enough.

However, now I'm simply getting the unhandled exception error again. It's the exact same file as last night. I then tried doing the whole process again on a fresh file, but still getting unhandled exception.

I'll just post a link to the file here in case anyone can figure out what I did wrong here. Really strange that the process at least started last night but not this morning. Also I have been using Notepad++.

https://drive.google.com/file/d/1wI5r9DHKe2uLwyolVxbXrQEIT-CIhMJF/view?usp=sharing
 
Hey, apologies for double posting, though things seem quiet so I could be talking to an echo chamber here.  :-P

Anyway, in regards to my True Solo Run project, I made a small amount of progress. Previously, I was having an issue where Hades Workshop was getting an "unhandled exception" error when importing the edited field data, which had the field data for every map in one txt file.

So today, I decided to try exporting as split files. I made my edits in the first file to put Freya in the party, which was for the Prima Vista Cargo Room as you start the game. Sure enough, after starting a new game, Freya was successfully in the party menu, and when the fight with Baku started, she was present there too (replacing Blank). I then applied my edits to all files at once in Notepad, and imported the first ten just to see if it would work any further. Freya was taken out of the party when I got to control Vivi exploring in Alexandria, but on further inspection, all of the files I imported were only Prima Vista files so that's fine. I just didn't import the Alexandria files since they didn't happen to be in that batch.

I continued playing anyway but eventually, the game would consistently crash with a "Runtime error" after the FMV cutscene where Steiner crashes into the castle while chasing Zidane and Garnet. I examined my edited files and found that the fifth file I edited was for the Prima Vista Music Room (the three previous files actually did not get edited at all as they didn't have anything that needed to be replaced), which is indeed the room after the Steiner cutscene.

It's possible I just need to import the other files as the game may have been expecting Freya to already be in the party from the previous scene or something, so I will investigate that.

I just have one question for now though. Is it possible for Hades Workshop to import multiple field files at once? It doesn't seem to let me select multiple files at once when doing a batch import. I can do them individually, but there are over 800 files to import so doing all of that manually would be extremely tedious and susceptible to human error.
 
Status
Not open for further replies.
Back
Top