public bool OnCast(Character caster, string args)
        {
            #region Determine number of pets. Return false if at or above MAX_PETS.
            if (!caster.IsImmortal)
            {
                int petCount = 0;

                foreach (NPC pet in caster.Pets)
                {
                    if (pet.QuestList.Count == 0)
                    {
                        petCount++;
                    }
                }

                if (petCount >= GameSpell.MAX_PETS)
                {
                    caster.WriteToDisplay("You do not possess the mental fortitude to summon an ally.");
                    return(false);
                }
            }
            #endregion

            args = args.Replace(ReferenceSpell.Command, "");
            args = args.Trim();
            string[] sArgs = args.Split(" ".ToCharArray());

            #region Determine Power
            int magicSkillLevel = Skills.GetSkillLevel(caster.magic);
            int power           = magicSkillLevel;

            if (sArgs.Length > 0)
            {
                try
                {
                    power = Convert.ToInt32(sArgs[0]);

                    if (power > magicSkillLevel && !caster.IsImmortal)
                    {
                        power = magicSkillLevel;
                    }
                }
                catch (Exception)
                {
                    power = magicSkillLevel;
                }
            }

            // Rangers get the spell at skill level 3, acts as skill level 1.
            if (!caster.IsImmortal && caster.BaseProfession != Character.ClassType.Druid)
            {
                power = power - 3;
            }

            if (power < 1)
            {
                power = 1;
            }
            #endregion

            List <Entity> availableEntities = new List <Entity>();

            foreach (Tuple <int, Entity, bool> tuple in AlliesAvailable)
            {
                if (tuple.Item1 > power)
                {
                    break;                      // Allies are in sequential power order.
                }
                if (tuple.Item1 <= power)
                {
                    // Not all allies can be summoned indoors.
                    if (caster.CurrentCell.IsOutdoors || (!caster.CurrentCell.IsOutdoors && !tuple.Item3))
                    {
                        availableEntities.Add(tuple.Item2);
                    }
                    else
                    {
                        continue;
                    }
                }
            }

            if (availableEntities.Count <= 0)
            {
                return(false);
            }

            Entity entity = availableEntities[Rules.Dice.Next(0, availableEntities.Count - 1)];

            Autonomy.EntityBuilding.EntityBuilder builder = new Autonomy.EntityBuilding.EntityBuilder();

            string profession = "fighter";

            // If human or humanoid, possibly switch to another profession besides fighter.
            if (Autonomy.EntityBuilding.EntityLists.IsHumanOrHumanoid(entity))
            {
                Character.ClassType[] availableProfessions = new Character.ClassType[] { Character.ClassType.Fighter, Character.ClassType.Thaumaturge, Character.ClassType.Wizard };

                Character.ClassType randomProfession = availableProfessions[Rules.Dice.Next(0, availableProfessions.Length - 1)];

                switch (randomProfession)
                {
                case Character.ClassType.Fighter:
                    profession = Autonomy.EntityBuilding.EntityBuilder.FIGHTER_SYNONYMS[Rules.Dice.Next(0, Autonomy.EntityBuilding.EntityBuilder.FIGHTER_SYNONYMS.Length - 1)];
                    break;

                case Character.ClassType.Thaumaturge:
                    profession = Autonomy.EntityBuilding.EntityBuilder.THAUMATURGE_SYNONYMS[Rules.Dice.Next(0, Autonomy.EntityBuilding.EntityBuilder.THAUMATURGE_SYNONYMS.Length - 1)];
                    break;

                case Character.ClassType.Wizard:
                    profession = Autonomy.EntityBuilding.EntityBuilder.WIZARD_SYNONYMS[Rules.Dice.Next(0, Autonomy.EntityBuilding.EntityBuilder.WIZARD_SYNONYMS.Length - 1)];
                    break;
                }
            }

            NPC ally = builder.BuildEntity("nature allied", entity, caster.Map.ZPlanes[caster.Z], profession);

            // Set level.
            ally.Level = Math.Max(caster.Level, magicSkillLevel) + Rules.Dice.Next(-1, 1); // magic skill should be set to higher skill if using impcast
            if (ally.Level <= 0)
            {
                ally.Level = 1;
            }

            builder.SetOnTheFlyVariables(ally);
            ally.Alignment = caster.Alignment;
            builder.SetName(ally, ally.BaseProfession.ToString());
            builder.SetDescriptions("", ally, caster.Map.ZPlanes[caster.Z], ally.BaseProfession.ToString().ToLower());
            Autonomy.EntityBuilding.EntityBuilder.SetGender(ally, caster.Map.ZPlanes[caster.Z]);
            Autonomy.EntityBuilding.EntityBuilder.SetVisualKey(ally.entity, ally);
            if (ally.spellDictionary.Count > 0)
            {
                ally.magic = Skills.GetSkillForLevel(ally.Level + Rules.Dice.Next(-1, 1));
            }
            GameSpell.FillSpellLists(ally);

            if (Autonomy.EntityBuilding.EntityLists.IsHumanOrHumanoid(ally))
            {
                List <int> armorToWear;

                if (power <= 13)
                {
                    armorToWear = Autonomy.ItemBuilding.ArmorSets.ArmorSet.ArmorSetDictionary[Autonomy.ItemBuilding.ArmorSets.ArmorSet.FULL_STUDDED_LEATHER].GetArmorList(ally);
                }
                else if (power < 16)
                {
                    armorToWear = Autonomy.ItemBuilding.ArmorSets.ArmorSet.ArmorSetDictionary[Autonomy.ItemBuilding.ArmorSets.ArmorSet.FULL_CHAINMAIL].GetArmorList(ally);
                }
                else
                {
                    armorToWear = Autonomy.ItemBuilding.ArmorSets.ArmorSet.ArmorSetDictionary[Autonomy.ItemBuilding.ArmorSets.ArmorSet.FULL_BANDED_MAIL].GetArmorList(ally);
                }

                foreach (int id in armorToWear)
                {
                    Item armor = Item.CopyItemFromDictionary(id);
                    // It's basic armor sets only. Label them as ethereal. (They will go back with the phantasm to their home plane. Given items drop.)
                    armor.special += " " + Item.EXTRAPLANAR;
                    ally.WearItem(armor);
                }
            }

            if (Autonomy.EntityBuilding.EntityLists.IsHumanOrHumanoid(ally) || Autonomy.EntityBuilding.EntityLists.ANIMALS_WIELDING_WEAPONS.Contains(ally.entity))
            {
                List <int> weaponsList = Autonomy.ItemBuilding.LootManager.GetBasicWeaponsFromArmory(ally, true);
                if (weaponsList.Count > 0)
                {
                    ally.EquipRightHand(Item.CopyItemFromDictionary(weaponsList[Rules.Dice.Next(weaponsList.Count - 1)]));
                }
                weaponsList = Autonomy.ItemBuilding.LootManager.GetBasicWeaponsFromArmory(ally, false);
                if (weaponsList.Count > 0)
                {
                    ally.EquipLeftHand(Item.CopyItemFromDictionary(weaponsList[Rules.Dice.Next(weaponsList.Count - 1)]));
                }

                if (ally.RightHand != null)
                {
                    ally.RightHand.special += " " + Item.EXTRAPLANAR;
                }
                if (ally.LeftHand != null)
                {
                    ally.LeftHand.special += " " + Item.EXTRAPLANAR;
                }
            }

            ally.Hits    = ally.HitsFull;
            ally.Mana    = ally.ManaFull;
            ally.Stamina = ally.StaminaFull;

            ally.Age     = GameWorld.World.AgeCycles[Rules.Dice.Next(0, GameWorld.World.AgeCycles.Count - 1)];
            ally.special = "despawn summonnaturesally";

            int twoMinutes = Utils.TimeSpanToRounds(new TimeSpan(0, 2, 0));
            // 18 minutes + 2 minutes for every skill level past 3
            ally.RoundsRemaining = (twoMinutes * 9) + ((magicSkillLevel - ReferenceSpell.RequiredLevel) * twoMinutes);
            //ally.species = Globals.eSpecies.Magical; // this may need to be changed for AI to work properly

            ally.canCommand = true;
            ally.IsMobile   = true;
            ally.IsSummoned = true;
            ally.IsUndead   = false;

            ally.FollowID = caster.UniqueID;

            ally.PetOwner = caster;
            caster.Pets.Add(ally);

            if (ally.CurrentCell != caster.CurrentCell)
            {
                ally.CurrentCell = caster.CurrentCell;
            }

            ReferenceSpell.SendGenericCastMessage(caster, null, true);

            ally.EmitSound(ally.idleSound);
            caster.WriteToDisplay((ally.longDesc.StartsWith("evil") ? "An " : "A ") + ally.longDesc + " answers your call for assistance.");
            ally.AddToWorld();
            return(true);
        }
