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

  • Thread starter Thread starter Tirlititi
  • Start date Start date
Status
Not open for further replies.
Hello tirlititi,

just wondering if it is possible to change the battle music for certain story battles? For example, the boss battles against Scarlet Hair and Tantarian have the normal battle theme playing, and I'd like to change that to the boss battle theme. Is this determined somewhere in the scripts of their respective field files?
 
No, it's determined in a couple of .txt files of the "resources.assets" archive. The files are called "BtlEncountBGMMetaData.txt" (for battles on the field) and "WldBtlEncountBGMMetaData.txt" (for battles on the map).

The files present like this :
Code: [Select]
Code:
{  "ID of Field": {    "ID of Battle in the Field": "ID of Battle Music",    ...  },  ...}
Battles have the music ID "0" (for normal encounters), "35" (for bosses) and "111" (for Hunter's Chance). Some battles are not registered in these files, when they don't stop the music played in the field (the "Don't Stop Music" battle flag is also checked for them in the "Enemy" panel).
 
Battles have the music ID "0" (for normal encounters), "35" (for bosses) and "111" (for Hunter's Chance). Some battles are not registered in these files, when they don't stop the music played in the field (the "Don't Stop Music" battle flag is also checked for them in the "Enemy" panel).
Thanks, I really appreciate it.

On a related note, I tried adding random encounters to a field that previously didn't have them by copying the following lines to the Main_Init script:

    SetRandomBattleFrequency( 60 )
    SetRandomBattles( 2, 859, 849, 854, 854 )
Now I get proper random encounters in that field, but the music doesn't change to the battle theme. Instead, the normal field music keeps playing. Is there any sort of SoundCode that I have to add somewhere in the field script for that?
 
No: as you can see from the format of the "BtlEncountBGMMetaData.txt", the battle musics are not linked by "1 Battle -> 1 Music" but rather by "1 Field + 1 Battle -> 1 Music". So you need to add a line for your new battle (or, more precisely, to your new use of a battle inside a field) inside this .txt file.

No sound code needs to be added in the field script.
 
Hi, just wanted to say awesome tool, man, many thanks, have been using it for months, but now I'm posting for the first time here. I can do a lot with HW, but how do I open that resource.assets file, never had such a file format before, do I need a special tool to open it? Sorry to bother you, but I'm at a complete loss here, but thanks for this great tool, man!
 
Is there a way to change the Encounter Rate on Steam to something similar to the PS version?
I've noticed I'll run through an entire dungeon with maybe 1 or 2 encounters.
 
@Little Cloud: The resources.assets file is an Unity archive and it can be opened with a few tools available on the internet.
Hades Workshop can also open it a bit more conveniently: go to "Tools -> Unity Assets Viewer" and open the FF9_Launcher.exe in this tool. From there, you can access to all the Unity archives of the game. The resources.assets is in the list "Archive -> Shared Assets -> Resources".

It contains pretty much all the texts of the game (that's why HW generates a new one when exporting as Steam mod), card datas, spell animation datas, copies of the PSX world map chunk, a few images (though most interesting images are in the "sharedassets2" archive), some meta-data files like the one discussed above, etc...

Contrary to what happens when you open the datas within the main frame of HW, the changes you will make on the archives ("right-click -> import selection") will apply directly on the archives and replace them on your hard drive, instead of letting you doing it yourself.

@vomitrocious00: That's a big unknown for me. You can find there a discussion on this encounter rate. I must be missing something because there doesn't seem to be a big difference between the way random encounters are coded in the Steam version compared to the description that SoftReset did on the PSX mechanics. There is no doubt that the encounter rate is lower on Steam though... So either a little change in the mechanics is enough to produce that effect, or I didn't catch a condition to launch a random encounter that would have been added for Steam.

If you want to adjust numbers inside the code to increase the encounter rate, it's in the method "ProcessEncount" of the class "EventEngine". You can edit it in HW in the "CIL Code" panel, but it is much more convenient and safer to use the tool dnSpy as it allows to edit the source code in C# and not the assembly code in CIL. I don't know what to change in order to get the exact same encounter rate as the PSX version.
There are also random encounter rates inside the Field scripts but they are the same between PSX and Steam version and it would be uselessly tedious to change them for each field.
 
Hello everyone

I have a 3D model export problem FF9 I have this message has it


is there a way to export its model without worry?

And thank you in advance
 
Last edited:
No: as you can see from the format of the "BtlEncountBGMMetaData.txt", the battle musics are not linked by "1 Battle -> 1 Music" but rather by "1 Field + 1 Battle -> 1 Music". So you need to add a line for your new battle (or, more precisely, to your new use of a battle inside a field) inside this .txt file.

No sound code needs to be added in the field script.
Hi tirlititi, I've done a bit of playtesting in the last few days, but it seems the desired changes to the battle theme won't take effect. Here's what I did:

I've exported the BtlEncountBGMMetaData.txt, opened it with a text editor and made the required changes, and then I imported it again using the "import selection" function in Hades Workshop. I've done this with both resource.assets files (the x64 and the x86) to be sure. However, I still don't get any music changes in my new random battles. Both resource.assets files are updated according to the fiel change date. Is there anything else I'm missing?

Also, I've encountered another problem: When adding random battles to a new field, after such a battle the field music doesn't resume and I can't move my character anymore. I've noticed that all fields that naturally have random battles also have a main_reinit function in their scripts, while fields without random battles don't. So I'm guessing I need to write a main_reinit function for the fields that I've added random encounters to, right? I'm just unsure what exactly I need to put there, as these scripts seem to differ from field to field. From what I see it's something similar to each respective field's main_init function, but before I resort to (potentially fruitless) trial and error I was hoping that you could give me some general tips as to what I can copy/paste from the main_init script.
 
You're welcome, Vomitrocious :)

@lyokoffx: So, this error means that the program couldn't save the file on your hard drive. Most probably, it can be because there is already a file "NoName10400" at this place and it is used by another program. It could also be because your OS denies the right to HW to create files there (but that'd be strange because you would have seen it with other files).
However, "NoName10400" is not a 3D model anyway. In order to extract a 3D model, you need to select a named file with the extension ".fbx" and file type "GameObject" (example: "Resources/Assets/1/133/133.fbx"). That's not the most intuitive process, but these are the root files of the 3D models in the archives so that's how it works...

The 3D model importation doesn't work correctly unfortunatly.

@Kefka: That's strange :/
1) If you export those meta-data files again after this manipulation, are the changes still there? If not, you are not importing things correctly (though I don't really see how ; you would see if there was a problem).
2) Maybe you edited the game files of your backup folder? The important folder is the one named "FINAL FANTASY IX" in Steam's folder. I think that it's those files that are used even if you execute the "FF9_Launcher.exe" of a copy placed in a totally unrelated folder.

EDIT: I forgot to answer about the field's "main_reinit" but fortunatly, Incinerator's answer is better than what I could have said (I never tried to add new encounters in fields without them). "XXX_reinit" is indeed a function called after a battle ends.
 
Last edited:
Hi tirlititi, I've done a bit of playtesting in the last few days, but it seems the desired changes to the battle theme won't take effect. Here's what I did:

I've exported the BtlEncountBGMMetaData.txt, opened it with a text editor and made the required changes, and then I imported it again using the "import selection" function in Hades Workshop. I've done this with both resource.assets files (the x64 and the x86) to be sure. However, I still don't get any music changes in my new random battles. Both resource.assets files are updated according to the fiel change date. Is there anything else I'm missing?

Also, I've encountered another problem: When adding random battles to a new field, after such a battle the field music doesn't resume and I can't move my character anymore. I've noticed that all fields that naturally have random battles also have a main_reinit function in their scripts, while fields without random battles don't. So I'm guessing I need to write a main_reinit function for the fields that I've added random encounters to, right? I'm just unsure what exactly I need to put there, as these scripts seem to differ from field to field. From what I see it's something similar to each respective field's main_init function, but before I resort to (potentially fruitless) trial and error I was hoping that you could give me some general tips as to what I can copy/paste from the main_init script.
If you add random battles to a field that doesn't have it, you need to add the function "Main_Reinit" to the script for the player to regain control after the battle.
(Not sure if this is the precise code to enter in the function (ask Tirlititi) but I used this for some of mine without issue:
Code: [Select]
Code:
Function Main_Reinit    set VAR_GlobBool_159 = 0    RunScriptAsync( 0, 250, 13 )    if ( VAR_GlobBool_155 == 1 ) {        ATE( 1 )    }    ShowTile( 11, 0 )    ShowTile( 12, 0 )    if ( VAR_GlobBool_158 == 0 ) {        0x27( 127 )    } else {        0x27( 255 )    }    Wait( 2 )    ShowTile( 9, 0 )    RunTileAnimation( 0, 0 )    SetTileAnimationFlags( 0, 16 )    SetTileAnimationSpeed( 0, 64 )    RunSPSCode( 10, 130, 195, 0, 0 )    RunSPSCode( 10, 145, 6000, 0, 0 )    RunSPSCode( 10, 155, 255, 0, 0 )    RunSPSCode( 10, 160, 16, 0, 0 )    RunSPSCode( 10, 170, 0, 0, 0 )    RunSPSCode( 10, 156, 1, 0, 0 )    RunSPSCode( 10, 131, 1, 0, 0 )    SetCameraFollowHeight( 500 )    if ( VARL_GenBool_2926 ) {        ShowTile( 9, 1 )    }    if ( VAR_GlobUInt8_24 ) {        RunScriptAsync( 2, 15, 14 )    }    if ( VAR_GlobUInt8_25 ) {        RunScriptAsync( 2, 18, 14 )    }    Wait( 2 )    if ( VAR_GenUInt8_13 == 9 ) {        SetTextVariable( 2, 0 )        WindowAsync( 6, 0, 65 )        RaiseWindows(  )        WaitWindow( 6 )        set VAR_GenUInt8_13 = 0    }    if ( VAR_GenUInt8_14 == 9 ) {        SetTextVariable( 2, 1 )        WindowAsync( 6, 0, 65 )        RaiseWindows(  )        WaitWindow( 6 )        set VAR_GenUInt8_14 = 0    }    set VAR_GlobBool_159 = 1    if ( VAR_GlobBool_158 == 1 ) {        set VAR_GlobBool_158 = 1        if ( VAR_GlobBool_159 == 1 ) {            if ( VAR_GlobBool_156 == 0 ) {                EnableMove(  )                0x27( 255 )                if ( VAR_GlobBool_144 == 0 ) {                    EnableMenu(  )                }            }        }    }    if ( VAR_GlobUInt8_17 == 255 ) {        set Op66(( GetData_12 - 160 ), ( GetData_13 - 112 ))    }    0xA9( 250 )    FadeFilter( 7, 16, VAR_GlobUInt8_17, 0, 0, 0 )    return
The battle music will stop playing after battle if "No Victory animations" isn't checked and that random battle's music code isn't in the field (through BtlEncountBGMMetaData.txt). In this case, you can just put the field's Sound code in Main_Reinit, and/or check the box "No Victory Animations".

editing the BtlEncountBGMMetaData.txt e.g.

1. I've added a Battle with "625" to field: "Daguerreo/Entrance".
Daguerreo/Entrance is Field ID: "2800"
Extract and open BtlEncountBGMMetaData.txt (Always keep the BtlEncountBGMMetaData.txt in the HadesWorkshopAssets\Resources folder!)
From the list scroll down to #2800:
first.png


Since Daguerreo doesn't ever have a random battle it in Vanilla, I've added it in as Tirlititi told you to do before.
The number "111" is music id: "music082" which is "Hunter's Chance" (in my case, a battle theme).
Save the .txt file, import it back with HW Unity Viewer and test.
My battle leaves "No Victory Animations" unchecked
enemy.png

With this setup, the battle will be in the field, once the battle ends, the field music resumes as it should.

Also for a setup for multiple battles can go a little something like this in the field script:

Code: [Select]
Code:
 if ( VARL_GenBool_7962 == 0 ) {        DisableMove(  )        DisableMenu(  )        RunSoundCode( 265, 0 )        Wait( 10 )        0xA9( 250 )        FadeFilter( 4, 24, VAR_GlobUInt8_17, 255, 255, 255 )        Wait( 25 )        RunSoundCode3( 53248, 3096, 0, -128, 125 )        Wait( 30 )        0xA9( 250 )        FadeFilter( 5, 16, VAR_GlobUInt8_17, 0, 0, 0 )        Wait( 70 )        RunSoundCode( 0, 73 )        WindowSync( 1, 128, 400 )        WindowSyncEx( 22, 1, 128, 401 )        Wait( 10 )        0xA9( 250 )        FadeFilter( 4, 24, VAR_GlobUInt8_17, 255, 255, 255 )        Wait( 25 )        RunSoundCode3( 53248, 3096, 0, -128, 125 )        Wait( 30 )        0xA9( 250 )        FadeFilter( 5, 16, VAR_GlobUInt8_17, 0, 0, 0 )        Wait( 10 )        WindowSyncEx( 22, 1, 128, 402 )        WindowSync( 1, 128, 403 )        WindowSyncEx( 22, 1, 128, 404 )        WindowSync( 1, 128, 405 )        FadeFilter( 2, 24, 0, 64, 64, 64 )        RaiseWindows(  )        WindowSync( 1, 16, 406 )        WindowSync( 1, 16, 407 )        WindowSync( 1, 16, 408 )        WindowSync( 1, 16, 409 )        set VARL_GenBool_7962 = 1    }    DisableMove(  )    DisableMenu(  )    RunSoundCode( 0, 73 )    WindowSync( 1, 16, 410 )    switch 5 ( GetDialogChoice ) from 0 {    case +0:        RunSoundCode( 0, 0 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        Battle( 1, 896 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        Battle( 1, 899 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        Battle( 1, 897 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        Battle( 1, 210 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        Battle( 1, 211 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        Battle( 1, 57 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        Battle( 1, 82 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        Battle( 1, 231 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        Battle( 1, 280 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        Battle( 1, 763 )        RunSoundCode( 0, 111 )        DisableMenu(  )        DisableMove(  )        Wait( 20 )        0xA9( 250 )        FadeFilter( 4, 24, VAR_GlobUInt8_17, 255, 255, 255 )        Wait( 25 )        RunSoundCode3( 53248, 3096, 0, -128, 125 )        Wait( 30 )        0xA9( 250 )        FadeFilter( 5, 16, VAR_GlobUInt8_17, 0, 0, 0 )        Wait( 30 )        RunSoundCode( 0, 5 )        FadeFilter( 2, 24, 0, 64, 64, 64 )        RaiseWindows(  )        WindowSync( 1, 16, 411 )        0xA9( 250 )        FadeFilter( 4, 24, VAR_GlobUInt8_17, 255, 255, 255 )        Wait( 25 )        RunSoundCode3( 53248, 3096, 0, -128, 125 )        Wait( 30 )        0xA9( 250 )        FadeFilter( 5, 16, VAR_GlobUInt8_17, 0, 0, 0 )        Wait( 30 )        FadeFilter( 2, 24, 0, 64, 64, 64 )        RaiseWindows(  )        WindowSync( 1, 16, 412 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 15 )        AddItem( 15, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 25 )        AddItem( 25, 1 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 39 )        AddItem( 39, 1 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 49 )        AddItem( 49, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 44 )        AddItem( 44, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 56 )        AddItem( 56, 1 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 61 )        AddItem( 61, 1 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 63 )        AddItem( 63, 1 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 67 )        AddItem( 67, 1 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 78 )        AddItem( 78, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 83 )        AddItem( 83, 1 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 84 )        AddItem( 84, 1 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 87 )        AddItem( 87, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 96 )        AddItem( 96, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 97 )        AddItem( 97, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 131 )        AddItem( 131, 6 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 147 )        AddItem( 147, 7 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 163 )        AddItem( 163, 4 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 164 )        AddItem( 164, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 167 )        AddItem( 167, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 175 )        AddItem( 175, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 176 )        AddItem( 176, 8 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 191 )        AddItem( 191, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 195 )        AddItem( 195, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 197 )        AddItem( 197, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 209 )        AddItem( 209, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 222 )        AddItem( 222, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 198 )        AddItem( 198, 8 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 225 )        AddItem( 225, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 226 )        AddItem( 226, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 227 )        AddItem( 227, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 228 )        AddItem( 228, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 229 )        AddItem( 229, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 230 )        AddItem( 230, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 231 )        AddItem( 231, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 232 )        AddItem( 232, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 233 )        AddItem( 233, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 234 )        AddItem( 234, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 238 )        AddItem( 238, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 235 )        AddItem( 235, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 241 )        AddItem( 241, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 242 )        AddItem( 242, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 243 )        AddItem( 243, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 247 )        AddItem( 247, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 248 )        AddItem( 248, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 249 )        AddItem( 249, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 250 )        AddItem( 250, 13 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 253 )        AddItem( 253, 50 )        WindowSync( 7, 0, 68 )        RunSoundCode3( 53248, 108, 0, -128, 125 )        SetTextVariable( 0, 254 )        AddItem( 254, 50 )        WindowSync( 7, 0, 68 )        WindowSync( 1, 16, 413 )        WindowSync( 1, 16, 414 )        set VARL_GenBool_7963 = 1        FadeFilter( 6, 16, VAR_GlobUInt8_17, 255, 255, 255 )        EnableMove(  )        RunSoundCode( 0, 73 )        EnableMenu(  )        Wait( 16 )        FadeFilter( 7, 16, VAR_GlobUInt8_17, 0, 0, 0 )        TerminateEntry( 255 )        break    case +1:        DisableMenu(  )        DisableMove(  )        Menu( 0, 0 )        EnableMove(  )        EnableMenu(  )        break    case +2:        DisableMenu(  )        DisableMove(  )        Party( 4, 0 )        UpdatePartyUI(  )        EnableMove(  )        EnableMenu(  )        break    case +3:        DisableMenu(  )        DisableMove(  )        SetHP( 0, 9999 )        SetMP( 0, 999 )        CureStatus( 0, 255 )        SetHP( 1, 9999 )        SetMP( 1, 999 )        CureStatus( 1, 255 )        SetHP( 2, 9999 )        SetMP( 2, 999 )        CureStatus( 2, 255 )        SetHP( 3, 9999 )        SetMP( 3, 999 )        CureStatus( 3, 255 )        SetHP( 4, 9999 )        SetMP( 4, 999 )        CureStatus( 4, 255 )        SetHP( 5, 9999 )        SetMP( 5, 999 )        CureStatus( 5, 255 )        SetHP( 6, 9999 )        SetMP( 6, 999 )        CureStatus( 6, 255 )        SetHP( 7, 9999 )        SetMP( 7, 999 )        CureStatus( 7, 255 )        SetHP( 8, 9999 )        SetMP( 8, 999 )        CureStatus( 8, 255 )        SetHP( 9, 9999 )        SetMP( 9, 999 )        CureStatus( 9, 255 )        SetHP( 10, 9999 )        SetMP( 10, 999 )        CureStatus( 10, 255 )        SetHP( 11, 9999 )        SetMP( 11, 999 )        CureStatus( 11, 255 )        RunSoundCode3( 53248, 534, 0, -128, 125 )        FadeFilter( 2, 24, 0, 64, 64, 64 )        RaiseWindows(  )        WindowSync( 1, 16, 80 )        EnableMove(  )        EnableMenu(  )        break    case +4:        EnableMove(  )        EnableMenu(  )        Wait( 16 )        FadeFilter( 7, 16, VAR_GlobUInt8_17, 0, 0, 0 )        if ( GetDialogChoice == 0 ) {            FadeFilter( 7, 16, VAR_GlobUInt8_17, 0, 0, 0 )        } else {            EnableMove(  )            0x27( 255 )            EnableMenu(  )        }    }    return
that script was a battle rush mode I removed as "trial mode".
Since I no longer used it in the mod, feel free to use it for your occasion. :)
 
WOw, thanks a ton for your answers, guys. It was indeed the lack of a Main_Reinit function that caused the problems! Now everything is running smoothly, I get my battle theme, and afterwards the field theme starts playing again and I regain movement control of my character. Thanks again, I'm finally getting the grip of this!
 
thank you for your support

but i can not do it like you said i pence operating system refuses to HW to create files

and here is my window and I have it indicate my directory (x86)



can I fix this bug ???

And thank you in advance
 
Last edited:
Try to right-click on HW (the program's .exe) and select "Run as administrator", it should fix the problem.
But then again, "NoName" files are not interesting for 3D models and that's not what you want to export.
 
I thank you very much for your help it works without worry thanks to "Run as administrator"

and to have me warn of these file "NoName"

Thank you very much for this trick

I have a three question

1- you can facilitate my search by telling me that kind of model3D category for each folder ? dexprotation of "unity asset viewer" expmle "p0data2" = "weapon" (= exmple)

and what are the missing models ?

2- for the .bin of the psx version

are there any models under Hades Workshop to export ?

3- Is there a possibility that Hades Workshop becomes an SDK to compile its game FF9 since unity3D ?

because there are some keywords "unity asset viewer" "GameObject" "transform" I want to know who is the link unity3d with Hades Workshop ?

because there is more game engine and software3D


and thank you very much and thanks in advance
 
Last edited:
When I try the background editor conversion HW crash.
File name :
Pic1_1_0.bmp
Pic1_1_1.bmp
...

Error Log :
Log Name:      Application
Source:        Application Error
Date:          2018-10-21 22:52:51
Event ID:      1000
Task Category: (100)
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      DCM
Description:
Faulting application name: HadesWorkshop.exe, version: 0.0.0.0, time stamp: 0x5b38c355
Faulting module name: HadesWorkshop.exe, version: 0.0.0.0, time stamp: 0x5b38c355
Exception code: 0xc0000005
Fault offset: 0x010358ce
Faulting process id: 0x15ac
Faulting application start time: 0x01d469b1a17fc153
Faulting application path: D:\Games\FINAL FANTASY IX\HadesWorkshop\HadesWorkshop.exe
Faulting module path: D:\Games\FINAL FANTASY IX\HadesWorkshop\HadesWorkshop.exe
Report Id: f5d37569-790a-4009-a303-dd288be8e8eb
Faulting package full name:
Faulting package-relative application ID:
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Application Error" />
    <EventID Qualifiers="0">1000</EventID>
    <Level>2</Level>
    <Task>100</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2018-10-22T02:52:51.135109000Z" />
    <EventRecordID>991</EventRecordID>
    <Channel>Application</Channel>
    <Computer>DCM</Computer>
    <Security />
  </System>
  <EventData>
    <Data>HadesWorkshop.exe</Data>
    <Data>0.0.0.0</Data>
    <Data>5b38c355</Data>
    <Data>HadesWorkshop.exe</Data>
    <Data>0.0.0.0</Data>
    <Data>5b38c355</Data>
    <Data>c0000005</Data>
    <Data>010358ce</Data>
    <Data>15ac</Data>
    <Data>01d469b1a17fc153</Data>
    <Data>D:\Games\FINAL FANTASY IX\HadesWorkshop\HadesWorkshop.exe</Data>
    <Data>D:\Games\FINAL FANTASY IX\HadesWorkshop\HadesWorkshop.exe</Data>
    <Data>f5d37569-790a-4009-a303-dd288be8e8eb</Data>
    <Data>
    </Data>
    <Data>
    </Data>
  </EventData>
</Event>
 
Last edited:
@Kefka: Yes, it is possible with dnSpy again. In the "btl_calc::CalcMain", you need to put the line "btl_calc.CalcSub_15E(cALC_VAR);" a bit everywhere ^^'
Again, having a look at this file makes it easier to read the spell effects before editing the real thing (that has idiotic names and is harder to read).

For example, go to the "case 19" (Physical Strike effect) and change it to this:
Code: [Select]
Code:
 case 19:  btl_calc.CalcSub_13A(cALC_VAR);  btl_calc.CalcSub_141(cALC_VAR);  btl_calc.CalcSub_143(cALC_VAR);  btl_calc.CalcSub_159(cALC_VAR);  if (btl_calc.CalcSub_152(cALC_VAR))  {   btl_calc.CalcSub_15E(cALC_VAR);   btl_calc.CalcSub_203(cALC_VAR);   btl_calc.CalcSub_270(cALC_VAR);  }  break;
You should put the line before the "CalcSub_20X" ("DoSetDamage_..." in the readable version).
Hi Tirlititi, sorry for the late reply to the Ipsen Curse topic, but it took me a while to play up to that point in the game (my first playthrough with the Steam version). Plus, I've never used dnSpy before so I also had to learn debugging and stuff (still more of a beginner, lol..).

Anyway, I've found the btl_calc::CalcMain and tried to edit it like you told me (thanks for the easier to read version of the Btl_calc function, by the way), however afterwards when I click on 'compile' I get several entries of the following message:

"CS0266: Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)"

and in one case also the following:

"CS1503: Argument2: Cannot convert type 'int' to 'byte'."

The strange thing is, these error messages refer to places in the code that I didn't even edit. It also happens when I try to compile again without editing anything, so these errors must be in the vanilla code already. And because of this I can't seem to save my changes. Do you know what's going on?

On a related note, you said to always insert the line "btl_calc.CalcSub_15E(cALC_VAR);" right above the "DoSetDamage..." line. This works for Physical Strike, Magic Weapon, Throw, Spear & Trance Spear, and Sword Magic. However, there are other physical skills like Dark Side and Lancer which don't have a "DoSetDamage..." line, so I'm unsure of where I should add the "btl_calc.CalcSub_15E(cALC_VAR);" in these cases.
 
@lyokoffx: Ok nice. It's weird that you need administrator rights to allow HW to create a file but okay.

1- The only "missing" models are the spell special effects (they are inside the files "efXXXX" in the resources.assets but in a PSX format that I don't know) and the fact that some models (typically the World Map) are splitted into pieces. For the rest:
- p0data2 contains the weapon models (".../battlemodel/6/") and the battle scenes (".../battlemodel/battlemap_all/"),
- p0data3 contains the World Map terrain (".../worldmap/prefabs/.../block....prefab") and the World Map structures/effects (".../worldmap/effectmodels/" and ".../worldmap/prefabs/effects/"),
- p0data4 contains pretty much all the field models ("assets/resources/models/") and battle models of the enemies and characters (folder "3" of the models); the related animations are in p0data6 (they are automatically used when you extract a model from the p0data5 archive).
There are also some special effects on the field or on the world map (I think they are called "SPS") in p0data1X archives. I'm not sure if they really are 3D models though.

2- For the PSX version, you can extract only the Battle Scenes as wavefront 3D models (.obj) using HW.

3- No. The references to GameObjects and such are because the game was developped using Unity. It's not HW's terminology to begin with.

@DracoMoye: This error log doesn't tell me anything interesting unfortunatly :/
Can you get a bit more precise on what you do before the program crashes? Do you see the preview of your .bmp images in the Background Editor? Is it when you click on "Apply" in the "Converter" panel that it crashes or right after selecting the .bmp file? You should maybe try to convert your .bmp into other image formats (if I recall correctly, PNG, TGA and TIFF should be ok). The .bmp formats are actually very diverse and maybe you're using a version that is not compatible.

@Kefka: No problem. Well done going this far (you did most of the job).
For the errors, they are caused by dnSpy but they are not problematic: you just need to write the type conversion yourself when these errors pop. For instance, if the line "byte x = 5;" gives an error, change it to this:
Code: [Select]
Code:
byte x = (byte)5;
It's sometimes a bit more complicated, like "byte x = intvalue1 + intvalue2;" in which case you must also add parentheses around what needs to be converted:
Code: [Select]
Code:
byte x = (byte)(intvalue1 + intvalue2);
What I personally do is that I create a .txt file in my mod's folder named after the class/method I edit and I put the code (and its modifications) in that file. This way, I only have to "Select All + Copy + Paste" when I change it (otherwise, I'd need to write these type conversions everytime because dnSpy doesn't register them after compilation).

For the Darkside and Lancer effects, you need to add the line after the "at_pow" variable is set (it's usually in the "Setup..." call but sometimes it's directly in the "case" code) and before it is used (again, it's usually in the "DoSetDamage..." but sometimes it's directly in the "case" code). So for Lancer and Darskide, you need to add "btl_calc.CalcSub_15E(cALC_VAR);" before that one:
Code: [Select]
Code:
if (cALC_VAR.at_pow - cALC_VAR.df_pow > 0)
 
Status
Not open for further replies.
Back
Top