Further file organization
Further file organization
This commit is contained in:
142
nwn/nwnprc/trunk/scripts/prc_assn_da_hb.nss
Normal file
142
nwn/nwnprc/trunk/scripts/prc_assn_da_hb.nss
Normal file
@@ -0,0 +1,142 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: 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;
|
||||
}
|
Reference in New Issue
Block a user