From 8ec7fd44ff8f972ae5e7a96930719d2db8e27a62 Mon Sep 17 00:00:00 2001 From: Regalis Date: Thu, 19 Nov 2015 21:24:49 +0200 Subject: [PATCH] LimbSlot combinations for pickable items ("Any,RightHand+LeftHand"...) --- Subsurface/Barotrauma.csproj | 3 - .../Content/Items/Artifacts/artifacts.xml | 4 +- Subsurface/Content/Items/Clothes/clothes.xml | 4 +- .../Content/Items/Diving/divinggear.xml | 23 +- Subsurface/Content/Items/Tools/tools.xml | 9 +- Subsurface/Content/Items/Weapons/railgun.xml | 2 +- Subsurface/Content/Items/Weapons/weapons.xml | 2 +- Subsurface/Content/Particles/blood.png | Bin 8470 -> 0 bytes Subsurface/Source/Characters/Character.cs | 6 +- Subsurface/Source/Items/CharacterInventory.cs | 268 ++++++++++++------ .../Items/Components/Holdable/Pickable.cs | 26 +- Subsurface/Source/Items/Inventory.cs | 46 ++- Subsurface/Source/Items/Item.cs | 4 +- Subsurface/Source/Map/Map.cs | 3 +- Subsurface/Source/Particles/Particle.cs | 10 - Subsurface/Source/Program.cs | 8 +- Subsurface/Source/Screens/GameScreen.cs | 6 +- Subsurface_Solution.v12.suo | Bin 745472 -> 745472 bytes 18 files changed, 272 insertions(+), 152 deletions(-) delete mode 100644 Subsurface/Content/Particles/blood.png diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index eaf9142f9..0316478b6 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -740,9 +740,6 @@ PreserveNewest Designer - - PreserveNewest - PreserveNewest diff --git a/Subsurface/Content/Items/Artifacts/artifacts.xml b/Subsurface/Content/Items/Artifacts/artifacts.xml index 39eac13db..c283a20f7 100644 --- a/Subsurface/Content/Items/Artifacts/artifacts.xml +++ b/Subsurface/Content/Items/Artifacts/artifacts.xml @@ -8,7 +8,7 @@ - + - + diff --git a/Subsurface/Content/Items/Clothes/clothes.xml b/Subsurface/Content/Items/Clothes/clothes.xml index 59e3f8d2c..f614a4835 100644 --- a/Subsurface/Content/Items/Clothes/clothes.xml +++ b/Subsurface/Content/Items/Clothes/clothes.xml @@ -92,7 +92,7 @@ - + @@ -118,7 +118,7 @@ - + diff --git a/Subsurface/Content/Items/Diving/divinggear.xml b/Subsurface/Content/Items/Diving/divinggear.xml index fd67f56e7..f4d2d2caf 100644 --- a/Subsurface/Content/Items/Diving/divinggear.xml +++ b/Subsurface/Content/Items/Diving/divinggear.xml @@ -11,9 +11,6 @@ - - - @@ -33,7 +30,12 @@ - + + + + + + @@ -52,7 +54,7 @@ - + @@ -70,10 +72,17 @@ + + + + + + + @@ -86,9 +95,9 @@ - + - + diff --git a/Subsurface/Content/Items/Tools/tools.xml b/Subsurface/Content/Items/Tools/tools.xml index d26e8214c..3aa2621ff 100644 --- a/Subsurface/Content/Items/Tools/tools.xml +++ b/Subsurface/Content/Items/Tools/tools.xml @@ -12,7 +12,7 @@ - @@ -56,7 +56,7 @@ - @@ -94,9 +94,6 @@ - - - @@ -113,7 +110,7 @@ - diff --git a/Subsurface/Content/Items/Weapons/railgun.xml b/Subsurface/Content/Items/Weapons/railgun.xml index 5c9680dfe..5a4579d94 100644 --- a/Subsurface/Content/Items/Weapons/railgun.xml +++ b/Subsurface/Content/Items/Weapons/railgun.xml @@ -68,7 +68,7 @@ - + diff --git a/Subsurface/Content/Items/Weapons/weapons.xml b/Subsurface/Content/Items/Weapons/weapons.xml index fa95d3ecc..4e52c7076 100644 --- a/Subsurface/Content/Items/Weapons/weapons.xml +++ b/Subsurface/Content/Items/Weapons/weapons.xml @@ -26,7 +26,7 @@ - diff --git a/Subsurface/Content/Particles/blood.png b/Subsurface/Content/Particles/blood.png deleted file mode 100644 index e5ad8cfdb528283aa84fef3202e158ecb0d3a878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8470 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 allowedSlots = new List(item.AllowedSlots); + allowedSlots.Remove(LimbSlot.Any); + + inventory.TryPutItem(item, allowedSlots, false); } else { diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index cc32ed0a0..9e722f7d1 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -11,7 +11,7 @@ namespace Barotrauma [Flags] public enum LimbSlot { - Any = 1, RightHand = 2, LeftHand = 4, Head = 8, Torso = 16, Legs = 32, BothHands = 64 + None = 0, Any = 1, RightHand = 2, LeftHand = 4, Head = 8, Torso = 16, Legs = 32 }; class CharacterInventory : Inventory @@ -100,56 +100,69 @@ namespace Barotrauma /// /// If there is room, puts the item in the inventory and returns true, otherwise returns false /// - public override bool TryPutItem(Item item, LimbSlot allowedSlots, bool createNetworkEvent = true) + public override bool TryPutItem(Item item, List allowedSlots, bool createNetworkEvent = true) { - for (int i = 0; i < capacity; i++) - { - //item is already in the inventory! - if (items[i] == item) return true; - } + //for (int i = 0; i < capacity; i++) + //{ + // //item is already in the inventory! + // if (items[i] == item) return true; + //} - if (allowedSlots.HasFlag(LimbSlot.Any)) + //try to place the item in LimBlot.Any slot if that's allowed + if (allowedSlots.Contains(LimbSlot.Any)) { for (int i = 0; i < capacity; i++) { - if (items[i] != null) continue; - if (limbSlots[i] != LimbSlot.Any) continue; + if (items[i] != null || limbSlots[i] != LimbSlot.Any) continue; PutItem(item, i, createNetworkEvent); item.Unequip(character); return true; } } - for (int i = 0; i < capacity; i++) - { - if (allowedSlots.HasFlag(limbSlots[i]) && items[i]!=null) return false; - } - bool placed = false; - for (int i = 0; i < capacity; i++) + foreach (LimbSlot allowedSlot in allowedSlots) { - if (allowedSlots.HasFlag(limbSlots[i]) && items[i] == null) + //check if all the required slots are free + bool free = true; + for (int i = 0; i < capacity; i++) { - PutItem(item, i, createNetworkEvent, !placed); - item.Equip(character); - placed = true; + if (allowedSlot.HasFlag(limbSlots[i]) && items[i]!=null && items[i]!=item) + { + free = false; + break; + } } + + if (!free) continue; + + for (int i = 0; i < capacity; i++) + { + if (allowedSlot.HasFlag(limbSlots[i]) && items[i] == null) + { + PutItem(item, i, createNetworkEvent, !placed); + item.Equip(character); + placed = true; + } + } + + if (placed) return true; + + //if (allowedSlots.HasFlag(LimbSlot.BothHands)) TryPutItem(item, 3, createNetworkEvent); + } - if (placed) return true; - if (allowedSlots.HasFlag(LimbSlot.BothHands)) TryPutItem(item, 3, createNetworkEvent); - - return false; + return placed; } - public override bool TryPutItem(Item item, int i, bool createNetworkEvent) + public override bool TryPutItem(Item item, int index, bool createNetworkEvent) { - LimbSlot usedSlots = item.AllowedSlots; - //there's already an item in the slot - if (items[i] != null) + if (items[index] != null) { + if (items[index] == item) return false; + bool combined = false; //if (item.Combine(items[i])) //{ @@ -157,11 +170,16 @@ namespace Barotrauma // combined = true; //} //else - if (items[i].Combine(item)) + if (items[index].Combine(item)) { //PutItem(items[i], i, false, false); - Inventory otherInventory = items[i].inventory; - if (otherInventory!=null && createNetworkEvent) + if (items[index]==null) + { + System.Diagnostics.Debug.Assert(false); + return false; + } + Inventory otherInventory = items[index].inventory; + if (otherInventory != null && createNetworkEvent) { new Networking.NetworkEvent(Networking.NetworkEventType.InventoryUpdate, otherInventory.Owner.ID, true, true); } @@ -169,65 +187,157 @@ namespace Barotrauma combined = true; } - if (!combined) return false; + return combined; + } - if (usedSlots.HasFlag(LimbSlot.BothHands)) - { - if (limbSlots[i] == LimbSlot.LeftHand) - { - PutItem(item, FindLimbSlot(LimbSlot.RightHand), createNetworkEvent, false); - } - else if (limbSlots[i] == LimbSlot.RightHand) - { - PutItem(item, FindLimbSlot(LimbSlot.LeftHand), createNetworkEvent, false); - } - } - if (limbSlots[i] == LimbSlot.Any) item.Unequip(character); + if (limbSlots[index] == LimbSlot.Any) + { + if (!item.AllowedSlots.Contains(LimbSlot.Any)) return false; + if (items[index] != null) return items[index] == item; + PutItem(item, index, createNetworkEvent, true); return true; } + + LimbSlot placeToSlots = LimbSlot.None; + + bool slotsFree = true; + List allowedSlots = item.AllowedSlots; + foreach (LimbSlot allowedSlot in allowedSlots) + { + if (!allowedSlot.HasFlag(limbSlots[index])) continue; + + for (int i = 0; i < capacity; i++) + { + if (allowedSlot.HasFlag(limbSlots[i]) && items[i] != null && items[i] != item) + { + slotsFree = false; + break; + } + + placeToSlots = allowedSlot; + } + } + + if (!slotsFree) return false; - if (limbSlots[i]==LimbSlot.Any) - { - if (usedSlots.HasFlag(LimbSlot.Any)) - { - item.Unequip(character); - PutItem(item, i, createNetworkEvent); - return true; - } - else - { - return false; - } - } - else - { + return TryPutItem(item, new List() {placeToSlots}, createNetworkEvent); - if (limbSlots[i] != LimbSlot.Any && usedSlots.HasFlag(limbSlots[i]) && items[i] == null) - { - item.Unequip(character); - PutItem(item, i, createNetworkEvent); - item.Equip(character); - return true; - } + + ////there's already an item in the slot + //if (items[i] != null) + //{ + // bool combined = false; + // //if (item.Combine(items[i])) + // //{ + // // //PutItem(item, i, false, false); + // // combined = true; + // //} + // //else + // if (items[i].Combine(item)) + // { + // //PutItem(items[i], i, false, false); + // Inventory otherInventory = items[i].inventory; + // if (otherInventory!=null && createNetworkEvent) + // { + // new Networking.NetworkEvent(Networking.NetworkEventType.InventoryUpdate, otherInventory.Owner.ID, true, true); + // } + + // combined = true; + // } + + // if (!combined) return false; + + // //if (usedSlots.HasFlag(LimbSlot.BothHands)) + // //{ + // // if (limbSlots[i] == LimbSlot.LeftHand) + // // { + // // PutItem(item, FindLimbSlot(LimbSlot.RightHand), createNetworkEvent, false); + // // } + // // else if (limbSlots[i] == LimbSlot.RightHand) + // // { + // // PutItem(item, FindLimbSlot(LimbSlot.LeftHand), createNetworkEvent, false); + // // } + // //} + // if (limbSlots[i] == LimbSlot.Any) + // { + // item.Unequip(character); + // return true; + // } + //} + + + //bool placed = false; + //foreach (LimbSlot allowedSlot in usedSlots) + //{ + // if () + //} + + //foreach (LimbSlot allowedSlot in usedSlots) + //{ + // //check if all the required slots are free + // for (int n = 0; n < capacity; i++) + // { + // if (allowedSlot.HasFlag(limbSlots[n]) && items[n] != null && items[n] != item) continue; + // } + + // for (int n = 0; n < capacity; n++) + // { + // if (allowedSlot.HasFlag(limbSlots[i]) && items[i] == null) + // { + // PutItem(item, i, createNetworkEvent, !placed); + // item.Equip(character); + // placed = true; + // } + // } + + // if (placed) return true; + + // //if (allowedSlots.HasFlag(LimbSlot.BothHands)) TryPutItem(item, 3, createNetworkEvent); + + //} + + //if (limbSlots[i]==LimbSlot.Any) + //{ + // if (usedSlots.HasFlag(LimbSlot.Any)) + // { + // item.Unequip(character); + // PutItem(item, i, createNetworkEvent); + // return true; + // } + // else + // { + // return false; + // } + //} + //else + //{ + + // if (limbSlots[i] != LimbSlot.Any && usedSlots.HasFlag(limbSlots[i]) && items[i] == null) + // { + // item.Unequip(character); + // PutItem(item, i, createNetworkEvent); + // item.Equip(character); + // return true; + // } - if (usedSlots.HasFlag(LimbSlot.BothHands) && (limbSlots[i]==LimbSlot.LeftHand || limbSlots[i]==LimbSlot.RightHand)) - { - int rightHandSlot = FindLimbSlot(LimbSlot.LeftHand); - int leftHandSlot = FindLimbSlot(LimbSlot.RightHand); + // if (usedSlots.HasFlag(LimbSlot.BothHands) && (limbSlots[i]==LimbSlot.LeftHand || limbSlots[i]==LimbSlot.RightHand)) + // { + // int rightHandSlot = FindLimbSlot(LimbSlot.LeftHand); + // int leftHandSlot = FindLimbSlot(LimbSlot.RightHand); - if (items[rightHandSlot] != null) return false; - if (items[leftHandSlot] != null) return false; + // if (items[rightHandSlot] != null) return false; + // if (items[leftHandSlot] != null) return false; - PutItem(item, rightHandSlot, createNetworkEvent, true); - PutItem(item, leftHandSlot, createNetworkEvent, false); - item.Equip(character); - return true; - } + // PutItem(item, rightHandSlot, createNetworkEvent, true); + // PutItem(item, leftHandSlot, createNetworkEvent, false); + // item.Equip(character); + // return true; + // } - return false; - } + // return false; + //} } diff --git a/Subsurface/Source/Items/Components/Holdable/Pickable.cs b/Subsurface/Source/Items/Components/Holdable/Pickable.cs index 6b383140f..d3b3ebd5d 100644 --- a/Subsurface/Source/Items/Components/Holdable/Pickable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Pickable.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Xml.Linq; namespace Barotrauma.Items.Components @@ -7,9 +8,9 @@ namespace Barotrauma.Items.Components { protected Character picker; - protected LimbSlot allowedSlots; + protected List allowedSlots; - public LimbSlot AllowedSlots + public List AllowedSlots { get { return allowedSlots; } } @@ -22,11 +23,26 @@ namespace Barotrauma.Items.Components public Pickable(Item item, XElement element) : base(item, element) { + allowedSlots = new List(); + string slotString = ToolBox.GetAttributeString(element, "slots", "Any"); - string[] slots = slotString.Split(','); - foreach (string slot in slots) + string[] slotCombinations = slotString.Split(','); + foreach (string slotCombination in slotCombinations) { - allowedSlots = allowedSlots | (LimbSlot)Enum.Parse(typeof(LimbSlot), slot.Trim()); + string[] slots = slotCombination.Split('+'); + LimbSlot allowedSlot = LimbSlot.None; + foreach (string slot in slots) + { + if (slot.ToLower()=="bothhands") + { + allowedSlot = LimbSlot.LeftHand | LimbSlot.RightHand; + } + else + { + allowedSlot = allowedSlot | (LimbSlot)Enum.Parse(typeof(LimbSlot), slot.Trim()); + } + } + allowedSlots.Add(allowedSlot); } canBePicked = true; diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index 41420f01b..cc4121ed7 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -89,7 +89,7 @@ namespace Barotrauma /// /// If there is room, puts the item in the inventory and returns true, otherwise returns false /// - public virtual bool TryPutItem(Item item, LimbSlot allowedSlots = 0, bool createNetworkEvent = true) + public virtual bool TryPutItem(Item item, List allowedSlots = null, bool createNetworkEvent = true) { int slot = FindAllowedSlot(item); if (slot < 0) return false; @@ -238,48 +238,46 @@ namespace Barotrauma if (selectedSlot == slotIndex && !isSubSlot) { - System.Diagnostics.Debug.WriteLine("sdfg: "+selectedSlot+" - "+slotIndex); - selectedSlot = -1; - if (item == null) return; - - - int itemCapacity = item.Capacity; - if (itemCapacity == 0) return; + int itemCapacity = item==null ? 0 : item.Capacity; + if (itemCapacity > 0) + { #if DEBUG - System.Diagnostics.Debug.Assert(slotIndex>=0 && slotIndex= 0 && slotIndex < items.Length); #else if (slotIndex<0 || slotIndex>=items.Length) return; #endif - Rectangle containerRect = new Rectangle(rect.X - 5, rect.Y - (40 + 10) * itemCapacity - 5, - rect.Width + 10, rect.Height + (40 + 10) * itemCapacity + 10); + Rectangle containerRect = new Rectangle(rect.X - 5, rect.Y - (40 + 10) * itemCapacity - 5, + rect.Width + 10, rect.Height + (40 + 10) * itemCapacity + 10); - Rectangle subRect = rect; - subRect.Height = 40; + Rectangle subRect = rect; + subRect.Height = 40; - selectedSlot = containerRect.Contains(PlayerInput.MousePosition) ? slotIndex : -1; - System.Diagnostics.Debug.WriteLine(selectedSlot); + selectedSlot = containerRect.Contains(PlayerInput.MousePosition) ? slotIndex : -1; + System.Diagnostics.Debug.WriteLine(selectedSlot); - GUI.DrawRectangle(spriteBatch, containerRect, Color.Black*0.8f, true); - GUI.DrawRectangle(spriteBatch, containerRect, Color.White); + GUI.DrawRectangle(spriteBatch, containerRect, Color.Black * 0.8f, true); + GUI.DrawRectangle(spriteBatch, containerRect, Color.White); - Item[] containedItems = null; - if (items[slotIndex] != null) containedItems = items[slotIndex].ContainedItems; + Item[] containedItems = null; + if (items[slotIndex] != null) containedItems = items[slotIndex].ContainedItems; - if (containedItems != null) - { - for (int i = 0; i < itemCapacity; i++) + if (containedItems != null) { - subRect.Y = subRect.Y - subRect.Height - 10; - UpdateSlot(spriteBatch, subRect, selectedSlot, i < containedItems.Count() ? containedItems[i] : null, true); + for (int i = 0; i < itemCapacity; i++) + { + subRect.Y = subRect.Y - subRect.Height - 10; + UpdateSlot(spriteBatch, subRect, selectedSlot, i < containedItems.Count() ? containedItems[i] : null, true); + } } } + } DrawSlot(spriteBatch, rect, (draggingItem == item && !mouseOn) ? null : item, mouseOn, isSubSlot, drawItem); diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 1212000c3..99f0188b9 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -186,12 +186,12 @@ namespace Barotrauma } //which type of inventory slots (head, torso, any, etc) the item can be placed in - public LimbSlot AllowedSlots + public List AllowedSlots { get { Pickable p = GetComponent(); - return (p==null) ? LimbSlot.Any : p.AllowedSlots; + return (p==null) ? new List() { LimbSlot.Any } : p.AllowedSlots; } } diff --git a/Subsurface/Source/Map/Map.cs b/Subsurface/Source/Map/Map.cs index 2ec229a53..9e7e68a5e 100644 --- a/Subsurface/Source/Map/Map.cs +++ b/Subsurface/Source/Map/Map.cs @@ -257,7 +257,8 @@ namespace Barotrauma Vector2 rectCenter = new Vector2(rect.Center.X, rect.Center.Y); Vector2 offset = -currentLocation.MapPosition; - iceTexture.DrawTiled(spriteBatch, new Vector2(rect.X, rect.Y), new Vector2(rect.Width, rect.Height), offset, Color.White); + iceTexture.DrawTiled(spriteBatch, new Vector2(rect.X, rect.Y), new Vector2(rect.Width, rect.Height), Vector2.Zero, Color.White); + GUI.DrawRectangle(spriteBatch, rect, Color.White); //spriteBatch.Draw(iceTexture, offset, rect, null, null, 0f, null, Color.White, SpriteEffects.None, 0.0f); //Vector2 scale = new Vector2((float)rect.Width/ size, (float)rect.Height/size); diff --git a/Subsurface/Source/Particles/Particle.cs b/Subsurface/Source/Particles/Particle.cs index 63ada622c..cfb65921d 100644 --- a/Subsurface/Source/Particles/Particle.cs +++ b/Subsurface/Source/Particles/Particle.cs @@ -270,16 +270,6 @@ namespace Barotrauma.Particles prefab.Sprites[spriteIndex].origin, drawRotation, drawSize, SpriteEffects.None, prefab.Sprites[spriteIndex].Depth); - //spriteBatch.Draw( - // prefab.sprite.Texture, - // drawPosition, - // null, - // color*alpha, - // drawRotation, - // prefab.sprite.origin, - // size, - // SpriteEffects.None, prefab.sprite.Depth); - prevPosition = position; prevRotation = rotation; } diff --git a/Subsurface/Source/Program.cs b/Subsurface/Source/Program.cs index 41400c501..dd2d14c37 100644 --- a/Subsurface/Source/Program.cs +++ b/Subsurface/Source/Program.cs @@ -28,19 +28,19 @@ namespace Barotrauma { using (var game = new GameMain()) { -//#if !DEBUG +#if !DEBUG try { -//#endif +#endif game.Run(); -//#if !DEBUG +#if !DEBUG } catch (Exception e) { CrashDump(game, "crashreport.txt", e); } -//#endif +#endif } } diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index dce192bf7..89da7d9ce 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -203,7 +203,7 @@ namespace Barotrauma spriteBatch.End(); spriteBatch.Begin(SpriteSortMode.BackToFront, - BlendState.NonPremultiplied, + BlendState.AlphaBlend, SamplerState.LinearWrap, DepthStencilState.Default, null, null, cam.Transform); @@ -249,7 +249,7 @@ namespace Barotrauma spriteBatch.End(); spriteBatch.Begin(SpriteSortMode.Deferred, - BlendState.NonPremultiplied, + BlendState.AlphaBlend, null, DepthStencilState.Default, null, null, cam.Transform); GameMain.ParticleManager.Draw(spriteBatch, true, Particles.ParticleBlendState.AlphaBlend); @@ -272,7 +272,7 @@ namespace Barotrauma spriteBatch.End(); spriteBatch.Begin(SpriteSortMode.Deferred, - BlendState.NonPremultiplied, + BlendState.AlphaBlend, null, DepthStencilState.DepthRead, null, null, cam.Transform); GameMain.ParticleManager.Draw(spriteBatch, false, Particles.ParticleBlendState.AlphaBlend); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 0ee4a6faa01d248b4883bdfd18c6411adc492327..2bad0af0a41f3b5227681a40f5397969cec98f3b 100644 GIT binary patch delta 4621 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 OZa@oka-vmVbms54*Ljox