Larian Banner: Baldur's Gate Patch 9
Previous Thread
Next Thread
Print Thread
Joined: Sep 2016
journeyman
OP Offline
journeyman
Joined: Sep 2016
With Baardvaark's permission I've adapted his saving throw script to make your chance to resist a status equal to the percentage of physical or magical armor you have left. I've gotten it to work exactly how I want it to (!!) except for this one little problem I'm hoping someone here can help me figure out.

The mod works by overriding the status entries for every debuff with a physical or magic armor check and deleting the 'saving throw' for each, so disables will pass right through armor. Then, the following events are added to the top of Statuses.gamescript, which controls status interactions (i.e. wet + chilled = frozen).

For physical armor debuffs:

Quote
EVENT ResistPhysStatuses
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
FLOAT:_PhysArmor
ON
FetchCharacterApplyStatusData(_Character, _Result)
ACTIONS
ListClear(_RemoveList)

IF "c1|c2|c3|c4|c5|c6|c7|c8"

IsEqual(_Result,CRIPPLED)
IsEqual(_Result,DISEASED)
IsEqual(_Result,TAUNTED)
IsEqual(_Result,BLEEDING)
IsEqual(_Result,TAUNTED)
IsEqual(_Result,DISARMED)
IsEqual(_Result,KNOCKED_DOWN)
IsEqual(_Result,CHICKEN)

THEN
IF "!c1&c2&c3"
CharacterHasTalent(_Character,Raistlin)
CharacterGetStat(_PhysArmor,_Character,PhysicalArmor)
IsRandom(_PhysArmor)

THEN
ListAdd(_RemoveList, _Result)
Set(_Result,null)
StatusText(_Character,"Effect resisted by physical armor")
ENDIF
ENDIF
RETURN(_RemoveList,_Result,null)

For magic armor debuffs:

Quote
EVENT ResistMagicStatuses
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
FLOAT:_MagicArmor
ON
FetchCharacterApplyStatusData(_Character, _Result)
ACTIONS
ListClear(_RemoveList)

IF "c1|c2|c3|c4|c5|c6|c7|c8|c9|c10|c11|c12|c13|c14|c15|c16|c17|c18|c19|c20"

IsEqual(_Result,BLIND)
IsEqual(_Result,CURSED)
IsEqual(_Result,WEAK)
IsEqual(_Result,CHILLED)
IsEqual(_Result,SHOCKED)
IsEqual(_Result,NULL_RESISTANCE)
IsEqual(_Result,FIREBLOOD)
IsEqual(_Result,MADNESS)
IsEqual(_Result,FLAMING_CRESCENDO)
IsEqual(_Result,DEAF)
IsEqual(_Result,POISONED)
IsEqual(_Result,BURNING)
IsEqual(_Result,NECROFIRE)
IsEqual(_Result,FEAR)
IsEqual(_Result,FROZEN)
IsEqual(_Result,PETRIFIED)
IsEqual(_Result,STUNNED)
IsEqual(_Result,SLEEPING)
IsEqual(_Result,MUTED)
IsEqual(_Result,ENTANGLED)

THEN
IF "!c1&c2&c3"
CharacterHasTalent(_Character,Raistlin)
CharacterGetStat(_MagicArmor,_Character,MagicArmor)
IsRandom(_MagicArmor)

THEN
ListAdd(_RemoveList, _Result)
Set(_Result,null)
StatusText(_Character,"Effect resisted by magic armor")

ENDIF
ENDIF
RETURN(_RemoveList,_Result,null)

So if the status is any one of the statuses we've removed saves from, we do a random roll based on the percentage of the corresponding armor type remaining, and if we roll under that percentage the status is 'blocked,' and the text 'Effect resisted by ____ armor" is shown above the character.

The problem I'm having now is that of the two events (physical and magic saves), whichever I put at the top of this file works correctly. The one I put second lets the statuses it governs right through armor. It still returns the 'Effect resisted by ____ armor' text, which indicates to me that the armor percentage check is still occuring, but the status is never 'blocked.' This works the same no matter which event comes second, physical or magic.

I assume this problem has something to do with the 'remove list.' If I had a better understanding of how the scripts here work I might be able to figure it out, but my coding process is pretty much all intuition and trial and error.

Oh, and the reason I do this in Statuses.gamescript and not a character script is that FetchCharacterApplyStatusData is the only way I've found to 'grab' a status right before it's applied. (The character script this is based on has to remove statuses immediately after application, which returns a bunch of unsightly status set, status removed notifications.)

Here's what the rest of Statuses.gamescript (the base game code) looks like:

