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

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