Originally Posted by Baardvark
Yup, have something cooked up here. It takes into account armor percentage, vitality, perseverance. I also tied in special resists to Stunned and Frozen, and would do the same with most other statuses probably. This script is USED by Base. Feel free to do your own thing with it or just use it for context. Have lots of other things going right now so won't be getting around to this too soon.

Kind of a clunky system but it works. You'll have to also go into the status data and remove the SavingThrow from statuses.

Code
INIT
	CHARACTER:__Me
	
	STATUS:%MagicStatus = null
	STATUS:%PhysStatus = null
	FLOAT:%CritResistMalus = 0.0

	
EVENTS

EVENT CritResistReduction
VARS
FLOAT:_Wits
CHARACTER:_Source
ON
	OnCriticalHit(_Source,_,_,_)
	ACTIONS
IF "c1"
CharacterGetStat(_Wits,_Source,Wits) // receiving a crit temporarily reduces your resist chance according to wits of critter
THEN
Multiply(_Wits,-0.01)
Set(%CritResistMalus,_Wits)
StartTimer("CritBonusReset",0.60,0)
ENDIF

EVENT CritReset
VARS
ON
OnTimer("CritBonusReset")
ACTIONS
Set(%CritResistMalus,0.0)


EVENT ResistMagicStatuses
VARS
STATUS:_Status
INT:_Pers
FLOAT:_PersRes
FLOAT:_MagicArmor
FLOAT:_Con
FLOAT:_Int
FLOAT:_Vitality
CHARACTER:_Source
ON
OnCharacterStatusApplied(__Me,_Status)
ACTIONS

IF "c1|c2|c3|c4|c5|c6|c7|c8|c9|c10|c11|c12|c13|c14"

IsEqual(_Status,BURNING)
IsEqual(_Status,POISONED)
IsEqual(_Status,SLOWED)
IsEqual(_Status,FEAR)
IsEqual(_Status,BLIND)
IsEqual(_Status,CHILLED)
IsEqual(_Status,DAZED)
IsEqual(_Status,MUTED)
IsEqual(_Status,CURSED)
IsEqual(_Status,NECROFIRE)
IsEqual(_Status,CHARMED)
IsEqual(_Status,MADNESS)
IsEqual(_Status,SLEEPING)
IsEqual(_Status,FIREBLOOD)

THEN

IF "!c1&!c2&c3&c4&c5&c6&c7&c8"

CharacterHasStatus(__Me,RANDOMMALUS) // IGNORE THIS, from my mod
CharacterHasTalent(__Me,Raistlin) // Glass Cannon users can't resist
CharacterGetStat(_MagicArmor,__Me,MagicArmor)
CharacterGetStat(_Con,__Me,Constitution)
CharacterGetAbility(_Pers,__Me,Perseverance)
CharacterGetStatusSourceCharacter(__Me,_Status,_Source)
CharacterGetStat(_Int,_Source,Intelligence)
CharacterGetStat(_Vitality,__Me,Vitality)

THEN

Add(_Vitality,-1.0) // Turn current vitality % into the percentage that's missing as a negative
Cast(_PersRes,_Pers) // Convert Perseverance from an integer to a float (fraction)
Multiply(_PersRes,.03)
Multiply(_Con,.015)
Multiply(_Int,-0.01)
Multiply(_Vitality,0.5) // halve the vitality penalty
Add(_Con,_Int)
Add(_Con,_MagicArmor)
Add(_Con,_PersRes)
Add(_Con,_Vitality)
Add(_Con,%CritResistMalus)


IF "c1&(c2|c3)&c4"
IsGreaterThen(_Con,.10)
IsLessThen(_Con,.9)
IsEqual(_Con,.9)
IsRandom(_Con)

THEN

Set(%MagicStatus,_Status)
StartTimer("MagicStatusTimer",0.50,0) // timer delay since a status can't seem to be removed within a script when the trigger was that status being applied