Exemple #2
0
        public bool OnCast(Character caster, string args)
        {
            /*      Power   Mana    Type        Armor (item IDs)            Skill (base)    Spells
             *      1       20      phantasm    leather (8010, 15010)       7               none
             *      2       23      eidolon     chain (8015, 15015)         8               magic missile
             *      3       30      djinn       banded mail (8020, 15020)   9               ice storm
             *      4       32      salamander  sally scales (8102)         10              firewall
             *      5       35      efreet      steel (8021, 15021)         11              concussion
             *      6       40      marid       steel (8021, 15021)         12              icespear
             *      7       42      dao         steel (8021, 15021)         13              lightninglance
             */

            args = args.Replace(ReferenceSpell.Command, "");

            args = args.Trim();

            string[] sArgs = args.Split(" ".ToCharArray());

            #region Determine power.
            PhantasmPower power = PhantasmPower.Phantasm; // default power

            if (sArgs.Length > 0)
            {
                try
                {
                    power = (PhantasmPower)Convert.ToInt32(sArgs[0]);

                    if (power > PhantasmPower.Dao)
                    {
                        power = PhantasmPower.Dao;
                    }
                }
                catch (Exception)
                {
                    power = PhantasmPower.Phantasm;
                }
            }
            #endregion

            int magicSkillLevel = Skills.GetSkillLevel(caster.magic);
            if (caster.IsImmortal)
            {
                magicSkillLevel = 19;
            }

            #region Verify skill level for power of spell.
            if (!caster.IsImmortal)
            {
                if (magicSkillLevel < 19)
                {
                    if (magicSkillLevel < 19 && power == PhantasmPower.Dao)
                    {
                        caster.WriteToDisplay("You are not skilled enough yet to summon dao.");
                        return(true);
                    }

                    if (magicSkillLevel < 18 && power == PhantasmPower.Marid)
                    {
                        caster.WriteToDisplay("You are not skilled enough yet to summon marid.");
                        return(true);
                    }

                    if (magicSkillLevel < 17 && power == PhantasmPower.Efreet)
                    {
                        caster.WriteToDisplay("You are not skilled enough yet to summon efreeti.");
                        return(true);
                    }

                    if (magicSkillLevel < 15 && power == PhantasmPower.Salamander)
                    {
                        caster.WriteToDisplay("You are not skilled enough yet to summon salamanders.");
                        return(true);
                    }

                    if (magicSkillLevel < 13 && power == PhantasmPower.Djinn)
                    {
                        caster.WriteToDisplay("You are not skilled enough yet to summon djinn.");
                        return(true);
                    }

                    if (magicSkillLevel < 12 && power == PhantasmPower.Eidolon)
                    {
                        caster.WriteToDisplay("You are not skilled enough yet to summon eidolon.");
                        return(true);
                    }
                }
            }
            #endregion

            #region Determine number of pets. Return false if at or above MAX_PETS.
            int petCount = 0;

            foreach (NPC pet in caster.Pets)
            {
                if (pet.QuestList.Count == 0)
                {
                    petCount++;
                }
            }

            // TODO: item or skill/talent to summon more pets
            if (!caster.IsImmortal && petCount >= GameSpell.MAX_PETS)
            {
                caster.WriteToDisplay("You do not possess the mental fortitude to control another pet.");
                return(false);
            }
            #endregion

            #region Setup the summoned spirit.
            int        npcID       = 902;
            List <int> armorToWear = new List <int>();

            Autonomy.EntityBuilding.EntityLists.Entity entity = Autonomy.EntityBuilding.EntityLists.Entity.None;

            switch (power)
            {
            case PhantasmPower.Phantasm:     // phantasm with leather
                if (caster.Mana < ReferenceSpell.ManaCost)
                {
                    return(false);
                }
                entity = Autonomy.EntityBuilding.EntityLists.Entity.Phantasm;
                break;

            case PhantasmPower.Eidolon:     // eidolon with chain
                if (caster.Mana < ReferenceSpell.ManaCost + 3)
                {
                    caster.Mana -= 3;
                    return(false);
                }
                entity       = Autonomy.EntityBuilding.EntityLists.Entity.Eidolon;
                caster.Mana -= 5;
                break;

            case PhantasmPower.Djinn:     // djinn with banded mail
                if (caster.Mana < ReferenceSpell.ManaCost + 10)
                {
                    caster.Mana -= 10;
                    return(false);
                }
                caster.Mana -= 10;
                npcID        = 903; // djinn with banded mail and icestorm
                entity       = Autonomy.EntityBuilding.EntityLists.Entity.Djinn;
                break;

            case PhantasmPower.Salamander:     // salamander
                if (caster.Mana < ReferenceSpell.ManaCost + 12)
                {
                    caster.Mana -= 12;
                    return(false);
                }
                caster.Mana -= 12;
                npcID        = 37; // salamander with scales and firewall
                entity       = Autonomy.EntityBuilding.EntityLists.Entity.Salamander;
                break;

            case PhantasmPower.Efreet:     // efreet with plate
                if (caster.Mana < ReferenceSpell.ManaCost + 15)
                {
                    caster.Mana -= 15;
                    return(false);
                }
                caster.Mana -= 15;
                npcID        = 904; // efreet with steel plate and concussion
                entity       = Autonomy.EntityBuilding.EntityLists.Entity.Efreet;
                break;

            case PhantasmPower.Marid:     // efreet with plate
                if (caster.Mana < ReferenceSpell.ManaCost + 20)
                {
                    caster.Mana -= 20;
                    return(false);
                }
                caster.Mana -= 20;
                npcID        = 904; // marid with steel plate and icespear
                entity       = Autonomy.EntityBuilding.EntityLists.Entity.Marid;
                break;

            case PhantasmPower.Dao:     // efreet with plate
                if (caster.Mana < ReferenceSpell.ManaCost + 23)
                {
                    caster.Mana -= 23;
                    return(false);
                }
                caster.Mana -= 23;
                npcID        = 904; // dao with steel plate and lightninglance
                entity       = Autonomy.EntityBuilding.EntityLists.Entity.Dao;
                break;

            default:
                break;
            }

            // Create the summoned spirit.
            NPC phantasm = NPC.LoadNPC(npcID, caster.FacetID, caster.LandID, caster.MapID, caster.X, caster.Y, caster.Z, -1);

            foreach (Item wornItem in new List <Item>(phantasm.wearing))
            {
                phantasm.RemoveWornItem(wornItem);
            }

            phantasm.wearing.Clear();

            Autonomy.EntityBuilding.EntityBuilder builder = new Autonomy.EntityBuilding.EntityBuilder();

            phantasm.Level = caster.Level + (int)power;

            phantasm.entity = entity;
            builder.SetOnTheFlyVariables(phantasm);
            builder.SetName(phantasm, phantasm.BaseProfession.ToString());
            builder.SetDescriptions("", phantasm, caster.Map.ZPlanes[caster.Z], phantasm.BaseProfession.ToString().ToLower());
            Autonomy.EntityBuilding.EntityBuilder.SetVisualKey(phantasm.entity, phantasm);

            /*      Power   Mana    Type        Armor (item IDs)            Skill (base)    Spells
             *      1       20      phantasm    leather (8010, 15010)       7               none
             *      2       23      eidolon     chain (8015, 15015)         8               magic missile
             *      3       30      djinn       banded mail (8020, 15020)   9               ice storm
             *      4       32      salamander  sally scales (8102)         10              firewall
             *      5       35      efreet      steel (8021, 15021)         11              concussion
             *      6       40      marid       steel (8021, 15021)         12              icespear
             *      7       43      dao         steel (8021, 15021)         13              lightninglance
             */

            // basic phantasm
            if (power <= PhantasmPower.Phantasm)
            {
                phantasm.HitsMax += (int)power * 100;
                phantasm.ManaMax  = 0;
                phantasm.castMode = NPC.CastMode.Never;
                phantasm.magic    = 0;
            }
            else
            {
                phantasm.ManaMax  = (int)power * (3 + Rules.RollD(1, 6));
                phantasm.castMode = NPC.CastMode.NoPrep;
                phantasm.magic    = Skills.GetSkillForLevel(((int)power * 2) + Rules.RollD(1, 3));
                phantasm.spellDictionary.Clear();

                switch (power)
                {
                case PhantasmPower.Eidolon:     // eidolon with magic missile
                    if (!phantasm.spellDictionary.ContainsKey((int)GameSpell.GameSpellID.Magic_Missile))
                    {
                        phantasm.spellDictionary.Add((int)GameSpell.GameSpellID.Magic_Missile, GameSpell.GenerateMagicWords());
                    }
                    break;

                case PhantasmPower.Djinn:     // djinn with icestorm
                    if (!phantasm.spellDictionary.ContainsKey((int)GameSpell.GameSpellID.Icestorm))
                    {
                        phantasm.spellDictionary.Add((int)GameSpell.GameSpellID.Icestorm, GameSpell.GenerateMagicWords());
                    }
                    // talents
                    if (!phantasm.talentsDictionary.ContainsKey(Talents.GameTalent.TALENTS.DualWield.ToString().ToLower()))
                    {
                        phantasm.talentsDictionary.Add(Talents.GameTalent.GetTalent(Talents.GameTalent.TALENTS.DualWield).Command, DateTime.UtcNow);
                    }
                    break;

                case PhantasmPower.Salamander:     // salamander with firewall and firebolt
                    if (!phantasm.spellDictionary.ContainsKey((int)GameSpell.GameSpellID.Firewall))
                    {
                        phantasm.spellDictionary.Add((int)GameSpell.GameSpellID.Firewall, GameSpell.GenerateMagicWords());
                    }
                    if (!phantasm.spellDictionary.ContainsKey((int)GameSpell.GameSpellID.Firebolt))
                    {
                        phantasm.spellDictionary.Add((int)GameSpell.GameSpellID.Firebolt, GameSpell.GenerateMagicWords());
                    }
                    // talent
                    if (!phantasm.talentsDictionary.ContainsKey(Talents.GameTalent.TALENTS.DoubleAttack.ToString().ToLower()))
                    {
                        phantasm.talentsDictionary.Add(Talents.GameTalent.GetTalent(Talents.GameTalent.TALENTS.DoubleAttack).Command, DateTime.UtcNow);
                    }
                    break;

                case PhantasmPower.Efreet:     // efreet with concussion
                    if (!phantasm.spellDictionary.ContainsKey((int)GameSpell.GameSpellID.Concussion))
                    {
                        phantasm.spellDictionary.Add((int)GameSpell.GameSpellID.Concussion, GameSpell.GenerateMagicWords());
                    }
                    // talents
                    if (!phantasm.talentsDictionary.ContainsKey(Talents.GameTalent.TALENTS.DualWield.ToString().ToLower()))
                    {
                        phantasm.talentsDictionary.Add(Talents.GameTalent.GetTalent(Talents.GameTalent.TALENTS.DualWield).Command, DateTime.UtcNow);
                    }
                    if (!phantasm.talentsDictionary.ContainsKey(Talents.GameTalent.TALENTS.DoubleAttack.ToString().ToLower()))
                    {
                        phantasm.talentsDictionary.Add(Talents.GameTalent.GetTalent(Talents.GameTalent.TALENTS.DoubleAttack).Command, DateTime.UtcNow);
                    }
                    break;

                case PhantasmPower.Marid:
                    if (!phantasm.spellDictionary.ContainsKey((int)GameSpell.GameSpellID.Icespear))
                    {
                        phantasm.spellDictionary.Add((int)GameSpell.GameSpellID.Icespear, GameSpell.GenerateMagicWords());
                    }
                    // talents
                    if (!phantasm.talentsDictionary.ContainsKey(Talents.GameTalent.TALENTS.DualWield.ToString().ToLower()))
                    {
                        phantasm.talentsDictionary.Add(Talents.GameTalent.GetTalent(Talents.GameTalent.TALENTS.DualWield).Command, DateTime.UtcNow);
                    }
                    if (!phantasm.talentsDictionary.ContainsKey(Talents.GameTalent.TALENTS.DoubleAttack.ToString().ToLower()))
                    {
                        phantasm.talentsDictionary.Add(Talents.GameTalent.GetTalent(Talents.GameTalent.TALENTS.DoubleAttack).Command, DateTime.UtcNow);
                    }
                    break;

                case PhantasmPower.Dao:
                    // lightning lance
                    if (!phantasm.spellDictionary.ContainsKey((int)GameSpell.GameSpellID.Lightning_Lance))
                    {
                        phantasm.spellDictionary.Add((int)GameSpell.GameSpellID.Lightning_Lance, GameSpell.GenerateMagicWords());
                    }
                    // talents (dual wield, double attack, riposte)
                    if (!phantasm.talentsDictionary.ContainsKey(Talents.GameTalent.TALENTS.DualWield.ToString().ToLower()))
                    {
                        phantasm.talentsDictionary.Add(Talents.GameTalent.GetTalent(Talents.GameTalent.TALENTS.DualWield).Command, DateTime.UtcNow);
                    }
                    if (!phantasm.talentsDictionary.ContainsKey(Talents.GameTalent.TALENTS.DoubleAttack.ToString().ToLower()))
                    {
                        phantasm.talentsDictionary.Add(Talents.GameTalent.GetTalent(Talents.GameTalent.TALENTS.DoubleAttack).Command, DateTime.UtcNow);
                    }
                    if (!phantasm.talentsDictionary.ContainsKey(Talents.GameTalent.TALENTS.Riposte.ToString().ToLower()))
                    {
                        phantasm.talentsDictionary.Add(Talents.GameTalent.GetTalent(Talents.GameTalent.TALENTS.Riposte).Command, DateTime.UtcNow);
                    }
                    break;

                default:
                    phantasm.spellDictionary.Clear();
                    break;
                }
            }

            // Armor sets.

            switch (power)
            {
            case PhantasmPower.Phantasm:     // phantasm with leather
                armorToWear = ArmorSet.ArmorSetDictionary[ArmorSet.BASIC_LEATHER].GetArmorList(phantasm);
                break;

            case PhantasmPower.Eidolon:     // eidolon with chain
                armorToWear = ArmorSet.ArmorSetDictionary[ArmorSet.BASIC_CHAINMAIL].GetArmorList(phantasm);
                break;

            case PhantasmPower.Djinn:     // djinn with banded mail
                armorToWear = ArmorSet.ArmorSetDictionary[ArmorSet.BASIC_BANDED_MAIL].GetArmorList(phantasm);
                break;

            case PhantasmPower.Salamander:     // salamander
                armorToWear.Add(Item.ID_FIRE_SALAMANDER_SCALE_VEST);
                break;

            case PhantasmPower.Efreet:     // efreet with plate
            case PhantasmPower.Marid:
            case PhantasmPower.Dao:
                armorToWear = ArmorSet.ArmorSetDictionary[ArmorSet.BASIC_STEEL].GetArmorList(phantasm);
                break;

            default:
                break;
            }

            // Wear armor.
            foreach (int id in armorToWear)
            {
                Item armor = Item.CopyItemFromDictionary(id);
                // It's basic armor sets only. Label them as ethereal. (They will go back with the phantasm to their home plane. Given items drop.)
                armor.special += " " + Item.EXTRAPLANAR;
                phantasm.WearItem(armor);
            }

            if (phantasm.RightHand != null)
            {
                phantasm.RightHand.special += " " + Item.EXTRAPLANAR;
            }
            if (phantasm.LeftHand != null)
            {
                phantasm.LeftHand.special += " " + Item.EXTRAPLANAR;
            }

            GameSpell.FillSpellLists(phantasm);

            phantasm.Hits    = phantasm.HitsFull;
            phantasm.Mana    = phantasm.ManaFull;
            phantasm.Stamina = phantasm.StaminaFull;

            //phantasm.Alignment = (Globals.eAlignment)Enum.Parse(typeof(Globals.eAlignment), caster.Alignment.ToString());
            phantasm.Alignment = caster.Alignment;
            phantasm.Age       = 0;
            phantasm.special   = "despawn";

            int fiveMinutes = Utils.TimeSpanToRounds(new TimeSpan(0, 5, 0));
            // 30 minutes + 5 minutes for every skill level past 11 minus 5 minutes for every power of the spell beyond 1.
            phantasm.RoundsRemaining = (fiveMinutes * 6) + ((magicSkillLevel - ReferenceSpell.RequiredLevel) * fiveMinutes) - (((int)power - 1) * fiveMinutes);
            phantasm.species         = Globals.eSpecies.Magical; // this may need to be changed for AI to work properly

            phantasm.canCommand = true;
            phantasm.IsMobile   = true;
            phantasm.IsSummoned = true;
            phantasm.IsUndead   = false;

            phantasm.FollowID = caster.UniqueID;

            phantasm.PetOwner = caster;
            caster.Pets.Add(phantasm);
            #endregion

            if (phantasm.CurrentCell != caster.CurrentCell)
            {
                phantasm.CurrentCell = caster.CurrentCell;
            }

            phantasm.EmitSound(phantasm.idleSound);

            phantasm.AddToWorld();

            return(true);
        }