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

Tirlititi

  • *
  • Posts: 890
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2025 on: 2024-08-11 08:57:23 »
Hello RoSoDude.
That's most likely MIPS code indeed. I am not sure that would be feasible by modifying the parts of the MIPS code that are accessible through Hades Workshop but there's a chance it is.

The parts that are accessible and that are indexed correspond to effects of abilities. That code (which was most likely written in C for the PSX version before it got compiled to MIPS) has been ported into C# that can be read there: btl_calc.cs
Having both MIPS and C# there might help you to see how that MIPS is written and maybe identify data banks that would be relevant to change what you want. For example, there are references to BTL_DATA's "cur.hp": the current ATB of each fighter is very close to that field because "cur" is a structure like that:
Code: [Select]
public class POINTS
{
public ushort hp;
public short mp;
public short at;
public sbyte at_coef;
public byte capa;
}
with "at" being the ATB and "at_coef" being its speed (that depends both on Haste/Slow but also on the battle speed configuration).

Unfortunatly, I don't know about the parts that identify whether an animation (SFX) is running or not in MIPS. I guess using a debugger there (to scan the RAM during runtime) would be the best way. You can see the list of different SFX identifiers here; that should help you when looking for that kind of info.

There are functions that handles ATB progression globally, not just each individual "at_coef", but the C# port of it is surely not as close to the original MIPS code as other parts. The following C# method determines if ATB should be advancing (and would ideally be the place you'd add the condition regarding SFX) but is part of the HUD class, which were much more re-factored than other parts of the code:
Code: [Select]
public bool FF9BMenu_IsEnableAtb()
{
if (!this.commandEnable)
return false;
if (FF9StateSystem.Settings.cfg.atb != 1uL)
return true;
if (this.hidingHud)
return this.currentPlayerId == -1 || this.currentButtonGroup == BattleHUD.CommandGroupButton || this.currentButtonGroup == string.Empty;
return this.currentPlayerId == -1 || ButtonGroupState.ActiveGroup == BattleHUD.CommandGroupButton || ButtonGroupState.ActiveGroup == string.Empty;
}

Good luck.
« Last Edit: 2024-08-11 08:59:28 by Tirlititi »

HopefulTarnished

  • *
  • Posts: 4
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2026 on: 2024-08-27 20:40:49 »
I want a function to apply specifically to the player controlled character, but in entries where the function DefinePlayerCharacter could apply to either Zidane OR Dagger, is there a way to achieve this?

EDIT: amended after accidentally deleting the post so people can see the original question. Apologies.
« Last Edit: 2024-09-01 13:19:19 by HopefulTarnished »

Tirlititi

  • *
  • Posts: 890
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2027 on: 2024-08-27 22:40:40 »
Hello HopefulTarnished
You can use "GetEntryUniqueID(250)". It converts the special UIDs 250-255 to their number counterpart. Let's say if Zidane is the entry 11 (then Garnet is the entry 13), you can do:
Code: [Select]
if ( GetEntryUniqueID(250) == 11 ) {
    // Zidane is the player character
}
if ( GetEntryUniqueID(250) == 13 ) {
    // Garnet is the player character
}
I have not tested it but I think that should be the way to go.

Good luck too!

HopefulTarnished

  • *
  • Posts: 4
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2028 on: 2024-08-31 17:26:35 »
@tirlititi

I've managed to reach Dali in terms of scripting, even re-writing the scenes and it's going really really well. I'm a bit overwhelmed by the party changing scripts used by the devs though. Is there a special reason they are so long?

