Jump to content

Apotheosis - Mod Editor for Deadfire


Recommended Posts

15 hours ago, Noqn said:

@Kvellen ah turns out I had time to go ahead and implemented your suggestions 😄

Thanks!

I agree with restricting conditions on links to just exiting ones. Seemed like bad practice to me when I noticed them, and I couldn't really come up with any solid use cases. So wasn't going to push for it being implemented if it were a choice between it and ExternalVO field. Which while also niche has some additional uses I can think of beyond its original intention.

  • Thanks 1
Link to comment
Share on other sites

When using conditionals in Progression Tables, the auto-complete lists all conditionals, including non-Progression Tables conditionals.

I was made aware of this since some conditionals did not not work and saw that there are different conditionals category in https://eternity.obsidian.net/game-data-formats/conditionals.

Would it be possible to restrict conditions to their usage?

For example:

  • "ProgressionTableHasAbility" appears only Progression Tables conditional auto-completes.
  • "CanUseAbility" and "HasAbility" in RPG (conversations?).
  • "HasActiveAbility" in Targeting Filter (status effects or AI commands?).
Edited by Cmushi
  • Like 1
Link to comment
Share on other sites

Is there a way to rename the "Subclass" title in paladin subclass selection menu and how do you make disposition automatically appear in custom subclasses ability through the editor? 

image.thumb.png.39b0130e178816a1f3a82186a78912e5.png

  • Hmmm 1
Link to comment
Share on other sites

On 7/30/2024 at 10:50 PM, Noqn said:

Users can now edit Exteral VO values in Conversation Talk Nodes.

Uh-oh, new nodes default to the ExternalVO being checked and auto-fill with "null". Clicking on the field when this is the case crashes the editor 😬
This can be worked around by unchecking "ExternalVO", closing the conversation, and then reopening it.
Not a problem for existing nodes from can tell.

Edited by Kvellen
  • Like 1
Link to comment
Share on other sites

Posted (edited)

Gotten hold of a computer now, sorry for the late replies!

On 8/5/2024 at 3:13 PM, Cmushi said:

When using conditionals in Progression Tables, the auto-complete lists all conditionals, including non-Progression Tables conditionals.

I was made aware of this since some conditionals did not not work and saw that there are different conditionals category in https://eternity.obsidian.net/game-data-formats/conditionals.

Would it be possible to restrict conditions to their usage?

Ooh, excellent idea! I've limited them like this:

Progression Tables only:

Spoiler
"ProgressionTableHasAbility"
"ProgressionTableIsAttribute"
"ProgressionTableIsBackground"
"ProgressionTableIsClass"
"ProgressionTableIsCulture"
"ProgressionTableIsPartyMember"
"ProgressionTableIsPlayer"
"ProgressionTableIsRace"
"ProgressionTableIsRandomIndex"
"ProgressionTableIsSubclass"
"ProgressionTableIsSubrace"

Won't show up in Progression Tables:

Spoiler
"HasAbility"
"IsAttributeScoreValue"
"IsBackground"
"HasClass"
"IsCulture"
"IsPartyMember"
"IsRace"
"HasSubClass"
"IsSubrace"

RecipeData only:

Spoiler
"HasItemMod"
"IsSoulbound"
"IsUnique"

Conversations marked ConversationDisplayType: ShipDuel

Spoiler
"CanFlee"
"FullSailWillRam"
"HalfSailWillRam"
"HasCaptainPersonality"
"HasOngoingAction"
"HasOngoingActionOfType"
"HasShipDuelAdvantage"
"IsActionValid"
"IsAtShipRetreatDistance"
"IsCurrentHullHealthValue"
"IsCurrentSailHealthValue"
"IsInCombatEncounter"
"IsLastVolleyDamageAmount"
"IsLastVolleyHitCount"
"IsLastVolleyMissCount"
"IsLastVolleyShotCount"
"IsShipDeathType"
"IsShipDistance"
"IsShipExploded"
"IsShipType"
"ShipDuelAIActionIs"
"ShipDuelIsFirstTurn"
"ShipDuelIsRelativeBearing"
"ShipDuelIsTurn"

 

On 8/10/2024 at 9:35 PM, Cmushi said:

Is there a way to rename the "Subclass" title in paladin subclass selection menu and how do you make disposition automatically appear in custom subclasses ability through the editor? 

Gonna check this out 👍

 

On 8/14/2024 at 6:58 PM, Kvellen said:

Uh-oh, new nodes default to the ExternalVO being checked and auto-fill with "null". Clicking on the field when this is the case crashes the editor 😬

😬

ops, fixed now

Anyhow, new release!

2024-08-17

  • Progression Table, Ship Duel and Recipe-related Conditional Calls are now only available in auto-completions when appropriate.
  • Certain Conditionals are no longer available in Progression Table auto-completions to avoid confusion with PT variants (e.g. 'HasAbility' vs. 'ProgressionTableHasAbility')
  • ExternalVO values in new Talk Nodes are now properly initialized as empty strings.
