Author Topic: [PSX/PC] General editor - Hades Workshop (0.50b)  (Read 960500 times)

paky-outsider

  • *
  • Posts: 11
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2000 on: 2024-01-07 14:42:45 »
@paky-outsider: No, they are mostly done for the PC version and even for the PC version that is modded with the Memoria Engine Mod.
These 3 points apply to the PSX version as well, but that's pretty much it.
- Fix "ObjectUID_" in scripts so they adapt if you add or remove entries.
- Add a copy/paste feature for texts. Only enemy, world map and field texts can use this feature.
- Add a couple of interface improvements (mainly some more IDs are displayed).


@g_west: These are handled by the field scripts (in "Environment -> Fields -> Edit Script" windows).

The functions that are relevant to this side-quest are mostly those:
1) Picking up the Red Stone: Field Mountain Path/Trail (1550), Function Zidane_48
2) Picking up the Blue Stone: Field Mountain Path/Trail (1551), Function Zidane_15
3) Picking up the Yellow Stone: Field Mountain Path/Roots (1555), Function Zidane_22
4) Picking up the Green Stone: Field Mountain Path/Roots (1557), Function Zidane_14
5) Placing all the stones: Field Mountain Path/Roots (1554), Function Zidane_16

The picking-up functions all look roughly the same. Something like that:
Code: [Select]
Function Zidane_48
    TimedTurn( Angle(2000, 850), 32 )
    WaitTurn(  )
    SetStandAnimation( 2605 ) // Crouch
    RunAnimation( 2607 ) // Idle crouching
    WaitAnimation(  )
    SetTextVariable( 0, 300 ) // "Red Stone"
    WindowSync( 0, 0, 143 ) // "[Item] is set on the stone. Take it out Leave it alone"
    if ( !GetDialogChoice ) {
        Wait( 10 )
        RunSoundCode3( 53248, 1340, 0, -128, 125 ) // Play Sound
        Wait( 10 )
    }
    SetStandAnimation( 200 ) // Idle
    RunAnimation( 2591 ) // Stand up
    if ( !GetDialogChoice ) {
        RunSoundCode3( 53248, 108, 0, -128, 125 ) // Play Sound
        AddItem( 300, 1 ) // Add the Red Stone key item
        SetTextVariable( 0, 300 ) // "Red Stone"
        if ( 1 ) {
            WindowSync( 7, 0, 58 ) // "  Received [Item]!  "
        } else {
            WindowSync( 7, 0, 59 ) // Unused - "  Received [Item] Card!  "
        }
        set VARL_GenBool_2864 = 1
    }
    WaitAnimation(  )
    return
So you see, by changing the ID "300" to something else, you can change the item given at these statues. It also shows how items are given to the player so you can do something similar later on on disk 3.

The function for placing the stones is a bit more complicated (in particular, it uses a variable "VARL_GenUInt8_358" with bitwise operations to keep track of which stones are already placed). It could be done to add another stone requirement (like a custom made "White Stone" or whatever) that would only be picked up in disk 3, but indeed the easiest is to change the reward in one of the pickup spot above + add the missing stone later on in disk 3.

In order to give the missing stone later on, check how to change a chest content that I wrote a long time ago. Most of the time, you'll want to search for the "Chest" functions in field scripts or possibly the "Zidane_XX" functions when the items are placed on the floor and not inside a chest.
It is also possible to add a whole new chest, so you don't replace any other treasure. For that, you mostly need to:
1) Create a new entry in the "Edit Entries" window, of type "Object" (because it will be linked to a chest 3D object).
2) Add functions for that new entry, at least a "Init" (a function of type 0) and a "Range" (a function of type 2). Adding functions is done by right-clicking on the list of functions in the script window. These two functions should be like the functions for existing chests. The "Init" function for instance could look like that:
Code: [Select]
Function ChestA_Init
    SetModel( 75, 0 ) // The model of "ChestA"
    CreateObject( [COORDINATES: Chest position on the field] )
    TurnInstant( [ANGLE: Chest facing angle on the field] )
    SetObjectLogicalSize( 1, 40, 45 )
    SetStandAnimation( 7340 ) // Dummy Close
    SetWalkAnimation( 7340 ) // Dummy Close
    SetRunAnimation( 7340 ) // Dummy Close
    SetObjectFlags( 5 )
    SetHeadFocusMask( 2, 0 )
    if ( [CONDITION: Chest content already picked up] ) {
        SetStandAnimation( 7338 ) // Dummy Open
    } else {
        SetStandAnimation( 7339 ) // Dummy Close
    }
    SetObjectFlags( 49 )
    EnableHeadFocus( 0 )
    return
3) Add a line "InitObject" next to the others in the function "Main_Init" to actually create the chest object when entering the field.


Sorry for the late answers.

Hi Tirlititi and happy new year to everyone who still enjoying this game.
I'm on my way to mod 3rd disk of psx version.
I've to stop and re-mod the entire disk 2 fields, 'cause i overwrite the binary file directly, 'cause of some issues in Iifa Tree fields that stuck the game. Many of these fields, even if you don't modify anythings, if you parse them, appears some errors.
So i don't touch them (except two or three things). It works.
Something like that it happens on disk 3, pandemonium fields, because of my modification, i suppose.
In 3rd disk i'd wanted to add Beatrix in the party...the idea is switch Freya to Beatrix (simply adjustment of SetPartyReserve and SetCharacterData) but in many places there are some troubles: Desert Palace, Oeilivert, Gulgu, Ipsen Castle and so on till to Branbal. The code of the game, often checks who is in your party (is in party check, or with other VARiables) to put in game fields this o that character. Even if from Quina, Eiko and Amarant to Cinna, Marcus and Blank, I made it, It doesn't work if you adjust these checks to say to the game "if Beatrix is in the party you've to act like Freya is in the party".
Now, 'cause of Pandemonium fields problems, i rewrited fields only to have Tantalus... I added Beatrix in some battles (like when you search amarant in Ipsen Castle with Zidane solo party).