Code: [Select]
    if ( General_FieldEntrance == 65535 ) {
        set Setting_PartyReserve = 15
        SetPartyReserve( Setting_PartyReserve )
        set VAR_GlobInt16_8 = ( VAR_GlobInt16_10 = ( VAR_GlobInt16_12 = ( VAR_GlobInt16_14 = 0 ) ) )
        set VAR_GlobInt16_8 = 0
        while ( VAR_GlobInt16_8 <= 11 ) {
            if ( IsInParty(VAR_GlobInt16_8) ) {
                set VAR_GlobInt16_10 |= ( 1 << VAR_GlobInt16_8 )
            }
            set VAR_GlobInt16_8++
        }
        if ( 1 ) {
            set VAR_GlobInt16_12 |= 1
        }
        if ( 1 ) {
            set VAR_GlobInt16_12 |= 4
        }
        if ( 0 ) {
            set VAR_GlobInt16_12 |= 2147483648L
        }
        if ( 0 ) {
            set VAR_GlobInt16_12 |= 2147483648L
        }
        set VAR_GlobInt16_14 = ( VAR_GlobInt16_10 ^ VAR_GlobInt16_12 )
        set VAR_GlobInt16_8 = 0
        while ( VAR_GlobInt16_8 <= 11 ) {
            if ( ( VAR_GlobInt16_14 >> VAR_GlobInt16_8 ) & 1 ) {
                RemoveParty( VAR_GlobInt16_8 )
            }
            set VAR_GlobInt16_8++
        }
        if ( IsInParty(0) == 0 ) {
            set VAR_GlobBool_147 = AddParty(0)
        }
        if ( IsInParty(2) == 0 ) {
            set VAR_GlobBool_147 = AddParty(2)
        }
        if ( IsInParty(65535) == 0 ) {
            set VAR_GlobBool_147 = AddParty(65535)
        }
        if ( IsInParty(65535) == 0 ) {
            set VAR_GlobBool_147 = AddParty(65535)
        }
        set VARL_GenUInt8_303 = 0
        set VAR_GlobInt16_8 = ( VAR_GlobInt16_10 = ( VAR_GlobInt16_12 = ( VAR_GlobInt16_14 = 99 ) ) )
        if ( 1 ) {
            set VARL_GenUInt8_303++
            set VAR_GlobInt16_8 = 0
        }
        if ( 1 ) {
            set VARL_GenUInt8_303++
            set VAR_GlobInt16_10 = 2
        }
        if ( 0 ) {
            set VARL_GenUInt8_303++
            set VAR_GlobInt16_12 = 65535
        }
        if ( 0 ) {
            set VARL_GenUInt8_303++
            set VAR_GlobInt16_14 = 65535
        }
        set VAR_GlobBool_148 = ( VAR_GlobBool_149 = ( VAR_GlobBool_150 = ( VAR_GlobBool_151 = 0 ) ) )
        if ( VAR_GlobInt16_8 != 99 ) {
            if ( GetHP(VAR_GlobInt16_8) == 0 ) {
                set VAR_GlobBool_148 = 1
            }
        }
        if ( VAR_GlobInt16_10 != 99 ) {
            if ( GetHP(VAR_GlobInt16_10) == 0 ) {
                set VAR_GlobBool_149 = 1
            }
        }
        if ( VAR_GlobInt16_12 != 99 ) {
            if ( GetHP(VAR_GlobInt16_12) == 0 ) {
                set VAR_GlobBool_150 = 1
            }
        }
        if ( VAR_GlobInt16_14 != 99 ) {
            if ( GetHP(VAR_GlobInt16_14) == 0 ) {
                set VAR_GlobBool_151 = 1
            }
        }
        if ( ( ( ( VAR_GlobBool_148 + VAR_GlobBool_149 ) + VAR_GlobBool_150 ) + VAR_GlobBool_151 ) == VARL_GenUInt8_303 ) {
            if ( ( VAR_GlobInt16_8 != 99 ) && ( VAR_GlobBool_148 == 1 ) ) {
                SetHP( VAR_GlobInt16_8, 1 )
            }
            if ( ( VAR_GlobInt16_10 != 99 ) && ( VAR_GlobBool_149 == 1 ) ) {
                SetHP( VAR_GlobInt16_10, 1 )
            }
            if ( ( VAR_GlobInt16_12 != 99 ) && ( VAR_GlobBool_150 == 1 ) ) {
                SetHP( VAR_GlobInt16_12, 1 )
            }
            if ( ( VAR_GlobInt16_14 != 99 ) && ( VAR_GlobBool_151 == 1 ) ) {
                SetHP( VAR_GlobInt16_14, 1 )
            }
        }
        CureStatus( 0, 127 )
        CureStatus( 1, 127 )
        CureStatus( 3, 127 )
        CureStatus( 2, 127 )
        CureStatus( 4, 127 )
        CureStatus( 5, 127 )
        CureStatus( 7, 127 )
        CureStatus( 6, 127 )
        CureStatus( 8, 127 )
        if ( IsInParty(5) ) {
            set Setting_OptionalQuina = 1
        } else {
            set Setting_OptionalQuina = 0
        }
        if ( ( ( Setting_PartyInitialized >> 0 ) & 1 ) == 0 ) {
            SetCharacterData( 0, 1, 255, 9, 0 )
            set Setting_PartyInitialized |= 1
        }
        if ( ( ( Setting_PartyInitialized >> 2 ) & 1 ) == 0 ) {
            SetCharacterData( 2, 1, 255, 6, 2 )
            set Setting_PartyInitialized |= 4
        }
        set Setting_OptionalQuina = 0
        set Setting_DaggerDepresses = 0
        set Setting_MPx4 = 1
        SetHP( 0, 9999 )
        SetHP( 1, 9999 )
        SetHP( 3, 9999 )
        SetHP( 2, 9999 )
        SetHP( 4, 9999 )
        SetHP( 5, 9999 )
        SetHP( 7, 9999 )
        SetHP( 6, 9999 )
        SetHP( 8, 9999 )
        SetMP( 0, 999 )
        SetMP( 1, 999 )
        SetMP( 3, 999 )
        SetMP( 2, 999 )
        SetMP( 4, 999 )
        SetMP( 5, 999 )
        SetMP( 7, 999 )
        SetMP( 6, 999 )
        SetMP( 8, 999 )
        CureStatus( 0, 127 )
        CureStatus( 1, 127 )
        CureStatus( 3, 127 )
        CureStatus( 2, 127 )
        CureStatus( 4, 127 )
        CureStatus( 5, 127 )
        CureStatus( 7, 127 )
        CureStatus( 6, 127 )
        CureStatus( 8, 127 )
        if ( General_ScenarioCounter == 2639 ) {
            if ( IsInParty(2) ) {
                RemoveParty( 2 )
                set VARL_GenUInt8_303 = 0
                set VAR_GenInt8_60 = ( VAR_GenInt8_61 = ( VAR_GenInt8_62 = ( VAR_GenInt8_63 = ( VAR_GlobInt16_8 = ( VAR_GlobInt16_10 = ( VAR_GlobInt16_12 = ( VAR_GlobInt16_14 = 65535 ) ) ) ) ) ) )
                set VAR_GlobInt16_14 = 0
                while ( VAR_GlobInt16_14 <= 11 ) {
                    if ( IsInParty(VAR_GlobInt16_14) ) {
                        switch 4 ( ++VARL_GenUInt8_303 ) from 1 {
                        case +0:
                            set VAR_GenInt8_60 = VAR_GlobInt16_14
                            break
                        case +1:
                            set VAR_GenInt8_61 = VAR_GlobInt16_14
                            break
                        case +2:
                            set VAR_GenInt8_62 = VAR_GlobInt16_14
                            break
                        case +3:
                            set VAR_GenInt8_63 = VAR_GlobInt16_14
                            break
                        }
                    }
                    set VAR_GlobInt16_14++
                }
                switch 1 ( VARL_GenUInt8_303 ) from 0 {
                case +0:
                    set VAR_GlobBool_148 = AddParty(2)
                    if ( GetHP(2) == 0 ) {
                        SetHP( 2, 1 )
                    }
                    CureStatus( 2, 127 )
                    break
                default:
                    set VARL_GenUInt8_303 = 0
                    set VAR_GlobInt16_8 = ( VAR_GlobInt16_10 = ( VAR_GlobInt16_12 = ( VAR_GlobInt16_14 = 99 ) ) )
                    if ( VAR_GenInt8_60 != 65535 ) {
                        set VARL_GenUInt8_303++
                        set VAR_GlobInt16_8 = VAR_GenInt8_60
                    }
                    if ( VAR_GenInt8_61 != 65535 ) {
                        set VARL_GenUInt8_303++
                        set VAR_GlobInt16_10 = VAR_GenInt8_61
                    }
                    if ( VAR_GenInt8_62 != 65535 ) {
                        set VARL_GenUInt8_303++
                        set VAR_GlobInt16_12 = VAR_GenInt8_62
                    }
                    if ( VAR_GenInt8_63 != 65535 ) {
                        set VARL_GenUInt8_303++
                        set VAR_GlobInt16_14 = VAR_GenInt8_63
                    }
                    set VAR_GlobBool_148 = ( VAR_GlobBool_149 = ( VAR_GlobBool_150 = ( VAR_GlobBool_151 = 0 ) ) )
                    if ( VAR_GlobInt16_8 != 99 ) {
                        if ( GetHP(VAR_GlobInt16_8) == 0 ) {
                            set VAR_GlobBool_148 = 1
                        }
                    }
                    if ( VAR_GlobInt16_10 != 99 ) {
                        if ( GetHP(VAR_GlobInt16_10) == 0 ) {
                            set VAR_GlobBool_149 = 1
                        }
                    }
                    if ( VAR_GlobInt16_12 != 99 ) {
                        if ( GetHP(VAR_GlobInt16_12) == 0 ) {
                            set VAR_GlobBool_150 = 1
                        }
                    }
                    if ( VAR_GlobInt16_14 != 99 ) {
                        if ( GetHP(VAR_GlobInt16_14) == 0 ) {
                            set VAR_GlobBool_151 = 1
                        }
                    }
                    if ( ( ( ( VAR_GlobBool_148 + VAR_GlobBool_149 ) + VAR_GlobBool_150 ) + VAR_GlobBool_151 ) == VARL_GenUInt8_303 ) {
                        if ( ( VAR_GlobInt16_8 != 99 ) && ( VAR_GlobBool_148 == 1 ) ) {
                            SetHP( VAR_GlobInt16_8, 1 )
                        }
                        if ( ( VAR_GlobInt16_10 != 99 ) && ( VAR_GlobBool_149 == 1 ) ) {
                            SetHP( VAR_GlobInt16_10, 1 )
                        }
                        if ( ( VAR_GlobInt16_12 != 99 ) && ( VAR_GlobBool_150 == 1 ) ) {
                            SetHP( VAR_GlobInt16_12, 1 )
                        }
                        if ( ( VAR_GlobInt16_14 != 99 ) && ( VAR_GlobBool_151 == 1 ) ) {
                            SetHP( VAR_GlobInt16_14, 1 )
                        }
                    }
                    CureStatus( 0, 127 )
                    CureStatus( 1, 127 )
                    CureStatus( 3, 127 )
                    CureStatus( 2, 127 )
                    CureStatus( 4, 127 )
                    CureStatus( 5, 127 )
                    CureStatus( 7, 127 )
                    CureStatus( 6, 127 )
                    CureStatus( 8, 127 )
                    break
                }
            }
            if ( 0 ) {
                set Setting_OptionalQuina = 0
            }
        }
    }

