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

  • Thread starter Thread starter Tirlititi
  • Start date Start date
Status
Not open for further replies.
@shikulja: I don't understand what you want to do.
- Do you want to open the PSX files that were patched using RGR?
- Do you want to use a russian translation that is available for the Steam version and turn it to a PSX mod?
In the first case, it should work... maybe Hades Workshop bugs since a couple of versions so you should try with older versions of HW.
In the second case, it's not possible as I didn't write a script for converting a "Steam formatted text" to a "PSX formatted text".

@masagrator: So, I guess that you went to "File -> Preferences" to solve the first problem, which is what is needed to display and export modded backgrounds properly.
In order to import backgrounds, you need to go to the "Tools -> Background Editor". Here is a tutorial for using it.
 
@Tirlititi
I wanted to extract scripts and resources with text from pirated translations, okay, wait, when fix it, then I'll do it.

it's bad that there is no script for converting steam to psx, we have a good translation of leoris and its commands for steam in Russian, but for psx there is still no.
(insert all the text manually, this is just nonsense, and the chance of typos will be higher)
 
Last edited:
Sorry Tirlititi, one last thing.
I haven't still found a solution about  Freya that stuck in her place after the "Zorn and Thorn event" instead of following Zidane, how can I solve?
 
What is the current script that you got?
There are two possibilities: either the loop enters a case where the script "returns" (which stops for good the script making her following Zidane) or you forget to set the safety variable back to its normal state (that's if the cutscene safety relies on a variable).
 
Is it possible for app to generate textures like in original? 512x512, 1024x512, 1024x1024, 2048x1024, 2048x2048?

Edit: I've did it with imagemagick, but it looks like layers are slightly off. Is tool doing something that may mismatch layers without editing other files? Because Hades Workshop is showing it correctly.
http://screenshotcomparison.com/images/1559842050_4286950371.jpg
 
Last edited:
I don't see the problem with your screenshot.
Which kind of image do you want to "generate" (= extract from the game?) ?
 
I checked few of mismatches (table and piece of furniture have grey line around them)
https://i.imgur.com/CsFy43a.jpg

I'm trying to port Moguri Mod to original dimensions so I can use it with Nintendo Switch (screen is from there). I'm using parameter 32, original dimensions. Now I tried to check without doing any shenanigans, just downscaling extracted layers with imagemagick. I've created texture with tool, imported it and still they're there on PC. Hades Workshop shows it correctly, GIMP shows layers correctly.
I've tried 0.40 and 0.40b. Many tiles are few px off.
Edit:I'm trying now every version from 0.36b as 0.36 crashes.
0.36b and 0.37 looks even worse.
From 0.37b is exactly the same as in 0.40 and 0.40b.

Edit: It looks like even Moguri Mod has issue with mismatching tiles. Hmm...
Edit2: Is this a game issue (mismatching tiles) because of low precision? Because I see that wrong tiling has different offsets dependent on camera position...
 
Last edited:
What is the current script that you got?
There are two possibilities: either the loop enters a case where the script "returns" (which stops for good the script making her following Zidane) or you forget to set the safety variable back to its normal state (that's if the cutscene safety relies on a variable).
I think is the second case..the loop works correctly, it also finish with "loop"
I simply made here something like this...because I didn't have any idea of how to solve  :|

Code: [Select]
Code:
      }            if ( ( IsMovementEnabled == 0 ) && ( General_ScenarioCounter <= 3820 ) ) {                Wait( 1 )                return            } else {                if ( ( IsMovementEnabled == 0 ) && VAR_GlobBool_247 ) {                    InitWalk(  )                    Walk( GetFieldExitX, GetFieldExitY )                    return                }            }


While we're in argument I also want to ask you..I've tried on South Gate to make Marcus jump on the bridge after Dagger jumps, but I don't know why for some reason the Object "Marcus" moves but not read the "jump" animation, plus takes a little to go back in it's normal state..if you know what I mean. What I did is simply copypaste the same codes of Dagger and use them for Marcus (setting his Jump animation..obviously) and also added the script on the Region...so what's wrong?

Thanks as always if you can help

UPDATE: I was wondering..is there a way, somehow, to emulate a "Change Disc"? Like a save menu, and then an image appears like to change the disc even if it's not? (You know, like Game Over)
 
Last edited:
While we're in argument I also want to ask you..I've tried on South Gate to make Marcus jump on the bridge after Dagger jumps, but I don't know why for some reason the Object "Marcus" moves but not read the "jump" animation, plus takes a little to go back in it's normal state..if you know what I mean. What I did is simply copypaste the same codes of Dagger and use them for Marcus (setting his Jump animation..obviously) and also added the script on the Region...so what's wrong?

Thanks as always if you can help

UPDATE: I was wondering..is there a way, somehow, to emulate a "Change Disc"? Like a save menu, and then an image appears like to change the disc even if it's not? (You know, like Game Over)
Marcus's model might not have a jump animation as I don't think there is any point in the story that he jumps.
This sounds like the model moving, trying to execute an animation that doesn't exist, so instead doesn't do anything for the duration that the animation is meant to happen and then returning to the normal state.
 
Marcus's model might not have a jump animation as I don't think there is any point in the story that he jumps.
This sounds like the model moving, trying to execute an animation that doesn't exist, so instead doesn't do anything for the duration that the animation is meant to happen and then returning to the normal state.
Yeah, I think so too..so what's Jump3 stands for?  :| Probably nothing of what I used to think!
 
@masagrator: Yes, that's a problem happening because of the Steam version.
Basically, they used a weird alpha channel for rendering the edges of the tiles while it was a "completly opaque/completly transparent" alternative in the PSX format.
The shift on the carpet (wow, I had a hard time seeing it even with your mark...) surely comes from the way they upscaled the images for the Steam version (because it's not a tile edge).
Fragosso knows better than me this kind of things...

@ToraCarol: There should not be any "return" line if the first "if" block that you show.
The problem with the jump animation is more likely to be the one described here. You need to use this jump animation before in the script to let the game load it (using "SetRightAnimation( 5041 )" just before "SetRightAnimation( 5224 )" is enough).
Emulating a "Change disc" screen requires modding the C# code and adding new assets (textures) to the game. I don't know if it can work, sorry.
You may more easily add a "Would you like to save?" screen, as it can simply be emulated with a dialog box... but I can understand that it's not what you want.
 
@ToraCarol: There should not be any "return" line if the first "if" block that you show.

The problem with the jump animation is more likely to be the one described here. You need to use this jump animation before in the script to let the game load it (using "SetRightAnimation( 5041 )" just before "SetRightAnimation( 5224 )" is enough).

Emulating a "Change disc" screen requires modding the C# code and adding new assets (textures) to the game. I don't know if it can work, sorry.
You may more easily add a "Would you like to save?" screen, as it can simply be emulated with a dialog box... but I can understand that it's not what you want.
Thank you for all you replies, as always.
I was already thinking of adding a dialog box, but I was hoping that somebody has an idea of how to emulate this thing, because as I said i'm not good on C# code an stuff... but it's ok anyway! Let's hope someone someday will find a way! For now i'll just add a dialog box!
 
Last edited:
I fixed the "following Character" and Marcus thing..thanks a bunch!


1) About the save dialog box, you know guys where can i put it between the Disc 1 and 2? Is kinda complicated because there's a cinematic/unexisting field and the Borden field without any particular main loop..and I don't know where to put properly without mess everything! :|

2) Also, have you find a way to solve this,Tirlititi? I've tried with "Raise Windows" but for some reason it seem to not work!


