From f189b73fe57d9eaa72f043f2fca49754e7d161b8 Mon Sep 17 00:00:00 2001
From: PixelTK <85175107+PixelTheKermit@users.noreply.github.com>
Date: Sun, 13 Aug 2023 08:38:05 +0100
Subject: [PATCH] Arachnid rework (#18631)
* Merge before I fuck up anything again
* craft whitelist
* Sericulture
* Spider
* gone
* quickly fixed
* and coders taketh away
* And we take more away
* sericulture improvements
* arachnid
* better webbed
* OH WAIT
* test fail
---
.../Sericulture/SericultureComponent.cs | 27 +++
.../Sericulture/SericultureSystem.cs | 101 +++++++++++
.../Sericulture/SericultureEvents.cs | 7 +
.../Locale/en-US/actions/actions/spider.ftl | 6 +-
.../conditions/crafter-whitelist.ftl | 1 +
Resources/Locale/en-US/tiles/tiles.ftl | 3 +-
Resources/Prototypes/Actions/spider.yml | 8 +
Resources/Prototypes/Body/Parts/arachnid.yml | 4 -
.../Prototypes/Body/Prototypes/arachnid.yml | 6 +
Resources/Prototypes/Damage/modifier_sets.yml | 17 +-
.../Entities/Mobs/Player/arachnid.yml | 2 +-
.../Entities/Mobs/Species/arachnid.yml | 124 ++++++++-----
.../Entities/Objects/Materials/materials.yml | 45 ++++-
.../Entities/Objects/Misc/spider_web.yml | 5 +
.../Entities/Objects/Misc/tiles.yml | 16 ++
.../Structures/Furniture/Tables/tables.yml | 29 ++++
.../Entities/Structures/Furniture/beds.yml | 28 +++
.../Entities/Structures/Furniture/chairs.yml | 39 +++++
.../Entities/Structures/Walls/walls.yml | 43 ++++-
.../Reagents/Materials/materials.yml | 7 +
.../Recipes/Construction/Graphs/web.yml | 35 ++++
.../Prototypes/Recipes/Construction/web.yml | 35 ++++
.../Recipes/Crafting/Graphs/tiles.yml | 2 +-
.../Recipes/Crafting/Graphs/web.yml | 15 ++
Resources/Prototypes/Recipes/Crafting/web.yml | 10 ++
.../Prototypes/Stacks/Materials/materials.yml | 8 +
.../Prototypes/Stacks/floor_tile_stacks.yml | 7 +
Resources/Prototypes/Tiles/floors.yml | 14 ++
.../Objects/Materials/silk.rsi/icon.png | Bin 0 -> 391 bytes
.../Objects/Materials/silk.rsi/meta.json | 12 ++
.../Textures/Objects/Tiles/web.rsi/icon.png | Bin 0 -> 302 bytes
.../Textures/Objects/Tiles/web.rsi/meta.json | 14 ++
.../Structures/Furniture/Web/bed.rsi/icon.png | Bin 0 -> 491 bytes
.../Furniture/Web/bed.rsi/meta.json | 14 ++
.../Furniture/Web/chair.rsi/icon.png | Bin 0 -> 967 bytes
.../Furniture/Web/chair.rsi/meta.json | 15 ++
.../Furniture/Web/table.rsi/full.png | Bin 0 -> 566 bytes
.../Furniture/Web/table.rsi/meta.json | 163 ++++++++++++++++++
.../Furniture/Web/table.rsi/state_0.png | Bin 0 -> 780 bytes
.../Furniture/Web/table.rsi/state_1.png | Bin 0 -> 616 bytes
.../Furniture/Web/table.rsi/state_2.png | Bin 0 -> 780 bytes
.../Furniture/Web/table.rsi/state_3.png | Bin 0 -> 616 bytes
.../Furniture/Web/table.rsi/state_4.png | Bin 0 -> 652 bytes
.../Furniture/Web/table.rsi/state_5.png | Bin 0 -> 624 bytes
.../Furniture/Web/table.rsi/state_6.png | Bin 0 -> 652 bytes
.../Furniture/Web/table.rsi/state_7.png | Bin 0 -> 254 bytes
.../Structures/Walls/web.rsi/full.png | Bin 0 -> 507 bytes
.../Structures/Walls/web.rsi/meta.json | 46 +++++
.../Structures/Walls/web.rsi/wall0.png | Bin 0 -> 802 bytes
.../Structures/Walls/web.rsi/wall1.png | Bin 0 -> 596 bytes
.../Structures/Walls/web.rsi/wall2.png | Bin 0 -> 802 bytes
.../Structures/Walls/web.rsi/wall3.png | Bin 0 -> 596 bytes
.../Structures/Walls/web.rsi/wall4.png | Bin 0 -> 593 bytes
.../Structures/Walls/web.rsi/wall5.png | Bin 0 -> 697 bytes
.../Structures/Walls/web.rsi/wall6.png | Bin 0 -> 593 bytes
.../Structures/Walls/web.rsi/wall7.png | Bin 0 -> 239 bytes
Resources/Textures/Tiles/Misc/Web/meta.json | 14 ++
.../Textures/Tiles/Misc/Web/web_tile.png | Bin 0 -> 1540 bytes
58 files changed, 860 insertions(+), 62 deletions(-)
create mode 100644 Content.Server/Sericulture/SericultureComponent.cs
create mode 100644 Content.Server/Sericulture/SericultureSystem.cs
create mode 100644 Content.Shared/Sericulture/SericultureEvents.cs
create mode 100644 Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl
create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/web.yml
create mode 100644 Resources/Prototypes/Recipes/Construction/web.yml
create mode 100644 Resources/Prototypes/Recipes/Crafting/Graphs/web.yml
create mode 100644 Resources/Prototypes/Recipes/Crafting/web.yml
create mode 100644 Resources/Textures/Objects/Materials/silk.rsi/icon.png
create mode 100644 Resources/Textures/Objects/Materials/silk.rsi/meta.json
create mode 100644 Resources/Textures/Objects/Tiles/web.rsi/icon.png
create mode 100644 Resources/Textures/Objects/Tiles/web.rsi/meta.json
create mode 100644 Resources/Textures/Structures/Furniture/Web/bed.rsi/icon.png
create mode 100644 Resources/Textures/Structures/Furniture/Web/bed.rsi/meta.json
create mode 100644 Resources/Textures/Structures/Furniture/Web/chair.rsi/icon.png
create mode 100644 Resources/Textures/Structures/Furniture/Web/chair.rsi/meta.json
create mode 100644 Resources/Textures/Structures/Furniture/Web/table.rsi/full.png
create mode 100644 Resources/Textures/Structures/Furniture/Web/table.rsi/meta.json
create mode 100644 Resources/Textures/Structures/Furniture/Web/table.rsi/state_0.png
create mode 100644 Resources/Textures/Structures/Furniture/Web/table.rsi/state_1.png
create mode 100644 Resources/Textures/Structures/Furniture/Web/table.rsi/state_2.png
create mode 100644 Resources/Textures/Structures/Furniture/Web/table.rsi/state_3.png
create mode 100644 Resources/Textures/Structures/Furniture/Web/table.rsi/state_4.png
create mode 100644 Resources/Textures/Structures/Furniture/Web/table.rsi/state_5.png
create mode 100644 Resources/Textures/Structures/Furniture/Web/table.rsi/state_6.png
create mode 100644 Resources/Textures/Structures/Furniture/Web/table.rsi/state_7.png
create mode 100644 Resources/Textures/Structures/Walls/web.rsi/full.png
create mode 100644 Resources/Textures/Structures/Walls/web.rsi/meta.json
create mode 100644 Resources/Textures/Structures/Walls/web.rsi/wall0.png
create mode 100644 Resources/Textures/Structures/Walls/web.rsi/wall1.png
create mode 100644 Resources/Textures/Structures/Walls/web.rsi/wall2.png
create mode 100644 Resources/Textures/Structures/Walls/web.rsi/wall3.png
create mode 100644 Resources/Textures/Structures/Walls/web.rsi/wall4.png
create mode 100644 Resources/Textures/Structures/Walls/web.rsi/wall5.png
create mode 100644 Resources/Textures/Structures/Walls/web.rsi/wall6.png
create mode 100644 Resources/Textures/Structures/Walls/web.rsi/wall7.png
create mode 100644 Resources/Textures/Tiles/Misc/Web/meta.json
create mode 100644 Resources/Textures/Tiles/Misc/Web/web_tile.png
diff --git a/Content.Server/Sericulture/SericultureComponent.cs b/Content.Server/Sericulture/SericultureComponent.cs
new file mode 100644
index 0000000000..37da04ff13
--- /dev/null
+++ b/Content.Server/Sericulture/SericultureComponent.cs
@@ -0,0 +1,27 @@
+namespace Content.Server.Sericulture;
+
+[RegisterComponent]
+public sealed class SericultureComponent : Component
+{
+
+ [DataField("popupText")]
+ public string PopupText = "sericulture-failure-hunger";
+
+ ///
+ /// What will be produced at the end of the action.
+ ///
+ [DataField("entityProduced", required: true)]
+ public string EntityProduced = "";
+
+ [DataField("actionProto", required: true)]
+ public string ActionProto = "";
+
+ ///
+ /// How long will it take to make.
+ ///
+ [DataField("productionLength", required: true), ViewVariables(VVAccess.ReadWrite)]
+ public float ProductionLength = 0;
+
+ [DataField("hungerCost"), ViewVariables(VVAccess.ReadWrite)]
+ public float HungerCost = 0f;
+}
diff --git a/Content.Server/Sericulture/SericultureSystem.cs b/Content.Server/Sericulture/SericultureSystem.cs
new file mode 100644
index 0000000000..5eb538271e
--- /dev/null
+++ b/Content.Server/Sericulture/SericultureSystem.cs
@@ -0,0 +1,101 @@
+using Content.Server.Actions;
+using Content.Server.DoAfter;
+using Content.Server.Popups;
+using Content.Shared.Actions;
+using Content.Shared.Actions.ActionTypes;
+using Content.Shared.DoAfter;
+using Content.Shared.Nutrition.Components;
+using Content.Shared.Nutrition.EntitySystems;
+using Robust.Shared.Prototypes;
+using Content.Shared.Sericulture;
+using Content.Server.Stack;
+
+namespace Content.Server.Sericulture;
+
+public sealed class SericultureSystem : EntitySystem
+{
+ [Dependency] private readonly ActionsSystem _actionsSystem = default!;
+ [Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
+ [Dependency] private readonly IPrototypeManager _protoManager = default!;
+ [Dependency] private readonly HungerSystem _hungerSystem = default!;
+ [Dependency] private readonly PopupSystem _popupSystem = default!;
+ [Dependency] private readonly StackSystem _stackSystem = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnCompInit);
+ SubscribeLocalEvent(OnCompRemove);
+ SubscribeLocalEvent(OnSericultureStart);
+ SubscribeLocalEvent(OnSericultureDoAfter);
+ }
+
+ private void OnCompInit(EntityUid uid, SericultureComponent comp, ComponentInit args)
+ {
+ if (!_protoManager.TryIndex(comp.ActionProto, out var actionProto))
+ return;
+
+ _actionsSystem.AddAction(uid, new InstantAction(actionProto), uid);
+ }
+
+ private void OnCompRemove(EntityUid uid, SericultureComponent comp, ComponentShutdown args)
+ {
+ if (!_protoManager.TryIndex(comp.ActionProto, out var actionProto))
+ return;
+
+ _actionsSystem.RemoveAction(uid, new InstantAction(actionProto));
+ }
+
+ private void OnSericultureStart(EntityUid uid, SericultureComponent comp, SericultureActionEvent args)
+ {
+ if (IsHungry(uid))
+ {
+ _popupSystem.PopupEntity(Loc.GetString(comp.PopupText), uid, uid);
+ return;
+ }
+
+ var doAfter = new DoAfterArgs(uid, comp.ProductionLength, new SericultureDoAfterEvent(), uid)
+ {
+ BreakOnUserMove = true,
+ BlockDuplicate = true,
+ BreakOnDamage = true,
+ CancelDuplicate = true,
+ };
+
+ _doAfterSystem.TryStartDoAfter(doAfter);
+ }
+
+ private void OnSericultureDoAfter(EntityUid uid, SericultureComponent comp, SericultureDoAfterEvent args)
+ {
+ if (args.Cancelled || args.Handled || comp.Deleted)
+ return;
+
+ if (IsHungry(uid))
+ {
+ _popupSystem.PopupEntity(Loc.GetString(comp.PopupText), uid, uid);
+ return;
+ }
+
+ _hungerSystem.ModifyHunger(uid, -comp.HungerCost);
+
+ var newEntity = Spawn(comp.EntityProduced, Transform(uid).Coordinates);
+
+ _stackSystem.TryMergeToHands(newEntity, uid);
+
+ args.Repeat = true;
+ }
+
+ private bool IsHungry(EntityUid uid, HungerComponent? comp = null)
+ {
+ if (!Resolve(uid, ref comp))
+ return false;
+
+ if (_hungerSystem.GetHungerThreshold(comp) <= HungerThreshold.Peckish)
+ return true;
+
+ return false;
+ }
+
+ public sealed class SericultureActionEvent : InstantActionEvent { }
+}
diff --git a/Content.Shared/Sericulture/SericultureEvents.cs b/Content.Shared/Sericulture/SericultureEvents.cs
new file mode 100644
index 0000000000..cf8e1063f6
--- /dev/null
+++ b/Content.Shared/Sericulture/SericultureEvents.cs
@@ -0,0 +1,7 @@
+using Content.Shared.DoAfter;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Sericulture;
+
+[Serializable, NetSerializable]
+public sealed class SericultureDoAfterEvent : SimpleDoAfterEvent { }
diff --git a/Resources/Locale/en-US/actions/actions/spider.ftl b/Resources/Locale/en-US/actions/actions/spider.ftl
index 3fc482ce3e..f74e8db737 100644
--- a/Resources/Locale/en-US/actions/actions/spider.ftl
+++ b/Resources/Locale/en-US/actions/actions/spider.ftl
@@ -2,4 +2,8 @@ spider-web-action-name = Spider Web
spider-web-action-description = Spawns a web that slows your prey down.
spider-web-action-nogrid = There is no floor under you!
spider-web-action-success = You place webs around you.
-spider-web-action-fail = You can't place webs here! All cardinal directions already have webs!
\ No newline at end of file
+spider-web-action-fail = You can't place webs here! All cardinal directions already have webs!
+
+sericulture-action-name = Weave silk
+sericulture-action-description = Weave a bit of silk for use in arts and crafts.
+sericulture-failure-hunger = Your stomach is too empty to make any more webs!
diff --git a/Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl b/Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl
new file mode 100644
index 0000000000..646d89ca5e
--- /dev/null
+++ b/Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl
@@ -0,0 +1 @@
+construction-step-condition-crafter-whitelist = You need to meet certain requirements.
diff --git a/Resources/Locale/en-US/tiles/tiles.ftl b/Resources/Locale/en-US/tiles/tiles.ftl
index 96db8fde57..973033ce02 100644
--- a/Resources/Locale/en-US/tiles/tiles.ftl
+++ b/Resources/Locale/en-US/tiles/tiles.ftl
@@ -100,4 +100,5 @@ tiles-basalt-floor = basalt floor
tiles-snow-floor = snow floor
tiles-wood3 = wood broken floor
tiles-hull = exterior hull plating
-tiles-hull-reinforced = exterior reinforced hull plating
\ No newline at end of file
+tiles-hull-reinforced = exterior reinforced hull plating
+tiles-web = web tile
diff --git a/Resources/Prototypes/Actions/spider.yml b/Resources/Prototypes/Actions/spider.yml
index 8a5ee0e52d..988b9a3f8d 100644
--- a/Resources/Prototypes/Actions/spider.yml
+++ b/Resources/Prototypes/Actions/spider.yml
@@ -5,3 +5,11 @@
description: spider-web-action-description
serverEvent: !type:SpiderWebActionEvent
useDelay: 25
+
+- type: instantAction
+ id: SericultureAction
+ icon: Interface/Actions/web.png
+ name: sericulture-action-name
+ description: sericulture-action-description
+ serverEvent: !type:SericultureActionEvent
+ useDelay: 1
diff --git a/Resources/Prototypes/Body/Parts/arachnid.yml b/Resources/Prototypes/Body/Parts/arachnid.yml
index dbb656cc18..9c95d1d15a 100644
--- a/Resources/Prototypes/Body/Parts/arachnid.yml
+++ b/Resources/Prototypes/Body/Parts/arachnid.yml
@@ -91,8 +91,6 @@
sprite: Mobs/Species/Arachnid/parts.rsi
state: "l_leg"
- type: MovementBodyPart
- walkSpeed: 3.0
- sprintSpeed: 5.0
- type: entity
id: RightLegArachnid
@@ -103,8 +101,6 @@
sprite: Mobs/Species/Arachnid/parts.rsi
state: "r_leg"
- type: MovementBodyPart
- walkSpeed: 3.0
- sprintSpeed: 5.0
- type: entity
id: LeftFootArachnid
diff --git a/Resources/Prototypes/Body/Prototypes/arachnid.yml b/Resources/Prototypes/Body/Prototypes/arachnid.yml
index 0c57d3a199..60a83500af 100644
--- a/Resources/Prototypes/Body/Prototypes/arachnid.yml
+++ b/Resources/Prototypes/Body/Prototypes/arachnid.yml
@@ -27,14 +27,20 @@
part: RightArmArachnid
connections:
- right hand
+ - secondary right hand
left arm:
part: LeftArmArachnid
connections:
- left hand
+ - secondary left hand
right hand:
part: RightHandArachnid
left hand:
part: LeftHandArachnid
+ secondary right hand:
+ part: RightHandArachnid
+ secondary left hand:
+ part: LeftHandArachnid
right leg:
part: RightLegArachnid
connections:
diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml
index 1a425226a0..47fc03fb33 100644
--- a/Resources/Prototypes/Damage/modifier_sets.yml
+++ b/Resources/Prototypes/Damage/modifier_sets.yml
@@ -91,6 +91,14 @@
flatReductions:
Blunt: 5
+- type: damageModifierSet
+ 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
+ Piercing: 0.7
+ Heat: 3.0
+
- type: damageModifierSet
id: Slime
coefficients:
@@ -131,13 +139,10 @@
Shock: 1.2
- type: damageModifierSet
- id: Arachnid # Don't do too well with high temperatures, venomous (well some kinds anyways) and have an exo-skeleton (so probably harder to stab but easier to... break?)
+ id: Arachnid # Exo-skeleton, should have simillarities to skeleton resistances.
coefficients:
- Blunt: 1.15
- Piercing: 1.15
- Slash: 0.85
- Heat: 1.25
- Poison: 0.8
+ Blunt: 1.1
+ Heat: 1.5
- type: damageModifierSet
id: Moth # Slightly worse at everything but cold
diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml
index 5ab7e4b9c3..dc6009c561 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml
@@ -7,7 +7,7 @@
- type: Respirator
damage:
types:
- Asphyxiation: 2 # Make sure you have O2 on you at all times
+ Asphyxiation: 1.5 # Make sure you have O2 on you at all times
damageRecovery:
types:
Asphyxiation: -0.5 # Recovery will suck without chems
\ No newline at end of file
diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml
index 35c202be7f..32bf10ba5d 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml
@@ -6,50 +6,40 @@
abstract: true
components:
# The important nessessities
- - type: MovementSpeedModifier
- baseWalkSpeed: 3.0
- baseSprintSpeed: 5.0
- type: Body
prototype: Arachnid
requiredLegs: 2
- type: Perishable
- type: HumanoidAppearance
species: Arachnid
- - type: Damageable
- damageContainer: Biological
- damageModifierSet: Arachnid # spooder
- type: Hunger
- starvationDamage:
+ baseDecayRate: 0.0125
+ starvationDamage: # Not sure if this should be changed.
types:
Cold: 0.5
Bloodloss: 0.5
- type: Thirst
- - type: Icon
- sprite: Mobs/Species/Arachnid/parts.rsi
- state: full
- # Damage and speed
+ baseDecayRate: 0.0125
+ # Damage (Self)
+ - type: Damageable
+ damageContainer: Biological
+ damageModifierSet: Arachnid
- type: Bloodstream
bloodReagent: SpiderBlood
- - type: Temperature
- heatDamageThreshold: 400
- coldDamageThreshold: 285
- currentTemperature: 310.15
- specificHeat: 46
- coldDamage:
- types:
- Cold : 0.2 #per second, scales with temperature & other constants
- heatDamage:
- types:
- Heat : 0.1 #per second, scales with temperature & other constants
- - type: Barotrauma
+ # Damage (Others)
+ - type: MeleeWeapon
+ animation: WeaponArcClaw
+ soundHit:
+ collection: AlienClaw
damage:
- types:
- Blunt: 0.20 #per second, scales with pressure and other constants.
- - type: SlowOnDamage
- speedModifierThresholds: # This is an ouch, but it does make up for their extra speed
- 65: 0.7
- 80: 0.4
- # Misc
+ types: # Realisically this is more like 5 slash
+ Slash: 4
+ # Visual & Audio
+ - type: DamageVisuals
+ damageOverlayGroups:
+ Brute:
+ sprite: Mobs/Effects/brute_damage.rsi
+ color: "#162581"
- type: Speech
speechSounds: Arachnid
- type: Vocal
@@ -57,20 +47,66 @@
Male: UnisexArachnid
Female: UnisexArachnid
Unsexed: UnisexArachnid
- - type: Inventory
- templateId: arachnid
- - type: MeleeWeapon
- hidden: true
- soundHit:
- path: /Audio/Weapons/pierce.ogg
- angle: 30
- animation: WeaponArcClaw
- attackRate: 1.5
- damage:
- types:
- # Actually does 3 + 1 damage due to +25% damage bonus on all single target melee attacks
- Slash: 2.4
- Poison: 0.8
+ - type: Sprite
+ noRot: true
+ drawdepth: Mobs
+ layers:
+ - map: [ "enum.HumanoidVisualLayers.Chest" ]
+ - map: [ "enum.HumanoidVisualLayers.Head" ]
+ - map: [ "enum.HumanoidVisualLayers.Snout" ]
+ - map: [ "enum.HumanoidVisualLayers.Eyes" ]
+ - map: [ "enum.HumanoidVisualLayers.RArm" ]
+ - map: [ "enum.HumanoidVisualLayers.LArm" ]
+ - map: [ "enum.HumanoidVisualLayers.RLeg" ]
+ - map: [ "enum.HumanoidVisualLayers.LLeg" ]
+ - shader: StencilClear
+ sprite: Mobs/Species/Human/parts.rsi #PJB on stencil clear being on the left leg: "...this is 'fine'" -https://github.com/space-wizards/space-station-14/pull/12217#issuecomment-1291677115
+ # its fine, but its still very stupid that it has to be done like this instead of allowing sprites to just directly insert a stencil clear.
+ # sprite refactor when
+ state: l_leg
+ - shader: StencilMask
+ map: ["enum.HumanoidVisualLayers.StencilMask"]
+ sprite: Mobs/Customization/masking_helpers.rsi
+ state: unisex_full
+ visible: false
+ - map: ["jumpsuit"]
+ - map: ["enum.HumanoidVisualLayers.LFoot"]
+ - map: ["enum.HumanoidVisualLayers.RFoot"]
+ - map: ["enum.HumanoidVisualLayers.LHand"]
+ - map: ["enum.HumanoidVisualLayers.RHand"]
+ - map: [ "id" ]
+ - map: [ "gloves" ]
+ - map: [ "shoes" ]
+ - map: [ "ears" ]
+ - map: [ "outerClothing" ]
+ - map: [ "eyes" ]
+ - map: [ "belt" ]
+ - map: [ "enum.HumanoidVisualLayers.Tail" ] # Better here?
+ - map: [ "neck" ]
+ - map: [ "back" ]
+ - map: [ "enum.HumanoidVisualLayers.FacialHair" ]
+ - map: [ "enum.HumanoidVisualLayers.Hair" ]
+ - map: [ "enum.HumanoidVisualLayers.HeadSide" ]
+ - map: [ "enum.HumanoidVisualLayers.HeadTop" ]
+ - map: [ "mask" ]
+ - map: [ "head" ]
+ - map: [ "pocket1" ]
+ - map: [ "pocket2" ]
+ - map: ["enum.HumanoidVisualLayers.Handcuffs"]
+ color: "#ffffff"
+ sprite: Objects/Misc/handcuffs.rsi
+ state: body-overlay-2
+ visible: false
+ - map: [ "clownedon" ] # Dynamically generated
+ sprite: "Effects/creampie.rsi"
+ state: "creampie_human"
+ visible: false
+ # Misc
+ - type: Sericulture
+ actionProto: SericultureAction
+ productionLength: 3
+ entityProduced: MaterialWebSilk1
+ hungerCost: 5
- type: Butcherable
butcheringType: Spike
spawned:
diff --git a/Resources/Prototypes/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Entities/Objects/Materials/materials.yml
index eb28eb5729..05961b355e 100644
--- a/Resources/Prototypes/Entities/Objects/Materials/materials.yml
+++ b/Resources/Prototypes/Entities/Objects/Materials/materials.yml
@@ -127,7 +127,7 @@
- ReagentId: Fiber
Quantity: 5
- type: Tag
- tags:
+ tags:
- ClothMade
- DroneUsable
- Gauze
@@ -193,7 +193,7 @@
- ReagentId: Fiber
Quantity: 5
- type: Tag
- tags:
+ tags:
- ClothMade
- DroneUsable
- RawMaterial
@@ -372,7 +372,7 @@
- ReagentId: Fiber
Quantity: 5
- type: Tag
- tags:
+ tags:
- ClothMade
- DroneUsable
- RawMaterial
@@ -453,3 +453,42 @@
count: 1
- type: Item
size: 2
+
+- type: entity
+ parent: MaterialBase
+ id: MaterialWebSilk
+ name: silk
+ description: A webby material
+ suffix: Full
+ components:
+ - type: PhysicalComposition
+ materialComposition:
+ WebSilk: 100
+ - type: Sprite
+ sprite: Objects/Materials/silk.rsi
+ state: icon
+ - type: Stack
+ count: 50
+ stackType: WebSilk
+ - type: Item
+ size: 50
+
+- type: entity
+ parent: MaterialWebSilk
+ id: MaterialWebSilk25
+ suffix: 25
+ components:
+ - type: Stack
+ count: 25
+ - type: Item
+ size: 25
+
+- type: entity
+ parent: MaterialWebSilk
+ id: MaterialWebSilk1
+ suffix: 1
+ components:
+ - type: Stack
+ count: 1
+ - type: Item
+ size: 1
diff --git a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml
index d0178e70c3..0cba7656cb 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml
@@ -49,6 +49,11 @@
behaviors:
- !type:DoActsBehavior
acts: [ "Destruction" ]
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ MaterialWebSilk:
+ min: 0
+ max: 1
- type: Temperature
heatDamage:
types:
diff --git a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml
index 819748d58b..f13bb59e67 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml
@@ -810,3 +810,19 @@
- type: Stack
stackType: FloorTileGratingMaint
+- type: entity
+ name: web tile
+ parent: FloorTileItemBase
+ id: FloorTileItemWeb
+ components:
+ - type: Sprite
+ sprite: Objects/Tiles/web.rsi
+ state: icon
+ - type: FloorTile
+ outputs:
+ - FloorWebTile
+ - type: Stack
+ stackType: FloorTileWeb
+ - type: Construction
+ graph: TileWeb
+ node: webtile
diff --git a/Resources/Prototypes/Entities/Structures/Furniture/Tables/tables.yml b/Resources/Prototypes/Entities/Structures/Furniture/Tables/tables.yml
index bf061c4a74..301b37205c 100644
--- a/Resources/Prototypes/Entities/Structures/Furniture/Tables/tables.yml
+++ b/Resources/Prototypes/Entities/Structures/Furniture/Tables/tables.yml
@@ -478,6 +478,35 @@
- !type:DoActsBehavior
acts: [ "Destruction" ]
+- type: entity
+ id: TableWeb
+ parent: TableBase
+ name: web table
+ description: Really smooth and surprisingly durable.
+ components:
+ - type: Damageable
+ damageModifierSet: Web
+ - type: Sprite
+ sprite: Structures/Furniture/Web/table.rsi
+ - type: Icon
+ sprite: Structures/Furniture/Web/table.rsi
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 50
+ behaviors:
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - type: MeleeSound
+ soundGroups:
+ Brute:
+ path:
+ "/Audio/Weapons/slash.ogg"
+ - type: Construction
+ graph: TableWeb
+ node: table
+
- type: entity
id: TableDebug
parent: TableBase
diff --git a/Resources/Prototypes/Entities/Structures/Furniture/beds.yml b/Resources/Prototypes/Entities/Structures/Furniture/beds.yml
index 1d37ada25e..3c578192bb 100644
--- a/Resources/Prototypes/Entities/Structures/Furniture/beds.yml
+++ b/Resources/Prototypes/Entities/Structures/Furniture/beds.yml
@@ -122,3 +122,31 @@
state: mattress
- type: Damageable
damageModifierSet: Inflatable
+
+- type: entity
+ parent: Bed
+ id: WebBed
+ name: web bed
+ description: You got webbed.
+ components:
+ - type: Damageable
+ damageModifierSet: Web
+ - type: Sprite
+ sprite: Structures/Furniture/Web/bed.rsi
+ state: icon
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 50
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:PlaySoundBehavior
+ sound:
+ path: /Audio/Effects/woodhit.ogg
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ MaterialWebSilk:
+ min: 1
+ max: 1
diff --git a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
index 3afaaea408..4e84f1fbee 100644
--- a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
+++ b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
@@ -247,6 +247,45 @@
graph: RitualSeat
node: chairCursed
+- type: entity
+ name: web chair
+ id: WebChair
+ description: For true web developers.
+ parent: SeatBase
+ components:
+ - type: Transform
+ anchored: true
+ - type: Physics
+ bodyType: Static
+ - type: Anchorable
+ - type: Rotatable
+ - type: Sprite
+ sprite: Structures/Furniture/Web/chair.rsi
+ state: icon
+ - type: MeleeSound
+ soundGroups:
+ Brute:
+ path:
+ "/Audio/Weapons/slash.ogg"
+ - type: Damageable
+ damageModifierSet: Web
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 50
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:PlaySoundBehavior
+ sound:
+ path: /Audio/Effects/woodhit.ogg
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ MaterialWebSilk:
+ min: 1
+ max: 1
+
- type: entity
parent: [SeatBase, BaseFoldable]
id: ChairFolding
diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml
index 4da0c57273..aef2d6c3bf 100644
--- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml
+++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml
@@ -927,6 +927,48 @@
key: walls
base: wood
+- type: entity
+ parent: BaseWall
+ id: WallWeb
+ name: web wall
+ description: Keeps the spiders in and the greytide out.
+ components:
+ - type: Clickable
+ - type: MeleeSound
+ soundGroups:
+ Brute:
+ path:
+ "/Audio/Weapons/slash.ogg"
+ - type: Damageable
+ damageModifierSet: Web
+ - type: Tag
+ tags:
+ - Wall
+ - RCDDeconstructWhitelist
+ - type: Sprite
+ sprite: Structures/Walls/web.rsi
+ - type: Icon
+ sprite: Structures/Walls/web.rsi
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 30
+ behaviors:
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ MaterialWebSilk:
+ min: 1
+ max: 1
+ - type: IconSmooth
+ key: walls
+ base: wall
+ - type: Construction
+ graph: WallWeb
+ node: wall
+
# Vault Walls
@@ -975,7 +1017,6 @@
sprite: Structures/Walls/vault.rsi
state: sandstonevault
-
# Mime
- type: entity
diff --git a/Resources/Prototypes/Reagents/Materials/materials.yml b/Resources/Prototypes/Reagents/Materials/materials.yml
index f3ddc4d082..1c4b00b906 100644
--- a/Resources/Prototypes/Reagents/Materials/materials.yml
+++ b/Resources/Prototypes/Reagents/Materials/materials.yml
@@ -76,3 +76,10 @@
icon: { sprite: Objects/Materials/Sheets/meaterial.rsi, state: meat }
color: "#c53648"
price: 0.05
+
+- type: material
+ id: WebSilk
+ name: materials-web
+ icon: { sprite: Objects/Materials/silk.rsi, state: icon }
+ color: "#eeeeee" #eeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+ price: 0 # Maybe better for it to be priceless, knowing how greedy cargo is.
diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/web.yml b/Resources/Prototypes/Recipes/Construction/Graphs/web.yml
new file mode 100644
index 0000000000..0a9186207e
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Construction/Graphs/web.yml
@@ -0,0 +1,35 @@
+- type: constructionGraph
+ id: WallWeb
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: wall
+ completed:
+ - !type:SnapToGrid
+ southRotation: true
+ steps:
+ - material: WebSilk
+ amount: 4
+ doAfter: 3
+
+ - node: wall
+ entity: WallWeb
+
+- type: constructionGraph
+ id: TableWeb
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: table
+ completed:
+ - !type:SnapToGrid
+ southRotation: true
+ steps:
+ - material: WebSilk
+ amount: 4
+ doAfter: 3
+
+ - node: table
+ entity: TableWeb
diff --git a/Resources/Prototypes/Recipes/Construction/web.yml b/Resources/Prototypes/Recipes/Construction/web.yml
new file mode 100644
index 0000000000..3d0f9cf484
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Construction/web.yml
@@ -0,0 +1,35 @@
+- type: construction
+ name: web wall
+ id: WallWeb
+ graph: WallWeb
+ startNode: start
+ targetNode: wall
+ category: construction-category-structures
+ description: A fairly weak yet silky smooth wall.
+ icon:
+ sprite: /Textures/Structures/Walls/web.rsi
+ state: full
+ objectType: Structure
+ placementMode: SnapgridCenter
+ canRotate: false
+ canBuildInImpassable: false
+ conditions:
+ - !type:TileNotBlocked
+
+- type: construction
+ name: web table
+ id: TableWeb
+ graph: TableWeb
+ startNode: start
+ targetNode: table
+ category: construction-category-structures
+ description: Essential for any serious web development.
+ icon:
+ sprite: /Textures/Structures/Furniture/Web/table.rsi
+ state: full
+ objectType: Structure
+ placementMode: SnapgridCenter
+ canRotate: false
+ canBuildInImpassable: false
+ conditions:
+ - !type:TileNotBlocked
diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/tiles.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/tiles.yml
index caff139192..ad62fc08fb 100644
--- a/Resources/Prototypes/Recipes/Crafting/Graphs/tiles.yml
+++ b/Resources/Prototypes/Recipes/Crafting/Graphs/tiles.yml
@@ -9,7 +9,7 @@
- !type:SetStackCount
amount: 4
steps:
- - material: Steel
+ - material: WebSilk
amount: 1
- node: steeltile
entity: FloorTileItemSteel
diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml
new file mode 100644
index 0000000000..13aa4eb6b4
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml
@@ -0,0 +1,15 @@
+- type: constructionGraph
+ id: TileWeb
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: webtile
+ completed:
+ - !type:SetStackCount
+ amount: 2
+ steps:
+ - material: WebSilk
+ amount: 1
+ - node: webtile
+ entity: FloorTileItemWeb
diff --git a/Resources/Prototypes/Recipes/Crafting/web.yml b/Resources/Prototypes/Recipes/Crafting/web.yml
new file mode 100644
index 0000000000..0747806de2
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Crafting/web.yml
@@ -0,0 +1,10 @@
+- type: construction
+ name: web tile
+ id: TileWeb
+ graph: TileWeb
+ startNode: start
+ targetNode: webtile
+ category: construction-category-tiles
+ description: "Nice and smooth."
+ icon: { sprite: Objects/Tiles/web.rsi, state: icon }
+ objectType: Item
diff --git a/Resources/Prototypes/Stacks/Materials/materials.yml b/Resources/Prototypes/Stacks/Materials/materials.yml
index f48cc49863..283c64a10b 100644
--- a/Resources/Prototypes/Stacks/Materials/materials.yml
+++ b/Resources/Prototypes/Stacks/Materials/materials.yml
@@ -69,3 +69,11 @@
spawn: MaterialSheetMeat1
maxCount: 30
itemSize: 1
+
+- type: stack
+ id: WebSilk
+ name: silk
+ icon: { sprite: /Textures/Objects/Materials/silk.rsi, state: icon }
+ spawn: MaterialWebSilk1
+ maxCount: 50
+ itemSize: 1
diff --git a/Resources/Prototypes/Stacks/floor_tile_stacks.yml b/Resources/Prototypes/Stacks/floor_tile_stacks.yml
index deb212f3ad..5b69430500 100644
--- a/Resources/Prototypes/Stacks/floor_tile_stacks.yml
+++ b/Resources/Prototypes/Stacks/floor_tile_stacks.yml
@@ -368,3 +368,10 @@
spawn: FloorTileItemGratingMaint
maxCount: 30
itemSize: 5
+
+- type: stack
+ id: FloorTileWeb
+ name: web tile
+ spawn: FloorTileItemWeb
+ maxCount: 30
+ itemSize: 5
diff --git a/Resources/Prototypes/Tiles/floors.yml b/Resources/Prototypes/Tiles/floors.yml
index 7e76b18599..6efef85de8 100644
--- a/Resources/Prototypes/Tiles/floors.yml
+++ b/Resources/Prototypes/Tiles/floors.yml
@@ -1438,6 +1438,20 @@
itemDrop: MaterialWoodPlank1
heatCapacity: 10000
+- type: tile
+ id: FloorWebTile
+ name: tiles-web
+ sprite: /Textures/Tiles/Misc/Web/web_tile.png
+ baseTurf: Plating
+ isSubfloor: false
+ canCrowbar: true
+ footstepSounds:
+ collection: FootstepCarpet
+ barestepSounds:
+ collection: BarestepCarpet
+ itemDrop: FloorTileItemWeb
+ heatCapacity: 10000
+
#Hull tiles
- type: tile
id: FloorHull
diff --git a/Resources/Textures/Objects/Materials/silk.rsi/icon.png b/Resources/Textures/Objects/Materials/silk.rsi/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..648f370a54048c8d88f5c473215c1f3cabd4c1ad
GIT binary patch
literal 391
zcmV;20eJq2P)lH#(-9!WcO8vEG5joV32pCeluIpxI5D_qQ0g!=%14TqKGlPh*
zEXz>ut^)vIW+0+Q9$au@0LaW-_OVP0aNEtS5K#v3%LOL}03ym}c8KH80-W3l-HB%i
zlV@fg7SVNJZ+mc}Mc|WT7e}u*0DO-WMIiuM9Musge-=*{rzcfaw==t|2)`Alv3T9p
zez?3UHA9~$P8JxR*F;AHs}06Coe=14_bN>dJ`
zlpf67roUP;;ffBEcLhWd;k3s%8etVth-jD`_y_NT?jBIp&70LT5tmGJVsE>uZX+&y
l{Ci*u@Ax9RapT6v@dM#eCDSh>)QbQB002ovPDHLkV1m%dplSdB
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Materials/silk.rsi/meta.json b/Resources/Textures/Objects/Materials/silk.rsi/meta.json
new file mode 100644
index 0000000000..5ac5189bae
--- /dev/null
+++ b/Resources/Textures/Objects/Materials/silk.rsi/meta.json
@@ -0,0 +1,12 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Made by PixelTheKermit (github) for SS14",
+ "size": {"x": 32, "y": 32},
+ "states":
+ [
+ {
+ "name": "icon"
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Tiles/web.rsi/icon.png b/Resources/Textures/Objects/Tiles/web.rsi/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e039f001337155981104526bdb1bb229402510b2
GIT binary patch
literal 302
zcmV+}0nz@6P)Nkl%
zB>(`Dl?W?vB=Qsi0O?A2rmdMf_omtKs)T2*s@Y~dT>!vmC73zcptWST$hxlEkJrQvap0d|2N!Jp1**!Qj_qgd3;0@>9PDIs*PKu^&7&hEb
z&w(&==l#8>5>*0@wp!^fsNwS4@bdqG!C-JXPi$(qY*U8I8UO$Q07*qoM6N<$f(o92
Ap#T5?
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Tiles/web.rsi/meta.json b/Resources/Textures/Objects/Tiles/web.rsi/meta.json
new file mode 100644
index 0000000000..3be76cef96
--- /dev/null
+++ b/Resources/Textures/Objects/Tiles/web.rsi/meta.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Made by PixelTheKermit (github) for SS14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ }
+ ]
+}
diff --git a/Resources/Textures/Structures/Furniture/Web/bed.rsi/icon.png b/Resources/Textures/Structures/Furniture/Web/bed.rsi/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..18aef2ee51ab269a3640fd28d63135c686b22a93
GIT binary patch
literal 491
zcmVP0#sJVkDu(Go-Ha0?NoMI?V#yFFhAX}`=f{wdc
z7OLfKhIgKCe)#4OXw|A!t5&W4yR4=M5JF@{-|zQJV_K%5Iwhq9=N!K80|2_+ZfO#>
z5F(4?7`NLEaU6pXf})pFq6!C~%Up~x5JE~nYzZMULWmAhO2Kg)?eF(HY}@`dPtz2H
z5F;;U!3KaZ455@l7=~~hr{u5KYbBodYvM)OMU$^nUOuZXZkzyP42-dt@2dP+rZ&K1
z4@fC>MX%Sx<#PG6cU>1!N+VCxRPTWf0C3KAfaiH79|S=qJ|2(3IX80Gb+zvRUu#oL
zQE|Ph@Vq{XA}FOa_dKr@W1AZ0`fg2s;)lZl>-GADE2WSmiS{q|K-F{q%%dm*@Ocv!
zQ$8FHaXz0B1i|MXNRkBm{T{yWgE5BLY=-T2tNmm$!SQ&kjSmKcQl@O6`E&n{1As*-
z&F1s@+khst*=(>}E-m2k8d6Fddksy>2L~R<5C9g71$Mg~PN!2Tpbk+=v(adT>2!+K
hYV|&-$xOWK{{yNloh=B$cnAOh002ovPDHLkV1h=<)kFXQ
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Furniture/Web/bed.rsi/meta.json b/Resources/Textures/Structures/Furniture/Web/bed.rsi/meta.json
new file mode 100644
index 0000000000..0699682b97
--- /dev/null
+++ b/Resources/Textures/Structures/Furniture/Web/bed.rsi/meta.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "",
+ "states": [
+ {
+ "name": "icon"
+ }
+ ]
+}
diff --git a/Resources/Textures/Structures/Furniture/Web/chair.rsi/icon.png b/Resources/Textures/Structures/Furniture/Web/chair.rsi/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1fb28b09d0760a26b589a5d4507881daa3ecdbd
GIT binary patch
literal 967
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
KMNUMnLSTZGvK^cN
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Furniture/Web/table.rsi/state_6.png b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..786e798c3ea02cced3480498d93c05b6ad4db89c
GIT binary patch
literal 652
zcmV;70(1R|P)L_tL=s&tW%`2BQ9?ov^OhR#idD9ILkv&x~%Zk(|_Bi653A>r8b
zJTV?8n}JE+_pJ6=mH_~|uIrnoL0Oh)+jjJCRaO7AU$560r~d_~@jH+NNDn|7RRYSg
zgfS*+pQ;1^Kv5J?MW_=%#1f%a06`+!wheN9^#VepUVydsYaxj`ww*FqdDS0ZD-L0Hld3z!(#3OFNe+
z0x0mJC}MQyL{I^m11J83xM;}g%{OTg3~^D~@K|d@T;3}|GoY?(^&+C&0-8lcT?0sj
zCek7(JpgHby#V%k0GD(gAPjpe{CXlZ1JNvG3uu}K0G#*!^mBMT9=Stc!4^P)8)GI{
zeb(CO=l^4{1<*{=Q(V_}+wGP+1Qy;h0GO5qnr0vHm;u1_EEu+Vs|*0X&jM|;4|vW1
z;O8uO{r=l!0D#f=dbG_x5Fi5pjNStO`>u2bcz-tN%4)S@jUm+nOp*ZU0Z7AM1iA0)
z-)^@)&-1UM3K%b}hKp!bRk+{p0COD^KM?7A`xh5*xm>W{?`OB=A}(OLT;h7Y&Th*^T)=L(1Mqn(xbS>Fz4R|GfC4`p
m4o*9|^ZCquAd^TW68Hd;CH}ilfN-7w0000V7P5FAI8bbNpZT<53z9d!4At=!SkJ4G~?%^u5{$d{zZNGD`rc83{Q;Bvd&9srP1
zLe3d6Mzq!-B6uZi>{=@TAoP-Rz^l<(LyU2YU28?q$pLKbnb0II_xt^!lTv{*lj~f8
zvg>wTS2qB?^N><<`<7+d$+}#{0_Xe!-?ts)*6C{>;`Ei?2ND1>ySVx<;(As
zk~<+0`PcIvmo()?5
zBiW}3SUY-K)%J~K9}>_q+w*{uw${2kN4FY`)g$#bVpnU0h-{vZ%C+s&NkG?7#p3
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Walls/web.rsi/meta.json b/Resources/Textures/Structures/Walls/web.rsi/meta.json
new file mode 100644
index 0000000000..f30b2eba61
--- /dev/null
+++ b/Resources/Textures/Structures/Walls/web.rsi/meta.json
@@ -0,0 +1,46 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "",
+ "states": [
+ {
+ "name": "wall0",
+ "directions": 4
+ },
+ {
+ "name": "wall1",
+ "directions": 4
+ },
+ {
+ "name": "wall2",
+ "directions": 4
+ },
+ {
+ "name": "wall3",
+ "directions": 4
+ },
+ {
+ "name": "wall4",
+ "directions": 4
+ },
+ {
+ "name": "wall5",
+ "directions": 4
+ },
+ {
+ "name": "wall6",
+ "directions": 4
+ },
+ {
+ "name": "wall7",
+ "directions": 4
+ },
+ {
+ "name": "full"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/Structures/Walls/web.rsi/wall0.png b/Resources/Textures/Structures/Walls/web.rsi/wall0.png
new file mode 100644
index 0000000000000000000000000000000000000000..12426cbb8ef7c2e8ab1fca8f4655c45d696d507f
GIT binary patch
literal 802
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
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Walls/web.rsi/wall5.png b/Resources/Textures/Structures/Walls/web.rsi/wall5.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b1cb7cd0cc42ff58bf3002612ba7c07e79201fe
GIT binary patch
literal 697
zcmV;q0!ICbP)1
zF_I%84D7wyka98~-~nVjz;B<#8QDBwK0x9k-wUqT!x+4?i=bJ%BYVnKlzJptEr~af
zak*SRwAN5cA%pXngu!m&N=G&bOM%TxqIfl2LM=WvG04=^XUY9l>}2VwrztkMl@{b1e8L+T087~
zIsv5+*!TVO&G!bKfFpH4ER=eHPC)HnAPs|95lY8D05p}661ZNkAEoEpw%vTsjh8Bg
z=^jvfqsEv+ziS1ZfEpedESV4J1hBOLT@A9)oCIr0>?m53SSw!M14MHGTiX5vVg%&I
z=gDnWa=QErD5Z*p%#08xAR6zzzbR+eb(KC!1fm2)<73&HHZw*_-0z@E2t?yYN!k{4
zuLN^dHyehO!Z8$P3cczz{JMm0@WR%0`!dKx%YMbaC5j
zHVg@YX!vaI4-67Rz&{Uo`Vfdn6=1}S?hkb82W;C0rPPhlGrB(@I2y}m_ea~}?9o`a
zrs$~oek;TXh|A6qvl^U3ybkznczHQI?UK|{{QCO>Y|wXvev&MoYDubwNBadK1Thlm
z1k?=qYEe=ObOLI71F4qC$L^A#6HuEJr7d%5@t2`CLrt+m6N
zD0Bi!ArRm6h#mr+fRbCM4bEnRoy;w!FW*dE)_?vav+$>Ez0$rg3$^ool`+mJ<8;beuWkT)@mY
zjxVh>hG9UA5#D=ftuaj#lv1nD#u&sH0RY1=006Gn>xFXt5Bd;}O&7o&05{?Ugb?7p
zhqboJ^~4ES(n5x40ZT#%aL#>K|56-AKrOle?f|$sjDU0{SPIbsmP_GUh!fCa&`ZP#
zXiXQu9RN3^UK#+N&*uxks!w;$A%p;HExh-u&uQ;}zu(C*P&j=CbOGD}aMMJfUVI$K7v=Zd&jUWGC(v3K2!ju@fYN()tsx62y;0E`vH>iAtJC~Ym!yaq_C
z8Ds(J4$ixm8Cvc5?1d~KP3hmB0x6}=Jq4ttKTu%`0QqSkE&YKCQvleW1`^XBD7ZD2
z;+$I@8)G(qPkq&uO0|VhI$)^_CbEDWQU{!J`d*+v58w_US48*H|1UtKS`pj}cd=v_
zkRvUwwM4NC$lXQuE~Kci3rGh#lP;xm-=o4VV5@bu)^2u=HJT~*+u-Bz_;DLdAG6JD
zNx9u_q%p8(z}8?}zG1>HARTNj{bx!~194Lzm;N)UoPRe3TEAc=E(89`;WL1{on{ws
f`d;8&(W}iDw6@;T^(6nO00000NkvXXu0mjfBasD`
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Walls/web.rsi/wall7.png b/Resources/Textures/Structures/Walls/web.rsi/wall7.png
new file mode 100644
index 0000000000000000000000000000000000000000..9cd950af77b2cef05ffa2e85b45574ef94c2a281
GIT binary patch
literal 239
zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=+dN$yLn`LHy>*b&*^uWzz<<68
zf1jUWdMjXO^J4ltHpLpllg2Zu-E!
z=zlt$QVzoq-}kXBOa9!KTCGN!rktOj(`vN{!;pHtUeKx6>x5xQtJUKC{G2pRsnu!)
zoqhizsA{!}nx-ith%gLs97h^Cj)SIY%;$4#+a^g8@;s+fsh}uIK_}01k|dFOwOWnM
zW+Qck>}SMr97?}_{rWhJOejvLQ|9xz{4Ua)rYX&4larGZmdhoh(MWz5WeUTPv$HdP
z{P&8X7~MAmPIKDf)5U4y;jD3joz>l{k)N0AvDSu*>1OJn#SGT
z9jB+K+}_^O>-9K0J1h9{eV?bNrvj{00U6u284ibdo+phg%ffYC`u#rLZkHekh@yzg
z%S%2!K3k_;E>o}9d47Jz^E?`j26uON+}zx-TCEV}6+yIGEs`YR_4Sobr-Q2NdI2)R
z2w=5Zp(qNA#eyIRXfzr!z3cTF0Mj%v41@W6PNUHv2m%(1MZuSN9>NMh^?je=a46F<
znM~xCs#Gf6-`}I_I#Cp{TrTGgU?A=B&iXtUS6`<
zY*1CTpd(<_>2&Zsk01zugKfCm?WD4*s_b?sjv0+cviqmg
zDNz(rDwQxzQ^M-;@e#u?czk@6kTFe@QmI4~MNFqt7K;Unq7?jUnucxL{|C|GBy-q^
z0y59f&&=m@37M0V6RGnZSP8#kSBWiKKAdD+*TpnV;FIm0PKP|t@jQ=iw@bg@=j!ST
z+qQwvGvey%O2W$XJn}rJ)9H|98Su#pag^^*RyQ{{sE2S6iwi?t*Eu~sEkGto5=p|<
zYDJc1Utp!{y7VQUhtLC158)ur0>^O>_WS!gQ4}48)!Eq@j^hx=F`LbX
zL+Cv`JW$TE4A*sOx7&Z5WO}_G&1REsw|f*a0#@B_mu9p1M_7enNW0y}bzNDWe?AZV
z^NC0mvzn-tNSEU{sH#f8-+CbclZ?oUq9}Aa9q#Y%3zJp5-TrbjIt-%O
zY<}Jg_CLmPENc|UF|*mMFv;k;PL^c_oh-|~KxQ_Z6?Eb_mR#AtiU28AaU2}SVKf?XOvIT0@bK_(
qR3``mZf