MMD_PRC8/_module/nss/0i_gui_events.nss

1033 lines
55 KiB
Plaintext
Raw Normal View History

/*////////////////////////////////////////////////////////////////////////////////////////////////////
// Script Name: 0i_gui_events
// Programmer: Philos
//////////////////////////////////////////////////////////////////////////////////////////////////////
Include scripts for all gui events. See also 0e_gui_events
GUI Events:
GUIEVENT_EFFECTICON_CLICK: For displaying icon information.
This was built by DAZ all credit to him.
I just changed it from PostString to a NUI menu.
*/////////////////////////////////////////////////////////////////////////////////////////////////////
#include "0i_constants"
#include "0i_nui"
void ai_SetupModuleGUIEvents(object oCreature)
{
object oModule = GetModule();
string sModuleGUIEvents = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_GUIEVENT);
if(sModuleGUIEvents != "" || sModuleGUIEvents != "0e_gui_events")
{
SetLocalString(oModule, AI_MODULE_GUI_EVENT, sModuleGUIEvents);
}
SetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_GUIEVENT, "0e_gui_events");
}
int EffectIconToEffectType(int nEffectIcon)
{
switch (nEffectIcon)
{
case EFFECT_ICON_INVALID: return EFFECT_TYPE_INVALIDEFFECT;
// *** No Extra Stats
case EFFECT_ICON_BLIND: return EFFECT_TYPE_BLINDNESS;
case EFFECT_ICON_CHARMED: return EFFECT_TYPE_CHARMED;
case EFFECT_ICON_CONFUSED: return EFFECT_TYPE_CONFUSED;
case EFFECT_ICON_FRIGHTENED: return EFFECT_TYPE_FRIGHTENED;
case EFFECT_ICON_DOMINATED: return EFFECT_TYPE_DOMINATED;
case EFFECT_ICON_PARALYZE: return EFFECT_TYPE_PARALYZE;
case EFFECT_ICON_DAZED: return EFFECT_TYPE_DAZED;
case EFFECT_ICON_STUNNED: return EFFECT_TYPE_STUNNED;
case EFFECT_ICON_SLEEP: return EFFECT_TYPE_SLEEP;
case EFFECT_ICON_SILENCE: return EFFECT_TYPE_SILENCE;
case EFFECT_ICON_TURNED: return EFFECT_TYPE_TURNED;
case EFFECT_ICON_HASTE: return EFFECT_TYPE_HASTE;
case EFFECT_ICON_SLOW: return EFFECT_TYPE_SLOW;
case EFFECT_ICON_ENTANGLE: return EFFECT_TYPE_ENTANGLE;
case EFFECT_ICON_DEAF: return EFFECT_TYPE_DEAF;
case EFFECT_ICON_DARKNESS: return EFFECT_TYPE_DARKNESS;
case EFFECT_ICON_POLYMORPH: return EFFECT_TYPE_POLYMORPH;
case EFFECT_ICON_SANCTUARY: return EFFECT_TYPE_SANCTUARY;
case EFFECT_ICON_TRUESEEING: return EFFECT_TYPE_TRUESEEING;
case EFFECT_ICON_SEEINVISIBILITY: return EFFECT_TYPE_SEEINVISIBLE;
case EFFECT_ICON_ETHEREALNESS: return EFFECT_TYPE_ETHEREAL;
case EFFECT_ICON_PETRIFIED: return EFFECT_TYPE_PETRIFY;
// ***
case EFFECT_ICON_DAMAGE_RESISTANCE: return EFFECT_TYPE_DAMAGE_RESISTANCE;
case EFFECT_ICON_REGENERATE: return EFFECT_TYPE_REGENERATE;
case EFFECT_ICON_DAMAGE_REDUCTION: return EFFECT_TYPE_DAMAGE_REDUCTION;
case EFFECT_ICON_TEMPORARY_HITPOINTS: return EFFECT_TYPE_TEMPORARY_HITPOINTS;
case EFFECT_ICON_IMMUNITY: return EFFECT_TYPE_IMMUNITY;
case EFFECT_ICON_POISON: return EFFECT_TYPE_POISON;
case EFFECT_ICON_DISEASE: return EFFECT_TYPE_DISEASE;
case EFFECT_ICON_CURSE: return EFFECT_TYPE_CURSE;
case EFFECT_ICON_ATTACK_INCREASE: return EFFECT_TYPE_ATTACK_INCREASE;
case EFFECT_ICON_ATTACK_DECREASE: return EFFECT_TYPE_ATTACK_DECREASE;
case EFFECT_ICON_DAMAGE_INCREASE: return EFFECT_TYPE_DAMAGE_INCREASE;
case EFFECT_ICON_DAMAGE_DECREASE: return EFFECT_TYPE_DAMAGE_DECREASE;
case EFFECT_ICON_AC_INCREASE: return EFFECT_TYPE_AC_INCREASE;
case EFFECT_ICON_AC_DECREASE: return EFFECT_TYPE_AC_DECREASE;
case EFFECT_ICON_MOVEMENT_SPEED_INCREASE: return EFFECT_TYPE_MOVEMENT_SPEED_INCREASE;
case EFFECT_ICON_MOVEMENT_SPEED_DECREASE: return EFFECT_TYPE_MOVEMENT_SPEED_DECREASE;
case EFFECT_ICON_SAVING_THROW_DECREASE: return EFFECT_TYPE_SAVING_THROW_DECREASE;
case EFFECT_ICON_SPELL_RESISTANCE_INCREASE: return EFFECT_TYPE_SPELL_RESISTANCE_INCREASE;
case EFFECT_ICON_SPELL_RESISTANCE_DECREASE: return EFFECT_TYPE_SPELL_RESISTANCE_DECREASE;
case EFFECT_ICON_SKILL_INCREASE: return EFFECT_TYPE_SKILL_INCREASE;
case EFFECT_ICON_SKILL_DECREASE: return EFFECT_TYPE_SKILL_DECREASE;
case EFFECT_ICON_ELEMENTALSHIELD: return EFFECT_TYPE_ELEMENTALSHIELD;
case EFFECT_ICON_LEVELDRAIN: return EFFECT_TYPE_NEGATIVELEVEL;
case EFFECT_ICON_SPELLLEVELABSORPTION: return EFFECT_TYPE_SPELLLEVELABSORPTION;
case EFFECT_ICON_SPELLIMMUNITY: return EFFECT_TYPE_SPELL_IMMUNITY;
case EFFECT_ICON_CONCEALMENT: return EFFECT_TYPE_CONCEALMENT;
case EFFECT_ICON_EFFECT_SPELL_FAILURE: return EFFECT_TYPE_SPELL_FAILURE;
case EFFECT_ICON_INVISIBILITY:
case EFFECT_ICON_IMPROVEDINVISIBILITY: return EFFECT_TYPE_INVISIBILITY;
case EFFECT_ICON_ABILITY_INCREASE_STR:
case EFFECT_ICON_ABILITY_INCREASE_DEX:
case EFFECT_ICON_ABILITY_INCREASE_CON:
case EFFECT_ICON_ABILITY_INCREASE_INT:
case EFFECT_ICON_ABILITY_INCREASE_WIS:
case EFFECT_ICON_ABILITY_INCREASE_CHA: return EFFECT_TYPE_ABILITY_INCREASE;
case EFFECT_ICON_ABILITY_DECREASE_STR:
case EFFECT_ICON_ABILITY_DECREASE_CHA:
case EFFECT_ICON_ABILITY_DECREASE_DEX:
case EFFECT_ICON_ABILITY_DECREASE_CON:
case EFFECT_ICON_ABILITY_DECREASE_INT:
case EFFECT_ICON_ABILITY_DECREASE_WIS: return EFFECT_TYPE_ABILITY_DECREASE;
case EFFECT_ICON_IMMUNITY_ALL:
case EFFECT_ICON_IMMUNITY_MIND:
case EFFECT_ICON_IMMUNITY_POISON:
case EFFECT_ICON_IMMUNITY_DISEASE:
case EFFECT_ICON_IMMUNITY_FEAR:
case EFFECT_ICON_IMMUNITY_TRAP:
case EFFECT_ICON_IMMUNITY_PARALYSIS:
case EFFECT_ICON_IMMUNITY_BLINDNESS:
case EFFECT_ICON_IMMUNITY_DEAFNESS:
case EFFECT_ICON_IMMUNITY_SLOW:
case EFFECT_ICON_IMMUNITY_ENTANGLE:
case EFFECT_ICON_IMMUNITY_SILENCE:
case EFFECT_ICON_IMMUNITY_STUN:
case EFFECT_ICON_IMMUNITY_SLEEP:
case EFFECT_ICON_IMMUNITY_CHARM:
case EFFECT_ICON_IMMUNITY_DOMINATE:
case EFFECT_ICON_IMMUNITY_CONFUSE:
case EFFECT_ICON_IMMUNITY_CURSE:
case EFFECT_ICON_IMMUNITY_DAZED:
case EFFECT_ICON_IMMUNITY_ABILITY_DECREASE:
case EFFECT_ICON_IMMUNITY_ATTACK_DECREASE:
case EFFECT_ICON_IMMUNITY_DAMAGE_DECREASE:
case EFFECT_ICON_IMMUNITY_DAMAGE_IMMUNITY_DECREASE:
case EFFECT_ICON_IMMUNITY_AC_DECREASE:
case EFFECT_ICON_IMMUNITY_MOVEMENT_SPEED_DECREASE:
case EFFECT_ICON_IMMUNITY_SAVING_THROW_DECREASE:
case EFFECT_ICON_IMMUNITY_SPELL_RESISTANCE_DECREASE:
case EFFECT_ICON_IMMUNITY_SKILL_DECREASE:
case EFFECT_ICON_IMMUNITY_KNOCKDOWN:
case EFFECT_ICON_IMMUNITY_NEGATIVE_LEVEL:
case EFFECT_ICON_IMMUNITY_SNEAK_ATTACK:
case EFFECT_ICON_IMMUNITY_CRITICAL_HIT:
case EFFECT_ICON_IMMUNITY_DEATH_MAGIC: return EFFECT_TYPE_IMMUNITY;
case EFFECT_ICON_SAVING_THROW_INCREASE:
case EFFECT_ICON_REFLEX_SAVE_INCREASED:
case EFFECT_ICON_FORT_SAVE_INCREASED:
case EFFECT_ICON_WILL_SAVE_INCREASED: return EFFECT_TYPE_SAVING_THROW_INCREASE;
case EFFECT_ICON_DAMAGE_IMMUNITY_INCREASE:
case EFFECT_ICON_DAMAGE_IMMUNITY_MAGIC:
case EFFECT_ICON_DAMAGE_IMMUNITY_ACID:
case EFFECT_ICON_DAMAGE_IMMUNITY_COLD:
case EFFECT_ICON_DAMAGE_IMMUNITY_DIVINE:
case EFFECT_ICON_DAMAGE_IMMUNITY_ELECTRICAL:
case EFFECT_ICON_DAMAGE_IMMUNITY_FIRE:
case EFFECT_ICON_DAMAGE_IMMUNITY_NEGATIVE:
case EFFECT_ICON_DAMAGE_IMMUNITY_POSITIVE:
case EFFECT_ICON_DAMAGE_IMMUNITY_SONIC: return EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE;
case EFFECT_ICON_DAMAGE_IMMUNITY_DECREASE:
case EFFECT_ICON_DAMAGE_IMMUNITY_MAGIC_DECREASE:
case EFFECT_ICON_DAMAGE_IMMUNITY_ACID_DECREASE:
case EFFECT_ICON_DAMAGE_IMMUNITY_COLD_DECREASE:
case EFFECT_ICON_DAMAGE_IMMUNITY_DIVINE_DECREASE:
case EFFECT_ICON_DAMAGE_IMMUNITY_ELECTRICAL_DECREASE:
case EFFECT_ICON_DAMAGE_IMMUNITY_FIRE_DECREASE:
case EFFECT_ICON_DAMAGE_IMMUNITY_NEGATIVE_DECREASE:
case EFFECT_ICON_DAMAGE_IMMUNITY_POSITIVE_DECREASE:
case EFFECT_ICON_DAMAGE_IMMUNITY_SONIC_DECREASE: return EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE;
//case EFFECT_ICON_INVULNERABLE: return EFFECT_TYPE_INVULNERABLE;
//case EFFECT_ICON_WOUNDING: return EFFECT_TYPE_INVALIDEFFECT;
//case EFFECT_ICON_TAUNTED: return EFFECT_TYPE_INVALIDEFFECT;
//case EFFECT_ICON_TIMESTOP: return EFFECT_TYPE_TIMESTOP;
//case EFFECT_ICON_BLINDNESS: return EFFECT_TYPE_BLINDNESS;
//case EFFECT_ICON_DISPELMAGICBEST: return EFFECT_TYPE_INVALIDEFFECT;
//case EFFECT_ICON_DISPELMAGICALL: return EFFECT_TYPE_INVALIDEFFECT;
//case EFFECT_ICON_ENEMY_ATTACK_BONUS: return EFFECT_TYPE_INVALIDEFFECT;
//case EFFECT_ICON_FATIGUE: return EFFECT_TYPE_INVALIDEFFECT;
}
return EFFECT_TYPE_INVALIDEFFECT;
}
int AbilityTypeFromEffectIconAbility(int nEffectIcon)
{
switch (nEffectIcon)
{
case EFFECT_ICON_ABILITY_INCREASE_STR:
case EFFECT_ICON_ABILITY_DECREASE_STR:
return ABILITY_STRENGTH;
case EFFECT_ICON_ABILITY_INCREASE_DEX:
case EFFECT_ICON_ABILITY_DECREASE_DEX:
return ABILITY_DEXTERITY;
case EFFECT_ICON_ABILITY_INCREASE_CON:
case EFFECT_ICON_ABILITY_DECREASE_CON:
return ABILITY_CONSTITUTION;
case EFFECT_ICON_ABILITY_INCREASE_INT:
case EFFECT_ICON_ABILITY_DECREASE_INT:
return ABILITY_INTELLIGENCE;
case EFFECT_ICON_ABILITY_INCREASE_WIS:
case EFFECT_ICON_ABILITY_DECREASE_WIS:
return ABILITY_WISDOM;
case EFFECT_ICON_ABILITY_INCREASE_CHA:
case EFFECT_ICON_ABILITY_DECREASE_CHA:
return ABILITY_CHARISMA;
}
return -1;
}
int DamageTypeFromEffectIconDamageImmunity(int nEffectIcon)
{
switch (nEffectIcon)
{
case EFFECT_ICON_DAMAGE_IMMUNITY_MAGIC:
case EFFECT_ICON_DAMAGE_IMMUNITY_MAGIC_DECREASE:
return DAMAGE_TYPE_MAGICAL;
case EFFECT_ICON_DAMAGE_IMMUNITY_ACID:
case EFFECT_ICON_DAMAGE_IMMUNITY_ACID_DECREASE:
return DAMAGE_TYPE_ACID;
case EFFECT_ICON_DAMAGE_IMMUNITY_COLD:
case EFFECT_ICON_DAMAGE_IMMUNITY_COLD_DECREASE:
return DAMAGE_TYPE_COLD;
case EFFECT_ICON_DAMAGE_IMMUNITY_DIVINE:
case EFFECT_ICON_DAMAGE_IMMUNITY_DIVINE_DECREASE:
return DAMAGE_TYPE_DIVINE;
case EFFECT_ICON_DAMAGE_IMMUNITY_ELECTRICAL:
case EFFECT_ICON_DAMAGE_IMMUNITY_ELECTRICAL_DECREASE:
return DAMAGE_TYPE_ELECTRICAL;
case EFFECT_ICON_DAMAGE_IMMUNITY_FIRE:
case EFFECT_ICON_DAMAGE_IMMUNITY_FIRE_DECREASE:
return DAMAGE_TYPE_FIRE;
case EFFECT_ICON_DAMAGE_IMMUNITY_NEGATIVE:
case EFFECT_ICON_DAMAGE_IMMUNITY_NEGATIVE_DECREASE:
return DAMAGE_TYPE_NEGATIVE;
case EFFECT_ICON_DAMAGE_IMMUNITY_POSITIVE:
case EFFECT_ICON_DAMAGE_IMMUNITY_POSITIVE_DECREASE:
return DAMAGE_TYPE_POSITIVE;
case EFFECT_ICON_DAMAGE_IMMUNITY_SONIC:
case EFFECT_ICON_DAMAGE_IMMUNITY_SONIC_DECREASE:
return DAMAGE_TYPE_SONIC;
}
return -1;
}
int ImmunityTypeFromEffectIconImmunity(int nEffectIcon)
{
switch (nEffectIcon)
{
case EFFECT_ICON_IMMUNITY_MIND: return IMMUNITY_TYPE_MIND_SPELLS;
case EFFECT_ICON_IMMUNITY_POISON: return IMMUNITY_TYPE_POISON;
case EFFECT_ICON_IMMUNITY_DISEASE: return IMMUNITY_TYPE_DISEASE;
case EFFECT_ICON_IMMUNITY_FEAR: return IMMUNITY_TYPE_FEAR;
case EFFECT_ICON_IMMUNITY_TRAP: return IMMUNITY_TYPE_TRAP;
case EFFECT_ICON_IMMUNITY_PARALYSIS: return IMMUNITY_TYPE_PARALYSIS;
case EFFECT_ICON_IMMUNITY_BLINDNESS: return IMMUNITY_TYPE_BLINDNESS;
case EFFECT_ICON_IMMUNITY_DEAFNESS: return IMMUNITY_TYPE_DEAFNESS;
case EFFECT_ICON_IMMUNITY_SLOW: return IMMUNITY_TYPE_SLOW;
case EFFECT_ICON_IMMUNITY_ENTANGLE: return IMMUNITY_TYPE_ENTANGLE;
case EFFECT_ICON_IMMUNITY_SILENCE: return IMMUNITY_TYPE_SILENCE;
case EFFECT_ICON_IMMUNITY_STUN: return IMMUNITY_TYPE_STUN;
case EFFECT_ICON_IMMUNITY_SLEEP: return IMMUNITY_TYPE_SLEEP;
case EFFECT_ICON_IMMUNITY_CHARM: return IMMUNITY_TYPE_CHARM;
case EFFECT_ICON_IMMUNITY_DOMINATE: return IMMUNITY_TYPE_DOMINATE;
case EFFECT_ICON_IMMUNITY_CONFUSE: return IMMUNITY_TYPE_CONFUSED;
case EFFECT_ICON_IMMUNITY_CURSE: return IMMUNITY_TYPE_CURSED;
case EFFECT_ICON_IMMUNITY_DAZED: return IMMUNITY_TYPE_DAZED;
case EFFECT_ICON_IMMUNITY_ABILITY_DECREASE: return IMMUNITY_TYPE_ABILITY_DECREASE;
case EFFECT_ICON_IMMUNITY_ATTACK_DECREASE: return IMMUNITY_TYPE_ATTACK_DECREASE;
case EFFECT_ICON_IMMUNITY_DAMAGE_DECREASE: return IMMUNITY_TYPE_DAMAGE_DECREASE;
case EFFECT_ICON_IMMUNITY_DAMAGE_IMMUNITY_DECREASE: return IMMUNITY_TYPE_DAMAGE_IMMUNITY_DECREASE;
case EFFECT_ICON_IMMUNITY_AC_DECREASE: return IMMUNITY_TYPE_AC_DECREASE;
case EFFECT_ICON_IMMUNITY_MOVEMENT_SPEED_DECREASE: return IMMUNITY_TYPE_MOVEMENT_SPEED_DECREASE;
case EFFECT_ICON_IMMUNITY_SAVING_THROW_DECREASE: return IMMUNITY_TYPE_SAVING_THROW_DECREASE;
case EFFECT_ICON_IMMUNITY_SPELL_RESISTANCE_DECREASE: return IMMUNITY_TYPE_SPELL_RESISTANCE_DECREASE;
case EFFECT_ICON_IMMUNITY_SKILL_DECREASE: return IMMUNITY_TYPE_SKILL_DECREASE;
case EFFECT_ICON_IMMUNITY_KNOCKDOWN: return IMMUNITY_TYPE_KNOCKDOWN;
case EFFECT_ICON_IMMUNITY_NEGATIVE_LEVEL: return IMMUNITY_TYPE_NEGATIVE_LEVEL;
case EFFECT_ICON_IMMUNITY_SNEAK_ATTACK: return IMMUNITY_TYPE_SNEAK_ATTACK;
case EFFECT_ICON_IMMUNITY_CRITICAL_HIT: return IMMUNITY_TYPE_CRITICAL_HIT;
case EFFECT_ICON_IMMUNITY_DEATH_MAGIC: return IMMUNITY_TYPE_DEATH;
}
return -1;
}
void ClearLines(object oPlayer)
{
int nLine, nLines = GetLocalInt(oPlayer, "BUFFINFO_LAST_NUM_LINES");
for (nLine = 1; nLine <= nLines; nLine++)
{
PostString(oPlayer, "", 10, nLine + 3, SCREEN_ANCHOR_TOP_RIGHT, 0.1f, 0xFFFFFF00, 0xFFFFFF00, nLine);
}
}
void DisplayLine(object oPlayer, int nLine, string sText, int nColor)
{
PostString(oPlayer, sText, 10, nLine + 3, SCREEN_ANCHOR_TOP_RIGHT, 10.0f, nColor, 0xFFFFFF00, nLine);
}
string SecondsToTimestamp(int nSeconds)
{
sqlquery sql;
if (nSeconds > 86400) sql = SqlPrepareQueryObject(GetModule(), "SELECT (@seconds / 3600) || ':' || strftime('%M:%S', @seconds / 86400.0);");
else sql = SqlPrepareQueryObject(GetModule(), "SELECT time(@seconds, 'unixepoch');");
SqlBindInt(sql, "@seconds", nSeconds);
SqlStep(sql);
return SqlGetString(sql, 0);
}
string Get2DAStrRef(string s2DA, string sColumn, int nRow)
{
return GetStringByStrRef(StringToInt(Get2DAString(s2DA, sColumn, nRow)));
}
string GetVersusRacialTypeAndAlignment(int nRacialType, int nLawfulChaotic, int nGoodEvil)
{
string sRacialType = nRacialType == RACIAL_TYPE_INVALID ? "" : Get2DAStrRef("racialtypes", "NamePlural", nRacialType);
string sLawfulChaotic = nLawfulChaotic == ALIGNMENT_LAWFUL ? "Lawful" : nLawfulChaotic == ALIGNMENT_CHAOTIC ? "Chaotic" : "";
string sGoodEvil = nGoodEvil == ALIGNMENT_GOOD ? "Good" : nGoodEvil == ALIGNMENT_EVIL ? "Evil" : "";
string sAlignment = sLawfulChaotic + (sLawfulChaotic == "" ? sGoodEvil : (sGoodEvil == "" ? "" : " " + sGoodEvil));
return (sRacialType != "" || sAlignment != "") ? (" vs. " + sAlignment + (sAlignment == "" ? sRacialType : (sRacialType == "" ? "" : " " + sRacialType))) : "";
}
string GetModifierType(int nEffectType, int nPlus, int nMinus)
{
return nEffectType == nPlus ? "+" : nEffectType == nMinus ? "-" : "";
}
string ACTypeToString(int nACType)
{
switch (nACType)
{
case AC_DODGE_BONUS: return "Dodge";
case AC_NATURAL_BONUS: return "Natural";
case AC_ARMOUR_ENCHANTMENT_BONUS: return "Armor";
case AC_SHIELD_ENCHANTMENT_BONUS: return "Shield";
case AC_DEFLECTION_BONUS: return "Deflection";
}
return "";
}
string SavingThrowToString(int nSavingThrow)
{
switch (nSavingThrow)
{
case SAVING_THROW_ALL: return "All";
case SAVING_THROW_FORT: return "Fortitude";
case SAVING_THROW_REFLEX: return "Reflex";
case SAVING_THROW_WILL: return "Will";
}
return "";
}
string SavingThrowTypeToString(int nSavingThrowType)
{
switch (nSavingThrowType)
{
case SAVING_THROW_TYPE_MIND_SPELLS: return "Mind Spells";
case SAVING_THROW_TYPE_POISON: return "Poison";
case SAVING_THROW_TYPE_DISEASE: return "Disease";
case SAVING_THROW_TYPE_FEAR: return "Fear";
case SAVING_THROW_TYPE_SONIC: return "Sonic";
case SAVING_THROW_TYPE_ACID: return "Acid";
case SAVING_THROW_TYPE_FIRE: return "Fire";
case SAVING_THROW_TYPE_ELECTRICITY: return "Electricity";
case SAVING_THROW_TYPE_POSITIVE: return "Positive";
case SAVING_THROW_TYPE_NEGATIVE: return "Negative";
case SAVING_THROW_TYPE_DEATH: return "Death";
case SAVING_THROW_TYPE_COLD: return "Cold";
case SAVING_THROW_TYPE_DIVINE: return "Divine";
case SAVING_THROW_TYPE_TRAP: return "Traps";
case SAVING_THROW_TYPE_SPELL: return "Spells";
case SAVING_THROW_TYPE_GOOD: return "Good";
case SAVING_THROW_TYPE_EVIL: return "Evil";
case SAVING_THROW_TYPE_LAW: return "Lawful";
case SAVING_THROW_TYPE_CHAOS: return "Chaotic";
}
return "";
}
string AbilityToString(int nAbility)
{
switch (nAbility)
{
case ABILITY_STRENGTH: return "Strength";
case ABILITY_DEXTERITY: return "Dexterity";
case ABILITY_CONSTITUTION: return "Constitution";
case ABILITY_INTELLIGENCE: return "Intelligence";
case ABILITY_WISDOM: return "Wisdom";
case ABILITY_CHARISMA: return "Charisma";
}
return "";
}
string DamageTypeToString(int nDamageType)
{
switch (nDamageType)
{
case DAMAGE_TYPE_BLUDGEONING: return "Bludgeoning";
case DAMAGE_TYPE_PIERCING: return "Piercing";
case DAMAGE_TYPE_SLASHING: return "Slashing";
case DAMAGE_TYPE_MAGICAL: return "Magical";
case DAMAGE_TYPE_ACID: return "Acid";
case DAMAGE_TYPE_COLD: return "Cold";
case DAMAGE_TYPE_DIVINE: return "Divine";
case DAMAGE_TYPE_ELECTRICAL: return "Electrical";
case DAMAGE_TYPE_FIRE: return "Fire";
case DAMAGE_TYPE_NEGATIVE: return "Negative";
case DAMAGE_TYPE_POSITIVE: return "Positive";
case DAMAGE_TYPE_SONIC: return "Sonic";
case DAMAGE_TYPE_BASE_WEAPON: return "Base Weapon";
}
return "";
}
string SpellSchoolToString(int nSpellSchool)
{
switch (nSpellSchool)
{
case SPELL_SCHOOL_GENERAL: return "General";
case SPELL_SCHOOL_ABJURATION: return "Abjuration";
case SPELL_SCHOOL_CONJURATION: return "Conjuration";
case SPELL_SCHOOL_DIVINATION: return "Divination";
case SPELL_SCHOOL_ENCHANTMENT: return "Enchantment";
case SPELL_SCHOOL_EVOCATION: return "Evocation";
case SPELL_SCHOOL_ILLUSION: return "Illusion";
case SPELL_SCHOOL_NECROMANCY: return "Necromancy";
case SPELL_SCHOOL_TRANSMUTATION: return "Transmutation";
}
return "";
}
string MissChanceToString(int nMissChance)
{
switch (nMissChance)
{
case MISS_CHANCE_TYPE_VS_RANGED: return "vs. Ranged";
case MISS_CHANCE_TYPE_VS_MELEE: return "vs. Melee";
}
return "";
}
void ai_CreateEffectChatReport(object oPlayer, int nEffectIconID)
{
int nIconEffectType = EffectIconToEffectType(nEffectIconID);
if(nIconEffectType == EFFECT_TYPE_INVALIDEFFECT) return;
int nLine, nIndex, nEffectIndex;
string sColor = AI_COLOR_YELLOW;
int bSkipDisplay, bHasEffect;
int nEffectType, bIsSpellLevelAbsorptionPretendingToBeSpellImmunity;
string sText;
json jEffectID = JsonArray();
// ************************************************************************* Width / Height
// Row 1 ******************************************************************* 500 / 27
sText = Get2DAStrRef("effecticons", "StrRef", nEffectIconID);
ai_SendMessages(sText, AI_COLOR_YELLOW, oPlayer);
effect eEffect = GetFirstEffect(oPlayer);
while(GetIsEffectValid(eEffect))
{
bSkipDisplay = FALSE;
nEffectType = GetEffectType(eEffect);
// Unlimited EffectSpellLevelAbsorption has a SpellImmunity Icon
if (nIconEffectType == EFFECT_TYPE_SPELL_IMMUNITY && GetEffectInteger(eEffect, 3))
{
bIsSpellLevelAbsorptionPretendingToBeSpellImmunity = TRUE;
nIconEffectType = EFFECT_TYPE_SPELLLEVELABSORPTION;
}
if (nEffectType == nIconEffectType)
{
bHasEffect = TRUE;
int nSpellID = GetEffectSpellId(eEffect);
string sSpellName = nSpellID == -1 ? "<Unknown>" : Get2DAStrRef("spells", "Name", nSpellID);
int bIsPermanentEffect = GetEffectDurationType(eEffect) == DURATION_TYPE_PERMANENT;
int nDurationRemaining = GetEffectDurationRemaining(eEffect);
string sDurationRemaining = bIsPermanentEffect ? "(Permanent)" : "(" + SecondsToTimestamp(nDurationRemaining) + ")";
if(bIsPermanentEffect) sColor = AI_COLOR_WHITE;
else
{
if(nDurationRemaining < 61) sColor = AI_COLOR_RED;
else if(nDurationRemaining < 300) sColor = AI_COLOR_YELLOW;
else sColor = AI_COLOR_GREEN;
}
string sStats = "";
string sRacialTypeAlignment = "";
switch (nEffectType)
{
case EFFECT_TYPE_AC_INCREASE:
case EFFECT_TYPE_AC_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_AC_INCREASE, EFFECT_TYPE_AC_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + ACTypeToString(GetEffectInteger(eEffect, 0)) + " AC";
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4));
break;
}
case EFFECT_TYPE_ATTACK_INCREASE:
case EFFECT_TYPE_ATTACK_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_ATTACK_INCREASE, EFFECT_TYPE_ATTACK_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) +" AB";
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4));
break;
}
case EFFECT_TYPE_SAVING_THROW_INCREASE:
case EFFECT_TYPE_SAVING_THROW_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SAVING_THROW_INCREASE, EFFECT_TYPE_SAVING_THROW_DECREASE);
string sSavingThrow = SavingThrowToString(GetEffectInteger(eEffect, 1));
string sSavingThrowType = SavingThrowTypeToString(GetEffectInteger(eEffect, 2));
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + " " + sSavingThrow + (sSavingThrowType == "" ? "" : " (vs. " + sSavingThrowType + ")");
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4), GetEffectInteger(eEffect, 5));
break;
}
case EFFECT_TYPE_ABILITY_INCREASE:
case EFFECT_TYPE_ABILITY_DECREASE:
{
int nAbility = AbilityTypeFromEffectIconAbility(nEffectIconID);
if (nAbility != GetEffectInteger(eEffect, 0))
bSkipDisplay = TRUE;
else
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_ABILITY_INCREASE, EFFECT_TYPE_ABILITY_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + AbilityToString(nAbility);
}
break;
}
case EFFECT_TYPE_DAMAGE_INCREASE:
case EFFECT_TYPE_DAMAGE_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_DAMAGE_INCREASE, EFFECT_TYPE_DAMAGE_DECREASE);
sStats = sModifier + Get2DAStrRef("iprp_damagecost", "Name", GetEffectInteger(eEffect, 0)) + " (" + DamageTypeToString(GetEffectInteger(eEffect, 1)) + ")";
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4));
break;
}
case EFFECT_TYPE_SKILL_INCREASE:
case EFFECT_TYPE_SKILL_DECREASE:
{
int nSkill = GetEffectInteger(eEffect, 0);
string sSkill = nSkill == 255 ? "All Skills" : Get2DAStrRef("skills", "Name", nSkill);
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SKILL_INCREASE, EFFECT_TYPE_SKILL_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + sSkill;
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4));
break;
}
case EFFECT_TYPE_TEMPORARY_HITPOINTS:
{
sStats = "+" + IntToString(GetEffectInteger(eEffect, 0)) + " HitPoints";
break;
}
case EFFECT_TYPE_DAMAGE_REDUCTION:
{
int nAmount = GetEffectInteger(eEffect, 0);
int nDamagePower = GetEffectInteger(eEffect, 1);
nDamagePower = nDamagePower > 6 ? --nDamagePower : nDamagePower;
int nRemaining = GetEffectInteger(eEffect, 2);
sStats = IntToString(nAmount) + "/+" + IntToString(nDamagePower) + " (" + (nRemaining == 0 ? "Unlimited" : IntToString(nRemaining) + " Damage Remaining") + ")";
break;
}
case EFFECT_TYPE_DAMAGE_RESISTANCE:
{
int nAmount = GetEffectInteger(eEffect, 1);
int nRemaining = GetEffectInteger(eEffect, 2);
sStats = IntToString(nAmount) + "/- " + DamageTypeToString(GetEffectInteger(eEffect, 0)) + " Resistance (" + (nRemaining == 0 ? "Unlimited" : IntToString(nRemaining) + " Damage Remaining") + ")";
break;
}
case EFFECT_TYPE_IMMUNITY:
{
int nImmunity = ImmunityTypeFromEffectIconImmunity(nEffectIconID);
if (nImmunity != GetEffectInteger(eEffect, 0))
bSkipDisplay = TRUE;
else
{
sStats = Get2DAStrRef("effecticons", "StrRef", nEffectIconID);
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3));
}
break;
}
case EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE:
case EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE:
{
int nDamageType = GetEffectInteger(eEffect, 0);
int nDamageTypeFromIcon = DamageTypeFromEffectIconDamageImmunity(nEffectIconID);
if (nDamageTypeFromIcon != -1 && nDamageType != nDamageTypeFromIcon)
bSkipDisplay = TRUE;
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE, EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + "% " + DamageTypeToString(nDamageType) + " Damage Immunity";
break;
}
case EFFECT_TYPE_SPELL_IMMUNITY:
{
sStats = "Spell Immunity: " + Get2DAStrRef("spells", "Name", GetEffectInteger(eEffect, 0));
break;
}
case EFFECT_TYPE_SPELLLEVELABSORPTION:
{
int nMaxSpellLevelAbsorbed = GetEffectInteger(eEffect, 0);
int bUnlimited = GetEffectInteger(eEffect, 3);
string sSpellLevel;
switch (nMaxSpellLevelAbsorbed)
{
case 0: sSpellLevel = "Cantrip"; break;
case 1: sSpellLevel = "1st"; break;
case 2: sSpellLevel = "2nd"; break;
case 3: sSpellLevel = "3rd"; break;
default: sSpellLevel = IntToString(nMaxSpellLevelAbsorbed) + "th"; break;
}
sSpellLevel += " Level" + (nMaxSpellLevelAbsorbed == 0 ? "" : " and Below");
string sSpellSchool = SpellSchoolToString(GetEffectInteger(eEffect, 2));
string sRemainingSpellLevels = bUnlimited ? "" : "(" + IntToString(GetEffectInteger(eEffect, 1)) + " Spell Levels Remaining)";
sStats = sSpellLevel + " " + sSpellSchool + " Spell Immunity " + sRemainingSpellLevels;
if (bIsSpellLevelAbsorptionPretendingToBeSpellImmunity)
nIconEffectType = EFFECT_TYPE_SPELL_IMMUNITY;
else if (bUnlimited && !bIsSpellLevelAbsorptionPretendingToBeSpellImmunity)
bSkipDisplay = TRUE;
break;
}
case EFFECT_TYPE_REGENERATE:
{
sStats = "+" + IntToString(GetEffectInteger(eEffect, 0)) + " HP / " + FloatToString((GetEffectInteger(eEffect, 1) / 1000.0f), 0, 2) + "s";
break;
}
case EFFECT_TYPE_POISON:
{
sStats = "Poison: " + Get2DAStrRef("poison", "Name", GetEffectInteger(eEffect, 0));
break;
}
case EFFECT_TYPE_DISEASE:
{
sStats = "Disease: " + Get2DAStrRef("disease", "Name", GetEffectInteger(eEffect, 0));
break;
}
case EFFECT_TYPE_CURSE:
{
int nAbility;
string sAbilityDecrease;
for (nAbility = 0; nAbility < 6; nAbility++)
{
int nAbilityMod = GetEffectInteger(eEffect, nAbility);
if (nAbilityMod > 0)
{
string sAbility = GetStringLeft(AbilityToString(nAbility), 3);
sAbilityDecrease += "-" + IntToString(nAbilityMod) + " " + sAbility + ", ";
}
}
sAbilityDecrease = GetStringLeft(sAbilityDecrease, GetStringLength(sAbilityDecrease) - 2);
sStats = sAbilityDecrease;
break;
}
case EFFECT_TYPE_MOVEMENT_SPEED_INCREASE:
case EFFECT_TYPE_MOVEMENT_SPEED_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_MOVEMENT_SPEED_INCREASE, EFFECT_TYPE_MOVEMENT_SPEED_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + "% Movement Speed";
break;
}
case EFFECT_TYPE_ELEMENTALSHIELD:
{
sStats = IntToString(GetEffectInteger(eEffect, 0)) + " + " + Get2DAStrRef("iprp_damagecost", "Name", GetEffectInteger(eEffect, 1)) + " (" + DamageTypeToString(GetEffectInteger(eEffect, 2)) + ")";
break;
}
case EFFECT_TYPE_NEGATIVELEVEL:
{
sStats = "-" + IntToString(GetEffectInteger(eEffect, 0)) + " Levels";
break;
}
case EFFECT_TYPE_CONCEALMENT:
{
string sMissChance = MissChanceToString(GetEffectInteger(eEffect, 4) - 1);
sStats = IntToString(GetEffectInteger(eEffect, 0)) + "% Concealment" + (sMissChance == "" ? "" : " (" + sMissChance + ")");
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3));
break;
}
case EFFECT_TYPE_SPELL_RESISTANCE_INCREASE:
case EFFECT_TYPE_SPELL_RESISTANCE_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SPELL_RESISTANCE_INCREASE, EFFECT_TYPE_SPELL_RESISTANCE_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + " Spell Resistance";
break;
}
case EFFECT_TYPE_SPELL_FAILURE:
{
sStats = IntToString(GetEffectInteger(eEffect, 0)) + "% Spell Failure (Spell School: " + SpellSchoolToString(GetEffectInteger(eEffect, 1)) + ")";
break;
}
case EFFECT_TYPE_INVISIBILITY:
{
int nInvisibilityType = GetEffectInteger(eEffect, 0);
if (nEffectIconID == EFFECT_ICON_INVISIBILITY)
bSkipDisplay = nInvisibilityType != INVISIBILITY_TYPE_NORMAL;
else if (nEffectIconID == EFFECT_ICON_IMPROVEDINVISIBILITY)
bSkipDisplay = nInvisibilityType != INVISIBILITY_TYPE_IMPROVED;
if (!bSkipDisplay)
{
sStats = (nInvisibilityType == INVISIBILITY_TYPE_IMPROVED ? "Improved " : "") + "Invisibility";
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3));
}
break;
}
case EFFECT_TYPE_HASTE:
{
sStats = "Hasted";
}
}
if(!bSkipDisplay)
{
sText = sSpellName + " " + sDurationRemaining + (sStats == "" ? "" : " -> " + sStats + sRacialTypeAlignment);
if(sText != "")
{
ai_SendMessages(sText, sColor, oPlayer);
object oSource = GetEffectCreator(eEffect);
if(GetIsObjectValid(oSource))
{
sText = GetObjectType(oSource) ? GetName(oSource) : "<Unknown>";
sText = " Creator: " + sText;
float fLength = IntToFloat(GetStringLength(sText) * 8);
ai_SendMessages(sText, AI_COLOR_YELLOW, oPlayer);
}
}
}
}
nIndex++;
eEffect = GetNextEffect(oPlayer);
}
}
void ai_CreateEffectIconMenu(object oPlayer, int nEffectIconID)
{
int nIconEffectType = EffectIconToEffectType(nEffectIconID);
if(nIconEffectType == EFFECT_TYPE_INVALIDEFFECT) return;
int nLine, nColor, nIndex, nEffectIndex;
int bSkipDisplay, bHasEffect;
int nEffectType, bIsSpellLevelAbsorptionPretendingToBeSpellImmunity;
string sText;
json jEffectID = JsonArray();
// ************************************************************************* Width / Height
// Row 1 ******************************************************************* 500 / 27
sText = Get2DAStrRef("effecticons", "StrRef", nEffectIconID);
json jRow = CreateLabel(JsonArray(), "Effect: " + sText, "lbl_buff_name", 700.0f, 15.0f, NUI_HALIGN_LEFT, NUI_VALIGN_MIDDLE, 0.0);
// Add row to the column.
json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow));
float fHeight = 27.0;
effect eEffect = GetFirstEffect(oPlayer);
while(GetIsEffectValid(eEffect))
{
bSkipDisplay = FALSE;
nEffectType = GetEffectType(eEffect);
// Unlimited EffectSpellLevelAbsorption has a SpellImmunity Icon
if (nIconEffectType == EFFECT_TYPE_SPELL_IMMUNITY && GetEffectInteger(eEffect, 3))
{
bIsSpellLevelAbsorptionPretendingToBeSpellImmunity = TRUE;
nIconEffectType = EFFECT_TYPE_SPELLLEVELABSORPTION;
}
if (nEffectType == nIconEffectType)
{
bHasEffect = TRUE;
int nSpellID = GetEffectSpellId(eEffect);
string sSpellName = nSpellID == -1 ? "<Unknown>" : Get2DAStrRef("spells", "Name", nSpellID);
int bIsPermanentEffect = GetEffectDurationType(eEffect) == DURATION_TYPE_PERMANENT;
int nDurationRemaining = GetEffectDurationRemaining(eEffect);
string sDurationRemaining = bIsPermanentEffect ? "(Permanent)" : "(" + SecondsToTimestamp(nDurationRemaining) + ")";
if(bIsPermanentEffect) nColor = 0x0000FFFF;
else
{
float fPercentage = IntToFloat(nDurationRemaining) / IntToFloat(GetEffectDuration(eEffect));
if(fPercentage > 0.5f) nColor = 0x00FF00FF;
else if(fPercentage < 0.25f) nColor = 0xFF0000FF;
else nColor = 0xFFFF00FF;
}
string sStats = "";
string sRacialTypeAlignment = "";
switch (nEffectType)
{
case EFFECT_TYPE_AC_INCREASE:
case EFFECT_TYPE_AC_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_AC_INCREASE, EFFECT_TYPE_AC_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + ACTypeToString(GetEffectInteger(eEffect, 0)) + " AC";
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4));
break;
}
case EFFECT_TYPE_ATTACK_INCREASE:
case EFFECT_TYPE_ATTACK_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_ATTACK_INCREASE, EFFECT_TYPE_ATTACK_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) +" AB";
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4));
break;
}
case EFFECT_TYPE_SAVING_THROW_INCREASE:
case EFFECT_TYPE_SAVING_THROW_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SAVING_THROW_INCREASE, EFFECT_TYPE_SAVING_THROW_DECREASE);
string sSavingThrow = SavingThrowToString(GetEffectInteger(eEffect, 1));
string sSavingThrowType = SavingThrowTypeToString(GetEffectInteger(eEffect, 2));
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + " " + sSavingThrow + (sSavingThrowType == "" ? "" : " (vs. " + sSavingThrowType + ")");
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4), GetEffectInteger(eEffect, 5));
break;
}
case EFFECT_TYPE_ABILITY_INCREASE:
case EFFECT_TYPE_ABILITY_DECREASE:
{
int nAbility = AbilityTypeFromEffectIconAbility(nEffectIconID);
if (nAbility != GetEffectInteger(eEffect, 0))
bSkipDisplay = TRUE;
else
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_ABILITY_INCREASE, EFFECT_TYPE_ABILITY_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + AbilityToString(nAbility);
}
break;
}
case EFFECT_TYPE_DAMAGE_INCREASE:
case EFFECT_TYPE_DAMAGE_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_DAMAGE_INCREASE, EFFECT_TYPE_DAMAGE_DECREASE);
sStats = sModifier + Get2DAStrRef("iprp_damagecost", "Name", GetEffectInteger(eEffect, 0)) + " (" + DamageTypeToString(GetEffectInteger(eEffect, 1)) + ")";
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4));
break;
}
case EFFECT_TYPE_SKILL_INCREASE:
case EFFECT_TYPE_SKILL_DECREASE:
{
int nSkill = GetEffectInteger(eEffect, 0);
string sSkill = nSkill == 255 ? "All Skills" : Get2DAStrRef("skills", "Name", nSkill);
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SKILL_INCREASE, EFFECT_TYPE_SKILL_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + " " + sSkill;
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3), GetEffectInteger(eEffect, 4));
break;
}
case EFFECT_TYPE_TEMPORARY_HITPOINTS:
{
sStats = "+" + IntToString(GetEffectInteger(eEffect, 0)) + " HitPoints";
break;
}
case EFFECT_TYPE_DAMAGE_REDUCTION:
{
int nAmount = GetEffectInteger(eEffect, 0);
int nDamagePower = GetEffectInteger(eEffect, 1);
nDamagePower = nDamagePower > 6 ? --nDamagePower : nDamagePower;
int nRemaining = GetEffectInteger(eEffect, 2);
sStats = IntToString(nAmount) + "/+" + IntToString(nDamagePower) + " (" + (nRemaining == 0 ? "Unlimited" : IntToString(nRemaining) + " Damage Remaining") + ")";
break;
}
case EFFECT_TYPE_DAMAGE_RESISTANCE:
{
int nAmount = GetEffectInteger(eEffect, 1);
int nRemaining = GetEffectInteger(eEffect, 2);
sStats = IntToString(nAmount) + "/- " + DamageTypeToString(GetEffectInteger(eEffect, 0)) + " Resistance (" + (nRemaining == 0 ? "Unlimited" : IntToString(nRemaining) + " Damage Remaining") + ")";
break;
}
case EFFECT_TYPE_IMMUNITY:
{
int nImmunity = ImmunityTypeFromEffectIconImmunity(nEffectIconID);
if (nImmunity != GetEffectInteger(eEffect, 0))
bSkipDisplay = TRUE;
else
{
sStats = Get2DAStrRef("effecticons", "StrRef", nEffectIconID);
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3));
}
break;
}
case EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE:
case EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE:
{
int nDamageType = GetEffectInteger(eEffect, 0);
int nDamageTypeFromIcon = DamageTypeFromEffectIconDamageImmunity(nEffectIconID);
if (nDamageTypeFromIcon != -1 && nDamageType != nDamageTypeFromIcon)
bSkipDisplay = TRUE;
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE, EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 1)) + "% " + DamageTypeToString(nDamageType) + " Damage Immunity";
break;
}
case EFFECT_TYPE_SPELL_IMMUNITY:
{
sStats = "Spell Immunity: " + Get2DAStrRef("spells", "Name", GetEffectInteger(eEffect, 0));
break;
}
case EFFECT_TYPE_SPELLLEVELABSORPTION:
{
int nMaxSpellLevelAbsorbed = GetEffectInteger(eEffect, 0);
int bUnlimited = GetEffectInteger(eEffect, 3);
string sSpellLevel;
switch (nMaxSpellLevelAbsorbed)
{
case 0: sSpellLevel = "Cantrip"; break;
case 1: sSpellLevel = "1st"; break;
case 2: sSpellLevel = "2nd"; break;
case 3: sSpellLevel = "3rd"; break;
default: sSpellLevel = IntToString(nMaxSpellLevelAbsorbed) + "th"; break;
}
sSpellLevel += " Level" + (nMaxSpellLevelAbsorbed == 0 ? "" : " and Below");
string sSpellSchool = SpellSchoolToString(GetEffectInteger(eEffect, 2));
string sRemainingSpellLevels = bUnlimited ? "" : "(" + IntToString(GetEffectInteger(eEffect, 1)) + " Spell Levels Remaining)";
sStats = sSpellLevel + " " + sSpellSchool + " Spell Immunity " + sRemainingSpellLevels;
if (bIsSpellLevelAbsorptionPretendingToBeSpellImmunity)
nIconEffectType = EFFECT_TYPE_SPELL_IMMUNITY;
else if (bUnlimited && !bIsSpellLevelAbsorptionPretendingToBeSpellImmunity)
bSkipDisplay = TRUE;
break;
}
case EFFECT_TYPE_REGENERATE:
{
sStats = "+" + IntToString(GetEffectInteger(eEffect, 0)) + " HP / " + FloatToString((GetEffectInteger(eEffect, 1) / 1000.0f), 0, 2) + "s";
break;
}
case EFFECT_TYPE_POISON:
{
sStats = "Poison: " + Get2DAStrRef("poison", "Name", GetEffectInteger(eEffect, 0));
break;
}
case EFFECT_TYPE_DISEASE:
{
sStats = "Disease: " + Get2DAStrRef("disease", "Name", GetEffectInteger(eEffect, 0));
break;
}
case EFFECT_TYPE_CURSE:
{
int nAbility;
string sAbilityDecrease;
for (nAbility = 0; nAbility < 6; nAbility++)
{
int nAbilityMod = GetEffectInteger(eEffect, nAbility);
if (nAbilityMod > 0)
{
string sAbility = GetStringLeft(AbilityToString(nAbility), 3);
sAbilityDecrease += "-" + IntToString(nAbilityMod) + " " + sAbility + ", ";
}
}
sAbilityDecrease = GetStringLeft(sAbilityDecrease, GetStringLength(sAbilityDecrease) - 2);
sStats = sAbilityDecrease;
break;
}
case EFFECT_TYPE_MOVEMENT_SPEED_INCREASE:
case EFFECT_TYPE_MOVEMENT_SPEED_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_MOVEMENT_SPEED_INCREASE, EFFECT_TYPE_MOVEMENT_SPEED_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + "% Movement Speed";
break;
}
case EFFECT_TYPE_ELEMENTALSHIELD:
{
sStats = IntToString(GetEffectInteger(eEffect, 0)) + " + " + Get2DAStrRef("iprp_damagecost", "Name", GetEffectInteger(eEffect, 1)) + " (" + DamageTypeToString(GetEffectInteger(eEffect, 2)) + ")";
break;
}
case EFFECT_TYPE_NEGATIVELEVEL:
{
sStats = "-" + IntToString(GetEffectInteger(eEffect, 0)) + " Levels";
break;
}
case EFFECT_TYPE_CONCEALMENT:
{
string sMissChance = MissChanceToString(GetEffectInteger(eEffect, 4) - 1);
sStats = IntToString(GetEffectInteger(eEffect, 0)) + "% Concealment" + (sMissChance == "" ? "" : " (" + sMissChance + ")");
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3));
break;
}
case EFFECT_TYPE_SPELL_RESISTANCE_INCREASE:
case EFFECT_TYPE_SPELL_RESISTANCE_DECREASE:
{
string sModifier = GetModifierType(nEffectType, EFFECT_TYPE_SPELL_RESISTANCE_INCREASE, EFFECT_TYPE_SPELL_RESISTANCE_DECREASE);
sStats = sModifier + IntToString(GetEffectInteger(eEffect, 0)) + " Spell Resistance";
break;
}
case EFFECT_TYPE_SPELL_FAILURE:
{
sStats = IntToString(GetEffectInteger(eEffect, 0)) + "% Spell Failure (Spell School: " + SpellSchoolToString(GetEffectInteger(eEffect, 1)) + ")";
break;
}
case EFFECT_TYPE_INVISIBILITY:
{
int nInvisibilityType = GetEffectInteger(eEffect, 0);
if (nEffectIconID == EFFECT_ICON_INVISIBILITY)
bSkipDisplay = nInvisibilityType != INVISIBILITY_TYPE_NORMAL;
else if (nEffectIconID == EFFECT_ICON_IMPROVEDINVISIBILITY)
bSkipDisplay = nInvisibilityType != INVISIBILITY_TYPE_IMPROVED;
if (!bSkipDisplay)
{
sStats = (nInvisibilityType == INVISIBILITY_TYPE_IMPROVED ? "Improved " : "") + "Invisibility";
sRacialTypeAlignment = GetVersusRacialTypeAndAlignment(GetEffectInteger(eEffect, 1), GetEffectInteger(eEffect, 2), GetEffectInteger(eEffect, 3));
}
break;
}
case EFFECT_TYPE_HASTE:
{
sStats = "Hasted";
}
}
if(!bSkipDisplay)
{
sText = sSpellName + " " + sDurationRemaining + (sStats == "" ? "" : " -> " + sStats + sRacialTypeAlignment);
if(sText != "")
{
jRow = CreateLabel(JsonArray(), " " + sText, "lbl_buff_info" + IntToString(nIndex), 700.0f, 10.0f, NUI_HALIGN_LEFT, NUI_VALIGN_TOP, 0.0);
// Add row to the column.
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
fHeight += 10.0;
object oSource = GetEffectCreator(eEffect);
if(GetIsObjectValid(oSource))
{
sText = GetObjectType(oSource) ? GetName(oSource) : "<Unknown>";
sText = " Creator: " + sText;
float fLength = IntToFloat(GetStringLength(sText) * 8);
jRow = CreateLabel(JsonArray(), sText, "lbl_buff_source" + IntToString(nIndex), fLength, 15.0f, NUI_HALIGN_LEFT, NUI_VALIGN_BOTTOM, 0.0);
if(oSource == oPlayer)
{
CreateButton(jRow, "Remove", "btn_remove_effect_" + IntToString(nEffectIndex++), 70.0f, 20.0f, 0.0);
jEffectID = JsonArrayInsert(jEffectID, JsonString(GetEffectLinkId(eEffect)));
fHeight += 20.0;
}
else fHeight += 15.0;
// Add row to the column.
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
}
}
}
}
nIndex++;
eEffect = GetNextEffect(oPlayer);
}
float fScale = IntToFloat(GetPlayerDeviceProperty(oPlayer, PLAYER_DEVICE_PROPERTY_GUI_SCALE)) / 100.0;
float fX = IntToFloat(GetPlayerDeviceProperty(oPlayer, PLAYER_DEVICE_PROPERTY_GUI_WIDTH));
fX = fX - (700.0 * fScale);
float fY = 50 * fScale;
// Set the Layout of the window.
json jLayout = NuiCol(jCol);
int nToken = SetWindow(oPlayer, jLayout, AI_EFFECT_ICON_NUI, "Effect Icon Menu",
fX, fY, 700.0, fHeight * fScale, FALSE, FALSE, FALSE, TRUE, FALSE, "0e_nui");
// Save the associate to the nui for use in 0e_nui
json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oPlayer)));
jData = JsonArrayInsert(jData, JsonInt(nEffectIconID));
jData = JsonArrayInsert(jData, jEffectID);
NuiSetUserData(oPlayer, nToken, jData);
NuiSetBind(oPlayer, nToken, "lbl_buff_name_event", JsonBool(TRUE));
while(nIndex >= 0)
{
NuiSetBind(oPlayer, nToken, "lbl_buff_info" + IntToString(nIndex) + "_event", JsonBool(TRUE));
NuiSetBind(oPlayer, nToken, "lbl_buff_source" + IntToString(nIndex) + "_event", JsonBool(TRUE));
nIndex--;
}
while(nEffectIndex >= 0)
{
NuiSetBind(oPlayer, nToken, "btn_remove_effect_" + IntToString(nEffectIndex) + "_event", JsonBool(TRUE));
NuiSetBind(oPlayer, nToken, "btn_remove_effect_" + IntToString(nEffectIndex), JsonInt(TRUE));
nEffectIndex--;
}
}