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

  • Thread starter Thread starter Tirlititi
  • Start date Start date
Status
Not open for further replies.
This tool is amazing and I'm having so much fun tweaking and adjusting various bits and pieces of the game. Thank you so much for creating it and sharing it with the world. :)

Does anyone know what the easiest way would be to change certain values for enemies, all at once; or at least more conveniently than going into every, single enemy formation in the game and altering the values one-by-one? Basically what I'm trying to achieve is to increase every enemy's HP by 50%, throughout the entire game.

Also, since using the Beatrix Mod doesn't work with my own mod(s), I wanted to do the manual extraction of Beatrix from Alternate Fantasy, as is explained https://steamcommunity.com/app/377840/discussions/0/353915953249510749/?ctp=2#c276237094325785813. But the link to the .hws file for Alternate Fantasy is dead. Does anyone have an updated link to it?
 
Last edited:
Hello.

Glad you found the problem, charlie_38. The indexings of statuses are indeed confusing, because of a mistake we did early on that lead to shift the indexing by 1 in some places. Sorry about that.

@Kapten Teo: Thanks. Unfortunatly, there is no easy way to do that. The main problem is that there are enemies with a 10,000 extra HP that should not be taken into account but are there for scripting purposes. For example, Plant Brain's HP, internally, are 11,431 HP instead of 1,431 HP, and then its AI script manages the way it dies. If you raised its HP by 50%, it would go up to 17,146 HP and require 7,146 damage to be killed, way more than the expected 50% bonus.
And there are plenty of enemies like that, and there are also enemies with a slightly different system, which makes things more complicated.
So, except for checking the option "Edit similar enemies", I don't see a way to ease the task for you (and you'll still need to take into account these extra 10,000 HP when they are present).

The HWS are found here ("AF & PCP source files").
However, it's been a while since I didn't update these source files (althoug the Beatrix Mod's HWS is up-to-date because I didn't update the mod since a long time), partly because I need to update Hades Workshop and partly because I think people tend to import the .hws files for compatibility reasons for situations in which compatibility should be handled by the Memoria engine instead. There are situations that prevent compatibility unless "compiling a mix of both mods", but most of the time it's rather a matter of file conciseness and priority choices.
Well, for the Beatrix Mod, I should be the one improving the file conciseness. But there, you have the HWS.

Sorry, I really need to update my mods at some point. I focus on improving Memoria and they are lagging behind.
 
Thank you for replying!
Yeah, I figured there would be some things preventing an easy solution to increasing enemy HP across the board. One day I might just do all the adjustments manually, after all.
Thanks for the source files! I'm sorry you're feeling like things are lagging behind, but really, the things you've done for the modding community here are staggering. Kudos!
 
Hi Tirlititi,

No problem about status indexing, once I figured it out I didn't have this issue anymore.

Now  I am struggled with something related to field scripts. Let's see if I can explain it:
I'm trying to set an area in the field where a bubble icon is displayed and then something happens when triggering it. Something similar to Memoria card game spots or Dagger song triggering in Madain Sari. I think I've set up the scripts needed:
-Region_Init: I've defined a polygonal region with four points (X,Y)
-Region_Range: the script with "Bubble(1)"
-Region_SpeakBTN: what happens when you press X on the Bubble.

When I define a new entry as a Region (type 1) in "Edit Entries", I can't manage to make it appear as a Region in the functions list, it will always appear as "Entry_X". When I want to make a character model appear I don't have this issue since once I define the model ID the script is automatically recognised as "Object" type when I parse it.
I've tried to play my mod with these scripts though, but no bubble spot is displayed when going on the polygonal area defined.

Maybe I need to do something else?
 
Hi charlie_38.

The entry names are not very trustful in that regard. Entries are named "Region" as soon as they are initialized (most likely in the function "Main_Init") with "InitRegion", while object entries are named according to the "SetModel" line found in their own functions. You need to compile, close and re-open the script editor to have updated entry names.

I guess your problem is only the "InitRegion", as the rest seems correct. An example of region in the vanilla script using the same method as yours is:
Code: [Select]
Code:
Function Region8_Init    SetRegion( ( -44, 1481 ), ( -159, 1237 ), ( 31, 1169 ), ( 88, 1329 ) )    returnFunction Region8_Range    ifnot ( IsMovementEnabled ) {        return    }    Bubble( 1 )    returnFunction Region8_SpeakBTN    ifnot ( IsMovementEnabled ) {        return    }    // Whatever happens when interacting while inside the region    return
 