Is there no more succinct way to achieve saving a party formation and recalling it?

Thank you so much for taking the time to reply. I had no background in code only a week ago, and have learned to script some pretty decent scenes in the last week using your tool. I'm blown away how good it is to be honest!

Oh last question, is there a list anywhere of the VAR_GlobInt values used in the base game? I'm cautious about using them in case I overwrite something important to the original code.

Hope
« Last Edit: 2024-09-01 08:25:40 by HopefulTarnished »

Tirlititi

  • *
  • Posts: 890
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2029 on: 2024-09-01 10:10:13 »
I guess devs had some kind of "macros", ie. they only wrote a single line for changing the party formation and that line was converted into all these lines, doing the process step by step in a way that adapts to all situations. That's why it heals everyone even if they didn't join the party yet or why there are "if ( 0 )" blocks that just never happen. I never added a feature for having macros there.

The "VAR_GlobInt" are restricted to a field.
"local" variables are restricted to the entry, so "VAR_LocInt8_0" in the function "Main_Init" is a different variable than "VAR_LocInt8_0" in the function "Zidane_Init".
"global" variables are restricted to the field, so "VAR_GlobInt8_0" in the field "Prima Vista/Cargo Room" is not the same as in the field "Prima Vista/Meeting Room".
Only "general" variables are unrestricted (and they are the ones saved in save games). It would require a lot of work to identify all of the general variables already and I don't advance on that part anymore since a long time.
If you understand what a global or local variable does, you can name it inside the "local variable panel" right above the function's script. It's lines like
Code: [Select]
global int8 {variable_name} VAR_GlobInt8_0
Please don't edit your posts to remove the question after it is solved. It helps other people that read the topic.
« Last Edit: 2024-09-01 10:14:13 by Tirlititi »

