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 0000000000..648f370a54
Binary files /dev/null and b/Resources/Textures/Objects/Materials/silk.rsi/icon.png differ
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 0000000000..e039f00133
Binary files /dev/null and b/Resources/Textures/Objects/Tiles/web.rsi/icon.png differ
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 0000000000..18aef2ee51
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/bed.rsi/icon.png differ
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 0000000000..b1fb28b09d
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/chair.rsi/icon.png differ
diff --git a/Resources/Textures/Structures/Furniture/Web/chair.rsi/meta.json b/Resources/Textures/Structures/Furniture/Web/chair.rsi/meta.json
new file mode 100644
index 0000000000..3b193359ab
--- /dev/null
+++ b/Resources/Textures/Structures/Furniture/Web/chair.rsi/meta.json
@@ -0,0 +1,15 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "",
+ "states": [
+ {
+ "name": "icon",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Structures/Furniture/Web/table.rsi/full.png b/Resources/Textures/Structures/Furniture/Web/table.rsi/full.png
new file mode 100644
index 0000000000..484a398c2c
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/table.rsi/full.png differ
diff --git a/Resources/Textures/Structures/Furniture/Web/table.rsi/meta.json b/Resources/Textures/Structures/Furniture/Web/table.rsi/meta.json
new file mode 100644
index 0000000000..2c94685f9c
--- /dev/null
+++ b/Resources/Textures/Structures/Furniture/Web/table.rsi/meta.json
@@ -0,0 +1,163 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "",
+ "states": [
+ {
+ "name": "full",
+ "delays": [
+ [
+ 1
+ ]
+ ]
+ },
+ {
+ "name": "state_0",
+ "directions": 4,
+ "delays": [
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ]
+ ]
+ },
+ {
+ "name": "state_1",
+ "directions": 4,
+ "delays": [
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ]
+ ]
+ },
+ {
+ "name": "state_2",
+ "directions": 4,
+ "delays": [
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ]
+ ]
+ },
+ {
+ "name": "state_3",
+ "directions": 4,
+ "delays": [
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ]
+ ]
+ },
+ {
+ "name": "state_4",
+ "directions": 4,
+ "delays": [
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ]
+ ]
+ },
+ {
+ "name": "state_5",
+ "directions": 4,
+ "delays": [
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ]
+ ]
+ },
+ {
+ "name": "state_6",
+ "directions": 4,
+ "delays": [
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ]
+ ]
+ },
+ {
+ "name": "state_7",
+ "directions": 4,
+ "delays": [
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ],
+ [
+ 1.0
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Structures/Furniture/Web/table.rsi/state_0.png b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_0.png
new file mode 100644
index 0000000000..fe1dda3af4
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_0.png differ
diff --git a/Resources/Textures/Structures/Furniture/Web/table.rsi/state_1.png b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_1.png
new file mode 100644
index 0000000000..c3f7c42919
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_1.png differ
diff --git a/Resources/Textures/Structures/Furniture/Web/table.rsi/state_2.png b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_2.png
new file mode 100644
index 0000000000..fe1dda3af4
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_2.png differ
diff --git a/Resources/Textures/Structures/Furniture/Web/table.rsi/state_3.png b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_3.png
new file mode 100644
index 0000000000..c3f7c42919
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_3.png differ
diff --git a/Resources/Textures/Structures/Furniture/Web/table.rsi/state_4.png b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_4.png
new file mode 100644
index 0000000000..786e798c3e
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_4.png differ
diff --git a/Resources/Textures/Structures/Furniture/Web/table.rsi/state_5.png b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_5.png
new file mode 100644
index 0000000000..3ba4feb721
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_5.png differ
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 0000000000..786e798c3e
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_6.png differ
diff --git a/Resources/Textures/Structures/Furniture/Web/table.rsi/state_7.png b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_7.png
new file mode 100644
index 0000000000..3f5fe58d7f
Binary files /dev/null and b/Resources/Textures/Structures/Furniture/Web/table.rsi/state_7.png differ
diff --git a/Resources/Textures/Structures/Walls/web.rsi/full.png b/Resources/Textures/Structures/Walls/web.rsi/full.png
new file mode 100644
index 0000000000..6c398daceb
Binary files /dev/null and b/Resources/Textures/Structures/Walls/web.rsi/full.png differ
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 0000000000..12426cbb8e
Binary files /dev/null and b/Resources/Textures/Structures/Walls/web.rsi/wall0.png differ
diff --git a/Resources/Textures/Structures/Walls/web.rsi/wall1.png b/Resources/Textures/Structures/Walls/web.rsi/wall1.png
new file mode 100644
index 0000000000..1a84c1c0e5
Binary files /dev/null and b/Resources/Textures/Structures/Walls/web.rsi/wall1.png differ
diff --git a/Resources/Textures/Structures/Walls/web.rsi/wall2.png b/Resources/Textures/Structures/Walls/web.rsi/wall2.png
new file mode 100644
index 0000000000..12426cbb8e
Binary files /dev/null and b/Resources/Textures/Structures/Walls/web.rsi/wall2.png differ
diff --git a/Resources/Textures/Structures/Walls/web.rsi/wall3.png b/Resources/Textures/Structures/Walls/web.rsi/wall3.png
new file mode 100644
index 0000000000..1a84c1c0e5
Binary files /dev/null and b/Resources/Textures/Structures/Walls/web.rsi/wall3.png differ
diff --git a/Resources/Textures/Structures/Walls/web.rsi/wall4.png b/Resources/Textures/Structures/Walls/web.rsi/wall4.png
new file mode 100644
index 0000000000..dd7e845958
Binary files /dev/null and b/Resources/Textures/Structures/Walls/web.rsi/wall4.png differ
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 0000000000..7b1cb7cd0c
Binary files /dev/null and b/Resources/Textures/Structures/Walls/web.rsi/wall5.png differ
diff --git a/Resources/Textures/Structures/Walls/web.rsi/wall6.png b/Resources/Textures/Structures/Walls/web.rsi/wall6.png
new file mode 100644
index 0000000000..dd7e845958
Binary files /dev/null and b/Resources/Textures/Structures/Walls/web.rsi/wall6.png differ
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 0000000000..9cd950af77
Binary files /dev/null and b/Resources/Textures/Structures/Walls/web.rsi/wall7.png differ
diff --git a/Resources/Textures/Tiles/Misc/Web/meta.json b/Resources/Textures/Tiles/Misc/Web/meta.json
new file mode 100644
index 0000000000..901633df32
--- /dev/null
+++ b/Resources/Textures/Tiles/Misc/Web/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": "web_tile"
+ }
+ ]
+}
diff --git a/Resources/Textures/Tiles/Misc/Web/web_tile.png b/Resources/Textures/Tiles/Misc/Web/web_tile.png
new file mode 100644
index 0000000000..c40431140c
Binary files /dev/null and b/Resources/Textures/Tiles/Misc/Web/web_tile.png differ