Hi Tirlititi,

That was indeed the problem, I've added "InitRegion" in function "Main_Init" and the entries have been initialized as "Region". Now the scripts worked in my mod.

Thanks a bunge!
 
Hey Tirlititi,

As I continue to wrok on my mod, I recompiled HW in order to fix the bug that prevents successfully transfer item changes across Psx disks. Would you be OK with me sharing that? If so, how would you pefer I do that?

-Yerek
 
Last edited:
Hello Yerek.
That would be very great. I should be working again on Hades Workshop in a foreseeable future (maybe a month or so), so it can be part of the version after that.
You can contact me on discord (Tirlititi) if that's OK with you. Another possibility is to create a "Pull Request" on github directly.
 
Hi Tirlititi,

I'd like to add camera movements when you enter some fields. I've managed to do this in field 1866, adding functions like "MoveCamera( 160, 288, 1, 8 )". This field has no scroll following Zidane.
But if I try to do this in other fields in Alexandria, the movements don't execute, or I get a black screen with no field (the sound works fine). 
I've been able to modify a bit the camera when you enter the field, but it keeps "static" and the scroll won't work when you move Zidane.

I've checked Function Zidane_Init and his coordinates from the different field entrances, and I've tried to set similar coordinates X,Y in "MoveCamera" function, so that these movement take place from Zidane's position, but when I reopen the field script these coordinates are somehow "transformed" sometimes. For example, for a field entrance where Zidane's coordinates are:

    case 232:
        set VAR_GlobInt16_0 = 65477
        set VAR_GlobInt16_4 = 7000
        set VAR_GlobInt16_6 = 0
        set VAR_GlobInt16_2 = 65448


If I set "MoveCamera( 65477, 7000, 1, 8 )", HW turns this into "MoveCamera( -59, 7000, 1, 8 )". And then, in the game I get a black screen.

Do you know if there is a way of doing this? I don't know if the scroll that follows Zidane should be edited for this purpose, but I can't manage to identify this funcion in the scripts.

Thanks in advance!
Regards.
 
Hello.
That looks very complicated. I don't know how you should proceed.
I know why it bugs though: the coordinates in functions "Zidane_Init" are the XZY coordinates on the field. They are of type "Int16" so 65477 must indeed be interpreted as -59, there's no problem there. The problem is that the coordinates used by "MoveCamera" are XY coordinates on the screen. The conversion from field coordinates to screen coordinates is all but straightforward. Maybe you can search for other ways to manipulate the camera there (can you add an offset to the camera that follows the player character? I don't remember).
 
Hi Tirlititi,

I've managed to set the camera movements for my mod. At the bottom right corner of the script screen you have a blue dot that you can move through X,Y axes manually if you click on the "MoveCamera" function, and doing so you can see how the camera position in the screen changes, but these converted values for screen coordinates don't seem to work fine in the game. However, if I adjust X,Y values little by little in the function "MoveCamera" taking other fields values as a reference, I finally get to the camera shot I want.

I've also fixed the "static" field issue with the function "ReleaseCamera", that gets the camera back to its normal position after the movements, so that you control Zidane again with the normal scroll that follows him. This is better to do within a scene with disable move and menu functions, so that the camera movements and the turn to its normal behaviour happen without the possibility of moving Zidane through the screen (you can lose him for a while in the screen).

This is indeed complicated, but with (a lot of) patience you can get cool effects :)
 
Hi Tirlititi,

I've been doing some tests in a new HW project, and when I re-loaded the main project in which I'm working HW keeps loading it but never ends, causing HW not responding. It's not the same issue as crashing, which happens randomly as you explained. In this case I never get to open it whenever I try to load it.
I've been able to load a previous version, but this is far in progress from the last version I saved. Does this mean I might have lost my project forever? I'm afraid of redoing it to the point it crashed and that it happens again in some time.
I've tried to change its location in some other folders and also to rename it, but I never get to open it.

Regards.
 
Last edited:
Hi.
I'm afraid so, yes. As said, you really need to save on a different file everytime.
It might be that your .hws are not corrupted and the datas can be technically retrieved, but for that I need to dig into what's the problem and I'm not on it yet.
 
Hi Tirlititi,

I've been saving on different files everytime, although I didn't do this from the very beginning of my project. Could this be the cause?
The previous version I've been able to recover was done in a moment when I did save on a different file, anyway, so I'm not sure if I will experience this issue again if I recontinue my project from this point, saving files this way.
It seems that some .hws can get corrupted in the future even if I could load them without crashing some time ago.
 