fvKbfB6.png


3) Last but not least, what about if I want to set in a "Trance Mode at start of the battle" other characters instead only Zidane, Steiner and Vivi? It's possible?
 I know there is something that enables "Trance Mode" in the main enemy attacks, is it correct?
 
Last edited:
[...]
3) Last but not least, what about if I want to set in a "Trance Mode at start of the battle" other characters instead only Zidane, Steiner and Vivi? It's possible?
 I know there is something that enables "Trance Mode" in the main enemy attacks, is it correct?
[...]
Prison Cage; Garnet battle does this.
It has an attack that fills the Trance meter. It may be a different name in later versions of HW, but in version 0.38 its called Transfer.
in that fight there are a few important things that happen related to the trance bar filling. I'll try to show each of the important parts of the code. You can load the battle up yourself if you want to compare.

Code: [Select]
Code:
Function Main_Init    if ( IsBattleInitialized ) {        CloseAllWindows(  )        Wait( 5 )        TerminateBattle(  )    } else {        set SV_EnemyTeam[ATB] =$ FirstOf(SV_EnemyTeam[MAX_ATB])        set #( VAR_GlobUInt16_33 = ( SV_PlayerTeam[MODEL_TYPE] ==$ 0 ) )        set #( VAR_GlobUInt16_33 |= ( SV_PlayerTeam[MODEL_TYPE] ==$ 1 ) )    }    return
The first check is to see if battle has ended already, that seems to be normal for most battles. Then at [else] there are some commands and one of them is setting the enemy's ATB to the MAX_ATB of the first enemy. Tirlititi will have to explain how the list assignments work because I don't fully understand them, but I know that's what's happening in that line anyway.
Next we have a variable that is looking for Zidane's dagger animation model, and one that's looking for his thief sword animation model, and setting the party slot either of them is in, to VAR_GlobUInt16_33. The code does this twice for unknown reasons, the second time fully overwriting the first one.
(if you want to change this to a random party member you can change it to this Code: [Select]
Code:
set #( VAR_GlobUInt16_33 = RandomInTeam(SV_PlayerTeam) )
now, this variable is important for later, because in that fight ONLY Zidane is supposed to start with Trance, and the game needs to know which party slot he's in, in order to target him. (the battle also tracks all the other characters this way too so there is a variable for each specific character you might want to target)

Next since we already set Prison Cage to have full ATB at the start, we have the Prison Cage ATB code (I've again removed some code not related to Trance):
Code: [Select]
Code:
Function Prison_Cage_ATB    if ( !VAR_LocUInt8_3 ) {        set VAR_LocUInt8_3 = 1        set #( SV_Target = VAR_GlobUInt16_33 )        Attack( 8 )        return    }    return
VAR_LocUInt8_3 is for tracking the cutscene progression for Zidane and Steiner explaining what Trance is. To begin with, its not set, so the battle checks if it doesn't exist yet (it doesn't) and then it sets it to 1, sets the SV_Target variable to the VAR_GlobUInt16_33, which it previously set as the party slot for Zidane, so now the next attack to execute will hit Zidane. Finally, it executes Attack( 8 ) which in this battle is Transfer, which fills up a character's Trance meter completely, and then returns out of the [if] and then processes some other things I removed for brevity, and then returns again to allow the game to continue into the next cycle.

If you wanted to change the character to say, Freya, in the prison cage fight, the game locates her model and stores it in VAR_GlobUInt16_45 using this code
Code: [Select]
Code:
        set #( VAR_GlobUInt16_45 = ( SV_PlayerTeam[MODEL_TYPE] ==$ 12 ) )
just like it did for Zidane in UInt16_33
A full list of character models can be seen in the Function List, under Var Code > [DATA ACCESS]
Code: [Select]
Code:
[MODEL_TYPE]Zidane : 0 or 1Vivi : 2Dagger : 3, 4, 5 or 6Steiner : 7 or 8Quina : 9Eiko : 10 or 11Freya : 12Amarant : 13Cinna : 14Marcus : 15Blank : 16 or 17Beatrix : 18
Note, that if the character you want to target is not in the battle, the code may freeze while it looks for that character specifically, or it may skip right over the Transfer attack completely. I don't know the exact effects, but if the variables aren't set correctly in the PSX version, the battle will just stall as the game tries to attack something that doesn't exist. Tirlititi may have advice on doing other things with targetting.

Battle code is all pretty new to me, but I did just look into this last night, ironically, so I figured I'd explain what I already figured out.
 
Last edited:
Not really a technical question, but since I want to develop the temporary characters into full ones...

I think I can just move Beatrix over to Sword Art and White Magic-- in fact, link all 3 white mages to the same White Magic command. That will free up some space.

I think I will get rid of the SFX commands and instead just make the "theater" versions of everyone the same as their normal version. They only do 1 fight using those commands anyway.

I can also get rid of the superfluous Magic commands.

That leaves me with choices with the other three.

Being able to do away with the SFX commands gives me 14 new abilities I can make.

So should I

1) Make 4 unique commands for one and 5 for the other two
2) Make Cinna "Green Mage/Gray Mage" so that he would make use of spells from the White Magic and Black Magic lists. Then I can maybe give Marcus and Blank 7 unique commands each (I think I might be able to squeeze this in without running into the command limit since I am pruning unneeded ones)
3) Find a way to expand the Ability List as well as the Command list so that all 3 can have 8 unique commands each.