1) Any suggestions?

2) Where (or with what) i can edit something about trance models on psx version?
I've already gave trance to Cinna, Marcus and Blank removing Change Model line in Spell animation for Trance Activate --- but, you know, i'm wondering, for example, can i associate blank with pluto suit like trance version of Blank?
And on it, how can i choose (or set) this suit for Blank, in normal game?

It's almost a year that i've started to mod the game thank to this forum, to you Tirlititi and to who posts here throught the years.

Thanks.
« Last Edit: 2024-01-07 15:05:45 by paky-outsider »

Tirlititi

  • *
  • Posts: 883
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2001 on: 2024-01-07 17:15:34 »
Sorry, I can't help you with those.

1) Yes, the game script isn't meant to allow Beatrix in multiple instances. The Desert Palace / Oeilvert split being surely the biggest obstacle. You'd need to create a bunch of functions to have Beatrix appear in these scenes or even to avoid crashes and soft-locks.
Everytime the script uses something like "RunScriptSync( XX, 252, XX )", it searches for a script linked to one of the 4 party members. It soft-locks if Beatrix is that party member and doesn't have the corresponding function. That kind of thing is used a lot for animations, walks, dialogs... in places where the characters present aren't fixed. And as you said, there are also a lot of "IsInParty" checks, sometimes in scripts that assume that "IsInParty(X)" works for exactly 3 characters when X ranges from 1 to 7...
Honestly, that's a huge work to make and it couldn't even be automatized because each script works differently and should be fixed in a different way.

2) You can't do that for the PSX version. Removing the Change Model line is the furthest thing you can do there. I'm actually not even sure if Blank's Pluto Armor model exists in the discs 2, 3 and 4 in the PSX version (or maybe the battle model exists but not the field version).
I guess searching for the IDs of the trance models in the binary file could lead to some results. If you're lucky, these IDs are stored in a row or in a pattern that could be found. Again, that requires the use of a hexa-decimal file editor, not something that HW can do.
The list of model IDs used in the game can be downloaded here.

ste459

  • *
  • Posts: 14
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2002 on: 2024-01-21 09:35:19 »
Back to Hades Workshop after a long time  :) Nice to see that FF9 modding is still active!
Congratulations Tirlititi for your wonderful work!

If it were possible I would like to ask for an help. My goal is to create a multi-hit skill for Steiner or Zidane, inspired from limit breaks of previous FF games. The character shoud run towards target (or targets), hit with multiple sword attacks (dealing and displaying damage with every single hit) and then come back. I tried to edit the spell sequencing using Iai strike for animations, but the result was a mess. I am not able to make Steiner run towards the 2nd target after the first damage point and before jumping back (maybe I need to insert some of the unknow instructions like 0x50., 0x71?). It is possible to make a skill like what I intend to do? Is it the only way to do that?
Thanks in advance!

Tirlititi

  • *
  • Posts: 883
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2003 on: 2024-01-21 15:43:55 »
Since you have the Steam version of the game, you can use Memoria's feature for doing things like that. For that, you need to have Memoria updated to some recent version if you haven't done that already: https://github.com/Albeoris/Memoria/releases/latest.
Then, use custom ".seq" files. These are similar to the animation sequences you can edit in Hades Workshop but they allow much more things.

For example, in Alternate Fantasy, I used this sequence file for one of Zidane's ability: it performs a double-hit much like what you want (I think).
Code: [Select]
// Player sequence of SFX Iai_Strike_2
// Used by Zidane (Windfall with a dagger)

WaitAnimation: Char=Caster
Message: Text=[CastName] ; Priority=1 ; Title=True ; Reflect=True
SetupReflect: Delay=SFXLoaded
LoadSFX: SFX=Iai_Strike_1 ; Reflect=True ; UseCamera=False
PlayAnimation: Char=Caster ; Anim=MP_SET
WaitAnimation: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=670 ; UseCollisionRadius=True ; Anim=MP_RUN
Turn: Char=Caster ; BaseAngle=AllTargets ; Time=4
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=400 ; UseCollisionRadius=True ; Anim=MP_RUN_TO_ATTACK
WaitMove: Char=Caster
StartThread
Wait: Time=4
WaitSFXLoaded: SFX=Iai_Strike_1
PlaySFX: SFX=Iai_Strike_1
WaitSFXDone: SFX=Iai_Strike_1
EndThread
PlayAnimation: Char=Caster ; Anim=MP_ATTACK
WaitAnimation: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=-200 ; UseCollisionRadius=True ; Time=0
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=1100 ; UseCollisionRadius=True ; Anim=MP_STEP_BACK
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=670 ; UseCollisionRadius=True ; Anim=MP_RUN
Turn: Char=Caster ; BaseAngle=AllTargets ; Time=4
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=400 ; UseCollisionRadius=True ; Anim=MP_RUN_TO_ATTACK
WaitMove: Char=Caster
StartThread
Wait: Time=4
WaitSFXLoaded: SFX=Iai_Strike_1
PlaySFX: SFX=Iai_Strike_1
WaitSFXDone: SFX=Iai_Strike_1
EndThread
PlayAnimation: Char=Caster ; Anim=MP_ATTACK
WaitAnimation: Char=Caster
MoveToPosition: Char=Caster ; AbsolutePosition=Default ; Anim=MP_BACK
Turn: Char=Caster ; BaseAngle=Default ; Time=4
WaitMove: Caster
PlayAnimation: Char=Caster ; Anim=Idle
WaitTurn: Char=Caster
ActivateReflect
WaitReflect
By having this file saved as "{Mod Folder}/StreamingAssets/Data/SpecialEffects/ef030/Sequence.seq", the abilities that use the spell effect "Iai Strike 2" (that you can pick in Hades Workshop) will perform a double-hit with the Iai Strike effect.

