source: 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Ai/AIStates/AgressiveState.cs @ 4671

Revision 4671, 4.2 KB checked in by dezhidki, 7 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using CastleMaster.Players;
6using CastleMaster.Units.Mobs;
7using CastleMaster.Units;
8using CastleMaster.Graphics;
9using Microsoft.Xna.Framework;
10
11namespace CastleMaster.Ai.AIStates
12{
13    public class AgressiveState : AIState
14    {
15        private List<MobWarrior> warriors;
16        private List<MobRanger> rangers;
17        private bool isAttacking = false;
18
19        public AgressiveState(PlayerAI player)
20            : base(player)
21        {
22        }
23
24        public override int Importance
25        {
26            get
27            {
28                List<MobWarrior> mobUnits = AI.GetUnitsByType<MobWarrior>();
29
30                if (AI.CoinsAmount >= 200 || mobUnits.Count > 10)
31                    return IMPORTANCE_HIGH;
32                else if (mobUnits.Count > 5 && AI.CoinsAmount >= 100)
33                    return IMPORTANCE_MEDIUM;
34
35                return IMPORTANCE_LOW;
36            }
37        }
38
39        public override Unit SelectUnit(Team team)
40        {
41            int attackTarget = Game.Random.Next(2);
42            if (attackTarget == 0)
43            {
44                List<Unit> toAttack = new List<Unit>();
45                if (AI.Enemy.King.Health <= 300) return AI.Enemy.King;
46
47                toAttack.Add(AI.Enemy.King);
48                if (!AI.Enemy.Store.IsDestroyed) toAttack.Add(AI.Enemy.Store);
49
50                return toAttack[Game.Random.Next(toAttack.Count)];
51            }
52            else if (attackTarget == 1)
53            {
54                return AI.Enemy.AvailableUnits[Game.Random.Next(AI.Enemy.AvailableUnits.Count)];
55            }
56
57            return null;
58        }
59
60        public override void OnStateChange()
61        {
62            isAttacking = false;
63        }
64
65        public override void OnStateChosen()
66        {
67            warriors = AI.GetUnitsByType<MobWarrior>();
68            rangers = AI.GetUnitsByType<MobRanger>();
69        }
70
71        public override void ApplyState()
72        {
73            if (!AI.Store.IsDestroyed && warriors.Count + rangers.Count <= 5 && AI.CoinsAmount >= UnitStore.PRICE_WARRIOR)
74            {
75                Type typeToBuy = null;
76                typeToBuy = AI.AttackerTypes[Game.Random.Next(AI.AttackerTypes.Count)];
77
78                Mob m = AI.Store.BuyUnit<Mob>(typeToBuy);
79                Point spawnPoint = typeToBuy == typeof(MobWarrior) ? AI.WarriorSpawnPoint : AI.RangerSpawnPoint;
80
81                bool solid = true;
82                int xTile = 0, zTile = 0;
83                while (solid)
84                {
85                    xTile = spawnPoint.X + (int)(Math.Sin(Game.Random.NextDouble() * MathHelper.TwoPi) * 4.0F);
86                    zTile = spawnPoint.Y + (int)(Math.Cos(Game.Random.NextDouble() * MathHelper.TwoPi) * 4.0F);
87                    if (xTile < 0 || xTile >= AI.Level.Width || zTile < 0 || zTile >= AI.Level.Height) continue;
88                    if (!AI.Level.RegisteredTiles[AI.Level.Tiles[xTile + zTile * AI.Level.Width]].IsSolidTo(m)) solid = false;
89                }
90
91                AI.Level.AddEntity(m, xTile * Viewport.TILESIZE + 8.0F, zTile * Viewport.TILESIZE + 8.0F);
92                if (typeToBuy == typeof(MobWarrior))
93                {
94                    warriors.Add((MobWarrior)m);
95                    ((MobWarrior)m).OnFunctionClick(AI.RangerSpawnPoint.X * Viewport.TILESIZE, AI.RangerSpawnPoint.Y * Viewport.TILESIZE, 1, false);
96                }
97                else
98                {
99                    rangers.Add((MobRanger)m);
100                    ((MobRanger)m).OnFunctionClick(AI.RangerSpawnPoint.X * Viewport.TILESIZE, AI.RangerSpawnPoint.Y * Viewport.TILESIZE, 1, false);
101                }
102
103                return;
104            }
105
106            if (!isAttacking)
107            {
108                if (warriors.Count > 0)
109                    warriors[0].OnGroupOrder(warriors, AI.WarriorSpawnPoint.X * Viewport.TILESIZE, AI.WarriorSpawnPoint.Y * Viewport.TILESIZE);
110                if (rangers.Count > 0)
111                    rangers[0].OnGroupOrder(rangers, AI.RangerSpawnPoint.X * Viewport.TILESIZE, AI.RangerSpawnPoint.Y * Viewport.TILESIZE);
112                isAttacking = true;
113            }
114        }
115    }
116}
Note: See TracBrowser for help on using the repository browser.