EVENTS
EVENT CharacterSetWarm
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, WARM)
ACTIONS
Set(_Result,WARM)
ListClear(_RemoveList)
ListAdd(_RemoveList,WET)
IF "c1"
CharacterHasStatus(_Character, WARM)
THEN
ListAdd(_RemoveList,WARM)
Set(_Result,BURNING)
ELIF "c1|c2|c3"
CharacterHasStatus(_Character, BURNING)
CharacterHasStatus(_Character, NECROFIRE)
CharacterHasStatus(_Character, HOLY_FIRE)
THEN
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, CHILLED)
THEN
ListAdd(_RemoveList,CHILLED)
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, FROZEN)
THEN
ListAdd(_RemoveList,FROZEN)
Set(_Result,CHILLED)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetBurning
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, BURNING)
ACTIONS
Set(_Result,BURNING)
ListClear(_RemoveList)
IF "c1&!c2"
CharacterHasStatus(_Character, WARM)
CharacterHasStatus(_Character, WET)
THEN
ListAdd(_RemoveList, WARM)
ELIF "c1&!c2"
CharacterHasStatus(_Character, WET)
CharacterHasStatus(_Character, WARM)
THEN
ListAdd(_RemoveList, WET)
Set(_Result, WARM)
ELIF "c1&c2"
CharacterHasStatus(_Character, WET)
CharacterHasStatus(_Character, WARM)
THEN
ListAdd(_RemoveList, WET)
ELIF "c1"
CharacterHasStatus(_Character, CHILLED)
THEN
ListAdd(_RemoveList, CHILLED)
Set(_Result, WARM)
ELIF "c1"
CharacterHasStatus(_Character, FROZEN)
THEN
ListAdd(_RemoveList, FROZEN)
Set(_Result, WET)
ELIF "c1|c2"
CharacterHasStatus(_Character, NECROFIRE)
CharacterHasStatus(_Character, HOLY_FIRE)
THEN
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetNecrofire
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, NECROFIRE)
ACTIONS
Set(_Result,NECROFIRE)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, PETRIFIED)
THEN
Set(_Result,null)
ELSE
ListAdd(_RemoveList, WARM)
ListAdd(_RemoveList, BURNING)
ListAdd(_RemoveList, CHILLED)
ListAdd(_RemoveList, WET)
ListAdd(_RemoveList, FROZEN)
IF "c1"
CharacterHasStatus(_Character, HOLY_FIRE)
THEN
ListAdd(_RemoveList, HOLY_FIRE)
Set(_Result, BURNING)
ELIF "c1"
CharacterHasStatus(_Character, BLESSED)
THEN
ListAdd(_RemoveList, BLESSED)
Set(_Result, BURNING)
ENDIF
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetHolyFire
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, HOLY_FIRE)
ACTIONS
Set(_Result,HOLY_FIRE)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, PETRIFIED)
THEN
Set(_Result,null)
ELSE
ListAdd(_RemoveList, WARM)
ListAdd(_RemoveList, BURNING)
ListAdd(_RemoveList, CHILLED)
ListAdd(_RemoveList, WET)
ListAdd(_RemoveList, FROZEN)
IF "c1"
CharacterHasStatus(_Character, NECROFIRE)
THEN
ListAdd(_RemoveList, NECROFIRE)
Set(_Result, BURNING)
ENDIF
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetWet
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
INT:_Turns
ON
FetchCharacterApplyStatusData(_Character, WET)
ACTIONS
Set(_Result,WET)
Set(_Turns,null)
ListClear(_RemoveList)
ListAdd(_RemoveList, WARM)
ListAdd(_RemoveList, INVISIBLE)
IF "c1"
CharacterHasStatus(_Character, BURNING)
THEN
ListAdd(_RemoveList, BURNING)
Set(_Result, WARM)
ELIF "c1"
CharacterHasStatus(_Character, HOLY_FIRE)
THEN
ListAdd(_RemoveList, HOLY_FIRE)
Set(_Result, WARM)
ELIF "c1"
CharacterHasStatus(_Character, CHILLED)
THEN
ListAdd(_RemoveList, CHILLED)
Set(_Result,FROZEN)
Set(_Turns,1)
ELIF "c1|c2|c3"
CharacterHasStatus(_Character, FROZEN)
CharacterHasStatus(_Character, NECROFIRE)
CharacterHasStatus(_Character, HOLY_FIRE)
THEN
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, SHOCKED)
THEN
ListAdd(_RemoveList, SHOCKED)
Set(_Result,STUNNED)
Set(_Turns,1)
ENDIF
RETURN(_RemoveList,_Result,_Turns)

EVENT CharacterSetChilled
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
INT:_Turns
ON
FetchCharacterApplyStatusData(_Character, CHILLED)
ACTIONS
Set(_Result,CHILLED)
Set(_Turns,null)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, BURNING)
THEN
ListAdd(_RemoveList, BURNING)
Set(_Result, WARM)
ELIF "c1"
CharacterHasStatus(_Character, HOLY_FIRE)
THEN
ListAdd(_RemoveList, HOLY_FIRE)
Set(_Result, WARM)
ELIF "c1"
CharacterHasStatus(_Character, WARM)
THEN
ListAdd(_RemoveList, WARM)
Set(_Result,null)
ELIF "c1|c2"
CharacterHasStatus(_Character, CHILLED)
CharacterHasStatus(_Character, WET)
THEN
ListAdd(_RemoveList, CHILLED)
ListAdd(_RemoveList, WET)
Set(_Result, FROZEN)
Set(_Turns,1)
ELIF "c1|c2|c3"
CharacterHasStatus(_Character, FROZEN)
CharacterHasStatus(_Character, NECROFIRE)
CharacterHasStatus(_Character, HOLY_FIRE)
THEN
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,_Turns)

EVENT CharacterSetFrozen
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, FROZEN)
ACTIONS
Set(_Result,FROZEN)
ListClear(_RemoveList)
ListAdd(_RemoveList, CHILLED)
ListAdd(_RemoveList, WET)
ListAdd(_RemoveList, INVISIBLE)
ListAdd(_RemoveList, SLEEPING)
IF "c1"
CharacterHasStatus(_Character, MAGIC_SHELL)
THEN
ListClear(_RemoveList)
ListAdd(_RemoveList, MAGIC_SHELL)
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, BURNING)
THEN
ListAdd(_RemoveList, BURNING)
Set(_Result, WET)
ELIF "c1"
CharacterHasStatus(_Character, HOLY_FIRE)
THEN
ListAdd(_RemoveList, HOLY_FIRE)
Set(_Result, WET)
ELIF "c1|c2"
CharacterHasStatus(_Character, NECROFIRE)
CharacterHasStatus(_Character, HOLY_FIRE)
THEN
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, WARM)
THEN
ListAdd(_RemoveList, WARM)
Set(_Result, CHILLED)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetPetrified
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, PETRIFIED)
ACTIONS
Set(_Result,PETRIFIED)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, MAGIC_SHELL)
THEN
ListClear(_RemoveList)
ListAdd(_RemoveList, MAGIC_SHELL)
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, BLESSED)
THEN
ListClear(_RemoveList)
ListAdd(_RemoveList, BLESSED)
Set(_Result,null)
ENDIF
IF "c1"
IsEqual(_Result, PETRIFIED)
THEN
ListAdd(_RemoveList, STUNNED)
ListAdd(_RemoveList, SHOCKED)
ListAdd(_RemoveList, BLEEDING)
ListAdd(_RemoveList, CRIPPLED)
ListAdd(_RemoveList, BURNING)
ListAdd(_RemoveList, POISONED)
ListAdd(_RemoveList, INVISIBLE)
ListAdd(_RemoveList, SLEEPING)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetShocked
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
INT:_Turns
ON
FetchCharacterApplyStatusData(_Character, SHOCKED)
ACTIONS
Set(_Result,SHOCKED)
Set(_Turns,null)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, MAGIC_SHELL)
THEN
ListAdd(_RemoveList, MAGIC_SHELL)
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, STUNNED)
THEN
ListAdd(_RemoveList, SHOCKED)
Set(_Result,null)
ELIF "c1|c2"
CharacterHasStatus(_Character, SHOCKED)
CharacterHasStatus(_Character, WET)
THEN
ListAdd(_RemoveList, SHOCKED)
Set(_Result,STUNNED)
Set(_Turns,1)
ENDIF
ListAdd(_RemoveList, INVISIBLE)
ListAdd(_RemoveList, SLEEPING)
RETURN(_RemoveList,_Result,_Turns)

