示例#1
0
        public override void Update(float dt)
        {
            Animations.FountainRipple.Update(dt);
            //_particle.Update(dt);TODO

            //Heal the player when they are close
            if (SmileyUtil.Distance(X, Y, SMH.Player.X, SMH.Player.Y) < Fountain.FountainHealRadius)
            {
                SMH.Player.Heal(0.5f);
            }
        }
        /// <summary>
        /// Deletes the save file in the given save slot.
        /// </summary>
        /// <param name="saveSlot"></param>
        public void Delete(SaveSlot saveSlot)
        {
            StorageContainer container = SmileyUtil.GetStorageContainer();

            container.DeleteFile(saveSlot.GetDescription());

            Saves[saveSlot] = new SaveFile(saveSlot.GetDescription())
            {
                IsEmpty = true
            };
        }
        /// <summary>
        /// Saves the current configuration data.
        /// </summary>
        public void SaveConfig()
        {
            StorageContainer container = SmileyUtil.GetStorageContainer();

            container.DeleteFile(ConfigFile);
            using (Stream stream = container.OpenFile(ConfigFile, FileMode.Create))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(SmileyConfig));
                serializer.Serialize(stream, _config);
            }
        }
示例#4
0
        /// <summary>
        /// Draws tile stuff that needs to be drawn before smiley.
        /// </summary>
        public void DrawBeforeSmiley(float x, float y)
        {
            //Draw Terrain
            if (Collision != CollisionTile.PIT && Collision != CollisionTile.FAKE_PIT && Collision != CollisionTile.NO_WALK_PIT)
            {
                SMH.Graphics.DrawSprite(SpriteSets.MainLayer[Terrain], x, y);
            }

            //Draw Collision
            if (_animation != null)
            {
                if (Collision == CollisionTile.SHALLOW_WATER || Collision == CollisionTile.SHALLOW_GREEN_WATER)
                {
                    SMH.Graphics.DrawAnimation(_animation, x, y, Color.FromNonPremultiplied(255, 255, 255, 125));
                }
                else
                {
                    SMH.Graphics.DrawAnimation(_animation, x, y);
                }
            }
            else if (SmileyUtil.ShouldDrawCollision(Collision))
            {
                Color color = Color.White;
                if (Collision >= CollisionTile.UP_ARROW && Collision <= CollisionTile.LEFT_ARROW)
                {
                    if (ID == -1 || ID == 990)
                    {
                        //Render normal, red arrow
                        color = Color.FromNonPremultiplied(255, 0, 255, 255);
                    }
                    else
                    {
                        //It's a rotating arrow, make it green
                        color = Color.FromNonPremultiplied(0, 255, 255, 255);
                    }
                }
                SMH.Graphics.DrawSprite(SpriteSets.WalkLayer[(int)Collision], x, y, color);
            }

            //Items
            if (Item == (int)ItemTile.EnemyGroupBlockGraphic)
            {
                //If this is an enemy block, draw it with the enemy group's block alpha
                //TODO: SMH.Graphics.DrawSprite(SpriteSets.ItemLayer[Item], x, y, Color.FromNonPremultiplied(255, 255, 255, smh->enemyGroupManager->groups[variable[i + xGridOffset][j + yGridOffset]].blockAlpha));
            }
            else if (Item != (int)ItemTile.NONE && ID != Constants.ID_DrawAfterSmiley)
            {
                SMH.Graphics.DrawSprite(SpriteSets.ItemLayer[Item], x, y);
            }
        }
示例#5
0
        public override void Draw()
        {
            if (SmileyUtil.Distance(X, Y, SMH.Player.X, SMH.Player.Y) > 1000f)
            {
                return;
            }

            //Bottom fountain part and pool
            SMH.Graphics.DrawSprite(Sprites.FountainBottom, ScreenX, ScreenY);
            SMH.Graphics.DrawAnimation(Animations.FountainRipple, ScreenX, ScreenY - 72f);

            //Top fountain part and pool
            SMH.Graphics.DrawSprite(Sprites.FountainTop, ScreenX, ScreenY - 115f);
            SMH.Graphics.DrawAnimation(Animations.FountainRipple, ScreenX, ScreenY - 215f, Color.White, 0f, 0.35f, 0.4f);

            //TODO:
            //Fountain particle
            //smh->resources->GetParticleSystem("fountain")->MoveTo(smh->getScreenX(x), smh->getScreenY(y - 220.0), true);
            //smh->resources->GetParticleSystem("fountain")->Render();
        }
