PRC8/nwn/nwnprc/trunk/scripts/prc_ad_flurry.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

152 lines
4.4 KiB
Plaintext

#include "prc_inc_clsfunc"
void CleanCopy(object oImage)
{
SetLootable(oImage, FALSE);
object oItem = GetFirstItemInInventory(oImage);
while(GetIsObjectValid(oItem))
{
SetDroppableFlag(oItem, FALSE);
SetItemCursedFlag(oItem, TRUE);
oItem = GetNextItemInInventory(oImage);
}
int i;
for(i=0;i<NUM_INVENTORY_SLOTS;i++)//equipment
{
oItem = GetItemInSlot(i, oImage);
SetDroppableFlag(oItem, FALSE);
SetItemCursedFlag(oItem, TRUE);
}
TakeGoldFromCreature(GetGold(oImage), oImage, TRUE);
}
void CleanAllCopies()
{
string sImage1 = "PC_IMAGE"+ObjectToString(OBJECT_SELF)+"mirror";
string sImage2 = "PC_IMAGE"+ObjectToString(OBJECT_SELF)+"flurry";
object oCreature = GetFirstObjectInArea(GetArea(OBJECT_SELF));
while (GetIsObjectValid(oCreature))
{
if(GetTag(oCreature) == sImage1 || GetTag(oCreature) == sImage2)
{
CleanCopy(oCreature);
}
oCreature = GetNextObjectInArea(GetArea(OBJECT_SELF));;
}
}
void RemoveExtraImages()
{
string sImage1 = "PC_IMAGE"+ObjectToString(OBJECT_SELF)+"mirror";
string sImage2 = "PC_IMAGE"+ObjectToString(OBJECT_SELF)+"flurry";
object oCreature = GetFirstObjectInArea(GetArea(OBJECT_SELF));
while (GetIsObjectValid(oCreature))
{
if(GetTag(oCreature) == sImage1 || GetTag(oCreature) == sImage2)
{
DestroyObject(oCreature, 0.0);
}
oCreature = GetNextObjectInArea(GetArea(OBJECT_SELF));;
}
}
void main2()
{
object oTarget = PRCGetSpellTargetObject();
int iLevel = GetLevelByClass(CLASS_TYPE_ARCANE_DUELIST, OBJECT_SELF);
int iAdd = iLevel/3;
int iImages = d4(1) + 3;
PRCRemoveEffectsFromSpell(OBJECT_SELF, GetSpellId());
SetLocalObject(OBJECT_SELF, "FLURRY_TARGET", oTarget);
FlurryEffects(OBJECT_SELF);
string sImage = "PC_IMAGE"+ObjectToString(OBJECT_SELF)+"flurry";
effect eImage = EffectCutsceneGhost();
eImage = SupernaturalEffect(eImage);
effect eNoSpell = EffectSpellFailure(100);
eNoSpell = SupernaturalEffect(eNoSpell);
int iPlus;
for (iPlus = 0; iPlus < iImages; iPlus++)
{
object oImage = CopyObject(OBJECT_SELF, GetLocation(OBJECT_SELF), OBJECT_INVALID, sImage);
AssignCommand(oImage, ActionAttack(oTarget, FALSE));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImage, oImage);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eNoSpell, oImage);
ChangeToStandardFaction(oImage, STANDARD_FACTION_DEFENDER);
SetIsTemporaryFriend(OBJECT_SELF, oImage, FALSE);
DestroyObject(oImage, iLevel * 60.0); // they dissapear after one minute per level.
}
CleanAllCopies();
object oCreature = GetFirstObjectInArea(GetArea(OBJECT_SELF));
while (GetIsObjectValid(oCreature))
{
if(GetTag(oCreature) == sImage)
{
DelayCommand(3.0, SPMakeAttack(oTarget, oCreature));
}
oCreature = GetNextObjectInArea(GetArea(OBJECT_SELF));;
}
}
void main()
{
// First we'll see if this target is in the flurry list.
int i;
string sName1 = "FLURRY_TARGET_";
object oTarget = PRCGetSpellTargetObject();
for (i = 0 ; i < 10 ; i++)
{
string sName2 = sName1 + IntToString(i);
if (GetLocalObject(OBJECT_SELF, sName2) == oTarget)
{
IncrementRemainingFeatUses(OBJECT_SELF, 3534); // Flurry of Swords
FloatingTextStringOnCreature("This target has already been selected today.", OBJECT_SELF, FALSE);
return;
}
}
if (oTarget == OBJECT_SELF)
{
IncrementRemainingFeatUses(OBJECT_SELF, 3534); // Flurry of Swords
FloatingTextStringOnCreature("You may not target yourself.", OBJECT_SELF, FALSE);
return;
}
if (!GetIsReactionTypeHostile(oTarget))
{
IncrementRemainingFeatUses(OBJECT_SELF, 3534); // Flurry of Swords
FloatingTextStringOnCreature("You must target an enemy.", OBJECT_SELF, FALSE);
return;
}
// If it's not on the flurry list, add it to the list
int iTargets = GetLocalInt(OBJECT_SELF, "FLURRY_TARGET_NUMBER");
sName1 = "FLURRY_TARGET_" + IntToString(iTargets);
SetLocalInt(OBJECT_SELF, "FLURRY_TARGET_NUMBER", iTargets + 1);
SetLocalObject(OBJECT_SELF, sName1, oTarget);
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), TRUE));
// Continue on...
DelayCommand(0.0, RemoveExtraImages());
DelayCommand(0.5, main2());
}