EVENT CharacterSetStunned
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, STUNNED)
ACTIONS
Set(_Result,STUNNED)
ListClear(_RemoveList)
ListAdd(_RemoveList, SHOCKED)
ListAdd(_RemoveList, PETRIFIED)
ListAdd(_RemoveList, WET)
ListAdd(_RemoveList, INVISIBLE)
ListAdd(_RemoveList, SLEEPING)
IF "c1"
CharacterHasStatus(_Character, MAGIC_SHELL)
THEN
ListClear(_RemoveList)
ListAdd(_RemoveList, MAGIC_SHELL)
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, BLESSED)
THEN
ListClear(_RemoveList)
ListAdd(_RemoveList, BLESSED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetDrunk
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
INT:_Turns
ON
FetchCharacterApplyStatusData(_Character, DRUNK)
ACTIONS
Set(_Result,DRUNK)
Set(_Turns,null)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, CLEAR_MINDED)
THEN
ListAdd(_RemoveList, CLEAR_MINDED)
Set(_Result, null)
ELIF "c1"
CharacterHasStatus(_Character, DRUNK)
THEN
ListAdd(_RemoveList, DRUNK)
Set(_Result, SLEEPING)
Set(_Turns,2)
ENDIF
RETURN(_RemoveList,_Result,_Turns)

EVENT CharacterSetSlowed
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, SLOWED)
ACTIONS
Set(_Result,SLOWED)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, HASTED)
THEN
ListAdd(_RemoveList, HASTED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetHasted
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, HASTED)
ACTIONS
Set(_Result,HASTED)
ListClear(_RemoveList)
ListAdd(_RemoveList, SLOWED)
ListAdd(_RemoveList, CRIPPLED)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetFeared
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, FEAR)
ACTIONS
Set(_Result,FEAR)
ListClear(_RemoveList)
IF "c1|c2"
CharacterHasStatus(_Character, CLEAR_MINDED)
CharacterHasStatus(_Character, ENRAGED)
THEN
ListAdd(_RemoveList, CLEAR_MINDED)
ListAdd(_RemoveList, ENRAGED)
Set(_Result,null)
ELSE
ListAdd(_RemoveList, CHARMED)
ListAdd(_RemoveList, TAUNTED)
ListAdd(_RemoveList, SLEEPING)
ListAdd(_RemoveList, MADNESS)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetCharmed
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, CHARMED)
ACTIONS
Set(_Result,CHARMED)
ListClear(_RemoveList)
IF "c1|c2"
CharacterHasStatus(_Character, CLEAR_MINDED)
CharacterHasStatus(_Character, ENRAGED)
THEN
ListAdd(_RemoveList, CLEAR_MINDED)
ListAdd(_RemoveList, ENRAGED)
Set(_Result,null)
ELSE
ListAdd(_RemoveList, FEAR)
ListAdd(_RemoveList, TAUNTED)
ListAdd(_RemoveList, SLEEPING)
ListAdd(_RemoveList, MADNESS)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetTaunted
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, TAUNTED)
ACTIONS
Set(_Result,TAUNTED)
ListClear(_RemoveList)
ListAdd(_RemoveList, INVISIBLE)
IF "c1|c2"
CharacterHasStatus(_Character, CLEAR_MINDED)
CharacterHasStatus(_Character, ENRAGED)
THEN
ListAdd(_RemoveList, CLEAR_MINDED)
ListAdd(_RemoveList, ENRAGED)
Set(_Result,null)
ELSE
ListAdd(_RemoveList, CHARMED)
ListAdd(_RemoveList, FEAR)
ListAdd(_RemoveList, SLEEPING)
ListAdd(_RemoveList, MADNESS)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetSleeping
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, SLEEPING)
ACTIONS
Set(_Result,SLEEPING)
ListClear(_RemoveList)
ListAdd(_RemoveList, INVISIBLE)
IF "c1|c2"
CharacterHasStatus(_Character, CLEAR_MINDED)
CharacterHasStatus(_Character, ENRAGED)
THEN
ListAdd(_RemoveList, CLEAR_MINDED)
ListAdd(_RemoveList, ENRAGED)
Set(_Result,null)
ELSE
ListAdd(_RemoveList, CHARMED)
ListAdd(_RemoveList, TAUNTED)
ListAdd(_RemoveList, FEAR)
ListAdd(_RemoveList, MADNESS)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetMadness
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, MADNESS)
ACTIONS
Set(_Result,MADNESS)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, CLEAR_MINDED)
THEN
ListAdd(_RemoveList, CLEAR_MINDED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetClearMinded
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, CLEAR_MINDED)
ACTIONS
Set(_Result,CLEAR_MINDED)
ListClear(_RemoveList)
ListAdd(_RemoveList, FEAR)
ListAdd(_RemoveList, CHARMED)
ListAdd(_RemoveList, TAUNTED)
ListAdd(_RemoveList, SLEEPING)
ListAdd(_RemoveList, ENRAGED)
ListAdd(_RemoveList, BLIND)
ListAdd(_RemoveList, DRUNK)
ListAdd(_RemoveList, MADNESS)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetEnraged
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, ENRAGED)
ACTIONS
Set(_Result,ENRAGED)
ListClear(_RemoveList)
ListAdd(_RemoveList, FEAR)
ListAdd(_RemoveList, CHARMED)
ListAdd(_RemoveList, TAUNTED)
ListAdd(_RemoveList, SLEEPING)
ListAdd(_RemoveList, MADNESS)
ListAdd(_RemoveList, CLEAR_MINDED)
RETURN(_RemoveList,_Result,null)


