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"