Jump to content

Recommended Posts

Posted

Dumping my ability modding notes for anyone else who might need it.  Because testing isn't always perfect, some of this may prove to be incorrect, but I mod successfully with it.

 

*I prefer to test abilities by adding the item to a ring (ring_rau) and then equipping the ring.  The ability pops up in the class abilities menu
+Then type toggleresourcelimit to be able to use the ability even if you're not in that class
+passives already learned by your character will be the old versions, unless using a ring or something which does overwrite it!
! attacks.gamedatabundle is missing Launching Kick, flagellant's path upgrade, 198dcb3b-f4f2-4e86-8f7d-9416cfb86f96, wtf!

abilities.gamedatabundle
===========================

"UpgradeDescriptions": [
                        {
                            "String": 2034
                        }
                    ],
"UpgradedFromID" --> links to another ability
"AbilityClassID" --> Class that uses this ability
"AbilityLevel": 5
"IsPassive" --> Puts it on the right hand side of level-up screen?
"IsCombatOnly" --> Vital feature unique to abilities
"UniqueSet" - looks like it's for groups of abilities that take an area (Storms, Walls are the only ones)
"StatusEffectsIDs" - Applies Statuseffects to self or the attack if it's a full-attack ability (twinned shot)

    Non-Necessary
    ---------------
    "InterruptsOn": Hit,Crit,Graze,None,Miss?

>>>WeaponAttackAbilityComponent (Weapon Attack Ability)
"Type": "FullAttack" or Primary or Secondary or None (not used)
"DefendedBy": "Count" <---no override, so inherits the weapon attack's info
"AfflictionsDefendedBy": "Count"
"AttackStatusEffectsIDs" - Additional StatusIDs to apply
"IsMultiHit" - True = weapon attack applies in a line and goes through enemies like a beam
"ProjectilePrefab" - overrides the projectile animation
!Abilities that use WeaponAttackAbilityComponent can't link to a status effect AttackTargetOnEvent-->OnHit. OnApply works fine. Shackle_Shot was my problem for this.


SharedTargetAbilityComponent can have PartyMember for abilities where you're hitting the same dudes


progressiontables.gamedatabundle
=================================

    +Must include all code for a class, in my experience.  The new code isn't added, it's replaced. Copy+paste it!
    +Two types of abilities here.  Unlock, and AutoGrant.  AutoGrant is added automatically I guess, unlock is chosen by the player.

"AddAbilityID"
"RemoveAbilityID" - for upgraded abilities, remove the old one
"MinimumPowerLevel" - level needed to choose it (dual-class gets 1 power level per 2 levels)
"RequiresAbilityID" - 
"Conditional" - for subclass restrictions or for upgraded abilities it'll require the old ability