EVENT CharacterSetRested
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, RESTED)
ACTIONS
Set(_Result,RESTED)
ListClear(_RemoveList)
ListAdd(_RemoveList, MUTED)
ListAdd(_RemoveList, BLIND)
ListAdd(_RemoveList, CRIPPLED)
ListAdd(_RemoveList, KNOCKED_DOWN)
ListAdd(_RemoveList, BLEEDING)
ListAdd(_RemoveList, PLAGUE)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetMuted
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, MUTED)
ACTIONS
Set(_Result,MUTED)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, RESTED)
THEN
ListAdd(_RemoveList, RESTED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetBlind
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, BLIND)
ACTIONS
Set(_Result,BLIND)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, RESTED)
THEN
ListAdd(_RemoveList, RESTED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetCrippled
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, CRIPPLED)
ACTIONS
Set(_Result,CRIPPLED)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, RESTED)
THEN
ListAdd(_RemoveList, RESTED)
Set(_Result,null)
ENDIF
IF "c1"
CharacterHasStatus(_Character, HASTED)
THEN
ListAdd(_RemoveList, HASTED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetKnockedDown
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, KNOCKED_DOWN)
ACTIONS
Set(_Result,KNOCKED_DOWN)
ListClear(_RemoveList)
ListAdd(_RemoveList, INVISIBLE)
ListAdd(_RemoveList, SLEEPING)
IF "c1"
CharacterHasStatus(_Character, RESTED)
THEN
ListAdd(_RemoveList, RESTED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetRegeneration
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, REGENERATION)
ACTIONS
Set(_Result,REGENERATION)
ListClear(_RemoveList)
ListAdd(_RemoveList, ACID)
ListAdd(_RemoveList, POISONED)
ListAdd(_RemoveList, BLEEDING)
ListAdd(_RemoveList, SUFFOCATING)
ListAdd(_RemoveList, BURNING)
ListAdd(_RemoveList, INFESTED)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetFortified
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, FORTIFIED)
ACTIONS
Set(_Result,FORTIFIED)
ListClear(_RemoveList)
ListAdd(_RemoveList, ACID)
ListAdd(_RemoveList, POISONED)
ListAdd(_RemoveList, BURNING)
ListAdd(_RemoveList, BLEEDING)
ListAdd(_RemoveList, DISEASED)
ListAdd(_RemoveList, INFECTIOUS_DISEASED)
ListAdd(_RemoveList, DECAYING_TOUCH)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetAcid
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, ACID)
ACTIONS
Set(_Result,ACID)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, FORTIFIED)
THEN
ListAdd(_RemoveList, FORTIFIED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetPoisoned
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, POISONED)
ACTIONS
Set(_Result,POISONED)
ListClear(_RemoveList)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetBleeding
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, BLEEDING)
ACTIONS
Set(_Result,BLEEDING)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, REGENERATION)
THEN
ListAdd(_RemoveList, REGENERATION)
Set(_Result,null)
ENDIF
IF "c1"
CharacterHasStatus(_Character, FORTIFIED)
THEN
ListAdd(_RemoveList, FORTIFIED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetBlessed
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, BLESSED)
ACTIONS
Set(_Result,BLESSED)
ListClear(_RemoveList)
ListAdd(_RemoveList, DISEASED)
ListAdd(_RemoveList, INFECTIOUS_DISEASED)
ListAdd(_RemoveList, DECAYING_TOUCH)
ListAdd(_RemoveList, PETRIFIED)
ListAdd(_RemoveList, STUNNED)
ListAdd(_RemoveList, FROZEN)
ListAdd(_RemoveList, INFESTED)
ListAdd(_RemoveList, PLAGUE)
IF "c1"
CharacterHasStatus(_Character, FROZEN)
THEN
ListAdd(_RemoveList, FROZEN)
Set(_Result, CHILLED)
ENDIF
IF "c1"
CharacterHasStatus(_Character, BURNING)
THEN
ListAdd(_RemoveList, BURNING)
Set(_Result, HOLY_FIRE)
ENDIF
IF "c1"
CharacterHasStatus(_Character, NECROFIRE)
THEN
ListAdd(_RemoveList, NECROFIRE)
Set(_Result, BURNING)
ENDIF
IF "c1"
CharacterHasStatus(_Character, CURSED)
THEN
ListAdd(_RemoveList, CURSED)
Set(_Result,null)
ENDIF
IF "c1"
CharacterHasStatus(_Character, VOIDHOWL)
THEN
ListAdd(_RemoveList, VOIDHOWL)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetVoidHowl
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, VOIDHOWL)
ACTIONS
Set(_Result,VOIDHOWL)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetMagicShell
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, MAGIC_SHELL)
ACTIONS
Set(_Result,MAGIC_SHELL)
ListClear(_RemoveList)
ListAdd(_RemoveList, FROZEN)
ListAdd(_RemoveList, STUNNED)
ListAdd(_RemoveList, PETRIFIED)
ListAdd(_RemoveList, PLAGUE)
ListAdd(_RemoveList, SUFFOCATING)
ListAdd(_RemoveList, POISONED)
ListAdd(_RemoveList, BURNING)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetCursed
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, CURSED)
ACTIONS
Set(_Result,CURSED)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, BLESSED)
THEN
ListAdd(_RemoveList, BLESSED)
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, CHILLED)
THEN
ListAdd(_RemoveList, CHILLED)
Set(_Result, FROZEN)
ENDIF
IF "c1"
CharacterHasStatus(_Character, BURNING)
THEN
ListAdd(_RemoveList, BURNING)
Set(_Result, NECROFIRE)
ENDIF
IF "c1|c2"
CharacterHasStatus(_Character, WARM)
CharacterHasStatus(_Character, HOLY_FIRE)
THEN
ListAdd(_RemoveList, WARM)
ListAdd(_RemoveList, HOLY_FIRE)
Set(_Result, BURNING)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetDiseased
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, DISEASED)
ACTIONS
Set(_Result,DISEASED)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, FORTIFIED)
THEN
ListAdd(_RemoveList, FORTIFIED)
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, BLESSED)
THEN
ListAdd(_RemoveList, BLESSED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetInfectiousDiseased
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, INFECTIOUS_DISEASED)
ACTIONS
Set(_Result,INFECTIOUS_DISEASED)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, FORTIFIED)
THEN
ListAdd(_RemoveList, FORTIFIED)
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, BLESSED)
THEN
ListAdd(_RemoveList, BLESSED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetDecaying
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, DECAYING_TOUCH)
ACTIONS
Set(_Result,DECAYING_TOUCH)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, FORTIFIED)
THEN
ListAdd(_RemoveList, FORTIFIED)
Set(_Result,null)
ELIF "c1"
CharacterHasStatus(_Character, BLESSED)
THEN
ListAdd(_RemoveList, BLESSED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetInvisible
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, INVISIBLE)
ACTIONS
Set(_Result,INVISIBLE)
ListClear(_RemoveList)
IF "c1"
CharacterHasStatus(_Character, MARKED)
THEN
ListAdd(_RemoveList, INVISIBLE)
Set(_Result,null)
ELSE
ListAdd(_RemoveList, WET)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetDeathfog
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, DEATH_FOG)
ACTIONS
Set(_Result,DEATH_FOG)
ListClear(_RemoveList)
IF "c1|c2|c3|c4|c5|c6|c7|c8"
CharacterHasTalent(_Character, Zombie)
IsTagged(_Character, UNDEAD)
IsTagged(_Character, UNDEAD_BEAST)
IsTagged(_Character, DEATHFOG_IMMUNE)
IsTagged(_Character, DRAGON)
IsTagged(_Character, VOIDWOKEN)
IsTagged(_Character, DEMON)
IsTagged(_Character, CONSTRUCT)
THEN
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetChicken
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, CHICKEN)
ACTIONS
Set(_Result, CHICKEN)
ListClear(_RemoveList)
ListAdd(_RemoveList, WINGS)
IF "c1"
CharacterHasStatus(_Character, CHICKEN)
THEN
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetHealingElixir
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, HEALING_ELIXIR)
ACTIONS
Set(_Result,HEALING_ELIXIR)
ListClear(_RemoveList)
ListAdd(_RemoveList, WEAK)
ListAdd(_RemoveList, SLOWED)
ListAdd(_RemoveList, DISEASED)
ListAdd(_RemoveList, POISONED)
ListAdd(_RemoveList, BLEEDING)
ListAdd(_RemoveList, CRIPPLED)
ListAdd(_RemoveList, CURSED)
ListAdd(_RemoveList, CHILLED)
ListAdd(_RemoveList, DRUNK)
ListAdd(_RemoveList, BURNING)
ListAdd(_RemoveList, BLEEDING)
ListAdd(_RemoveList, NECROFIRE)
ListAdd(_RemoveList, ACID)
ListAdd(_RemoveList, SUFFOCATING)
ListAdd(_RemoveList, DECAYING_TOUCH)
ListAdd(_RemoveList, INFECTIOUS_DISEASED)
ListAdd(_RemoveList, PLAGUE)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetChainHeal
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, CHAIN_HEAL)
ACTIONS
Set(_Result,CHAIN_HEAL)
ListClear(_RemoveList)
ListAdd(_RemoveList, INFESTED)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetCleanseWounds
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, CLEANSE_WOUNDS)
ACTIONS
Set(_Result,CLEANSE_WOUNDS)
ListClear(_RemoveList)
ListAdd(_RemoveList, INFESTED)
ListAdd(_RemoveList, PLAGUE)
ListAdd(_RemoveList, DISEASED)
ListAdd(_RemoveList, INFECTIOUS_DISEASED)
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetSteamLance
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, STEAM_LANCE)
ACTIONS
Set(_Result,STEAM_LANCE)
ListClear(_RemoveList)
ListAdd(_RemoveList, FROZEN)
ListAdd(_RemoveList, CHILLED)
ListAdd(_RemoveList, DISEASED)
ListAdd(_RemoveList, INFECTIOUS_DISEASED)
ListAdd(_RemoveList, DECAYING_TOUCH)
ListAdd(_RemoveList, PLAGUE)
IF "c1"
CharacterHasStatus(_Character, PLAGUE)
THEN
ListAdd(_RemoveList, PLAGUE)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT CharacterSetWeb
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchCharacterApplyStatusData(_Character, WEB)
ACTIONS
Set(_Result,WEB)
ListClear(_RemoveList)
IF "c1&!c2"
CharacterHasStatus(_Character, SPIDER_LEGS)
CharacterHasStatus(_Character, HASTED)
THEN
Set(_Result,HASTED)
ELIF "c1"
CharacterHasStatus(_Character, SPIDER_LEGS)
THEN
ListAdd(_RemoveList, null) /* Don't reapply Haste to avoid spam */
ELIF "c1&!c2"
CharacterHasStatus(_Character, HASTED)
CharacterHasStatus(_Character, SPIDER_LEGS)
THEN
ListAdd(_RemoveList, HASTED)
ENDIF
RETURN(_RemoveList,_Result,null)

