protected override void DoBehaviour(HashSet <GameObject> changedObjects)
        {
            //TODO: replace by closest player.
            Player player = GameWorld.Find(Player.LocalPlayerName) as Player;

            if (player.Tile.SeenBy.ContainsKey(this))
            {
                bool ableToHit = AttackEvent.AbleToHit(this, player.Tile, Reach);
                if (ableToHit)
                {
                    Attack(player);
                    changedObjects.Add(player);

                    int cost = BaseActionCost;
                    if ((EquipmentSlots.Find("bodySlot") as RestrictedItemSlot).SlotItem != null)
                    {
                        cost = (int)(cost * ((EquipmentSlots.Find("bodySlot") as RestrictedItemSlot).SlotItem as BodyEquipment).WalkCostMod);
                    }
                    actionPoints -= cost;
                }
                else
                {
                    GoTo(changedObjects, player);
                }
            }
            else
            {
                Idle();
            }
        }
Beispiel #2
0
        /// <summary>
        /// Pathfind towards a given player
        /// </summary>
        /// <param name="player">The player to target with Pathfinding</param>
        public override void GoTo(HashSet <GameObject> changedObjects, Player player)
        {
            TileField tf = GameWorld.Find("TileField") as TileField;


            if (player.Tile.SeenBy.ContainsKey(this))
            {
                bool ableToHit = AttackEvent.AbleToHit(this, player.Tile, this.Reach);

                Special_AbleToHit(player);

                if (special_ableToHit && actionpoints_used >= actionpoints_cooldown)
                {
                    Special_Attack(player, mod);

                    actionpoints_used = 0;
                    actionPoints      = 0;
                    changedObjects.Add(player);
                }
                else if (ableToHit)
                {
                    Attack(player);

                    int cost = BaseActionCost;
                    if ((EquipmentSlots.Find("bodySlot") as ItemSlot).SlotItem != null)
                    {
                        cost = (int)(cost * ((EquipmentSlots.Find("bodySlot") as ItemSlot).SlotItem as BodyEquipment).WalkCostMod);
                    }
                    actionPoints -= cost;
                    changedObjects.Add(player);
                }
                else
                {
                    PathFinder  pf   = new PathFinder(tf);
                    List <Tile> path = pf.ShortestPath(Tile, player.Tile);
                    // TODO?:(assuming there are tiles that cannot be walked over but can be fired over)
                    // check if there is a path to a spot that can hit the player (move closer water to fire over it)
                    if (path.Count > 0)
                    {
                        changedObjects.Add(this);
                        changedObjects.Add(Tile);
                        changedObjects.Add(path[0]);

                        MoveTo(path[0]);
                        actionPoints -= BaseActionCost;
                    }
                    else
                    {
                        Idle();
                    }
                }
            }
            else
            {
                Idle();
            }
        }