Conditional
====================
    > "FunctionHash" - set to 0, the game creates a hash for this
    > "ParameterHash" - set to 0, the game creates a hash for this
    > "Parameters" - Subclass ID or Ability ID providing the restriction
    > "Operator" - 0=And, 1=Or, for multiple conditions in this Components section (the Operator just below "Conditional" should always be 0 though)
    > Example:                            "Components": [{
                                        }, {
                                            "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
                                            "Data": {
                                                "Flags": "",
                                                "FullName": "Boolean ProgressionTableHasAbility(Guid)",
                                                "FunctionHash": -1793712019,
                                                "ParameterHash": 124907666,
                                                "Parameters": ["e1668937-c325-45ec-a53e-7fb9ba421abe"],
                                                "UnrealCall": ""
                                            },
                                            "Not": true,
                                            "Operator": 0
                                        },    {
                                            "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
                                            "Data": {
                                                "Flags": "",
                                                "FullName": "Boolean ProgressionTableIsSubclass(Guid)",
                                                "FunctionHash": 0,
                                                "ParameterHash": 0,
                                                "Parameters": ["36675937-fef0-4248-aef8-61d41844ea5f"],
                                                "UnrealCall": ""
                                            },
                                            "Not": true,
                                            "Operator": 0
                                        }
Conditionals from any folder seem to be useable (/AI,/RPG,/Global, etc. in the Obsidian Game Data Formats documentation)
"VisibilityConditional" - for subclass restrictions, same as conditional but restricts view of the ability
IsAttributeScoreValue - conditional used in abilities like Colossal in lax3_abilities.gamedatabundle - allow abilities based on Attribute Score!!
IsCurrentActionType(Guid, ActionType) - While whatever your commanded action is, i.e. whatever is in the circle above your character. ActionType not given in the official Obsidian documentation!  You can see it used in aibehaviors.aibehaviorbundle.  It appears to be the AIBehaviorType list in the Enumerations document, but "UseWaypoint" isn't on that list!!  Could also be CustomAIActionType, which only has UseAbility, Attack, and UseItem
    "UseObject"
    "Attack"
    "ConsumeItem"
    "SwitchWeaponSet"
    "UseWaypoint"
    "Cast"
    "Grapple"
    "Move"
    "MoveToWaypointInCombat"
    So far I only know that Attack works. Grapple and some others not listed here don't seem to work for the Targeting conditional I tried.

Boolean HasMoveRateEffectWithValue(Guid, Operator, Single) does not work
+If you want to create a status effect based on if the enemy is alone, it was done with Azure blade by AttackEnemyOnEvent and the attack has a target conditional IsAllyCount

Boolean HasStatusEffectType(Guid, StatusEffectType) work with "Invisible", as you'll notice it's actually never on your current effects when applied
Boolean IsCurrentActionType(Guid, ActionType) doesn't activate and deactivate abilities for the ActivationPrerequisites well, for "Cast" action type

+From the Improved Single Classes Mod: "Prior version will incorrectly grant abilities to multiclass characters. Apparently HasClass is not supported on a progressiontable, only ProgressionTableIsClass, which doesn't seem to check for other classes outside the current table."
ActivationPrerequisites (in abilities) appears to start the effect on the conditional, but also cancel it when that condition is no longer true!
    - my Abbadon's Ultimate ability Respair did this when it was just an activation conditional  and one StatusEffect.  It would trigger when HP was 20% then immediately disappear


-------------------
 Typically in Boolean algebra, R1 and R2 or R3 would be evaluated like (R1 and R2) or R3, but that's not the case here.  The conditionals are evaluated in order. If any AND conditional is false, the whole condition fails. If any OR conditional is true, the whole condition passes. In either case, evaluation will short-circuit (not evaluating any more conditionals).

If neither of those things occur, the result is based on the operator of the last conditional.

    If it's AND, the result is RN (the result of the last conditional)
    If it's OR, the result is RN OR RN-1

As far as I can tell, the evaluation order is left-to-right (top-to-bottom in JSON)
-------------------

Instances
===================
Target - 1a26e100-0000-0000-0000-000000000000 - sometimes really needs a connected attack to work


Attacks
===============
+Damage and other basic attack stats isn't modified after the attack is launched, even if it's a projectile that takes time to hit new foes (not sure about bouncing)
+Bounce damage can go down but it can't go up via AttackOverride: FullAttack because the bounce data only works for the Attack in that gamedata (momentum_shot)
+Each bounce is another chance for a linked effect to occur "OnApply"
+Attacks must have a ForcedTarget (and maybe AffectedTargetType) that allow for the connected attacks to start. So A hostile attack that also heals friends in an AOE can't have ForcedTarget: Hostile.
+Targeting and Visual effects are why your abilities don't work. VFX are finicky and targeting works when consistent succession of attacks.
+TeleportAttacks can't have Require****Object: true
+TeleportAttacks only hit a location so effects won't work unless they are also targeting a location (AOE spells)
+TeleportBeamAttacks can have Require****Object: true
+ForcedTarget can be "None" or "Self" but not much else.  Can't be "Friendly" or "Ally" etc.
+Attack targeting appearances (red circle vs yellow circle) can be overridden by "HostilityOverride"

Defunct Status Effect Types, Ability Types, etc.
================================================
+"PassiveAbility" (different than IsPassive: True) abilities don't work when copied.  They're special because Nothing refers to them so they somehow work on their own.
+IsMarked: True 
    doesn't seem to work at all.
+MarkedPrey doesn't seem to work at all.  Nothing references the PassiveAbility, so maybe just using another means of applying the desired StatusEffect works. (worked for me in Clear Shot)
+EngagementRadius doesn't seem to work
+BonusHealingMult can't use attack filter, even though BonusHealMult can
+VerticalLaunch, when stacked, doesn't apply all the stacks immediately, or at least they decrease rapidly on the gui.  After a few launches, especially with a lot of stacks (100 stacks of 1), the launch time for any future launch becomes much longer and inconsistent.
+Boolean HasStatusEffectType doesn't work with "Immunity" or "AfflictionImmunity" but it does work with "AfflictionResistance" !
+BeneficialEffectDurationMultiplier doesn't seem to work
+BonusPotionEffectOrDurationPercent definitely doesn't work
+DamageMinimum doesn't work with negative values, at least
+OnSuccessfulInterrupt doesn't seem to work, and is never used
+EnemiesNeededToFlankAdj does nothing when -1, or at least the minimum is still 2
+DOTTickMult works but it's visuals are screwed up to be negative when it should start with a plus sign, so overwrite with a text string
+16 statuseffects appears to be the limit, seen at Minor Avatar and not working with more unless child effects are linked to them
+UnadjustedDamageBonus doesn't show up in the combat log, the end damage is just bigger from that multiple of your initially rolled damage
    - also doesn't show up in text correctly, but it does use the attack filter
+DamageMinimum does work but doesn't adjust the maximum damage in the GUI, so it looks wrong. Also it can use the attack filter
+SuspendHostileEffects doesn't use the attack filter
+"None" effects that also use "Transfer" can cause the ability description to freak out and say object not defined, only curable by changing SE type

StatusEffects
===================
+You just can't have some VFX on status effects.  The mod won't load.  prefabs/effects/abilities/monk/fx_flagellants_path_tp.prefab is one of them.
+You can link an effect to the caster, even if the effect must be a Child (Affliction), the affliction effect can be Transfer, which links to an identical effect for the caster
    - So Child-->Transfer-->statusEffect works
+ApplyOverTime only works for straight values, and is only used for Health and Damage by Obsidian
+StackedChildrenApplyEffects "true" makes things stack that aren't stacking.  In my Fireform attack, a stacking ApplyOnTick ApplyStatusEffectOnEvent applying a stacking DamageMult wasn't stacking the DoT applications, it was only applying at the interval rate, until StackedChildrenApplyEffects "true"
+You can't increase the duration of outgoing effects, only afflictions.  Duration has to be extended as they are received or existing
+"Boolean IsStatusEffectCount(Guid, Guid, Operator, Int32)" is used for effects based on number of stacks

Stun
--------------
                        "ef17d967-79f8-4cb6-ae93-a19e4d3eb8d2", Might -5 (all these have infinite base duration)
                        "9fd4396f-b41b-40f7-9d7f-049d1ab466b9", Penetration -4 (useless unless "Stunned" effect is resisted. It's here b/c lesser afflictions)
                        "45537b43-aa00-4ee7-8f70-84f60a6b1d65", Stunned (infinite base duration)
                        "b83921b4-08a3-4327-a33b-365580ac88ad"  Deflection -10

-----------------
+AoEMult is not AOEMult like in the enumerations manual
+OneHitUse will apply to the attack of the ability and expire if it's linked from the abilities section, but this only works for my code if I do this too:
                    "TriggerAdjustment": {
                        "TriggerOnEvent": "OnPostAttackRollCalculated",
                        "TriggerOffEvent": "None",
                        "ValidateWithAttackFilter": "true",
                        "ParamValue": 0,
                        "ValueAdjustment": 0,
                        "DurationAdjustment": 0,
                        "ResetTriggerOnEffectTimeout": "false",
                        "MaxTriggerCount": 1,
                        "IgnoreMaxTriggerCount": "false",
                        "RemoveEffectAtMax": "true",
                        "ChanceToTrigger": 1
    - The problem with this is that it clears after the first instance, so AoE attacks are only affected by the effect for one random target in the AoE
    - You can't link it via ApplyStatusOnEvent (OneHitUse) --> StatusEffect (OneHitUse) because it stays on the character forever! Unlike official code
        But it finally goes away if you attack with something that's NOT part of the OneHitUse AttackFilter criteria. Ability instead of spell, etc
        I'm doing it exactly like strike the bell's penetration and it's not working :(
        The frickin' melee attack that was just for visual flair was ruining a lot too.  Skill at least started when I took that out.
    - AoEMult doesn't work with it either, looks like
+OneHitUse will work perfectly if in a WeaponAttackAbilityComponent under the AttackStatusEffectsIDs section
+Having statusEffect directly in the ability seems to flow down into all or some of the attacks of that ability (clear shot_test_2)
+Bounce damage can go down but it can't go up via AttackOverride: FullAttack because the bounce data only works for the Attack in that gamedata (momentum_shot)
+Bounces don't repeat if you make it hit InRangeOrder true
+UseCharacterLevel": "true" in power level scaling can cause the effects to not load

Apply/AttackOnEvent
----------------
+The target is you, unless it's an SE in an Attack or ApplySEtoEnemy
+the OnEvent statuses use the attack filter when the event is relating to an attack.
+OnActivatesAttack effects before the attack is launched, and triggers for subsidiary attacks, not just attacks launched from an animation
+OnLaunchesAttack does not target the enemy, it targets the self for the status
+OnLaunchesAttack is before attack rolls occur for that attack
+AttackOnEvent can't have Visual Effects.  The mod won't load.
+ApplyStatusEffectToSelfByDamageTypeReceived is a delicate, frustrating baby that you don't want to work with
    when you test this you need to take godmode off
+ApplyStatusEffectToSelfByDamageRecieved and the damage statusEffect linked to it might need to be IsHostile "true" if the damage is instant!! (I've done otherwise)
+OnClear doesn't trigger from Child effects expiring
+OnEngagementByOtherBroken triggers every enemy attack if something like an aura is decreasing their max engagement
+StatusEffectsOnAttackIDs (in the ItemMod) applies the effect to the target hit, but be careful because this is never used
+When in godmode you don't count as OnAttacked
+OnAttacked doesn't include OnMissed, it's only when you're grazed hit or crit
+AttackEnemyOnEvent requires a 1 in the Value as it represents the percent chance to trigger!


AttackFilter
----------------
+weapon attack abilities and their secondary effects don't register with this, unless source: weapon is included, and they're never a class ability
+the OnEvent statuses use the attack filter when the event is relating to an attack.
+Source: NonSpellAbility will apply to -all- attacks if alone, and applies to all abilities, even spells, of the ClassTypeID if defined
+TargetType can be SingleTarget, AOE, or None (default)
+AdjustDurationOfHostileEffects doesn't ever use Attack Filter in the Obsidian code
+AttackTarget TargetHostility is Default, Hostile, or NonHostile
+TargetHostility can use HostileEver, but this ignores a lot of attacks, mostly only working on melee or teleport+hit attacks
+TargetHostility Nonhostile doesn't seem to trigger attacks from you onto allies (tried OnScoringHit, attack filter nonhostil, targetfilter nonhostile)
+AttackFilter and AttackTargetFilter work fine with multiple keywords and inspiration keywords, but sometimes they don't
    Ex: My Rightousness ability was based off of High and Mighty, which do the same thing, but Righteousness didn't work
+"Not" works like Not OR NOT when multiple keywords are used
+AttackFilter HealthPercentage doesn't work with DamageMultiplier, you have to have an ability w/ conditional based on HP
    AttackTargetFilter does work though
+ApplyStatusEffectToEnemyByDamageDealt automatically uses the attack filter, damageType AND can (not must) use the event value for OnScoringGrazeOrHitOrCriticalHit
+"NonHostile" isn't in any attack filters and didn't work with AoEMult
+Attack Speed doesn't seem to use the Attack Target filter
+ClassTypeID is the class value ID and doesn't work by itself, but does when "source" parameters are used (spell/NonSpellAbility)
    - weapon attack abilities are not affected, and are instead affected by weapon-only effects without the ClassTypeID involved
        - even if source "Weapon" is used
+DefendedBy must be "Deflect" instead of deflection

Does StatusEffectDefense work? Not used in ANY files.  Would be awesome to have defense vs. "Stunned" or "KnockUp" for example.
AdjustBeneficialDuration doesn't use the attack filter, it can use KeywordValueID though!
It isn't impossible to react when someone misses you---Soul Mirror is the only ability that uses AttackHitType": "Miss", with AttackReflectChance


Trigger Notes
----------------
? When using ApplyStatusEffectToEnemyOnEvent then AttackTargetOnEvent, which is now on the enemy, the Trigger section counts the enemy as the "effect target" but the attack still comes from you, right? (ex: Soul_Storm_Stack)
+OnMovementEnd sometimes "doesn't work" because it triggers automatically an extra time, immediately when you don't want it to!
    - So if you have it cancel on the 2nd time, via MaxTriggerCount: 2, RemoveEffectAtMax: True, then it works as intended
    - I can't tell when exactly it triggers, but apparently at the end of casting, and at rest. Maybe the beginning of the current action.
+When this isn't done in a way the game likes, it will cause your ability to not show up
+OnHit is not an event!  OnPlainHit is.
+ApplyStatusEffectToSelfByDamageRecieved is 1) spelled incorrectly, and 2) doesn't work if you have God mode on!  The damage is logged but doesn't trigger!!
+OnMissed didn't trigger in the TriggerAdjustment when I used it to try and clear a status giving defense up to one miss
+StartsAttackingSameTargetAsAlly begins the instant you and someone else start targeting the same target
+OnUnconscious happens just before death, so clear on death still works with it
+OnHealthPercentBelow and OnHealthPercentAbove simply do not work as a trigger unless you're Obsidian I guess.  Try the AttackTarget filter instead
+OnApply doesn't work for stacking effects because they're stacked instead of being reapplied.  They're already applied.  No effect unless otherwise applying.


Basic TriggerAdjustments
--------------------------
                    "TriggerAdjustment": {
                        "TriggerOnEvent": "OnLaunchesAttack", <----When you attack, below will happen
                        "TriggerOffEvent": "None",
                        "ValidateWithAttackFilter": "true",
                        "ParamValue": 0,
                        "ValueAdjustment": 1.05, <----Value of StatusEffect will be x105%. Multiplicative!
                        "DurationAdjustment": 5,  <---Duration of StatusEffect will be +5 seconds
                        "ResetTriggerOnEffectTimeout": "false", <---only used by one StatusEffect
                        "MaxTriggerCount": 10, <---Will stack 10x
                        "IgnoreMaxTriggerCount": "false",
                        "RemoveEffectAtMax": "true",  <----remove effect at max stacks for this condition
                        "ChanceToTrigger": 1  <---This adjustment will happen every time you launch an attack

Ranged Attack Notes
----------------------------
+"ProjectileCountAdjustment" on Abilities must be 0 if you want additional ranged attack rays per level (every 2 power levels)
    - It looks like this only works if everything else is default too, on the abilities side of it, not the attack side
    - Actually it looks like it only works if you copy my arc_nova wizard ability and multiHit_ray attack. It seriously only works if you paste that code, then change it.


What Counts as An Attack
--------------------------------
+AoE pulses don't count
+RandomAoE pulses (AoE in AoE) do count as attacks, but probably not an attack launch

Keywords
-------------------
+HasKeyword is only used for attacks and companion statuseffects.
+Keyword conditionals don't appear to work with affliction/inspiration keywords
?+AttackTargetOnEvent is it possible to add keywords to these attacks?

Removing Statuses
-------------------
+"Immunity" status effect with the keyword in the AttackFilter clears the statuses with that keyword and makes immune to those keyword attacks

Immunities
-----------------
+Armor immunities should be implemented via ArmorRating 999.  The AI glitches and repeatedly attacks that person fast after their unresponsive hit, and the hits can get queued and then released all at once when the ArmorRating becomes reduced lower than 999

Stacking
---------------------
+Multiple StatusEffects that do the same thing but for different reasons? --> "StackingRuleOverride": "Always" in the Ability section
    - or only the highest DamageMultiple bonus will take effect, for example


Unlisted Special Ability/Attack/StatusEffect GameData Types
---------------------
AttackAuraGameData (attacks.gamedatabundle) - on a few attacks in expansion Lax3
    - This is awesome for auras on you affecting enemies, but you can't extend the duration on events
AttackGrappleGameData
AttackFirearmGameData


Push and Pull
--------------
+Pushing can cause enemies to bounce if you apply multiple statuseffect pushes
+pushes don't apply if the push would cause it to go past a wall.  They're applied, but the target doesn't push, just gets hit there
+Pushing is more smooth if done by chaining attacks that push, like my air nova spell


DynamicValue
--------------
+Multiplies the Stat by the MultiplyBy factor and adds it to the BaseValue
    e.g. Ardent_SE_Will StatusEffectType "Will", BaseValue 20, DynamicValue Stat "Health", MultiplyBy -15, Operator "Add" (never change this)
        Add -15 Will multiplied by the target's current health ratio, to the constant base value of 20, for total of +5/+20 Will at Min/Max HP

GUI Tricks
----------------
+ Current Effects is slightly different than the ability GUI.  It will have some abilities that are AppliedOnEvent that don't show in ability previews.
+ ApplyStatusEffectOnEvent x2 or x3 hides something from the ability GUI, but puts it on the Current Effects if the intermediary ApplyStatusEffectOnEvent are instant.
+ If you hide abilities from GUI you can also force it to show all status effects, but this often doesn't get what you need
+ Afflictions show up in their own group listing of status effects in the summary, so they'll be bundled up
+ If something is showing up in a bad order, it's because it's part of a different attack, target, or duration group. Attack vs. a defense type, vs. a hostility type, target type, Infinite, Instant, Affliction etc.
+"None" effects that also use "Transfer" can cause the ability description to freak out and say object not defined, only curable by changing SE type

Deep Mechanics
----------------
+Negative "Health" effects appear to be treated as damage, as they are steepened with damage% bonuses
 

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...