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

lvb

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1575 on: 2019-08-11 12:19:48 »
Thank you very much for the help, Tirlititi

I don't know if the zip compile contains the localvariable which at first I don't know what is the use of it. I have open the LocalVariableSettings.hws and the code now seems a bit clear to understand. I'm not aware of it at first, thank you anyway.

Actually, I didn't plan to rework the Necron attack pattern script, I just want Necron to use all its skills beside Grand Cross, Neutron ring, and Blue Shockwave (it felt so monotone for me and less challenging if it only attacks with those 3 skills). I'm a bit confused that when I check the skill it had, there's more than Grand Cross, which are Thundaga, Firaga, Holy, etc but it still use only those 3 skills. So I recheck again at wiki and found out Necron had script which detects whose character using Reflect then he won't ever use any reflectable magic attacks (even after I unchecked the "reflect" and "return magic").

After I follow your suggestion to learn first Tantarian script (and I find it very easy to understand), I understood a bit how to read Necron's script. So then I just have to edit the "reflecttargetcheck" to make Necron use all its skills to attack by modifying:
Code: [Select]
        set #( reflecttargetcheck = RandomInTeam(( ( NotMatching(SV_PlayerTeam[STATUS_CURRENT_A], 257) & NotMatching(SV_PlayerTeam[STATUS_CURRENT_B], 64) ) & ( ~( Matching(SV_PlayerTeam[STATUS_CURRENT_B], 32) | Matching(SV_PlayerTeam[STATUS_AUTO_B], 32) ) ) )) )
        if ( !( #( NotMatching(SV_PlayerTeam[STATUS_CURRENT_A], 4355) & reflecttargetcheck ) ) ) {
            set #( SV_Target = 0 )}

to

Code: [Select]
        set #( reflecttargetcheck = RandomInTeam(( ( NotMatching(SV_PlayerTeam[STATUS_CURRENT_A], 257) & NotMatching(SV_PlayerTeam[STATUS_CURRENT_B], 64) ) )) )
        if ( !( #( NotMatching(SV_PlayerTeam[STATUS_CURRENT_A], 4355) & reflecttargetcheck ) ) ) {
            set #( SV_Target = 1)}


assuming the SV_Target value is both 0 and 1 only (on/off), I modify it to  (assuming it will be activated even after the reflect checker detects them on 'reflect' or not). Up until now I still don't know why is there '& ( ~( Matching(SV_PlayerTeam[STATUS_CURRENT_B], 32) | Matching(SV_PlayerTeam[STATUS_AUTO_B], 32)' and don't know the meaning of 32. And because it's different than wiki (where there are no 'Matching' only the 'NotMatching'), I decided to remove them.

Problem solved. However, the multiple target magic attack only deals on 1 character. So I tried to relearn again the Tantarian's script, found out it's on the SV_Target. On Necron case it shows 1 (and my assumption is wrong, it's not the on/off value, but actually it's 'amount' value), then I edit it to 5 (just like Tantarian's 'Attack(5)' on 'default: set #( SV_Target = SV_PlayerTeam )' which I don't know the meaning of it and just try it). In my opinion, if Necron's multiple magic deals on 1 character equals to 'SV_Target = 1', and Tantarian's multiple attack deals on all 4 character, it should be equal to 'Attack(4)' (which I still don't know the meaning of 5 it has).

Then finally, all character can be damaged by modifying:
Code: [Select]
            set #( SV_Target = 1)
to

Code: [Select]
            set #( SV_Target = 5)

I agree that Necron's script case is a whole complicated one, but I do believe Ozma one will be the most complicated. Fortunately, all I want to do is minor modify.

Anyway, thank you so much for the help.
« Last Edit: 2019-08-11 12:22:36 by lvb »

Tirlititi

  • Freak
  • *
  • Posts: 594
  • Karma: 78
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1576 on: 2019-08-12 12:39:16 »
SV_Target does not work like that.

"set SV_Target = 1" -> Only the 1st player's character is targeted (usually Zidane).
"set SV_Target = 2" -> Only the 2nd player's character is targeted.
"set SV_Target = 4" -> Only the 3rd player's character is targeted.
"set SV_Target = 8" -> Only the 4th player's character is targeted.
"set SV_Target = 16" -> Only the 1st enemy is targeted.
"set SV_Target = 32" -> Only the 2nd enemy is targeted.
"set SV_Target = 64" -> Only the 3rd enemy is targeted.
"set SV_Target = 128" -> Only the 4th enemy is targeted.
And then, you add numbers to have multiple targets. The whole player's party is thus targeted with "set SV_Target = 15" and not 5 (if you watch more carefully, you'll see that only two characters are affected when you use 5).
However, because the number of characters/enemies may vary, it is very unusual to use the numbers directly; oftentimes, "SV_PlayerTeam" or "SV_EnemyTeam" are used instead of "15" or "240" respectively. The "NotMatching" or "Matching" rules out characters not matching some conditions (the "32" means "Reflect": again, select that number and see how it converts to the "Status List B" which can be seen on the left of the window, inside the "Battle" panel). For single-targeted spells, a "RandomInTeam" is used.

The number used as an argument for the "Attack" corresponds to the attack in the attack list. Look at what's displayed on the right.

lvb

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1577 on: 2019-08-13 15:18:11 »
SV_Target does not work like that.

"set SV_Target = 1" -> Only the 1st player's character is targeted (usually Zidane).
"set SV_Target = 2" -> Only the 2nd player's character is targeted.
"set SV_Target = 4" -> Only the 3rd player's character is targeted.
"set SV_Target = 8" -> Only the 4th player's character is targeted.
"set SV_Target = 16" -> Only the 1st enemy is targeted.
"set SV_Target = 32" -> Only the 2nd enemy is targeted.
"set SV_Target = 64" -> Only the 3rd enemy is targeted.
"set SV_Target = 128" -> Only the 4th enemy is targeted.
And then, you add numbers to have multiple targets. The whole player's party is thus targeted with "set SV_Target = 15" and not 5 (if you watch more carefully, you'll see that only two characters are affected when you use 5).
However, because the number of characters/enemies may vary, it is very unusual to use the numbers directly; oftentimes, "SV_PlayerTeam" or "SV_EnemyTeam" are used instead of "15" or "240" respectively. The "NotMatching" or "Matching" rules out characters not matching some conditions (the "32" means "Reflect": again, select that number and see how it converts to the "Status List B" which can be seen on the left of the window, inside the "Battle" panel). For single-targeted spells, a "RandomInTeam" is used.

The number used as an argument for the "Attack" corresponds to the attack in the attack list. Look at what's displayed on the right.

Hello, sorry for late replying. I have some work to do.
Strange. I find that '5' has done some damage to all of the character in the team, however this is very useful information. Now I know how to use the SV_target value properly.
Actually, I'm aware the left panel were use to define the conditions. I did some change for the treasure item by looking at it, but in this case it was very confusing at first because when I hit on some number in the script, it defines some condition even if the number does not relate to 'item' or something else.

Now I get the point of how to hit on the right number so it will define the right condition (based on your short explanation above). Much appreciate it. I will update anything later including anything confuse me. For someone who had no idea of reading script your explanation was very much helpful. Thank you.

Incinerator

  • Guest
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1578 on: 2019-08-14 05:03:45 »
SV_Target does not work like that.

"set SV_Target = 1" -> Only the 1st player's character is targeted (usually Zidane).
"set SV_Target = 2" -> Only the 2nd player's character is targeted.
"set SV_Target = 4" -> Only the 3rd player's character is targeted.
"set SV_Target = 8" -> Only the 4th player's character is targeted.
"set SV_Target = 16" -> Only the 1st enemy is targeted.
"set SV_Target = 32" -> Only the 2nd enemy is targeted.
"set SV_Target = 64" -> Only the 3rd enemy is targeted.
"set SV_Target = 128" -> Only the 4th enemy is targeted.
And then, you add numbers to have multiple targets. The whole player's party is thus targeted with "set SV_Target = 15" and not 5 (if you watch more carefully, you'll see that only two characters are affected when you use 5).
However, because the number of characters/enemies may vary, it is very unusual to use the numbers directly; oftentimes, "SV_PlayerTeam" or "SV_EnemyTeam" are used instead of "15" or "240" respectively. The "NotMatching" or "Matching" rules out characters not matching some conditions (the "32" means "Reflect": again, select that number and see how it converts to the "Status List B" which can be seen on the left of the window, inside the "Battle" panel). For single-targeted spells, a "RandomInTeam" is used.

The number used as an argument for the "Attack" corresponds to the attack in the attack list. Look at what's displayed on the right.

I'm glad you showed that, because I've beaconed to have the enemy target a specific character!.

lvb

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1579 on: 2019-08-17 13:12:13 »
Hello, Tirlititi.
I have some problem with HW, but this is not the code thing probelm like I have posted before.

First, When I tried to 'Open Mod' my .hws save file (compiled completely from Spells to Fields) to the original clean game, it suddenly force close the Hades Workshop.
I try to find the cause by opening the hws once again and checking 1 by 1 category (from Spells, Items, then Enemies, etc) and once it open on the 'World Maps', HW closed itself with no loading bar at all (the loading bar with 'n/n' text)
I have unchecked 'including text' and 'including locals', and checked the text only, checked the locals only, still force closed.
So then the problems found while I open Mod the 'World Maps' only.

My FF IX game is clean with no mod except HW mods only.

Notes: In 'World Maps', I have some modified only on the 'Battle Spots' tab, to change what enemy should show on the specific places. And also I find that the 'battle spots' tab is actually loaded incorrectly at first opened the HW (e.g. on Battle Spot 1, Normal, Mist Continent, Grassland (Day), etc. the enemy selection shown a bit mess), but after I maximize the HW window, it loaded correctly. And it always like that whenever I open the HW and load the game.

Second, I want to combine the mods with Moguri Mod. However, after I successfully patched the Moguri Mod, and wanted to 'open Mod' my .hws to get my HW mods back after the Moguri patch by opening the FF9Launcher.exe file, it takes very long to load the HW data. I assume the HW won't work on the patched with any mods FFIX Launcher. So I decided to reinstall the game, and open mod my .hws on it, then the first problem above appeared.
I have downloaded the latest 0.41b HW.

Tirlititi

  • Freak
  • *
  • Posts: 594
  • Karma: 78
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1580 on: 2019-08-17 20:44:30 »
First: that's absolutly impossible.
If the loading bar is not showing for the World Maps, it means that HW has bugs while loading the WM datas from the game. As long as the datas required are not loaded, the .hws file is barely checked (it's only checked to see the available sections, which works fine since you see them before confirming).
So either the loading bar shows up, or you have a file modded without you knowing it (most probable). The WM datas are mainly in the p0data3.bin archive.

Second: You should be able to open HW on the Moguri Mod except for the DLL changes.
In order to do that, you need a folder with:
1) A "FF9_Launcher.exe", whichever one (even a dummy file of 0kb would work as long as it's correctly named),
2) The archive files of the Moguri Mod (all the p0dataX.bin, the "mainData", "resources.assets" and all the "sharedassetsX.assets", the "levelX" shouldn't be needed except if you want to use the Unity Assets Viewer tool),
3) The "Assembly-CSharp.dll" of the normal game, unmodded (at least not modded by Memoria or the Moguri Mod).

Put all these files in sub-folders mimicking the directory of the game, select the "FF9_Launcher.exe" with HW and it should be alright.
When saving, choose the options "Spreadsheets" + "Unity Archives": the archives of Moguri should be generated correctly and there will be .csv files that can be read by Memoria.
The p0dataX.bin should go in the Moguri Mod's folder (that's where the modded archives are), something like "C:\Program Files\Moguri Mod\StreamingAssets".
The .csv files should also go in a Moguri Mod's subfolder, like "C:\Program Files\Moguri Mod\StreamingAssets\Data\Battle\Actions.csv".
The resources/sharedassets should go in the Steam's file folder, as usual.

I hope that it helps. Tell me if I'm wrong somewhere ^^'

anxietymafia

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1581 on: 2019-08-26 02:28:13 »
Is it possible to make Garnet use her short hair model on the field?

Tirlititi

  • Freak
  • *
  • Posts: 594
  • Karma: 78
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1582 on: 2019-08-26 08:56:18 »
Unfortunatly, this is mainly hard-coded. You can change it using the tool dnSpy but not Hades Workshop only.
In dnSpy, open the Assembly-CSharp.dll, search for the following classes and methods and edit a few lines:

1) In the class "ModelFactory" and its method "CreateModel", there's this block:
Code: [Select]
if (ModelFactory.garnetShortHairTable.Contains(text))
{
ushort num = BitConverter.ToUInt16(FF9StateSystem.EventState.gEventGlobal, 0);
bool flag = num >= 10300;
if (flag)
{
// etc... Disable "long_hair" components
}
else
{
// etc... Disable "short_hair" components
}
}
Replace the "if (flag)" line by "if (flag && isBattle)".

2) In the class "EventEngine" and its method "DoEventCode" (that's a very long one), there is a "case EBin.event_code_binary.MODEL":
Code: [Select]
case EBin.event_code_binary.MODEL:
{
posObj.model = (ushort)this.getv2();
Obj expr_1EA4 = this.gExec;
expr_1EA4.flags |= 1;
posObj.eye = (short)(-4 * this.getv1());
if (this.gMode == 1)
{
string text = FF9BattleDB.GEO[(int)posObj.model];
posObj.go = ModelFactory.CreateModel(text, false);
GeoTexAnim.addTexAnim(posObj.go, text);
if (ModelFactory.garnetShortHairTable.Contains(text))
{
posObj.garnet = true;
ushort num7 = BitConverter.ToUInt16(FF9StateSystem.EventState.gEventGlobal, 0);
posObj.shortHair = (num7 >= 10300);
}
// etc...
Change the line "posObj.shortHair = (num7 >= 10300);" to "posObj.shortHair = false;".

There might be a third method to change, the method "addTexAnim" of the class "GeoTexAnim", but I am not sure if it is important or if it would mess up with the battle model.
And there would be a 4th one, "ff9play::FF9Play_GetSerialID", if you wanted to change her model in battles as well.

anxietymafia

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1583 on: 2019-08-26 10:08:27 »
Thanks so much for the reply,

Is this also possible for the psx version?

Tirlititi

  • Freak
  • *
  • Posts: 594
  • Karma: 78
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1584 on: 2019-08-26 14:52:21 »
No, sorry.

Clem Fandango

  • Newbie
  • *
  • Posts: 3
  • Karma: 0
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1585 on: 2019-09-08 22:10:52 »
I've been working with the tool for a while now and I'm trying to find a way around how Phoenix Downs interact with undead monsters.

Specifically I'm trying to find a way to make the item no longer bring the HP of undead targets down to critical HP levels. My initial thought was to have the item use the Life formula, but that doesn't appear to work since there's no hit rate section for items (unless I'm totally blind) and Phoenix Downs using the formula don't seem to work on dead allies either.

Part of the problem is that I still want to have undead targets take damage from restorative sources since I have at least one spell in the mod based around doing that, so taking away the undead type from enemies isn't something I want to do. I've also noticed that granting enemies Easy Kill status doesn't seem to make them immune to the effect either (which is wild to think about, honestly), so I'm not sure if there's something I'm missing to make this happen.

Worst case scenario I can just make Phoenix Downs really expensive so just chucking them at zombies and such isn't economically feasible, I mean if it's good enough for FF5 it's good enough for me, but I wanted to ask and see if there's something I'm missing.

Also, apologies if this has been asked before, I did a brief and possibly bad search and couldn't find anything.

« Last Edit: 2019-09-08 23:37:09 by Clem Fandango »

Tirlititi

  • Freak
  • *
  • Posts: 594
  • Karma: 78
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1586 on: 2019-09-10 15:52:48 »
Hello Clem Fandango. Sorry I didn't see your message before.

It is not possible to do that without modding the battle engine. It can be done either with Albeoris's Memoria tool or with dnSpy, but not directly with HW (or only with added difficulties for no reason). In both case, it's a bit of C# coding.

Using Memoria, you need to change the script of Phoenix Downs (inside "Scripts/Sources/Battle/0072_ItemPhoenixScript.cs"):
Code: [Select]
public void Perform()
{
if (!_v.Target.CanBeRevived())
return;

if (_v.Target.IsZombie)
{
_v.Context.Flags |= BattleCalcFlags.Miss; // Add this line
return; // Add this line
// if ((_v.Target.CurrentHp = (UInt16)(GameRandom.Next8() % 10)) == 0) // Remove this line
// _v.Target.Kill(); // Remove this line
}
else if (_v.Target.CheckIsPlayer())
{
if (_v.Target.IsUnderStatus(BattleStatus.Death))
_v.Target.CurrentHp = (UInt16)(1 + GameRandom.Next8() % 10);

_v.TargetCommand.TryRemoveItemStatuses();
}
}

Using dnSpy, you need to change the method "btl_calc::CalcMain" and more specifically the "case 72":
Code: [Select]
if (Status.checkCurStat(target, 64u) || btl_util.CheckEnemyCategory(target, ENEMY.ENEMY_CATEGORY_UNDEAD))
{
calc_VAR.flags |= 1; // Add this line
// Remove the following lines, "if ((target.cur.hp = (ushort)(Comn.random8() % 10)) == 0)" and "SetEnforceHP0"
}
else if (btl_calc.CheckNotPlayerMiss(calc_VAR))
// etc... no change there

Clem Fandango

  • Newbie
  • *
  • Posts: 3
  • Karma: 0
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1587 on: 2019-09-10 16:26:02 »
Hypothetically, were I to enact the change using dnSpy, would the HWS files used by Hades pick up that change? In other words, if I wanted to distribute a mod as an HWS file, would folks playing the mod still need to make the same changes in order for the Phoenix Down change to be in effect? I'm just trying to figure out which way I should go about this while making it as seamless as possible should I choose to release a mod.

Tirlititi

  • Freak
  • *
  • Posts: 594
  • Karma: 78
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1588 on: 2019-09-10 18:05:35 »
No, the .hws wouldn't hold that change.
That's a real problem for me as well as I would largely prefer to have only 1 file for the mod, but the nature of the change is just not embeddable in a .hws... so I decided that I would distribute the C# code as well (generating the mod then requires Memoria or dnSpy in addition to HW).
Using Memoria, it's simply a .cs file to share in addition to the .hws (and then I think that you need to run Memoria's script compiler, but that's easy).

In any case, the default way to share a mod is not to share the .hws (+ maybe C# code) but to share the generated Steam files (p0data, DLL...).
Even if it creates mod compatibility problems, that's the easiest way to do it, both for the modder and the user.

Clem Fandango

  • Newbie
  • *
  • Posts: 3
  • Karma: 0
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.41b)
« Reply #1589 on: 2019-09-10 18:43:47 »
Thanks for the reply, I was afraid this might make things kind of complicated. I think for the moment I might keep working on other stuff and leave this towards latter parts of this whole process. It's generally not a showstopper for what I'm working with, but I'll definitely need to consider it further if I ever end up releasing anything.