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

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