HopefulTarnished

  • *
  • Posts: 4
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2030 on: 2024-09-01 11:41:35 »
Thank you! I can't believe I didn't see that panel before omg...

Yes! Sorry about the edit. I've modified the post to include the original question. I deleted it before because I didn't realise anyone had replied, I figured out my own workaround, and didn't want to waste anyone's time with an unnecessary question. I'll leave all future posts as they are!

Thanks for the reply, that's amazing! That variable panel is SO helpful for keeping track.

I'd really like to know also is there a way to modify the item drop rate chances (256/256, 96/256, etc)?
And with character-specific trance styles (like Steiner getting 300% damage, Zidane having access to Dyne, or Dbl Wht), are they hardcoded into the character id's (0 for zidane etc), or are they controlled some other way?
« Last Edit: 2024-09-01 20:16:37 by HopefulTarnished »

bumble_treez

  • *
  • Posts: 1
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2031 on: 2024-09-05 04:13:05 »
Holy wow this is a huge thread and its astonishing how active you are! Thanks for your commitment to one of my favorite games ever!

Im just dipping my toes into this whole scene and into coding in general so excuse any misunderstandings I may have here. Ive looked around at the information available here but didnt see what i was looking for.

Im trying to find a way to implement an alternative stat system. Something where you get to choose which stat bonuses you get over time for each character and perhaps respec later in the game.

