Updated Vow of Poverty. Added Sanctify Ki Strike, Holy Strike, Fist of Heavens, Vow of Abstinence, Vow of Chastity & Gift of Faith. (@fenac). Turned off the Taunt & Parry skills. Re-disabled AC & save bonuses from Tumble & Spellcraft. Updated min() & max() to PRCmin() & PRCmax() to not conflict with similarly named NUI adjacent functions. Set Point Blank Shot to 30' per PnP. Added icon for Chosen of Evil. Started work on Hidden Talent. Created Psionics function cheatsheet. Updated release archive.
163 lines
7.9 KiB
Plaintext
163 lines
7.9 KiB
Plaintext
//:://////////////////////////////////////////////
|
|
//:: Switch-based speed alterations
|
|
//:: prc_speed
|
|
//:://////////////////////////////////////////////
|
|
/** @file
|
|
A script called from EvalPRCFeats() that
|
|
applies optional speed modifications.
|
|
|
|
- Racial speed
|
|
- Medium or heavier armor speed reduction
|
|
- Removal of PC speed advantage
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "prc_alterations"
|
|
|
|
void main()
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
//get the object thats going to apply the effect
|
|
//this strips previous effects too
|
|
object oWP = GetObjectToApplyNewEffect("WP_SpeedEffect", oPC, TRUE);
|
|
|
|
// This applies fast travel when the PC is in safe areas
|
|
if (GetPRCSwitch(PRC_FAST_TRAVEL_SPEED) && !GetIsInCombat(oPC) && GetIsObjectValid(GetAreaFromLocation(GetLocation(oPC))))
|
|
{
|
|
AssignCommand(oWP, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectMovementSpeedIncrease(99)), oPC)));
|
|
AddEventScript(oPC, EVENT_ONHEARTBEAT, "prc_speed", TRUE, FALSE);
|
|
return;
|
|
}
|
|
else if (!GetPRCSwitch(PRC_FAST_TRAVEL_SPEED))
|
|
RemoveEventScript(oPC, EVENT_ONHEARTBEAT, "prc_speed", TRUE, FALSE);
|
|
|
|
// Load current speed as determined by previous iterations. Or in case of first iteration, hardcoded to 30
|
|
int nCurrentSpeed = GetLocalInt(oPC, "PRC_SwitchbasedSpeed");
|
|
if(!nCurrentSpeed)
|
|
nCurrentSpeed = 30;
|
|
|
|
//30feet is the default speed
|
|
//rather than try to fudge around biowares differences
|
|
//Ill just scale relative to that
|
|
int nNewSpeed = 30;
|
|
|
|
// See if we should alter speed based on race
|
|
if(GetPRCSwitch(PRC_PNP_RACIAL_SPEED))
|
|
{
|
|
nNewSpeed = StringToInt(Get2DACache("racialtypes", "Endurance", GetRacialType(oPC)));
|
|
|
|
// Some races do not have speed listed, in that case default to current
|
|
if(!nNewSpeed)
|
|
nNewSpeed = 30;
|
|
|
|
if (DEBUG) DoDebug("Racial Speed equals: "+IntToString(nNewSpeed));
|
|
}
|
|
|
|
// Adds a 5 foot boost to speed when 10th level or up
|
|
object oWOL = GetItemPossessedBy(oPC, "WOL_WargirdsArmor");
|
|
if (GetIsObjectValid(oWOL) && GetHitDice(oPC) >= 10 && GetHasFeat(FEAT_LEAST_LEGACY, oPC)) nNewSpeed += 5;
|
|
// Adds a 5 foot boost to speed when 10th level or up
|
|
oWOL = GetItemPossessedBy(oPC, "BowoftheBlackArcher");
|
|
if (GetIsObjectValid(oWOL) && GetHitDice(oPC) >= 18 && GetHasFeat(FEAT_GREATER_LEGACY, oPC)) nNewSpeed += 10;
|
|
// Adds a 5 foot boost to speed when 10th level or up
|
|
oWOL = GetItemPossessedBy(oPC, "WOL_Ur");
|
|
if (GetIsObjectValid(oWOL) && GetHitDice(oPC) >= 6 && GetHasFeat(FEAT_LEAST_LEGACY, oPC)) nNewSpeed += 5;
|
|
if (GetIsObjectValid(oWOL) && GetHitDice(oPC) >= 11 && GetHasFeat(FEAT_LESSER_LEGACY, oPC)) nNewSpeed += 5;
|
|
// Adds a 10 foot boost to speed when 11th level or up
|
|
oWOL = GetItemPossessedBy(oPC, "WOL_Treebrother");
|
|
if (GetIsObjectValid(oWOL) && GetHitDice(oPC) >= 11 && GetHasFeat(FEAT_LESSER_LEGACY, oPC)) nNewSpeed += 10;
|
|
// Adds a 10 foot boost to speed when 11th level or up
|
|
oWOL = GetItemPossessedBy(oPC, "WOL_Arik");
|
|
if (GetIsObjectValid(oWOL) && GetHitDice(oPC) >= 10 && GetHasFeat(FEAT_LEAST_LEGACY, oPC)) nNewSpeed += 10;
|
|
// Adds a 5 foot boost per point of essentia invested
|
|
if(GetEssentiaInvested(oPC, MELD_CERULEAN_SANDALS)) nNewSpeed += (5 * GetEssentiaInvested(oPC, MELD_CERULEAN_SANDALS));
|
|
// Adds a 60 foot boost
|
|
if (GetLocalInt(oPC, "DreadCarapaceTimer")) nNewSpeed += 60;
|
|
// 30 foot boost
|
|
if (GetLocalInt(oPC, "IncarnateAvatarSpeed")) nNewSpeed += 30;
|
|
// 10 foot boost
|
|
if (GetLocalInt(oPC, "LamiaBeltSpeed")) nNewSpeed += 10;
|
|
// Adds a 5 foot boost per point of essentia invested, plus 5
|
|
if (GetLocalInt(oPC, "WorgPeltSpeed")) nNewSpeed += GetLocalInt(oPC, "WorgPeltSpeed");
|
|
// 10 foot boost
|
|
if (GetLocalInt(oPC, "AstralVambraces") == 2) nNewSpeed += 10;
|
|
// 10 foot boost
|
|
if (GetLocalInt(oPC, "DesharisSpeed")) nNewSpeed += 10;
|
|
// Adds a 10 foot boost per point
|
|
if (GetLocalInt(oPC, "SpeedFromPain")) nNewSpeed += GetLocalInt(oPC, "SpeedFromPain") * 10;
|
|
|
|
// Binding content
|
|
if (GetLevelByClass(CLASS_TYPE_BINDER, oPC) || GetHasFeat(FEAT_PRACTICED_BINDER, oPC))
|
|
{
|
|
if (GetHasSpellEffect(VESTIGE_RONOVE, oPC) && GetLocalInt(oPC, "ExploitVestige") != VESTIGE_RONOVE_SPRINT) nNewSpeed += 10;
|
|
}
|
|
|
|
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
|
|
//in an onunequip event the armor is still in the slot
|
|
if(GetItemLastUnequipped() == oArmor && GetLocalInt(oPC, "ONEQUIP") == 1)
|
|
oArmor = OBJECT_INVALID;
|
|
int nArmorType = GetArmorType(oArmor);
|
|
|
|
// Adds a 5 foot boost per point of essentia invested
|
|
if(GetEssentiaInvested(oPC, MELD_DUSKLING_SPEED) && nArmorType == ARMOR_TYPE_LIGHT) nNewSpeed += (5 * GetEssentiaInvested(oPC, MELD_DUSKLING_SPEED));
|
|
|
|
// See if we should remove PC speed advantage
|
|
if(GetPRCSwitch(PRC_REMOVE_PLAYER_SPEED) &&
|
|
(GetIsPC(oPC) || GetMovementRate(oPC) == 0)
|
|
)
|
|
{
|
|
//PCs move at 4.0 NPC "normal" is 3.5
|
|
nNewSpeed = FloatToInt(IntToFloat(nNewSpeed) * (3.5 / 4.0));
|
|
if (DEBUG) DoDebug("Player Speed equals: "+IntToString(nNewSpeed));
|
|
}
|
|
|
|
|
|
// See if we should alter speed based on armor. Dwarves ignore this, as does Wargird's Armor, and the Aym Vestige, and Wildren race
|
|
int nAym = FALSE;
|
|
if (GetLocalInt(oPC, "ExploitVestige") != VESTIGE_AYM_DWARVEN_STEP && GetHasSpellEffect(VESTIGE_AYM, oPC)) nAym = TRUE;
|
|
if(GetPRCSwitch(PRC_PNP_ARMOR_SPEED) && MyPRCGetRacialType(oPC) != RACIAL_TYPE_DWARF && oArmor != oWOL && !nAym && GetRacialType(oPC) != RACIAL_TYPE_WILDREN)
|
|
{
|
|
int nCoc = (GetLevelByClass(CLASS_TYPE_COC, oPC));
|
|
int nKnight = (GetLevelByClass(CLASS_TYPE_KNIGHT, oPC));
|
|
if(nArmorType == ARMOR_TYPE_MEDIUM && nCoc < 5 && nKnight < 4)
|
|
nNewSpeed = FloatToInt(IntToFloat(nNewSpeed) * 0.75);
|
|
else if(nArmorType == ARMOR_TYPE_HEAVY && nCoc < 5 && nKnight < 9)
|
|
nNewSpeed = FloatToInt(IntToFloat(nNewSpeed) * 0.666);
|
|
|
|
if (DEBUG) DoDebug("Armor Speed equals: "+IntToString(nNewSpeed));
|
|
}
|
|
|
|
// In case of no changes
|
|
if(nNewSpeed == nCurrentSpeed)
|
|
return;
|
|
|
|
// Only apply the modification in case the PC is in a valid area. Invalid area means log(in|out)
|
|
if(!GetIsObjectValid(GetAreaFromLocation(GetLocation(oPC))))
|
|
return;
|
|
|
|
// Store new speed for future checks
|
|
SetLocalInt(oPC, "PRC_SwitchbasedSpeed", nNewSpeed);
|
|
|
|
// Determine speed change
|
|
float fSpeedChange = (IntToFloat(nNewSpeed) / 30) - 1.0;
|
|
if(DEBUG) DoDebug("prc_speed: NewSpeed = " + IntToString(nNewSpeed) + "; OldSpeed = " + IntToString(nCurrentSpeed) + "; SpeedChange = " + FloatToString(fSpeedChange));
|
|
if(DEBUG) DoDebug("GetMovementRate() = " + IntToString(GetMovementRate(oPC)));
|
|
if(DEBUG) DoDebug("Speed Change equals: "+FloatToString(fSpeedChange));
|
|
|
|
// Speed increase
|
|
if(fSpeedChange > 0.0)
|
|
{
|
|
int nChange = PRCMin(99, PRCMax(0, FloatToInt(fSpeedChange * 100.0)));
|
|
if(DEBUG) DoDebug("prc_speed: Applying an increase in speed: " + IntToString(nChange));
|
|
AssignCommand(oWP, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectMovementSpeedIncrease(nChange)), oPC)));
|
|
}
|
|
// Speed decrease
|
|
else if(fSpeedChange < 0.0)
|
|
{
|
|
int nChange = PRCMin(99, PRCMax(0, FloatToInt(-fSpeedChange * 100.0)));
|
|
if(DEBUG) DoDebug("prc_speed: Applying an decrease in speed: " + IntToString(nChange));
|
|
AssignCommand(oWP, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectMovementSpeedDecrease(nChange)), oPC)));
|
|
//ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectMovementSpeedDecrease(nChange)), oPC)
|
|
}
|
|
} |