Hi everyone, I'm making a sequel to FF9 using unity3D and using Hades Workshop to extract game data

a big thank you to Tirlititi who gave me help with Hades Workshop

I hope you like the video


what do you think of this work?
 
Last edited:
Hey Tirlititi,

I wanted to send you a private message but it doesn't work, sadly if this was asked before but can we edit mods like alternate fantasy or trance seek using Hades workshop? I don't know how it works.

Thanks again for this great modding tool, I was using it a lot before and I had a lot of fun on the PSX version, but on the Steam version i'm quite lost using the application =)

Thanks again and have a nice evening!
 
I've looped back around to manual trance without taking a turn, and I almost have it, but am having trouble finding the column bit in caster/target data. I can find it, but wanted to check if anyone else has to save time.

Also, I found a bit that should be documented in caster/target data. bit 44 mask 2  I.E. $21[44] & 0xFFFF for caster is the current ATB value. Max appears to be a calculated value.

Edit : version is PSX
 
In an older post you mentioned a ppf patch for The Collector rank bug in Tetra Master.

https://www.ff7catalog.com/posts/173970/

The dropbox link to your patch is now dead. Would you please rehost that? I am interested in adding this fix to my Difficulty Tweak mod. After years of not touching it I think that will be a good state to leave it in.

Thanks again for the work that you do :)
 
Okay, so I figured it out, and have trance activating by holding R2 in battle for PSX version. I wanted to share some notes in case they help anyone.

1. bit 104 mask 1 of caster/target data is the character id. (21[104] & 0xFF for caster example would always be 1 when Zidane uses a ability, 2 for Vivi, etc.).

2. I wanted to provide the ASM for two different versions of manual trance in HW's format for anyone who wants them:


First the universal requirement; not automatically activating trance when gauge reaches max :

change the first three lines at 0xB8364 to match this :

Code: [Select]
Code:
$2 = $0 + 255jump 0xB8378$4[120] = $2 & 0xFF
By command :

Insert this code at the start of any formula you are not using, as it will be used as a "Enter trance" formula. Do not replace the default trance formula or the times where certain fights force a specific character in trance will glitch and freeze/crash.

Code: [Select]
Code:
$3 = $19[120] & 0xFF$2 = $0 + 255if ($2 != $3), jump 0xB7910nothing$4 = $19 + $0$19[42] = $3 & 0xFFFFjump 0xBEDBC (store return position to $31)$5 = $0 + 16384jump 0xB7918
Now, the breakdown. The first three lines check if trance gauge is at max (255). If not it jumps to add status in order to become defend when trance is not available. Simply change the jump to 0xB9718 to change that. The rest simply runs the trance formula. Depending on how you want to deploy this, you may want to change to $4 = $19 + $0 to $4 = $21 + $0. The latter simply applies Trance to the caster instead of target, but they'll likely be the same.


The button activation:

I won't explain much here as I don't feel like writing a book today, but I will give enough details for those with knowledge of assembly to understand.  the code goes like this :

Link the Jump (Not Jal) at 0xB0488: to wherever you put the next function. This is the part of the battle loop that will check for the button press.


The function :
Code: [Select]
Code:
$3 = 32775 << 16$3 = $3[14640]nothing$3 = $3 & 0x200if ($3 == $0), jump ENDnothing$2 = 32778 << 16$3 = 32774 << 16$3 = $3[31052]$2 = $2[-26306] & 0xFF$3 = $3[28]nothing$3 = $3[2276]nothing$4 = $3[1784]$5 = $0 + 0LOOP: if ($2 != $5), jump LOOP_INCnothingjump OUT$3 = $4 + 0nothingLOOP_INC: $5 = $5 + 1jump LOOP$4 = $4[0]OUT: $2 = $3[120] & 0xFF$3 = $0 + 255if ($2 != $3), jump ENDnothingjump 0xBEDBC (store return position to $31)$5 = $0 + 16384END: $2 = $18[8] & 0xFFjump 0xB0490$3 = $17[4544]
The first part checks the address for L2 and R2 to see if R2 is pressed. If not it returns to the battle loop. If it is it finds the current character by looping through each slot to find the selected character. Then (OUT) it checks if trance gauge is max. If not it returns to the battle loop. If R2 is pressed, someone's command window is open, and that character's trance gauge is maxed, the character will enter trance at the end of the battle loop.
 
Last edited:
Status
Not open for further replies.
Back
Top