My initial idea was to have this be some sort of pop up window triggered on level up but that seemed a little crazy to implement. I also thought it may be impossible if it wasnt just insanely hard.

So my next best idea was to just have a Stats option at every Moogle that let you interact with your stats. For all i know this could be even more difficult to implement, though, so your advice is welcome.

My main question is about how to interact with the character stats in general. Can i just give a permanent stat bonus to a character via a menu? Could a key item give a stat boost to a character? ive got a couple of ways i think it could work but im utterly lost at how to get started.

I also want this system to not be affected by the level at which the character enters the party, so i imagine i will have to find a way to deal with that, too. i expect that i will need to calculate how many points are expected to be available to a character based on their current level and then compare that to the amount of allocated stats for that character. Then, if there is a difference between those numbers, you are awarded the difference. Can this just be done with code or will i have to get creative with something like dummy items in the inventory?

charlie_38

  • *
  • Posts: 9
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2032 on: 2024-12-03 21:46:03 »
Hi Tirlititi,

I've detected a couple of bugs in this HW version that maybe you want to have a look (if they have already been spotted in this topic, sorry!).

-If you want to change spells for Sword Magic (Steiner) in "Party / Special", the corresponding "MagicSwordSets.csv" file is exported correctly. However, if you save and close your HW project, when you reopen it these changes are not saved, and Sword Magic appears with default spells.
This is not something very annoying since you can export it once and it will work for your mod.

-This other one is a bit hard to explain, I'll try! If you want to add a new dialog text for a localization, for example "Environment / Texts / Fossil Roo", it will be created at the bottom of the list, in my case "PRUEBA ESPAÑOL":

https://drive.google.com/file/d/1KULPIAfKlQNecY2XB-cl_rRUYA8XVqiD/view?usp=drive_link

If you save and close your HW project and you reopen it, this new text is still at the bottom of the list but its "preview" (the text in the language you have set in HW preferences) is gone. Instead, you will find the "preview" of your new text replacing the "preview" of the first original game's text in the list which had an empty "preview". So, in my example, you can see that the preview text "PRUEBA ESPAÑOL" has replaced the text that goes after "Stilzkin─En Cleyra he pasado las de Caín...":

