Further file organization
Further file organization
This commit is contained in:
94
nwn/nwnprc/trunk/scripts/prc_ef_foe.nss
Normal file
94
nwn/nwnprc/trunk/scripts/prc_ef_foe.nss
Normal file
@@ -0,0 +1,94 @@
|
||||
#include "prc_inc_stunfist"
|
||||
#include "prc_inc_combat"
|
||||
|
||||
void AddHooks(object oItem)
|
||||
{
|
||||
if(GetBaseItemType(oItem) == BASE_ITEM_KAMA || GetIsPRCCreatureWeapon(oItem))
|
||||
{
|
||||
RemoveEventScript(oItem, EVENT_ITEM_ONHIT, "prc_ef_foe", TRUE, FALSE);
|
||||
// Add eventhook to the item
|
||||
AddEventScript(oItem, EVENT_ITEM_ONHIT, "prc_ef_foe", TRUE, FALSE);
|
||||
|
||||
// Add the OnHitCastSpell: Unique needed to trigger the event
|
||||
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), RoundsToSeconds(1), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
object oPC = OBJECT_SELF;
|
||||
int nEvent = GetRunningEvent();
|
||||
|
||||
// We arent being called from onhit event, instead from spell script, so activate spell and hooks
|
||||
if(nEvent == FALSE)
|
||||
{
|
||||
if(!GetHasMonkWeaponEquipped(oPC))
|
||||
return;
|
||||
|
||||
if(GetHasSpellEffect(SPELL_EF_FIST_OF_ENERGY_FIRE, oPC))
|
||||
return;
|
||||
if(GetHasSpellEffect(SPELL_EF_FIST_OF_ENERGY_ELECTRICITY, oPC))
|
||||
return;
|
||||
|
||||
if(!ExpendStunfistUses(oPC, 1))
|
||||
return;
|
||||
|
||||
int eDmgType;
|
||||
int nSpellID = GetSpellId();
|
||||
switch (nSpellID)
|
||||
{
|
||||
case SPELL_EF_FIST_OF_ENERGY_FIRE : eDmgType = DAMAGE_TYPE_FIRE; break;
|
||||
case SPELL_EF_FIST_OF_ENERGY_ELECTRICITY: eDmgType = DAMAGE_TYPE_ELECTRICAL; break;
|
||||
default: if(DEBUG) DoDebug("Unrecognized SpellID: " + IntToString(nSpellID), oPC);
|
||||
}
|
||||
|
||||
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_1d6, eDmgType);
|
||||
eDmg = EffectLinkEffects(eDmg, EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
||||
eDmg = SupernaturalEffect(eDmg);
|
||||
|
||||
effect eVFX = EffectVisualEffect(VFX_IMP_HOLY_AID);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDmg, oPC, RoundsToSeconds(1));
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oPC);
|
||||
|
||||
if(GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST,oPC) >= 6)
|
||||
{
|
||||
// setup hooks
|
||||
AddHooks(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC));
|
||||
AddHooks(GetItemInSlot(INVENTORY_SLOT_LEFTHAND , oPC));
|
||||
AddHooks(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC));
|
||||
AddHooks(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC));
|
||||
}
|
||||
}
|
||||
else if(nEvent == EVENT_ITEM_ONHIT)
|
||||
{
|
||||
object oItem = GetSpellCastItem();
|
||||
int eDmgType;
|
||||
|
||||
if (GetHasSpellEffect(SPELL_EF_FIST_OF_ENERGY_FIRE, oPC)) {
|
||||
eDmgType = DAMAGE_TYPE_FIRE;
|
||||
} else if (GetHasSpellEffect(SPELL_EF_FIST_OF_ENERGY_ELECTRICITY, oPC)) {
|
||||
eDmgType = DAMAGE_TYPE_ELECTRICAL;
|
||||
} else {
|
||||
// undo hooks
|
||||
RemoveEventScript(oItem, EVENT_ITEM_ONHIT, "prc_ef_foe", TRUE, FALSE);
|
||||
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", 1, DURATION_TYPE_TEMPORARY);
|
||||
return;
|
||||
}
|
||||
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
|
||||
// GetBaseItemType(oWeapR) == BASE_ITEM_KAMA
|
||||
int nThreat = 20; // todo, take into account WM with kama, and other(?) crit modifiers
|
||||
int iDiceCritical = 1; // todo, take into account WM with kama, and other(?) crit modifier
|
||||
|
||||
int dice = d20();
|
||||
|
||||
if (dice >= nThreat)
|
||||
{
|
||||
FloatingTextStringOnCreature("Critical Hit", oPC);
|
||||
int nDamage = d10(iDiceCritical);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(nDamage, eDmgType), oTarget);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user