source: 2013/30/MiskaK/MW2(My Warfare 2)/MW2(My Warfare 2)/MW2(My Warfare 2)/Vihollinen.cs @ 4580

Revision 4580, 10.5 KB checked in by anlakane, 6 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Effects;
7
8/// <summary>
9/// Mikä tahansa pelaajalle vihamielinen pelihahmo.
10/// </summary>
11public class Vihollinen : Elava
12{
13    /// <summary>
14    /// Paljonko vihollinen tekee vahinkoa eläviä kohtaan.
15    /// </summary>
16    public double TuhovoimaElaviaKohtaan { get; set; }
17
18    /// <summary>
19    /// Mitä vihollinen yrittää paikantaa ja tuhota.
20    /// </summary>
21    public Pelaaja[] Kohteet { get; set; }
22
23    /// <summary>
24    /// Miten nopeasti vihollinen liikkuu.
25    /// </summary>
26    public double LiikkumisNopeus { get; set; }
27
28    private double todennakoisyysSpawnata;
29
30    /// <summary>
31    /// Todennäköisyys, miten usein tämä vihollinen spawnaa. Väliltä 0 - 1.
32    /// 0 = ei spawnaa koskaan, 1 = spawnaa aina, kun tätä yritetään spawnata.
33    /// </summary>
34    public double TodennakoisyysSpawnata { get { return todennakoisyysSpawnata; } set { if (value > 0 && value < 1) todennakoisyysSpawnata = value; } }
35
36    /// <summary>
37    /// Onko vihollisella ampuma-asetta.
38    /// </summary>
39    public bool OnkoAsetta { get; set; }
40
41    /// <summary>
42    /// Tuhoaako vihollinen itsensä törmätessään pelaajaan.
43    /// </summary>
44    public bool OnkoSuicideAttacker { get; set; }
45
46    /// <summary>
47    /// Mikä ase vihollisella on. Voi olla null, jolloin vahinkoa syntyy vain kosketuksesta
48    /// TuhovoimaElaviaKohtaan-arvon verran.
49    /// </summary>
50    public Ase ValittuAse { get; set; }
51
52    /// <summary>
53    /// Miltä etäisyydeltä vihollinen ampuu, jos sillä on ase.
54    /// </summary>
55    public double EtaisyysJoltaAmpuu { get; set; }
56
57    /// <summary>
58    /// Paljonko aseen tavallista tarkkuutta kasvatetaan tai vähennetään.
59    /// 1.0 ei tee mitään, pienempi tarkentaa laukauksia ja suurempi epätarkentaa.
60    /// </summary>
61    public double AmpumisTarkkuus { get; set; }
62
63    /// <summary>
64    /// Peli, jossa vihollinen on.
65    /// </summary>
66    private PhysicsGame peliJossaOn;
67
68    private Infinite infiniteJossaOn;
69
70    /// <summary>
71    /// Ääni hylsyille.
72    /// </summary>
73    private static readonly SoundEffect hylsynPutoamisAani = MW2_My_Warfare_2_.LoadSoundEffect("gun_shell_drop");
74
75    /// <summary>
76    /// Mitä kuvaa käytetään kuolemaefektissä.
77    /// </summary>
78    public Image KuolemaEfektinPartikkeliKuva { get; set; }
79
80    /// <summary>
81    /// Luodaan uusi vihollinen.
82    /// </summary>
83    /// <param name="width">Leveys.</param>
84    /// <param name="height">Korkeus.</param>
85    /// <param name="kuva">Kuva.</param>
86    /// <param name="elamienMaara">Hitpointien määrä, pelaajalla on 20.</param>
87    /// <param name="tuhovoimaElaviaKohtaan">Paljonko tekee vahinkoa pelaajaa kohtaan meleehyökkäyksellä. Pelaajalla on 20 hp:tä.</param>
88    public Vihollinen(double width, double height, Image kuva, double elamienMaara, double tuhovoimaElaviaKohtaan, double liikkumisNopeus, Pelaaja[] kohteet, bool onkoAsetta, bool onkoSuicideAttacker, PhysicsGame peli, Infinite infinite)
89        : base(width, height)
90    {
91        this.Elamat.Value = elamienMaara;
92        this.Elamat.LowerLimit += Kuolema;
93        this.TuhovoimaElaviaKohtaan = tuhovoimaElaviaKohtaan;
94        this.TodennakoisyysSpawnata = 1.0;
95        this.Image = kuva;
96        this.ValittuAse = new Ase(30, 10);
97        this.Add(this.ValittuAse);
98        this.LiikkumisNopeus = liikkumisNopeus;
99        this.OnkoAsetta = onkoAsetta;
100        this.Brain = LuoAivot(kohteet, liikkumisNopeus);
101        this.Kohteet = kohteet;
102        this.peliJossaOn = peli;
103        this.infiniteJossaOn = infinite;
104        this.LinearDamping = 0.95;
105        this.AngularDamping = 0.95;
106        this.OnkoSuicideAttacker = onkoSuicideAttacker;
107        //peliJossaOn.AddCollisionHandler(this, "pelaaja", TormaaPelaajaan);
108        this.CollisionIgnoreGroup = 5; // se vaan on 5
109        this.Mass = 1000;
110    }
111
112    /// <summary>
113    /// Luodaan vihollinen toisen pohjalta.
114    /// </summary>
115    /// <param name="kopioitavaVihollinen">Vihollinen, jonka pohjalta kopioidaan uusi.</param>
116    public Vihollinen(Vihollinen kopioitavaVihollinen)
117        : base(kopioitavaVihollinen.Width, kopioitavaVihollinen.Height)
118    {
119        this.Elamat.Value = kopioitavaVihollinen.Elamat.Value;
120        this.Elamat.LowerLimit += Kuolema;
121        this.TuhovoimaElaviaKohtaan = kopioitavaVihollinen.TuhovoimaElaviaKohtaan;
122        this.TodennakoisyysSpawnata = kopioitavaVihollinen.TodennakoisyysSpawnata;
123        this.Image = kopioitavaVihollinen.Image;
124        this.ValittuAse = Aseet.LuoRynkky(); // fixattu, masentavaa
125        this.Add(this.ValittuAse);
126        this.LiikkumisNopeus = kopioitavaVihollinen.LiikkumisNopeus;
127        this.Kohteet = kopioitavaVihollinen.Kohteet;
128        this.EtaisyysJoltaAmpuu = kopioitavaVihollinen.EtaisyysJoltaAmpuu;
129        this.AmpumisTarkkuus = kopioitavaVihollinen.AmpumisTarkkuus;
130        this.OnkoAsetta = kopioitavaVihollinen.OnkoAsetta;
131        this.Brain = LuoAivot(kopioitavaVihollinen.Kohteet, kopioitavaVihollinen.LiikkumisNopeus);
132        this.peliJossaOn = kopioitavaVihollinen.peliJossaOn;
133        this.infiniteJossaOn = kopioitavaVihollinen.infiniteJossaOn;
134        this.OnkoSuicideAttacker = kopioitavaVihollinen.OnkoSuicideAttacker;
135        this.CollisionIgnoreGroup = kopioitavaVihollinen.CollisionIgnoreGroup;
136        //peliJossaOn.AddCollisionHandler(this, "pelaaja", TormaaPelaajaan);
137        this.Mass = kopioitavaVihollinen.Mass;
138    }
139
140    /// <summary>
141    /// Luodaan viholliselle aivot.
142    /// </summary>
143    /// <param name="kohteet">Mitä kohteita vihollinen seuraa.</param>
144    /// <param name="nopeus">Miten nopeasti vihollinen liikkuu.</param>
145    /// <returns></returns>
146    private FollowerBrain LuoAivot(Pelaaja[] kohteet, double nopeus)
147    {
148        FollowerBrain seuraamisAivot;
149        if (kohteet[1] == null) seuraamisAivot = new FollowerBrain(kohteet[0]);
150        else seuraamisAivot = new FollowerBrain(kohteet);
151        seuraamisAivot.Speed = nopeus;
152        seuraamisAivot.TurnWhileMoving = true;
153        if (this.OnkoAsetta)
154        {
155            seuraamisAivot.DistanceClose = this.EtaisyysJoltaAmpuu;
156            seuraamisAivot.TargetClose += delegate { Ammu(this.AmpumisTarkkuus); };
157        }
158        return seuraamisAivot;
159    }
160
161    /// <summary>
162    /// Ammutaan vihollisen aseella, jos sellainen on.
163    /// </summary>
164    /// <param name="tarkkuusKerroin">Paljonko aseen tavallista tarkkuutta kasvatetaan tai vähennetään.
165    /// 1.0 ei tee mitään, pienempi tarkentaa laukauksia ja suurempi epätarkentaa.
166    /// </param>
167    public void Ammu(double tarkkuusKerroin)
168    {
169        // jos ei ole asetta, ei ammuta
170        if (this.ValittuAse == null) return;
171        if (this.ValittuAse.Ammo.Value == 0) Timer.SingleShot(this.ValittuAse.LataukseenKuluvaAika, delegate
172        {
173            this.ValittuAse.Ammo.Value = this.ValittuAse.Ammo.MaxValue;
174        });
175        PhysicsObject ammus = this.ValittuAse.Shoot();
176        if (ammus == null) return; // jos jostain syystä ei voida ampua, keskeytetään
177
178        // lisätään epätarkkuutta
179        Vector random = RandomGen.NextVector(this.ValittuAse.AseenHajoama.X * tarkkuusKerroin, this.ValittuAse.AseenHajoama.Y * tarkkuusKerroin);
180        ammus.Hit(random);
181
182        ammus.CollisionIgnoreGroup = 4;
183        ammus.Tag = "ammus";
184        ammus.LinearDamping = 0.99;
185        ammus.Size = new Vector(this.ValittuAse.luodinKuva.Width, this.ValittuAse.luodinKuva.Height);
186        ammus.Image = this.ValittuAse.luodinKuva;
187        peliJossaOn.AddCollisionHandler<PhysicsObject, Tuhoutuva>(
188            ammus, delegate(PhysicsObject a, Tuhoutuva tuhoutuva)
189            {
190                a.Destroy();
191                tuhoutuva.Kesto.Value -= this.ValittuAse.TuhovoimaTuhoutuviaVastaan;
192            });
193
194        peliJossaOn.AddCollisionHandler<PhysicsObject, Pelaaja>(
195            ammus, delegate(PhysicsObject a, Pelaaja pelaaja)
196            {
197                a.Destroy();
198                MW2_My_Warfare_2_.osuma1.Play();
199                pelaaja.Elamat.Value -= this.ValittuAse.TuhovoimaElaviaVastaan / 1.5;
200            });
201        peliJossaOn.Add(ammus);
202        //if (this.ValittuAse.TuleekoHylsya)
203        //    Hylsy(this, this.ValittuAse.hylsynKuva);
204    }
205
206    /// <summary>
207    /// Luo hylsyn vihollisen ampuessa.
208    /// </summary>
209    /// <param name="pelaaja">Vihollinen, jonka aseesta hylsy lentää.</param>
210    void Hylsy(Vihollinen vihu, Image hylsynkuva)
211    {
212        PhysicsObject hylsy = new PhysicsObject(2, 5);
213        hylsy.Image = hylsynkuva;
214        hylsy.Position = this.Position + Vector.FromLengthAndAngle(15, this.Angle + Angle.FromDegrees(-90));
215        hylsy.LinearDamping = 0.93;
216        hylsy.Mass = 0.5;
217        hylsy.Angle = this.Angle + Angle.FromDegrees(90);
218        hylsy.AngularVelocity = RandomGen.NextDouble(-20.0, 20.0);
219        hylsy.AngularDamping = 0.97;
220        hylsy.MaximumLifetime = TimeSpan.FromSeconds(3.0);
221        hylsy.Hit(Vector.FromLengthAndAngle(RandomGen.NextInt(150, 300), this.Angle + Angle.FromDegrees(RandomGen.NextDouble(-95, -85))));
222        peliJossaOn.Add(hylsy);
223        Timer.SingleShot(0.5, delegate { hylsynPutoamisAani.Play(0.7, 0.0, 0.0); });
224    }
225
226    /// <summary>
227    /// Tuhotaan vihollinen Elamien loputtua.
228    /// </summary>
229    private void Kuolema()
230    {
231        if (infiniteJossaOn != null)
232            infiniteJossaOn.VihollisetKentalla.Remove(this);
233        Blood.AddDeathSplatter(this.Position, 3, 0.4);
234        this.Destroy();
235    }
236
237    /// <summary>
238    /// Kutsutaan, kun vihu törmää pelaajaan.
239    /// </summary>
240    /// <param name="tormaaja">Törmäävä vihollinen.</param>
241    /// <param name="kohde">Pelaaja, johon törmätään.</param>
242    private void TormaaPelaajaan(PhysicsObject tormaaja, PhysicsObject pelaaja)
243    {
244        Pelaaja p = pelaaja as Pelaaja;
245        p.Elamat.Value -= this.TuhovoimaElaviaKohtaan;
246        if (this.OnkoSuicideAttacker) // tuhoutuuko hyökätessään
247        {
248            KuolemaEfekti();
249            Kuolema();
250        }
251    }
252
253    private void KuolemaEfekti()
254    {
255        if (this.KuolemaEfektinPartikkeliKuva == null) return; // ettei tule NullPointeria
256
257        ExplosionSystem kuolemaefekti = new ExplosionSystem(this.KuolemaEfektinPartikkeliKuva, 100);
258        kuolemaefekti.Position = this.Position;
259        peliJossaOn.Add(kuolemaefekti);
260        kuolemaefekti.AddEffect(this.Position, 50);
261    }
262}
Note: See TracBrowser for help on using the repository browser.