From 52af5462676e42e01cceafebe77a2a2a481537bb Mon Sep 17 00:00:00 2001 From: PixelTK <85175107+PixelTheKermit@users.noreply.github.com> Date: Wed, 8 Nov 2023 20:18:52 +0000 Subject: [PATCH] Arachnid 2: Episode 2 (#19984) * Shield * minor sprite changes and buffs * structure buff * Crafting stuff * tweaks * 88-88 * Better web pocket sprites. * yeah it's fine now. --- .../UI/ConstructionMenuPresenter.cs | 8 ++ .../ConstructionSystem.Initial.cs | 16 ++- .../Conditions/EntityWhitelistCondition.cs | 45 ++++++ .../Prototypes/ConstructionPrototype.cs | 16 ++- .../conditions/crafter-whitelist.ftl | 1 - .../construction/construction-system.ftl | 1 + Resources/Prototypes/Damage/modifier_sets.yml | 4 +- .../Entities/Mobs/Species/arachnid.yml | 44 +++--- .../Entities/Objects/Shields/shields.yml | 53 +++++++ .../Entities/Structures/Walls/walls.yml | 3 + .../arachnid_inventory_template.yml | 134 ++++++++++++++++++ .../Prototypes/Recipes/Construction/web.yml | 18 +++ .../Recipes/Crafting/Graphs/web.yml | 9 ++ Resources/Prototypes/Recipes/Crafting/web.yml | 31 ++++ Resources/Prototypes/tags.yml | 3 + .../Textures/Interface/Classic/Slots/web.png | Bin 0 -> 908 bytes .../Textures/Interface/Default/Slots/web.png | Bin 668 -> 790 bytes .../Interface/Modernized/Slots/web.png | Bin 0 -> 523 bytes .../Arachnid/chelicerae.rsi/downwards.png | Bin 233 -> 231 bytes .../Mobs/Species/Arachnid/parts.rsi/eyes.png | Bin 138 -> 151 bytes .../Objects/Materials/silk.rsi/icon.png | Bin 391 -> 423 bytes .../Melee/web-shield.rsi/icon-inhand-left.png | Bin 0 -> 816 bytes .../web-shield.rsi/icon-inhand-right.png | Bin 0 -> 845 bytes .../Weapons/Melee/web-shield.rsi/icon.png | Bin 0 -> 409 bytes .../Weapons/Melee/web-shield.rsi/meta.json | 19 +++ 25 files changed, 375 insertions(+), 30 deletions(-) create mode 100644 Content.Shared/Construction/Conditions/EntityWhitelistCondition.cs delete mode 100644 Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl create mode 100644 Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml create mode 100644 Resources/Textures/Interface/Classic/Slots/web.png create mode 100644 Resources/Textures/Interface/Modernized/Slots/web.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/meta.json diff --git a/Content.Client/Construction/UI/ConstructionMenuPresenter.cs b/Content.Client/Construction/UI/ConstructionMenuPresenter.cs index cdc9044a40..28cf3ba16c 100644 --- a/Content.Client/Construction/UI/ConstructionMenuPresenter.cs +++ b/Content.Client/Construction/UI/ConstructionMenuPresenter.cs @@ -1,9 +1,11 @@ using System.Linq; using Content.Client.UserInterface.Systems.MenuBar.Widgets; using Content.Shared.Construction.Prototypes; +using Content.Shared.Tag; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Placement; +using Robust.Client.Player; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.Utility; @@ -25,6 +27,7 @@ namespace Content.Client.Construction.UI [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IPlacementManager _placementManager = default!; [Dependency] private readonly IUserInterfaceManager _uiManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; private readonly IConstructionMenuView _constructionView; @@ -152,6 +155,11 @@ namespace Content.Client.Construction.UI if (recipe.Hide) continue; + if (_playerManager.LocalSession == null + || _playerManager.LocalEntity == null + || (recipe.EntityWhitelist != null && !recipe.EntityWhitelist.IsValid(_playerManager.LocalEntity.Value))) + continue; + if (!string.IsNullOrEmpty(search)) { if (!recipe.Name.ToLowerInvariant().Contains(search.Trim().ToLowerInvariant())) diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index 21978f2d0c..f312308798 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -15,6 +15,7 @@ using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Storage; +using Content.Shared.Tag; using Robust.Shared.Containers; using Robust.Shared.Player; using Robust.Shared.Timing; @@ -29,6 +30,8 @@ namespace Content.Server.Construction [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly EntityLookupSystem _lookupSystem = default!; + [Dependency] private readonly StorageSystem _storageSystem = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; // --- WARNING! LEGACY CODE AHEAD! --- // This entire file contains the legacy code for initial construction. @@ -330,6 +333,12 @@ namespace Content.Server.Construction return false; } + if (constructionPrototype.EntityWhitelist != null && !constructionPrototype.EntityWhitelist.IsValid(user)) + { + _popup.PopupEntity(Loc.GetString("construction-system-cannot-start"), user, user); + return false; + } + var startNode = constructionGraph.Nodes[constructionPrototype.StartNode]; var targetNode = constructionGraph.Nodes[constructionPrototype.TargetNode]; var pathFind = constructionGraph.Path(startNode.Name, targetNode.Name); @@ -383,7 +392,6 @@ namespace Content.Server.Construction // LEGACY CODE. See warning at the top of the file! private async void HandleStartStructureConstruction(TryStartStructureConstructionMessage ev, EntitySessionEventArgs args) { - if (!_prototypeManager.TryIndex(ev.PrototypeName, out ConstructionPrototype? constructionPrototype)) { _sawmill.Error($"Tried to start construction of invalid recipe '{ev.PrototypeName}'!"); @@ -404,6 +412,12 @@ namespace Content.Server.Construction return; } + if (constructionPrototype.EntityWhitelist != null && !constructionPrototype.EntityWhitelist.IsValid(user)) + { + _popup.PopupEntity(Loc.GetString("construction-system-cannot-start"), user, user); + return; + } + if (_container.IsEntityInContainer(user)) { _popup.PopupEntity(Loc.GetString("construction-system-inside-container"), user, user); diff --git a/Content.Shared/Construction/Conditions/EntityWhitelistCondition.cs b/Content.Shared/Construction/Conditions/EntityWhitelistCondition.cs new file mode 100644 index 0000000000..22d86b54fb --- /dev/null +++ b/Content.Shared/Construction/Conditions/EntityWhitelistCondition.cs @@ -0,0 +1,45 @@ +using Content.Shared.Construction.EntitySystems; +using Content.Shared.Whitelist; +using Robust.Shared.Map; +using Robust.Shared.Utility; + +namespace Content.Shared.Construction.Conditions; + +/// +/// A check to see if the entity itself can be crafted. +/// +[DataDefinition] +public sealed partial class EntityWhitelistCondition : IConstructionCondition +{ + /// + /// What is told to the player attempting to construct the recipe using this condition. This will be localised. + /// + [DataField("conditionString")] + public string ConditionString = "construction-step-condition-entity-whitelist"; + + /// + /// The icon shown to the player beside the condition string. + /// + [DataField("conditionIcon")] + public SpriteSpecifier? ConditionIcon = null; + + /// + /// The whitelist that allows only certain entities to use this. + /// + [DataField("whitelist", required: true)] + public EntityWhitelist Whitelist = new(); + + public bool Condition(EntityUid user, EntityCoordinates location, Direction direction) + { + return Whitelist.IsValid(user); + } + + public ConstructionGuideEntry GenerateGuideEntry() + { + return new ConstructionGuideEntry + { + Localization = ConditionString, + Icon = ConditionIcon + }; + } +} diff --git a/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs b/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs index bd6dc096ad..e9863f8364 100644 --- a/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs +++ b/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs @@ -1,4 +1,5 @@ using Content.Shared.Construction.Conditions; +using Content.Shared.Whitelist; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Utility; @@ -20,7 +21,7 @@ public sealed partial class ConstructionPrototype : IPrototype /// Friendly name displayed in the construction GUI. /// [DataField("name")] - public string Name= string.Empty; + public string Name = string.Empty; /// /// "Useful" description displayed in the construction GUI. @@ -31,7 +32,7 @@ public sealed partial class ConstructionPrototype : IPrototype /// /// The this construction will be using. /// - [DataField("graph", customTypeSerializer:typeof(PrototypeIdSerializer), required: true)] + [DataField("graph", customTypeSerializer: typeof(PrototypeIdSerializer), required: true)] public string Graph = string.Empty; /// @@ -64,6 +65,13 @@ public sealed partial class ConstructionPrototype : IPrototype [DataField("canBuildInImpassable")] public bool CanBuildInImpassable { get; private set; } + /// + /// If not null, then this is used to check if the entity trying to construct this is whitelisted. + /// If they're not whitelisted, hide the item. + /// + [DataField("entityWhitelist")] + public EntityWhitelist? EntityWhitelist = null; + [DataField("category")] public string Category { get; private set; } = ""; [DataField("objectType")] public ConstructionType Type { get; private set; } = ConstructionType.Structure; @@ -84,11 +92,11 @@ public sealed partial class ConstructionPrototype : IPrototype /// /// Construction to replace this construction with when the current one is 'flipped' /// - [DataField("mirror", customTypeSerializer:typeof(PrototypeIdSerializer))] + [DataField("mirror", customTypeSerializer: typeof(PrototypeIdSerializer))] public string? Mirror; public IReadOnlyList Conditions => _conditions; - public IReadOnlyList Layers => _layers ?? new List{Icon}; + public IReadOnlyList Layers => _layers ?? new List { Icon }; } public enum ConstructionType diff --git a/Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl b/Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl deleted file mode 100644 index 646d89ca5e..0000000000 --- a/Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl +++ /dev/null @@ -1 +0,0 @@ -construction-step-condition-crafter-whitelist = You need to meet certain requirements. diff --git a/Resources/Locale/en-US/construction/construction-system.ftl b/Resources/Locale/en-US/construction/construction-system.ftl index 6ba8ae7813..81be8c4ab2 100644 --- a/Resources/Locale/en-US/construction/construction-system.ftl +++ b/Resources/Locale/en-US/construction/construction-system.ftl @@ -4,3 +4,4 @@ construction-system-construct-cannot-start-another-construction = You can't star construction-system-construct-no-materials = You don't have the materials to build that! construction-system-already-building = You are already building that! construction-system-inside-container = You can't build while you're there! +construction-system-cannot-start = You cannot craft this! diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 8ab45c8b63..d651373ede 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -95,9 +95,9 @@ id: Web # Very flammable, can be easily hacked and slashed, but shooting or hitting it is another story. coefficients: Blunt: 0.7 - Slash: 2.0 + Slash: 1.4 Piercing: 0.7 - Heat: 3.0 + Heat: 2.0 - type: damageModifierSet id: Slime diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index a996a73127..244631509c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -11,13 +11,30 @@ - type: HumanoidAppearance species: Arachnid - type: Hunger - baseDecayRate: 0.0125 # Spiders have slow metabolisms all things considered, so I decided to just make their hunger drain slower. starvationDamage: types: Cold: 0.5 Bloodloss: 0.5 - type: Thirst - baseDecayRate: 0.0125 # Read comment in hunger + - type: Sericulture + action: ActionSericulture + productionLength: 2 + entityProduced: MaterialWebSilk1 + hungerCost: 4 # Should total to 25 total silk on full hunger + - type: Tag + tags: + - CanPilot + - FootstepSound + - DoorBumpOpener + - SpiderCraft + - type: Perishable + - type: Butcherable + butcheringType: Spike + spawned: + - id: FoodMeatSpider + amount: 5 + - type: Inventory + templateId: arachnid # Damage (Self) - type: Bloodstream bloodReagent: CopperBlood @@ -27,20 +44,8 @@ soundHit: collection: AlienClaw damage: - types: # Realisically this is more like 5 slash - Slash: 4 - # Fun - - type: Sericulture - action: ActionSericulture - productionLength: 3 - entityProduced: MaterialWebSilk1 - hungerCost: 9 # Should total to 12 total silk on full hunger - - type: Perishable - - type: Butcherable - butcheringType: Spike - spawned: - - id: FoodMeatSpider - amount: 5 + types: + Slash: 5 # Visual & Audio - type: DamageVisuals damageOverlayGroups: @@ -93,7 +98,7 @@ - map: [ "neck" ] - map: [ "back" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ] - - map: [ "enum.HumanoidVisualLayers.Hair" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] # Do these need to be here? (arachnid hair arachnid hair) - map: [ "enum.HumanoidVisualLayers.HeadSide" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - map: [ "mask" ] @@ -109,11 +114,6 @@ sprite: "Effects/creampie.rsi" state: "creampie_arachnid" visible: false - - type: Tag - tags: - - CanPilot - - FootstepSound - - DoorBumpOpener - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Objects/Shields/shields.yml b/Resources/Prototypes/Entities/Objects/Shields/shields.yml index c3e3ea44ea..4596085f34 100644 --- a/Resources/Prototypes/Entities/Objects/Shields/shields.yml +++ b/Resources/Prototypes/Entities/Objects/Shields/shields.yml @@ -222,6 +222,59 @@ min: 1 max: 2 +- type: entity + name: web shield + parent: BaseShield + id: WebShield + description: A stringy shield. It's weak, and doesn't seem to do well against heat. + components: + - type: Sprite + sprite: Objects/Weapons/Melee/web-shield.rsi + state: icon + - type: Item + sprite: Objects/Weapons/Melee/web-shield.rsi + heldPrefix: icon + - type: Blocking + passiveBlockModifier: + coefficients: + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + activeBlockModifier: + coefficients: + Blunt: 0.85 + Slash: 0.85 + Piercing: 0.85 + flatReductions: + Blunt: 0.5 + Slash: 0.5 + Piercing: 0.5 + - type: Construction + graph: WebObjects + node: shield + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 40 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTrigger + damage: 20 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:SpawnEntitiesBehavior + spawn: + MaterialWebSilk: + min: 1 + max: 1 + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/woodhit.ogg + #Magic/Cult Shields (give these to wizard for now) - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index a78565b1d5..9059fd06d7 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -966,6 +966,9 @@ MaterialWebSilk: min: 1 max: 1 + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/woodhit.ogg - type: IconSmooth key: walls base: wall diff --git a/Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml new file mode 100644 index 0000000000..0ebbdb916e --- /dev/null +++ b/Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml @@ -0,0 +1,134 @@ +- type: inventoryTemplate + id: arachnid + slots: + - name: shoes + slotTexture: shoes + slotFlags: FEET + stripTime: 3 + uiWindowPos: 1,3 + strippingWindowPos: 1,3 + displayName: Shoes + - name: jumpsuit + slotTexture: uniform + slotFlags: INNERCLOTHING + stripTime: 6 + uiWindowPos: 0,2 + strippingWindowPos: 0,2 + displayName: Jumpsuit + - name: gloves + slotTexture: gloves + slotFlags: GLOVES + uiWindowPos: 2,2 + strippingWindowPos: 2,2 + displayName: Gloves + - name: neck + slotTexture: neck + slotFlags: NECK + uiWindowPos: 0,1 + strippingWindowPos: 0,1 + displayName: Neck + - name: mask + slotTexture: mask + slotFlags: MASK + uiWindowPos: 1,1 + strippingWindowPos: 1,1 + displayName: Mask + - name: eyes + slotTexture: glasses + slotFlags: EYES + stripTime: 3 + uiWindowPos: 0,0 + strippingWindowPos: 0,0 + displayName: Eyes + - name: ears + slotTexture: ears + slotFlags: EARS + stripTime: 3 + uiWindowPos: 2,0 + strippingWindowPos: 2,0 + displayName: Ears + - name: head + slotTexture: head + slotFlags: HEAD + uiWindowPos: 1,0 + strippingWindowPos: 1,0 + displayName: Head + - name: suitstorage + slotTexture: suit_storage + slotFlags: SUITSTORAGE + stripTime: 3 + uiWindowPos: 2,0 + strippingWindowPos: 2,5 + dependsOn: outerClothing + displayName: Suit Storage + - name: id + slotTexture: id + slotFlags: IDCARD + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 2,1 + strippingWindowPos: 2,4 + dependsOn: jumpsuit + displayName: ID + - name: belt + slotTexture: belt + slotFlags: BELT + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,1 + strippingWindowPos: 1,5 + displayName: Belt + - name: back + slotTexture: back + slotFlags: BACK + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,0 + strippingWindowPos: 0,5 + displayName: Back + + - name: pocket4 + slotTexture: web + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,4 + strippingWindowPos: 1,5 + displayName: Pocket 4 + - name: pocket3 + slotTexture: web + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 0,4 + strippingWindowPos: 0,5 + displayName: Pocket 3 + + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 1,2 + strippingWindowPos: 1,2 + displayName: Suit + - name: pocket1 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 0,3 + strippingWindowPos: 0,4 + dependsOn: jumpsuit + displayName: Pocket 1 + stripHidden: true + - name: pocket2 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,3 + strippingWindowPos: 1,4 + dependsOn: jumpsuit + displayName: Pocket 2 + stripHidden: true diff --git a/Resources/Prototypes/Recipes/Construction/web.yml b/Resources/Prototypes/Recipes/Construction/web.yml index 2d61ac1515..9a0d832d01 100644 --- a/Resources/Prototypes/Recipes/Construction/web.yml +++ b/Resources/Prototypes/Recipes/Construction/web.yml @@ -13,6 +13,9 @@ placementMode: SnapgridCenter canRotate: false canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft conditions: - !type:TileNotBlocked @@ -31,6 +34,9 @@ placementMode: SnapgridCenter canRotate: false canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft conditions: - !type:TileNotBlocked @@ -49,6 +55,9 @@ placementMode: SnapgridCenter canRotate: false canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft conditions: - !type:TileNotBlocked @@ -66,6 +75,9 @@ objectType: Structure placementMode: SnapgridCenter canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft - type: construction name: web crate @@ -82,6 +94,9 @@ placementMode: SnapgridCenter canRotate: false canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft - type: construction name: web door @@ -97,5 +112,8 @@ objectType: Structure placementMode: SnapgridCenter canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft conditions: - !type:TileNotBlocked diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml index 2bde191cdb..718af8be27 100644 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml @@ -36,6 +36,12 @@ amount: 4 doAfter: 6 + - to: shield + steps: + - material: WebSilk + amount: 12 + doAfter: 6 + # Deconstruction - node: tile entity: FloorTileItemWeb @@ -51,3 +57,6 @@ - node: cloth entity: MaterialCloth1 + + - node: shield + entity: WebShield diff --git a/Resources/Prototypes/Recipes/Crafting/web.yml b/Resources/Prototypes/Recipes/Crafting/web.yml index 0cd8b22c0a..fe25b2f224 100644 --- a/Resources/Prototypes/Recipes/Crafting/web.yml +++ b/Resources/Prototypes/Recipes/Crafting/web.yml @@ -6,6 +6,9 @@ targetNode: tile category: construction-category-tiles description: "Nice and smooth." + entityWhitelist: + tags: + - SpiderCraft icon: sprite: Objects/Tiles/web.rsi state: icon @@ -19,6 +22,9 @@ targetNode: coat category: construction-category-clothing description: "Surprisingly warm and durable." + entityWhitelist: + tags: + - SpiderCraft icon: sprite: Clothing/OuterClothing/WinterCoats/coatweb.rsi state: icon @@ -32,6 +38,9 @@ targetNode: jumpsuit category: construction-category-clothing description: "At least it's something." + entityWhitelist: + tags: + - SpiderCraft icon: sprite: Clothing/Uniforms/Jumpsuit/web.rsi state: icon @@ -45,6 +54,9 @@ targetNode: jumpskirt category: construction-category-clothing description: "At least it's something." + entityWhitelist: + tags: + - SpiderCraft icon: sprite: Clothing/Uniforms/Jumpskirt/web.rsi state: icon @@ -58,7 +70,26 @@ targetNode: cloth category: construction-category-materials description: "Feels just like cloth, strangely enough." + entityWhitelist: + tags: + - SpiderCraft icon: sprite: Objects/Materials/materials.rsi state: cloth_3 objectType: Item + +- type: construction + name: web shield + id: WebShield + graph: WebObjects + startNode: start + targetNode: shield + category: construction-category-clothing + description: "It's thick enough to handle a few blows, but probably not heat." + entityWhitelist: + tags: + - SpiderCraft + icon: + sprite: Objects/Weapons/Melee/web-shield.rsi + state: icon + objectType: Item diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 6d72187985..33e2e376fe 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -972,6 +972,9 @@ - type: Tag id: SpeedLoaderRifle +- type: Tag + id: SpiderCraft + - type: Tag id: SpreaderIgnore diff --git a/Resources/Textures/Interface/Classic/Slots/web.png b/Resources/Textures/Interface/Classic/Slots/web.png new file mode 100644 index 0000000000000000000000000000000000000000..4c37ac42472e0ab6000eb8165b4061ce0d8de830 GIT binary patch literal 908 zcmV;719SX|P)}@wEpN=&6tt8Zd4Ty#)WDcas+S7qplD1wFL*UX+;J zLJ>LSBJe3te9%=%Q|Ljao5)$&OWhL9^spLvwZG&z!v0=XJDPp-ecyTS%^PX8THLv_ zdCVo?!Gn9VvaoRN*z@X_u|B@vrJNY3T*ShjS3j}8M+AJoTlxH(?@P}f-4E^9(&~m2 ze?KdhRyQ1gq%D9azy37v{cgpQ7*k+>cPCs~-*$e#_si(R!^6WjT_5}Xjm^7Gd`v0D zCtrW(JpTE|fgK+s;JPlIW+S|@dDrPQ8=)P08^rA_uWeaHM_WBcAP54q)&MN8ZH*~$ zUIak^L~2+S;z%j5w7M}>@9j2pnvKwPU6fM1eCcNsux#yf8pw)=Kk{N=WqsSROs9=b zvk^{=0hq4$SxDMX5qMkgMNpy@TC@R7{J&1K5w5In=ci#7Lx7Jy{n8OtqId8oT5I~9 zc4l_emOpkxDdrZhWAuRMd%vaT?eFdsZ$XvegFof8f}9y1_U&(M{_g17Xgvt zN@y2KBG`KvmcRJQsZ|#f$u)!l1p2`N&-Wf?W{D*bM=A#L2mt6Kpc*ZdA|a=9@@k0y zGU+TRA~3HtDA4*fit;E8VJN?f?N$gk9T7p~Gz*L|6TOG1(J4F&;^%i> zM-=2lc@b=Jd!w^pT7ALt+SXW?l^X+gGDJ!gsc=?U8}VmuM+8wdTw2|5vO47RB5o_$ z5sj{9zTd4FW4Qh852Y+4!@WB*Y(U%ZR@S$j{oS4L#f!fyB7*1DPkg`2*xm4=uV$&c iVf@Z^QIN~Np8pT|b=!b`GX)U<0000^C#t>>qex zD1hqW$rqshALcu4w;E?@1f>7%Yr^`Vddy|}e5Dx{jVbLPC4WeS1YUXD0Q9=ea6q|I zi~U~~4Hb!E@7#P-e1itUDOd#qj?cLq@wq89vq1|enZA1rZt?6}}98`}( z_FC(e2}BX~Q?ArPBBlMKIuIuijW%lh6d0db+DK#|TKDIO-jt!&ZHE4$frbR44A-f9 z7Si+pp%~*LG=H^!YUF9?b(>*!ecv}N87~1mZ}e%f{U-?gi|7rECZb}DX&{Xuz+S0} z<2Z~*KM@gre7{be;LY1Tlu~%bU4kIsy5CONm{MnIAT0xqHpDb-@H=>5I-LOUF#p}my8z_# zE;(ltnJ(W=F%3i++w3I>0LZCLwzLKTrC-m!iGTtj2yGX2Q)&k64>qp)7nCZWadmN) zXBz@2n1B2lan--b^kXBTfkluhpl1^$NT^4fzxi1!128Xx0+9fP6Sg7D)30VWtE{Fg zWnehy@LqpntFRN#!aVx>$<0Fb8?2oH0PzLfN5Mr2h`(I#r>=x{8)lsahl399_=r*p zl$lu&k)@(H2c5)9Xs?2cPPeP5+`t5A`&_siK6ls7XrHpmm0DN=C(YQTsa&by`~H(2 z+n0UTGz3mfP0YvWzM!>U`>}o5+6uQcb3HQ`6dUW@kfP&kO_lbKXtx?F)Iht{IIA9> wa5uiK+t)O^LzbC5>o96V*)Lx5qWU8E1I6;m#cvV^q5uE@07*qoM6N<$f{JQq;Q#;t delta 643 zcmV-}0(||J2AlU zsj?5zmniho+d@kz2}?r@3CV(O9ejx0!*;ZitT;cLIN!y#Bx~mTG&7Qb6N3T3)%DE} z0HYG@4Il1rf4UsVUY_rcZoShTC!z30|J>(0}O;MpxH2ASX&yfS@Z; zngRq}2>_-8Ns_4dMyrpv*T=%i4l!n}0*l!gjaDCv+1U7@T5B8M^=41KFXt1Z@BHEt zi`h7*tWI>T0s!##`e-nyH+zsWQvE^%#&@;W#{2XMz;^279B{<|DZ#miF#H1m@clE@ zPw!GjkTOE^+kbbY>B`C6MYK=>0_PsmbfpXuYh3|qPtz4R_tws3W1|AqT3ay}B0wC6 z%Ajso%E;)iH+#95a1kw3Kwop;KSLac5F$X9Wy+wG5rW_=(sYG54h@I&nAlqZoh1Nd zSq8?K(ND4ie`7%(@0xSx7;rfvL;%jc+_LCdvCW)L1%J*jE>)Wlf%D0^2jK^ZWvJR* z;~K3#02uXTqXKr`6EjfNM8&?FHlvF+a#|Xz%9~6FPJ?^fh01p0J7Td?M2Gy3y(v=DB^IaG~%- zw5cxaJ7({_;20nWhMn$UL`U;upN@5+YG0-6Sy}gkPIrKZ`&-7T;q#_4{Jb=j24**$ d@}hbYd;nn^$20`(rHTLm002ovPDHLkV1iB?HQ4|F diff --git a/Resources/Textures/Interface/Modernized/Slots/web.png b/Resources/Textures/Interface/Modernized/Slots/web.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9a67f8be8b08c9ba6258e6424e0bccf48126f3 GIT binary patch literal 523 zcmV+m0`&cfP)0~?@H2Jgp4WSf)hmt>Voyto}$q?w`4neLgS&lDN8u}(# zXWe_!opcg#V|W0NCV4Yo_*W-89`<%^U!xv*2qSXxZg^x7J8`(cq2cDY&MTGR#*H^)BS7O>X z*o6q4Sdz={aGd~9LZHK?h#`N*3b>xV41>*QE5P-PRT0v^it7CffD!`Nv9}4~yy$Qk zAvlL1SR#(2URzmK5TYjevnC;x901}tLJ%yib~Psq0b>rKA@Z^R=ps5f@K;c|Cc0s0 zCCakuv}Ho+{S;VFLR~3vT3$8L)c=I2+Z>@JV&@#th4dkgBgAoJ*e@+)Mll+TAXv6z zhBAM&04n54{1&8h;2QW}0>*4H>NX?^5TYI=7+VX}9YfxRLe%7fqmy%9m^UK5T)McR z>coBJ{^D&&CD-qU#)U*R$^kA`LHDJLnE*bFLr*LxcH>EN{)Nak@*dglvtDo>{+aUk-^bI$QIqj%%S7`aLX@0@6 xD|HU%)yrAJ(sX|}%=x@3EPg60MD>IHcNiUC`@0@}#lQ>_@pScbS?83{1OO8uQP2PY delta 205 zcmaFP_>ysgO8o{;7srr_Id5-m6g;fJ)B5l^kI!M5lAZ-CGqy0AW$bNI}nYf`_f)|#HtDLVIYO?l`)>*uHCHp(9goqzxN{FU-M&zgL_ z_w?N)mGbcSwa;d0E}in$=kJM^j8lTl%CAc}Pck_+VYk0M0|>Z*Nrn&JXLN$R8|>+WNp_~N-3-m9E^ z6Tk5Lyu$UDqD})@*Jc$mGJru{zPo%u%;XK5ge}&2-nhsvb6sW48x|8zu;ho6%=>IC U7T!C%P8G!WboFyt=akR{00`JH9RL6T delta 109 zcmbQv*u^+OB`wg?#WAE}&fA-cdeK zcy78EsI#C=p8*19yzFAV@O1TaS?83{ F1OPrODA51_ diff --git a/Resources/Textures/Objects/Materials/silk.rsi/icon.png b/Resources/Textures/Objects/Materials/silk.rsi/icon.png index 648f370a54048c8d88f5c473215c1f3cabd4c1ad..003f17ab445c1e37bf29a837218a27d581f860a5 100644 GIT binary patch delta 397 zcmV;80doF_1E&L!B!6y6L_t(oh3!>6Z^IxEeQBylkW3&(%Ud$t69507z{HenmPdrA zgd3e92DwWMQK}C0lPox_yL(XNHDVlfEc4o&TDNI5tyUN#*Hx)LU3AZ z3L)gkQzihQX&P6Wg`yr%O69amDRbImjF}Vw?DzY;4#QAlx{Sa$j!ptM zEX(PrMe)2^YbT`?#&OJ%CNfEG+m`yiueyw?Z$cqNmW2>t<}5RF^-Wk+g0AZ}%#8VS rvs0JOe*G<2;$5%diWMtX{5c-_&B^n&epCnm0000t<#U5ioNBkb#2(MMN?)gNU#!%TVvG0{~!VAfiSdTz_z40LaW-_OVP0aNEtS z5K#v3%LOL}03ym}c8KH80-W3l-HB%ilV@fg7SVNJZ+mc}Mc|WT7e}u*0DO-WMIiuM z9Musge-=*{rzcfaw==t|2)`Alv3T9pez?3UHA9~$P8JxR*F;ALd_6aYD#{N_kSTS`+7q?8`a+@`-;GU192lXnF~5#hAQI2vIUQHW@m z9QX(Cg6zXODUr3>;h8sG6Br57N@=I=kh4$6)zgx|Z;C zd9(a`^9%?C0)ar_XgQ$}(OQ@PmC3TK_q)3Ew$bQ|x1iR#9F0bB&ehL^5P$B+<8iMF zXsye;ySq-ki;D}=Ab5#st;^wXh$xD1dU{$vmr}x7Ti<_teBkTr3zNxYV-U2~<;~3v zq9{V1=bd`Dx3^?LkiG&!2qZ}YDJ6_CKcZ6BEvA%$QVOfps<+;3HbWf8fAsF}@5#G> zcK}wa6_O-@F$PL0q-hEv1kyCc`};eLF^Hn5cL1t##u&`!bEIjC&(BXhJUozB9snXr zv8wU_>L5_)aaA554gi4qXIou;;jBEs5CElA>w4&r2B0}zIp^x`uq%&`kF2c^5CkAe z5&%CfZj7m?D{E~%FgD9=qqh&d1K^xP9LKQMLP`lKeJkZp&ruC6c`4B(urTV4o(<#LJF z*VnDL!`Ii>D2k$`$FUbU_=OPn!ip@S&AdRhAlfDmuuiYa3sid4xd4DL0Koc8j!zcn zw;o4EC=dt)0)apv5C{YUfxz*>W|84YUU0mJ)gm(*jmUy99*;{O>rEG|7Mb(&bFu); z=ksz`>&+&-v%*4%`ar}v*E$`hq^Vn-94V!|PoP;XGL)R1oq1Vrx?r`)P(o?FX>#xu z8E)N!KN;fIWwppqLTSBe!fKJB#MgS$1*=7d5?||07kjbDaM9O#vk6v<3?&rSn{}{S zWGJDs-u#BuB0~wK^`;4{MdtGIl58_HolZ+%>&-fjej!BCQL`*N(OQ>DlHl#_?ayCk uC|E2OE$ajR7y8Sacwu*(DjBzyyFf%kTAl=B<_00003+B`$U80ceB4_ zr>9H$I!ijJ!a zqXC=E1^`f&C4>-2(-dcCXGqf&LI{*)x${0>xW2xQ-rwJ`UawIUg;l4~fF{G?P&>#N z!*DnxlIw=)bQ*Ql*~tI^+R6IXcc#;6r!}dw0YZqK+uuSb1Dcl=rIa@dpN*TF8|$~g zXh4!A0H7DV`m!RW)C*(teZFGTX*577g~4C|DJ3}P;G6@1zAvT3U@+JzIDEvWv()bnw+`V>BAI7D0ez4X6u=<#M?*1(wUDE|7f3rqj9z*7LnN1)7DB z@7Q#9x(Y}scM73qo$VX9x3_vv(A*!Gux^JhFE23~ji8j$XPz;Jx3@PuKRJsEZWx*_0{spN{lTfEf(lpiMetv$UEK9_3+&iMv`y0?? zKT1Q1tB4M%0f4(GjjM6V4RG}flB;n^4cL#;P~s}0)7yY!Q5s5IMRa-_a4bqgiK~cC zF9W(pXz2Tt#%q7QwbC4JEE3I;2;D{U{A3t|B^Q+u^n-&Bet9*=FeF z<)v~F(fRX*5XnT%vMkE;yh@S;A0HnFe_5g6_4RcpqC*wXBJJ8VJ2tL6LLvGR2$1j( X!;}5Z-#;es00000NkvXXu0mjf$heOM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon.png b/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..29830d3ac8c680d95426136cba02d60285daefdd GIT binary patch literal 409 zcmV;K0cQS*P) z@7if6c<&$Ijj8K8dtDWP_x^D{pCKZt&szJbeYsq+A+iCy_m9)*1Y->L`+e#sA~17m z-)=YD?{_p!lLcXN0f5Om=NyO#B9bhRbs~au4%XW2HAw?7jw8ylL