248549595, 310686993, 388358742, 485448428, 606810535, 758513168, 948141460, 1185176826, 1481471032, 1851838791}; //times 1.25

        #endregion Fields

        #region Methods

        public static void activate(Monster monster, int x, int y, Region region, Quinoa quinoa)
        {
            if(TerrainManager.hasParameter(region.getTerrain(x, y), TerrainParameter.HAS_DOOR))
            {
                DoorCode doorCode = (DoorCode)Enum.Parse(typeof(DoorCode), (TerrainManager.getParameter(region.getTerrain(x, y), TerrainParameter.HAS_DOOR)));
                if(doorCode == DoorCode.CLOSED)
                {
                    region.getTerrain(x, y).getParameters().Add(TerrainParameter.HAS_DOOR, EnumUtil.EnumName<DoorCode>(DoorCode.OPEN));

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("The door opens.");
                    }
                }
                else if(doorCode == DoorCode.OPEN)
                {
                    region.getTerrain(x, y).getParameters().Add(TerrainParameter.HAS_DOOR, EnumUtil.EnumName<DoorCode>(DoorCode.CLOSED));

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("The door closes.");
                    }
                }
            }
            else if(TerrainManager.hasParameter(region.getTerrain(x, y), TerrainParameter.HAS_FLOODGATE))
            {
                DoorCode doorCode = (DoorCode)Enum.Parse(typeof(DoorCode), (TerrainManager.getParameter(region.getTerrain(x, y), TerrainParameter.HAS_FLOODGATE)));
                if(doorCode == DoorCode.CLOSED)
                {
                    region.getTerrain(x, y).getParameters().Add(TerrainParameter.HAS_FLOODGATE, EnumUtil.EnumName<DoorCode>(DoorCode.OPEN));

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("The floodgate opens.");
                    }
                }
                else if(doorCode == DoorCode.OPEN)
                {
                    region.getTerrain(x, y).getParameters().Add(TerrainParameter.HAS_FLOODGATE, EnumUtil.EnumName<DoorCode>(DoorCode.CLOSED));

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("The floodgate closes.");
                    }
                }
            }
            else
            {
                if(isPlayer(monster))
                {
                    quinoa.getMessageManager().addMessage("Nothing to do there.");
                }
            }
        }
        public static void monsterKilled(Monster killer, Monster victim, Quinoa quinoa)
        {
            String playerFeedback="The " + EnumUtil.EnumName<MonsterCode>(victim.monsterCode) + " is gone.";

            //Give experience
            MonsterActionManager.giveExperience(killer, victim.stats.getExperienceGiven(), quinoa);

            //Drop items
            foreach(Item tempItem in victim.inventory.getItems())
            {
                Item newItem = (Item)tempItem.CopyObject();
                newItem.setPosition(victim.x, victim.y);
                newItem.itemState = ItemState.GROUND;
                quinoa.getCurrentRegionHeader().getRegion().getItems().Add(newItem);
            }

            //Any monster specific items
            switch(victim.monsterCode)
            {
                case MonsterCode.HUMAN:
                break;

                case MonsterCode.GHOST:
                playerFeedback = "The " + EnumUtil.EnumName<MonsterCode>(victim.monsterCode) + " fades away...";
                break;

                case MonsterCode.SPONGE:
                playerFeedback = "The " + EnumUtil.EnumName<MonsterCode>(victim.monsterCode) + " crumbles.";
                break;

                case MonsterCode.SLIME:
                for(int i=0; i < 2; i++)
                {
                    Monster newMon = new Monster();
                    newMon.monsterCode = MonsterCode.SMALL_SLIME;
                    MonsterActionManager.initialize(newMon);
                    newMon.setPosition(victim.x + RandomNumber.RandomInteger(5) - 2, victim.y + RandomNumber.RandomInteger(5) - 2);
                    quinoa.getActions().addMonster(newMon);
                }
                playerFeedback = "The " + EnumUtil.EnumName<MonsterCode>(victim.monsterCode) + " splits!";
                break;

                case MonsterCode.SMALL_SLIME:
                for(int i=0; i < 2; i++)
                {
                    Monster newMon = new Monster();
                    newMon.monsterCode = MonsterCode.TINY_SLIME;
                    MonsterActionManager.initialize(newMon);
                    newMon.setPosition(victim.x + RandomNumber.RandomInteger(7) - 4, victim.y + RandomNumber.RandomInteger(7) - 4);
                    quinoa.getActions().addMonster(newMon);
                }
                playerFeedback = "The " + EnumUtil.EnumName<MonsterCode>(victim.monsterCode) + " splits!";
                break;

                case MonsterCode.TINY_SLIME:
                playerFeedback = "The " + EnumUtil.EnumName<MonsterCode>(victim.monsterCode) + " evaporates!";
                break;

                case MonsterCode.DEER:
                case MonsterCode.PIG:
                playerFeedback = "The " + EnumUtil.EnumName<MonsterCode>(victim.monsterCode) + " collapses.";
                break;

                default:
                break;
            }

            //Inform plyer
            if(killer.ID.Equals(MonsterActionManager.PLAYER_ID))
            {
                quinoa.getMessageManager().addMessage(playerFeedback);
            }
        }
        public static void giveExperience(Monster monster, int amount, Quinoa quinoa)
        {
            monster.stats.setExperience(monster.stats.getExperience() + amount);

            //check for level up
            int startLevel = monster.stats.getLevel();
            int endLevel = monster.stats.getLevel();
            for(int i=0; i < xpLevels.Length; i++)
            {
                if(monster.stats.getExperience() >= xpLevels[i])
                {
                    endLevel = (i + 1);
                }
            }

            if(endLevel > startLevel && startLevel != MonsterStats.MAX_LEVEL)
            {
                monster.stats.setLevel(endLevel);
                monster.stats.setAvailableStatPoints(monster.stats.getAvailableStatPoints() + ((endLevel - startLevel) * MonsterStats.STAT_POINTS_PER_LEVEL ));
                monster.stats.setCurrentHealth(monster.stats.getMaxHP());

                if(isPlayer(monster))
                {
                    quinoa.getMessageManager().addMessage("Level up!");
                    quinoa.getUI().getScreen().displayDialog();
                }
            }
        }
        public static void executePickupCommand(Monster monster, MonsterCommand command, Quinoa quinoa)
        {
            bool pickedUpAtLeastOneItem = false;
            Region region = quinoa.getCurrentRegionHeader().getRegion();
            foreach(Item tempItem in region.getItems())
            {
                if(tempItem.x == monster.x
                && tempItem.y == monster.y
                && !tempItem.ShouldBeRemoved)
                {
                    if(monster.inventory.stackItem(tempItem))
                    {
                        //Item stacked on current item
                        tempItem.RemoveObject();
                        pickedUpAtLeastOneItem = true;

                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("Got " + EnumUtil.EnumName<ItemClass>(tempItem.itemClass) + ".");
                        }
                    }
                    else
                    {
                        if(!monster.inventory.Full)
                        {
                            monster.inventory.addItem((Item)tempItem.CopyObject());
                            tempItem.RemoveObject();
                            pickedUpAtLeastOneItem = true;

                            if(isPlayer(monster))
                            {
                                quinoa.getMessageManager().addMessage("Got " + EnumUtil.EnumName<ItemClass>(tempItem.itemClass) + ".");
                            }
                        }
                        else
                        {
                            if(isPlayer(monster))
                            {
                                quinoa.getMessageManager().addMessage("Can't carry any more.");
                                pickedUpAtLeastOneItem = true;
                            }
                        }
                    }
                }
            }

            if(!pickedUpAtLeastOneItem)
            {
                if(isPlayer(monster))
                {
                    quinoa.getMessageManager().addMessage("Nothing to pick up there.");
                }
            }
        }
        public static void executeUnequipCommand(Monster monster, MonsterCommand command, Quinoa quinoa)
        {
            String itemID = command.getParameter("itemID");
            Item itemToEquip = monster.inventory.getItem(itemID);

            //Find the slot that the item is equiped in
            ItemSlot equipSlot = ItemSlot.NULL;
            foreach (ItemSlot tempSlot in Enum.GetValues(typeof(ItemSlot)).Cast<ItemSlot>())
            {
                Item testItem = monster.inventory.getItem(tempSlot);
                if(testItem != null && testItem.ID.Equals(itemID))
                {
                    equipSlot = tempSlot;
                }
            }

            if(equipSlot != ItemSlot.NULL)
            {
                if(!monster.inventory.Full)
                {
                    Item newItem = (Item)itemToEquip.CopyObject();
                    monster.inventory.equipItem(null, equipSlot);
                    if(!monster.inventory.stackItem(newItem))
                    {
                        monster.inventory.addItem(newItem);
                    }

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("Unequiped " + EnumUtil.EnumName<ItemClass>(newItem.itemClass) + ".");
                    }
                }
                else
                {
                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("No space to unequip that.");
                    }
                }
            }
        }
        public static void executeEquipCommand(Monster monster, MonsterCommand command, Quinoa quinoa)
        {
            String itemID = command.getParameter("itemID");
            Item itemToEquip = monster.inventory.getItem(itemID);
            if(itemToEquip != null)
            {
                //check for a free slot
                ItemSlot freeSlot = ItemManager.getFreeItemSlot(monster, itemToEquip);
                if(freeSlot != ItemSlot.NULL)
                {
                    Item newItem = (Item)itemToEquip.CopyObject();
                    monster.inventory.removeItem(itemID);
                    monster.inventory.equipItem(newItem, freeSlot);

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("Equiped " + EnumUtil.EnumName<ItemClass>(newItem.itemClass) + ".");
                    }
                }
                else
                {
                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("No space to equip that.");
                    }
                }
            }
        }
        public static void executeItemVerbCommand(Monster monster, MonsterCommand command, Quinoa quinoa)
        {
            Item item = monster.inventory.getItem(command.getParameter("itemID"));
            ItemVerb verb = (ItemVerb)Enum.Parse(typeof(ItemVerb), command.getParameter("verb"));
            Region region = quinoa.getCurrentRegionHeader().getRegion();
            int x = Int32.Parse(command.getParameter("x"));
            int y = Int32.Parse(command.getParameter("y"));
            bool removeItem=false;
            if(item != null)
            {
                switch(verb)
                {
                    case ItemVerb.EAT:
                    foreach(ItemAttribute attribute in item.attributes)
                    {
                        if(attribute.type == ItemAttributeType.NUTRITION)
                        {
                            double nutrition = Double.Parse(attribute.parameter);
                            monster.stats.setCurrentHunger(monster.stats.getCurrentHunger() - nutrition);
                            if(monster.stats.getCurrentHunger() < 0)
                            {
                                monster.stats.setCurrentHunger(0.0);
                            }

                            if(isPlayer(monster))
                            {
                                quinoa.getMessageManager().addMessage("Ate " + EnumUtil.EnumName<ItemClass>(item.itemClass) + ".");
                            }
                        }

                        if(attribute.type == ItemAttributeType.HEALS)
                        {
                            double points = Double.Parse(attribute.parameter);
                            monster.stats.setCurrentHealth(monster.stats.getCurrentHealth() + points);
                            if(monster.stats.getCurrentHealth() > monster.stats.getMaxHP())
                            {
                                monster.stats.setCurrentHealth(monster.stats.getMaxHP());
                            }

                            if(isPlayer(monster))
                            {
                                if(points >= 0)
                                {
                                    quinoa.getMessageManager().addMessage("You feel better.");
                                }
                                else
                                {
                                    quinoa.getMessageManager().addMessage("You feel worse.");
                                }
                            }
                        }
                    }
                    removeItem = true;
                    break;

                    case ItemVerb.PLACE:
                    removeItem = MonsterActionManager.place(monster, item, x, y, region, quinoa);
                    break;

                    case ItemVerb.USE:
                    removeItem = use(monster, item, x, y, region, quinoa);
                    break;

                }

                if(removeItem)
                {
                    if(item.stackSize > 1)
                    {
                        item.stackSize = item.stackSize - 1;
                    }
                    else
                    {
                        item.RemoveObject();
                    }
                }
            }
            else
            {
                //Non-item verbs
                switch(verb)
                {
                    case ItemVerb.ACTIVATE:
                    MonsterActionManager.activate(monster, x, y, region, quinoa);
                    break;

                    case ItemVerb.TALK:
                    if(isPlayer(monster))
                    {
                        quinoa.getActions().talk(x, y);
                        quinoa.getActions().showDialog();
                    }
                    break;

                    case ItemVerb.LOOK:
                    if(isPlayer(monster))
                    {
                        quinoa.getActions().look(x, y);
                        quinoa.getActions().showDialog();
                    }
                    break;

                    case ItemVerb.TRADE:
                    if(isPlayer(monster))
                    {
                        quinoa.getActions().trade(x, y);
                    }
                    break;

                    case ItemVerb.SLEEP:
                    Item terrainItem = region.getItem(x, y);

                    if(terrainItem != null)
                    {
                        foreach(ItemAttribute ia in terrainItem.attributes)
                        {
                            if(ia.type == ItemAttributeType.SLEEPS_FOR)
                            {
                                int hours = Int32.Parse(ia.parameter.Split(new char[]{' '})[0]);
                                monster.setPosition(x, y);
                                monster.sleeping = Quinoa.TICKS_PER_SECOND * 60 * 60 * hours;
                                break;
                            }
                        }
                    }

                    if(TerrainManager.hasParameter(region.getTerrain(x, y), TerrainParameter.HAS_BED))
                    {
                        int hours = 4;
                        monster.setPosition(x, y);
                        monster.sleeping = Quinoa.TICKS_PER_SECOND * 60 * 60 * hours;
                    }
                    else
                    {
                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("You can't sleep there.");
                        }
                    }
                    break;
                }
            }
        }
        public static void executeAttackCommand(Monster monster, MonsterCommand command, Quinoa quinoa)
        {
            Monster monsterToAttack = quinoa.getMonsterByID(command.getParameter("monsterID"));
            if(monsterToAttack != null)
            {
                if(quinoa.monsterIsAdjacent(monster.x, monster.y, monsterToAttack.ID))
                {
                    //Do a combat attack
                    MonsterActionManager.combat(monster, monsterToAttack, quinoa);

                    //Check for removal if not player
                    //Also check for kill
                    if(!monsterToAttack.ID.Equals(MonsterActionManager.PLAYER_ID) && !(monsterToAttack.stats.getCurrentHealth() > 1))
                    {
                        monsterToAttack.RemoveObject();
                        monsterKilled(monster, monsterToAttack, quinoa);
                    }

                }
                else
                {
                    //Attack misses automatically
                    if(monster.ID.Equals(MonsterActionManager.PLAYER_ID))
                    {
                        quinoa.getMessageManager().addMessage("You miss the " + EnumUtil.EnumName<MonsterCode>(monsterToAttack.monsterCode) + ".");
                    }
                }
            }
            else
            {
                //Monster cannot be found
                if(monster.ID.Equals(MonsterActionManager.PLAYER_ID))
                {
                    quinoa.getMessageManager().addMessage("You swing at nothing.");
                }
            }
        }
        public static void executeDropCommand(Monster monster, MonsterCommand command, Quinoa quinoa)
        {
            String itemID = command.getParameter("itemID");
            Item itemToDrop = monster.inventory.getItem(itemID);
            if(itemToDrop != null)
            {
                Item newItem = (Item)itemToDrop.CopyObject();
                newItem.itemState = ItemState.GROUND;
                newItem.setPosition(monster.x, monster.y);
                quinoa.getCurrentRegionHeader().getRegion().getItems().Add(newItem);
                monster.inventory.removeItem(itemID);
                monster.inventory.removedExpiredItems();

                if(isPlayer(monster))
                {
                    quinoa.getMessageManager().addMessage("Dropped " + itemToDrop.itemClass + ".");
                }
            }
        }
        public static void combat(Monster attacker, Monster defender, Quinoa quinoa)
        {
            //Wake on being hit
            defender.sleeping = 0;

            //Hit if rnd() < ATK / (ATK + DEF).
            double atk = MonsterActionManager.getAttackRating(attacker);
            double def = MonsterActionManager.getDefenseRating(defender);
            if (RandomNumber.RandomDouble() < atk / (atk + def))
            {

                double damage = 0.0;
                if(atk > def)
                {
                    //damage = rnd() * (ATK - DEF)
                    damage = ((RandomNumber.RandomDouble() / 2) + 0.5) * (atk - def);

                }
                else
                {
                    //damage = rnd()
                    damage = RandomNumber.RandomDouble();
                }

                defender.stats.setCurrentHealth(defender.stats.getCurrentHealth() - damage);

                if(MonsterActionManager.isPlayer(attacker))
                {
                    quinoa.getMessageManager().addMessage("You hit the " + EnumUtil.EnumName<MonsterCode>(defender.monsterCode) + " for " + damage + ".");

                }
                else if(MonsterActionManager.isPlayer(defender))
                {
                    quinoa.getMessageManager().addMessage("The " + EnumUtil.EnumName<MonsterCode>(defender.monsterCode) + " hits for " + damage + ".");
                }

            }
            else
            {
                if(MonsterActionManager.isPlayer(attacker))
                {
                    quinoa.getMessageManager().addMessage("You missed the " + EnumUtil.EnumName<MonsterCode>(defender.monsterCode) + ".");
                }
                else if(MonsterActionManager.isPlayer(defender))
                {
                    quinoa.getMessageManager().addMessage("The " + EnumUtil.EnumName<MonsterCode>(defender.monsterCode) + " missed you.");
                }
            }
        }
        public static bool use(Monster monster, Item item, int x, int y, Region region, Quinoa quinoa)
        {
            Terrain terrain = region.getTerrain(x,y);
            switch(item.itemClass)
            {
                case ItemClass.AXE:
                if(TerrainManager.hasParameter(region.getTerrain(x, y), TerrainParameter.HAS_TREE))
                {
                    TreeCode tc = (TreeCode)Enum.Parse(typeof(TreeCode), TerrainManager.getParameter(region.getTerrain(x, y), TerrainParameter.HAS_TREE));
                    int damage = 0;
                    if(TerrainManager.hasParameter(region.getTerrain(x, y), TerrainParameter.DAMAGE))
                    {
                        damage = Int32.Parse(TerrainManager.getParameter(region.getTerrain(x,y), TerrainParameter.DAMAGE));
                    }
                    damage = damage + 1;

                    if(damage < TerrainManager.maxTreeDamage(tc))
                    {
                        region.getTerrain(x,y).getParameters().Add(TerrainParameter.DAMAGE, damage + "");

                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("You chop the " + EnumUtil.EnumName<TreeCode>(tc) + ".");
                        }
                    }
                    else
                    {
                        region.getTerrain(x, y).getParameters().Remove(TerrainParameter.HAS_TREE);
                        region.getTerrain(x, y).getParameters().Remove(TerrainParameter.DAMAGE);
                        Item log = new Item();
                        log.itemClass = ItemClass.LOG;
                        log.itemState = ItemState.GROUND;
                        log.setPosition(x, y);
                        region.getItems().Add(log);

                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("The tree falls.");
                        }
                    }
                }
                return false;

                case ItemClass.LANTERN:
                case ItemClass.TORCH:
                return MonsterActionManager.setFire(monster, item, region, x, y, quinoa);

                case ItemClass.ASH:
                //check for mushrooms spores
                if(TerrainManager.hasParameter(terrain, TerrainParameter.HAS_MUSHROOM_SPORES))
                {
                    MushroomSporeCode msc = (MushroomSporeCode)Enum.Parse(typeof(MushroomSporeCode), TerrainManager.getParameter(terrain, TerrainParameter.HAS_MUSHROOM_SPORES));

                    if(RandomNumber.RandomDouble() > 0.25)
                    {
                        //Grow a mushroom
                        Item newMushroom = new Item();
                        newMushroom.itemClass = TerrainManager.mushroomSporeToItemClass(msc);
                        ItemManager.initialize(newMushroom);
                        newMushroom.setPosition(x, y);
                        region.getItems().Add(newMushroom);

                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("A mushroom sprouts!");
                        }
                    }
                    else
                    {
                        //spread the spore
                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("The spores shimmer..");
                        }
                        quinoa.getActions().spreadSpore(x, y, msc);
                    }

                    //Slight chance to remove the spores
                    if (RandomNumber.RandomDouble() < 0.02)
                    {
                        terrain.getParameters().Remove(TerrainParameter.HAS_MUSHROOM_SPORES);
                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("The spores crumble...");
                        }
                    }

                    return true;
                }

                //check for clover
                if(TerrainManager.hasParameter(terrain, TerrainParameter.HAS_CLOVER))
                {
                    int cloverCount = Int32.Parse(TerrainManager.getParameter(terrain, TerrainParameter.HAS_CLOVER));
                    if(cloverCount > 0)
                    {
                        terrain.getParameters().Add(TerrainParameter.HAS_CLOVER, "0");

                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("The clover blooms!");
                        }

                        return true;
                    }
                }

                //fertilize existing ground
                switch(terrain.getCode())
                {
                    case TerrainCode.DIRT:
                    terrain.setCode(TerrainCode.FERTILE_LAND);
                    terrain.getParameters().Add(TerrainParameter.GROW_COUNTER, TerrainManager.GRASS_GROW_COUNT+"");
                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("The ground becomes fertile.");
                    }
                    return true;

                    case TerrainCode.FERTILE_LAND:
                    if(TerrainManager.hasParameter(terrain, TerrainParameter.GROW_COUNTER))
                    {
                        int growCount = Int32.Parse(TerrainManager.getParameter(terrain, TerrainParameter.GROW_COUNTER));
                        growCount = growCount / 2;
                        terrain.getParameters().Add(TerrainParameter.GROW_COUNTER, growCount+"");
                        if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("The ground becomes more fertile.");
                    }
                    }
                    return true;

                    default:
                    return false;
                }

                case ItemClass.BUCKET:
                if(terrain.getWater() > 0)
                {
                    int waterLevel = terrain.getWater();
                    if(waterLevel > TerrainManager.DEEP_WATER)
                    {
                        item.itemClass = ItemClass.WATER_BUCKET;
                        terrain.setWater(waterLevel - TerrainManager.DEEP_WATER);
                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("You fill the bucket with water.");
                        }
                    }
                    else
                    {
                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("There's not enough water there.");
                        }
                    }
                }
                return false;

                case ItemClass.WATER_BUCKET:
                int waterValue = ItemManager.WATER_LEVEL_BUCKET_FULL;

                //Turn the item back to a bucket after all uses are gone
                if(ItemManager.decreaseUse(item))
                {
                    item.itemClass = ItemClass.BUCKET;
                }

                //Check for fire extinguishing
                if(TerrainManager.hasParameter(terrain, TerrainParameter.FIRE))
                {
                    terrain.getParameters().Remove(TerrainParameter.FIRE);
                    waterValue = waterValue / 2;

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("The fire is extinguished!");
                    }
                }

                //Add water to the ground
                if(TerrainManager.wetable(terrain, x, y, quinoa))
                {
                    terrain.setWater(terrain.getWater() + waterValue);

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("You splash water around.");
                    }
                }

                return false;

                case ItemClass.SHOVEL:
                if(TerrainManager.diggable(terrain))
                {
                    TerrainManager.dig(terrain, x, y, quinoa);

                    if(isPlayer(monster))
                    {
                        if(TerrainManager.hasParameter(terrain, TerrainParameter.HAS_GRAVE))
                        {
                            quinoa.getMessageManager().addMessage("You open the grave.");
                        }
                        else
                        {
                            quinoa.getMessageManager().addMessage("You dig.");
                        }
                    }
                }
                else
                {
                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("You can't dig there.");
                    }
                }
                return false;

                case ItemClass.PICKAXE:
                if(TerrainManager.mineable(terrain))
                {
                    TerrainManager.mine(terrain, x, y, quinoa);

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("You mine.");
                    }
                }
                else
                {
                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("You can't mine there.");
                    }
                }
                return false;

                case ItemClass.CORN_SEED:
                if(terrain.getCode() == TerrainCode.FERTILE_LAND)
                {
                    if(!TerrainManager.hasParameter(terrain, TerrainParameter.HAS_SEED))
                    {
                        terrain.getParameters().Add(TerrainParameter.HAS_SEED, EnumUtil.EnumName<SeedType>(SeedType.CORN));
                        terrain.getParameters().Add(TerrainParameter.GROW_COUNTER,TerrainManager.CORN_GROW_COUNT+"");

                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("You sow the corn seed.");
                        }
                    }
                }
                else
                {
                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("Plant seeds in fertile ground.");
                    }
                }
                return true;

                case ItemClass.PUMPKIN_SEED:
                if(terrain.getCode() == TerrainCode.FERTILE_LAND)
                {
                    if(!TerrainManager.hasParameter(terrain, TerrainParameter.HAS_SEED))
                    {
                        terrain.getParameters().Add(TerrainParameter.HAS_SEED,EnumUtil.EnumName<SeedType>(SeedType.PUMPKIN));
                        terrain.getParameters().Add(TerrainParameter.GROW_COUNTER,TerrainManager.PUMPKIN_GROW_COUNT+"");

                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("Sow the pumpkin seed.");
                            quinoa.getMessageManager().addMessage("A creeping vine appears.");
                        }
                    }
                }
                else
                {
                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("Plant seeds in fertile ground.");
                    }
                }
                return true;

                case ItemClass.MOP:
                if(TerrainManager.hasParameter(terrain, TerrainParameter.HAS_MOSS))
                {
                    terrain.getParameters().Remove(TerrainParameter.HAS_MOSS);
                }
                if(terrain.getWater() > 0)
                {
                    terrain.setWater(0);
                }
                if(TerrainManager.hasParameter(terrain, TerrainParameter.HAS_MUSHROOM_SPORES))
                {
                    terrain.getParameters().Remove(TerrainParameter.HAS_MUSHROOM_SPORES);
                }
                return false;

                default:
                return false;
            }
        }
        public static bool setFire(Monster monster, Item item, Region region, int x, int y, Quinoa quinoa)
        {
            if(TerrainManager.flammable(region.getTerrain(x,y), x, y, quinoa))
                {
                    region.getTerrain(x,y).getParameters().Add(TerrainParameter.FIRE, TerrainManager.BASE_FLAME_RATE+"");
                    if(ItemManager.decreaseUse(item))
                    {
                        item.RemoveObject();
                    }

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("Flames burst forth!");
                    }
                }
                else
                {
                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("That won't catch on fire.");
                    }
                }
                return false;
        }
        public static void sellItemToMonster(Monster seller, Monster buyer, Item item, Quinoa quinoa)
        {
            //Check if the buyer has enough money
            if(buyer.inventory.wealth >= item.worth)
            {
                //Do the sale
                Item newItem = (Item)item.CopyObject();
                newItem.stackSize = 1;

                if(!buyer.inventory.stackItem(newItem))
                {
                    if(!buyer.inventory.Full)
                    {
                        //Successfully sold as new item
                        buyer.inventory.addItem(newItem);
                        item.stackSize = item.stackSize-1;
                        if(item.stackSize == 0)
                        {
                            item.RemoveObject();
                            seller.inventory.removedExpiredItems();
                        }
                        seller.inventory.wealth = (seller.inventory.wealth + newItem.worth);
                        buyer.inventory.wealth = (buyer.inventory.wealth - newItem.worth);
                    }
                    else
                    {
                        //No room in buyer inventory
                        //Buyer can not afford
                        if(isPlayer(buyer))
                        {
                            quinoa.getMessageManager().addMessage("You don't have enough room for that.");
                        }
                        else if(isPlayer(seller))
                        {
                            quinoa.getMessageManager().addMessage("They don't have enough room.");
                        }
                    }
                }
                else
                {
                    //Successfully sold as stacked
                    item.stackSize = item.stackSize-1;
                    if(item.stackSize == 0)
                    {
                        item.RemoveObject();
                        seller.inventory.removedExpiredItems();
                    }
                    seller.inventory.wealth = (seller.inventory.wealth + newItem.worth);
                    buyer.inventory.wealth = (buyer.inventory.wealth - newItem.worth);
                }
            }
            else
            {
                //Buyer can not afford
                if(isPlayer(buyer))
                {
                    quinoa.getMessageManager().addMessage("You don't have enough money for that.");
                }
                else if(isPlayer(seller))
                {
                    quinoa.getMessageManager().addMessage("They don't have enough money.");
                }
            }
        }
        public static bool place(Monster monster, Item item, int x, int y, Region region, Quinoa quinoa)
        {
            Terrain terrain = region.getTerrain(x,y);
            switch(item.itemClass)
            {
                case ItemClass.FLOODGATE:
                if(terrain.getCode() == TerrainCode.STREAM_BED)
                {
                    terrain.getParameters().Add(TerrainParameter.HAS_FLOODGATE, EnumUtil.EnumName<DoorCode>(DoorCode.CLOSED));
                    return true;
                }
                else
                {
                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("That must be placed in a stream bed.");
                    }
                    return false;
                }

                case ItemClass.BONES:
                if(TerrainManager.hasParameter(terrain, TerrainParameter.HAS_GRAVE))
                {
                    GraveCode gc = (GraveCode)Enum.Parse(typeof(GraveCode), TerrainManager.getParameter(terrain, TerrainParameter.HAS_GRAVE));
                    if(gc == GraveCode.BROKEN)
                    {
                        terrain.getParameters().Add(TerrainParameter.HAS_GRAVE, EnumUtil.EnumName<GraveCode>(GraveCode.SPECIAL));
                        if(isPlayer(monster))
                        {
                            quinoa.getMessageManager().addMessage("You restore the bones to the grave.");
                        }
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                return false;

                case ItemClass.APPLE:
                if(RandomNumber.RandomDouble() < TerrainManager.APPLE_TREE_FROM_APPLE_CHANCE
                && !TerrainManager.hasParameter(terrain, TerrainParameter.HAS_TREE)
                && !TerrainManager.hasParameter(terrain, TerrainParameter.HAS_SIGN)
                && !TerrainManager.hasParameter(terrain, TerrainParameter.HAS_DOOR)
                && terrain.getCode() == TerrainCode.GRASS)
                {
                    terrain.getParameters().Add(TerrainParameter.HAS_TREE, EnumUtil.EnumName<TreeCode>(TreeCode.APPLE_TREE));

                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("An apple tree sprouts!");
                    }
                }
                else
                {
                    if(isPlayer(monster))
                    {
                        quinoa.getMessageManager().addMessage("The apple rots...");
                    }
                }
                return true;

                default:
                Item newItem = (Item)item.CopyObject();
                newItem.itemState = ItemState.GROUND;
                newItem.stackSize = 1;
                newItem.refreshID();
                newItem.setPosition(x, y);
                quinoa.getCurrentRegionHeader().getRegion().getItems().Add(newItem);
                return true;
            }
        }