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

Revision 5689, 8.3 KB checked in by anlakane, 5 years ago (diff)

Esittelyversio

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 bool Capturing { get; private set; }
40
41    public bool SpawningEnabled { get; set; }
42
43    public Entrance(Vector position, double radius, Owner owner, int secondsToCapture)
44    {
45        this.Position = position;
46        this.Radius = radius;
47        this.CurrentOwner = owner;
48        this.CaptureTimer.Interval = 1;
49        this.CaptureTimer.Timeout += UpdateState;
50        this.CaptureTimer.Start();
51        this.CaptureSeconds = new IntMeter(secondsToCapture, 0, secondsToCapture);
52        this.CaptureSeconds.LowerLimit += Capture;
53
54        this.CaptureBar = new ProgressBar(160, 14);
55        this.CaptureBar.Position = this.Position + new Vector(0.0, 75.0);
56        this.CaptureBar.BindTo(this.CaptureSeconds);
57        this.CaptureBar.BorderColor = Color.White;
58        The_Reclaim.Peli.Add(this.CaptureBar, 3);
59
60        switch (CurrentOwner)
61        {
62            case Owner.Friendly:
63                this.CaptureBar.BarColor = Color.Green;
64                break;
65            case Owner.Enemy:
66                this.CaptureBar.BarColor = Color.Red;
67                break;
68            case Owner.Neutral:
69                this.CaptureBar.BarColor = Color.Yellow;
70                break;
71        }
72
73        this.SpawnTimer.Interval = RandomGen.NextDouble(GameConstants.MINIMUM_SPAWN_DELAY, GameConstants.MAXIMUM_SPAWN_DELAY);
74        this.SpawnTimer.Timeout += delegate { Spawn(); };
75        this.SpawnTimer.Start();
76        this.SpawningEnabled = true;
77    }
78
79    private void UpdateState()
80    {
81        FriendliesInside = GetAmountInside(The_Reclaim.Peli.FriendlyTroops);
82        EnemiesInside = GetAmountInside(The_Reclaim.Peli.HostileTroops);
83
84        switch (CurrentOwner)
85        {
86            case Owner.Friendly:
87                if (EnemiesInside > FriendliesInside)
88                {
89                    CaptureSeconds.Value--;
90                    Capturing = true;
91                }
92                else Capturing = false;
93                break;
94            case Owner.Enemy:
95                if (FriendliesInside > EnemiesInside)
96                {
97                    CaptureSeconds.Value--;
98                    Capturing = true;
99                }
100                else Capturing = false;
101
102                break;
103            case Owner.Neutral:
104                if (FriendliesInside != EnemiesInside)
105                {
106                    CaptureSeconds.Value--;
107                    Capturing = true;
108                }
109                else Capturing = false;
110
111                break;
112            default:
113                break;
114        }
115    }
116
117    private void Capture()
118    {
119        switch (CurrentOwner)
120        {
121            case Owner.Friendly:
122                if (Captured != null)
123                    Captured(Owner.Enemy);
124                this.CaptureBar.BarColor = Color.Red;
125                this.CaptureSeconds.Value = this.CaptureSeconds.DefaultValue;
126                this.CurrentOwner = Owner.Enemy;
127                break;
128            case Owner.Enemy:
129                if (Captured != null)
130                    Captured(Owner.Friendly);
131                this.CaptureBar.BarColor = Color.Green;
132                this.CaptureSeconds.Value = this.CaptureSeconds.DefaultValue;
133                this.CurrentOwner = Owner.Friendly;
134                break;
135            case Owner.Neutral:
136                if (EnemiesInside < FriendliesInside)
137                {
138                    if (Captured != null)
139                        Captured(Owner.Friendly);
140                    this.CaptureBar.BarColor = Color.Green;
141                    this.CurrentOwner = Owner.Friendly;
142                }
143                else
144                {
145                    this.CaptureBar.BarColor = Color.Red;
146                    this.CurrentOwner = Owner.Enemy;
147                    if (Captured != null)
148                        Captured(Owner.Enemy);
149                }
150                this.CaptureSeconds.Value = this.CaptureSeconds.DefaultValue;
151                break;
152            default:
153                break;
154        }
155        The_Reclaim.Peli.CheckCurrentSituation();
156    }
157
158    private int GetAmountInside(List<Soldier> troops)
159    {
160        int amount = 0;
161
162        for (int i = 0; i < troops.Count; i++)
163        {
164            if (Vector.Distance(Position, troops[i].Position) < Radius)
165                amount++;
166        }
167        return amount;
168    }
169
170    public List<Soldier> GetSoldiersInside(Entrance.Owner enemyType, double additionalRadius = 0)
171    {
172        List<Soldier> soldsInside = new List<Soldier>();
173
174        if (enemyType == Owner.Friendly)
175        {
176            for (int i = 0; i < The_Reclaim.Peli.FriendlyTroops.Count; i++)
177                if (IsInside(The_Reclaim.Peli.FriendlyTroops[i].Position, additionalRadius)) soldsInside.Add(The_Reclaim.Peli.FriendlyTroops[i]);
178        }
179        else
180        {
181            for (int i = 0; i < The_Reclaim.Peli.HostileTroops.Count; i++)
182                if (IsInside(The_Reclaim.Peli.HostileTroops[i].Position, additionalRadius)) soldsInside.Add(The_Reclaim.Peli.HostileTroops[i]);
183        }
184        return soldsInside;
185    }
186
187    /// <summary>
188    /// Onko jokin piste Entrancen sisäpuolella.
189    /// </summary>
190    /// <param name="position">Tutkittava piste.</param>
191    /// <returns></returns>
192    public bool IsInside(Vector position, double additionalRadius = 0)
193    {
194        return Vector.Distance(position, this.Position) < this.Radius + additionalRadius;
195    }
196
197    public void Spawn(int friendlyAmount = -1, int enemyAmount = -1)
198    {
199        if (Capturing) return;
200        if (!SpawningEnabled) return;
201
202        switch (CurrentOwner)
203        {
204            case Owner.Friendly:
205                if (friendlyAmount == -1)
206                for (int i = 0; i < RandomGen.NextInt(GameConstants.MINIMUM_SPAWN_COUNT, GameConstants.MAXIMUM_SPAWN_COUNT); i++)
207                    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());
208                else
209                    for (int i = 0; i < friendlyAmount; i++)
210                        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());
211                break;
212            case Owner.Enemy:
213                if (enemyAmount == -1)
214                    for (int i = 0; i < RandomGen.NextInt(GameConstants.MINIMUM_SPAWN_COUNT, GameConstants.MAXIMUM_SPAWN_COUNT); i++)
215                        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());
216                else
217                    for (int i = 0; i < enemyAmount; i++)
218                        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());
219                break;
220            case Owner.Neutral:
221                break;
222            default:
223                break;
224        }
225    }
226}
Note: See TracBrowser for help on using the repository browser.