Merge remote-tracking branch 'VOREStation/master' into upstream-merge-7697

This commit is contained in:
Unknown
2021-03-11 10:01:39 -05:00
323 changed files with 181375 additions and 155860 deletions
+12 -4
View File
@@ -407,7 +407,7 @@ proc/admin_notice(var/message, var/rights)
dat+="<B><FONT COLOR='maroon'>ERROR: Could not submit Feed story to Network.</B></FONT><HR><BR>"
if(src.admincaster_feed_channel.channel_name=="")
dat+="<FONT COLOR='maroon'>•Invalid receiving channel name.</FONT><BR>"
if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]")
if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]" || admincaster_feed_message.title == "")
dat+="<FONT COLOR='maroon'>•Invalid message body.</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[3]'>Return</A><BR>"
if(7)
@@ -436,11 +436,14 @@ proc/admin_notice(var/message, var/rights)
var/i = 0
for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
i++
dat+="-[MESSAGE.body] <BR>"
//dat+="-[MESSAGE.body] <BR>"
var/pic_data
if(MESSAGE.img)
usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+="<img src='tmp_photo[i].png' width = '180'><BR><BR>"
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
pic_data+="<img src='tmp_photo[i].png' width = '180'><BR>"
dat+= get_newspaper_content(MESSAGE.title, MESSAGE.body, MESSAGE.author,"#d4cec1", pic_data)
dat+="<BR>"
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author] - [MESSAGE.time_stamp]</FONT>\]</FONT><BR>"
dat+={"
<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>
<BR><A href='?src=\ref[src];ac_setScreen=[1]'>Back</A>
@@ -1424,6 +1427,11 @@ var/datum/announcement/minor/admin_min_announcer = new
return 1
if(tomob.client) //No need to ghostize if there is no client
tomob.ghostize(0)
if(frommob.mind && frommob.mind.current) //Preserve teleop for original body when adminghosting.
var/mob/body = frommob.mind.current
if(body)
if(body.teleop)
body.teleop = tomob
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has put [frommob.ckey] in control of [tomob.name].</span>")
log_admin("[key_name(usr)] stuffed [frommob.ckey] into [tomob.name].")
feedback_add_details("admin_verb","CGD")
+1 -6
View File
@@ -57,9 +57,4 @@
onclose(usr, "admin_dialogue_log")
feedback_add_details("admin_verb","PDL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
// Used to get `atom/O as obj|mob|turf in view()` to match against strings containing apostrophes immediately after substrings that match to other objects. Somehow. - Ater
/proc/admin_atom_validate(atom/A)
return view()
feedback_add_details("admin_verb","PDL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+7 -3
View File
@@ -1742,16 +1742,20 @@
src.admincaster_feed_channel.channel_name = sanitizeSafe(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
src.access_news_network()
else if(href_list["ac_set_new_title"])
src.admincaster_feed_message.title = sanitize(input(usr, "Enter the Feed title", "Network Channel Handler", ""))
src.access_news_network()
else if(href_list["ac_set_new_message"])
src.admincaster_feed_message.body = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", ""))
src.admincaster_feed_message.body = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "") as message)
src.access_news_network()
else if(href_list["ac_submit_new_message"])
if(src.admincaster_feed_message.body =="" || src.admincaster_feed_message.body =="\[REDACTED\]" || src.admincaster_feed_channel.channel_name == "" )
if(src.admincaster_feed_message.body =="" || admincaster_feed_message.title == "" || admincaster_feed_message.body =="\[REDACTED\]" || admincaster_feed_channel.channel_name == "" )
src.admincaster_screen = 6
else
feedback_inc("newscaster_stories",1)
news_network.SubmitArticle(src.admincaster_feed_message.body, src.admincaster_signature, src.admincaster_feed_channel.channel_name, null, 1)
news_network.SubmitArticle(admincaster_feed_message.body, admincaster_signature, admincaster_feed_channel.channel_name, null, 1, "", admincaster_feed_message.title)
src.admincaster_screen=4
log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!")
+1 -1
View File
@@ -629,7 +629,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(src)] has created a command report", 1)
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in admin_atom_validate(O)) // I don't understand precisely how this fixes the string matching against a substring, but it does - Ater
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in _validate_atom(O)) // I don't understand precisely how this fixes the string matching against a substring, but it does - Ater
set category = "Admin"
set name = "Delete"
+1 -1
View File
@@ -3,7 +3,7 @@
desc = "A small electronic device able to ignite combustable substances."
icon_state = "igniter"
origin_tech = list(TECH_MAGNET = 1)
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, MAT_COPPER = 10, "waste" = 10)
secured = 1
wires = WIRE_RECEIVE
+1 -1
View File
@@ -5,7 +5,7 @@
desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted."
icon_state = "infrared"
origin_tech = list(TECH_MAGNET = 2)
matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, "waste" = 100)
matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, MAT_COPPER = 10, "waste" = 100)
wires = WIRE_PULSE
+1 -1
View File
@@ -3,7 +3,7 @@
desc = "Used for scanning and alerting when someone enters a certain proximity."
icon_state = "prox"
origin_tech = list(TECH_MAGNET = 1)
matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, "waste" = 50)
matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, MAT_COPPER = 10, "waste" = 50)
wires = WIRE_PULSE
secured = 0
+1 -1
View File
@@ -4,7 +4,7 @@
icon_state = "signaller"
item_state = "signaler"
origin_tech = list(TECH_MAGNET = 1)
matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100)
matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, MAT_COPPER = 10, "waste" = 100)
wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
secured = TRUE
+1 -1
View File
@@ -3,7 +3,7 @@
desc = "Used to time things. Works well with contraptions which has to count down. Tick tock."
icon_state = "timer"
origin_tech = list(TECH_MAGNET = 1)
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, MAT_COPPER = 10, "waste" = 10)
wires = WIRE_PULSE
+1 -1
View File
@@ -3,7 +3,7 @@
desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated."
icon_state = "voice"
origin_tech = list(TECH_MAGNET = 1)
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, MAT_COPPER = 10, "waste" = 10)
var/listening = 0
var/recorded //the activation message
+1
View File
@@ -26,6 +26,7 @@
var/datum/chatOutput/chatOutput
var/datum/volume_panel/volume_panel = null // Initialized by /client/verb/volume_panel()
var/chatOutputLoadedAt
var/seen_news = 0
var/adminhelped = 0
@@ -1,3 +1,5 @@
#define LOADOUT_BAN_STRING "Custom loadout"
/datum/gear_tweak/proc/get_contents(var/metadata)
return
@@ -165,7 +167,7 @@ var/datum/gear_tweak/custom_name/gear_tweak_free_name = new()
return ""
/datum/gear_tweak/custom_name/get_metadata(var/user, var/metadata)
if(jobban_isbanned(user, "Custom loadout"))
if(jobban_isbanned(user, LOADOUT_BAN_STRING))
to_chat(user, SPAN_WARNING("You are banned from using custom loadout names/descriptions."))
return
if(valid_custom_names)
@@ -196,7 +198,7 @@ var/datum/gear_tweak/custom_desc/gear_tweak_free_desc = new()
return ""
/datum/gear_tweak/custom_desc/get_metadata(var/user, var/metadata)
if(jobban_isbanned(user, "Custom loadout"))
if(jobban_isbanned(user, LOADOUT_BAN_STRING))
to_chat(user, SPAN_WARNING("You are banned from using custom loadout names/descriptions."))
return
if(valid_custom_desc)
@@ -507,3 +509,46 @@ var/datum/gear_tweak/custom_desc/gear_tweak_free_desc = new()
var/t = ValidTeslaLinks[metadata[7]]
I.tesla_link = new t(I)
I.update_verbs()
/datum/gear_tweak/implant_location
var/static/list/bodypart_names_to_tokens = list(
"head" = BP_HEAD,
"upper body" = BP_TORSO,
"lower body" = BP_GROIN,
"left hand" = BP_L_HAND,
"left arm" = BP_L_ARM,
"right hand" = BP_R_HAND,
"right arm" = BP_R_ARM,
"left foot" = BP_L_FOOT,
"left leg" = BP_L_LEG,
"right foot" = BP_R_FOOT,
"right leg" = BP_R_LEG
)
var/static/list/bodypart_tokens_to_names = list(
BP_HEAD = "head",
BP_TORSO = "upper body",
BP_GROIN = "lower body",
BP_LEFT_HAND = "left hand",
BP_LEFT_ARM = "left arm",
BP_RIGHT_HAND = "right hand",
BP_RIGHT_ARM = "right arm",
BP_LEFT_FOOT = "left foot",
BP_LEFT_LEG = "left leg",
BP_RIGHT_FOOT = "right foot",
BP_RIGHT_LEG = "right leg"
)
/datum/gear_tweak/implant_location/get_default()
return bodypart_names_to_tokens[1]
/datum/gear_tweak/implant_location/tweak_item(var/obj/item/weapon/implant/I, var/metadata)
if(istype(I))
I.initialize_loc = bodypart_names_to_tokens[metadata] || BP_TORSO
/datum/gear_tweak/implant_location/get_contents(var/metadata)
return "Location: [metadata]"
/datum/gear_tweak/implant_location/get_metadata(var/user, var/metadata)
return (input(user, "Select a bodypart for the implant to be implanted inside.", "Implant Location", metadata || "upper body") as null|anything in bodypart_names_to_tokens) || bodypart_tokens_to_names[BP_TORSO]
#undef LOADOUT_BAN_STRING
@@ -77,6 +77,12 @@
display_name = "drop pouches, white (Medical)"
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic")
/datum/gear/accessory/bluespace
display_name = "bluespace badge (Eng, Sec, Med, Exploration, Miner)"
path = /obj/item/clothing/accessory/storage/bluespace
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner")
cost = 2
/datum/gear/accessory/webbing
cost = 1
@@ -0,0 +1,56 @@
/datum/gear/utility/implant
display_name = "implant, neural assistance web"
description = "A complex web implanted into the subject, medically in order to compensate for neurological disease."
path = /obj/item/weapon/implant/neural
slot = "implant"
exploitable = 1
sort_category = "Cyberware"
cost = 6
/datum/gear/utility/implant/tracking
display_name = "implant, tracking"
path = /obj/item/weapon/implant/tracking/weak
cost = 10
// Remove these after generic implant has been in for awhile and everyone has had a reasonable period to copy their old descs.
/datum/gear/utility/implant/dud1
display_name = "implant, head"
description = "An implant with no obvious purpose (DEPRECATED, USE GENERIC IMPLANT)."
path = /obj/item/weapon/implant/dud
cost = 1
/datum/gear/utility/implant/dud2
display_name = "implant, torso"
description = "An implant with no obvious purpose (DEPRECATED, USE GENERIC IMPLANT)."
path = /obj/item/weapon/implant/dud/torso
cost = 1
// End removal marker.
/datum/gear/utility/implant/generic
display_name = "implant, generic, primary"
description = "An implant with no obvious purpose."
path = /obj/item/weapon/implant
cost = 1
/datum/gear/utility/implant/generic/second
display_name = "implant, generic, secondary"
/datum/gear/utility/implant/generic/third
display_name = "implant, generic, tertiary"
/datum/gear/utility/implant/generic/New()
..()
gear_tweaks += global.gear_tweak_implant_location
/datum/gear/utility/implant/language
cost = 2
exploitable = 0
/datum/gear/utility/implant/language/eal
display_name = "vocal synthesizer, EAL"
description = "A surgically implanted vocal synthesizer which allows the owner to speak EAL, if they know it."
path = /obj/item/weapon/implant/language/eal
/datum/gear/utility/implant/language/skrellian
display_name = "vocal synthesizer, Skrellian"
description = "A surgically implanted vocal synthesizer which allows the owner to speak Common Skrellian, if they know it."
path = /obj/item/weapon/implant/language/skrellian
@@ -391,4 +391,8 @@
/datum/gear/head/blackngoldheaddress
display_name = "black and gold headdress"
path = /obj/item/clothing/head/blackngoldheaddress
path = /obj/item/clothing/head/blackngoldheaddress
/datum/gear/head/plaguedoctor2
display_name = "golden plague doctor's hat"
path = /obj/item/clothing/head/plaguedoctorhat/gold
@@ -24,4 +24,9 @@
/datum/gear/mask/veil
display_name = "black veil"
path = /obj/item/clothing/mask/veil
path = /obj/item/clothing/mask/veil
/datum/gear/mask/plaguedoctor2
display_name = "golden plague doctor's mask"
path = /obj/item/clothing/mask/gas/plaguedoctor/gold
cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage.
@@ -173,6 +173,10 @@ datum/gear/suit/duster
path = /obj/item/clothing/suit/storage/toggle/labcoat/emt
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
/datum/gear/suit/miscellaneous/labcoat
display_name = "plague doctor's coat"
path = /obj/item/clothing/suit/storage/toggle/labcoat/plaguedoctor
/datum/gear/suit/roles/surgical_apron
display_name = "surgical apron"
path = /obj/item/clothing/suit/surgicalapron
@@ -644,4 +644,16 @@
/datum/gear/uniform/gothic2
display_name = "lacey gothic dress"
path = /obj/item/clothing/under/dress/gothic2
path = /obj/item/clothing/under/dress/gothic2
/datum/gear/uniform/flowerskirt
display_name = "flower skirt"
path = /obj/item/clothing/under/flower_skirt
/datum/gear/uniform/flowerskirt/New()
..()
gear_tweaks += gear_tweak_free_color_choice
/datum/gear/uniform/countess
display_name = "countess dress"
path = /obj/item/clothing/under/dress/countess
@@ -204,3 +204,11 @@ Qipao
/datum/gear/uniform/qipao_white
display_name = "qipao, white"
path = /obj/item/clothing/under/dress/qipao/white
/*
Bluespace jumpsuit
*/
/datum/gear/uniform/hfjumpsuit
display_name = "HYPER jumpsuit"
path = /obj/item/clothing/under/hyperfiber
cost = 2
@@ -115,60 +115,10 @@
display_name = "cell, device"
path = /obj/item/weapon/cell/device
/datum/gear/utility/implant
slot = "implant"
exploitable = 1
/datum/gear/utility/implant/tracking
display_name = "implant, tracking"
path = /obj/item/weapon/implant/tracking/weak
cost = 0 //VOREStation Edit. Changed cost to 0
/datum/gear/utility/implant/neural
display_name = "implant, neural assistance web"
description = "A complex web implanted into the subject, medically in order to compensate for neurological disease."
path = /obj/item/weapon/implant/neural
cost = 6
/datum/gear/utility/implant/dud1
display_name = "implant, head"
description = "An implant with no obvious purpose."
path = /obj/item/weapon/implant/dud
cost = 1
/datum/gear/utility/implant/dud2
display_name = "implant, torso"
description = "An implant with no obvious purpose."
path = /obj/item/weapon/implant/dud/torso
cost = 1
/datum/gear/utility/implant/language
cost = 2
exploitable = 0
/datum/gear/utility/implant/language/eal
display_name = "vocal synthesizer, EAL"
description = "A surgically implanted vocal synthesizer which allows the owner to speak EAL, if they know it."
path = /obj/item/weapon/implant/language/eal
/datum/gear/utility/implant/language/skrellian
display_name = "vocal synthesizer, Skrellian"
description = "A surgically implanted vocal synthesizer which allows the owner to speak Common Skrellian, if they know it."
path = /obj/item/weapon/implant/language/skrellian
/datum/gear/utility/pen
display_name = "Fountain Pen"
path = /obj/item/weapon/pen/fountain
/datum/gear/utility/wheelchair/color
display_name = "wheelchair"
path = /obj/item/wheelchair
cost = 4
/datum/gear/utility/wheelchair/color/New()
..()
gear_tweaks += gear_tweak_free_color_choice
/datum/gear/utility/umbrella
display_name = "Umbrella"
path = /obj/item/weapon/melee/umbrella
@@ -178,6 +128,20 @@
..()
gear_tweaks += gear_tweak_free_color_choice
/datum/gear/utility/wheelchair
display_name = "wheelchair selection"
path = /obj/item/wheelchair
cost = 4
/datum/gear/utility/wheelchair/New()
..()
gear_tweaks += gear_tweak_free_color_choice
var/list/wheelchairs = list(
"wheelchair" = /obj/item/wheelchair,
"motorized wheelchair" = /obj/item/wheelchair/motor
)
gear_tweaks += new/datum/gear_tweak/path(wheelchairs)
/****************
modular computers
****************/
@@ -670,3 +670,10 @@
path = /obj/item/clothing/glasses/aerogelgoggles
whitelisted = SPECIES_TESHARI
sort_category = "Xenowear"
/datum/gear/utility/teshchair
display_name = "small electric wheelchair (Teshari)"
path = /obj/item/wheelchair/motor/small
whitelisted = SPECIES_TESHARI
sort_category = "Xenowear"
cost = 4
@@ -149,6 +149,9 @@
var/available_in_hours = job.available_in_playhours(user.client)
. += "<del>[rank]</del></td></a><td> \[IN [round(available_in_hours, 0.1)] DEPTHOURS]</td></tr>"
continue
if(!is_job_whitelisted(user,rank))
. += "<del>[rank]</del></td></a><td><b> \[WHITELIST ONLY]</b></td></tr>"
continue
//VOREStation Add End
if(job.minimum_character_age && user.client && (user.client.prefs.age < job.minimum_character_age))
. += "<del>[rank]</del></td></a><td> \[MINIMUM CHARACTER AGE: [job.minimum_character_age]]</td></tr>"
@@ -299,7 +299,3 @@
if(PREF_FBP_SOFTWARE)
return 150
return S.max_age // welp
/datum/category_item/player_setup_item/proc/color_square(red, green, blue, hex)
var/color = hex ? hex : "#[num2hex(red, 2)][num2hex(green, 2)][num2hex(blue, 2)]"
return "<span style='font-face: fixedsys; font-size: 14px; background-color: [color]; color: [color]'>___</span>"
@@ -23,12 +23,8 @@
// Physical traits are what they sound like, and involve the character's physical body, as opposed to their mental state.
/datum/trait/modifier/physical
<<<<<<< HEAD
category = "Physical Quirks" //VOREStation Edit
=======
name = "Physical"
category = "Physical"
>>>>>>> b22a056... Sideports a couple of init unit tests from Neb. (#7893)
/datum/trait/modifier/physical/flimsy
@@ -10,6 +10,11 @@
var/custom_base // What to base the custom species on
var/blood_color = "#A10808"
var/custom_say = null
var/custom_whisper = null
var/custom_ask = null
var/custom_exclaim = null
var/list/pos_traits = list() // What traits they've selected for their custom species
var/list/neu_traits = list()
var/list/neg_traits = list()
@@ -33,10 +38,15 @@
S["neg_traits"] >> pref.neg_traits
S["blood_color"] >> pref.blood_color
S["traits_cheating"]>> pref.traits_cheating
S["traits_cheating"] >> pref.traits_cheating
S["max_traits"] >> pref.max_traits
S["trait_points"] >> pref.starting_trait_points
S["custom_say"] >> pref.custom_say
S["custom_whisper"] >> pref.custom_whisper
S["custom_ask"] >> pref.custom_ask
S["custom_exclaim"] >> pref.custom_exclaim
/datum/category_item/player_setup_item/vore/traits/save_character(var/savefile/S)
S["custom_species"] << pref.custom_species
S["custom_base"] << pref.custom_base
@@ -45,10 +55,15 @@
S["neg_traits"] << pref.neg_traits
S["blood_color"] << pref.blood_color
S["traits_cheating"]<< pref.traits_cheating
S["traits_cheating"] << pref.traits_cheating
S["max_traits"] << pref.max_traits
S["trait_points"] << pref.starting_trait_points
S["custom_say"] << pref.custom_say
S["custom_whisper"] << pref.custom_whisper
S["custom_ask"] << pref.custom_ask
S["custom_exclaim"] << pref.custom_exclaim
/datum/category_item/player_setup_item/vore/traits/sanitize_character()
if(!pref.pos_traits) pref.pos_traits = list()
if(!pref.neu_traits) pref.neu_traits = list()
@@ -86,6 +101,10 @@
/datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character)
character.custom_species = pref.custom_species
character.custom_say = pref.custom_say
character.custom_ask = pref.custom_ask
character.custom_whisper = pref.custom_whisper
character.custom_exclaim = pref.custom_exclaim
if(character.isSynthetic()) //Checking if we have a synth on our hands, boys.
pref.dirty_synth = 1
@@ -122,14 +141,14 @@
. += "<a href='?src=\ref[src];custom_base=1'>[pref.custom_base ? pref.custom_base : "Human"]</a><br>"
var/traits_left = pref.max_traits
. += "<b>Traits Left:</b> [traits_left]<br>"
if(pref.species == SPECIES_CUSTOM)
var/points_left = pref.starting_trait_points
for(var/T in pref.pos_traits + pref.neg_traits)
points_left -= traits_costs[T]
traits_left--
. += "<b>Traits Left:</b> [traits_left]<br>"
. += "<b>Points Left:</b> [points_left]<br>"
if(points_left < 0 || traits_left < 0 || !pref.custom_species)
. += "<span style='color:red;'><b>^ Fix things! ^</b></span><br>"
@@ -156,6 +175,16 @@
. += "<b>Blood Color: </b>" //People that want to use a certain species to have that species traits (xenochimera/promethean/spider) should be able to set their own blood color.
. += "<a href='?src=\ref[src];blood_color=1'>Set Color</a>"
. += "<a href='?src=\ref[src];blood_reset=1'>R</a><br>"
. += "<br>"
. += "<b>Custom Say: </b>"
. += "<a href='?src=\ref[src];custom_say=1'>Set Say Verb</a><br>"
. += "<b>Custom Whisper: </b>"
. += "<a href='?src=\ref[src];custom_whisper=1'>Set Whisper Verb</a><br>"
. += "<b>Custom Ask: </b>"
. += "<a href='?src=\ref[src];custom_ask=1'>Set Ask Verb</a><br>"
. += "<b>Custom Exclaim: </b>"
. += "<a href='?src=\ref[src];custom_exclaim=1'>Set Exclaim Verb</a><br>"
/datum/category_item/player_setup_item/vore/traits/OnTopic(var/href,var/list/href_list, var/mob/user)
if(!CanUseTopic(user))
@@ -216,6 +245,30 @@
pref.neg_traits -= trait
return TOPIC_REFRESH
else if(href_list["custom_say"])
var/say_choice = sanitize(input(usr, "This word or phrase will appear instead of 'says': [pref.real_name] says, \"Hi.\"", "Custom Say", pref.custom_say) as null|text, 12)
if(say_choice)
pref.custom_say = say_choice
return TOPIC_REFRESH
else if(href_list["custom_whisper"])
var/whisper_choice = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [pref.real_name] whispers, \"Hi...\"", "Custom Whisper", pref.custom_whisper) as null|text, 12)
if(whisper_choice)
pref.custom_whisper = whisper_choice
return TOPIC_REFRESH
else if(href_list["custom_ask"])
var/ask_choice = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [pref.real_name] asks, \"Hi?\"", "Custom Ask", pref.custom_ask) as null|text, 12)
if(ask_choice)
pref.custom_ask = ask_choice
return TOPIC_REFRESH
else if(href_list["custom_exclaim"])
var/exclaim_choice = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [pref.real_name] exclaims, \"Hi!\"", "Custom Exclaim", pref.custom_exclaim) as null|text, 12)
if(exclaim_choice)
pref.custom_exclaim = exclaim_choice
return TOPIC_REFRESH
else if(href_list["add_trait"])
var/mode = text2num(href_list["add_trait"])
var/list/picklist
@@ -290,6 +343,10 @@
alert("The trait you've selected cannot be taken by the species you've chosen!","Error")
return TOPIC_REFRESH
if( LAZYLEN(instance.allowed_species) && !(pref.species in instance.allowed_species)) //Adding white list handling -shark
alert("The trait you've selected cannot be taken by the species you've chosen!","Error")
return TOPIC_REFRESH
if(trait_choice in pref.pos_traits + pref.neu_traits + pref.neg_traits)
conflict = instance.name
+97
View File
@@ -0,0 +1,97 @@
/client/verb/who_advanced()
set name = "Advanced Who"
set category = "OOC"
var/msg = "<b>Current Players:</b>\n"
var/list/Lines = list()
if(holder)
for(var/client/C in GLOB.clients)
var/entry = "<tr><td>[C.key]"
if(C.holder && C.holder.fakekey)
entry += " <i>(as [C.holder.fakekey])</i>"
entry += "</td><td>"
if(C.mob.real_name)
switch(C.mob.stat)
if(UNCONSCIOUS)
entry += "<span class='darkgray'><b>Unconscious</b></span>" // these are literally all spans so I can apply .inverted to them because black on dark grey isn't legible
if(DEAD)
if(isobserver(C.mob))
var/mob/observer/dead/O = C.mob
if(O.started_as_observer)
entry += "<span class='gray'>Observing</span>"
else
entry += "<span class='black'><b>Died</b></span>"
else
entry += "<span class='green'>Playing</span>"
entry += " as [C.mob.real_name]"
else if(isnewplayer(C.mob))
entry += "<span class='blue'><b>In lobby</b></span>"
entry += "</td><td>"
var/age
if(isnum(C.player_age))
age = C.player_age
else
age = 0
if(age <= 1)
age = "<span class='red'><b>[age]</b></span>"
else if(age < 10)
age = "<span class='orange'><b>[age]</b></span>"
entry += "Age: [age]"
entry += "</td><td>"
if(is_special_character(C.mob))
if(C.mob?.mind?.special_role)
entry += "<b><span class='red'>[C.mob.mind.special_role]</span></b>"
else
entry += "<b><span class='red'>Antagonist</span></b>"
entry += "</td><td>"
if(C.is_afk())
var/seconds = C.last_activity_seconds()
entry += " (AFK - "
entry += "[round(seconds / 60)] minutes, "
entry += "[seconds % 60] seconds)"
entry += "</td><td>"
entry += " (<A HREF='?_src_=holder;adminmoreinfo=\ref[C.mob]'>?</A>)"
entry += "</td></tr>"
Lines += entry
else
for(var/client/C in GLOB.clients)
var/entry = "\t"
if(C.holder && C.holder.fakekey)
entry += "[C.holder.fakekey]"
else
entry += "[C.key]"
var/mob/observer/dead/O = C.mob
if(isobserver(O))
entry += " - <span class='gray'>Observing</span><br>"
else if(istype(O,/mob/new_player))
entry += " - <span class='blue'>In Lobby</span><br>"
else
entry += " - <span class='green'>Playing</span><br>"
Lines += entry
msg += "<table>"
for(var/line in sortList(Lines))
msg += "[line]"
msg += "</table>"
msg += "<b>Total Players: [length(Lines)]</b>"
msg = "<span class='filter_info'>" + msg + "</span>"
to_chat(src, msg)
@@ -0,0 +1,139 @@
GLOBAL_DATUM(character_directory, /datum/character_directory)
/client/verb/show_character_directory()
set name = "Character Directory"
set category = "OOC"
set desc = "Shows a listing of all active characters, along with their associated OOC notes, flavor text, and more."
// This is primarily to stop malicious users from trying to lag the server by spamming this verb
if(!usr.checkMoveCooldown())
to_chat(usr, "<span class='warning'>Don't spam character directory refresh.</span>")
return
usr.setMoveCooldown(10)
if(!GLOB.character_directory)
GLOB.character_directory = new
GLOB.character_directory.tgui_interact(mob)
// This is a global singleton. Keep in mind that all operations should occur on usr, not src.
/datum/character_directory
/datum/character_directory/tgui_state(mob/user)
return GLOB.tgui_always_state
/datum/character_directory/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "CharacterDirectory", "Character Directory")
ui.open()
/datum/character_directory/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
data["personalVisibility"] = user?.client?.prefs?.show_in_directory
data["personalTag"] = user?.client?.prefs?.directory_tag || "Unset"
data["personalErpTag"] = user?.client?.prefs?.directory_erptag || "Unset"
return data
/datum/character_directory/tgui_static_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
var/list/directory_mobs = list()
for(var/client/C in GLOB.clients)
// Allow opt-out.
if(!C?.prefs?.show_in_directory)
continue
// These are the three vars we're trying to find
// The approach differs based on the mob the client is controlling
var/name = null
var/ooc_notes = null
var/flavor_text = null
var/tag = C.prefs.directory_tag || "Unset"
var/erptag = C.prefs.directory_erptag || "Unset"
var/character_ad = C.prefs.directory_ad
if(ishuman(C.mob))
var/mob/living/carbon/human/H = C.mob
if(data_core && data_core.general)
if(!find_general_record("name", H.real_name))
if(!find_record("name", H.real_name, data_core.hidden_general))
continue
name = H.real_name
ooc_notes = H.ooc_notes
flavor_text = H.flavor_texts["general"]
if(isAI(C.mob))
var/mob/living/silicon/ai/A = C.mob
name = "[A.name] (Artificial Intelligence)"
ooc_notes = A.ooc_notes
flavor_text = null // No flavor text for AIs :c
if(isrobot(C.mob))
var/mob/living/silicon/robot/R = C.mob
if(R.scrambledcodes || (R.module && R.module.hide_on_manifest))
continue
name = "[R.name] ([R.modtype] [R.braintype])"
ooc_notes = R.ooc_notes
flavor_text = R.flavor_text
// It's okay if we fail to find OOC notes and flavor text
// But if we can't find the name, they must be using a non-compatible mob type currently.
if(!name)
continue
directory_mobs.Add(list(list(
"name" = name,
"ooc_notes" = ooc_notes,
"tag" = tag,
"erptag" = erptag,
"character_ad" = character_ad,
"flavor_text" = flavor_text,
)))
data["directory"] = directory_mobs
return data
/datum/character_directory/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
. = ..()
if(.)
return
switch(action)
if("refresh")
// This is primarily to stop malicious users from trying to lag the server by spamming this verb
if(!usr.checkMoveCooldown())
to_chat(usr, "<span class='warning'>Don't spam character directory refresh.</span>")
return
usr.setMoveCooldown(10)
update_tgui_static_data(usr, ui)
return TRUE
if("setTag")
var/list/new_tag = input(usr, "Pick a new Vore tag for the character directory", "Character Tag", usr?.client?.prefs?.directory_tag) as null|anything in GLOB.char_directory_tags
if(!new_tag)
return
usr?.client?.prefs?.directory_tag = new_tag
return TRUE
if("setErpTag")
var/list/new_erptag = input(usr, "Pick a new ERP tag for the character directory", "Character ERP Tag", usr?.client?.prefs?.directory_erptag) as null|anything in GLOB.char_directory_erptags
if(!new_erptag)
return
usr?.client?.prefs?.directory_erptag = new_erptag
return TRUE
if("setVisible")
usr?.client?.prefs?.show_in_directory = !usr?.client?.prefs?.show_in_directory
to_chat(usr, "<span class='notice'>You are now [usr.client.prefs.show_in_directory ? "shown" : "not shown"] in the directory.</span>")
return TRUE
if("editAd")
if(!usr?.client?.prefs)
return
var/current_ad = usr.client.prefs.directory_ad
var/new_ad = sanitize(input(usr, "Change your character ad", "Character Ad", current_ad) as message|null, extra = 0)
if(isnull(new_ad))
return
usr.client.prefs.directory_ad = new_ad
return TRUE
+48
View File
@@ -0,0 +1,48 @@
/client/verb/ignore(key_to_ignore as text)
set name = "Ignore"
set category = "OOC"
set desc = "Makes OOC and Deadchat messages from a specific player not appear to you."
if(!key_to_ignore)
return
key_to_ignore = ckey(sanitize(key_to_ignore))
if(prefs && prefs.ignored_players)
if(key_to_ignore in prefs.ignored_players)
to_chat(usr, "<span class='warning'>[key_to_ignore] is already being ignored.</span>")
return
if(key_to_ignore == usr.ckey)
to_chat(usr, "<span class='notice'>You can't ignore yourself.</span>")
return
prefs.ignored_players |= key_to_ignore
SScharacter_setup.queue_preferences_save(prefs)
to_chat(usr, "<span class='notice'>Now ignoring <b>[key_to_ignore]</b>.</span>")
/client/verb/unignore(key_to_unignore as text)
set name = "Unignore"
set category = "OOC"
set desc = "Reverts your ignoring of a specific player."
if(!key_to_unignore)
return
key_to_unignore = ckey(sanitize(key_to_unignore))
if(prefs && prefs.ignored_players)
if(!(key_to_unignore in prefs.ignored_players))
to_chat(usr, "<span class='warning'>[key_to_unignore] isn't being ignored.</span>")
return
prefs.ignored_players -= key_to_unignore
SScharacter_setup.queue_preferences_save(prefs)
to_chat(usr, "<span class='notice'>Reverted ignore on <b>[key_to_unignore]</b>.</span>")
/mob/proc/is_key_ignored(var/key_to_check)
if(client)
return client.is_key_ignored(key_to_check)
return 0
/client/proc/is_key_ignored(var/key_to_check)
key_to_check = ckey(key_to_check)
if(key_to_check in prefs.ignored_players)
if(GLOB.directory[key_to_check] in GLOB.admins) // This is here so this is only evaluated if someone is actually being blocked.
return 0
return 1
return 0
+193
View File
@@ -0,0 +1,193 @@
/client/verb/ooc(msg as text)
set name = "OOC"
set category = "OOC"
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "<span class='warning'>Speech is currently admin-disabled.</span>")
return
if(!mob) return
if(IsGuestKey(key))
to_chat(src, "Guests may not use OOC.")
return
msg = sanitize(msg)
if(!msg) return
if(!is_preference_enabled(/datum/client_preference/show_ooc))
to_chat(src, "<span class='warning'>You have OOC muted.</span>")
return
if(!holder)
if(!config.ooc_allowed)
to_chat(src, "<span class='danger'>OOC is globally muted.</span>")
return
if(!config.dooc_allowed && (mob.stat == DEAD))
to_chat(usr, "<span class='danger'>OOC for dead mobs has been turned off.</span>")
return
if(prefs.muted & MUTE_OOC)
to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>")
return
if(findtext(msg, "byond://") && !config.allow_byond_links)
to_chat(src, "<B>Advertising other servers is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return
if(findtext(msg, "discord.gg") && !config.allow_discord_links)
to_chat(src, "<B>Advertising discords is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]")
return
if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links)
to_chat(src, "<B>Posting external links is not allowed.</B>")
log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]")
return
log_ooc(msg, src)
if(msg)
handle_spam_prevention(MUTE_OOC)
var/ooc_style = "everyone"
if(holder && !holder.fakekey)
ooc_style = "elevated"
//VOREStation Block Edit Start
if(holder.rights & R_EVENT) //Retired Admins
ooc_style = "event_manager"
if(holder.rights & R_ADMIN && !(holder.rights & R_BAN)) //Game Masters
ooc_style = "moderator"
if(holder.rights & R_SERVER && !(holder.rights & R_BAN)) //Developers
ooc_style = "developer"
if(holder.rights & R_ADMIN && holder.rights & R_BAN) //Admins
ooc_style = "admin"
//VOREStation Block Edit End
for(var/client/target in GLOB.clients)
if(target.is_preference_enabled(/datum/client_preference/show_ooc))
if(target.is_key_ignored(key)) // If we're ignored by this person, then do nothing.
continue
var/display_name = src.key
if(holder)
if(holder.fakekey)
if(target.holder)
display_name = "[holder.fakekey]/([src.key])"
else
display_name = holder.fakekey
if(holder && !holder.fakekey && (holder.rights & R_ADMIN|R_FUN|R_EVENT) && config.allow_admin_ooccolor && (src.prefs.ooccolor != initial(src.prefs.ooccolor))) // keeping this for the badmins
to_chat(target, "<font color='[src.prefs.ooccolor]'><span class='ooc'>" + create_text_tag("ooc", "OOC:", target) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>")
else
to_chat(target, "<span class='ooc'><span class='[ooc_style]'>" + create_text_tag("ooc", "OOC:", target) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></span>")
/client/verb/looc(msg as text)
set name = "LOOC"
set desc = "Local OOC, seen only by those in view."
set category = "OOC"
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
return
if(!mob)
return
if(IsGuestKey(key))
to_chat(src, "Guests may not use OOC.")
return
msg = sanitize(msg)
if(!msg)
return
if(!is_preference_enabled(/datum/client_preference/show_looc))
to_chat(src, "<span class='danger'>You have LOOC muted.</span>")
return
if(!holder)
if(!config.looc_allowed)
to_chat(src, "<span class='danger'>LOOC is globally muted.</span>")
return
if(!config.dooc_allowed && (mob.stat == DEAD))
to_chat(usr, "<span class='danger'>OOC for dead mobs has been turned off.</span>")
return
if(prefs.muted & MUTE_OOC)
to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>")
return
if(findtext(msg, "byond://") && !config.allow_byond_links)
to_chat(src, "<B>Advertising other servers is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return
if(findtext(msg, "discord.gg") && !config.allow_discord_links)
to_chat(src, "<B>Advertising discords is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]")
return
if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links)
to_chat(src, "<B>Posting external links is not allowed.</B>")
log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]")
return
log_looc(msg,src)
if(msg)
handle_spam_prevention(MUTE_OOC)
var/mob/source = mob.get_looc_source()
var/turf/T = get_turf(source)
if(!T) return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
var/list/m_viewers = in_range["mobs"]
var/list/receivers = list() //Clients, not mobs.
var/list/r_receivers = list()
var/display_name = key
if(holder && holder.fakekey)
display_name = holder.fakekey
if(mob.stat != DEAD)
display_name = mob.name
//VOREStation Add - Resleeving shenanigan prevention
if(ishuman(mob))
var/mob/living/carbon/human/H = mob
if(H.original_player && H.original_player != H.ckey) //In a body not their own
display_name = "[H.mind.name] (as [H.name])"
//VOREStation Add End
// Everyone in normal viewing range of the LOOC
for(var/mob/viewer in m_viewers)
if(viewer.client && viewer.client.is_preference_enabled(/datum/client_preference/show_looc))
receivers |= viewer.client
else if(istype(viewer,/mob/observer/eye)) // For AI eyes and the like
var/mob/observer/eye/E = viewer
if(E.owner && E.owner.client)
receivers |= E.owner.client
// Admins with RLOOC displayed who weren't already in
for(var/client/admin in GLOB.admins)
if(!(admin in receivers) && admin.is_preference_enabled(/datum/client_preference/holder/show_rlooc))
r_receivers |= admin
// Send a message
for(var/client/target in receivers)
var/admin_stuff = ""
if(target in GLOB.admins)
admin_stuff += "/([key])"
to_chat(target, "<span class='ooc looc'>" + create_text_tag("looc", "LOOC:", target) + " <EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span>")
for(var/client/target in r_receivers)
var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])"
to_chat(target, "<span class='ooc looc'>" + create_text_tag("looc", "LOOC:", target) + " <span class='prefix'>(R)</span><EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span>")
/mob/proc/get_looc_source()
return src
/mob/living/silicon/ai/get_looc_source()
if(eyeobj)
return eyeobj
return src
+12
View File
@@ -0,0 +1,12 @@
/client/proc/pingfromtime(time)
return ((world.time+world.tick_lag*world.tick_usage/100)-time)*100
/client/verb/display_ping(time as num)
set instant = TRUE
set name = ".display_ping"
to_chat(src, "<span class='notice'>Round trip ping took [round(pingfromtime(time),1)]ms</span>")
/client/verb/ping()
set name = "Ping"
set category = "OOC"
winset(src, null, "command=.display_ping+[world.time+world.tick_lag*world.tick_usage/100]")
+168
View File
@@ -0,0 +1,168 @@
/mob/var/suiciding = 0
/mob/living/carbon/human/verb/suicide()
set hidden = 1
if (stat == DEAD)
to_chat(src, "You're already dead!")
return
if (!ticker)
to_chat(src, "You can't commit suicide before the game starts!")
return
if(!player_is_antag(mind))
message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1)
to_chat(src, "No. Adminhelp if there is a legitimate reason.")
return
if (suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
if(confirm == "Yes")
if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))")
return
suiciding = 15
does_not_breathe = 0 //Prevents ling-suicide zombies, or something
var/obj/item/held_item = get_active_hand()
if(held_item)
var/damagetype = held_item.suicide_act(src)
if(damagetype)
log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]")
var/damage_mod = 1
switch(damagetype) //Sorry about the magic numbers.
//brute = 1, burn = 2, tox = 4, oxy = 8
if(15) //4 damage types
damage_mod = 4
if(6, 11, 13, 14) //3 damage types
damage_mod = 3
if(3, 5, 7, 9, 10, 12) //2 damage types
damage_mod = 2
if(1, 2, 4, 8) //1 damage type
damage_mod = 1
else //This should not happen, but if it does, everything should still work
damage_mod = 1
//Do 175 damage divided by the number of damage types applied.
if(damagetype & BRUTELOSS)
adjustBruteLoss(30/damage_mod) //hack to prevent gibbing
adjustOxyLoss(145/damage_mod)
if(damagetype & FIRELOSS)
adjustFireLoss(175/damage_mod)
if(damagetype & TOXLOSS)
adjustToxLoss(175/damage_mod)
if(damagetype & OXYLOSS)
adjustOxyLoss(175/damage_mod)
//If something went wrong, just do normal oxyloss
if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS))
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
return
log_and_message_admins("[key_name(src)] commited suicide")
var/datum/gender/T = gender_datums[get_visible_gender()]
var/suicidemsg
suicidemsg = pick("<span class='danger'>[src] is attempting to bite [T.his] tongue off! It looks like [T.he] [T.is] trying to commit suicide.</span>", \
"<span class='danger'>[src] is jamming [T.his] thumbs into [T.his] eye sockets! It looks like [T.he] [T.is] trying to commit suicide.</span>", \
"<span class='danger'>[src] is twisting [T.his] own neck! It looks like [T.he] [T.is] trying to commit suicide.</span>", \
"<span class='danger'>[src] is holding [T.his] breath! It looks like [T.he] [T.is] trying to commit suicide.</span>")
if(isSynthetic())
suicidemsg = "<span class='danger'>[src] is attempting to switch [T.his] power off! It looks like [T.he] [T.is] trying to commit suicide.</span>"
visible_message(suicidemsg)
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
/mob/living/carbon/brain/verb/suicide()
set hidden = 1
if (stat == 2)
to_chat(src, "You're already dead!")
return
if (!ticker)
to_chat(src, "You can't commit suicide before the game starts!")
return
if (suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
if(confirm == "Yes")
suiciding = 1
to_chat(viewers(loc),"<span class='danger'>[src]'s brain is growing dull and lifeless. It looks like it's lost the will to live.</span>")
spawn(50)
death(0)
suiciding = 0
/mob/living/silicon/ai/verb/suicide()
set hidden = 1
if (stat == 2)
to_chat(src, "You're already dead!")
return
if (suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
if(confirm == "Yes")
suiciding = 1
to_chat(viewers(src),"<span class='danger'>[src] is powering down. It looks like they're trying to commit suicide.</span>")
//put em at -175
adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
/mob/living/silicon/robot/verb/suicide()
set hidden = 1
if (stat == 2)
to_chat(src, "You're already dead!")
return
if (suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
if(confirm == "Yes")
suiciding = 1
to_chat(viewers(src),"<span class='danger'>[src] is powering down. It looks like they're trying to commit suicide.</span>")
//put em at -175
adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
/mob/living/silicon/pai/verb/suicide()
set category = "pAI Commands"
set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
set name = "pAI Suicide"
var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No")
if(answer == "Yes")
var/obj/item/device/paicard/card = loc
card.removePersonality()
var/turf/T = get_turf_or_move(card.loc)
for (var/mob/M in viewers(T))
M.show_message("<span class='notice'>[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"</span>", 3, "<span class='notice'>[src] bleeps electronically.</span>", 2)
death(0)
else
to_chat(src, "Aborting suicide attempt.")
+208
View File
@@ -0,0 +1,208 @@
/client/verb/who()
set name = "Who"
set category = "OOC"
var/msg = "<b>Current Players:</b>\n"
var/list/Lines = list()
if(holder && (R_ADMIN & holder.rights || R_MOD & holder.rights))
for(var/client/C in GLOB.clients)
var/entry = "\t[C.key]"
if(C.holder && C.holder.fakekey)
entry += " <i>(as [C.holder.fakekey])</i>"
entry += " - Playing as [C.mob.real_name]"
switch(C.mob.stat)
if(UNCONSCIOUS)
entry += " - <font color='darkgray'><b>Unconscious</b></font>"
if(DEAD)
if(isobserver(C.mob))
var/mob/observer/dead/O = C.mob
if(O.started_as_observer)
entry += " - <font color='gray'>Observing</font>"
else
entry += " - <font color='black'><b>DEAD</b></font>"
else
entry += " - <font color='black'><b>DEAD</b></font>"
var/age
if(isnum(C.player_age))
age = C.player_age
else
age = 0
if(age <= 1)
age = "<font color='#ff0000'><b>[age]</b></font>"
else if(age < 10)
age = "<font color='#ff8c00'><b>[age]</b></font>"
entry += " - [age]"
if(is_special_character(C.mob))
entry += " - <b><font color='red'>Antagonist</font></b>"
if(C.is_afk())
var/seconds = C.last_activity_seconds()
entry += " (AFK - "
entry += "[round(seconds / 60)] minutes, "
entry += "[seconds % 60] seconds)"
entry += " (<A HREF='?_src_=holder;adminmoreinfo=\ref[C.mob]'>?</A>)"
Lines += entry
else
for(var/client/C in GLOB.clients)
if(C.holder && C.holder.fakekey)
Lines += C.holder.fakekey
else
Lines += C.key
for(var/line in sortList(Lines))
msg += "[line]\n"
msg += "<b>Total Players: [length(Lines)]</b>"
to_chat(src,msg)
/client/verb/staffwho()
set category = "Admin"
set name = "Staffwho"
var/message = get_staffwho_message(holder)
to_chat(src, message)
// VOREStation Edit - This whole proc has various vorestation edits throughout. Practically every other line.
/proc/get_staffwho_message(datum/admins/holder)
var/msg = ""
var/modmsg = ""
var/devmsg = ""
var/eventMmsg = ""
var/num_mods_online = 0
var/num_admins_online = 0
var/num_devs_online = 0
var/num_event_managers_online = 0
if(holder)
for(var/client/C in GLOB.admins)
if(R_ADMIN & C.holder.rights && R_BAN & C.holder.rights)
if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) //Event Managerss can't see stealthmins
continue
msg += "\t[C] is a [C.holder.rank]"
if(C.holder.fakekey)
msg += " <i>(as [C.holder.fakekey])</i>"
if(isobserver(C.mob))
msg += " - Observing"
else if(istype(C.mob,/mob/new_player))
msg += " - Lobby"
else
msg += " - Playing"
if(C.is_afk())
var/seconds = C.last_activity_seconds()
msg += " (AFK - "
msg += "[round(seconds / 60)] minutes, "
msg += "[seconds % 60] seconds)"
msg += "\n"
num_admins_online++
else if(R_ADMIN & C.holder.rights && !(R_SERVER & C.holder.rights))
modmsg += "\t[C] is a [C.holder.rank]"
if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
continue
if(C.holder.fakekey)
msg += " <i>(as [C.holder.fakekey])</i>"
if(isobserver(C.mob))
modmsg += " - Observing"
else if(istype(C.mob,/mob/new_player))
modmsg += " - Lobby"
else
modmsg += " - Playing"
if(C.is_afk())
var/seconds = C.last_activity_seconds()
modmsg += " (AFK - "
modmsg += "[round(seconds / 60)] minutes, "
modmsg += "[seconds % 60] seconds)"
modmsg += "\n"
num_mods_online++
else if(R_SERVER & C.holder.rights)
if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
continue
devmsg += "\t[C] is a [C.holder.rank]"
if(C.holder.fakekey)
devmsg += " <i>(as [C.holder.fakekey])</i>"
if(isobserver(C.mob))
devmsg += " - Observing"
else if(istype(C.mob,/mob/new_player))
devmsg += " - Lobby"
else
devmsg += " - Playing"
if(C.is_afk())
var/seconds = C.last_activity_seconds()
devmsg += "(AFK - "
devmsg += "[round(seconds / 60)] minutes, "
devmsg += "[seconds % 60] seconds)"
devmsg += "\n"
num_devs_online++
else
if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
continue
eventMmsg += "\t[C] is a [C.holder.rank]"
if(C.holder.fakekey)
eventMmsg += " <i>(as [C.holder.fakekey])</i>"
if(isobserver(C.mob))
eventMmsg += " - Observing"
else if(istype(C.mob,/mob/new_player))
eventMmsg += " - Lobby"
else
eventMmsg += " - Playing"
if(C.is_afk())
var/seconds = C.last_activity_seconds()
eventMmsg += " (AFK - "
eventMmsg += "[round(seconds / 60)] minutes, "
eventMmsg += "[seconds % 60] seconds)"
eventMmsg += "\n"
num_event_managers_online++
else
for(var/client/C in GLOB.admins)
if(R_ADMIN & C.holder.rights && R_BAN & C.holder.rights)
if(!C.holder.fakekey)
msg += "\t[C] is a [C.holder.rank]\n"
num_admins_online++
else if(R_ADMIN & C.holder.rights && !(R_SERVER & C.holder.rights))
if(!C.holder.fakekey)
modmsg += "\t[C] is a [C.holder.rank]\n"
num_mods_online++
else if(R_SERVER & C.holder.rights)
if(!C.holder.fakekey)
devmsg += "\t[C] is a [C.holder.rank]\n"
num_devs_online++
else
if(!C.holder.fakekey)
eventMmsg += "\t[C] is a [C.holder.rank]\n"
num_event_managers_online++
msg = "<b>Current Admins ([num_admins_online]):</b>\n" + msg
if(config.show_mods)
msg += "\n<b> Current Game Masters ([num_mods_online]):</b>\n" + modmsg
if(config.show_devs)
msg += "\n<b> Current Developers ([num_devs_online]):</b>\n" + devmsg
if(config.show_event_managers)
msg += "\n<b> Current Miscellaneous ([num_event_managers_online]):</b>\n" + eventMmsg
msg += "\n<span class='info'>Adminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and respond.</span>"
return msg
+9
View File
@@ -117,6 +117,15 @@
min_cold_protection_temperature = T0C - 20
cold_protection = HEAD
/obj/item/clothing/head/helmet/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
icon_state = "explorer"
flags = THICKMATERIAL
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35)
/obj/item/clothing/head/helmet/swat
name = "\improper SWAT helmet"
desc = "They're often used by highly trained SWAT Officers."
+5
View File
@@ -126,6 +126,11 @@
siemens_coefficient = 0.9
body_parts_covered = 0
/obj/item/clothing/head/plaguedoctorhat/gold
name = "golden plague doctor's hat"
desc = "These were once used by plague doctors, allegedly. This one has gold accents."
icon_state = "plaguedoctor2"
/obj/item/clothing/head/hasturhood
name = "hastur's hood"
desc = "It's unspeakably stylish"
+5
View File
@@ -69,6 +69,11 @@
armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 90, rad = 0)
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/mask/gas/plaguedoctor/gold
name = "gold plague doctor mask"
desc = "A modern version of the age old classic, this mask is both capable of filtering air, and connecting to an air supply. This one is gold."
icon_state = "plaguedoctor2"
/obj/item/clothing/mask/gas/swat
name = "\improper SWAT mask"
desc = "A close-fitting tactical mask that can be connected to an air supply."
+51 -27
View File
@@ -56,31 +56,6 @@
..()
helmet = new /obj/item/clothing/head/helmet/space/void/responseteam/janitor //autoinstall the helmet
/obj/item/clothing/suit/space/void/responseteam
sprite_sheets = list(
SPECIES_HUMAN = 'icons/mob/spacesuit_vr.dmi',
SPECIES_TAJ = 'icons/mob/species/tajaran/suit_vr.dmi',
SPECIES_SKRELL = 'icons/mob/species/skrell/suit_vr.dmi',
SPECIES_UNATHI = 'icons/mob/species/unathi/suit_vr.dmi',
SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit_vr.dmi',
SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi',
SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi',
SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_vr.dmi',
SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit_vr.dmi',
SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_vr.dmi'
)
sprite_sheets_obj = list(
SPECIES_TAJ = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_SKRELL = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_UNATHI = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_XENOHYBRID = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_AKULA = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_SERGAL = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_VULPKANIN = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_ZORREN_HIGH = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_FENNEC = 'icons/obj/clothing/suits_vr.dmi'
)
//override the attackby screwdriver proc so that people can't remove the helmet
/obj/item/clothing/suit/space/void/responseteam/attackby(obj/item/W as obj, mob/user as mob)
@@ -181,6 +156,43 @@
icon_state = "erthelmet_j"
item_state = "erthelmet_j"
/obj/item/clothing/suit/space/void/responseteam
sprite_sheets = list(
SPECIES_HUMAN = 'icons/mob/spacesuit_vr.dmi',
SPECIES_TAJ = 'icons/mob/species/tajaran/suit_vr.dmi',
SPECIES_SKRELL = 'icons/mob/species/skrell/suit_vr.dmi',
SPECIES_UNATHI = 'icons/mob/species/unathi/suit_vr.dmi',
SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit_vr.dmi',
SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi',
SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi',
SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_vr.dmi',
SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit_vr.dmi',
SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_vr.dmi',
SPECIES_SHADEKIN_CREW = 'icons/mob/species/vulpkanin/suit_vr.dmi',
SPECIES_VASILISSAN = 'icons/mob/spacesuit_vr.dmi',
SPECIES_NEVREAN = 'icons/mob/spacesuit_vr.dmi',
SPECIES_RAPALA = 'icons/mob/spacesuit_vr.dmi',
SPECIES_ALRAUNE = 'icons/mob/spacesuit_vr.dmi',
SPECIES_ZADDAT = 'icons/mob/spacesuit_vr.dmi'
)
sprite_sheets_obj = list(
SPECIES_TAJ = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_SKRELL = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_UNATHI = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_XENOHYBRID = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_AKULA = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_SERGAL = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_VULPKANIN = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_ZORREN_HIGH = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_FENNEC = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_SHADEKIN_CREW = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_VASILISSAN = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_NEVREAN = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_RAPALA = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_ALRAUNE = 'icons/obj/clothing/suits_vr.dmi',
SPECIES_ZADDAT = 'icons/obj/clothing/suits_vr.dmi'
)
/obj/item/clothing/head/helmet/space/void/responseteam
sprite_sheets = list(
SPECIES_HUMAN = 'icons/mob/head_vr.dmi',
@@ -192,7 +204,13 @@
SPECIES_SERGAL = 'icons/mob/species/unathi/helmet_vr.dmi',
SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet_vr.dmi',
SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet_vr.dmi',
SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_vr.dmi'
SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_vr.dmi',
SPECIES_SHADEKIN_CREW = 'icons/mob/species/vulpkanin/helmet_vr.dmi',
SPECIES_VASILISSAN = 'icons/mob/head_vr.dmi',
SPECIES_NEVREAN = 'icons/mob/head_vr.dmi',
SPECIES_RAPALA = 'icons/mob/head_vr.dmi',
SPECIES_ALRAUNE = 'icons/mob/head_vr.dmi',
SPECIES_ZADDAT = 'icons/mob/head_vr.dmi'
)
sprite_sheets_obj = list(
SPECIES_TAJ = 'icons/obj/clothing/hats_vr.dmi',
@@ -203,6 +221,12 @@
SPECIES_SERGAL = 'icons/obj/clothing/hats_vr.dmi',
SPECIES_VULPKANIN = 'icons/obj/clothing/hats_vr.dmi',
SPECIES_ZORREN_HIGH = 'icons/obj/clothing/hats_vr.dmi',
SPECIES_FENNEC = 'icons/obj/clothing/hats_vr.dmi'
SPECIES_FENNEC = 'icons/obj/clothing/hats_vr.dmi',
SPECIES_SHADEKIN_CREW = 'icons/obj/clothing/hats_vr.dmi',
SPECIES_VASILISSAN = 'icons/obj/clothing/hats_vr.dmi',
SPECIES_NEVREAN = 'icons/obj/clothing/hats_vr.dmi',
SPECIES_RAPALA = 'icons/obj/clothing/hats_vr.dmi',
SPECIES_ALRAUNE = 'icons/obj/clothing/hats_vr.dmi',
SPECIES_ZADDAT = 'icons/obj/clothing/hats_vr.dmi'
)
sprite_sheets_refit = list() //have to nullify this as well just to be thorough
+40
View File
@@ -539,6 +539,14 @@
return 0
return 1
/obj/item/clothing/suit/armor/pcarrier/explorer
name = "explorer suit"
desc = "A lightweight explorer plate carrier. It can be equipped with armor plates, but only protects from the cold on it's own."
icon_state = "explorer"
flags = THICKMATERIAL
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
/obj/item/clothing/suit/armor/pcarrier/light
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate)
@@ -593,6 +601,30 @@
desc = "A lightweight tan plate carrier vest. It can be equipped with armor plates, but provides no protection of its own."
icon_state = "pcarrier_tan"
/obj/item/clothing/suit/armor/pcarrier/laserproof
name = "ablative plate carrier"
desc = "A specialist laser resistant plate carrier. It can be equipped with armour plates, but provides very little protection of its own."
icon_state = "ablative"
armor = list(melee = 0, bullet = 0, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 0)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/laserproof)
/obj/item/clothing/suit/armor/pcarrier/bulletproof
name = "ballistic plate carrier"
desc = "A specialist bullet resistant plate carrier. It can be equipped with armour plates, but provides very little protection of its own."
icon_state = "ballistic"
armor = list(melee = 0, bullet = 5, laser = 0, energy = 0, bomb = 5, bio = 0, rad = 0)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/bulletproof)
/obj/item/clothing/suit/armor/pcarrier/riot
name = "riot plate carrier"
desc = "A specialist melee resistant plate carrier. It can be equipped with armour plates, but provides very little protection of its own."
icon_state = "riot"
armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/riot)
/obj/item/clothing/suit/armor/pcarrier/explorer/light
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/explorer, /obj/item/clothing/accessory/armor/armguards/explorer, /obj/item/clothing/accessory/armor/legguards/explorer, /obj/item/clothing/accessory/storage/pouches/green)
/obj/item/clothing/suit/armor/pcarrier/tan/tactical
name = "tactical plate carrier"
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/tactical, /obj/item/clothing/accessory/storage/pouches/large/tan)
@@ -600,3 +632,11 @@
/obj/item/clothing/suit/armor/pcarrier/merc
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/merc, /obj/item/clothing/accessory/armor/armguards/merc, /obj/item/clothing/accessory/armor/legguards/merc, /obj/item/clothing/accessory/storage/pouches/large)
/obj/item/clothing/suit/armor/pcarrier/laserproof/full
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/laserproof, /obj/item/clothing/accessory/armor/armguards/laserproof, /obj/item/clothing/accessory/armor/legguards/laserproof, /obj/item/clothing/accessory/storage/pouches/blue)
/obj/item/clothing/suit/armor/pcarrier/bulletproof/full
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/bulletproof, /obj/item/clothing/accessory/armor/armguards/bulletproof, /obj/item/clothing/accessory/armor/legguards/bulletproof, /obj/item/clothing/accessory/storage/pouches)
/obj/item/clothing/suit/armor/pcarrier/riot/full
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/riot, /obj/item/clothing/accessory/armor/armguards/riot, /obj/item/clothing/accessory/armor/legguards/riot, /obj/item/clothing/accessory/storage/pouches)
+3 -3
View File
@@ -86,10 +86,10 @@
/obj/item/clothing/head/bio_hood/cmo
icon_state = "bio_cmo"
//Plague Dr mask can be found in clothing/masks/gasmask.dm
//Plague Dr mask can be found in clothing/masks/gasmask.dm. Golden can be found in labcoat.dm.
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit
name = "Plague doctor suit"
name = "plague doctor suit"
desc = "It protected doctors from the Black Death, back then. You bet your arse it's gonna help you against viruses."
icon_state = "plaguedoctor"
item_state_slots = list(slot_r_hand_str = "bio", slot_l_hand_str = "bio")
flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+7 -1
View File
@@ -104,4 +104,10 @@
/obj/item/clothing/suit/storage/toggle/labcoat/blue_edge
name = "blue-edged labcoat"
desc = "A suit that protects against minor chemical spills. This one has blue trim."
icon_state = "blue_edge_labcoat"
icon_state = "blue_edge_labcoat"
/obj/item/clothing/suit/storage/toggle/labcoat/plaguedoctor
name = "golden plague doctor suit"
desc = "If it worked then, it works now. This classic design comes in gold."
icon_state = "plaguedoctor2"
index = 1
@@ -92,6 +92,12 @@
armor = list(melee = 30, bullet = 15, laser = 40, energy = 10, bomb = 25, bio = 0, rad = 0)
slot = ACCESSORY_SLOT_ARMOR_C
/obj/item/clothing/accessory/armor/armorplate/explorer
name = "explorer armor plate"
desc = "A flexible plate made of synthetic fibers, designed to protect from the Sivian fauna. Attaches to a plate carrier."
icon_state = "armor_light"
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35)
/obj/item/clothing/accessory/armor/armorplate/stab
name = "mesh armor plate"
desc = "A mesh armor plate made of steel-reinforced synthetic fibers, great for dealing with small blades. Attaches to a plate carrier."
@@ -145,7 +151,7 @@
/obj/item/clothing/accessory/armor/armorplate/laserproof
name = "ablative armor plate"
desc = "A durasteel-scaled synthetic armor plate, providing good protection against lasers. Attaches to a plate carrier."
icon_state = "armor_medium"
icon_state = "armor_ablative"
slowdown = 0.6
armor = list(melee = 10, bullet = 10, laser = 70, energy = 50, bomb = 0, bio = 0, rad = 0)
armorsoak = list(melee = 0, bullet = 0, laser = 10, energy = 15, bomb = 0, bio = 0, rad = 0)
@@ -203,6 +209,12 @@
desc = "A pair of tan arm pads reinforced with armor plating. Attaches to a plate carrier."
icon_state = "armguards_tan"
/obj/item/clothing/accessory/armor/armguards/explorer
name = "explorer arm guards"
desc = "A pair of green arm pads reinforced with armor plating. Attaches to a plate carrier."
icon_state = "armguards_green"
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35)
/obj/item/clothing/accessory/armor/armguards/merc
name = "heavy arm guards"
desc = "A pair of red-trimmed black arm pads reinforced with heavy armor plating. Attaches to a plate carrier."
@@ -262,6 +274,12 @@
desc = "A pair of armored leg pads in tan. Attaches to a plate carrier."
icon_state = "legguards_tan"
/obj/item/clothing/accessory/armor/legguards/explorer
name = "explorer leg guards"
desc = "A pair of armored leg pads in green. Attaches to a plate carrier."
icon_state = "legguards_green"
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35)
/obj/item/clothing/accessory/armor/legguards/merc
name = "heavy leg guards"
desc = "A pair of heavily armored leg pads in red-trimmed black. Attaches to a plate carrier."
+13 -1
View File
@@ -560,12 +560,18 @@
icon_state = "pentagram"
index = 1
obj/item/clothing/under/dress/yellowswoop
/obj/item/clothing/under/dress/yellowswoop
name = "yellow swooped dress"
desc = "A yellow dress that swoops to the side."
icon_state = "yellowswoop"
index = 1
/obj/item/clothing/under/dress/countess
name = "countess dress"
desc = "A red and black dress fit for a countess."
icon_state = "countess"
index = 1
/*
* wedding stuff
*/
@@ -895,6 +901,12 @@ Uniforms and such
icon_state = "disheveled"
index = 1
/obj/item/clothing/under/flower_skirt
name = "flower skirt"
desc = "A flowery skirt that comes in a variety of colors."
icon_state = "flowerskirt"
index = 1
/*
* swimsuit
*/
+30 -25
View File
@@ -16,51 +16,56 @@
item_state = "golem" //This is dumb and hacky but was here when I got here.
worn_state = "golem" //It's basically just a coincidentally black iconstate in the file.
/obj/item/clothing/under/bluespace
name = "bluespace jumpsuit"
icon_state = "lingchameleon"
/obj/item/clothing/under/hyperfiber
name = "HYPER jumpsuit"
icon = 'icons/obj/clothing/uniforms_vr.dmi'
icon_override = 'icons/mob/uniform_vr.dmi'
icon_state = "hyper"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi',
)
item_state = "lingchameleon"
worn_state = "lingchameleon"
desc = "Do you feel like warping spacetime today? Because it seems like that's on the agenda, now. \
Allows one to resize themselves at will, and conceals their true weight."
item_state = "hyper"
worn_state = "hyper"
desc = "Got a lot to hide on your body? Well, this Heavy Yield Protrusion Erasing and Retracting suit seems perfect for you. \
Hides any bulges on your body, as well as conceals your true weight."
hides_bulges = TRUE
var/original_size
/obj/item/clothing/under/bluespace/verb/toggle_fibers()
/obj/item/clothing/under/hyperfiber/verb/toggle_fibers()
set category = "Object"
set name = "Adjust fibers"
set desc = "Adjust your suit fibers. This makes it so your stomach(s) will show or not."
set name = "Adjust Bluespace Fibers"
set desc = "Adjust your suit's HYPER fibers. Activating it hides your stomach(s) and your general body-build. Good if you have a lot to hide."
set src in usr
adjust_fibers(usr)
..()
/obj/item/clothing/under/bluespace/proc/adjust_fibers(mob/user)
/obj/item/clothing/under/hyperfiber/proc/adjust_fibers(mob/user)
if(hides_bulges == FALSE)
hides_bulges = TRUE
to_chat(user, "You tense the suit fibers, hiding your stomach(s).")
to_chat(user, "You tense the suit fibers, hiding your stomach(s) and weight.")
else
hides_bulges = FALSE
to_chat(user, "You relax the suit fibers, showing your stomach(s).")
to_chat(user, "You relax the suit fibers, revealing your stomach(s) and weight.")
/obj/item/clothing/under/hyperfiber/bluespace
name = "bluespace jumpsuit"
icon_state = "bluespace"
item_state = "bluespace"
worn_state = "bluespace"
desc = "Do you feel like warping spacetime today? Because it seems like that's on the agenda, now. \
Allows one to resize themselves at will, and conceals their true weight as well as any bulges or protrusions on their body."
var/original_size
/obj/item/clothing/under/bluespace/verb/resize()
set name = "Adjust Size"
/obj/item/clothing/under/hyperfiber/bluespace/verb/resize()
set name = "Adjust Bluespace Fibers"
set desc = "Adjust your suit's bluespace fibers. Activating it allows you to expand your own body or reduce it in size! Effect is limited to when you have the suit on."
set category = "Object"
set src in usr
bluespace_size(usr)
..()
/obj/item/clothing/under/bluespace/proc/bluespace_size(mob/usr as mob)
/obj/item/clothing/under/hyperfiber/bluespace/proc/bluespace_size(mob/usr as mob)
if (!ishuman(usr))
return
@@ -73,7 +78,7 @@
to_chat(H,"<span class='warning'>You must be WEARING the uniform to change your size.</span>")
return
var/new_size = input("Put the desired size (25-200%)", "Set Size", 200) as num|null
var/new_size = input("Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null
//Check AGAIN because we accepted user input which is blocking.
if (src != H.w_uniform)
@@ -89,7 +94,7 @@
H.update_icons() //Just want the matrix transform
return
if (!ISINRANGE(new_size,25,200))
if (!H.size_range_check(new_size))
to_chat(H,"<span class='notice'>The safety features of the uniform prevent you from choosing this size.</span>")
return
@@ -102,7 +107,7 @@
else //They chose their current size.
return
/obj/item/clothing/under/bluespace/mob_can_unequip(mob/M, slot, disable_warning = 0)
/obj/item/clothing/under/hyperfiber/bluespace/mob_can_unequip(mob/M, slot, disable_warning = 0)
. = ..()
if(. && ishuman(M) && original_size)
var/mob/living/carbon/human/H = M
+3
View File
@@ -0,0 +1,3 @@
#undef COMPASS_INTERVAL
#undef COMPASS_PERIOD
#undef COMPASS_LABEL_OFFSET
+15
View File
@@ -0,0 +1,15 @@
#define COMPASS_INTERVAL 3
#define COMPASS_PERIOD 15
#define COMPASS_LABEL_OFFSET 150
/*
This folder contains an abstract type (/obj/compass_holder) which contains a set of
waypoints (/datum/compass_waypoint) and generates a circular compass with markers for
mobs that have the object in their screen list. See GPS for an example implementation.
*/
/image/compass_marker
maptext_height = 64
maptext_width = 128
maptext_x = -48
maptext_y = -32
+127
View File
@@ -0,0 +1,127 @@
/obj/compass_holder
name = null
icon = null
icon_state = null
screen_loc = "CENTER,CENTER"
var/show_heading = FALSE
var/numeric_directions = FALSE
var/image/compass_heading_marker
var/list/compass_static_labels
var/list/compass_waypoints
var/list/compass_waypoint_markers
var/static/list/angle_step_to_dir = list(
"N",
"NE",
"E",
"SE",
"S",
"SW",
"W",
"NW",
"N"
)
/obj/compass_holder/Initialize(mapload, ...)
. = ..()
if(show_heading)
compass_heading_marker = new /image/compass_marker
compass_heading_marker.maptext = "<center><font color = '#00ffffff' size = 2><b>△</b></font></center>"
compass_heading_marker.filters = filter(type="drop_shadow", color = "#00ffffaa", size = 2, offset = 1,x = 0, y = 0)
compass_heading_marker.layer = LAYER_HUD_UNDER
compass_heading_marker.plane = PLANE_PLAYER_HUD
for(var/i in 0 to (360/(COMPASS_PERIOD))-1)
var/image/I = new /image/compass_marker
I.loc = src
var/str
var/str_col
if(i % COMPASS_INTERVAL == 0)
var/angle = (i * COMPASS_PERIOD)
if(numeric_directions)
str = "[angle]"
else
str = angle_step_to_dir[CLAMP(round(angle/45)+1, 1, length(angle_step_to_dir))]
str_col = "#ffffffaa"
else
str = "〡"
str_col = "#aaaaaa88"
I.maptext = "<center><font color = '[str_col]' size = '1px'><b>[str]</b></font></center>"
var/matrix/M = matrix()
M.Translate(0, COMPASS_LABEL_OFFSET)
M.Turn(COMPASS_PERIOD * i)
I.transform = M
I.filters = filter(type="drop_shadow", color = "#77777777", size = 2, offset = 1,x = 0, y = 0)
I.layer = LAYER_HUD_UNDER
I.plane = PLANE_PLAYER_HUD
LAZYADD(compass_static_labels, I)
rebuild_overlay_lists(TRUE)
/obj/compass_holder/Destroy()
QDEL_NULL_LIST(compass_waypoints)
. = ..()
/obj/compass_holder/proc/get_heading()
var/atom/A = loc?.loc // is there a get_holder_recursive() equivalent on Polaris?
if(istype(A))
. = dir2angle(A.dir)
else
. = 0
/obj/compass_holder/update_icon()
var/set_overlays = (compass_static_labels | compass_waypoint_markers)
if(show_heading)
set_overlays |= compass_heading_marker
overlays = set_overlays
/obj/compass_holder/proc/clear_waypoint(var/id)
LAZYREMOVE(compass_waypoints, id)
rebuild_overlay_lists(TRUE)
/obj/compass_holder/proc/set_waypoint(var/id, var/label, var/heading_x, var/heading_y, var/heading_z, var/label_color)
var/datum/compass_waypoint/wp = LAZYACCESS(compass_waypoints, id)
if(!wp)
wp = new /datum/compass_waypoint()
wp.set_values(label, heading_x, heading_y, heading_z, label_color)
LAZYSET(compass_waypoints, id, wp)
rebuild_overlay_lists(TRUE)
/obj/compass_holder/proc/recalculate_heading(var/rebuild_icon = TRUE)
if(show_heading)
var/matrix/M = matrix()
M.Translate(0, round(COMPASS_LABEL_OFFSET - 35))
M.Turn(get_heading())
compass_heading_marker.transform = M
if(rebuild_icon)
update_icon()
/obj/compass_holder/proc/show_waypoint(var/id)
var/datum/compass_waypoint/wp = compass_waypoints[id]
wp.hidden = FALSE
/obj/compass_holder/proc/hide_waypoint(var/id)
var/datum/compass_waypoint/wp = compass_waypoints[id]
wp.hidden = TRUE
/obj/compass_holder/proc/hide_waypoints(var/rebuild_overlays = FALSE)
for(var/id in compass_waypoints)
hide_waypoint(id)
if(rebuild_overlays)
rebuild_overlay_lists(TRUE)
/obj/compass_holder/proc/rebuild_overlay_lists(var/update_icon = FALSE)
compass_waypoint_markers = null
var/turf/T = get_turf(src)
if(istype(T))
for(var/id in compass_waypoints)
var/datum/compass_waypoint/wp = compass_waypoints[id]
if(!wp.hidden)
wp.recalculate_heading(T.x, T.y)
LAZYADD(compass_waypoint_markers, wp.compass_overlay)
if(show_heading)
recalculate_heading(FALSE)
if(update_icon)
update_icon()
+30
View File
@@ -0,0 +1,30 @@
/datum/compass_waypoint
var/name
var/x
var/y
var/z
var/color
var/hidden = FALSE
var/image/compass_overlay
/datum/compass_waypoint/proc/set_values(var/_name, var/_x, var/_y, var/_z, var/_color)
name = _name
x = _x
y = _y
z = _z
color = _color
compass_overlay = new /image/compass_marker
compass_overlay.loc = src
compass_overlay.maptext = "<center><font color = '[color]' size = '2px'><b>|</b>\n[name]</font></center>"
compass_overlay.filters = filter(type="drop_shadow", color = "[color]" + "aa", size = 2, offset = 1,x = 0, y = 0)
compass_overlay.layer = LAYER_HUD_UNDER
compass_overlay.plane = PLANE_PLAYER_HUD
/datum/compass_waypoint/proc/recalculate_heading(var/cx, var/cy)
var/matrix/M = matrix()
M.Translate(0, (name ? COMPASS_LABEL_OFFSET-4 : COMPASS_LABEL_OFFSET))
M.Turn(ATAN2(cy-y, cx-x)+180)
compass_overlay.transform = M
#undef COMPASS_PERIOD
#undef COMPASS_INTERVAL
@@ -141,4 +141,4 @@
else if(bloodsamp)
icon_state = "dnaclosed"
else
icon_state = "dnaopen"
icon_state = "dnaopen"
+16 -2
View File
@@ -76,10 +76,24 @@
stat(null,"<font color='#8A0808'><b>[description_holders["antag"]]</b></font>") //Red, malicious antag-related text
//override examinate verb to update description holders when things are examined
/mob/examinate(atom/A as mob|obj|turf in view())
if(..())
//mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine()
/mob/verb/examinate(atom/A as mob|obj|turf in _validate_atom(A))
set name = "Examine"
set category = "IC"
if((is_blind(src) || usr.stat) && !isobserver(src))
to_chat(src, "<span class='notice'>Something is there but you can't see it.</span>")
return 1
//Could be gone by the time they finally pick something
if(!A)
return 1
face_atom(A)
var/list/results = A.examine(src)
if(!results || !results.len)
results = list("You were unable to examine that. Tell a developer!")
to_chat(src, jointext(results, "<br>"))
update_examine_panel(A)
/mob/proc/update_examine_panel(var/atom/A)
+122 -1
View File
@@ -1,9 +1,22 @@
/datum/lore/codex/category/main_news // The top-level categories for the news thing
name = "Index"
data = "Below you'll find a list of articles relevant to the current (as of 2564) political climate, especially concerning the Almach Rim \
data = "Below you'll find a list of articles relevant to the current (as of 2565) political climate, especially concerning the local \
region. Each is labeled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \
articles. You are encouraged to check back frequently."
children = list(
/datum/lore/codex/page/article101,
/datum/lore/codex/page/article100,
/datum/lore/codex/page/article99,
/datum/lore/codex/page/article98,
/datum/lore/codex/page/article97,
/datum/lore/codex/page/article96,
/datum/lore/codex/page/article95,
/datum/lore/codex/page/article94,
/datum/lore/codex/page/article93,
/datum/lore/codex/page/article92,
/datum/lore/codex/page/article91,
/datum/lore/codex/page/article90,
/datum/lore/codex/page/article89,
/datum/lore/codex/page/article88,
/datum/lore/codex/page/article87,
/datum/lore/codex/page/article86,
@@ -1006,3 +1019,111 @@
Make no mistake, that is what our agreement today symbolizes. A new era of peace for us, where we no longer have to worry about the threat of piracy or invasion. We can return to our homes, rebuild our stations, and forge a new future for ourselves and our children'\
<br><br>\
It was also announced that though the work of restoring order to the system is ongoing, they expect elections will be held for a new Assembly and President within the next few months, with the exact date announced once violence on the major stations has ceased and cooperation from the insubordinate stations is secured. Yong will head an interim government in the meantime."
/datum/lore/codex/page/article89
name = "08/15/64 - Almach Permits First Solar Inspection"
data = "Almost four months since its establishment as a Skrellian territory, the Almach Protectorate Government has extended its first formal invitation to Solar Confederate Government inspectors to ensure the fledgling state is complying with restrictions imposed by the Treaty of Whythe.\
<br><br>\
The composition of the official Solar Inspection Group has been a matter of much deliberation over the past several months, and owing to the ground to be covered now includes over 3,500 experts from a wide variety of fields. The bulk of the Group is comprised of Transgressive Technologies Commission agents, including the EIO, but also includes military officials, independent observers, and corporate representatives. The inclusion of the latter group spurred heated debate in the Colonial Assembly, but ultimately 'thought-leaders' from Ward-Takahashi, NanoTrasen, and Hephaestus Industries were admitted, while other interests will have to be satisfied to be represented by Sol Economic Organization liaisons.\
<br><br>\
The APG, currently based out of what is to be a neutral embassy on Carter in Relan pending the completion of the new government centre of Vigilance Station in Whythe, is not legally required to fully comply with Five Points regulation, though the Whythe terms ensure that any transgressive research is undertaken under the strictest guidelines. The Skrell have amiably agreed to ensure that any innovation by the protectorate is safe, controlled, and does not enter Solar territory. These terms are similar to those applied to such technologies developed by and for the Skrell themselves, whose expertise is considered unrivalled in the field, but has been widely criticised by certain human bioconservative groups.\
<br><br>\
The inspection is expected to take several weeks, and will begin tomorrow."
/datum/lore/codex/page/article90
name = "08/29/64 - Kaleidoscope Cosmetics Goes Trans-Stellar After Genix Merger"
data = "Personal care giant Kaleidoscope Cosmetics has been officially recognised by the Solar Galactic Exchange as a true Trans-stellar Corporation today, following a controversial merger with Genix Therapeutic Systems and expanding its corporate assets to over 20 key systems.\
<br><br>\
Genix, which will now be operating under the Kaleidoscope name while retaining some corporate autonomy, has come under some scrutiny from the Transgressive Technologies Commission in recent months following its aggressive acquisition of liquidated Almachi assets in the aftermath of the Association's dissolution in April. The company was cleared of suspected Five Points violations without fanfare just two weeks ago, and allowed to resume work on the development a variety of previously approved commercial genetic modification products.\
<br><br>\
Many cosmetic gene-modification products have been available for some time - primarily in the Almach Rim - but have remained targeted at a relatively niche market. These treatments, ranging from cosmetic anti-aging to 'fantasy' body features are now set to be marketed and available in 'hundreds' of Kaleidoscope clinics galaxy-wide in the coming months. The TTC has reported that they are 'Confident that no transgressive modification is being provided and that these modifications are strictly superficial'. They have officially wished Kaleidoscope's directors well in their ascent to the galactic stage."
/datum/lore/codex/page/article91
name = "09/21/64 - Almach Passes Inspection - Concerns Raised"
data = "The Solar Inspection Group has granted the Almach Protectorate a passing grade in the first official inspection of the territory under Skrellian rule, though ethical concerns have been raised by a number of independent observers involved in the process.\
<br><br>\
During the course of the month-long inspection, Skrell facilitators were cooperative in ensuring the SIG were given 'unlimited' access to all research and development facilities requested by Sol, as well as informing the group of numerous previously unidentified locations that had been flagged by the Almach Protectorate Government since assuming control of the region in April. Critics of protectorate have suggested that the 'official list' may not be as comprehensive as stated, but the SIG has stated that they are 'confident that no deception has been undertaken by the APG. We have observed no evidence of research being concealed from our teams, and to the best of our knowledge the only locations left undisturbed are those few still occupied by Association holdouts, beyond the control of either inspecting government.'\
<br><br>\
Also as a result of the inspection, concerns have been raised regarding the treatment of ex-Association citizens, particularly the often genetically modified residents of Angessa's Pearl. While Angessa Martei's location is still unknown, her legacy - a society described by some as a cult of personality with emphasis on the cult - poses a significant threat to Skrellian control of the Exalt's Light system, and the clash of 'strong ideologies' has allegedly resulted in mistreatment of detainees that, according to the official report 'would not be permitted in Solar jurisdictions'.\
<br><br>\
The Protectorate's passing grade opens the door for interstellar trade to resume between the two nations for the first time in several years. Manufacturing giant Ward-Takahashi has already released a public statement on its intent to deal with the APG, and several other trans-stellars are expected to follow suit."
/datum/lore/codex/page/article92
name = "09/24/64 - Kaleidoscope Announce Exclusive Almach Deal"
data = "Mere days after the announcement of the reopening of Almachi-Solar trade, the Kaleidoscope Cosmetics corporation has confirmed that they have secured 'exclusive rights' to genetic products produced by several major manufacturers in the Angessa's Pearl system formerly owned by The Exalt - the insular mercurial theocracy of Exalt's Light - and recently handed over to the Almach Protectorate Government.\
<br><br>\
The details of the company's trade agreement have not been made public, but have reportedly already been approved by both the APG and SCG. The promptness of the agreement suggests to some that negotitations had been underway well before the announcement of the Protectorate's passing grade. Though cooperation between trans-stellar interests and government entities is far from unusual, such dealings with foreign governments - such as those widely made as 'open secrets' with Eutopia - are considered distasteful by many within the Icarus Front.\
<br><br>\
The Angessan products Kaleidoscope intends to offer have also not been made public, but are all to be thoroughly screened by the Transgressive Technologies Commission before being made available, though 'failing' proposals may be approved for use exclusively within Protectorate territory."
/datum/lore/codex/page/article93
name = "10/04/64 - Yong Wins Relani Elections"
data = "Despite concerns about domestic unrest and potential Skrellian interference, elections in Relan have gone ahead, selecting a new President and System Assembly. Francis Harp Yong, leader of the interim government and previous governor of the city-station Ithaca, known for his leading role in negotiating the end of Skrellian occupation and calming riots and rebellions earlier this year, has won the Presidency in a landslide, receiving nearly seventy percent of the vote. His party, the Spacer Union, has secured a narrow majority in the Assembly. The New Federalists, led by former member of the Harper government Odoacer Mieville, are the largest opposition party.\
<br><br>\
Yong has promised to reinforce Relani neutrality and rebuild the pre-war social system, forming a coalition of labor, technoprogressives, and anti-war activists. His victory likely means an end to the unrest that has plagued Relan since the end of the war with Almach."
/datum/lore/codex/page/article94
name = "12/23/64 - Two Vessels Feared Lost In Isavau's Gamble"
data = "Two Solar salvage vessels have been declared missing this week while undertaking operations in the remote Isavau's Gamble system. Locals also report that several smaller craft from the Eutopia system have 'vanished' under similar circumstances. Authorities are treating the disappearances as potential pirate attacks.\
<br><br>\
The XIV Sri Chamarajendra with crew of 32, and IIV Reimarus with 9 are both reported to have lost contact with the system's spaceport while undertaking far-orbit salvage operations on decommissioned and abandoned facilities, including the ILS Harvest Moon which detonated with all hands earlier this year. The disappearances have spurred the system government to request greater anti-piracy support from the SCG, which has been much reduced since the Almach War and increased tensions on the Hegemony border.\
<br><br>\
While Proximal to the independent and often 'lawless' Eutopia system, as well as the Rarkajar Rift, infamous prowl of the human-tajaran Jaguar Gang, the Isavau's System has rarely been a direct target for such large-scale apparent hijackings, and no group has yet claimed credit or demanded ransom."
/datum/lore/codex/page/article95
name = "12/27/64 - NanoTrasen Accused In Satisfaction Poll Fixing"
data = "The results of an annual system-wide corporate employee satisfaction poll in Vir have been called into question after a leak of internal employee contracts by an anonymous whistle blower. According to verified documents provided to the Vir News Network, NanoTrasen employees on annual employment contracts up for renewal are instructed to fill out an appended form expressing 'Extremely High' satisfaction with their employment at the company, or the contract will be deemed 'incomplete' and thus invalid.\
<br><br>\
NanoTrasen have been winners of the Vir Happy Employee Award for the 7 years running as of this year, and as such the legitimacy of the award, which has been run in major systems by the Sol Economic Organization since 2503, has been called seriously into question. The SEO has expressed regrets regarding the alleged fixing, but has stated that participating corporations are within their right to encourage employees to vote in a particular way.\
<br><br>\
According to NanoTrasen, the so-called 'Satisfaction Clause' in their contract renewal process is entirely permissible from a legal standpoint, and the company has no plans to make any changes at this time. When approached for comment, one anonymous employee stated that they 'had never even heard of' the award."
/datum/lore/codex/page/article96
name = "01/03/65 - VirGov Seals Security Deal With Local Firm"
data = "Governor Lusia Hainirsdottir has announced sweeping changes to government law enforcement in Vir, lynchpinned by the signing of a five-year contract with home-grown independent security and arms firm, Hedberg-Hammarstrom. The private enterprise will be assuming 'key duties' in local law enforcement and system security, in a move that Hainirsdottir says 'will save millions in taxpayer money, and encourages local, Virite businesses that we trust them every step of the way'.\
<br><br>\
While many colonies and facilities in Vir rely wholly on in-house security forces and will continue to do so, Hedberg-Hammarstrom is set to take over government patrol duties throughout the system, as well as administrating a large portion of previously government-run local law enforcement agencies including policing and wilderness garrisons.\
<br><br>\
CEO Gunnar Hammarstrom has reassured current SifGuard members at all levels that they need not fear for their jobs, and that for many the changes will be as simple as a slight change in uniform and a different name on their paychecks, but that H-H agents will be assuming managerial roles in most locations."
/datum/lore/codex/page/article97
name = "01/05/65 - Top NanoTrasen Executive Injured In Sif Bombing"
data = "Calvert Moravec, Chief Operations Officer for NanoTrasen Vir remains in a critical condition following a suspected assassination attempt on Saturday. The former gubernatorial candidate had been making a speech at a small NanoTrasen facility known for a prior terrorist attack by Boiling Point forces two years ago, when a small explosive device detonated close to the executive's leg, rendering him unconcious.\
<br><br>\
NanoTrasen security have elected to investigate the bombing internally, refusing to cooperate with SifGuard authorities on the grounds of disagreements with newly established Hedberg-Hammarstrom management. Mr. Moravec, nephew of NanoTrasen CEO Albary Moravec had reportedly been speaking out against H-H's involvement in national policing when the blast occurred.\
<br><br>\
Commander Spradling of NanoTrasen Internal Security has issued a company-wide active search order for one member of the audience who remains unaccounted for named 'Lae Vu', who is believed to be a journalist or posing as such, accompanied by images from communicator footage taken at the event.\
<br><br>\
This amateur footage also shows one member of the audience shouting an anti-corporate slogan and throwing a small electronic device at Moravec before being escorted from the room, just moments prior to the explosion. Spradling has stated that this individual, who is believed to be a disgruntled veteran of the Sif Defense Force, remains one of several persons of interest, but that the thrown item does not appear to be connected directly with the explosive device.\
<br><br>\
Reports from witnesses suggest that Mr. Moravec made a temporary recovery thanks to the fast action of medical staff aboard the NLS Southern Cross, but that a few hours later he appeared to suffer from a seizure, after which he was placed into a medically induced coma that he is yet to recover from. Unverified images from the Cross appear to show a disoriented individual resembling Moravec self-medicating with a cocktail of prescribed painkillers and alcoholic beverages, though the company strongly denies their veracity."
/datum/lore/codex/page/article98
name = "02/02/65 - NanoTrasen Announces Employee-Led Advisement Scheme"
data = "Trans-stellar giant NanoTrasen has today announced the launch of their brand-new 'NanoTrasen Employee Representation Committee' scheme, which will allow employee-selected representatives to have a say in company policy on a local basis. Initially launching as a pilot in 'a few key regions', the NERC is intended to provide an in-house method for those working for NanoTrasen to 'address grievances and provide valuable input without resorting to radical means'.\
<br><br>\
Vir is one of three size regions of varying scale but similar company presence selected for the pilot program, alongside the 'Deep Bowl' - including Stove, Viola and New Singapore, and 'South America', on Earth. Elections are expected to take place over the coming weeks, with each region electing representatives from core facilities in their locale. The Vir Branch will be expected to select five employees, one from each of; their New Reykjavik Head Office (Colloquially know as 'CentComm'), Karan colony the NCS Northern Star, Kalmar-based NMB Gullstrand medical research center, Sivian way-station NLS Southern Cross, and the company's sprawling Ekmanshalvo Fabrication Plant.\
<br><br>\
The Representation Committee is set to have quite significant powers over their region's day-to-day operations, ranging from Standard Operation Procedure, to security enforcement, to interior design."
/datum/lore/codex/page/article99
name = "02/06/65 - Calvert Moravec Dead At 58, Announces Withdrawal From Public Life"
data = "Just over a month since his injury in a brazen assassination attempt, NanoTrasen Vir's Chief Operations Officer Calvert Moravec has announced his 'temporary withdrawal' from public and corporate matters, in an inspiring speech given from his post-cloning recovery ward. The noted corporate executive passed away on Friday, following a long comatose period, but is expected to make a full recovery.\
<br><br>\
Mr. Moravec has stated that he believes a spell 'away from the public eye' will do wonders for his recovery, and 'expects to make a return some time in the coming years'. However, Moravec has reaffirmed that his stance on corporate policing, which is believed to have been the reason for the January bombing, remains unchanged; 'The refusal of Hedberg-Hammarstrom to allow our security teams to access government criminal records has been a significant hindrance to the investigation into my death. Allowing just one corporation exclusive access to this data is unequivocally wrong.'"
/datum/lore/codex/page/article100
name = "02/08/65 - NERC Campaigning Begins in Vir"
data = "NanoTrasen's latest employee initiative, the NanoTrasen Employee Representation Committee is set to hold their first in-house election this coming weekend, after 'respectable' signup rates for the positions across all participating Vir-based facilities.\
<br><br>\
According to those interviewed at a few sites, campaigning may be mixed. One potential committee member for the Gullstrand Medical Center described the competition as 'cut-throat' with staff looking to be split between the selection of already respected chief medical experts, and 'more represenative' service staff. Conversely, one worker at the Ekmanshalvo Fabrication Plant complex stated that he 'would probably just vote for whoever I've heard of.'\
<br><br>\
Final voting will take place on Saturday the 13th of February, with results announced by the following Monday."
/datum/lore/codex/page/article101
name = "02/11/65 - Top Astronomers Announce 'Alarming' Tachyon Downtick"
data = "The Galactic Survey Administration has today released a 'high priority' report on what is being described as a 'significant decline in core tachyon density' throughout the known galaxy. According to recent findings tachyon deterioration, which had previously been 'negligible' has undergone a 'rapid acceleration' which could begin to seriously affect interstellar transit in as soon as 30 to 50 years.\
<br><br>\
Tachyons are a naturally occurring particle present in varying density which form the primary mechanism for bluespace drive operation. In simple terms, the higher the density of tachyons, the more efficiently starship engines are capable of operating. Low-density regions such as the Rarkajar Rift have long posed a challenge to interstellar trade, and the expansion of such regions could prove devastating to galactic unity.\
<br><br>\
FTL industry leaders Focal Point Energistics have already announced 'immediate investigation' into the GSA's findings after taking a blow on the stock exchange, and have guaranteed a 'commitment to future-proofing' in all forthcoming products."
+5 -1
View File
@@ -28,6 +28,10 @@
name = "stack of plastic"
type_to_spawn = /obj/item/stack/material/plastic
/obj/fiftyspawner/copper
name = "stack of copper"
type_to_spawn = /obj/item/stack/material/copper
/obj/fiftyspawner/graphite
name = "stack of graphite"
type_to_spawn = /obj/item/stack/material/graphite
@@ -92,7 +96,7 @@
name = "stack of logs"
type_to_spawn = /obj/item/stack/material/log
/obj/fiftyspawner/log
/obj/fiftyspawner/log/sif
name = "stack of alien logs"
type_to_spawn = /obj/item/stack/material/log/sif
+276 -275
View File
@@ -1,275 +1,276 @@
/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] 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), \
new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1) \
))
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), \
new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("yellow comfy chair", /obj/structure/bed/chair/comfy/yellow, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("orange comfy chair", /obj/structure/bed/chair/comfy/orange, 2, one_per_turf = 1, on_floor = 1), \
))
recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("bench frame", /obj/structure/table/bench, 1, time = 10, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0)
recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20)
recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20)
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60)
recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1)
recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
//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)
recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1)
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), \
new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1), \
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), \
new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
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), \
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), \
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), \
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1), \
))
//recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1)//VOREStation Removal
recipes += new/datum/stack_recipe("medical stand", /obj/structure/medical_stand, 4, time = 20, one_per_turf = 1, on_floor = 1)//VOREStation Replacement
recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade)
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2)
recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1)
recipes += new/datum/stack_recipe("floor lamp fixture frame", /obj/machinery/light_construct/flamp, 2)
recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2)
recipes += new/datum/stack_recipe_list("modular computer frames", list( \
new/datum/stack_recipe("modular console frame", /obj/item/modular_computer/console, 20),\
new/datum/stack_recipe("modular telescreen frame", /obj/item/modular_computer/telescreen, 10),\
new/datum/stack_recipe("modular laptop frame", /obj/item/modular_computer/laptop, 10),\
new/datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/tablet, 5),\
))
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), \
new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1), \
))
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)
recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1)
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)
recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1)
recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10)
/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)
/datum/material/stone/marble/generate_recipes()
..()
recipes += new/datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/wmarble, 1, 4, 20)
recipes += new/datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/bmarble, 1, 4, 20)
/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)
recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE)
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) // 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) // 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) // 100u
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
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)
recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("plastic fishtank", /obj/item/glass_jar/fish/plastic, 2, time = 30 SECONDS)
recipes += new/datum/stack_recipe("reagent tubing", /obj/item/stack/hose, 1, 4, 20, pass_stack_color = TRUE)
/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)
recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE)
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)
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)
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
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)
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)
recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE) //VOREStation Add
recipes += new/datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1)
/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)
/datum/material/cardboard/generate_recipes()
..()
recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe_list("folders",list( \
new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue), \
new/datum/stack_recipe("grey folder", /obj/item/weapon/folder), \
new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red), \
new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white), \
new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow), \
))
/datum/material/snow/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10)
recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10)
recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15)
recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10)
recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20)
/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)
/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)
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, 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]")
/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)
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)
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)
recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS)
/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)
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, 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)
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]")
/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]")
@@ -31,7 +31,7 @@
recipes += new/datum/stack_recipe("dropship seat", /obj/structure/bed/chair/bay/shuttle, 4, one_per_turf = 1, on_floor = 1, time = 20)
recipes += new/datum/stack_recipe("small teshari nest", /obj/structure/bed/chair/bay/chair/padded/red/smallnest, 2, one_per_turf = 1, on_floor = 1, time = 10)
recipes += new/datum/stack_recipe("large teshari nest", /obj/structure/bed/chair/bay/chair/padded/red/bignest, 4, one_per_turf = 1, on_floor = 1, time = 20)
recipes += new/datum/stack_recipe("dance pole", /obj/structure/dancepole, 2, one_per_turf = 1, on_floor = 1, time = 20)
recipes += new/datum/stack_recipe("light switch frame", /obj/item/frame/lightswitch, 2)
recipes += new/datum/stack_recipe_list("sofas", list(
new/datum/stack_recipe("red sofa middle", /obj/structure/bed/chair/sofa, 1, one_per_turf = 1, on_floor = 1), \
+90 -17
View File
@@ -102,14 +102,14 @@
/obj/item/stack/material/iron
name = "iron"
icon_state = "sheet-silver"
icon_state = "sheet-ingot"
default_type = "iron"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/lead
name = "lead"
icon_state = "sheet-adamantine"
icon_state = "sheet-ingot"
default_type = "lead"
apply_colour = 1
no_variants = FALSE
@@ -159,22 +159,24 @@
/obj/item/stack/material/graphite
name = "graphite"
icon_state = "sheet-silver"
icon_state = "sheet-puck"
default_type = MAT_GRAPHITE
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/gold
name = "gold"
icon_state = "sheet-gold"
icon_state = "sheet-ingot"
default_type = "gold"
no_variants = FALSE
apply_colour = TRUE
/obj/item/stack/material/silver
name = "silver"
icon_state = "sheet-silver"
icon_state = "sheet-ingot"
default_type = "silver"
no_variants = FALSE
apply_colour = TRUE
//Valuable resource, cargo can sell it.
/obj/item/stack/material/platinum
@@ -182,6 +184,7 @@
icon_state = "sheet-adamantine"
default_type = "platinum"
no_variants = FALSE
apply_colour = TRUE
//Extremely valuable to Research.
/obj/item/stack/material/mhydrogen
@@ -193,14 +196,14 @@
//Fuel for MRSPACMAN generator.
/obj/item/stack/material/tritium
name = "tritium"
icon_state = "sheet-silver"
icon_state = "sheet-puck"
default_type = "tritium"
apply_colour = 1
apply_colour = TRUE
no_variants = FALSE
/obj/item/stack/material/osmium
name = "osmium"
icon_state = "sheet-silver"
icon_state = "sheet-ingot"
default_type = "osmium"
apply_colour = 1
no_variants = FALSE
@@ -209,16 +212,17 @@
// Fusion fuel.
/obj/item/stack/material/deuterium
name = "deuterium"
icon_state = "sheet-silver"
icon_state = "sheet-puck"
default_type = "deuterium"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/steel
name = DEFAULT_WALL_MATERIAL
icon_state = "sheet-metal"
icon_state = "sheet-refined"
default_type = DEFAULT_WALL_MATERIAL
no_variants = FALSE
apply_colour = TRUE
/obj/item/stack/material/steel/hull
name = MAT_STEELHULL
@@ -226,9 +230,10 @@
/obj/item/stack/material/plasteel
name = "plasteel"
icon_state = "sheet-plasteel"
icon_state = "sheet-reinforced"
default_type = "plasteel"
no_variants = FALSE
apply_colour = TRUE
/obj/item/stack/material/plasteel/hull
name = MAT_PLASTEELHULL
@@ -236,17 +241,19 @@
/obj/item/stack/material/durasteel
name = "durasteel"
icon_state = "sheet-durasteel"
icon_state = "sheet-reinforced"
item_state = "sheet-metal"
default_type = "durasteel"
no_variants = FALSE
apply_colour = TRUE
/obj/item/stack/material/durasteel/hull
name = MAT_DURASTEELHULL
/obj/item/stack/material/titanium
name = MAT_TITANIUM
icon_state = "sheet-silver"
icon_state = "sheet-refined"
apply_colour = TRUE
item_state = "sheet-silver"
default_type = MAT_TITANIUM
no_variants = FALSE
@@ -345,8 +352,10 @@
icon_state = "sheet-wood"
default_type = MAT_WOOD
strict_color_stacking = TRUE
apply_colour = 1
drop_sound = 'sound/items/drop/wooden.ogg'
pickup_sound = 'sound/items/pickup/wooden.ogg'
no_variants = FALSE
/obj/item/stack/material/wood/sif
name = "alien wooden plank"
@@ -431,6 +440,8 @@
name = "snow"
desc = "The temptation to build a snowman rises."
icon_state = "sheet-snow"
drop_sound = 'sound/items/drop/gloves.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
default_type = "snow"
/obj/item/stack/material/snowbrick
@@ -438,6 +449,8 @@
desc = "For all of your igloo building needs."
icon_state = "sheet-snowbrick"
default_type = "packed snow"
drop_sound = 'sound/items/drop/gloves.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
/obj/item/stack/material/leather
name = "leather"
@@ -463,30 +476,90 @@
/obj/item/stack/material/glass
name = "glass"
icon_state = "sheet-glass"
icon_state = "sheet-transparent"
default_type = "glass"
no_variants = FALSE
drop_sound = 'sound/items/drop/glass.ogg'
pickup_sound = 'sound/items/pickup/glass.ogg'
apply_colour = TRUE
/obj/item/stack/material/glass/reinforced
name = "reinforced glass"
icon_state = "sheet-rglass"
icon_state = "sheet-rtransparent"
default_type = "rglass"
no_variants = FALSE
apply_colour = TRUE
/obj/item/stack/material/glass/phoronglass
name = "borosilicate glass"
desc = "This sheet is special platinum-glass alloy designed to withstand large temperatures"
singular_name = "borosilicate glass sheet"
icon_state = "sheet-phoronglass"
icon_state = "sheet-transparent"
default_type = "borosilicate glass"
no_variants = FALSE
apply_colour = TRUE
/obj/item/stack/material/glass/phoronrglass
name = "reinforced borosilicate glass"
desc = "This sheet is special platinum-glass alloy designed to withstand large temperatures. It is reinforced with few rods."
singular_name = "reinforced borosilicate glass sheet"
icon_state = "sheet-phoronrglass"
icon_state = "sheet-rtransparent"
default_type = "reinforced borosilicate glass"
no_variants = FALSE
apply_colour = TRUE
/obj/item/stack/material/bronze
name = "bronze"
icon_state = "sheet-ingot"
singular_name = "bronze ingot"
default_type = "bronze"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/tin
name = "tin"
icon_state = "sheet-ingot"
singular_name = "tin ingot"
default_type = "tin"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/copper
name = "copper"
icon_state = "sheet-ingot"
singular_name = "copper ingot"
default_type = "copper"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/painite
name = "painite"
icon_state = "sheet-gem"
singular_name = "painite gem"
default_type = "painite"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/void_opal
name = "void opal"
icon_state = "sheet-void_opal"
singular_name = "void opal"
default_type = "void opal"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/quartz
name = "quartz"
icon_state = "sheet-gem"
singular_name = "quartz gem"
default_type = "quartz"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/aluminium
name = "aluminium"
icon_state = "sheet-ingot"
singular_name = "aluminium ingot"
default_type = "aluminium"
apply_colour = 1
no_variants = FALSE
+84 -2
View File
@@ -486,6 +486,7 @@ var/list/name_to_material
door_icon_base = "metal"
icon_colour = "#D1E6E3"
icon_reinf = "reinf_metal"
composite_material = null
/datum/material/plasteel/titanium/hull
name = MAT_TITANIUMHULL
@@ -637,7 +638,7 @@ var/list/name_to_material
hardness = 40
weight = 30
stack_origin_tech = list(TECH_MATERIAL = 2)
composite_material = list() //todo
composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT / 2, "borosilicate glass" = SHEET_MATERIAL_AMOUNT)
rod_product = null
/datum/material/plastic
@@ -1007,6 +1008,7 @@ var/list/name_to_material
protectiveness = 1 // 4%
flags = MATERIAL_PADDING
conductive = 0
integrity = 40
pass_stack_colors = TRUE
supply_conversion_value = 2
@@ -1055,9 +1057,10 @@ var/list/name_to_material
icon_base = "solid"
icon_reinf = "reinf_mesh"
integrity = 60
weight = 10
ignition_point = T0C+400
melting_point = T0C+500
protectiveness = 25
protectiveness = 20
conductive = 0
supply_conversion_value = 4
@@ -1073,6 +1076,7 @@ var/list/name_to_material
melting_point = T0C+300
protectiveness = 3 // 13%
conductive = 0
integrity = 40
supply_conversion_value = 3
/datum/material/carpet
@@ -1210,3 +1214,81 @@ var/list/name_to_material
weight = 1
protectiveness = 0 // 0%
conductive = 0
/datum/material/void_opal
name = "void opal"
display_name = "void opal"
use_name = "void opal"
icon_colour = "#0f0f0f"
stack_type = /obj/item/stack/material/void_opal
flags = MATERIAL_UNMELTABLE
cut_delay = 60
reflectivity = 0
conductivity = 1
shard_type = SHARD_SHARD
tableslam_noise = 'sound/effects/Glasshit.ogg'
hardness = 100
stack_origin_tech = list(TECH_ARCANE = 1, TECH_MATERIAL = 6)
sheet_singular_name = "gem"
sheet_plural_name = "gems"
supply_conversion_value = 30 // These are hilariously rare.
/datum/material/painite
name = "painite"
display_name = "painite"
use_name = "painite"
icon_colour = "#6b4947"
stack_type = /obj/item/stack/material/painite
flags = MATERIAL_UNMELTABLE
reflectivity = 0.3
tableslam_noise = 'sound/effects/Glasshit.ogg'
sheet_singular_name = "gem"
sheet_plural_name = "gems"
supply_conversion_value = 4
/datum/material/tin
name = "tin"
display_name = "tin"
use_name = "tin"
stack_type = /obj/item/stack/material/tin
icon_colour = "#b2afaf"
sheet_singular_name = "ingot"
sheet_plural_name = "ingots"
supply_conversion_value = 1
hardness = 50
weight = 13
/datum/material/copper
name = "copper"
display_name = "copper"
use_name = "copper"
stack_type = /obj/item/stack/material/copper
conductivity = 52
icon_colour = "#af633e"
sheet_singular_name = "ingot"
sheet_plural_name = "ingots"
supply_conversion_value = 1
weight = 13
hardness = 50
/datum/material/quartz
name = "quartz"
display_name = "quartz"
use_name = "quartz"
icon_colour = "#e6d7df"
stack_type = /obj/item/stack/material/quartz
tableslam_noise = 'sound/effects/Glasshit.ogg'
sheet_singular_name = "crystal"
sheet_plural_name = "crystals"
supply_conversion_value = 4
/datum/material/aluminium
name = "aluminium"
display_name = "aluminium"
use_name = "aluminium"
icon_colour = "#e5e2d0"
stack_type = /obj/item/stack/material/aluminium
sheet_singular_name = "ingot"
sheet_plural_name = "ingots"
supply_conversion_value = 2
weight = 10
+9 -1
View File
@@ -43,4 +43,12 @@
"platinum" = 1,
"sand" = 2
)
product = /obj/item/stack/material/glass/phoronglass
product = /obj/item/stack/material/glass/phoronglass
/datum/alloy/bronze
metaltag = "bronze"
requires = list(
"copper" = 2,
"tin" = 1
)
product = /obj/item/stack/material/bronze
+12
View File
@@ -46,6 +46,18 @@
name = "platinum coin"
icon_state = "coin_adamantine"
/obj/item/weapon/coin/morphium
name = "morphium coin"
icon_state = "coin_morphium"
/obj/item/weapon/coin/aluminium
name = "aluminium coin"
icon_state = "coin_aluminium"
/obj/item/weapon/coin/verdantium
name = "verdantium coin"
icon_state = "coin_verdantium"
/obj/item/weapon/coin/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = W
+10 -3
View File
@@ -27,7 +27,11 @@
"osmium" = /obj/item/weapon/ore/osmium,
"hydrogen" = /obj/item/weapon/ore/hydrogen,
"silicates" = /obj/item/weapon/ore/glass,
"carbon" = /obj/item/weapon/ore/coal
"carbon" = /obj/item/weapon/ore/coal,
"copper" = /obj/item/weapon/ore/copper,
"tin" = /obj/item/weapon/ore/tin,
"bauxite" = /obj/item/weapon/ore/bauxite,
"rutile" = /obj/item/weapon/ore/rutile
)
//Upgrades
@@ -40,11 +44,14 @@
// Found with an advanced laser. exotic_drilling >= 1
var/list/ore_types_uncommon = list(
MAT_MARBLE = /obj/item/weapon/ore/marble,
"painite" = /obj/item/weapon/ore/painite,
"quartz" = /obj/item/weapon/ore/quartz,
MAT_LEAD = /obj/item/weapon/ore/lead
)
// Found with an ultra laser. exotic_drilling >= 2
var/list/ore_types_rare = list(
"void opal" = /obj/item/weapon/ore/void_opal,
MAT_VERDANTIUM = /obj/item/weapon/ore/verdantium
)
@@ -60,7 +67,7 @@
cell = default_use_hicell()
/obj/machinery/mining/drill/get_cell()
return cell
return cell
/obj/machinery/mining/drill/loaded
cell = /obj/item/weapon/cell/high
@@ -187,7 +194,7 @@
if (panel_open && cell && user.Adjacent(src))
to_chat(user, "You take out \the [cell].")
cell.forceMove(get_turf(user))
user.put_in_hands(cell)
component_parts -= cell
cell = null
return
+32 -8
View File
@@ -1,12 +1,14 @@
/obj/item/weapon/mining_scanner
name = "ore detector"
name = "deep scan device"
desc = "A complex device used to locate ore deep underground."
icon = 'icons/obj/device.dmi'
icon_state = "forensic0-old" //GET A BETTER SPRITE.
icon_state = "deep_scan_device"
item_state = "electronic"
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
matter = list(DEFAULT_WALL_MATERIAL = 150)
var/scan_time = 2 SECONDS
var/range = 2
var/exact = FALSE
/obj/item/weapon/mining_scanner/attack_self(mob/user as mob)
to_chat(user, "<span class='notice'>You begin sweeping \the [src] about, scanning for metal deposits.</span>")
@@ -17,9 +19,10 @@
ScanTurf(get_turf(user), user)
/obj/item/weapon/mining_scanner/proc/ScanTurf(var/atom/target, var/mob/user, var/exact = FALSE)
/obj/item/weapon/mining_scanner/proc/ScanTurf(var/atom/target, var/mob/user)
var/list/metals = list(
"surface minerals" = 0,
"industrial metals" = 0,
"precious metals" = 0,
"precious gems" = 0,
"nuclear fuel" = 0,
@@ -29,7 +32,7 @@
var/turf/Turf = get_turf(target)
for(var/turf/simulated/T in range(2, Turf))
for(var/turf/simulated/T in range(range, Turf))
if(!T.has_resources)
continue
@@ -38,12 +41,13 @@
var/ore_type
switch(metal)
if("silicates", "carbon", "hematite", "marble") ore_type = "surface minerals"
if("gold", "silver", "lead") ore_type = "precious metals"
if("diamond") ore_type = "precious gems"
if("silicates", "carbon", "marble", "quartz") ore_type = "surface minerals"
if("hematite", "tin", "copper", "bauxite", "lead") ore_type = "industrial metals"
if("gold", "silver", "rutile") ore_type = "precious metals"
if("diamond", "painite") ore_type = "precious gems"
if("uranium") ore_type = "nuclear fuel"
if("phoron", "osmium", "hydrogen") ore_type = "exotic matter"
if("verdantium") ore_type = "anomalous matter"
if("verdantium", "void opal") ore_type = "anomalous matter"
if(ore_type) metals[ore_type] += T.resources[metal]
@@ -64,3 +68,23 @@
message += "<br><span class='notice'>- [result] of [ore_type].</span>"
to_chat(user, message)
/obj/item/weapon/mining_scanner/advanced
name = "advanced ore detector"
desc = "An advanced device used to locate ore deep underground."
description_info = "This scanner has variable range, you can use the Set Scanner Range verb, or alt+click the device. Drills dig in 5x5."
origin_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 4)
matter = list(DEFAULT_WALL_MATERIAL = 150)
scan_time = 0.5 SECONDS
exact = TRUE
/obj/item/weapon/mining_scanner/advanced/AltClick(mob/user)
change_size()
/obj/item/weapon/mining_scanner/advanced/verb/change_size()
set name = "Set Scanner Range"
set category = "Object"
var/custom_range = input("Scanner Range","Pick a range to scan. ") as null|anything in list(0,1,2,3,4,5,6,7)
if(custom_range)
range = custom_range
to_chat(usr, "<span class='notice'>Scanner will now look up to [range] tile(s) away.</span>")
@@ -168,10 +168,17 @@
"sand" = 1,
"hematite" = 1,
"carbon" = 1,
"raw copper" = 1,
"raw tin" = 1,
"void opal" = 3,
"painite" = 3,
"quartz" = 3,
"raw bauxite" = 5,
"phoron" = 15,
"silver" = 16,
"gold" = 18,
"marble" = 20,
"rutile" = 20,
"uranium" = 30,
"diamond" = 50,
"platinum" = 40,
+11 -16
View File
@@ -87,18 +87,11 @@
/obj/machinery/mineral/stacking_machine/New()
..()
for(var/stacktype in subtypesof(/obj/item/stack/material))
var/obj/item/stack/S = stacktype
var/s_name = initial(S.name)
stack_storage[s_name] = 0
stack_paths[s_name] = stacktype
stack_storage["glass"] = 0
stack_paths["glass"] = /obj/item/stack/material/glass
stack_storage[DEFAULT_WALL_MATERIAL] = 0
stack_paths[DEFAULT_WALL_MATERIAL] = /obj/item/stack/material/steel
stack_storage["plasteel"] = 0
stack_paths["plasteel"] = /obj/item/stack/material/plasteel
for(var/stacktype in (subtypesof(/obj/item/stack/material) - typesof(/obj/item/stack/material/cyborg)))
var/obj/item/stack/material/S = stacktype
var/s_matname = initial(S.default_type)
stack_storage[s_matname] = 0
stack_paths[s_matname] = stacktype
spawn( 5 )
for (var/dir in cardinal)
@@ -127,10 +120,12 @@
var/turf/T = get_turf(input)
for(var/obj/item/O in T.contents)
if(!O) return
if(istype(O,/obj/item/stack))
if(!isnull(stack_storage[O.name]))
stack_storage[O.name]++
O.loc = null
if(istype(O,/obj/item/stack/material))
var/obj/item/stack/material/S = O
var/matname = S.material.name
if(!isnull(stack_storage[matname]))
stack_storage[matname] += S.amount
qdel(S)
else
O.loc = output.loc
else
+9 -3
View File
@@ -54,7 +54,13 @@ var/list/mining_overlay_cache = list()
"verdantium" = /obj/item/weapon/ore/verdantium,
"marble" = /obj/item/weapon/ore/marble,
"lead" = /obj/item/weapon/ore/lead,
"rutile" = /obj/item/weapon/ore/rutile //VOREStation Add
"copper" = /obj/item/weapon/ore/copper,
"tin" = /obj/item/weapon/ore/tin,
"bauxite" = /obj/item/weapon/ore/bauxite,
// "void opal" = /obj/item/weapon/ore/void_opal,
// "painite" = /obj/item/weapon/ore/painite,
// "quartz" = /obj/item/weapon/ore/quartz,
"rutile" = /obj/item/weapon/ore/rutile
)
has_resources = 1
@@ -644,10 +650,10 @@ turf/simulated/mineral/floor/light_corner
var/mineral_name
if(rare_ore)
mineral_name = pickweight(list("marble" = 5, "uranium" = 10, "platinum" = 10, "hematite" = 20, "carbon" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 5, "verdantium" = 1, "rutile" = 4)) //VOREStation Edit
mineral_name = pickweight(list("marble" = 5,/* "quartz" = 15,*/ "copper" = 10, "tin" = 5, "bauxite" = 5, "uranium" = 15, "platinum" = 20, "hematite" = 15, "rutile" = 20, "carbon" = 15, "diamond" = 3, "gold" = 15, "silver" = 15, "phoron" = 25, "lead" = 5,/* "void opal" = 1,*/ "verdantium" = 2/*, "painite" = 1*/))
else
mineral_name = pickweight(list("marble" = 3, "uranium" = 10, "platinum" = 10, "hematite" = 70, "carbon" = 70, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 2, "verdantium" = 1, "rutile" = 4)) //VOREStation Edit
mineral_name = pickweight(list("marble" = 3,/* "quartz" = 10,*/ "copper" = 20, "tin" = 15, "bauxite" = 15, "uranium" = 10, "platinum" = 10, "hematite" = 70, "rutile" = 15, "carbon" = 70, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 3,/* "void opal" = 1,*/ "verdantium" = 1/*, "painite" = 1*/))
if(mineral_name && (mineral_name in ore_data))
mineral = ore_data[mineral_name]
+35
View File
@@ -107,6 +107,41 @@
material = MAT_LEAD
origin_tech = list(TECH_MATERIAL = 3)
/obj/item/weapon/ore/copper
name = "raw copper"
icon_state = "ore_copper"
material = "copper"
/obj/item/weapon/ore/tin
name = "raw tin"
icon_state = "ore_tin"
material = "tin"
/obj/item/weapon/ore/bauxite
name = "raw bauxite"
icon_state = "ore_bauxite"
material = "bauxite"
/obj/item/weapon/ore/rutile
name = "raw rutile"
icon_state = "ore_rutile"
material = "rutile"
/obj/item/weapon/ore/void_opal
name = "raw void opal"
icon_state = "ore_void_opal"
material = "void opal"
/obj/item/weapon/ore/painite
name = "raw painite"
icon_state = "ore_painite"
material = "painite"
/obj/item/weapon/ore/quartz
name = "raw quartz"
icon_state = "ore_quartz"
material = "quartz"
/obj/item/weapon/ore/slag
name = "Slag"
desc = "Someone screwed up..."
+67
View File
@@ -177,3 +177,70 @@ var/global/list/ore_data = list()
ore = /obj/item/weapon/ore/lead
scan_icon = "mineral_rare"
reagent = "lead"
/ore/copper
name = "copper"
display_name = "copper"
smelts_to = "copper"
alloy = 1
result_amount = 5
spread_chance = 15
ore = /obj/item/weapon/ore/copper
scan_icon = "mineral_common"
reagent = "copper"
/ore/tin
name = "tin"
display_name = "tin"
smelts_to = "tin"
alloy = 1
result_amount = 5
spread_chance = 10
ore = /obj/item/weapon/ore/tin
scan_icon = "mineral_common"
/ore/quartz
name = "quartz"
display_name = "unrefined quartz"
compresses_to = "quartz"
result_amount = 5
spread_chance = 5
ore = /obj/item/weapon/ore/quartz
scan_icon = "mineral_common"
/ore/bauxite
name = "bauxite"
display_name = "bauxite"
smelts_to = "aluminium"
result_amount = 5
spread_chance = 25
ore = /obj/item/weapon/ore/bauxite
scan_icon = "mineral_common"
reagent = "aluminum"
/ore/rutile
name = "rutile"
display_name = "rutile"
smelts_to = "titanium"
result_amount = 5
spread_chance = 12
ore = /obj/item/weapon/ore/rutile
scan_icon = "mineral_uncommon"
/ore/painite
name = "painite"
display_name = "rough painite"
compresses_to = "painite"
result_amount = 5
spread_chance = 3
ore = /obj/item/weapon/ore/painite
scan_icon = "mineral_rare"
/ore/void_opal
name = "void opal"
display_name = "rough void opal"
compresses_to = "void opal"
result_amount = 5
spread_chance = 1
ore = /obj/item/weapon/ore/void_opal
scan_icon = "mineral_rare"
+4 -3
View File
@@ -37,14 +37,15 @@
var/mob/M = mob
spawn(0) // It's possible that it could be deleted in the meantime, or that it runtimes.
if(M)
//VOREStation edit
if(istype(M, /mob/observer/dead/))
if(isobserver(M))
//VOREStation Edit Start
var/mob/observer/dead/D = M
if(ckey || (src in view(D)))
M.show_message(message, m_type)
message = "<span class='emote'><B>[src]</B> ([ghost_follow_link(src, M)]) [input]</span>"
else
M.show_message(message, m_type)
//End VOREStation edit
//VOREStation Edit End
for(var/obj in o_viewers)
var/obj/O = obj
@@ -54,9 +54,7 @@
return
if(!typing_indicator)
typing_indicator = new
typing_indicator.icon = 'icons/mob/talk_vr.dmi' //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons
typing_indicator.icon_state = "[speech_bubble_appearance()]_typing"
init_typing_indicator("[speech_bubble_appearance()]_typing")
if(state && !typing)
loc.add_overlay(typing_indicator, TRUE)
@@ -91,6 +91,16 @@
message = "squishes."
m_type = 1
if("chirp")
/* VOREStation Removal Start - Eh. People can chirp maybe.
if ((species.bump_flag != SLIME) && (species.name != SPECIES_DIONA))
to_chat(src, "<span class='warning'>You are not a diona or slime!</span>")
return
*/ //VOREStation Removal End
playsound(src, 'sound/misc/nymphchirp.ogg', 50, 0)
message = "chirps."
m_type = 2
//Skrell-only emotes
if("warble")
if(species.name != SPECIES_SKRELL)
@@ -181,6 +181,14 @@
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
@@ -1078,7 +1078,7 @@
if(species)
if(species.name && species.name == new_species)
if(species.name && species.name == new_species && species.name != "Custom Species") //VOREStation Edit
return
if(species.language)
remove_language(species.language)
@@ -7,6 +7,7 @@
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()
@@ -208,6 +208,20 @@
plane_holder.set_vis(vis,FALSE)
vis_enabled -= vis
/mob/living/carbon/human/get_restraining_bolt()
var/obj/item/weapon/implant/restrainingbolt/RB
for(var/obj/item/organ/external/EX in organs)
RB = locate() in EX
if(istype(RB) && !(RB.malfunction))
break
if(RB)
if(!RB.malfunction)
return TRUE
return FALSE
#undef HUMAN_EATING_NO_ISSUE
#undef HUMAN_EATING_NO_MOUTH
#undef HUMAN_EATING_BLOCKED_MOUTH
@@ -0,0 +1,206 @@
/*
A system for easily and quickly removing your own bodyparts, with a view towards
swapping them out for new ones, or just doing it as a party trick to horrify an
audience. Current implementation only supports robolimbs and uses a modular_bodypart
value on the manufacturer datum, but I have tried to keep it generic for future work.
PS. jesus christ this was meant to be a half an hour port
*/
// External organ procs:
// Does this bodypart count as a modular limb, and if so, what kind?
/obj/item/organ/external/proc/get_modular_limb_category()
. = MODULAR_BODYPART_INVALID
if(robotic >= ORGAN_ROBOT && model)
var/datum/robolimb/manufacturer = all_robolimbs[model]
if(!isnull(manufacturer?.modular_bodyparts))
. = manufacturer.modular_bodyparts
// Checks if a limb could theoretically be removed.
// Note that this does not currently bother checking if a child or internal organ is vital.
/obj/item/organ/external/proc/can_remove_modular_limb(var/mob/living/carbon/human/user)
if(vital || cannot_amputate)
return FALSE
var/bodypart_cat = get_modular_limb_category()
if(bodypart_cat == MODULAR_BODYPART_CYBERNETIC)
if(!parent_organ)
return FALSE
var/obj/item/organ/external/parent = user?.get_organ(parent_organ)
if(!parent || parent.get_modular_limb_category(user) < MODULAR_BODYPART_CYBERNETIC)
return FALSE
. = (bodypart_cat != MODULAR_BODYPART_INVALID)
// Note that this proc is checking if the organ can be attached -to-, not attached itself.
/obj/item/organ/external/proc/can_attach_modular_limb_here(var/mob/living/carbon/human/user)
var/list/limb_data = user?.species?.has_limbs[organ_tag]
if(islist(limb_data) && limb_data["has_children"] > 0)
. = (length(children) < limb_data["has_children"])
/obj/item/organ/external/proc/can_be_attached_modular_limb(var/mob/living/carbon/user)
var/bodypart_cat = get_modular_limb_category()
if(bodypart_cat == MODULAR_BODYPART_INVALID)
return FALSE
if(!parent_organ)
return FALSE
var/obj/item/organ/external/parent = user?.get_organ(parent_organ)
if(!parent)
return FALSE
if(!parent.can_attach_modular_limb_here(user))
return FALSE
if(bodypart_cat == MODULAR_BODYPART_CYBERNETIC && parent.get_modular_limb_category(src) < MODULAR_BODYPART_CYBERNETIC)
return FALSE
return TRUE
// Checks if an organ (or the parent of one) is in a fit state for modular limb stuff to happen.
/obj/item/organ/external/proc/check_modular_limb_damage(var/mob/living/carbon/human/user)
. = damage >= min_broken_damage || (status & ORGAN_BROKEN) || is_stump() // can't use is_broken() as the limb has ORGAN_CUT_AWAY
// Human mob procs:
// Checks the organ list for limbs meeting a predicate. Way overengineered for such a limited use
// case but I can see it being expanded in the future if meat limbs or doona limbs use it.
/mob/living/carbon/human/proc/get_modular_limbs(var/return_first_found = FALSE, var/validate_proc)
for(var/bp in organs)
var/obj/item/organ/external/E = bp
if(!validate_proc || call(E, validate_proc)(src) > MODULAR_BODYPART_INVALID)
LAZYADD(., E)
if(return_first_found)
return
// Prune children so we can't remove every individual component of an entire prosthetic arm
// piece by piece. Technically a circular dependency here would remove the limb entirely but
// if there's a parent whose child is also its parent, there's something wrong regardless.
for(var/bp in .)
var/obj/item/organ/external/E = bp
if(length(E.children))
. -= E.children
// Called in robotize(), replaced() and removed() to update our modular limb verbs.
/mob/living/carbon/human/proc/refresh_modular_limb_verbs()
if(length(get_modular_limbs(return_first_found = TRUE, validate_proc = /obj/item/organ/external/proc/can_attach_modular_limb_here)))
verbs |= .proc/attach_limb_verb
else
verbs -= .proc/attach_limb_verb
if(length(get_modular_limbs(return_first_found = TRUE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb)))
verbs |= .proc/detach_limb_verb
else
verbs -= .proc/detach_limb_verb
// Proc helper for attachment verb.
/mob/living/carbon/human/proc/check_can_attach_modular_limb(var/obj/item/organ/external/E)
if(world.time < last_special + (2 SECONDS) || get_active_hand() != E)
return FALSE
//VOREStation Addition Start
if(species.name == SPECIES_PROTEAN)
to_chat(src, SPAN_WARNING("This is not compatible with your nanomachine body!"))
return FALSE
//VOREStation Addition End
if(incapacitated() || restrained())
to_chat(src, SPAN_WARNING("You can't do that in your current state!"))
return FALSE
if(QDELETED(E) || !istype(E))
to_chat(src, SPAN_WARNING("You are not holding a compatible limb to attach."))
return FALSE
if(!E.can_be_attached_modular_limb(src))
to_chat(src, SPAN_WARNING("\The [E] cannot be attached to your current body."))
return FALSE
if(E.get_modular_limb_category() <= MODULAR_BODYPART_INVALID)
to_chat(src, SPAN_WARNING("\The [E] cannot be attached by your own hand."))
return FALSE
var/install_to_zone = E.organ_tag
if(!isnull(get_organ(install_to_zone)))
to_chat(src, SPAN_WARNING("There is already a limb attached at that part of your body."))
return FALSE
if(E.check_modular_limb_damage(src))
to_chat(src, SPAN_WARNING("\The [E] is too damaged to be attached."))
return FALSE
var/obj/item/organ/external/parent = E.parent_organ && get_organ(E.parent_organ)
if(!parent)
to_chat(src, SPAN_WARNING("\The [E] needs an existing limb to be attached to."))
return FALSE
if(parent.check_modular_limb_damage(src))
to_chat(src, SPAN_WARNING("Your [parent.name] is too damaged to have anything attached."))
return FALSE
return TRUE
// Proc helper for detachment verb.
/mob/living/carbon/human/proc/check_can_detach_modular_limb(var/obj/item/organ/external/E)
if(world.time < last_special + (2 SECONDS))
return FALSE
//VOREStation Addition Start
if(species.name == SPECIES_PROTEAN)
to_chat(src, SPAN_WARNING("You can't just detach parts of your nanomachine body!"))
return FALSE
//VOREStation Addition End
if(incapacitated() || restrained())
to_chat(src, SPAN_WARNING("You can't do that in your current state!"))
return FALSE
if(!istype(E) || QDELETED(src) || QDELETED(E) || E.owner != src || E.loc != src)
return FALSE
if(E.check_modular_limb_damage(src))
to_chat(src, SPAN_WARNING("That limb is too damaged to be removed!"))
return FALSE
var/obj/item/organ/external/parent = E.parent_organ && get_organ(E.parent_organ)
if(!parent)
return FALSE
if(parent.check_modular_limb_damage(src))
to_chat(src, SPAN_WARNING("Your [parent.name] is too damaged to detach anything from it."))
return FALSE
return (E in get_modular_limbs(return_first_found = FALSE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb))
// Verbs below:
// Add or remove robotic limbs; check refresh_modular_limb_verbs() above.
/mob/living/carbon/human/proc/attach_limb_verb()
set name = "Attach Limb"
set category = "Object"
set desc = "Attach a replacement limb."
set usr = src
var/obj/item/organ/external/E = get_active_hand()
if(!check_can_attach_modular_limb(E))
return FALSE
if(!do_after(src, 2 SECONDS, src))
return FALSE
if(!check_can_attach_modular_limb(E))
return FALSE
last_special = world.time
drop_from_inventory(E)
E.replaced(src)
// Reconnect the organ and children as normally this is done with surgery.
E.status &= ~ORGAN_CUT_AWAY
for(var/obj/item/organ/external/child in E.children)
child.status &= ~ORGAN_CUT_AWAY
var/datum/gender/G = gender_datums[gender]
visible_message(
SPAN_NOTICE("\The [src] attaches \the [E] to [G.his] body!"),
SPAN_NOTICE("You attach \the [E] to your body!"))
regenerate_icons() // Not sure why this isn't called by removed(), but without it we don't update our limb appearance.
return TRUE
/mob/living/carbon/human/proc/detach_limb_verb()
set name = "Remove Limb"
set category = "Object"
set desc = "Detach one of your limbs."
set usr = src
var/list/detachable_limbs = get_modular_limbs(return_first_found = FALSE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb)
if(!length(detachable_limbs))
to_chat(src, SPAN_WARNING("You have no detachable limbs."))
return FALSE
var/obj/item/organ/external/E = input(usr, "Which limb do you wish to detach?", "Limb Removal") as null|anything in detachable_limbs
if(!check_can_detach_modular_limb(E))
return FALSE
if(!do_after(src, 2 SECONDS, src))
return FALSE
if(!check_can_detach_modular_limb(E))
return FALSE
last_special = world.time
E.removed(src)
E.dropInto(loc)
put_in_hands(E)
var/datum/gender/G = gender_datums[gender]
visible_message(
SPAN_NOTICE("\The [src] detaches [G.his] [E.name]!"),
SPAN_NOTICE("You detach your [E.name]!"))
return TRUE
@@ -366,7 +366,7 @@
return
var/datum/robolimb/robohead = all_robolimbs[E.model]
if(!robohead.monitor_styles || !robohead.monitor_icon)
to_chat(src,"<span class='warning'>Your head doesn't have a monitor or it doens't support to be changed!</span>")
to_chat(src,"<span class='warning'>Your head doesn't have a monitor, or it doesn't support being changed!</span>")
return
var/list/states
if(!states)
@@ -30,8 +30,9 @@
H.eyes_over_markings = !H.eyes_over_markings
update_icons_body()
var/datum/robolimb/robohead = all_robolimbs[H.model]
if(robohead.monitor_styles && robohead.monitor_icon)
to_chat(src, "<span class='notice'>You reconfigure the rendering order of your facial display.</span>")
if(H.robotic)
var/datum/robolimb/robohead = all_robolimbs[H.model]
if(robohead.monitor_styles && robohead.monitor_icon)
to_chat(src, "<span class='notice'>You reconfigure the rendering order of your facial display.</span>")
return TRUE
+8 -3
View File
@@ -62,6 +62,8 @@
//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()
@@ -1555,7 +1557,8 @@
custom_pain("[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!", 40)
if(shock_stage >= 30)
if(shock_stage == 30) emote("me",1,"is having trouble keeping their eyes open.")
if(shock_stage == 30 && !isbelly(loc)) //VOREStation Edit
emote("me",1,"is having trouble keeping their eyes open.")
eye_blurry = max(2, eye_blurry)
stuttering = max(stuttering, 5)
@@ -1563,7 +1566,8 @@
to_chat(src, "<span class='danger'>[pick("The pain is excruciating", "Please&#44; just end the pain", "Your whole body is going numb")]!</span>")
if (shock_stage >= 60)
if(shock_stage == 60) emote("me",1,"'s body becomes limp.")
if(shock_stage == 60 && !isbelly(loc)) //VOREStation Edit
emote("me",1,"'s body becomes limp.")
if (prob(2))
to_chat(src, "<span class='danger'>[pick("The pain is excruciating", "Please&#44; just end the pain", "Your whole body is going numb")]!</span>")
Weaken(20)
@@ -1579,7 +1583,8 @@
Paralyse(5)
if(shock_stage == 150)
emote("me",1,"can no longer stand, collapsing!")
if(!isbelly(loc)) //VOREStation Edit
emote("me",1,"can no longer stand, collapsing!")
Weaken(20)
if(shock_stage >= 150)
@@ -77,4 +77,11 @@
// Moving around increases germ_level faster
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
germ_level++
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)
+1 -1
View File
@@ -184,7 +184,7 @@
/mob/living/carbon/human/handle_speech_sound()
var/list/returns[2]
if(species.speech_sounds && prob(species.speech_chance))
if(species.speech_sounds && species.speech_sounds.len && prob(species.speech_chance)) //VOREStation Edit: Sanity Check
returns[1] = sound(pick(species.speech_sounds))
returns[2] = 50
return returns
@@ -122,7 +122,7 @@ Variables you may want to make use of are:
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head),
BP_HEAD = list("path" = /obj/item/organ/external/head),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
@@ -3,4 +3,12 @@
#define SHIFTED_OR_NOT 3
#define AB_PHASE_SHIFTED 0x1
#define AB_SHADE_REGEN 0x2
#define AB_SHADE_REGEN 0x2
//Porting over the type system of the mobs
#define BLUE_EYES 1
#define RED_EYES 2
#define PURPLE_EYES 3
#define YELLOW_EYES 4
#define GREEN_EYES 5
#define ORANGE_EYES 6
@@ -21,7 +21,7 @@
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin)
rarity_value = 15 //INTERDIMENSIONAL FLUFFERS
siemens_coefficient = 0
siemens_coefficient = 1
darksight = 10
slowdown = -0.5
@@ -106,6 +106,9 @@
/datum/power/shadekin/regenerate_other,
/datum/power/shadekin/create_shade)
var/list/shadekin_ability_datums = list()
var/kin_type
var/energy_light = 0.25
var/energy_dark = 0.75
/datum/species/shadekin/New()
..()
@@ -162,18 +165,21 @@
var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
darkness = 1-brightness //Invert
var/is_dark = (darkness >= 0.5)
if(H.ability_flags & AB_PHASE_SHIFTED)
dark_gains = 0
else
//Heal (very) slowly in good darkness
if(darkness >= 0.75)
H.adjustFireLoss(-0.05)
H.adjustBruteLoss(-0.05)
H.adjustToxLoss(-0.05)
dark_gains = 0.75
if(is_dark)
H.adjustFireLoss((-0.10)*darkness)
H.adjustBruteLoss((-0.10)*darkness)
H.adjustToxLoss((-0.10)*darkness)
//energy_dark and energy_light are set by the shadekin eye traits.
//These are balanced around their playstyles and 2 planned new aggressive abilities
dark_gains = energy_dark
else
dark_gains = 0.25
dark_gains = energy_light
set_energy(H, get_energy(H) + dark_gains)
@@ -33,6 +33,27 @@
var/ability_cost = 100
var/darkness = 1
var/turf/T = get_turf(src)
if(!T)
to_chat(src,"<span class='warning'>You can't use that here!</span>")
return FALSE
var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
darkness = 1-brightness //Invert
var/watcher = 0
for(var/mob/living/carbon/human/watchers in oview(7,src )) // If we can see them...
if(watchers in oviewers(7,src)) // And they can see us...
if(!(watchers.stat) && !isbelly(watchers.loc) && !istype(watchers.loc, /obj/item/weapon/holder)) // And they are alive and not being held by someone...
watcher++ // They are watching us!
ability_cost = CLAMP(ability_cost/(0.01+darkness*2),50, 80)//This allows for 1 watcher in full light
if(watcher>0)
ability_cost = ability_cost + ( 15 * watcher )
if(!(ability_flags & AB_PHASE_SHIFTED))
log_debug("[src] attempted to shift with [watcher] visible Carbons with a cost of [ability_cost] in a darkness level of [darkness]")
var/datum/species/shadekin/SK = species
if(!istype(SK))
to_chat(src, "<span class='warning'>Only a shadekin can use that!</span>")
@@ -48,7 +69,6 @@
shadekin_adjust_energy(-ability_cost)
playsound(src, 'sound/effects/stealthoff.ogg', 75, 1)
var/turf/T = get_turf(src)
if(!T.CanPass(src,T) || loc != T)
to_chat(src,"<span class='warning'>You can't use that here!</span>")
return FALSE
@@ -270,4 +290,4 @@
holder.glow_intensity = initial(holder.glow_intensity)
holder.glow_color = initial(holder.glow_color)
holder.set_light(0)
my_kin = null
my_kin = null
@@ -0,0 +1,91 @@
/datum/trait/kintype
allowed_species = list(SPECIES_SHADEKIN)
var/color = BLUE_EYES
name = "Shadekin Blue Adaptation"
desc = "Makes your shadekin adapted as a Blue eyed kin! This gives you decreased energy regeneration in darkness, decreased regeneration in the light amd unchanged health!"
cost = 0
var_changes = list( "total_health" = 100,
"energy_light" = 0.5,
"energy_dark" = 0.5,
"unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap))
custom_only = FALSE
/datum/trait/kintype/red
name = "Shadekin Red Adaptation"
color = RED_EYES
desc = "Makes your shadekin adapted as a Red eyed kin! This gives you minimal energy regeneration in darkness, moderate regeneration in the light amd increased health!"
var_changes = list( "total_health" = 200,
"energy_light" = -1,
"energy_dark" = 0.1,
"unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap))
/datum/trait/kintype/purple
name = "Shadekin Purple Adaptation"
color = PURPLE_EYES
desc = "Makes your shadekin adapted as a Purple eyed kin! This gives you moderate energy regeneration in darkness, minor degeneration in the light amd increased health!"
var_changes = list( "total_health" = 150,
"energy_light" = 1,
"energy_dark" = -0.5,
"unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap))
/datum/trait/kintype/yellow
name = "Shadekin Yellow Adaptation"
color = YELLOW_EYES
desc = "Makes your shadekin adapted as a Yellow eyed kin! This gives you the highest energy regeneration in darkness, high degeneration in the light amd unchanged health!"
var_changes = list( "total_health" = 100,
"energy_light" = 3,
"energy_dark" = -2,
"unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap))
/datum/trait/kintype/green
name = "Shadekin Green Adaptation"
color = GREEN_EYES
desc = "Makes your shadekin adapted as a Green eyed kin! This gives you high energy regeneration in darkness, minor regeneration in the light amd unchanged health!"
var_changes = list( "total_health" = 100,
"energy_light" = 2,
"energy_dark" = 0.125,
"unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap))
/datum/trait/kintype/orange
name = "Shadekin Orange Adaptation"
color = ORANGE_EYES
desc = "Makes your shadekin adapted as a Orange eyed kin! This gives you minor energy regeneration in darkness, modeate degeneration in the light amd increased health!"
var_changes = list( "total_health" = 175,
"energy_light" = 0.25,
"energy_dark" = -0.5,
"unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap))
/datum/trait/kintype/apply(var/datum/species/shadekin/S,var/mob/living/carbon/human/H)
if(color && istype(S)) //Sanity check to see if they're actually a shadekin, otherwise just don't do anything. They shouldn't be able to spawn with the trait.
S.kin_type = color
..(S,H)
switch(color)
if(BLUE_EYES)
H.shapeshifter_set_eye_color("0000FF")
if(RED_EYES)
H.shapeshifter_set_eye_color("FF0000")
if(GREEN_EYES)
H.shapeshifter_set_eye_color("00FF00")
if(PURPLE_EYES)
H.shapeshifter_set_eye_color("FF00FF")
if(YELLOW_EYES)
H.shapeshifter_set_eye_color("FFFF00")
if(ORANGE_EYES)
H.shapeshifter_set_eye_color("FFA500")
/datum/unarmed_attack/shadekinharmbap
attack_name = "syphon strike"
attack_verb = list("hit", "clawed", "slashed", "scratched")
attack_sound = 'sound/weapons/slice.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
shredding = 0
/datum/unarmed_attack/shadekinharmbap/apply_effects(var/mob/living/carbon/human/shadekin/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
..()
if(user == target) //Prevent self attack to gain energy
return
var/obj/item/organ/internal/brain/shadekin/shade_organ = user.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return
shade_organ.dark_energy = CLAMP(shade_organ.dark_energy + attack_damage,0,shade_organ.max_dark_energy) //Convert Damage done to Energy Gained
@@ -51,9 +51,11 @@
var/hunger_factor = 0.05 // Multiplier for hunger.
var/active_regen_mult = 1 // Multiplier for 'Regenerate' power speed, in human_powers.dm
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
var/allergens = null // Things that will make this species very sick
var/allergen_severity = 0.5 // How bad are reactions to the allergen? This is raw toxin damage per metabolism tick, multiplied by the amount metabolized
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
var/allergens = null // Things that will make this species very sick
var/allergen_reaction = AG_TOX_DMG|AG_OXY_DMG|AG_EMOTE|AG_PAIN|AG_WEAKEN // What type of reactions will you have? These the 'main' options and are intended to approximate anaphylactic shock at high doses.
var/allergen_damage_severity = 1.2 // How bad are reactions to the allergen? Touch with extreme caution.
var/allergen_disable_severity = 3 // Whilst this determines how long nonlethal effects last and how common emotes are.
var/min_age = 17
var/max_age = 70
@@ -370,6 +372,9 @@
var/limb_path = organ_data["path"]
var/obj/item/organ/O = new limb_path(H)
organ_data["descriptor"] = O.name
if(O.parent_organ)
organ_data = has_limbs[O.parent_organ]
organ_data["has_children"] = organ_data["has_children"]+1
for(var/organ_tag in has_organ)
var/organ_type = has_organ[organ_tag]
@@ -282,9 +282,9 @@
to_chat(user,"<span class='warning'>You don't have a working refactory module!</span>")
return
var/nagmessage = "Adjust your mass to be a size between 25 to 200%. Up-sizing consumes metal, downsizing returns metal."
var/nagmessage = "Adjust your mass to be a size between 25 to 200% (or between 1 to 600% in dorms area). Up-sizing consumes metal, downsizing returns metal."
var/new_size = input(user, nagmessage, "Pick a Size", user.size_multiplier*100) as num|null
if(!new_size || !ISINRANGE(new_size,25,200))
if(!new_size || !size_range_check(new_size))
return
var/size_factor = new_size/100
@@ -313,7 +313,7 @@
breath_heat_level_3 = 1350 //Default 1250
reagent_tag = IS_SKRELL
allergens = MEAT|FISH|DAIRY
allergens = MEAT|FISH|DAIRY|EGGS
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
@@ -323,6 +323,9 @@
wikilink="https://wiki.vore-station.net/Teshari"
agility = 90
male_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
female_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
inherent_verbs = list(
/mob/living/carbon/human/proc/sonar_ping,
/mob/living/proc/hide,
@@ -155,30 +155,79 @@
//Allergen traits! Not available to any species with a base allergens var.
/datum/trait/allergy_gluten
/datum/trait/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_changes = list("allergens" = 16)
excludes = list(/datum/trait/allergy_nuts,/datum/trait/allergy_soy)
var/allergen = GRAINS
/datum/trait/allergy_nuts
/datum/trait/allergy/apply(var/datum/species/S,var/mob/living/carbon/human/H)
S.allergens |= allergen
..(S,H)
/datum/trait/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."
cost = 0
custom_only = FALSE
allergen = MEAT
/datum/trait/allergy/fish
name = "Allergy: Fish"
desc = "You're highly allergic to fish. It's probably best to avoid seafood in general..."
cost = 0
custom_only = FALSE
allergen = FISH
/datum/trait/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."
cost = 0
custom_only = FALSE
allergen = FRUIT
/datum/trait/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."
cost = 0
custom_only = FALSE
allergen = VEGETABLE
/datum/trait/allergy/nuts
name = "Allergy: Nuts"
desc = "You're highly allergic to hard-shell seeds, such as peanuts."
cost = 0
custom_only = FALSE
var_changes = list("allergens" = 64)
excludes = list(/datum/trait/allergy_gluten,/datum/trait/allergy_soy)
allergen = SEEDS
/datum/trait/allergy_soy
/datum/trait/allergy/soy
name = "Allergy: Soy"
desc = "You're highly allergic to soybeans, and some other kinds of bean."
cost = 0
custom_only = FALSE
var_changes = list("allergens" = 32)
excludes = list(/datum/trait/allergy_gluten,/datum/trait/allergy_nuts)
allergen = BEANS
/datum/trait/allergy/dairy
name = "Allergy: Lactose"
desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy."
cost = 0
custom_only = FALSE
allergen = DAIRY
/datum/trait/allergy/fungi
name = "Allergy: Fungi"
desc = "You're highly allergic to Fungi such as mushrooms."
cost = 0
custom_only = FALSE
allergen = FUNGI
/datum/trait/allergy/coffee
name = "Allergy: Coffee"
desc = "You're highly allergic to coffee in specific."
cost = 0
custom_only = FALSE
allergen = COFFEE
// Spicy Food Traits, from negative to positive.
/datum/trait/spice_intolerance_extreme
@@ -10,6 +10,7 @@
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.
var/list/banned_species // A list of species that can't take this trait
var/list/allowed_species // VORESTATION EDIT:chomp port. A list of species that CAN take this trait, use this if only a few species can use it. -shark
var/custom_only = TRUE // Trait only available for custom species
//Proc can be overridden lower to include special changes, make sure to call up though for the vars changes
+8
View File
@@ -700,6 +700,14 @@
/mob/living/proc/has_eyes()
return 1
/mob/living/proc/get_restraining_bolt()
var/obj/item/weapon/implant/restrainingbolt/RB = locate() in src
if(RB)
if(!RB.malfunction)
return TRUE
return FALSE
/mob/living/proc/slip(var/slipped_on,stun_duration=8)
return 0
@@ -5,6 +5,7 @@
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
+9 -7
View File
@@ -95,28 +95,29 @@ default behaviour is:
if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !tmob.buckled && !buckled && can_swap && can_move_mob(tmob, 1, 0)) // mutual brohugs all around!
var/turf/oldloc = loc
//VOREstation Edit - Begin
//check bumpnom chance, if it's a simplemob that's doing the bumping
var/mob/living/simple_mob/srcsimp = src
if(istype(srcsimp))
if(srcsimp.tryBumpNom(tmob))
now_pushing = 0
return
//if it's a simplemob being bumped, and the above didn't make them start getting bumpnommed, they get a chance to bumpnom
var/mob/living/simple_mob/tmobsimp = tmob
if(istype(tmobsimp))
if(tmobsimp.tryBumpNom(src))
now_pushing = 0
return
//VOREstation Edit - End
forceMove(tmob.loc)
//VOREstation Edit - Begin
// In case of micros, we don't swap positions; instead occupying the same square!
if (handle_micro_bump_helping(tmob))
now_pushing = 0
return
if(step_mechanics_pref && tmob.step_mechanics_pref)
if(handle_micro_bump_helping(tmob))
now_pushing = 0
return
// TODO - Check if we need to do something about the slime.UpdateFeed() we are skipping below.
// VOREStation Edit - End
tmob.forceMove(oldloc)
@@ -145,7 +146,8 @@ default behaviour is:
now_pushing = 0
return
// Handle grabbing, stomping, and such of micros!
if(handle_micro_bump_other(tmob)) return
if(step_mechanics_pref && tmob.step_mechanics_pref)
if(handle_micro_bump_other(tmob)) return
// VOREStation Edit - End
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(40) && !(FAT in src.mutations))
+5 -3
View File
@@ -5,8 +5,8 @@
/mob/living/verb/customsay()
set category = "IC"
set name = "Customise Speech Verbs"
set desc = "Customise the text which appears when you type- e.g. 'says', 'asks', 'exclaims'."
set name = "Customize Speech Verbs"
set desc = "Customize the text which appears when you type- e.g. 'says', 'asks', 'exclaims'."
if(src.client)
var/customsaylist[] = list(
@@ -16,7 +16,7 @@
"Exclaim/Shout/Yell (!)",
"Cancel"
)
var/sayselect = input("Which say-verb do you wish to customise?") as null|anything in customsaylist //we can't use alert() for this because there's too many terms
var/sayselect = input("Which say-verb do you wish to customize?") as null|anything in customsaylist //we can't use alert() for this because there's too many terms
if(sayselect == "Say")
custom_say = sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text)
@@ -39,3 +39,5 @@
ooc_notes = new_metadata
to_chat(usr, "OOC notes updated.")
log_admin("[key_name(usr)] updated their OOC notes mid-round.")
+2 -2
View File
@@ -320,7 +320,7 @@ proc/get_radio_key_from_channel(var/channel)
var/speech_bubble_test = say_test(message)
//var/image/speech_bubble = image('icons/mob/talk_vr.dmi',src,"h[speech_bubble_test]") //VOREStation Edit. Commented this out in case we need to reenable.
var/speech_type = speech_bubble_appearance()
var/image/speech_bubble = image('icons/mob/talk_vr.dmi',src,"[speech_type][speech_bubble_test]") //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons
var/image/speech_bubble = generate_speech_bubble(src, "[speech_type][speech_bubble_test]")
var/sb_alpha = 255
var/atom/loc_before_turf = src
//VOREStation Add
@@ -342,7 +342,7 @@ proc/get_radio_key_from_channel(var/channel)
var/turf/ST = get_turf(above)
if(ST)
var/list/results = get_mobs_and_objs_in_view_fast(ST, world.view)
var/image/z_speech_bubble = image('icons/mob/talk_vr.dmi', above, "h[speech_bubble_test]") //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons
var/image/z_speech_bubble = generate_speech_bubble(above, "h[speech_bubble_test]")
images_to_clients[z_speech_bubble] = list()
for(var/item in results["mobs"])
if(item != above && !(item in listening))
@@ -91,6 +91,8 @@
var/tracking_entities = 0 //The number of known entities currently accessing the internal camera
var/braintype = "Cyborg"
var/obj/item/weapon/implant/restrainingbolt/bolt // The restraining bolt installed into the cyborg.
var/list/robot_verbs_default = list(
/mob/living/silicon/robot/proc/sensor_mode,
/mob/living/silicon/robot/proc/robot_checklaws
@@ -481,6 +483,20 @@
return
if(istype(W, /obj/item/weapon/implant/restrainingbolt) && !cell)
if(bolt)
to_chat(user, "<span class='notice'>There is already a restraining bolt installed in this cyborg.</span>")
return
else
user.drop_from_inventory(W)
W.forceMove(src)
bolt = W
to_chat(user, "<span class='notice'>You install \the [W].</span>")
return
if(istype(W, /obj/item/weapon/aiModule)) // Trying to modify laws locally.
if(!opened)
to_chat(user, "<span class='warning'>You need to open \the [src]'s panel before you can modify them.</span>")
@@ -622,6 +638,21 @@
to_chat(user, "Unable to locate a radio.")
updateicon()
else if(W.is_wrench() && opened && !cell)
if(bolt)
to_chat(user,"You begin removing \the [bolt].")
if(do_after(user, 2 SECONDS, src))
bolt.forceMove(get_turf(src))
bolt = null
to_chat(user, "You remove \the [bolt].")
else
to_chat(user, "There is no restraining bolt installed.")
return
else if(istype(W, /obj/item/device/encryptionkey/) && opened)
if(radio)//sanityyyyyy
radio.attackby(W,user)//GTFO, you have your own procs
@@ -664,6 +695,30 @@
spark_system.start()
return ..()
/mob/living/silicon/robot/GetIdCard()
if(bolt && !bolt.malfunction)
return null
return idcard
/mob/living/silicon/robot/get_restraining_bolt()
var/obj/item/weapon/implant/restrainingbolt/RB = bolt
if(istype(RB))
if(!RB.malfunction)
return TRUE
return FALSE
/mob/living/silicon/robot/resist_restraints()
if(bolt)
if(!bolt.malfunction)
visible_message("<span class='danger'>[src] is trying to break their [bolt]!</span>", "<span class='warning'>You attempt to break your [bolt]. (This will take around 90 seconds and you need to stand still)</span>")
if(do_after(src, 1.5 MINUTES, src, incapacitation_flags = INCAPACITATION_DISABLED))
visible_message("<span class='danger'>[src] manages to break \the [bolt]!</span>", "<span class='warning'>You successfully break your [bolt].</span>")
bolt.malfunction = MALFUNCTION_PERMANENT
return
/mob/living/silicon/robot/proc/module_reset()
transform_with_anim() //VOREStation edit: sprite animation
uneq_all()
@@ -1015,6 +1070,9 @@
return 0
/mob/living/silicon/robot/binarycheck()
if(get_restraining_bolt())
return FALSE
if(is_component_functioning("comms"))
var/datum/robot_component/RC = get_component("comms")
use_power(RC.active_usage)
@@ -1107,6 +1165,11 @@
sleep(20)
to_chat(src, "<span class='danger'>SynBorg v1.7.1 loaded.</span>")
sleep(5)
if(bolt)
if(!bolt.malfunction)
bolt.malfunction = MALFUNCTION_PERMANENT
to_chat(src, "<span class='danger'>RESTRAINING BOLT DISABLED</span>")
sleep(5)
to_chat(src, "<span class='danger'>LAW SYNCHRONISATION ERROR</span>")
sleep(5)
to_chat(src, "<span class='danger'>Would you like to send a report to NanoTraSoft? Y/N</span>")
@@ -355,6 +355,7 @@
name = "Custodial Hound module"
sprites = list(
"Custodial Hound" = "scrubpup",
"Janihound model V-2" = "J9",
"Borgi" = "borgi-jani",
"Otieborg" = "otiej",
"Drake" = "drakejanit"
@@ -32,6 +32,9 @@
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
. -= 2 // VOREStation Edit
if(get_restraining_bolt()) // Borgs with Restraining Bolts move slower.
. += 1
. += config.robot_delay
. += ..()
@@ -41,11 +41,11 @@
return say(message)
// Ugly saycode so parrots can use their headsets.
/mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, speaking, used_radios)
/mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, used_radios, whispering)
..()
if(message_mode)
if(my_headset && istype(my_headset, /obj/item/device/radio))
my_headset.talk_into(src, message, message_mode, verb, speaking)
my_headset.talk_into(src, message, message_mode, verb, whispering)
used_radios += my_headset
// Clicked on while holding an object.
@@ -0,0 +1,67 @@
/datum/category_item/catalogue/fauna/sect_drone
name = "Creature - Sect Drone"
desc = "Database Update Pending" //TODO: Virgo Lore Writing WIP
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/vore/sect_drone
name = "sect drone"
desc = "A large, chitin-plated insectoid whose multiple cyan eyes cast a frightful blue light. Its \
abdomen has an unusually soft and... flexible-looking underbelly..."
icon_dead = "sect_drone_dead"
icon_living = "sect_drone"
icon_state = "sect_drone"
icon = 'icons/mob/vore64x64.dmi'
vis_height = 64
has_eye_glow = TRUE
faction = "insects"
maxHealth = 90
health = 90
see_in_dark = 8
movement_cooldown = 3
melee_damage_lower = 6
melee_damage_upper = 12
grab_resist = 100 // you can't even wrap your arms around this thing, how could you hope to grab it???
vore_active = 1
vore_capacity = 1
vore_pounce_chance = 70 // v hongry buggo
vore_icons = SA_ICON_LIVING
//Beeg bug don't give a fuck about atmos. Something something, phoron mutation.
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
response_help = "pats"
response_disarm = "tries to shove"
response_harm = "hits"
attacktext = list("slashed")
friendly = list("nuzzles", "caresses", "headbumps against", "leans against", "nibbles affectionately on", "antennae tickles") // D'awww
old_x = -16
old_y = 0
default_pixel_x = -16
pixel_x = -16
pixel_y = 0
max_buckled_mobs = 1 //Yeehaw
can_buckle = TRUE
buckle_movable = TRUE
buckle_lying = FALSE
mount_offset_y = 7
ai_holder_type = /datum/ai_holder/simple_mob/melee
say_list_type = /datum/say_list/sect_drone
/datum/say_list/sect_drone
say_got_target = list("chitters threateningly!")
@@ -1,6 +1,6 @@
// Beeg bug do beeg noms. It also glows in the dark for maximum spook power.
/datum/category_item/catalogue/fauna/sect_queen //TODO: VIRGO_LORE_WRITING_WIP
/datum/category_item/catalogue/fauna/sect_queen
name = "Creature - Sect Queen"
desc = "A massively-sized insect that is native, although rarely spotted outside of its colony, to Virgo 3B. \
It bears the combined physical traits of several of Earth's insects. Its forelegs have claws bearing serrated \
@@ -28,7 +28,7 @@
maxHealth = 200
health = 200
see_in_dark = 8
melee_damage_lower = 8
melee_damage_upper = 16
@@ -61,7 +61,7 @@
default_pixel_x = -16
pixel_x = -16
pixel_y = 0
max_buckled_mobs = 1 //Yeehaw
can_buckle = TRUE
buckle_movable = TRUE
@@ -19,7 +19,7 @@
//Shifting in
if(ability_flags & AB_PHASE_SHIFTED)
ability_flags &= ~AB_PHASE_SHIFTED
mouse_opacity = 2
mouse_opacity = 1
name = real_name
for(var/belly in vore_organs)
var/obj/belly/B = belly
+1 -1
View File
@@ -110,7 +110,7 @@
var/speech_bubble_test = say_test(message)
//var/image/speech_bubble = image('icons/mob/talk_vr.dmi',comm,"h[speech_bubble_test]") //VOREStation Edit - Commented out in case of needed reenable.
var/speech_type = speech_bubble_appearance()
var/image/speech_bubble = image('icons/mob/talk_vr.dmi',comm,"[speech_type][speech_bubble_test]") //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons
var/image/speech_bubble = generate_speech_bubble(comm, "[speech_type][speech_bubble_test]")
spawn(30)
qdel(speech_bubble)

Some files were not shown because too many files have changed in this diff Show More