// ITEMS ================================================================================================
EVENT ItemSetWarm
VARS
ITEM:_Item
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchItemApplyStatusData(_Item, WARM)
ACTIONS
Set(_Result,WARM)
ListClear(_RemoveList)
ListAdd(_RemoveList,WET)
IF "c1"
ItemHasStatus(_Item, WARM)
THEN
ListAdd(_RemoveList,WARM)
Set(_Result,BURNING)
ELIF "c1|c2|c3"
ItemHasStatus(_Item, BURNING)
ItemHasStatus(_Item, NECROFIRE)
ItemHasStatus(_Item, HOLY_FIRE)
THEN
Set(_Result,null)
ELIF "c1"
ItemHasStatus(_Item, CHILLED)
THEN
ListAdd(_RemoveList,CHILLED)
Set(_Result,null)
ELIF "c1"
ItemHasStatus(_Item, FROZEN)
THEN
ListAdd(_RemoveList,FROZEN)
Set(_Result, CHILLED)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT ItemSetBurning
VARS
ITEM:_Item
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchItemApplyStatusData(_Item, BURNING)
ACTIONS
Set(_Result,BURNING)
ListClear(_RemoveList)
ListAdd(_RemoveList,WARM)
IF "c1"
ItemHasStatus(_Item, CHILLED)
THEN
ListAdd(_RemoveList,CHILLED)
Set(_Result, WARM)
ELIF "c1"
ItemHasStatus(_Item, WET)
THEN
ListAdd(_RemoveList,WET)
Set(_Result, WARM)
ELIF "c1"
ItemHasStatus(_Item, FROZEN)
THEN
ListAdd(_RemoveList,FROZEN)
Set(_Result, WET)
ELIF "c1|c2"
ItemHasStatus(_Item, NECROFIRE)
ItemHasStatus(_Item, HOLY_FIRE)
THEN
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT ItemSetNecrofire
VARS
ITEM:_Item
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchItemApplyStatusData(_Item, NECROFIRE)
ACTIONS
Set(_Result,NECROFIRE)
ListClear(_RemoveList)
ListAdd(_RemoveList,WARM)
ListAdd(_RemoveList,BURNING)
ListAdd(_RemoveList,CHILLED)
ListAdd(_RemoveList,WET)
ListAdd(_RemoveList,FROZEN)
IF "c1"
ItemHasStatus(_Item, HOLY_FIRE)
THEN
ListAdd(_RemoveList,HOLY_FIRE)
Set(_Result, BURNING)
ELIF "c1"
ItemHasStatus(_Item, BLESSED)
THEN
ListAdd(_RemoveList,BLESSED)
Set(_Result, BURNING)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT ItemSetHolyFire
VARS
ITEM:_Item
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchItemApplyStatusData(_Item, HOLY_FIRE)
ACTIONS
Set(_Result,HOLY_FIRE)
ListClear(_RemoveList)
ListAdd(_RemoveList,WARM)
ListAdd(_RemoveList,BURNING)
ListAdd(_RemoveList,CHILLED)
ListAdd(_RemoveList,WET)
ListAdd(_RemoveList,FROZEN)
IF "c1"
ItemHasStatus(_Item, NECROFIRE)
THEN
ListAdd(_RemoveList,NECROFIRE)
Set(_Result, BURNING)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT ItemSetWet
VARS
ITEM:_Item
LIST<STATUS>:_RemoveList
STATUS:_Result
INT:_Turns
ON
FetchItemApplyStatusData(_Item, WET)
ACTIONS
Set(_Result,WET)
Set(_Turns,null)
ListClear(_RemoveList)
ListAdd(_RemoveList,WARM)
ListAdd(_RemoveList, INVISIBLE)
IF "c1"
ItemHasStatus(_Item, BURNING)
THEN
ListAdd(_RemoveList,BURNING)
Set(_Result,null)
ELIF "c1"
ItemHasStatus(_Item, CHILLED)
THEN
ListAdd(_RemoveList,CHILLED)
Set(_Result, FROZEN)
Set(_Turns, 1)
ELIF "c1|c2|c3"
ItemHasStatus(_Item, FROZEN)
ItemHasStatus(_Item, NECROFIRE)
ItemHasStatus(_Item, HOLY_FIRE)
THEN
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,_Turns)

