source: 2014/30/MitjaK/Attack to Agora/Attack to Agora/Attack to Agora/Attack to Agora/Attack_to_Agora.cs @ 6472

Revision 6472, 23.5 KB checked in by anlakane, 4 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using Microsoft.Xna.Framework.Content;
9
10public partial class Attack_to_Agora : PhysicsGame
11{
12    private Animation chuckinkavely;
13    private Animation chuckinKavelyFlipped;
14
15    /// <summary>
16    /// Vakiot kannattaa merkitä constiksi (ei voi muuttaa). Tällöin ne kirjoitetaan isolla.
17    /// </summary>
18    const double NOPEUS = 500; // 500
19    const double HYPPYVOIMA = 1500;
20    double prevVelocityX = 0.0;
21    const double STOP_LIMIT_X = 1;
22    bool controlsActive = true;
23
24    Image level1 = LoadImage("kentta1");
25    Image taistelijanvarjo = LoadImage("varjo");
26    Image taistelijaOlio = LoadImage("olio");
27    Image cCaseD = LoadImage("laatikko_opening");
28    Image cCaseF = LoadImage("caseavausruutu");
29    Image karambitInspect = LoadImage("karambitfade");
30    Image keyInspect = LoadImage("avaintyohuoneeseen");
31    Image tormaavavihollinen = LoadImage("ajlauta");
32
33    Image ePalkkiTyhja = LoadImage("healthbarempty");
34    Image ePalkkiTaysi = LoadImage("healthbarfull");
35
36    Image valveAlku = LoadImage("peliaukeaa1");
37    Image ajAlku = LoadImage("peliaukeaa2");
38    private bool stSequenceSkipped = false;
39
40    Elava taistelija;
41    AssaultRifle taistelijanAse;
42    const double ASEEN_DMG = 25.0;
43    const double WEAPON_INACCURACY = 20.0;
44    bool walkBackwards = false;
45
46    const double VIHOLLISEN_TORMAYSDMG = 4.0;
47
48    int kenttaNro = 1;
49
50    /// <summary>
51    /// Mitä tehdään tämänhetkisessä kentässä osuttaessa triggeriin.
52    /// </summary>
53    Action TriggerAction;
54    bool tActionTriggered = false;
55
56    /// <summary>
57    /// Viimeisen pelissä olevan kentän indeksi.
58    /// </summary>
59    const int VIIMEINEN_KENTTA = 19;
60     
61    #region yleiset toiminnot
62    public override void Begin()
63    {
64        SetWindowSize(1366, 768, true);
65        LataaContent();
66        AloitusAnimaatio();
67    }
68
69    void AloitaPeli()
70    {
71        ClearAll();
72        LuoKentta();
73        AsetaOhjaimet();
74        KirkastaRuutua(0.03, 1.0);
75        ensimmainentehtava.Play();
76        Timer.SingleShot(4.0, delegate { taustamusiikki_1.Play(); });
77    }
78
79    protected override void Update(Time time)
80    {
81        if (taistelija != null && taistelijanAse != null)
82        {
83            if (!walkBackwards)
84            {
85                if (taistelija.Velocity.X < -STOP_LIMIT_X)
86                {
87                    taistelijanAse.Angle = Angle.FromDegrees(180.0);
88                    taistelija.Animation = chuckinKavelyFlipped;
89                    if (prevVelocityX > 0)
90                        taistelija.Animation.Start();
91                }
92                if (taistelija.Velocity.X > STOP_LIMIT_X)
93                {
94                    taistelijanAse.Angle = Angle.FromDegrees(0.0);
95                    taistelija.Animation = chuckinkavely;
96                    if (prevVelocityX < 0)
97                        taistelija.Animation.Start();
98                }
99                if (taistelija.Velocity.X >= -STOP_LIMIT_X && taistelija.Velocity.X <= STOP_LIMIT_X)
100                    taistelija.Animation.Stop();
101
102                prevVelocityX = taistelija.Velocity.X;
103            }
104        }
105        base.Update(time);
106    }
107
108    void FixCamera()
109    {
110        double widthReduction = 1920.0 / Window.Width;
111        double heightReduction = 1080.0 / Window.Height;
112
113        double multiplier = Math.Max(widthReduction, heightReduction);
114
115        Camera.ZoomFactor = 1 / multiplier;
116    }
117
118    /// <summary>
119    /// Pimennetään ruutua pikku hiljaa.
120    /// Oletusnopeus 0.01.
121    /// </summary>
122    public void PimennaRuutua(double nopeus)
123    {
124        Timer ajastin = new Timer();
125        ajastin.Interval = 0.1;
126        ajastin.Timeout += delegate
127        {
128            Level.AmbientLight -= nopeus;
129            if (Level.AmbientLight <= 0.0)
130            {
131                ajastin.Stop();
132                ajastin.Reset();
133            }
134        };
135        ajastin.Start();
136    }
137
138    /// <summary>
139    /// Pimennetään ruutua pikku hiljaa.
140    /// Oletusnopeus 0.01.
141    /// </summary>
142    public void PimennaRuutua(double nopeus, Action onFinished)
143    {
144        Timer ajastin = new Timer();
145        ajastin.Interval = 0.1;
146        ajastin.Timeout += delegate
147        {
148            Level.AmbientLight -= nopeus;
149            if (Level.AmbientLight <= 0.0)
150            {
151                ajastin.Stop();
152                ajastin.Reset();
153                if (onFinished != null)
154                    onFinished();
155            }
156        };
157        ajastin.Start();
158    }
159
160    /// <summary>
161    /// Kirkastetaan ruutua pikku hiljaa.
162    /// </summary>
163    public void KirkastaRuutua(double nopeus, double tavoite)
164    {
165        Timer ajastin = new Timer();
166        ajastin.Interval = 0.1;
167        ajastin.Timeout += delegate
168        {
169            //if (Level.AmbientLight > 0.1) return;
170            Level.AmbientLight += nopeus;
171            if (Level.AmbientLight > tavoite)
172            {
173                ajastin.Stop();
174                ajastin.Reset();
175            }
176        };
177        ajastin.Start();
178    }
179
180    /// <summary>
181    /// Kirkastetaan ruutua pikku hiljaa.
182    /// </summary>
183    public void KirkastaRuutua(double nopeus, double tavoite, Action onFinished)
184    {
185        Timer ajastin = new Timer();
186        ajastin.Interval = 0.1;
187        ajastin.Timeout += delegate
188        {
189            //if (Level.AmbientLight > 0.1) return;
190            Level.AmbientLight += nopeus;
191            if (Level.AmbientLight > tavoite)
192            {
193                ajastin.Stop();
194                ajastin.Reset();
195                if (onFinished != null)
196                    onFinished();
197            }
198        };
199        ajastin.Start();
200    }
201
202
203    /// <summary>
204    /// Piirretään valojuovia.
205    /// </summary>
206    /// <param name="position">Valojuovan tämänhetkinen sijainti.</param>
207    /// <param name="color">Valojuovan väri.</param>
208    /// <param name="lifetimeInSeconds">Kauanko valojuova pysyy kentällä.</param>
209    void DrawTracers(Vector position, Color color, double lifetimeInSeconds, double brightnessFactor)
210    {
211        color.AlphaComponent = (byte)(32 * brightnessFactor); // 64 toimii
212        GameObject tracer = new GameObject(2, 2);
213        tracer.Shape = Shape.Circle;
214        tracer.Color = color;
215        tracer.Position = position;
216        tracer.MaximumLifetime = TimeSpan.FromSeconds(lifetimeInSeconds);
217        Add(tracer);
218    }
219    /// <summary>
220    /// Piirretään valojuovia.
221    /// </summary>
222    /// <param name="tracingObject">Olio, josta valojuovat tulevat.</param>
223    /// <param name="color">Valojuovan väri.</param>
224    /// <param name="lifetimeInSeconds">Kauanko valojuova pysyy kentällä.</param>
225    /// <param name="brightnessFactor">Valojuovan kirkkaus.</param>
226    void DrawTracers(PhysicsObject tracingObject, Color color, double lifetimeInSeconds, double brightnessFactor)
227    {
228        color.AlphaComponent = (byte)(32 * brightnessFactor); // 64 toimii
229        GameObject tracer = new GameObject(90, 2);
230        tracer.Shape = Shape.Circle;
231        tracer.Color = color;
232        tracer.Position = tracingObject.Position;
233        tracer.Angle = tracingObject.Angle;
234        tracer.MaximumLifetime = TimeSpan.FromSeconds(lifetimeInSeconds);
235        Add(tracer);
236    }
237
238    void AloitusAnimaatio()
239    {
240        Level.Background.Color = Color.Black;
241        Level.AmbientLight = 0.0;
242        GameObject tausta = new GameObject(ajAlku);
243        Add(tausta);
244        KirkastaRuutua(0.05, 1.0);
245        H2Oopening.Play();
246        Keyboard.Listen(Key.Escape, ButtonState.Pressed, delegate {
247            stSequenceSkipped = true;
248            H2Oopening.Stop();
249            AloitaPeli();
250        }, null);
251
252
253        Timer.SingleShot(7.0, delegate {
254            if (!stSequenceSkipped)
255            {
256                PimennaRuutua(0.1, delegate
257                {
258                    if (!stSequenceSkipped)
259                        AloitaPeli();
260                });
261            }
262        });
263    }
264
265    void LataaContent()
266    {
267        chuckinkavely = LoadAnimation("pelaaja_anim");
268        chuckinKavelyFlipped = Animation.Mirror(chuckinkavely);
269        jounibossArrive = LoadAnimation("jouniboss_anim");
270        asemiesLiikkuu = LoadAnimation("asemiesliikkuu");
271        tuliAnimaatio = LoadAnimation("tulianimaatio");
272        tuliAnimaatioFlipped = Animation.Mirror(tuliAnimaatio);
273    }
274
275    #endregion
276
277
278    void Liikuta(PhysicsObject pelaaja, double suunta)
279    {
280        if (!controlsActive) return;
281
282        pelaaja.Velocity = new Vector(suunta, pelaaja.Velocity.Y);
283
284        if (!pelaaja.Animation.IsPlaying)
285            pelaaja.Animation.Resume();
286    }
287
288    void LiikutaYlos(PhysicsObject pelaaja)
289    {
290        if (!controlsActive) return;
291
292        pelaaja.Hit(new Vector(0, HYPPYVOIMA * pelaaja.Mass));
293
294        Sound pelaajaHyppyAani = hyppy.CreateSound();
295        pelaajaHyppyAani.Pitch = 0.1;
296        Timer.SingleShot(0.1, delegate { pelaajaHyppyAani.Play(); });
297   
298    }
299
300    void LuoKentta()
301    {
302        SmoothTextures = false;
303        // IsFullScreen = true;
304        Gravity = new Vector(0, -2500);
305        // Synkataan taustakuvan ja colortilemapin pikselit
306        Level.Background.Image = LoadImage("kentta" + kenttaNro.ToString());
307
308        Level.Width = Screen.Width;
309        double kerroin = (double)Level.Background.Image.Width / Level.Background.Image.Height;
310        Level.Height = Level.Width / kerroin;
311        Level.Background.FitToLevel();
312
313        Image pohjaLevynKuva = LoadImage("kentta" + kenttaNro.ToString() + "pohja");
314
315        ColorTileMap pohjaLevy = new ColorTileMap(pohjaLevynKuva);
316        pohjaLevy.SetTileMethod(Color.Gold, LuoPohja);
317        pohjaLevy.SetTileMethod(Color.Cyan, Luotaistelija);
318        pohjaLevy.SetTileMethod(Color.DarkGray, LuoTormaavaVihollinen);
319        pohjaLevy.SetTileMethod(Color.Gray, LuoAmpuvaVihollinen);
320        pohjaLevy.SetTileMethod(Color.Red, LuoTriggerPalikka);
321        pohjaLevy.Optimize(Color.Gold);
322        pohjaLevy.Optimize(Color.Red);
323
324        // oletuksena 1 pikseli = 1 unit
325        const double BASE_SIZE = 1.0;
326        double widthMultiplier = Level.Width / pohjaLevynKuva.Width;
327        double heightMultiplier = Level.Height / pohjaLevynKuva.Height;
328        pohjaLevy.Execute(BASE_SIZE * widthMultiplier, BASE_SIZE * heightMultiplier);
329
330        PhysicsObject vasenreuna = Level.CreateLeftBorder();
331        vasenreuna.X -= 75;
332        vasenreuna.Tag = "vasenreuna";
333        vasenreuna.CollisionIgnoreGroup = 1; // ettei Jouni törmää
334        PhysicsObject oikeareuna = Level.CreateRightBorder();
335        oikeareuna.Tag = "oikeareuna";
336
337        if (taistelija != null)
338            Varjo(taistelija);
339        TeeKenttaKohtaisetAsiat(kenttaNro);
340    }
341
342    void Luotaistelija(Vector paikka, double leveys, double korkeus)
343    {
344        taistelija = new Elava(150, 150, 100.0);
345        taistelija.Shape = Shape.Rectangle;
346        taistelija.Animation = new Animation(chuckinkavely);
347        taistelija.Animation.Start();
348        taistelija.Tag = "pelaaja";
349        taistelija.Position = paikka;
350        taistelija.Kuoli += PelaajaKuoli;
351
352        AddCollisionHandler(taistelija, "vasenreuna", SeuraavaKentta);
353        //AddCollisionHandler<PhysicsObject, PhysicsObject>(taistelija, "vihollinen", delegate {
354        //    taistelija.Damagea(VIHOLLISEN_TORMAYSDMG);
355        //});
356
357        taistelija.Mass = 10.0;
358        Add(taistelija);
359        Camera.Follow(taistelija);
360        Camera.StayInLevel = true;
361
362        taistelijanAse = new AssaultRifle(20, 10);
363        taistelijanAse.FireRate = 20;
364        taistelijanAse.InfiniteAmmo = true;
365        taistelijanAse.Power.Value = 750;
366        taistelijanAse.Power.DefaultValue = 750;
367        taistelijanAse.AttackSound = ampuminen;
368        taistelijanAse.IsVisible = false;
369        taistelija.Add(taistelijanAse);
370
371        LuoElamaPalkki();
372    }
373
374    void LuoElamaPalkki()
375    {
376        ProgressBar elamat = new ProgressBar(532 / 1.5, 49 / 1.5);
377        elamat.BindTo(taistelija.Elamat);
378        elamat.Left = Screen.Left + 40;
379        elamat.Top = Screen.Top - 40;
380        elamat.Image = ePalkkiTyhja;
381        elamat.BarImage = ePalkkiTaysi;
382        Add(elamat);
383    }
384
385    void LuoTriggerPalikka(Vector paikka, double leveys, double korkeus)
386    {
387        PhysicsObject trigger = new PhysicsObject(leveys, korkeus);
388        trigger.IsVisible = false;
389        trigger.IgnoresCollisionResponse = true;
390        trigger.Tag = "trigger";
391        trigger.Collided += delegate(IPhysicsObject t, IPhysicsObject kohde)
392        {
393            if (tActionTriggered) return;
394            if (kohde.Tag.ToString() == "trigger") return;
395
396            if (TriggerAction != null)
397                TriggerAction();
398
399            tActionTriggered = true;
400        };
401        trigger.Position = paikka;
402        trigger.MakeStatic();
403        Add(trigger);
404    }
405
406    GameObject Varjo(GameObject shadowCaster)
407    {
408        GameObject varjo = new GameObject(70, 30);
409        varjo.Image = taistelijanvarjo;
410        Add(varjo, -1);
411
412        Timer ajastin = new Timer();
413        ajastin.Interval = 1.0 / 60.0;
414        ajastin.Timeout += delegate
415        {
416            varjo.X = shadowCaster.X;
417            varjo.Y = EtsiVarjonY(shadowCaster);
418        };
419        ajastin.Start();
420
421        return varjo;
422    }
423
424    /// <summary>
425    /// Etsii suoraan pelaajan alla olevan lattiapalikan Y-koordinaatin.
426    /// </summary>
427    /// <returns></returns>
428    double EtsiVarjonY(GameObject shadowCaster)
429    {
430        Vector rayDown = new Vector(0.0, -2000.0);
431        List<GameObject> possibleObjects = GetObjects(x => x != shadowCaster && x is PhysicsObject);
432        List<GameObject> objectsBelow = new List<GameObject>();
433
434        for (int i = 0; i < possibleObjects.Count; i++)
435        {
436            if (possibleObjects[i].IsBlocking(new Vector(shadowCaster.X, shadowCaster.Bottom), new Vector(shadowCaster.X, shadowCaster.Bottom) + rayDown))
437            {
438                objectsBelow.Add(possibleObjects[i]);
439            }
440        }
441
442        if (objectsBelow.Count == 0)
443            return double.MinValue;
444
445        double minDistance = double.MaxValue;
446        int minIndex = -1;
447
448        for (int i = 0; i < objectsBelow.Count; i++)
449        {
450            double currentDistance = Math.Abs(shadowCaster.Bottom - objectsBelow[i].Top);
451            if (currentDistance < minDistance)
452            {
453                minDistance = currentDistance;
454                minIndex = i;
455            }
456        }
457
458        return objectsBelow[minIndex].Top;
459    }
460
461
462    void SeuraavaKentta(PhysicsObject tormaaja, PhysicsObject tormatty)
463    {
464        if (!paaseekoSeuraavaanKenttaan) return;
465
466        ClearAll();
467        taistelija = null;
468        TriggerAction = null;
469        tActionTriggered = false;
470        controlsActive = true;
471
472        kenttaNro++;
473
474        if (kenttaNro > VIIMEINEN_KENTTA)
475        {
476            VoititPelin();
477        }
478
479        else
480        {
481            LuoKentta();
482            AsetaOhjaimet();
483        }
484    }
485
486    void TeeKenttaKohtaisetAsiat(int kentta)
487    {
488        switch (kentta)
489        {
490            case 9:
491                taustamusiikki_1.Stop();
492                MediaPlayer.Play("bossfightmusicAJ");
493                MediaPlayer.IsRepeating = true;
494                TriggerAction += delegate { LuoJouniBoss(new Vector(Screen.Left - jouniBoss.Width / 2 - 20, Screen.Bottom + (jouniBoss.Height / 2) - 100), Screen.Left + jouniBoss.Width / 2); };
495                break;
496            case 10:
497                paaseekoSeuraavaanKenttaan = false;
498                MediaPlayer.Stop();
499                TriggerAction += delegate { LuoChromaCase(ItemType.Knife); };
500                break;
501            case 11:
502                taustamusiikki_1.Play();
503                break;
504            case 16:
505                taustamusiikki_1.Stop();
506                controlsActive = false;
507                Level.AmbientLight = 0.0;
508                KirkastaRuutua(0.03, 1.0);
509                Timer.SingleShot(4.0, delegate { SeuraavaKentta(null, null); });
510                break;
511            case 17:
512                controlsActive = false;
513                Timer.SingleShot(4.0, delegate { PimennaRuutua(0.03, delegate { SeuraavaKentta(null, null); }); });
514                break;
515            case 18:
516                controlsActive = false;
517                taistelija.Size *= 0.5;
518                taustamusiikki_1.Stop();
519                MediaPlayer.Play("bossfightmusicAJ");
520                MediaPlayer.IsRepeating = true;
521                LuoAnttiJussi(new Vector(0.0, Screen.Top + anttijussiboss.Height));
522                break;
523            default:
524                break;
525        }
526    }
527
528    void LuoPohja(Vector paikka, double leveys, double korkeus)
529    {
530        PhysicsObject pala = PhysicsObject.CreateStaticObject(leveys, korkeus);
531        pala.Position = paikka;
532        pala.IsVisible = false;
533        Add(pala);
534    }
535
536    void LuoChromaCase(ItemType forceItem)
537    {
538        Mouse.IsCursorVisible = true;
539
540        List<GameObject> pItems = new List<GameObject>();
541        GameObject knife = new GameObject(LoadImage("rareitem_knife"));
542        knife.Tag = new object[2] {(object)50.0, (object)ItemType.Knife};
543        pItems.Add(knife);
544
545        GameObject avain = new GameObject(LoadImage("rareitem_avain_small"));
546        avain.Tag = new object[2] { (object)50.0, (object)ItemType.Key };
547        pItems.Add(avain);
548       
549        GameObject cCaseDialog = new GameObject(cCaseD); // koko debug
550        Add(cCaseDialog);
551
552        Mouse.ListenOn(cCaseDialog, MouseButton.Left, ButtonState.Pressed, delegate
553        {
554            cCaseDialog.Destroy();
555
556            GameObject cCaseFront = new GameObject(cCaseF);
557
558            if (forceItem == ItemType.Knife)
559            {
560                ChromaCase cCase = new ChromaCase(pItems, cCaseFront, knife, 20);
561                cCase.Add(new Vector(0.0, Level.Bottom + cCaseFront.Height / 2), 2);
562                cCase.ItemReceived += delegate(GameObject o) { GotItemFromCase(o); };
563                cCase.ItemRelativePosition = new Vector((472 - 467.5), (455 - 204));
564                cCase.Start();
565            }
566            else
567            {
568                ChromaCase cCase = new ChromaCase(pItems, cCaseFront, avain, 20);
569                cCase.Add(new Vector(0.0, Level.Bottom + cCaseFront.Height / 2), 2);
570                cCase.ItemReceived += delegate(GameObject o) { GotItemFromCase(o); };
571                cCase.ItemRelativePosition = new Vector((472 - 467.5), (455 - 204));
572                cCase.Start();
573            }
574        }, null);
575    }
576
577    void GotItemFromCase(GameObject o)
578    {
579        ItemType gotType = (ItemType)(((object[])o.Tag)[1]);
580
581        switch (gotType)
582        {
583            case ItemType.Knife:
584                GameObject inspect = new GameObject(karambitInspect);
585                inspect.Position = Camera.ScreenToWorld(Screen.Center);
586                karambitfadeSound.Play();
587                Timer.SingleShot(karambitfadeSound.Duration.Seconds + 1, delegate
588                {
589                    inspect.Destroy();
590                    tActionTriggered = false;
591                    TriggerAction = null;
592                    TriggerAction = delegate { LuoChromaCase(ItemType.Key); };
593                });
594                Add(inspect);
595                break;
596            case ItemType.Key:
597                GameObject inspectKey = new GameObject(keyInspect);
598                inspectKey.Position = Camera.ScreenToWorld(Screen.Center);
599                taisteletiesi.Play();
600                Timer.SingleShot(taisteletiesi.Duration.Seconds + 1, delegate
601                {
602                    inspectKey.Destroy();
603                    paaseekoSeuraavaanKenttaan = true;
604                });
605                Add(inspectKey);
606                break;
607            default:
608                break;
609        }
610    }
611
612    /// <summary>
613    /// Asetetaan pelaajalle ohjaimet.
614    /// </summary>
615    void AsetaOhjaimet()
616    {
617        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, null, taistelija, -NOPEUS);
618        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, null, taistelija, NOPEUS);
619        Keyboard.Listen(Key.W, ButtonState.Pressed, LiikutaYlos, null, taistelija);
620        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
621        Keyboard.Listen(Key.Space, ButtonState.Down, Ammu, null);
622        Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, delegate { walkBackwards = true; }, null);
623        Keyboard.Listen(Key.LeftShift, ButtonState.Released, delegate { walkBackwards = false; }, null);
624
625
626        // haxnapit
627
628        Keyboard.Listen(Key.N, ButtonState.Pressed, delegate { taistelija.IgnoresCollisionResponse = true; }, null);
629        Keyboard.Listen(Key.N, ButtonState.Released, delegate { taistelija.IgnoresCollisionResponse = false; }, null);
630
631        Keyboard.Listen(Key.K, ButtonState.Pressed, delegate { SeuraavaKentta(null, null); }, null);
632    }
633
634    void Ammu()
635    {
636        if (!controlsActive) return;
637
638        if (taistelijanAse == null) 
639            return;
640
641        PhysicsObject ammus = taistelijanAse.Shoot();
642
643        if (ammus == null) 
644            return;
645        ammus.Size *= 0.2;
646
647        ammus.Hit(new Vector(0.0, RandomGen.NextDouble(-WEAPON_INACCURACY, WEAPON_INACCURACY)));
648        ammus.IsUpdated = true;
649        ammus.NeedsUpdateCall = true;
650        ammus.CanRotate = false;
651        ammus.Updated += delegate(PhysicsObject a) 
652        { 
653             DrawTracers(a, Color.Yellow, 0.2, 2.0); 
654        };
655
656        AddCollisionHandler(ammus, "vihollinen", AmmusOsuuViholliseen);
657        AddCollisionHandler(ammus, "jouni", AmmusOsuuViholliseen);
658        AddCollisionHandler(ammus, "anttijussi", AmmusOsuuViholliseen);
659
660        AddCollisionHandler<PhysicsObject, PhysicsObject>(ammus, delegate(PhysicsObject a, PhysicsObject k) {
661
662            if (k.Tag.ToString() == "trigger") return;
663            ammus.Destroy();
664        });
665    }
666
667    void AmmusOsuuViholliseen(PhysicsObject ammus, PhysicsObject kohde)
668    {
669        Elava vihu = kohde as Elava;
670
671        if (vihu == null) return;
672
673        vihu.Damagea(ASEEN_DMG);
674    }
675
676    void PelaajaKuoli()
677    {
678        kenttaNro -= kenttaNro % 3; // 3 kentän välein checkpoint
679
680        if (kenttaNro < 1)
681            kenttaNro = 1;
682
683        paaseekoSeuraavaanKenttaan = true;
684
685        taistelija = null;
686        TriggerAction = null;
687        tActionTriggered = false;
688
689
690        ClearAll();
691        LuoKentta();
692        AsetaOhjaimet();
693    }
694
695    void VoititPelin()
696    {
697        MediaPlayer.Stop();
698
699        SeuraavaKentta(null, null);
700        Level.AmbientLight = 0.0;
701        taustamusiikki_1.Stop();
702
703        ClearControls();
704
705        KirkastaRuutua(0.03, 1.0, delegate {
706            hirmuvallanalta.Play();
707            Timer.SingleShot(hirmuvallanalta.Duration.Seconds + 1, delegate
708            {
709                yliopistiolaiset.Play();
710                Timer.SingleShot(yliopistiolaiset.Duration.Seconds, delegate {
711                    PimennaRuutua(0.03, delegate {
712                        Exit();
713                    });
714                });
715            });
716        });
717    }
718}
Note: See TracBrowser for help on using the repository browser.