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

Tirlititi

  • *
  • Posts: 886
    • 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: 886
    • 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: 886
    • 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: 6
    • 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: 886
    • 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: 6
    • 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: 886
    • 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: Yesterday at 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: Yesterday at 02:08:28 by Naro »

Tirlititi

  • *
  • Posts: 886
    • View Profile
Re: [PSX/PC] General editor - Hades Workshop (0.50b)
« Reply #2037 on: Today at 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: Today at 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.