source: 2014/30/MiskaK/The Reclaim/The Reclaim/The Reclaim/The Reclaim/Entrance.cs @ 5602

Revision 5602, 6.5 KB checked in by anlakane, 6 years ago (diff)

Lisätty mm. ampuminen ja vihollisten tekoälyä.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Widgets;
7
8public class Entrance
9{
10    public enum Owner
11    {
12        Friendly,
13        Enemy,
14        Neutral
15    }
16
17    public Owner CurrentOwner { get; set; }
18
19    public Vector Position { get; set; }
20
21    public double Radius { get; set; }
22
23    public IntMeter CaptureSeconds { get; set; }
24
25    public ProgressBar CaptureBar { get; set; }
26
27    public int FriendliesInside { get; set; }
28
29    public int EnemiesInside { get; set; }
30
31    private Timer CaptureTimer = new Timer();
32
33    public Timer SpawnTimer = new Timer();
34
35    public delegate void EntranceUpdate(Owner owner);
36
37    public event EntranceUpdate Captured;
38
39    public Entrance(Vector position, double radius, Owner owner, int secondsToCapture)
40    {
41        this.Position = position;
42        this.Radius = radius;
43        this.CurrentOwner = owner;
44        this.CaptureTimer.Interval = 1;
45        this.CaptureTimer.Timeout += UpdateState;
46        this.CaptureTimer.Start();
47        this.CaptureSeconds = new IntMeter(secondsToCapture, 0, secondsToCapture);
48        this.CaptureSeconds.LowerLimit += Capture;
49
50        this.CaptureBar = new ProgressBar(160, 14);
51        this.CaptureBar.Position = this.Position + new Vector(0.0, 75.0);
52        this.CaptureBar.BindTo(this.CaptureSeconds);
53        this.CaptureBar.BorderColor = Color.White;
54        The_Reclaim.Peli.Add(this.CaptureBar, 3);
55
56        switch (CurrentOwner)
57        {
58            case Owner.Friendly:
59                this.CaptureBar.BarColor = Color.Green;
60                break;
61            case Owner.Enemy:
62                this.CaptureBar.BarColor = Color.Red;
63                break;
64            case Owner.Neutral:
65                this.CaptureBar.BarColor = Color.Yellow;
66                break;
67        }
68
69        this.SpawnTimer.Interval = RandomGen.NextDouble(GameConstants.MINIMUM_SPAWN_DELAY, GameConstants.MAXIMUM_SPAWN_DELAY);
70        this.SpawnTimer.Timeout += Spawn;
71        this.SpawnTimer.Start();
72    }
73
74    private void UpdateState()
75    {
76        FriendliesInside = GetAmountInside(The_Reclaim.Peli.FriendlyTroops);
77        EnemiesInside = GetAmountInside(The_Reclaim.Peli.HostileTroops);
78
79        switch (CurrentOwner)
80        {
81            case Owner.Friendly:
82                if (EnemiesInside > FriendliesInside)
83                    CaptureSeconds.Value--;
84                break;
85            case Owner.Enemy:
86                if (FriendliesInside > EnemiesInside)
87                    CaptureSeconds.Value--;
88                break;
89            case Owner.Neutral:
90                if (FriendliesInside != EnemiesInside)
91                    CaptureSeconds.Value--;
92                break;
93            default:
94                break;
95        }
96    }
97
98    private void Capture()
99    {
100        switch (CurrentOwner)
101        {
102            case Owner.Friendly:
103                if (Captured != null)
104                    Captured(Owner.Enemy);
105                this.CaptureBar.BarColor = Color.Red;
106                this.CaptureSeconds.Value = this.CaptureSeconds.DefaultValue;
107                break;
108            case Owner.Enemy:
109                if (Captured != null)
110                    Captured(Owner.Friendly);
111                this.CaptureBar.BarColor = Color.Green;
112                this.CaptureSeconds.Value = this.CaptureSeconds.DefaultValue;
113                break;
114            case Owner.Neutral:
115                if (EnemiesInside < FriendliesInside)
116                {
117                    if (Captured != null)
118                        Captured(Owner.Friendly);
119                    this.CaptureBar.BarColor = Color.Green;
120                }
121                else
122                {
123                    this.CaptureBar.BarColor = Color.Red;
124                    if (Captured != null)
125                        Captured(Owner.Enemy);
126                }
127                this.CaptureSeconds.Value = this.CaptureSeconds.DefaultValue;
128                break;
129            default:
130                break;
131        }
132    }
133
134    private int GetAmountInside(List<Soldier> troops)
135    {
136        int amount = 0;
137
138        for (int i = 0; i < troops.Count; i++)
139        {
140            if (Vector.Distance(Position, troops[i].Position) < Radius)
141                amount++;
142        }
143        return amount;
144    }
145
146    public List<Soldier> GetSoldiersInside(Entrance.Owner enemyType)
147    {
148        List<Soldier> soldsInside = new List<Soldier>();
149
150        if (enemyType == Owner.Friendly)
151        {
152            for (int i = 0; i < The_Reclaim.Peli.FriendlyTroops.Count; i++)
153                if (IsInside(The_Reclaim.Peli.FriendlyTroops[i].Position)) soldsInside.Add(The_Reclaim.Peli.FriendlyTroops[i]);
154        }
155        else
156        {
157            for (int i = 0; i < The_Reclaim.Peli.HostileTroops.Count; i++)
158                if (IsInside(The_Reclaim.Peli.HostileTroops[i].Position)) soldsInside.Add(The_Reclaim.Peli.HostileTroops[i]);
159        }
160        return soldsInside;
161    }
162
163    /// <summary>
164    /// Onko jokin piste Entrancen sisäpuolella.
165    /// </summary>
166    /// <param name="position">Tutkittava piste.</param>
167    /// <returns></returns>
168    public bool IsInside(Vector position)
169    {
170        return Vector.Distance(position, this.Position) < this.Radius;
171    }
172
173    public void Spawn()
174    {
175        switch (CurrentOwner)
176        {
177            case Owner.Friendly:
178                for (int i = 0; i < RandomGen.NextInt(GameConstants.MINIMUM_SPAWN_COUNT, GameConstants.MAXIMUM_SPAWN_COUNT); i++)
179                    The_Reclaim.Peli.CreateSoldier(this.Position + RandomGen.NextVector(-this.Radius / 2, this.Radius / 2), Images.OmaSotilasAKS74u, true, RandomGen.NextDouble(GameConstants.SOLDIER_MIN_SPEED, GameConstants.SOLDIER_MAX_SPEED), Aseet.GetRandomWeapon(), RandomGen.NextAngle());
180                break;
181            case Owner.Enemy:
182                for (int i = 0; i < RandomGen.NextInt(GameConstants.MINIMUM_SPAWN_COUNT, GameConstants.MAXIMUM_SPAWN_COUNT); i++)
183                    The_Reclaim.Peli.CreateSoldier(this.Position + RandomGen.NextVector(-this.Radius / 2, this.Radius / 2), Images.VihollinenVSSVintorez, false, RandomGen.NextDouble(GameConstants.SOLDIER_MIN_SPEED, GameConstants.SOLDIER_MAX_SPEED), Aseet.GetRandomWeapon(), RandomGen.NextAngle());
184                break;
185            case Owner.Neutral:
186                break;
187            default:
188                break;
189        }
190    }
191}
Note: See TracBrowser for help on using the repository browser.