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