INIT
CHARACTER:__Me
STATUS:%Status
FLOAT:%StatusChance
ABILITY:%SavingThrow
EVENTS
EVENT StatusRegistration
VARS
STATUS:_Status
ON
OnCharacterApplyStatus(__Me,_Status) //checks a status before it gets applied (even if it will fail!)
ACTIONS
IF "c1&!c2"
IsEqual(%Status,null) //to prevent a reaction when we manually apply the status (s. below)
IsEqual(_Status,CONSUME) //must be excluded since specific potions can't be removed with char scripting!
THEN
IF "c1|c2" //every willpower related status to be added here
IsEqual(_Status,STUNNED)
IsEqual(_Status,BLIND)
THEN
Set(%Status,_Status)
Set(%SavingThrow,Willpower)
CallFunction("CalculateSavingThrow")
ELIF "c1" //every bodybuilding related status to be added here
IsEqual(_Status,FROZEN)
THEN
Set(%Status,_Status)
Set(%SavingThrow,BodyBuilding)
CallFunction("CalculateSavingThrow")
ENDIF
ENDIF
RETURN(1) //well, I have no idea what this does, but it is somehow necessary for the OnCharacterApplyStatus event; I also don't know
//what the integer does, but it works
EVENT SavingThrow
VARS
INT:_Resistance
ON
OnFunction("CalculateSavingThrow")
ACTIONS
IF "c1"
CharacterGetAbility(_Resistance,__Me,%SavingThrow)
THEN
IF "c1"
IsEqual(_Resistance,1)
THEN
Set(%StatusChance,0.1) //I chose 10% chance to resist per ability level
ELIF "c1"
IsEqual(_Resistance,2)
THEN
Set(%StatusChance,0.2)
ELIF "c1"
IsEqual(_Resistance,3)
THEN
Set(%StatusChance,0.3)
ELIF "c1"
IsEqual(_Resistance,4)
THEN
Set(%StatusChance,0.4)
ELIF "c1"
IsEqual(_Resistance,5)
THEN
Set(%StatusChance,0.5)
ELIF "c1"
IsEqual(_Resistance,6)
THEN
Set(%StatusChance,0.6)
ELSE
Set(%StatusChance,0.05)
ENDIF
ENDIF
StartTimer("RemoveStatus",1,0) //should be as short as possible; maybe 0.5 seconds or less; a timer is necessary to prevent a crash
Set(%SavingThrow,null)
EVENT RemoveOrApplyStatus
ON
OnTimer("RemoveStatus")
ACTIONS
IF "c1"
IsRandom(%StatusChance)
THEN
IF "c1"
CharacterHasStatus(__Me,%Status)
THEN
IF "c1"
IsEqual(%Status,FROZEN)
THEN
CharacterApplyStatus(__Me,WARM) //frozen can't be removed by script, so we must use this status
ELSE
CharacterRemoveStatus(__Me,%Status)
ENDIF
StatusText(__Me,"ResistStatus")
ENDIF
ELIF "!c1"
CharacterHasStatus(__Me,%Status)
THEN
CharacterApplyStatus(__Me,%Status,null,1)
ENDIF
Set(%Status,null)