#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());
}