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

Revision 4740, 5.5 KB checked in by dezhidki, 6 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)
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 OnStateReChosen()
72        {
73            warriors = AI.GetUnitsByType<MobWarrior>();
74            rangers = AI.GetUnitsByType<MobRanger>();
75        }
76
77        public override void ApplyState()
78        {
79            if (!AI.Armory.IsDestroyed && warriors.Count + rangers.Count <= 8 && AI.CoinsAmount >= UnitArmory.PRICE_WARRIOR)
80            {
81                Type typeToBuy = null;
82                int buyID = Game.Random.Next(AI.AttackerTypes.Count);
83                typeToBuy = AI.AttackerTypes[buyID];
84
85                Mob m = AI.Armory.BuyUnit<Mob>(typeToBuy);
86                Point spawnPoint = AI.SpawnPoints[buyID + 1];
87
88                bool solid = true;
89                int xTile = 0, zTile = 0;
90                while (solid)
91                {
92                    xTile = spawnPoint.X + (int)(Math.Sin(Game.Random.NextDouble() * MathHelper.TwoPi) * 4.0F);
93                    zTile = spawnPoint.Y + (int)(Math.Cos(Game.Random.NextDouble() * MathHelper.TwoPi) * 4.0F);
94                    if (xTile < 0 || xTile >= AI.Level.Width || zTile < 0 || zTile >= AI.Level.Height) continue;
95                    if (!AI.Level.RegisteredTiles[AI.Level.Tiles[xTile + zTile * AI.Level.Width]].IsSolidTo(m)) solid = false;
96                }
97
98                AI.Level.AddEntity(m, xTile * Viewport.TILESIZE + 8.0F, zTile * Viewport.TILESIZE + 8.0F);
99                if (typeToBuy == typeof(MobWarrior))
100                {
101                    warriors.Add((MobWarrior)m);
102                    ((MobWarrior)m).OnFunctionClick(AI.SpawnPoints[Player.SPAWN_WARRIOR].X * Viewport.TILESIZE, AI.SpawnPoints[Player.SPAWN_WARRIOR].Y * Viewport.TILESIZE, 1, false);
103                }
104                else
105                {
106                    rangers.Add((MobRanger)m);
107                    ((MobRanger)m).OnFunctionClick(AI.SpawnPoints[Player.SPAWN_RANGER].X * Viewport.TILESIZE, AI.SpawnPoints[Player.SPAWN_RANGER].Y * Viewport.TILESIZE, 1, false);
108                }
109
110                return;
111            }
112
113            if (!isAttacking)
114            {
115                if (warriors.Count > 0)
116                    warriors[0].OnGroupOrder(warriors, AI.SpawnPoints[Player.SPAWN_WARRIOR].X * Viewport.TILESIZE, AI.SpawnPoints[Player.SPAWN_WARRIOR].Y * Viewport.TILESIZE);
117                if (rangers.Count > 0)
118                    rangers[0].OnGroupOrder(rangers, AI.SpawnPoints[Player.SPAWN_RANGER].X * Viewport.TILESIZE, AI.SpawnPoints[Player.SPAWN_RANGER].Y * Viewport.TILESIZE);
119                isAttacking = true;
120            }
121            else
122            {
123
124                for (int i = 0; i < warriors.Count; i++)
125                {
126                    MobWarrior warrior = warriors[i];
127                    if (warrior.Removed)
128                        warriors.Remove(warrior);
129
130                    if (!warrior.HasActiveOrders && warrior.Target == null)
131                        warrior.OnFunctionClick(AI.SpawnPoints[Player.SPAWN_WARRIOR].X * Viewport.TILESIZE, AI.SpawnPoints[Player.SPAWN_WARRIOR].Y * Viewport.TILESIZE, 1, false);
132                }
133
134                for (int i = 0; i < rangers.Count; i++)
135                {
136                    MobRanger ranger = rangers[i];
137                    if (ranger.Removed)
138                        rangers.Remove(ranger);
139
140                    if (!ranger.HasActiveOrders && ranger.Target == null)
141                        ranger.OnFunctionClick(AI.SpawnPoints[Player.SPAWN_RANGER].X * Viewport.TILESIZE, AI.SpawnPoints[Player.SPAWN_RANGER].Y * Viewport.TILESIZE, 1, false);
142                }
143            }
144        }
145    }
146}
Note: See TracBrowser for help on using the repository browser.