source: 2014/30/MiskaK/The Reclaim/The Reclaim/The Reclaim/The Reclaim/Soldier.cs @ 5555

Revision 5555, 10.0 KB checked in by mikrkana, 6 years ago (diff)

Korjattu SeesObject?-bugi ja lisätty etu- ja sukunimiä.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Assets;
7using Jypeli.Widgets;
8
9public class Soldier : LivingEntity
10{
11    /// <summary>
12    /// Voiko pelaaja käskyttää sotilasta.
13    /// </summary>
14    public bool IsPlayerControlled { get; set; }
15
16    /// <summary>
17    /// Mitä tekee tällä hetkellä.
18    /// </summary>
19    public Behaviour CurrentBehaviour { get; set; }
20
21    /// <summary>
22    /// Sotilaan ase.
23    /// </summary>
24    public Ase Weapon { get; set; }
25
26    public double MovingSpeed { get; set; }
27
28    public GameObject SelectionMarker { get; set; }
29
30    public GameObject Shadow { get; private set; }
31
32    public List<Soldier> TargetSoldiers { get; set; }
33
34    public Label Name { get; set; }
35
36    private const double NAME_HEIGHT = 75.0;
37
38    public Soldier(double width, double height, bool isPlayerControlled)
39        : base(width, height)
40    {
41        CurrentBehaviour = Behaviour.Idle;
42        this.IsPlayerControlled = isPlayerControlled;
43        Weapon = new Ase(40, 10);
44        Weapon.Position = this.Position;
45        The_Reclaim.Peli.Add(Weapon);
46        MovingSpeed = 400;
47        SelectionMarker = new GameObject(width * 1.25, height * 1.25);
48        if (isPlayerControlled)
49            SelectionMarker.Image = Images.SelectionImage;
50        else
51            SelectionMarker.Image = Images.EnemySelectionImage;
52        SelectionMarker.IsUpdated = true;
53        SelectionMarker.NeedsUpdateCall = true;
54        SelectionMarker.Updated += delegate(GameObject s) { s.Angle += Angle.FromDegrees(-1); };
55        The_Reclaim.Peli.Add(SelectionMarker, -1);
56        SelectionMarker.IsVisible = false;
57
58        Shadow = new GameObject(width / 4, height / 4);
59        Shadow.Image = Images.ShadowImage;
60        The_Reclaim.Peli.Add(Shadow, -1);
61
62        TargetSoldiers = new List<Soldier>();
63
64        Name = new Label(Names.GetRandomName());
65        Name.Position = new Vector(0.0, this.Position.Y + NAME_HEIGHT);
66        The_Reclaim.Peli.Add(Name, 3);
67    }
68
69    public Soldier(Image kuva, bool isPlayerControlled)
70        : this(kuva.Width, kuva.Height, isPlayerControlled)
71    {
72        this.Image = kuva;
73    }
74
75    public Soldier(Image kuva, double sizeMultiplier, bool isPlayerControlled)
76        : this(kuva.Width, kuva.Height, isPlayerControlled)
77    {
78        this.Image = kuva;
79        this.Size *= sizeMultiplier;
80        SelectionMarker.Size *= sizeMultiplier;
81    }
82
83
84    public void UpdateAI()
85    {
86        if (!IsPlayerControlled)
87        {
88            if (The_Reclaim.Peli.FriendlyTroops.Count != 0)
89                this.TargetLocation = RandomGen.SelectOne<Soldier>(The_Reclaim.Peli.FriendlyTroops).Position;
90            this.CurrentBehaviour = Behaviour.Move;
91        }
92
93
94        switch (CurrentBehaviour)
95        {
96            case Behaviour.Idle:
97                this.Stop();
98                this.ReittiAivot.Active = false;
99                break;
100            case Behaviour.Move:
101                if (this.TargetLocation != null)
102                {
103                    if (!this.HasRoute)
104                        this.MoveToDestination(TargetLocation, MovingSpeed);
105                }
106                break;
107            case Behaviour.Shoot:
108                //List<Soldier> kohteetNakyvilla = TargetSoldiers.FindAll(x => this.SeesObject(x, "seina")).;
109
110                List<GameObject> kohteetNakyvilla = new List<GameObject>();
111                for (int i = 0; i < TargetSoldiers.Count; i++)
112                {
113                    if (this.SeesObject(TargetSoldiers[i], "seina"))
114                    {
115                        kohteetNakyvilla.Add(TargetSoldiers[i]);
116                    }
117                }
118
119                if (kohteetNakyvilla.Count != 0)
120                {
121                    Soldier kohde = (Soldier)SelectOptimalTarget(kohteetNakyvilla);
122                    this.Angle = (kohde.Position - this.Position).Angle;
123                    Shoot();
124                }
125                break;
126            default:
127                break;
128        }
129    }
130
131    /// <summary>
132    /// Valitaan optimaalinen kohde käytössä olevan aseen mukaan.
133    /// </summary>
134    /// <param name="targets">Kaikki näkyvillä olevat kohteet.</param>
135    /// <returns>Paras vaihtoehto.</returns>
136    Soldier SelectOptimalTarget(List<GameObject> targets)
137    {
138        List<GameObject> targetsClosestToFarthest = targets.OrderBy<GameObject, double>(delegate(GameObject o) { return Vector.Distance(this.Position, o.Position); }).ToList();
139        switch (this.Weapon.AseenTyyppi)
140        {
141            case Ase.WeaponType.Melee:
142                return (Soldier)targetsClosestToFarthest[0]; // lähin
143            case Ase.WeaponType.CloseRange:
144                return (Soldier)targetsClosestToFarthest[targetsClosestToFarthest.Count / 3];
145            case Ase.WeaponType.MediumRange:
146                return (Soldier)targetsClosestToFarthest[targetsClosestToFarthest.Count / 3 * 2];
147            case Ase.WeaponType.LongRange:
148                return (Soldier)targetsClosestToFarthest[targetsClosestToFarthest.Count - 1]; // kaukaisin
149            default:
150                return (Soldier)targetsClosestToFarthest[RandomGen.NextInt(0, targetsClosestToFarthest.Count)];
151        }
152    }
153
154    public override void Update(Time time)
155    {
156        if (SelectionMarker != null && SelectionMarker.IsAddedToGame != false)
157            SelectionMarker.Position = this.Position;
158        if (Shadow != null && Shadow.IsAddedToGame != false)
159            Shadow.Position = this.Position;
160        if (Name != null && Name.IsAddedToGame != false)
161            Name.Position = this.Position + new Vector(0.0, NAME_HEIGHT);
162        if (Weapon != null && Weapon.IsAddedToGame != false)
163        {
164            Weapon.Position = this.Position;
165            Weapon.Angle = this.Angle;
166        }
167        base.Update(time);
168    }
169
170    void Shoot()
171    {
172        if (this.Weapon == null) return;
173
174        PhysicsObject ammus = this.Weapon.Shoot();
175        if (ammus == null) return;
176
177        The_Reclaim.Peli.Add(ammus);
178        Vector random = RandomGen.NextVector(this.Weapon.AseenHajoama.X, this.Weapon.AseenHajoama.Y);
179        ammus.Hit(random);
180
181        ammus.CollisionIgnoreGroup = 2;
182        ammus.Tag = "ammus";
183        ammus.LinearDamping = 0.99;
184        //ammus.Size = new Vector(this.Weapon.luodinKuva.Width, this.Weapon.luodinKuva.Height);
185        ammus.Color = Color.White;
186        ammus.Mass = 50;
187        ammus.CanRotate = false;
188        ammus.IsVisible = this.Weapon.NakyykoAmmus;
189
190        // jos on meleease, ammusta ei näytetä
191        if (this.Weapon.OnkoMeleeAse == true) ammus.IsVisible = false;
192
193        // muuten ammutaan hylsy ja laitetaan luodille oikea kuva
194        else
195        {
196            if (this.Weapon.TuleekoHylsya)
197                Hylsy(this.Weapon.hylsynKuva);
198            ammus.Image = this.Weapon.luodinKuva;
199        }
200
201        if (this.Weapon.UsesTracers)
202        {
203            ammus.IsUpdated = true;
204            ammus.NeedsUpdateCall = true;
205            Color c;
206            if (this.Weapon.OverrideTracerColor != Color.Transparent)
207                c = this.Weapon.OverrideTracerColor;
208            else c = Color.Yellow;
209            ammus.Updated += delegate(GameObject o) { The_Reclaim.Peli.DrawTracers(o, c, this.Weapon.TracerLength, this.Weapon.TracerBrightness); };
210        }
211
212        if (this.Weapon.LapaiseekoMateriaaleja)
213        {
214            ammus.IgnoresCollisionResponse = true;
215            ammus.Collided += delegate
216            {
217                if (this.Weapon.AseenLapaisy > 0)
218                    Timer.SingleShot(this.Weapon.AseenLapaisy, delegate { ammus.IgnoresCollisionResponse = false; });
219            };
220        }
221
222        // collisionhandlerit
223        The_Reclaim.Peli.AddCollisionHandler<PhysicsObject, Soldier>(ammus, delegate(PhysicsObject a, Soldier kohde)
224        {
225            kohde.Damage(this.Weapon.TuhovoimaElaviaVastaan);
226            ammus.Destroy();
227        });
228
229        The_Reclaim.Peli.AddCollisionHandler<PhysicsObject, PhysicsObject>(ammus, delegate(PhysicsObject a, PhysicsObject kohde)
230        {
231            ammus.Destroy();
232        });
233
234    }
235
236    /// <summary>
237    /// Luo hylsyn ammuttaessa ja lisää sen hylsyt-taulukkoon.
238    /// </summary>
239    void Hylsy(Image hylsynkuva)
240    {
241        PhysicsObject hylsy = new PhysicsObject(2, 5);
242        hylsy.Image = hylsynkuva;
243        hylsy.Position = this.Position + Vector.FromLengthAndAngle(15, this.Angle + Angle.FromDegrees(-90));
244        hylsy.LinearDamping = 0.93;
245        hylsy.Mass = 0.5;
246        hylsy.Angle = this.Angle + Angle.FromDegrees(90);
247        hylsy.AngularVelocity = RandomGen.NextDouble(-20.0, 20.0);
248        hylsy.AngularDamping = 0.97;
249        The_Reclaim.Peli.Add(hylsy, -2);
250
251        hylsy.MaximumLifetime = TimeSpan.FromSeconds(1.5);
252        hylsy.Destroying += delegate
253        {
254            GameObject fakeHylsy = new GameObject(hylsy.Width, hylsy.Height); // samanlainen GameObject-hylsy samaan paikkaan lagin vähentämiseksi
255            fakeHylsy.Image = hylsynkuva;
256            fakeHylsy.Position = hylsy.Position;
257            fakeHylsy.Angle = hylsy.Angle;
258            The_Reclaim.Peli.Add(fakeHylsy, -2);
259            The_Reclaim.Peli.LisaaTehosteObjekti(fakeHylsy);
260        };
261
262        hylsy.Hit(Vector.FromLengthAndAngle(RandomGen.NextInt(150, 300), this.Angle + Angle.FromDegrees(RandomGen.NextDouble(-95, -85))));
263        //AddCollisionHandler(hylsy, HylsyOsuu);
264        //Timer.SingleShot(0.5, delegate { hylsynPutoamisAani.Play(0.7, 0.0, 0.0); });
265    }
266
267    /*/// <summary>
268    /// CollisionHandleri hylsylle. Soitetaan kilahdusääni, jos hylsy osuu seinään.
269    /// </summary>
270    /// <param name="hylsy">Hylsy.</param>
271    /// <param name="kohde">Kohde, johon hylsy osuu.</param>
272    void HylsyOsuu(PhysicsObject hylsy, PhysicsObject kohde)
273    {
274        if (kohde is Tuhoutuva)
275            hylsynPutoamisAani.Play(0.7, 0.0, 0.0);
276    }*/
277
278}
Note: See TracBrowser for help on using the repository browser.