示例#6
0
        public void Draw()
        {
            int drawX, drawY;

            //Draw health
            for (int i = 1; i <= SMH.Player.MaxHealth; i++)
            {
                drawX = (i <= 10) ? 120 + i * 35 : 120 + (i - 10) * 35;
                drawY = (i <= 10) ? 25 : 70;
                if (SMH.Player.Health >= i)
                {
                    SMH.Graphics.DrawSprite(Sprites.FullHealth, drawX, drawY);
                }
                else if (SMH.Player.Health < i && SMH.Player.Health >= i - .25)
                {
                    SMH.Graphics.DrawSprite(Sprites.ThreeQuartersHealth, drawX, drawY);
                }
                else if (SMH.Player.Health < i - .25 && SMH.Player.Health >= i - .5)
                {
                    SMH.Graphics.DrawSprite(Sprites.HalfHealth, drawX, drawY);
                }
                else if (SMH.Player.Health < i - .5 && SMH.Player.Health >= i - .75)
                {
                    SMH.Graphics.DrawSprite(Sprites.QuarterHealth, drawX, drawY);
                }
                else
                {
                    SMH.Graphics.DrawSprite(Sprites.EmptyHealth, drawX, drawY);
                }
            }

            //Draw mana bar
            drawX = 155;
            drawY = SMH.Player.MaxMana < 11 ? 65 : 110;
            float manaBarSizeMultiplier = (1f + .15f * SMH.SaveManager.CurrentSave.NumUpgrades[Upgrade.Mana]) * 0.96f; //adjust the size multiplier so max mana bar is the same width as max hearts

            SMH.Graphics.DrawCroppedSprite(Sprites.ManaBarBackgroundCenter, drawX + 4, drawY, new Rectangle(675, 282, Convert.ToInt32(115f * manaBarSizeMultiplier - 4f), 22));
            SMH.Graphics.DrawCroppedSprite(Sprites.ManaBar, drawX + 4, drawY + 3, new Rectangle(661, 304, Convert.ToInt32(115f * (SMH.Player.Mana / SMH.Player.MaxMana) * manaBarSizeMultiplier), 15));
            SMH.Graphics.DrawSprite(Sprites.ManaBarBackgroundLeftTip, drawX, drawY);
            SMH.Graphics.DrawSprite(Sprites.ManaBarBackgroundRightTip, drawX + 115f * manaBarSizeMultiplier - 2f, drawY);

            //Draw abilities
            SMH.Graphics.DrawSprite(Sprites.AbilityBackground, 5f, 12f);
            foreach (AbilitySlot slot in _abilitySlots)
            {
                if (slot.Ability != Ability.NO_ABILITY)
                {
                    SMH.Graphics.DrawSprite(SpriteSets.Abilities[(int)slot.Ability], slot.X, slot.Y, Color.White, 0f, slot.Scale);
                }
            }

            //Draw keys
            int keyIndex = SmileyUtil.GetKeyIndex(SMH.SaveManager.CurrentSave.Level);

            if (keyIndex != -1)
            {
                SMH.Graphics.DrawSprite(Sprites.KeyBackground, 748, 714);

                int keyXOffset = 763;
                int keyYOffset = 724;
                for (int i = 0; i < 4; i++)
                {
                    //Draw key icon
                    SMH.Graphics.DrawSprite(SpriteSets.KeyIcons[i], keyXOffset + 60 * i, keyYOffset);

                    //Draw num keys
                    SMH.Graphics.DrawString(SmileyFont.Number, SMH.SaveManager.CurrentSave.NumKeys[keyIndex, i].ToString(),
                                            keyXOffset + 60 * i + 45, keyYOffset + 5, TextAlignment.Left);
                }
            }

            //Show whether or not Smiley is invincible
            if (SMH.Player.IsInvincible)
            {
                SMH.Graphics.DrawString(SmileyFont.Curlz, "Invincibility On", 512, 3, TextAlignment.Center);
            }

            //Smiley progress bar
            Rectangle?r = SMH.Player.GetProgressBar();

            if (r != null)
            {
                SMH.Graphics.DrawSprite(Sprites.BossHealthBar, r.Value, Color.White);
            }
        }