Edited by Noqn
  • Like 1
  • Thanks 2
Link to comment
Share on other sites

  • 3 weeks later...

Hi Hi

Amazing work with Apotheosis, even the name is wonderfully chosen!
I have been having a blast putting in more AI conditionals and stuff like that ;)
However as I am just an amateur at programming I'm not sure how to acces the names / string names of certain fields in the User scripts.
For example I know I need string number 253, but idk how to get the localized name for this string.

 

I am trying to see if I can add all spell buffs as a CustomAIConditionalScriptSet.
This so I can realize my grand master plan AI ;) first for my own party, then for mobs :D

I know how to do it manually but doing it in an automated way sounds cool to try ;)
But first things first, making the spell CustomAIConditionalCategory for each class.

 However I am lost with the stringindextable and stuff like that, I can't solve an easy thing like the following:

Where I just want to make an extra category for each existing class

SetGameDataPath("ai.gamedatabundle");
foreach (var POEClass in Components<CharacterClassComponent>())
{
  CustomAIConditionalCategoryComponent test = new CustomAIConditionalCategoryComponent
  {
    CategoryName = POEClass.DisplayName
  };
}

Sincerely

 

lalolalo9

  • Like 1
Link to comment
Share on other sites

On 9/2/2024 at 2:54 PM, lalolalo9 said:

I have been having a blast putting in more AI conditionals and stuff like that ;)
However as I am just an amateur at programming I'm not sure how to acces the names / string names of certain fields in the User scripts.

Ok first of all I'm ridiculously excited that someone is using the User Script feature 😄

Your post has made me realize the API is severely lacking some features (like adding new GameDataObjects, editing/accessing StringTable text...)

Besides that, I've started working on setting up User Scripts with an external editor, which I think would help tremendously:

I'll make sure to write a new Wiki page for User Scripts as well, and instructions to configure VS Code properly for this.

On 9/2/2024 at 2:54 PM, lalolalo9 said:

Amazing work with Apotheosis, even the name is wonderfully chosen!

YES Thanks 💖

I'm genuinely happy about the name, I liked how Fallout's G.E.C.K. modding kit was named after an in-universe thing and wanted something similar.

  • Like 2
Link to comment
Share on other sites

  • 2 weeks later...

Getting a crash whenever I try altering a global expression if there is already a modified global expression in mod.

Steps to reproduce:

  1. Go to the Global Conditionals tab, search for and open "ge_ability_holy_radiance"
  2. Remove the "_" in "Holy_Radiance", click accept, and then Save the mod.
  3. Close and restart the editor.
  4. Load the mod with the altered global expression.
  5. In the Global Conditionals tab search for and open "ge_ability_dazzling_lights"
  6. add a "or AreGuidsSameGameData(Arkemyrs_Dazzling_Lights_Trickster, oei_interactionSelectedGameData)" to the statement.
  7. Click Accept, and save.

The editor crashes.

  • Thanks 1
Link to comment
Share on other sites

Is there a way to arrange the order of abilities inside progression tables? I think they are sorted by ability ID as new abilities are added right off base abilities however they seem to be sorted randomly.

  • Hmmm 1
Link to comment
Share on other sites

On 9/19/2024 at 12:59 PM, Kvellen said:

Getting a crash whenever I try altering a global expression if there is already a modified global expression in mod.

Fixed now!

On 9/15/2024 at 4:09 AM, Hoo said:

It seems that "Open in New Tab"  in the Editor shows blank page after the latest update. Could you check this issue? Thanks in advane

I forgot to write back after i patched this, sorry 😅

 

2024-09-20

  • Fixed CTD when saving modified Global Conditionals
  • Updates to User Script API

2024-09-15

  • Fixed regression causing some GameData pages not to be displayed.

2024-09-14

  • User Scripts can now be edited through an external editor and synced to Apotheosis.
  • Extended User Script API.
  • Users can now append new String Table entries directly from String Table tabs.
  • Modded .stringtable files are now properly written indented again.

 

 

Edited by Noqn
  • Like 1
  • Thanks 2
Link to comment
Share on other sites

11 hours ago, Cmushi said:

Is there a way to arrange the order of abilities inside progression tables? I think they are sorted by ability ID as new abilities are added right off base abilities however they seem to be sorted randomly.

I remember when I started trying to recreate the whole Progression Table view in Apotheosis that I couldn't make sense of what determines the in-game ability order.

I double checked and the order is not consistent with IDs, not DebugNames, not in-game names, not the order the abilities were defined in abilities.gamedatabundle, and not the order their UnlockableAbility where in in the BaseProgressionTableComponent...

