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

Revision 3134, 38.2 KB checked in by jaollipa, 9 years ago (diff)

Talletus.

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