ELIF "c1"
IsGreaterThen(_Con,.9)
THEN
Set(%MagicStatus,_Status)
StartTimer("MagicStatusTimer",0.50,0)

ENDIF
ENDIF
ENDIF

EVENT ResistPhysicalStatuses

VARS
STATUS:_Status
INT:_Pers
FLOAT:_PersRes
FLOAT:_PhysArmor
FLOAT:_Con
CHARACTER:_Source
FLOAT:_Strength
FLOAT:_Vitality

ON
OnCharacterStatusApplied(__Me,_Status)
ACTIONS

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

IsEqual(_Status,CRIPPLED)
IsEqual(_Status,KNOCKED_DOWN)
IsEqual(_Status,PETRIFIED)
IsEqual(_Status,BLEEDING)
IsEqual(_Status,DECAYING_TOUCH)
IsEqual(_Status,DISARMED)
IsEqual(_Status,CHICKEN)
IsEqual(_Status,WEAK)
IsEqual(_Status,DISEASED)
IsEqual(_Status,INFECTIOUS_DISEASED)

THEN

IF "!c1&!c2&c3&c4&c5&c6&c7&c8"

CharacterHasStatus(__Me,RANDOMMALUS)
CharacterHasTalent(__Me,Raistlin)
CharacterGetStat(_PhysArmor,__Me,PhysicalArmor)
CharacterGetStat(_Con,__Me,Constitution)
CharacterGetAbility(_Pers,__Me,Perseverance)
CharacterGetStatusSourceCharacter(__Me,_Status,_Source)
CharacterGetStat(_Strength,_Source,Strength)
CharacterGetStat(_Vitality,__Me,Vitality)

THEN

Add(_Vitality,-1.0)
Cast(_PersRes,_Pers)
Multiply(_PersRes,.03)
Multiply(_Con,.015)
Multiply(_Strength,-0.01)
Multiply(_Vitality,0.5)
Add(_Con,_Strength)
Add(_Con,_PhysArmor)
Add(_Con,_PersRes)
Add(_Con,_Vitality)

IF "c1&(c2|c3)&c4"

IsGreaterThen(_Con,.10)
IsLessThen(_Con,.90)
IsEqual(_Con,.9)
IsRandom(_Con)

THEN

Set(%PhysStatus,_Status)
StartTimer("PhysStatusTimer",0.50,0)

ELIF "c1"
IsGreaterThen(_Con,.9)
THEN
Set(%PhysStatus,_Status)
StartTimer("PhysStatusTimer",0.50,0)

ENDIF
ENDIF
ENDIF


EVENT ResistStunned
VARS
INT:_Pers
FLOAT:_PersRes
FLOAT:_MagicArmor
FLOAT:_Con
FLOAT:_Int
FLOAT:_Vitality
INT:_Aero
FLOAT:_AeroResist
INT:_AeroSource
FLOAT:_AeroMalus
CHARACTER:_Source

ON
OnCharacterStatusApplied(__Me,STUNNED)
ACTIONS

IF "!c1&c2&c3&c4&c5&c6&c7&c8&c9"

CharacterHasTalent(__Me,Raistlin) // Glass Cannon users can't resist
CharacterGetStat(_MagicArmor,__Me,MagicArmor)
CharacterGetStat(_Con,__Me,Constitution)
CharacterGetAbility(_Pers,__Me,Perseverance)
CharacterGetAbility(_Aero,__Me,AirSpecialist)
CharacterGetStatusSourceCharacter(__Me,STUNNED,_Source)
CharacterGetAbility(_AeroSource,_Source,AirSpecialist)
CharacterGetStat(_Int,_Source,Intelligence)
CharacterGetStat(_Vitality,__Me,Vitality)

THEN

