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

Revision 4677, 10.6 KB checked in by anlakane, 8 years ago (diff)

Korjattu kopteri. Tehty uutta Escape-pelimuotoa ja lisätty sille valikko. Lisätty deathmatchiin vaihtoehtoinen teema.

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        this.Tag = "vihollinen";
111    }
112
113    /// <summary>
114    /// Luodaan vihollinen toisen pohjalta.
115    /// </summary>
116    /// <param name="kopioitavaVihollinen">Vihollinen, jonka pohjalta kopioidaan uusi.</param>
117    public Vihollinen(Vihollinen kopioitavaVihollinen)
118        : base(kopioitavaVihollinen.Width, kopioitavaVihollinen.Height)
119    {
120        this.Elamat.Value = kopioitavaVihollinen.Elamat.Value;
121        this.Elamat.LowerLimit += Kuolema;
122        this.TuhovoimaElaviaKohtaan = kopioitavaVihollinen.TuhovoimaElaviaKohtaan;
123        this.TodennakoisyysSpawnata = kopioitavaVihollinen.TodennakoisyysSpawnata;
124        this.Image = kopioitavaVihollinen.Image;
125        this.ValittuAse = Aseet.LuoRynkky(); // fixattu, masentavaa
126        this.Add(this.ValittuAse);
127        this.LiikkumisNopeus = kopioitavaVihollinen.LiikkumisNopeus;
128        this.Kohteet = kopioitavaVihollinen.Kohteet;
129        this.EtaisyysJoltaAmpuu = kopioitavaVihollinen.EtaisyysJoltaAmpuu;
130        this.AmpumisTarkkuus = kopioitavaVihollinen.AmpumisTarkkuus;
131        this.OnkoAsetta = kopioitavaVihollinen.OnkoAsetta;
132        this.Brain = LuoAivot(kopioitavaVihollinen.Kohteet, kopioitavaVihollinen.LiikkumisNopeus);
133        this.peliJossaOn = kopioitavaVihollinen.peliJossaOn;
134        this.infiniteJossaOn = kopioitavaVihollinen.infiniteJossaOn;
135        this.OnkoSuicideAttacker = kopioitavaVihollinen.OnkoSuicideAttacker;
136        this.CollisionIgnoreGroup = kopioitavaVihollinen.CollisionIgnoreGroup;
137        //peliJossaOn.AddCollisionHandler(this, "pelaaja", TormaaPelaajaan);
138        this.Mass = kopioitavaVihollinen.Mass;
139        this.Tag = "vihollinen";
140    }
141
142    /// <summary>
143    /// Luodaan viholliselle aivot.
144    /// </summary>
145    /// <param name="kohteet">Mitä kohteita vihollinen seuraa.</param>
146    /// <param name="nopeus">Miten nopeasti vihollinen liikkuu.</param>
147    /// <returns></returns>
148    private FollowerBrain LuoAivot(Pelaaja[] kohteet, double nopeus)
149    {
150        FollowerBrain seuraamisAivot;
151        if (kohteet[1] == null) seuraamisAivot = new FollowerBrain(kohteet[0]);
152        else seuraamisAivot = new FollowerBrain(kohteet);
153        seuraamisAivot.Speed = nopeus;
154        seuraamisAivot.TurnWhileMoving = true;
155        if (this.OnkoAsetta)
156        {
157            seuraamisAivot.DistanceClose = this.EtaisyysJoltaAmpuu;
158            seuraamisAivot.TargetClose += delegate { Ammu(this.AmpumisTarkkuus); };
159        }
160        return seuraamisAivot;
161    }
162
163    /// <summary>
164    /// Ammutaan vihollisen aseella, jos sellainen on.
165    /// </summary>
166    /// <param name="tarkkuusKerroin">Paljonko aseen tavallista tarkkuutta kasvatetaan tai vähennetään.
167    /// 1.0 ei tee mitään, pienempi tarkentaa laukauksia ja suurempi epätarkentaa.
168    /// </param>
169    public void Ammu(double tarkkuusKerroin)
170    {
171        // jos ei ole asetta, ei ammuta
172        if (this.ValittuAse == null) return;
173        if (this.ValittuAse.Ammo.Value == 0) Timer.SingleShot(this.ValittuAse.LataukseenKuluvaAika, delegate
174        {
175            this.ValittuAse.Ammo.Value = this.ValittuAse.Ammo.MaxValue;
176        });
177        PhysicsObject ammus = this.ValittuAse.Shoot();
178        if (ammus == null) return; // jos jostain syystä ei voida ampua, keskeytetään
179
180        // lisätään epätarkkuutta
181        Vector random = RandomGen.NextVector(this.ValittuAse.AseenHajoama.X * tarkkuusKerroin, this.ValittuAse.AseenHajoama.Y * tarkkuusKerroin);
182        ammus.Hit(random);
183
184        ammus.CollisionIgnoreGroup = 4;
185        ammus.Tag = "ammus";
186        ammus.LinearDamping = 0.99;
187        ammus.Size = new Vector(this.ValittuAse.luodinKuva.Width, this.ValittuAse.luodinKuva.Height);
188        ammus.Image = this.ValittuAse.luodinKuva;
189        peliJossaOn.AddCollisionHandler<PhysicsObject, Tuhoutuva>(
190            ammus, delegate(PhysicsObject a, Tuhoutuva tuhoutuva)
191            {
192                a.Destroy();
193                tuhoutuva.Kesto.Value -= this.ValittuAse.TuhovoimaTuhoutuviaVastaan;
194            });
195
196        peliJossaOn.AddCollisionHandler<PhysicsObject, Pelaaja>(
197            ammus, delegate(PhysicsObject a, Pelaaja pelaaja)
198            {
199                a.Destroy();
200                MW2_My_Warfare_2_.osuma1.Play();
201                pelaaja.Elamat.Value -= this.ValittuAse.TuhovoimaElaviaVastaan / 1.5;
202            });
203        peliJossaOn.Add(ammus);
204        //if (this.ValittuAse.TuleekoHylsya)
205        //    Hylsy(this, this.ValittuAse.hylsynKuva);
206    }
207
208    /// <summary>
209    /// Luo hylsyn vihollisen ampuessa.
210    /// </summary>
211    /// <param name="pelaaja">Vihollinen, jonka aseesta hylsy lentää.</param>
212    void Hylsy(Vihollinen vihu, Image hylsynkuva)
213    {
214        PhysicsObject hylsy = new PhysicsObject(2, 5);
215        hylsy.Image = hylsynkuva;
216        hylsy.Position = this.Position + Vector.FromLengthAndAngle(15, this.Angle + Angle.FromDegrees(-90));
217        hylsy.LinearDamping = 0.93;
218        hylsy.Mass = 0.5;
219        hylsy.Angle = this.Angle + Angle.FromDegrees(90);
220        hylsy.AngularVelocity = RandomGen.NextDouble(-20.0, 20.0);
221        hylsy.AngularDamping = 0.97;
222        hylsy.MaximumLifetime = TimeSpan.FromSeconds(3.0);
223        hylsy.Hit(Vector.FromLengthAndAngle(RandomGen.NextInt(150, 300), this.Angle + Angle.FromDegrees(RandomGen.NextDouble(-95, -85))));
224        peliJossaOn.Add(hylsy);
225        Timer.SingleShot(0.5, delegate { hylsynPutoamisAani.Play(0.7, 0.0, 0.0); });
226    }
227
228    /// <summary>
229    /// Tuhotaan vihollinen Elamien loputtua.
230    /// </summary>
231    private void Kuolema()
232    {
233        if (infiniteJossaOn != null)
234            infiniteJossaOn.VihollisetKentalla.Remove(this);
235        Blood.AddDeathSplatter(this.Position, 3, 0.4);
236        this.Destroy();
237    }
238
239    /// <summary>
240    /// Kutsutaan, kun vihu törmää pelaajaan.
241    /// </summary>
242    /// <param name="tormaaja">Törmäävä vihollinen.</param>
243    /// <param name="kohde">Pelaaja, johon törmätään.</param>
244    private void TormaaPelaajaan(PhysicsObject tormaaja, PhysicsObject pelaaja)
245    {
246        Pelaaja p = pelaaja as Pelaaja;
247        p.Elamat.Value -= this.TuhovoimaElaviaKohtaan;
248        if (this.OnkoSuicideAttacker) // tuhoutuuko hyökätessään
249        {
250            KuolemaEfekti();
251            Kuolema();
252        }
253    }
254
255    private void KuolemaEfekti()
256    {
257        if (this.KuolemaEfektinPartikkeliKuva == null) return; // ettei tule NullPointeria
258
259        ExplosionSystem kuolemaefekti = new ExplosionSystem(this.KuolemaEfektinPartikkeliKuva, 100);
260        kuolemaefekti.Position = this.Position;
261        peliJossaOn.Add(kuolemaefekti);
262        kuolemaefekti.AddEffect(this.Position, 50);
263    }
264}
Note: See TracBrowser for help on using the repository browser.