Since I am already editing the assembly file in order to try to increase the number of slots from 9 to 12 so that the additional characters can be used uniquely and I haven't completely solved that, the only trick to increasing the lists for spells and commands is that I won't be able to further edit it with Hades Workshop. And it would be so much easier to use it to edit the abilities than try to figure out how to do it via hex-editor or something.

And I haven't completely solved the puzzle on how to do it yet anyway. I honestly haven't been working on it much for the past few months.
But I have worked out how to turn that starting area into a test area by assigning it a random encounter script and then putting the characters I want to test into the initial party.

Addendum:

Seeing what I could free up in the Commands list by combining similar commands and removing the unused/1 time use ones, I can arrange this to 34 command blocks free.
That it plenty enough to turn Cinna into a proper mage with plenty of spells taken from the black mage/white mage/blue mage lists and still leave enough room for the other two to get 8 commands each, even if 1 has to be a pre-existing ability.
 
Last edited:
I think I am 95+% of the way to expanding the character slots from 9 to 12, allowing the remaining 3 characters to be fully utilized.

I have spent basically the past two days on it.

To get as far as I did involved editing all of these classes

Under the "-" category
Actor
btl_init
ETb
EventEngine
FF9PARTY_INFO
ff9play
FF9StateGlobal
FieldHUD
NameSettingUI
NGUIText
PartySettingUI
PLAYER
ShopUI