You can find more informations on how to write .seq files on the wiki: https://github.com/Albeoris/Memoria/wiki/Battle-SFX-Sequence

ste459

  • *
  • Posts: 14
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2004 on: 2024-01-21 20:12:59 »
Thanks! Yes, this is very similar to what I had in mind (even the same animation!).

I tested and worked perfectly for a single target. I'm trying now to edit the sequence to make a multi-target spell, in my intentions the character should be able to hit once (or maybe twice) every enemy, one-by-one. The main obstacle is that I have zero programming knowledge  ;D
I tried to edit the sequence as follows:

Code: [Select]
/ Player sequence of SFX Iai_Strike_2
// Used by Zidane (Windfall with a dagger)

WaitAnimation: Char=Caster
Message: Text=[CastName] ; Priority=1 ; Title=True ; Reflect=True
SetupReflect: Delay=SFXLoaded
LoadSFX: SFX=Iai_Strike_1 ; Reflect=True ; UseCamera=False
PlayAnimation: Char=Caster ; Anim=MP_SET
WaitAnimation: Char=Caster
MoveToTarget: Char=Caster ; Target=FirstTarget ; Distance=670 ; UseCollisionRadius=True ; Anim=MP_RUN
Turn: Char=Caster ; BaseAngle=FirstTarget ; Time=4
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=FirstTarget ; Distance=400 ; UseCollisionRadius=True ; Anim=MP_RUN_TO_ATTACK
WaitMove: Char=Caster
StartThread
Wait: Time=4
WaitSFXLoaded: SFX=Iai_Strike_1
PlaySFX: SFX=Iai_Strike_1
WaitSFXDone: SFX=Iai_Strike_1
EndThread
PlayAnimation: Char=Caster ; Anim=MP_ATTACK
WaitAnimation: Char=Caster
MoveToTarget: Char=Caster ; Target=FirstTarget ; Distance=-200 ; UseCollisionRadius=True ; Time=0
MoveToTarget: Char=Caster ; Target=FirstTarget ; Distance=1100 ; UseCollisionRadius=True ; Anim=MP_STEP_BACK
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=SecondTarget ; Distance=670 ; UseCollisionRadius=True ; Anim=MP_RUN
Turn: Char=Caster ; BaseAngle=SecondTarget ; Time=4
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=SecondTarget ; Distance=400 ; UseCollisionRadius=True ; Anim=MP_RUN_TO_ATTACK
WaitMove: Char=Caster
StartThread
Wait: Time=4
WaitSFXLoaded: SFX=Iai_Strike_1
PlaySFX: SFX=Iai_Strike_1
WaitSFXDone: SFX=Iai_Strike_1
EndThread
PlayAnimation: Char=Caster ; Anim=MP_ATTACK
WaitAnimation: Char=Caster
MoveToTarget: Char=Caster ; Target=SecondTarget ; Distance=-200 ; UseCollisionRadius=True ; Time=0
MoveToTarget: Char=Caster ; Target=SecondTarget ; Distance=1100 ; UseCollisionRadius=True ; Anim=MP_STEP_BACK
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=ThirdTarget ; Distance=670 ; UseCollisionRadius=True ; Anim=MP_RUN
Turn: Char=Caster ; BaseAngle=ThirdTarget ; Time=4
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=ThirdTarget ; Distance=400 ; UseCollisionRadius=True ; Anim=MP_RUN_TO_ATTACK
WaitMove: Char=Caster
StartThread
Wait: Time=4
WaitSFXLoaded: SFX=Iai_Strike_1
PlaySFX: SFX=Iai_Strike_1
WaitSFXDone: SFX=Iai_Strike_1
EndThread
PlayAnimation: Char=Caster ; Anim=MP_ATTACK
WaitAnimation: Char=Caster
MoveToTarget: Char=Caster ; Target=ThirdTarget ; Distance=-200 ; UseCollisionRadius=True ; Time=0
MoveToTarget: Char=Caster ; Target=ThirdTarget ; Distance=1100 ; UseCollisionRadius=True ; Anim=MP_STEP_BACK
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=FourthTarget ; Distance=670 ; UseCollisionRadius=True ; Anim=MP_RUN
Turn: Char=Caster ; BaseAngle=FourthTarget ; Time=4
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=FourthTarget ; Distance=400 ; UseCollisionRadius=True ; Anim=MP_RUN_TO_ATTACK
WaitMove: Char=Caster
StartThread
Wait: Time=4
WaitSFXLoaded: SFX=Iai_Strike_1
PlaySFX: SFX=Iai_Strike_1
WaitSFXDone: SFX=Iai_Strike_1
EndThread
PlayAnimation: Char=Caster ; Anim=MP_ATTACK
WaitAnimation: Char=Caster
MoveToPosition: Char=Caster ; AbsolutePosition=Default ; Anim=MP_BACK
Turn: Char=Caster ; BaseAngle=Default ; Time=4
WaitMove: Caster
PlayAnimation: Char=Caster ; Anim=Idle
WaitTurn: Char=Caster
ActivateReflect
WaitReflect

