forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
142 lines
5.5 KiB
Plaintext
142 lines
5.5 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Name Assassin Death Attack heartbeat
|
|
//:: FileName prc_assn_da_hb
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Shane Hennessy
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
// Death Attack for the assassin
|
|
// this function counts down till they get to perform the DA
|
|
// and then adds the slaytarget type property to their weapon
|
|
|
|
#include "NW_I0_GENERIC"
|
|
#include "bnd_inc_bndfunc"
|
|
|
|
void main()
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
|
|
// Currently from the PnP rules they dont have to wait except for the study time
|
|
// So this fWaitTime is not being used at all
|
|
// Are we still counting down before they can do another DA?
|
|
float fWaitTime = GetLocalFloat(oPC,"PRC_ASSN_DEATHATTACK_WAITSEC");
|
|
if (fWaitTime > 0.0)
|
|
{
|
|
// The wait is over they can do another DA
|
|
DeleteLocalFloat(oPC,"PRC_ASSN_DEATHATTACK_WAITSEC");
|
|
return;
|
|
}
|
|
if (!GetTotalSneakAttackDice(oPC) && !GetHasSpellEffect(VESTIGE_MARCHOSIAS, oPC))
|
|
{
|
|
FloatingTextStringOnCreature("You have no sneak attack dice, you can not perform a death attack!", oPC, FALSE);
|
|
DeleteLocalFloat(oPC,"PRC_ASSN_DEATHATTACK_APPLY");
|
|
return;
|
|
}
|
|
|
|
// We must be counting down until we can apply the slay property
|
|
// Assasain must not be seen
|
|
/* if (!((GetStealthMode(oPC) == STEALTH_MODE_ACTIVATED) ||
|
|
(PRCGetHasEffect(EFFECT_TYPE_INVISIBILITY,oPC)) ||
|
|
!(GetIsInCombat(oPC)) ||
|
|
(PRCGetHasEffect(EFFECT_TYPE_SANCTUARY,oPC))))*/
|
|
// Using the CanSeePlayer function on the target
|
|
if (GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, GetLocalObject(oPC, "PRC_DA_TARGET"), 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)))
|
|
{
|
|
FloatingTextStringOnCreature("Your target is aware of you, you can not perform a death attack", oPC);
|
|
DeleteLocalFloat(oPC,"PRC_ASSN_DEATHATTACK_APPLY");
|
|
return;
|
|
}
|
|
float fApplyDATime = GetLocalFloat(oPC,"PRC_ASSN_DEATHATTACK_APPLY");
|
|
// We run every 6 seconds
|
|
fApplyDATime -= 6.0;
|
|
SetLocalFloat(oPC,"PRC_ASSN_DEATHATTACK_APPLY",fApplyDATime );
|
|
|
|
// Times up, apply the slay to their primary weapon
|
|
if (fApplyDATime <= 0.0)
|
|
{
|
|
object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
|
int nWeaponType = GetBaseItemType(oWeapon);
|
|
|
|
if(nWeaponType == BASE_ITEM_SHORTBOW
|
|
|| nWeaponType == BASE_ITEM_LONGBOW
|
|
|| nWeaponType == BASE_ITEM_LIGHTCROSSBOW
|
|
|| nWeaponType == BASE_ITEM_HEAVYCROSSBOW
|
|
|| nWeaponType == BASE_ITEM_SLING)
|
|
{
|
|
if(GetLevelByClass(CLASS_TYPE_JUSTICEWW, oPC) < 10)
|
|
{
|
|
SendMessageToPC(oPC, "You cannot use a ranged death attack.");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if(nWeaponType == BASE_ITEM_INVALID)
|
|
{
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_ARMS);
|
|
}
|
|
|
|
// if we got something add the on hit slay racial type property to it
|
|
// for 3 rounds
|
|
int nSaveDC = 10 + GetLevelByClass(CLASS_TYPE_BFZ, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_ASSASSIN, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_SHADOWLORD, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_CULTIST_SHATTERED_PEAK, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_JUSTICEWW, oPC)
|
|
+ GetAbilityModifier(ABILITY_INTELLIGENCE, oPC);
|
|
int nMarruDC = 10 + (GetHitDice(oPC)/2) + GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
|
|
if (GetRacialType(oPC) == RACIAL_TYPE_MARRULURK) nSaveDC = nMarruDC;
|
|
if (GetHasSpellEffect(VESTIGE_MARCHOSIAS, oPC)) nSaveDC = GetBinderDC(oPC, VESTIGE_MARCHOSIAS);
|
|
|
|
// Saves are capped at 70
|
|
if (nSaveDC > 70)
|
|
nSaveDC = 70;
|
|
int nRace = GetLocalInt(oPC,"PRC_ASSN_TARGET_RACE");
|
|
itemproperty ipSlay = ItemPropertyOnHitProps(IP_CONST_ONHIT_SLAYRACE,nSaveDC,nRace);
|
|
|
|
if(GetWeaponRanged(oWeapon))
|
|
{
|
|
object oAmmo;
|
|
if(nWeaponType == BASE_ITEM_LONGBOW
|
|
|| nWeaponType == BASE_ITEM_SHORTBOW)
|
|
{
|
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_ARROWS);
|
|
}
|
|
else if(nWeaponType == BASE_ITEM_SLING)
|
|
{
|
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_BULLETS);
|
|
}
|
|
else if(nWeaponType == BASE_ITEM_LIGHTCROSSBOW
|
|
|| nWeaponType == BASE_ITEM_HEAVYCROSSBOW)
|
|
{
|
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_BOLTS);
|
|
}
|
|
IPSafeAddItemProperty(oAmmo, ipSlay, 7.0);
|
|
SendMessageToPC(oPC,"Death Attack ready, you have 1 round to slay your target");
|
|
return;
|
|
}
|
|
else if (GetIsObjectValid(oWeapon))
|
|
{
|
|
IPSafeAddItemProperty(oWeapon, ipSlay, 7.0);
|
|
SendMessageToPC(oPC,"Death Attack ready, you have 1 round to slay your target");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
FloatingTextStringOnCreature("You do not have a proper melee weapon for the death attack", oPC);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SendMessageToPC(oPC,"Your are still studying your target wait "+IntToString(FloatToInt(fApplyDATime))+ " seconds before you can perform the death attack");
|
|
// Run more heartbeats
|
|
DelayCommand(6.0,ExecuteScript("prc_assn_da_hb", oPC));
|
|
}
|
|
return;
|
|
} |