source: 2014/30/MikkoL/Gradiant/LM2/LM2/Gradiant.cs @ 5556

Revision 5556, 64.0 KB checked in by mijoliim, 7 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
9class player : PhysicsObject
10{
11    public IntMeter health = new IntMeter(100, 0, 100);
12
13    public player(double width, double height)
14        : base(width, height)
15    {
16        health.LowerLimit += delegate
17        {
18            this.Destroy();
19        };
20        IgnoresGravity = true;
21    }
22}
23
24class droid : PhysicsObject
25{
26    public droid(double width, double height)
27        : base(width, height)
28    {
29        IgnoresGravity = true;
30    }
31}
32
33class enemy : PhysicsObject
34{
35    public IntMeter health = new IntMeter(100, 0, 100);
36    public IntMeter ScoreValue = new IntMeter(100, 0, int.MaxValue);
37    public bool canShoot = false;
38    public double explosion_scale = 50;
39
40    public enemy(double width, double height)
41        : base(width, height)
42    {
43        health.LowerLimit += delegate { this.Destroy(); };
44        IgnoresGravity = true;
45    }
46}
47class boss : PhysicsObject
48{
49    public IntMeter health = new IntMeter(10000, 0, 10000);
50    public IntMeter ScoreValue = new IntMeter(100, 0, int.MaxValue);
51    public bool canShoot = false;
52    public double explosion_scale = 100;
53
54    public boss(double width, double height)
55        : base(width, height)
56    {
57        health.LowerLimit += delegate { this.Destroy(); };
58        IgnoresGravity = true;
59    }
60}
61
62class bullet : PhysicsObject
63{
64    public int damage;
65
66    public bullet(double width, double height)
67        : base(width, height) { }
68}
69class frontborder : PhysicsObject
70{
71
72    public frontborder(double width, double height)
73        : base(width, height) { IgnoresGravity = true; }
74}
75class backborder : PhysicsObject
76{
77
78    public backborder(double width, double height)
79        : base(width, height) { IgnoresGravity = true; }
80}
81class bulletdes : PhysicsObject
82{
83    public bulletdes(double width, double height)
84            : base(width, height) { IgnoresGravity = true; }
85}
86
87public class Gradiant : PhysicsGame
88{
89    player player = new player(7, 8);
90    PhysicsObject playership = new PhysicsObject(47, 46);
91    double player_speed = 425;
92    Vector stagespeed = new Vector(-500,0);
93    Vector cntr = new Vector(0, 0);
94
95    //Player
96    Image player_ship_01 = LoadImage("player_ship_01");
97    Image player_ship_02 = LoadImage("player_ship_02");
98    Image hitbox = LoadImage("hitbox");
99    Image droid_image = LoadImage("droid");
100    //Bullets
101    Image bullet_green_laser01 = LoadImage("bullet_green_laser01");
102    Image bullet_player01 = LoadImage("bullet_player");
103    Image bullet_player02 = LoadImage("bullet_player02");
104    Image bullet_player03 = LoadImage("bullet_player03");
105    Image bullet_player04 = LoadImage("bullet_player04");
106    Image bullet_player05 = LoadImage("bullet_player05");
107    Image bullet_droid = LoadImage("bullet_droid");
108    Image bullet_laser = LoadImage("bullet_laser");
109    Image bullet_enemy_01 = LoadImage("bullet_enemy_01");
110    Image bullet_enemy_02 = LoadImage("bullet_enemy_02");
111    Image bullet_enemy_03 = LoadImage("bullet_enemy_03");
112    Image bullet_enemy_04 = LoadImage("bullet_enemy_04");
113    Image bullet_enemy_05 = LoadImage("bullet_enemy_05");
114    Image bullet_enemy_06 = LoadImage("bullet_enemy_06");
115    //Enemies
116    Image enemy_ship_01 = LoadImage("enemy_ship_01");
117    Image enemy_ship_01_red = LoadImage("enemy_ship_01_red");
118    Image enemy_ship_01_blue = LoadImage("enemy_ship_01_blue");
119    Image enemy_ship_01_blue_inverted = LoadImage("enemy_ship_01_blue_inverted");
120    Image enemy_ship_02 = LoadImage("enemy_ship_02");
121    Image enemy_ship_03 = LoadImage("enemy_ship_03");
122    Image enemy_ship_04 = LoadImage("enemy_ship_04");
123    Image enemy_ship_05 = LoadImage("enemy_ship_05");
124    //Bosses
125    Image boss_ship_01 = LoadImage("boss_ship_01");
126    //Powerups
127    Image powerup_damage = LoadImage("powerup_damage");
128    Image powerup_spread = LoadImage("powerup_spread");
129    //Borders
130    Image border_top = LoadImage("border_bottom");
131    Image border_bottom = LoadImage("border_top");
132    //Backgrounds
133    Image space_bg = LoadImage("space_bg");
134    Image earth = LoadImage("earth");
135    //Explosion
136    private Animation explosion_anim;
137    private Animation droid_anim;
138    private Animation droid2_anim;
139    //GUI
140    Image title = LoadImage("title_screen");
141    Image title_02 = LoadImage("title_screen_02");
142    Image press_start_img = LoadImage("Press_Start");
143    Image controls = LoadImage("controls");
144    Image stage_1_clear = LoadImage("stage_1_clear");
145    Image stage_1_start = LoadImage("stage_1_start");
146    Image stage_2_clear = LoadImage("stage_2_clear");
147    Image stage_2_start = LoadImage("stage_2_start");
148    Image damage_up = LoadImage("damage_up");
149    Image spread_up = LoadImage("spread_up");
150    Image cursor_gui = LoadImage("cursor");
151    Image select_ship_gui = LoadImage("select_ship");
152
153    Image aj = LoadImage("aj-weed");
154
155    //SFX
156    SoundEffect hurtsfx = LoadSoundEffect("hurt");
157    SoundEffect hitsfx = LoadSoundEffect("hit");
158    SoundEffect shootsfx = LoadSoundEffect("shoot");
159    SoundEffect selectsfx = LoadSoundEffect("select1");
160    SoundEffect powerupsfx = LoadSoundEffect("powerup");
161    SoundEffect explosionsfx = LoadSoundEffect("explosion");
162    SoundEffect enemy_shootsfx = LoadSoundEffect("enemy_shoot");
163
164    //Weapon
165    double wpn_shootRate = 0.1;
166    IntMeter wpn_damageRatio = new IntMeter(1, 1, 10);
167    DoubleMeter wpn_spread = new DoubleMeter(1,1,10);
168
169    double drd_shootRate = 0.2;
170    double drd_type = 0;
171    IntMeter drd_damageRatio = new IntMeter(1, 1, 20);
172    //drd types
173    //1: spreadshot
174    //2: missile
175    //3: laser
176
177    //Collision ignore groups
178    //2: player bullets/enemy bullets
179    //3: enemies
180    //4: powerups
181
182    Timer wpn_timer = new Timer();
183
184    GameObject control_gui;
185    GameObject press_start;
186    GameObject cursor;
187    GameObject select_ship;
188    Timer cursor_blink;
189    double cursorpos = 0;
190
191    bool s001 = false;
192
193    public override void Begin()
194    {
195       
196        //Load SFX
197        hurtsfx.Play();
198
199        //Load Anim
200        explosion_anim = LoadAnimation("explosionanim");
201        droid_anim = LoadAnimation("droidanim");
202        droid2_anim = LoadAnimation("droid2anim");
203
204        MediaPlayer.Play("Starmap");
205        MediaPlayer.IsRepeating = true;
206
207        SetWindowSize(1280, 800, false);
208
209        Level.Size = new Vector(Screen.Width,Screen.Height);
210        SmoothTextures = false;
211
212        GameObject titlescreen = new GameObject(1280, 801);
213        titlescreen.Position = Screen.Center;
214        titlescreen.Image = title_02;
215        Add(titlescreen,-3);
216
217        press_start = new GameObject(215, 59);
218        press_start.Position = Screen.Center + new Vector(0, 90);
219        press_start.Image = press_start_img;
220        Add(press_start);
221
222        control_gui = new GameObject(345, 247);
223        control_gui.Position = Screen.Center + new Vector(66, -112);
224        control_gui.Image = controls;
225        Add(control_gui);
226
227        Timer start = new Timer();
228        start.Interval = 0.6;
229        start.Timeout += delegate
230        {
231            if (press_start.IsVisible) press_start.IsVisible = false;
232            else press_start.IsVisible = true;
233        };
234        start.Start();
235
236        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, null);
237        ControllerOne.Listen(Button.Back, ButtonState.Pressed, ConfirmExit, null);
238        ControllerOne.Listen(Button.Start, ButtonState.Pressed, Select_ship, null);
239
240
241    }
242    void Select_ship()
243    {
244        selectsfx.Play();
245
246        ClearControls();
247        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, null);
248        ControllerOne.Listen(Button.Back, ButtonState.Pressed, ConfirmExit, null);
249        ControllerOne.ListenAnalog(AnalogControl.LeftStick, -0.1, movecursor, null);
250        ControllerOne.Listen(Button.Start, ButtonState.Pressed, Start, null);
251        ControllerOne.Listen(Button.A, ButtonState.Pressed, Start, null);
252
253        control_gui.Destroy();
254        press_start.Destroy();
255
256        cursor = new GameObject(21, 19);
257        cursor.Image = cursor_gui;
258        cursor.Position = Screen.Center + new Vector(-232, 41);
259
260        select_ship = new GameObject(426, 136);
261        select_ship.Image = select_ship_gui;
262        select_ship.Position = Screen.Center;
263
264        Add(select_ship);
265        Add(cursor);
266
267        cursor_blink = new Timer();
268        cursor_blink.Interval = 0.5;
269        cursor_blink.Timeout += delegate
270        {
271            if (cursor.IsVisible) cursor.IsVisible = false;
272            else if (!cursor.IsVisible) cursor.IsVisible = true;
273            if (cursor.IsDestroyed) cursor_blink.Stop();
274        };
275        cursor_blink.Start();
276    }
277    void movecursor(AnalogState dir)
278    {
279        if (cursorpos!= 0 && dir.StateVector.Y >= 0.7)
280        {
281            cursorpos = 0;
282            cursor.Position = Screen.Center + new Vector(-232, 41);
283            cursor_blink.Start();
284            cursor.IsVisible = true;
285            selectsfx.Play();
286        }
287        else if (cursorpos!= 1 &&dir.StateVector.Y <= -0.7)
288        {
289            cursorpos = 1;
290            cursor.Position = Screen.Center + new Vector(-232, -51);
291            cursor_blink.Start();
292            cursor.IsVisible = true;
293            selectsfx.Play();
294        }
295    }
296
297    void Start()
298    {
299        selectsfx.Play();
300        ClearAll();
301        MediaPlayer.Stop();
302
303        CreateLevel("level_01");
304
305        GameObject stage_01_start = new GameObject(405, 39);
306        stage_01_start.Position = cntr;
307        stage_01_start.Image = stage_1_start;
308        Add(stage_01_start, 3);
309
310        double i = 0;
311        Timer start = new Timer();
312        start.Interval = 0.1;
313        start.Timeout += delegate
314        {
315            i++;
316            if (i >= 15) stage_01_start.Destroy();
317            if (stage_01_start.IsVisible) stage_01_start.IsVisible = false;
318            else stage_01_start.IsVisible = true;
319        };
320        start.Start(15);
321        Pause();
322        ControllerOne.Listen(Button.Start, ButtonState.Pressed, start_01, null);
323       
324
325        setwpn_timer();
326    }
327    void start_01()
328    {
329        if (!s001)
330        {
331            s001 = true;
332            Pause();
333            MediaPlayer.Play("Venom");
334            selectsfx.Play();
335        }
336    }
337
338    //Stage creation
339    void CreateLevel(string level)
340    {
341        Gravity = new Vector(1000, 0);
342
343        TileMap lvl = TileMap.FromLevelAsset(level);
344        lvl.SetTileMethod('x', border);
345        lvl.SetTileMethod('y', bordertop);
346        lvl.SetTileMethod('z', borderbottom);
347        lvl.SetTileMethod('%', frontBorder);
348        lvl.SetTileMethod('&', backBorder);
349        lvl.SetTileMethod('#', bulletdes);
350        lvl.SetTileMethod('P', AddPlayer);
351        lvl.SetTileMethod('1', enemy_ship_1);
352        lvl.SetTileMethod('R', enemy_ship_1_red);
353        lvl.SetTileMethod('B', enemy_ship_1_bottom);
354        lvl.SetTileMethod('T', enemy_ship_1_top);
355        lvl.SetTileMethod('2', enemy_ship_2);
356        lvl.SetTileMethod('3', enemy_ship_3);
357        lvl.SetTileMethod('4', enemy_ship_4_top);
358        lvl.SetTileMethod('$', enemy_ship_4_bottom);
359        lvl.SetTileMethod('5', enemy_ship_5);
360        lvl.SetTileMethod('G', boss_ship_1);
361        lvl.Execute(35, 35);
362
363        Level.Background.Color = Color.LightGray;
364        GameObject bg = new GameObject(1280, 800);
365        bg.Position = cntr;
366        bg.Image = earth;
367        bg.MoveTo(cntr - new Vector(1280, 0), 900);
368
369        GameObject bg2 = new GameObject(1280, 800);
370        bg2.Position = cntr+new Vector(1280,0);
371        bg2.Image = earth;
372        bg2.MoveTo(cntr, 900);
373
374        Timer scroll = new Timer();
375        scroll.Interval = 0.001;
376        scroll.Timeout += delegate
377        {
378            if (bg.Position.X <= cntr.X - 1279)
379            {
380                bg.Position = cntr;
381                bg.MoveTo(cntr - new Vector(1280, 0), 900);
382            };
383            if (bg2.Position.X <= cntr.X + 1)
384            {
385                bg2.Position = cntr+new Vector(1280,0);
386                bg2.MoveTo(cntr, 900);
387            };
388        };
389        scroll.Start();
390        Add(bg, -3);
391        Add(bg2, -3);
392
393        AddControls();
394        AddHealthbar();
395
396        Camera.Position = player.Position;
397        //Camera.ZoomFactor = 0.4;
398        //edgeBorders();
399    }
400    //Tiles for level
401    void border(Vector position, double width, double height)
402    {
403        PhysicsObject border2 = PhysicsObject.CreateStaticObject(width*1.5, height);
404        border2.Position = position;
405        border2.Restitution = 0;
406        border2.KineticFriction = 0;
407        border2.StaticFriction = 0;
408        border2.Color = Color.Black;
409        border2.Tag = "border";
410        Add(border2, 1);
411    }
412    void bordertop(Vector position, double width, double height)
413    {
414        PhysicsObject border2 = PhysicsObject.CreateStaticObject(width * 1.5, height);
415        border2.Position = position;
416        border2.Restitution = 0;
417        border2.KineticFriction = 0;
418        border2.StaticFriction = 0;
419        border2.Color = Color.Black;
420        border2.Tag = "border";
421        border2.Image = border_top;
422        Add(border2, 1);
423    }
424    void borderbottom(Vector position, double width, double height)
425    {
426        PhysicsObject border2 = PhysicsObject.CreateStaticObject(width * 1.5, height);
427        border2.Position = position;
428        border2.Restitution = 0;
429        border2.KineticFriction = 0;
430        border2.StaticFriction = 0;
431        border2.Color = Color.Black;
432        border2.Tag = "border";
433        border2.Image = border_bottom;
434        Add(border2, 1);
435    }
436    void frontBorder(Vector position, double width, double height)
437    {
438        frontborder border = new frontborder(width, height);
439        border.Position = position;
440        border.Color = Color.White;
441        border.Restitution = 0;
442        border.Tag = "border";
443        border.IgnoresCollisionResponse = true;
444        border.IgnoresPhysicsLogics = true;
445        AddCollisionHandler<PhysicsObject, player>(border, frontBorderCollision);
446        AddCollisionHandler<PhysicsObject, enemy>(border, frontBorderCollisionEnemy);
447        Add(border);
448    }
449    void backBorder(Vector position, double width, double height)
450    {
451        backborder border = new backborder(width, height);
452        border.Position = position;
453        border.Color = Color.White;
454        border.Restitution = 0;
455        border.Tag = "border";
456        border.IgnoresCollisionResponse = true;
457        border.IgnoresCollisionResponse = true;
458        AddCollisionHandler<PhysicsObject, player>(border, backBorderCollision);
459        //AddCollisionHandler<PhysicsObject, enemy>(border, backBorderCollisionEnemy);
460        Add(border);
461    }
462    void bulletdes(Vector position, double width, double height)
463    {
464        bulletdes border = new bulletdes(width, height);
465        border.Position = position;
466        border.Color = Color.Red;
467        border.Restitution = 0;
468        border.Tag = "border";
469        border.IgnoresCollisionResponse = true;
470        border.IgnoresPhysicsLogics = true;
471        Add(border);
472    }
473    void frontBorderCollision(PhysicsObject border, PhysicsObject target)
474    {
475        player.health.Value = player.health.Value - player.health.Value;
476        hurtsfx.Play();
477        explosionsfx.Play();
478        explosion_animation2(target);
479        playership.Destroy();
480
481    }
482    void frontBorderCollisionEnemy(PhysicsObject border, enemy enemy)
483    {
484        enemy.canShoot = true;
485
486    }
487    void backBorderCollision(PhysicsObject border, PhysicsObject target)
488    {
489        player.health.Value = player.health.Value - player.health.Value;
490        hurtsfx.Play();
491        explosionsfx.Play();
492        explosion_animation2(target);
493        playership.Destroy();
494    }
495    void backBorderCollisionEnemy(PhysicsObject border, enemy enemy)
496    {
497        enemy.Destroy();
498    }
499
500    //Player related
501    void AddPlayer(Vector pos, double width, double height)
502    {
503        cntr = pos;
504
505        player.Shape = Shape.Circle;
506        player.Color = Color.Black;
507        player.Restitution = 0;
508        player.CanRotate = false;
509        player.Mass = int.MaxValue;
510        player.KineticFriction = 0;
511        player.StaticFriction = 0;
512        player.Image = hitbox;
513        player.IgnoresGravity = true;
514        player.Position = pos;
515        player.Tag = "player1";
516        Add(player,2);
517
518        if (cursorpos == 0)
519        {
520            playership.Image = player_ship_01;
521            playership.Size = new Vector(37, 48);
522        }
523        else if (cursorpos == 1) playership.Image = player_ship_02;
524        playership.IsVisible = true;
525        playership.IgnoresCollisionResponse = true;
526        playership.IgnoresPhysicsLogics = true;
527        playership.Angle = Angle.FromDegrees(-90);
528        playership.CanRotate = false;
529        playership.Tag = "playership";
530        playership.Position = player.Position;
531
532        FollowerBrain playershipbrain = new FollowerBrain(player);
533        playershipbrain.Speed = 500;
534        playershipbrain.DistanceFar = 5000;
535        playershipbrain.DistanceClose = 0;
536        playershipbrain.StopWhenTargetClose = true;
537        playershipbrain.Active = true;
538        playershipbrain.TurnWhileMoving = false;
539
540        playership.Brain = playershipbrain;
541
542        Add(playership, -1);
543        drd_type = cursorpos;
544        if (drd_type == 0)
545        {
546            droid(new Vector(-30, 50));
547            droid(new Vector(-30, -50));
548            droid(new Vector(-50, 30));
549            droid(new Vector(-50, -30));
550        } 
551        else if (drd_type == 1)
552        {
553            droid(new Vector(-30, 55));
554            droid(new Vector(-30, -55));
555            droid(new Vector(-10, 35));
556            droid(new Vector(-10, -35));
557        }
558    }
559    void AddHealthbar()
560    {
561        ProgressBar healthBar = new ProgressBar(135, 10);
562        healthBar.BorderColor = Color.Black;
563        healthBar.Color = Color.Black;
564        healthBar.BarColor = Color.Red;
565        healthBar.BindTo(player.health);
566        healthBar.Angle = Angle.RightAngle;
567        healthBar.Position = new Vector(Screen.LeftSafe + 30, Screen.BottomSafe + 200);
568        Add(healthBar);
569    }
570    void AddControls()
571
572    {
573        ControllerOne.Listen(Button.Back, ButtonState.Pressed, ConfirmExit, null);
574        ControllerOne.ListenAnalog(AnalogControl.LeftStick, -0.1, move, null);
575
576        ControllerOne.Listen(Button.B, ButtonState.Pressed, shoot, null);
577        ControllerOne.Listen(Button.B, ButtonState.Released, stopShoot, null);
578
579        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, null);
580
581        //cheat
582        Keyboard.Listen(Key.U, ButtonState.Pressed, cheat_upgrade, null);
583        Keyboard.Listen(Key.I, ButtonState.Pressed, cheat_damage, null);
584        Keyboard.Listen(Key.H, ButtonState.Pressed, cheat_fullhp, null);
585
586    }
587    void move(AnalogState speed)
588    {
589        player.Velocity = speed.StateVector * player_speed / (ControllerOne.LeftTriggerState+1);
590    }
591
592    void cheat_upgrade()
593    {
594        wpn_spread.Value++;
595    }
596    void cheat_damage()
597    {
598        wpn_damageRatio.Value++;
599    }
600    void cheat_fullhp()
601    {
602        player.health.Value = 100;
603        //MessageDisplay.Te
604    }
605
606    //Weapon system
607    void shoot()
608    {
609        //wpn_timer.Stop();
610        wpn_timer.Interval = wpn_shootRate;
611
612        wpn_timer.Start();
613    }
614    void setwpn_timer()
615    {
616            wpn_timer.Timeout += delegate
617        {
618            if (!player.IsDestroyed)
619            {
620                if (ControllerOne.GetButtonState(Button.B) == ButtonState.Down)
621                {
622                    Weapon();
623                    wpn_timer.Interval = wpn_shootRate;
624                    shootsfx.Play();
625                }
626            };
627        };
628    }
629    void stopShoot()
630    {
631        wpn_timer.Stop();
632    }
633    void Weapon()
634    {
635        if (wpn_spread.Value == 1)
636        {
637            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 0), new Vector(40, 12) );
638            Projectile(player.Position + new Vector(10, -5), new Vector(1200, 0), new Vector(40, 12) );
639        }
640        else if (wpn_spread.Value == 2)
641        {
642            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 0), new Vector(40, 12) );
643            Projectile(player.Position + new Vector(10, -10), new Vector(1200, 0), new Vector(40, 12) );
644            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12) );
645        }
646        else if (wpn_spread.Value == 3)
647        {
648            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 15), new Vector(40, 12) );
649            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -15), new Vector(40, 12) );
650            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 20), new Vector(40, 12) );
651            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -20), new Vector(40, 12) );
652        }
653        else if (wpn_spread.Value == 4)
654        {
655            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 25), new Vector(40, 12) );
656            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -25), new Vector(40, 12) );
657            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12) );
658            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 50), new Vector(40, 12) );
659            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -50), new Vector(40, 12) );
660        }
661        else if (wpn_spread.Value == 5)
662        {
663            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12) );
664            Projectile(player.Position + new Vector(10, -0), new Vector(1200, 0), new Vector(40, 12) );
665
666            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 50), new Vector(40, 12) );
667            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -50), new Vector(40, 12) );
668
669            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 55), new Vector(40, 12) );
670            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -55), new Vector(40, 12) );
671        }
672        else if (wpn_spread.Value == 6)
673        {
674            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 25), new Vector(40, 12) );
675            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -25), new Vector(40, 12) );
676            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12) );
677            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 50), new Vector(40, 12) );
678            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -50), new Vector(40, 12) );
679
680            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 75), new Vector(40, 12) );
681            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -75), new Vector(40, 12) );
682        }
683        else if (wpn_spread.Value == 7)
684        {
685            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 15), new Vector(40, 12) );
686            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -15), new Vector(40, 12) );
687            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 15), new Vector(40, 12) );
688            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -15), new Vector(40, 12) );
689
690            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 50), new Vector(40, 12) );
691            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -50), new Vector(40, 12) );
692
693            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 50), new Vector(40, 12) );
694            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -50), new Vector(40, 12) );
695        }
696        else if (wpn_spread.Value == 8)
697        {
698            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12) );
699            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 25), new Vector(40, 12) );
700            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -25), new Vector(40, 12) );
701            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 25), new Vector(40, 12) );
702            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -25), new Vector(40, 12) );
703
704            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 50), new Vector(40, 12) );
705            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -50), new Vector(40, 12) );
706
707            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 50), new Vector(40, 12) );
708            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -50), new Vector(40, 12) );
709        }
710        else if (wpn_spread.Value == 9)
711        {
712            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 15), new Vector(40, 12));
713            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -15), new Vector(40, 12));
714            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 15), new Vector(40, 12));
715            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -15), new Vector(40, 12));
716
717            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 50), new Vector(40, 12));
718            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -50), new Vector(40, 12));
719
720            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 50), new Vector(40, 12));
721            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -50), new Vector(40, 12));
722
723            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 75), new Vector(40, 12));
724            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -75), new Vector(40, 12));
725        }
726        else if (wpn_spread.Value == 10)
727        {
728            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 25), new Vector(40, 12) );
729            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -25), new Vector(40, 12));
730            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12));
731            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 50), new Vector(40, 12));
732            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -50), new Vector(40, 12) );
733
734            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 75), new Vector(40, 12) );
735            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -75), new Vector(40, 12) );
736
737            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 100), new Vector(40, 12) );
738            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -100), new Vector(40, 12) );
739
740            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 125), new Vector(40, 12) );
741            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -125), new Vector(40, 12) );
742        }
743    }
744    void Projectile(Vector pos, Vector vel, Vector size)
745    {
746        bullet projectile = new bullet(size.X, size.Y);
747        projectile.Shape = Shape.Diamond;
748        projectile.IgnoresGravity = true;
749        projectile.Position = pos;
750        projectile.Tag = "player_bullet";
751
752        if (wpn_damageRatio <= 2) projectile.Image = bullet_player01;
753        else if (wpn_damageRatio.Value <= 4) projectile.Image = bullet_player03;
754        else if (wpn_damageRatio.Value <= 6) projectile.Image = bullet_player04;
755        else if (wpn_damageRatio.Value <= 8) projectile.Image = bullet_player02;
756        else if (wpn_damageRatio.Value <= 10) projectile.Image = bullet_player05;
757
758        projectile.damage = wpn_damageRatio.Value;
759            projectile.IgnoresCollisionResponse = true;
760
761        projectile.CollisionIgnoreGroup = 2;
762        projectile.MaximumLifetime = TimeSpan.FromSeconds(1.57);
763
764        AddCollisionHandler<bullet, frontborder>(projectile, destroy);
765        AddCollisionHandler<bullet, enemy>(projectile, damageEnemy);
766
767        Add(projectile, 0);
768        projectile.Hit(vel/1.2);
769        projectile.Angle = projectile.Velocity.Angle;
770    }
771
772    void droid(Vector pos)
773    {
774        droid drd = new droid(13,13);
775        drd.Shape = Shape.Circle;
776        drd.IgnoresCollisionResponse = true;
777        drd.CollisionIgnoreGroup = 2;
778        drd.Position = player.Position + pos;
779        if (cursorpos == 0) drd.Animation = droid2_anim;
780        else if (cursorpos == 1) drd.Animation = droid_anim;
781        drd.Animation.Start();
782        setdrd_shoot_timer(drd);
783
784        Timer move = new Timer();
785        move.Interval = 0.01;
786        move.Timeout += delegate
787        {
788            if (drd.Position != player.Position + pos)
789            {
790                drd.Position = player.Position + pos;
791            }
792        };
793        move.Start();
794
795        Add(drd);
796    }
797    void setdrd_shoot_timer(droid drd)
798    {
799        Timer drdshoot = new Timer();
800        if (cursorpos == 0) drdshoot.Interval = drd_shootRate;
801        else if (cursorpos == 1) drdshoot.Interval = 0.05;
802        if (cursorpos == 0)
803        {
804            drdshoot.Timeout += delegate
805            {
806                if (ControllerOne.GetButtonState(Button.B) == ButtonState.Down)
807                {
808                    droidprojectile(drd.Position, new Vector(-400, RandomGen.NextDouble(100, 150)), new Vector(24, 13));
809                    droidprojectile(drd.Position, new Vector(-400, RandomGen.NextDouble(-150, -100)), new Vector(24, 13));
810                };
811            };
812        }
813        else if (cursorpos == 1)
814        {
815            drdshoot.Timeout += delegate
816            {
817                if (ControllerOne.GetButtonState(Button.B) == ButtonState.Down)
818                {
819                    droidlaser(drd.Position + new Vector(37, 0), new Vector(1400, 0), new Vector(70, 5));
820                };
821            };
822        }
823
824        drdshoot.Start();
825    }
826
827    void droidprojectile(Vector pos, Vector vel, Vector size)
828    {
829        bullet projectile = new bullet(size.X, size.Y/2);
830        projectile.Shape = Shape.Diamond;
831        projectile.IgnoresGravity = false;
832        projectile.Position = pos;
833        projectile.Tag = "player_bullet";
834        projectile.Image = bullet_droid;
835        projectile.damage = drd_damageRatio.Value;
836        projectile.LinearDamping = 0.99;
837
838        projectile.IgnoresCollisionResponse = true;
839
840        projectile.CollisionIgnoreGroup = 2;
841        projectile.MaximumLifetime = TimeSpan.FromSeconds(3);
842
843        AddCollisionHandler<bullet, frontborder>(projectile, destroy);
844        AddCollisionHandler<bullet, enemy>(projectile, damageEnemy);
845
846        Add(projectile, -1);
847        projectile.Hit(vel);
848        projectile.Angle = projectile.Velocity.Angle;
849
850        Timer angle = new Timer();
851        angle.Interval = 0.05;
852        angle.Timeout += delegate
853        {
854            projectile.Angle = projectile.Velocity.Angle;
855            if (projectile.IsDestroyed) { angle.Stop(); };
856        };
857        angle.Start();
858    }
859    void droidlaser(Vector pos, Vector vel, Vector size)
860    {
861        bullet projectile = new bullet(size.X, size.Y);
862        projectile.Shape = Shape.Rectangle;
863        projectile.IgnoresGravity = true;
864        projectile.Position = pos;
865        projectile.Tag = "player_bullet";
866        projectile.Image = bullet_laser;
867        projectile.damage = drd_damageRatio.Value;
868
869        projectile.IgnoresCollisionResponse = true;
870
871        projectile.CollisionIgnoreGroup = 2;
872        projectile.MaximumLifetime = TimeSpan.FromSeconds(1.2);
873
874        AddCollisionHandler<bullet, frontborder>(projectile, destroy);
875        AddCollisionHandler<bullet, enemy>(projectile, damageEnemy);
876
877        Add(projectile, -1);
878        projectile.Hit(vel);
879
880    }
881   
882    //Enemies
883    void enemy_ship_1(Vector pos, double width, double height)
884    {
885        enemy enemyship = new enemy(70, 35);
886        enemyship.Shape = Shape.Circle;
887        enemyship.Color = Color.Black;
888        enemyship.Position = pos;
889        enemyship.IgnoresCollisionResponse = true;
890        enemyship.CollisionIgnoreGroup = 3;
891        enemyship.health.MaxValue = 6;
892        enemyship.Image = enemy_ship_01;
893
894        Add(enemyship, -1);
895        enemyship.Hit(stagespeed);
896        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
897        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_1_frontborder);
898    }
899    void enemy_ship_1_frontborder(enemy enemyship, frontborder border)
900    {
901        enemyship.LifetimeLeft = TimeSpan.FromSeconds(3);
902    }
903    void enemy_ship_1_red(Vector pos, double width, double height)
904    {
905        enemy enemyship = new enemy(70, 35);
906        enemyship.Shape = Shape.Circle;
907        enemyship.Color = Color.Black;
908        enemyship.Position = pos;
909        enemyship.IgnoresCollisionResponse = true;
910        enemyship.health.MaxValue = 6;
911        enemyship.Image = enemy_ship_01_red;
912        enemyship.CollisionIgnoreGroup = 3;
913
914        Add(enemyship, -1);
915        enemyship.Hit(stagespeed);
916        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
917        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_1_red_frontborder);
918    }
919    void enemy_ship_1_red_frontborder(enemy enemyship, frontborder border)
920    {
921        if (!enemyship.canShoot)
922        {
923            enemyship.Angle = Angle.FromDegrees(180);
924            enemyship.Velocity = -stagespeed;
925            enemyship.Position = new Vector(border.X-1400, enemyship.Position.Y);
926            enemyship.LifetimeLeft = TimeSpan.FromSeconds(3);
927
928            enemyship.canShoot = true;
929        };
930    }
931    void enemy_ship_1_bottom(Vector pos, double width, double height)
932    {
933        enemy enemyship = new enemy(35, 70);
934        enemyship.Shape = Shape.Circle;
935        enemyship.Color = Color.Black;
936        enemyship.Position = pos;
937        enemyship.IgnoresCollisionResponse = true;
938        enemyship.CollisionIgnoreGroup = 3;
939        enemyship.health.MaxValue = 6;
940        enemyship.Image = enemy_ship_01_blue;
941        enemyship.Angle = Angle.FromDegrees(90);
942
943        Add(enemyship, -1);
944        enemyship.Hit(stagespeed);
945        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
946        AddCollisionHandler<PhysicsObject, frontborder>(enemyship, enemy_ship_1_bottom_frontborder);
947    }
948    void enemy_ship_1_bottom_frontborder(PhysicsObject enemyship, frontborder br)
949    {
950        enemyship.LifetimeLeft = TimeSpan.FromSeconds(3);
951        enemyship.Angle = Angle.FromDegrees(0);
952        enemyship.Velocity = new Vector(0, -stagespeed.X/1.7);
953        enemyship.Position = new Vector(cntr.X + enemyship.Y, -405);
954    }
955    void enemy_ship_1_top(Vector pos, double width, double height)
956    {
957        enemy enemyship = new enemy(35, 70);
958        enemyship.Shape = Shape.Circle;
959        enemyship.Color = Color.Black;
960        enemyship.Position = pos;
961        enemyship.IgnoresCollisionResponse = true;
962        enemyship.CollisionIgnoreGroup = 3;
963        enemyship.health.MaxValue = 6;
964        enemyship.Image = enemy_ship_01_blue_inverted;
965        enemyship.Angle = Angle.FromDegrees(90);
966
967        Add(enemyship, -1);
968        enemyship.Hit(stagespeed);
969        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
970        AddCollisionHandler<PhysicsObject, frontborder>(enemyship, enemy_ship_1_top_frontborder);
971    }
972    void enemy_ship_1_top_frontborder(PhysicsObject enemysship, frontborder br)
973    {
974        enemysship.LifetimeLeft = TimeSpan.FromSeconds(3);
975        enemysship.Angle = Angle.FromDegrees(0);
976        enemysship.Velocity = new Vector(0, stagespeed.X / 1.75);
977
978        enemysship.Position = new Vector(cntr.X + enemysship.Y, 405);
979    }
980    void enemy_ship_2(Vector pos, double widht, double height)
981    {
982        enemy enemyship = new enemy(70, 30);
983        enemyship.Shape = Shape.Circle;
984        enemyship.Color = Color.Black;
985        enemyship.Position = pos;
986        enemyship.IgnoresCollisionResponse = true;
987        enemyship.CollisionIgnoreGroup = 3;
988        enemyship.health.MaxValue = 25;
989        enemyship.Image = enemy_ship_02;
990
991        Add(enemyship, -1);
992        enemyship.Hit(stagespeed);
993        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
994        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_2_start_shooting);
995    }
996    void enemy_ship_2_start_shooting(enemy enemyship, frontborder border)
997    {
998        if (!enemyship.canShoot)
999        {
1000            enemyship.canShoot = true;
1001
1002            enemyship.Velocity = enemyship.Velocity / 2;
1003
1004            double angle = 0;
1005            double i = 1;
1006            double c = 0;
1007            UnlimitedAngle angle2;
1008
1009            Timer playsfx = new Timer();
1010            playsfx.Interval = 0.05;
1011            playsfx.Timeout += delegate
1012            {
1013                    enemy_shootsfx.Play();
1014            };
1015
1016            Timer shoot = new Timer();
1017            shoot.Interval = 0.01;
1018            shoot.Timeout += delegate
1019            {
1020                if (c >= 200){
1021                    shoot.Stop(); 
1022                playsfx.Stop();
1023                }
1024                else if (c != 200)
1025                {
1026                    if (!enemyship.IsDestroyed)
1027                    {
1028                        angle = angle + i;
1029                        i = i + 0.1;
1030                        c++;
1031                        angle2 = UnlimitedAngle.FromDegrees(angle);
1032                        enemy_shoot_2(enemyship.Position,
1033
1034                            angle2.GetVector() * 500
1035                            );
1036                    }
1037                    else
1038                    {
1039                        shoot.Stop();
1040                        playsfx.Stop();
1041                    }
1042                };
1043
1044            };
1045
1046            Timer wait = new Timer();
1047            wait.Interval = 0.5;
1048            wait.Timeout += delegate
1049            {
1050                if (!enemyship.IsDestroyed)
1051                {
1052                    shoot.Start();
1053                    playsfx.Start();
1054                }
1055                else wait.Stop();
1056            };
1057            wait.Start(1);
1058        }
1059    }
1060    void enemy_ship_3(Vector pos, double width, double height)
1061    {
1062        enemy enemyship = new enemy(71, 56);
1063        enemyship.Shape = Shape.Circle;
1064        enemyship.Position = pos;
1065        enemyship.IgnoresCollisionResponse = true;
1066        enemyship.CollisionIgnoreGroup = 3;
1067        enemyship.health.MaxValue = 50;
1068        enemyship.Image = enemy_ship_03;
1069        enemyship.explosion_scale = 75;
1070
1071        Add(enemyship,-1);
1072        enemyship.Hit(stagespeed);
1073
1074        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_3_start_shooting);
1075        AddCollisionHandler<enemy, player>(enemyship,damagePlayerEnemyShip2);
1076    }
1077    void enemy_ship_3_start_shooting(enemy enemyship, frontborder border)
1078    {
1079        if (!enemyship.canShoot)
1080        {
1081            enemyship.canShoot = true;
1082            enemyship.LifetimeLeft = TimeSpan.FromSeconds(60);
1083            enemyship.Velocity = enemyship.Velocity / 3;
1084            int i = 0;
1085            int e = 0;
1086
1087            Timer playsfx = new Timer();
1088            playsfx.Interval = 0.06;
1089            playsfx.Timeout += delegate
1090            {
1091                enemy_shootsfx.Play();
1092            };
1093
1094            Timer wait = new Timer();
1095
1096            Timer enemy_shoot = new Timer();
1097            enemy_shoot.Interval = 0.02;
1098            enemy_shoot.Timeout += delegate
1099            {
1100                if (e >= 4)
1101                {
1102
1103                    enemy_shoot.Stop();
1104                    playsfx.Stop();
1105                    enemyship.Velocity = stagespeed / 3;
1106                    enemyship.LifetimeLeft = TimeSpan.FromSeconds(6);
1107                };
1108                i++;
1109                if (i == 50 && e != 4)
1110                {
1111                    enemy_shoot.Stop();
1112                    playsfx.Stop();
1113                    wait.Start(1);
1114                    e++;
1115                };
1116                if (enemyship.IsDestroyed)
1117                {
1118                    enemy_shoot.Stop();
1119                    playsfx.Stop();
1120                }
1121                if (e != 4)
1122                {
1123                    enemy_shoot_1(enemyship.Position + new Vector(RandomGen.NextDouble(-30, 30), RandomGen.NextDouble(-30, 30)));
1124                }
1125            };
1126
1127            wait.Interval = 0.5;
1128            wait.Timeout += delegate
1129            {
1130                if (enemyship.IsDestroyed) wait.Stop();
1131                i = 0;
1132                enemy_shoot.Start(50);
1133                playsfx.Start();
1134            };
1135
1136            Timer enemy_start = new Timer();
1137            enemy_start.Interval = 3;
1138            enemy_start.Timeout += delegate
1139            {
1140                if (!enemyship.IsDestroyed)
1141                {
1142                    playsfx.Start();
1143                    enemy_shoot.Start(50);
1144                    enemyship.Velocity = new Vector(0,0);
1145                };
1146            };
1147            enemy_start.Start(1);
1148
1149        };
1150    }
1151    void enemy_ship_4_top(Vector pos, double width, double height)
1152    {
1153        enemy enemyship = new enemy(43, 33);
1154        enemyship.Shape = Shape.Circle;
1155        enemyship.Color = Color.Black;
1156        enemyship.Position = pos;
1157        enemyship.IgnoresCollisionResponse = true;
1158        enemyship.CollisionIgnoreGroup = 3;
1159        enemyship.health.MaxValue = 10;
1160        enemyship.Image = enemy_ship_04;
1161
1162        Add(enemyship, -1);
1163        enemyship.Hit(stagespeed);
1164        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
1165        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_4_top_frontborder);
1166    }
1167    void enemy_ship_4_top_frontborder(enemy enemysship, frontborder br)
1168    {
1169        if (!enemysship.canShoot)
1170        {
1171            enemysship.canShoot = true;
1172
1173            //enemysship.LifetimeLeft = TimeSpan.FromSeconds(3);
1174            enemysship.Velocity = new Vector(0, stagespeed.X);
1175            enemysship.Position = new Vector(cntr.X + enemysship.Y, 405);
1176
1177            Timer chk = new Timer();
1178            chk.Interval = 0.01;
1179            chk.Timeout += delegate
1180            {
1181                if (!enemysship.IsDestroyed)
1182                {
1183                    if (enemysship.Y >= player.Y - 10 && enemysship.Y <= player.Y + 10)
1184                    {
1185                        enemysship.Velocity = stagespeed;
1186                        if ((player.X - enemysship.X) > 0) enemysship.Velocity = -stagespeed;
1187                        chk.Stop();
1188                        enemysship.LifetimeLeft = TimeSpan.FromSeconds(3);
1189                    }
1190                }
1191                else if (enemysship.IsDestroyed) chk.Stop();
1192            };
1193
1194            chk.Start();
1195        };
1196    }
1197    void enemy_ship_4_bottom(Vector pos, double width, double height)
1198    {
1199        enemy enemyship = new enemy(43, 33);
1200        enemyship.Shape = Shape.Circle;
1201        enemyship.Color = Color.Black;
1202        enemyship.Position = pos;
1203        enemyship.IgnoresCollisionResponse = true;
1204        enemyship.CollisionIgnoreGroup = 3;
1205        enemyship.health.MaxValue = 10;
1206        enemyship.Image = enemy_ship_04;
1207
1208        Add(enemyship, -1);
1209        enemyship.Hit(stagespeed);
1210        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
1211        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_4_bottom_frontborder);
1212    }
1213    void enemy_ship_4_bottom_frontborder(enemy enemysship, frontborder br)
1214    {
1215        if (!enemysship.canShoot)
1216        {
1217            enemysship.canShoot = true;
1218            enemysship.Velocity = new Vector(0, -stagespeed.X);
1219            enemysship.Position = new Vector(cntr.X + enemysship.Y, -405);
1220
1221            Timer chk = new Timer();
1222            chk.Interval = 0.01;
1223            chk.Timeout += delegate
1224            {
1225                if (!enemysship.IsDestroyed)
1226                {
1227                    if (enemysship.Y >= player.Y - 10 && enemysship.Y <= player.Y + 10)
1228                    {
1229                        enemysship.Velocity = stagespeed;
1230                        if ((player.X - enemysship.X) > 0) enemysship.Velocity = -stagespeed;
1231                        chk.Stop();
1232                        enemysship.LifetimeLeft = TimeSpan.FromSeconds(3);
1233                    }
1234                }
1235                else if (enemysship.IsDestroyed) chk.Stop();
1236            };
1237
1238            chk.Start();
1239        };
1240    }
1241    void enemy_ship_5(Vector pos, double width, double height)
1242    {
1243        enemy enemyship = new enemy(62, 49);
1244        enemyship.Shape = Shape.Circle;
1245        enemyship.Position = pos;
1246        enemyship.IgnoresCollisionResponse = true;
1247        enemyship.CollisionIgnoreGroup = 3;
1248        enemyship.health.MaxValue = 30;
1249        enemyship.Image = enemy_ship_05;
1250        enemyship.explosion_scale = 60;
1251
1252        Add(enemyship, -1);
1253        enemyship.Hit(stagespeed);
1254
1255        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_5_start_shooting);
1256        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip2);
1257    }
1258    void enemy_ship_5_start_shooting(enemy enemyship, frontborder border)
1259    {
1260        if (!enemyship.canShoot)
1261        {
1262            enemyship.canShoot = true;
1263            enemyship.LifetimeLeft = TimeSpan.FromSeconds(8.4);
1264            enemyship.Velocity = enemyship.Velocity / 3;
1265
1266            UnlimitedAngle angle = UnlimitedAngle.FromDegrees(0);
1267            UnlimitedAngle angle2 = UnlimitedAngle.FromDegrees(90);
1268            UnlimitedAngle angle3 = UnlimitedAngle.FromDegrees(180);
1269            UnlimitedAngle angle4 = UnlimitedAngle.FromDegrees(270);
1270            double i = 0;
1271
1272            Timer shoot = new Timer();
1273            shoot.Interval = 0.06;
1274            shoot.Timeout += delegate
1275            {
1276                if (!enemyship.IsDestroyed)
1277                {
1278                    i = i + 12;
1279                    angle = UnlimitedAngle.FromDegrees(i);
1280                    angle2 = UnlimitedAngle.FromDegrees(i + 90);
1281                    angle3 = UnlimitedAngle.FromDegrees(i + 180);
1282                    angle4 = UnlimitedAngle.FromDegrees(i + 270);
1283
1284                    enemy_shoot_3(enemyship.Position, angle.GetVector() * 400);
1285                    enemy_shoot_3(enemyship.Position, angle2.GetVector() * 400);
1286                    enemy_shoot_3(enemyship.Position, angle3.GetVector() * 400);
1287                    enemy_shoot_3(enemyship.Position, angle4.GetVector() * 400);
1288
1289                    enemy_shootsfx.Play();
1290                }
1291                else shoot.Stop();
1292            };
1293
1294            Timer wait = new Timer();
1295            wait.Interval = 1;
1296            wait.Timeout += delegate
1297            {
1298                if (!enemyship.IsDestroyed)
1299                {
1300                    shoot.Start();
1301                }
1302                else shoot.Stop();
1303            };
1304
1305            wait.Start(1);
1306        }
1307    }
1308
1309    void enemy_shoot_1(Vector pos)
1310    {
1311        bullet enemy_bullet = new bullet(27, 27);
1312        enemy_bullet.Shape = Shape.Circle;
1313        enemy_bullet.Position = pos;
1314        enemy_bullet.IgnoresCollisionResponse = true;
1315        enemy_bullet.IgnoresGravity = true;
1316        enemy_bullet.CollisionIgnoreGroup = 2;
1317        enemy_bullet.damage = 5;
1318        enemy_bullet.MaximumLifetime = TimeSpan.FromSeconds(5);
1319        enemy_bullet.Image = bullet_enemy_05;
1320
1321        enemy_bullet.Hit((player.Position - enemy_bullet.Position).Normalize() * 300);
1322        Add(enemy_bullet, 0);
1323        AddCollisionHandler<bullet, player>(enemy_bullet, damagePlayerBullet);
1324        AddCollisionHandler<bullet, bulletdes>(enemy_bullet, destroy);
1325    }
1326    void enemy_shoot_2(Vector pos, Vector dir)
1327    {
1328        bullet enemy_bullet = new bullet(27, 27);
1329        enemy_bullet.Shape = Shape.Circle;
1330        enemy_bullet.Position = pos;
1331        enemy_bullet.IgnoresCollisionResponse = true;
1332        enemy_bullet.IgnoresGravity = true;
1333        enemy_bullet.CollisionIgnoreGroup = 2;
1334        enemy_bullet.damage = 5;
1335        enemy_bullet.MaximumLifetime = TimeSpan.FromSeconds(5);
1336        enemy_bullet.Image = bullet_enemy_02;
1337
1338        Add(enemy_bullet, 0);
1339        enemy_bullet.Hit(dir/9);
1340        AddCollisionHandler<bullet, player>(enemy_bullet, damagePlayerBullet);
1341        AddCollisionHandler<bullet, bulletdes>(enemy_bullet, destroy);
1342
1343        Timer wait = new Timer();
1344        wait.Interval = 0.8;
1345        wait.Timeout += delegate
1346        {
1347            enemy_bullet.Velocity = dir;
1348        };
1349        wait.Start(1);
1350    }
1351    void enemy_shoot_3(Vector pos, Vector dir)
1352    {
1353        bullet enemy_bullet = new bullet(27, 27);
1354        enemy_bullet.Shape = Shape.Circle;
1355        enemy_bullet.Position = pos;
1356        enemy_bullet.IgnoresCollisionResponse = true;
1357        enemy_bullet.IgnoresGravity = true;
1358        enemy_bullet.CollisionIgnoreGroup = 2;
1359        enemy_bullet.damage = 5;
1360        enemy_bullet.MaximumLifetime = TimeSpan.FromSeconds(4);
1361        enemy_bullet.Image = bullet_enemy_01;
1362
1363        Add(enemy_bullet, 0);
1364        enemy_bullet.Hit(dir);
1365        AddCollisionHandler<bullet, player>(enemy_bullet, damagePlayerBullet);
1366        AddCollisionHandler<bullet, bulletdes>(enemy_bullet, destroy);
1367
1368    }
1369
1370    //Bosses
1371    void boss_ship_1(Vector pos, double width, double height)
1372    {
1373        boss boss_ship = new boss(196, 124);
1374        boss_ship.Shape = Shape.Circle;
1375        boss_ship.Position = pos;
1376        boss_ship.IgnoresCollisionResponse = true;
1377        boss_ship.CollisionIgnoreGroup = 3;
1378        boss_ship.Image = boss_ship_01;
1379
1380        Add(boss_ship, -1);
1381        boss_ship.Hit(stagespeed);
1382        AddCollisionHandler<boss, frontborder>(boss_ship, boss_01_start);
1383        AddCollisionHandler<boss, bullet>(boss_ship, damageBoss);
1384        AddCollisionHandler<boss, player>(boss_ship, damagePlayerBossShip);
1385    }
1386    void boss_01_start(boss boss, frontborder border)
1387    {
1388        if (!boss.canShoot)
1389        {
1390            boss.canShoot = true;
1391            boss.Velocity = boss.Velocity / 8;
1392
1393            Timer wait = new Timer();
1394            wait.Interval = 5;
1395            wait.Timeout += delegate
1396            {
1397                MediaPlayer.Play("Andross");
1398                MediaPlayer.Volume = 1;
1399                boss.Velocity = new Vector(0, 0);
1400                boss.health.Value = boss.health.MaxValue;
1401                boss_01_start_shooting(boss);
1402            };
1403            wait.Start(1);
1404
1405            Timer fade_volume = new Timer();
1406            fade_volume.Interval = 0.2;
1407            fade_volume.Timeout += delegate
1408            {
1409                MediaPlayer.Volume = MediaPlayer.Volume - 0.1;
1410                if (MediaPlayer.Volume == 0)
1411                {
1412                    fade_volume.Stop();
1413                }
1414            };
1415            fade_volume.Start();
1416
1417        }
1418    }
1419    void boss_01_start_shooting(boss boss)
1420    {
1421        int i = 0;
1422
1423        double angle5 = 0;
1424        double c = 1;
1425        UnlimitedAngle angle05;
1426
1427        Timer shoot2 = new Timer();
1428        shoot2.Interval = 0.01;
1429        shoot2.Timeout += delegate
1430        {
1431            if (!boss.IsDestroyed)
1432            {
1433                angle5 = angle5 + c;
1434                c = c + 0.1;
1435                angle05 = UnlimitedAngle.FromDegrees(angle5);
1436                boss_shoot_2(boss.Position,
1437
1438                    angle05.GetVector() * 500
1439                    );
1440            }
1441            else
1442            {
1443                shoot2.Stop();
1444            }
1445        };
1446        Timer wait = new Timer();
1447
1448        Timer enemy_shoot1 = new Timer();
1449        enemy_shoot1.Interval = 0.02;
1450        enemy_shoot1.Timeout += delegate
1451        {
1452            i++;
1453            if (i == 100)
1454            {
1455                enemy_shoot1.Stop();
1456                shoot2.Start();
1457                wait.Start(1);
1458            };
1459            if (boss.IsDestroyed)
1460            {
1461                enemy_shoot1.Stop();
1462            }
1463                boss_shoot_1(boss.Position + new Vector(RandomGen.NextDouble(-50, 50), RandomGen.NextDouble(-50, 50)));
1464        };
1465
1466        UnlimitedAngle angle = UnlimitedAngle.FromDegrees(0);
1467        UnlimitedAngle angle2 = UnlimitedAngle.FromDegrees(90);
1468        UnlimitedAngle angle3 = UnlimitedAngle.FromDegrees(180);
1469        UnlimitedAngle angle4 = UnlimitedAngle.FromDegrees(270);
1470        double b = 0;
1471
1472        Timer shoot = new Timer();
1473        shoot.Interval = 0.08;
1474        shoot.Timeout += delegate
1475        {
1476            if (!boss.IsDestroyed)
1477            {
1478                b = b + 12;
1479                angle = UnlimitedAngle.FromDegrees(b);
1480                angle2 = UnlimitedAngle.FromDegrees(b + 90);
1481                angle3 = UnlimitedAngle.FromDegrees(b + 180);
1482                angle4 = UnlimitedAngle.FromDegrees(b + 270);
1483
1484                boss_shoot_3(boss.Position, angle.GetVector() * 400);
1485                boss_shoot_3(boss.Position, angle2.GetVector() * 400);
1486                boss_shoot_3(boss.Position, angle3.GetVector() * 400);
1487                boss_shoot_3(boss.Position, angle4.GetVector() * 400);
1488
1489                enemy_shootsfx.Play();
1490            }
1491            else shoot.Stop();
1492        };
1493
1494        wait.Interval = 0.5;
1495        wait.Timeout += delegate
1496        {
1497            if (boss.IsDestroyed) wait.Stop();
1498            i = 0;
1499            enemy_shoot1.Start(100);
1500            shoot2.Stop();
1501        };
1502
1503        enemy_shoot1.Start();
1504        shoot.Start();
1505    }
1506
1507    void boss_shoot_1(Vector pos)
1508    {
1509        bullet enemy_bullet = new bullet(27, 27);
1510        enemy_bullet.Shape = Shape.Circle;
1511        enemy_bullet.Position = pos;
1512        enemy_bullet.IgnoresCollisionResponse = true;
1513        enemy_bullet.IgnoresGravity = true;
1514        enemy_bullet.CollisionIgnoreGroup = 2;
1515        enemy_bullet.damage = 5;
1516        enemy_bullet.MaximumLifetime = TimeSpan.FromSeconds(5);
1517        enemy_bullet.Image = bullet_enemy_06;
1518
1519        enemy_bullet.Hit((player.Position - enemy_bullet.Position).Normalize() * 300);
1520        Add(enemy_bullet, 0);
1521        AddCollisionHandler<bullet, player>(enemy_bullet, damagePlayerBullet);
1522        AddCollisionHandler<bullet, bulletdes>(enemy_bullet, destroy);
1523    }
1524    void boss_shoot_2(Vector pos, Vector dir)
1525    {
1526        bullet enemy_bullet = new bullet(27, 27);
1527        enemy_bullet.Shape = Shape.Circle;
1528        enemy_bullet.Position = pos;
1529        enemy_bullet.IgnoresCollisionResponse = true;
1530        enemy_bullet.IgnoresGravity = true;
1531        enemy_bullet.CollisionIgnoreGroup = 2;
1532        enemy_bullet.damage = 5;
1533        enemy_bullet.MaximumLifetime = TimeSpan.FromSeconds(5);
1534        enemy_bullet.Image = bullet_enemy_06;
1535
1536        Add(enemy_bullet, 0);
1537        enemy_bullet.Hit(dir / 9);
1538        AddCollisionHandler<bullet, player>(enemy_bullet, damagePlayerBullet);
1539        AddCollisionHandler<bullet, bulletdes>(enemy_bullet, destroy);
1540
1541        Timer wait = new Timer();
1542        wait.Interval = 0.8;
1543        wait.Timeout += delegate
1544        {
1545            enemy_bullet.Velocity = dir;
1546        };
1547        wait.Start(1);
1548    }
1549    void boss_shoot_3(Vector pos, Vector dir)
1550    {
1551        bullet enemy_bullet = new bullet(27, 27);
1552        enemy_bullet.Shape = Shape.Circle;
1553        enemy_bullet.Position = pos;
1554        enemy_bullet.IgnoresCollisionResponse = true;
1555        enemy_bullet.IgnoresGravity = true;
1556        enemy_bullet.CollisionIgnoreGroup = 2;
1557        enemy_bullet.damage = 5;
1558        enemy_bullet.MaximumLifetime = TimeSpan.FromSeconds(4);
1559        enemy_bullet.Image = bullet_enemy_06;
1560
1561        Add(enemy_bullet, 0);
1562        enemy_bullet.Hit(dir);
1563        AddCollisionHandler<bullet, player>(enemy_bullet, damagePlayerBullet);
1564        AddCollisionHandler<bullet, bulletdes>(enemy_bullet, destroy);
1565
1566    }
1567
1568
1569    //Power-ups
1570    void powerup(Vector pos)
1571    {
1572        int a = RandomGen.NextInt(1, 9);
1573        if (a == 1)
1574        {
1575            createPowerup(pos);
1576        };
1577    }
1578    void createPowerup(Vector pos)
1579    {
1580        int type = RandomGen.NextInt(1, 12);
1581
1582        PhysicsObject powerup = new PhysicsObject(15, 15);
1583        powerup.Position = pos;
1584        powerup.Tag = "powerup";
1585        powerup.IgnoresCollisionResponse = true;
1586        powerup.IgnoresGravity = true;
1587        powerup.CollisionIgnoreGroup = 4;
1588        powerup.MaximumLifetime = TimeSpan.FromSeconds(5);
1589
1590        FollowerBrain powerup_follow = new FollowerBrain(player);
1591        powerup_follow.DistanceFar = 300;
1592        powerup_follow.Speed = 430;
1593        powerup_follow.Active = true;
1594
1595        powerup.Brain = powerup_follow;
1596
1597        if (type <= 6)
1598        {
1599            powerup.Image = powerup_damage;
1600            AddCollisionHandler(powerup, "player1", powerupdamage);
1601        }
1602        else if (type >= 7)
1603        {
1604            powerup.Image = powerup_spread;
1605            AddCollisionHandler(powerup, "player1", powerupspread);
1606        }
1607
1608        Add(powerup, -2);
1609    }
1610    void powerupdamage(PhysicsObject powerup, PhysicsObject p)
1611    {
1612        wpn_damageRatio.Value++;
1613        powerup.Destroy();
1614        powerupsfx.Play();
1615
1616        GameObject damageup = new GameObject(121,16);
1617        damageup.Position = p.Position + new Vector(0, 30);
1618        damageup.MaximumLifetime = TimeSpan.FromSeconds(0.75);
1619        damageup.Image = damage_up;
1620
1621        Timer damage = new Timer();
1622        damage.Interval = 0.1;
1623        damage.Timeout += delegate
1624        {
1625            if (damageup.IsDestroyed) damage.Stop();
1626            if (damageup.IsVisible) damageup.IsVisible = false;
1627            else damageup.IsVisible = true;
1628        };
1629
1630        Add(damageup, 2);
1631        damage.Start();
1632    }
1633    void powerupspread(PhysicsObject powerup, PhysicsObject p)
1634    {
1635        wpn_spread.Value++;
1636        powerup.Destroy();
1637        powerupsfx.Play();
1638
1639        GameObject spreadup = new GameObject(121, 16);
1640        spreadup.Position = p.Position + new Vector(0, 30);
1641        spreadup.MaximumLifetime = TimeSpan.FromSeconds(0.75);
1642        spreadup.Image = spread_up;
1643
1644        Timer damage = new Timer();
1645        damage.Interval = 0.1;
1646        damage.Timeout += delegate
1647        {
1648            if (spreadup.IsDestroyed) damage.Stop();
1649            if (spreadup.IsVisible) spreadup.IsVisible = false;
1650            else spreadup.IsVisible = true;
1651        };
1652
1653        Add(spreadup, 2);
1654        damage.Start();
1655    }
1656
1657    //Misc
1658    void destroy(PhysicsObject p, PhysicsObject target)
1659    {
1660        p.Destroy();
1661    }
1662    void damagePlayerEnemyShip(enemy b, player p)
1663    {
1664        p.health.Value = p.health.Value - 5;
1665        if (p.health <= 0)
1666        {
1667            explosionsfx.Play();
1668            explosion_animation2(playership);
1669            playership.Destroy();
1670        }
1671        b.Destroy();
1672        hurtsfx.Play();
1673        explosionsfx.Play();
1674        explosion_animation(b);
1675    }
1676    void damagePlayerEnemyShip2(enemy b, player p)
1677    {
1678        p.health.Value = p.health.Value - 5;
1679        if (p.health <= 0)
1680        {
1681            explosionsfx.Play();
1682            explosion_animation2(playership);
1683            playership.Destroy();
1684        }
1685        hurtsfx.Play();
1686    }
1687    void damagePlayerBossShip(boss b, player p)
1688    {
1689        p.health.Value = 0;
1690        explosionsfx.Play();
1691        explosion_animation2(playership);
1692        playership.Destroy();
1693        hurtsfx.Play();
1694    }
1695    void damagePlayerBullet(bullet b, player p)
1696    {
1697        p.health.Value = p.health.Value - b.damage;
1698        if (p.health <= 0)
1699        {
1700            explosion_animation2(playership);
1701            playership.Destroy();
1702            explosionsfx.Play();
1703        }
1704        b.Destroy();
1705        hurtsfx.Play();
1706    }
1707    void damageEnemy(bullet b, enemy e)
1708    {
1709        e.health.Value = e.health.Value - b.damage;
1710        if (e.health.Value <= 0)
1711        {
1712            powerup(e.Position);
1713            explosionsfx.Play();
1714            explosion_animation(e);
1715        };
1716        hitsfx.Play();
1717        b.Destroy();
1718       
1719    }
1720    void damageBoss(boss b, bullet bullet)
1721    {
1722        if (bullet.Tag == "player_bullet")
1723        {
1724            bullet.Destroy();
1725            b.health.Value = b.health.Value - bullet.damage;
1726            if (b.health.Value <= 0)
1727            {
1728                explosion_animation_boss(b);
1729
1730                Timer fade = new Timer();
1731                fade.Interval = 0.03;
1732                fade.Timeout += delegate
1733                {
1734                    MediaPlayer.Volume = MediaPlayer.Volume - 0.1;
1735                    if (MediaPlayer.Volume == 0)
1736                    {
1737                        fade.Stop();
1738                    }
1739                };
1740                fade.Start();
1741
1742                GameObject stage_clear = new GameObject(290,39);
1743                stage_clear.Image = stage_1_clear;
1744                stage_clear.Position = cntr;
1745
1746                Timer stageclr = new Timer();
1747                stageclr.Interval = 0.8;
1748                stageclr.Timeout += delegate
1749                {
1750                    if (stage_clear.IsVisible) stage_clear.IsVisible = false;
1751                    else stage_clear.IsVisible = true;
1752                };
1753
1754                Timer wait = new Timer();
1755                wait.Interval = 1;
1756                wait.Timeout += delegate
1757                {
1758                    Add(stage_clear,3);
1759                    stageclr.Start();
1760                    SoundEffect.MasterVolume = 0.2;
1761                    MediaPlayer.Stop();
1762                    MediaPlayer.Volume = 1;
1763                    MediaPlayer.IsRepeating = false;
1764                    MediaPlayer.Play("Stage Clear");
1765                };
1766
1767                wait.Start(1);
1768
1769            }
1770            hitsfx.Play();
1771        }
1772    }
1773    void explosion_animation(enemy enemyship)
1774    {
1775        GameObject explosion = new GameObject(enemyship.explosion_scale, enemyship.explosion_scale);
1776        explosion.Position = enemyship.Position;
1777        explosion.Animation = explosion_anim;
1778        explosion.MaximumLifetime = TimeSpan.FromSeconds(0.2);
1779        Add(explosion,-1);
1780        explosion.Animation.Start(1);
1781    }
1782    void explosion_animation_boss(boss enemyship)
1783    {
1784        GameObject explosion = new GameObject(enemyship.explosion_scale, enemyship.explosion_scale);
1785        explosion.Position = enemyship.Position;
1786        explosion.Animation = explosion_anim;
1787        explosion.MaximumLifetime = TimeSpan.FromSeconds(0.2);
1788        Add(explosion, -1);
1789        explosion.Animation.Start(1);
1790    }
1791
1792    void explosion_animation2(PhysicsObject plr)
1793    {
1794        GameObject explosion = new GameObject(80,80);
1795        explosion.Position = plr.Position;
1796        explosion.Animation = explosion_anim;
1797        explosion.MaximumLifetime = TimeSpan.FromSeconds(0.2);
1798        Add(explosion, -1);
1799        explosion.Animation.Start(1);
1800
1801        Timer wait = new Timer();
1802        wait.Interval = 1;
1803        wait.Timeout += delegate
1804        {
1805            SoundEffect.MasterVolume = 0.2;
1806            MediaPlayer.Volume = 0.2;
1807            MultiSelectWindow gameover = new MultiSelectWindow("Game Over", "Quit");
1808            gameover.ItemSelected += select_gameover;
1809            Add(gameover);
1810        };
1811        wait.Start(1);
1812
1813    }
1814    void select_gameover(int selection)
1815    {
1816        switch (selection)
1817        {
1818            case 0:
1819                ConfirmExit();
1820                break;
1821        }
1822    }
1823}
Note: See TracBrowser for help on using the repository browser.