public MapItem CreateItem(int itemID,string name,string description, string graphic, int value  
            ,bool equippable,int armourRating, int damageRating, string damageType,string category,string equippableLocation,
            int woundPotential, int stunAmount,bool stackable,int effect, int effectPower,bool isRanged)
        {
            InventoryItem item = null;

            if (effect == -1)
            {
                item = new InventoryItem();
            }
            else
            {
                item = new ConsumableItem();
            }

            item.Description = description;

            string chosenGraphic = String.Empty;

            //Does graphic contain multiple choices?
            if (graphic.Contains(","))
            {
                //yes, lets split it
                var graphics = graphic.Split(',');

                //use random to determine which one we want
                chosenGraphic = graphics[GameState.Random.Next(graphics.Length)];

                item.Graphic = SpriteManager.GetSprite((LocalSpriteName)Enum.Parse(typeof(LocalSpriteName), chosenGraphic));
            }
            else
            {
                //nope
                item.Graphic = SpriteManager.GetSprite((LocalSpriteName)Enum.Parse(typeof(LocalSpriteName), graphic));
            }

            item.InInventory = false;
            item.InternalName = name;
            item.IsEquippable = equippable;
            item.IsEquipped = false;
            item.MayContainItems = true;
            item.Name = name;
            item.Category = (InventoryCategory) Enum.Parse(typeof(InventoryCategory), category);
            item.BaseValue = value;
            item.ArmourRating = armourRating;
            item.DamageDice = damageRating;
            item.StunAmount = stunAmount;
            item.WoundPotential = woundPotential;
            item.WeaponType = damageType;
            item.Stackable = stackable;
            item.TotalAmount = 1;
            item.IsRanged = isRanged;

            if (effect != -1)
            {
                (item as ConsumableItem).Effects = (ConsumableEffect) effect;
                (item as ConsumableItem).EffectPower = effectPower;
            }

            if (!String.IsNullOrEmpty(equippableLocation))
            {
                item.EquippableLocation = (EquipmentLocation)Enum.Parse(typeof(EquipmentLocation), equippableLocation);
            }

            return item;
        }
        public bool HandleClick(int x, int y, Objects.Enums.MouseActionEnum mouseAction, out DRObjects.Enums.ActionType? actionType, out DRObjects.Enums.InternalActionEnum? internalActionType, out object[] args, out MapItem itm, out DRObjects.MapCoordinate coord, out bool destroy)
        {
            actionType = null;
            internalActionType = null;
            args = null;
            coord = null;
            destroy = false;
            itm = null;

            //Clicked on a context menu item?
            foreach (var contextMenu in contextMenuChoices)
            {
                if (contextMenu.Rect.Contains(x, y))
                {
                    //Yes. Perform the action
                    //this.selectedItem.PerformAction(contextMenu.Action, this.CurrentActor, contextMenu.Args);
                    actionType = contextMenu.Action;
                    args = contextMenu.Args;
                    itm = selectedItem;
                }
            }

            //remove the contextual menu
            this.contextMenu = new Rectangle(0, 0, 0, 0);
            contextMenuChoices = new List<ContextMenuItem>();
            selectedItem = null;

            for (int i=0; i < categories.Count; i++)
            {
                if (categories[i].Contains(x, y))
                {
                    //Change category!
                    this.ChosenCategory = i;

                    //remove the contextual menu
                    contextMenu = new Rectangle(0, 0, 0, 0);
                    contextMenuChoices = new List<ContextMenuItem>();
                    selectedItem = null;

                    //Handled. Naught else
                    return true;
                }
            }

            //Have we clicked on an item ?
            List<InventoryItemRectangle> allItemBoxes = new List<InventoryItemRectangle>();
            allItemBoxes.AddRange(row1Items);
            allItemBoxes.AddRange(row2Items);
            allItemBoxes.AddRange(row3Items);

            foreach (InventoryItemRectangle rect in allItemBoxes)
            {
                if (rect.Rect.Contains(x, y))
                {
                    //remove the contextual menu
                    contextMenu = new Rectangle(0, 0, 0, 0);
                    contextMenuChoices = new List<ContextMenuItem>();
                    selectedItem = null;

                    //Does it contain an item?
                    if (rect.Item != null)
                    {
                        //Yes - open contextual menu
                        contextMenu = new Rectangle(x+15, y+15, 0, 0);
                        selectedItem = rect.Item;

                        foreach (var action in rect.Item.GetPossibleActions(this.CurrentActor))
                        {
                            AddContextMenuItem(action, new object[0] { }, content);
                        }

                        //done
                        return true;
                    }
                    else
                    {
                        return true; //Empty box
                    }

                }
            }

            //Have we clicked on an equipped item?
            foreach (EquippedItemRectangle rect in equipmentRectangles)
            {
                if (rect.Rect.Contains(x, y))
                {
                    //remove the contextual menu
                    contextMenu = new Rectangle(0, 0, 0, 0);
                    contextMenuChoices = new List<ContextMenuItem>();
                    selectedItem = null;

                    //Does it contain an item?
                    if (rect.InventoryItem != null)
                    {
                        //Yes - open contextual menu
                        contextMenu = new Rectangle(x + 15, y + 15, 0, 0);
                        selectedItem = rect.InventoryItem;

                        foreach (var action in rect.InventoryItem.GetPossibleActions(this.CurrentActor))
                        {
                            AddContextMenuItem(action, new object[0] { }, content);
                        }

                        //done
                        return true;
                    }
                    else
                    {
                        return true; //Empty box
                    }
                }
            }

            return true;
        }
        /// <summary>
        /// Generates an animal actor, together with it's Map Character from it's parameters
        /// </summary>
        /// <returns></returns>
        public static Actor GenerateAnimal(AnimalData data)
        {
            //Load the race data
            data.RaceData = ActorGeneration.ReadRaceData(data.RaceID);

            Actor actor = new Actor();

            actor.Anatomy = ActorGeneration.GenerateAnatomy("human");
            actor.Attributes = new SkillsAndAttributes();
            actor.Attributes.Actor = actor;
            ActorGeneration.GenerateAttributes(data.RaceData.RaceName,ActorProfession.WARRIOR,GameState.Random.Next(data.MinLevel,data.MaxLevel),actor);

            actor.Attributes.Health = actor.Anatomy;
            actor.Attributes.HandToHand = GameState.Random.Next(data.MinLevel, data.MaxLevel);
            actor.Attributes.Evasion = GameState.Random.Next(data.MinLevel, data.MaxLevel);

            actor.EnemyData = new EnemyData();
            actor.EnemyData.EnemyLineOfSight = data.LineOfSight;
            actor.EnemyData.Intelligent = false;
            actor.EnemyData.Profession = ActorProfession.WARRIOR;
            actor.EnemyData.EnemyName = data.Name;

            actor.Gender = Gender.U;
            actor.Inventory = new ActorInventory();

            //Meat.
            if (data.MeatAmount > 0)
            {
                //Create some meat
                ConsumableItem meat = new ConsumableItem();
                meat.ArmourRating = 0;
                meat.BaseValue = 50;
                meat.Category = InventoryCategory.SUPPLY;
                meat.Description = "The meat of a " + data.Name;
                meat.EffectPower = 1;
                meat.Effects = ConsumableEffect.FEED;
                meat.Graphic = SpriteManager.GetSprite(LocalSpriteName.STEAK);
                meat.InternalName = "meat";
                meat.IsEquippable = false;
                meat.InInventory = true;
                meat.IsEquipped = false;
                meat.MayContainItems = true;
                meat.Name = data.Name + " meat";
                meat.Stackable = true;
                meat.TotalAmount = data.MeatAmount;

                actor.Inventory.Inventory.Add(meat.Category, meat);
            }

            //Hide
            if (data.HideAmount > 0)
            {
                //Create a hide
                InventoryItem hide = new InventoryItem();
                hide.ArmourRating = 0;
                hide.BaseValue = data.HideValue;
                hide.Category = InventoryCategory.LOOT;
                hide.Description = "The hide of a " + data.Name;
                hide.Graphic = SpriteManager.GetSprite(LocalSpriteName.HIDE);
                hide.InInventory = true;
                hide.InternalName = "hide";
                hide.IsEquippable = false;
                hide.IsEquipped = false;
                hide.MayContainItems = true;
                hide.Name = data.Name + " hide";
                hide.Stackable = true;
                hide.TotalAmount = data.HideAmount;

                actor.Inventory.Inventory.Add(hide.Category, hide);
            }

            actor.IsAggressive = data.IsAggressive;
            actor.IsAlive = true;
            actor.IsAnimal = true;
            actor.IsDomesticatedAnimal = data.Domesticated;
            actor.IsPlayerCharacter = false;
            actor.IsStunned = false;
            actor.Name = data.Name;
            actor.UnarmedDamageDice = data.DamageDice;
            actor.UniqueId = Guid.NewGuid();

            LocalCharacter lc = new LocalCharacter();
            lc.Actor = actor;
            lc.Description = data.Name;

            //Pick a graphic
            string graphic = data.GraphicsList[GameState.Random.Next(data.GraphicsList.Length)];

            lc.Graphic = (SpriteManager.GetSprite((LocalSpriteName) Enum.Parse(typeof(LocalSpriteName),graphic)));

            lc.InternalName = data.Name;
            lc.IsStunned = false;
            lc.LineOfSightRange = data.LineOfSight;
            lc.MayContainItems = false;
            lc.Name = data.Name;

            actor.MapCharacter = lc;

            return actor;
        }