Beispiel #3
0
        private void SetupType()
        {
            if (playerType == PlayerType.Random)
            {
                //select random armorType
                Array pTypeValues = Enum.GetValues(typeof(PlayerType));
                playerType = (PlayerType)pTypeValues.GetValue(GameEnvironment.Random.Next(pTypeValues.Length - 1));
            }

            RestrictedItemSlot weaponslot = EquipmentSlots.Find("weaponSlot") as RestrictedItemSlot;
            RestrictedItemSlot bodyslot   = EquipmentSlots.Find("bodySlot") as RestrictedItemSlot;
            int EquipmentStartingStrenght = 3;

            ItemSlot slot_0_0 = Inventory[0, 0] as ItemSlot;

            slot_0_0.ChangeItem(new Potion("Sprites/Potions/ruby", PotionType.Health, PotionPower.minor, 5));//some starting healt potions


            ItemSlot slot_2_2 = Inventory[2, 2] as ItemSlot;

            slot_2_2.ChangeItem(new Heal());
            ItemSlot slot_3_2 = Inventory[3, 2] as ItemSlot;

            slot_3_2.ChangeItem(new MagicBolt());

            switch (playerType)
            {
            case PlayerType.Warrior:
                weaponslot.ChangeItem(new WeaponEquipment(EquipmentStartingStrenght, WeaponType.melee));
                bodyslot.ChangeItem(new BodyEquipment(EquipmentStartingStrenght, 2, ArmorType.heavy));
                SetStats(1, 4, 4, 1, 1, 1, 1);
                break;

            case PlayerType.Archer:
                weaponslot.ChangeItem(new WeaponEquipment(EquipmentStartingStrenght, WeaponType.bow));
                bodyslot.ChangeItem(new BodyEquipment(EquipmentStartingStrenght, 2, ArmorType.normal));
                SetStats(1, 1, 1, 4, 1, 1, 4);
                break;

            case PlayerType.Mage:
                weaponslot.ChangeItem(new WeaponEquipment(EquipmentStartingStrenght, WeaponType.staff));
                bodyslot.ChangeItem(new BodyEquipment(EquipmentStartingStrenght, 2, ArmorType.robes));
                SetStats(1, 1, 1, 1, 4, 4, 1);
                ItemSlot slot_1_0 = Inventory[1, 0] as ItemSlot;
                slot_1_0.ChangeItem(new Potion("Sprites/Potions/brilliant_blue", PotionType.Mana, PotionPower.minor, 5));    //some starting mana potions
                break;

            default:
                throw new Exception("invalid enemy type");
            }
        }
        /// <summary>
        /// Set up the enemy
        /// </summary>
        /// <param name="etype">The Enemy type</param>
        /// <param name="floorNumber">The floor the enemy is on</param>
        private EnemyType SetupType(EnemyType etype, int floorNumber)
        {
            if (etype == EnemyType.random)
            {
                //select random armorType
                Array eTypeValues = Enum.GetValues(typeof(EnemyType));
                etype = (EnemyType)eTypeValues.GetValue(GameEnvironment.Random.Next(eTypeValues.Length - 1));
            }

            id += " : " + etype.ToString();
            int eLvl         = GameEnvironment.Random.Next(1, floorNumber);
            int weaponChance = 15 * floorNumber; // higher chance the deeper you go
            int armorChance  = 15 * floorNumber; //

            switch (etype)
            {
            case EnemyType.warrior:
                if (weaponChance < GameEnvironment.Random.Next(100))
                {
                    RestrictedItemSlot weaponslot = EquipmentSlots.Find("weaponSlot") as RestrictedItemSlot;
                    weaponslot.ChangeItem(new WeaponEquipment(floorNumber, WeaponType.melee));
                }
                if (armorChance < GameEnvironment.Random.Next(100))
                {
                    RestrictedItemSlot bodyslot = EquipmentSlots.Find("bodySlot") as RestrictedItemSlot;
                    // bodyslot.ChangeItem(new BodyEquipment(floorNumber, 2, ArmorType.normal));
                }
                SetStats(eLvl, 3 + (eLvl), 3 + (eLvl), 2 + (eLvl / 2), 1 + (eLvl / 2), 1 + (eLvl / 2), 2 + (eLvl / 2), 20 + eLvl * 3, 2, 1);
                break;

            case EnemyType.archer:
                if (weaponChance < GameEnvironment.Random.Next(100))
                {
                    RestrictedItemSlot weaponslot = EquipmentSlots.Find("weaponSlot") as RestrictedItemSlot;
                    weaponslot.ChangeItem(new WeaponEquipment(floorNumber, WeaponType.bow));
                }
                if (armorChance < GameEnvironment.Random.Next(100))
                {
                    RestrictedItemSlot bodyslot = EquipmentSlots.Find("bodySlot") as RestrictedItemSlot;
                    //bodyslot.ChangeItem(new BodyEquipment(floorNumber, 2, ArmorType.normal));
                }
                SetStats(eLvl, 2 + (eLvl / 2), 1 + (eLvl / 2), 3 + (eLvl), 1 + (eLvl / 2), 1 + (eLvl / 2), 3 + (eLvl), 20 + eLvl * 3, 2, 1);
                break;

            case EnemyType.mage:
                if (weaponChance < GameEnvironment.Random.Next(100))
                {
                    RestrictedItemSlot weaponslot = EquipmentSlots.Find("weaponSlot") as RestrictedItemSlot;
                    weaponslot.ChangeItem(new WeaponEquipment(floorNumber, WeaponType.staff));
                }
                if (armorChance < GameEnvironment.Random.Next(100))
                {
                    RestrictedItemSlot bodyslot = EquipmentSlots.Find("bodySlot") as RestrictedItemSlot;
                    //bodyslot.ChangeItem(new BodyEquipment(floorNumber, 2, ArmorType.robes));
                }
                SetStats(eLvl, 1 + (eLvl / 2), 1 + (eLvl / 2), 1 + (eLvl / 2), 3 + (eLvl), 3 + (eLvl), 1 + (eLvl / 2), 20 + eLvl * 3, 2, 2);
                break;

            default:
                throw new Exception("invalid enemy type");
            }
            return(etype);
        }