Add(_Vitality,-1.0) // Turn current vitality % into the percentage that's missing as a negative
Cast(_PersRes,_Pers) // Convert Perseverance from an integer to a float (fraction)
Cast(_AeroResist,_Aero)
Cast(_AeroMalus,_AeroSource)
Multiply(_AeroMalus,-0.05)
Multiply(_AeroResist,.15)
Multiply(_PersRes,.03)
Multiply(_Con,.015)
Multiply(_Int,-0.01)
Multiply(_Vitality,0.5) // halve the vitality penalty
Add(_Con,_AeroMalus)
Add(_Con,_AeroResist)
Add(_Con,_Int)
Add(_Con,_MagicArmor)
Add(_Con,_PersRes)
Add(_Con,_Vitality)
Add(_Con,%CritResistMalus)


IF "c1"
IsRandom(_Con)

THEN

Set(%MagicStatus,STUNNED)
StartTimer("MagicStatusTimer",0.50,0) // timer delay since a status can't seem to be removed within a script when the trigger was that status being applied

ENDIF
ENDIF

EVENT ResistFrozen
VARS
INT:_Pers
FLOAT:_PersRes
FLOAT:_MagicArmor
FLOAT:_Con
FLOAT:_Int
FLOAT:_Vitality
INT:_Water
FLOAT:_WaterResist
INT:_WaterSource
FLOAT:_WaterMalus
CHARACTER:_Source

ON
OnCharacterStatusApplied(__Me,FROZEN)
ACTIONS

IF "!c1&c2&c3&c4&c5&c6&c7&c8&c9"

CharacterHasTalent(__Me,Raistlin)
CharacterGetStat(_MagicArmor,__Me,MagicArmor)
CharacterGetStat(_Con,__Me,Constitution)
CharacterGetAbility(_Pers,__Me,Perseverance)
CharacterGetAbility(_Water,__Me,WaterSpecialist)
CharacterGetStatusSourceCharacter(__Me,FROZEN,_Source)
CharacterGetAbility(_WaterSource,_Source,WaterSpecialist)
CharacterGetStat(_Int,_Source,Intelligence)
CharacterGetStat(_Vitality,__Me,Vitality)

THEN

Add(_Vitality,-1.0) // Turn current vitality % into the percentage that's missing as a negative
Cast(_PersRes,_Pers) // Convert Perseverance from an integer to a float (fraction)
Cast(_WaterResist,_Water)
Cast(_WaterMalus,_WaterSource)
Multiply(_WaterMalus,-0.05)
Multiply(_WaterResist,.15)
Multiply(_PersRes,.03)
Multiply(_Con,.015)
Multiply(_Int,-0.01)
Multiply(_Vitality,0.5) // halve the vitality penalty
Add(_Con,_WaterMalus)
Add(_Con,_WaterResist)
Add(_Con,_Int)
Add(_Con,_MagicArmor)
Add(_Con,_PersRes)
Add(_Con,_Vitality)
Add(_Con,%CritResistMalus)


IF "c1"
IsRandom(_Con)

THEN

Set(%MagicStatus,FROZEN)
StartTimer("MagicStatusTimer",0.50,0) // timer delay since a status can't seem to be removed within a script when the trigger was that status being applied

ENDIF
ENDIF




Baardvark, I like the idea of the decaying armor resist chance. But perhaps a proportional system is a bit too "heavy"? I don't exactly understand how the vitality and perseverance are plugged into the math equation but from my limited understanding its close-ish to....

EX:25/100 armor = 25% resist chance?

The predictability of armor vs status effects as it is currently is nice in it's own way but perhaps too certain. Making it proportional is perhaps too limiting to armor.

Maybe a middle ground with diminishing returns once you get past a certain threshold?

IE From 100-70% armor you are still at 100% resists, below that you start losing 5% resist chance for every 10% of armor you are missing.

60% armor = 10% effect penetration
50% armor = 15% effect penetration
40% armor = 20% effect penetration
30% armor = 25% effect penetration
20% armor = 30% effect penetration


Maybe it's just my line of thinking at the moment, but it seems like a middle ground where you can punch holes in armor to create a small window without heavily gutting the effectiveness of 20-50% armor.

I think some people want a little randomness to the mix but maybe without making it too random?



Last edited by Ranik; 17/09/17 11:38 AM.