diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index f0787cec292..5a3fddc8256 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -537,4 +537,79 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
for(var/species_name in whitelisted_icons)
custom_species_bases += species_name
+ // Weaver recipe stuff
+ paths = typesof(/datum/weaver_recipe/structure) - /datum/weaver_recipe/structure
+ for(var/path in paths)
+ var/datum/weaver_recipe/instance = new path()
+ if(!instance.title)
+ continue //A prototype or something
+ weavable_structures[instance.title] = instance
+
+ paths = typesof(/datum/weaver_recipe/item) - /datum/weaver_recipe/item
+ for(var/path in paths)
+ var/datum/weaver_recipe/instance = new path()
+ if(!instance.title)
+ continue //A prototype or something
+ weavable_items[instance.title] = instance
+
return 1 // Hooks must return 1
+
+var/global/list/weavable_structures = list()
+/*
+floor web
+nest
+wall
+trap
+*/
+var/global/list/weavable_items = list()
+/*
+jumpsuit
+suit
+dress
+skirt
+shorts
+pants
+socks (shoes)
+footwraps
+toeless socks (toesless boots)
+sole covers (sandals)
+thick socks (winter boots)
+gloves
+fingerless gloves
+evening gloves
+cap
+top-hat
+bowler hat
+bandana
+veil
+beret
+headband
+waistcoast
+poncho
+cloak
+jacket
+labcoat
+overcoat
+winter coat
+hoodie
+robe/kimono
+apron
+hand bindings
+foot bindings
+overall bindings
+blindfold
+blindfold(fake)
+muzzle
+muzzle(fake)
+earmuffs
+earmuffs(fake)
+bandages
+bedsheet
+bedsheet(large)
+towel
+teshari cloak
+teshari undercoat
+scarf
+sweater
+collar?
+*/
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 785e223f8ff..fe1c4b5c7e1 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -69,7 +69,8 @@
//Organs and blood
handle_organs()
stabilize_body_temperature() //Body temperature adjusts itself (self-regulation)
- weightgain() //VORESTATION EDIT
+ weightgain() //VOREStation Addition
+ process_weaver_silk() //VOREStation Addition
handle_shock()
handle_pain()
@@ -77,7 +78,7 @@
handle_medical_side_effects()
handle_heartbeat()
- handle_nif() //VOREStation Add
+ handle_nif() //VOREStation Addition
if(!client)
species.handle_npc(src)
@@ -1291,7 +1292,7 @@
clear_alert("blind")
var/apply_nearsighted_overlay = FALSE
- if(disabilities & NEARSIGHTED)
+ if(disabilities & NEARSIGHTED)
apply_nearsighted_overlay = TRUE
if(glasses)
diff --git a/code/modules/mob/living/carbon/human/life_vr.dm b/code/modules/mob/living/carbon/human/life_vr.dm
index a513fc3df01..3bf3e45da2f 100644
--- a/code/modules/mob/living/carbon/human/life_vr.dm
+++ b/code/modules/mob/living/carbon/human/life_vr.dm
@@ -6,6 +6,14 @@
else if (nutrition <= MAX_NUTRITION_TO_LOSE && stat != 2 && weight > MIN_MOB_WEIGHT && weight_loss)
weight -= species.metabolism*(0.01*weight_loss) // starvation weight loss
+/mob/living/carbon/human/proc/process_weaver_silk()
+ if(!species || !(species.is_weaver))
+ return
+
+ if(species.silk_reserve < species.silk_max_reserve && species.silk_production == TRUE && nutrition > 100)
+ species.silk_reserve = min(species.silk_reserve + 2, species.silk_max_reserve)
+ adjust_nutrition(-0.4)
+
/mob/living/carbon/human/proc/handle_hud_list_vr()
//Right-side status hud updates with left side one.
@@ -60,13 +68,13 @@
//Overriding carbon move proc that forces default hunger factor
/mob/living/carbon/Moved(atom/old_loc, direction, forced = FALSE)
. = ..()
-
+
// Technically this does mean being dragged takes nutrition
if(stat != DEAD)
adjust_nutrition(hunger_rate/-10)
if(m_intent == "run")
adjust_nutrition(hunger_rate/-10)
-
+
// Moving around increases germ_level faster
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
germ_level++
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm
index 7c62d02b257..5dad639e31f 100644
--- a/code/modules/mob/living/carbon/human/species/species_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/species_vr.dm
@@ -20,6 +20,10 @@
var/wikilink = null //link to wiki page for species
var/icon_height = 32
var/agility = 20 //prob() to do agile things
+ var/is_weaver = FALSE
+ var/silk_production = FALSE
+ var/silk_reserve = 100
+ var/silk_max_reserve = 500
var/list/traits = list()
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
index db223014b7a..efa50c03750 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
@@ -850,3 +850,64 @@
set category = "Abilities"
pass_flags ^= PASSTABLE //I dunno what this fancy ^= is but Aronai gave it to me.
to_chat(src, "You [pass_flags&PASSTABLE ? "will" : "will NOT"] move over tables/railings/trays!")
+
+/mob/living/carbon/human/proc/check_silk_amount()
+ set name = "Check Silk Amount"
+ set category = "Abilities"
+
+ if(species.is_weaver)
+ to_chat(src, "Your silk reserves are at [species.silk_reserve]/[species.silk_max_reserve].")
+
+/mob/living/carbon/human/proc/toggle_silk_production()
+ set name = "Toggle Silk Production"
+ set category = "Abilities"
+
+ if(species.is_weaver)
+ species.silk_production = !(species.silk_production)
+ to_chat(src, "You are [species.silk_production ? "now" : "no longer"] producing silk.")
+
+/mob/living/carbon/human/proc/weave_structure()
+ set name = "Weave Structure"
+ set category = "Abilities"
+
+ if(!(species.is_weaver))
+ return
+
+ var/choice
+ var/datum/weaver_recipe/structure/desired_result
+ var/finalized = "No"
+
+ while(finalized == "No" && src.client)
+ choice = input(src,"What would you like to weave?") as null|anything in weavable_structures
+ desired_result = weavable_structures[choice]
+ if(desired_result || !istype(desired_result))
+ return
+
+ if(choice)
+ finalized = alert(src, "Are you sure you want to weave [desired_result.title]? It will cost you [desired_result.cost] silk.","Confirmation","Yes","No")
+
+/mob/living/carbon/human/proc/weave_item()
+ set name = "Weave Item"
+ set category = "Abilities"
+
+/mob/living/proc/weaveWebBindings()
+ set name = "Weave Web Bindings"
+ set category = "Species Powers"
+ if(nutrition >= 30) //This isn't a huge problem. This is so you can bind people up.
+ src.visible_message("\the [src] pulls silk from their manibles and delicately weaves it into bindings.")
+ adjust_nutrition(-30)
+ spawn(30) //5 seconds to weave the bindings~
+ var/obj/item/clothing/suit/web_bindings/bindings = new() //This sprite is amazing, I must say.
+ src.put_in_hands(bindings)
+ else
+ to_chat(src, "You do not have enough nutrition to create webbing!") //CK~
+
+/obj/item/clothing/suit/web_bindings
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_override = 'icons/vore/custom_clothes_vr.dmi'
+ name = "web bindings"
+ desc = "A webbed cocoon that completely restrains the wearer."
+ icon_state = "web_bindings"
+ item_state = "web_bindings_mob"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
index d1fbf273aa9..07ad2ce9c32 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
@@ -126,7 +126,7 @@
/datum/trait/antiseptic_saliva/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..()
- H.verbs |= /mob/living/carbon/human/proc/lick_wounds
+ H.verbs |= /mob/living/carbon/human/proc/lick_wounds
/datum/trait/traceur
name = "Traceur"
@@ -139,3 +139,16 @@
desc = "You are able to move unhindered on snow."
cost = 1
var_changes = list("snow_movement" = -2)
+
+/datum/trait/weaver
+ name = "Weaver"
+ desc = "You can produce silk and create various articles of clothing and objects."
+ cost = 1
+ var_changes = list("is_weaver" = 1)
+
+/datum/trait/weaver/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ ..()
+ H.verbs |= /mob/living/carbon/human/proc/check_silk_amount
+ H.verbs |= /mob/living/carbon/human/proc/toggle_silk_production
+ H.verbs |= /mob/living/carbon/human/proc/weave_structure
+ H.verbs |= /mob/living/carbon/human/proc/weave_item
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm
new file mode 100644
index 00000000000..5b58ad0b9d5
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm
@@ -0,0 +1,47 @@
+/obj/effect/weaversilk
+ name = "weaversilk web"
+ desc = "A thin layer of fiberous webs. It looks like it can be torn down with one strong hit."
+ icon = 'icons/vore/weaver_icons_vr.dmi'
+ anchored = 1
+ density = 0
+
+/obj/effect/weaversilk/attack_hand(mob/user as mob)
+ if(user.a_intent == I_HURT)
+ to_chat(user,"You easily tear down [name].")
+ qdel(src)
+
+/obj/effect/weaversilk/floor
+ var/possible_icon_states = list("floorweb1", "floorweb2")
+ plane = DIRTY_PLANE
+
+/obj/effect/weaversilk/floor/Initialize()
+ ..()
+ icon_state = pick(possible_icon_states)
+
+/obj/effect/weaversilk/wall
+ name = "weaversilk web wall"
+ desc = "A thin layer of fiberous webs, but just thick enough to block your way. It looks like it can be torn down with one strong hit."
+ icon_state = "wallweb1"
+ density = 1
+
+/obj/structure/bed/double/weaversilk_nest
+ name = "nest"
+ desc = "A nest of some kind, made of fiberous material."
+ icon = 'icons/vore/weaver_icons_vr.dmi'
+ icon_state = "nest"
+ base_icon = "nest"
+
+/obj/structure/bed/double/weaversilk_nest/update_icon()
+ return
+
+/obj/structure/bed/double/weaversilk_nest/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(W.is_wrench() || istype(W,/obj/item/stack) || W.is_wirecutter())
+ return
+ ..()
+
+/obj/structure/bed/double/weaversilk_nest/attack_hand(mob/user as mob)
+ ..()
+ if(user.a_intent == I_HURT && !has_buckled_mobs())
+ to_chat(user,"You easily tear down [name].")
+ qdel(src)
+
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm
new file mode 100644
index 00000000000..385a2117818
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm
@@ -0,0 +1,27 @@
+/datum/weaver_recipe
+ var/title = null
+ var/result_type
+ var/cost = 0
+ var/time = 50
+ var/one_per_turf = FALSE
+
+/datum/weaver_recipe/structure
+ one_per_turf = TRUE
+
+/datum/weaver_recipe/structure/floor
+ title = "Floor"
+ result_type = /obj/effect/weaversilk/floor
+ cost = 25
+
+/datum/weaver_recipe/structure/wall
+ title = "Wall"
+ result_type = /obj/effect/weaversilk/wall
+ cost = 100
+
+/datum/weaver_recipe/structure/nest
+ title = "Wall"
+ result_type = /obj/structure/bed/double/weaversilk_nest
+ cost = 100
+
+/datum/weaver_recipe/item
+ one_per_turf = FALSE
\ No newline at end of file
diff --git a/code/modules/vore/appearance/spider_taur_powers_vr.dm b/code/modules/vore/appearance/spider_taur_powers_vr.dm
deleted file mode 100644
index a7df6edd4ee..00000000000
--- a/code/modules/vore/appearance/spider_taur_powers_vr.dm
+++ /dev/null
@@ -1,21 +0,0 @@
-/obj/item/clothing/suit/web_bindings
- icon = 'icons/vore/custom_clothes_vr.dmi'
- icon_override = 'icons/vore/custom_clothes_vr.dmi'
- name = "web bindings"
- desc = "A webbed cocoon that completely restrains the wearer."
- icon_state = "web_bindings"
- item_state = "web_bindings_mob"
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
-
-/mob/living/proc/weaveWebBindings()
- set name = "Weave Web Bindings"
- set category = "Species Powers"
- if(nutrition >= 30) //This isn't a huge problem. This is so you can bind people up.
- src.visible_message("\the [src] pulls silk from their manibles and delicately weaves it into bindings.")
- adjust_nutrition(-30)
- spawn(30) //5 seconds to weave the bindings~
- var/obj/item/clothing/suit/web_bindings/bindings = new() //This sprite is amazing, I must say.
- src.put_in_hands(bindings)
- else
- to_chat(src, "You do not have enough nutrition to create webbing!") //CK~
diff --git a/icons/vore/weaver_icons_vr.dmi b/icons/vore/weaver_icons_vr.dmi
new file mode 100644
index 00000000000..0622346156f
Binary files /dev/null and b/icons/vore/weaver_icons_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 1e480dc8dc3..310cad22731 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2653,6 +2653,8 @@
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm"
+#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_objs.dm"
+#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_recipies.dm"
#include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm"
#include "code\modules\mob\living\carbon\human\species\virtual_reality\opaque_form.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm"
@@ -3684,7 +3686,6 @@
#include "code\modules\vore\hook-defs_vr.dm"
#include "code\modules\vore\trycatch_vr.dm"
#include "code\modules\vore\appearance\preferences_vr.dm"
-#include "code\modules\vore\appearance\spider_taur_powers_vr.dm"
#include "code\modules\vore\appearance\sprite_accessories_taur_vr.dm"
#include "code\modules\vore\appearance\sprite_accessories_vr.dm"
#include "code\modules\vore\appearance\update_icons_vr.dm"