Beispiel #5
0
        /// <summary>
        /// Set up the enemy
        /// </summary>
        /// <param name="etype">The Enemy type</param>
        /// <param name="floorNumber">The floor the enemy is on</param>
        private void SetupType(EnemyType etype, int floorNumber)
        {
            if (etype == EnemyType.random)
            {
                //select random armorType
                Array eTypeValues = Enum.GetValues(typeof(EnemyType));
                etype = (EnemyType)eTypeValues.GetValue(GameEnvironment.Random.Next(eTypeValues.Length - 1));
            }
            id += " : " + etype.ToString();
            int eLvl = GameEnvironment.Random.Next(floorNumber, floorNumber + 5);

            switch (etype)
            {
            case EnemyType.warrior:
            {
                ItemSlot weaponslot = EquipmentSlots.Find("weaponSlot") as ItemSlot;
                weaponslot.ChangeItem(new WeaponEquipment(floorNumber + 2, WeaponType.melee));
                ItemSlot bodyslot = EquipmentSlots.Find("bodySlot") as ItemSlot;
                bodyslot.ChangeItem(new BodyEquipment(floorNumber / 10, 2, ArmorType.normal));
                SetStats(eLvl, 3 + (eLvl), 3 + (eLvl), 2 + (eLvl / 2), 1 + (eLvl / 2), 1 + (eLvl / 2), 2 + (eLvl / 2), 20 + eLvl * 3, 2, 1);
                enemySprite = "empty:65:65:12:Brown";
            }

            break;

            case EnemyType.archer:
            {
                ItemSlot weaponslot = EquipmentSlots.Find("weaponSlot") as ItemSlot;
                weaponslot.ChangeItem(new WeaponEquipment(floorNumber + 2, WeaponType.bow));
                ItemSlot bodyslot = EquipmentSlots.Find("bodySlot") as ItemSlot;
                bodyslot.ChangeItem(new BodyEquipment(floorNumber / 10, 2, ArmorType.normal));
                SetStats(eLvl, 2 + (eLvl / 2), 1 + (eLvl / 2), 3 + (eLvl), 1 + (eLvl / 2), 1 + (eLvl / 2), 3 + (eLvl), 20 + eLvl * 3, 2, 1);
                enemySprite = "empty:65:65:12:Yellow";
            }

            break;

            case EnemyType.mage:
            {
                ItemSlot weaponslot = EquipmentSlots.Find("weaponSlot") as ItemSlot;
                weaponslot.ChangeItem(new WeaponEquipment(floorNumber + 2, WeaponType.staff));
                ItemSlot bodyslot = EquipmentSlots.Find("bodySlot") as ItemSlot;
                bodyslot.ChangeItem(new BodyEquipment(floorNumber / 10, 2, ArmorType.robes));
                SetStats(eLvl, 1 + (eLvl / 2), 1 + (eLvl / 2), 1 + (eLvl / 2), 3 + (eLvl), 3 + (eLvl), 1 + (eLvl / 2), 20 + eLvl * 3, 2, 2);
                enemySprite = "empty:65:65:12:CornflowerBlue";
            }


            break;

            default:
                throw new Exception("invalid enemy type");
            }
            ItemSlot slot_0_1 = Inventory[0, 1] as ItemSlot;

            slot_0_1.ChangeItem(new Potion(floorNumber + 5, 10, PotionType.Health));
            ItemSlot slot_1_1 = Inventory[1, 1] as ItemSlot;

            slot_1_1.ChangeItem(new WeaponEquipment(floorNumber + 2));
            ItemSlot slot_2_1 = Inventory[2, 1] as ItemSlot;

            slot_2_1.ChangeItem(new BodyEquipment(floorNumber + 2, 3));
        }