However this code makes Steiner hit always 4 times (even if there are <4 enemies), furthermore the damage is dealt to all the enemies with every hit. I've checked the Memoria's wiki u linked, but I'm still not sure of how can I fix this (maybe I need a target loop thread?).

Thanks in advance for your suggestions and your time!!

Tirlititi

  • *
  • Posts: 883
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2005 on: 2024-01-22 09:42:29 »
Exactly, you need a target loop thread with the option "Chain". You also need to redo a "LoadSFX" operation when you change the target, which is the reason why it applied to all the targets everytime.

Something like:
Code: [Select]
StartThread: TargetLoop ; Chain ; Sync
LoadSFX: SFX=Iai_Strike_1 ; Target=AllTargets ; Reflect=True ; UseCamera=False
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=670 ; UseCollisionRadius=True ; Anim=MP_RUN
Turn: Char=Caster ; BaseAngle=AllTargets ; Time=4
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=400 ; UseCollisionRadius=True ; Anim=MP_RUN_TO_ATTACK
WaitMove: Char=Caster
StartThread
Wait: Time=4
WaitSFXLoaded: SFX=Iai_Strike_1
PlaySFX: SFX=Iai_Strike_1
WaitSFXDone: SFX=Iai_Strike_1
EndThread
PlayAnimation: Char=Caster ; Anim=MP_ATTACK
WaitAnimation: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=-200 ; UseCollisionRadius=True ; Time=0
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=1100 ; UseCollisionRadius=True ; Anim=MP_STEP_BACK
WaitMove: Char=Caster
EndThread

ste459

  • *
  • Posts: 14
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2006 on: 2024-01-22 22:28:42 »
Thanks!!! Works great
I used your code to make a double-hit, multi target ability for Steiner. I added a check to prevent him from hitting again an enemy already killed by the first strike, and made minor tweaks like playing the victory animation at start.
The result is quite funny, especially when using custom flags to allow criticals  8)


Code: [Select]
WaitAnimation: Char=Caster
Message: Text=[CastName] ; Priority=1 ; Title=True ; Reflect=True
SetupReflect: Delay=SFXLoaded
SetBackgroundIntensity: Intensity=0.5 ; Time=4 ; HoldDuration=50
Wait: Time=30
PlayAnimation: Char=Caster ; Anim=MP_WIN
WaitAnimation: Char=Caster
WaitTurn: Char=Caster
StartThread: TargetLoop ; Chain ; Sync
LoadSFX: SFX=Iai_Strike_1 ; Target=AllTargets ; Reflect=True ; UseCamera=False
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=670 ; UseCollisionRadius=True ; Anim=MP_RUN
Turn: Char=Caster ; BaseAngle=AllTargets ; Time=4
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=400 ; UseCollisionRadius=True ; Anim=MP_RUN_TO_ATTACK
WaitMove: Char=Caster
StartThread
Wait: Time=4
WaitSFXLoaded: SFX=Iai_Strike_1
PlaySFX: SFX=Iai_Strike_1
WaitSFXDone: SFX=Iai_Strike_1
EndThread
PlayAnimation: Char=Caster ; Anim=MP_ATTACK
WaitAnimation: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=-200 ; UseCollisionRadius=True ; Time=0
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=500 ; UseCollisionRadius=True ; Anim=MP_STEP_BACK
WaitMove: Char=Caster
EndThread
StartThread: TargetLoop ; Chain ; Sync
StartThread: Condition=TargetHP != 0 ; Sync
LoadSFX: SFX=Iai_Strike_1 ; Target=AllTargets ; Reflect=True ; UseCamera=False
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=670 ; UseCollisionRadius=True ; Anim=MP_RUN
Turn: Char=Caster ; BaseAngle=AllTargets ; Time=4
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=400 ; UseCollisionRadius=True ; Anim=MP_RUN_TO_ATTACK
WaitMove: Char=Caster
StartThread
Wait: Time=4
WaitSFXLoaded: SFX=Iai_Strike_1
PlaySFX: SFX=Iai_Strike_1
WaitSFXDone: SFX=Iai_Strike_1
EndThread
PlayAnimation: Char=Caster ; Anim=MP_ATTACK
WaitAnimation: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=-200 ; UseCollisionRadius=True ; Time=0
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=500 ; UseCollisionRadius=True ; Anim=MP_STEP_BACK
WaitMove: Char=Caster
EndThread
EndThread
SetBackgroundIntensity: Intensity=1 ; Time=8
MoveToPosition: Char=Caster ; AbsolutePosition=Default ; Anim=MP_BACK
Turn: Char=Caster ; BaseAngle=Default ; Time=4
WaitMove: Caster
PlayAnimation: Char=Caster ; Anim=Idle
WaitTurn: Char=Caster
ActivateReflect
WaitReflect


There is just an issue. I tested this spell against Yans and noticed that after getting hit twice they countered with Float against themselves. I remember that this bug may happen when an enemy able to counterattack gets hit by a double damaging spell, right? There is now a way to fix that, other than disabling counterattacks for the specific spell I made?
I tried to activate CountersBetterTarget in Memoria.ini with no result
« Last Edit: 2024-01-23 12:09:56 by ste459 »

Tirlititi

  • *
  • Posts: 883
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2007 on: 2024-01-23 17:12:05 »
I don't understand why there is this issue with a counter-float on themselves, sorry. I don't know where it comes from. I'm afraid that you'll have to investigate that issue yourself. "CounterBetterTarget" only applies to party members' counters so you don't need to take it into account when checking things. I would say you should rather check Yan's IA.