https://drive.google.com/file/d/1C704jDKsxRWa6aYBoBqfwVYII-4xJvob/view?usp=drive_link

However, when you open the last text of the list, which has no "preview" now, is indeed your new text with the content you set for each language:

https://drive.google.com/file/d/1B8AVwQvtP_uaeIziu7M2xwC0aer-jKHJ/view?usp=drive_link

This issue can be fixed if you delete the "preview" which is replacing the original game's text and then rewrite it for your new text. Next new texts you add won't have this bug.

I've also noticed that adding texts can cause HW project to crash when you want to reopen it. Apparently you can rename your project and it will normally reopen.


Regards!

Tirlititi

  • *
  • Posts: 890
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2033 on: 2024-12-03 23:57:24 »
Hello Charlie_38,

Indeed, the HWS files sometimes bug right now. It is quite irritating because it's the first version of HW that has bugs concerning the save format in a long time and it can (and unfortunatly did) make people lose their mod or parts of it.
So I advise to always save your HWS as a new file everytime you save, instead of overwriting them.

Sometimes, a HWS that usually crashes on load can be opened without crash randomly. That's not the renaming that solved it but something random that I have yet to understand. It may be that a part of your changes were lost in the process as well.
An example of what was reported to be randomly lost is the field script modifications, but only in japanese.
I made a couple of changes in my own mod without noticeable problem myself (even though it's a big mod), but maybe i missed them or maybe the bugs really appear when adding new entries as you saw with texts... In any case, we should be careful.

I saw that the "Party -> Special" panel makes the HWS very unstable indeed. Your details about the bug in the texts may help me to find the issue.

I'll try to update the tool to fix these bugs and catch up with a couple of Memoria features, but somehow it's always delayed.

Sorry about that.

charlie_38

  • *
  • Posts: 9
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2034 on: 2024-12-04 13:28:38 »
Hi Tirlititi,

Thanks for your quick response. I will then follow your advise to save as a new file everytime I save.
I've tried to reopen a project and yes, it indeed crashes randomly even after renaming it.

My situation now is that I finished modding disk 1 and 2, but that HW project went somehow bugged and crashed so I couldn't reopen it anymore. I started a new project to mod abilities (spells, SA, commands, stats...), and my idea is to redo now disk 1 and 2 (and then continue with 3 and 4) in this new project. I've not been saving in different files in this new one, so... Althought it hasn't crashed or bugged yet, do you still advise me to start over and be careful with saves so that it doesn't crash in the future?

I'm glad that my explanation concerning the texts bug can help you. Should you require a little more detail about it, just let me know.

Regards!

Tirlititi

  • *
  • Posts: 890
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2035 on: 2024-12-04 21:08:40 »
No, don't start over: it will be easier to spot that some things are missing (if there are any) rather than doing it all over again, even if you're not far away yet.

Naro

  • *
  • Posts: 2
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2036 on: 2024-12-09 02:05:16 »
Hello, new here. I was playing around with the Hades Workshop tool, and I was able to make a mod, but I was unsure of how to make it compatible with other existing mods in memoria. How would I go about making it compatible?

When I was trying stuff out, it was using the base game as the reference point which I imagine is the reason for incompatibility with some mods. I mainly adjusted weapons/armor/accessory traits and some learned skills (like giving Garnet the holy spell learnable through a rod and making some more weapons give bonus points on level up).

Also, is there a discord server for these ff9 mods? I would be more active there than in forums.
« Last Edit: 2024-12-09 02:08:28 by Naro »

Tirlititi

  • *
  • Posts: 890
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2037 on: 2024-12-10 18:14:18 »
Mainly, there's Qhimm's discord, although it's not very active concerning FF9, and there's Moogle & Mods: https://discord.gg/b4D9SRG9

Compatibility is not always possible: if a mod decides to give Mage Masher a power of 30 and another mod decides it should be 40, then there's no way to have both be effective at the same time. There are a few ways to try achieving the maximum compatibility with other mods, but no way to make everything compatible with everything. The possibilities are:
1) Make sure that your mod folder contains only the files that are indeed modified. Hades Workshop should do that automatically in most cases.
2) For almost all the CSV files, it is possible to only have the modified entries in the files there. Again, Hades Worshop automatically filters these and only write the entries that were actually modded, but it currently has many flaws in that regard.
3) Same goes with text files (.mes): a MES file that only contains something like [TXID=100][STRT=0,1]And now for something completly different[ENDN] will only change 1 text (of the text block or concerning spell names or item names, etc...) without touching the others. Hades Workshop is rather clumsy for now concerning that aspect.