示例#7
0
        public void Update(float dt)
        {
            CollisionTile collisionAtPlayer = SMH.Player.Tile.Collision;
            SpinDirection dir = SpinDirection.None;

            //Input to change ability
            if (!SMH.WindowManager.IsWindowOpen)
            {
                if (SMH.Input.IsPressed(Input.PreviousAbility))
                {
                    dir = SpinDirection.Left;
                }
                else if (SMH.Input.IsPressed(Input.NextAbility))
                {
                    dir = SpinDirection.Right;
                }
            }

            if (dir != SpinDirection.None)
            {
                if (SelectedAbility == Ability.WATER_BOOTS && SMH.Player.IsSmileyTouchingWater())
                {
                    if (collisionAtPlayer != CollisionTile.DEEP_WATER && collisionAtPlayer != CollisionTile.GREEN_WATER)
                    {
                        //player is on a land tile, but touching water; bump him over and change abilities
                        ChangeAbility(dir);
                        SMH.Player.GraduallyMoveTo(SMH.Player.Tile.X * 64f + 32f, SMH.Player.Tile.Y * 64f + 32f, 500);
                    }
                    else
                    {
                        //player actually on a water tile; cannot take off the sandals; play error message
                        SMH.Sound.PlaySound(Sound.Error);
                    }
                }
                else
                {
                    ChangeAbility(dir);
                }
            }

            float angle, x, y, targetX, targetY;

            for (int i = 0; i < 3; i++)
            {
                //Move towards target slot
                x       = _abilitySlots[i].X;
                y       = _abilitySlots[i].Y;
                targetX = _points[_abilitySlots[i].Slot].X;
                targetY = _points[_abilitySlots[i].Slot].Y;
                angle   = SmileyUtil.GetAngleBetween(x, y, targetX, targetY);
                if (SmileyUtil.Distance(x, y, targetX, targetY) < 600.0 * dt)
                {
                    _abilitySlots[i].X = targetX;
                    _abilitySlots[i].Y = targetY;
                }
                else
                {
                    _abilitySlots[i].X += 600f * (float)Math.Cos(angle) * dt;
                    _abilitySlots[i].Y += 600f * (float)Math.Sin(angle) * dt;
                }

                //Move towards correct size
                if (_abilitySlots[i].Slot == 1 && _abilitySlots[i].Scale < 1f)
                {
                    _abilitySlots[i].Scale += 3f * dt;
                    if (_abilitySlots[i].Scale > 1f)
                    {
                        _abilitySlots[i].Scale = 1f;
                    }
                }
                else if (_abilitySlots[i].Slot != 1 && _abilitySlots[i].Scale > SmallScale)
                {
                    _abilitySlots[i].Scale -= 3f * dt;
                    if (_abilitySlots[i].Scale < SmallScale)
                    {
                        _abilitySlots[i].Scale = SmallScale;
                    }
                }
            }
        }