Apotheosis orders based on the UnlockableAbility order, which will not necessarily reflect how it looks in-game. I wanted to make some drag-n-drop feature like what you ask for, but it would have to be consistent with in-game rendering first.
If you're editing a Table directly, you can expand the AbilityUnlocks list, right-click and select Cut, then right-click the row where you want it and select Insert. That way it'll be rendered earlier/later in Apotheosis, but probably won't change the  in-game order.

Edited by Noqn
  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...

Hello. I have a question about Summons; Is there any way to put a new summoned creature type?

For example, there is an incarnate summon creature, such as Incarnate (Berath), which summons 2 creatures; Pallid Knight and Usher. In attacks.gamebundle, we can see what SummonFileList is loaded by the spell (prefabs/characters/character_templates/creature/summons/cre_priest_planargate_berath_usher.prefab and so on).

I want to copy the summon file to another and modify some stats such as name, equipments, and abilities. But it seems not doable, because the prefab file cannot be copied nor created. 

  • Hmmm 1
Link to comment
Share on other sites

  • 3 weeks later...
On 10/5/2024 at 8:50 AM, Hoo said:

Hello. I have a question about Summons; Is there any way to put a new summoned creature type?

No, I think the most you can do is find the corresponding CharacterStats object (under Characters) and edit some data of an existing summon from there. But you can't create a new one.

Sorry as always for my late reply 😖

On 10/22/2024 at 5:25 PM, Cmushi said:

QOL Suggestion: Add a "Show Similar" option that creates a search query with the current field.

Great suggestion, will look at this

  • Thanks 1
Link to comment
Share on other sites

2024-10-25

  • Right-clicking a value in a GameData tab and selecting "Find Similar" will open the Query sidebar and search for other objects that has a matching value.

I think this is going to be insanely convenient, thanks for the idea @Cmushi❤️

 

Edited by Noqn
  • Like 1
  • Thanks 1
Link to comment
Share on other sites

You already added it, that's insane!

Edit: Tried it out and it works perfectly. I hoped that I could search condition as well as I can't figure out how to input them in the search query.

How do you search for empty, not empty and "IsHealthPercentage(This, LessThanOrEqualTo, 50)" ActivationPrequistes?

I tried the following but none seem to work:

  • *GenericAbility.ActivationPrerequisites=empty
  • *GenericAbility.ActivationPrerequisites=null
  • *GenericAbility.ActivationPrerequisites=" "
  • *GenericAbility.ActivationPrerequisites!=empty
  • not *GenericAbility.ActivationPrerequisites=empty
  • *GenericAbility.ActivationPrerequisites=not empty
  •  *GenericAbility.ActivationPrerequisites=IsHealthPercentage(This, LessThanOrEqualTo, 50)
  •  *GenericAbility.ActivationPrerequisites="IsHealthPercentage(This, LessThanOrEqualTo, 50)"
Edited by Cmushi
  • Like 1
Link to comment
Share on other sites

Agh, I hadn't thought about handling Conditionals in Queries at all...

It's tricky because behind Apotheosis' scripting string representations there are some much more bothersome data models hidden away from the users.

I really like this syntax:

22 minutes ago, Cmushi said:

*GenericAbility.ActivationPrerequisites=empty
*GenericAbility.ActivationPrerequisites="IsHealthPercentage(This, LessThanOrEqualTo, 50)"

(I wonder if I could make the Scripts/Conditionals auto-completion and syntax highlighting features work within the query editor conditional strings... 🤔)

 

Link to comment
Share on other sites

19 minutes ago, Noqn said:

It's tricky because behind Apotheosis' scripting string representations there are some much more bothersome data models hidden away from the users.

Nevermind, I could do it quick and dirty by comparing the parsed expression text...

2024-10-26

  • Users can now select "Find Similar" when clicking Conditional or Script rows.

It can be written like this:

*GenericAbility.ActivationPrerequisites != ""
*GenericAbility.ActivationPrerequisites = "IsHealthPercentage(This, LessThanOrEqualTo, 50)" 

you can also use &= to find conditionals with partial matches (see more here https://gitlab.com/noqn/apotheosis/-/wikis/General-Instructions/Queries#string-selector)

*GenericAbility.ActivationPrerequisites &= "IsHealthPercentage(" 

 

 

  • Like 1
  • Thanks 1
Link to comment
Share on other sites

1 hour ago, Noqn said:

Nevermind, I could do it quick and dirty by comparing the parsed expression text...

2024-10-26

  • Users can now select "Find Similar" when clicking Conditional or Script rows.

It can be written like this:

*GenericAbility.ActivationPrerequisites != ""
*GenericAbility.ActivationPrerequisites = "IsHealthPercentage(This, LessThanOrEqualTo, 50)" 

you can also use &= to find conditionals with partial matches (see more here https://gitlab.com/noqn/apotheosis/-/wikis/General-Instructions/Queries#string-selector)

*GenericAbility.ActivationPrerequisites &= "IsHealthPercentage(" 

 

 

These are what exactly I really wanted to. Thank you indeed!

  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...