source: 2014/26/OtsoR/Projekti/Projekti/Projekti/Projekti.cs @ 5164

Revision 5164, 38.3 KB checked in by otelretu, 6 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Projekti : PhysicsGame
10{
11    public static Projekti Peli;
12
13    Image[] shipimages = new Image[100];
14    Color[] shipcolors = { Color.Blue, Color.Blue, Color.Purple, Color.DarkGray };
15    Color[] shipcolors2 = { Color.Orange, Color.Gold, Color.HotPink, Color.Wheat };
16    Image screen = LoadImage("titlescreen");
17    Image bigenemy = LoadImage("bigenemy");
18    Image fighterimg = LoadImage("fighter");
19    Image carrierimg = LoadImage("carrier");
20    Image pointer = LoadImage("pointer");
21    Image rdamage = LoadImage("rdamage");
22    Image rrepair = LoadImage("rrepair");
23    Image homing = LoadImage("missile");
24   
25    SoundEffect Arena = LoadSoundEffect("Sounds/Arena");
26    SoundEffect Laser = LoadSoundEffect("Sounds/Laser");
27    SoundEffect Power = LoadSoundEffect("Sounds/Power");
28    SoundEffect Stapler = LoadSoundEffect("Sounds/Stapler");
29    SoundEffect Tada = LoadSoundEffect("Sounds/Tada");
30
31    String[] weaponnames = { "Auto-Gun", "Railgun", "Plasma Cannon", "Missile Launcher" };
32
33    PhysicsObject topedge;
34    PhysicsObject bottomedge;
35    PhysicsObject leftedge;
36    PhysicsObject rightedge;
37
38    public Player ship1;
39    public Player ship2;
40    Weapon hostilew;
41    GameObject line;
42    PhysicsObject ammus;
43
44    Label number;
45    Label number2;
46    Label colour;
47    Label weaponlabel;
48    Label weaponlabel2;
49    Widget aluskuva;
50    Widget aluskuva2;
51    IntMeter shipimg;
52    IntMeter shipcolor1;
53    IntMeter shipwpn;
54    IntMeter shipimg2;
55    IntMeter shipcolor2;
56    IntMeter shipWeapon2;
57    IntMeter points;
58   
59    // Eri alusten/esineiden määrä.
60    int shipcounter;
61    int bigshipcounter;
62    int runecounter;
63    int fighters;
64    public override void Begin()
65    {
66        Peli = this;
67        ClearAll();
68        Level.Background.Image = screen;
69        Level.BackgroundColor = Color.Black;
70        Vector height = new Vector(Level.Background.Left, Level.Background.Bottom);
71        Vector width = new Vector(Level.Background.Right, Level.Background.Top);
72        Camera.ZoomTo(height, width);
73        Camera.Zoom(1);
74        Camera.StayInLevel = false;
75
76        IsFullScreen = true;
77
78        for (int i = 1; i <= 100; i++)
79        {
80            shipimages[i - 1] = LoadImage("Ships/s" + i);
81        }
82        SmoothTextures = false;
83        IsMouseVisible = true;
84        MultiSelectWindow numberofplayersmenu = new MultiSelectWindow("Main menu", "1 Player", "2 Players(Gamepads)", "Quit");
85        numberofplayersmenu.ItemSelected += mainmenu;
86        Add(numberofplayersmenu);
87    }
88
89    void mainmenu(int choice)
90    {
91        switch (choice)
92        {
93            case 0:
94                ClearAll();
95                singleplayer();
96                break;
97            case 1:
98                ClearAll();
99                coop();
100                break;
101            case 2:
102                Exit();
103                break;
104        }
105    }
106
107    void singleplayer()
108    {
109        aluskuva = new Widget(50, 50);
110        aluskuva.X = 0;
111        aluskuva.Y = 250;
112        aluskuva.Image = shipimages[0];
113        Add(aluskuva);
114
115        shipimg = new IntMeter(1, 1, 100);
116        shipimg.Changed += Changeship1;
117        shipwpn = new IntMeter(1, 1, 4);
118        shipwpn.Changed += delegate { weaponlabel.Text = weaponnames[shipwpn.Value - 1]; };
119        shipcolor1 = new IntMeter(0, 0, 3);
120        shipcolor1.Changed += Changeship1;
121
122        number = new Label();
123        number.BindTo(shipimg);
124        number.X = 0;
125        number.Y = 300;
126        Add(number);
127
128        colour = new Label("Style");
129        colour.X = -125;
130        colour.Y = 125;
131        Add(colour);
132
133        weaponlabel = new Label(weaponnames[0]);
134        weaponlabel.X = 125;
135        weaponlabel.Y = 125;
136        Add(weaponlabel);
137
138        Slider shiptype = new Slider(550, 10);
139        shiptype.X = 0;
140        shiptype.Y = 200;
141        shiptype.BindTo(shipimg);
142        Slider shipcolour = new Slider(125, 15);
143        shipcolour.X = -125;
144        shipcolour.Y = 150;
145        shipcolour.BindTo(shipcolor1);
146        Slider shipweapon = new Slider(125, 15);
147        shipweapon.X = 125;
148        shipweapon.Y = 150;
149        shipweapon.BindTo(shipwpn);
150
151        Add(shiptype);
152        Add(shipcolour);
153        Add(shipweapon);
154
155        PushButton button = new PushButton("Start");
156        button.Pressed += singleplayerbase;
157        Keyboard.Enable(Key.Enter);
158        Keyboard.Listen(Key.Enter, ButtonState.Pressed, delegate
159        {
160            singleplayerbase();
161            Keyboard.Disable(Key.Enter);
162           
163        }, null);
164        Add(button);
165
166        PushButton back = new PushButton("Back");
167        back.Pressed += delegate { Begin(); };
168        back.Position = new Vector(-200, 0);
169        Add(back);
170    }
171
172    void Changeship1(int vanha, int uusi)
173    {
174        aluskuva.Image = shipimages[shipimg.Value - 1].Clone();
175        aluskuva.Image.ReplaceColor(Color.White, shipcolors[shipcolor1.Value]);
176        aluskuva.Image.ReplaceColor(Color.Black, shipcolors2[shipcolor1.Value]);
177    }
178
179    void Changeship2(int vanha, int uusi)
180    {
181        aluskuva2.Image = shipimages[shipimg2.Value - 1].Clone();
182        aluskuva2.Image.ReplaceColor(Color.White, shipcolors[shipcolor2.Value]);
183        aluskuva2.Image.ReplaceColor(Color.Black, shipcolors2[shipcolor2.Value]);
184    }
185
186    void Createship(double x, double y)
187    {
188        ship1 = new Player(14, 14, Shape.FromImage(aluskuva.Image));
189        ship1.Image = aluskuva.Image;
190
191        ship1.Restitution = 1.0;
192        ship1.Color1 = shipcolors[shipcolor1.Value];
193        ship1.Color2 = shipcolors2[shipcolor1.Value];
194        ship1.cannonImage = LoadImage("missile");
195        ship1.cannonImage.ReplaceColor(Color.White, ship1.Color1);
196        ship1.cannonImage.ReplaceColor(Color.Black, ship1.Color2);
197
198        ship1.X = x;
199        ship1.Y = y;
200        ship1.KineticFriction = 0.0;
201        ship1.MomentOfInertia = Double.PositiveInfinity;
202        ship1.LinearDamping = 0.95;
203        ship1.AngularDamping = 0.95;
204        Add(ship1);
205        choice(shipwpn.Value);
206        ship1.Add(ship1.weapon);
207        ship1.CollisionIgnoreGroup = 1;
208        ship1.Tag = "player";
209        ship1.Destroyed += playerdeath;
210        ship1.Destroyed += delegate { 
211            ship1.weapon.Destroy(); 
212        };
213
214        if (ship1.weapon is LaserGun)
215        {
216            line = new GameObject(1000, 1.25);
217            line.Image = pointer;
218            line.X = 500;
219            ship1.Add(line);
220        }
221    }
222
223    void Createship2(double x, double y)
224    {
225        ship2 = new Player(14, 14, Shape.FromImage(aluskuva2.Image));
226        ship2.Image = aluskuva2.Image;
227        ship2.X = x;
228        ship2.Y = y;
229        ship2.Color1 = shipcolors[shipcolor2.Value];
230        ship2.Color2 = shipcolors2[shipcolor2.Value];
231        ship2.cannonImage = LoadImage("missile");
232        ship2.cannonImage.ReplaceColor(Color.White, ship2.Color1);
233        ship2.cannonImage.ReplaceColor(Color.Black, ship2.Color2);
234
235        ship2.Restitution = 1.0;
236        ship2.KineticFriction = 0.0;
237        ship2.MomentOfInertia = Double.PositiveInfinity;
238        ship2.LinearDamping = 0.95;
239        ship2.AngularDamping = 0.95;
240        Add(ship2);
241        choice2(shipWeapon2.Value);
242        ship2.Add(ship2.weapon);
243        ship2.CollisionIgnoreGroup = 1;
244        ship2.Tag = "player";
245        ship2.Destroyed += playerdeath;
246        ship2.Destroyed += delegate
247        {
248            ship2.weapon.Destroy();
249        };
250        if (ship2.weapon is LaserGun)
251        {
252            line = new GameObject(1000, 1.25);
253            line.Image = pointer;
254            line.X = 500;
255            ship1.Add(line);
256        }
257    }
258
259    void SpawnHostiles()
260    {
261        while (shipcounter < 29)
262        {
263            int hostileship = RandomGen.NextInt(0, 100);
264            double hostiley = 0.0;
265            double hostilex = 0.0;
266            if (RandomGen.NextBool())
267            {
268                hostiley = Level.Bottom + 2 * Level.Top * RandomGen.NextInt(0, 2);
269                hostilex = RandomGen.NextDouble(Level.Left, Level.Right);
270            }
271            else
272            {
273                hostiley = RandomGen.NextDouble(Level.Bottom, Level.Top);
274                hostilex = Level.Left + 2 * Level.Right * RandomGen.NextInt(0, 2);
275            }
276            Createhostile(hostileship, hostiley, hostilex);
277            shipcounter++;
278        }
279
280        while (bigshipcounter < 3)
281        {
282            double bighostiley = 0.0;
283            double bighostilex = 0.0;
284            if (RandomGen.NextBool())
285            {
286                bighostiley = Level.Bottom + 2 * Level.Top * RandomGen.NextInt(0, 2);
287                bighostilex = RandomGen.NextDouble(Level.Left, Level.Right);
288            }
289            else
290            {
291                bighostiley = RandomGen.NextDouble(Level.Bottom, Level.Top);
292                bighostilex = Level.Left + 2 * Level.Right * RandomGen.NextInt(0, 2);
293            }
294            Createfatman(bighostiley, bighostilex);
295            bigshipcounter++;
296        }
297    }
298
299    void Spawncarrier()
300    {
301        int hostileship = RandomGen.NextInt(0, 100);
302        double hostiley = 0.0;
303        double hostilex = 0.0;
304        if (RandomGen.NextBool())
305        {
306            hostiley = Level.Bottom + 2 * Level.Top * RandomGen.NextInt(0, 2);
307            hostilex = RandomGen.NextDouble(Level.Left, Level.Right);
308        }
309        else
310        {
311            hostiley = RandomGen.NextDouble(Level.Bottom, Level.Top);
312            hostilex = Level.Left + 2 * Level.Right * RandomGen.NextInt(0, 2);
313        }
314        Createcarrier(hostiley, hostilex);
315    }
316   
317    void Createhostile(int randomship, double randomy, double randomx)
318    {
319        Enemy hostile = new Enemy(14, 14, Shape.FromImage(shipimages[randomship]), 5, 2.5, -8);
320        hostile.Image = shipimages[randomship];
321        hostile.Y = randomy;
322        hostile.X = randomx;
323        hostile.Restitution = 1.0;
324        hostile.KineticFriction = 0.0;
325        hostile.MomentOfInertia = Double.PositiveInfinity;
326        hostile.LinearDamping = 0.95;
327        hostile.AngularDamping = 1;
328        hostile.Tag = "hostile";
329        hostile.Health.MaxValue = 5;
330        hostile.Health.Value = 5;
331        hostile.CollisionIgnoreGroup = 2;
332        hostile.Image.ReplaceColor(Color.White, Color.DarkGray);
333        hostile.Image.ReplaceColor(Color.Black, Color.Ruby);
334        Add(hostile);
335
336        hostile.Destroyed += EnemyDeath;
337
338        AssaultRifle hostilew = new AssaultRifle(0, 0);
339        hostilew.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 10, 0); };
340        hostilew.FireRate = 0.5;
341        hostilew.Power.DefaultValue = 15;
342        hostilew.Power.Value = 15;
343        hostile.Add(hostilew);
344
345        FollowerBrain brain = new FollowerBrain("player");
346        brain.Speed = 30;
347        brain.DistanceFar = 10000;
348        brain.DistanceClose = 100;
349        brain.StopWhenTargetClose = false;
350        brain.TargetClose += delegate { Fire(hostilew, null); };
351        brain.TurnWhileMoving = true;
352        hostile.Brain = brain;
353    }
354
355    void Createfatman(double y, double x)
356    {
357        Fatman fatman = new Fatman(50, 28, Shape.FromImage(bigenemy), 10, 2.0, -28);
358        fatman.Image = bigenemy;
359        fatman.X = x;
360        fatman.Y = y;
361        fatman.Restitution = 1.0;
362        fatman.KineticFriction = 0.0;
363        fatman.MomentOfInertia = Double.PositiveInfinity;
364        fatman.LinearDamping = 0.95;
365        fatman.AngularDamping = 1;
366        fatman.Tag = "hostile";
367        fatman.Health.MaxValue = 40;
368        fatman.Health.Value = 40;
369        fatman.CollisionIgnoreGroup = 2;
370        fatman.Image.ReplaceColor(Color.White, Color.DarkGray);
371        fatman.Image.ReplaceColor(Color.Black, Color.Ruby);
372        Add(fatman);
373        fatman.Destroyed += delegate { fatmandeath(fatman); };
374
375        fatman.ase = new PlasmaCannon(0, 0);
376        fatman.ase.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 3, 0); };
377        fatman.ase.FireRate = 0.4;
378        fatman.ase.CanHitOwner = false;
379        fatman.ase.Power.DefaultValue = 750;
380        fatman.ase.Power.Value = 750;
381        fatman.Add(fatman.ase);
382
383        FollowerBrain brain = new FollowerBrain("player");
384        brain.Speed = 15;
385        brain.DistanceFar = 10000;
386        brain.DistanceClose = 250;
387        brain.StopWhenTargetClose = false;
388        brain.TargetClose += delegate { Fire(fatman.ase, null); };
389        brain.TurnWhileMoving = true;
390        brain.TurnSpeed = UnlimitedAngle.FromDegrees(100);
391        fatman.Brain = brain;
392    }
393    void Createcarrier(double y, double x)
394    {
395        Carrier carrier = new Carrier(101, 40, Shape.FromImage(carrierimg), 30, 2.5, -55, 4);
396        carrier.Image = carrierimg;
397        carrier.X = x;
398        carrier.Y = y;
399        carrier.Restitution = 1.0;
400        carrier.KineticFriction = 0.0;
401        carrier.MomentOfInertia = Double.PositiveInfinity;
402        carrier.LinearDamping = 0.95;
403        carrier.AngularDamping = 1;
404        carrier.Tag = "hostile";
405        carrier.Health.MaxValue = 100;
406        carrier.Health.Value = 100;
407        carrier.CollisionIgnoreGroup = 2;
408        carrier.Image.ReplaceColor(Color.White, Color.DarkGray);
409        carrier.Image.ReplaceColor(Color.Black, Color.Ruby);
410        Add(carrier);
411        carrier.Destroyed += delegate { carrierdeath(carrier); };
412
413        while (fighters < 4)
414        {
415            carrier.AddFlanking(Createfighter(carrier.X, carrier.Y));
416            fighters++;
417        }
418
419        Timer spawnTimer = new Timer();
420        spawnTimer.Interval = 5.0;
421        spawnTimer.Timeout += delegate
422        {
423            FlankingEnemy enemy = carrier.GetFlanking();
424            if (enemy != null)
425            {
426                Add(enemy);
427                enemy.Position = carrier.Position;
428                carrier.RemoveFlanking(enemy);
429            }
430            else
431            {
432                while (fighters < 4)
433                {
434                    carrier.AddFlanking(Createfighter(carrier.X, carrier.Y));
435                    fighters++;
436                }
437            }
438        };
439        spawnTimer.Start();
440    }
441    FlankingEnemy Createfighter(double y, double x)
442    {
443        FlankingEnemy fighter;
444        if (ship2 == null)
445        {
446            fighter = new FlankingEnemy(20, 19, Shape.FromImage(fighterimg), 10, 2.0, -15, ship1, 125);
447        }
448        else
449        {
450            double distance = Vector.Distance(new Vector(x, y), ship1.Position);
451
452            if (Vector.Distance(new Vector(x, y), ship2.Position) < distance)
453            {
454                fighter = new FlankingEnemy(20, 19, Shape.FromImage(fighterimg), 10, 2.0, -15, ship2, 125);
455            }
456            else
457            {
458                fighter = new FlankingEnemy(20, 19, Shape.FromImage(fighterimg), 10, 2.0, -15, ship1, 125);
459            }
460        }
461        fighter.Image = fighterimg;
462        fighter.X = x;
463        fighter.Y = y;
464        fighter.Restitution = 1.0;
465        fighter.KineticFriction = 0.0;
466        fighter.MomentOfInertia = Double.PositiveInfinity;
467        fighter.LinearDamping = 0.95;
468        fighter.AngularDamping = 1;
469        fighter.Tag = "hostile";
470        fighter.Health.MaxValue = 20;
471        fighter.Health.Value = 20;
472        fighter.CollisionIgnoreGroup = 2;
473        fighter.Image.ReplaceColor(Color.White, Color.DarkGray);
474        fighter.Image.ReplaceColor(Color.Black, Color.Ruby);
475        //Add(fighter);
476        fighter.Destroyed += delegate { fighterdeath(fighter); };
477
478        fighter.ase = new Cannon(0, 0);
479        fighter.ase.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 3, 0); };
480        fighter.ase.FireRate = 0.3;
481        fighter.ase.CanHitOwner = false;
482        fighter.ase.Power.DefaultValue = 1500;
483        fighter.ase.Power.Value = 1500;
484        fighter.ase.AttackSound = Stapler;
485        fighter.Add(fighter.ase);
486        return fighter;
487    }
488
489    void playerdeath()
490    {
491        Arena.Play();
492        MessageDisplay.Add("Ship lost!");
493        Camera.StopFollowing();
494        if (ship1.IsDestroyed)
495        {
496            if (ship2 != null && ship2.IsDestroyed == false)
497            {
498                Camera.Follow(ship2);
499            }
500            else Camera.StopFollowing();
501        }
502        else if (ship2.IsDestroyed)
503        {
504            if (ship1 != null && ship1.IsDestroyed == false)
505            {
506                Camera.Follow(ship1);
507            }
508            else Camera.StopFollowing();
509        }
510    }
511
512    void EnemyDeath()
513    {
514        shipcounter--;
515        points.Value += 5;
516    }
517
518    void fatmandeath(Enemy kohde)
519    {
520        bigshipcounter--;
521        points.Value += 40;
522        Explosion enemydeath = new Explosion(40);
523        enemydeath.Position = kohde.AbsolutePosition;
524        enemydeath.UseShockWave = false;
525        Add(enemydeath);
526    }
527    void fighterdeath(Enemy kohde)
528    {
529        points.Value += 50;
530        Explosion enemydeath = new Explosion(30);
531        enemydeath.Position = kohde.AbsolutePosition;
532        enemydeath.UseShockWave = false;
533        fighters--;
534        Add(enemydeath);
535    }
536    void carrierdeath(Enemy kohde)
537    {
538        points.Value += 500;
539        Explosion enemydeath = new Explosion(80);
540        enemydeath.Position = kohde.AbsolutePosition;
541        enemydeath.UseShockWave = true;
542        carriertimer();
543        Add(enemydeath);
544    }
545    void carriertimer()
546    {
547        Timer carriertimer = new Timer();
548        Timer.SingleShot(60.0, Spawncarrier);
549    }
550    void createedges()
551    {
552        PhysicsObject leftedge = Level.CreateLeftBorder();
553        leftedge.Restitution = 1.0;
554        leftedge.KineticFriction = 0.0;
555        leftedge.IsVisible = false;
556        leftedge.CollisionIgnoreGroup = 2;
557        PhysicsObject rightedge = Level.CreateRightBorder();
558        rightedge.Restitution = 1.0;
559        rightedge.KineticFriction = 0.0;
560        rightedge.IsVisible = false;
561        rightedge.CollisionIgnoreGroup = 2;
562        PhysicsObject topedge = Level.CreateTopBorder();
563        topedge.Restitution = 1.0;
564        topedge.KineticFriction = 0.0;
565        topedge.IsVisible = false;
566        topedge.CollisionIgnoreGroup = 2;
567        PhysicsObject bottomedge = Level.CreateBottomBorder();
568        bottomedge.Restitution = 1.0;
569        bottomedge.IsVisible = false;
570        bottomedge.KineticFriction = 0.0;
571        bottomedge.CollisionIgnoreGroup = 2;
572        Level.Background.Color = Color.Black;
573    }
574
575    void coop()
576    {
577        aluskuva = new Widget(50, 50);
578        aluskuva.X = -300;
579        aluskuva.Y = 250;
580        aluskuva.Image = shipimages[0];
581        Add(aluskuva);
582
583        aluskuva2 = new Widget(50, 50);
584        aluskuva2.X = 300;
585        aluskuva2.Y = 250;
586        aluskuva2.Image = shipimages[0];
587        Add(aluskuva2);
588
589        shipimg = new IntMeter(1, 1, 100);
590        shipimg.Changed += Changeship1;
591        shipwpn = new IntMeter(1, 1, 4);
592        shipwpn.Changed += delegate { weaponlabel.Text = weaponnames[shipwpn.Value - 1]; };
593
594        Slider shipColorP1 = new Slider(125, 15);
595        shipColorP1.X = -425;
596        shipColorP1.Y = 150;
597        shipcolor1 = new IntMeter(0, 0, 3);
598        shipcolor1.Changed += Changeship1;
599        shipColorP1.BindTo(shipcolor1);
600
601        Slider shipcolour2 = new Slider(125, 15);
602        shipcolour2.X = 225;
603        shipcolour2.Y = 150;
604        shipcolor2 = new IntMeter(0, 0, 3);
605        shipcolor2.Changed += Changeship2;
606        shipcolour2.BindTo(shipcolor2);
607
608        shipimg2 = new IntMeter(1, 1, 100);
609        shipimg2.Changed += Changeship2;
610        shipWeapon2 = new IntMeter(1, 1, 4);
611        shipWeapon2.Changed += delegate
612        {
613            weaponlabel2.Text = weaponnames[shipWeapon2.Value - 1];
614        };
615        number = new Label();
616        number.BindTo(shipimg);
617        number.X = -300;
618        number.Y = 300;
619        Add(number);
620
621        number2 = new Label();
622        number2.BindTo(shipimg2);
623        number2.X = 300;
624        number2.Y = 300;
625        Add(number2);
626
627        weaponlabel = new Label(weaponnames[0]);
628        weaponlabel.X = -225;
629        weaponlabel.Y = 125;
630        Add(weaponlabel);
631        weaponlabel2 = new Label(weaponnames[0]);
632        weaponlabel2.X = 425;
633        weaponlabel2.Y = 125;
634        Add(weaponlabel2);
635
636        Slider shiptype = new Slider(550, 10);
637        shiptype.X = -300;
638        shiptype.Y = 200;
639        shiptype.BindTo(shipimg);
640
641        Slider shipweapon = new Slider(125, 15);
642        shipweapon.X = -225;
643        shipweapon.Y = 150;
644        shipweapon.BindTo(shipwpn);
645
646        Slider shiptype2 = new Slider(550, 10);
647        shiptype2.X = 300;
648        shiptype2.Y = 200;
649        shiptype2.BindTo(shipimg2);
650
651        Slider shipweapon2 = new Slider(125, 15);
652        shipweapon2.X = 425;
653        shipweapon2.Y = 150;
654        shipweapon2.BindTo(shipWeapon2);
655        Add(shiptype);
656        Add(shipColorP1);
657        Add(shipweapon);
658        Add(shiptype2);
659        Add(shipcolour2);
660        Add(shipweapon2);
661
662        PushButton button = new PushButton("Start");
663        button.Pressed += coopbase;
664        Keyboard.Enable(Key.Enter);
665        Keyboard.Listen(Key.Enter, ButtonState.Pressed, delegate
666        {
667            coopbase();
668            Keyboard.Disable(Key.Enter);
669
670        }, null);
671        Add(button);
672
673        PushButton back = new PushButton("Back");
674        back.Pressed += delegate { Begin(); };
675        back.Position = new Vector(-200, 0);
676        Add(back);
677    }
678
679    void choice(int choice)
680    {
681        switch (choice)
682        {
683            case 1:
684                ship1.weapon = new AssaultRifle(0, 0);
685                ship1.weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 1); };
686                ship1.weapon.FireRate = 4.5;
687                ship1.weapon.Power.Value = 25;
688                ship1.weapon.Power.DefaultValue = 25;
689                break;
690            case 2:
691                ship1.weapon = new LaserGun(0, 0);
692                ship1.weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 5); };
693                ship1.weapon.FireRate = 0.8;
694                ship1.weapon.Power.DefaultValue = 1000;
695                ship1.weapon.Power.Value = 1000;
696                break;
697            case 3:
698                ship1. weapon = new PlasmaCannon(0, 0);
699                ship1.weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 3); };
700                ship1.weapon.FireRate = 1.5;
701                ship1.weapon.Power.Value = 400;
702                ship1.weapon.Power.DefaultValue = 400;
703                break;
704            case 4:
705                ship1.weapon = new Cannon(0, 0);
706                ship1.weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 5); };
707                ship1.weapon.FireRate = 0.8;
708                ship1.weapon.Power.DefaultValue = 1500;
709                ship1.weapon.Power.Value = 1500;
710                break;
711        }
712    }
713    void choice2(int choice)
714    {
715        switch (choice)
716        {
717            case 1:
718                ship2.weapon = new AssaultRifle(0, 0);
719                ship2.weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 1); };
720                ship2.weapon.FireRate = 4.5;
721                ship2.weapon.Power.Value = 25;
722                ship2.weapon.Power.DefaultValue = 25;
723                break;
724            case 2:
725                ship2.weapon = new LaserGun(0, 0);
726                ship2.weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 5); };
727                ship2.weapon.FireRate = 1;
728                ship2.weapon.Power.DefaultValue = 1000;
729                ship2.weapon.Power.Value = 1000;
730                break;
731            case 3:
732                ship2.weapon = new PlasmaCannon(0, 0);
733                ship2.weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 3); };
734                ship2.weapon.FireRate = 1.5;
735                ship2.weapon.Power.Value = 400;
736                ship2.weapon.Power.DefaultValue = 400;
737                break;
738            case 4:
739                ship2.weapon = new Cannon(0, 0);
740                ship2.weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 5); };
741                ship2.weapon.FireRate = 0.8;
742                ship2.weapon.Power.DefaultValue = 1500;
743                ship2.weapon.Power.Value = 1500;
744                break;
745        }
746    }
747
748    void Fire(Weapon ase, Player ship)
749    {
750        if (ship != null && ship.IsDestroyed) return;
751        PhysicsObject ammus = ase.Shoot();
752        if (ammus != null)
753        {
754            ammus.MaximumLifetime = TimeSpan.FromSeconds(10.0);
755            if (ase is AssaultRifle)
756            {
757                ammus.IgnoresCollisionResponse = true;
758                ammus.Color = Color.Yellow;
759                ammus.Shape = Shape.Rectangle;
760                ammus.Image = null;
761                ammus.Size = new Vector(4.0, 1.0);
762                ammus.CollisionIgnoreGroup = 4;
763                AddCollisionHandler(ammus, AmmusOsui);
764            }
765            if (ase is LaserGun)
766            {
767                ammus.Size = new Vector(9.0, 1.0);
768                ammus.Image = null;
769                ammus.Shape = Shape.Triangle;
770                ammus.Color = Color.BrightGreen;
771                ammus.IgnoresCollisionResponse = true;
772                ammus.Tag = "laser";
773                ase.AttackSound = Laser;
774            }
775            if (ase is PlasmaCannon)
776            {
777                ammus.Size *= 0.9;
778                AddCollisionHandler(ammus, AmmusOsui);
779                ammus.IgnoresCollisionResponse = true;
780                ammus.CollisionIgnoreGroup = 3;
781            }
782            if (ase is Cannon)
783            {
784                ammus.Size *= 0.8;
785                ammus.Image = ship.cannonImage;
786                AddCollisionHandler(ammus, missilehit);
787                ammus.AngularDamping = 1.0;
788                ammus.IgnoresCollisionResponse = true;
789                ase.AttackSound = Stapler;
790
791                FollowerBrain ammusbrain = new FollowerBrain("hostile", "laser");
792                ammusbrain.DistanceFar = 40;
793                ammusbrain.Speed = 90;
794                ammusbrain.TurnSpeed = UnlimitedAngle.FromDegrees(360);
795                ammusbrain.StopWhenTargetClose = false;
796                ammusbrain.TurnWhileMoving = true;
797                ammus.Brain = ammusbrain;
798            }
799        }
800    }
801    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
802    {
803        if (kohde.Tag == "powerup")
804        {
805            return;
806        }
807        ammus.Destroy();
808    }
809
810    void missilehit(PhysicsObject tormaaja, PhysicsObject kohde)
811    {
812        if (kohde.Tag == "powerup")
813        {
814            return;
815        }
816        Explosion missilecrash = new Explosion(8);
817        missilecrash.Position = tormaaja.Position;
818        missilecrash.UseShockWave = false;
819        Add(missilecrash);
820        tormaaja.Destroy();
821    }
822    public void firehoming(Weapon ase)
823    {
824        if (ship2 == null)
825            ase.AbsoluteAngle = (ship1.AbsolutePosition - ase.AbsolutePosition).Angle;
826        else
827        {
828            if (Vector.Distance(ase.AbsolutePosition, ship1.Position) < Vector.Distance(ase.AbsolutePosition, ship2.Position))
829                ase.AbsoluteAngle = (ship1.AbsolutePosition - ase.AbsolutePosition).Angle;
830            else
831                ase.AbsoluteAngle = (ship2.AbsolutePosition - ase.AbsolutePosition).Angle;
832        }
833
834        PhysicsObject ammus = ase.Shoot();
835        if (ammus != null)
836        {
837            ammus.MaximumLifetime = TimeSpan.FromSeconds(5.0);
838            ammus.Image = homing;
839            AddCollisionHandler(ammus, missilehit);
840            ammus.IgnoresCollisionResponse = true;
841            ammus.Size *= 0.8;
842            ammus.AngularDamping = 1.0;
843            ammus.Image.ReplaceColor(Color.White, Color.DarkGray);
844            ammus.Image.ReplaceColor(Color.Black, Color.Ruby);
845            AddCollisionHandler(ammus, "player1", CollisionHandler.DestroyObject);
846            FollowerBrain ammusbrain = new FollowerBrain("player", "laser");
847            ammusbrain.DistanceFar = 40;
848            ammusbrain.Speed = 90;
849            ammusbrain.TurnSpeed = UnlimitedAngle.FromDegrees(200);
850            ammusbrain.StopWhenTargetClose = false;
851            ammusbrain.TurnWhileMoving = true;
852            ammus.Brain = ammusbrain;
853        }
854    }
855    void weaponhit(PhysicsObject ammus, PhysicsObject kohde, int playerDamage, int enemyDamage)
856    {
857        if (kohde.Tag == "player")
858        {
859            Player ship = kohde as Player;
860            ship.Health.Value -= playerDamage;
861        }
862        if (kohde.Tag == "hostile")
863        {
864            Enemy ship = kohde as Enemy;
865            ship.Health.Value -= enemyDamage;
866        }
867    }
868    void Controlsship()
869    {
870        Keyboard.Listen(Key.W, ButtonState.Down, movement, null, 0, 100, ship1);
871        Keyboard.Listen(Key.S, ButtonState.Down, movement, null, 0, -100, ship1);
872        Keyboard.Listen(Key.A, ButtonState.Down, movement, null, -100, 0, ship1);
873        Keyboard.Listen(Key.D, ButtonState.Down, movement, null, 100, 0, ship1);
874        Keyboard.Listen(Key.Space, ButtonState.Down, Fire, "", ship1.weapon, ship1);
875        Mouse.ListenMovement(0, Aim, null, ship1);
876        Mouse.Listen(MouseButton.Left, ButtonState.Down, Fire, null, ship1.weapon, ship1);
877        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Pausemenu, null);
878        //Keyboard.Listen(Key.K, ButtonState.Pressed, delegate { Begin();/*MessageDisplay.Add(ship1.Position.ToString());*/ }, null);
879    }
880    void Pausemenu()
881    {
882        Pause();
883        MultiSelectWindow pausemenu = new MultiSelectWindow("Paused", "1. Continue", "2. Main menu", "3. Quit");
884        pausemenu.ItemSelected += menuselect;
885        Add(pausemenu);
886    }
887    void menuselect(int valinta)
888    {
889        switch (valinta)
890        {
891            case 0:
892                Pause();
893                break;
894            case 1:
895                Pause();
896                Begin();
897                break;
898            case 2:
899                Exit();
900                break;
901        }
902    }
903    void Aim(AnalogState hiirenLiike, Player ship)
904    {
905        Vector suunta = (Mouse.PositionOnWorld - ship.AbsolutePosition).Normalize();
906        ship.Angle = suunta.Angle;
907    }
908    void movement(int x, int y, PhysicsObject ship)
909    {
910        ship.Push(new Vector(x, y));
911    }
912    void gamepadmove(AnalogState tatintila, double speed, Player ship)
913    {
914        ship.Push(tatintila.StateVector * speed);
915    }
916    void gamepadaim(AnalogState tatintila, Player ship)
917    {
918        ship.Angle = tatintila.StateVector.Angle;
919    }
920
921    void Controlsship1()
922    {
923        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Pausemenu, null);
924        ControllerOne.ListenAnalog(AnalogControl.LeftStick, 0.1, gamepadmove, null, 100.0, ship1);
925        ControllerOne.ListenAnalog(AnalogControl.RightStick, 0.1, gamepadaim, null, ship1);
926        ControllerOne.Listen(Button.RightTrigger, ButtonState.Down, Fire, null, ship1.weapon, ship1);
927        ControllerOne.Listen(Button.LeftTrigger, ButtonState.Down, Fire, null, ship1.weapon, ship1);
928        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, delegate { MessageDisplay.Add(Mouse.PositionOnWorld.ToString()); }, null);
929    }
930    void Controlsship2()
931    {
932        ControllerTwo.ListenAnalog(AnalogControl.LeftStick, 0.1, gamepadmove, null, 100.0, ship2);
933        ControllerTwo.ListenAnalog(AnalogControl.RightStick, 0.1, gamepadaim, null, ship2);
934        ControllerTwo.Listen(Button.RightTrigger, ButtonState.Down, Fire, null, ship2.weapon, ship2);
935        ControllerTwo.Listen(Button.LeftTrigger, ButtonState.Down, Fire, null, ship2.weapon, ship2);
936    }
937
938    void singleplayerbase()
939    {
940        ClearAll();
941        Keyboard.Listen(Key.R, ButtonState.Pressed, delegate { singleplayerbase(); }, null);
942       
943        GameObject background = new GameObject(1500, 1500);
944        Level.Background.CreateStars();
945        background.Image = Level.Background.Image;
946        background.Tag = "background";
947        Add(background, -1);
948        Level.Background.Image = null;
949
950        shipcounter = 0;
951        bigshipcounter = 0;
952
953        Level.Size = new Vector(1500, 1500);
954        createedges();
955        Createship(0, 0);
956        Camera.Zoom(2);
957        Camera.Follow(ship1);
958        Camera.StayInLevel = true;
959        SpawnHostiles();
960        Controlsship();
961        carriertimer();
962
963        Timer spawnrune = new Timer();
964        spawnrune.Interval = 10;
965        spawnrune.Timeout += Spawnrunes;
966        spawnrune.Start();
967
968        points = new IntMeter(0);
969        Label pointsdisplay = new Label();
970        pointsdisplay.Title = "Points";
971        pointsdisplay.X = Screen.Right - 100;
972        pointsdisplay.Y = Screen.Top - 100;
973        pointsdisplay.TextColor = Color.White;
974        pointsdisplay.Color = Color.Black;
975        pointsdisplay.BindTo(points);
976        Add(pointsdisplay);
977
978        Timer hostileCreateTimer = new Timer();
979        hostileCreateTimer.Interval = 2;
980        hostileCreateTimer.Timeout += SpawnHostiles;
981        hostileCreateTimer.Start();
982    }
983    void coopbase()
984    {
985        ClearAll();
986        Keyboard.Listen(Key.R, ButtonState.Pressed, delegate { coopbase(); }, null);
987
988        GameObject background = new GameObject(1500, 1500);
989        Level.Background.CreateStars();
990        background.Image = Level.Background.Image;
991        background.Tag = "background";
992        Add(background, -1);
993        Level.Background.Image = null;
994
995        shipcounter = 0;
996        bigshipcounter = 0;
997        Level.Size = new Vector(1500, 1500);
998        createedges();
999        Createship(-100, 0);
1000        Createship2(100, 0);
1001
1002        //Camera.Zoom(2);
1003        Camera.Follow( ship1, ship2 );
1004        //Camera.ZoomToLevel();
1005        Camera.FollowXMargin = 500;
1006        Camera.FollowYMargin = 500;
1007        Camera.StayInLevel = true;
1008
1009        SpawnHostiles();
1010        carriertimer();
1011
1012        Controlsship1();
1013        Controlsship2();
1014
1015        Timer spawnrune = new Timer();
1016        spawnrune.Interval = 0.1;
1017        spawnrune.Timeout += Spawnrunes;
1018        spawnrune.Start();
1019
1020        points = new IntMeter(0);
1021        Label pointsdisplay = new Label();
1022        pointsdisplay.Title = "Points";
1023        pointsdisplay.X = Screen.Right - 100;
1024        pointsdisplay.Y = Screen.Top - 100;
1025        pointsdisplay.TextColor = Color.White;
1026        pointsdisplay.Color = Color.Black;
1027        pointsdisplay.BindTo(points);
1028        Add(pointsdisplay);
1029
1030        Timer spawnenemy = new Timer();
1031        spawnenemy.Interval = 5;
1032        spawnenemy.Timeout += SpawnHostiles;
1033        spawnenemy.Start();
1034    }
1035    void Spawnrunes()
1036    {
1037        if (runecounter < 6)
1038        {
1039            int runetype = RandomGen.NextInt(1, 3);
1040            double runey = 0.0;
1041            double runex = 0.0;
1042            Vector paikka = GetRandomFreePosition("background", 5.0);
1043            runey = paikka.Y;
1044            runex = paikka.X;
1045            Createrune(runetype, runey, runex);
1046            runecounter++;
1047        }
1048    }
1049    void Createrune(int runetype, double y, double x)
1050    {
1051        PhysicsObject Rune = new PhysicsObject(10, 10);
1052        Rune.X = x;
1053        Rune.Y = y;
1054        Rune.CollisionIgnoreGroup = 2 & 3 & 4;
1055        Rune.IgnoresCollisionResponse = true;
1056        Rune.MakeStatic();
1057        Rune.Tag = "powerup";
1058        Rune.AngularVelocity = 5;
1059        Add(Rune);
1060        switch (runetype)
1061        {
1062            case 1:
1063                //Addcollision
1064                Rune.Image = rdamage;
1065                Rune.Height = 15;
1066                Rune.Width = 10;
1067                AddCollisionHandler(Rune, "player", delegate(PhysicsObject tormaaja, Player ship) { damagerune(tormaaja, ship); });
1068                break;
1069            case 2:
1070                //Addcollision
1071                Rune.Image = rrepair;
1072                AddCollisionHandler(Rune, "player", delegate(PhysicsObject tormaaja, Player ship) { repairrune(tormaaja, ship); });
1073                Rune.Height = 14;
1074                Rune.Width = 14;
1075                break;
1076        }
1077    }
1078
1079    void damagerune(PhysicsObject rune, Player ship)
1080    {
1081        rune.Destroy();
1082        ship.weapon.FireRate *= 2;
1083        Timer.SingleShot(15.0, delegate { 
1084            ship.weapon.FireRate /= 2; }
1085            );
1086        MessageDisplay.Add("Power Surge");
1087        Power.Play();
1088        runecounter--;
1089    }
1090    void repairrune(PhysicsObject rune, Player ship)
1091    {
1092        ship.Health.Value += 10;
1093        MessageDisplay.Add("Hull restored 20%");
1094        Power.Play();
1095        rune.Destroy();
1096        runecounter--;
1097    }
1098
1099    /// <summary>
1100    /// Palauttaa satunnaisen vapaan paikan kentän sisältä.
1101    /// </summary>
1102    /// <param name="ignoresTag">Minkätagisia olioita ei huomioida.</param>
1103    /// <param name="radius">Alueen halkaisija, jonka tulee olla vapaana paikan ympärillä.</param>
1104    /// <returns>Vapaa paikka.</returns>
1105    Vector GetRandomFreePosition(String ignoresTag, double radius)
1106    {
1107        Vector pos;
1108        do
1109        {
1110            pos = RandomGen.NextVector(Level.Left, Level.Bottom, Level.Right, Level.Top);
1111
1112        } while(IsOccupied(pos, ignoresTag, radius));
1113        return pos;
1114    }
1115
1116    bool IsOccupied(Vector position, String ignoresTag, double radius)
1117    {
1118        GameObject o = GetObjectAt(position, radius);
1119        if (o == null) return false;
1120        if (o.Tag.ToString() == ignoresTag) return false;
1121        return true;
1122    }
1123}
Note: See TracBrowser for help on using the repository browser.