示例#8
0
        public override void Draw()
        {
            //Shade the screen behind the inventory
            SMH.Graphics.DrawRect(new Rect(0, 0, 1024, 768), Color.FromNonPremultiplied(0, 0, 0, 80), true);

            //Draw the inventory background
            SMH.Graphics.DrawSprite(Sprites.Inventory, InventoryXOffset, InventoryYOffset);

            //Ability grid
            int drawX, drawY;

            for (int i = 0; i < Width; i++)
            {
                for (int j = 0; j < Height; j++)
                {
                    Ability ability = (Ability)(j * 4 + i);
                    if (SMH.SaveManager.CurrentSave.HasAbility[ability])
                    {
                        drawX = Convert.ToInt32(InventoryXOffset + 40f + i * SquareSize + 32f);
                        drawY = Convert.ToInt32(InventoryYOffset + 40f + j * SquareSize + 32f);

                        SMH.Graphics.DrawSprite(SpriteSets.Abilities[j * 4 + i], drawX, drawY);

                        //Draw the ability name and info if it is highlighted
                        if (_cursorX == i && _cursorY == j)
                        {
                            SMH.Graphics.DrawString(SmileyFont.AbilityTitle, SMH.Data.Abilities[ability].Name, InventoryXOffset + 170, InventoryYOffset + 275, TextAlignment.Center, Color.White);
                            SMH.Graphics.DrawString(SmileyFont.Segoe14, SMH.Data.GetAbilityDescription(ability), InventoryXOffset + 40, InventoryYOffset + 340, TextAlignment.Left, Color.White);
                        }
                        //Draw a check if the ability is one of the ones selected to be available in the GUI
                        if (SMH.GUI.IsAbilityAvailable(ability))
                        {
                            SMH.Graphics.DrawSprite(Sprites.SelectedAbilityCheck, drawX - 27, drawY + 23, Color.FromNonPremultiplied(255, 255, 255, (int)SmileyUtil.GetFlashingAlpha(0.6f)));
                        }
                    }
                }
            }

            //Key selection graphic
            float selectedKeyAlpha = ((float)Math.Sin(SMH.Now) + 1f) / 2f * 60f + 30f;
            float selectedKeyRed   = ((float)Math.Sin(SMH.Now * 1.3) + 1f) / 2f * 100f + 100f;
            float selectedKeyGreen = ((float)Math.Sin(SMH.Now * 1.6) + 1f) / 2f * 100f + 100f;
            float selectedKeyBlue  = ((float)Math.Sin(SMH.Now * 0.7) + 1f) / 2f * 100f + 100f;
            Color color            = Color.FromNonPremultiplied((int)selectedKeyRed, (int)selectedKeyGreen, (int)selectedKeyBlue, (int)selectedKeyAlpha);

            switch (SMH.SaveManager.CurrentSave.Level)
            {
            case Level.OLDE_TOWNE:
                SMH.Graphics.DrawSprite(Sprites.SelectedKeys, InventoryXOffset + 375 + 50 * 0, InventoryYOffset + 28, color);
                break;

            case Level.FOREST_OF_FUNGORIA:
                SMH.Graphics.DrawSprite(Sprites.SelectedKeys, InventoryXOffset + 375 + 50 * 1, InventoryYOffset + 28, color);
                break;

            case Level.SESSARIA_SNOWPLAINS:
                SMH.Graphics.DrawSprite(Sprites.SelectedKeys, InventoryXOffset + 375 + 50 * 2, InventoryYOffset + 28, color);
                break;

            case Level.WORLD_OF_DESPAIR:
                SMH.Graphics.DrawSprite(Sprites.SelectedKeys, InventoryXOffset + 375 + 50 * 3, InventoryYOffset + 28, color);
                break;

            case Level.CASTLE_OF_EVIL:
                SMH.Graphics.DrawSprite(Sprites.SelectedKeys, InventoryXOffset + 375 + 50 * 4, InventoryYOffset + 28, color);
                break;
            }
            ;

            //Key Matrix
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    //Level icons
                    if (j == 0)
                    {
                        SMH.Graphics.DrawSprite(SpriteSets.KeyIcons[i], InventoryXOffset + 385 + i * 50, InventoryYOffset + 35);
                    }
                    //Key icons
                    if (i == 0)
                    {
                        SMH.Graphics.DrawSprite(SpriteSets.KeyIcons[j], InventoryXOffset + 345, InventoryYOffset + 75 + j * 50);
                    }
                    //Key numbers
                    SMH.Graphics.DrawString(SmileyFont.Number, SMH.SaveManager.CurrentSave.NumKeys[i, j].ToString(), InventoryXOffset + 405 + i * 50, InventoryYOffset + 80 + j * 50, TextAlignment.Center, Color.White);
                }
            }

            //Upgrades
            SMH.Graphics.DrawSprite(Sprites.MoneyIcon, InventoryXOffset + 348, InventoryYOffset + 295);
            SMH.Graphics.DrawString(SmileyFont.Segoe14, SMH.SaveManager.CurrentSave.Money.ToString(), InventoryXOffset + 398, InventoryYOffset + 302, TextAlignment.Left, Color.White);

            for (int i = 0; i < 3; i++)
            {
                SMH.Graphics.DrawSprite(SpriteSets.UpgradeIcons[i], InventoryXOffset + 423 + i * 68, InventoryYOffset + 297);
                SMH.Graphics.DrawString(SmileyFont.Segoe14, SMH.SaveManager.CurrentSave.NumUpgrades[(Upgrade)i].ToString(), InventoryXOffset + 466 + i * 68, InventoryYOffset + 302, TextAlignment.Left, Color.White);
            }

            //Maximum mana
            SMH.Graphics.DrawString(SmileyFont.Segoe14, "Mana Multiplier: ", InventoryXOffset + 355, InventoryYOffset + 343, TextAlignment.Left, Color.White);
            SMH.Graphics.DrawString(SmileyFont.Segoe14, String.Format("{0:N2}", SMH.SaveManager.CurrentSave.ManaModifier), InventoryXOffset + 615, InventoryYOffset + 341, TextAlignment.Right, Color.White);
            //Damage multiplier
            SMH.Graphics.DrawString(SmileyFont.Segoe14, "Damage Multiplier:", InventoryXOffset + 355, InventoryYOffset + 367, TextAlignment.Left, Color.White);
            SMH.Graphics.DrawString(SmileyFont.Segoe14, String.Format("{0:N2}", SMH.SaveManager.CurrentSave.DamageModifer), InventoryXOffset + 615, InventoryYOffset + 365, TextAlignment.Right, Color.White);
            //Number of licks
            SMH.Graphics.DrawString(SmileyFont.Segoe14, "Number Of Licks:", InventoryXOffset + 355, InventoryYOffset + 391, TextAlignment.Left, Color.White);
            SMH.Graphics.DrawString(SmileyFont.Segoe14, String.Format("{0:N2}", SMH.SaveManager.CurrentSave.NumTongueLicks), InventoryXOffset + 615, InventoryYOffset + 391, TextAlignment.Right, Color.White);
            //Enemies killed
            SMH.Graphics.DrawString(SmileyFont.Segoe14, "Enemies Killed:", InventoryXOffset + 355, InventoryYOffset + 415, TextAlignment.Left, Color.White);
            SMH.Graphics.DrawString(SmileyFont.Segoe14, String.Format("{0}", SMH.SaveManager.CurrentSave.NumEnemiesKilled), InventoryXOffset + 615, InventoryYOffset + 415, TextAlignment.Right, Color.White);
            //Pixels travelled
            SMH.Graphics.DrawString(SmileyFont.Segoe14, "Pixels Travelled:", InventoryXOffset + 355, InventoryYOffset + 439, TextAlignment.Left, Color.White);
            SMH.Graphics.DrawString(SmileyFont.Segoe14, String.Format("{0}", SMH.SaveManager.CurrentSave.PixelsTraversed), InventoryXOffset + 615, InventoryYOffset + 439, TextAlignment.Right, Color.White);

            //Draw the cursor
            SMH.Graphics.DrawSprite(Sprites.InventoryCursor, InventoryXOffset + _cursorX * SquareSize + 31, InventoryYOffset + _cursorY * SquareSize + 31);
        }
        /// <summary>
        /// Loads the save file with the given file name, or returns an empty save
        /// if the file doens't exist.
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        private SaveFile LoadFile(string fileName)
        {
            SaveFile file = new SaveFile(fileName);

            StorageContainer container = SmileyUtil.GetStorageContainer();

            if (!container.FileExists(fileName))
            {
                file.IsEmpty = true;
                return(file);
            }

            //Select the specified save file
            using (BitStream input = new BitStream(container, fileName, BitStreamMode.Read))
            {
                file.TimePlayed = TimeSpan.FromTicks(input.ReadBits(64));

                //Load abilties
                foreach (Ability ability in Enum.GetValues(typeof(Ability)))
                {
                    file.HasAbility[ability] = input.ReadBit();
                }

                //Load keys
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        file.NumKeys[i, j] = input.ReadByte();
                    }
                }

                //Load gems
                foreach (Level level in Enum.GetValues(typeof(Level)))
                {
                    foreach (Gem gem in Enum.GetValues(typeof(Gem)))
                    {
                        file.NumGems[level][gem] = input.ReadByte();
                    }
                }

                //Load money
                file.Money = input.ReadByte();

                //Load upgrades
                foreach (Upgrade upgrade in Enum.GetValues(typeof(Upgrade)))
                {
                    file.NumUpgrades[upgrade] = input.ReadByte();
                }

                //Load which bosses have been slain
                foreach (Boss boss in Enum.GetValues(typeof(Boss)))
                {
                    file.HasKilledBoss[boss] = input.ReadBit();
                }

                //Load player zone and location
                file.Level       = (Level)input.ReadByte();
                file.PlayerGridX = input.ReadByte();
                file.PlayerGridY = input.ReadByte();

                //Health and mana
                file.PlayerHealth = (float)(input.ReadByte() / 4);
                file.PlayerMana   = (float)(input.ReadByte());

                //Load changed shit
                int numChanges = input.ReadBits(16);
                for (int i = 0; i < numChanges; i++)
                {
                    file.ChangeTile((Level)input.ReadByte(), input.ReadByte(), input.ReadByte());
                }

                //Load Stats
                file.NumTongueLicks   = input.ReadByte();
                file.NumEnemiesKilled = input.ReadByte();
                file.PixelsTraversed  = input.ReadBits(24);

                //Tutorial Man
                file.AdviceManEncounterCompleted = input.ReadBit();

                for (int i = 0; i < 3; i++)
                {
                    SMH.GUI.SetAbilityInSlot((Ability)input.ReadBits(5), i);
                }

                foreach (Level level in Enum.GetValues(typeof(Level)))
                {
                    file.HasVisitedLevel[level] = input.ReadBit();
                }

                file.Difficulty = (Difficulty)input.ReadByte();

                //Exploration data
                foreach (Level level in Enum.GetValues(typeof(Level)))
                {
                    for (int j = 0; j < 256; j++)
                    {
                        for (int k = 0; k < 256; k++)
                        {
                            file.Explored[level][j, k] = input.ReadBit();
                        }
                    }
                }
            }

            file.TimeFileLoaded = DateTime.Now.TimeOfDay;

            return(file);
        }
        private void SaveFile(SaveFile file)
        {
            using (BitStream output = new BitStream(SmileyUtil.GetStorageContainer(), file.Name, BitStreamMode.Write))
            {
                output.WriteBits(file.TimePlayed.Ticks, 64);

                //Save abilties
                foreach (Ability ability in Enum.GetValues(typeof(Ability)))
                {
                    output.WriteBit(file.HasAbility[ability]);
                }

                //Save keys
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        output.WriteByte(file.NumKeys[i, j]);
                    }
                }

                //Save gems
                foreach (Level level in Enum.GetValues(typeof(Level)))
                {
                    foreach (Gem gem in Enum.GetValues(typeof(Gem)))
                    {
                        output.WriteByte(file.NumGems[level][gem]);
                    }
                }

                //Save money
                output.WriteByte(file.Money);

                //Save upgrades
                foreach (Upgrade upgrade in Enum.GetValues(typeof(Upgrade)))
                {
                    output.WriteByte(file.NumUpgrades[upgrade]);
                }

                //Save which bosses have been slain
                foreach (Boss boss in Enum.GetValues(typeof(Boss)))
                {
                    output.WriteBit(file.HasKilledBoss[boss]);
                }

                //Save player zone and location
                output.WriteByte((int)file.Level);
                output.WriteByte(file.PlayerGridX);
                output.WriteByte(file.PlayerGridY);

                //Health and mana
                output.WriteByte((int)file.PlayerHealth * 4);
                output.WriteByte((int)file.PlayerMana);

                //Load changed shit
                file.SaveChanges(output);

                //Load Stats
                output.WriteByte(file.NumTongueLicks);
                output.WriteByte(file.NumEnemiesKilled);
                output.WriteBits(file.PixelsTraversed, 24);

                //Tutorial Man
                output.WriteBit(file.AdviceManEncounterCompleted);

                for (int i = 0; i < 3; i++)
                {
                    output.WriteBits((int)SMH.GUI.GetAbilityInSlot(i), 5);
                }

                foreach (Level level in Enum.GetValues(typeof(Level)))
                {
                    output.WriteBit(file.HasVisitedLevel[level]);
                }

                output.WriteByte((int)file.Difficulty);

                //Exploration data
                foreach (Level level in Enum.GetValues(typeof(Level)))
                {
                    for (int j = 0; j < 256; j++)
                    {
                        for (int k = 0; k < 256; k++)
                        {
                            output.WriteBit(file.Explored[level][j, k]);
                        }
                    }
                }

                file.TimePlayed.Add(DateTime.Now.TimeOfDay.Subtract(file.TimeFileLoaded));
                output.WriteBits(file.TimePlayed.Ticks, 64);
            }
        }
        /// <summary>
        /// Returns whether or not the circle intersects a rectangle.
        /// </summary>
        /// <param name="rect"></param>
        /// <returns></returns>
        public bool Intersects(Rect rect)
        {
            //Test for when the circle is completely inside the box
            if (rect.Contains(new Vector2(X, Y)))
            {
                return(true);
            }

            //Test the 4 corners of the box
            if (SmileyUtil.Distance(rect.X, rect.Y, X, Y) < Radius)
            {
                return(true);
            }
            if (SmileyUtil.Distance(rect.Right, rect.Y, X, Y) < Radius)
            {
                return(true);
            }
            if (SmileyUtil.Distance(rect.Right, rect.Bottom, X, Y) < Radius)
            {
                return(true);
            }
            if (SmileyUtil.Distance(rect.X, rect.Bottom, X, Y) < Radius)
            {
                return(true);
            }

            //Test middle of box
            if (SmileyUtil.Distance(rect.X + (rect.Right - rect.X) / 2f, rect.Y + (rect.Bottom - rect.Y) / 2f, X, Y) < Radius)
            {
                return(true);
            }

            //Test top and bottom of box
            if (X > rect.X && X < rect.Right)
            {
                if (Math.Abs(rect.Bottom - Y) < Radius)
                {
                    return(true);
                }
                if (Math.Abs(rect.Y - Y) < Radius)
                {
                    return(true);
                }
            }

            //Test left and right side of box
            if (Y > rect.Y && Y < rect.Bottom)
            {
                if (Math.Abs(rect.Right - X) < Radius)
                {
                    return(true);
                }
                if (Math.Abs(rect.X - X) < Radius)
                {
                    return(true);
                }
            }

            //If all tests pass there is no intersection
            return(false);
        }
 /// <summary>
 /// Returns whether or not the circle intersects another circle.
 /// </summary>
 /// <param name="circle"></param>
 /// <returns></returns>
 public bool Intersects(CollisionCircle circle)
 {
     return(SmileyUtil.Distance(X, Y, circle.X, circle.Y) < Radius + circle.Radius);
 }
 /// <summary>
 /// Returns whether or not the circle contains a point.
 /// </summary>
 /// <param name="x"></param>
 /// <param name="y"></param>
 /// <returns></returns>
 public bool Contains(float x, float y)
 {
     return(Math.Abs(SmileyUtil.Distance(X, Y, x, y)) < Radius);
 }