Jaysyn904 7307efab11 Changed UserType for ToB Maneuvers
Changed UserType for ToB Maneuvers.  Removed free Imp Combat Casting from ToB base classes.  Fixed typo in Arcane Trickster skill list. Fixed bad value in damagehitvisual.2da.  Fixed typos in ecl.2da. Fixed targeting bug with Profane Lifeleech. Started working on updated materials system.  Fixed overlong filenames in materialcomp.2da and prc_spells.2da.  Fixed typo in prc_effect_inc.nss.  Added Daylight Adaptation as iprp_feat.  Fixed issue where Karsite's couldn't use spell cast from magical items.  Added missing Reth Dekala entangling blade.  Added Light Fortification for Warforged.  Added Fortification for Reth Dekala.  Added moderate fortification for Warforged Charger.  Removed Imp. Fortification from races that shouldn't have it.  Fixed missing Monstrous marker feat on Yuan-Ti Pureblood.  Updated TLK.  Updated release archive.
2024-12-13 11:33:43 -05:00

264 lines
11 KiB
Plaintext

/*
Script for all racial abilities / penalties that require a heartbeat check
*/
#include "prc_inc_spells"
void DoFortification(object oPC)
{
if(DEBUG) DoDebug("race_hb >> DoFortification() is running.");
// Get or create the player's skin object
object oHide = GetPCSkin(oPC);
int nRace = GetRacialType(oPC);
if (nRace == RACIAL_TYPE_RETH_DEKALA)
{
// Apply immunity properties for 2 seconds
if(DEBUG) DoDebug("Applying Fortification");
IPSafeAddItemProperty(oHide, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_CRITICAL_HITS), 2.0f);
IPSafeAddItemProperty(oHide, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_BACKSTAB), 2.0f);
// Schedule the next toggle in 4 seconds
DelayCommand(4.0f, DoFortification(oPC));
}
else if (nRace == RACIAL_TYPE_WARFORGED && !GetHasFeat(FEAT_IMPROVED_FORTIFICATION, oPC) && !GetHasFeat(FEAT_UNARMORED_BODY, oPC))
{
// Apply immunity properties for 1 seconds
if(DEBUG) DoDebug("Applying Light Fortification");
IPSafeAddItemProperty(oHide, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_CRITICAL_HITS), 1.0f);
IPSafeAddItemProperty(oHide, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_BACKSTAB), 1.0f);
// Schedule the next toggle in 4 seconds
DelayCommand(4.0f, DoFortification(oPC));
}
else if (nRace == RACIAL_TYPE_WARFORGED_CHARGER && !GetHasFeat(FEAT_IMPROVED_FORTIFICATION, oPC) && !GetHasFeat(FEAT_UNARMORED_BODY, oPC))
{
// Apply immunity properties for 3 seconds
if(DEBUG) DoDebug("Applying Moderate Fortification");
IPSafeAddItemProperty(oHide, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_CRITICAL_HITS), 3.0f);
IPSafeAddItemProperty(oHide, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_BACKSTAB), 3.0f);
// Schedule the next toggle in 4 seconds
DelayCommand(4.0f, DoFortification(oPC));
}
}
void main()
{
object oPC = OBJECT_SELF;
object oArea = GetArea(oPC);
object oSkin = GetPCSkin(oPC);
int bHasLightSensitive = GetHasFeat(FEAT_LTSENSE, oPC);
int bHasLightBlindness = GetHasFeat(FEAT_LTBLIND, oPC);
if(bHasLightSensitive || bHasLightBlindness)
{
int bIsEffectedByLight = FALSE;
if(GetIsObjectValid(oArea)
&& !GetHasFeat(FEAT_DAYLIGHTADAPT, oPC)
&& !GetHasFeat(FEAT_NS_LIGHT_ADAPTION, oPC)
&& GetIsDay()
&& GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND
&& !GetIsAreaInterior(oArea))
bIsEffectedByLight = TRUE;
// light sensitivity
// those with lightblindess are also sensitive
if(bIsEffectedByLight)
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDazzle(), oPC, 6.5);
// light blindness
if(bHasLightBlindness && bIsEffectedByLight)
{
// on first entering bright light
// cause blindness for 1 round
if(!GetLocalInt(oPC, "EnteredDaylight"))
{
effect eBlind = EffectBlindness();
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlind, oPC, 5.99);
SetLocalInt(oPC, "EnteredDaylight", TRUE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDazzle(), oPC, 6.5);
}
}
if(!bIsEffectedByLight && GetLocalInt(oPC, "EnteredDaylight"))
DeleteLocalInt(oPC, "EnteredDaylight");
}
// imaskari underground hide bonus
//this is in addition to the normal bonus
if(GetHasFeat(FEAT_SA_HIDEU, oPC))
{
if(GetIsAreaAboveGround(oArea) == AREA_UNDERGROUND)
SetCompositeBonus(oSkin, "SA_Hide_Underground", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
else
SetCompositeBonus(oSkin, "SA_Hide_Underground", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
}
// troglodyte underground hide bonus
//this is in addition to the normal bonus
if(GetHasFeat(FEAT_SA_HIDE_TROG, oPC))
{
if(GetIsAreaAboveGround(oArea) == AREA_UNDERGROUND)
SetCompositeBonus(oSkin, "SA_Hide_Underground", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
else
SetCompositeBonus(oSkin, "SA_Hide_Underground", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
}
// forest gnomes bonus to hide in the woods
//this is in addition to the normal bonus
if(GetHasFeat(FEAT_SA_HIDEF, oPC) || GetHasFeat(FEAT_BONUS_BAMBOO, oPC))
{
if(GetIsAreaNatural(oArea) == AREA_NATURAL
&& GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND)
SetCompositeBonus(oSkin, "SA_Hide_Forest", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
else
SetCompositeBonus(oSkin, "SA_Hide_Forest", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
}
// grig bonus to hide in the woods
if(GetHasFeat(FEAT_SA_HIDEF_5, oPC))
{
if(GetIsAreaNatural(oArea) == AREA_NATURAL &&
GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND)
SetCompositeBonus(oSkin, "SA_Hide_Forest", 5, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
else
SetCompositeBonus(oSkin, "SA_Hide_Forest", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
}
// ranger Camouflage
if(GetHasFeat(FEAT_CAMOUFLAGE, oPC))
{
if(GetIsAreaNatural(oArea) == AREA_NATURAL &&
GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND)
SetCompositeBonus(oSkin, "Cls_Camouflage", 5, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
else
SetCompositeBonus(oSkin, "Cls_Camouflage", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
}
//Chameleon Skin Hide bonus for Poison Dusk Lizardfolk
//+5 to Hide if most of skin is uncovered
if(GetHasFeat(FEAT_CHAMELEON, oPC))
{
if(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC) == OBJECT_INVALID)
SetCompositeBonus(oSkin, "Chameleon", 5, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
else
SetCompositeBonus(oSkin, "Chameleon", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
}
// Krinth Shadowstrike is done as interior areas, applies to melee only
if(GetHasFeat(FEAT_SHADOWSTRIKE, oPC) && GetIsAreaInterior(oArea) && IPGetIsMeleeWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC)))
{
effect eShadow = EffectLinkEffects(EffectAttackIncrease(1), EffectDamageIncrease(DAMAGE_BONUS_1d6, DAMAGE_TYPE_BASE_WEAPON));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eShadow), oPC, 6.0);
}
// Treebrother WOL bonus to Hide/MS
if(GetIsObjectValid(GetItemPossessedBy(oPC, "WOL_Treebrother")) && GetHitDice(oPC) >= 10)
{
if(GetIsAreaNatural(oArea) == AREA_NATURAL && GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND)
{
SetCompositeBonus(oSkin, "TreebrotherH", 5, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
SetCompositeBonus(oSkin, "TreebrotherMS", 5, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
}
else
{
SetCompositeBonus(oSkin, "TreebrotherH", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
SetCompositeBonus(oSkin, "TreebrotherMS", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
}
}
// Bhuka Sandskimming hackjob
if(GetRacialType(oPC) == RACIAL_TYPE_BHUKA && GetIsAreaNatural(oArea) == AREA_NATURAL && GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND)
{
effect eLook = GetFirstEffect(oPC);
while(GetIsEffectValid(eLook))
{
if(GetEffectType(eLook) == EFFECT_TYPE_MOVEMENT_SPEED_DECREASE)
{
RemoveEffect(oPC, eLook);
}
eLook = GetNextEffect(oPC);
}
}
if(GetRacialType(oPC) == RACIAL_TYPE_FROST_FOLK)
{
if(GetWeather(oArea) == WEATHER_SNOW)
SetCompositeBonus(oSkin, "FrostFolkHide", 8, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
else
SetCompositeBonus(oSkin, "FrostFolkHide", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
}
if(GetRacialType(oPC) == RACIAL_TYPE_ULDRA)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamageIncrease(DAMAGE_BONUS_1, DAMAGE_TYPE_COLD), oPC, 6.0);
}
if(GetRacialType(oPC) == RACIAL_TYPE_SHARAKIM)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(VersusRacialTypeEffect(EffectAttackIncrease(1), RACIAL_TYPE_HUMANOID_ORC)), oPC, 6.0);
if(GetIsNight())
{
SetCompositeBonus(oSkin, "Sharakhim_H", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
SetCompositeBonus(oSkin, "Sharakhim_S", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
SetCompositeBonus(oSkin, "Sharakhim_M", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
SetCompositeBonus(oSkin, "Sharakhim_R", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH);
}
else
{
SetCompositeBonus(oSkin, "Sharakhim_H", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
SetCompositeBonus(oSkin, "Sharakhim_S", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
SetCompositeBonus(oSkin, "Sharakhim_M", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
SetCompositeBonus(oSkin, "Sharakhim_R", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH);
}
}
// Underfolk Camo
if(GetRacialType(oPC) == RACIAL_TYPE_UNDERFOLK)
{
if(GetIsAreaNatural(oArea) == AREA_NATURAL)
SetCompositeBonus(oSkin, "Underfolk_H", 10, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
else
SetCompositeBonus(oSkin, "Underfolk_H", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE); // Yes, they always have a +4 minimum
}
if (GetIsPC(oPC) == TRUE && GetPRCSwitch(PRC_CHICKEN_INFESTED) && GetLevelByClass(CLASS_TYPE_COMMONER, oPC))
{
MultisummonPreSummon();
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectSummonCreature("prc_chicken"), GetLocation(oPC), HoursToSeconds(GetPRCSwitch(PRC_CHICKEN_INFESTED)));
}
if (GetRacialType(oPC) == RACIAL_TYPE_SKULK && GetActionMode(oPC, ACTION_MODE_STEALTH))
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(EffectMovementSpeedIncrease(99)), oPC, 6.0);
if (GetRacialType(oPC) == RACIAL_TYPE_HYBSIL)
{
if(GetIsAreaNatural(oArea) == AREA_NATURAL && GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND)
{
SetCompositeBonus(oSkin, "HybsilSearch", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH);
SetCompositeBonus(oSkin, "HybsilDisable", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_DISABLE_TRAP);
}
else
{
SetCompositeBonus(oSkin, "HybsilSearch", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH);
SetCompositeBonus(oSkin, "HybsilDisable", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_DISABLE_TRAP);
}
}
if (GetRacialType(oPC) == RACIAL_TYPE_RETH_DEKALA || GetRacialType(oPC) == RACIAL_TYPE_WARFORGED || GetRacialType(oPC) == RACIAL_TYPE_WARFORGED_CHARGER)
{
int bFortification = GetLocalInt(oPC, "FORTIFCATION_ACTIVE");
if (!bFortification)
{
DoFortification(oPC);
SetLocalInt(oPC, "FORTIFCATION_ACTIVE", 1);
if(DEBUG) DoDebug("race_hb >> DoFortification() activated.");
}
}
}