From 25ebe5224818ade5c52266e7cf5982b27b2d0491 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Thu, 11 Jan 2018 16:51:36 +0200 Subject: [PATCH] Option to configure alternate sprites for broken items --- .../BarotraumaClient/Source/Items/Item.cs | 21 +++++++----- .../Source/Items/ItemPrefab.cs | 33 +++++++++++++++++-- .../BarotraumaShared/Source/Items/Item.cs | 1 + .../Source/Items/ItemPrefab.cs | 20 +++++++++-- 4 files changed, 60 insertions(+), 15 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Item.cs b/Barotrauma/BarotraumaClient/Source/Items/Item.cs index f71eb7af5..62894cbad 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Item.cs @@ -15,7 +15,7 @@ namespace Barotrauma { public override Sprite Sprite { - get { return prefab.sprite; } + get { return prefab.GetActiveSprite(condition); } } public override void Draw(SpriteBatch spriteBatch, bool editing, bool back = true) @@ -24,22 +24,24 @@ namespace Barotrauma Color color = (IsSelected && editing) ? color = Color.Red : spriteColor; if (isHighlighted) color = Color.Orange; - SpriteEffects oldEffects = prefab.sprite.effects; - prefab.sprite.effects ^= SpriteEffects; + Sprite selectedSprite = prefab.GetActiveSprite(condition); - if (prefab.sprite != null) + if (selectedSprite != null) { + SpriteEffects oldEffects = selectedSprite.effects; + selectedSprite.effects ^= SpriteEffects; + float depth = GetDrawDepth(); if (body == null) { if (prefab.ResizeHorizontal || prefab.ResizeVertical || SpriteEffects.HasFlag(SpriteEffects.FlipHorizontally) || SpriteEffects.HasFlag(SpriteEffects.FlipVertically)) { - prefab.sprite.DrawTiled(spriteBatch, new Vector2(DrawPosition.X - rect.Width / 2, -(DrawPosition.Y + rect.Height / 2)), new Vector2(rect.Width, rect.Height), color); + selectedSprite.DrawTiled(spriteBatch, new Vector2(DrawPosition.X - rect.Width / 2, -(DrawPosition.Y + rect.Height / 2)), new Vector2(rect.Width, rect.Height), color); } else { - prefab.sprite.Draw(spriteBatch, new Vector2(DrawPosition.X, -DrawPosition.Y), color, 0.0f, 1.0f, SpriteEffects.None, depth); + selectedSprite.Draw(spriteBatch, new Vector2(DrawPosition.X, -DrawPosition.Y), color, 0.0f, 1.0f, SpriteEffects.None, depth); } } @@ -57,16 +59,17 @@ namespace Barotrauma depth = holdable.Picker.AnimController.GetLimb(LimbType.LeftArm).sprite.Depth - 0.000001f; } - body.Draw(spriteBatch, prefab.sprite, color, depth); + body.Draw(spriteBatch, selectedSprite, color, depth); } else { - body.Draw(spriteBatch, prefab.sprite, color, depth); + body.Draw(spriteBatch, selectedSprite, color, depth); } } + + selectedSprite.effects = oldEffects; } - prefab.sprite.effects = oldEffects; List staticDrawableComponents = new List(drawableComponents); //static list to compensate for drawable toggling for (int i = 0; i < staticDrawableComponents.Count; i++) diff --git a/Barotrauma/BarotraumaClient/Source/Items/ItemPrefab.cs b/Barotrauma/BarotraumaClient/Source/Items/ItemPrefab.cs index 7236db0a5..fe606c4cb 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/ItemPrefab.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/ItemPrefab.cs @@ -1,11 +1,41 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; +using System.Collections.Generic; namespace Barotrauma { + class BrokenItemSprite + { + //sprite will be rendered if the condition of the item is below this + public readonly float MaxCondition; + public readonly Sprite Sprite; + + public BrokenItemSprite(Sprite sprite, float maxCondition) + { + Sprite = sprite; + MaxCondition = maxCondition; + } + } + partial class ItemPrefab : MapEntityPrefab { + public List BrokenSprites = new List(); + + public Sprite GetActiveSprite(float condition) + { + Sprite activeSprite = sprite; + foreach (BrokenItemSprite brokenSprite in BrokenSprites) + { + if (condition <= brokenSprite.MaxCondition) + { + activeSprite = brokenSprite.Sprite; + break; + } + } + return activeSprite; + } + public override void DrawPlacing(SpriteBatch spriteBatch, Camera cam) { Vector2 position = Submarine.MouseToWorldGrid(cam, Submarine.MainSub); @@ -40,9 +70,6 @@ namespace Barotrauma if (sprite != null) sprite.DrawTiled(spriteBatch, new Vector2(position.X, -position.Y), placeSize, SpriteColor); } - - //if (PlayerInput.GetMouseState.RightButton == ButtonState.Pressed) selected = null; - } } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 802e5498f..e10e7b72b 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -383,6 +383,7 @@ namespace Barotrauma case "trigger": case "sprite": case "deconstruct": + case "brokensprite": break; case "aitarget": aiTarget = new AITarget(this); diff --git a/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs b/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs index 6d014de7d..dfb6ce209 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs @@ -25,8 +25,6 @@ namespace Barotrauma partial class ItemPrefab : MapEntityPrefab { - //static string contentFolder = "Content/Items/"; - private readonly string configFile; //default size @@ -305,12 +303,28 @@ namespace Barotrauma sprite = new Sprite(subElement, spriteFolder); size = sprite.size; break; +#if CLIENT + case "brokensprite": + string brokenSpriteFolder = ""; + if (!subElement.GetAttributeString("texture", "").Contains("/")) + { + brokenSpriteFolder = Path.GetDirectoryName(filePath); + } + + var brokenSprite = new BrokenItemSprite(new Sprite(subElement, brokenSpriteFolder), subElement.GetAttributeFloat("maxcondition", 0.0f)); + int spriteIndex = 0; + for (int i = 0; i < BrokenSprites.Count && BrokenSprites[i].MaxCondition < brokenSprite.MaxCondition; i++) + { + spriteIndex = i; + } + BrokenSprites.Insert(spriteIndex, brokenSprite); + break; +#endif case "deconstruct": DeconstructTime = subElement.GetAttributeFloat("time", 10.0f); foreach (XElement deconstructItem in subElement.Elements()) { - string deconstructItemName = deconstructItem.GetAttributeString("name", "not found"); //minCondition does <= check, meaning that below or equeal to min condition will be skipped. float minCondition = deconstructItem.GetAttributeFloat("mincondition", -0.1f);