EVENT ItemSetChilled
VARS
ITEM:_Item
LIST<STATUS>:_RemoveList
STATUS:_Result
INT:_Turns
ON
FetchItemApplyStatusData(_Item, CHILLED)
ACTIONS
Set(_Result,CHILLED)
Set(_Turns,null)
ListClear(_RemoveList)
IF "c1"
ItemHasStatus(_Item, BURNING)
THEN
ListAdd(_RemoveList,BURNING)
Set(_Result, WARM)
ELIF "c1"
ItemHasStatus(_Item, WARM)
THEN
ListAdd(_RemoveList,WARM)
Set(_Result,null)
ELIF "c1|c2"
ItemHasStatus(_Item, CHILLED)
ItemHasStatus(_Item, WET)
THEN
ListAdd(_RemoveList,CHILLED)
ListAdd(_RemoveList,WET)
Set(_Result, FROZEN)
Set(_Turns, 1)
ELIF "c1|c2|c3"
ItemHasStatus(_Item, FROZEN)
ItemHasStatus(_Item, NECROFIRE)
ItemHasStatus(_Item, HOLY_FIRE)
THEN
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,_Turns)

EVENT ItemSetFrozen
VARS
ITEM:_Item
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchItemApplyStatusData(_Item, FROZEN)
ACTIONS
Set(_Result,FROZEN)
ListClear(_RemoveList)
ListAdd(_RemoveList,CHILLED)
ListAdd(_RemoveList,WET)
ListAdd(_RemoveList, INVISIBLE)
IF "c1"
ItemHasStatus(_Item, BURNING)
THEN
ListAdd(_RemoveList,BURNING)
Set(_Result, WET)
ELIF "c1|c2"
ItemHasStatus(_Item, NECROFIRE)
ItemHasStatus(_Item, HOLY_FIRE)
THEN
Set(_Result,null)
ELIF "c1"
ItemHasStatus(_Item, WARM)
THEN
ListAdd(_RemoveList,WARM)
Set(_Result, CHILLED)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT ItemSetBlessed
VARS
ITEM:_Item
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchItemApplyStatusData(_Item, BLESSED)
ACTIONS
Set(_Result,BLESSED)
ListClear(_RemoveList)
ListAdd(_RemoveList, DISEASED)
ListAdd(_RemoveList, INFECTIOUS_DISEASED)
ListAdd(_RemoveList, DECAYING_TOUCH)
ListAdd(_RemoveList, PETRIFIED)
ListAdd(_RemoveList, STUNNED)
ListAdd(_RemoveList, PLAGUE)
IF "c1"
ItemHasStatus(_Item, FROZEN)
THEN
ListAdd(_RemoveList, FROZEN)
Set(_Result, CHILLED)
ENDIF
IF "c1"
ItemHasStatus(_Item, BURNING)
THEN
ListAdd(_RemoveList, BURNING)
Set(_Result, HOLY_FIRE)
ENDIF
IF "c1"
ItemHasStatus(_Item, NECROFIRE)
THEN
ListAdd(_RemoveList, NECROFIRE)
Set(_Result, BURNING)
ENDIF
IF "c1"
ItemHasStatus(_Item, CURSED)
THEN
ListAdd(_RemoveList, CURSED)
Set(_Result,null)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT ItemSetCursed
VARS
ITEM:_Item
LIST<STATUS>:_RemoveList
STATUS:_Result
ON
FetchItemApplyStatusData(_Item, CURSED)
ACTIONS
Set(_Result,CURSED)
ListClear(_RemoveList)
IF "c1"
ItemHasStatus(_Item, BLESSED)
THEN
ListAdd(_RemoveList, BLESSED)
Set(_Result,null)
ELIF "c1"
ItemHasStatus(_Item, CHILLED)
THEN
ListAdd(_RemoveList, CHILLED)
Set(_Result, FROZEN)
ENDIF
IF "c1"
ItemHasStatus(_Item, BURNING)
THEN
ListAdd(_RemoveList, BURNING)
Set(_Result, NECROFIRE)
ENDIF
IF "c1|c2"
ItemHasStatus(_Item, WARM)
ItemHasStatus(_Item, HOLY_FIRE)
THEN
ListAdd(_RemoveList, WARM)
ListAdd(_RemoveList, HOLY_FIRE)
Set(_Result, BURNING)
ENDIF
RETURN(_RemoveList,_Result,null)

EVENT ItemSetShocked
VARS
ITEM:_Item
LIST<STATUS>:_RemoveList
STATUS:_Result
INT:_Turns
ON
FetchItemApplyStatusData(_Item, SHOCKED)
ACTIONS
Set(_Result,SHOCKED)
Set(_Turns,null)
ListClear(_RemoveList)
IF "c1"
ItemHasStatus(_Item, MAGIC_SHELL)
THEN
ListAdd(_RemoveList, MAGIC_SHELL)
Set(_Result,null)
ELIF "c1"
ItemHasStatus(_Item, STUNNED)
THEN
ListAdd(_RemoveList, SHOCKED)
Set(_Result,null)
ELIF "c1|c2"
ItemHasStatus(_Item, SHOCKED)
ItemHasStatus(_Item, WET)
THEN
ListAdd(_RemoveList, SHOCKED)
Set(_Result,STUNNED)
Set(_Turns,1)
ENDIF
ListAdd(_RemoveList, INVISIBLE)
ListAdd(_RemoveList, SLEEPING)
RETURN(_RemoveList,_Result,_Turns)

