source: 2015/27/ohjaajat/TheLegendOfGabriel/TheLegendOfGabriel/TheLegendOfGabriel/TheLegendOfGabriel.cs @ 6717

Revision 6717, 23.4 KB checked in by sieerinn, 4 years ago (diff)

Pelin voi nyt teoriassa pelata alusta loppuun läpi.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Reflection;
5using Jypeli;
6using Jypeli.Assets;
7using Jypeli.Controls;
8using Jypeli.Effects;
9using Jypeli.Widgets;
10
11public class StoryItem
12{
13    // Iso kuvake joka näkyy inventoryssä.
14    public Image InventoryImage { get; set; }
15
16    public Queue<string> Message { get; set; }
17
18    public StoryItem(Queue<String> message, Image image)
19    {
20        this.InventoryImage = image;
21        this.Message = message;
22    }
23}
24
25class CycleSlot : Label
26{
27    public Label UsageLabel { get; set; }
28
29    public CycleSlot(double left, double top)
30    {
31        this.Left = left;
32        this.Top = top;
33        this.Size = new Vector(60, 40);
34
35        UsageLabel = new Label("10");
36        UsageLabel.IsVisible = false;
37        UsageLabel.TextColor = Color.White;
38        UsageLabel.X = this.X + 10;
39        UsageLabel.Top = this.Bottom;
40        UsageLabel.Font = Font.DefaultSmallBold;
41    }
42
43    public void UpdateImage(Item item)
44    {
45        if (item != null)
46        {
47            this.Image = item.InventoryImage;
48            UsageLabel.IsVisible = false;
49            if (item.Usages.MaxValue > 0)
50            {
51                UsageLabel.IsVisible = true;
52                UsageLabel.BindTo(item.Usages);
53            }
54        }
55    }
56}
57
58public partial class TheLegendOfGabriel : PhysicsGame
59{
60    public const int TILE_SIZE = 20;
61
62    private Player player;
63    private List<Creature> enemies = new List<Creature>(); 
64
65    private bool transition;
66    List<GameObject> oldObjects = new List<GameObject>();
67    List<Exit> exits = new List<Exit>();
68
69    private bool viewing;
70    private double midpoint;
71    private double second;
72    GameObject frame;
73    Queue<string> messagesviewed;
74
75    private const int STORYITEM_COUNT = 3;
76    List<StoryItem> storyItems = new List<StoryItem>();
77
78    private bool canUseExit = true;
79    private bool woodDestroyed = false;
80
81    public IntMeter BossHealth;
82    private List<Vector> bossSpawnPositions = new List<Vector>();
83
84    private CycleSlot currentItem; // Laatikossa näkyvä nykyinen kama.
85    private CycleSlot nextItem; // Seuraavan kaman kuva.
86    private CycleSlot prevItem; // Edellisen kaman kuva.
87    private Label swordItem; // Laatikossa näkyvä miekka.
88
89    #region Resources
90
91    public static SoundEffect SwordSound = LoadSoundEffect("swordsound");
92    public static SoundEffect GunSound = LoadSoundEffect("gunsound");
93    public static SoundEffect EnemyDieSound = LoadSoundEffect("enemydie");
94
95    public static Image GunImage = LoadImage("gun");
96    public static Image BulletImage = LoadImage("bullet");
97    public static Image LetterImage = LoadImage("letter");
98    public static Image FenceImage = LoadImage("fence");
99    public static Image FoodImage = LoadImage("food");
100    public static Image SmallSwordImage = LoadImage("smallsword");
101    public static Image MonocleImage = LoadImage("monocle");
102    public static Image BigMonocleImage = LoadImage("bigmonocle");
103    public static Image BigSwordImage = LoadImage("bigsword");
104    public static Image GrenadeImage = LoadImage("gran");
105    public static Image GrenadeSmallImage = LoadImage("gransmall");
106    public static Image MaskImage = LoadImage("helm");
107    public static Image MaskLargeImage = LoadImage("helmlarge");
108
109    public static Image GrenadeBoxImage = LoadImage("grenadebox");
110    public static Image AmmoBoxImage = LoadImage("ammobox");
111
112    public static Image FrameImage = LoadImage("frame");
113    public static Image ActiveItemFrameImageX = LoadImage("activeitemframe");
114    public static Image ActiveItemFrameImageZ = LoadImage("activeitemframez");
115
116    public static Image PlayerHealthImage = LoadImage("playerhealth");
117    public static Image PlayerHealthEmptyImage = LoadImage("playerhealthempty");
118
119    [AssetName("walkright")]
120    internal Animation playerWalkRight;
121    [AssetName("walkright", mirror: true)]
122    internal Animation playerWalkLeft;
123    [AssetName("walkup")]
124    private Animation playerWalkUp;
125    [AssetName("walkdown")]
126    private Animation playerWalkDown;
127
128    [AssetName("nwalkright")]
129    internal Animation nWalkRight;
130    [AssetName("nwalkright", mirror: true)]
131    internal Animation nWalkLeft;
132    [AssetName("nwalkup")]
133    private Animation nWalkUp;
134    [AssetName("nwalkdown")]
135    private Animation nWalkDown;
136
137    [AssetName("swingup")]
138    private Animation playerSwingUp;
139    [AssetName("swingright")]
140    private Animation playerSwingRight;
141    [AssetName("swingright", mirror: true)]
142    private Animation playerSwingLeft;
143    [AssetName("swingdown")]
144    private Animation playerSwingDown;
145
146    [AssetName("shootup")]
147    private Animation playerShootUp;
148    [AssetName("shootright")]
149    private Animation playerShootRight;
150    [AssetName("shootright", mirror: true)]
151    private Animation playerShootLeft;
152    [AssetName("shootdown")]
153    private Animation playerShootDown;
154
155    [AssetName("coyoteup")]
156    private Animation coyoteUp;
157    [AssetName("coyoteright")]
158    private Animation coyoteRight;
159    [AssetName("coyoteright", mirror: true)]
160    private Animation coyoteLeft;
161    [AssetName("coyotedown")]
162    private Animation coyoteDown;
163
164    [AssetName("train")]
165    private Animation trainAnimation;
166    [AssetName("carriage")]
167    private Animation carriageAnimation;
168
169    [AssetName("smoke")]
170    private Animation smokeAnimation;
171
172    #endregion
173
174    public override void Begin()
175    {
176        Mouse.IsCursorVisible = true;
177        SmoothTextures = false;
178        LoadAnimations();
179        StartGame();
180        BuildUI();
181        Intro();
182    }
183
184    void Victory()
185    {
186        ClearAll();
187        Level.Background.Color = Color.Black;
188
189        var text = new Label("Voitit muutes belin."); // Tekstin voisi vaihtaa.
190        text.TextColor = Color.White;
191        Add(text);
192    }
193
194    void BuildUI()
195    {
196        BuildRightBar();
197        BuildInventoryCycle();
198        BuildHealthBar();
199        UpdateItemCycleImages();
200    }
201   
202    void BuildHealthBar()
203    {
204        var bar = new ProgressBar(32 * 10, 32);
205        bar.Right = Screen.Right - 50;
206        bar.Top = Screen.Top - 50;
207        bar.Image = PlayerHealthEmptyImage;
208        bar.BarImage = PlayerHealthImage;
209        bar.BindTo(player.Health);
210        Add(bar);
211    }
212
213    void BuildInventoryCycle()
214    {
215        const int spacing = 20;
216
217        prevItem = new CycleSlot(Screen.Left + 50, Screen.Top - 30);
218        Add(prevItem);
219        Add(prevItem.UsageLabel);
220
221        currentItem = new CycleSlot(prevItem.Right + spacing, prevItem.Top);
222        Add(currentItem);
223        Add(currentItem.UsageLabel);
224
225        nextItem = new CycleSlot(currentItem.Right + spacing, prevItem.Top);
226        Add(nextItem);
227        Add(nextItem.UsageLabel);
228
229        // Ruutu jonka sisällä käytössä oleva kama on.
230        var frame = new Label();
231        frame.Size = new Vector(60, 60);
232        frame.Image = ActiveItemFrameImageX;
233        frame.X = currentItem.X;
234        frame.Top = currentItem.Top;
235        Add(frame);
236
237        // Miekan kuva.
238        swordItem = new Label();
239        swordItem.Size = prevItem.Size;
240        swordItem.Left = nextItem.Right + spacing * 2;
241        swordItem.Top = currentItem.Top;
242        Add(swordItem);
243
244        // Miekan kuvan ympärillä oleva ruutu.
245        var swordFrame = new Label();
246        swordFrame.Size = new Vector(60, 60);
247        swordFrame.Image = ActiveItemFrameImageZ;
248        swordFrame.X = swordItem.X;
249        swordFrame.Top = swordItem.Top;
250        Add(swordFrame);
251    }
252
253    void BuildRightBar()
254    {
255        for (int i = 0; i < STORYITEM_COUNT; i++)
256        {
257            Label member = new Label(FrameImage);
258            member.Size = new Vector(40, 40);
259            member.Position = new Vector(Screen.Right - FrameImage.Width, Screen.Top - Screen.Width * 0.25 - FrameImage.Height * i * 1.5);
260            Add(member);
261
262            GameObject inner = new GameObject(TILE_SIZE, TILE_SIZE);
263            inner.Color = Color.Black;
264            if (storyItems.Count > i &&  storyItems[i] != null)
265            {
266                inner.Image = storyItems[i].InventoryImage;
267                Mouse.ListenOn(inner, MouseButton.Left, ButtonState.Pressed, ShowTextItem, "View those precious memories", storyItems[i]);
268            }
269            member.Add(inner);
270        }
271    }
272
273    /// <summary>
274    /// Lataa automaagisesti kaikki animaatiot.
275    /// </summary>
276    private void LoadAnimations()
277    {
278        // Haetaan tämän luokan kaikki ei-julkiset attribuutit.
279        foreach (var field in GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
280        {
281            // Jos attribuutille on laitettu AsseName, niin ladataan sen niminen animaatio.
282            var assetAttr = Attribute.GetCustomAttribute(field, typeof(AssetNameAttribute)) as AssetNameAttribute;
283            if (assetAttr == null) continue;
284            var anim = LoadAnimation(assetAttr.AssetName);
285            field.SetValue(this, assetAttr.Mirror ? MirrorAnimation(anim) : anim);
286        }
287    }
288
289    Dictionary<Direction, Animation> DirectionalAnimations(Animation left, Animation right, Animation up, Animation down)
290    {
291        var dict = new Dictionary<Direction, Animation>();
292        dict[Direction.Left] = left;
293        dict[Direction.Right] = right;
294        dict[Direction.Up] = up;
295        dict[Direction.Down] = down;
296        return dict;
297    }
298
299    void Intro()
300    {
301        storyItems.Add(new StoryItem(new Queue<string>(new[] { "Oi, Alex",
302        "",
303        "Coyotes on a train.",
304        "Coyotes on a train, that's all I'm sayin'",
305        "-Ana"
306        }), LetterImage));
307
308        //ShowTextItem(storyItems[0]);
309    }
310
311    void ShowTextItem(StoryItem item)
312    {
313        viewing = true;
314        messagesviewed = new Queue<string>(item.Message);
315       
316        Level.AmbientLight -= 0.75;
317
318        frame = new GameObject(item.InventoryImage) { Width = Window.Width * 0.25, Height = Window.Height * 0.25, Position = Camera.Position };
319        Add(frame, 2);
320
321        midpoint = 26 * item.Message.Count() * 0.5;
322        Pause();
323
324    }
325
326    /// <summary>
327    /// Peilaa kaikki animaation kuvat.
328    /// </summary>
329    private static Animation MirrorAnimation(Animation anim)
330    {
331        return new Animation(anim.Select(Image.Mirror).ToArray()) { FPS = anim.FPS };
332    }
333
334    private void StartGame()
335    {
336        ClearAll();
337        CreatePlayer(new Vector(0, -300), TILE_SIZE, TILE_SIZE, Angle.Zero, Shape.Rectangle, "", null);
338        CreateLevel("level1");
339        //CreatePlayer(new Vector(-Level.Width/3, Level.Bottom + TILE_SIZE * 2));
340        SetControls();
341       
342        Camera.Follow(player);
343        Camera.ZoomFactor = 2.0;
344    }
345
346    void SetControls()
347    {
348        Keyboard.Listen(Key.Left, ButtonState.Down, player.Move, null, Direction.Left);
349        Keyboard.Listen(Key.Right, ButtonState.Down, player.Move, null, Direction.Right);
350        Keyboard.Listen(Key.Up, ButtonState.Down, player.Move, null, Direction.Up);
351        Keyboard.Listen(Key.Down, ButtonState.Down, player.Move, null, Direction.Down);
352
353        Keyboard.Listen(Key.X, ButtonState.Pressed, delegate { UseItem(player.ActiveItem, player.Sword, () => player.ActiveItem.UseKeyPressed()); }, null);
354        Keyboard.Listen(Key.X, ButtonState.Released, delegate { UseItem(player.ActiveItem, player.Sword, () => player.ActiveItem.UseKeyReleased()); }, null);
355        Keyboard.Listen(Key.X, ButtonState.Down, delegate { UseItem(player.ActiveItem, player.Sword, () => player.ActiveItem.UseKeyDown()); }, null);
356
357        Keyboard.Listen(Key.Z, ButtonState.Pressed, delegate { UseItem(player.Sword, player.ActiveItem, () => player.Sword.UseKeyPressed()); }, null);
358        Keyboard.Listen(Key.Z, ButtonState.Released, delegate { UseItem(player.Sword, player.ActiveItem, () => player.Sword.UseKeyReleased()); }, null);
359        Keyboard.Listen(Key.Z, ButtonState.Down, delegate { UseItem(player.Sword, player.ActiveItem, () => player.Sword.UseKeyDown()); }, null);
360
361        Keyboard.Listen(Key.Space, ButtonState.Pressed, CycleItems, null);
362
363        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, null);
364    }
365
366    /// <summary>
367    /// Luo pelaajan.
368    /// </summary>
369    void CreatePlayer(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
370    {
371        player = new Player();
372        player.CanRotate = false;
373        player.MovementSpeed = new DoubleMeter(2300, 0, 2300);
374        player.Position = position;
375        player.MoveAnimations = DirectionalAnimations(playerWalkLeft, playerWalkRight, playerWalkUp, playerWalkDown);
376        player.SwingAnimations = DirectionalAnimations(playerSwingLeft, playerSwingRight, playerSwingUp, playerSwingDown);
377        player.ShootAnimations = DirectionalAnimations(playerShootLeft, playerShootRight, playerShootUp, playerShootDown);
378        player.Image = playerWalkDown.CurrentFrame;
379        Add(player, 1);
380
381        player.Inventory.Add(new Monocle(player));
382
383        //player.Sword = new Sword(player);
384        //player.Inventory.Add(new Pistol(player));
385        //player.Inventory.Add(new Grenade(player));
386
387        //player.Health.Value = 3; // Alkuun vain kolme sydäntä.
388        player.Health.Value = player.Health.MaxValue = 100;
389
390        AddCollisionHandler(player, "exit", CollidesWithExit);
391        AddCollisionHandler(player, "enemy", delegate(PhysicsObject p, PhysicsObject e)
392        {
393            player.Health.Value--;
394        });
395
396        AddCollisionHandler(player, "ammobox", delegate(PhysicsObject p, PhysicsObject box)
397        {
398            box.Destroy();
399            var gun = player.Inventory.FirstOrDefault(i => i is Pistol);
400            if (gun != null)
401            {
402                gun.Usages.Value += 5;
403            }
404        });
405
406        AddCollisionHandler(player, "grenadebox", delegate(PhysicsObject p, PhysicsObject box)
407        {
408            box.Destroy();
409            var grenades = player.Inventory.FirstOrDefault(i => i is Grenade);
410            if (grenades != null)
411            {
412                grenades.Usages.Value += 5;
413            }
414        });
415
416        AddCollisionHandler(player, "storyTime", StoryTime);
417
418        AddCollisionHandler(player, "pistol", delegate(PhysicsObject p, PhysicsObject item)
419        {
420            item.Destroy();
421            player.Inventory.Add(new Pistol(player));
422            UpdateItemCycleImages();
423        });
424
425        AddCollisionHandler(player, "grenade", delegate(PhysicsObject p, PhysicsObject item)
426        {
427            item.Destroy();
428            player.Inventory.Add(new Grenade(player));
429            UpdateItemCycleImages();
430        });
431
432        AddCollisionHandler(player, "mask", delegate(PhysicsObject p, PhysicsObject item)
433        {
434            item.Destroy();
435            player.Inventory.Add(new Mask(player));
436            UpdateItemCycleImages();
437        });
438    }
439
440
441    void StoryTime(PhysicsObject pPlayer, PhysicsObject storyBlock)
442    {
443        storyItems.Add(new StoryItem(new Queue<string>(new[] { "Oi, boy!",
444            "There something wrong with your head?",
445            "It's dangerous out there - you did see the coyotes, right?",
446            "",
447            "Just... take this.",
448            "You've used a sword before, right?",
449            "",
450            "-Hobo in a cave"
451        }), FoodImage));
452
453        storyBlock.Tag = "none";
454        storyBlock.IgnoresCollisionResponse = true;
455
456        if (player.Sword == null)
457        {
458            player.Sword = new Sword(player);
459        }
460
461        ShowTextItem(storyItems[1]);
462        BuildRightBar();
463    }
464
465    void UseItem(Item item, Item otherItem, Action action)
466    {
467        if (player.IsDestroyed)
468            return;
469
470        bool inUse = false;
471        if (otherItem != null)
472        {
473            inUse = otherItem.InUse;
474        }
475
476        if (item != null && !inUse)
477        {
478            action();
479        }
480    }
481
482    void CycleItems()
483    {
484        // Kaman vaihtossa simuloidaan että oltaisiin laskettu irti käyttönäppäimestä.
485        if (player.ActiveItem != null)
486        {
487            player.ActiveItem.CancelUse();
488        }
489        if (player.Sword != null)
490        {
491            player.Sword.CancelUse();
492        }
493
494        player.CycleItems();
495        UpdateItemCycleImages();
496    }
497
498    void UpdateItemCycleImages()
499    {
500        prevItem.UpdateImage(player.PrevItem);
501        currentItem.UpdateImage(player.ActiveItem);
502        nextItem.UpdateImage(player.NextItem);
503
504        if (player.Sword != null)
505        {
506            swordItem.Image = BigSwordImage;
507        }
508    }
509
510    void CollidesWithEnemy(PhysicsObject player, PhysicsObject enemy)
511    {
512
513    }
514
515    /*
516    void CollidesWithExit(PhysicsObject pPlayer, PhysicsObject pExit)
517    {
518        var oldExit = pExit as Exit;
519        if (oldExit == null || oldExit.TargetLevel == null || pExit.IsDestroying || pExit.IsDestroyed)
520            return;
521
522        enemies.Clear();
523        ClearAll();
524
525        CreateLevel(oldExit.TargetLevel);
526        var targetExit = exits.FirstOrDefault(e => e.Name == oldExit.TargetExitName);
527       
528        BuildUI();
529        SetControls();
530        player.Position = targetExit.Position + Direction.Inverse(targetExit.Position.Angle.MainDirection).GetVector() * TILE_SIZE * 2;
531        Add(player);
532    }
533     */
534
535    void CollidesWithExit(PhysicsObject pPlayer, PhysicsObject pExit)
536    {
537        if (!canUseExit)
538            return;
539
540        canUseExit = false;
541        Timer.SingleShot(2, () => canUseExit = true);
542
543        var oldExit = pExit as Exit;
544        if (oldExit == null || transition || oldExit.TargetLevel == null || pExit.IsDestroying || pExit.IsDestroyed)
545            return;
546
547        oldExit.Destroy();
548
549        var oldExitDirection = GetExitDirection(oldExit);
550        transition = true;
551
552        enemies.Clear();
553
554        // Otetaan vanhat objektit talteen.
555        oldObjects.Clear();
556        foreach (var obj in GetObjects(o => o != player))
557        {
558            if (obj != player)
559            {
560                oldObjects.Add(obj);
561            }
562        }
563
564        // Luodaan seuraava kenttä.
565        exits.Clear();
566        CreateLevel(oldExit.TargetLevel);
567
568        // Etsitään seuraavan kentän kohde exitti johon siirrytään.
569        var targetExit = exits.FirstOrDefault(e => e.Name == oldExit.TargetExitName);
570
571        if (targetExit == null)
572        {
573            throw new Exception("Tarkisita kenttien exittien nimet.");
574        }
575
576        // Jompikumpi uloskäynti ei ole kentän laidalla, sulava siirtyminen ei ole mahdollista.
577        if (GetExitDirection(targetExit) == Direction.None || oldExitDirection == Direction.None)
578        {
579            transition = false;
580            oldObjects.ForEach(o => o.Destroy());
581            oldObjects.Clear();
582
583            BuildUI();
584
585            // Yritetään päätellä pelaajalle joku järkevä paikka.
586            player.Position = targetExit.Position + Direction.Inverse(targetExit.Position.Angle.MainDirection).GetVector() * TILE_SIZE * 4;
587           
588            //Camera.Follow(player);
589            //Camera.ZoomFactor = 2.0;
590            return;
591        }
592
593        // Pysäytetään peli siirtymän ajaksi.
594        Pause();
595        PhysicsEnabled = false;
596
597        // Lasketaan siirtymävektorit.
598        Direction dir = GetExitDirection(targetExit);
599        Vector exitDelta = targetExit.Position - oldExit.Position;
600        Vector transitionVector = Level.Size;
601        if (dir == Direction.Left || dir == Direction.Right)
602        {
603            transitionVector.X *= dir.GetVector().X;
604            transitionVector.Y = exitDelta.Y;
605        }
606        else
607        {
608            transitionVector.Y *= dir.GetVector().Y;
609            transitionVector.X = exitDelta.X;
610        }
611
612        // Siirretään vanhoja objekteja ja pelaajaa.
613        foreach (var obj in oldObjects)
614        {
615            obj.Position += transitionVector;
616        }
617        //player.Position += transitionVector + Direction.Inverse(dir).GetVector() * TILE_SIZE * 4;
618        player.Position = targetExit.Position + Direction.Inverse(targetExit.Position.Angle.MainDirection).GetVector() * TILE_SIZE * 2;
619
620        // Zoomataan kameraa sopivasti ja liikutetaan se vanhan kentän päälle, josta se sitten siirtyy uuden kentän päälle.
621        Camera.Position += transitionVector;
622        Vector pos = Camera.Position;
623        //Camera.Follow(player);
624        //Camera.ZoomFactor = 2.0;
625        Camera.Position = pos;
626    }
627
628    /// <summary>
629    /// Palauttaa suunnan millä puolella kenttää uloskäynti on.
630    /// </summary>   
631    Direction GetExitDirection(Exit exit)
632    {
633        const double epsilon = 1e-3;
634        Func<double, double, bool> isSame = (x, y) => Math.Abs(y - x) < epsilon;
635
636        if (isSame(exit.Top, Level.Top))
637        {
638            return Direction.Up;
639        }
640        if (isSame(exit.Bottom, Level.Bottom))
641        {
642            return Direction.Down;
643        }
644        if (isSame(exit.Left, Level.Left))
645        {
646            return Direction.Left;
647        }
648        if (isSame(exit.Right, Level.Right))
649        {
650            return Direction.Right;
651        }
652        return Direction.None;
653    }
654
655    protected override void PausedUpdate(Time gameTime)
656    {
657        base.PausedUpdate(gameTime);
658        double dt = gameTime.SinceLastUpdate.TotalSeconds;
659
660        const double transitionSpeed = 400.0;
661
662        if (transition && !viewing)
663        {
664            Camera.Position += Camera.Position.Normalize() * -transitionSpeed * dt;
665
666            // Siirtymä on ohi, jatketaan peliä ja poistetaan edellinen kenttä.
667            if (Camera.Position.Magnitude < transitionSpeed * dt)
668            {
669                transition = false;
670                Pause();
671                PhysicsEnabled = true;
672                Camera.Position = Vector.Zero;
673
674                foreach (var obj in oldObjects)
675                {
676                    obj.Destroy();
677                }
678                oldObjects.Clear();
679
680                BuildUI();
681            }
682        }
683
684        if(viewing && !transition)  //!transition perhaps being somewhat unnecessary, but now I do feel a bit safer.
685        {
686            second += dt;
687            if(second > 1)
688            {
689                if (messagesviewed.Count < 1)   //The letter's read, better head back.
690                {
691                    Level.AmbientLight = 1;
692                    frame.Destroy();
693                    GetObjectsWithTag("labelWaitingToDie").ForEach(g => g.Destroy());
694                    viewing = false;
695                    Pause();
696                    return;
697                }
698
699                second = 0;
700                var storyLabel = new Label(messagesviewed.Dequeue()) { TextColor = Color.White };
701                storyLabel.Y = -midpoint + storyLabel.Height * messagesviewed.Count() + 1;
702                storyLabel.Tag = "labelWaitingToDie";
703                Add(storyLabel);
704
705            }
706        }
707    }
708
709    protected override void Update(Time time)
710    {
711        player.UpdateCreature(time);
712        enemies.ForEach(e => e.UpdateCreature(time));
713        base.Update(time);
714    }
715}
Note: See TracBrowser for help on using the repository browser.