source: 2012/24/JaakkoL/Crisis Fire/FysiikkaPeli1/FysiikkaPeli1/Peli.cs @ 3051

Revision 3051, 37.2 KB checked in by jaollipa, 10 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 Enemy : PhysicsObject
10{
11    public int HP;
12    public int ScoreValue;
13
14    public Enemy(double width, double height)
15        : base(width, height)
16    {
17        CanRotate = false;
18    }
19}
20
21class SpecialEnemy : Enemy
22{
23    public int PossibleDamageReduced;
24
25    public SpecialEnemy(double width, double height)
26        : base(width, height)
27    {
28    }
29}
30
31class Bullet : PhysicsObject
32{
33    public int Damage;
34
35    public Bullet(double width, double height)
36        : base(width, height)
37    {
38        IgnoresCollisionResponse = true;
39        IgnoresGravity = true;
40        CanRotate = false;
41    }
42}
43
44class Power : PhysicsObject
45{
46    public int PowerValue;
47    public int ScoreValue;
48
49    public Power(double height, double width)
50        : base(height, width)
51    {
52        IgnoresGravity = false;
53        IgnoresCollisionResponse = true;
54        CanRotate = false;
55    }
56}
57
58class CrisisFire : PhysicsGame
59{
60    Image MainMenu = LoadImage("CrisisFireMainMenu");
61    Image PowerItem = LoadImage("PowerItem");
62
63    Vector VelocityUp = new Vector(0.0, 550.0);
64    Vector VelocityDown = new Vector(0.0, -550.0);
65    Vector VelocityLeft = new Vector(-550.0, 0.0);
66    Vector VelocityRight = new Vector(550.0, 0.0);
67    PhysicsObject Player;
68    Enemy SmallEnemy;
69    Enemy Enemy;
70    Enemy LargeEnemy;
71    Enemy Boss;
72    SpecialEnemy Defender;
73    PhysicsObject KillBorder;
74    PhysicsObject Threshold;
75    IntMeter PowerGauge;
76    IntMeter PowerGaugeHC;
77    IntMeter ScoreGauge;
78    Timer PrimaryROF;
79    Timer SecondaryROF;
80    Timer TertiaryROF;
81    Timer LaserROF;
82    Timer PowerGoesCrazy;
83    bool IsGameHC;
84
85    ScoreList ScoreboardNrm = new ScoreList(10, false, 3000);
86    ScoreList ScoreboardHC = new ScoreList(10, false, 5000);
87
88    public override void Begin()
89    {
90        Level.Background.Image = MainMenu;
91        Camera.ZoomToLevel();
92        ControllerOne.Listen(Button.A, ButtonState.Pressed, StartGameNormalMode, null);
93        ControllerOne.Listen(Button.B, ButtonState.Pressed, StartGameHardcoreMode, null);
94        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, null);
95    }
96
97    void StartGameNormalMode()
98    {
99        IsGameHC = false;
100
101        if (DataStorage.Exists("ScoreboardNrm.xml"))
102        {
103            ScoreboardNrm = DataStorage.Load<ScoreList>(ScoreboardNrm, "ScoreboardNrm.xml");
104        }
105
106        FieldN();
107        SetControlsNrm();
108        CreatePowerGauge();
109        CreateScoreGauge();
110        // The first, "normal" gametype
111    }
112
113    void StartGameHardcoreMode()
114    {
115        IsGameHC = true;
116
117        if (DataStorage.Exists("ScoreboardHC.xml"))
118        {
119            ScoreboardHC = DataStorage.Load<ScoreList>(ScoreboardHC, "ScoreboardHC.xml");
120        }
121
122        FieldHC();
123        SetControlsHC();
124        CreateScoreGauge();
125        CreatePowerGaugeHC();
126        // Hardcore mode. Boss is tougher, the enemies are faster, no power system, the game is over if a single enemy reaches the threshold
127    }
128
129    void FieldN()
130    {
131        TileMap LevelSpawns = TileMap.FromLevelAsset("FieldFromTilemapNormal");
132        Level.Background.CreateGradient(Color.Black, Color.Blue);
133
134        LevelSpawns.SetTileMethod('/', CreateThreshold);
135        LevelSpawns.SetTileMethod('|', CreateKillBorder);
136        LevelSpawns.SetTileMethod('P', SpawnPlayer);
137        LevelSpawns.SetTileMethod('S', SpawnSmallEnemy);
138        LevelSpawns.SetTileMethod('M', SpawnEnemy);
139        LevelSpawns.SetTileMethod('L', SpawnLargeEnemy);
140        LevelSpawns.SetTileMethod('B', SpawnBossNrm);
141        LevelSpawns.SetTileMethod('D', SpawnDefender);
142
143        LevelSpawns.Execute(90, 90);
144        Level.CreateBorders();
145        Camera.StayInLevel = true;
146        Camera.FollowedObject = Player;
147
148        Gravity = new Vector(-300.0, 0.0);
149        // Assigns the spawn methods to the normal mode's tilemap and adds constant gravity
150    }
151
152    void FieldHC()
153    {
154        TileMap LevelSpawns = TileMap.FromLevelAsset("FieldFromTilemapNormal");
155        Level.Background.CreateGradient(Color.Black, Color.DarkRed);
156
157        LevelSpawns.SetTileMethod('/', CreateThreshold);
158        LevelSpawns.SetTileMethod('|', CreateKillBorder);
159        LevelSpawns.SetTileMethod('P', SpawnPlayer);
160        LevelSpawns.SetTileMethod('S', SpawnSmallEnemy);
161        LevelSpawns.SetTileMethod('M', SpawnEnemy);
162        LevelSpawns.SetTileMethod('L', SpawnLargeEnemy);
163        LevelSpawns.SetTileMethod('B', SpawnBossHC);
164        LevelSpawns.SetTileMethod('D', SpawnDefender);
165
166        LevelSpawns.Execute(90, 90);
167        Level.CreateBorders();
168        Camera.StayInLevel = true;
169        Camera.FollowedObject = Player;
170
171        Gravity = new Vector(-400.0, 0.0);
172        // Assigns the spawn methods to the normal mode's tilemap and applies HC versions of variables
173    }
174
175    void SpawnPlayer(Vector PPosition, double height, double width)
176    {
177        height = 50.0;
178        width = 50.0;
179        Player = new PhysicsObject(height, width);
180        double massP1 = 10.0;
181        Player.Mass = massP1;
182        Player.Restitution = 0.0;
183        Player.LinearDamping = 0.85;
184        Player.IgnoresGravity = true;
185        Player.CanRotate = false;
186        Player.Position = PPosition;
187        Player.Shape = Shape.Rectangle;
188        Player.Color = Color.DarkRed;
189        Player.Tag = "P1";
190        AddCollisionHandler(Player, "KB", KillBorderCollision);
191        Add(Player);
192        // Creates the player's ship and the collision handler for the Kill Border
193    }
194
195    void CreateKillBorder(Vector KBPosition, double height, double width)
196    {
197        KillBorder = PhysicsObject.CreateStaticObject(height, width);
198        KillBorder.Position = KBPosition;
199        KillBorder.Shape = Shape.Rectangle;
200        KillBorder.Color = Color.Red;
201        KillBorder.Tag = "KB";
202        KillBorder.IgnoresCollisionResponse = true;
203        Add(KillBorder);
204        // Adds a border that the player cannot cross without dying; this is to prevent moving out of the camera bounds
205    }
206
207    void KillBorderCollision(PhysicsObject Player, PhysicsObject KillBorder)
208    {
209        PowerGoesCrazy = new Timer();
210        PowerGoesCrazy.Interval = 0.05;
211        PowerGoesCrazy.Timeout += delegate { GameOverGaugeValue(); };
212        PowerGoesCrazy.Start();
213        Player.Destroy();
214        MessageDisplay.Add("The force field vaporized you.");
215        Timer.SingleShot(2.0, GameOver);
216        Timer.SingleShot(6.0, Begin);
217        Timer.SingleShot(5.95, ClearControls);
218        Timer.SingleShot(5.95, ClearGameObjects);
219        // What happens if the player hits the Kill Border
220    }
221
222    void GameOverGaugeValue()
223    {
224        PowerGauge.Value = RandomGen.NextInt(0, 127);
225    }
226
227    void GameOver()
228    {
229        Label GameOver = new Label(300.0, 100.0, "Game Over");
230        GameOver.TextColor = Color.White;
231        GameOver.BorderColor = Color.Red;
232        GameOver.Color = Color.Black;
233        Add(GameOver);
234    }
235
236    void CreateThreshold(Vector THPosition, double height, double width)
237    {
238        Threshold = PhysicsObject.CreateStaticObject(height, width);
239        Threshold.Position = THPosition;
240        Threshold.Shape = Shape.Rectangle;
241        Threshold.Color = Color.DarkOrange;
242        Threshold.IgnoresCollisionResponse = true;
243        AddCollisionHandler(Threshold, EnemyReachesThreshold);
244        Add(Threshold);
245        // The score-lowering threshold
246    }
247
248    void EnemyReachesThreshold(PhysicsObject Threshold, PhysicsObject Target)
249    {
250        Enemy targetEnemy = Target as Enemy;
251        SpecialEnemy targetSpecEnem = Target as SpecialEnemy;
252
253        if (Target.Tag.ToString() == "Enemy")
254        {
255            ScoreGauge.Value = ScoreGauge.Value -= targetEnemy.ScoreValue / 2;
256            Target.Destroy();
257
258            if (IsGameHC == true)
259            {
260                MessageDisplay.Add("You were overrun.");
261                Timer.SingleShot(2.0, GameOver);
262                Timer.SingleShot(6.0, ScoreboardInitHC);
263            }
264        }
265        else if (Target.Tag.ToString() == "SpecialEnemy")
266        {
267            ScoreGauge.Value = ScoreGauge.Value -= targetSpecEnem.ScoreValue / 2;
268            Target.Destroy();
269        }
270    }
271
272    void SpawnSmallEnemy(Vector SEPosition, double height, double width)
273    {
274        height = 25.0;
275        width = 25.0;
276        SmallEnemy = new Enemy(height, width);
277        SmallEnemy.Position = SEPosition;
278        SmallEnemy.Shape = Shape.Ellipse;
279        SmallEnemy.Color = Color.Green;
280        SmallEnemy.Restitution = 0.8;
281        SmallEnemy.Mass = 10;
282        SmallEnemy.ScoreValue = 40;
283        SmallEnemy.HP = 100;
284        SmallEnemy.LinearDamping = 0.95;
285        SmallEnemy.Tag = "Enemy";
286        AddCollisionHandler(SmallEnemy, "P1", PlayerDestruction);
287        Add(SmallEnemy);
288        // The smallest enemy type
289
290        if (IsGameHC == false)
291        {
292            SmallEnemy.Destroyed += delegate { SpawnSmallPower(SEPosition); };
293        }
294    }
295
296    void SpawnEnemy(Vector EPosition, double height, double width)
297    {
298        height = 70.0;
299        width = 70.0;
300        Enemy = new Enemy(height, width);
301        Enemy.Position = EPosition;
302        Enemy.Shape = Shape.Ellipse;
303        Enemy.Color = Color.Green;
304        Enemy.Restitution = 0.5;
305        Enemy.Mass = 15;
306        Enemy.LinearDamping = 0.95;
307        Enemy.ScoreValue = 200;
308        Enemy.HP = 250;
309        Enemy.Tag = "Enemy";
310        AddCollisionHandler(Enemy, "P1", PlayerDestruction);
311        Add(Enemy);
312        // The medium enemy type
313
314        if (IsGameHC == false)
315        {
316            Enemy.Destroyed += delegate { SpawnPower(EPosition); };
317        }
318    }
319
320    void SpawnLargeEnemy(Vector LEPosition, double height, double width)
321    {
322        height = 150.0;
323        width = 150.0;
324        LargeEnemy = new Enemy(height, width);
325        LargeEnemy.Position = LEPosition;
326        LargeEnemy.Shape = Shape.Ellipse;
327        LargeEnemy.Color = Color.Green;
328        LargeEnemy.Restitution = 0.35;
329        LargeEnemy.Mass = 25;
330        LargeEnemy.LinearDamping = 0.95;
331        LargeEnemy.ScoreValue = 500;
332        LargeEnemy.HP = 800;
333        LargeEnemy.Tag = "Enemy";
334        AddCollisionHandler(LargeEnemy, "P1", PlayerDestruction);
335        Add(LargeEnemy);
336        // The large enemy type
337
338        if (IsGameHC == false)
339        {
340            LargeEnemy.Destroyed += delegate { SpawnLargePower(LEPosition); };
341        }
342    }
343
344    void SpawnBossNrm(Vector BPosition, double width, double height)
345    {
346        width = 800.0;
347        height = 500.0;
348        Boss = new Enemy(width, height);
349        Boss.Position = BPosition;
350        Boss.Shape = Shape.Ellipse;
351        Boss.Color = Color.DarkGreen;
352        Boss.Restitution = 0.1;
353        Boss.Mass = 9001;
354        Boss.LinearDamping = 0.95;
355        Boss.ScoreValue = 3000;
356        Boss.HP = 5555;
357        Boss.Tag = "Enemy";
358        AddCollisionHandler(Boss, "P1", PlayerDestruction);
359        Add(Boss);
360        // The boss. Obviously the larget enemy type
361
362        Boss.Destroyed += delegate { ScoreboardInitNrm(); };
363    }
364
365    void SpawnBossHC(Vector BPosition, double width, double height)
366    {
367        width = 800.0;
368        height = 500.0;
369        Boss = new Enemy(width, height);
370        Boss.Position = BPosition;
371        Boss.Shape = Shape.Ellipse;
372        Boss.Color = Color.DarkGreen;
373        Boss.Restitution = 0.1;
374        Boss.Mass = 9001;
375        Boss.LinearDamping = 0.95;
376        Boss.ScoreValue = 4000;
377        Boss.HP = 6666;
378        Boss.Tag = "Enemy";
379        AddCollisionHandler(Boss, "P1", PlayerDestruction);
380        Add(Boss);
381        // Hardcore Boss has 1111 more HP and 1000 more ScoreValue.
382
383        Boss.Destroyed += delegate { ScoreboardInitHC(); };
384    }
385
386    void SpawnDefender(Vector DPosition, double width, double height)
387    {
388        width = 100.0;
389        height = 200.0;
390        Defender = new SpecialEnemy(width, height);
391        Defender.Position = DPosition;
392        Defender.Shape = Shape.Ellipse;
393        Defender.Color = Color.LimeGreen;
394        Defender.Restitution = 0.1;
395        Defender.Mass = 9001;
396        Defender.LinearDamping = 0.95;
397        Defender.ScoreValue = 300;
398        Defender.HP = 180;
399        Defender.PossibleDamageReduced = 20;
400        Defender.Tag = "SpecialEnemy";
401        AddCollisionHandler(Defender, "P1", PlayerDestruction);
402        Add(Defender);
403    }
404
405    void PlayerDestruction(PhysicsObject Collider, PhysicsObject Player)
406    {
407        Enemy collidingEnemy = Collider as Enemy;
408
409        if (Collider.Tag.ToString() == "Enemy")
410        {
411            PowerGoesCrazy = new Timer();
412            PowerGoesCrazy.Interval = 0.1;
413            PowerGoesCrazy.Timeout += delegate { GameOverGaugeValue(); };
414            Player.Destroy();
415            MessageDisplay.Add("You have died.");
416            Timer.SingleShot(2.0, GameOver);
417            Timer.SingleShot(6.0, Begin);
418            Timer.SingleShot(5.95, ClearControls);
419            Timer.SingleShot(5.95, ClearGameObjects);
420        }
421    }
422
423    void SetControlsNrm()
424    {
425        ControllerOne.Listen(Button.DPadUp, ButtonState.Down, SetVelocity, null, Player, VelocityUp);
426        ControllerOne.Listen(Button.DPadUp, ButtonState.Released, SetVelocity, null, Player, Vector.Zero);
427        ControllerOne.Listen(Button.DPadDown, ButtonState.Down, SetVelocity, null, Player, VelocityDown);
428        ControllerOne.Listen(Button.DPadDown, ButtonState.Released, SetVelocity, null, Player, Vector.Zero);
429        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, SetVelocity, null, Player, VelocityLeft);
430        ControllerOne.Listen(Button.DPadLeft, ButtonState.Released, SetVelocity, null, Player, Vector.Zero);
431        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, SetVelocity, null, Player, VelocityRight);
432        ControllerOne.Listen(Button.DPadRight, ButtonState.Released, SetVelocity, null, Player, Vector.Zero);
433        ControllerOne.Listen(Button.Back, ButtonState.Pressed, StartGameNormalMode, null);
434        ControllerOne.Listen(Button.RightTrigger, ButtonState.Pressed, PrimaryRate, null);
435        ControllerOne.Listen(Button.RightTrigger, ButtonState.Released, PrimaryRateStop, null);
436        ControllerOne.Listen(Button.LeftTrigger, ButtonState.Pressed, SecondaryRate, null);
437        ControllerOne.Listen(Button.LeftTrigger, ButtonState.Released, SecondaryRateStop, null);
438        ControllerOne.Listen(Button.RightShoulder, ButtonState.Pressed, TertiaryRate, null);
439        ControllerOne.Listen(Button.RightShoulder, ButtonState.Released, TertiaryRateStop, null);
440        ControllerOne.Listen(Button.LeftShoulder, ButtonState.Pressed, LaserRate, null);
441        ControllerOne.Listen(Button.LeftShoulder, ButtonState.Released, LaserRateStop, null);
442        // Sets controls for Normal Mode.
443    }
444
445    void SetControlsHC()
446    {
447        ControllerOne.Listen(Button.DPadUp, ButtonState.Down, SetVelocity, null, Player, VelocityUp);
448        ControllerOne.Listen(Button.DPadUp, ButtonState.Released, SetVelocity, null, Player, Vector.Zero);
449        ControllerOne.Listen(Button.DPadDown, ButtonState.Down, SetVelocity, null, Player, VelocityDown);
450        ControllerOne.Listen(Button.DPadDown, ButtonState.Released, SetVelocity, null, Player, Vector.Zero);
451        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, SetVelocity, null, Player, VelocityLeft);
452        ControllerOne.Listen(Button.DPadLeft, ButtonState.Released, SetVelocity, null, Player, Vector.Zero);
453        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, SetVelocity, null, Player, VelocityRight);
454        ControllerOne.Listen(Button.DPadRight, ButtonState.Released, SetVelocity, null, Player, Vector.Zero);
455        ControllerOne.Listen(Button.Back, ButtonState.Pressed, StartGameHardcoreMode, null);
456        ControllerOne.Listen(Button.RightTrigger, ButtonState.Pressed, PrimaryRate, null);
457        ControllerOne.Listen(Button.RightTrigger, ButtonState.Released, PrimaryRateStop, null);
458        ControllerOne.Listen(Button.LeftTrigger, ButtonState.Pressed, SecondaryRate, null);
459        ControllerOne.Listen(Button.LeftTrigger, ButtonState.Released, SecondaryRateStop, null);
460        ControllerOne.Listen(Button.RightShoulder, ButtonState.Pressed, TertiaryRate, null);
461        ControllerOne.Listen(Button.RightShoulder, ButtonState.Released, TertiaryRateStop, null);
462        ControllerOne.Listen(Button.LeftShoulder, ButtonState.Pressed, LaserRate, null);
463        ControllerOne.Listen(Button.LeftShoulder, ButtonState.Released, LaserRateStop, null);
464        // Sets controls for Hardcore Mode.
465    }
466
467    void PrimaryRate()
468    {
469        PrimaryROF = new Timer();
470        PrimaryROF.Interval = 0.225;
471        PrimaryROF.Timeout += delegate { FirePrimary(Player, 1.0, 1.0, Shape.Rectangle); };
472        PrimaryROF.Start();
473    }
474
475    void PrimaryRateStop()
476    {
477        PrimaryROF.Stop();
478    }
479   
480    void FirePrimary(PhysicsObject Player, double ShotWidth, double ShotHeight, Shape ShotShape)
481    {
482        if (IsGameHC == false)
483        {
484            if (PowerGauge.Value < 128)
485            {
486                CreatePrimary(Player.X + 25, Player.Y + 10, 12.0, 3.0, new Vector(725.0, 30.0), Color.LightYellow);
487                CreatePrimary(Player.X + 25, Player.Y + 4, 12.0, 3.0, new Vector(725.0, -30.0), Color.LightYellow);
488                CreatePrimary(Player.X + 15, Player.Y + 17, 12.0, 3.0, new Vector(725.0, 120.0), Color.LightYellow);
489                CreatePrimary(Player.X + 15, Player.Y - 3, 12.0, 3.0, new Vector(725.0, -120.0), Color.LightYellow);
490                // Fires a wide, relatively slow shotgun-like 4 bullet spread from the top gun. Very inaccurate at long range.
491            }
492            else if (PowerGauge.Value == 128)
493            {
494                CreatePrimary(Player.X + 30, Player.Y + 7.5, 15.0, 4.0, new Vector(800.0, 0.0), Color.Yellow);
495                CreatePrimary(Player.X + 27.5, Player.Y + 12, 15.0, 4.0, new Vector(800.0, 75.0), Color.Yellow);
496                CreatePrimary(Player.X + 27.5, Player.Y + 5, 15.0, 4.0, new Vector(800.0, -75.0), Color.Yellow);
497                CreatePrimary(Player.X + 17.5, Player.Y + 20, 15.0, 4.0, new Vector(800.0, 150.0), Color.Yellow);
498                CreatePrimary(Player.X + 17.5, Player.Y - 1, 15.0, 4.0, new Vector(800.0, -150.0), Color.Yellow);
499                // The Full-Power Mode version of the primary shot. Adds a fifth, accurate center projectile.
500            }
501        }
502        else if (IsGameHC == true)
503        {
504            CreatePrimary(Player.X + 25, Player.Y + 10, 12.0, 3.0, new Vector(725.0, 30.0), Color.LightYellow);
505            CreatePrimary(Player.X + 25, Player.Y + 4, 12.0, 3.0, new Vector(725.0, -30.0), Color.LightYellow);
506            CreatePrimary(Player.X + 15, Player.Y + 17, 12.0, 3.0, new Vector(725.0, 120.0), Color.LightYellow);
507            CreatePrimary(Player.X + 15, Player.Y - 3, 12.0, 3.0, new Vector(725.0, -120.0), Color.LightYellow);
508            // Fires a wide, relatively slow shotgun-like 4 bullet spread from the top gun. Very inaccurate at long range.
509        }
510    }
511
512    void CreatePrimary(double X, double Y, double SizeX, double SizeY, Vector PrimaryImpulse, Color PrimaryColor)
513    {
514        Bullet Primary = new Bullet(SizeX, SizeY);
515        Primary.Color = PrimaryColor;
516        Primary.X = X;
517        Primary.Y = Y;
518
519        if (IsGameHC == false)
520        {
521            if (PowerGauge.Value == 128)
522            {
523                Primary.Damage = 11;
524            }
525            else if (PowerGauge.Value < 128)
526            {
527                Primary.Damage = 8;
528            }
529        }
530        else if (IsGameHC == true)
531        {
532            Primary.Damage = 8;
533        }
534        Primary.Mass = 1;
535        AddCollisionHandler(Primary, PrimaryDamagesEnemy);
536        Add(Primary);
537        Primary.Hit(PrimaryImpulse);
538    }
539
540    void PrimaryDamagesEnemy(PhysicsObject Primary, PhysicsObject Target)
541    {
542        Bullet primaryBullet = Primary as Bullet;
543        Enemy targetEnemy = Target as Enemy;
544        SpecialEnemy targetSpecEnem = Target as SpecialEnemy;
545
546        if (Target.Tag.ToString() == "Enemy")
547        {
548            targetEnemy.HP -= primaryBullet.Damage;
549            primaryBullet.Destroy();
550
551            if (targetEnemy.HP <= 0)
552            {
553                ScoreGauge.Value += targetEnemy.ScoreValue;
554                targetEnemy.Destroy();
555            }
556        }
557        else if (Target.Tag.ToString() == "SpecialEnemy")
558        {
559            targetSpecEnem.HP -= (primaryBullet.Damage - targetSpecEnem.PossibleDamageReduced);
560            primaryBullet.Destroy();
561
562            if (targetSpecEnem.HP <= 0)
563            {
564                ScoreGauge.Value += targetSpecEnem.ScoreValue;
565                targetSpecEnem.Destroy();
566            }
567        }
568        else if (Target.Tag.ToString() == "KB")
569        {
570            primaryBullet.Destroy();
571        }
572        else if (Target.Tag.ToString() == "LB")
573        {
574            primaryBullet.Destroy();
575        }
576    }
577
578    void SecondaryRate()
579    {
580        SecondaryROF = new Timer();
581        SecondaryROF.Interval = 0.225;
582        SecondaryROF.Timeout += delegate { FireSecondary(Player, 1.0, 1.0, Shape.Diamond); };
583        SecondaryROF.Start();
584    }
585
586    void SecondaryRateStop()
587    {
588        SecondaryROF.Stop();
589    }
590
591    void FireSecondary(PhysicsObject Player, double ShotWidth, double ShotHeight, Shape ShotShape)
592    {
593        if (IsGameHC == false)
594        {
595            if (PowerGauge.Value < 128)
596            {
597                CreateSecondary(Player.X + 20, Player.Y - 4, 15.0, 5.0, new Vector(1200.0, 0.0), Color.SkyBlue);
598                CreateSecondary(Player.X + 20, Player.Y - 10, 15.0, 5.0, new Vector(1200.0, 0.0), Color.SkyBlue);
599                // Fires a fast and powerful double-barrel shot from the bottom gun
600            }
601            else if (PowerGauge.Value == 128)
602            {
603                CreateSecondary(Player.X + 25, Player.Y - 5, 20.0, 7.0, new Vector(1250.0, 0.0), Color.Cyan);
604                CreateSecondary(Player.X + 25, Player.Y - 12, 20.0, 7.0, new Vector(1250.0, 0.0), Color.Cyan);
605                // Full-Power version of the double barrel gun. Increases the size, velocity and damage of the shots.
606            }
607        }
608        else if (IsGameHC == true)
609        {
610            CreateSecondary(Player.X + 20, Player.Y - 4, 15.0, 5.0, new Vector(1200.0, 0.0), Color.SkyBlue);
611            CreateSecondary(Player.X + 20, Player.Y - 10, 15.0, 5.0, new Vector(1200.0, 0.0), Color.SkyBlue);
612        }
613    }
614
615    void CreateSecondary(double X, double Y, double SizeX, double SizeY, Vector SecondaryImpulse, Color SecondaryColor)
616    {
617        Bullet Secondary = new Bullet(SizeX, SizeY);
618        Secondary.Shape = Shape.Diamond;
619        Secondary.Color = SecondaryColor;
620        Secondary.X = X;
621        Secondary.Y = Y;
622
623        if (IsGameHC == false)
624        {
625            if (PowerGauge.Value == 128)
626            {
627                Secondary.Damage = 30;
628            }
629            else if (PowerGauge.Value < 128)
630            {
631                Secondary.Damage = 20;
632            }
633        }
634        else if (IsGameHC == true)
635        {
636            Secondary.Damage = 20;
637        }
638
639        Secondary.Mass = 1;
640        AddCollisionHandler(Secondary, SecondaryDamagesEnemy);
641        Add(Secondary);
642        Secondary.Hit(SecondaryImpulse);
643    }
644
645    void SecondaryDamagesEnemy(PhysicsObject Secondary, PhysicsObject Target)
646    {
647        Bullet secondaryBullet = Secondary as Bullet;
648        Enemy targetEnemy = Target as Enemy;
649        SpecialEnemy targetSpecEnem = Target as SpecialEnemy;
650
651        if (Target.Tag.ToString() == "Enemy")
652        {
653            targetEnemy.HP -= secondaryBullet.Damage;
654            secondaryBullet.Destroy();
655
656            if (targetEnemy.HP <= 0)
657            {
658                ScoreGauge.Value += targetEnemy.ScoreValue;
659                targetEnemy.Destroy();
660            }
661        }
662        else if (Target.Tag.ToString() == "SpecialEnemy")
663        {
664            targetSpecEnem.HP -= (secondaryBullet.Damage - targetSpecEnem.PossibleDamageReduced);
665            secondaryBullet.Destroy();
666
667            if (targetSpecEnem.HP <= 0)
668            {
669                ScoreGauge.Value += targetSpecEnem.ScoreValue;
670                targetSpecEnem.Destroy();
671            }
672        }
673        else if (Target.Tag.ToString() == "KB")
674        {
675            secondaryBullet.Destroy();
676        }
677        else if (Target.Tag.ToString() == "LB")
678        {
679            secondaryBullet.Destroy();
680        }
681    }
682
683    void TertiaryRate()
684    {
685        TertiaryROF = new Timer();
686        TertiaryROF.Interval = 1;
687        TertiaryROF.Timeout += delegate { FireTertiary(Player, 1.0, 1.0, Shape.Diamond); };
688        TertiaryROF.Start();
689    }
690
691    void TertiaryRateStop()
692    {
693        TertiaryROF.Stop();
694    }
695
696    void FireTertiary(PhysicsObject Player, double ShotWidth, double ShotHeight, Shape ShotShape)
697    {
698        if (IsGameHC == false)
699        {
700            if (PowerGauge.Value < 128)
701            {
702                CreateTertiary(Player.X + 25, Player.Y, 30.0, 15.0, new Vector(1000.0, 0.0), Color.White);
703                // Fires a large and strong projectile with low rate-of-fire.
704            }
705            else if (PowerGauge.Value == 128)
706            {
707                CreateTertiary(Player.X + 35, Player.Y, 40.0, 17.5, new Vector(1500.0, 0.0), Color.Wheat);
708                // Full Power version. 1.5x more power and larger.
709            }
710        }
711        else if (IsGameHC == true)
712        {
713            CreateTertiary(Player.X + 25, Player.Y, 30.0, 15.0, new Vector(1000.0, 0.0), Color.White);
714        }
715    }
716
717    void CreateTertiary(double X, double Y, double SizeX, double SizeY, Vector TertiaryImpulse, Color TertiaryColor)
718    {
719        Bullet Tertiary = new Bullet(SizeX, SizeY);
720        Tertiary.Shape = Shape.Diamond;
721        Tertiary.Color = TertiaryColor;
722        Tertiary.X = X;
723        Tertiary.Y = Y;
724
725        if (IsGameHC == false)
726        {
727            if (PowerGauge.Value == 128)
728            {
729                Tertiary.Damage = 140;
730            }
731            else if (PowerGauge.Value < 128)
732            {
733                Tertiary.Damage = 120;
734            }
735        }
736        else if (IsGameHC == true)
737        {
738            Tertiary.Damage = 120;
739        }
740
741        Tertiary.Mass = 1;
742        AddCollisionHandler(Tertiary, TertiaryDamagesEnemy);
743        Add(Tertiary);
744        Tertiary.Hit(TertiaryImpulse);
745    }
746
747    void TertiaryDamagesEnemy(PhysicsObject Tertiary, PhysicsObject Target)
748    {
749        Bullet tertiaryBullet = Tertiary as Bullet;
750        Enemy targetEnemy = Target as Enemy;
751        SpecialEnemy targetSpecEnem = Target as SpecialEnemy;
752
753        if (Target.Tag.ToString() == "Enemy")
754        {
755            targetEnemy.HP -= tertiaryBullet.Damage;
756            tertiaryBullet.Destroy();
757
758            if (targetEnemy.HP <= 0)
759            {
760                ScoreGauge.Value += targetEnemy.ScoreValue;
761                targetEnemy.Destroy();
762            }
763        }
764        else if (Target.Tag.ToString() == "SpecialEnemy")
765        {
766            targetSpecEnem.HP -= (tertiaryBullet.Damage - targetSpecEnem.PossibleDamageReduced);
767            tertiaryBullet.Destroy();
768
769            if (targetSpecEnem.HP <= 0)
770            {
771                ScoreGauge.Value += targetSpecEnem.ScoreValue;
772                targetSpecEnem.Destroy();
773            }
774        }
775        else if (Target.Tag.ToString() == "KB")
776        {
777            tertiaryBullet.Destroy();
778        }
779        else if (Target.Tag.ToString() == "LB")
780        {
781            tertiaryBullet.Destroy();
782        }
783    }
784
785    void LaserRate()
786    {
787        LaserROF = new Timer();
788        LaserROF.Interval = 0.01;
789        LaserROF.Timeout += delegate { FireLaser(Player, 1.0, 1.0, Shape.Rectangle); };
790        LaserROF.Start();
791    }
792
793    void LaserRateStop()
794    {
795        LaserROF.Stop();
796    }
797
798    void FireLaser(PhysicsObject Player, double ShotWidth, double ShotHeight, Shape ShotShape)
799    {
800        if (IsGameHC == false)
801        {
802            if (PowerGauge.Value < 128)
803            {
804                CreateLaser(Player.X + 36, Player.Y, 30.0, 2.5, new Vector(1750.0, 0.0), Color.LightGreen);
805                // Fires a focused laser beam. Deals low damage but pierces enemies.
806            }
807            else if (PowerGauge.Value == 128)
808            {
809                CreateLaser(Player.X + 36, Player.Y + 5, 30.0, 2.5, new Vector(1750.0, 0.0), Color.Red);
810                CreateLaser(Player.X + 36, Player.Y - 5, 30.0, 2.5, new Vector(1750.0, 0.0), Color.Red);
811                // The Full Power version fires two lasers instead of one.
812            }
813        }
814        else if (IsGameHC == true)
815        {
816            CreateLaser(Player.X + 36, Player.Y, 30.0, 2.5, new Vector(1750.0, 0.0), Color.LightGreen);
817        }
818    }
819
820    void CreateLaser(double X, double Y, double SizeX, double SizeY, Vector LaserImpulse, Color LaserColor)
821    {
822        Bullet Laser = new Bullet(SizeX, SizeY);
823        Laser.Shape = Shape.Rectangle;
824        Laser.Color = LaserColor;
825        Laser.X = X;
826        Laser.Y = Y;
827
828        if (IsGameHC == false)
829        {
830            if (PowerGauge.Value == 128)
831            {
832                Laser.Damage = 2;
833            }
834            else if (PowerGauge.Value < 128)
835            {
836                Laser.Damage = 3;
837            }
838        }
839        else if (IsGameHC == true)
840        {
841            Laser.Damage = 3;
842        }
843
844        Laser.Mass = 1;
845        AddCollisionHandler(Laser, LaserDamagesEnemy);
846        Add(Laser);
847        Laser.Hit(LaserImpulse);
848    }
849
850    void LaserDamagesEnemy(PhysicsObject Laser, PhysicsObject Target)
851    {
852        Bullet laserProjectile = Laser as Bullet;
853        Enemy targetEnemy = Target as Enemy;
854        SpecialEnemy targetSpecEnem = Target as SpecialEnemy;
855
856        if (Target.Tag.ToString() == "Enemy")
857        {
858            targetEnemy.HP -= laserProjectile.Damage;
859
860            if (targetEnemy.HP <= 0)
861            {
862                ScoreGauge.Value += targetEnemy.ScoreValue;
863                targetEnemy.Destroy();
864            }
865        }
866        else if (Target.Tag.ToString() == "SpecialEnemy")
867        {
868            targetSpecEnem.HP -= (laserProjectile.Damage - targetSpecEnem.PossibleDamageReduced);
869            laserProjectile.Destroy();
870
871            if (targetSpecEnem.HP <= 0)
872            {
873                ScoreGauge.Value += targetSpecEnem.ScoreValue;
874                targetSpecEnem.Destroy();
875            }
876        }
877        else if (Target.Tag.ToString() == "KB")
878        {
879            laserProjectile.Destroy();
880        }
881        else if (Target.Tag.ToString() == "LB")
882        {
883            laserProjectile.Destroy();
884        }
885    }
886
887    void SetVelocity(PhysicsObject Player, Vector velocity)
888    {
889        Player.Velocity = velocity;
890    }
891
892    void CreatePowerGauge()
893    {
894        PowerGauge = new IntMeter(0);
895        PowerGauge.MaxValue = 128;
896
897        Label PowerMeter = new Label();
898        PowerMeter.X = Screen.Left + 150;
899        PowerMeter.Y = Screen.Top - 100;
900        PowerMeter.TextColor = Color.White;
901        PowerMeter.Color = Color.Red;
902
903        PowerMeter.BindTo(PowerGauge);
904        Add(PowerMeter);
905
906        Label PowerText = new Label("Power: ");
907        PowerText.X = Screen.Left + 50;
908        PowerText.Y = Screen.Top - 100;
909        PowerText.TextColor = Color.White;
910        PowerText.Color = Color.Red;
911        Add(PowerText);
912
913        ControllerOne.Listen(Button.Start, ButtonState.Pressed, PowerDebug, null);
914    }
915
916    void CreatePowerGaugeHC()
917    {
918        PowerGaugeHC = new IntMeter(0);
919        PowerGaugeHC.MaxValue = 128;
920    }
921
922    void PowerDebug()
923    {
924        PowerGauge.Value = PowerGauge.MaxValue;
925    }
926
927    void CreateScoreGauge()
928    {
929        ScoreGauge = new IntMeter(0);
930
931        Label ScoreMeter = new Label();
932        ScoreMeter.X = Screen.Right - 150;
933        ScoreMeter.Y = Screen.Top - 100;
934        ScoreMeter.TextColor = Color.White;
935        ScoreMeter.Color = Color.DarkGreen;
936
937        ScoreMeter.BindTo(ScoreGauge);
938        Add(ScoreMeter);
939
940        Label ScoreText = new Label("Score: ");
941        ScoreText.X = Screen.Right - 300;
942        ScoreText.Y = Screen.Top - 100;
943        ScoreText.TextColor = Color.White;
944        ScoreText.Color = Color.DarkGreen;
945        Add(ScoreText);
946    }
947
948    void SpawnSmallPower(Vector Position)
949    {
950        Power SmallPower = new Power(18.0, 18.0);
951        SmallPower.Image = PowerItem;
952        SmallPower.Position = Position;
953        SmallPower.Shape = Shape.Rectangle;
954        SmallPower.Color = Color.Red;
955        SmallPower.PowerValue = 1;
956        SmallPower.ScoreValue = 10;
957        SmallPower.Mass = 10;
958        SmallPower.LinearDamping = 0.985;
959        SmallPower.Tag = "Power";
960        AddCollisionHandler(SmallPower, "P1", ObtainPower);
961        Add(SmallPower);
962    }
963
964    void SpawnPower(Vector Position)
965    {
966        Power Power = new Power(24.0, 24.0);
967        Power.Image = PowerItem;
968        Power.Position = Position;
969        Power.Shape = Shape.Rectangle;
970        Power.Color = Color.Red;
971        Power.PowerValue = 4;
972        Power.ScoreValue = 40;
973        Power.Mass = 10;
974        Power.LinearDamping = 0.985;
975        Power.Tag = "Power";
976        AddCollisionHandler(Power, "P1", ObtainPower);
977        Add(Power);
978    }
979
980    void SpawnLargePower(Vector Position)
981    {
982        Power LargePower = new Power(30.0, 30.0);
983        LargePower.Image = PowerItem;
984        LargePower.Position = Position;
985        LargePower.Shape = Shape.Rectangle;
986        LargePower.Color = Color.Red;
987        LargePower.PowerValue = 10;
988        LargePower.ScoreValue = 100;
989        LargePower.Mass = 10;
990        LargePower.LinearDamping = 0.985;
991        LargePower.Tag = "Power";
992        AddCollisionHandler(LargePower, "P1", ObtainPower);
993        Add(LargePower);
994    }
995
996    void ObtainPower(PhysicsObject Collider, PhysicsObject Player)
997    {
998        Power obtainablePower = Collider as Power;
999
1000        if (Collider.Tag.ToString() == "Power")
1001        {
1002            PowerGauge.Value += obtainablePower.PowerValue;
1003            ScoreGauge.Value += obtainablePower.ScoreValue;
1004            obtainablePower.Destroy();
1005        }
1006    }
1007
1008    void ScoreboardInitNrm()
1009    {
1010        Timer.SingleShot(0.0, ClearTimers);
1011        Gravity = Vector.Zero;
1012
1013        if (ScoreGauge.Value <= 3000)
1014        {
1015            HighScoreWindow ScoreboardShow = new HighScoreWindow(
1016                                                                "High Scores (Normal Mode)",
1017                                                                ScoreboardNrm);
1018            ScoreboardShow.Closed += SaveScoresNrm;
1019            ScoreboardShow.Closed += delegate { ExitAfterWin(); };
1020            Add(ScoreboardShow);
1021        }
1022        else
1023        {
1024            HighScoreWindow ScoreboardShowHS = new HighScoreWindow(
1025                                                                  "High Scores (Normal Mode)",
1026                                                                  "Your score of %p is a high score! Enter name:",
1027                                                                  ScoreboardNrm, ScoreGauge.Value);
1028            ScoreboardShowHS.Closed += SaveScoresNrm;
1029            ScoreboardShowHS.Closed += delegate { ExitAfterWin(); };
1030            Add(ScoreboardShowHS);
1031        }
1032    }
1033
1034    void SaveScoresNrm(Window Sender)
1035    {
1036        DataStorage.Save<ScoreList>(ScoreboardNrm, "ScoreboardNrm.xml");
1037    }
1038
1039    void ScoreboardInitHC()
1040    {
1041        Timer.SingleShot(0.0, ClearTimers);
1042        Gravity = Vector.Zero;
1043
1044        if (ScoreGauge.Value <= 5000)
1045        {
1046            HighScoreWindow ScoreboardShow = new HighScoreWindow(
1047                                                                "High Scores (Hardcore Mode)",
1048                                                                ScoreboardHC);
1049            ScoreboardShow.Closed += SaveScoresHC;
1050            ScoreboardShow.Closed += delegate { ExitAfterWin(); };
1051            Add(ScoreboardShow);
1052        }
1053        else
1054        {
1055            HighScoreWindow ScoreboardShowHS = new HighScoreWindow(
1056                                                                  "High Scores (Hardcore Mode)",
1057                                                                  "Your score of %p is a high score! Enter name:",
1058                                                                  ScoreboardHC, ScoreGauge.Value);
1059            ScoreboardShowHS.Closed += SaveScoresHC;
1060            ScoreboardShowHS.Closed += delegate { ExitAfterWin(); };
1061            Add(ScoreboardShowHS);
1062        }
1063    }
1064
1065    void SaveScoresHC(Window Sender)
1066    {
1067        DataStorage.Save<ScoreList>(ScoreboardHC, "ScoreboardHC.xml");
1068    }
1069
1070    void ExitAfterWin()
1071    {
1072        Timer.SingleShot(2.5, Begin);
1073        Timer.SingleShot(2.45, ClearGameObjects);
1074        Timer.SingleShot(2.45, ClearControls);
1075    }
1076}
Note: See TracBrowser for help on using the repository browser.