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

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