Files
PRC8/nwn/nwnprc/trunk/scripts/prc_factotum.nss
Jaysyn904 3b6c74985e 2025/12/03 Update
Finished Hidden Talent.
Tweaked Factotum abilities to hopefully not run out of uses.
Tweaked Twinfiends skill function.
Hopefully fixed the Factotum's Inspiration not generating issues.
Hopefullly fixed Double Chakra bind.
Hopefully fixed Totemist's Double Totem Bind.
Hopefully fixed Girallon Arms.
Fixed Kuthrik Claws not granting Weapon Finesse.
Added missing medium centaur hoof slam uti.
Added new tentacle slam creature weapon (works the same, looks better).
Updated Spell Effect NUI to ignore system spells (@Rakiov).
Fixed typo in Guided Strike.
2025-12-03 15:33:47 -05:00

79 lines
3.4 KiB
Plaintext

#include "prc_inc_factotum"
#include "inc_dynconv"
void TriggerInspiration(object oPC, int nCombat);
void TriggerInspiration(object oPC, int nCombat)
{
SetLocalInt(oPC, "InspirationHBRunning", TRUE);
DelayCommand(0.249, DeleteLocalInt(oPC, "InspirationHBRunning"));
int nCurrent = GetIsInCombat(oPC);
// We just entered combat
if (nCurrent == TRUE && nCombat == FALSE)
SetInspiration(oPC);
else if (nCurrent == FALSE && nCombat == TRUE) // Just left combat
ClearInspiration(oPC);
DelayCommand(0.25, TriggerInspiration(oPC, nCurrent));
}
void main()
{
int nEvent = GetRunningEvent();
if(DEBUG) DoDebug("prc_factotum running, event: " + IntToString(nEvent));
// Get the PC. This is event-dependent
object oPC;
switch(nEvent)
{
case EVENT_ONPLAYERREST_FINISHED: oPC = GetLastBeingRested(); break;
case EVENT_ONCLIENTENTER: oPC = GetEnteringObject(); break;
default:
oPC = OBJECT_SELF;
}
int nClass = GetLevelByClass(CLASS_TYPE_FACTOTUM, oPC);
object oSkin = GetPCSkin(oPC);
object oArmour = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
int nArmour = GetBaseAC(oArmour);
int nBonus = GetAbilityModifier(ABILITY_INTELLIGENCE, oPC);
if (nClass >= 16 && 3 >= nArmour)
SetCompositeBonus(oSkin, "CunningDefense", nBonus, ITEM_PROPERTY_AC_BONUS);
else
SetCompositeBonus(oSkin, "CunningDefense", 0, ITEM_PROPERTY_AC_BONUS);
if (nClass >= 3)
{
SetCompositeBonus(oSkin, "BrainOverBrawn_H", nBonus, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
SetCompositeBonus(oSkin, "BrainOverBrawn_M", nBonus, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
SetCompositeBonus(oSkin, "BrainOverBrawn_O", nBonus, ITEM_PROPERTY_SKILL_BONUS, SKILL_OPEN_LOCK);
SetCompositeBonus(oSkin, "BrainOverBrawn_P", nBonus, ITEM_PROPERTY_SKILL_BONUS, SKILL_PICK_POCKET);
SetCompositeBonus(oSkin, "BrainOverBrawn_S", nBonus, ITEM_PROPERTY_SKILL_BONUS, SKILL_SET_TRAP);
SetCompositeBonus(oSkin, "BrainOverBrawn_T", nBonus, ITEM_PROPERTY_SKILL_BONUS, SKILL_TUMBLE);
SetCompositeBonus(oSkin, "BrainOverBrawn_R", nBonus, ITEM_PROPERTY_SKILL_BONUS, SKILL_RIDE);
SetCompositeBonus(oSkin, "BrainOverBrawn_J", nBonus, ITEM_PROPERTY_SKILL_BONUS, SKILL_JUMP);
SetCompositeBonus(oSkin, "BrainOverBrawn_B", nBonus, ITEM_PROPERTY_SKILL_BONUS, SKILL_BALANCE);
SetCompositeBonus(oSkin, "BrainOverBrawn_C", nBonus, ITEM_PROPERTY_SKILL_BONUS, SKILL_CLIMB);
}
// We aren't being called from any event, instead from EvalPRCFeats
if(nEvent == FALSE)
{
// Add eventhook to OnRestFinished to reset the used marker
AddEventScript(oPC, EVENT_ONPLAYERREST_FINISHED, "prc_factotum", FALSE, FALSE);
if (!GetLocalInt(oPC, "InspirationHBRunning")) DeleteLocalInt(oPC, "InspirationHB");
if (!GetLocalInt(oPC, "InspirationHB") && !GetLocalInt(oPC, "InspirationHBRunning"))
{
TriggerInspiration(oPC, FALSE);
SetLocalInt(oPC, "InspirationHB", TRUE);
}
}
else if(nEvent == EVENT_ONPLAYERREST_FINISHED && nClass >= 2)
{
AssignCommand(oPC, ClearAllActions(TRUE));
ClearFactotumSlots(oPC);
SetLocalInt(oPC, "FactotumArcDil", GetMaxArcDilSpellLevel(oPC));
StartDynamicConversation("prc_fact_splconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
}
}