source: 2013/24/LauriK/Defend The Computer/Defend The Computer/Defend The Computer/Defend_The_Computer.cs @ 4081

Revision 4081, 38.8 KB checked in by tojukarp, 6 years ago (diff)
Line 
1#region Alustus ja luokat
2
3using System;
4using System.Collections.Generic;
5using Jypeli;
6using Jypeli.Assets;
7using Jypeli.Controls;
8using Jypeli.Effects;
9using Jypeli.Widgets;
10
11public class Pelaaja : PhysicsObject
12{
13    public DoubleMeter elamalaskuri;
14    public DoubleMeter suojalaskuri;
15    public DoubleMeter ammuslaskuri;
16    public Pelaaja(double leveys, double korkeus, Shape muoto, Color vari)
17        : base(leveys, korkeus)
18    {
19        this.Shape = muoto;
20        this.Color = vari;
21        this.Mass = 10;
22        this.LinearDamping = 0.3;
23        this.AngularDamping = 0.1;
24        //this.Position = paikka;
25        this.Color = Color.Green;
26        this.Tag = "Pelaaja";
27        this.KineticFriction = 0.7;
28        this.CollisionIgnoreGroup = 2;
29    }
30
31}
32
33public class Vihollinen : PhysicsObject
34{
35    private IntMeter Vihunelamat = new IntMeter(100, 0, 100);
36    public IntMeter vihunelamat { get { return Vihunelamat; } }
37    public Vihollinen(double leveys, double korkeus, Image vihunkuva)
38        : base(leveys, korkeus)
39    {
40        this.Image = vihunkuva;
41        this.Mass = 10;
42        this.LinearDamping = 0.3;
43        this.AngularDamping = 0.9;
44        vihunelamat.LowerLimit += delegate { this.Destroy(); };
45        this.Tag = "Vihu";
46    }
47}
48
49public class Paketti : PhysicsObject
50{
51    public Paketti(double leveys, double korkeus)
52        : base(leveys, korkeus)
53    {
54        this.Mass = 10;
55        this.IgnoresExplosions = false;
56        this.IgnoresCollisionResponse = true;
57    }
58}
59
60public class Defend_The_Computer : PhysicsGame
61{
62    ScoreList pistelista;
63
64    IntMeter pistelaskuri;
65
66    GameObject aseenkuva1;
67
68    GameObject aseenkuva2;
69
70    ExplosionSystem hienorajahdys;
71    ExplosionSystem hienorajahdys2;
72
73    int pelaajienlukumaara2;
74
75    int pakettienlukumaara;
76
77    int vihujenmaara = 0;
78
79    bool AJ = false;
80    bool NC = false;
81    bool noenemies = false;
82
83    bool Debug = false;
84
85    double nopeus = 500;
86    double kaantymisnopeus = 100;
87    [Save]
88    int survivalkentannro;
89    [Save]
90    int vaikeustaso;
91    [Save]
92    int pelaajienlukumaara;
93    [Save]
94    bool aanetpaalla;
95
96    string pelaaja1ase = "Antivirus";
97    string pelaaja2ase = "Antivirus";
98
99    Image Intta = LoadImage("A-J");
100    Image Inttapaha = LoadImage("A-J_bad");
101    Image Egac = LoadImage("NC");
102    Image Egacpaha = LoadImage("NC_bad");
103
104    Image suojakuva = LoadImage("suoja");
105    Image bosskuva = LoadImage("virus_cartoon");
106    Image stopkuva = LoadImage("process_stop");
107
108    Color tekstienvari = Color.LightGreen;
109
110    List<Pelaaja> pelaajat = new List<Pelaaja>();
111
112    Timer aikalaskuri;
113
114    double ruudunkoko = 16;
115
116#endregion
117
118    public override void Begin()
119    {
120        ClearAll();
121
122        pistelista = new ScoreList(10, false, 0);
123
124        pelaajat.Clear();
125
126        IsPaused = true;
127
128        Lataakaikki(false, 0, 0);
129
130        Alkuvalikko();
131    }
132
133    #region Tallennus ja lataus
134
135    void Tyhjennanappaimet()
136    {
137        ClearControls();
138    }
139
140    void Tallennakaikki()
141    {
142        SaveGame("Save.xml");
143    }
144
145    void TallennaLista()
146    {
147        DataStorage.Save<ScoreList>(pistelista, "Survival" + survivalkentannro + pelaajienlukumaara + ".xml");
148    }
149
150    void Lataakaikki(bool kentta, int kenttanro, int players)
151    {
152        if (kentta == true)
153        {
154            pistelista = new ScoreList(10, false, 0);
155            DataStorage.TryLoad<ScoreList>(pistelista, "Survival" + kenttanro + players + ".xml");
156        }
157
158        if (DataStorage.Exists("Save.xml")) LoadGame("Save.xml");
159    }
160
161    #endregion
162
163    #region Valikko
164
165    void Alkuvalikko()
166    {
167        Tyhjennanappaimet();
168
169        MultiSelectWindow alkuvalikko = new MultiSelectWindow("", "Start game", "Highscores", "Help", "Sounds: " + ((aanetpaalla == true) ? "ON" : "OFF"), "Exit");
170        alkuvalikko.AddItemHandler(0, Valitsepelinlataus);
171        alkuvalikko.AddItemHandler(1, Ennatykset);
172        alkuvalikko.AddItemHandler(2, Ohjeet);
173        alkuvalikko.AddItemHandler(3, delegate
174        {
175            aanetpaalla = !aanetpaalla;
176            Tallennakaikki();
177            Alkuvalikko();
178        });
179        alkuvalikko.AddItemHandler(4, delegate
180        {
181            YesNoWindow ikkuna = new YesNoWindow("Do you want to quit?");
182            ikkuna.Yes += Exit;
183            ikkuna.No += delegate
184            {
185                ikkuna.Destroy();
186                Alkuvalikko();
187            };
188            Add(ikkuna);
189        });
190        alkuvalikko.DefaultCancel = 4;
191        Add(alkuvalikko);
192
193        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Exit");
194    }
195
196    void Kentanvalinta()
197    {
198        Tyhjennanappaimet();
199
200        MultiSelectWindow valitsepeli = new MultiSelectWindow("Select level", "Level 1", "Level 2", "Back");
201        valitsepeli.AddItemHandler(0, delegate
202        {
203            survivalkentannro = 1;
204            Valitsevaikeustaso();
205        });
206        valitsepeli.AddItemHandler(1, delegate
207        {
208            survivalkentannro = 2;
209            Valitsevaikeustaso();
210        });
211        valitsepeli.AddItemHandler(2, Valitsepelinlataus);
212        valitsepeli.DefaultCancel = 2;
213        Add(valitsepeli);
214
215        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valitsepelinlataus, "Exit");
216    }
217
218    void Ennatykset()
219    {
220        Tyhjennanappaimet();
221
222        pistelista = new ScoreList(10, false, 0);
223
224        MultiSelectWindow alkuvalikko = new MultiSelectWindow("Select level", "Level 1 (1p)", "Level 1 (2p)", "Level 2 (1p)", "Level 2 (2p)", "Back");
225        alkuvalikko.AddItemHandler(0, delegate
226        {
227            Lataakaikki(true, 1, 1);
228            HighScoreWindow topIkkuna = new HighScoreWindow(
229                              "Highscores: Level 1, 1 players",
230                             pistelista);
231            topIkkuna.Closed += delegate { Ennatykset(); };
232            topIkkuna.List.ScoreFormat = "{0:0.##}";
233            Add(topIkkuna);
234        });
235        alkuvalikko.AddItemHandler(1, delegate
236        {
237            Lataakaikki(true, 1, 2);
238            HighScoreWindow topIkkuna = new HighScoreWindow(
239                              "Highscores: Level 1, 2 players",
240                              pistelista);
241            topIkkuna.Closed += delegate { Ennatykset(); };
242            topIkkuna.List.ScoreFormat = "{0:0.##}";
243            Add(topIkkuna);
244        });
245        alkuvalikko.AddItemHandler(2, delegate
246        {
247            Lataakaikki(true, 2, 1);
248            HighScoreWindow topIkkuna = new HighScoreWindow(
249                              "Highscores: Level 2, 1 players",
250                              pistelista);
251            topIkkuna.Closed += delegate { Ennatykset(); };
252            topIkkuna.List.ScoreFormat = "{0:0.##}";
253            Add(topIkkuna);
254        });
255        alkuvalikko.AddItemHandler(3, delegate
256        {
257            Lataakaikki(true, 2, 2);
258            HighScoreWindow topIkkuna = new HighScoreWindow(
259                              "Highscores: Level 2, 2 players",
260                              pistelista);
261            topIkkuna.Closed += delegate { Ennatykset(); };
262            topIkkuna.List.ScoreFormat = "{0:0.##}";
263            Add(topIkkuna);
264        });
265        alkuvalikko.AddItemHandler(4, Alkuvalikko);
266        alkuvalikko.DefaultCancel = 4;
267        Add(alkuvalikko);
268
269        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Alkuvalikko, "Exit");
270    }
271
272    void Ohjeet()
273    {
274        Alkuvalikko();
275    }
276
277    void Valitsepelinlataus()
278    {
279        Tyhjennanappaimet();
280
281        MultiSelectWindow uusipeli = new MultiSelectWindow("Load existing game?", "New game", "Continue game", "Back");
282        uusipeli.AddItemHandler(0, delegate
283        {
284            survivalkentannro = 1;
285            Valitsepelaajienmaara();
286        });
287        uusipeli.AddItemHandler(1, Aloitapeli);
288        uusipeli.AddItemHandler(2, Alkuvalikko);
289        uusipeli.DefaultCancel = 2;
290        Add(uusipeli);
291
292        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Alkuvalikko, "Exit");
293    }
294
295    void Valitsepelaajienmaara()
296    {
297        Tyhjennanappaimet();
298
299        MultiSelectWindow pelaajienmaara = new MultiSelectWindow("Select number of players", "1 player", "2 players", "Back");
300        pelaajienmaara.AddItemHandler(0, delegate
301        {
302            pelaajienlukumaara = 1;
303            pelaajienlukumaara2 = 1;
304            Kentanvalinta();
305        });
306        pelaajienmaara.AddItemHandler(1, delegate
307        {
308            pelaajienlukumaara = 2;
309            pelaajienlukumaara2 = 2;
310            Kentanvalinta();
311        });
312        pelaajienmaara.AddItemHandler(2, Valitsepelinlataus);
313        pelaajienmaara.DefaultCancel = 2;
314        Add(pelaajienmaara);
315
316        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valitsepelinlataus, "Exit");
317    }
318
319    void Valitsevaikeustaso()
320    {
321        Tyhjennanappaimet();
322
323        MultiSelectWindow vaikeustasonvalinta = new MultiSelectWindow("Select difficulty", "Easy", "Normal", "Hard", "Insane", "Back");
324        vaikeustasonvalinta.AddItemHandler(0, delegate
325        {
326            vaikeustaso = 1;
327            Aloitapeli();
328        });
329        vaikeustasonvalinta.AddItemHandler(1, delegate
330        {
331            vaikeustaso = 2;
332            Aloitapeli();
333        });
334        vaikeustasonvalinta.AddItemHandler(2, delegate
335        {
336            vaikeustaso = 3;
337            Aloitapeli();
338        });
339        vaikeustasonvalinta.AddItemHandler(3, delegate
340        {
341            vaikeustaso = 4;
342            Aloitapeli();
343        });
344        vaikeustasonvalinta.AddItemHandler(4, Valitsepelaajienmaara);
345        vaikeustasonvalinta.DefaultCancel = 4;
346        Add(vaikeustasonvalinta);
347
348        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Kentanvalinta, "Exit");
349    }
350
351    void Paussivalikko()
352    {
353        IsPaused = true;
354
355        MultiSelectWindow paussivalikko = new MultiSelectWindow("Paused", "Continue", "Help", "Cheats", "Exit");
356        paussivalikko.AddItemHandler(0, delegate
357        {
358            IsPaused = false;
359            paussivalikko.Destroy();
360        });
361        paussivalikko.AddItemHandler(1, delegate
362        {
363            Lisaanappaimet();
364            ShowControlHelp();
365            Paussivalikko();
366        });
367
368        paussivalikko.AddItemHandler(2, delegate
369        {
370            InputWindow kysymysIkkuna = new InputWindow("Enter cheat");
371            kysymysIkkuna.TextEntered += Cheat;
372            Add(kysymysIkkuna);
373        });
374
375        paussivalikko.AddItemHandler(3, delegate
376        {
377            Tallennakaikki();
378            IsPaused = false;
379            Begin();
380        });
381        paussivalikko.DefaultCancel = 0;
382
383        Add(paussivalikko);
384
385        //Keyboard.Listen(Key.Escape, ButtonState.Pressed, delegate
386        //{
387        //IsPaused = false;
388        //paussivalikko.Destroy();
389        //}, "Exit");
390    }
391
392    void Cheat(InputWindow ikkuna)
393    {
394        Paussivalikko();
395
396        string vastaus = ikkuna.InputBox.Text;
397
398        if (vastaus == "ajlakane")
399        {
400            AJ = true;
401            MessageDisplay.Add("A-J -mode activated.");
402        }
403        else if (vastaus == "Nicolas Cage")
404        {
405            NC = true;
406            MessageDisplay.Add("Nicolas Cage mode activated.");
407        }
408        else if (vastaus == "Debug")
409        {
410            Debug = true;
411            MessageDisplay.Add("Debug mode activated.");
412        }
413        else if (vastaus == "NoEnemies")
414        {
415            noenemies = true;
416            MessageDisplay.Add("Enemy spawning disabled.");
417        }
418        else if (vastaus == "ClearAll")
419        {
420            AJ = false;
421            NC = false;
422            Debug = false;
423            noenemies = false;
424        }
425        else MessageDisplay.Add("False code!");
426    }
427
428
429    #endregion
430
431    #region Kentan lataus
432
433    void Aloitapeli()
434    {
435        Tallennakaikki();
436
437        ClearAll();
438
439        Lataakaikki(true, survivalkentannro, pelaajienlukumaara);
440
441        IsPaused = false;
442
443        ColorTileMap kentta_pelaaja = ColorTileMap.FromLevelAsset("Selviytyminen" + survivalkentannro);
444
445        kentta_pelaaja.SetTileMethod(Color.FromPaintDotNet(0, 3), Luopelaaja); // pelaaja 1
446
447        if (pelaajienlukumaara == 2)
448        {
449            kentta_pelaaja.SetTileMethod(Color.FromPaintDotNet(0, 4), Luopelaaja); // pelaaja 2
450        };
451
452        //if (pelaajienlukumaara == 3)
453        //{
454        //    kentta_pelaaja.SetTileMethod(Color.Blue, Luopelaaja);
455        //};
456        //if (pelaajienlukumaara == 4)
457        //{
458        //    kentta_pelaaja.SetTileMethod(Color.Gold, Luopelaaja);
459        //};
460
461        kentta_pelaaja.Execute(ruudunkoko, ruudunkoko);
462
463        ColorTileMap kentta = ColorTileMap.FromLevelAsset("Selviytyminen" + survivalkentannro);
464
465        kentta.SetTileMethod(Color.Black, Luoseina);
466        kentta.SetTileMethod(Color.White, Luolattia);
467        kentta.SetTileMethod(Color.FromPaintDotNet(0, 3), Luolattia);
468        kentta.SetTileMethod(Color.FromPaintDotNet(0, 4), Luolattia);
469        kentta.SetTileMethod(Color.FromPaintDotNet(0, 7), Luovoidalue);
470        //kentta.SetTileMethod(Color.Red, Luomaali);
471        //kentta.SetTileMethod(Color.FromPaintDotNet(0, 15), Luovirus);
472        //kentta.SetTileMethod(Color.FromPaintDotNet(1, 0), Luotroijalainen);
473
474        kentta.Execute(ruudunkoko, ruudunkoko);
475
476        Level.CreateBorders(false);
477
478        pakettienlukumaara = 0;
479
480        Gravity = new Vector(0, 0);
481
482        Level.BackgroundColor = Color.Black;
483
484        Lisaanappaimet();
485
486        Luomittarit();
487
488        Luoaikalaskuri();
489
490        Lisaanakyvyysalue();
491
492        Camera.StayInLevel = true;
493
494        hienorajahdys = new ExplosionSystem(LoadImage("yksi"), 200);
495        Add(hienorajahdys);
496        hienorajahdys.MinScale = 4;
497        hienorajahdys.MaxScale = 5;
498        hienorajahdys2 = new ExplosionSystem(LoadImage("nolla"), 200);
499        Add(hienorajahdys2);
500        hienorajahdys2.MinScale = 4;
501        hienorajahdys2.MaxScale = 5;
502    }
503
504    void Luoaikalaskuri()
505    {
506        aikalaskuri = new Timer();
507        aikalaskuri.Start();
508
509        Label aikanaytto = new Label();
510        aikanaytto.TextColor = Color.White;
511        aikanaytto.DecimalPlaces = 1;
512        aikanaytto.BindTo(aikalaskuri.SecondCounter);
513        Add(aikanaytto);
514        aikanaytto.Position = Screen.Center;
515        aikanaytto.Y = Screen.TopSafe - 50;
516    }
517
518    #endregion
519
520    #region Objektit
521
522    #region Pelaajat ja nappaimet
523
524    void Luopelaaja(Vector paikka, double leveys, double korkeus)
525    {
526        Pelaaja pelaaja = new Pelaaja(leveys, korkeus, Shape.Triangle, Color.Green);
527        pelaaja.Mass = 10;
528        pelaaja.LinearDamping = 0.3;
529        pelaaja.AngularDamping = 0.1;
530        pelaaja.Position = paikka;
531        pelaaja.Color = Color.Green;
532        pelaaja.Tag = "Pelaaja";
533
534        pelaajat.Add(pelaaja);
535        Add(pelaaja, 2);
536
537        pelaaja.elamalaskuri = new DoubleMeter(100);
538        pelaaja.elamalaskuri.MaxValue = 100;
539        pelaaja.elamalaskuri.LowerLimit += delegate { Kuoli(pelaaja); };
540
541        pelaaja.suojalaskuri = new DoubleMeter(100, 0, 100);
542        pelaaja.suojalaskuri.MaxValue = 100;
543        pelaaja.suojalaskuri.LowerLimit += delegate { pelaaja.elamalaskuri.Value -= 10; pelaaja.suojalaskuri.Value = 0.001; };
544
545        pelaaja.ammuslaskuri = new DoubleMeter(Double.PositiveInfinity);
546        pelaaja.ammuslaskuri.MinValue = 0;
547        pelaaja.ammuslaskuri.MaxValue = Double.PositiveInfinity;
548        pelaaja.ammuslaskuri.LowerLimit += delegate
549        {
550            if (pelaajat[0] == pelaaja)
551            {
552                pelaaja1ase = "Luoti";
553                pelaaja.ammuslaskuri.Value = Double.PositiveInfinity;
554            }
555            if (pelaajat.Count == 2 && pelaajat[1] == pelaaja)
556            {
557                pelaaja2ase = "Luoti";
558                pelaaja.ammuslaskuri.Value = Double.PositiveInfinity;
559            };
560        };
561
562        Timer ajastin = new Timer();
563        ajastin.Interval = 1;
564        ajastin.Timeout += delegate
565        {
566            if (AJ == true) pelaaja.Image = Intta;
567            if (NC == true) pelaaja.Image = Egac;
568        };
569        ajastin.Start();
570
571    }
572
573    void Luomittarit()
574    {
575        ProgressBar pelaaja1elamapalkki = new ProgressBar(150, 20);
576        pelaaja1elamapalkki.Left = Screen.LeftSafe + 50;
577        pelaaja1elamapalkki.Top = Screen.TopSafe - 50;
578        pelaaja1elamapalkki.BindTo(pelaajat[0].elamalaskuri);
579        pelaaja1elamapalkki.BorderColor = Color.Black;
580        pelaaja1elamapalkki.BarColor = Color.Red;
581        Add(pelaaja1elamapalkki);
582
583        Label nimi = new Label("Computer 1 health");
584        nimi.Position = pelaaja1elamapalkki.Position;
585        nimi.TextColor = tekstienvari;
586        nimi.Y = pelaaja1elamapalkki.Y + 50;
587        Add(nimi);
588
589        ProgressBar pelaaja1suojapalkki = new ProgressBar(150, 20);
590        pelaaja1suojapalkki.Left = Screen.LeftSafe + 50;
591        pelaaja1suojapalkki.Top = pelaaja1elamapalkki.Top - 100;
592        pelaaja1suojapalkki.BindTo(pelaajat[0].suojalaskuri);
593        pelaaja1suojapalkki.BorderColor = Color.Black;
594        pelaaja1suojapalkki.BarColor = Color.Blue;
595        Add(pelaaja1suojapalkki);
596
597        Label suojanimi = new Label("Computer 1 firewall");
598        suojanimi.Position = pelaaja1suojapalkki.Position;
599        suojanimi.TextColor = tekstienvari;
600        suojanimi.Y = pelaaja1suojapalkki.Y + 50;
601        Add(suojanimi);
602
603        pistelaskuri = new IntMeter(0);
604
605        Label pistenaytto = new Label();
606        pistenaytto.X = Screen.Center.X;
607        pistenaytto.Top = Screen.Top - 10;
608        pistenaytto.Color = tekstienvari;
609        pistenaytto.BindTo(pistelaskuri);
610        Add(pistenaytto);
611
612        aseenkuva1 = new Widget(50, 50);
613        aseenkuva1.Image = null;
614        aseenkuva1.Color = Color.Gold;
615        aseenkuva1.Left = pelaaja1suojapalkki.Left;
616        aseenkuva1.Y = pelaaja1suojapalkki.Y - 50;
617        Add(aseenkuva1);
618
619        Label panostenmaara1 = new Label("0");
620        panostenmaara1.Size = aseenkuva1.Size;
621        panostenmaara1.Y = aseenkuva1.Y;
622        panostenmaara1.X = aseenkuva1.X + 100;
623        panostenmaara1.TextColor = tekstienvari;
624        Add(panostenmaara1);
625
626        Timer ammukset = new Timer();
627        ammukset.Interval = 0.1;
628        ammukset.Timeout += delegate
629        {
630            if (pelaajat[0].ammuslaskuri.Value > 1e100)
631            {
632                panostenmaara1.Text = "oo";
633            }
634            else
635            {
636                panostenmaara1.Text = pelaajat[0].ammuslaskuri.Value.ToString();
637            }
638        };
639        ammukset.Start();
640
641
642        if (pelaajat.Count == 1) return;
643
644        ProgressBar pelaaja2elamapalkki = new ProgressBar(150, 20);
645        pelaaja2elamapalkki.Right = Screen.RightSafe - 50;
646        pelaaja2elamapalkki.Top = Screen.TopSafe - 50;
647        pelaaja2elamapalkki.BindTo(pelaajat[1].elamalaskuri);
648        pelaaja2elamapalkki.BorderColor = Color.Black;
649        pelaaja2elamapalkki.BarColor = Color.Red;
650        Add(pelaaja2elamapalkki);
651
652        Label nimi2 = new Label("Computer 2 health");
653        nimi2.Position = pelaaja2elamapalkki.Position;
654        nimi2.TextColor = tekstienvari;
655        nimi2.Y = pelaaja2elamapalkki.Y + 50;
656        Add(nimi2);
657
658        ProgressBar pelaaja2suojapalkki = new ProgressBar(150, 20);
659        pelaaja2suojapalkki.Right = Screen.RightSafe - 50;
660        pelaaja2suojapalkki.Top = pelaaja2elamapalkki.Top - 100;
661        pelaaja2suojapalkki.BindTo(pelaajat[1].suojalaskuri);
662        pelaaja2suojapalkki.BorderColor = Color.Black;
663        pelaaja2suojapalkki.BarColor = Color.Blue;
664        Add(pelaaja2suojapalkki);
665
666        Label suojanimi2 = new Label("Computer 2 firewall");
667        suojanimi2.Position = pelaaja2suojapalkki.Position;
668        suojanimi2.TextColor = tekstienvari;
669        suojanimi2.Y = pelaaja2suojapalkki.Y + 50;
670        Add(suojanimi2);
671
672        aseenkuva2 = new GameObject(20, 20);
673        aseenkuva2.Image = null;
674        aseenkuva2.X = pelaaja2suojapalkki.X;
675        aseenkuva2.Y = pelaaja2suojapalkki.Y - 100;
676        Add(aseenkuva2);
677
678        Label panostenmaara2 = new Label(pelaajat[1].ammuslaskuri);
679        panostenmaara2.Y = aseenkuva2.Y;
680        panostenmaara2.X = aseenkuva2.X + 10;
681        panostenmaara2.TextColor = tekstienvari;
682        Add(panostenmaara2);
683    }
684
685    void Lisaanakyvyysalue()
686    {
687        //todo
688
689        //Widget nakyvyysalue = new Widget(200, 200); //(Screen.WidthSafe, Screen.HeightSafe);
690        //nakyvyysalue.Image = LoadImage("Alue");
691        //Add(nakyvyysalue, 1);
692
693        //Timer ajastin = new Timer();
694        //ajastin.Interval = 0.1;
695        //ajastin.Timeout += delegate
696        //{
697        //    nakyvyysalue.Position = Screen.Center;
698        //};
699        //ajastin.Start();
700        if (pelaajat.Count == 1)
701        {
702            Camera.Follow(pelaajat[0]);
703            Camera.ZoomFactor = 5;
704            return;
705        }
706
707        Timer ajastin2 = new Timer();
708        ajastin2.Interval = 0.01;
709        ajastin2.Timeout += delegate
710        {
711            Camera.ZoomTo(pelaajat[0].Position, pelaajat[1].Position);
712            Camera.ZoomFactor = Math.Abs(Camera.ZoomFactor * 0.7);
713
714            if (Camera.ZoomFactor > 6)
715            {
716                Camera.ZoomFactor = 6.0;
717            }
718            //nakyvyysalue.Size = new Vector(1800, 1800) * 1 / Camera.ZoomFactor;
719            //nakyvyysalue.Position = (pelaaja1.Position + pelaaja2.Position) * 0.5;
720        };
721        ajastin2.Start();
722
723    }
724
725    void Lisaanappaimet()
726    {
727
728        Keyboard.Listen(Key.W, ButtonState.Down, Liikuta, "Move forward (P1)", pelaajat[0], nopeus);
729        Keyboard.Listen(Key.S, ButtonState.Down, Liikuta, "Move backwards (P1)", pelaajat[0], -nopeus);
730        Keyboard.Listen(Key.A, ButtonState.Down, Kaanna, "Turn (P1)", pelaajat[0], kaantymisnopeus);
731        Keyboard.Listen(Key.D, ButtonState.Down, Kaanna, "Turn (P1)", pelaajat[0], -kaantymisnopeus);
732        Keyboard.Listen(Key.Space, ButtonState.Pressed, Ammu, "Shoot (P1)", pelaajat[0]);
733
734        Keyboard.Listen(Key.R, ButtonState.Pressed, delegate { pelaajat[0].elamalaskuri.Value -= 50; }, null);
735
736        Keyboard.Listen(Key.Q, ButtonState.Pressed, delegate { pistelaskuri.Value++; }, null, pelaajat[0]);
737
738        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Paussivalikko, "Pause");
739        Keyboard.Listen(Key.Back, ButtonState.Pressed, Paussivalikko, "Pause");
740
741        if (pelaajat.Count == 2)
742        {
743            //Lisaagamepadnappaimet(pelaaja2);
744            Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Move forward (P2)", pelaajat[1], nopeus);
745            Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "Move backwards (P2)", pelaajat[1], -nopeus);
746            Keyboard.Listen(Key.Left, ButtonState.Down, Kaanna, "Turn (P2)", pelaajat[1], kaantymisnopeus);
747            Keyboard.Listen(Key.Right, ButtonState.Down, Kaanna, "Turn (P2)", pelaajat[1], -kaantymisnopeus);
748            Keyboard.Listen(Key.RightControl, ButtonState.Pressed, Ammu, "Shoot (P2)", pelaajat[1]);
749        }
750    }
751
752    void Lisaagamepadnappaimet(Pelaaja pelaaja)
753    {
754        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Paussivalikko, "Pause");
755        ControllerOne.Listen(Button.LeftTrigger, ButtonState.Down, Liikuta, "Move forward", pelaaja, nopeus);
756        ControllerOne.Listen(Button.RightTrigger, ButtonState.Down, Liikuta, "Move backwards", pelaaja, -nopeus);
757        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Kaanna, "Turn", pelaaja, kaantymisnopeus);
758        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Kaanna, "Turn", pelaaja, -kaantymisnopeus);
759
760        if (pelaajat.Count == 2)
761        {
762            ControllerTwo.Listen(Button.Back, ButtonState.Pressed, Paussivalikko, "Pause");
763            ControllerTwo.Listen(Button.LeftTrigger, ButtonState.Down, Liikuta, "Move forward", pelaaja, nopeus);
764            ControllerTwo.Listen(Button.RightTrigger, ButtonState.Down, Liikuta, "Move backwards", pelaaja, -nopeus);
765            ControllerTwo.Listen(Button.DPadLeft, ButtonState.Down, Kaanna, "Turn", pelaaja, kaantymisnopeus);
766            ControllerTwo.Listen(Button.DPadRight, ButtonState.Down, Kaanna, "Turn", pelaaja, -kaantymisnopeus);
767        }
768    }
769
770    void Liikuta(Pelaaja tyyppi, double nopeus)
771    {
772        Vector suunta = Vector.FromLengthAndAngle(nopeus, tyyppi.Angle + Angle.FromDegrees(90));
773        tyyppi.Push(suunta * 100);
774    }
775
776    void Kaanna(Pelaaja tyyppi, double kaantymisnopeus)
777    {
778        tyyppi.AngularVelocity = kaantymisnopeus;
779    }
780
781    #region Aseet ja ampuminen
782
783    void Ammu(Pelaaja pelaaja)
784    {
785        Vector vektori = Vector.FromLengthAndAngle(nopeus, pelaaja.Angle + Angle.FromDegrees(90));
786
787        if (pelaajat[0] == pelaaja)
788        {
789            if (pelaaja1ase == "Luoti")
790            {
791                Luoluoti(pelaaja.Position, vektori);
792            }
793
794            if (pelaaja1ase == "Antivirus")
795            {
796                Luoantivirus(pelaaja.Position, vektori);
797            }
798        }
799
800        if (pelaajat.Count == 2 && pelaajat[1] == pelaaja)
801        {
802            if (pelaaja2ase == "Luoti")
803            {
804                Luoluoti(pelaaja.Position, vektori);
805            }
806
807            if (pelaaja2ase == "Antivirus")
808            {
809                Luoantivirus(pelaaja.Position, vektori);
810            }
811        }
812    }
813
814    void Luoluoti(Vector paikka, Vector suunta)
815    {
816        PhysicsObject luoti = new PhysicsObject(5, 5);
817        luoti.CollisionIgnoreGroup = 2;
818        Add(luoti, 2);
819
820        luoti.CanRotate = false;
821        luoti.Position = paikka;
822        luoti.Hit(suunta * 0.5);
823
824        AddCollisionHandler(luoti, "Seina", Aseosuiseinaan);
825        AddCollisionHandler(luoti, "Vihu", Aseosui);
826    }
827
828    void Luoantivirus(Vector paikka, Vector suunta)
829    {
830        PhysicsObject antivirus = new PhysicsObject(ruudunkoko * 0.5, ruudunkoko * 0.5);
831        antivirus.Mass = 10;
832        antivirus.Image = null;
833        antivirus.IgnoresExplosions = true;
834        antivirus.Position = paikka;
835        Add(antivirus);
836        antivirus.CollisionIgnoreGroup = 2;
837
838        antivirus.MaximumLifetime = new TimeSpan(0, 0, 20);
839
840        antivirus.Hit(suunta);
841
842        FollowerBrain aivo = new FollowerBrain("Vihu");
843        aivo.Speed = nopeus * 0.5;
844        aivo.TurnWhileMoving = true;
845        antivirus.Brain = aivo;
846
847        AddCollisionHandler(antivirus, Antivirusosui);
848
849    }
850
851    void Antivirusosui(PhysicsObject antivirus, PhysicsObject virus)
852    {
853        if (virus.Tag.ToString() == "Vihu")
854        {
855            Vihollinen vihollinen = (Vihollinen)virus;
856            vihollinen.vihunelamat.Value -= 100;
857
858            Explosion rajahdys = new Explosion(10);
859            rajahdys.Force = 0;
860            rajahdys.Position = antivirus.Position;
861            if (aanetpaalla == false) rajahdys.Sound = null;
862            Add(rajahdys, 2);
863
864            antivirus.Destroy();
865
866            if (vihollinen.vihunelamat.Value < 1)
867            {
868                pistelaskuri.Value += 10;
869                hienorajahdys.AddEffect(vihollinen.Position, 30);
870                hienorajahdys2.AddEffect(vihollinen.Position, 30);
871            }
872        }
873    }
874
875    void Aseosui(PhysicsObject osuja, PhysicsObject kohde)
876    {
877        Vihollinen vihollinen = (Vihollinen)kohde;
878        vihollinen.vihunelamat.Value -= 10;
879
880        vihollinen.Brain.Active = false;
881
882        Timer.SingleShot(5, delegate { vihollinen.Brain.Active = true; });
883
884        kohde.Push((osuja.Position - kohde.Position).Normalize() * 150000);
885
886        Explosion rajahdys = new Explosion(5);
887        rajahdys.Force = 0;
888        rajahdys.Position = osuja.Position;
889        Add(rajahdys, 2);
890
891        osuja.Destroy();
892
893        if (vihollinen.vihunelamat.Value < 1)
894        {
895            pistelaskuri.Value += 10;
896            hienorajahdys.AddEffect(vihollinen.Position, 30);
897            hienorajahdys2.AddEffect(vihollinen.Position, 30);
898        }
899    }
900
901    void Aseosuiseinaan(PhysicsObject osuja, PhysicsObject seina)
902    {
903        Explosion rajahdys = new Explosion(5);
904        rajahdys.Force = 0;
905        rajahdys.Position = osuja.Position;
906        if (aanetpaalla == false) rajahdys.Sound = null;
907        Add(rajahdys, 2);
908
909        osuja.Destroy();
910    }
911
912    #endregion
913
914    void Kuoli(Pelaaja pelaaja)
915    {
916        Explosion rajahdys = new Explosion(50);
917        rajahdys.Position = pelaaja.Position;
918        rajahdys.Force = 0;
919        if (aanetpaalla == false) rajahdys.Sound = null;
920        Add(rajahdys, 2);
921
922        pelaaja.Destroy();
923
924        pelaajienlukumaara2 -= 1;
925
926        if (pelaajienlukumaara2 == 0)
927        {
928            Pelipaattyi();
929        }
930    }
931
932    #endregion
933
934    #region Vihut
935
936    void Luovihu(Vector paikka, double spawnausmatka, double leveys, double korkeus, double damage, string vihuntyyppi, double suunnanvaihtomin, double suunnanvaihtomax, double kaukonopeus, double lahinopeus, double kaukanaolo, int kuolemaaika, Action<Vihollinen> toiminto, Image kuva)
937    {
938        Vihollinen vihu = new Vihollinen(leveys, korkeus, kuva);
939
940        if (Vector.Distance(paikka, pelaajat[0].Position) > spawnausmatka)
941        {
942            Add(vihu, 0);
943        }
944
945        if (pelaajat.Count == 2 && Vector.Distance(paikka, pelaajat[1].Position) > spawnausmatka)
946        {
947            Add(vihu, 0);
948        }
949
950        vihu.Position = paikka;
951
952        AddCollisionHandler<Vihollinen, Pelaaja>(vihu, delegate(Vihollinen tormaaja, Pelaaja kohde) { kohde.suojalaskuri.Value -= damage; });
953        AddCollisionHandler<Vihollinen, Pelaaja>(vihu, delegate(Vihollinen tormaaja, Pelaaja kohde) { kohde.Hit(kohde.Position - tormaaja.Position.Normalize() * 50000); });
954
955        if (kuva != null) vihu.Shape = Shape.FromImage(kuva);
956        RandomMoverBrain satunnaisaivot = new RandomMoverBrain();
957        satunnaisaivot.ChangeMovementSeconds = RandomGen.NextDouble(suunnanvaihtomin, suunnanvaihtomax);
958        satunnaisaivot.Speed = kaukonopeus;
959
960        // FollowerBrain aivot = new FollowerBrain(pelaajat.ToArray());
961        FollowerBrain aivot = new FollowerBrain("Pelaaja", "Seurattava");
962        aivot.Speed = lahinopeus;
963        aivot.DistanceFar = kaukanaolo;
964        aivot.FarBrain = satunnaisaivot;
965        aivot.TurnWhileMoving = true;
966
967        aivot.StopWhenTargetClose = false;
968
969        if (toiminto != null) aivot.TargetClose += delegate { toiminto(vihu); };
970
971        vihu.MaximumLifetime = new TimeSpan(0, 0, kuolemaaika);
972
973        vihu.Brain = aivot;
974
975        Timer ajastin = new Timer();
976        ajastin.Interval = 1;
977        ajastin.Timeout += delegate
978        {
979            if (AJ == true) vihu.Image = Inttapaha;
980            if (NC == true) vihu.Image = Egacpaha;
981        };
982        ajastin.Start();
983    }
984
985    void Vihuspawneri(Vector paikka)
986    {
987        Timer ajastin = new Timer();
988        ajastin.Interval = RandomGen.NextDouble(1, 5);
989        ajastin.Timeout += delegate
990        {
991            if (noenemies == false)
992            {
993                double luku = RandomGen.NextDouble(0, 100);
994
995                if (luku < 0.05 * vaikeustaso)
996                {
997                    if (Debug == true)
998                    {
999                        vihujenmaara++;
1000                        MessageDisplay.Add("Vihuja lisätty " + vihujenmaara.ToString());
1001                    }
1002
1003                    Luovihu(paikka, ruudunkoko * 6, ruudunkoko, ruudunkoko, 10, "Nopea", 0.1, 1, nopeus * 0.5, nopeus * 0.7, ruudunkoko * 6, 20, null, null);
1004                }
1005
1006                else if (luku < 0.2 * vaikeustaso)
1007                {
1008                    if (Debug == true)
1009                    {
1010                        vihujenmaara++;
1011                        MessageDisplay.Add("Vihuja lisätty " + vihujenmaara.ToString());
1012                    }
1013                    Luovihu(paikka, ruudunkoko * 6, ruudunkoko, ruudunkoko, 10, "Perus", 0.1, 3, nopeus * 0.2, nopeus * 0.5, ruudunkoko * 6, 20, null, null);
1014                }
1015
1016                else if (luku < 1 * vaikeustaso)
1017                {
1018                    if (Debug == true)
1019                    {
1020                        vihujenmaara++;
1021                        MessageDisplay.Add("Vihuja lisätty " + vihujenmaara.ToString());
1022                    }
1023                    Luovihu(paikka, ruudunkoko * 6, ruudunkoko, ruudunkoko, 10, "Perus", 0.5, 5, nopeus * 0.2, nopeus * 0.4, ruudunkoko * 6, 20, null, stopkuva);
1024                }
1025
1026                // delegate(Vihollinen v) { v.Color = Color.Black; } -> Actioniin
1027            }
1028        };
1029        ajastin.Start();
1030    }
1031
1032    #endregion
1033
1034    #region Muut
1035
1036    void Luoseina(Vector paikka, double leveys, double korkeus)
1037    {
1038        PhysicsObject seina = new PhysicsObject(leveys, korkeus, Shape.Rectangle);
1039        seina.Position = paikka;
1040        seina.Mass = 1000000000;
1041        seina.IgnoresExplosions = true;
1042        seina.IgnoresPhysicsLogics = true;
1043        seina.CollisionIgnoreGroup = 1;
1044        seina.Color = Color.Gold;
1045        seina.Tag = "Seina";
1046        Add(seina, -1);
1047    }
1048
1049    void Luolattia(Vector paikka, double leveys, double korkeus)
1050    {
1051        GameObject lattia = new GameObject(leveys, korkeus);
1052        lattia.Position = paikka;
1053        lattia.Tag = "Lattia";
1054        Add(lattia, -3);
1055        lattia.Color = Color.Transparent;
1056
1057        Vihuspawneri(paikka);
1058        Pakettispawneri(paikka);
1059    }
1060
1061    void Luovoidalue(Vector paikka, double leveys, double korkeus)
1062    {
1063        PhysicsObject alue = new PhysicsObject(leveys, korkeus);
1064        alue.Position = paikka;
1065        alue.IgnoresCollisionResponse = true;
1066        alue.IgnoresPhysicsLogics = true;
1067        alue.Color = Color.Transparent;
1068
1069        AddCollisionHandler(alue, Osuivoidiin);
1070    }
1071
1072    void Osuivoidiin(PhysicsObject alue, PhysicsObject kohde)
1073    {
1074        if (kohde.Tag.ToString() != "Seina") kohde.Destroy();
1075    }
1076
1077    #region Paketit
1078
1079    void Luohealthpaketti(Vector paikka, double leveys, double korkeus)
1080    {
1081
1082        if (Vector.Distance(paikka, pelaajat[0].Position) > ruudunkoko * 6)
1083        {
1084            Paketti healthpaketti = new Paketti(leveys, korkeus);
1085            healthpaketti.Position = paikka;
1086            //healthpaketti.Image = null;
1087            healthpaketti.Color = Color.Red;
1088            healthpaketti.Tag = "Elamaa";
1089            Add(healthpaketti, 1);
1090
1091            AddCollisionHandler(healthpaketti, "Pelaaja", Osuihealthpakettiin);
1092        }
1093    }
1094
1095    void Osuihealthpakettiin(PhysicsObject paketti, PhysicsObject pelaaja)
1096    {
1097        if (Debug == true) MessageDisplay.Add("Osuttiin healthpakettiin.");
1098
1099        if (pelaaja == pelaajat[0])
1100        {
1101            paketti.Destroy();
1102            pelaajat[0].elamalaskuri.Value += 10;
1103        }
1104
1105        if (pelaajat.Count == 2 && pelaaja == pelaajat[1])
1106        {
1107            paketti.Destroy();
1108            pelaajat[1].elamalaskuri.Value += 10;
1109        }
1110    }
1111
1112    void Luosuojapaketti(Vector paikka, double leveys, double korkeus)
1113    {
1114        if (Vector.Distance(paikka, pelaajat[0].Position) > ruudunkoko * 6)
1115        {
1116            Paketti suojapaketti = new Paketti(leveys, korkeus);
1117            suojapaketti.Position = paikka;
1118            suojapaketti.Image = suojakuva;
1119            suojapaketti.Shape = Shape.FromImage(suojakuva);
1120            suojapaketti.Tag = "Suojaa";
1121            suojapaketti.Color = Color.Blue;
1122            Add(suojapaketti, 1);
1123
1124            AddCollisionHandler(suojapaketti, "Pelaaja", Osuisuojapakettiin);
1125        }
1126    }
1127
1128    void Osuisuojapakettiin(PhysicsObject paketti, PhysicsObject pelaaja)
1129    {
1130        if (Debug == true) MessageDisplay.Add("Osuttiin suojapakettiin.");
1131
1132        if (pelaaja == pelaajat[0])
1133        {
1134            paketti.Destroy();
1135            pelaajat[0].suojalaskuri.Value += 10;
1136        }
1137
1138        if (pelaajat.Count == 2 && pelaaja == pelaajat[1])
1139        {
1140            paketti.Destroy();
1141            pelaajat[1].suojalaskuri.Value += 10;
1142        }
1143    }
1144
1145    void Luoasepaketti(Vector paikka, double leveys, double korkeus)
1146    {
1147        if (Vector.Distance(paikka, pelaajat[0].Position) > ruudunkoko * 6)
1148        {
1149            Paketti asepaketti = new Paketti(leveys, korkeus);
1150            asepaketti.Position = paikka;
1151            //asepaketti.Image = null;
1152            asepaketti.Tag = "Aseita";
1153            asepaketti.Color = Color.HanPurple;
1154            Add(asepaketti, 1);
1155
1156            AddCollisionHandler(asepaketti, "Pelaaja", Osuiasepakettiin);
1157        }
1158    }
1159
1160    void Osuiasepakettiin(PhysicsObject paketti, PhysicsObject pelaaja)
1161    {
1162
1163        if (Debug == true) MessageDisplay.Add("Osuttiin asepakettiin.");
1164
1165        if (pelaaja == pelaajat[0])
1166        {
1167            paketti.Destroy();
1168        }
1169
1170        if (pelaajat.Count == 2 && pelaaja == pelaajat[1])
1171        {
1172            paketti.Destroy();
1173        }
1174    }
1175
1176    void Pakettispawneri(Vector paikka)
1177    {
1178        Timer ajastin = new Timer();
1179        ajastin.Interval = RandomGen.NextDouble(1, 10);
1180        ajastin.Timeout += delegate
1181        {
1182            double luku = RandomGen.NextDouble(0, 100);
1183
1184            if (luku < 0.5 / vaikeustaso)
1185            {
1186                pakettienlukumaara += 1;
1187
1188                if (pakettienlukumaara > 3)
1189                {
1190                    if (Debug == true) MessageDisplay.Add("Paketti luotu.");
1191
1192                    int toinenluku = RandomGen.NextInt(1, 4);
1193
1194                    if (toinenluku == 1) Luohealthpaketti(paikka, ruudunkoko, ruudunkoko);
1195
1196                    if (toinenluku == 2) Luosuojapaketti(paikka, ruudunkoko, ruudunkoko);
1197
1198                    if (toinenluku == 3) Luoasepaketti(paikka, ruudunkoko, ruudunkoko);
1199                }
1200            }
1201        };
1202        ajastin.Start();
1203    }
1204
1205    #endregion
1206
1207    #endregion
1208
1209    #endregion
1210
1211    #region Pelin lopetus
1212
1213    void Pelipaattyi()
1214    {
1215        aikalaskuri.Stop();
1216
1217        Lataakaikki(true, survivalkentannro, pelaajienlukumaara);
1218
1219        pistelaskuri.Value = pistelaskuri.Value += (int)Math.Round(aikalaskuri.SecondCounter.Value);
1220
1221        HighScoreWindow topIkkuna = new HighScoreWindow(
1222                             "Highscores",
1223                             "Congratulations, you made it to the high score list with \n{0:0.##} points! Enter your name:",
1224                             pistelista, pistelaskuri);
1225        topIkkuna.List.ScoreFormat = "{0:0.##}";
1226        topIkkuna.Closed += delegate
1227        {
1228            TallennaLista();
1229            Tallennakaikki();
1230            Begin();
1231        };
1232        Add(topIkkuna);
1233    }
1234
1235    #endregion
1236}
Note: See TracBrowser for help on using the repository browser.