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

Revision 4671, 5.4 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 CastleMaster.Entities.TileEntities;
10using Microsoft.Xna.Framework;
11
12namespace CastleMaster.Ai.AIStates
13{
14    public class CollectiveState : AIState
15    {
16        private List<MobWoodcutter> woodCutters;
17        private List<MobWarrior> warriors;
18        private List<MobRanger> rangers;
19        private bool walkingToWood = false, gettingWood = false;
20
21        public CollectiveState(PlayerAI player)
22            : base(player)
23        {
24        }
25
26        public override int Importance
27        {
28            get
29            {
30                if (AI.CoinsAmount <= Player.START_MONEY || AI.LumberAmount <= Player.START_LUMBER)
31                    return IMPORTANCE_HIGH;
32                if (AI.CoinsAmount <= Player.START_MONEY * 3)
33                    return IMPORTANCE_MEDIUM;
34
35                return IMPORTANCE_LOW;
36            }
37        }
38
39        public override void OnStateChosen()
40        {
41            woodCutters = AI.GetUnitsByType<MobWoodcutter>();
42            warriors = AI.GetUnitsByType<MobWarrior>();
43            rangers = AI.GetUnitsByType<MobRanger>();
44        }
45
46        public override void OnStateChange()
47        {
48            walkingToWood = false;
49            gettingWood = false;
50            if (woodCutters.Count > 0)
51            {
52                MobWoodcutter mw = woodCutters[0];
53                AI.ForestPoint = new Point((int)(mw.X / Viewport.TILESIZE), (int)(mw.Z / Viewport.TILESIZE));
54                woodCutters[0].OnGroupOrder<MobWoodcutter>(woodCutters, AI.WoodcutterSpawnPoint.X * Viewport.TILESIZE, AI.WoodcutterSpawnPoint.Y * Viewport.TILESIZE);
55            }
56        }
57
58        public override void ApplyState()
59        {
60            if (!AI.Store.IsDestroyed && AI.CoinsAmount >= UnitStore.PRICE_WOODCUTTER)
61            {
62                if (woodCutters.Count <= 5)
63                {
64                    MobWoodcutter m = AI.Store.BuyUnit<MobWoodcutter>();
65                    bool solid = true;
66                    int xTile = 0, zTile = 0;
67                    while (solid)
68                    {
69                        xTile = AI.WoodcutterSpawnPoint.X + (int)(Math.Sin(Game.Random.NextDouble() * MathHelper.TwoPi) * 2.0F);
70                        zTile = AI.WoodcutterSpawnPoint.Y + (int)(Math.Cos(Game.Random.NextDouble() * MathHelper.TwoPi) * 2.0F);
71                        if (xTile < 0 || xTile >= AI.Level.Width || zTile < 0 || zTile >= AI.Level.Height) continue;
72                        if (!AI.Level.RegisteredTiles[AI.Level.Tiles[xTile + zTile * AI.Level.Width]].IsSolidTo(m)) solid = false;
73                    }
74
75                    AI.Level.AddEntity(m, xTile * Viewport.TILESIZE + 8.0F, zTile * Viewport.TILESIZE + 8.0F);
76                    woodCutters.Add(m);
77                    m.OnFunctionClick(AI.ForestPoint.X * Viewport.TILESIZE, AI.ForestPoint.Y * Viewport.TILESIZE, 1, false);
78                    return;
79                }
80                else if (warriors.Count + rangers.Count <= 5 && AI.CoinsAmount >= UnitStore.PRICE_WARRIOR)
81                {
82                    Type typeToBuy = null;
83                    typeToBuy = AI.AttackerTypes[Game.Random.Next(AI.AttackerTypes.Count)];
84
85                    Mob m = AI.Store.BuyUnit<Mob>(typeToBuy);
86                    Point spawnPoint = typeToBuy == typeof(MobWarrior) ? AI.WarriorSpawnPoint : AI.RangerSpawnPoint;
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                        warriors.Add((MobWarrior)m);
101                    else
102                        rangers.Add((MobRanger)m);
103                }
104            }
105
106            if (!walkingToWood)
107            {
108                woodCutters[0].OnGroupOrder(woodCutters, AI.ForestPoint.X * Viewport.TILESIZE, AI.ForestPoint.Y * Viewport.TILESIZE);
109                walkingToWood = true;
110            }
111            else
112            {
113                foreach (MobWoodcutter woodCutter in woodCutters)
114                {
115                    if (!woodCutter.HasActiveOrders)
116                    {
117                        woodCutter.OrderChop(AI.Level.GetNearestEntity<TileEntityTree>(woodCutter, 5), 1, false);
118                        if (woodCutter.Removed) woodCutters.Remove(woodCutter);
119                    }
120                }
121
122                while (AI.LumberAmount > Player.START_LUMBER + 1)
123                {
124                    AI.LumberAmount--;
125                    AI.CoinsAmount += Player.LUMBER_WORTH;
126                }
127            }
128        }
129    }
130}
Note: See TracBrowser for help on using the repository browser.