Still, that's the kind of things you'd not want to do manually, and if you do it's after everything else.

Naro

  • *
  • Posts: 2
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2038 on: 2024-12-10 20:19:03 »
Thank you for the extra insight. One of the issues I'm running into is there is a mod, called Kupo Heroes Pack, that adds a medium tier holy spell (akin to an ara spell) to Garnet called photons. The mod allows Garnet to equip the dagger weapon, which now teaches the photons white magic spell.

The changes I made in the Hades Workshop editor didn't make any changes to the dagger weapon, but Garnet is no longer able to equip the dagger weapon and the dagger doesn't teach photons now.

Additionally, I wanted to add the holy spell in Garnet's white magic list, but it didn't seem to actually add it as a learnable spell in her white magic list (going to menu and checking her abilities). I would have thought the photons spell, added from the Kupo Heroes Pack, would have disappeared, but it is still there and a slot for holy is nowhere to be found.

The changes I made to equipment were all end game: magic racket, whale whisker (which would teach Garnet holy), dark matter, etc. for better passive bonuses.

charlie_38

  • *
  • Posts: 9
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2039 on: 2025-01-21 20:28:56 »
Hi Tirlititi,

I've come up again with a bug issue with my HW project. I started a new one in december, saving always in different files as you told me.
I've added a Regen spell to an enemy (it didn't have it in the original FF9), and when I try this battle the spell is bugged since it won't stop healing the enemy every second, displaying healing figures very quickly, instead of doing it at regular time intervals.
I've tried this with a new project and it works fine, so it's clearly related to my current HW project. So... isn't there anyway to fix this? I've tried to load previous files of my project, in order to spot the moment it began to get bugged, but it seems that it has applied to every single file I've been saving.
As you told, it's quite irritating since it could happen with future issues, even if this Regen spell gets fixed...
I've made sure of modifying scripts in the proper language, since they are language dependant as you explained. Maybe it is the export function in HW that gets bugged?

I don't know what to do now... :(

EDIT: I've fixed it! It turns out that the file "StatusData" in my mod was wrongly modifyed, with incorrect status id. I was setting the ids that appear in the file "StatusSet", and not the original ids of the game. With this file set correctly, the spell Regen is working fine now.
« Last Edit: 2025-01-31 10:24:42 by charlie_38 »

Kapten Teo

  • *
  • Posts: 4
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2040 on: 2025-01-26 13:11:43 »
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 Edit: 2025-01-27 15:53:32 by Kapten Teo »

Tirlititi

  • *
  • Posts: 890
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2041 on: 2025-02-01 12:35:15 »
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.

Kapten Teo

  • *
  • Posts: 4
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2042 on: 2025-02-01 19:22:51 »
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!

charlie_38

  • *
  • Posts: 9
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2043 on: 2025-02-02 13:28:34 »
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?

Tirlititi

  • *
  • Posts: 890
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2044 on: 2025-02-02 14:31:54 »
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]
Function Region8_Init
    SetRegion( ( -44, 1481 ), ( -159, 1237 ), ( 31, 1169 ), ( 88, 1329 ) )
    return


Function Region8_Range
    ifnot ( IsMovementEnabled ) {
        return
    }
    Bubble( 1 )
    return


Function Region8_SpeakBTN
    ifnot ( IsMovementEnabled ) {
        return
    }
    // Whatever happens when interacting while inside the region
    return

charlie_38

  • *
  • Posts: 9
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2045 on: 2025-02-02 15:42:52 »
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!

Yerek

  • *
  • Posts: 2
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2046 on: 2025-02-03 15:12:07 »
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 Edit: 2025-02-08 14:04:50 by Yerek »

Tirlititi

  • *
  • Posts: 890
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2047 on: 2025-02-11 09:34:25 »
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.