EVENT CharRemoveFrozen
VARS
CHARACTER:_Character
STATUS:_StatusRemoved
ON
OnCharacterStatusRemoved(_Character, FROZEN)
ACTIONS
CharacterApplyStatus(_Character, POST_MAGIC_CONTROL, 0)

EVENT CharRemoveStunned
VARS
CHARACTER:_Character
STATUS:_StatusRemoved
ON
OnCharacterStatusRemoved(_Character, STUNNED)
ACTIONS
CharacterApplyStatus(_Character, POST_MAGIC_CONTROL, 0)
IF "c1"
IsTagged(_Character,"AUTOMATON")
THEN
CharacterApplyStatus(_Character, HYPERCHARGED, 3, 1)
ENDIF

EVENT CharRemovePetrified
VARS
CHARACTER:_Character
STATUS:_StatusRemoved
ON
OnCharacterStatusRemoved(_Character, PETRIFIED)
ACTIONS
CharacterApplyStatus(_Character, POST_PHYS_CONTROL, 0)

EVENT CharRemoveKnockedDown
VARS
CHARACTER:_Character
STATUS:_StatusRemoved
ON
OnCharacterStatusRemoved(_Character, KNOCKED_DOWN)
ACTIONS
CharacterApplyStatus(_Character, POST_PHYS_CONTROL, 0)

EVENT CharRemoveInnerDemon
VARS
CHARACTER:_Character
STATUS:_StatusRemoved
ON
OnCharacterStatusRemoved(_Character, INNER_DEMON)
ACTIONS
IF "!c1"
CharacterHasStatus(_Character,INNER_DEMON)
THEN
CharacterRemoveStatus(_Character, DEMONIC_TUTELAGE)
ENDIF

EVENT InfernalLizard_RemoveNecroFire
VARS
CHARACTER:_Character
ON
OnCharacterStatusRemoved(_Character, NECROFIRE)
ACTIONS
IF "c1&!c2"
IsTagged(_Character,"INFERNAL_LIZARD")
CharacterHasStatus(_Character,WEAK)
THEN
CharacterApplyStatus(_Character,WEAK,2,1)
ENDIF

EVENT InfernalLizard_NecroFireReApply
VARS
CHARACTER:_Character
ON
OnCharacterStatusRemoved(_Character, WEAK)
ACTIONS
IF "c1&!c2"
IsTagged(_Character,"INFERNAL_LIZARD")
CharacterHasStatus(_Character,NECROFIRE)
THEN
CharacterApplyStatus(_Character,NECROFIRE,-1,1)
ENDIF

Joined: Sep 2017
B
apprentice
Offline
apprentice
B
Joined: Sep 2017
Sorry i am not able to help you. Would there be a way to make saves vs statuses (knocked prone, charmed, etc) use ability scores like strength as opposed to armor?

So lets say someone uses battering ram.-Can the person use the skill get a bonus from strength?
The save to be knocked prone won't go off of armor but a random roll using bonuses from either the player's strength OR finesse scores. (either hold their ground by being strong enough or dodge essentially).

Since D&D uses a d20 to determine the results i dont know how to implement this into the system. maybe a flat result for all skills, lets say normally it would work about 50% of the time without bonuses. Then with bonuses since the cap in divinity is 30 for every point above 10 it would add about 3% to the rammer or subtract for the defender.

I am asking because of how D&D works.

Joined: Sep 2015
A
addict
Offline
addict
A
Joined: Sep 2015
Hey Smarmbot,

