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); } }
/// <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); } }
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(); }
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); } }
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; } } } }
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); }