Under the "FF9" category
ff9abil
ff9shop
FFSHOP_INFO

I will try to give more detailed information in the future.

It seems like Beatrix has to remain the slot 8 character with Cinna, Marcus and Blank becoming 9, 10 and 11 respectively. Initially I was going to try to match their slots to their character numbers, but for whatever reason it didn't work out. I was getting everyone's models shifted by 1 place (Blank was using Beatrix's model, Marcus had Blanks and Cinna had Marcus's)

In fact, the entire thing might be working now, but the issue I am having is that at the end of that initial battle, when the mask is supposed to come off, the game crashes and it reports a violation with the SFX file. I don't know if it is the character animation of the mask falling off or if it is the game trying to focus the camera on the opponent that is causing the crash, but it is one of the two.

But, after experimentation I found that if I leave every other change, but just change two numbers in the EventEngine file, that the game runs smoothly (at least for that first room) but Cinna, Marcus and Blank take the models of Quina, Eiko and Amarant respectively.

I feel like if I can just track down this one error then the job will be completed.


In the meantime, to experiment with this further, I would like to know how to change the game script so that I can add a change party members NPC in the first room. I already figured out how to put battles there. Any clues on how to do it?

Also, is there any possible way to change the settings for Hade's Workshop that would allow me to edit my already edited assembly instead of having to switch back and forth between an edited and unedited one?
 
Hello guys, I'm sorry if I bother but I really hope anyone can help me with this one


b5TrPHB.png


As you can see in this image, there's a text window..with no text inside it! Why this happens? How to solve?
 
Last edited:
Hello, sorry for the silly question but in Hades Workshop I modify some Ending texts but I can't modify the arguments of Text Command "Center" (I think opcode 0x48). Whatever number I write in, it become default again automatically after closing the window, I dunno why, and I don't find any answer about it (sorry for bad english)
 
Last edited:
Hello guys, I'm sorry if I bother but I really hope anyone can help me with this one


b5TrPHB.png


As you can see in this image, there's a text window..with no text inside it! Why this happens? How to solve?
Looks like a script called text that doesn't exist!.
 
Status
Not open for further replies.
Back
Top