Merge branch 'master' into sord

This commit is contained in:
David Winters
2021-04-11 01:39:38 -04:00
263 changed files with 486280 additions and 30873 deletions
@@ -155,6 +155,7 @@ var/list/admin_verbs_fun = list(
/client/proc/smite,
/client/proc/smite_vr, //VOREStation Add,
/client/proc/admin_lightning_strike,
/client/proc/resize //VOREStation Add,
)
var/list/admin_verbs_spawn = list(
+24
View File
@@ -0,0 +1,24 @@
/client/proc/resize(var/mob/living/L in mob_list)
set name = "Resize"
set desc = "Resizes any living mob without any restrictions on size."
set category = "Fun"
if(!check_rights(R_ADMIN, R_FUN))
return
var/size_multiplier = input(usr, "Input size multiplier.", "Resize", 1) as num|null
if(!size_multiplier)
return //cancelled
size_multiplier = clamp(size_multiplier, 0.01, 1000)
var/can_be_big = L.has_large_resize_bounds()
var/very_big = is_extreme_size(size_multiplier)
if(very_big && can_be_big) // made an extreme size in an area that allows it, don't assume adminbuse
to_chat(src,"<span class='warning'>[L] will lose this size upon moving into an area where this size is not allowed.</span>")
else if(very_big) // made an extreme size in an area that doesn't allow it, assume adminbuse
to_chat(src,"<span class='warning'>[L] will retain this normally unallowed size outside this area.</span>")
L.resize(size_multiplier, animate = TRUE, uncapped = TRUE, ignore_prefs = TRUE)
log_and_message_admins("has changed [key_name(L)]'s size multiplier to [size_multiplier].")
feedback_add_details("admin_verb","RESIZE")
+1 -1
View File
@@ -52,7 +52,7 @@
return say(message)
/mob/living/proc/IIsAlly(mob/living/L)
return src.faction == L.faction
return istype(L) && src.faction == L.faction
/mob/living/simple_mob/IIsAlly(mob/living/L)
. = ..()
@@ -1019,13 +1019,16 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
return
organ = "brain"
var/datum/species/current_species = GLOB.all_species[pref.species]
var/list/organ_choices = list("Normal")
if(pref.organ_data[BP_TORSO] == "cyborg")
organ_choices -= "Normal"
if(organ_name == "Brain")
organ_choices += "Cybernetic"
organ_choices += "Positronic"
organ_choices += "Drone"
if(!(current_species.spawn_flags & SPECIES_NO_POSIBRAIN))
organ_choices += "Positronic"
if(!(current_species.spawn_flags & SPECIES_NO_DRONEBRAIN))
organ_choices += "Drone"
else
organ_choices += "Assisted"
organ_choices += "Mechanical"
@@ -1043,7 +1046,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.organ_data[organ] = "assisted"
if("Cybernetic")
pref.organ_data[organ] = "assisted"
if ("Mechanical")
if("Mechanical")
pref.organ_data[organ] = "mechanical"
if("Drone")
pref.organ_data[organ] = "digital"
@@ -44,7 +44,6 @@
display_name = "collar, holo"
path = /obj/item/clothing/accessory/collar/holo
//TFF 17/6/19 - public loadout addition: Indigestible Holocollar
/datum/gear/collar/holo/indigestible
display_name = "collar, holo (indigestible)"
path = /obj/item/clothing/accessory/collar/holo/indigestible
@@ -735,6 +735,12 @@
ckeywhitelist = list("pimientopyro")
character_name = list("Scylla Casmus")
/datum/gear/fluff/kiyoshi_cloak
path = /obj/item/clothing/accessory/poncho/fluff/cloakglowing
display_name = "glowing cloak"
ckeywhitelist = list("pastelprincedan")
character_name = list("Kiyoshi Maki", "Masumi Maki")
// Q CKEYS
// R CKEYS
@@ -45,7 +45,7 @@
character.weight_gain = pref.weight_gain
character.weight_loss = pref.weight_loss
character.fuzzy = pref.fuzzy
character.resize(pref.size_multiplier, animate = FALSE)
character.resize(pref.size_multiplier, animate = FALSE, ignore_prefs = TRUE)
/datum/category_item/player_setup_item/vore/size/content(var/mob/user)
. += "<br>"
@@ -1,5 +1,3 @@
//TFF 5/8/19 - moved /datum/preferences to preferences_vr.dm
/datum/category_item/player_setup_item/vore/misc
name = "Misc Settings"
sort_order = 9
@@ -9,16 +7,15 @@
S["directory_tag"] >> pref.directory_tag
S["directory_erptag"] >> pref.directory_erptag
S["directory_ad"] >> pref.directory_ad
S["sensorpref"] >> pref.sensorpref //TFF 5/8/19 - add sensor pref setting to load after saved
S["sensorpref"] >> pref.sensorpref
/datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S)
S["show_in_directory"] << pref.show_in_directory
S["directory_tag"] << pref.directory_tag
S["directory_erptag"] << pref.directory_erptag
S["directory_ad"] << pref.directory_ad
S["sensorpref"] << pref.sensorpref //TFF 5/8/19 - add sensor pref setting to be saveable
S["sensorpref"] << pref.sensorpref
//TFF 5/8/19 - add new datum category to allow for setting multiple settings when this is selected in the loadout.
/datum/category_item/player_setup_item/vore/misc/copy_to_mob(var/mob/living/carbon/human/character)
if(pref.sensorpref > 5 || pref.sensorpref < 1)
pref.sensorpref = 5
@@ -28,7 +25,7 @@
pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory))
pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag))
pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag))
pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) //TFF - 5/8/19 - add santisation for sensor prefs
pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref))
/datum/category_item/player_setup_item/vore/misc/content(var/mob/user)
. += "<br>"
@@ -36,7 +33,7 @@
. += "<b>Character Directory Vore Tag:</b> <a href='?src=\ref[src];directory_tag=1'><b>[pref.directory_tag]</b></a><br>"
. += "<b>Character Directory ERP Tag:</b> <a href='?src=\ref[src];directory_erptag=1'><b>[pref.directory_erptag]</b></a><br>"
. += "<b>Character Directory Advertisement:</b> <a href='?src=\ref[src];directory_ad=1'><b>Set Directory Ad</b></a><br>"
. += "<b>Suit Sensors Preference:</b> <a [pref.sensorpref ? "" : ""] href='?src=\ref[src];toggle_sensor_setting=1'><b>[sensorpreflist[pref.sensorpref]]</b></a><br>" //TFF 5/8/19 - Allow selection of sensor settings from off, binary, vitals, tracking, or random
. += "<b>Suit Sensors Preference:</b> <a [pref.sensorpref ? "" : ""] href='?src=\ref[src];toggle_sensor_setting=1'><b>[sensorpreflist[pref.sensorpref]]</b></a><br>"
/datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user)
if(href_list["toggle_show_in_directory"])
@@ -58,7 +55,6 @@
var/msg = sanitize(input(user,"Write your advertisement here!", "Flavor Text", html_decode(pref.directory_ad)) as message, extra = 0) //VOREStation Edit: separating out OOC notes
pref.directory_ad = msg
return TOPIC_REFRESH
//TFF 5/8/19 - add new thing so you can choose the sensor setting your character can get.
else if(href_list["toggle_sensor_setting"])
var/new_sensorpref = input(user, "Choose your character's sensor preferences:", "Character Preferences", sensorpreflist[pref.sensorpref]) as null|anything in sensorpreflist
if (!isnull(new_sensorpref) && CanUseTopic(user))
-2
View File
@@ -153,7 +153,6 @@
SPECIES_VOX = 'icons/mob/species/vox/suit.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/suit.dmi')
//TFF 5/8/19 - sets Vorestation /obj/item/clothing/under sensor setting default?
/obj/item/clothing/under
sensor_mode = 3
var/sensorpref = 5
@@ -162,7 +161,6 @@
SPECIES_VOX = 'icons/mob/species/vox/uniform.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/uniform.dmi')
//TFF 5/8/19 - define numbers and specifics for suit sensor settings
/obj/item/clothing/under/New(var/mob/living/carbon/human/H)
..()
sensorpref = isnull(H) ? 1 : (ishuman(H) ? H.sensorpref : 1)
@@ -329,13 +329,33 @@
/obj/item/clothing/suit/space/void/exploration
name = "exploration voidsuit"
desc = "A lightweight, radiation-resistant voidsuit, featuring the Explorer emblem on its chest plate. Designed for exploring unknown planetary environments."
desc = "A hazard and radiation resistant voidsuit, featuring the Explorer emblem on its chest plate. Designed for exploring unknown planetary environments."
icon_state = "void_explorer"
item_state_slots = list(slot_r_hand_str = "skrell_suit_black", slot_l_hand_str = "skrell_suit_black")
armor = list(melee = 40, bullet = 15, laser = 25,energy = 35, bomb = 30, bio = 100, rad = 70)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/device/healthanalyzer,/obj/item/device/gps,/obj/item/device/radio/beacon, \
/obj/item/weapon/shovel,/obj/item/ammo_magazine,/obj/item/weapon/gun)
//SAR
/obj/item/clothing/head/helmet/space/void/expedition_medical
name = "exploration medic\'s voidsuit helmet"
desc = "A radiation-resistant helmet made especially for exploring unknown planetary environments. Has a reinforced high-vis bubble style visor."
icon_state = "helm_exp_medic"
item_state = "helm_exp_medic"
item_state_slots = list(slot_r_hand_str = "syndicate-helm-black", slot_l_hand_str = "syndicate-helm-black")
armor = list(melee = 25, bullet = 10, laser = 20,energy = 30, bomb = 25, bio = 100, rad = 70)
light_overlay = "helmet_light_dual" //explorer_light
/obj/item/clothing/suit/space/void/expedition_medical
name = "exploration medic\'s voidsuit"
desc = "A hazard and radiation resistant voidsuit, featuring the Explorer emblem and a green cross on its chest plate. Seems to be a little lighter and more flexible than the regular explorer issue."
icon_state = "void_exp_medic"
slowdown = 0.75
item_state_slots = list(slot_r_hand_str = "skrell_suit_black", slot_l_hand_str = "skrell_suit_black")
armor = list(melee = 25, bullet = 10, laser = 20,energy = 30, bomb = 25, bio = 100, rad = 70)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/device/healthanalyzer,/obj/item/device/gps,/obj/item/device/radio/beacon, \
/obj/item/weapon/shovel,/obj/item/ammo_magazine,/obj/item/weapon/gun,/obj/item/weapon/storage/firstaid,/obj/item/stack/medical)
/obj/item/clothing/head/helmet/space/void/exploration/alt
desc = "A radiation-resistant helmet retrofitted for exploring unknown planetary environments."
icon_state = "helm_explorer2"
-2
View File
@@ -30,8 +30,6 @@
icon_state = "grey"
rolled_sleeves = 0
//TFF 5/8/19 - add a non perma-set orange jumpsuit, splits prison into its own obj with override var settings.
//TFF 5/9/19 - add a different icon_state to both jumpsuits, orange and prison. Refactors orange and prison jumpsuit slightly.
/obj/item/clothing/under/color/orange
name = "orange jumpsuit"
icon_state = "orange"
@@ -79,6 +79,8 @@
return
var/new_size = input("Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null
if(!new_size)
return //cancelled
//Check AGAIN because we accepted user input which is blocking.
if (src != H.w_uniform)
@@ -88,9 +90,9 @@
if (H.stat || H.restrained())
return
if (isnull(H.size_multiplier))
if (isnull(H.size_multiplier)) // Why would this ever be the case?
to_chat(H,"<span class='warning'>The uniform panics and corrects your apparently microscopic size.</span>")
H.resize(RESIZE_NORMAL)
H.resize(RESIZE_NORMAL, ignore_prefs = TRUE)
H.update_icons() //Just want the matrix transform
return
@@ -102,7 +104,7 @@
if(new_size != H.size_multiplier)
if(!original_size)
original_size = H.size_multiplier
H.resize(new_size/100)
H.resize(new_size/100, ignore_prefs = TRUE) // Ignores prefs because you can only resize yourself
H.visible_message("<span class='warning'>The space around [H] distorts as they change size!</span>","<span class='notice'>The space around you distorts as you change size!</span>")
else //They chose their current size.
return
@@ -111,7 +113,7 @@
. = ..()
if(. && ishuman(M) && original_size)
var/mob/living/carbon/human/H = M
H.resize(original_size)
H.resize(original_size, ignore_prefs = TRUE)
original_size = null
H.visible_message("<span class='warning'>The space around [H] distorts as they return to their original size!</span>","<span class='notice'>The space around you distorts as you return to your original size!</span>")
+1 -1
View File
@@ -22,7 +22,7 @@
/datum/event/rogue_drone/announce()
var/msg
var/rng = rand(1,5)
//VOREStation Edit Start TFF 16/12/19 - Sif -> Virgo 3b
//VOREStation Edit Start
switch(rng)
if(1)
msg = "A combat drone wing operating in close orbit above Virgo 3b has failed to return from a anti-piracy sweep. If any are sighted, \
+33
View File
@@ -171,3 +171,36 @@
. = ..()
reagents.add_reagent("rootbeer", 30)
//ADDITIONS BELOW THIS LINE MADE ON 04/03/2021
/obj/item/weapon/reagent_containers/food/drinks/cans/kvass
name = "\improper Kvass"
desc = "A true Slavic soda."
description_fluff = "A classic slavic beverage which many Space Russians still enjoy to this day. Fun fact, it is actually considered a weak beer by non-russians."
icon_state = "kvass"
center_of_mass = list("x"=16, "y"=10)
/obj/item/weapon/reagent_containers/food/drinks/cans/kvass/Initialize()
. = ..()
reagents.add_reagent("kvass", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/kompot
name = "\improper Kompot"
desc = "A taste of russia in the summertime - canned for you consumption."
description_fluff = "A sweet and fruity beverage that was traditionally used to preserve frutis in harsh Russian winters that is now available for widespread comsumption."
icon_state = "kompot"
center_of_mass = list("x"=16, "y"=10)
/obj/item/weapon/reagent_containers/food/drinks/cans/kompot/Initialize()
. = ..()
reagents.add_reagent("kompot", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/boda
name = "\improper Boda"
desc = "State regulated soda beverage. Enjoy comrades."
icon_state = "boda"
center_of_mass = list("x"=16, "y"=8)
/obj/item/weapon/reagent_containers/food/drinks/cans/boda/Initialize()
. = ..()
reagents.add_reagent("sodawater", 30)
+1 -1
View File
@@ -58,7 +58,7 @@
desc = "It's beef. It's roasted. It's been a staple of dining tradition for centuries."
icon = 'icons/obj/food_vr.dmi'
icon_state = "roastbeef"
trash = /obj/item/trash/plate //TFF 30/11/19 - Roast beef are put on plates, not waffle trays, you dunce~
trash = /obj/item/trash/plate
nutriment_amt = 8
nutriment_desc = list("cooked meat" = 5)
+61 -60
View File
@@ -27,7 +27,7 @@
var/datum/looping_sound/microwave/soundloop
// see code/modules/food/recipes_microwave.dm for recipes
//see code/modules/food/recipes_microwave.dm for recipes
/*******************
* Initialising
@@ -283,68 +283,69 @@
if("dispose")
dispose()
return TRUE
// /obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu
// var/dat = ""
// if(src.broken > 0)
// dat = {"<TT>Bzzzzttttt</TT>"}
// else if(src.operating)
// dat = {"<TT>Microwaving in progress!<BR>Please wait...!</TT>"}
// else if(src.dirty==100)
// dat = {"<TT>This microwave is dirty!<BR>Please clean it before use!</TT>"}
// else
// var/list/items_counts = new
// var/list/items_measures = new
// var/list/items_measures_p = new
// for (var/obj/O in ((contents - component_parts) - circuit))
// var/display_name = O.name
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
// items_measures[display_name] = "egg"
// items_measures_p[display_name] = "eggs"
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
// items_measures[display_name] = "tofu chunk"
// items_measures_p[display_name] = "tofu chunks"
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
// items_measures[display_name] = "slab of meat"
// items_measures_p[display_name] = "slabs of meat"
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
// display_name = "Turnovers"
// items_measures[display_name] = "turnover"
// items_measures_p[display_name] = "turnovers"
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
// items_measures[display_name] = "fillet of meat"
// items_measures_p[display_name] = "fillets of meat"
// items_counts[display_name]++
// for (var/O in items_counts)
// var/N = items_counts[O]
// if (!(O in items_measures))
// dat += {"<B>[capitalize(O)]:</B> [N] [lowertext(O)]\s<BR>"}
// else
// if (N==1)
// dat += {"<B>[capitalize(O)]:</B> [N] [items_measures[O]]<BR>"}
// else
// dat += {"<B>[capitalize(O)]:</B> [N] [items_measures_p[O]]<BR>"}
/*
/obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu
var/dat = ""
if(src.broken > 0)
dat = {"<TT>Bzzzzttttt</TT>"}
else if(src.operating)
dat = {"<TT>Microwaving in progress!<BR>Please wait...!</TT>"}
else if(src.dirty==100)
dat = {"<TT>This microwave is dirty!<BR>Please clean it before use!</TT>"}
else
var/list/items_counts = new
var/list/items_measures = new
var/list/items_measures_p = new
for (var/obj/O in ((contents - component_parts) - circuit))
var/display_name = O.name
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
items_measures[display_name] = "egg"
items_measures_p[display_name] = "eggs"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
items_measures[display_name] = "tofu chunk"
items_measures_p[display_name] = "tofu chunks"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
items_measures[display_name] = "slab of meat"
items_measures_p[display_name] = "slabs of meat"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
display_name = "Turnovers"
items_measures[display_name] = "turnover"
items_measures_p[display_name] = "turnovers"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
items_measures[display_name] = "fillet of meat"
items_measures_p[display_name] = "fillets of meat"
items_counts[display_name]++
for (var/O in items_counts)
var/N = items_counts[O]
if (!(O in items_measures))
dat += {"<B>[capitalize(O)]:</B> [N] [lowertext(O)]\s<BR>"}
else
if (N==1)
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures[O]]<BR>"}
else
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures_p[O]]<BR>"}
// for (var/datum/reagent/R in reagents.reagent_list)
// var/display_name = R.name
// if (R.id == "capsaicin")
// display_name = "Hotsauce"
// if (R.id == "frostoil")
// display_name = "Coldsauce"
// dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
for (var/datum/reagent/R in reagents.reagent_list)
var/display_name = R.name
if (R.id == "capsaicin")
display_name = "Hotsauce"
if (R.id == "frostoil")
display_name = "Coldsauce"
dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
// if (items_counts.len==0 && reagents.reagent_list.len==0)
// dat = {"<B>The microwave is empty</B><BR>"}
// else
// dat = {"<b>Ingredients:</b><br>[dat]"}
// dat += {"<HR><BR>\
// <A href='?src=\ref[src];action=cook'>Turn on!<BR>\
// <A href='?src=\ref[src];action=dispose'>Eject ingredients!<BR>\
// "}
if (items_counts.len==0 && reagents.reagent_list.len==0)
dat = {"<B>The microwave is empty</B><BR>"}
else
dat = {"<b>Ingredients:</b><br>[dat]"}
dat += {"<HR><BR>\
<A href='?src=\ref[src];action=cook'>Turn on!<BR>\
<A href='?src=\ref[src];action=dispose'>Eject ingredients!<BR>\
"}
// user << browse("<HEAD><TITLE>Microwave Controls</TITLE></HEAD><TT>[dat]</TT>", "window=microwave")
// onclose(user, "microwave")
// return
user << browse("<HEAD><TITLE>Microwave Controls</TITLE></HEAD><TT>[dat]</TT>", "window=microwave")
onclose(user, "microwave")
return
*/
/***********************************
* Microwave Menu Handling/Cooking
+2 -2
View File
@@ -187,10 +187,10 @@
for(var/obj/item/stack/wetleather/WL in I.instances)
if(!WL.wetness)
if(WL.amount == 1)
if(WL.amount)
WL.forceMove(get_turf(src))
WL.dry()
I.instances -= WL
WL.dry()
break
WL.wetness = max(0, WL.wetness - rand(1, 3))
@@ -211,7 +211,7 @@
/datum/event2/event/prison_break/proc/flicker_area()
for(var/area/A in areas_to_break)
var/obj/machinery/power/apc/apc = A.get_apc()
if(apc.operating) //If the apc's off, it's a little hard to overload the lights.
if(istype(apc) && apc.operating) //If the apc's off, it's a little hard to overload the lights.
for(var/obj/machinery/light/L in A)
L.flicker(10)
-1
View File
@@ -33,7 +33,6 @@
/area/engineering
holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
//TFF 11/12/19 - Minor refactor, makes mice spawn only in Atmos.
/area/engineering/atmos_intake
holomap_color = null
/area/maintenance/substation/engineering
@@ -94,7 +94,6 @@
to_chat(user, "You load [W] into [src].")
return
//TFF 3/6/19 - fix infinite frame creation, ported from Cit RP - also allow movement of hydroponic-related machines.
if(default_deconstruction_screwdriver(user, W))
return
if(W.is_wrench())
+278 -276
View File
@@ -1,276 +1,278 @@
/datum/material/proc/get_recipes()
if(!recipes)
generate_recipes()
return recipes
/datum/material/proc/generate_recipes()
recipes = list()
// If is_brittle() returns true, these are only good for a single strike.
recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] armor plate insert", /obj/item/weapon/material/armor_plating/insert, 2, time = 40, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
if(integrity>=50)
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
if(hardness>50)
recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] defense wire", /obj/item/weapon/material/barbedwire, 10, time = 1 MINUTE, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
/datum/material/steel/generate_recipes()
..()
recipes += new/datum/stack_recipe_list("office chairs",list( \
new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") \
))
recipes += new/datum/stack_recipe_list("comfy chairs", list( \
new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("yellow comfy chair", /obj/structure/bed/chair/comfy/yellow, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("orange comfy chair", /obj/structure/bed/chair/comfy/orange, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
))
recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("bench frame", /obj/structure/table/bench, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0, recycle_material = "[name]")
recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]")
recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]")
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]")
recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
//recipes += new/datum/stack_recipe("fire axe cabinet frame", /obj/item/frame/fireaxe_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
recipes += new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe_list("airlock assemblies", list( \
new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("eng atmos airlock assembly", /obj/structure/door_assembly/door_assembly_eat, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("voidcraft airlock assembly horizontal", /obj/structure/door_assembly/door_assembly_voidcraft, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("voidcraft airlock assembly vertical", /obj/structure/door_assembly/door_assembly_voidcraft/vertical, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
))
//recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Removal
recipes += new/datum/stack_recipe("medical stand", /obj/structure/medical_stand, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Replacement
recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade, recycle_material = "[name]")
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2, recycle_material = "[name]")
recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("floor lamp fixture frame", /obj/machinery/light_construct/flamp, 2, recycle_material = "[name]")
recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2, recycle_material = "[name]")
recipes += new/datum/stack_recipe_list("modular computer frames", list( \
new/datum/stack_recipe("modular console frame", /obj/item/modular_computer/console, 20, recycle_material = "[name]"),\
new/datum/stack_recipe("modular telescreen frame", /obj/item/modular_computer/telescreen, 10, recycle_material = "[name]"),\
new/datum/stack_recipe("modular laptop frame", /obj/item/modular_computer/laptop, 10, recycle_material = "[name]"),\
new/datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/tablet, 5, recycle_material = "[name]"),\
))
recipes += new/datum/stack_recipe_list("filing cabinets", list( \
new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
))
recipes += new/datum/stack_recipe("desk bell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]")
/datum/material/plasteel/generate_recipes()
..()
recipes += new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("knife grip", /obj/item/weapon/material/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/dark, 1, 4, 20, recycle_material = "[name]")
recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10, recycle_material = "[name]")
/datum/material/stone/generate_recipes()
..()
recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
/datum/material/stone/marble/generate_recipes()
..()
recipes += new/datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/wmarble, 1, 4, 20, recycle_material = "[name]")
recipes += new/datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/bmarble, 1, 4, 20, recycle_material = "[name]")
/datum/material/plastic/generate_recipes()
..()
recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 500u
recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 250u
recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 100u
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("plastic fishtank", /obj/item/glass_jar/fish/plastic, 2, time = 30 SECONDS, recycle_material = "[name]")
recipes += new/datum/stack_recipe("reagent tubing", /obj/item/stack/hose, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
/datum/material/wood/generate_recipes()
..()
recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") //VOREStation Add
recipes += new/datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]")
/datum/material/wood/log/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE, recycle_material = "[name]")
/datum/material/cardboard/generate_recipes()
..()
recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe_list("folders",list( \
new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue, recycle_material = "[name]"), \
new/datum/stack_recipe("grey folder", /obj/item/weapon/folder, recycle_material = "[name]"), \
new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red, recycle_material = "[name]"), \
new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white, recycle_material = "[name]"), \
new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow, recycle_material = "[name]"), \
))
/datum/material/snow/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10, recycle_material = "[name]")
recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10, recycle_material = "[name]")
recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15, recycle_material = "[name]")
recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10, recycle_material = "[name]")
recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20, recycle_material = "[name]")
/datum/material/snowbrick/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
/datum/material/wood/sif/generate_recipes()
..()
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = TRUE)
for(var/datum/stack_recipe/r_recipe in recipes)
if(r_recipe.title == "wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden chair")
recipes -= r_recipe
continue
/datum/material/supermatter/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("supermatter shard", /obj/machinery/power/supermatter/shard, 30 , one_per_turf = 1, time = 600, on_floor = 1, recycle_material = "[name]")
/datum/material/cloth/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
/datum/material/resin/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS, recycle_material = "[name]")
/datum/material/leather/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
recipes += new/datum/stack_recipe("whip", /obj/item/weapon/material/whip, 5, time = 15 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
/datum/material/proc/get_recipes()
if(!recipes)
generate_recipes()
return recipes
/datum/material/proc/generate_recipes()
recipes = list()
// If is_brittle() returns true, these are only good for a single strike.
recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] armor plate insert", /obj/item/weapon/material/armor_plating/insert, 2, time = 40, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
if(integrity>=50)
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
if(hardness>50)
recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] defense wire", /obj/item/weapon/material/barbedwire, 10, time = 1 MINUTE, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
/datum/material/steel/generate_recipes()
..()
recipes += new/datum/stack_recipe_list("office chairs",list( \
new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") \
))
recipes += new/datum/stack_recipe_list("comfy chairs", list( \
new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("yellow comfy chair", /obj/structure/bed/chair/comfy/yellow, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("orange comfy chair", /obj/structure/bed/chair/comfy/orange, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
))
recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("bench frame", /obj/structure/table/bench, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0, recycle_material = "[name]")
recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]")
recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]")
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]")
recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
//recipes += new/datum/stack_recipe("fire axe cabinet frame", /obj/item/frame/fireaxe_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
recipes += new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe_list("airlock assemblies", list( \
new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("eng atmos airlock assembly", /obj/structure/door_assembly/door_assembly_eat, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("voidcraft airlock assembly horizontal", /obj/structure/door_assembly/door_assembly_voidcraft, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("voidcraft airlock assembly vertical", /obj/structure/door_assembly/door_assembly_voidcraft/vertical, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
))
//recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Removal
recipes += new/datum/stack_recipe("medical stand", /obj/structure/medical_stand, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Replacement
recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade, recycle_material = "[name]")
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2, recycle_material = "[name]")
recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("floor lamp fixture frame", /obj/machinery/light_construct/flamp, 2, recycle_material = "[name]")
recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2, recycle_material = "[name]")
recipes += new/datum/stack_recipe_list("modular computer frames", list( \
new/datum/stack_recipe("modular console frame", /obj/item/modular_computer/console, 20, recycle_material = "[name]"),\
new/datum/stack_recipe("modular telescreen frame", /obj/item/modular_computer/telescreen, 10, recycle_material = "[name]"),\
new/datum/stack_recipe("modular laptop frame", /obj/item/modular_computer/laptop, 10, recycle_material = "[name]"),\
new/datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/tablet, 5, recycle_material = "[name]"),\
))
recipes += new/datum/stack_recipe_list("filing cabinets", list( \
new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
))
recipes += new/datum/stack_recipe("desk bell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]")
/datum/material/plasteel/generate_recipes()
..()
recipes += new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("knife grip", /obj/item/weapon/material/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/dark, 1, 4, 20, recycle_material = "[name]")
recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10, recycle_material = "[name]")
/datum/material/stone/generate_recipes()
..()
recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
/datum/material/stone/marble/generate_recipes()
..()
recipes += new/datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/wmarble, 1, 4, 20, recycle_material = "[name]")
recipes += new/datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/bmarble, 1, 4, 20, recycle_material = "[name]")
/datum/material/plastic/generate_recipes()
..()
recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 500u
recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 250u
recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 100u
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("plastic fishtank", /obj/item/glass_jar/fish/plastic, 2, time = 30 SECONDS, recycle_material = "[name]")
recipes += new/datum/stack_recipe("reagent tubing", /obj/item/stack/hose, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
/datum/material/wood/generate_recipes()
..()
recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") //VOREStation Add
recipes += new/datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]")
recipes += new/datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]")
/datum/material/wood/log/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE, recycle_material = "[name]")
/datum/material/cardboard/generate_recipes()
..()
recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe_list("folders",list( \
new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue, recycle_material = "[name]"), \
new/datum/stack_recipe("grey folder", /obj/item/weapon/folder, recycle_material = "[name]"), \
new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red, recycle_material = "[name]"), \
new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white, recycle_material = "[name]"), \
new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow, recycle_material = "[name]"), \
))
/datum/material/snow/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10, recycle_material = "[name]")
recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10, recycle_material = "[name]")
recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15, recycle_material = "[name]")
recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10, recycle_material = "[name]")
recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20, recycle_material = "[name]")
/datum/material/snowbrick/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
/datum/material/wood/sif/generate_recipes()
..()
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = TRUE)
for(var/datum/stack_recipe/r_recipe in recipes)
if(r_recipe.title == "wood floor tile")
recipes -= r_recipe
continue
if(r_recipe.title == "wooden chair")
recipes -= r_recipe
continue
/datum/material/supermatter/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("supermatter shard", /obj/machinery/power/supermatter/shard, 30 , one_per_turf = 1, time = 600, on_floor = 1, recycle_material = "[name]")
/datum/material/cloth/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
/datum/material/resin/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS, recycle_material = "[name]")
/datum/material/leather/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
recipes += new/datum/stack_recipe("whip", /obj/item/weapon/material/whip, 5, time = 15 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
+9 -1
View File
@@ -55,4 +55,12 @@
/obj/fiftyspawner/plastitanium_glass
name = "stack of plastitanium glass"
type_to_spawn = /obj/item/stack/material/glass/plastitanium
type_to_spawn = /obj/item/stack/material/glass/plastitanium
/obj/item/stack/material/gold/hull
name = "gold hull sheets"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "sheet-plastitanium"
item_state = "sheet-silver"
no_variants = FALSE
default_type = MAT_GOLDHULL
+2 -1
View File
@@ -53,9 +53,10 @@ var/list/name_to_material
/proc/populate_material_list(force_remake=0)
if(name_to_material && !force_remake) return // Already set up!
name_to_material = list()
for(var/type in typesof(/datum/material) - /datum/material)
for(var/type in subtypesof(/datum/material))
var/datum/material/new_mineral = new type
if(!new_mineral.name)
qdel(new_mineral)
continue
name_to_material[lowertext(new_mineral.name)] = new_mineral
return 1
+11 -1
View File
@@ -91,4 +91,14 @@
created_fulltile_window = /obj/structure/window/plastitanium/full
wire_product = null
rod_product = /obj/item/stack/material/glass/plastitanium
composite_material = list(MAT_PLASTITANIUM = SHEET_MATERIAL_AMOUNT, "glass" = SHEET_MATERIAL_AMOUNT)
composite_material = list(MAT_PLASTITANIUM = SHEET_MATERIAL_AMOUNT, "glass" = SHEET_MATERIAL_AMOUNT)
/datum/material/gold/hull
name = MAT_GOLDHULL
stack_type = /obj/item/stack/material/gold/hull
icon_base = "hull"
icon_reinf = "reinf_mesh"
explosion_resistance = 50
/datum/material/gold/hull/place_sheet(var/turf/target) //Deconstructed into normal plasteel sheets.
new /obj/item/stack/material/gold(target)
+1 -1
View File
@@ -88,7 +88,7 @@
for(var/turf in visAdded)
var/turf/t = turf
if(t.obfuscations[obfuscation.type])
if(LAZYLEN(t.obfuscations) && t.obfuscations[obfuscation.type])
obscured -= t.obfuscations[obfuscation.type]
for(var/eye in seenby)
var/mob/observer/eye/m = eye
+1 -1
View File
@@ -10,7 +10,7 @@
icon_state = "farmbot0"
health = 50
maxHealth = 50
req_one_access = list(access_robotics, access_hydroponics, access_xenobiology) //TFF 11/7/19 - adds Xenobio access on behalf of Nalarac
req_one_access = list(access_robotics, access_hydroponics, access_xenobiology)
var/action = "" // Used to update icon
var/waters_trays = 1
@@ -181,15 +181,6 @@
return FALSE
/mob/living/carbon/human/verb/toggle_resizing_immunity()
set name = "Toggle Resizing Immunity"
set desc = "Toggles your ability to resist resizing attempts"
set category = "IC"
resizable = !resizable
to_chat(src, "<span class='notice'>You are now [resizable ? "susceptible" : "immune"] to being resized.</span>")
/mob/living/carbon/human/proc/handle_flip_vr()
var/original_density = density
var/original_passflags = pass_flags
@@ -492,6 +492,7 @@ This function restores all organs.
switch(damagetype)
if(BRUTE)
damageoverlaytemp = 20
if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT)){damage *= 0.7}
damage = damage*species.brute_mod
for(var/datum/modifier/M in modifiers)
@@ -504,6 +505,7 @@ This function restores all organs.
UpdateDamageIcon()
if(BURN)
damageoverlaytemp = 20
if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){damage *= 0.7}
damage = damage*species.burn_mod
for(var/datum/modifier/M in modifiers)
@@ -7,7 +7,6 @@
var/impersonate_bodytype //For impersonating a bodytype
var/ability_flags = 0 //Shadekin abilities/potentially other species-based?
var/sensorpref = 5 //Suit sensor loadout pref
var/unnaturally_resized = FALSE //If one became larger than 200%, or smaller than 25%. This flag is needed for the case when admins want someone to be very big or very small outside of dorms.
var/wings_hidden = FALSE
/mob/living/carbon/human/proc/shadekin_get_energy()
@@ -97,6 +97,7 @@
var/their_slowdown = max(H.calculate_item_encumbrance(), 1)
item_tally = max(item_tally, their_slowdown) // If our slowdown is less than theirs, then we become as slow as them (before species modifires).
item_tally /= 2 //VOREStation Add
item_tally *= species.item_slowdown_mod
. += item_tally
@@ -189,7 +190,7 @@
if(istype(back, /obj/item/weapon/tank/jetpack))
return back
else if(istype(rig))
for(var/obj/item/rig_module/maneuvering_jets.module in rig.installed_modules)
for(var/obj/item/rig_module/maneuvering_jets/module in rig.installed_modules)
return module.jets
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)
@@ -104,7 +104,8 @@
else if (E.is_dislocated())
stance_damage += 0.5
if(E) limb_pain = E.organ_can_feel_pain()
if(E && (!E.is_usable() || E.is_broken() || E.is_dislocated())) //VOREStation Edit
limb_pain = E.organ_can_feel_pain()
// Canes and crutches help you stand (if the latter is ever added)
// One cane mitigates a broken leg+foot, or a missing foot.
+1 -3
View File
@@ -62,8 +62,6 @@
//No need to update all of these procs if the guy is dead.
fall() //VORESTATION EDIT. Prevents people from floating
if(unnaturally_resized) //VORESTATION EDIT.
handle_unnatural_size()
if(stat != DEAD && !stasis)
//Updates the number of stored chemicals for powers
handle_changeling()
@@ -1268,7 +1266,7 @@
//VOREStation Add - Vampire hunger alert
else if(get_species() == SPECIES_CUSTOM)
var/datum/species/custom/C = species
if(/datum/trait/bloodsucker in C.traits)
if(/datum/trait/neutral/bloodsucker in C.traits)
fat_alert = /obj/screen/alert/fat/vampire
hungry_alert = /obj/screen/alert/hungry/vampire
starving_alert = /obj/screen/alert/starving/vampire
@@ -78,10 +78,3 @@
// Moving around increases germ_level faster
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
germ_level++
/mob/living/carbon/human/proc/handle_unnatural_size()
if(!in_dorms())
if(src.size_multiplier > 2)
src.resize(2)
else if (src.size_multiplier < 0.25)
src.resize(0.25)
@@ -413,7 +413,6 @@
H.visible_message( \
"<span class='notice'>[H] shakes [target]'s hand.</span>", \
"<span class='notice'>You shake [target]'s hand.</span>", )
//TFF 15/12/19 - Port nose booping from CHOMPStation
else if(H.zone_sel.selecting == "mouth")
H.visible_message( \
"<span class='notice'>[H] boops [target]'s nose.</span>", \
@@ -53,6 +53,9 @@
var/datum/species/new_copy = new to_copy.type()
for(var/organ in to_copy.has_limbs)
var/list/organ_data = to_copy.has_limbs[organ]
new_copy.has_limbs[organ] = organ_data.Copy()
new_copy.traits = traits
//If you had traits, apply them
@@ -0,0 +1 @@
#define PROTEAN_EDIBLE_MATERIALS list(MAT_STEEL, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_METALHYDROGEN)
@@ -22,8 +22,8 @@
response_harm = "hits"
harm_intent_damage = 2
melee_damage_lower = 10
melee_damage_upper = 10
melee_damage_lower = 5
melee_damage_upper = 5
attacktext = list("slashed")
min_oxy = 0
@@ -36,7 +36,7 @@
max_n2 = 0
minbodytemp = 0
maxbodytemp = 900
movement_cooldown = 3
movement_cooldown = 4
var/mob/living/carbon/human/humanform
var/obj/item/organ/internal/nano/refactory/refactory
@@ -267,9 +267,8 @@
if(refactory && istype(A,/obj/item/stack/material))
var/obj/item/stack/material/S = A
var/substance = S.material.name
var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones.
var allowed = FALSE
for(var/material in edible_materials)
for(var/material in PROTEAN_EDIBLE_MATERIALS)
if(material == substance) allowed = TRUE
if(!allowed)
return
@@ -282,9 +281,8 @@
if(refactory && istype(O,/obj/item/stack/material))
var/obj/item/stack/material/S = O
var/substance = S.material.name
var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones.
var allowed = FALSE
for(var/material in edible_materials)
for(var/material in PROTEAN_EDIBLE_MATERIALS)
if(material == substance) allowed = TRUE
if(!allowed)
return
@@ -432,7 +430,7 @@ var/global/list/disallowed_protean_accessories = list(
var/atom/reform_spot = blob.drop_location()
//Size update
resize(blob.size_multiplier, FALSE)
resize(blob.size_multiplier, FALSE, ignore_prefs = TRUE)
//Move them back where the blob was
forceMove(reform_spot)
@@ -201,9 +201,8 @@
var/obj/item/stack/material/matstack = held
var/substance = matstack.material.name
var/list/edible_materials = list(MAT_STEEL, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_METALHYDROGEN) //Can't eat all materials, just useful ones.
var allowed = FALSE
for(var/material in edible_materials)
for(var/material in PROTEAN_EDIBLE_MATERIALS)
if(material == substance) allowed = TRUE
if(!allowed)
to_chat(src,"<span class='warning'>You can't process [substance]!</span>")
@@ -300,14 +299,14 @@
//Sizing up
if(cost > 0)
if(refactory.use_stored_material(MAT_STEEL,cost))
user.resize(size_factor)
user.resize(size_factor, ignore_prefs = TRUE)
else
to_chat(user,"<span class='warning'>That size change would cost [cost] steel, which you don't have.</span>")
//Sizing down (or not at all)
else if(cost <= 0)
cost = abs(cost)
var/actually_added = refactory.add_stored_material(MAT_STEEL,cost)
user.resize(size_factor)
user.resize(size_factor, ignore_prefs = TRUE)
if(actually_added != cost)
to_chat(user,"<span class='warning'>Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.</span>")
@@ -201,7 +201,7 @@
if(refactory.get_stored_material(MAT_GOLD) >= METAL_PER_TICK)
H.add_modifier(/datum/modifier/protean/gold, origin = refactory)
//Silver adds darksight
//Silver adds accuracy and evasion
if(refactory.get_stored_material(MAT_SILVER) >= METAL_PER_TICK)
H.add_modifier(/datum/modifier/protean/silver, origin = refactory)
@@ -58,7 +58,7 @@
ambiguous_genders = TRUE
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_NO_POSIBRAIN
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
bump_flag = MONKEY
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
@@ -162,7 +162,7 @@
// without parachute, or falling bird without free wings goes splat.
// Are we landing from orbit, or handcuffed/unconscious/tied to something?
if(planetary || !istype(H) || H.incapacitated())
if(planetary || !istype(H) || H.incapacitated(INCAPACITATION_DEFAULT|INCAPACITATION_DISABLED))
return ..()
// Are we landing on a turf? Not sure how this could not be the case, but let's be safe.
@@ -201,7 +201,7 @@
// Handled!
if(!silent)
to_chat(H, SPAN_NOTICE("You catch the air in your wings and greatly slow your fall."))
H.visible_message(SPAN_NOTICE("\The [H] glides down from above, landing safely."))
H.Stun(2)
landing.visible_message(SPAN_NOTICE("\The [H] glides down from above, landing safely."))
H.Stun(1)
playsound(H, "rustle", 25, 1)
return TRUE
@@ -1,31 +1,34 @@
#define ORGANICS 1
#define SYNTHETICS 2
/datum/trait/speed_slow
/datum/trait/negative
category = -1
/datum/trait/negative/speed_slow
name = "Slowdown"
desc = "Allows you to move slower on average than baseline."
cost = -2
var_changes = list("slowdown" = 0.5)
/datum/trait/speed_slow_plus
/datum/trait/negative/speed_slow_plus
name = "Major Slowdown"
desc = "Allows you to move MUCH slower on average than baseline."
cost = -3
var_changes = list("slowdown" = 1.0)
/datum/trait/weakling
/datum/trait/negative/weakling
name = "Weakling"
desc = "Causes heavy equipment to slow you down more when carried."
cost = -1
var_changes = list("item_slowdown_mod" = 1.5)
/datum/trait/weakling_plus
/datum/trait/negative/weakling_plus
name = "Major Weakling"
desc = "Allows you to carry heavy equipment with much more slowdown."
cost = -2
var_changes = list("item_slowdown_mod" = 2.0)
/datum/trait/endurance_low
/datum/trait/negative/endurance_low
name = "Low Endurance"
desc = "Reduces your maximum total hitpoints to 75."
cost = -2
@@ -35,7 +38,7 @@
..(S,H)
H.setMaxHealth(S.total_health)
/datum/trait/endurance_very_low
/datum/trait/negative/endurance_very_low
name = "Extremely Low Endurance"
desc = "Reduces your maximum total hitpoints to 50."
cost = -3 //Teshari HP. This makes the person a lot more suseptable to getting stunned, killed, etc.
@@ -45,108 +48,81 @@
..(S,H)
H.setMaxHealth(S.total_health)
/datum/trait/minor_brute_weak
/datum/trait/negative/minor_brute_weak
name = "Minor Brute Weakness"
desc = "Increases damage from brute damage sources by 15%"
cost = -1
var_changes = list("brute_mod" = 1.15)
/datum/trait/brute_weak
/datum/trait/negative/brute_weak
name = "Brute Weakness"
desc = "Increases damage from brute damage sources by 25%"
cost = -2
var_changes = list("brute_mod" = 1.25)
/datum/trait/brute_weak_plus
/datum/trait/negative/brute_weak_plus
name = "Major Brute Weakness"
desc = "Increases damage from brute damage sources by 50%"
cost = -3
var_changes = list("brute_mod" = 1.5)
/datum/trait/minor_burn_weak
/datum/trait/negative/minor_burn_weak
name = "Minor Burn Weakness"
desc = "Increases damage from burn damage sources by 15%"
cost = -1
var_changes = list("burn_mod" = 1.15)
/datum/trait/burn_weak
/datum/trait/negative/burn_weak
name = "Burn Weakness"
desc = "Increases damage from burn damage sources by 25%"
cost = -2
var_changes = list("burn_mod" = 1.25)
/datum/trait/burn_weak_plus
/datum/trait/negative/burn_weak_plus
name = "Major Burn Weakness"
desc = "Increases damage from burn damage sources by 50%"
cost = -3
var_changes = list("burn_mod" = 1.5)
/datum/trait/conductive
/datum/trait/negative/conductive
name = "Conductive"
desc = "Increases your susceptibility to electric shocks by 50%"
cost = -1
var_changes = list("siemens_coefficient" = 1.5) //This makes you a lot weaker to tasers.
/datum/trait/conductive_plus
/datum/trait/negative/conductive_plus
name = "Major Conductive"
desc = "Increases your susceptibility to electric shocks by 100%"
cost = -2
cost = -1
var_changes = list("siemens_coefficient" = 2.0) //This makes you extremely weak to tasers.
/datum/trait/haemophilia
/datum/trait/negative/haemophilia
name = "Haemophilia - Organics only"
desc = "When you bleed, you bleed a LOT."
cost = -2
var_changes = list("bloodloss_rate" = 2)
can_take = ORGANICS
/datum/trait/hollow
/datum/trait/negative/hollow
name = "Hollow Bones/Aluminum Alloy"
desc = "Your bones and robot limbs are much easier to break."
cost = -2 //I feel like this should be higher, but let's see where it goes
/datum/trait/hollow/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/negative/hollow/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
for(var/obj/item/organ/external/O in H.organs)
O.min_broken_damage *= 0.5
O.min_bruised_damage *= 0.5
/datum/trait/lightweight
/datum/trait/negative/lightweight
name = "Lightweight"
desc = "Your light weight and poor balance make you very susceptible to unhelpful bumping. Think of it like a bowling ball versus a pin."
cost = -2
var_changes = list("lightweight" = 1)
/datum/trait/colorblind/mono
name = "Colorblindness (Monochromancy)"
desc = "You simply can't see colors at all, period. You are 100% colorblind."
cost = -1
/datum/trait/colorblind/mono/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.add_modifier(/datum/modifier/trait/colorblind_monochrome)
/datum/trait/colorblind/para_vulp
name = "Colorblindness (Para Vulp)"
desc = "You have a severe issue with green colors and have difficulty recognizing them from red colors."
cost = -1
/datum/trait/colorblind/para_vulp/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.add_modifier(/datum/modifier/trait/colorblind_vulp)
/datum/trait/colorblind/para_taj
name = "Colorblindness (Para Taj)"
desc = "You have a minor issue with blue colors and have difficulty recognizing them from red colors."
cost = -1
/datum/trait/colorblind/para_taj/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.add_modifier(/datum/modifier/trait/colorblind_taj)
/datum/trait/neural_hypersensitivity
/datum/trait/negative/neural_hypersensitivity
name = "Neural Hypersensitivity"
desc = "Your nerves are particularly sensitive to physical changes, leading to experiencing twice the intensity of pain and pleasure alike. Doubles traumatic shock."
cost = -1
var_changes = list("trauma_mod" = 2)
can_take = ORGANICS
@@ -1,42 +1,42 @@
#define ORGANICS 1
#define SYNTHETICS 2
/datum/trait/metabolism_up
/datum/trait/neutral/metabolism_up
name = "Fast Metabolism"
desc = "You process ingested and injected reagents faster, but get hungry faster (Teshari speed)."
cost = 0
var_changes = list("metabolic_rate" = 1.2, "hunger_factor" = 0.2, "metabolism" = 0.06) // +20% rate and 4x hunger (Teshari level)
excludes = list(/datum/trait/metabolism_down, /datum/trait/metabolism_apex)
excludes = list(/datum/trait/neutral/metabolism_down, /datum/trait/neutral/metabolism_apex)
/datum/trait/metabolism_down
/datum/trait/neutral/metabolism_down
name = "Slow Metabolism"
desc = "You process ingested and injected reagents slower, but get hungry slower."
cost = 0
var_changes = list("metabolic_rate" = 0.8, "hunger_factor" = 0.04, "metabolism" = 0.0012) // -20% of default.
excludes = list(/datum/trait/metabolism_up, /datum/trait/metabolism_apex)
excludes = list(/datum/trait/neutral/metabolism_up, /datum/trait/neutral/metabolism_apex)
/datum/trait/metabolism_apex
/datum/trait/neutral/metabolism_apex
name = "Apex Metabolism"
desc = "Finally a proper excuse for your predatory actions. Essentially doubles the fast trait rates. Good for characters with big appetites."
cost = 0
var_changes = list("metabolic_rate" = 1.4, "hunger_factor" = 0.4, "metabolism" = 0.012) // +40% rate and 8x hunger (Double Teshari)
excludes = list(/datum/trait/metabolism_up, /datum/trait/metabolism_down)
excludes = list(/datum/trait/neutral/metabolism_up, /datum/trait/neutral/metabolism_down)
/datum/trait/coldadapt
/datum/trait/neutral/coldadapt
name = "Cold-Adapted"
desc = "You are able to withstand much colder temperatures than other species, and can even be comfortable in extremely cold environments. You are also more vulnerable to hot environments, and have a lower body temperature as a consequence of these adaptations."
cost = 0
var_changes = list("cold_level_1" = 200, "cold_level_2" = 150, "cold_level_3" = 90, "breath_cold_level_1" = 180, "breath_cold_level_2" = 100, "breath_cold_level_3" = 60, "cold_discomfort_level" = 210, "heat_level_1" = 330, "heat_level_2" = 380, "heat_level_3" = 700, "breath_heat_level_1" = 360, "breath_heat_level_2" = 400, "breath_heat_level_3" = 850, "heat_discomfort_level" = 295, "body_temperature" = 290)
excludes = list(/datum/trait/hotadapt)
excludes = list(/datum/trait/neutral/hotadapt)
/datum/trait/hotadapt
/datum/trait/neutral/hotadapt
name = "Heat-Adapted"
desc = "You are able to withstand much hotter temperatures than other species, and can even be comfortable in extremely hot environments. You are also more vulnerable to cold environments, and have a higher body temperature as a consequence of these adaptations."
cost = 0
var_changes = list("heat_level_1" = 420, "heat_level_2" = 460, "heat_level_3" = 1100, "breath_heat_level_1" = 440, "breath_heat_level_2" = 510, "breath_heat_level_3" = 1500, "heat_discomfort_level" = 390, "cold_level_1" = 280, "cold_level_2" = 220, "cold_level_3" = 140, "breath_cold_level_1" = 260, "breath_cold_level_2" = 240, "breath_cold_level_3" = 120, "cold_discomfort_level" = 280, "body_temperature" = 330)
excludes = list(/datum/trait/coldadapt)
excludes = list(/datum/trait/neutral/coldadapt)
/datum/trait/autohiss_unathi
/datum/trait/neutral/autohiss_unathi
name = "Autohiss (Unathi)"
desc = "You roll your S's and x's"
cost = 0
@@ -49,9 +49,9 @@
),
autohiss_exempt = list("Sinta'unathi"))
excludes = list(/datum/trait/autohiss_tajaran)
excludes = list(/datum/trait/neutral/autohiss_tajaran)
/datum/trait/autohiss_tajaran
/datum/trait/neutral/autohiss_tajaran
name = "Autohiss (Tajaran)"
desc = "You roll your R's."
cost = 0
@@ -60,74 +60,74 @@
"r" = list("rr", "rrr", "rrrr")
),
autohiss_exempt = list("Siik"))
excludes = list(/datum/trait/autohiss_unathi)
excludes = list(/datum/trait/neutral/autohiss_unathi)
/datum/trait/bloodsucker
/datum/trait/neutral/bloodsucker
name = "Bloodsucker"
desc = "Makes you unable to gain nutrition from anything but blood. To compenstate, you get fangs that can be used to drain blood from prey."
cost = 0
custom_only = FALSE
var_changes = list("organic_food_coeff" = 0) //The verb is given in human.dm
/datum/trait/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/carbon/human/proc/bloodsuck
/datum/trait/succubus_drain
/datum/trait/neutral/succubus_drain
name = "Succubus Drain"
desc = "Makes you able to gain nutrition from draining prey in your grasp."
cost = 0
custom_only = FALSE
/datum/trait/succubus_drain/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/succubus_drain/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/carbon/human/proc/succubus_drain
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_finalize
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_lethal
/datum/trait/feeder
/datum/trait/neutral/feeder
name = "Feeder"
desc = "Allows you to feed your prey using your own body."
cost = 0
custom_only = FALSE
/datum/trait/feeder/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/feeder/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/carbon/human/proc/slime_feed
/datum/trait/hard_vore
/datum/trait/neutral/hard_vore
name = "Brutal Predation"
desc = "Allows you to tear off limbs & tear out internal organs."
cost = 0
custom_only = FALSE
/datum/trait/hard_vore/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/hard_vore/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/shred_limb
/datum/trait/trashcan
/datum/trait/neutral/trashcan
name = "Trash Can"
desc = "Allows you to dispose of some garbage on the go instead of having to look for a bin or littering like an animal."
cost = 0
custom_only = FALSE
var_changes = list("trashcan" = 1)
/datum/trait/trashcan/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/trashcan/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/eat_trash
/datum/trait/gem_eater
/datum/trait/neutral/gem_eater
name = "Expensive Taste"
desc = "You only gain nutrition from raw ore and refined minerals. There's nothing that sates the appetite better than precious gems, exotic or rare minerals and you have damn fine taste. Anything else is beneath you."
cost = 0
custom_only = FALSE
var_changes = list("organic_food_coeff" = 0, "eat_minerals" = 1)
/datum/trait/gem_eater/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/gem_eater/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/eat_minerals
/datum/trait/synth_chemfurnace
/datum/trait/neutral/synth_chemfurnace
name = "Biofuel Processor"
desc = "You are able to gain energy through consuming and processing normal food. Energy-dense foods such as protein bars and survival food will yield the best results."
cost = 0
@@ -135,101 +135,101 @@
can_take = SYNTHETICS
var_changes = list("organic_food_coeff" = 0, "synthetic_food_coeff" = 0.25)
/datum/trait/glowing_eyes
/datum/trait/neutral/glowing_eyes
name = "Glowing Eyes"
desc = "Your eyes show up above darkness. SPOOKY! And kinda edgey too."
cost = 0
custom_only = FALSE
var_changes = list("has_glowing_eyes" = 1)
/datum/trait/glowing_body
/datum/trait/neutral/glowing_body
name = "Glowing Body"
desc = "Your body glows about as much as a PDA light! Settable color and toggle in Abilities tab ingame."
cost = 0
custom_only = FALSE
/datum/trait/glowing_body/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/glowing_body/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/glow_toggle
H.verbs |= /mob/living/proc/glow_color
//Allergen traits! Not available to any species with a base allergens var.
/datum/trait/allergy
/datum/trait/neutral/allergy
name = "Allergy: Gluten"
desc = "You're highly allergic to gluten proteins, which are found in most common grains."
cost = 0
custom_only = FALSE
var/allergen = GRAINS
/datum/trait/allergy/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/allergy/apply(var/datum/species/S,var/mob/living/carbon/human/H)
S.allergens |= allergen
..(S,H)
/datum/trait/allergy/meat
/datum/trait/neutral/allergy/meat
name = "Allergy: Meat"
desc = "You're highly allergic to just about any form of meat. You're probably better off just sticking to vegetables. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = MEAT
/datum/trait/allergy/fish
/datum/trait/neutral/allergy/fish
name = "Allergy: Fish"
desc = "You're highly allergic to fish. It's probably best to avoid seafood in general. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = FISH
/datum/trait/allergy/fruit
/datum/trait/neutral/allergy/fruit
name = "Allergy: Fruit"
desc = "You're highly allergic to fruit. Vegetables are fine, but you should probably read up on how to tell the difference. Remember, tomatoes are a fruit. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = FRUIT
/datum/trait/allergy/vegetable
/datum/trait/neutral/allergy/vegetable
name = "Allergy: Vegetable"
desc = "You're highly allergic to vegetables. Fruit are fine, but you should probably read up on how to tell the difference. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = VEGETABLE
/datum/trait/allergy/nuts
/datum/trait/neutral/allergy/nuts
name = "Allergy: Nuts"
desc = "You're highly allergic to hard-shell seeds, such as peanuts. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = SEEDS
/datum/trait/allergy/soy
/datum/trait/neutral/allergy/soy
name = "Allergy: Soy"
desc = "You're highly allergic to soybeans, and some other kinds of bean. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = BEANS
/datum/trait/allergy/dairy
/datum/trait/neutral/allergy/dairy
name = "Allergy: Lactose"
desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = DAIRY
/datum/trait/allergy/fungi
/datum/trait/neutral/allergy/fungi
name = "Allergy: Fungi"
desc = "You're highly allergic to fungi such as mushrooms. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = FUNGI
/datum/trait/allergy/coffee
/datum/trait/neutral/allergy/coffee
name = "Allergy: Coffee"
desc = "You're highly allergic to coffee in specific. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = COFFEE
/datum/trait/allergen_reduced_effect
/datum/trait/neutral/allergen_reduced_effect
name = "Reduced Allergen Reaction"
desc = "This trait halves the lethality of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to nonlethal reactions or special reactions (such as unathi drowsiness from sugars)."
cost = 0
@@ -237,42 +237,42 @@
var_changes = list("allergen_damage_severity" = 0.6)
// Spicy Food Traits, from negative to positive.
/datum/trait/spice_intolerance_extreme
/datum/trait/neutral/spice_intolerance_extreme
name = "Extreme Spice Intolerance"
desc = "Spicy (and chilly) peppers are three times as strong. (This does not affect pepperspray.)"
cost = 0
custom_only = FALSE
var_changes = list("spice_mod" = 3) // 300% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/spice_intolerance_basic
/datum/trait/neutral/spice_intolerance_basic
name = "Heavy Spice Intolerance"
desc = "Spicy (and chilly) peppers are twice as strong. (This does not affect pepperspray.)"
cost = 0
custom_only = FALSE
var_changes = list("spice_mod" = 2) // 200% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/spice_intolerance_slight
/datum/trait/neutral/spice_intolerance_slight
name = "Slight Spice Intolerance"
desc = "You have a slight struggle with spicy foods. Spicy (and chilly) peppers are one and a half times stronger. (This does not affect pepperspray.)"
cost = 0
custom_only = FALSE
var_changes = list("spice_mod" = 1.5) // 150% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/spice_tolerance_basic
/datum/trait/neutral/spice_tolerance_basic
name = "Spice Tolerance"
desc = "Spicy (and chilly) peppers are only three-quarters as strong. (This does not affect pepperspray.)"
cost = 0
custom_only = FALSE
var_changes = list("spice_mod" = 0.75) // 75% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/spice_tolerance_advanced
/datum/trait/neutral/spice_tolerance_advanced
name = "Strong Spice Tolerance"
desc = "Spicy (and chilly) peppers are only half as strong. (This does not affect pepperspray.)"
cost = 0
custom_only = FALSE
var_changes = list("spice_mod" = 0.5) // 50% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/spice_immunity
/datum/trait/neutral/spice_immunity
name = "Extreme Spice Tolerance"
desc = "Spicy (and chilly) peppers are basically ineffective! (This does not affect pepperspray.)"
cost = 0
@@ -280,42 +280,42 @@
var_changes = list("spice_mod" = 0.25) // 25% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
// Alcohol Traits Start Here, from negative to positive.
/datum/trait/alcohol_intolerance_advanced
/datum/trait/neutral/alcohol_intolerance_advanced
name = "Liver of Air"
desc = "The only way you can hold a drink is if it's in your own two hands, and even then you'd best not inhale too deeply near it. Drinks are three times as strong."
cost = 0
custom_only = FALSE
var_changes = list("alcohol_mod" = 3) // 300% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/alcohol_intolerance_basic
/datum/trait/neutral/alcohol_intolerance_basic
name = "Liver of Lilies"
desc = "You have a hard time with alcohol. Maybe you just never took to it, or maybe it doesn't agree with you... either way, drinks are twice as strong."
cost = 0
custom_only = FALSE
var_changes = list("alcohol_mod" = 2) // 200% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/alcohol_intolerance_slight
/datum/trait/neutral/alcohol_intolerance_slight
name = "Liver of Tulips"
desc = "You have a slight struggle with alcohol. Drinks are one and a half times stronger."
cost = 0
custom_only = FALSE
var_changes = list("alcohol_mod" = 1.5) // 150% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/alcohol_tolerance_basic
/datum/trait/neutral/alcohol_tolerance_basic
name = "Liver of Iron"
desc = "You can hold drinks much better than those lily-livered land-lubbers! Arr! Drinks are only three-quarters as strong."
cost = 0
custom_only = FALSE
var_changes = list("alcohol_mod" = 0.75) // 75% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/alcohol_tolerance_advanced
/datum/trait/neutral/alcohol_tolerance_advanced
name = "Liver of Steel"
desc = "Drinks tremble before your might! You can hold your alcohol twice as well as those blue-bellied barnacle boilers! Drinks are only half as strong."
cost = 0
custom_only = FALSE
var_changes = list("alcohol_mod" = 0.5) // 50% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/alcohol_immunity
/datum/trait/neutral/alcohol_immunity
name = "Liver of Durasteel"
desc = "You've drunk so much that most booze doesn't even faze you. It takes something like a Pan-Galactic or a pint of Deathbell for you to even get slightly buzzed."
cost = 0
@@ -323,99 +323,126 @@
var_changes = list("alcohol_mod" = 0.25) // 25% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
// Alcohol Traits End Here.
/datum/trait/neutral/colorblind/mono
name = "Colorblindness (Monochromancy)"
desc = "You simply can't see colors at all, period. You are 100% colorblind."
cost = 0
/datum/trait/neutral/colorblind/mono/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.add_modifier(/datum/modifier/trait/colorblind_monochrome)
/datum/trait/neutral/colorblind/para_vulp
name = "Colorblindness (Para Vulp)"
desc = "You have a severe issue with green colors and have difficulty recognizing them from red colors."
cost = 0
/datum/trait/neutral/colorblind/para_vulp/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.add_modifier(/datum/modifier/trait/colorblind_vulp)
/datum/trait/neutral/colorblind/para_taj
name = "Colorblindness (Para Taj)"
desc = "You have a minor issue with blue colors and have difficulty recognizing them from red colors."
cost = 0
/datum/trait/neutral/colorblind/para_taj/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.add_modifier(/datum/modifier/trait/colorblind_taj)
// Body shape traits
/datum/trait/taller
/datum/trait/neutral/taller
name = "Tall"
desc = "Your body is taller than average."
cost = 0
custom_only = FALSE
var_changes = list("icon_scale_y" = 1.09)
excludes = list(/datum/trait/tall, /datum/trait/short, /datum/trait/shorter)
excludes = list(/datum/trait/neutral/tall, /datum/trait/neutral/short, /datum/trait/neutral/shorter)
/datum/trait/taller/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/taller/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.update_transform()
/datum/trait/tall
/datum/trait/neutral/tall
name = "Slightly Tall"
desc = "Your body is a bit taller than average."
cost = 0
custom_only = FALSE
var_changes = list("icon_scale_y" = 1.05)
excludes = list(/datum/trait/taller, /datum/trait/short, /datum/trait/shorter)
excludes = list(/datum/trait/neutral/taller, /datum/trait/neutral/short, /datum/trait/neutral/shorter)
/datum/trait/tall/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/tall/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.update_transform()
/datum/trait/short
/datum/trait/neutral/short
name = "Slightly Short"
desc = "Your body is a bit shorter than average."
cost = 0
custom_only = FALSE
var_changes = list("icon_scale_y" = 0.95)
excludes = list(/datum/trait/taller, /datum/trait/tall, /datum/trait/shorter)
excludes = list(/datum/trait/neutral/taller, /datum/trait/neutral/tall, /datum/trait/neutral/shorter)
/datum/trait/short/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/short/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.update_transform()
/datum/trait/shorter
/datum/trait/neutral/shorter
name = "Short"
desc = "Your body is shorter than average."
cost = 0
custom_only = FALSE
var_changes = list("icon_scale_y" = 0.915)
excludes = list(/datum/trait/taller, /datum/trait/tall, /datum/trait/short)
excludes = list(/datum/trait/neutral/taller, /datum/trait/neutral/tall, /datum/trait/neutral/short)
/datum/trait/shorter/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/shorter/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.update_transform()
/datum/trait/obese
/datum/trait/neutral/obese
name = "Very Bulky"
desc = "Your body is much wider than average."
cost = 0
custom_only = FALSE
var_changes = list("icon_scale_x" = 1.095)
excludes = list(/datum/trait/fat, /datum/trait/thin, /datum/trait/thinner)
excludes = list(/datum/trait/neutral/fat, /datum/trait/neutral/thin, /datum/trait/neutral/thinner)
/datum/trait/obese/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/obese/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.update_transform()
/datum/trait/fat
/datum/trait/neutral/fat
name = "Bulky"
desc = "Your body is wider than average."
cost = 0
custom_only = FALSE
var_changes = list("icon_scale_x" = 1.054)
excludes = list(/datum/trait/obese, /datum/trait/thin, /datum/trait/thinner)
excludes = list(/datum/trait/neutral/obese, /datum/trait/neutral/thin, /datum/trait/neutral/thinner)
/datum/trait/fat/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/fat/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.update_transform()
/datum/trait/thin
/datum/trait/neutral/thin
name = "Thin"
desc = "Your body is thinner than average."
cost = 0
custom_only = FALSE
var_changes = list("icon_scale_x" = 0.945)
excludes = list(/datum/trait/fat, /datum/trait/obese, /datum/trait/thinner)
excludes = list(/datum/trait/neutral/fat, /datum/trait/neutral/obese, /datum/trait/neutral/thinner)
/datum/trait/thin/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/thin/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.update_transform()
/datum/trait/thinner
/datum/trait/neutral/thinner
name = "Very Thin"
desc = "Your body is much thinner than average."
cost = 0
custom_only = FALSE
var_changes = list("icon_scale_x" = 0.905)
excludes = list(/datum/trait/fat, /datum/trait/obese, /datum/trait/thin)
excludes = list(/datum/trait/neutral/fat, /datum/trait/neutral/obese, /datum/trait/neutral/thin)
/datum/trait/thinner/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/neutral/thinner/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.update_transform()
@@ -1,25 +1,28 @@
#define ORGANICS 1
#define SYNTHETICS 2
/datum/trait/speed_fast
/datum/trait/positive
category = 1
/datum/trait/positive/speed_fast
name = "Haste"
desc = "Allows you to move faster on average than baseline."
cost = 4
var_changes = list("slowdown" = -0.5)
/datum/trait/hardy
/datum/trait/positive/hardy
name = "Hardy"
desc = "Allows you to carry heavy equipment with less slowdown."
cost = 1
var_changes = list("item_slowdown_mod" = 0.5)
/datum/trait/hardy_plus
/datum/trait/positive/hardy_plus
name = "Major Hardy"
desc = "Allows you to carry heavy equipment with almost no slowdown."
cost = 2
var_changes = list("item_slowdown_mod" = 0.1)
var_changes = list("item_slowdown_mod" = 0.25)
/datum/trait/endurance_high
/datum/trait/positive/endurance_high
name = "High Endurance"
desc = "Increases your maximum total hitpoints to 125"
cost = 4
@@ -29,127 +32,127 @@
..(S,H)
H.setMaxHealth(S.total_health)
/datum/trait/nonconductive
/datum/trait/positive/nonconductive
name = "Non-Conductive"
desc = "Decreases your susceptibility to electric shocks by a 10% amount."
cost = 1 //This effects tasers!
var_changes = list("siemens_coefficient" = 0.9)
/datum/trait/positive/nonconductive_plus
name = "Major Non-Conductive"
desc = "Decreases your susceptibility to electric shocks by a 25% amount."
cost = 2 //This effects tasers!
cost = 2 //Let us not forget this effects tasers!
var_changes = list("siemens_coefficient" = 0.75)
/datum/trait/nonconductive_plus
name = "Major Non-Conductive"
desc = "Decreases your susceptibility to electric shocks by a 50% amount."
cost = 3 //Let us not forget this effects tasers!
var_changes = list("siemens_coefficient" = 0.5)
/datum/trait/darksight
/datum/trait/positive/darksight
name = "Darksight"
desc = "Allows you to see a short distance in the dark."
cost = 1
var_changes = list("darksight" = 5, "flash_mod" = 2.0)
var_changes = list("darksight" = 5, "flash_mod" = 1.1)
/datum/trait/darksight_plus
/datum/trait/positive/darksight_plus
name = "Darksight (Major)"
desc = "Allows you to see in the dark for the whole screen."
cost = 2
var_changes = list("darksight" = 8, "flash_mod" = 3.0)
var_changes = list("darksight" = 8, "flash_mod" = 1.2)
/datum/trait/melee_attack
/datum/trait/positive/melee_attack
name = "Sharp Melee"
desc = "Provides sharp melee attacks that do slightly more damage."
cost = 1
var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp))
/datum/trait/melee_attack_fangs
/datum/trait/positive/melee_attack_fangs
name = "Sharp Melee & Numbing Fangs"
desc = "Provides sharp melee attacks that do slightly more damage, along with fangs that makes the person bit unable to feel their body or pain."
cost = 2
var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp, /datum/unarmed_attack/bite/sharp/numbing))
/datum/trait/fangs
/datum/trait/positive/fangs
name = "Numbing Fangs"
desc = "Provides fangs that makes the person bit unable to feel their body or pain."
cost = 1
var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite/sharp/numbing))
/datum/trait/minor_brute_resist
/datum/trait/positive/minor_brute_resist
name = "Minor Brute Resist"
desc = "Adds 15% resistance to brute damage sources."
cost = 2
var_changes = list("brute_mod" = 0.85)
/datum/trait/brute_resist
/datum/trait/positive/brute_resist
name = "Brute Resist"
desc = "Adds 25% resistance to brute damage sources."
cost = 3
var_changes = list("brute_mod" = 0.75)
excludes = list(/datum/trait/minor_burn_resist,/datum/trait/burn_resist)
excludes = list(/datum/trait/positive/minor_burn_resist,/datum/trait/positive/burn_resist)
/datum/trait/minor_burn_resist
/datum/trait/positive/minor_burn_resist
name = "Minor Burn Resist"
desc = "Adds 15% resistance to burn damage sources."
cost = 2
var_changes = list("burn_mod" = 0.85)
/datum/trait/burn_resist
/datum/trait/positive/burn_resist
name = "Burn Resist"
desc = "Adds 25% resistance to burn damage sources."
cost = 3
var_changes = list("burn_mod" = 0.75)
excludes = list(/datum/trait/minor_brute_resist,/datum/trait/brute_resist)
excludes = list(/datum/trait/positive/minor_brute_resist,/datum/trait/positive/brute_resist)
/datum/trait/photoresistant
/datum/trait/positive/photoresistant
name = "Photoresistant"
desc = "Decreases stun duration from flashes and other light-based stuns and disabilities by 50%"
desc = "Decreases stun duration from flashes and other light-based stuns and disabilities by 20%"
cost = 1
var_changes = list("flash_mod" = 0.5)
var_changes = list("flash_mod" = 0.8)
/datum/trait/winged_flight
/datum/trait/positive/winged_flight
name = "Winged Flight"
desc = "Allows you to fly by using your wings. Don't forget to bring them!"
cost = 1
cost = 0
/datum/trait/winged_flight/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/positive/winged_flight/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/flying_toggle
H.verbs |= /mob/living/proc/start_wings_hovering
/datum/trait/hardfeet
/datum/trait/positive/hardfeet
name = "Hard Feet"
desc = "Makes your nice clawed, scaled, hooved, armored, or otherwise just awfully calloused feet immune to glass shards."
cost = 1
cost = 0
var_changes = list("flags" = NO_MINOR_CUT) //Checked the flag is only used by shard stepping.
/datum/trait/antiseptic_saliva
/datum/trait/positive/antiseptic_saliva
name = "Antiseptic Saliva"
desc = "Your saliva has especially strong antiseptic properties that can be used to heal small wounds."
cost = 1
/datum/trait/antiseptic_saliva/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/positive/antiseptic_saliva/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..()
H.verbs |= /mob/living/carbon/human/proc/lick_wounds
/datum/trait/traceur
/datum/trait/positive/traceur
name = "Traceur"
desc = "You're capable of parkour and can *flip over low objects (most of the time)."
cost = 2
var_changes = list("agility" = 90)
/datum/trait/snowwalker
/datum/trait/positive/snowwalker
name = "Snow Walker"
desc = "You are able to move unhindered on snow."
cost = 1
var_changes = list("snow_movement" = -2)
/datum/trait/weaver
/datum/trait/positive/weaver
name = "Weaver"
desc = "You can produce silk and create various articles of clothing and objects."
cost = 2
var_changes = list("is_weaver" = 1)
/datum/trait/weaver/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/positive/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
H.verbs |= /mob/living/carbon/human/proc/set_silk_color
H.verbs |= /mob/living/carbon/human/proc/set_silk_color
@@ -5,7 +5,8 @@
var/name
var/desc = "Contact a developer if you see this trait."
var/cost = 0 // 0 is neutral, negative cost means negative, positive cost means positive.
var/cost = 0
var/category = 0 // What category this trait is. -1 is Negative, 0 is Neutral, 1 is Positive
var/list/var_changes // A list to apply to the custom species vars.
var/list/excludes // Store a list of paths of traits to exclude, but done automatically if they change the same vars.
var/can_take = ORGANICS|SYNTHETICS // Can freaking synths use those.
File diff suppressed because it is too large Load Diff
@@ -5,8 +5,6 @@
var/ooc_notes = null
appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER
var/hunger_rate = DEFAULT_HUNGER_FACTOR
var/resizable = TRUE
//custom say verbs
var/custom_say = null
var/custom_ask = null
+2 -2
View File
@@ -8,7 +8,7 @@ var/list/department_radio_keys = list(
":n" = "Science", ".n" = "Science",
":m" = "Medical", ".m" = "Medical",
":e" = "Engineering", ".e" = "Engineering",
":k" = "Response Team", ".k" = "Response Team", //TFF 11/3/20 - Add Response Team to channels usable rather than resorting to :H or such.,
":k" = "Response Team", ".k" = "Response Team",
":s" = "Security", ".s" = "Security",
":w" = "whisper", ".w" = "whisper",
":t" = "Mercenary", ".t" = "Mercenary",
@@ -27,7 +27,7 @@ var/list/department_radio_keys = list(
":N" = "Science", ".N" = "Science",
":M" = "Medical", ".M" = "Medical",
":E" = "Engineering", ".E" = "Engineering",
":k" = "Response Team", ".k" = "Response Team", //TFF 11/3/20 - Add Response Team to channels usable rather than resorting to :H or such.,
":k" = "Response Team", ".k" = "Response Team",
":S" = "Security", ".S" = "Security",
":W" = "whisper", ".W" = "whisper",
":T" = "Mercenary", ".T" = "Mercenary",
+2 -3
View File
@@ -53,7 +53,7 @@
"Chirp" = list("chirps","chirrups","cheeps"),
"Feline" = list("purrs","yowls","meows"),
"Canine" = list("yaps","barks","woofs"),
"Rodent" = list("squeaks", "SQUEAKS", "sqiks") //VOREStation Edit - TFF 22/11/19 - CHOMPStation port of pAI additions,
"Rodent" = list("squeaks", "SQUEAKS", "sqiks") //VOREStation Edit
)
var/obj/item/weapon/pai_cable/cable // The cable we produce and use when door or camera jacking
@@ -330,8 +330,7 @@
close_up()
//VOREStation Removal Start - TFF 22/11/19 - Refactored in pai_vr.dm
/*
/* //VOREStation Removal Start
/mob/living/silicon/pai/proc/choose_chassis()
set category = "pAI Commands"
set name = "Choose Chassis"
@@ -1,7 +1,6 @@
/mob/living/silicon/pai
var/people_eaten = 0
icon = 'icons/mob/pai_vr.dmi'
//TFF 22/11/19 - CHOMPStation port of pAI additions.
var/global/list/wide_chassis = list(
"rat",
"panther"
@@ -36,7 +35,6 @@
else if(people_eaten && resting)
icon_state = "[chassis]_rest_full"
//TFF 22/11/19 - CHOMPStation port of pAI additions.
if(chassis in wide_chassis)
icon = 'icons/mob/pai_vr64x64.dmi'
pixel_x = -16
@@ -58,7 +56,6 @@
else if(people_eaten && resting)
icon_state = "[chassis]_rest_full"
//TFF 22/11/19 - CHOMPStation port of pAI additions.
if(chassis in wide_chassis)
icon = 'icons/mob/pai_vr64x64.dmi'
pixel_x = -16
@@ -89,7 +89,7 @@
// Close to mid-ranged shooter that arcs over other things, ideal if allies are in front of it.
// Difference from siege hivebots is that siege hivebots have limited charges for their attacks, are very long range, and \
// Difference from siege hivebots is that siege hivebots have limited charges for their attacks, are very long range, and
// the projectiles have an AoE component, where as backline hivebots do not.
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/backline
name = "backline hivebot"
@@ -121,7 +121,7 @@
else if(ismob(target))
var/mob/living/M = target
resize(M.size_multiplier)
resize(M.size_multiplier, ignore_prefs = TRUE)
//Morphed is weaker
melee_damage_lower = melee_damage_disguised
@@ -165,7 +165,7 @@
maptext = null
size_multiplier = our_size_multiplier
resize(size_multiplier)
resize(size_multiplier, ignore_prefs = TRUE)
//Baseline stats
melee_damage_lower = initial(melee_damage_lower)
@@ -183,7 +183,7 @@
/mob/living/simple_mob/vore/hostile/morph/will_show_tooltip()
return (!morphed)
/mob/living/simple_mob/vore/hostile/morph/resize(var/new_size, var/animate = TRUE)
/mob/living/simple_mob/vore/hostile/morph/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE)
if(morphed && !ismob(form))
return
return ..()
@@ -1,3 +1,2 @@
//TFF 5/8/19 - add randomised sensor setting for random button clicking
/datum/preferences/randomize_appearance_and_body_for(var/mob/living/carbon/human/H)
sensorpref = rand(1,5)
@@ -728,3 +728,9 @@
icon_state = "unathilongfrills"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/vr/thunderthighs
name = "Boosted Thighs"
icon_state = "thunderthighs"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG,BP_R_LEG)
@@ -146,7 +146,6 @@
suit_sprites = 'icons/mob/taursuits_wolf.dmi'
icon_sprite_tag = "wolf"
//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/fatwolf
name = "Fat Wolf (Taur)"
icon_state = "fatwolf_s"
@@ -158,7 +157,6 @@
extra_overlay = "wolf_markings"
//icon_sprite_tag = "wolf2c"
//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c
name = "Fat Wolf dual-color (Taur)"
icon_state = "fatwolf_s"
@@ -245,7 +243,6 @@
suit_sprites = 'icons/mob/taursuits_feline.dmi'
icon_sprite_tag = "feline"
//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/fatfeline
name = "Fat Feline (Taur)"
icon_state = "fatfeline_s"
@@ -262,7 +259,6 @@
extra_overlay = "feline_markings"
//icon_sprite_tag = "feline2c"
//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/feline/fatfeline_2c
name = "Fat Feline dual-color (Taur)"
icon_state = "fatfeline_s"
@@ -57,7 +57,6 @@
suit_sprites = 'icons/mob/taursuits_wolf_vr.dmi'
icon_sprite_tag = "wolf"
//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/fatwolf
name = "Fat Wolf (Taur)"
icon_state = "fatwolf_s"
@@ -70,7 +69,6 @@
extra_overlay2 = "wolf_markings_2"
//icon_sprite_tag = "wolf2c"
//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c
name = "Fat Wolf 3-color (Taur)"
icon_state = "fatwolf_s"
@@ -276,7 +274,6 @@
suit_sprites = 'icons/mob/taursuits_feline_vr.dmi'
icon_sprite_tag = "feline"
//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/fatfeline
name = "Fat Feline (Taur)"
icon_state = "fatfeline_s"
@@ -294,7 +291,6 @@
extra_overlay2 = "feline_markings_2"
//icon_sprite_tag = "feline2c"
//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/feline/fatfeline_2c
name = "Fat Feline 3-color (Taur)"
icon_state = "fatfeline_s"
+1 -1
View File
@@ -192,7 +192,7 @@
var/datum/preferences/B = O.client.prefs
for(var/language in B.alternate_languages)
O.add_language(language)
O.resize(B.size_multiplier, animate = TRUE) //VOREStation Addition: add size prefs to borgs
O.resize(B.size_multiplier, animate = TRUE, ignore_prefs = TRUE) //VOREStation Addition: add size prefs to borgs
O.fuzzy = B.fuzzy //VOREStation Addition: add size prefs to borgs
callHook("borgify", list(O))
-9
View File
@@ -9,17 +9,8 @@
return
// Obsolete
/mob/proc/update_icons_layers()
return
/mob/proc/update_icons_huds()
return
/mob/proc/update_icons_body()
return
/mob/proc/update_icons_all()
return
// End obsolete
/mob/proc/update_hud()
@@ -7,7 +7,6 @@
illegal = TRUE
wear = 3
access = 999 //Prevents anyone from buying it without an emag.
activates = FALSE //It's armor.
combat_flags = (NIF_C_BRUTEARMOR) // Default on when installed, clear when uninstalled
/datum/nifsoft/burn_armor
@@ -19,7 +18,6 @@
illegal = TRUE
wear = 3
access = 999 //Prevents anyone from buying it without an emag.
activates = FALSE //It's armor.
combat_flags = (NIF_C_BURNARMOR) // Default on when installed, clear when uninstalled
/datum/nifsoft/painkillers
+1 -1
View File
@@ -134,7 +134,7 @@
to_chat(nif.human,"<span class='notice'>The safety features of the NIF Program prevent you from choosing this size.</span>")
return
else
if(nif.human.resize(new_size/100))
if(nif.human.resize(new_size/100, uncapped=nif.human.has_large_resize_bounds(), ignore_prefs = TRUE))
to_chat(nif.human,"<span class='notice'>You set the size to [new_size]%</span>")
nif.human.visible_message("<span class='warning'>Swirling grey mist envelops [nif.human] as they change size!</span>","<span class='notice'>Swirling streams of nanites wrap around you as you change size!</span>")
spawn(0)
+1 -1
View File
@@ -73,7 +73,7 @@ proc/get_deepspace(x,y)
/mob/lost_in_space()
return isnull(client)
/mob/living/lost_in_space()
/mob/living/carbon/human/lost_in_space()
return FALSE
// return isnull(client) && !key && stat == DEAD // Allows bodies that players have ghosted from to be deleted - Ater
+30 -35
View File
@@ -216,15 +216,17 @@ var/datum/planet/sif/planet_sif = null
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
indoor_sounds_type = /datum/looping_sound/weather/inside_snow
/*
/datum/weather/sif/snow/process_effects()
..()
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(33))
T.chill()
*/
/datum/weather/sif/blizzard
name = "blizzard"
@@ -249,15 +251,17 @@ var/datum/planet/sif/planet_sif = null
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
/*
/datum/weather/sif/blizzard/process_effects()
..()
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(50))
T.chill()
*/
/datum/weather/sif/rain
name = "rain"
@@ -283,25 +287,21 @@ var/datum/planet/sif/planet_sif = null
/datum/weather/sif/rain/process_effects()
..()
for(var/mob/living/L in living_mob_list)
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(!istype(U) || !U.open)
U = L.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
L.water_act(1)
if(show_message)
@@ -340,24 +340,21 @@ var/datum/planet/sif/planet_sif = null
/datum/weather/sif/storm/process_effects()
..()
for(var/mob/living/L in living_mob_list)
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(!istype(U) || !U.open)
U = L.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
L.water_act(2)
@@ -401,20 +398,18 @@ var/datum/planet/sif/planet_sif = null
/datum/weather/sif/hail/process_effects()
..()
for(var/humie in human_mob_list)
var/mob/living/carbon/human/H = humie
for(var/mob/living/carbon/H as anything in human_mob_list)
if(H.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(H)
if(!T.outdoors)
continue // They're indoors, so no need to pelt them with ice.
// If they have an open umbrella, it'll guard from hail
var/obj/item/weapon/melee/umbrella/U
if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella))
U = H.get_active_hand()
else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
if(!istype(U) || !U.open)
U = H.get_inactive_hand()
if(U && U.open)
if(istype(U) && U.open)
if(show_message)
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
continue
+500
View File
@@ -0,0 +1,500 @@
var/datum/planet/virgo3b_better/planet_virgo3b_better = null
/datum/time/virgo3b_better
seconds_in_day = 6 HOURS
/datum/planet/virgo3b_better
name = "Virgo-3BB"
desc = "A surprising discovery! Aparently there were moons around Virgo-3B! Moreover, one of them seems to be a perfect habitable paradise, with vegetation, greenery, and \
generally everything one could want out of the planet. So the station was simply plucked off the original spot and put on the moon's moon with minor alterations."
current_time = new /datum/time/virgo3b_better()
// expected_z_levels = list(1) // This is defined elsewhere.
planetary_wall_type = /turf/unsimulated/wall/planetary/virgo3b_better
/datum/planet/virgo3b_better/New()
..()
planet_virgo3b_better = src
weather_holder = new /datum/weather_holder/virgo3b_better(src)
/datum/planet/virgo3b_better/update_sun()
..()
var/datum/time/time = current_time
var/length_of_day = time.seconds_in_day / 10 / 60 / 60
var/noon = length_of_day / 2
var/distance_from_noon = abs(text2num(time.show_time("hh")) - noon)
sun_position = distance_from_noon / noon
sun_position = abs(sun_position - 1)
var/new_brightness = null
var/new_color = null
switch(sun_position)
if(0 to 0.10) // Night
new_brightness = 0.8
new_color = "#DDBB22"
if(0.10 to 0.15) // Twilight
new_brightness = 1.5
new_color = "#EEDD55"
if(0.15 to 0.20) // Sunrise/set
new_brightness = 4
new_color = "#FFFFBB"
if(0.20 to 1.00) // Noon
new_brightness = 7
new_color = "#FFFFFF"
var/weather_light_modifier = 1
if(weather_holder && weather_holder.current_weather)
weather_light_modifier = weather_holder.current_weather.light_modifier
new_brightness = new_brightness * weather_light_modifier
if(weather_holder && weather_holder.current_weather && weather_holder.current_weather.light_color)
new_color = weather_holder.current_weather.light_color
spawn(1)
update_sun_deferred(2, new_brightness, new_color)
/datum/weather_holder/virgo3b_better
temperature = T0C
allowed_weather_types = list(
WEATHER_CLEAR = new /datum/weather/virgo3b_better/clear(),
WEATHER_OVERCAST = new /datum/weather/virgo3b_better/overcast(),
WEATHER_LIGHT_SNOW = new /datum/weather/virgo3b_better/light_snow(),
WEATHER_SNOW = new /datum/weather/virgo3b_better/snow(),
WEATHER_BLIZZARD = new /datum/weather/virgo3b_better/blizzard(),
WEATHER_RAIN = new /datum/weather/virgo3b_better/rain(),
WEATHER_STORM = new /datum/weather/virgo3b_better/storm(),
WEATHER_HAIL = new /datum/weather/virgo3b_better/hail(),
WEATHER_BLOOD_MOON = new /datum/weather/virgo3b_better/blood_moon(),
WEATHER_EMBERFALL = new /datum/weather/virgo3b_better/emberfall(),
WEATHER_ASH_STORM = new /datum/weather/virgo3b_better/ash_storm(),
WEATHER_FALLOUT = new /datum/weather/virgo3b_better/fallout(),
WEATHER_PARTY = new /datum/weather/virgo3b_better/party()
)
roundstart_weather_chances = list(
WEATHER_CLEAR = 30,
WEATHER_OVERCAST = 5
)
/datum/weather/virgo3b_better
name = "virgo3bb base"
temp_high = 295.15 // -20c
temp_low = 291.15 // -30c
/datum/weather/virgo3b_better/clear
name = "clear"
transition_chances = list(
WEATHER_CLEAR = 60,
WEATHER_OVERCAST = 20
)
transition_messages = list(
"The sky clears up.",
"The sky is visible.",
"The weather is calm."
)
sky_visible = TRUE
observed_message = "The sky is clear."
/datum/weather/virgo3b_better/overcast
name = "overcast"
transition_chances = list(
WEATHER_CLEAR = 25,
WEATHER_OVERCAST = 50,
WEATHER_RAIN = 10
)
observed_message = "It is overcast, all you can see are clouds."
transition_messages = list(
"All you can see above are clouds.",
"Clouds cut off your view of the sky.",
"It's very cloudy."
)
/datum/weather/virgo3b_better/light_snow
name = "light snow"
icon_state = "snowfall_light"
temp_high = 235.15
temp_low = 225.15
light_modifier = 0.7
transition_chances = list(
WEATHER_OVERCAST = 20,
WEATHER_LIGHT_SNOW = 50,
WEATHER_SNOW = 25,
WEATHER_HAIL = 5
)
observed_message = "It is snowing lightly."
transition_messages = list(
"Small snowflakes begin to fall from above.",
"It begins to snow lightly.",
)
/datum/weather/virgo3b_better/snow
name = "moderate snow"
icon_state = "snowfall_med"
temp_high = 230.15
temp_low = 220.15
wind_high = 2
wind_low = 0
light_modifier = 0.5
flight_failure_modifier = 5
transition_chances = list(
WEATHER_LIGHT_SNOW = 20,
WEATHER_SNOW = 50,
WEATHER_BLIZZARD = 20,
WEATHER_HAIL = 5,
WEATHER_OVERCAST = 5
)
observed_message = "It is snowing."
transition_messages = list(
"It's starting to snow.",
"The air feels much colder as snowflakes fall from above."
)
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
indoor_sounds_type = /datum/looping_sound/weather/inside_snow
/*
/datum/weather/virgo3b_better/snow/process_effects()
..()
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(33))
T.chill()
*/
/datum/weather/virgo3b_better/blizzard
name = "blizzard"
icon_state = "snowfall_heavy"
temp_high = 215.15
temp_low = 200.15
wind_high = 4
wind_low = 2
light_modifier = 0.3
flight_failure_modifier = 10
transition_chances = list(
WEATHER_SNOW = 45,
WEATHER_BLIZZARD = 40,
WEATHER_HAIL = 10,
WEATHER_OVERCAST = 5
)
observed_message = "A blizzard blows snow everywhere."
transition_messages = list(
"Strong winds howl around you as a blizzard appears.",
"It starts snowing heavily, and it feels extremly cold now."
)
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
/*
/datum/weather/virgo3b_better/blizzard/process_effects()
..()
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(50))
T.chill()
*/
/datum/weather/virgo3b_better/rain
name = "rain"
icon_state = "rain"
wind_high = 2
wind_low = 1
light_modifier = 0.5
effect_message = "<span class='warning'>Rain falls on you.</span>"
transition_chances = list(
WEATHER_OVERCAST = 25,
WEATHER_CLEAR = 25
)
observed_message = "It is raining."
transition_messages = list(
"The sky is dark, and rain falls down upon you."
)
outdoor_sounds_type = /datum/looping_sound/weather/rain
indoor_sounds_type = /datum/looping_sound/weather/rain/indoors
/datum/weather/virgo3b_better/rain/process_effects()
..()
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(!istype(U) || !U.open)
U = L.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
L.water_act(1)
if(show_message)
to_chat(L, effect_message)
/datum/weather/virgo3b_better/storm
name = "storm"
icon_state = "storm"
wind_high = 4
wind_low = 2
light_modifier = 0.3
flight_failure_modifier = 10
effect_message = "<span class='warning'>Rain falls on you, drenching you in water.</span>"
var/next_lightning_strike = 0 // world.time when lightning will strike.
var/min_lightning_cooldown = 5 SECONDS
var/max_lightning_cooldown = 1 MINUTE
observed_message = "An intense storm pours down over the region."
transition_messages = list(
"You feel intense winds hit you as the weather takes a turn for the worst.",
"Loud thunder is heard in the distance.",
"A bright flash heralds the approach of a storm."
)
outdoor_sounds_type = /datum/looping_sound/weather/rain
indoor_sounds_type = /datum/looping_sound/weather/rain/indoors
transition_chances = list(
WEATHER_RAIN = 45,
WEATHER_STORM = 40,
WEATHER_HAIL = 10,
WEATHER_OVERCAST = 5
)
/datum/weather/virgo3b_better/storm/process_effects()
..()
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(!istype(U) || !U.open)
U = L.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
L.water_act(2)
if(show_message)
to_chat(L, effect_message)
handle_lightning()
// This gets called to do lightning periodically.
// There is a seperate function to do the actual lightning strike, so that badmins can play with it.
/datum/weather/virgo3b_better/storm/proc/handle_lightning()
if(world.time < next_lightning_strike)
return // It's too soon to strike again.
next_lightning_strike = world.time + rand(min_lightning_cooldown, max_lightning_cooldown)
var/turf/T = pick(holder.our_planet.planet_floors) // This has the chance to 'strike' the sky, but that might be a good thing, to scare reckless pilots.
lightning_strike(T)
/datum/weather/virgo3b_better/hail
name = "hail"
icon_state = "hail"
light_modifier = 0.3
flight_failure_modifier = 15
timer_low_bound = 2
timer_high_bound = 5
effect_message = "<span class='warning'>The hail smacks into you!</span>"
transition_chances = list(
WEATHER_RAIN = 45,
WEATHER_STORM = 40,
WEATHER_HAIL = 10,
WEATHER_OVERCAST = 5
)
observed_message = "Ice is falling from the sky."
transition_messages = list(
"Ice begins to fall from the sky.",
"It begins to hail.",
"An intense chill is felt, and chunks of ice start to fall from the sky, towards you."
)
/datum/weather/virgo3b_better/hail/process_effects()
..()
for(var/mob/living/carbon/H as anything in human_mob_list)
if(H.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(H)
if(!T.outdoors)
continue // They're indoors, so no need to pelt them with ice.
// If they have an open umbrella, it'll guard from hail
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
if(!istype(U) || !U.open)
U = H.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
continue
var/target_zone = pick(BP_ALL)
var/amount_blocked = H.run_armor_check(target_zone, "melee")
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
var/damage = rand(1,3)
if(amount_blocked >= 30)
continue // No need to apply damage. Hardhats are 30. They should probably protect you from hail on your head.
//Voidsuits are likewise 40, and riot, 80. Clothes are all less than 30.
if(amount_soaked >= damage)
continue // No need to apply damage.
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
if(show_message)
to_chat(H, effect_message)
/datum/weather/virgo3b_better/blood_moon
name = "blood moon"
light_modifier = 0.5
light_color = "#FF0000"
flight_failure_modifier = 25
transition_chances = list(
WEATHER_BLOODMOON = 100
)
observed_message = "Everything is red. Something really ominous is going on."
transition_messages = list(
"The sky turns blood red!"
)
outdoor_sounds_type = /datum/looping_sound/weather/wind
indoor_sounds_type = /datum/looping_sound/weather/wind/indoors
// Ash and embers fall forever, such as from a volcano or something.
/datum/weather/virgo3b_better/emberfall
name = "emberfall"
icon_state = "ashfall_light"
light_modifier = 0.7
light_color = "#880000"
temp_high = 293.15 // 20c
temp_low = 283.15 // 10c
flight_failure_modifier = 20
transition_chances = list(
WEATHER_EMBERFALL = 100
)
observed_message = "Soot, ash, and embers float down from above."
transition_messages = list(
"Gentle embers waft down around you like grotesque snow."
)
outdoor_sounds_type = /datum/looping_sound/weather/wind
indoor_sounds_type = /datum/looping_sound/weather/wind/indoors
// Like the above but a lot more harmful.
/datum/weather/virgo3b_better/ash_storm
name = "ash storm"
icon_state = "ashfall_heavy"
light_modifier = 0.1
light_color = "#FF0000"
temp_high = 323.15 // 50c
temp_low = 313.15 // 40c
wind_high = 6
wind_low = 3
flight_failure_modifier = 50
transition_chances = list(
WEATHER_ASH_STORM = 100
)
observed_message = "All that can be seen is black smoldering ash."
transition_messages = list(
"Smoldering clouds of scorching ash billow down around you!"
)
// Lets recycle.
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
/datum/weather/virgo3b_better/ash_storm/process_effects()
..()
for(var/thing in living_mob_list)
var/mob/living/L = thing
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
continue // They're indoors, so no need to burn them with ash.
L.inflict_heat_damage(rand(1, 3))
// Totally radical.
/datum/weather/virgo3b_better/fallout
name = "fallout"
icon_state = "fallout"
light_modifier = 0.7
light_color = "#CCFFCC"
flight_failure_modifier = 30
transition_chances = list(
WEATHER_FALLOUT = 100
)
observed_message = "Radioactive soot and ash rains down from the heavens."
transition_messages = list(
"Radioactive soot and ash start to float down around you, contaminating whatever they touch."
)
outdoor_sounds_type = /datum/looping_sound/weather/wind
indoor_sounds_type = /datum/looping_sound/weather/wind/indoors
// How much radiation a mob gets while on an outside tile.
var/direct_rad_low = RAD_LEVEL_LOW
var/direct_rad_high = RAD_LEVEL_MODERATE
// How much radiation is bursted onto a random tile near a mob.
var/fallout_rad_low = RAD_LEVEL_HIGH
var/fallout_rad_high = RAD_LEVEL_VERY_HIGH
/datum/weather/virgo3b_better/fallout/process_effects()
..()
for(var/thing in living_mob_list)
var/mob/living/L = thing
if(L.z in holder.our_planet.expected_z_levels)
irradiate_nearby_turf(L)
var/turf/T = get_turf(L)
if(!T.outdoors)
continue // They're indoors, so no need to irradiate them with fallout.
L.rad_act(rand(direct_rad_low, direct_rad_high))
// This makes random tiles near people radioactive for awhile.
// Tiles far away from people are left alone, for performance.
/datum/weather/virgo3b_better/fallout/proc/irradiate_nearby_turf(mob/living/L)
if(!istype(L))
return
var/list/turfs = RANGE_TURFS(world.view, L)
var/turf/T = pick(turfs) // We get one try per tick.
if(!istype(T))
return
if(T.outdoors)
SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high))
/datum/weather/virgo3b_better/party
name = "party"
icon = 'icons/effects/weather_vr.dmi'
icon_state = "party"
light_color = "#FFFFFF"
light_modifier = 2
flight_failure_modifier = 70
transition_chances = list(
WEATHER_CLEAR = 100
)
transition_messages = list(
"IT'S PARTY TIME!",
"LET'S GO! PARTY TIME!",
"EVERYONE, IT'S TIME TO PARTY!"
)
sky_visible = TRUE
observed_message = "THE PARTY IS ON!"
+29 -35
View File
@@ -203,15 +203,17 @@ var/datum/planet/virgo3b/planet_virgo3b = null
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
indoor_sounds_type = /datum/looping_sound/weather/inside_snow
/*
/datum/weather/virgo3b/snow/process_effects()
..()
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(33))
T.chill()
*/
/datum/weather/virgo3b/blizzard
name = "blizzard"
@@ -236,15 +238,17 @@ var/datum/planet/virgo3b/planet_virgo3b = null
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
/*
/datum/weather/virgo3b/blizzard/process_effects()
..()
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(50))
T.chill()
*/
/datum/weather/virgo3b/rain
name = "rain"
@@ -270,25 +274,21 @@ var/datum/planet/virgo3b/planet_virgo3b = null
/datum/weather/virgo3b/rain/process_effects()
..()
for(var/mob/living/L in living_mob_list)
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(!istype(U) || !U.open)
U = L.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
L.water_act(1)
if(show_message)
@@ -325,25 +325,21 @@ var/datum/planet/virgo3b/planet_virgo3b = null
/datum/weather/virgo3b/storm/process_effects()
..()
for(var/mob/living/L in living_mob_list)
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(!istype(U) || !U.open)
U = L.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
L.water_act(2)
@@ -385,20 +381,18 @@ var/datum/planet/virgo3b/planet_virgo3b = null
/datum/weather/virgo3b/hail/process_effects()
..()
for(var/humie in human_mob_list)
var/mob/living/carbon/human/H = humie
for(var/mob/living/carbon/H as anything in human_mob_list)
if(H.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(H)
if(!T.outdoors)
continue // They're indoors, so no need to pelt them with ice.
// If they have an open umbrella, it'll guard from hail
var/obj/item/weapon/melee/umbrella/U
if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella))
U = H.get_active_hand()
else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
if(!istype(U) || !U.open)
U = H.get_inactive_hand()
if(U && U.open)
if(istype(U) && U.open)
if(show_message)
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
continue
+41 -47
View File
@@ -32,35 +32,35 @@ var/datum/planet/virgo4/planet_virgo4 = null
var/min = 0
switch(sun_position)
if(0 to 0.30) // Night
low_brightness = 0.1
if(0 to 0.20) // Night
low_brightness = 0.3
low_color = "#000066"
high_brightness = 0.2
high_brightness = 0.5
high_color = "#66004D"
min = 0
if(0.30 to 0.40) // Twilight
low_brightness = 0.4
if(0.20 to 0.30) // Twilight
low_brightness = 0.5
low_color = "#66004D"
high_brightness = 0.6
high_brightness = 0.9
high_color = "#CC3300"
min = 0.40
if(0.40 to 0.50) // Sunrise/set
low_brightness = 0.7
if(0.30 to 0.40) // Sunrise/set
low_brightness = 0.9
low_color = "#CC3300"
high_brightness = 0.9
high_brightness = 3.0
high_color = "#FF9933"
min = 0.50
if(0.50 to 1.00) // Noon
low_brightness = 1
if(0.40 to 1.00) // Noon
low_brightness = 3.0
low_color = "#DDDDDD"
high_brightness = 2
high_brightness = 10.0
high_color = "#FFFFFF"
min = 0.70
@@ -187,15 +187,17 @@ var/datum/planet/virgo4/planet_virgo4 = null
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
indoor_sounds_type = /datum/looping_sound/weather/inside_snow
/*
/datum/weather/virgo4/snow/process_effects()
..()
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(33))
T.chill()
*/
/datum/weather/virgo4/blizzard
name = "blizzard"
@@ -217,15 +219,17 @@ var/datum/planet/virgo4/planet_virgo4 = null
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
/*
/datum/weather/virgo4/blizzard/process_effects()
..()
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(50))
T.chill()
*/
/datum/weather/virgo4/rain
name = "rain"
@@ -248,25 +252,21 @@ var/datum/planet/virgo4/planet_virgo4 = null
/datum/weather/virgo4/rain/process_effects()
..()
for(var/mob/living/L in living_mob_list)
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(!istype(U) || !U.open)
U = L.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
L.water_act(1)
if(show_message)
@@ -298,25 +298,21 @@ var/datum/planet/virgo4/planet_virgo4 = null
/datum/weather/virgo4/storm/process_effects()
..()
for(var/mob/living/L in living_mob_list)
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(!istype(U) || !U.open)
U = L.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
L.water_act(2)
@@ -355,20 +351,18 @@ var/datum/planet/virgo4/planet_virgo4 = null
/datum/weather/virgo4/hail/process_effects()
..()
for(var/humie in human_mob_list)
var/mob/living/carbon/human/H = humie
for(var/mob/living/carbon/H as anything in human_mob_list)
if(H.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(H)
if(!T.outdoors)
continue // They're indoors, so no need to pelt them with ice.
// If they have an open umbrella, it'll guard from hail
var/obj/item/weapon/melee/umbrella/U
if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella))
U = H.get_active_hand()
else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
if(!istype(U) || !U.open)
U = H.get_inactive_hand()
if(U && U.open)
if(istype(U) && U.open)
if(show_message)
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
continue
+4
View File
@@ -0,0 +1,4 @@
/datum/weather_holder/update_icon_effects()
..()
if(current_weather.icon)
visuals.icon = current_weather.icon
-1
View File
@@ -95,7 +95,6 @@
playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5)
tesla_zap(src, 10, power/(coeff/2))
//TFF 3/6/19 - Port Cit RP fix for infinite frames
/obj/machinery/power/grounding_rod
name = "grounding rod"
desc = "Keep an area from being fried from Edison's Bane."
@@ -279,3 +279,22 @@
/obj/item/projectile/beam/shock/weak
damage = 5
agony = 10
//
// Projectile Beam Definitions
//
/obj/item/projectile/beam/pointdefense
name = "point defense salvo"
icon_state = "laser"
damage = 15
damage_type = ELECTROCUTE //You should be safe inside a voidsuit
sharp = FALSE //"Wide" spectrum beam
light_color = COLOR_GOLD
excavation_amount = 200 // Good at shooting rocks
muzzle_type = /obj/effect/projectile/muzzle/pointdefense
tracer_type = /obj/effect/projectile/tracer/pointdefense
impact_type = /obj/effect/projectile/impact/pointdefense
+2 -1
View File
@@ -313,7 +313,8 @@
if(spill)
splash(target.loc, spill, multiplier, copy, min_spill, max_spill)
trans_to(target, amount, multiplier, copy)
if(!trans_to(target, amount, multiplier, copy))
touch(target, amount)
/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1)
if (!target)
@@ -1700,7 +1700,7 @@
glass_name = "Rewriter"
glass_desc = "The secret of the sanctuary of the Libarian..."
allergen_type = FRUIT|COFFEE //Made with space mountain wind (Fruit)
allergen_type = FRUIT|COFFEE //Made with space mountain wind (Fruit)
/datum/reagent/drink/rewriter/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
@@ -2720,7 +2720,7 @@
glass_name = "Banana Honk"
glass_desc = "A drink from Banana Heaven."
allergen_type = FRUIT|DAIRY //Made from banana juice(fruit) and cream(dairy)
allergen_type = FRUIT|DAIRY //Made from banana juice(fruit) and cream(dairy)
/datum/reagent/ethanol/barefoot
name = "Barefoot"
@@ -4156,3 +4156,28 @@
reagent_state = LIQUID
nutriment_factor = 40 //very filling
color = "#d169b2"
//ADDITIONS BELOW THIS LINE MADE ON 04/03/2021
/datum/reagent/drink/soda/kompot
name = "Kompot"
id = "kompot"
description = "A traditional Eastern European beverage once used to preserve fruit in the 1980s"
taste_description = "refreshuingly sweet and fruity"
color = "#ed9415" // rgb: 237, 148, 21
adj_drowsy = -1
adj_temp = -6
glass_name = "kompot"
glass_desc = "A glass of refreshing kompot."
glass_special = list(DRINK_FIZZ)
/datum/reagent/ethanol/kvass
name = "Kvass"
id = "kvass"
description = "A traditional fermented Slavic and Baltic beverage commonly made from rye bread."
taste_description = "a warm summer day at babushka's cabin"
color = "#b78315" // rgb: 183, 131, 21
strength = 95 //It's just soda to Russians
nutriment_factor = 2
glass_name = "kvass"
glass_desc = "A hearty glass of Slavic brew."
@@ -1450,7 +1450,7 @@
/datum/reagent/qerr_quem
name = "Qerr-quem"
id = "querr_quem"
id = "qerr_quem"
description = "A potent stimulant and anti-anxiety medication, made for the Qerr-Katish."
taste_description = "mint"
reagent_state = LIQUID
@@ -13,8 +13,7 @@
mrate_static = TRUE
/datum/reagent/macrocillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(M.size_range_check(M.size_multiplier))
M.resize(M.size_multiplier+0.01)//Incrrease 1% per tick.
M.resize(M.size_multiplier+0.01, uncapped = M.has_large_resize_bounds()) //Incrrease 1% per tick.
return
/datum/reagent/microcillin
@@ -27,8 +26,7 @@
mrate_static = TRUE
/datum/reagent/microcillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(M.size_range_check(M.size_multiplier))
M.resize(M.size_multiplier-0.01) //Decrease 1% per tick.
M.resize(M.size_multiplier-0.01, uncapped = M.has_large_resize_bounds()) //Decrease 1% per tick.
return
@@ -6,7 +6,6 @@
item_state = "cleaner"
center_of_mass = list("x" = 16,"y" = 10)
flags = OPENCONTAINER|NOBLUDGEON
//TFF 24/12/19 - Let people print more spray bottles if needed.
matter = list("glass" = 300, DEFAULT_WALL_MATERIAL = 300)
slot_flags = SLOT_BELT
throwforce = 3
@@ -662,6 +662,19 @@ CIRCUITS BELOW
build_path = /obj/item/weapon/circuitboard/microwave/advanced
sort_string = "HACAA"
/datum/design/circuit/pointdefense
name = "point defense battery"
id = "pointdefense"
req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 3, TECH_COMBAT = 4)
build_path = /obj/item/weapon/circuitboard/pointdefense
sort_string = "OAABA"
/datum/design/circuit/pointdefense_control
name = "point defense control"
id = "pointdefense_control"
req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_COMBAT = 2)
build_path = /obj/item/weapon/circuitboard/pointdefense_control
sort_string = "OAABB"
/datum/design/circuit/shield_generator
name = "shield generator"
-17
View File
@@ -466,20 +466,3 @@
user.visible_message("<span class='warning'>[user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!</span>", \
"<span class='warning'>Your hand slips, damaging [target]'s [affected.name] with \the [tool]!</span>")
affected.createwound(BRUISE, 20)
//////////////////////////////////////////////////////////////////
// HEART SURGERY //
//////////////////////////////////////////////////////////////////
// To be finished after some tests.
// /datum/surgery_step/ribcage/heart/cut
// allowed_tools = list(
// /obj/item/weapon/surgical/scalpel = 100, \
// /obj/item/weapon/material/knife = 75, \
// /obj/item/weapon/material/shard = 50, \
// )
// min_duration = 30
// max_duration = 40
// /datum/surgery_step/ribcage/heart/cut/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
// return ..() && target.op_stage.ribcage == 2
+11 -3
View File
@@ -11,7 +11,7 @@
material = get_material_by_name("darkglass")
verbs -= /obj/structure/table/verb/do_flip
verbs -= /obj/structure/table/proc/do_put
..()
/obj/structure/table/darkglass/dismantle(obj/item/weapon/wrench/W, mob/user)
@@ -34,9 +34,17 @@
material = get_material_by_name("fancyblack")
verbs -= /obj/structure/table/verb/do_flip
verbs -= /obj/structure/table/proc/do_put
..()
/obj/structure/table/fancyblack/dismantle(obj/item/weapon/wrench/W, mob/user)
to_chat(user, "<span class='warning'>You cannot dismantle \the [src].</span>")
return
return
/obj/structure/table/gold
icon_state = "plain_preview"
color = "#FFFF00"
/obj/structure/table/gold/New()
material = get_material_by_name(MAT_GOLD)
..()
@@ -1,5 +1,3 @@
// TFF 6/10/20 - Just a little thing to prevent the button
// and console from being destroyed by explosions.
/obj/structure/lift/button/ex_act()
return
+3 -3
View File
@@ -23,7 +23,7 @@
var/car_limit = 0 //how many cars an engine can pull before performance degrades. This should be 0 to prevent trailers from unhitching.
active_engines = 1
var/obj/item/weapon/key/key //TFF 19/1/20 - Bugfix for key being prevented from getting used again
var/obj/item/weapon/key/key
var/key_type = /obj/item/weapon/key/security
var/siren = 0 //This is for eventually getting the siren sprite to work.
@@ -62,7 +62,7 @@
/obj/vehicle/train/security/engine/New()
..()
cell = new /obj/item/weapon/cell/high(src)
key = new key_type(src) //TFF 19/1/20 - Bugfix for key being prevented from getting used again
key = new key_type(src)
var/image/I = new(icon = 'icons/obj/vehicles.dmi', icon_state = "cargo_engine_overlay", layer = src.layer + 0.2) //over mobs
overlays += I
turn_off() //so engine verbs are correctly set
@@ -91,7 +91,7 @@
..()
/obj/vehicle/train/security/engine/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, key_type)) //TFF 19/1/20 - Bugfix for key being prevented from getting used again
if(istype(W, key_type))
if(!key)
user.drop_item()
W.forceMove(src)
+39 -4
View File
@@ -3,7 +3,8 @@
var/digestable = TRUE // Can the mob be digested inside a belly?
var/devourable = TRUE // Can the mob be devoured at all?
var/feeding = TRUE // Can the mob be vorishly force fed or fed to others?
var/absorbable = TRUE // Are you allowed to absorb this person? TFF addition 14/12/19
var/absorbable = TRUE // Are you allowed to absorb this person?
var/resizable = TRUE // Can other people resize you? (Usually ignored for self-resizes)
var/digest_leave_remains = FALSE // Will this mob leave bones/skull/etc after the melty demise?
var/allowmobvore = TRUE // Will simplemobs attempt to eat the mob?
var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not.
@@ -41,6 +42,7 @@
M.verbs += /mob/living/proc/lick
M.verbs += /mob/living/proc/smell
M.verbs += /mob/living/proc/switch_scaling
M.verbs += /mob/living/proc/vorebelly_printout
if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
return TRUE
M.vorePanel = new(M)
@@ -224,7 +226,8 @@
P.digestable = src.digestable
P.devourable = src.devourable
P.feeding = src.feeding
P.absorbable = src.absorbable //TFF 14/12/19 - choose whether allowing absorbing
P.absorbable = src.absorbable
P.resizable = src.resizable
P.digest_leave_remains = src.digest_leave_remains
P.allowmobvore = src.allowmobvore
P.vore_taste = src.vore_taste
@@ -258,7 +261,8 @@
digestable = P.digestable
devourable = P.devourable
feeding = P.feeding
absorbable = P.absorbable //TFF 14/12/19 - choose whether allowing absorbing
absorbable = P.absorbable
resizable = P.resizable
digest_leave_remains = P.digest_leave_remains
allowmobvore = P.allowmobvore
vore_taste = P.vore_taste
@@ -682,7 +686,6 @@
to_chat(src, "<span class='notice'>You can taste the flavor of garbage and leftovers. Delicious?</span>")
else
to_chat(src, "<span class='notice'>You can taste the flavor of gluttonous waste of food.</span>")
//TFF 10/7/19 - Add custom flavour for collars for trash can trait.
else if (istype(I,/obj/item/clothing/accessory/collar))
visible_message("<span class='warning'>[src] demonstrates their voracious capabilities by swallowing [I] whole!</span>")
to_chat(src, "<span class='notice'>You can taste the submissiveness in the wearer of [I]!</span>")
@@ -864,3 +867,35 @@
/obj/screen/fullscreen/belly
icon = 'icons/mob/screen_full_vore.dmi'
icon_state = ""
/mob/living/proc/vorebelly_printout() //Spew the vorepanel belly messages into chat window for copypasting.
set name = "Print Vorebelly Settings"
set category = "Preferences"
set desc = "Print out your vorebelly messages into chat for copypasting."
for(var/belly in vore_organs)
if(isbelly(belly))
var/obj/belly/B = belly
to_chat(src, "<span class='notice'><b>Belly name:</b> [B.name]</span>")
to_chat(src, "<span class='notice'><b>Belly desc:</b> [B.desc]</span>")
to_chat(src, "<span class='notice'><b>Vore verb:</b> [B.vore_verb]</span>")
to_chat(src, "<span class='notice'><b>Struggle messages (outside):</b></span>")
for(var/msg in B.struggle_messages_outside)
to_chat(src, "<span class='notice'>[msg]</span>")
to_chat(src, "<span class='notice'><b>Struggle messages (inside):</b></span>")
for(var/msg in B.struggle_messages_inside)
to_chat(src, "<span class='notice'>[msg]</span>")
to_chat(src, "<span class='notice'><b>Digest messages (owner):</b></span>")
for(var/msg in B.digest_messages_owner)
to_chat(src, "<span class='notice'>[msg]</span>")
to_chat(src, "<span class='notice'><b>Digest messages (prey):</b></span>")
for(var/msg in B.digest_messages_prey)
to_chat(src, "<span class='notice'>[msg]</span>")
to_chat(src, "<span class='notice'><b>Examine messages:</b></span>")
for(var/msg in B.examine_messages)
to_chat(src, "<span class='notice'>[msg]</span>")
to_chat(src, "<span class='notice'><b>Emote lists:</b></span>")
for(var/EL in B.emote_lists)
to_chat(src, "<span class='notice'><b>[EL]:</b></span>")
for(var/msg in B.emote_lists[EL])
to_chat(src, "<span class='notice'>[msg]</span>")
+15 -8
View File
@@ -45,19 +45,22 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
//Actual preferences
var/digestable = TRUE
var/devourable = TRUE
var/absorbable = TRUE
var/feeding = TRUE
var/absorbable = TRUE //TFF 14/12/19 - choose whether allowing absorbing
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = FALSE
var/digest_leave_remains = FALSE
var/allowmobvore = TRUE
var/permit_healbelly = TRUE
var/resizable = TRUE
var/show_vore_fx = TRUE
var/step_mechanics_pref = FALSE
var/pickup_pref = TRUE
var/list/belly_prefs = list()
var/vore_taste = "nothing in particular"
var/vore_smell = "nothing in particular"
var/permit_healbelly = TRUE
var/show_vore_fx = TRUE
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = FALSE
var/step_mechanics_pref = FALSE
var/pickup_pref = TRUE
//Mechanically required
var/path
@@ -122,8 +125,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
digestable = json_from_file["digestable"]
devourable = json_from_file["devourable"]
resizable = json_from_file["resizable"]
feeding = json_from_file["feeding"]
absorbable = json_from_file["absorbable"] //TFF 14/12/19 - choose whether allowing absorbing
absorbable = json_from_file["absorbable"]
digest_leave_remains = json_from_file["digest_leave_remains"]
allowmobvore = json_from_file["allowmobvore"]
vore_taste = json_from_file["vore_taste"]
@@ -141,6 +145,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
digestable = TRUE
if(isnull(devourable))
devourable = TRUE
if(isnull(resizable))
resizable = TRUE
if(isnull(feeding))
feeding = TRUE
if(isnull(absorbable))
@@ -175,6 +181,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"version" = version,
"digestable" = digestable,
"devourable" = devourable,
"resizable" = resizable,
"absorbable" = absorbable,
"feeding" = feeding,
"digest_leave_remains" = digest_leave_remains,
+7
View File
@@ -208,6 +208,7 @@
data["prefs"] = list(
"digestable" = host.digestable,
"devourable" = host.devourable,
"resizable" = host.resizable,
"feeding" = host.feeding,
"absorbable" = host.absorbable,
"digest_leave_remains" = host.digest_leave_remains,
@@ -358,6 +359,12 @@
host.client.prefs_vr.devourable = host.devourable
unsaved_changes = TRUE
return TRUE
if("toggle_resize")
host.resizable = !host.resizable
if(host.client.prefs_vr)
host.client.prefs_vr.resizable = host.resizable
unsaved_changes = TRUE
return TRUE
if("toggle_feed")
host.feeding = !host.feeding
if(host.client.prefs_vr)
@@ -2287,4 +2287,47 @@ Departamental Swimsuits, for general use
body_parts_covered = UPPER_TORSO|LOWER_TORSO|FEET|ARMS|HANDS
//PastelPrinceDan: Kiyoshi Maki
/obj/item/clothing/accessory/poncho/fluff/cloakglowing
name = "glowing cloak"
desc = "A fancy cloak with a RGB LED color strip along the trim, cycling through the colors of the rainbow."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "rgb"
item_state = "rgb"
overlay_state = "rgb"
icon_override = 'icons/vore/custom_onmob_vr.dmi'
var/is_dark = FALSE
/obj/item/clothing/accessory/poncho/fluff/cloakglowing/equipped()
..()
var/mob/living/carbon/human/H = loc
if(istype(H) && H.wear_suit == src)
icon_override = 'icons/vore/custom_onmob_vr.dmi'
update_clothing_icon()
/obj/item/clothing/accessory/poncho/fluff/cloakglowing/dropped()
icon_override = 'icons/vore/custom_onmob_vr.dmi'
/obj/item/clothing/accessory/poncho/fluff/cloakglowing/proc/colorswap(mob/user)
if(user.canmove && !user.stat)
src.is_dark = !src.is_dark
if (src.is_dark)
icon_state = "rgbd"
item_state = "rgbd"
overlay_state = "rgbd"
to_chat(user, "The polychromic plates in your cloak activate, turning it black.")
else
icon_state = "rgb"
item_state = "rgb"
overlay_state = "rgb"
to_chat(user, "The polychromic plates in your cloak activate, turning it white.")
has_suit.update_clothing_icon()
/obj/item/clothing/accessory/poncho/fluff/cloakglowing/verb/color_verb()
set name = "Swap color"
set category = "Object"
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
colorswap(usr)
@@ -337,7 +337,7 @@
name = "Mouse Plushie"
desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend."
slot_flags = SLOT_HEAD
icon_state = "mouse_brown" //TFF 12/11/19 - Change sprite to not look dead. Heck you for that choice! >:C
icon_state = "mouse_brown"
item_state = "mouse_brown_head"
icon = 'icons/vore/custom_items_vr.dmi'
icon_override = 'icons/vore/custom_items_vr.dmi'
+34 -35
View File
@@ -1,17 +1,3 @@
//these aren't defines so they can stay in this file
var/const/RESIZE_HUGE = 2
var/const/RESIZE_BIG = 1.5
var/const/RESIZE_NORMAL = 1
var/const/RESIZE_SMALL = 0.5
var/const/RESIZE_TINY = 0.25
//average
var/const/RESIZE_A_HUGEBIG = (RESIZE_HUGE + RESIZE_BIG) / 2
var/const/RESIZE_A_BIGNORMAL = (RESIZE_BIG + RESIZE_NORMAL) / 2
var/const/RESIZE_A_NORMALSMALL = (RESIZE_NORMAL + RESIZE_SMALL) / 2
var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
// Adding needed defines to /mob/living
// Note: Polaris had this on /mob/living/carbon/human We need it higher up for animals and stuff.
/mob/living
@@ -60,32 +46,45 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
/mob/living/get_effective_size()
return size_multiplier
/atom/movable/proc/size_range_check(size_select) //both objects and mobs needs to have that
var/area/A = get_area(src) //Get the atom's area to check for size limit.
if((A.limit_mob_size && (size_select > 200 || size_select < 25)) || (size_select > 600 || size_select <1))
return FALSE
return TRUE
/atom/movable/proc/has_large_resize_bounds()
var/area/A = get_area(src) //Get the atom's area to check for size limit.
return !A.limit_mob_size
/proc/is_extreme_size(size)
return (size < RESIZE_MINIMUM || size > RESIZE_MAXIMUM)
/**
* Resizes the mob immediately to the desired mod, animating it growing/shrinking.
* It can be used by anything that calls it.
*/
/atom/movable/proc/in_dorms()
var/area/A = get_area(src)
return istype(A, /area/crew_quarters/sleep)
/atom/movable/proc/size_range_check(size_select) //both objects and mobs needs to have that
if((!in_dorms() && (size_select > 200 || size_select < 25)) || (size_select > 600 || size_select <1))
return FALSE
return TRUE
/mob/living/proc/resize(var/new_size, var/animate = TRUE, var/mark_unnatural_size = TRUE)
/mob/living/proc/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE)
if(!uncapped)
new_size = clamp(new_size, RESIZE_MINIMUM, RESIZE_MAXIMUM)
var/datum/component/resize_guard/guard = GetComponent(/datum/component/resize_guard)
if(guard)
qdel(guard)
else if(has_large_resize_bounds())
if(is_extreme_size(new_size))
AddComponent(/datum/component/resize_guard)
else
var/datum/component/resize_guard/guard = GetComponent(/datum/component/resize_guard)
if(guard)
qdel(guard)
if(size_multiplier == new_size)
return 1
size_multiplier = new_size //Change size_multiplier so that other items can interact with them
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(new_size > 2 || new_size < 0.25)
if(mark_unnatural_size) //Will target size be reverted to ordinary bounds when out of dorms or not?
H.unnaturally_resized = TRUE
else
H.unnaturally_resized = FALSE
if(animate)
var/change = new_size - size_multiplier
var/duration = (abs(change)+0.25) SECONDS
@@ -111,8 +110,8 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
else
update_transform() //Lame way
/mob/living/carbon/human/resize(var/new_size, var/animate = TRUE)
if(!resizable)
/mob/living/carbon/human/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE)
if(!resizable && !ignore_prefs)
return 1
if(species)
vis_height = species.icon_height
@@ -125,7 +124,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
apply_hud(index, HI)
// Optimize mannequins - never a point to animating or doing HUDs on these.
/mob/living/carbon/human/dummy/mannequin/resize(var/new_size, var/animate = TRUE)
/mob/living/carbon/human/dummy/mannequin/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE)
size_multiplier = new_size
/**
@@ -175,10 +174,10 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
var/mob/living/simple_mob/SA = M
if(!SA.has_hands)
return 0
if(buckled)
to_chat(usr,"<span class='notice'>You have to unbuckle \the [M] before you pick them up.</span>")
return 0
if(size_diff >= 0.50 || mob_size < MOB_SMALL)
if(buckled)
to_chat(usr,"<span class='notice'>You have to unbuckle \the [src] before you pick them up.</span>")
return 0
holder_type = /obj/item/weapon/holder/micro
var/obj/item/weapon/holder/m_holder = get_scooped(M, G)
holder_type = holder_default
+28 -14
View File
@@ -44,12 +44,15 @@
set category = "Object"
set src in view(1)
var/size_select = input("Put the desired size (25-200%), (1-600%) in dormitory areas.", "Set Size", size_set_to * 100) as num
if(!size_range_check(size_select))
to_chat(usr, "<span class='notice'>Invalid size.</span>")
return
size_set_to = (size_select/100)
var/size_select = input("Put the desired size (25-200%), (1-600%) in dormitory areas.", "Set Size", size_set_to * 100) as num|null
if(!size_select)
return //cancelled
//We do valid resize testing in actual firings because people move after setting these things.
//Just a basic clamp here to the valid ranges.
size_set_to = clamp((size_select/100), RESIZE_MINIMUM_DORMS, RESIZE_MAXIMUM_DORMS)
to_chat(usr, "<span class='notice'>You set the size to [size_select]%</span>")
if(size_set_to < RESIZE_MINIMUM || size_set_to > RESIZE_MAXIMUM)
to_chat(usr, "<span class='notice'>Note: Resizing limited to 25-200% automatically while outside dormatory areas.</span>") //hint that we clamp it in resize
/obj/item/weapon/gun/energy/sizegun/examine(mob/user)
. = ..()
@@ -66,8 +69,10 @@
set category = "Object"
set src in view(1)
var/size_select = input("Put the desired size", "Set Size", size_set_to * 100) as num
size_set_to = max(1,size_select/100) //No negative numbers
var/size_select = input("Put the desired size (1-600%)", "Set Size", size_set_to * 100) as num|null
if(!size_select)
return //cancelled
size_set_to = clamp((size_select/100), 0, 1000) //eheh
to_chat(usr, "<span class='notice'>You set the size to [size_select]%</span>")
//
@@ -88,21 +93,30 @@
/obj/item/projectile/beam/sizelaser/on_hit(var/atom/target)
var/mob/living/M = target
var/ignoring_prefs = (target == firer ? TRUE : FALSE) // Resizing yourself
if(istype(M))
if(!M.in_dorms() || !istype(M, /mob/living/carbon/human))
if(!M.resize(clamp(set_size,0.25,2)))
to_chat(M, "<font color='blue'>The beam fires into your body, changing your size!</font>")
else
if(!M.resize(clamp(set_size,0.01,6)))
to_chat(M, "<font color='blue'>The beam fires into your body, changing your size!</font>")
if(!M.resize(set_size, uncapped = M.has_large_resize_bounds(), ignore_prefs = ignoring_prefs))
to_chat(M, "<font color='blue'>The beam fires into your body, changing your size!</font>")
M.updateicon()
return
return 1
/obj/item/projectile/beam/sizelaser/admin/on_hit(var/atom/target)
var/mob/living/M = target
if(istype(M))
M.resize(set_size, TRUE, FALSE)
var/can_be_big = M.has_large_resize_bounds()
var/very_big = is_extreme_size(set_size)
if(very_big && can_be_big) // made an extreme size in an area that allows it, don't assume adminbuse
to_chat(firer, "<span class='warning'>[M] will lose this size upon moving into an area where this size is not allowed.</span>")
else if(very_big) // made an extreme size in an area that doesn't allow it, assume adminbuse
to_chat(firer, "<span class='warning'>[M] will retain this normally unallowed size outside this area.</span>")
M.resize(set_size, uncapped = TRUE, ignore_prefs = TRUE) // Always ignores prefs, caution is advisable
to_chat(M, "<font color='blue'>The beam fires into your body, changing your size!</font>")
M.updateicon()
return
+1 -1
View File
@@ -21,7 +21,7 @@
icon_state = "strange"
var/datum/geosample/geologic_data
origin_tech = list(TECH_MATERIAL = 5)
w_class = ITEMSIZE_SMALL //TFF 25/11/19 - fixes the strange rocks to be small size like before and not normal.
w_class = ITEMSIZE_SMALL
/obj/item/weapon/strangerock/New(loc, var/inside_item_type = 0)
pixel_x = rand(0,16)-8