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