I don't get why they would target themselves because they don't have any spell that would target themselves normally. So even if there is some kind of mess because of 2 counters being queued simultaneously (and there shouldn't: the behaviour now should be that any new counter is dismissed until the 1st counter is performed), I don't see how the target could end up being themselves.

ste459

  • *
  • Posts: 14
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2008 on: 2024-01-23 19:58:10 »
Ok, I'm happy if it is not a known issue, maybe I only messed up something while modding, I'll do some check.

Thanks again Tirliti!!

razzle

  • *
  • Posts: 1
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2009 on: 2024-02-13 14:35:09 »
This is my first time using this mod, and I followed all the directions for installing. However, my problem is that every time I modify something, like changing "thunder" to "thunderZ" just for testing, after saving it using the save Steam mod and attempting to close the app, it says, "There are unsaved changes.

Tirlititi

  • *
  • Posts: 883
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2010 on: 2024-02-20 08:47:26 »
You should better always save your mod as "Steam Mod" but also as HWS saves ("File -> Save Mod").
You cannot resume the modding of the game after closing Hades Workshop if you don't do that: Hades Workshop should always load the base game when you open it: you can resume a mod you previously started by using "File -> Open Mod" and selecting the HWS file you previously saved.

charlie_38

  • *
  • Posts: 4
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2011 on: 2024-02-24 20:16:48 »
Hi Charlie_38.
There's no problem. Me and other people have done it without noticing any bug and there shouldn't be any. There would be issues if you tried to load a HWS that was created with HW v0.50b into the older version of HW v0.43, but the other way around is designed to work fine.

Hi Tirlititi,

I've noticed that this new version exports csv files that don't have all items, in StreamingAssets\Data\Items folder.
For example, "Weapons.csv" file, when exported from HW, contains the weapons I've modded and some of the rest of non-modded weapons, but not all of them.
I also have an issue with "Items.csv" and "ItemEffects.csv" files, since they don't contain all items ids. Then, when playing game, some attacks or actions don't work fine, like for example giving an elixir or a phoenix down to a party member.
I've modded some armours and none of them appear in "Armours.csv" file when exported. Only five items appear, and they are all non-modded.

However, text files in FF9_Data\embeddedasset\text folder contain only the modded stuff and they work fine. I guess it is because the tag "[TXID=X]" that must mean something like "mantain the name of the non-modded items until the item X that is modded".

Is this caused because my project was started with a previous HW version? Should I configure something else in HW?

Apart from this issue, in the Help window of HW, it says:

"[Scripts]
You can't edit the World Maps' scripts in the Japanese version of the game."

Does this still happen if you change language setting in HW to Japanese, and edit worldmaps' scripts?

Regards!
« Last Edit: 2024-02-28 22:20:40 by charlie_38 »

Tirlititi

  • *
  • Posts: 883
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2012 on: 2024-03-02 15:22:13 »
Hello charlie_38,

Regarding the non-complete CSV and MES files, that's normal. You must get an up-to-date version of Memoria in order for it to work properly though. So once you've updated Memoria, it should be all good.

Regarding that note in the Help window, it only concerns the PSX Japanese version of the game. If I recall correctly, one of the World Maps used for debugging had a "corrupted" script that would make Hades Workshop crash if it tried to read it. In the Steam version of the game, that's not a problem anymore and you can indeed edit the Japanese World Maps' scripts if you change language setting in HW to Japanese and it will work fine.

charlie_38

  • *
  • Posts: 4
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2013 on: 2024-03-02 20:57:32 »
Hi Tirlititi,

I had already updated Memoria (v2023.06.11), and I started to use this new version of HW afterwards. I've just re-updated Memoria though, to check again.
The curious thing about this is that it seems to work fine with a new project: it only exports the changes you make, and then in game everything works correctly. But if I load my HW project and export, the CSV files are exported in the way I explained. That's why I thought it might have something to do with the version of my project: it will only work fine in game if I have the CSV files with all items.

Regarding the note in the Help windows, I had not read the top of that section: it clearly says that all those issues only apply for the PSX version. Sorry for not reading it from the beginning, LOL.


stir472

  • *
  • Posts: 18
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2014 on: 2024-03-03 21:36:22 »
Hii tirlititi, I am curious to know if there will be a memory or hadesworkshop update in the coming months, greetings. I love your job

Yerek

  • *
  • Posts: 1
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2015 on: 2024-04-04 12:04:03 »
First, just want to say I love the tool you've made. Second I was wondering if anyone had any ideas on a problem I am running into. I made a psx mod that makes the defend conmand activate trance only if at max gauge (auto trance is disabled as well), but because a command is used to enter trance, it increments the trance gauge down one turn right after activating it. Does anyone have any ideas on a way to fix this? I haven't found anything myself,  but wanted to check and see if anyone else has any ideas.

Sombra

  • *
  • Posts: 1
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2016 on: 2024-04-21 08:09:39 »
Hello people. I need help.
1. I want to know which files have information about chocographs/vials/cracks in the rocks.  And how can I change its contents?
2. How can I change enemies behavior? For example I added curaga skill for Grand Dragon, but he doesn't use it in battle.
« Last Edit: 2024-04-21 23:24:35 by Sombra »

g_west

  • *
  • Posts: 31
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2017 on: 2024-06-04 21:17:38 »
Hey Tirlititi,

It's been a while and you probably don't remember. Last time I asked you about the colored stones and switching things up a bit with that. Well I picked up modding again FF9 again, and I reread through your reply regarding my last question, but I find I'm still stuck. I know very little about coding, but so far I've managed to change quite a bit. I have hit a road block however, and it's making me want to pull my hair out.

I want to change what the player receives from depositing the colored stones in Conde Petie Mountain Path, and I want to change when this is possible. I got the first part working no problem, the second part eludes me. My plan was to switch out the Blue Stone for a Sapphire (no problem) and put the Blue Stone in a chest in Mount Gulug (again, no problem). This way, the player has to wait till disc three to deposit the last colored stone. However, when I take the sapphire out of the Blue Stone statue on the Mountain Path, the game registers it as me having the Blue Stone in my inventory, even when I don't, as it's been changed to a Sapphire. I'm guessing the simple act of removing any item from the statues triggers some kind of command to let the game know to make the "Deposit Blue Stone" option appear in the Deposit Statue. My question is, how would I remove that command and tie it to the chest it Mount Gulug instead? Is this even possible?

g_west

  • *
  • Posts: 31
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2018 on: 2024-06-04 22:01:06 »
Hey Sombra,

To change the chocograph treasures you need to to go to Environment -> World Map -> Global Map. There you'll see a list. "World Map: No Transport," "World Map/Event: Cargo Ship," etc. In the first one, "World Map: No Transport," look for "Function World_Chest_39" and you'll see something like this.

Function World_Chest_39
    set VAR_LocUInt8_8 = ( ( Chocobo_WorldChestFound >> ( GetCurrentChocograph - 1 ) ) & 1 )
    switch 2 ( VAR_LocUInt8_8 ) from 0 {
    case +0:
        switch 24 ( GetCurrentChocograph ) from 1 {
        case +0:
            set Chocobo_WorldChestFound |= 1
            set VAR_LocUInt8_9 = 239 -> WHAT THE TREASURE IS
            set VAR_LocUInt8_14 = 2 -> HOW MANY YOU GET
            set VAR_LocUInt8_10 = 237
            set VAR_LocUInt8_15 = 3
            set VAR_LocUInt8_11 = 238
            set VAR_LocUInt8_16 = 4
            set VAR_LocInt16_12 = 140
            set VAR_LocUInt8_17 = 2

This is the first chocograph. I already changed mine so the "140" value at the bottom will be different for you. Underneath this in the same function window will be all the other treasures. "Case 0" is the first chocograph and "Case 1" is the second and so on.

To change the cracks and bubbles, it is the same thing, except it's under "Function World_Chocobo_15" and ""Function World_Chocobo_16" respectively.

Now that being said, it'll be different for each category under Environment -> World Map -> Global Map. So for example, in "World Map: Blue Narciss" it won't be ""Function World_Chest_39" it will be "Function World_Chest_41" It changes for each category, and you have to change them all because the game sees the same chests as different depending on how far along you are in the story. I find the best way to do this is to make all the changes in "World Map: No Transport," -> "Function World_Chest_39," and then just copy and paste the new list into the others i.e., "World Map: Blue Narciss" -> "Function World_Chest_41" and so on. You can skip the ones that say "Event" or "Dagger," as you don't have access to a chocobo during those times.

As for the Grand Dragon problem, I don't know how to add moves, but changing them is easy. So, for example, Grand Dragon has two Thundaga moves and we want to make one of them Curaga. So click on one of the two Thundagas and on the left hand side by the spell name, click the ... and manually change the name. Below the spell name is the type of attack, change it to "Magic Heal." "Power" and "Element" are self explanatory. "Accuracy" is tied to the "Status." If you want to add a status to a move, you need to also increase the accuracy. Some attack types can't add statuses, like "Magic Heal," for example. Below that is MP Cost, which should be self explanatory, and below that is probably where your problem is. "Animation," you have to change the animation in the drop down menu to the far right AND under "Edit Animation." At the bottom of the main spell page, make sure to change the targeting parameters, or the Grand Dragon will be healing your party.

Tirlititi

  • *
  • Posts: 883
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2019 on: 2024-06-05 10:57:06 »
Hello g_west,

After checking the code, there's indeed an extra subtlety in the way that side-quest is coded. The possibility to deposit the stones depends on a treasure variable instead of whether you have the stones themselves (the key items) in your inventory. Here are the scripts explained:

Code: [Select]
// The function to pick the Blue Stone, in Mountain Path/Trail (1551)
Function Zidane_15
    // The following lines are the movement of Zidane crouching in front of the statue
    TimedTurn( Angle(2679, 3842), 32 )
    WaitTurn(  )
    SetStandAnimation( 2605 )
    RunAnimation( 2606 )
    WaitAnimation(  )

    // This replaces "[ITEM=0]" in the dialog right below by the name of the item 301 (Blue Stone)
    SetTextVariable( 0, 301 )
    // Display the dialog with two choices: "[ITEM=0] is set on the stone. Take it out Leave it alone"
    WindowSync( 0, 0, 143 )

    // The check "!GetDialogChoice" is synonymous to "GetDialogChoice == 0", eg. the player chose "Take it out"
    if ( !GetDialogChoice ) {
        Wait( 10 )
        // Play the pickup sound
        RunSoundCode3( 53248, 1340, 0, -128, 125 )
        Wait( 10 )
    }

    // The following lines are the movement of Zidane standing up
    SetStandAnimation( 200 )
    RunAnimation( 2590 )

    if ( !GetDialogChoice ) {
        // So, this whole block executes only if the player chose "Take it out"
        RunSoundCode3( 53248, 108, 0, -128, 125 )

        // Give the key item "Blue Stone" to the player
        AddItem( 301, 1 )
        // Same as above: replaces "[ITEM=0]" by "Blue Stone" in the upcoming dialog
        SetTextVariable( 0, 301 )

        // Blocks with "if ( 1 )" always execute; it's a technical leftover to have a "if" block there and it could just have been "WindowSync( 7, 0, 58 )"
        if ( 1 ) {
            // Display the dialog "Received [ITEM=0]!"
            WindowSync( 7, 0, 58 )
        } else {
            // That part is thus never executed and could be completly removed, it wouldn't make any difference
            WindowSync( 7, 0, 59 )
        }

        // THERE, this is the added subtlety: this variable is a "treasure picked" memo.
        // It is enabled once you picked the treasure and usually it
        // (1) makes sure that you cannot pick the same treasure multiple times
        // (2) counts toward the treasure rank score
        // But there, it will also be used to allow the player to place the Blue Stone in the other statue
        set VARL_GenBool_2865 = 1
    }
    WaitAnimation(  )
    return

Code: [Select]
// The function to place the different stones, in Mountain Path/Roots (1554)
// I'll write much less details there
Function Zidane_16
    SetWalkTurnSpeed( 64 )
    SetPathing( 0 )
    SetWalkSpeed( 30 )
    InitWalk(  )
    WalkXZY( 1445, 174, 1243 )
    TimedTurn( 160, 32 )
    WaitTurn(  )
    SetStandAnimation( 2605 )
    RunAnimation( 2607 )
    WaitAnimation(  )
    set VAR_LocUInt8_0 = 0
    SetTextVariable( 0, 300 ) // Replace "[ITEM=0]" by "Red Stone"
    SetTextVariable( 1, 301 ) // Replace "[ITEM=1]" by "Blue Stone"
    SetTextVariable( 2, 302 ) // Replace "[ITEM=2]" by "Yellow Stone"
    SetTextVariable( 3, 303 ) // Replace "[ITEM=3]" by "Green Stone"


    // Here's the tricky part: the variable "VARL_GenUInt8_358" is tied to "VARL_GenBool_2865"
    // "VARL_GenBool_2865" is actually the second bit in "VARL_GenUInt8_358"

    // So "VARL_GenUInt8_358" is organised in 8 bits:
    // The first 4 bytes are "have you picked up the stones"
    // The last 4 bytes are "have you placed the stones"

    // "VARL_GenUInt8_358 != 255" is "as long as there's a bit that is not set"
    // ie. "as long as the side-quest isn't over"

    // "( ( VARL_GenUInt8_358 & ( ~( VARL_GenUInt8_358 >> 4 ) ) ) & 15 )" is a complex formula that enables the different choices
    // It enables a choice if the related item (1) has been picked and (2) has not been placed yet

    while ( ( !VAR_LocUInt8_0 ) && ( VARL_GenUInt8_358 != 255 ) ) {
        EnableDialogChoices( ( ( VARL_GenUInt8_358 & ( ~( VARL_GenUInt8_358 >> 4 ) ) ) & 15 ) | 16, 0 )

        // "There’s a hole. Put [ITEM=0] in. Put [ITEM=1] in. Put [ITEM=2] in. Put [ITEM=3] in. Leave it alone"
        WindowSync( 0, 0, 144 )

        if ( GetDialogChoice == 4 ) {
            // "Leave it alone" -> Exit the loop
            set VAR_LocUInt8_0 = 1
        } else {
            // Update "VARL_GenUInt8_358" in order to say that the stone has been placed
            set VARL_GenUInt8_358 |= ( 1 << ( GetDialogChoice + 4 ) )
            SetTextVariable( 4, GetDialogChoice + 300 )
            RemoveItem( GetDialogChoice + 300, 1 )
            WindowSync( 0, 0, 145 ) // "Put in [ITEM=4]"
            RunSoundCode3( 53248, 1339, 0, -128, 125 )
        }
    }

    // etc...
    if ( VARL_GenUInt8_358 == 255 ) {
        WindowSync( 0, 128, 146 ) // "Zidane “Hmm?  Something came out from the back...”"
            if ( GetItemCount(229) < 99 ) { // Can carry another Moonstone
                if ( VARL_GenBool_7381 == 0 ) {
                    RunSoundCode3( 53248, 108, 0, -128, 125 )
                    set VARL_GenBool_7381 = 1
                    SetTextVariable( 0, 229 )
                    AddItem( 229, 1 )
                    WindowSync( 7, 0, 58 ) // "Received Moonstone!"
                }
            } else {
                WindowSync( 7, 0, 62 ) // "Cannot carry another Moonstone."
            }
        }
    }
    SetStandAnimation( 200 )
    RunAnimation( 2591 )
    WaitAnimation(  )
    TimedTurn( 32, 32 )
    WaitTurn(  )
    InitWalk(  )
    WalkXZY( 1327, 170, 1228 )
    MoveInstantXZY( 1327, 170, 1228 )
    SetPathing( 1 )
    return

In order to check for the presence of the items in the player's inventory instead of the treasure pickup flag, you can use the following code instead and use "allocate 2" in the local variable panel.
Code: [Select]
    set VAR_LocUInt8_1 = GetItemCount(300)
    set VAR_LocUInt8_1 |= (GetItemCount(301) << 1)
    set VAR_LocUInt8_1 |= (GetItemCount(302) << 2)
    set VAR_LocUInt8_1 |= (GetItemCount(303) << 3)

    // Replace "VARL_GenUInt8_358 != 255" by "(VARL_GenUInt8_358 & 240) != 240"
    while ( ( !VAR_LocUInt8_0 ) && ( (VARL_GenUInt8_358 & 240) != 240 ) ) {
        EnableDialogChoices( ( ( VAR_LocUInt8_1 & ( ~( VARL_GenUInt8_358 >> 4 ) ) ) & 15 ) | 16, 0 )
        // etc..
    }

    // Also for the reward that marks the end of the side-quest
    if ( (VARL_GenUInt8_358 & 240) == 240 ) {
        WindowSync( 0, 128, 146 ) // "Zidane “Hmm?  Something came out from the back...”"
        // etc...
    }

g_west

  • *
  • Posts: 31
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2020 on: 2024-06-05 18:49:38 »
Hot damn, that worked!

Thank you Tirlititi, you're the greatest. I think I'm starting to understand this stuff a bit better.

Thanks again.

g_west

  • *
  • Posts: 31
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2021 on: 2024-06-05 19:12:11 »
Hey Tirlititi,

I, uh, I may have spoken too soon...

So the code works with the blue stone, when I pick it up (now a sapphire) and I go to deposit it, there is no longer an option to deposit the blue stone. That part works perfectly. However...

https://imgur.com/a/ff9-mod-problems-t8gsjzA

Pictures of my new problem (the flametongue is just a renamed flame saber). I'm currently looking at the altered code, but I'm not sure what's going wrong.

Here's the altered code you gave me.

    WaitAnimation(  )
    set VAR_LocUInt8_0 = 0
    set VAR_LocUInt8_1 = GetItemCount(300)
    set VAR_LocUInt8_1 |= ( GetItemCount(301) << 1 )
    set VAR_LocUInt8_1 |= ( GetItemCount(302) << 2 )
    set VAR_LocUInt8_1 |= ( GetItemCount(303) << 3 )
    while ( ( !VAR_LocUInt8_0 ) && ( ( VARL_GenUInt8_358 & 240 ) != 240 ) ) {
        EnableDialogChoices( ( ( VAR_LocUInt8_1 & ( ~( VARL_GenUInt8_358 >> 4 ) ) ) & 15 ) | 16, 0 )
        WindowSync( 0, 0, 144 )
        if ( GetDialogChoice == 4 ) {
            set VAR_LocUInt8_0 = 1
        } else {
            set VARL_GenUInt8_358 |= ( 1 << ( GetDialogChoice + 4 ) )
            SetTextVariable( 4, GetDialogChoice + 300 )
            RemoveItem( GetDialogChoice + 300, 1 )
            WindowSync( 0, 0, 145 )
            RunSoundCode3( 53248, 1339, 0, -128, 125 )
        }
    }
    if ( ( VARL_GenUInt8_358 & 240 ) == 240 ) {
        WindowSync( 0, 128, 146 )
        if ( 0 ) {
            RunSoundCode3( 53248, 108, 0, -128, 125 )

I may have messed up and there is something I'm not seeing? I can't find the values for any of the items listed in the images, but as you can see, the item name for the red stone changes depending on what other stones I've picked up.

Any ideas?

Also, I made sure to change the Local Variable Panel to "allocate 2"
« Last Edit: 2024-06-05 19:23:33 by g_west »

Tirlititi

  • *
  • Posts: 883
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2022 on: 2024-06-05 22:00:13 »
You removed the following lines from the base script:
Code: [Select]
    SetTextVariable( 0, 300 ) // Replace "[ITEM=0]" by "Red Stone"
    SetTextVariable( 1, 301 ) // Replace "[ITEM=1]" by "Blue Stone"
    SetTextVariable( 2, 302 ) // Replace "[ITEM=2]" by "Yellow Stone"
    SetTextVariable( 3, 303 ) // Replace "[ITEM=3]" by "Green Stone"

g_west

  • *
  • Posts: 31
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2023 on: 2024-06-05 22:18:12 »
I see. I thought I was supposed to replace rather than add.

    SetTextVariable( 0, 300 )
    SetTextVariable( 1, 301 )
    SetTextVariable( 2, 302 )
    SetTextVariable( 3, 303 )
    set VAR_LocUInt8_0 = 0
    set VAR_LocUInt8_1 = GetItemCount(300)
    set VAR_LocUInt8_1 |= ( GetItemCount(301) << 1 )
    set VAR_LocUInt8_1 |= ( GetItemCount(302) << 2 )
    set VAR_LocUInt8_1 |= ( GetItemCount(303) << 3 )
    while ( ( !VAR_LocUInt8_0 ) && ( ( VARL_GenUInt8_358 & 240 ) != 240 ) ) {
        EnableDialogChoices( ( ( VAR_LocUInt8_1 & ( ~( VARL_GenUInt8_358 >> 4 ) ) ) & 15 ) | 16, 0 )

This is what I'm using now, and it seems to be working.

Thank you for being patient with me, it's very much appreciated.

RoSoDude

  • *
  • Posts: 1
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2024 on: 2024-08-11 04:19:44 »
Hi there, I'm trying to investigate whether it is feasible to make a hack for the PSX version of FF9 which pauses ATB during animations (I wrote a similar hack to do this for FF6 on the SNES, as it had the same issue). There's already a hack to speed up ATB, but this just leads to a stuffed command queue while you wait for the animations to play out. It would be nice to have faster ATB gauges that also pause during animations so the turn order is more meaningful, and commands aren't so delayed.

Also, I wonder if anything can be done about the long pauses before animations start?

I know assembly (most familiar with SNES 65816), so I am willing to dig through MIPS code if I know where to start looking.