I haven't done any D:OS 2 scripting yet (no time for it until next year), so this looks partly unfamiliar. But your problem is probably caused by the first event block always getting executed (ListClear + RETURN...), even if _Result isn't equal to the statuses you define as conditions, so the engine gets an 'Okay' to apply the status (because _Result isn't set to null), regardless of your other event block following which seems to be second in the execution order.

The solution (if I'm guessing right) would be to put everything into one event block.

Edit:
Code
EVENT ResistPhysStatuses
VARS
CHARACTER:_Character
LIST<STATUS>:_RemoveList
STATUS:_Result
FLOAT:_Armor
ON
FetchCharacterApplyStatusData(_Character, _Result)
ACTIONS
ListClear(_RemoveList)

IF "c1|c2|c3|c4|c5|c6|c7|c8"

IsEqual(_Result,CRIPPLED)
IsEqual(_Result,DISEASED)
IsEqual(_Result,TAUNTED)
IsEqual(_Result,BLEEDING)
IsEqual(_Result,TAUNTED)
IsEqual(_Result,DISARMED)
IsEqual(_Result,KNOCKED_DOWN)
IsEqual(_Result,CHICKEN)

THEN
IF "!c1&c2&c3"
CharacterHasTalent(_Character,Raistlin)
CharacterGetStat(_Armor,_Character,PhysicalArmor)
IsRandom(_Armor)

THEN
ListAdd(_RemoveList, _Result)
Set(_Result,null)
StatusText(_Character,"Effect resisted by physical armor")
ENDIF
ELIF "c1|c2|c3|c4|c5|c6|c7|c8|c9|c10|c11|c12|c13|c14|c15|c16|c17|c18|c19|c20"

IsEqual(_Result,BLIND)
IsEqual(_Result,CURSED)
IsEqual(_Result,WEAK)
IsEqual(_Result,CHILLED)
IsEqual(_Result,SHOCKED)
IsEqual(_Result,NULL_RESISTANCE)
IsEqual(_Result,FIREBLOOD)
IsEqual(_Result,MADNESS)
IsEqual(_Result,FLAMING_CRESCENDO)
IsEqual(_Result,DEAF)
IsEqual(_Result,POISONED)
IsEqual(_Result,BURNING)
IsEqual(_Result,NECROFIRE)
IsEqual(_Result,FEAR)
IsEqual(_Result,FROZEN)
IsEqual(_Result,PETRIFIED)
IsEqual(_Result,STUNNED)
IsEqual(_Result,SLEEPING)
IsEqual(_Result,MUTED)
IsEqual(_Result,ENTANGLED)

THEN
IF "!c1&c2&c3"
CharacterHasTalent(_Character,Raistlin)
CharacterGetStat(_Armor,_Character,MagicArmor)
IsRandom(_Armor)

THEN
ListAdd(_RemoveList, _Result)
Set(_Result,null)
StatusText(_Character,"Effect resisted by magic armor")

ENDIF
ENDIF
RETURN(_RemoveList,_Result,null) 



Last edited by Abraxas*; 01/10/17 04:14 PM.

My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Sep 2016
journeyman
OP Offline
journeyman
Joined: Sep 2016
@Abraxas: Aaaaand that did it! Thanks! The soon-to-be CC'd party members of my subscribers are cursing your name. Next year can't come quickly enough.

@Belligerence: You could use this code as a basis to do just that. First couple tweaks might look something like:

Quote
FetchCharacterApplyStatusData(_Character, KNOCKED_DOWN)
....
CharacterGetStat(_STR,_Character,STRENGTH)


Knockdown would bypass phys armor and check strength.



Joined: Sep 2015
A
addict
Offline
addict
A
Joined: Sep 2015
Glad I could be of help. I wouldn't have bet on it here! smile

Before I answered I had a look into D:OS 1 and noticed that OnCharacterApplyStatus (which is similar to FetchCharacterApplyStatusData in D:OS 2) can prevent status applications. RETURN requires an integer here and tells the engine if to apply or not apply the status (and apply another status instead, for example). I wouldn't have noticed that without your question.

Also nice to see you working on D:OS 2!


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Sep 2015
A
addict
Offline
addict
A
Joined: Sep 2015
One more thing: Have you checked if the functionality of your event block is also affected by the other event blocks of the original script and vice versa (depending on the order)? From my understanding this should be the case as long as you have empty status variables in FetchCharacterApplyStatusData (so the event block will always return the catched status to apply it) or two FetchCharacterApplyStatusData events for the same status (so two events interfere).

You probably have to add your resist code to every existing FetchCharacterApplyStatusData event (if you want to regard this status) and create new events for your statuses that aren't regarded already.

Example for the FROZEN status:

Code
EVENT CharacterSetFrozen
VARS
	CHARACTER:_Character
	LIST<STATUS>:_RemoveList
	STATUS:_Result
	FLOAT:_MagicArmor
ON
	FetchCharacterApplyStatusData(_Character, FROZEN)
ACTIONS
	Set(_Result,FROZEN)
	ListClear(_RemoveList)
	IF "!c1&c2&c3"
		CharacterHasTalent(_Character,Raistlin)
		CharacterGetStat(_MagicArmor,_Character,MagicArmor)
		IsRandom(_MagicArmor)
	THEN
		ListAdd(_RemoveList, _Result)
		Set(_Result,null)
		StatusText(_Character,"Effect resisted by magic armor")
	ELSE
		ListAdd(_RemoveList, CHILLED)
		ListAdd(_RemoveList, WET)
		ListAdd(_RemoveList, INVISIBLE)
		ListAdd(_RemoveList, SLEEPING)
		IF "c1"
			CharacterHasStatus(_Character, MAGIC_SHELL)
		THEN
			ListClear(_RemoveList)
			ListAdd(_RemoveList, MAGIC_SHELL)
			Set(_Result,null)
		ELIF "c1"
			CharacterHasStatus(_Character, BURNING)
		THEN
			ListAdd(_RemoveList, BURNING)
			Set(_Result, WET)
		ELIF "c1"
			CharacterHasStatus(_Character, HOLY_FIRE)
		THEN
			ListAdd(_RemoveList, HOLY_FIRE)
			Set(_Result, WET)
		ELIF "c1|c2"
			CharacterHasStatus(_Character, NECROFIRE)
			CharacterHasStatus(_Character, HOLY_FIRE)
		THEN
			Set(_Result,null)
		ELIF "c1"
			CharacterHasStatus(_Character, WARM)
		THEN
			ListAdd(_RemoveList, WARM)
			Set(_Result, CHILLED)
		ENDIF
	ENDIF	
	RETURN(_RemoveList,_Result,null)




My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Sep 2016
journeyman
OP Offline
journeyman
Joined: Sep 2016
You're intuition is correct--putting this process up top did break status interactions where one replaces the other.

Looks like I've got a lot more work to do!

Joined: Oct 2017
D
stranger
Offline
stranger
D
Joined: Oct 2017
Just found the thread because I was wondering if someone was already working on something like this. I went poking around in the editor (this being my first time) and my heart sank when I saw the way too simple "100" there for status effects on skills and realized the task would be much harder to "fix" the armor CC issue than I thought it would be. Editing the statuses themselves, like you did, is probably too far over my head as I have been out of coding practice for a while, but as a game design/math issue, I have a couple suggestions.

Straight percentages are a good stopgap to making sure the system works (and it was going to be my first step), but in the end, you want to reward characters who have high armor values. For example, if someone has max armor 10 and another has max armor 100, both would be "equally good" at stopping the crowd control. Clearly, the one with 100 should be "better" in some fashion, so tweaking the numbers in their favor could be implemented.

Similarly, the chief complaint many people had (and based on the new system Larian agrees) is that CC was too unavoidable. Their new fix simply delays the same negative gameplay until armor is gone, so maybe a flat x% (let's say 20%) is always able to be resisted. Conversely, that same x% could also always be possible, even if they are sitting at full armor. This would mean that nothing is ever beyond hope, or ever a sure thing, something I think would be a better design. It could offer "war stories" and "stand up and cheer moments" that a story-heavy game could really benefit from, and some number crunch to prevent stun-locking as well.

Finally, and this doesn't exactly pertain to your mod, but it is adjacent, is to have armor only prevent SOME of the damage. Having % chance to have the CC go through just means that stuff happens faster. If, for example, 50% of the damage went to the appropriate armor and the other half went to Vitality, it might keep people in that "maybe-maybe not" sweet spot for longer. It also has the benefit of making healing spells more beneficial throughout the entire fight, rather than just the last half. Armor gaining spells are helpful the whole way through, and so should regular old healing be as well (I'm looking at you, necromancy!). If you really wanted to go crazy, you could have it not be a 50-50 split, and have it based on how they are in proportion to their full value and each other (so someone who is low health but has full armor takes more armor damage and less vitality). But that is probably making it more complicated than it needs to be, and is just more math for math sake (even if it's cool).


Moderated by  Larian_KVN 

Link Copied to Clipboard
Powered by UBB.threads™ PHP Forum Software 7.7.5