"
dat += "Name: "
dat += "[real_name]"
@@ -284,18 +303,35 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "[ha_style] "
dat += "Color [color_square(r_headacc, g_headacc, b_headacc)] "
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings.
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ dat += "Head Markings: "
+ dat += "[m_styles["head"]]"
+ dat += "Color [color_square(color2R(m_colours["head"]), color2G(m_colours["head"]), color2B(m_colours["head"]))] "
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
dat += "Body Markings: "
- dat += "[m_style]"
- dat += "Color [color_square(r_markings, g_markings, b_markings)] "
+ dat += "[m_styles["body"]]"
+ dat += "Color [color_square(color2R(m_colours["body"]), color2G(m_colours["body"]), color2B(m_colours["body"]))] "
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ dat += "Tail Markings: "
+ dat += "[m_styles["tail"]]"
+ dat += "Color [color_square(color2R(m_colours["tail"]), color2G(m_colours["tail"]), color2B(m_colours["tail"]))] "
dat += "Hair: "
dat += "[h_style]"
- dat += "Color [color_square(r_hair, g_hair, b_hair)] "
+ dat += "Color [color_square(r_hair, g_hair, b_hair)]"
+ var/datum/sprite_accessory/temp_hair_style = hair_styles_list[h_style]
+ if(temp_hair_style && temp_hair_style.secondary_theme && !temp_hair_style.no_sec_colour)
+ dat += " Color #2 [color_square(r_hair_sec, g_hair_sec, b_hair_sec)]"
+ dat += " "
dat += "Facial Hair: "
dat += "[f_style ? "[f_style]" : "Shaved"]"
- dat += "Color [color_square(r_facial, g_facial, b_facial)] "
+ dat += "Color [color_square(r_facial, g_facial, b_facial)]"
+ var/datum/sprite_accessory/temp_facial_hair_style = facial_hair_styles_list[f_style]
+ if(temp_facial_hair_style && temp_facial_hair_style.secondary_theme && !temp_facial_hair_style.no_sec_colour)
+ dat += " Color #2 [color_square(r_facial_sec, g_facial_sec, b_facial_sec)]"
+ dat += " "
+
if(species != "Machine")
dat += "Eyes: "
@@ -318,6 +354,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "Character Records "
dat += "Limbs"
+ if(species in list("Unathi")) //Species with alt heads.
+ dat += "Alternate Head: "
+ dat += "[alt_head] "
dat += "Limbs and Parts: Adjust "
if(species != "Slime People" && species != "Machine")
dat += "Internal Organs: Adjust "
@@ -395,6 +434,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "OOC notes: Edit "
if(unlock_content)
dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"] "
+ if(user.client.donator_level >= DONATOR_LEVEL_ONE)
+ dat += "Donator Publicity: [(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"] "
dat += "Randomized character slot: [randomslot ? "Yes" : "No"] "
dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"] "
@@ -431,14 +472,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
total_cost += G.cost
var/fcolor = "#3366CC"
- if(total_cost < MAX_GEAR_COST)
+ if(total_cost < max_gear_slots)
fcolor = "#E67300"
dat += ""
- dat += "| [total_cost]/[MAX_GEAR_COST] loadout points spent. \[Clear Loadout\] | "
+ dat += "| [total_cost]/[max_gear_slots] loadout points spent. \[Clear Loadout\] | "
dat += ""
var/firstcat = 1
for(var/category in loadout_categories)
+ var/datum/loadout_category/LC = loadout_categories[category]
+ if(LC.donor_only)
+ if(user.client.donator_level < DONATOR_LEVEL_TWO) // level two donators get the donator loadout, so don't show it to anyone with less than that
+ continue
if(firstcat)
firstcat = 0
else
@@ -1064,6 +1109,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(TG.display_name in gear)
gear -= TG.display_name
else
+ if(TG.donor_only)
+ if(user.client.donator_level < DONATOR_LEVEL_TWO) // donator items are locked to > tier 2
+ //they normally can't even get this far- but just in case of href exploits, we check them here
+ return
var/total_cost = 0
var/list/type_blacklist = list()
for(var/gear_name in gear)
@@ -1075,7 +1124,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
type_blacklist += G.subtype_path
total_cost += G.cost
- if((total_cost + TG.cost) <= MAX_GEAR_COST)
+ if((total_cost + TG.cost) <= max_gear_slots)
gear += TG.display_name
else if(href_list["gear"] && href_list["tweak"])
@@ -1097,6 +1146,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
switch(href_list["task"])
if("random")
+ var/datum/robolimb/robohead
+ if(species == "Machine")
+ var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
+ robohead = all_robolimbs[head_model]
switch(href_list["preference"])
if("name")
real_name = random_name(gender,species)
@@ -1107,23 +1160,59 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
r_hair = rand(0,255)
g_hair = rand(0,255)
b_hair = rand(0,255)
+ if("secondary_hair")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
+ r_hair_sec = rand(0,255)
+ g_hair_sec = rand(0,255)
+ b_hair_sec = rand(0,255)
if("h_style")
- h_style = random_hair_style(gender, species)
+ h_style = random_hair_style(gender, species, robohead)
if("facial")
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
r_facial = rand(0,255)
g_facial = rand(0,255)
b_facial = rand(0,255)
+ if("secondary_facial")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
+ r_facial_sec = rand(0,255)
+ g_facial_sec = rand(0,255)
+ b_facial_sec = rand(0,255)
if("f_style")
- f_style = random_facial_hair_style(gender, species)
+ f_style = random_facial_hair_style(gender, species, robohead)
+ if("headaccessory")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ r_headacc = rand(0,255)
+ g_headacc = rand(0,255)
+ b_headacc = rand(0,255)
+ if("ha_style")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ ha_style = random_head_accessory(species)
+ if("m_style_head")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
+ if("m_head_colour")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ m_colours["head"] = rgb(rand(0,255), rand(0,255), rand(0,255))
+ if("m_style_body")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings.
+ m_styles["body"] = random_marking_style("body", species)
+ if("m_body_colour")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings.
+ m_colours["body"] = rgb(rand(0,255), rand(0,255), rand(0,255))
+ if("m_style_tail")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
+ if("m_tail_colour")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_colours["tail"] = rgb(rand(0,255), rand(0,255), rand(0,255))
if("underwear")
- underwear = random_underwear(gender)
+ underwear = random_underwear(gender, species)
ShowChoices(user)
if("undershirt")
- undershirt = random_undershirt(gender)
+ undershirt = random_undershirt(gender, species)
ShowChoices(user)
if("socks")
- socks = random_socks(gender)
+ socks = random_socks(gender, species)
ShowChoices(user)
if("eyes")
r_eyes = rand(0,255)
@@ -1159,7 +1248,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(new_age)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
if("species")
-
var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
var/prev_species = species
// var/whitelisted = 0
@@ -1177,43 +1265,41 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
species = input("Please select a species", "Character Generation", null) in new_species
if(prev_species != species)
+ var/datum/robolimb/robohead
+ if(species == "Machine")
+ var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
+ robohead = all_robolimbs[head_model]
//grab one of the valid hair styles for the newly chosen species
- var/list/valid_hairstyles = list()
- for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(!(species in S.species_allowed))
- continue
-
- valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
-
- if(valid_hairstyles.len)
- h_style = pick(valid_hairstyles)
- else
- //this shouldn't happen
- h_style = hair_styles_list["Bald"]
+ h_style = random_hair_style(gender, species, robohead)
//grab one of the valid facial hair styles for the newly chosen species
- var/list/valid_facialhairstyles = list()
- for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(!(species in S.species_allowed))
- continue
+ f_style = random_facial_hair_style(gender, species, robohead)
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
-
- if(valid_facialhairstyles.len)
- f_style = pick(valid_facialhairstyles)
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ ha_style = random_head_accessory(species)
else
- //this shouldn't happen
- f_style = facial_hair_styles_list["Shaved"]
+ ha_style = "None" // No Vulp ears on Unathi
+ r_headacc = 0
+ g_headacc = 0
+ b_headacc = 0
+
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
+ else
+ m_styles["head"] = "None"
+ m_colours["head"] = "#000000"
+
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ m_styles["body"] = random_marking_style("body", species)
+ else
+ m_styles["body"] = "None"
+ m_colours["body"] = "#000000"
+
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
+ else
+ m_styles["tail"] = "None"
+ m_colours["tail"] = "#000000"
// Don't wear another species' underwear!
var/datum/sprite_accessory/S = underwear_list[underwear]
@@ -1228,20 +1314,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(!S || !(species in S.species_allowed))
socks = random_socks(gender, species)
- //reset hair colour and skin colour
- r_hair = 0//hex2num(copytext(new_hair, 2, 4))
- g_hair = 0//hex2num(copytext(new_hair, 4, 6))
- b_hair = 0//hex2num(copytext(new_hair, 6, 8))
-
- s_tone = 0
+ //reset skin tone and colour
+ if(species in list("Human", "Drask", "Vox"))
+ random_skin_tone(species)
+ else
+ s_tone = 0
if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")))
r_skin = 0
g_skin = 0
b_skin = 0
- ha_style = "None" // No Vulp ears on Unathi
- m_style = "None" // No Unathi markings on Tajara
+ alt_head = "None" //No alt heads on species that don't have them.
body_accessory = null //no vulptail on humans damnit
@@ -1288,39 +1372,44 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/input = "Choose your character's hair colour:"
var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null
if(new_hair)
- r_hair = hex2num(copytext(new_hair, 2, 4))
- g_hair = hex2num(copytext(new_hair, 4, 6))
- b_hair = hex2num(copytext(new_hair, 6, 8))
+ r_hair = color2R(new_hair)
+ g_hair = color2G(new_hair)
+ b_hair = color2B(new_hair)
+
+ if("secondary_hair")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
+ if(hair_style.secondary_theme && !hair_style.no_sec_colour)
+ var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", rgb(r_hair_sec, g_hair_sec, b_hair_sec)) as color|null
+ if(new_hair)
+ r_hair_sec = color2R(new_hair)
+ g_hair_sec = color2G(new_hair)
+ b_hair_sec = color2B(new_hair)
if("h_style")
var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
- if(S.name == "Bald")
- valid_hairstyles[hairstyle] = S
- if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
- else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(species in S.species_allowed)
- if(robohead.is_monitor && (robohead.company in S.models_allowed)) //If the Machine character has the default Morpheus screen head or another screen head
- //and said head is in the hair style's allowed models list...
- valid_hairstyles[hairstyle] = S //Allow them to select the hairstyle.
- continue
- else
- if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human hairstyles).
- continue
- else if(!robohead.is_monitor && ("Human" in S.species_allowed))
- valid_hairstyles[hairstyle] = S
- continue
- else
- if(!(species in S.species_allowed))
- continue
- valid_hairstyles[hairstyle] = S
+ if(hairstyle == "Bald") //Just in case.
+ valid_hairstyles += hairstyle
+ continue
+ if(species == "Machine") //Species that can use prosthetic heads.
+ var/head_model
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ head_model = "Morpheus Cyberkinetics"
+ else
+ head_model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[head_model]
+ if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_hairstyles += hairstyle //Give them their hairstyles if they do.
+ else
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
+ valid_hairstyles += hairstyle
+ else //If the user is not a species who can have robotic heads, use the default handling.
+ if(species in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ valid_hairstyles += hairstyle
var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
if(new_h_style)
@@ -1331,9 +1420,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/input = "Choose the colour of your your character's head accessory:"
var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null
if(new_head_accessory)
- r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
- g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
- b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
+ r_headacc = color2R(new_head_accessory)
+ g_headacc = color2G(new_head_accessory)
+ b_headacc = color2B(new_head_accessory)
if("ha_style")
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
@@ -1343,47 +1432,130 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(!(species in H.species_allowed))
continue
- valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style]
+ valid_head_accessory_styles += head_accessory_style
var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles
if(new_head_accessory_style)
ha_style = new_head_accessory_style
- if("markings")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
- var/input = "Choose the colour of your your character's markings:"
- var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null
- if(new_markings)
- r_markings = hex2num(copytext(new_markings, 2, 4))
- g_markings = hex2num(copytext(new_markings, 4, 6))
- b_markings = hex2num(copytext(new_markings, 6, 8))
-
- if("m_style")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
- var/list/valid_markings = list()
- for(var/markingstyle in marking_styles_list)
- var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
- if(!(species in M.species_allowed))
+ if("alt_head")
+ if(organ_data["head"] == "cyborg")
+ return
+ if(species in list("Unathi")) //Species with alt heads.
+ var/list/valid_alt_heads = list()
+ valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option
+ for(var/alternate_head in alt_heads_list)
+ var/datum/sprite_accessory/alt_heads/head = alt_heads_list[alternate_head]
+ if(!(species in head.species_allowed))
continue
+ valid_alt_heads += alternate_head
+
+ var/new_alt_head = input(user, "Choose your character's alternate head style:", "Character Preference") as null|anything in valid_alt_heads
+ if(new_alt_head)
+ alt_head = new_alt_head
+ if(m_styles["head"])
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/body_markings/head/head_marking_style = marking_styles_list[head_marking]
+ if(!head_marking_style.heads_allowed || (!("All" in head_marking_style.heads_allowed) && !(alt_head in head_marking_style.heads_allowed)))
+ m_styles["head"] = "None"
+
+ if("m_style_head")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ var/list/valid_markings = list()
+ valid_markings["None"] = marking_styles_list["None"]
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[markingstyle]
+ if(!(species in M.species_allowed))
+ continue
+ if(M.marking_location != "head")
+ continue
+ if(alt_head && alt_head != "None")
+ if(!("All" in M.heads_allowed) && !(alt_head in M.heads_allowed))
+ continue
+ else
+ if(M.heads_allowed && !("All" in M.heads_allowed))
+ continue
+
if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
+ var/head_model
if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
+ head_model = "Morpheus Cyberkinetics"
else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
+ head_model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[head_model]
if(robohead.is_monitor && M.name != "None") //If the character can have prosthetic heads and they have the default Morpheus head (or another monitor-head), no optic markings.
continue
else if(!robohead.is_monitor && M.name != "None") //Otherwise, if they DON'T have the default head and the head's not a monitor but the head's not in the style's list of allowed models, skip.
if(!(robohead.company in M.models_allowed))
continue
- valid_markings[markingstyle] = marking_styles_list[markingstyle]
+ valid_markings += markingstyle
- var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings
+ var/new_marking_style = input(user, "Choose the style of your character's head markings:", "Character Preference", m_styles["head"]) as null|anything in valid_markings
if(new_marking_style)
- m_style = new_marking_style
+ m_styles["head"] = new_marking_style
+
+ if("m_head_colour")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ var/input = "Choose the colour of your your character's head markings:"
+ var/new_markings = input(user, input, "Character Preference", m_colours["head"]) as color|null
+ if(new_markings)
+ m_colours["head"] = new_markings
+
+ if("m_style_body")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ var/list/valid_markings = list()
+ valid_markings["None"] = marking_styles_list["None"]
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
+ if(!(species in M.species_allowed))
+ continue
+ if(M.marking_location != "body")
+ continue
+
+ valid_markings += markingstyle
+
+ var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference", m_styles["body"]) as null|anything in valid_markings
+ if(new_marking_style)
+ m_styles["body"] = new_marking_style
+
+ if("m_body_colour")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ var/input = "Choose the colour of your your character's body markings:"
+ var/new_markings = input(user, input, "Character Preference", m_colours["body"]) as color|null
+ if(new_markings)
+ m_colours["body"] = new_markings
+
+ if("m_style_tail")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ var/list/valid_markings = list()
+ valid_markings["None"] = marking_styles_list["None"]
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/tail/M = marking_styles_list[markingstyle]
+ if(M.marking_location != "tail")
+ continue
+ if(!(species in M.species_allowed))
+ continue
+ if(!body_accessory)
+ if(M.tails_allowed)
+ continue
+ else
+ if(!M.tails_allowed || !(body_accessory in M.tails_allowed))
+ continue
+
+ valid_markings += markingstyle
+
+ var/new_marking_style = input(user, "Choose the style of your character's tail markings:", "Character Preference", m_styles["tail"]) as null|anything in valid_markings
+ if(new_marking_style)
+ m_styles["tail"] = new_marking_style
+
+ if("m_tail_colour")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ var/input = "Choose the colour of your your character's tail markings:"
+ var/new_markings = input(user, input, "Character Preference", m_colours["tail"]) as color|null
+ if(new_markings)
+ m_colours["tail"] = new_markings
if("body_accessory")
var/list/possible_body_accessories = list()
@@ -1400,74 +1572,90 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories
if(new_body_accessory)
+ m_styles["tail"] = "None"
body_accessory = (new_body_accessory == "None") ? null : new_body_accessory
if("facial")
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null
if(new_facial)
- r_facial = hex2num(copytext(new_facial, 2, 4))
- g_facial = hex2num(copytext(new_facial, 4, 6))
- b_facial = hex2num(copytext(new_facial, 6, 8))
+ r_facial = color2R(new_facial)
+ g_facial = color2G(new_facial)
+ b_facial = color2B(new_facial)
+
+ if("secondary_facial")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
+ if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour)
+ var/new_facial = input(user, "Choose your character's secondary facial-hair colour:", "Character Preference", rgb(r_facial_sec, g_facial_sec, b_facial_sec)) as color|null
+ if(new_facial)
+ r_facial_sec = color2R(new_facial)
+ g_facial_sec = color2G(new_facial)
+ b_facial_sec = color2B(new_facial)
if("f_style")
- var/list/valid_facialhairstyles = list()
+ var/list/valid_facial_hairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(S.name == "Shaved")
- valid_facialhairstyles[facialhairstyle] = S
+
+ if(facialhairstyle == "Shaved") //Just in case.
+ valid_facial_hairstyles += facialhairstyle
+ continue
if(gender == MALE && S.gender == FEMALE)
continue
if(gender == FEMALE && S.gender == MALE)
continue
if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
+ var/head_model
if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
+ head_model = "Morpheus Cyberkinetics"
else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(species in S.species_allowed)
- if(robohead.is_monitor) //If the Machine character has the default Morpheus screen head or another screen head and they're allowed to have the style, let them have it.
- valid_facialhairstyles[facialhairstyle] = S
- continue
+ head_model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[head_model]
+ if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
else
- if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human facial hairstyles).
- continue
- else if(!robohead.is_monitor && ("Human" in S.species_allowed))
- valid_facialhairstyles[facialhairstyle] = S
- continue
- else
- if(!(species in S.species_allowed))
- continue
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
+ valid_facial_hairstyles += facialhairstyle
+ else //If the user is not a species who can have robotic heads, use the default handling.
+ if(species in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ valid_facial_hairstyles += facialhairstyle
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
-
- var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles
+ var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facial_hairstyles
if(new_f_style)
f_style = new_f_style
if("underwear")
- var/list/underwear_options
- if(gender == MALE)
- underwear_options = underwear_m
- else
- underwear_options = underwear_f
-
- var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options
+ var/list/valid_underwear = list()
+ for(var/underwear in underwear_list)
+ var/datum/sprite_accessory/S = underwear_list[underwear]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+ valid_underwear[underwear] = underwear_list[underwear]
+ var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in valid_underwear
+ ShowChoices(user)
if(new_underwear)
underwear = new_underwear
- ShowChoices(user)
-
if("undershirt")
- var/new_undershirt
- if(gender == MALE)
- new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m
- else
- new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f
+ var/list/valid_undershirts = list()
+ for(var/undershirt in undershirt_list)
+ var/datum/sprite_accessory/S = undershirt_list[undershirt]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+ valid_undershirts[undershirt] = undershirt_list[undershirt]
+ var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in valid_undershirts
+ ShowChoices(user)
if(new_undershirt)
undershirt = new_undershirt
- ShowChoices(user)
if("socks")
var/list/valid_sockstyles = list()
@@ -1488,9 +1676,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("eyes")
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null
if(new_eyes)
- r_eyes = hex2num(copytext(new_eyes, 2, 4))
- g_eyes = hex2num(copytext(new_eyes, 4, 6))
- b_eyes = hex2num(copytext(new_eyes, 6, 8))
+ r_eyes = color2R(new_eyes)
+ g_eyes = color2G(new_eyes)
+ b_eyes = color2B(new_eyes)
if("s_tone")
if(species == "Human" || species == "Drask")
@@ -1506,9 +1694,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null
if(new_skin)
- r_skin = hex2num(copytext(new_skin, 2, 4))
- g_skin = hex2num(copytext(new_skin, 4, 6))
- b_skin = hex2num(copytext(new_skin, 6, 8))
+ r_skin = color2R(new_skin)
+ g_skin = color2G(new_skin)
+ b_skin = color2B(new_skin)
if("ooccolor")
@@ -1594,8 +1782,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
switch(new_state)
if("Normal")
if(limb == "head")
- m_style = "None"
- h_style = random_hair_style(gender, species)
+ m_styles["head"] = "None"
+ h_style = hair_styles_list["Bald"]
f_style = facial_hair_styles_list["Shaved"]
organ_data[limb] = null
rlimb_data[limb] = null
@@ -1640,11 +1828,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models
if(subchoice)
choice = subchoice
- if(limb == "head")
- ha_style = "None"
- h_style = hair_styles_list["Bald"]
- f_style = facial_hair_styles_list["Shaved"]
- m_style = "None"
+ if(limb in list("head", "chest", "groin"))
+ if(species != "Machine")
+ return
+ if(limb == "head")
+ ha_style = "None"
+ alt_head = null
+ h_style = hair_styles_list["Bald"]
+ f_style = facial_hair_styles_list["Shaved"]
+ m_styles["head"] = "None"
rlimb_data[limb] = choice
organ_data[limb] = "cyborg"
if(second_limb)
@@ -1655,7 +1847,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
else
rlimb_data[second_limb] = choice
organ_data[second_limb] = "cyborg"
-
if("organs")
var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes")
if(!organ_name) return
@@ -1700,6 +1891,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(unlock_content)
toggles ^= MEMBER_PUBLIC
+ if("donor_public")
+ if(user.client.donator_level >= DONATOR_LEVEL_ONE)
+ toggles ^= DONATOR_PUBLIC
+
if("gender")
if(gender == MALE)
gender = FEMALE
@@ -1847,16 +2042,27 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
//Head-specific
var/obj/item/organ/external/head/H = character.get_organ("head")
+
H.r_hair = r_hair
H.g_hair = g_hair
H.b_hair = b_hair
+ H.r_hair_sec = r_hair_sec
+ H.g_hair_sec = g_hair_sec
+ H.b_hair_sec = b_hair_sec
+
H.r_facial = r_facial
H.g_facial = g_facial
H.b_facial = b_facial
+ H.r_facial_sec = r_facial_sec
+ H.g_facial_sec = g_facial_sec
+ H.b_facial_sec = b_facial_sec
+
H.h_style = h_style
H.f_style = f_style
+
+ H.alt_head = alt_head
//End of head-specific.
character.r_skin = r_skin
@@ -1946,10 +2152,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
H.b_headacc = b_headacc
H.ha_style = ha_style
if(character.species.bodyflags & HAS_MARKINGS)
- character.r_markings = r_markings
- character.g_markings = g_markings
- character.b_markings = b_markings
- character.m_style = m_style
+ character.m_colours = m_colours
+ character.m_styles = m_styles
if(body_accessory)
character.body_accessory = body_accessory_by_name["[body_accessory]"]
diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
index 4506d510754..1425f714183 100644
--- a/code/modules/client/preference/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -110,23 +110,28 @@
hair_red,
hair_green,
hair_blue,
+ secondary_hair_red,
+ secondary_hair_green,
+ secondary_hair_blue,
facial_red,
facial_green,
facial_blue,
+ secondary_facial_red,
+ secondary_facial_green,
+ secondary_facial_blue,
skin_tone,
skin_red,
skin_green,
skin_blue,
- markings_red,
- markings_green,
- markings_blue,
+ marking_colours,
head_accessory_red,
head_accessory_green,
head_accessory_blue,
hair_style_name,
facial_style_name,
- marking_style_name,
+ marking_styles,
head_accessory_style_name,
+ alt_head_name,
eyes_red,
eyes_green,
eyes_blue,
@@ -181,52 +186,57 @@
r_hair = text2num(query.item[8])
g_hair = text2num(query.item[9])
b_hair = text2num(query.item[10])
- r_facial = text2num(query.item[11])
- g_facial = text2num(query.item[12])
- b_facial = text2num(query.item[13])
- s_tone = text2num(query.item[14])
- r_skin = text2num(query.item[15])
- g_skin = text2num(query.item[16])
- b_skin = text2num(query.item[17])
- r_markings = text2num(query.item[18])
- g_markings = text2num(query.item[19])
- b_markings = text2num(query.item[20])
- r_headacc = text2num(query.item[21])
- g_headacc = text2num(query.item[22])
- b_headacc = text2num(query.item[23])
- h_style = query.item[24]
- f_style = query.item[25]
- m_style = query.item[26]
- ha_style = query.item[27]
- r_eyes = text2num(query.item[28])
- g_eyes = text2num(query.item[29])
- b_eyes = text2num(query.item[30])
- underwear = query.item[31]
- undershirt = query.item[32]
- backbag = text2num(query.item[33])
- b_type = query.item[34]
+ r_hair_sec = text2num(query.item[11])
+ g_hair_sec = text2num(query.item[12])
+ b_hair_sec = text2num(query.item[13])
+ r_facial = text2num(query.item[14])
+ g_facial = text2num(query.item[15])
+ b_facial = text2num(query.item[16])
+ r_facial_sec = text2num(query.item[17])
+ g_facial_sec = text2num(query.item[18])
+ b_facial_sec = text2num(query.item[19])
+ s_tone = text2num(query.item[20])
+ r_skin = text2num(query.item[21])
+ g_skin = text2num(query.item[22])
+ b_skin = text2num(query.item[23])
+ m_colours = params2list(query.item[24])
+ r_headacc = text2num(query.item[25])
+ g_headacc = text2num(query.item[26])
+ b_headacc = text2num(query.item[27])
+ h_style = query.item[28]
+ f_style = query.item[29]
+ m_styles = params2list(query.item[30])
+ ha_style = query.item[31]
+ alt_head = query.item[32]
+ r_eyes = text2num(query.item[33])
+ g_eyes = text2num(query.item[34])
+ b_eyes = text2num(query.item[35])
+ underwear = query.item[36]
+ undershirt = query.item[37]
+ backbag = text2num(query.item[38])
+ b_type = query.item[39]
//Jobs
- alternate_option = text2num(query.item[35])
- job_support_high = text2num(query.item[36])
- job_support_med = text2num(query.item[37])
- job_support_low = text2num(query.item[38])
- job_medsci_high = text2num(query.item[39])
- job_medsci_med = text2num(query.item[40])
- job_medsci_low = text2num(query.item[41])
- job_engsec_high = text2num(query.item[42])
- job_engsec_med = text2num(query.item[43])
- job_engsec_low = text2num(query.item[44])
- job_karma_high = text2num(query.item[45])
- job_karma_med = text2num(query.item[46])
- job_karma_low = text2num(query.item[47])
+ alternate_option = text2num(query.item[40])
+ job_support_high = text2num(query.item[41])
+ job_support_med = text2num(query.item[42])
+ job_support_low = text2num(query.item[43])
+ job_medsci_high = text2num(query.item[44])
+ job_medsci_med = text2num(query.item[45])
+ job_medsci_low = text2num(query.item[46])
+ job_engsec_high = text2num(query.item[47])
+ job_engsec_med = text2num(query.item[48])
+ job_engsec_low = text2num(query.item[49])
+ job_karma_high = text2num(query.item[50])
+ job_karma_med = text2num(query.item[51])
+ job_karma_low = text2num(query.item[52])
//Miscellaneous
- flavor_text = query.item[48]
- med_record = query.item[49]
- sec_record = query.item[50]
- gen_record = query.item[51]
+ flavor_text = query.item[53]
+ med_record = query.item[54]
+ sec_record = query.item[55]
+ gen_record = query.item[56]
// Apparently, the preceding vars weren't always encoded properly...
if(findtext(flavor_text, "<")) // ... so let's clumsily check for tags!
flavor_text = html_encode(flavor_text)
@@ -236,17 +246,17 @@
sec_record = html_encode(sec_record)
if(findtext(gen_record, "<"))
gen_record = html_encode(gen_record)
- disabilities = text2num(query.item[52])
- player_alt_titles = params2list(query.item[53])
- organ_data = params2list(query.item[54])
- rlimb_data = params2list(query.item[55])
- nanotrasen_relation = query.item[56]
- speciesprefs = text2num(query.item[57])
+ disabilities = text2num(query.item[57])
+ player_alt_titles = params2list(query.item[58])
+ organ_data = params2list(query.item[59])
+ rlimb_data = params2list(query.item[60])
+ nanotrasen_relation = query.item[61]
+ speciesprefs = text2num(query.item[62])
//socks
- socks = query.item[58]
- body_accessory = query.item[59]
- gear = params2list(query.item[60])
+ socks = query.item[63]
+ body_accessory = query.item[64]
+ gear = params2list(query.item[65])
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
@@ -262,23 +272,30 @@
r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair))
g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair))
b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair))
+ r_hair_sec = sanitize_integer(r_hair_sec, 0, 255, initial(r_hair_sec))
+ g_hair_sec = sanitize_integer(g_hair_sec, 0, 255, initial(g_hair_sec))
+ b_hair_sec = sanitize_integer(b_hair_sec, 0, 255, initial(b_hair_sec))
r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial))
g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial))
b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial))
+ r_facial_sec = sanitize_integer(r_facial_sec, 0, 255, initial(r_facial_sec))
+ g_facial_sec = sanitize_integer(g_facial_sec, 0, 255, initial(g_facial_sec))
+ b_facial_sec = sanitize_integer(b_facial_sec, 0, 255, initial(b_facial_sec))
s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone))
r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin))
g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin))
b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin))
- r_markings = sanitize_integer(r_markings, 0, 255, initial(r_markings))
- g_markings = sanitize_integer(g_markings, 0, 255, initial(g_markings))
- b_markings = sanitize_integer(b_markings, 0, 255, initial(b_markings))
+ for(var/marking_location in m_colours)
+ m_colours[marking_location] = sanitize_hexcolor(m_colours[marking_location], DEFAULT_MARKING_COLOURS[marking_location])
r_headacc = sanitize_integer(r_headacc, 0, 255, initial(r_headacc))
g_headacc = sanitize_integer(g_headacc, 0, 255, initial(g_headacc))
b_headacc = sanitize_integer(b_headacc, 0, 255, initial(b_headacc))
h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style))
f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style))
- m_style = sanitize_inlist(m_style, marking_styles_list, initial(m_style))
+ for(var/marking_location in m_styles)
+ m_styles[marking_location] = sanitize_inlist(m_styles[marking_location], marking_styles_list, DEFAULT_MARKING_STYLES[marking_location])
ha_style = sanitize_inlist(ha_style, head_accessory_styles_list, initial(ha_style))
+ alt_head = sanitize_inlist(alt_head, alt_heads_list, initial(alt_head))
r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes))
g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes))
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
@@ -318,6 +335,9 @@
var/rlimblist
var/playertitlelist
var/gearlist
+
+ var/markingcolourslist = list2params(m_colours)
+ var/markingstyleslist = list2params(m_styles)
if(!isemptylist(organ_data))
organlist = list2params(organ_data)
if(!isemptylist(rlimb_data))
@@ -341,23 +361,28 @@
hair_red='[r_hair]',
hair_green='[g_hair]',
hair_blue='[b_hair]',
+ secondary_hair_red='[r_hair_sec]',
+ secondary_hair_green='[g_hair_sec]',
+ secondary_hair_blue='[b_hair_sec]',
facial_red='[r_facial]',
facial_green='[g_facial]',
facial_blue='[b_facial]',
+ secondary_facial_red='[r_facial_sec]',
+ secondary_facial_green='[g_facial_sec]',
+ secondary_facial_blue='[b_facial_sec]',
skin_tone='[s_tone]',
skin_red='[r_skin]',
skin_green='[g_skin]',
skin_blue='[b_skin]',
- markings_red='[r_markings]',
- markings_green='[g_markings]',
- markings_blue='[b_markings]',
+ marking_colours='[sanitizeSQL(markingcolourslist)]',
head_accessory_red='[r_headacc]',
head_accessory_green='[g_headacc]',
head_accessory_blue='[b_headacc]',
hair_style_name='[sanitizeSQL(h_style)]',
facial_style_name='[sanitizeSQL(f_style)]',
- marking_style_name='[sanitizeSQL(m_style)]',
+ marking_styles='[sanitizeSQL(markingstyleslist)]',
head_accessory_style_name='[sanitizeSQL(ha_style)]',
+ alt_head_name='[sanitizeSQL(alt_head)]',
eyes_red='[r_eyes]',
eyes_green='[g_eyes]',
eyes_blue='[b_eyes]',
@@ -406,14 +431,17 @@
INSERT INTO [format_table_name("characters")] (ckey, slot, OOC_Notes, real_name, name_is_always_random, gender,
age, species, language,
hair_red, hair_green, hair_blue,
+ secondary_hair_red, secondary_hair_green, secondary_hair_blue,
facial_red, facial_green, facial_blue,
+ secondary_facial_red, secondary_facial_green, secondary_facial_blue,
skin_tone, skin_red, skin_green, skin_blue,
- markings_red, markings_green, markings_blue,
+ marking_colours,
head_accessory_red, head_accessory_green, head_accessory_blue,
hair_style_name,
facial_style_name,
- marking_style_name,
+ marking_styles,
head_accessory_style_name,
+ alt_head_name,
eyes_red, eyes_green, eyes_blue,
underwear, undershirt,
backbag, b_type, alternate_option,
@@ -433,14 +461,17 @@
('[C.ckey]', '[default_slot]', '[sanitizeSQL(metadata)]', '[sanitizeSQL(real_name)]', '[be_random_name]','[gender]',
'[age]', '[sanitizeSQL(species)]', '[sanitizeSQL(language)]',
'[r_hair]', '[g_hair]', '[b_hair]',
+ '[r_hair_sec]', '[g_hair_sec]', '[b_hair_sec]',
'[r_facial]', '[g_facial]', '[b_facial]',
+ '[r_facial_sec]', '[g_facial_sec]', '[b_facial_sec]',
'[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]',
- '[r_markings]', '[g_markings]', '[b_markings]',
+ '[sanitizeSQL(markingcolourslist)]',
'[r_headacc]', '[g_headacc]', '[b_headacc]',
'[sanitizeSQL(h_style)]',
'[sanitizeSQL(f_style)]',
- '[sanitizeSQL(m_style)]',
+ '[sanitizeSQL(markingstyleslist)]',
'[sanitizeSQL(ha_style)]',
+ '[sanitizeSQL(alt_head)]',
'[r_eyes]', '[g_eyes]', '[b_eyes]',
'[underwear]', '[undershirt]',
'[backbag]', '[b_type]', '[alternate_option]',
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 9945079b1a5..4ae3e230762 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -411,11 +411,12 @@
var/mob/living/carbon/human/M = src.loc
to_chat(M, "\red The Optical Thermal Scanner overloads and blinds you!")
if(M.glasses == src)
- M.eye_blind = 3
- M.eye_blurry = 5
- M.disabilities |= NEARSIGHTED
- spawn(100)
- M.disabilities &= ~NEARSIGHTED
+ M.EyeBlind(3)
+ M.EyeBlurry(5)
+ if(!(M.disabilities & NEARSIGHTED))
+ M.BecomeNearsighted()
+ spawn(100)
+ M.CureNearsighted()
..()
/obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete
diff --git a/code/modules/clothing/patreon/glasses.dm b/code/modules/clothing/patreon/glasses.dm
new file mode 100644
index 00000000000..8f795b212a2
--- /dev/null
+++ b/code/modules/clothing/patreon/glasses.dm
@@ -0,0 +1,21 @@
+/*
+ Donator Glasses Loadout for Patreon
+*/
+//Kamina shades
+/obj/item/clothing/glasses/fluff/kamina
+ name = "Spiky Orange-tinted Shades"
+ desc = "Row row!"
+ icon_state = "gar"
+ item_state = "gar"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/eyes.dmi'
+ )
+
+
+//Green Kamina shades
+/obj/item/clothing/glasses/fluff/kamina/green
+ name = "Spiky Green-tinted Shades"
+ desc = "Fight the power!"
+ icon_state = "garm"
+ item_state = "garm"
\ No newline at end of file
diff --git a/code/modules/clothing/patreon/hats.dm b/code/modules/clothing/patreon/hats.dm
new file mode 100644
index 00000000000..bfcc69972e4
--- /dev/null
+++ b/code/modules/clothing/patreon/hats.dm
@@ -0,0 +1,63 @@
+/*
+ Donator Loadout for Patreon
+*/
+
+//mushroom hat
+/obj/item/clothing/head/fluff/mushhat
+ name = "Mushroom Hat"
+ desc = "A horrifying display of Nanotrasen's ruthless pursuit in being the forefront of fashion. Or genocide."
+ icon_state = "mushhat"
+ item_state = "mushhat"
+ flags = BLOCKHAIR
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi'
+ )
+
+//gold top hat and recolours
+/obj/item/clothing/head/fluff/goldtophat
+ name = "Gold-trimmed Top Hat"
+ desc = "Poshness incarnate."
+ icon_state = "goldtophat"
+ item_state = "goldtophat"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi'
+ )
+
+
+/obj/item/clothing/head/fluff/goldtophat/blue
+ name = "Gold-trimmed Blue Top Hat"
+ desc = "Poshness incarnate. With blue."
+ icon_state = "goldtophatblue"
+ item_state = "goldtophatblue"
+
+/obj/item/clothing/head/fluff/goldtophat/red
+ name = "Gold-trimmed Red Top Hat"
+ desc = "Poshness incarnate. With red."
+ icon_state = "goldtophatred"
+ item_state = "goldtophatred"
+
+//medieval guard helm
+/obj/item/clothing/head/fluff/guardhelm
+ name = "Plastic Guard helm"
+ desc = "A plastic re-creation of a medieval-era headwear worn by extremely bored recruits of the local army. Kintergarden only."
+ icon_state = "guardhelm"
+ item_state = "guardhelm"
+ flags = BLOCKHAIR
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi'
+ )
+
+//black sombrero
+/obj/item/clothing/head/fluff/blacksombrero
+ name = "Black sombrero"
+ desc = "A rare identifying hat of the infamous ancient renegade gang known as 'El Loco Pocos'"
+ icon_state = "blacksombrero"
+ item_state = "blacksombrero"
+ flags = BLOCKHAIR
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi'
+ )
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index 6fad0961ab4..1c8bd73c47f 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -189,15 +189,11 @@
to_chat(H, "You deploy your hardsuit helmet, sealing you off from the world.")
H.update_inv_head()
-/obj/item/clothing/suit/space/rig/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/clothing/suit/space/rig/attackby(obj/item/W, mob/user, params)
if(!isliving(user))
return
- if(istype(src.loc,/mob/living))
- to_chat(user, "How do you propose to modify a hardsuit while it is being worn?")
- return
-
- if(istype(W,/obj/item/weapon/screwdriver))
+ if(istype(W,/obj/item/weapon/screwdriver) && can_modify(user))
if(!helmet)
to_chat(user, "\The [src] does not have a helmet installed.")
else
@@ -213,7 +209,7 @@
boots = null
return
- else if(istype(W,/obj/item/clothing/head/helmet/space))
+ else if(istype(W,/obj/item/clothing/head/helmet/space) && can_modify(user))
if(!attached_helmet)
to_chat(user, "\The [src] does not have a helmet mount.")
return
@@ -226,7 +222,7 @@
src.helmet = W
return
- else if(istype(W,/obj/item/clothing/shoes/magboots))
+ else if(istype(W,/obj/item/clothing/shoes/magboots) && can_modify(user))
if(!attached_boots)
to_chat(user, "\The [src] does not have boot mounts.")
return
@@ -242,6 +238,13 @@
return ..()
..()
+
+/obj/item/clothing/suit/space/rig/proc/can_modify(mob/living/user)
+ if(isliving(loc))
+ to_chat(user, "You can not modify the hardsuit while it is being worn.")
+ return 0
+
+ return 1
//Engineering rig
/obj/item/clothing/head/helmet/space/rig/engineering
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index fccf464607b..085e57eb25b 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -936,11 +936,6 @@
if(wearer.notransform || !wearer.canmove)
return
- if(locate(/obj/effect/stop/, wearer.loc))
- for(var/obj/effect/stop/S in wearer.loc)
- if(S.victim == wearer)
- return
-
if(!wearer.lastarea)
wearer.lastarea = get_area(wearer.loc)
diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm
index 726de710a1a..a4fad8a16cb 100644
--- a/code/modules/computer3/computers/communications.dm
+++ b/code/modules/computer3/computers/communications.dm
@@ -66,16 +66,21 @@
if("main" in href_list)
state = STATE_DEFAULT
if("login" in href_list)
- var/mob/M = usr
- var/obj/item/I = M.get_active_hand()
+ if(!ishuman(usr))
+ to_chat(usr, "Access denied.")
+ return
+ var/mob/living/carbon/human/H = usr
+ var/obj/item/I = H.get_active_hand()
if(I)
I = I.GetID()
if(istype(I,/obj/item/weapon/card/id) && check_access(I))
authenticated = 1
if(access_captain in I.GetAccess())
authenticated = 2
- crew_announcement.announcer = GetNameAndAssignmentFromId(I)
-
+ var/obj/item/weapon/card/id = H.get_idcard(TRUE)
+ if(istype(id))
+ crew_announcement.announcer = GetNameAndAssignmentFromId(id)
+
if("logout" in href_list)
authenticated = 0
crew_announcement.announcer = ""
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 35e31dc9519..3ced404f91b 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -14,7 +14,7 @@
var/used = 0
/obj/item/device/fluff/tattoo_gun // Generic tattoo gun, make subtypes for different folks
- name = "dispoable tattoo pen"
+ name = "disposable tattoo pen"
desc = "A cheap plastic tattoo application pen."
icon = 'icons/obj/custom_items.dmi'
icon_state = "tatgun"
@@ -22,7 +22,7 @@
throwforce = 0
w_class = 1
var/tattoo_name = "tiger stripe tattoo" // Tat name for visible messages
- var/tattoo_icon = "Tiger Body" // body_accessory.dmi, new icons defined in sprite_accessories.dm
+ var/tattoo_icon = "Tiger-stripe Tattoo" // body_accessory.dmi, new icons defined in sprite_accessories.dm
var/tattoo_r = 1 // RGB values for the body markings
var/tattoo_g = 1
var/tattoo_b = 1
@@ -47,10 +47,15 @@
to_chat(user, "[target] has no skin, how do you expect to tattoo them?")
return
- if(target.m_style != "None")
+ if(target.m_styles["body"] != "None")
to_chat(user, "[target] already has body markings, any more would look silly!")
return
+ var/datum/sprite_accessory/body_markings/tattoo/temp_tatt = marking_styles_list[tattoo_icon]
+ if(!(target.species.name in temp_tatt.species_allowed))
+ to_chat(user, "You can't think of a way to make the [tattoo_name] design work on [target == user ? "your" : "[target]'s"] body type.")
+ return
+
if(target == user)
to_chat(user, "You use the [src] to apply a [tattoo_name] to yourself!")
@@ -61,12 +66,8 @@
user.visible_message("[user] finishes the [tattoo_name] on [target].", "You finish the [tattoo_name].")
if(!used) // No exploiting do_after to tattoo multiple folks.
- target.m_style = tattoo_icon
- target.r_markings = tattoo_r
- target.g_markings = tattoo_g
- target.b_markings = tattoo_b
-
- target.update_markings()
+ target.change_markings(tattoo_icon, "body")
+ target.change_marking_color(rgb(tattoo_r, tattoo_g, tattoo_b), "body")
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
used = 1
@@ -98,9 +99,9 @@
if(!used)
var/ink_color = input("Please select an ink color.", "Tattoo Ink Color", rgb(tattoo_r, tattoo_g, tattoo_b)) as color|null
if(ink_color && !(user.incapacitated() || used) )
- tattoo_r = hex2num(copytext(ink_color, 2, 4))
- tattoo_g = hex2num(copytext(ink_color, 4, 6))
- tattoo_b = hex2num(copytext(ink_color, 6, 8))
+ tattoo_r = color2R(ink_color)
+ tattoo_g = color2G(ink_color)
+ tattoo_b = color2B(ink_color)
to_chat(user, "You change the color setting on the [src].")
@@ -224,6 +225,28 @@
to_chat(target, "You comb your tail with the [src].")
used = 1
+/obj/item/device/fluff/cardgage_helmet_kit //captain cardgage: Richard Ulery
+ name = "welding helmet modkit"
+ desc = "Some spraypaint and a stencil, perfect for painting flames onto a welding helmet!"
+ icon_state = "modkit"
+ w_class = 2
+ force = 0
+ throwforce = 0
+
+/obj/item/device/fluff/cardgage_helmet_kit/afterattack(atom/target, mob/user, proximity)
+ if(!proximity || !ishuman(user) || user.lying)
+ return
+
+ if(istype(target, /obj/item/clothing/head/welding))
+ to_chat(user, "You modify the appearance of [target].")
+
+ var/obj/item/clothing/head/welding/flamedecal/P = new(get_turf(target))
+ transfer_fingerprints_to(P)
+ qdel(target)
+ qdel(src)
+ return
+ to_chat(user, "You can't modify [target]!")
+
#define USED_MOD_HELM 1
#define USED_MOD_SUIT 2
@@ -335,7 +358,7 @@
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.head == src)
- H.slurring = max(3, H.slurring) //always slur
+ H.Slur(3) //always slur
/obj/item/clothing/head/beret/fluff/linda //Epic_Charger: Linda Clark
name = "Green beret"
@@ -423,6 +446,11 @@
/obj/item/clothing/head/hood/fluff/linda //Epic_Charger: Linda Clark
icon_state = "greenhood"
+/obj/item/clothing/suit/armor/shodanscoat // RazekPraxis: SHODAN
+ name = "SHODAN's Captain's Coat"
+ desc = "A black coat with gold trim and an old US Chevron printed on the back. Edgy."
+ icon_state = "shodancoat"
+
//////////// Uniforms ////////////
/obj/item/clothing/under/fluff/kharshai // Kharshai: Athena Castile
name = "Castile formal outfit"
@@ -432,6 +460,15 @@
item_state = "castile_dress"
item_color = "castile_dress"
+/obj/item/clothing/under/fluff/elishirt // FlattestGuitar9: Eli Randolph
+ name = "casual dress shirt"
+ desc = "A soft, white dress shirt paired up with black suit pants. The set looks comfortable."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "elishirt"
+ item_state = "elishirt"
+ item_color = "elishirt"
+ displays_id = 0
+
/obj/item/clothing/under/psysuit/fluff/isaca_sirius_1 // Xilia: Isaca Sirius
name = "Isaca's suit"
desc = "Black, comfortable and nicely fitting suit. Made not to hinder the wearer in any way. Made of some exotic fabric. And some strange glowing jewel at the waist. Name labels says; Property of Isaca Sirius; The Seeder."
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index caca591b90b..b583c04702f 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -123,8 +123,6 @@ log transactions
to_chat(user, "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.")
return
if(get_dist(src,user) <= 1)
- //check to see if the user has low security enabled
- scan_user(user)
add_fingerprint(user)
//js replicated from obj/machinery/computer/card
@@ -252,55 +250,59 @@ log transactions
var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0)
authenticated_account.security_level = new_sec_level
if("attempt_auth")
- if(linked_db && !ticks_left_locked_down)
- var/tried_account_num = text2num(href_list["account_num"])
- if(!tried_account_num)
- tried_account_num = held_card.associated_account_number
- var/tried_pin = text2num(href_list["account_pin"])
+ if(linked_db)
+ // check if they have low security enabled
+ scan_user(usr)
+
+ if(!ticks_left_locked_down && held_card)
+ var/tried_account_num = text2num(href_list["account_num"])
+ if(!tried_account_num)
+ tried_account_num = held_card.associated_account_number
+ var/tried_pin = text2num(href_list["account_pin"])
- authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1)
- if(!authenticated_account)
- number_incorrect_tries++
- if(previous_account_number == tried_account_num)
- if(number_incorrect_tries > max_pin_attempts)
- //lock down the atm
- ticks_left_locked_down = 30
- playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
+ authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1)
+ if(!authenticated_account)
+ number_incorrect_tries++
+ if(previous_account_number == tried_account_num)
+ if(number_incorrect_tries > max_pin_attempts)
+ //lock down the atm
+ ticks_left_locked_down = 30
+ playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
- //create an entry in the account transaction log
- var/datum/money_account/failed_account = linked_db.get_account(tried_account_num)
- if(failed_account)
- var/datum/transaction/T = new()
- T.target_name = failed_account.owner_name
- T.purpose = "Unauthorised login attempt"
- T.source_terminal = machine_id
- T.date = current_date_string
- T.time = worldtime2text()
- failed_account.transaction_log.Add(T)
+ //create an entry in the account transaction log
+ var/datum/money_account/failed_account = linked_db.get_account(tried_account_num)
+ if(failed_account)
+ var/datum/transaction/T = new()
+ T.target_name = failed_account.owner_name
+ T.purpose = "Unauthorised login attempt"
+ T.source_terminal = machine_id
+ T.date = current_date_string
+ T.time = worldtime2text()
+ failed_account.transaction_log.Add(T)
+ else
+ to_chat(usr, "\red [bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
+ previous_account_number = tried_account_num
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
else
- to_chat(usr, "\red [bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
- previous_account_number = tried_account_num
- playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
+ to_chat(usr, "\red [bicon(src)] incorrect pin/account combination entered.")
+ number_incorrect_tries = 0
else
- to_chat(usr, "\red [bicon(src)] incorrect pin/account combination entered.")
- number_incorrect_tries = 0
- else
- playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
- ticks_left_timeout = 120
- view_screen = NO_SCREEN
+ playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
+ ticks_left_timeout = 120
+ view_screen = NO_SCREEN
- //create a transaction log entry
- var/datum/transaction/T = new()
- T.target_name = authenticated_account.owner_name
- T.purpose = "Remote terminal access"
- T.source_terminal = machine_id
- T.date = current_date_string
- T.time = worldtime2text()
- authenticated_account.transaction_log.Add(T)
+ //create a transaction log entry
+ var/datum/transaction/T = new()
+ T.target_name = authenticated_account.owner_name
+ T.purpose = "Remote terminal access"
+ T.source_terminal = machine_id
+ T.date = current_date_string
+ T.time = worldtime2text()
+ authenticated_account.transaction_log.Add(T)
- to_chat(usr, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
+ to_chat(usr, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
- previous_account_number = tried_account_num
+ previous_account_number = tried_account_num
if("withdrawal")
var/amount = max(text2num(href_list["funds_amount"]),0)
if(amount <= 0)
@@ -404,3 +406,5 @@ log transactions
T.date = current_date_string
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
+
+ view_screen = NO_SCREEN
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index 05054f468dd..3bc26b52799 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -1,5 +1,3 @@
-/var/global/sent_aliens_to_station = 0
-
/datum/event/alien_infestation
announceWhen = 400
var/spawncount = 1
@@ -7,8 +5,8 @@
/datum/event/alien_infestation/setup()
announceWhen = rand(announceWhen, announceWhen + 50)
- spawncount = rand(1, 2)
- sent_aliens_to_station = 1
+ if(prob(50))
+ spawncount++
/datum/event/alien_infestation/announce()
if(successSpawn)
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index d7877676b21..a3f302cff9f 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -6,7 +6,7 @@
var/armor = H.getarmor(type = "rad")
if((H.species.flags & RADIMMUNE) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected
continue
- H.hallucination += rand(50, 100)
+ H.AdjustHallucinate(rand(50, 100))
/datum/event/mass_hallucination/announce()
- command_announcement.Announce("It seems that station [station_name()] is passing through a minor radiation field, this may cause some hallucination, but no further damage")
\ No newline at end of file
+ command_announcement.Announce("It seems that station [station_name()] is passing through a minor radiation field, this may cause some hallucination, but no further damage")
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index ffc4882a055..4c120db79e0 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -279,11 +279,11 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir)
var/target_dist = get_dist(src,target)
if(target_dist<=3) //"Eaten"
- target.sleeping = 20
+ target.Sleeping(20)
target.hal_crit = 1
target.hal_screwyhud = 1
spawn(rand(50,100))
- target.sleeping = 0
+ target.SetSleeping(0)
target.hal_crit = 0
target.hal_screwyhud = 0
@@ -480,7 +480,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]!", 1)
my_target.staminaloss += 30
if(prob(20))
- my_target.eye_blurry += 3
+ my_target.AdjustEyeBlurry(3)
if(prob(33))
if(!locate(/obj/effect/overlay) in my_target.loc)
fake_blood(my_target)
@@ -752,11 +752,11 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
halimage = null
if("death")
//Fake death
- src.sleeping = 20
+ Sleeping(20)
hal_crit = 1
hal_screwyhud = 1
spawn(rand(50,100))
- src.sleeping = 0
+ SetSleeping(0)
hal_crit = 0
hal_screwyhud = 0
if("husks")
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 15ce27b7d5c..0814bf988f4 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -81,7 +81,7 @@
refill = reagents.get_master_reagent_id()
refillName = reagents.get_master_reagent_name()
- var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
+ var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
to_chat(user, " You transfer [trans] units of the solution to [target].")
if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
@@ -102,22 +102,22 @@
if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird
return
if(is_hot(I))
- if(src.reagents)
- src.reagents.chem_temp += 15
+ if(reagents)
+ reagents.chem_temp += 15
to_chat(user, "You heat [src] with [I].")
- src.reagents.handle_reactions()
+ reagents.handle_reactions()
/obj/item/weapon/reagent_containers/food/drinks/examine(mob/user)
if(!..(user, 1))
return
- if(!reagents || reagents.total_volume==0)
+ if(!reagents || reagents.total_volume == 0)
to_chat(user, " \The [src] is empty!")
- else if(reagents.total_volume<=src.volume/4)
+ else if(reagents.total_volume <= volume/4)
to_chat(user, " \The [src] is almost empty!")
- else if(reagents.total_volume<=src.volume*0.66)
+ else if(reagents.total_volume <= volume*0.66)
to_chat(user, " \The [src] is half full!")// We're all optimistic, right?!
- else if(reagents.total_volume<=src.volume*0.90)
+ else if(reagents.total_volume <= volume*0.90)
to_chat(user, " \The [src] is almost full!")
else
to_chat(user, " \The [src] is full!")
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 8928c5e8c57..53130d972f4 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -22,9 +22,9 @@
else
user.drop_item()
user.put_in_active_hand(B)
- B.icon_state = src.icon_state
+ B.icon_state = icon_state
- var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
+ var/icon/I = new('icons/obj/drinks.dmi', icon_state)
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I
@@ -99,11 +99,11 @@
//Display an attack message.
if(target != user)
- target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [src.name]!", \
- "[user] has hit [target][head_attack_message] with a bottle of [src.name]!")
+ target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [name]!", \
+ "[user] has hit [target][head_attack_message] with a bottle of [name]!")
else
- user.visible_message("[target] hits \himself with a bottle of [src.name][head_attack_message]!", \
- "[target] hits \himself with a bottle of [src.name][head_attack_message]!")
+ user.visible_message("[target] hits \himself with a bottle of [name][head_attack_message]!", \
+ "[target] hits \himself with a bottle of [name][head_attack_message]!")
//Attack logs
add_logs(user, target, "attacked", src)
@@ -284,7 +284,7 @@
desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by rioters and revolutionaries. Light and toss."
icon_state = "vodkabottle"
list_reagents = list()
- var/list/accelerants = list(/datum/reagent/ethanol,/datum/reagent/fuel,/datum/reagent/clf3,/datum/reagent/phlogiston,
+ var/list/accelerants = list(/datum/reagent/consumable/ethanol,/datum/reagent/fuel,/datum/reagent/clf3,/datum/reagent/phlogiston,
/datum/reagent/napalm,/datum/reagent/hellwater,/datum/reagent/plasma,/datum/reagent/plasma_dust)
var/active = 0
diff --git a/code/modules/food_and_drinks/drinks/drinks/cans.dm b/code/modules/food_and_drinks/drinks/drinks/cans.dm
index 6d72ec2221c..89deed5dedd 100644
--- a/code/modules/food_and_drinks/drinks/drinks/cans.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/cans.dm
@@ -9,7 +9,7 @@
/obj/item/weapon/reagent_containers/food/drinks/cans/attack_self(mob/user)
if(canopened == 0)
- playsound(src.loc,'sound/effects/canopen.ogg', rand(10,50), 1)
+ playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1)
to_chat(user, "You open the drink with an audible pop!")
canopened = 1
flags |= OPENCONTAINER
@@ -32,7 +32,7 @@
if(canopened == 0)
to_chat(user, "You need to open the drink!")
return
- else if(M == user && !src.reagents.total_volume && user.a_intent == "harm" && user.zone_sel.selecting == "head")
+ else if(M == user && !reagents.total_volume && user.a_intent == "harm" && user.zone_sel.selecting == "head")
user.visible_message("[user] crushes ["\the [src]"] on \his forehead!", "You crush \the [src] on your forehead.")
crush(user)
return
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index bc1442038e9..0412c93626b 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -36,523 +36,12 @@
reagents.clear_reagents()
extinguish()
-/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() // *scream
- if(reagents.reagent_list.len > 0)
- switch(reagents.get_master_reagent_id())
- if("beer")
- icon_state = "beerglass"
- name = "Beer glass"
- desc = "A freezing pint of beer"
- if("cider")
- icon_state = "rewriter"
- name = "Cider"
- desc = "a refreshing glass of traditional cider"
- if("beer2")
- icon_state = "beerglass"
- name = "Beer glass"
- desc = "A freezing pint of beer"
- if("ale")
- icon_state = "aleglass"
- name = "Ale glass"
- desc = "A freezing pint of delicious Ale"
- if("milk")
- icon_state = "glass_white"
- name = "Glass of milk"
- desc = "White and nutritious goodness!"
- if("cream")
- icon_state = "glass_white"
- name = "Glass of cream"
- desc = "Ewwww..."
- if("chocolate")
- icon_state = "chocolateglass"
- name = "Glass of chocolate"
- desc = "Tasty"
- if("hot_coco")
- icon_state = "hot_coco"
- name = "Glass of hot coco"
- desc = "Delicious and cozy"
- if("lemonjuice")
- icon_state = "lemonglass"
- name = "Glass of lemonjuice"
- desc = "Sour..."
- if("cola")
- icon_state = "glass_brown"
- name = "Glass of Space Cola"
- desc = "A glass of refreshing Space Cola"
- if("nuka_cola")
- icon_state = "nuka_colaglass"
- name = "Nuka Cola"
- desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland"
- if("orangejuice")
- icon_state = "glass_orange"
- name = "Glass of Orange juice"
- desc = "Vitamins! Yay!"
- if("tomatojuice")
- icon_state = "glass_red"
- name = "Glass of Tomato juice"
- desc = "Are you sure this is tomato juice?"
- if("blood")
- icon_state = "glass_red"
- name = "Glass of Tomato juice"
- desc = "Are you sure this is tomato juice?"
- if("limejuice")
- icon_state = "glass_green"
- name = "Glass of Lime juice"
- desc = "A glass of sweet-sour lime juice."
- if("whiskey")
- icon_state = "whiskeyglass"
- name = "Glass of whiskey"
- desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
- if("gin")
- icon_state = "ginvodkaglass"
- name = "Glass of gin"
- desc = "A crystal clear glass of Griffeater gin."
- if("vodka")
- icon_state = "ginvodkaglass"
- name = "Glass of vodka"
- desc = "The glass contain wodka. Xynta."
- if("sake")
- icon_state = "ginvodkaglass"
- name = "Glass of Sake"
- desc = "A glass of Sake."
- if("goldschlager")
- icon_state = "ginvodkaglass"
- name = "Glass of goldschlager"
- desc = "100 proof that teen girls will drink anything with gold in it."
- if("wine")
- icon_state = "wineglass"
- name = "Glass of wine"
- desc = "A very classy looking drink."
- if("cognac")
- icon_state = "cognacglass"
- name = "Glass of cognac"
- desc = "Damn, you feel like some kind of French aristocrat just by holding this."
- if("kahlua")
- icon_state = "kahluaglass"
- name = "Glass of RR coffee Liquor"
- desc = "DAMN, THIS THING LOOKS ROBUST"
- if("vermouth")
- icon_state = "vermouthglass"
- name = "Glass of Vermouth"
- desc = "You wonder why you're even drinking this straight."
- if("triple_citrus")
- icon_state = "triplecitrus"
- name = "Glass of Triplecitrus Juice"
- desc = "As colorful and healthy as it is delicious."
- if("mojito")
- icon_state = "mojito"
- name = "Glass of Mojito"
- desc = "Fresh from Spesscuba."
- if("tequila")
- icon_state = "tequilaglass"
- name = "Glass of Tequila"
- desc = "Now all that's missing is the weird colored shades!"
- if("patron")
- icon_state = "patronglass"
- name = "Glass of Patron"
- desc = "Drinking patron in the bar, with all the subpar ladies."
- if("rum")
- icon_state = "rumglass"
- name = "Glass of Rum"
- desc = "Now you want to Pray for a pirate suit, don't you?"
- if("absinthe")
- icon_state = "absinthebottle"
- name = "Glass of Absinthe"
- desc = "The green fairy is going to get you now!"
- if("gintonic")
- icon_state = "gintonicglass"
- name = "Gin and Tonic"
- desc = "A mild but still great cocktail. Drink up, like a true Englishman."
- if("ginsonic")
- icon_state = "ginsonic"
- name = "Gin and Sonic"
- desc = "An extremely high amperage drink. Absolutely not for the true Englishman."
- if("whiskeycola")
- icon_state = "whiskeycolaglass"
- name = "Whiskey Cola"
- desc = "An innocent-looking mixture of cola and Whiskey. Delicious."
- if("whiterussian")
- icon_state = "whiterussianglass"
- name = "White Russian"
- desc = "A very nice looking drink. But that's just, like, your opinion, man."
- if("screwdrivercocktail")
- icon_state = "screwdriverglass"
- name = "Screwdriver"
- desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
- if("bloodymary")
- icon_state = "bloodymaryglass"
- name = "Bloody Mary"
- desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder."
- if("martini")
- icon_state = "martiniglass"
- name = "Classic Martini"
- desc = "Damn, the bartender even stirred it, not shook it."
- if("vodkamartini")
- icon_state = "martiniglass"
- name = "Vodka martini"
- desc ="A bastardisation of the classic martini. Still great."
- if("gargleblaster")
- icon_state = "gargleblasterglass"
- name = "Pan-Galactic Gargle Blaster"
- desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy."
- if("bravebull")
- icon_state = "bravebullglass"
- name = "Brave Bull"
- desc = "Tequila and Coffee liquor, brought together in a mouthwatering mixture. Drink up."
- if("tequilasunrise")
- icon_state = "tequilasunriseglass"
- name = "Tequila Sunrise"
- desc = "Oh great, now you feel nostalgic about sunrises back on Terra..."
- if("toxinsspecial")
- icon_state = "toxinsspecialglass"
- name = "Toxins Special"
- desc = "Whoah, this thing is on FIRE"
- if("beepskysmash")
- icon_state = "beepskysmashglass"
- name = "Beepsky Smash"
- desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
- if("doctorsdelight")
- icon_state = "doctorsdelightglass"
- name = "Doctor's Delight"
- desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place."
- if("manlydorf")
- icon_state = "manlydorfglass"
- name = "The Manly Dorf"
- desc = "A manly concotion made from Ale and Beer. Intended for true men only."
- if("irishcream")
- icon_state = "irishcreamglass"
- name = "Irish Cream"
- desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?"
- if("cubalibre")
- icon_state = "cubalibreglass"
- name = "Cuba Libre"
- desc = "A classic mix of rum and cola."
- if("b52")
- icon_state = "b52glass"
- name = "B-52"
- desc = "Kahlua, Irish Cream, and congac. You will get bombed."
- if("atomicbomb")
- icon_state = "atomicbombglass"
- name = "Atomic Bomb"
- desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing."
- if("longislandicedtea")
- icon_state = "longislandicedteaglass"
- name = "Long Island Iced Tea"
- desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
- if("threemileisland")
- icon_state = "threemileislandglass"
- name = "Three Mile Island Ice Tea"
- desc = "A glass of this is sure to prevent a meltdown."
- if("margarita")
- icon_state = "margaritaglass"
- name = "Margarita"
- desc = "On the rocks with salt on the rim. Arriba~!"
- if("blackrussian")
- icon_state = "blackrussianglass"
- name = "Black Russian"
- desc = "For the lactose-intolerant. Still as classy as a White Russian."
- if("vodkatonic")
- icon_state = "vodkatonicglass"
- name = "Vodka and Tonic"
- desc = "For when a gin and tonic isn't russian enough."
- if("manhattan")
- icon_state = "manhattanglass"
- name = "Manhattan"
- desc = "The Detective's undercover drink of choice. He never could stomach gin..."
- if("manhattan_proj")
- icon_state = "proj_manhattanglass"
- name = "Manhattan Project"
- desc = "A scienitst drink of choice, for thinking how to blow up the station."
- if("ginfizz")
- icon_state = "ginfizzglass"
- name = "Gin Fizz"
- desc = "Refreshingly lemony, deliciously dry."
- if("irishcoffee")
- icon_state = "irishcoffeeglass"
- name = "Irish Coffee"
- desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning."
- if("suicider")
- icon_state = "suicider"
- name = "Suicider"
- desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
- if("whiskeysoda")
- icon_state = "whiskeysodaglass2"
- name = "Whiskey Soda"
- desc = "Ultimate refreshment."
- if("tonic")
- icon_state = "glass_clear"
- name = "Glass of Tonic Water"
- desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
- if("sodawater")
- icon_state = "glass_clear"
- name = "Glass of Soda Water"
- desc = "Soda water. Why not make a scotch and soda?"
- if("water")
- icon_state = "glass_clear"
- name = "Glass of Water"
- desc = "The father of all refreshments."
- if("spacemountainwind")
- icon_state = "Space_mountain_wind_glass"
- name = "Glass of Space Mountain Wind"
- desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind."
- if("thirteenloko")
- icon_state = "thirteen_loko_glass"
- name = "Glass of Thirteen Loko"
- desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass"
- if("dr_gibb")
- icon_state = "dr_gibb_glass"
- name = "Glass of Dr. Gibb"
- desc = "Dr. Gibb. Not as dangerous as the name might imply."
- if("space_up")
- icon_state = "space-up_glass"
- name = "Glass of Space-up"
- desc = "Space-up. It helps keep your cool."
- if("moonshine")
- icon_state = "glass_clear"
- name = "Moonshine"
- desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
- if("soymilk")
- icon_state = "glass_white"
- name = "Glass of soy milk"
- desc = "White and nutritious soy goodness!"
- if("berryjuice")
- icon_state = "berryjuice"
- name = "Glass of berry juice"
- desc = "Berry juice. Or maybe its jam. Who cares?"
- if("poisonberryjuice")
- icon_state = "poisonberryjuice"
- name = "Glass of poison berry juice"
- desc = "A glass of deadly juice."
- if("carrotjuice")
- icon_state = "carrotjuice"
- name = "Glass of carrot juice"
- desc = "It is just like a carrot but without crunching."
- if("potato")
- icon_state = "glass_brown"
- name = "Glass of potato juice"
- desc = "Who in the hell requests this? Gross!"
- if("banana")
- icon_state = "banana"
- name = "Glass of banana juice"
- desc = "The raw essence of a banana. HONK"
- if("bahama_mama")
- icon_state = "bahama_mama"
- name = "Bahama Mama"
- desc = "Tropic cocktail"
- if("singulo")
- icon_state = "singulo"
- name = "Singulo"
- desc = "A blue-space beverage."
- if("alliescocktail")
- icon_state = "alliescocktail"
- name = "Allies cocktail"
- desc = "A drink made from your allies."
- if("antifreeze")
- icon_state = "antifreeze"
- name = "Anti-freeze"
- desc = "The ultimate refreshment."
- if("barefoot")
- icon_state = "b&p"
- name = "Barefoot"
- desc = "Barefoot and pregnant"
- if("demonsblood")
- icon_state = "demonsblood"
- name = "Demons Blood"
- desc = "Just looking at this thing makes the hair at the back of your neck stand up."
- if("booger")
- icon_state = "booger"
- name = "Booger"
- desc = "Ewww..."
- if("snowwhite")
- icon_state = "snowwhite"
- name = "Snow White"
- desc = "A cold refreshment."
- if("aloe")
- icon_state = "aloe"
- name = "Aloe"
- desc = "Very, very, very good."
- if("andalusia")
- icon_state = "andalusia"
- name = "Andalusia"
- desc = "A nice, strange named drink."
- if("sbiten")
- icon_state = "sbitenglass"
- name = "Sbiten"
- desc = "A spicy mix of Vodka and Spice. Very hot."
- if("red_mead")
- icon_state = "red_meadglass"
- name = "Red Mead"
- desc = "A True Vikings Beverage, though its color is strange."
- if("mead")
- icon_state = "meadglass"
- name = "Mead"
- desc = "A Vikings Beverage, though a cheap one."
- if("iced_beer")
- icon_state = "iced_beerglass"
- name = "Iced Beer"
- desc = "A beer so frosty, the air around it freezes."
- if("grog")
- icon_state = "grogglass"
- name = "Grog"
- desc = "A fine and cepa drink for Space."
- if("soy_latte")
- icon_state = "soy_latte"
- name = "Soy Latte"
- desc = "A nice and refrshing beverage while you are reading."
- if("cafe_latte")
- icon_state = "cafe_latte"
- name = "Cafe Latte"
- desc = "A nice, strong and refreshing beverage while you are reading."
- if("cafe_mocha")
- icon_state = "cafe_latte"
- name = "Cafe Mocha"
- desc = "The perfect blend of coffe, milk, and chocolate."
- if("acidspit")
- icon_state = "acidspitglass"
- name = "Acid Spit"
- desc = "A drink from Nanotrasen. Made from live aliens."
- if("amasec")
- icon_state = "amasecglass"
- name = "Amasec"
- desc = "Always handy before COMBAT!!!"
- if("neurotoxin")
- icon_state = "neurotoxinglass"
- name = "Neurotoxin"
- desc = "A drink that is guaranteed to knock you silly."
- if("hippiesdelight")
- icon_state = "hippiesdelightglass"
- name = "Hippie's Delight"
- desc = "A drink enjoyed by people during the 1960's."
- if("bananahonk")
- icon_state = "bananahonkglass"
- name = "Banana Honk"
- desc = "A drink from Banana Heaven."
- if("silencer")
- icon_state = "silencerglass"
- name = "Silencer"
- desc = "A drink from mime Heaven."
- if("nothing")
- icon_state = "nothing"
- name = "Nothing"
- desc = "Absolutely nothing."
- if("devilskiss")
- icon_state = "devilskiss"
- name = "Devils Kiss"
- desc = "Creepy time!"
- if("changelingsting")
- icon_state = "changelingsting"
- name = "Changeling Sting"
- desc = "A stingy drink."
- if("irishcarbomb")
- icon_state = "irishcarbomb"
- name = "Irish Car Bomb"
- desc = "An irish car bomb."
- if("syndicatebomb")
- icon_state = "syndicatebomb"
- name = "Syndicate Bomb"
- desc = "A syndicate bomb."
- if("erikasurprise")
- icon_state = "erikasurprise"
- name = "Erika Surprise"
- desc = "The surprise is, it's green!"
- if("driestmartini")
- icon_state = "driestmartiniglass"
- name = "Driest Martini"
- desc = "Only for the experienced. You think you see sand floating in the glass."
- if("ice")
- icon_state = "iceglass"
- name = "Glass of ice"
- desc = "Generally, you're supposed to put something else in there too..."
- if("icecoffee")
- icon_state = "icedcoffeeglass"
- name = "Iced Coffee"
- desc = "A drink to perk you up and refresh you!"
- if("coffee")
- icon_state = "glass_brown"
- name = "Glass of coffee"
- desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere."
- if("bilk")
- icon_state = "glass_brown"
- name = "Glass of bilk"
- desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis."
- if("fuel")
- icon_state = "dr_gibb_glass"
- name = "Glass of welder fuel"
- desc = "Unless you are an industrial tool, this is probably not safe for consumption."
- if("brownstar")
- icon_state = "brownstar"
- name = "Brown Star"
- desc = "Its not what it sounds like..."
- if("tea")
- icon_state = "glass_brown"
- name = "Glass of Tea"
- desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?"
- if("icetea")
- icon_state = "icetea"
- name = "Iced Tea"
- desc = "No relation to a certain rap artist/ actor."
- if("milkshake")
- icon_state = "milkshake"
- name = "Milkshake"
- desc = "Glorious brainfreezing mixture."
- if("lemonade")
- icon_state = "lemonade"
- name = "Lemonade"
- desc = "Oh the nostalgia..."
- if("kiraspecial")
- icon_state = "kiraspecial"
- name = "Kira Special"
- desc = "Long live the guy who everyone had mistaken for a girl. Baka!"
- if("rewriter")
- icon_state = "rewriter"
- name = "Rewriter"
- desc = "The secert of the sanctuary of the Libarian..."
- if("applejack")
- icon_state = "cognacglass"
- name = "Glass of applejack"
- desc = "When cider isn't strong enough, you gotta jack it."
- if("jackrose")
- icon_state = "patronglass"
- name = "Jack Rose"
- desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s."
- if("synthanol")
- icon_state = "synthanolglass"
- name = "Glass of Synthanol"
- desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too."
- if("robottears")
- icon_state = "robottearsglass"
- name = "Glass of Robot Tears"
- desc = "No robots were hurt in the making of this drink."
- if("trinary")
- icon_state = "trinaryglass"
- name = "Glass of Trinary"
- desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well."
- if("servo")
- icon_state = "servoglass"
- name = "Glass of Servo"
- desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe."
- if("synthnsoda")
- icon_state = "synthnsodaglass"
- name = "Glass of Synth 'n Soda"
- desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon."
- if("synthignon")
- icon_state = "synthignonglass"
- name = "Glass of Synthignon"
- desc = "Someone mixed good wine and robot booze. Romantic, but atrocious."
- if("uplink")
- icon_state = "uplinkglass"
- name = "Glass of Uplink"
- desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics."
- if("holywater")
- icon_state = "glass_clear"
- name = "Glass of Water"
- desc = "The father of all refreshments."
-
-
- else
- icon_state ="glass_brown"
- name = "Glass of ..what?"
- desc = "You can't really tell what this is."
+/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change()
+ if(reagents.reagent_list.len)
+ var/datum/reagent/R = reagents.get_master_reagent()
+ icon_state = R.drink_icon
+ name = R.drink_name
+ desc = R.drink_desc
else
icon_state = "glass_empty"
name = "glass"
diff --git a/code/modules/food_and_drinks/food/candy.dm b/code/modules/food_and_drinks/food/candy.dm
index d13eb7ec145..32a4a584a88 100644
--- a/code/modules/food_and_drinks/food/candy.dm
+++ b/code/modules/food_and_drinks/food/candy.dm
@@ -13,9 +13,6 @@
icon = 'icons/obj/food/candy.dmi'
icon_state = "candy"
-/obj/item/weapon/reagent_containers/food/snacks/candy/New()
- ..()
-
// ***********************************************************
// Candy Ingredients / Flavorings / Byproduct
// ***********************************************************
@@ -25,76 +22,53 @@
desc = "Such sweet, fattening food."
icon_state = "chocolatebar"
filling_color = "#7D5F46"
-
-/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("chocolate",4)
bitesize = 2
+ list_reagents = list("nutriment" = 2, "chocolate" = 4)
/obj/item/weapon/reagent_containers/food/snacks/candy/caramel
name = "Caramel"
desc = "Chewy and dense, yet it practically melts in your mouth!"
icon_state = "caramel"
filling_color = "#DB944D"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/caramel/New()
- ..()
- reagents.add_reagent("cream", 2)
- reagents.add_reagent("sugar", 2)
bitesize = 2
+ list_reagents = list("cream" = 2, "sugar" = 2)
+
/obj/item/weapon/reagent_containers/food/snacks/candy/toffee
name = "Toffee"
desc = "A hard, brittle candy with a distinctive taste."
icon_state = "toffee"
filling_color = "#7D5F46"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/toffee/New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("sugar", 3)
bitesize = 2
+ list_reagents = list("nutriment" = 3, "sugar" = 3)
/obj/item/weapon/reagent_containers/food/snacks/candy/nougat
name = "Nougat"
desc = "A soft, chewy candy commonly found in candybars."
icon_state = "nougat"
filling_color = "#7D5F46"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/nougat/New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("sugar", 3)
- spawn(1)
- reagents.del_reagent("egg")
- reagents.update_total()
bitesize = 2
+ list_reagents = list("nutriment" = 3, "sugar" = 3)
/obj/item/weapon/reagent_containers/food/snacks/candy/taffy
name = "Saltwater Taffy"
desc = "Old fashioned saltwater taffy. Chewy!"
icon_state = "candy1"
filling_color = "#7D5F46"
+ bitesize = 2
+ list_reagents = list("nutriment" = 3, "sugar" = 3)
/obj/item/weapon/reagent_containers/food/snacks/candy/taffy/New()
..()
icon_state = pick("candy1", "candy2", "candy3", "candy4", "candy5")
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("sugar", 3)
- bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/candy/fudge
name = "Fudge"
desc = "Chocolate fudge, a timeless classic treat."
icon_state = "fudge"
filling_color = "#7D5F46"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/New()
- ..()
- reagents.add_reagent("cream", 3)
- reagents.add_reagent("chocolate",6)
bitesize = 3
+ list_reagents = list("cream" = 3, "chocolate" = 6)
/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/peanut
name = "Peanut Fudge"
@@ -113,10 +87,7 @@
desc = "An extra creamy fudge with bits of real chocolate cookie mixed in. Crunchy!"
icon_state = "fudge_cookies_n_cream"
filling_color = "#7D5F46"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cookies_n_cream/New()
- ..()
- reagents.add_reagent("cream", 3)
+ list_reagents = list("cream" = 6, "chocolate" = 6)
/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/turtle
name = "Turtle Fudge"
@@ -132,24 +103,16 @@
name = "Donor Candy"
desc = "A little treat for blood donors."
trash = /obj/item/trash/candy
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/donor/New()
- ..()
- reagents.add_reagent("nutriment", 10)
- reagents.add_reagent("sugar", 3)
bitesize = 5
+ list_reagents = list("nutriment" = 10, "sugar" = 3)
/obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn
name = "candy corn"
desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas."
icon_state = "candycorn"
filling_color = "#FFFCB0"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn/New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("sugar", 2)
bitesize = 2
+ list_reagents = list("nutriment" = 4, "sugar" = 2)
// ***********************************************************
// Candy Products (plain / unflavored)
@@ -161,11 +124,8 @@
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#FFFFFF"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/New()
- ..()
- reagents.add_reagent("sugar", 15)
- bitesize = 3
+ bitesize = 4
+ list_reagents = list("sugar" = 15)
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar
name = "candy"
@@ -173,92 +133,64 @@
icon_state = "candy"
trash = /obj/item/trash/candy
filling_color = "#7D5F46"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/candybar/New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("chocolate",5)
bitesize = 3
+ list_reagents = list("nutriment" = 2, "chocolate" = 5)
/obj/item/weapon/reagent_containers/food/snacks/candy/candycane
name = "candy cane"
desc = "A festive mint candy cane."
icon_state = "candycane"
filling_color = "#F2F2F2"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/candycane/New()
- ..()
- reagents.add_reagent("minttoxin", 1)
- reagents.add_reagent("sugar", 5)
bitesize = 2
+ list_reagents = list("minttoxin" = 1, "sugar" = 5)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear
name = "gummy bear"
desc = "A small edible bear. It's squishy and chewy!"
icon_state = "gbear"
filling_color = "#FFFFFF"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/New()
- ..()
- reagents.add_reagent("sugar", 10)
bitesize = 3
+ list_reagents = list("sugar" = 10)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm
name = "gummy worm"
desc = "An edible worm, made from gelatin."
icon_state = "gworm"
filling_color = "#FFFFFF"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/New()
- ..()
- reagents.add_reagent("sugar", 10)
bitesize = 3
+ list_reagents = list("sugar" = 10)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas."
icon_state = "jbean"
filling_color = "#FFFFFF"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/New()
- ..()
- reagents.add_reagent("sugar", 10)
bitesize = 3
+ list_reagents = list("sugar" = 10)
/obj/item/weapon/reagent_containers/food/snacks/candy/jawbreaker
name = "jawbreaker"
desc = "An unbelievably hard candy. The name is fitting."
icon_state = "jawbreaker"
filling_color = "#ED0758"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jawbreaker/New()
- ..()
- reagents.add_reagent("sugar", 10)
bitesize = 0.1 //this is gonna take a while, you'll be working at this all shift.
+ list_reagents = list("sugar" = 10)
/obj/item/weapon/reagent_containers/food/snacks/candy/cash
name = "candy cash"
desc = "Not legal tender. Tasty though."
icon_state = "candy_cash"
filling_color = "#302000"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cash/New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("chocolate", 4)
bitesize = 2
+ list_reagents = list("nutriment" = 2, "chocolate" = 4)
/obj/item/weapon/reagent_containers/food/snacks/candy/coin
name = "chocolate coin"
desc = "Probably won't work in the vending machines."
icon_state = "choc_coin"
filling_color = "#302000"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/coin/New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("chocolate",4)
bitesize = 3
+ list_reagents = list("nutriment" = 2, "chocolate" = 4)
/obj/item/weapon/reagent_containers/food/snacks/candy/gum
name = "bubblegum"
@@ -266,22 +198,15 @@
icon_state = "bubblegum"
trash = /obj/item/trash/gum
filling_color = "#FF7495"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gum/New()
- ..()
- reagents.add_reagent("sugar", 5)
bitesize = 0.2
+ list_reagents = list("sugar" = 5)
/obj/item/weapon/reagent_containers/food/snacks/candy/sucker
name = "sucker"
desc = "For being such a good sport!"
icon_state = "sucker"
filling_color = "#FFFFFF"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/sucker/New()
- ..()
- reagents.add_reagent("sugar", 10)
- bitesize = 1
+ list_reagents = list("sugar" = 10)
// ***********************************************************
// Gummy Bear Flavors
@@ -292,91 +217,56 @@
desc = "A small edible bear. It's red!"
icon_state = "gbear_red"
filling_color = "#801E28"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/red/New()
- ..()
- reagents.add_reagent("cherryjelly", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "cherryjelly" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/blue
name = "gummy bear"
desc = "A small edible bear. It's blue!"
icon_state = "gbear_blue"
filling_color = "#863333"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/blue/New()
- ..()
- reagents.add_reagent("berryjuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "berryjuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/poison
name = "gummy bear"
desc = "A small edible bear. It's blue!"
icon_state = "gbear_blue"
filling_color = "#863353"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/poison/New()
- ..()
- reagents.add_reagent("poisonberryjuice", 12)
- spawn(1)
- reagents.del_reagent("sugar")
- reagents.update_total()
- bitesize = 3
+ list_reagents = list("poisonberryjuice" = 12)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/green
name = "gummy bear"
desc = "A small edible bear. It's green!"
icon_state = "gbear_green"
filling_color = "#365E30"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/green/New()
- ..()
- reagents.add_reagent("limejuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "limejuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/yellow
name = "gummy bear"
desc = "A small edible bear. It's yellow!"
icon_state = "gbear_yellow"
filling_color = "#863333"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/yellow/New()
- ..()
- reagents.add_reagent("lemonjuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "lemonjuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/orange
name = "gummy bear"
desc = "A small edible bear. It's orange!"
icon_state = "gbear_orange"
filling_color = "#E78108"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/orange/New()
- ..()
- reagents.add_reagent("orangejuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "orangejuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/purple
name = "gummy bear"
desc = "A small edible bear. It's purple!"
icon_state = "gbear_purple"
filling_color = "#993399"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/purple/New()
- ..()
- reagents.add_reagent("grapejuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "grapejuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/wtf
name = "gummy bear"
desc = "A small bear. Wait... what?"
icon_state = "gbear_wtf"
filling_color = "#60A584"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/wtf/New()
- ..()
- reagents.add_reagent("space_drugs", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "space_drugs" = 2)
// ***********************************************************
// Gummy Worm Flavors
@@ -387,91 +277,56 @@
desc = "An edible worm, made from gelatin. It's red!"
icon_state = "gworm_red"
filling_color = "#801E28"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/red/New()
- ..()
- reagents.add_reagent("cherryjelly", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "cherryjelly" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/blue
name = "gummy worm"
desc = "An edible worm, made from gelatin. It's blue!"
icon_state = "gworm_blue"
filling_color = "#863333"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/blue/New()
- ..()
- reagents.add_reagent("berryjuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "berryjuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/poison
name = "gummy worm"
desc = "An edible worm, made from gelatin. It's blue!"
icon_state = "gworm_blue"
filling_color = "#863353"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/poison/New()
- ..()
- reagents.add_reagent("poisonberryjuice", 12)
- spawn(1)
- reagents.del_reagent("sugar")
- reagents.update_total()
- bitesize = 3
+ list_reagents = list("poisonberryjuice" = 12)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/green
name = "gummy worm"
desc = "An edible worm, made from gelatin. It's green!"
icon_state = "gworm_green"
filling_color = "#365E30"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/green/New()
- ..()
- reagents.add_reagent("limejuice", 10)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "limejuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/yellow
name = "gummy worm"
desc = "An edible worm, made from gelatin. It's yellow!"
icon_state = "gworm_yellow"
filling_color = "#863333"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/yellow/New()
- ..()
- reagents.add_reagent("lemonjuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "lemonjuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/orange
name = "gummy worm"
desc = "An edible worm, made from gelatin. It's orange!"
icon_state = "gworm_orange"
filling_color = "#E78108"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/orange/New()
- ..()
- reagents.add_reagent("orangejuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "orangejuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/purple
name = "gummy worm"
desc = "An edible worm, made from gelatin. It's purple!"
icon_state = "gworm_purple"
filling_color = "#993399"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/purple/New()
- ..()
- reagents.add_reagent("grapejuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "grapejuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf
name = "gummy worm"
desc = "An edible worm. Did it just move?"
icon_state = "gworm_wtf"
filling_color = "#60A584"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf/New()
- ..()
- reagents.add_reagent("space_drugs", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "space_drugs" = 2)
// ***********************************************************
// Jelly Bean Flavors
@@ -482,146 +337,91 @@
desc = "A candy bean, guarenteed to not give you gas. It's red!"
icon_state = "jbean_red"
filling_color = "#801E28"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/red/New()
- ..()
- reagents.add_reagent("cherryjelly", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "cherryjelly" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/blue
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's blue!"
icon_state = "jbean_blue"
filling_color = "#863333"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/blue/New()
- ..()
- reagents.add_reagent("berryjuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "berryjuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/poison
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's blue!"
icon_state = "jbean_blue"
filling_color = "#863353"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/poison/New()
- ..()
- reagents.add_reagent("poisonberryjuice", 12)
- spawn(1)
- reagents.del_reagent("sugar")
- reagents.update_total()
- bitesize = 3
+ list_reagents = list("poisonberryjuice" = 12)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/green
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's green!"
icon_state = "jbean_green"
filling_color = "#365E30"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/green/New()
- ..()
- reagents.add_reagent("limejuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "limejuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/yellow
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's yellow!"
icon_state = "jbean_yellow"
filling_color = "#863333"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/yellow/New()
- ..()
- reagents.add_reagent("lemonjuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "lemonjuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/orange
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's orange!"
icon_state = "jbean_orange"
filling_color = "#E78108"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/orange/New()
- ..()
- reagents.add_reagent("orangejuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "orangejuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/purple
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's purple!"
icon_state = "jbean_purple"
filling_color = "#993399"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/purple/New()
- ..()
- reagents.add_reagent("grapejuice", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "grapejuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/chocolate
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's chocolate!"
icon_state = "jbean_choc"
filling_color = "#302000"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/chocolate/New()
- ..()
- reagents.add_reagent("chocolate",2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "chocolate" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/popcorn
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's popcorn flavored!"
icon_state = "jbean_popcorn"
filling_color = "#664330"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/popcorn/New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/cola
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's Cola flavored!"
icon_state = "jbean_cola"
filling_color = "#102000"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/cola/New()
- ..()
- reagents.add_reagent("cola", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "cola" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/drgibb
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's Dr. Gibb flavored!"
icon_state = "jbean_cola"
filling_color = "#102000"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/drgibb/New()
- ..()
- reagents.add_reagent("dr_gibb", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "dr_gibb" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/coffee
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's Coffee flavored!"
icon_state = "jbean_choc"
filling_color = "#482000"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/coffee/New()
- ..()
- reagents.add_reagent("coffee", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "coffee" = 2)
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. You aren't sure what color it is."
icon_state = "jbean_wtf"
filling_color = "#60A584"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf/New()
- ..()
- reagents.add_reagent("space_drugs", 2)
- bitesize = 3
+ list_reagents = list("sugar" = 10, "space_drugs" = 2)
// ***********************************************************
// Cotton Candy Flavors
@@ -633,11 +433,7 @@
icon_state = "cottoncandy_red"
trash = /obj/item/weapon/c_tube
filling_color = "#801E28"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/red/New()
- ..()
- reagents.add_reagent("cherryjelly", 5)
- bitesize = 4
+ list_reagents = list("sugar" = 15, "cherryjelly" = 5)
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/blue
name = "cotton candy"
@@ -645,11 +441,7 @@
icon_state = "cottoncandy_blue"
trash = /obj/item/weapon/c_tube
filling_color = "#863333"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/blue/New()
- ..()
- reagents.add_reagent("berryjuice", 5)
- bitesize = 4
+ list_reagents = list("sugar" = 15, "berryjuice" = 5)
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/poison
name = "cotton candy"
@@ -657,14 +449,7 @@
icon_state = "cottoncandy_blue"
trash = /obj/item/weapon/c_tube
filling_color = "#863353"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/poison/New()
- ..()
- reagents.add_reagent("poisonberryjuice", 20)
- spawn(1)
- reagents.del_reagent("sugar")
- reagents.update_total()
- bitesize = 4
+ list_reagents = list("poisonberryjuice" = 20)
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/green
name = "cotton candy"
@@ -672,11 +457,7 @@
icon_state = "cottoncandy_green"
trash = /obj/item/weapon/c_tube
filling_color = "#365E30"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/green/New()
- ..()
- reagents.add_reagent("limejuice", 5)
- bitesize = 4
+ list_reagents = list("sugar" = 15, "limejuice" = 5)
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/yellow
name = "cotton candy"
@@ -684,11 +465,7 @@
icon_state = "cottoncandy_yellow"
trash = /obj/item/weapon/c_tube
filling_color = "#863333"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/yellow/New()
- ..()
- reagents.add_reagent("lemonjuice", 5)
- bitesize = 4
+ list_reagents = list("sugar" = 15, "lemonjuice" = 5)
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/orange
name = "cotton candy"
@@ -696,11 +473,7 @@
icon_state = "cottoncandy_orange"
trash = /obj/item/weapon/c_tube
filling_color = "#E78108"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/orange/New()
- ..()
- reagents.add_reagent("orangejuice", 5)
- bitesize = 4
+ list_reagents = list("sugar" = 15, "orangejuice" = 5)
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/purple
name = "cotton candy"
@@ -708,11 +481,7 @@
icon_state = "cottoncandy_purple"
trash = /obj/item/weapon/c_tube
filling_color = "#993399"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/purple/New()
- ..()
- reagents.add_reagent("grapejuice", 5)
- bitesize = 4
+ list_reagents = list("sugar" = 15, "grapejuice" = 5)
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/pink
name = "cotton candy"
@@ -720,11 +489,7 @@
icon_state = "cottoncandy_pink"
trash = /obj/item/weapon/c_tube
filling_color = "#863333"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/pink/New()
- ..()
- reagents.add_reagent("watermelonjuice", 5)
- bitesize = 4
+ list_reagents = list("sugar" = 15, "watermelonjuice" = 5)
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/rainbow
name = "cotton candy"
@@ -732,14 +497,7 @@
icon_state = "cottoncandy_rainbow"
trash = /obj/item/weapon/c_tube
filling_color = "#C8A5DC"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/rainbow/New()
- ..()
- reagents.add_reagent("omnizine", 20)
- spawn(1)
- reagents.del_reagent("sugar")
- reagents.update_total()
- bitesize = 4
+ list_reagents = list("omnizine" = 20)
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/bad_rainbow
name = "cotton candy"
@@ -747,14 +505,7 @@
icon_state = "cottoncandy_rainbow"
trash = /obj/item/weapon/c_tube
filling_color = "#32127A"
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/bad_rainbow/New()
- ..()
- reagents.add_reagent("sulfonal", 20)
- spawn(1)
- reagents.del_reagent("sugar")
- reagents.update_total()
- bitesize = 4
+ list_reagents = list("sulfonal" = 20)
// ***********************************************************
// Candybar Flavors
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index 931e84b892b..d7ffca96843 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -82,7 +82,7 @@
if(target.reagents.total_volume >= target.reagents.maximum_volume)
to_chat(user, "you can't add anymore to [target]!")
return
- var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
+ var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
to_chat(user, "You transfer [trans] units of the condiment to [target].")
/obj/item/weapon/reagent_containers/food/condiment/on_reagent_change()
@@ -223,7 +223,7 @@
return
else
to_chat(user, "You tear open [src] above [target] and the condiments drip onto it.")
- src.reagents.trans_to(target, amount_per_transfer_from_this)
+ reagents.trans_to(target, amount_per_transfer_from_this)
qdel(src)
/obj/item/weapon/reagent_containers/food/condiment/pack/on_reagent_change()
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 78651f97b0c..77e3f22a1e8 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -1,4 +1,4 @@
-/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP))
var/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich/S = new(get_turf(user))
S.attackby(W,user, params)
@@ -6,13 +6,13 @@
else
..()
-/obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP))
var/obj/item/weapon/reagent_containers/food/snacks/customizable/burger/S = new(get_turf(user))
S.attackby(W,user, params)
qdel(src)
-/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP))
var/obj/item/weapon/reagent_containers/food/snacks/customizable/pizza/S = new(get_turf(user))
S.attackby(W,user, params)
@@ -21,7 +21,7 @@
..()
-/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP))
var/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta/S = new(get_turf(user))
S.attackby(W,user, params)
@@ -30,7 +30,7 @@
..()
-/obj/item/trash/plate/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/trash/plate/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP))
var/obj/item/weapon/reagent_containers/food/snacks/customizable/fullycustom/S = new(get_turf(user))
S.attackby(W,user, params)
@@ -44,7 +44,7 @@
icon = 'icons/obj/food/food.dmi'
icon_state = "soup"
-/obj/item/trash/bowl/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/trash/bowl/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP))
var/obj/item/weapon/reagent_containers/food/snacks/customizable/soup/S = new(get_turf(user))
@@ -54,7 +54,6 @@
..()
/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich
- /obj/item/weapon/reagent_containers/food/snacks/customizable
name = "sandwich"
desc = "A sandwich! A timeless classic."
icon_state = "breadslice"
@@ -79,12 +78,7 @@
trash = /obj/item/trash/plate
bitesize = 2
var/list/ingredients = list()
-
- New()
- ..()
-
- reagents.add_reagent("nutriment", 8)
-
+ list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/customizable/pizza
name = "personal pizza"
@@ -323,7 +317,7 @@
toptype = new /obj/item/weapon/reagent_containers/food/snacks/bun()
/obj/item/weapon/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params)
- if(src.contents.len > sandwich_limit)
+ if(contents.len > sandwich_limit)
to_chat(user, "If you put anything else in or on [src] it's going to make a mess.")
return
if(!istype(I, /obj/item/weapon/reagent_containers/food/snacks))
@@ -351,7 +345,7 @@
for(var/obj/item/O in ingredients)
i++
if(!fullycustom)
- var/image/I = new(src.icon, "[baseicon]_filling")
+ var/image/I = new(icon, "[baseicon]_filling")
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/food = O
if(!food.filling_color == "#FFFFFF")
@@ -372,7 +366,7 @@
overlays += O.overlays
if(top)
- var/image/T = new(src.icon, "[baseicon]_top")
+ var/image/T = new(icon, "[baseicon]_top")
T.pixel_x = pick(list(-1,0,1))
T.pixel_y = (ingredients.len * 2)+1
overlays += T
@@ -388,24 +382,6 @@
to_chat(user, " You think you can see [whatsinside] in there.")
-/*
-/obj/item/weapon/reagent_containers/food/snacks/customizable/attack(mob/M as mob, mob/user as mob, def_zone) //SNOOOOOOOWFLAAAAAAAAAAAAAAAAAKES
-
- var/obj/item/shard
- for(var/obj/item/O in contents)
- if(istype(O,/obj/item/weapon/shard))
- shard = O
- break
-
- var/mob/living/H
- if(istype(M,/mob/living))
- H = M
-
- if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable.
- to_chat(H, "\red You lacerate your mouth on a [shard.name] in the sandwich!")
- H.adjustBruteLoss(5) //TODO: Target head if human.
- ..()
-*/
/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/newname()
var/unsorteditems[0]
@@ -487,7 +463,7 @@
sendback = "[pick(list("absurd","colossal","enormous","ridiculous","massive","oversized","cardiac-arresting","pipe-clogging","edible but sickening","sickening","gargantuan","mega","belly-burster","chest-burster"))] [basename]"
return sendback
-/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/sortlist(var/list/unsorted, var/highest)
+/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/sortlist(list/unsorted, highest)
var/sorted[0]
for(var/i = 1, i<= highest, i++)
for(var/it in unsorted)
diff --git a/code/modules/food_and_drinks/food/meat.dm b/code/modules/food_and_drinks/food/meat.dm
index 76de76530ea..4635f6eb9b1 100644
--- a/code/modules/food_and_drinks/food/meat.dm
+++ b/code/modules/food_and_drinks/food/meat.dm
@@ -4,16 +4,11 @@
icon_state = "meat"
health = 180
filling_color = "#FF1C1C"
- New()
- ..()
- reagents.add_reagent("protein", 3)
- src.bitesize = 3
+ bitesize = 3
+ list_reagents = list("protein" = 3)
-/obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if( \
- istype(W, /obj/item/weapon/kitchen/knife) || \
- istype(W, /obj/item/weapon/scalpel) \
- )
+/obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/kitchen/knife) || istype(W, /obj/item/weapon/scalpel))
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)
@@ -49,6 +44,4 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/ham
name = "Ham"
desc = "Taste like bacon."
- New()
- ..()
- reagents.add_reagent("porktonium", 10)
+ list_reagents = list("protein" = 3, "porktonium" = 10)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/seafood.dm b/code/modules/food_and_drinks/food/seafood.dm
index 410c225247c..c0a95d39315 100644
--- a/code/modules/food_and_drinks/food/seafood.dm
+++ b/code/modules/food_and_drinks/food/seafood.dm
@@ -5,12 +5,8 @@
icon = 'icons/obj/food/seafood.dmi'
icon_state = "fishfillet"
filling_color = "#FFDEFE"
-
- New()
- ..()
- reagents.add_reagent("protein", 3)
- reagents.add_reagent("carpotoxin", 3)
- src.bitesize = 6
+ bitesize = 6
+ list_reagents = list("protein" = 3, "carpotoxin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/salmonmeat
name = "raw salmon"
@@ -18,11 +14,8 @@
icon = 'icons/obj/food/seafood.dmi'
icon_state = "fishfillet"
filling_color = "#FFDEFE"
-
- New()
- ..()
- reagents.add_reagent("protein", 3)
- src.bitesize = 3
+ bitesize = 3
+ list_reagents = list("protein" = 3)
/obj/item/weapon/reagent_containers/food/snacks/salmonsteak
name = "Salmon steak"
@@ -31,14 +24,8 @@
icon_state = "salmonsteak"
trash = /obj/item/trash/plate
filling_color = "#7A3D11"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("sodiumchloride", 1)
- reagents.add_reagent("blackpepper", 1)
- bitesize = 3
-
+ bitesize = 3
+ list_reagents = list("nutriment" = 4, "sodiumchloride" = 1, "blackpepper" = 1)
/obj/item/weapon/reagent_containers/food/snacks/catfishmeat
name = "raw catfish"
@@ -46,11 +33,8 @@
icon = 'icons/obj/food/seafood.dmi'
icon_state = "fishfillet"
filling_color = "#FFDEFE"
-
- New()
- ..()
- reagents.add_reagent("protein", 3)
- src.bitesize = 3
+ bitesize = 3
+ list_reagents = list("protein" = 3)
/obj/item/weapon/reagent_containers/food/snacks/fishfingers
name = "Fish Fingers"
@@ -58,15 +42,8 @@
icon = 'icons/obj/food/seafood.dmi'
icon_state = "fishfingers"
filling_color = "#FFDEFE"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("carpotoxin", 3)
- spawn(1)
- reagents.del_reagent("egg")
- reagents.update_total()
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 4, "carpotoxin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/fishburger
name = "Fillet -o- Carp Sandwich"
@@ -74,12 +51,8 @@
icon = 'icons/obj/food/seafood.dmi'
icon_state = "fishburger"
filling_color = "#FFDEFE"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("carpotoxin", 3)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "carpotoxin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/cubancarp
name = "Cuban Carp"
@@ -88,13 +61,8 @@
icon_state = "cubancarp"
trash = /obj/item/trash/plate
filling_color = "#E9ADFF"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("carpotoxin", 3)
- reagents.add_reagent("capsaicin", 3)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "carpotoxin" = 3, "capsaicin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/fishandchips
name = "Fish and Chips"
@@ -102,168 +70,117 @@
icon = 'icons/obj/food/seafood.dmi'
icon_state = "fishandchips"
filling_color = "#E3D796"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("carpotoxin", 3)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "carpotoxin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/sashimi
name = "carp sashimi"
desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sashimi"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("toxin", 5)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "toxin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/fried_shrimp
name = "fried shrimp"
desc = "Just one of the many things you can do with shrimp!"
icon = 'icons/obj/food/seafood.dmi'
icon_state = "shrimp_fried"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- src.bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/boiled_shrimp
name = "boiled shrimp"
desc = "Just one of the many things you can do with shrimp!"
icon = 'icons/obj/food/seafood.dmi'
icon_state = "shrimp_cooked"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- src.bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/sushi_Ebi
name = "Ebi Sushi"
desc = "A simple sushi consisting of cooked shrimp and rice."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_Ebi"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/sushi_Ikura
name = "Ikura Sushi"
desc = "A simple sushi consisting of salmon roe."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_Ikura"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("protein", 1)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2, "protein" = 1)
/obj/item/weapon/reagent_containers/food/snacks/sushi_Sake
name = "Sake Sushi"
desc = "A simple sushi consisting of raw salmon and rice."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_Sake"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/sushi_SmokedSalmon
name = "Smoked Salmon Sushi"
desc = "A simple sushi consisting of cooked salmon and rice."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_SmokedSalmon"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/sushi_Tamago
name = "Tamago Sushi"
desc = "A simple sushi consisting of egg and rice."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_Tamago"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/sushi_Inari
name = "Inari Sushi"
desc = "A piece of fried tofu stuffed with rice."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_Inari"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/sushi_Masago
name = "Masago Sushi"
desc = "A simple sushi consisting of goldfish roe."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_Masago"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("protein", 1)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2, "protein" = 1)
/obj/item/weapon/reagent_containers/food/snacks/sushi_Tobiko
name = "Tobiko Sushi"
desc = "A simple sushi consisting of shark roe."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_Masago"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("protein", 1)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2, "protein" = 1)
/obj/item/weapon/reagent_containers/food/snacks/sushi_TobikoEgg
name = "Tobiko and Egg Sushi"
desc = "A sushi consisting of shark roe and an egg."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_TobikoEgg"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("protein", 1)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2, "protein" = 1)
/obj/item/weapon/reagent_containers/food/snacks/sushi_Tai
name = "Tai Sushi"
desc = "A simple sushi consisting of catfish and rice."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_Tai"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/sushi_Unagi
name = "Unagi Sushi"
desc = "A simple sushi consisting of eel and rice."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "sushi_Hokki"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 3
\ No newline at end of file
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index d403b4aae4b..49cd0c1fa3b 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -4,7 +4,6 @@
desc = "yummy"
icon = 'icons/obj/food/food.dmi'
icon_state = null
- bitesize = 1
var/bitecount = 0
var/trash = null
var/slice_path
@@ -38,10 +37,10 @@
/obj/item/weapon/reagent_containers/food/snacks/proc/Post_Consume(mob/living/M)
return
-/obj/item/weapon/reagent_containers/food/snacks/attack_self(mob/user as mob)
+/obj/item/weapon/reagent_containers/food/snacks/attack_self(mob/user)
return
-/obj/item/weapon/reagent_containers/food/snacks/attack(mob/M as mob, mob/user as mob, def_zone)
+/obj/item/weapon/reagent_containers/food/snacks/attack(mob/M, mob/user, def_zone)
if(reagents && !reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it.
to_chat(user, "None of [src] left, oh no!")
M.unEquip(src) //so icons update :[
@@ -64,11 +63,11 @@
if(bitecount==0)
return
else if(bitecount==1)
- to_chat(user, "\blue \The [src] was bitten by someone!")
+ to_chat(user, "[src] was bitten by someone!")
else if(bitecount<=3)
- to_chat(user, "\blue \The [src] was bitten [bitecount] times!")
+ to_chat(user, "[src] was bitten [bitecount] times!")
else
- to_chat(user, "\blue \The [src] was bitten multiple times!")
+ to_chat(user, "[src] was bitten multiple times!")
/obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W, mob/user, params)
@@ -93,10 +92,10 @@
"You scoop up some [src] with \the [U]!" \
)
- src.bitecount++
+ bitecount++
U.overlays.Cut()
var/image/I = new(U.icon, "loadedfood")
- I.color = src.filling_color
+ I.color = filling_color
U.overlays += I
var/obj/item/weapon/reagent_containers/food/snacks/collected = new type
@@ -136,7 +135,7 @@
else if(W.w_class <= 2 && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable))
if(!iscarbon(user))
return 1
- to_chat(user, "\red You slip [W] inside [src].")
+ to_chat(user, "You slip [W] inside [src].")
user.unEquip(W)
if((user.client && user.s_active != src))
user.client.screen -= W
@@ -147,28 +146,28 @@
else
return 1
if( \
- !isturf(src.loc) || \
- !(locate(/obj/structure/table) in src.loc) && \
- !(locate(/obj/machinery/optable) in src.loc) && \
- !(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \
+ !isturf(loc) || \
+ !(locate(/obj/structure/table) in loc) && \
+ !(locate(/obj/machinery/optable) in loc) && \
+ !(locate(/obj/item/weapon/storage/bag/tray) in loc) \
)
- to_chat(user, "\red You cannot slice [src] here! You need a table or at least a tray to do it.")
+ to_chat(user, "You cannot slice [src] here! You need a table or at least a tray to do it.")
return 1
var/slices_lost = 0
if(!inaccurate)
user.visible_message( \
- "\blue [user] slices \the [src]!", \
- "\blue You slice \the [src]!" \
+ "[user] slices [src]!", \
+ "You slice [src]!" \
)
else
user.visible_message( \
- "\blue [user] crudely slices \the [src] with [W]!", \
- "\blue You crudely slice \the [src] with your [W]!" \
+ "[user] crudely slices [src] with [W]!", \
+ "You crudely slice [src] with your [W]!" \
)
slices_lost = rand(1,min(1,round(slices_num/2)))
var/reagents_per_slice = reagents.total_volume/slices_num
for(var/i=1 to (slices_num-slices_lost))
- var/obj/slice = new slice_path (src.loc)
+ var/obj/slice = new slice_path (loc)
reagents.trans_to(slice,reagents_per_slice)
qdel(src)
@@ -185,19 +184,19 @@
M.changeNext_move(CLICK_CD_MELEE)
if(iscorgi(M))
if(bitecount >= 4)
- M.visible_message("[M] [pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [src] was")].","You swallow up the last part of \the [src].")
- playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
+ M.visible_message("[M] [pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where [src] was")].","You swallow up the last part of [src].")
+ playsound(loc,'sound/items/eatfood.ogg', rand(10,50), 1)
var/mob/living/simple_animal/pet/corgi/C = M
C.adjustBruteLoss(-5)
C.adjustFireLoss(-5)
qdel(src)
else
- M.visible_message("[M] takes a bite of \the [src].","You take a bite of \the [src].")
- playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
+ M.visible_message("[M] takes a bite of [src].","You take a bite of [src].")
+ playsound(loc,'sound/items/eatfood.ogg', rand(10,50), 1)
bitecount++
else if(ismouse(M))
var/mob/living/simple_animal/mouse/N = M
- to_chat(N, text("\blue You nibble away at [src]."))
+ to_chat(N, text("You nibble away at [src]."))
if(prob(50))
N.visible_message("[N] nibbles away at [src].", "")
//N.emote("nibbles away at the [src]")
@@ -255,49 +254,8 @@
icon_state = "aesirsalad"
trash = /obj/item/trash/snack_bowl
filling_color = "#468C00"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("omnizine", 8)
- bitesize = 3
-
-/*
-/obj/item/weapon/reagent_containers/food/snacks/candy
- name = "candy"
- desc = "Nougat, love it or hate it."
- icon_state = "candy"
- trash = /obj/item/trash/candy
- filling_color = "#7D5F46"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 1)
- reagents.add_reagent("sugar", 3)
- bitesize = 2
-
-/obj/item/weapon/reagent_containers/food/snacks/candy/donor
- name = "Donor Candy"
- desc = "A little treat for blood donors."
- trash = /obj/item/trash/candy
- New()
- ..()
- reagents.add_reagent("nutriment", 10)
- reagents.add_reagent("sugar", 3)
- bitesize = 5
-
-/obj/item/weapon/reagent_containers/food/snacks/candy_corn
- name = "candy corn"
- desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas."
- icon_state = "candy_corn"
- filling_color = "#FFFCB0"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("sugar", 2)
- bitesize = 2
-*/
+ bitesize = 3
+ list_reagents = list("nutriment" = 8, "omnizine" = 8)
/obj/item/weapon/reagent_containers/food/snacks/chips
name = "chips"
@@ -305,12 +263,7 @@
icon_state = "chips"
trash = /obj/item/trash/chips
filling_color = "#E8C31E"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("sodiumchloride", 1)
- bitesize = 1
+ list_reagents = list("nutriment" = 3, "sodiumchloride" = 1)
/obj/item/weapon/reagent_containers/food/snacks/cornchips
name = "corn chips"
@@ -318,123 +271,79 @@
icon_state = "chips"
trash = /obj/item/trash/chips
filling_color = "#E8C31E"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- bitesize = 1
+ list_reagents = list("nutriment" = 3)
/obj/item/weapon/reagent_containers/food/snacks/cookie
name = "cookie"
desc = "COOKIE!!!"
icon_state = "COOKIE!!!"
filling_color = "#DBC94F"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 5)
- bitesize = 1
+ list_reagents = list("nutriment" = 5)
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
name = "Chocolate Bar"
desc = "Such sweet, fattening food."
icon_state = "chocolatebar"
filling_color = "#7D5F46"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("chocolate",4)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 2, "chocolate" = 4)
/obj/item/weapon/reagent_containers/food/snacks/choc_pile //for reagent chocolate being spilled on turfs
name = "Pile of Chocolate"
desc = "A pile of pure chocolate pieces."
icon_state = "cocoa"
filling_color = "#7D5F46"
-
- New()
- ..()
- reagents.add_reagent("chocolate",5) //no longer can be used to generate the reagent infinitely
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("chocolate" = 5)
/obj/item/weapon/reagent_containers/food/snacks/chocolateegg
name = "Chocolate Egg"
desc = "Such sweet, fattening food."
icon_state = "chocolateegg"
filling_color = "#7D5F46"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("chocolate",4)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 3, "chocolate" = 4)
/obj/item/weapon/reagent_containers/food/snacks/donut
name = "donut"
desc = "Goes great with Robust Coffee."
icon_state = "donut1"
filling_color = "#D9C386"
+ bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/donut/normal
name = "donut"
desc = "Goes great with Robust Coffee."
icon_state = "donut1"
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("sprinkles", 1)
- src.bitesize = 3
- if(prob(30))
- src.icon_state = "donut2"
- src.name = "frosted donut"
- reagents.add_reagent("sprinkles", 2)
+ list_reagents = list("nutriment" = 3, "sprinkles" = 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/donut/normal/New()
+ ..()
+ if(prob(30))
+ icon_state = "donut2"
+ name = "frosted donut"
+ reagents.add_reagent("sprinkles", 2)
/obj/item/weapon/reagent_containers/food/snacks/donut/sprinkles
name = "frosted donut"
icon_state = "donut2"
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("sprinkles", 3)
+ list_reagents = list("nutriment" = 3, "sprinkles" = 3)
/obj/item/weapon/reagent_containers/food/snacks/donut/chaos
name = "Chaos Donut"
desc = "Like life, it never quite tastes the same."
icon_state = "donut1"
filling_color = "#ED11E6"
+ bitesize = 10
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("sprinkles", 1)
- bitesize = 10
- var/chaosselect = pick(1,2,3,4,5,6,7,8,9,10)
- switch(chaosselect)
- if(1)
- reagents.add_reagent("nutriment", 3)
- if(2)
- reagents.add_reagent("capsaicin", 3)
- if(3)
- reagents.add_reagent("frostoil", 3)
- if(4)
- reagents.add_reagent("sprinkles", 3)
- if(5)
- reagents.add_reagent("plasma", 3)
- if(6)
- reagents.add_reagent("chocolate", 3)
- if(7)
- reagents.add_reagent("slimejelly", 3)
- if(8)
- reagents.add_reagent("banana", 3)
- if(9)
- reagents.add_reagent("berryjuice", 3)
- if(10)
- reagents.add_reagent("omnizine", 3)
- if(prob(30))
- src.icon_state = "donut2"
- src.name = "Frosted Chaos Donut"
- reagents.add_reagent("sprinkles", 2)
+/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New()
+ ..()
+ var/extra_reagent = pick("nutriment", "capsaicin", "frostoil", "sprinkles", "plasma", "chocolate", "slimejelly", "banana", "berryjuice", "omnizine")
+ reagents.add_reagent("[extra_reagent]", 3)
+ if(prob(30))
+ icon_state = "donut2"
+ name = "Frosted Chaos Donut"
+ reagents.add_reagent("sprinkles", 2)
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly
@@ -442,85 +351,75 @@
desc = "You jelly?"
icon_state = "jdonut1"
filling_color = "#ED1169"
+ bitesize = 5
+ list_reagents = list("nutriment" = 3, "sprinkles" = 1, "berryjuice" = 5)
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("sprinkles", 1)
- reagents.add_reagent("berryjuice", 5)
- bitesize = 5
- if(prob(30))
- src.icon_state = "jdonut2"
- src.name = "Frosted Jelly Donut"
- reagents.add_reagent("sprinkles", 2)
+/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New()
+ ..()
+ if(prob(30))
+ icon_state = "jdonut2"
+ name = "Frosted Jelly Donut"
+ reagents.add_reagent("sprinkles", 2)
/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly
name = "Jelly Donut"
desc = "You jelly?"
icon_state = "jdonut1"
filling_color = "#ED1169"
+ bitesize = 5
+ list_reagents = list("nutriment" = 3, "sprinkles" = 1, "slimejelly" = 5)
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("sprinkles", 1)
- reagents.add_reagent("slimejelly", 5)
- bitesize = 5
- if(prob(30))
- src.icon_state = "jdonut2"
- src.name = "Frosted Jelly Donut"
- reagents.add_reagent("sprinkles", 2)
+/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly/New()
+ ..()
+ if(prob(30))
+ icon_state = "jdonut2"
+ name = "Frosted Jelly Donut"
+ reagents.add_reagent("sprinkles", 2)
/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly
name = "Jelly Donut"
desc = "You jelly?"
icon_state = "jdonut1"
filling_color = "#ED1169"
+ bitesize = 5
+ list_reagents = list("nutriment" = 3, "sprinkles" = 1, "cherryjelly" = 5)
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("sprinkles", 1)
- reagents.add_reagent("cherryjelly", 5)
- bitesize = 5
- if(prob(30))
- src.icon_state = "jdonut2"
- src.name = "Frosted Jelly Donut"
- reagents.add_reagent("sprinkles", 2)
+/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly/New()
+ ..()
+ if(prob(30))
+ icon_state = "jdonut2"
+ name = "Frosted Jelly Donut"
+ reagents.add_reagent("sprinkles", 2)
/obj/item/weapon/reagent_containers/food/snacks/egg
name = "egg"
desc = "An egg!"
icon_state = "egg"
filling_color = "#FDFFD1"
+ list_reagents = list("protein" = 1, "egg" = 5)
- New()
+/obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom)
+ ..()
+ var/turf/T = get_turf(hit_atom)
+ new/obj/effect/decal/cleanable/egg_smudge(T)
+ if(reagents)
+ reagents.reaction(hit_atom, TOUCH)
+ qdel(src)
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype( W, /obj/item/toy/crayon ))
+ var/obj/item/toy/crayon/C = W
+ var/clr = C.colourName
+
+ if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow")))
+ to_chat(usr, "The egg refuses to take on this color!")
+ return
+
+ to_chat(usr, "You color \the [src] [clr]")
+ icon_state = "egg-[clr]"
+ item_color = clr
+ else
..()
- reagents.add_reagent("protein", 1)
- reagents.add_reagent("egg", 5)
-
- throw_impact(atom/hit_atom)
- ..()
- var/turf/T = get_turf(hit_atom)
- new/obj/effect/decal/cleanable/egg_smudge(T)
- if(reagents)
- reagents.reaction(hit_atom, TOUCH)
- qdel(src)
-
- attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype( W, /obj/item/toy/crayon ))
- var/obj/item/toy/crayon/C = W
- var/clr = C.colourName
-
- if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow")))
- to_chat(usr, "\blue The egg refuses to take on this color!")
- return
-
- to_chat(usr, "\blue You color \the [src] [clr]")
- icon_state = "egg-[clr]"
- item_color = clr
- else
- ..()
/obj/item/weapon/reagent_containers/food/snacks/egg/blue
icon_state = "egg-blue"
@@ -559,25 +458,14 @@
desc = "A fried egg, with a touch of salt and pepper."
icon_state = "friedegg"
filling_color = "#FFDF78"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("egg", 5)
- reagents.add_reagent("sodiumchloride", 1)
- reagents.add_reagent("blackpepper", 1)
- bitesize = 1
+ list_reagents = list("nutriment" = 2, "egg" = 5, "sodiumchloride" = 1, "blackpepper" = 1)
/obj/item/weapon/reagent_containers/food/snacks/boiledegg
name = "Boiled egg"
desc = "A hard boiled egg."
icon_state = "egg"
filling_color = "#FFFFFF"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("egg", 5)
+ list_reagents = list("nutriment" = 2, "egg" = 5)
/obj/item/weapon/reagent_containers/food/snacks/organ
@@ -586,11 +474,8 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "appendix"
filling_color = "#E00D34"
-
- New()
- ..()
- reagents.add_reagent("protein", 4)
- src.bitesize = 3
+ bitesize = 3
+ list_reagents = list("protein" = 4)
/obj/item/weapon/reagent_containers/food/snacks/appendix
//yes, this is the same as meat. I might do something different in future
@@ -599,11 +484,8 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "appendix"
filling_color = "#E00D34"
-
- New()
- ..()
- reagents.add_reagent("protein", 3)
- src.bitesize = 3
+ bitesize = 3
+ list_reagents = list("protein" = 3)
/obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed
name = "inflamed appendix"
@@ -616,179 +498,125 @@
icon_state = "tofu"
desc = "We all love tofu."
filling_color = "#FFFEE0"
-
- New()
- ..()
- reagents.add_reagent("plantmatter", 3)
- src.bitesize = 3
+ bitesize = 3
+ list_reagents = list("plantmatter" = 3)
/obj/item/weapon/reagent_containers/food/snacks/fried_tofu
name = "Fried Tofu"
icon_state = "tofu"
desc = "Proof that even vegetarians crave unhealthy foods."
filling_color = "#FFFEE0"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- src.bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 3)
/obj/item/weapon/reagent_containers/food/snacks/tofurkey
name = "Tofurkey"
desc = "A fake turkey made from tofu."
icon_state = "tofurkey"
filling_color = "#FFFEE0"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 12)
- reagents.add_reagent("ether", 3)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 12, "ether" = 3)
/obj/item/weapon/reagent_containers/food/snacks/stuffing
name = "Stuffing"
desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!"
icon_state = "stuffing"
filling_color = "#C9AC83"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- bitesize = 1
+ list_reagents = list("nutriment" = 3)
/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice
name = "huge mushroom slice"
desc = "A slice from a huge mushroom."
icon_state = "hugemushroomslice"
filling_color = "#E0D7C5"
-
- New()
- ..()
- reagents.add_reagent("plantmatter", 3)
- reagents.add_reagent("psilocybin", 3)
- src.bitesize = 6
+ bitesize = 6
+ list_reagents = list("plantmatter" = 3, "psilocybin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/tomatomeat
name = "tomato slice"
desc = "A slice from a huge tomato"
icon_state = "tomatomeat"
filling_color = "#DB0000"
-
- New()
- ..()
- reagents.add_reagent("protein", 3)
- src.bitesize = 6
+ bitesize = 6
+ list_reagents = list("protein" = 3)
/obj/item/weapon/reagent_containers/food/snacks/bearmeat
name = "bear meat"
desc = "A very manly slab of meat."
icon_state = "bearmeat"
filling_color = "#DB0000"
-
- New()
- ..()
- reagents.add_reagent("protein", 12)
- reagents.add_reagent("methamphetamine", 5)
- src.bitesize = 3
+ bitesize = 3
+ list_reagents = list("protein" = 12, "methamphetamine" = 5)
/obj/item/weapon/reagent_containers/food/snacks/xenomeat
name = "meat"
desc = "A slab of meat"
icon_state = "xenomeat"
filling_color = "#43DE18"
-
- New()
- ..()
- reagents.add_reagent("protein", 3)
- src.bitesize = 6
+ bitesize = 6
+ list_reagents = list("protein" = 3)
/obj/item/weapon/reagent_containers/food/snacks/spidermeat
name = "spider meat"
desc = "A slab of spider meat."
icon_state = "spidermeat"
- New()
- ..()
- reagents.add_reagent("protein", 3)
- reagents.add_reagent("toxin", 3)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("protein" = 3, "toxin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/lizardmeat
name = "mutant lizard meat"
desc = "Seems to be a slab of meat from some mutant lizard thing?"
icon_state = "xenomeat"
filling_color = "#43DE18"
-
- New()
- ..()
- reagents.add_reagent("protein", 3)
- reagents.add_reagent("toxin", 3)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("protein" = 3, "toxin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/spiderleg
name = "spider leg"
desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?"
icon_state = "spiderleg"
- New()
- ..()
- reagents.add_reagent("protein", 2)
- reagents.add_reagent("toxin", 2)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 2, "toxin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/meatball
name = "Meatball"
desc = "A great meal all round."
icon_state = "meatball"
filling_color = "#DB0000"
- New()
- ..()
- reagents.add_reagent("protein", 3)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 3)
/obj/item/weapon/reagent_containers/food/snacks/sausage
name = "Sausage"
desc = "A piece of mixed, long meat."
icon_state = "sausage"
filling_color = "#DB0000"
-
- New()
- ..()
- reagents.add_reagent("protein", 6)
- reagents.add_reagent("porktonium", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 6, "porktonium" = 10)
/obj/item/weapon/reagent_containers/food/snacks/donkpocket
name = "Donk-pocket"
desc = "The food of choice for the seasoned traitor."
icon_state = "donkpocket"
filling_color = "#DEDEAB"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
+ list_reagents = list("nutriment" = 4)
/obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket
name = "Warm Donk-pocket"
desc = "The food of choice for the seasoned traitor."
icon_state = "donkpocket"
filling_color = "#DEDEAB"
+ list_reagents = list("nutriment" = 4)
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
-
- Post_Consume(mob/living/M)
- M.reagents.add_reagent("omnizine", 15)
+/obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket/Post_Consume(mob/living/M)
+ M.reagents.add_reagent("omnizine", 15)
/obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket_weak
name = "Lightly Warm Donk-pocket"
desc = "The food of choice for the seasoned traitor. This one is lukewarm."
icon_state = "donkpocket"
filling_color = "#DEDEAB"
-
-/obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket_weak/New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("weak_omnizine", 3)
+ list_reagents = list("nutriment" = 4, "weak_omnizine" = 3)
/obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket
name = "Donk-pocket"
@@ -796,42 +624,31 @@
icon_state = "donkpocket"
filling_color = "#DEDEAB"
bitesize = 100 //nom the whole thing at once.
+ list_reagents = list("nutriment" = 1)
- New()
- ..()
- reagents.add_reagent("nutriment", 1)
-
- Post_Consume(mob/living/M)
- M.reagents.add_reagent("omnizine", 15)
- M.reagents.add_reagent("teporone", 15)
- M.reagents.add_reagent("synaptizine", 15)
- M.reagents.add_reagent("salglu_solution", 15)
- M.reagents.add_reagent("salbutamol", 15)
- M.reagents.add_reagent("methamphetamine", 15)
+/obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket/Post_Consume(mob/living/M)
+ M.reagents.add_reagent("omnizine", 15)
+ M.reagents.add_reagent("teporone", 15)
+ M.reagents.add_reagent("synaptizine", 15)
+ M.reagents.add_reagent("salglu_solution", 15)
+ M.reagents.add_reagent("salbutamol", 15)
+ M.reagents.add_reagent("methamphetamine", 15)
/obj/item/weapon/reagent_containers/food/snacks/brainburger
name = "brainburger"
desc = "A strange looking burger. It looks almost sentient."
icon_state = "brainburger"
filling_color = "#F2B6EA"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("prions", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6, "prions" = 10)
/obj/item/weapon/reagent_containers/food/snacks/ghostburger
name = "Ghost Burger"
desc = "Spooky! It doesn't look very filling."
icon_state = "ghostburger"
filling_color = "#FFF2FF"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 2
-
+ bitesize = 2
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/human
var/hname = ""
@@ -842,52 +659,38 @@
name = "-burger"
desc = "A bloody burger."
icon_state = "hburger"
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/cheeseburger
name = "cheeseburger"
desc = "The cheese adds a good flavor."
icon_state = "cheeseburger"
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/monkeyburger
name = "burger"
desc = "The cornerstone of every nutritious breakfast."
icon_state = "hburger"
filling_color = "#D63C3C"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/tofuburger
name = "Tofu Burger"
desc = "What.. is that meat?"
icon_state = "tofuburger"
filling_color = "#FFFEE0"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/roburger
name = "roburger"
desc = "The lettuce is the only organic component. Beep."
icon_state = "roburger"
filling_color = "#CCCCCC"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("nanomachines", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 2, "nanomachines" = 10)
/obj/item/weapon/reagent_containers/food/snacks/roburgerbig
name = "roburger"
@@ -895,49 +698,32 @@
icon_state = "roburger"
filling_color = "#CCCCCC"
volume = 100
-
- New()
- ..()
- reagents.add_reagent("nanomachines", 100)
- bitesize = 0.1
+ bitesize = 0.1
+ list_reagents = list("nanomachines" = 100)
/obj/item/weapon/reagent_containers/food/snacks/xenoburger
name = "xenoburger"
desc = "Smells caustic. Tastes like heresy."
icon_state = "xburger"
filling_color = "#43DE18"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/clownburger
name = "Clown Burger"
desc = "This tastes funny..."
icon_state = "clownburger"
filling_color = "#FF00FF"
-
- New()
- ..()
-/*
- var/datum/disease/F = new /datum/disease/pierrot_throat(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 4, data)
-*/
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/mimeburger
name = "Mime Burger"
desc = "Its taste defies language."
icon_state = "mimeburger"
filling_color = "#FFFFFF"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/omelette
name = "Omelette Du Fromage"
@@ -945,23 +731,15 @@
icon_state = "omelette"
trash = /obj/item/trash/plate
filling_color = "#FFF9A8"
-
- //var/herp = 0
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- bitesize = 1
+ list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/muffin
name = "Muffin"
desc = "A delicious and spongy little cake"
icon_state = "muffin"
filling_color = "#E0CF9B"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/pie
name = "Banana Cream Pie"
@@ -969,17 +747,13 @@
icon_state = "pie"
trash = /obj/item/trash/plate
filling_color = "#FBFFB8"
-
-/obj/item/weapon/reagent_containers/food/snacks/pie/New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("banana",5)
bitesize = 3
+ list_reagents = list("nutriment" = 4, "banana" = 5)
/obj/item/weapon/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom)
..()
- new/obj/effect/decal/cleanable/pie_smudge(src.loc)
- src.visible_message("\red [src.name] splats.","\red You hear a splat.")
+ new/obj/effect/decal/cleanable/pie_smudge(loc)
+ visible_message("[src] splats.","You hear a splat.")
qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/berryclafoutis
@@ -987,11 +761,8 @@
desc = "No black birds, this is a good sign."
icon_state = "berryclafoutis"
trash = /obj/item/trash/plate
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("berryjuice", 5)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 4, "berryjuice" = 5)
/obj/item/weapon/reagent_containers/food/snacks/waffles
name = "waffles"
@@ -999,11 +770,8 @@
icon_state = "waffles"
trash = /obj/item/trash/waffles
filling_color = "#E6DEB5"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/eggplantparm
name = "Eggplant Parmigiana"
@@ -1011,11 +779,8 @@
icon_state = "eggplantparm"
trash = /obj/item/trash/plate
filling_color = "#4D2F5E"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/soylentgreen
name = "Soylent Green"
@@ -1023,11 +788,8 @@
icon_state = "soylent_green"
trash = /obj/item/trash/waffles
filling_color = "#B8E6B5"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 10)
/obj/item/weapon/reagent_containers/food/snacks/soylenviridians
name = "Soylen Virdians"
@@ -1035,12 +797,8 @@
icon_state = "soylent_yellow"
trash = /obj/item/trash/waffles
filling_color = "#E6FA61"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 10)
- bitesize = 2
-
+ bitesize = 2
+ list_reagents = list("nutriment" = 10)
/obj/item/weapon/reagent_containers/food/snacks/meatpie
name = "Meat-pie"
@@ -1048,11 +806,8 @@
desc = "An old barber recipe, very delicious!"
trash = /obj/item/trash/plate
filling_color = "#948051"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 10)
/obj/item/weapon/reagent_containers/food/snacks/tofupie
name = "Tofu-pie"
@@ -1060,42 +815,31 @@
desc = "A delicious tofu pie."
trash = /obj/item/trash/plate
filling_color = "#FFFEE0"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 10)
/obj/item/weapon/reagent_containers/food/snacks/amanita_pie
name = "amanita pie"
desc = "Sweet and tasty poison pie."
icon_state = "amanita_pie"
filling_color = "#FFCCCC"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 5)
- reagents.add_reagent("amanitin", 3)
- reagents.add_reagent("psilocybin", 1)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 5, "amanitin" = 3, "psilocybin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/plump_pie
name = "plump pie"
desc = "I bet you love stuff made out of plump helmets!"
icon_state = "plump_pie"
filling_color = "#B8279B"
+ bitesize = 2
+ list_reagents = list("nutriment" = 8)
- New()
- ..()
- if(prob(10))
- name = "exceptional plump pie"
- desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!"
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("omnizine", 5)
- bitesize = 2
- else
- reagents.add_reagent("nutriment", 8)
- bitesize = 2
+/obj/item/weapon/reagent_containers/food/snacks/plump_pie/New()
+ ..()
+ if(prob(10))
+ name = "exceptional plump pie"
+ desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" // What
+ reagents.add_reagent("omnizine", 5)
/obj/item/weapon/reagent_containers/food/snacks/xemeatpie
name = "Xeno-pie"
@@ -1103,11 +847,8 @@
desc = "A delicious meatpie. Probably heretical."
trash = /obj/item/trash/plate
filling_color = "#43DE18"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 10)
/obj/item/weapon/reagent_containers/food/snacks/wingfangchu
name = "Wing Fang Chu"
@@ -1115,12 +856,8 @@
icon_state = "wingfangchu"
trash = /obj/item/trash/snack_bowl
filling_color = "#43DE18"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
-
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/human/kabob
name = "-kabob"
@@ -1128,11 +865,8 @@
desc = "A human meat, on a stick."
trash = /obj/item/stack/rods
filling_color = "#A85340"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/monkeykabob
name = "Meat-kabob"
@@ -1140,11 +874,8 @@
desc = "Delicious meat, on a stick."
trash = /obj/item/stack/rods
filling_color = "#A85340"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/tofukabob
name = "Tofu-kabob"
@@ -1152,11 +883,8 @@
desc = "Vegan meat, on a stick."
trash = /obj/item/stack/rods
filling_color = "#FFFEE0"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/popcorn
name = "Popcorn"
@@ -1165,18 +893,18 @@
trash = /obj/item/trash/popcorn
var/unpopped = 0
filling_color = "#FFFAD4"
+ bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0
+ list_reagents = list("nutriment" = 2)
- New()
- ..()
- unpopped = rand(1,10)
- reagents.add_reagent("nutriment", 2)
- bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0
- On_Consume(mob/M, mob/user)
- if(prob(unpopped)) //lol ...what's the point?
- to_chat(user, "\red You bite down on an un-popped kernel!")
- unpopped = max(0, unpopped-1)
- ..()
+/obj/item/weapon/reagent_containers/food/snacks/popcorn/New()
+ ..()
+ unpopped = rand(1,10)
+/obj/item/weapon/reagent_containers/food/snacks/popcorn/On_Consume(mob/M, mob/user)
+ if(prob(unpopped)) //lol ...what's the point?
+ to_chat(user, "You bite down on an un-popped kernel!")
+ unpopped = max(0, unpopped-1)
+ ..()
/obj/item/weapon/reagent_containers/food/snacks/sosjerky
name = "Scaredy's Private Reserve Beef Jerky"
@@ -1184,11 +912,8 @@
desc = "Beef jerky made from the finest space cows."
trash = /obj/item/trash/sosjerky
filling_color = "#631212"
-
- New()
- ..()
- reagents.add_reagent("protein", 4)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 4)
/obj/item/weapon/reagent_containers/food/snacks/pistachios
name = "Pistachios"
@@ -1196,11 +921,7 @@
desc = "A snack of deliciously salted pistachios. A perfectly valid choice..."
trash = /obj/item/trash/pistachios
filling_color = "#BAD145"
-
- New()
- ..()
- reagents.add_reagent("plantmatter", 6)
- reagents.add_reagent("sodiumchloride", 1)
+ list_reagents = list("plantmatter" = 6, "sodiumchloride" = 1)
/obj/item/weapon/reagent_containers/food/snacks/no_raisin
name = "4no Raisins"
@@ -1208,21 +929,15 @@
desc = "Best raisins in the universe. Not sure why."
trash = /obj/item/trash/raisins
filling_color = "#343834"
-
- New()
- ..()
- reagents.add_reagent("plantmatter", 6)
+ list_reagents = list("plantmatter" = 6)
/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie
name = "Space Twinkie"
icon_state = "space_twinkie"
desc = "Guaranteed to survive longer then you will."
filling_color = "#FFE591"
-
- New()
- ..()
- reagents.add_reagent("sugar", 4)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("sugar" = 4)
/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers
name = "Cheesie Honkers"
@@ -1230,79 +945,53 @@
desc = "Bite sized cheesie snacks that will honk all over your mouth"
trash = /obj/item/trash/cheesie
filling_color = "#FFA305"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("fake_cheese", 2)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 4, "fake_cheese" = 2)
/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein
name = "chow mein"
desc = "What is in this anyways?"
icon_state = "chinese1"
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("beans", 3)
- reagents.add_reagent("msg",4)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6, "beans" = 3, "msg" = 4)
/obj/item/weapon/reagent_containers/food/snacks/chinese/tao
name = "Admiral Yamamoto carp"
desc = "Tastes like chicken."
icon_state = "chinese2"
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("protein", 2)
- reagents.add_reagent("msg",4)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 4, "protein" = 2, "msg" = 4)
/obj/item/weapon/reagent_containers/food/snacks/chinese/newdles
name = "chinese newdles"
desc = "Made fresh, weekly!"
icon_state = "chinese3"
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("msg",4)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6, "msg" = 4)
/obj/item/weapon/reagent_containers/food/snacks/chinese/rice
name = "fried rice"
desc = "A timeless classic."
icon_state = "chinese4"
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("rice", 3)
- reagents.add_reagent("msg",4)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 3, "rice" = 3, "msg" = 4)
/obj/item/weapon/reagent_containers/food/snacks/syndicake
name = "Syndi-Cakes"
icon_state = "syndi_cakes"
desc = "An extremely moist snack cake that tastes just as good after being nuked."
filling_color = "#FF5D05"
-
trash = /obj/item/trash/syndi_cakes
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("salglu_solution", 5)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 4, "salglu_solution" = 5)
/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato
name = "Loaded Baked Potato"
desc = "Totally baked."
icon_state = "loadedbakedpotato"
filling_color = "#9C7A68"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/fries
name = "Space Fries"
@@ -1310,11 +999,8 @@
icon_state = "fries"
trash = /obj/item/trash/plate
filling_color = "#EDDD00"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 4)
/obj/item/weapon/reagent_containers/food/snacks/soydope
name = "Soy Dope"
@@ -1322,22 +1008,15 @@
icon_state = "soydope"
trash = /obj/item/trash/plate
filling_color = "#C4BF76"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/spagetti
name = "Spagetti"
desc = "A bundle of raw spaghetti."
icon_state = "spagetti"
filling_color = "#EDDD00"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 1)
- bitesize = 1
+ list_reagents = list("nutriment" = 1)
/obj/item/weapon/reagent_containers/food/snacks/cheesyfries
name = "Cheesy Fries"
@@ -1345,38 +1024,30 @@
icon_state = "cheesyfries"
trash = /obj/item/trash/plate
filling_color = "#EDDD00"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/fortunecookie
name = "Fortune cookie"
desc = "A true prophecy in each cookie!"
icon_state = "fortune_cookie"
filling_color = "#E8E79E"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 3)
/obj/item/weapon/reagent_containers/food/snacks/badrecipe
name = "Burned mess"
desc = "Someone should be demoted from chef for this."
icon_state = "badrecipe"
filling_color = "#211F02"
+ bitesize = 2
+ list_reagents = list("????" = 5, "carbon" = 3)
- New()
- ..()
- reagents.add_reagent("????", 5)
- reagents.add_reagent("carbon", 3)
- bitesize = 2
-
- // it's burned! it should start off being classed as any cooktype that burns
- cooktype["grilled"] = 1
- cooktype["deep fried"] = 1
+/obj/item/weapon/reagent_containers/food/snacks/badrecipe/New()
+ ..()
+ // it's burned! it should start off being classed as any cooktype that burns
+ cooktype["grilled"] = 1
+ cooktype["deep fried"] = 1
/obj/item/weapon/reagent_containers/food/snacks/meatsteak
name = "Meat steak"
@@ -1384,13 +1055,8 @@
icon_state = "meatstake"
trash = /obj/item/trash/plate
filling_color = "#7A3D11"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("sodiumchloride", 1)
- reagents.add_reagent("blackpepper", 1)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 4, "sodiumchloride" = 1, "blackpepper" = 1)
/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff
name = "Spacy Liberty Duff"
@@ -1398,12 +1064,8 @@
icon_state = "spacylibertyduff"
trash = /obj/item/trash/snack_bowl
filling_color = "#42B873"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("psilocybin", 6)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "psilocybin" = 6)
/obj/item/weapon/reagent_containers/food/snacks/amanitajelly
name = "Amanita Jelly"
@@ -1411,13 +1073,8 @@
icon_state = "amanitajelly"
trash = /obj/item/trash/snack_bowl
filling_color = "#ED0758"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("amanitin", 6)
- reagents.add_reagent("psilocybin", 3)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "amanitin" = 6, "psilocybin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/poppypretzel
name = "Poppy pretzel"
@@ -1425,12 +1082,7 @@
icon_state = "poppypretzel"
bitesize = 2
filling_color = "#916E36"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 5)
- bitesize = 2
-
+ list_reagents = list("nutriment" = 5)
/obj/item/weapon/reagent_containers/food/snacks/meatballsoup
name = "Meatball soup"
@@ -1438,50 +1090,32 @@
icon_state = "meatballsoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#785210"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("water", 5)
- bitesize = 5
+ bitesize = 5
+ list_reagents = list("nutriment" = 8, "water" = 5)
/obj/item/weapon/reagent_containers/food/snacks/slimesoup
name = "slime soup"
desc = "If no water is available, you may substitute tears."
icon_state = "slimesoup"
filling_color = "#C4DBA0"
-
- New()
- ..()
- reagents.add_reagent("slimejelly", 5)
- reagents.add_reagent("water", 10)
- bitesize = 5
+ bitesize = 5
+ list_reagents = list("slimejelly" = 5, "water" = 10)
/obj/item/weapon/reagent_containers/food/snacks/bloodsoup
name = "Tomato soup"
desc = "Smells like copper"
icon_state = "tomatosoup"
filling_color = "#FF0000"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("blood", 10)
- reagents.add_reagent("water", 5)
- bitesize = 5
+ bitesize = 5
+ list_reagents = list("nutriment" = 2, "blood" = 10, "water" = 5)
/obj/item/weapon/reagent_containers/food/snacks/clownstears
name = "Clown's Tears"
desc = "Not very funny."
icon_state = "clownstears"
filling_color = "#C4FBFF"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("banana", 5)
- reagents.add_reagent("water", 10)
- bitesize = 5
+ bitesize = 5
+ list_reagents = list("nutriment" = 4, "banana" = 5, "water" = 10)
/obj/item/weapon/reagent_containers/food/snacks/vegetablesoup
name = "Vegetable soup"
@@ -1489,12 +1123,8 @@
icon_state = "vegetablesoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#AFC4B5"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("water", 5)
- bitesize = 5
+ bitesize = 5
+ list_reagents = list("nutriment" = 8, "water" = 5)
/obj/item/weapon/reagent_containers/food/snacks/nettlesoup
name = "Nettle soup"
@@ -1502,13 +1132,8 @@
icon_state = "nettlesoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#AFC4B5"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("water", 5)
- reagents.add_reagent("omnizine", 5)
- bitesize = 5
+ bitesize = 5
+ list_reagents = list("nutriment" = 8, "water" = 5, "omnizine" = 5)
/obj/item/weapon/reagent_containers/food/snacks/mysterysoup
name = "Mystery soup"
@@ -1516,46 +1141,46 @@
icon_state = "mysterysoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#F082FF"
+ bitesize = 5
- New()
- ..()
- var/mysteryselect = pick(1,2,3,4,5,6,7,8,9,10)
- switch(mysteryselect)
- if(1)
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("capsaicin", 3)
- reagents.add_reagent("tomatojuice", 2)
- if(2)
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("frostoil", 3)
- reagents.add_reagent("tomatojuice", 2)
- if(3)
- reagents.add_reagent("nutriment", 5)
- reagents.add_reagent("water", 5)
- reagents.add_reagent("omnizine", 5)
- if(4)
- reagents.add_reagent("nutriment", 5)
- reagents.add_reagent("water", 10)
- if(5)
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("banana", 10)
- if(6)
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("blood", 10)
- if(7)
- reagents.add_reagent("slimejelly", 10)
- reagents.add_reagent("water", 10)
- if(8)
- reagents.add_reagent("carbon", 10)
- reagents.add_reagent("toxin", 10)
- if(9)
- reagents.add_reagent("nutriment", 5)
- reagents.add_reagent("tomatojuice", 10)
- if(10)
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("tomatojuice", 5)
- reagents.add_reagent("oculine", 5)
- bitesize = 5
+/obj/item/weapon/reagent_containers/food/snacks/mysterysoup/New()
+ ..()
+ var/mysteryselect = pick(1,2,3,4,5,6,7,8,9,10)
+ switch(mysteryselect)
+ if(1)
+ reagents.add_reagent("nutriment", 6)
+ reagents.add_reagent("capsaicin", 3)
+ reagents.add_reagent("tomatojuice", 2)
+ if(2)
+ reagents.add_reagent("nutriment", 6)
+ reagents.add_reagent("frostoil", 3)
+ reagents.add_reagent("tomatojuice", 2)
+ if(3)
+ reagents.add_reagent("nutriment", 5)
+ reagents.add_reagent("water", 5)
+ reagents.add_reagent("omnizine", 5)
+ if(4)
+ reagents.add_reagent("nutriment", 5)
+ reagents.add_reagent("water", 10)
+ if(5)
+ reagents.add_reagent("nutriment", 2)
+ reagents.add_reagent("banana", 10)
+ if(6)
+ reagents.add_reagent("nutriment", 6)
+ reagents.add_reagent("blood", 10)
+ if(7)
+ reagents.add_reagent("slimejelly", 10)
+ reagents.add_reagent("water", 10)
+ if(8)
+ reagents.add_reagent("carbon", 10)
+ reagents.add_reagent("toxin", 10)
+ if(9)
+ reagents.add_reagent("nutriment", 5)
+ reagents.add_reagent("tomatojuice", 10)
+ if(10)
+ reagents.add_reagent("nutriment", 6)
+ reagents.add_reagent("tomatojuice", 5)
+ reagents.add_reagent("oculine", 5)
/obj/item/weapon/reagent_containers/food/snacks/wishsoup
name = "Wish Soup"
@@ -1563,14 +1188,14 @@
icon_state = "wishsoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#D1F4FF"
+ bitesize = 5
+ list_reagents = list("water" = 10)
- New()
- ..()
- reagents.add_reagent("water", 10)
- bitesize = 5
- if(prob(25))
- src.desc = "A wish come true!"
- reagents.add_reagent("nutriment", 8)
+/obj/item/weapon/reagent_containers/food/snacks/wishsoup/New()
+ ..()
+ if(prob(25))
+ desc = "A wish come true!" // hue
+ reagents.add_reagent("nutriment", 8)
/obj/item/weapon/reagent_containers/food/snacks/hotchili
name = "Hot Chili"
@@ -1578,50 +1203,31 @@
icon_state = "hotchili"
trash = /obj/item/trash/snack_bowl
filling_color = "#FF3C00"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("capsaicin", 3)
- reagents.add_reagent("tomatojuice", 2)
- bitesize = 5
-
+ bitesize = 5
+ list_reagents = list("nutriment" = 6, "capsaicin" = 3, "tomatojuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/coldchili
name = "Cold Chili"
desc = "This slush is barely a liquid!"
icon_state = "coldchili"
filling_color = "#2B00FF"
-
trash = /obj/item/trash/snack_bowl
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("frostoil", 3)
- reagents.add_reagent("tomatojuice", 2)
- bitesize = 5
+ bitesize = 5
+ list_reagents = list("nutriment" = 6, "frostoil" = 3, "tomatojuice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/raw_bacon
name = "raw bacon"
desc = "It's fleshy and pink!"
icon_state = "raw_bacon"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("nutriment", 1)
- reagents.add_reagent("porktonium", 10)
+ list_reagents = list("nutriment" = 1, "porktonium" = 10)
/obj/item/weapon/reagent_containers/food/snacks/bacon
name = "bacon"
desc = "It looks juicy and tastes amazing!"
icon_state = "bacon2"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("porktonium", 10)
- reagents.add_reagent("msg", 4)
-
+ list_reagents = list("nutriment" = 4, "porktonium" = 10, "msg" = 4)
/obj/item/weapon/reagent_containers/food/snacks/telebacon
name = "Tele Bacon"
@@ -1629,15 +1235,16 @@
icon_state = "bacon"
var/obj/item/device/radio/beacon/bacon/baconbeacon
bitesize = 2
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("porktonium", 10)
- baconbeacon = new /obj/item/device/radio/beacon/bacon(src)
- On_Consume(mob/M, mob/user)
- if(!reagents.total_volume)
- baconbeacon.loc = user
- baconbeacon.digest_delay()
+ list_reagents = list("nutriment" = 4, "porktonium" = 10)
+
+/obj/item/weapon/reagent_containers/food/snacks/telebacon/New()
+ ..()
+ baconbeacon = new /obj/item/device/radio/beacon/bacon(src)
+
+/obj/item/weapon/reagent_containers/food/snacks/telebacon/On_Consume(mob/M, mob/user)
+ if(!reagents.total_volume)
+ baconbeacon.loc = user
+ baconbeacon.digest_delay()
/obj/item/weapon/reagent_containers/food/snacks/monkeycube
@@ -1647,13 +1254,11 @@
bitesize = 12
filling_color = "#ADAC7F"
var/monkey_type = "Monkey"
-
-/obj/item/weapon/reagent_containers/food/snacks/monkeycube/New()
- ..()
- reagents.add_reagent("protein",10)
+ list_reagents = list("protein" = 10)
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user, proximity)
- if(!proximity) return
+ if(!proximity)
+ return
if(istype(O,/obj/structure/sink) && !wrapped)
to_chat(user, "You place [src] under a stream of water...")
user.drop_item()
@@ -1737,22 +1342,16 @@
desc = "This is absolutely Ei Nath."
icon_state = "spellburger"
filling_color = "#D505FF"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger
name = "Big Bite Burger"
desc = "Forget the Big Mac. THIS is the future!"
icon_state = "bigbiteburger"
filling_color = "#E3D681"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 14)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 14)
/obj/item/weapon/reagent_containers/food/snacks/enchiladas
name = "Enchiladas"
@@ -1760,12 +1359,8 @@
icon_state = "enchiladas"
trash = /obj/item/trash/tray
filling_color = "#A36A1F"
-
- New()
- ..()
- reagents.add_reagent("nutriment",8)
- reagents.add_reagent("capsaicin", 6)
- bitesize = 4
+ bitesize = 4
+ list_reagents = list("nutriment" = 8, "capsaicin" = 6)
/obj/item/weapon/reagent_containers/food/snacks/burrito
name = "Burrito"
@@ -1773,10 +1368,7 @@
icon_state = "burrito"
trash = /obj/item/trash/plate
filling_color = "#A36A1F"
-
-/obj/item/weapon/reagent_containers/food/snacks/burrito/New()
- ..()
- reagents.add_reagent("nutriment", 5)
+ list_reagents = list("nutriment" = 5)
/obj/item/weapon/reagent_containers/food/snacks/chimichanga
name = "Chimichanga"
@@ -1784,11 +1376,7 @@
icon_state = "chimichanga"
trash = /obj/item/trash/plate
filling_color = "#A36A1F"
-
-/obj/item/weapon/reagent_containers/food/snacks/chimichanga/New()
- ..()
- reagents.add_reagent("omnizine", 4) //Deadpool reference. Deal with it.
- reagents.add_reagent("cheese", 2)
+ list_reagents = list("omnizine" = 4, "cheese" = 2) //Deadpool reference. Deal with it.
/obj/item/weapon/reagent_containers/food/snacks/monkeysdelight
name = "monkey's Delight"
@@ -1796,27 +1384,16 @@
icon_state = "monkeysdelight"
trash = /obj/item/trash/tray
filling_color = "#5C3C11"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 10)
- reagents.add_reagent("banana", 5)
- reagents.add_reagent("blackpepper", 1)
- reagents.add_reagent("sodiumchloride", 1)
- bitesize = 6
+ bitesize = 6
+ list_reagents = list("nutriment" = 10, "banana" = 5, "blackpepper" = 1, "sodiumchloride" = 1)
/obj/item/weapon/reagent_containers/food/snacks/baguette
name = "Baguette"
desc = "Bon appetit!"
icon_state = "baguette"
filling_color = "#E3D796"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("blackpepper", 1)
- reagents.add_reagent("sodiumchloride", 1)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "blackpepper" = 1, "sodiumchloride" = 1)
/obj/item/weapon/reagent_containers/food/snacks/sandwich
name = "Sandwich"
@@ -1824,11 +1401,8 @@
icon_state = "sandwich"
trash = /obj/item/trash/plate
filling_color = "#D9BE29"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/toastedsandwich
name = "Toasted Sandwich"
@@ -1836,12 +1410,8 @@
icon_state = "toastedsandwich"
trash = /obj/item/trash/plate
filling_color = "#D9BE29"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("carbon", 2)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6, "carbon" = 2)
/obj/item/weapon/reagent_containers/food/snacks/grilledcheese
name = "Grilled Cheese Sandwich"
@@ -1849,11 +1419,8 @@
icon_state = "toastedsandwich"
trash = /obj/item/trash/plate
filling_color = "#D9BE29"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 7)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 7) //why make a regualr sandwhich when you can make grilled cheese, with this nutriment value?
/obj/item/weapon/reagent_containers/food/snacks/tomatosoup
name = "Tomato Soup"
@@ -1861,12 +1428,8 @@
icon_state = "tomatosoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#D92929"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 5)
- reagents.add_reagent("tomatojuice", 10)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 5, "tomatojuice" = 10)
/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles
name = "Roffle Waffles"
@@ -1874,26 +1437,16 @@
icon_state = "rofflewaffles"
trash = /obj/item/trash/waffles
filling_color = "#FF00F7"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("psilocybin", 8)
- bitesize = 4
+ bitesize = 4
+ list_reagents = list("nutriment" = 8, "psilocybin" = 8)
/obj/item/weapon/reagent_containers/food/snacks/stew
name = "Stew"
desc = "A nice and warm stew. Healthy and strong."
icon_state = "stew"
filling_color = "#9E673A"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 10)
- reagents.add_reagent("tomatojuice", 5)
- reagents.add_reagent("oculine", 5)
- reagents.add_reagent("water", 5)
- bitesize = 10
+ bitesize = 10
+ list_reagents = list("nutriment" = 10, "tomatojuice" = 5, "oculine" = 5, "water" = 5)
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast
name = "Jellied Toast"
@@ -1901,63 +1454,44 @@
icon_state = "jellytoast"
trash = /obj/item/trash/plate
filling_color = "#B572AB"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 1)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 1)
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry
- New()
- ..()
- reagents.add_reagent("cherryjelly", 5)
+ list_reagents = list("nutriment" = 1, "cherryjelly" = 5)
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime
- New()
- ..()
- reagents.add_reagent("slimejelly", 5)
+ list_reagents = list("nutriment" = 1, "slimejelly" = 5)
/obj/item/weapon/reagent_containers/food/snacks/jellyburger
name = "Jelly Burger"
desc = "Culinary delight..?"
icon_state = "jellyburger"
filling_color = "#B572AB"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 5)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 5)
/obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime
- New()
- ..()
- reagents.add_reagent("slimejelly", 5)
+ list_reagents = list("nutriment" = 5, "slimejelly" = 5)
/obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry
- New()
- ..()
- reagents.add_reagent("cherryjelly", 5)
+ list_reagents = list("nutriment" = 5, "cherryjelly" = 5)
/obj/item/weapon/reagent_containers/food/snacks/milosoup
name = "Milosoup"
desc = "The universes best soup! Yum!!!"
icon_state = "milosoup"
trash = /obj/item/trash/snack_bowl
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("water", 5)
- bitesize = 4
+ bitesize = 4
+ list_reagents = list("nutriment" = 8, "water" = 5)
/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat
name = "Stewed Soy Meat"
desc = "Even non-vegetarians will LOVE this!"
icon_state = "stewedsoymeat"
trash = /obj/item/trash/plate
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti
name = "Boiled Spagetti"
@@ -1965,11 +1499,8 @@
icon_state = "spagettiboiled"
trash = /obj/item/trash/plate
filling_color = "#FCEE81"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/boiledrice
name = "Boiled Rice"
@@ -1977,11 +1508,8 @@
icon_state = "boiledrice"
trash = /obj/item/trash/snack_bowl
filling_color = "#FFFBDB"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/ricepudding
name = "Rice Pudding"
@@ -1989,11 +1517,8 @@
icon_state = "rpudding"
trash = /obj/item/trash/snack_bowl
filling_color = "#FFFBDB"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 4)
/obj/item/weapon/reagent_containers/food/snacks/pastatomato
name = "Spagetti"
@@ -2001,12 +1526,8 @@
icon_state = "pastatomato"
trash = /obj/item/trash/plate
filling_color = "#DE4545"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("tomatojuice", 10)
- bitesize = 4
+ bitesize = 4
+ list_reagents = list("nutriment" = 6, "tomatojuice" = 10)
/obj/item/weapon/reagent_containers/food/snacks/meatballspagetti
name = "Spagetti & Meatballs"
@@ -2014,35 +1535,24 @@
icon_state = "meatballspagetti"
trash = /obj/item/trash/plate
filling_color = "#DE4545"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("synaptizine", 5)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 8, "synaptizine" = 5)
/obj/item/weapon/reagent_containers/food/snacks/spesslaw
name = "Spesslaw"
desc = "A lawyers favourite"
icon_state = "spesslaw"
filling_color = "#DE4545"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("synaptizine", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 8, "synaptizine" = 10)
/obj/item/weapon/reagent_containers/food/snacks/poppypretzel
name = "Poppy Pretzel"
desc = "A large soft pretzel full of POP!"
icon_state = "poppypretzel"
filling_color = "#AB7D2E"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 5)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 5)
/obj/item/weapon/reagent_containers/food/snacks/carrotfries
name = "Carrot Fries"
@@ -2050,68 +1560,48 @@
icon_state = "carrotfries"
trash = /obj/item/trash/plate
filling_color = "#FAA005"
-
- New()
- ..()
- reagents.add_reagent("plantmatter", 3)
- reagents.add_reagent("oculine", 3)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("plantmatter" = 3, "oculine" = 3)
/obj/item/weapon/reagent_containers/food/snacks/superbiteburger
name = "Super Bite Burger"
desc = "This is a mountain of a burger. FOOD!"
icon_state = "superbiteburger"
filling_color = "#CCA26A"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 50)
- bitesize = 10
+ bitesize = 10
+ list_reagents = list("nutriment" = 50)
/obj/item/weapon/reagent_containers/food/snacks/candiedapple
name = "Candied Apple"
desc = "An apple coated in sugary sweetness."
icon_state = "candiedapple"
filling_color = "#F21873"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 3) // A candy apple without sugar...
/obj/item/weapon/reagent_containers/food/snacks/applepie
name = "Apple Pie"
desc = "A pie containing sweet sweet love... or apple."
icon_state = "applepie"
filling_color = "#E0EDC5"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- bitesize = 3
-
+ bitesize = 3
+ list_reagents = list("nutriment" = 4)
/obj/item/weapon/reagent_containers/food/snacks/cherrypie
name = "Cherry Pie"
desc = "Taste so good, make a grown man cry."
icon_state = "cherrypie"
filling_color = "#FF525A"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 4)
/obj/item/weapon/reagent_containers/food/snacks/twobread
name = "Two Bread"
desc = "It is very bitter and winy."
icon_state = "twobread"
filling_color = "#DBCC9A"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/jellysandwich
name = "Jelly Sandwich"
@@ -2119,41 +1609,28 @@
icon_state = "jellysandwich"
trash = /obj/item/trash/plate
filling_color = "#9E3A78"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime
- New()
- ..()
- reagents.add_reagent("slimejelly", 5)
+ list_reagents = list("nutriment" = 2, "slimejelly" = 5)
/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry
- New()
- ..()
- reagents.add_reagent("cherryjelly", 5)
+ list_reagents = list("nutriment" = 2, "cherryjelly" = 5)
/obj/item/weapon/reagent_containers/food/snacks/boiledslimecore
name = "Boiled Slime Core"
desc = "A boiled red thing."
icon_state = "boiledrorocore"
- New()
- ..()
- reagents.add_reagent("slimejelly", 5)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("slimejelly" = 5)
/obj/item/weapon/reagent_containers/food/snacks/mint
name = "mint"
desc = "it is only wafer thin."
icon_state = "mint"
filling_color = "#F2F2F2"
-
- New()
- ..()
- reagents.add_reagent("minttoxin", 1)
- bitesize = 1
+ list_reagents = list("minttoxin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/mushroomsoup
name = "chantrelle soup"
@@ -2161,29 +1638,24 @@
icon_state = "mushroomsoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#E386BF"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit
name = "plump helmet biscuit"
desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour."
icon_state = "phelmbiscuit"
filling_color = "#CFB4C4"
+ bitesize = 2
+ list_reagents = list("nutriment" = 5)
- New()
- ..()
- if(prob(10))
- name = "exceptional plump helmet biscuit"
- desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!"
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("omnizine", 5)
- bitesize = 2
- else
- reagents.add_reagent("nutriment", 5)
- bitesize = 2
+/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New()
+ ..()
+ if(prob(10))
+ name = "exceptional plump helmet biscuit"
+ desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" // Is this a reference?
+ reagents.add_reagent("nutriment", 3)
+ reagents.add_reagent("omnizine", 5)
/obj/item/weapon/reagent_containers/food/snacks/chawanmushi
name = "chawanmushi"
@@ -2191,11 +1663,7 @@
icon_state = "chawanmushi"
trash = /obj/item/trash/snack_bowl
filling_color = "#F0F2E4"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 5)
- bitesize = 1
+ list_reagents = list("nutriment" = 5)
/obj/item/weapon/reagent_containers/food/snacks/beetsoup
name = "beet soup"
@@ -2203,24 +1671,24 @@
icon_state = "beetsoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#FAC9FF"
+ bitesize = 2
+ list_reagents = list("nutriment" = 8)
- New()
- ..()
- switch(rand(1,6))
- if(1)
- name = "borsch"
- if(2)
- name = "bortsch"
- if(3)
- name = "borstch"
- if(4)
- name = "borsh"
- if(5)
- name = "borshch"
- if(6)
- name = "borscht"
- reagents.add_reagent("nutriment", 8)
- bitesize = 2
+/obj/item/weapon/reagent_containers/food/snacks/beetsoup/New()
+ ..()
+ switch(rand(1,6))
+ if(1)
+ name = "borsch"
+ if(2)
+ name = "bortsch"
+ if(3)
+ name = "borstch"
+ if(4)
+ name = "borsh"
+ if(5)
+ name = "borshch"
+ if(6)
+ name = "borscht"
/obj/item/weapon/reagent_containers/food/snacks/herbsalad
name = "herb salad"
@@ -2228,11 +1696,8 @@
icon_state = "herbsalad"
trash = /obj/item/trash/snack_bowl
filling_color = "#76B87F"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/validsalad
name = "valid salad"
@@ -2240,12 +1705,8 @@
icon_state = "validsalad"
trash = /obj/item/trash/snack_bowl
filling_color = "#76B87F"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("omnizine", 5)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 8, "omnizine" = 5)
/obj/item/weapon/reagent_containers/food/snacks/appletart
name = "golden apple streusel tart"
@@ -2253,33 +1714,24 @@
icon_state = "gappletart"
trash = /obj/item/trash/plate
filling_color = "#FFFF00"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("gold", 5)
- spawn(1)
- reagents.del_reagent("egg")
- reagents.update_total()
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 8, "gold" = 5)
/obj/item/weapon/reagent_containers/food/snacks/dough_ball
name = "ball of raw dough"
desc = "A ball of raw dough, ready to be molded into new recipes."
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "dough"
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- bitesize = 1
- attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/weapon/kitchen/rollingpin))
- user.visible_message( \
- "[user] flattens the dough with the rolling pin!", \
- "\blue You flatten the dough with your rolling pin!" \
- )
- new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(src.loc)
- qdel(src)
+ list_reagents = list("nutriment" = 3)
+
+/obj/item/weapon/reagent_containers/food/snacks/dough_ball/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W,/obj/item/weapon/kitchen/rollingpin))
+ user.visible_message( \
+ "[user] flattens the dough with the rolling pin!", \
+ "You flatten the dough with your rolling pin!" \
+ )
+ new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(loc)
+ qdel(src)
/////////////////////////////////////////////////Sliceable////////////////////////////////////////
// All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels
@@ -2293,10 +1745,7 @@
icon_state = "flatdough"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice
slices_num = 3
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- bitesize = 1
+ list_reagents = list("nutriment" = 3)
/obj/item/weapon/reagent_containers/food/snacks/doughslice
name = "slice of dough"
@@ -2312,11 +1761,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice
slices_num = 5
filling_color = "#FF7575"
- New()
- ..()
- reagents.add_reagent("protein", 20)
- reagents.add_reagent("nutriment", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 20, "nutriment" = 10)
/obj/item/weapon/reagent_containers/food/snacks/meatbreadslice
name = "meatbread slice"
@@ -2333,11 +1779,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice
slices_num = 5
filling_color = "#8AFF75"
- New()
- ..()
- reagents.add_reagent("protein", 20)
- reagents.add_reagent("nutriment", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 20, "nutriment" = 10)
/obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice
name = "xenomeatbread slice"
@@ -2353,12 +1796,8 @@
icon_state = "spidermeatbread"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice
slices_num = 5
- New()
- ..()
- reagents.add_reagent("protein", 20)
- reagents.add_reagent("nutriment", 10)
- reagents.add_reagent("toxin", 15)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 20, "nutriment" = 10, "toxin" = 15)
/obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice
name = "spider meat bread slice"
@@ -2366,9 +1805,7 @@
icon_state = "xenobreadslice"
trash = /obj/item/trash/plate
bitesize = 2
- New()
- ..()
- reagents.add_reagent("toxin", 2)
+ list_reagents = list("toxin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread
name = "Banana-nut bread"
@@ -2377,11 +1814,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice
slices_num = 5
filling_color = "#EDE5AD"
- New()
- ..()
- reagents.add_reagent("banana", 20)
- reagents.add_reagent("nutriment", 20)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("banana" = 20, "nutriment" = 20)
/obj/item/weapon/reagent_containers/food/snacks/bananabreadslice
name = "Banana-nut bread slice"
@@ -2398,10 +1832,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice
slices_num = 5
filling_color = "#F7FFE0"
- New()
- ..()
- reagents.add_reagent("nutriment", 30)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 30)
/obj/item/weapon/reagent_containers/food/snacks/tofubreadslice
name = "Tofubread slice"
@@ -2411,7 +1843,6 @@
filling_color = "#F7FFE0"
bitesize = 2
-
/obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake
name = "Carrot Cake"
desc = "A favorite desert of a certain wascally wabbit. Not a lie."
@@ -2419,11 +1850,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice
slices_num = 5
filling_color = "#FFD675"
- New()
- ..()
- reagents.add_reagent("nutriment", 25)
- reagents.add_reagent("oculine", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 25, "oculine" = 10)
/obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice
name = "Carrot Cake slice"
@@ -2440,12 +1868,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/braincakeslice
slices_num = 5
filling_color = "#E6AEDB"
- New()
- ..()
- reagents.add_reagent("protein", 15)
- reagents.add_reagent("nutriment", 10)
- reagents.add_reagent("mannitol", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 15, "nutriment" = 10, "mannitol" = 10)
/obj/item/weapon/reagent_containers/food/snacks/braincakeslice
name = "Brain Cake slice"
@@ -2462,10 +1886,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice
slices_num = 5
filling_color = "#FAF7AF"
- New()
- ..()
- reagents.add_reagent("nutriment", 25)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 25)
/obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice
name = "Cheese Cake slice"
@@ -2482,9 +1904,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice
slices_num = 5
filling_color = "#F7EDD5"
- New()
- ..()
- reagents.add_reagent("nutriment", 20)
+ list_reagents = list("nutriment" = 20)
/obj/item/weapon/reagent_containers/food/snacks/plaincakeslice
name = "Vanilla Cake slice"
@@ -2501,9 +1921,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice
slices_num = 5
filling_color = "#FADA8E"
- New()
- ..()
- reagents.add_reagent("nutriment", 20)
+ list_reagents = list("nutriment" = 20)
/obj/item/weapon/reagent_containers/food/snacks/orangecakeslice
name = "Orange Cake slice"
@@ -2520,9 +1938,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/limecakeslice
slices_num = 5
filling_color = "#CBFA8E"
- New()
- ..()
- reagents.add_reagent("nutriment", 20)
+ list_reagents = list("nutriment" = 20)
/obj/item/weapon/reagent_containers/food/snacks/limecakeslice
name = "Lime Cake slice"
@@ -2539,9 +1955,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice
slices_num = 5
filling_color = "#FAFA8E"
- New()
- ..()
- reagents.add_reagent("nutriment", 20)
+ list_reagents = list("nutriment" = 20)
/obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice
name = "Lemon Cake slice"
@@ -2558,10 +1972,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice
slices_num = 5
filling_color = "#805930"
- New()
- ..()
- reagents.add_reagent("nutriment", 20)
- reagents.add_reagent("chocolate",20)
+ list_reagents = list("nutriment" = 20, "chocolate" = 20)
/obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice
name = "Chocolate Cake slice"
@@ -2578,11 +1989,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesewedge
slices_num = 5
filling_color = "#FFF700"
- New()
- ..()
- reagents.add_reagent("nutriment", 20)
- reagents.add_reagent("cheese", 20)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 20, "cheese" = 20)
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
name = "Cheese wedge"
@@ -2597,12 +2005,7 @@
icon_state = "weirdcheesewedge"
filling_color = "#00FF33"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("mercury", 5)
- reagents.add_reagent("lsd", 5)
- reagents.add_reagent("ethanol", 5)
- reagents.add_reagent("weird_cheese", 5)
+ list_reagents = list("mercury" = 5, "lsd" = 5, "ethanol" = 5, "weird_cheese" = 5)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake
name = "Birthday Cake"
@@ -2611,11 +2014,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice
slices_num = 5
filling_color = "#FFD6D6"
- New()
- ..()
- reagents.add_reagent("nutriment", 20)
- reagents.add_reagent("sprinkles", 10)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 20, "sprinkles" = 10)
/obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice
name = "Birthday Cake slice"
@@ -2632,14 +2032,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice
slices_num = 6
filling_color = "#FFE396"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- spawn(1)
- reagents.del_reagent("egg")
- reagents.update_total()
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/breadslice
name = "Bread slice"
@@ -2648,10 +2042,7 @@
trash = /obj/item/trash/plate
filling_color = "#D27332"
bitesize = 2
-
- New()
- ..()
- reagents.add_reagent("bread", 5)
+ list_reagents = list("bread" = 5)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread
name = "Cream Cheese Bread"
@@ -2660,10 +2051,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice
slices_num = 5
filling_color = "#FFF896"
- New()
- ..()
- reagents.add_reagent("nutriment", 20)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 20)
/obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice
name = "Cream Cheese Bread slice"
@@ -2673,7 +2062,6 @@
filling_color = "#FFF896"
bitesize = 2
-
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice
name = "Watermelon Slice"
desc = "A slice of watery goodness."
@@ -2681,7 +2069,6 @@
filling_color = "#FF3867"
bitesize = 2
-
/obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake
name = "Apple Cake"
desc = "A cake centred with Apple"
@@ -2689,9 +2076,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/applecakeslice
slices_num = 5
filling_color = "#EBF5B8"
- New()
- ..()
- reagents.add_reagent("nutriment", 15)
+ list_reagents = list("nutriment" = 15)
/obj/item/weapon/reagent_containers/food/snacks/applecakeslice
name = "Apple Cake slice"
@@ -2708,10 +2093,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice
slices_num = 5
filling_color = "#F5B951"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 15)
+ list_reagents = list("nutriment" = 15)
/obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice
name = "Pumpkin Pie slice"
@@ -2726,10 +2108,7 @@
desc = "It's a salted cracker."
icon_state = "cracker"
filling_color = "#F5DEB8"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 1)
+ list_reagents = list("nutriment" = 1)
/obj/item/weapon/reagent_containers/food/snacks/rawcutlet
name = "raw cutlet"
@@ -2737,17 +2116,16 @@
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "rawcutlet"
bitesize = 1
- New()
- ..()
- reagents.add_reagent("protein", 1)
- attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/weapon/kitchen/knife))
- user.visible_message( \
- "[user] cuts the raw cutlet with the knife!", \
- "You cut the raw cutlet with your knife!" \
- )
- new /obj/item/weapon/reagent_containers/food/snacks/raw_bacon(src.loc)
- qdel(src)
+ list_reagents = list("protein" = 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W,/obj/item/weapon/kitchen/knife))
+ user.visible_message( \
+ "[user] cuts the raw cutlet with the knife!", \
+ "You cut the raw cutlet with your knife!" \
+ )
+ new /obj/item/weapon/reagent_containers/food/snacks/raw_bacon(loc)
+ qdel(src)
/////////////////////////////////////////////////PIZZA////////////////////////////////////////
@@ -2762,11 +2140,8 @@
icon_state = "pizzamargherita"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/margheritaslice
slices_num = 6
- New()
- ..()
- reagents.add_reagent("nutriment", 40)
- reagents.add_reagent("tomatojuice", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 40, "tomatojuice" = 6)
/obj/item/weapon/reagent_containers/food/snacks/margheritaslice
name = "Margherita slice"
@@ -2781,12 +2156,8 @@
icon_state = "meatpizza"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice
slices_num = 6
- New()
- ..()
- reagents.add_reagent("protein", 30)
- reagents.add_reagent("nutriment", 20)
- reagents.add_reagent("tomatojuice", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 30, "nutriment" = 20, "tomatojuice" = 6)
/obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice
name = "Meatpizza slice"
@@ -2801,11 +2172,8 @@
icon_state = "mushroompizza"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice
slices_num = 6
- New()
- ..()
- reagents.add_reagent("plantmatter", 25)
- reagents.add_reagent("nutriment", 10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("plantmatter" = 25, "nutriment" = 10)
/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice
name = "Mushroompizza slice"
@@ -2820,13 +2188,8 @@
icon_state = "vegetablepizza"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice
slices_num = 6
- New()
- ..()
- reagents.add_reagent("plantmatter", 20)
- reagents.add_reagent("nutriment", 10)
- reagents.add_reagent("tomatojuice", 6)
- reagents.add_reagent("oculine", 12)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("plantmatter" = 20, "nutriment" = 10, "tomatojuice" = 6, "oculine" = 12)
/obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice
name = "Vegetable pizza slice"
@@ -2898,18 +2261,16 @@
icon_state = "pizzabox[boxes.len+1]"
-/obj/item/pizzabox/attack_hand( mob/user as mob )
-
- if( open && pizza )
- user.put_in_hands( pizza )
-
- to_chat(user, "\red You take the [src.pizza] out of the [src].")
- src.pizza = null
+/obj/item/pizzabox/attack_hand(mob/user)
+ if(open && pizza)
+ user.put_in_hands(pizza)
+ to_chat(user, "You take the [pizza] out of the [src].")
+ pizza = null
update_icon()
return
- if( boxes.len > 0 )
- if( user.get_inactive_hand() != src )
+ if(boxes.len > 0)
+ if(user.get_inactive_hand() != src)
..()
return
@@ -2917,15 +2278,14 @@
boxes -= box
user.put_in_hands( box )
- to_chat(user, "\red You remove the topmost [src] from your hand.")
+ to_chat(user, "You remove the topmost [src] from your hand.")
box.update_icon()
update_icon()
return
..()
-/obj/item/pizzabox/attack_self( mob/user as mob )
-
- if( boxes.len > 0 )
+/obj/item/pizzabox/attack_self(mob/user)
+ if(boxes.len > 0)
return
open = !open
@@ -2935,11 +2295,11 @@
update_icon()
-/obj/item/pizzabox/attackby( obj/item/I as obj, mob/user as mob , params)
- if( istype(I, /obj/item/pizzabox/) )
+/obj/item/pizzabox/attackby( obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/pizzabox/))
var/obj/item/pizzabox/box = I
- if( !box.open && !src.open )
+ if(!box.open && !open)
// Make a list of all boxes to be added
var/list/boxestoadd = list()
boxestoadd += box
@@ -2951,36 +2311,36 @@
box.loc = src
box.boxes = list() // Clear the box boxes so we don't have boxes inside boxes. - Xzibit
- src.boxes.Add( boxestoadd )
+ boxes.Add( boxestoadd )
box.update_icon()
update_icon()
- to_chat(user, "\red You put the [box] ontop of the [src]!")
+ to_chat(user, "You put the [box] ontop of the [src]!")
else
- to_chat(user, "\red The stack is too high!")
+ to_chat(user, "The stack is too high!")
else
- to_chat(user, "\red Close the [box] first!")
+ to_chat(user, "Close the [box] first!")
return
- if( istype(I, /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/) ) // Long ass fucking object name
+ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/)) // Long ass fucking object name
- if( src.open )
+ if(open)
user.drop_item()
I.loc = src
- src.pizza = I
+ pizza = I
update_icon()
- to_chat(user, "\red You put the [I] in the [src]!")
+ to_chat(user, "You put the [I] in the [src]!")
else
- to_chat(user, "\red You try to push the [I] through the lid but it doesn't work!")
+ to_chat(user, "You try to push the [I] through the lid but it doesn't work!")
return
- if( istype(I, /obj/item/weapon/pen/) )
+ if(istype(I, /obj/item/weapon/pen/))
- if( src.open )
+ if(open)
return
var/t = input("Enter what you want to add to the tag:", "Write", null, null) as text
@@ -3017,110 +2377,63 @@
name = "egg wrap"
desc = "The precursor to Pigs in a Blanket."
icon_state = "wrap"
- New()
- ..()
- reagents.add_reagent("nutriment", 5)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 5)
/obj/item/weapon/reagent_containers/food/snacks/beans
name = "tin of beans"
desc = "Musical fruit in a slightly less musical container."
icon_state = "beans"
- New()
- ..()
- reagents.add_reagent("nutriment", 10)
- reagents.add_reagent("beans",10)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 10, "beans" = 10)
/obj/item/weapon/reagent_containers/food/snacks/benedict
name = "eggs benedict"
desc = "There is only one egg on this, how rude."
icon_state = "benedict"
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("egg", 3)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 3, "egg" = 3)
/obj/item/weapon/reagent_containers/food/snacks/hotdog
name = "hotdog"
desc = "Fresh footlong ready to go down on."
icon_state = "hotdog"
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("ketchup", 3)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 3, "ketchup" = 3)
/obj/item/weapon/reagent_containers/food/snacks/meatbun
name = "meat bun"
desc = "Has the potential to not be Dog."
icon_state = "meatbun"
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 6
+ bitesize = 6
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich
name = "icecream sandwich"
desc = "Portable Ice-cream in it's own packaging."
icon_state = "icecreamsandwich"
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("ice", 2)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 2, "ice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/notasandwich
name = "not-a-sandwich"
desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache."
icon_state = "notasandwich"
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/sugarcookie
name = "sugar cookie"
desc = "Just like your little sister used to make."
icon_state = "sugarcookie"
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("sugar", 5)
- spawn(1)
- reagents.del_reagent("egg")
- reagents.update_total()
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 2, "sugar" = 5)
/obj/item/weapon/reagent_containers/food/snacks/friedbanana
name = "Fried Banana"
desc = "Goreng Pisang, also known as fried bananas."
icon_state = "friedbanana"
- New()
- ..()
- reagents.add_reagent("sugar", 5)
- reagents.add_reagent("nutriment", 8)
- reagents.add_reagent("cornoil", 4)
-
-/obj/item/weapon/reagent_containers/food/snacks/tofurkey
- name = "Tofurkey"
- desc = "A fake turkey made from tofu."
- icon_state = "tofurkey"
- New()
- ..()
- reagents.add_reagent("nutriment", 12)
- reagents.add_reagent("ether", 3)
- bitesize = 3
-
-/obj/item/weapon/reagent_containers/food/snacks/stuffing
- name = "Stuffing"
- desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!"
- icon_state = "stuffing"
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- bitesize = 1
+ list_reagents = list("sugar" = 5, "nutriment" = 8, "cornoil" = 4)
/obj/item/weapon/reagent_containers/food/snacks/dionaroast
name = "roast diona"
@@ -3128,46 +2441,31 @@
icon_state = "dionaroast"
trash = /obj/item/trash/plate
filling_color = "#75754B"
-
- New()
- ..()
- reagents.add_reagent("plantmatter", 4)
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("radium", 2)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("plantmatter" = 4, "nutriment" = 2, "radium" = 2)
/obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg
name = "boiled spider leg"
desc = "A giant spider's leg that's still twitching after being cooked. Gross!"
icon_state = "spiderlegcooked"
trash = /obj/item/trash/plate
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
- reagents.add_reagent("toxin", 2)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 3, "toxin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/spidereggs
name = "spider eggs"
desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health."
icon_state = "spidereggs"
- New()
- ..()
- reagents.add_reagent("protein", 2)
- reagents.add_reagent("toxin", 3)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 2, "toxin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/spidereggsham
name = "green eggs and ham"
desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?"
icon_state = "spidereggsham"
trash = /obj/item/trash/plate
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- reagents.add_reagent("sodiumchloride", 1)
- reagents.add_reagent("toxin", 3)
- bitesize = 4
+ bitesize = 4
+ list_reagents = list("nutriment" = 6, "sodiumchloride" = 1, "toxin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey
name = "Turkey"
@@ -3175,11 +2473,8 @@
icon_state = "turkey"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/turkeyslice
slices_num = 6
- New()
- ..()
- reagents.add_reagent("protein", 24)
- reagents.add_reagent("nutriment", 18)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("protein" = 24, "nutriment" = 18)
/obj/item/weapon/reagent_containers/food/snacks/turkeyslice
name = "turkey serving"
@@ -3196,56 +2491,41 @@
trash = /obj/item/trash/plate
filling_color = "#D6D9C1"
bitesize = 2
-
- New()
- ..()
- reagents.add_reagent("nutriment", 5)
- reagents.add_reagent("gravy", 5)
- reagents.add_reagent("mashedpotatoes", 10)
- bitesize = 2
+ list_reagents = list("nutriment" = 5, "gravy" = 5, "mashedpotatoes" = 10)
////////////////////////////////ICE CREAM///////////////////////////////////
/obj/item/weapon/reagent_containers/food/snacks/icecream
- name = "ice cream"
- desc = "Delicious ice cream."
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "icecream_cone"
- New()
- ..()
- reagents.add_reagent("nutriment", 1)
- reagents.add_reagent("sugar",1)
- bitesize = 1
- update_icon()
+ name = "ice cream"
+ desc = "Delicious ice cream."
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "icecream_cone"
+ list_reagents = list("nutriment" = 1, "sugar" = 1)
- update_icon()
- overlays.Cut()
- var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color")
- filling.icon += mix_color_from_reagents(reagents.reagent_list)
- overlays += filling
+/obj/item/weapon/reagent_containers/food/snacks/icecream/New()
+ ..()
+ update_icon()
+
+/obj/item/weapon/reagent_containers/food/snacks/icecream/update_icon()
+ overlays.Cut()
+ var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color")
+ filling.icon += mix_color_from_reagents(reagents.reagent_list)
+ overlays += filling
/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcone
- name = "ice cream cone"
- desc = "Delicious ice cream."
- icon_state = "icecream_cone"
- volume = 50
- New()
- ..()
- reagents.add_reagent("nutriment", 2)
- reagents.add_reagent("sugar",6)
- reagents.add_reagent("ice",2)
- bitesize = 3
+ name = "ice cream cone"
+ desc = "Delicious ice cream."
+ icon_state = "icecream_cone"
+ volume = 50
+ bitesize = 3
+ list_reagents = list("nutriment" = 3, "sugar" = 7, "ice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcup
- name = "chocolate ice cream cone"
- desc = "Delicious ice cream."
- icon_state = "icecream_cup"
- volume = 50
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("chocolate",8)
- reagents.add_reagent("ice",2)
- bitesize = 6
+ name = "chocolate ice cream cone"
+ desc = "Delicious ice cream."
+ icon_state = "icecream_cup"
+ volume = 50
+ bitesize = 6
+ list_reagents = list("nutriment" = 5, "chocolate" = 8, "ice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/cereal
name = "box of cereal"
@@ -3253,18 +2533,15 @@
icon = 'icons/obj/food/food.dmi'
icon_state = "cereal_box"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
+ list_reagents = list("nutriment" = 3)
+
/obj/item/weapon/reagent_containers/food/snacks/deepfryholder
name = "Deep Fried Foods Holder Obj"
desc = "If you can see this description the code for the deep fryer fucked up."
icon = 'icons/obj/food/food.dmi'
icon_state = "deepfried_holder_icon"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
+ list_reagents = list("nutriment" = 3)
/obj/item/weapon/reagent_containers/food/snacks/dough
name = "dough"
@@ -3272,9 +2549,7 @@
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "dough"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
+ list_reagents = list("nutriment" = 3)
// Dough + rolling pin = flat dough
/obj/item/weapon/reagent_containers/food/snacks/dough/attackby(obj/item/I, mob/user, params)
@@ -3296,9 +2571,7 @@
icon_state = "flat dough"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice
slices_num = 3
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
+ list_reagents = list("nutriment" = 3)
/obj/item/weapon/reagent_containers/food/snacks/doughslice
name = "dough slice"
@@ -3306,29 +2579,22 @@
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "doughslice"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("nutriment", 1)
+ list_reagents = list("nutriment" = 1)
/obj/item/weapon/reagent_containers/food/snacks/bun
name = "bun"
desc = "The base for any self-respecting burger."
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "bun"
- bitesize = 2
- New()
- ..()
- reagents.add_reagent("nutriment", 4)
- bitesize = 3
+ bitesize = 3
+ list_reagents = list("nutriment" = 4)
/obj/item/weapon/reagent_containers/food/snacks/taco
name = "taco"
desc = "Take a bite!"
icon_state = "taco"
bitesize = 3
- New()
- ..()
- reagents.add_reagent("nutriment", 7)
+ list_reagents = list("nutriment" = 7)
/obj/item/weapon/reagent_containers/food/snacks/cutlet
name = "cutlet"
@@ -3336,9 +2602,7 @@
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "cutlet"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("protein", 2)
+ list_reagents = list("protein" = 2)
/obj/item/weapon/reagent_containers/food/snacks/rawmeatball
name = "raw meatball"
@@ -3346,18 +2610,14 @@
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "rawmeatball"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("protein", 2)
+ list_reagents = list("protein" = 2)
/obj/item/weapon/reagent_containers/food/snacks/hotdog
name = "hotdog"
desc = "Unrelated to dogs, maybe."
icon_state = "hotdog"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("protein", 6)
+ list_reagents = list("protein" = 6)
/obj/item/weapon/reagent_containers/food/snacks/flatbread
name = "flatbread"
@@ -3365,9 +2625,7 @@
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "flatbread"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("nutriment", 3)
+ list_reagents = list("nutriment" = 3)
/obj/item/weapon/reagent_containers/food/snacks/rawsticks
name = "raw potato sticks"
@@ -3375,18 +2633,14 @@
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "rawsticks"
bitesize = 2
- New()
- ..()
- reagents.add_reagent("plantmatter", 3)
+ list_reagents = list("plantmatter" = 3)
/obj/item/weapon/reagent_containers/food/snacks/ectoplasm
name = "ectoplasm"
desc = "A luminescent blob of what scientists refer to as 'ghost goo'."
icon = 'icons/obj/wizard.dmi'
icon_state = "ectoplasm"
- New()
- ..()
- reagents.add_reagent("ectoplasm", 10)
+ list_reagents = list("ectoplasm" = 10)
/obj/item/weapon/reagent_containers/food/snacks/liquidfood
name = "\improper LiquidFood Ration"
@@ -3394,12 +2648,8 @@
icon_state = "liquidfood"
trash = /obj/item/trash/liquidfood
filling_color = "#A8A8A8"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 20)
- reagents.add_reagent("iron", 3)
- bitesize = 4
+ bitesize = 4
+ list_reagents = list("nutriment" = 20, "iron" = 3)
/obj/item/weapon/reagent_containers/food/snacks/tastybread
@@ -3408,8 +2658,5 @@
icon_state = "tastybread"
trash = /obj/item/trash/tastybread
filling_color = "#A66829"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 6)
- bitesize = 2
+ bitesize = 2
+ list_reagents = list("nutriment" = 6)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index b71bb0be2d4..fafa983cf1d 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -52,13 +52,13 @@
else
overlays += image('icons/obj/kitchen.dmi', "gridle")
-/obj/machinery/gibber/relaymove(mob/user as mob)
+/obj/machinery/gibber/relaymove(mob/user)
if(locked)
return
go_out()
-/obj/machinery/gibber/attack_hand(mob/user as mob)
+/obj/machinery/gibber/attack_hand(mob/user)
if(stat & (NOPOWER|BROKEN))
return
@@ -73,7 +73,7 @@
else
startgibbing(user)
-/obj/machinery/gibber/attackby(obj/item/P as obj, mob/user as mob, params)
+/obj/machinery/gibber/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = P
if(G.state < 2)
@@ -126,7 +126,7 @@
return
user.visible_message("[user] starts to put [victim] into the gibber!")
- src.add_fingerprint(user)
+ add_fingerprint(user)
if(do_after(user, 30, target = victim) && user.Adjacent(src) && victim.Adjacent(user) && !occupant)
user.visible_message("[user] stuffs [victim] into the gibber!")
@@ -155,7 +155,7 @@
return
for(var/obj/O in src)
- O.loc = src.loc
+ O.loc = loc
occupant.forceMove(get_turf(src))
occupant = null
@@ -212,11 +212,11 @@
/obj/machinery/gibber/proc/startgibbing(var/mob/user, var/UserOverride=0)
if(!istype(user) && !UserOverride)
- log_debug("Some shit just went down with the gibber at X[x], Y[y], Z[z] with an invalid user. (JMP)")
+ log_debug("Some shit just went down with the gibber at X[x], Y[y], Z[z] with an invalid user. (JMP)")
return
if(UserOverride)
- msg_admin_attack("[key_name_admin(occupant)] was gibbed by an autogibber (\the [src]) (JMP)")
+ msg_admin_attack("[key_name_admin(occupant)] was gibbed by an autogibber (\the [src]) (JMP)")
if(operating)
return
@@ -236,7 +236,7 @@
var/slab_name = occupant.name
var/slab_count = 3
var/slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human //gibber can only gib humans on paracode, no need to check meat type
- var/slab_nutrition = src.occupant.nutrition / 15
+ var/slab_nutrition = occupant.nutrition / 15
slab_nutrition /= slab_count
@@ -352,7 +352,7 @@
feedinTopanim()
return 1
-/obj/machinery/gibber/autogibber/proc/ejectclothes(var/mob/living/carbon/human/H)
+/obj/machinery/gibber/autogibber/proc/ejectclothes(mob/living/carbon/human/H)
if(!istype(H)) return 0
if(H != occupant) return 0 //only using H as a shortcut to typecast
for(var/obj/O in H)
@@ -367,7 +367,7 @@
if(O.flags & NODROP)
qdel(O) //they are already dead by now
H.unEquip(O)
- O.loc = src.loc
+ O.loc = loc
O.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15)
sleep(1)
@@ -375,7 +375,7 @@
if(C.flags & NODROP)
qdel(C)
H.unEquip(C)
- C.loc = src.loc
+ C.loc = loc
C.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15)
sleep(1)
@@ -385,7 +385,7 @@
var/spats = 0 //keeps track of how many items get spit out. Don't show a message if none are found.
for(var/obj/O in src)
if(istype(O))
- O.loc = src.loc
+ O.loc = loc
O.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15)
spats++
sleep(1)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
index 5fbd65deddc..59f9ec60d12 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -24,10 +24,7 @@
/obj/machinery/icemachine/New()
- var/datum/reagents/R = new/datum/reagents(500)
- reagents = R
- R.my_atom = src
-
+ create_reagents(500)
/obj/machinery/icemachine/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/reagent_containers/glass))
diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm
index f0fb01efad2..19da4fb85ac 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm
@@ -63,11 +63,11 @@ var/list/ingredients_source = list(
while(ingredients.len < 11)
ingredients.Add(5)
-/obj/machinery/icecream_vat/attack_hand(mob/user as mob)
+/obj/machinery/icecream_vat/attack_hand(mob/user)
user.set_machine(src)
interact(user)
-/obj/machinery/icecream_vat/interact(mob/user as mob)
+/obj/machinery/icecream_vat/interact(mob/user)
var/dat
dat += "Dispense vanilla icecream There is [ingredients[ICECREAM_VANILLA]] scoops of vanilla icecream left (made from milk and ice). "
dat += "Dispense strawberry icecream There is [ingredients[FLAVOUR_STRAWBERRY]] dollops of strawberry flavouring left (obtained from berry juice. "
@@ -91,7 +91,7 @@ var/list/ingredients_source = list(
popup.set_content(dat)
popup.open(0)
-/obj/machinery/icecream_vat/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+/obj/machinery/icecream_vat/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/reagent_containers))
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/icecream))
var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O
@@ -99,7 +99,7 @@ var/list/ingredients_source = list(
if(ingredients[ICECREAM_VANILLA] > 0)
var/flavour_name = get_icecream_flavour_string(dispense_flavour)
if(dispense_flavour < 11 && ingredients[dispense_flavour] > 0)
- src.visible_message("[bicon(src)] [user] scoops delicious [flavour_name] flavoured icecream into [I].")
+ visible_message("[bicon(src)] [user] scoops delicious [flavour_name] flavoured icecream into [I].")
ingredients[dispense_flavour] -= 1
ingredients[ICECREAM_VANILLA] -= 1
@@ -127,7 +127,7 @@ var/list/ingredients_source = list(
else
var/obj/item/weapon/reagent_containers/R = O
if(R.reagents)
- src.visible_message("[user] has emptied all of [R] into [src].")
+ visible_message("[user] has emptied all of [R] into [src].")
for(var/datum/reagent/current_reagent in R.reagents.reagent_list)
if(ingredients_source[current_reagent.id])
add(ingredients_source[current_reagent.id], current_reagent.volume / 2)
@@ -151,7 +151,7 @@ var/list/ingredients_source = list(
ingredients[INGR_FLOUR] -= amount
ingredients[INGR_SUGAR] -= amount
ingredients[CONE_WAFFLE] += amount
- src.visible_message("[user] cooks up some waffle cones.")
+ visible_message("[user] cooks up some waffle cones.")
else
to_chat(user, "You require sugar and flour to make waffle cones.")
if(CONE_CHOC)
@@ -160,7 +160,7 @@ var/list/ingredients_source = list(
ingredients[CONE_WAFFLE] -= amount
ingredients[FLAVOUR_CHOCOLATE] -= amount
ingredients[CONE_CHOC] += amount
- src.visible_message("[user] cooks up some chocolate cones.")
+ visible_message("[user] cooks up some chocolate cones.")
else
to_chat(user, "You require waffle cones and chocolate flavouring to make chocolate cones.")
if(ICECREAM_VANILLA)
@@ -169,7 +169,7 @@ var/list/ingredients_source = list(
ingredients[INGR_ICE] -= amount
ingredients[INGR_MILK] -= amount
ingredients[ICECREAM_VANILLA] += amount
- src.visible_message("[user] whips up some vanilla icecream.")
+ visible_message("[user] whips up some vanilla icecream.")
else
to_chat(user, "You require milk and ice to make vanilla icecream.")
updateDialog()
@@ -179,7 +179,7 @@ var/list/ingredients_source = list(
return
if(href_list["dispense"])
dispense_flavour = text2num(href_list["dispense"])
- src.visible_message("\blue[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.")
+ visible_message("\blue[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.")
if(href_list["cone"])
var/dispense_cone = text2num(href_list["cone"])
@@ -187,11 +187,11 @@ var/list/ingredients_source = list(
var/cone_name = get_icecream_flavour_string(dispense_cone)
if(ingredients[dispense_cone] >= 1)
ingredients[dispense_cone] -= 1
- var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = new(src.loc)
+ var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = new(loc)
I.cone_type = cone_name
I.icon_state = "icecream_cone_[cone_name]"
I.desc = "Delicious [cone_name] cone, but no ice cream."
- src.visible_message("[usr] dispenses a crunchy [cone_name] cone from [src].")
+ visible_message("[usr] dispenses a crunchy [cone_name] cone from [src].")
else
to_chat(usr, "There are no [cone_name] cones left!")
updateDialog()
@@ -202,7 +202,7 @@ var/list/ingredients_source = list(
if(href_list["eject"])
if(held_container)
- held_container.forceMove(src.loc)
+ held_container.forceMove(loc)
held_container = null
updateDialog()
@@ -231,7 +231,7 @@ var/list/ingredients_source = list(
/obj/item/weapon/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour)
var/flavour_name = get_icecream_flavour_string(flavour)
name = "[flavour_name] icecream"
- src.overlays += "icecream_[flavour_name]"
+ overlays += "icecream_[flavour_name]"
desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream."
ice_creamed = 1
diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
index e1cb054690f..03ceb5c0034 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
@@ -35,7 +35,7 @@
return
-/obj/machinery/juicer/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+/obj/machinery/juicer/attackby(obj/item/O, mob/user, params)
if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
if(beaker)
@@ -46,9 +46,9 @@
return 0
O.forceMove(src)
beaker = O
- src.verbs += /obj/machinery/juicer/verb/detach
+ verbs += /obj/machinery/juicer/verb/detach
update_icon()
- src.updateUsrDialog()
+ updateUsrDialog()
return 0
if(!is_type_in_list(O, allowed_items))
to_chat(user, "It doesn't look like that contains any juice.")
@@ -57,24 +57,24 @@
to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]")
return 0
O.forceMove(src)
- src.updateUsrDialog()
+ updateUsrDialog()
return 0
-/obj/machinery/juicer/attack_ai(mob/user as mob)
+/obj/machinery/juicer/attack_ai(mob/user)
return 0
-/obj/machinery/juicer/attack_hand(mob/user as mob)
+/obj/machinery/juicer/attack_hand(mob/user)
user.set_machine(src)
interact(user)
-/obj/machinery/juicer/interact(mob/user as mob) // The microwave Menu
+/obj/machinery/juicer/interact(mob/user) // The microwave Menu
var/is_chamber_empty = 0
var/is_beaker_ready = 0
var/processing_chamber = ""
var/beaker_contents = ""
for(var/i in allowed_items)
- for(var/obj/item/O in src.contents)
+ for(var/obj/item/O in contents)
if(!istype(O,i))
continue
processing_chamber+= "some [O] "
@@ -119,7 +119,7 @@
if("detach")
detach()
- src.updateUsrDialog()
+ updateUsrDialog()
return
/obj/machinery/juicer/verb/detach()
@@ -130,8 +130,8 @@
return
if(!beaker)
return
- src.verbs -= /obj/machinery/juicer/verb/detach
- beaker.forceMove(src.loc)
+ verbs -= /obj/machinery/juicer/verb/detach
+ beaker.forceMove(loc)
beaker = null
update_icon()
@@ -159,8 +159,8 @@
return
if(!beaker || beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
return
- playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
- for(var/obj/item/weapon/reagent_containers/food/snacks/O in src.contents)
+ playsound(loc, 'sound/machines/juicer.ogg', 50, 1)
+ for(var/obj/item/weapon/reagent_containers/food/snacks/O in contents)
var/r_id = get_juice_id(O)
beaker.reagents.add_reagent(r_id,get_juice_amount(O))
qdel(O)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index 648f228bb54..ef7591e3955 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -32,8 +32,7 @@
********************/
/obj/machinery/kitchen_machine/New()
- reagents = new/datum/reagents(100)
- reagents.my_atom = src
+ create_reagents(100)
if(!available_recipes)
available_recipes = new
acceptable_items = new
@@ -56,7 +55,7 @@
* Item Adding
********************/
-/obj/machinery/kitchen_machine/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+/obj/machinery/kitchen_machine/attackby(obj/item/O, mob/user, params)
if(operating)
return
if(!broken && dirty < 100)
@@ -77,8 +76,8 @@
default_deconstruction_crowbar(O)
- if(src.broken > 0)
- if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver
+ if(broken > 0)
+ if(broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver
user.visible_message( \
"[user] starts to fix part of \the [src].", \
"You start to fix part of \the [src]." \
@@ -88,8 +87,8 @@
"[user] fixes part of \the [src].", \
"You have fixed part of \the [src]." \
)
- src.broken = 1 // Fix it a bit
- else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench
+ broken = 1 // Fix it a bit
+ else if(broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench
user.visible_message( \
"[user] starts to fix part of \the [src].", \
"You start to fix part of \the [src]." \
@@ -99,14 +98,14 @@
"[user] fixes \the [src].", \
"You have fixed \the [src]." \
)
- src.icon_state = off_icon
- src.broken = 0 // Fix it!
- src.dirty = 0 // just to be sure
- src.flags = OPENCONTAINER
+ icon_state = off_icon
+ broken = 0 // Fix it!
+ dirty = 0 // just to be sure
+ flags = OPENCONTAINER
else
to_chat(user, "It's broken!")
return 1
- else if(src.dirty==100) // The machine is all dirty so can't be used!
+ else if(dirty==100) // The machine is all dirty so can't be used!
if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them
user.visible_message( \
"[user] starts to clean \the [src].", \
@@ -117,10 +116,10 @@
"[user] has cleaned \the [src].", \
"You have cleaned \the [src]." \
)
- src.dirty = 0 // It's clean!
- src.broken = 0 // just to be sure
- src.icon_state = off_icon
- src.flags = OPENCONTAINER
+ dirty = 0 // It's clean!
+ broken = 0 // just to be sure
+ icon_state = off_icon
+ flags = OPENCONTAINER
else //Otherwise bad luck!!
to_chat(user, "It's dirty!")
return 1
@@ -161,12 +160,12 @@
else
to_chat(user, "You have no idea what you can cook with this [O].")
return 1
- src.updateUsrDialog()
+ updateUsrDialog()
-/obj/machinery/kitchen_machine/attack_ai(mob/user as mob)
+/obj/machinery/kitchen_machine/attack_ai(mob/user)
return 0
-/obj/machinery/kitchen_machine/attack_hand(mob/user as mob)
+/obj/machinery/kitchen_machine/attack_hand(mob/user)
user.set_machine(src)
interact(user)
@@ -174,15 +173,15 @@
* Machine Menu *
********************/
-/obj/machinery/kitchen_machine/interact(mob/user as mob) // The microwave Menu
+/obj/machinery/kitchen_machine/interact(mob/user) // The microwave Menu
if(panel_open || !anchored)
return
var/dat = ""
- if(src.broken > 0)
+ if(broken > 0)
dat = {"Bzzzzttttt"}
- else if(src.operating)
- dat = {"[pick(src.cook_verbs)] in progress! Please wait...!"}
- else if(src.dirty==100)
+ else if(operating)
+ dat = {"[pick(cook_verbs)] in progress! Please wait...!"}
+ else if(dirty==100)
dat = {"This [src] is dirty! Please clean it before use!"}
else
var/list/items_counts = new
@@ -237,7 +236,7 @@
var/datum/browser/popup = new(user, name, name, 400, 400)
popup.set_content(dat)
popup.open(0)
- onclose(user, "[src.name]")
+ onclose(user, "[name]")
return
@@ -298,14 +297,14 @@
byproduct = recipe.get_byproduct()
stop()
if(cooked)
- cooked.forceMove(src.loc)
+ cooked.forceMove(loc)
for(var/i=1,i\The [src] turns on.", "You hear \a [src].")
- src.operating = 1
- src.icon_state = on_icon
- src.updateUsrDialog()
+ visible_message("\The [src] turns on.", "You hear \a [src].")
+ operating = 1
+ icon_state = on_icon
+ updateUsrDialog()
/obj/machinery/kitchen_machine/proc/abort()
- src.operating = 0 // Turn it off again aferwards
- src.icon_state = off_icon
- src.updateUsrDialog()
+ operating = 0 // Turn it off again aferwards
+ icon_state = off_icon
+ updateUsrDialog()
/obj/machinery/kitchen_machine/proc/stop()
- playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
- src.operating = 0 // Turn it off again aferwards
- src.icon_state = off_icon
- src.updateUsrDialog()
+ playsound(loc, 'sound/machines/ding.ogg', 50, 1)
+ operating = 0 // Turn it off again aferwards
+ icon_state = off_icon
+ updateUsrDialog()
/obj/machinery/kitchen_machine/proc/dispose()
for(var/obj/O in contents)
- O.forceMove(src.loc)
- if(src.reagents.total_volume)
- src.dirty++
- src.reagents.clear_reagents()
+ O.forceMove(loc)
+ if(reagents.total_volume)
+ dirty++
+ reagents.clear_reagents()
to_chat(usr, "You dispose of \the [src]'s contents.")
- src.updateUsrDialog()
+ updateUsrDialog()
/obj/machinery/kitchen_machine/proc/muck_start()
- playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound
- src.icon_state = dirty_icon // Make it look dirty!!
+ playsound(loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound
+ icon_state = dirty_icon // Make it look dirty!!
/obj/machinery/kitchen_machine/proc/muck_finish()
- playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
- src.visible_message("\The [src] gets covered in muck!")
- src.dirty = 100 // Make it dirty so it can't be used util cleaned
- src.flags = null //So you can't add condiments
- src.icon_state = dirty_icon // Make it look dirty too
- src.operating = 0 // Turn it off again aferwards
- src.updateUsrDialog()
+ playsound(loc, 'sound/machines/ding.ogg', 50, 1)
+ visible_message("\The [src] gets covered in muck!")
+ dirty = 100 // Make it dirty so it can't be used util cleaned
+ flags = null //So you can't add condiments
+ icon_state = dirty_icon // Make it look dirty too
+ operating = 0 // Turn it off again aferwards
+ updateUsrDialog()
/obj/machinery/kitchen_machine/proc/broke()
var/datum/effect/system/spark_spread/s = new
s.set_up(2, 1, src)
s.start()
- src.icon_state = broken_icon // Make it look all busted up and shit
- src.visible_message("The [src] breaks!") //Let them know they're stupid
- src.broken = 2 // Make it broken so it can't be used util fixed
- src.flags = null //So you can't add condiments
- src.operating = 0 // Turn it off again aferwards
- src.updateUsrDialog()
+ icon_state = broken_icon // Make it look all busted up and shit
+ visible_message("The [src] breaks!") //Let them know they're stupid
+ broken = 2 // Make it broken so it can't be used util fixed
+ flags = null //So you can't add condiments
+ operating = 0 // Turn it off again aferwards
+ updateUsrDialog()
/obj/machinery/kitchen_machine/proc/fail()
var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/ffuu = new(src)
@@ -382,7 +381,7 @@
if(id)
amount+=O.reagents.get_reagent_amount(id)
qdel(O)
- src.reagents.clear_reagents()
+ reagents.clear_reagents()
ffuu.reagents.add_reagent("carbon", amount)
ffuu.reagents.add_reagent("????", amount/10)
ffuu.forceMove(get_turf(src))
@@ -392,8 +391,8 @@
return
usr.set_machine(src)
- if(src.operating)
- src.updateUsrDialog()
+ if(operating)
+ updateUsrDialog()
return
switch(href_list["action"])
diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
index dc283e65d6c..e70ac59209e 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
@@ -33,7 +33,7 @@
cube_production = cubes_made
required_grind = req_grind
-/obj/machinery/monkey_recycler/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params)
if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O))
return
@@ -62,7 +62,7 @@
cycle_through = 0
to_chat(user, "You change the monkeycube type to [initial(cube_type.name)].")
- if(src.stat != 0) //NOPOWER etc
+ if(stat != 0) //NOPOWER etc
return
if(istype(O, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
@@ -76,11 +76,11 @@
user.drop_item()
qdel(target)
to_chat(user, "You stuff the monkey in the machine.")
- playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
+ playsound(loc, 'sound/machines/juicer.ogg', 50, 1)
var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
use_power(500)
- src.grinded++
+ grinded++
sleep(50)
pixel_x = initial(pixel_x)
to_chat(user, "The machine now has [grinded] monkey\s worth of material stored.")
@@ -90,15 +90,15 @@
to_chat(user, "The machine only accepts monkeys!")
return
-/obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob)
- if(src.stat != 0) //NOPOWER etc
+/obj/machinery/monkey_recycler/attack_hand(mob/user)
+ if(stat != 0) //NOPOWER etc
return
if(grinded >= required_grind)
to_chat(user, "The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube.")
- playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1)
+ playsound(loc, 'sound/machines/hiss.ogg', 50, 1)
grinded -= required_grind
for(var/i = 0, i < cube_production, i++) // Forgot to fix this bit the first time through
- new cube_type(src.loc)
+ new cube_type(loc)
to_chat(user, "The machine's display flashes that it has [grinded] monkey\s worth of material left.")
else // I'm not sure if the \s macro works with a word in between; I'll play it safe
to_chat(user, "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded].")
diff --git a/code/modules/food_and_drinks/kitchen_machinery/oven.dm b/code/modules/food_and_drinks/kitchen_machinery/oven.dm
index 796e8c4bd4b..6a47eb94ff5 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/oven.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/oven.dm
@@ -60,7 +60,7 @@
food_choices.Remove(U)
for(var/U in subtypesof(/obj/item/weapon/reagent_containers/food/snacks/customizable/cook))
var/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/V = new U
- src.food_choices += V
+ food_choices += V
return
/obj/machinery/cooking/candy
@@ -75,5 +75,5 @@
food_choices.Remove(U)
for(var/U in subtypesof(/obj/item/weapon/reagent_containers/food/snacks/customizable/candy))
var/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/V = new U
- src.food_choices += V
+ food_choices += V
return
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index d2b810dc7bb..5183fe6a4fa 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -58,9 +58,9 @@
var/time = 40
/datum/food_processor_process/proc/process_food(loc, what, obj/machinery/processor/processor)
- if(src.output && loc && processor)
+ if(output && loc && processor)
for(var/i = 0, i < processor.rating_amount, i++)
- new src.output(loc)
+ new output(loc)
if(what)
qdel(what)
@@ -154,9 +154,9 @@
return P
return 0
-/obj/machinery/processor/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+/obj/machinery/processor/attackby(obj/item/O, mob/user, params)
- if(src.processing)
+ if(processing)
to_chat(user, "\the [src] is already processing something!")
return 1
@@ -191,25 +191,25 @@
what.loc = src
return
-/obj/machinery/processor/attack_hand(var/mob/user as mob)
+/obj/machinery/processor/attack_hand(mob/user)
if(stat & (NOPOWER|BROKEN)) //no power or broken
return
- if(src.processing)
+ if(processing)
to_chat(user, "\the [src] is already processing something!")
return 1
- if(src.contents.len == 0)
+ if(contents.len == 0)
to_chat(user, "\the [src] is empty.")
return 1
- src.processing = 1
+ processing = 1
user.visible_message("[user] turns on [src].", \
"You turn on [src].", \
"You hear a food processor.")
- playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
+ playsound(loc, 'sound/machines/blender.ogg', 50, 1)
use_power(500)
var/total_time = 0
- for(var/O in src.contents)
+ for(var/O in contents)
var/datum/food_processor_process/P = select_recipe(O)
if(!P)
log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.")
@@ -217,14 +217,14 @@
total_time += P.time
sleep(total_time / rating_speed)
- for(var/O in src.contents)
+ for(var/O in contents)
var/datum/food_processor_process/P = select_recipe(O)
if(!P)
log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.")
continue
- P.process_food(src.loc, O, src)
- src.processing = 0
+ P.process_food(loc, O, src)
+ processing = 0
- src.visible_message("\the [src] has finished processing.", \
+ visible_message("\the [src] has finished processing.", \
"\the [src] has finished processing.", \
"You hear a food processor stopping.")
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index c6f7e54a003..2446b74ad22 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -53,7 +53,7 @@
A.forceMove(loc)
return ..()
-/obj/machinery/smartfridge/proc/accept_check(var/obj/item/O as obj)
+/obj/machinery/smartfridge/proc/accept_check(obj/item/O)
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/))
return 1
return 0
@@ -66,7 +66,7 @@
icon_on = "seeds"
icon_off = "seeds-off"
-/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O as obj)
+/obj/machinery/smartfridge/seeds/accept_check(obj/item/O)
if(istype(O,/obj/item/seeds/))
return 1
return 0
@@ -77,7 +77,7 @@
icon_state = "smartfridge" //To fix the icon in the map editor.
icon_on = "smartfridge_chem"
-/obj/machinery/smartfridge/medbay/accept_check(var/obj/item/O as obj)
+/obj/machinery/smartfridge/medbay/accept_check(obj/item/O)
if(istype(O,/obj/item/weapon/reagent_containers/glass/))
return 1
if(istype(O,/obj/item/weapon/storage/pill_bottle/))
@@ -91,7 +91,7 @@
desc = "A refrigerated storage unit for slime extracts"
req_access_txt = "47"
-/obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O as obj)
+/obj/machinery/smartfridge/secure/extract/accept_check(obj/item/O)
if(istype(O,/obj/item/slime_extract))
return 1
return 0
@@ -103,7 +103,7 @@
icon_on = "smartfridge_chem"
req_one_access_txt = "5;33"
-/obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O as obj)
+/obj/machinery/smartfridge/secure/medbay/accept_check(obj/item/O)
if(istype(O,/obj/item/weapon/reagent_containers/glass/))
return 1
if(istype(O,/obj/item/weapon/storage/pill_bottle/))
@@ -134,7 +134,7 @@
nanomanager.update_uis(src)
amount--
-/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj)
+/obj/machinery/smartfridge/chemistry/accept_check(obj/item/O)
if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers))
return 1
return 0
@@ -154,7 +154,7 @@
/obj/item/weapon/reagent_containers/glass/bottle/plasma = 1,
/obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine = 1)
-/obj/machinery/smartfridge/secure/chemistry/virology/accept_check(var/obj/item/O as obj)
+/obj/machinery/smartfridge/secure/chemistry/virology/accept_check(obj/item/O)
if(istype(O, /obj/item/weapon/reagent_containers/syringe) || istype(O, /obj/item/weapon/reagent_containers/glass/bottle) || istype(O, /obj/item/weapon/reagent_containers/glass/beaker))
return 1
return 0
@@ -163,17 +163,17 @@
name = "\improper Drink Showcase"
desc = "A refrigerated storage unit for tasty tasty alcohol."
-/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj)
+/obj/machinery/smartfridge/drinks/accept_check(obj/item/O)
if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment))
return 1
/obj/machinery/smartfridge/process()
if(stat & (BROKEN|NOPOWER))
return
- if(src.seconds_electrified > 0)
- src.seconds_electrified--
- if(src.shoot_inventory && prob(2))
- src.throw_item()
+ if(seconds_electrified > 0)
+ seconds_electrified--
+ if(shoot_inventory && prob(2))
+ throw_item()
/obj/machinery/smartfridge/power_change()
var/old_stat = stat
@@ -192,9 +192,9 @@
* Item Adding
********************/
-/obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob)
+/obj/machinery/smartfridge/attackby(obj/item/O, mob/user)
if(istype(O, /obj/item/weapon/screwdriver) && anchored)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
panel_open = !panel_open
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
overlays.Cut()
@@ -271,20 +271,20 @@
return 1
return 0
-/obj/machinery/smartfridge/attack_ai(mob/user as mob)
+/obj/machinery/smartfridge/attack_ai(mob/user)
return 0
-/obj/machinery/smartfridge/attack_ghost(mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/smartfridge/attack_ghost(mob/user)
+ return attack_hand(user)
-/obj/machinery/smartfridge/attack_hand(mob/user as mob)
+/obj/machinery/smartfridge/attack_hand(mob/user)
if(stat & (NOPOWER|BROKEN))
return
wires.Interact(user)
ui_interact(user)
//Drag pill bottle to fridge to empty it into the fridge
-/obj/machinery/smartfridge/MouseDrop_T(obj/over_object as obj, mob/user as mob)
+/obj/machinery/smartfridge/MouseDrop_T(obj/over_object, mob/user)
if(!istype(over_object, /obj/item/weapon/storage/pill_bottle)) //Only pill bottles, please
return
@@ -305,7 +305,7 @@
to_chat(user, "Some items are refused.")
nanomanager.update_uis(src)
-/obj/machinery/smartfridge/secure/emag_act(user as mob)
+/obj/machinery/smartfridge/secure/emag_act(user)
emagged = 1
locked = -1
to_chat(user, "You short out the product lock on [src].")
@@ -314,7 +314,7 @@
* SmartFridge Menu
********************/
-/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
user.set_machine(src)
var/data[0]
@@ -336,7 +336,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
- ui = new(user, src, ui_key, "smartfridge.tmpl", src.name, 400, 500)
+ ui = new(user, src, ui_key, "smartfridge.tmpl", name, 400, 500)
ui.set_initial_data(data)
ui.open()
@@ -346,7 +346,7 @@
var/mob/user = usr
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
- src.add_fingerprint(user)
+ add_fingerprint(user)
if(href_list["close"])
user.unset_machine()
@@ -387,7 +387,7 @@
item_quants[O]--
for(var/obj/T in contents)
if(T.name == O)
- T.forceMove(src.loc)
+ T.forceMove(loc)
throw_item = T
break
break
@@ -395,7 +395,7 @@
return 0
spawn(0)
throw_item.throw_at(target,16,3,src)
- src.visible_message("[src] launches [throw_item.name] at [target.name]!")
+ visible_message("[src] launches [throw_item.name] at [target.name]!")
return 1
/************************
diff --git a/code/modules/food_and_drinks/recipes/recipes_candy.dm b/code/modules/food_and_drinks/recipes/recipes_candy.dm
index 2ab54fc0e27..98f969a17ec 100644
--- a/code/modules/food_and_drinks/recipes/recipes_candy.dm
+++ b/code/modules/food_and_drinks/recipes/recipes_candy.dm
@@ -78,6 +78,11 @@
items = list(/obj/item/weapon/reagent_containers/food/snacks/egg)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/nougat
+/datum/recipe/candy/nougat/make_food(obj/container)
+ var/obj/item/weapon/reagent_containers/food/snacks/candy/nougat/being_cooked = ..()
+ being_cooked.reagents.del_reagent("egg")
+ return being_cooked
+
// ***********************************************************
// Base Candy Recipes (unflavored / plain)
// ***********************************************************
diff --git a/code/modules/food_and_drinks/recipes/recipes_grill.dm b/code/modules/food_and_drinks/recipes/recipes_grill.dm
index 4c459b737ff..5845e860c9d 100644
--- a/code/modules/food_and_drinks/recipes/recipes_grill.dm
+++ b/code/modules/food_and_drinks/recipes/recipes_grill.dm
@@ -89,6 +89,11 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers
+/datum/recipe/grill/fishfingers/make_food(obj/container)
+ var/obj/item/weapon/reagent_containers/food/snacks/fishfingers/being_cooked = ..()
+ being_cooked.reagents.del_reagent("egg")
+ return being_cooked
+
/datum/recipe/grill/cutlet
items = list(
/obj/item/weapon/reagent_containers/food/snacks/rawcutlet
diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm
index 0f58955a2bf..5903e191b4e 100644
--- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm
+++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm
@@ -205,10 +205,11 @@
reagents = list("water" = 5, "vodka" = 5)
fruit = list("amanita" = 3)
result = /obj/item/weapon/reagent_containers/food/snacks/amanitajelly
- make_food(var/obj/container as obj)
- var/obj/item/weapon/reagent_containers/food/snacks/amanitajelly/being_cooked = ..(container)
- being_cooked.reagents.del_reagent("amanitin")
- return being_cooked
+
+/datum/recipe/microwave/amanitajelly/make_food(obj/container)
+ var/obj/item/weapon/reagent_containers/food/snacks/amanitajelly/being_cooked = ..()
+ being_cooked.reagents.del_reagent("amanitin")
+ return being_cooked
/datum/recipe/microwave/meatballsoup
reagents = list("water" = 10)
@@ -538,10 +539,11 @@ datum/recipe/microwave/slimesandwich
/datum/recipe/microwave/herbsalad
fruit = list("ambrosia" = 3, "apple" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad
- make_food(var/obj/container as obj)
- var/obj/item/weapon/reagent_containers/food/snacks/herbsalad/being_cooked = ..(container)
- being_cooked.reagents.del_reagent("toxin")
- return being_cooked
+
+/datum/recipe/microwave/herbsalad/make_food(obj/container)
+ var/obj/item/weapon/reagent_containers/food/snacks/herbsalad/being_cooked = ..()
+ being_cooked.reagents.del_reagent("toxin")
+ return being_cooked
/datum/recipe/microwave/aesirsalad
fruit = list("ambrosiadeus" = 3, "goldapple" = 1)
@@ -553,10 +555,11 @@ datum/recipe/microwave/slimesandwich
/obj/item/weapon/reagent_containers/food/snacks/meatball,
)
result = /obj/item/weapon/reagent_containers/food/snacks/validsalad
- make_food(var/obj/container as obj)
- var/obj/item/weapon/reagent_containers/food/snacks/validsalad/being_cooked = ..(container)
- being_cooked.reagents.del_reagent("toxin")
- return being_cooked
+
+/datum/recipe/microwave/validsalad/make_food(obj/container)
+ var/obj/item/weapon/reagent_containers/food/snacks/validsalad/being_cooked = ..()
+ being_cooked.reagents.del_reagent("toxin")
+ return being_cooked
////////////////////////////FOOD ADDITTIONS///////////////////////////////
diff --git a/code/modules/food_and_drinks/recipes/recipes_oven.dm b/code/modules/food_and_drinks/recipes/recipes_oven.dm
index 9ee3ff3343e..d20c06e260f 100644
--- a/code/modules/food_and_drinks/recipes/recipes_oven.dm
+++ b/code/modules/food_and_drinks/recipes/recipes_oven.dm
@@ -176,20 +176,22 @@
/obj/item/weapon/paper,
)
result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie
- make_food(var/obj/container as obj)
+
+/datum/recipe/oven/fortunecookie/make_food(obj/container)
+ var/obj/item/weapon/paper/paper = locate() in container
+ paper.loc = null //prevent deletion
+ var/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/being_cooked = ..()
+ paper.loc = being_cooked
+ being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn
+ return being_cooked
+
+/datum/recipe/oven/fortunecookie/check_items(obj/container)
+ . = ..()
+ if(.)
var/obj/item/weapon/paper/paper = locate() in container
- paper.loc = null //prevent deletion
- var/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/being_cooked = ..(container)
- paper.loc = being_cooked
- being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn
- return being_cooked
- check_items(var/obj/container as obj)
- . = ..()
- if(.)
- var/obj/item/weapon/paper/paper = locate() in container
- if(!paper || !paper.info)
- return -1
- return .
+ if(!paper || !paper.info)
+ return -1
+ return .
/datum/recipe/oven/pizzamargherita
fruit = list("tomato" = 1)
@@ -293,6 +295,11 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread
+/datum/recipe/oven/bread/make_food(obj/container)
+ var/obj/item/weapon/reagent_containers/food/snacks/sliceable/bread/being_cooked = ..()
+ being_cooked.reagents.del_reagent("egg")
+ return being_cooked
+
/datum/recipe/oven/applepie
fruit = list("apple" = 1)
items = list(
@@ -377,6 +384,11 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/appletart
+/datum/recipe/oven/appletart/make_food(obj/container)
+ var/obj/item/weapon/reagent_containers/food/snacks/appletart/being_cooked = ..()
+ being_cooked.reagents.del_reagent("egg")
+ return being_cooked
+
/datum/recipe/oven/cracker
reagents = list("sodiumchloride" = 1)
items = list(
@@ -392,6 +404,11 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie
+/datum/recipe/oven/sugarcookie/make_food(obj/container)
+ var/obj/item/weapon/reagent_containers/food/snacks/sugarcookie/being_cooked = ..()
+ being_cooked.reagents.del_reagent("egg")
+ return being_cooked
+
/datum/recipe/oven/flatbread
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm
index 005be6c1f7e..b6c943dbdab 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm
@@ -31,7 +31,7 @@
/datum/crafting_recipe/cherrysandwich
name = "Cherry Jelly Sandwich"
reqs = list(
- /datum/reagent/cherryjelly = 5,
+ /datum/reagent/consumable/cherryjelly = 5,
/obj/item/weapon/reagent_containers/food/snacks/breadslice = 2,
)
result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry
@@ -49,7 +49,7 @@
/datum/crafting_recipe/jellyburger
name = "Cherry Jelly Burger"
reqs = list(
- /datum/reagent/cherryjelly = 5,
+ /datum/reagent/consumable/cherryjelly = 5,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry
diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm
index bc6692d72b1..712f368a078 100644
--- a/code/modules/hydroponics/grown_inedible.dm
+++ b/code/modules/hydroponics/grown_inedible.dm
@@ -13,9 +13,7 @@
..()
- var/datum/reagents/R = new/datum/reagents(50)
- reagents = R
- R.my_atom = src
+ create_reagents(50)
//Handle some post-spawn var stuff.
if(planttype)
@@ -98,7 +96,7 @@
to_chat(M, "You are stunned by the powerful acid of the Deathnettle!")
add_logs(user, M, "attacked", src)
- M.eye_blurry += force/7
+ M.AdjustEyeBlurry(force/7)
if(prob(20))
M.Paralyse(force / 6)
M.Weaken(force / 15)
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index e9c63ed8794..72bf80c58de 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -380,10 +380,12 @@
//--FalseIncarnate
/obj/machinery/portable_atmospherics/hydroponics/verb/remove_label()
-
set name = "Remove Label"
set category = "Object"
set src in view(1)
+
+ if(usr.incapacitated())
+ return
if(labelled)
to_chat(usr, "You remove the label.")
@@ -397,6 +399,9 @@
set name = "Set Light"
set category = "Object"
set src in view(1)
+
+ if(usr.incapacitated())
+ return
var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10)
if(new_light)
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index 2f41c6cdb5c..4086403c6e0 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -13,19 +13,23 @@
origin_tech = "magnets=1;biotech=1"
var/form_title
var/last_data
+ var/print_cooldown = 0
+ var/cooldown_length = 50 // Five seconds
/obj/item/device/analyzer/plant_analyzer/proc/print_report_verb()
set name = "Print Plant Report"
set category = "Object"
set src = usr
- if(usr.stat || usr.restrained() || usr.lying)
+ if(usr.incapacitated())
return
+
print_report(usr)
/obj/item/device/analyzer/plant_analyzer/Topic(href, href_list)
if(..())
- return
+ return 1
+
if(href_list["print"])
print_report(usr)
@@ -33,6 +37,11 @@
if(!last_data)
to_chat(user, "There is no scan data to print.")
return
+ if(print_cooldown > world.time)
+ to_chat(user, "The printer is still cooling down.")
+ return
+ print_cooldown = world.time + cooldown_length
+
playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src))
P.name = "paper - [form_title]"
diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm
index da60e939987..fd92e6675f1 100644
--- a/code/modules/lighting/light_source.dm
+++ b/code/modules/lighting/light_source.dm
@@ -114,9 +114,9 @@
/datum/light_source/proc/parse_light_color()
if(light_color)
- lum_r = GetRedPart(light_color) / 255
- lum_g = GetGreenPart(light_color) / 255
- lum_b = GetBluePart(light_color) / 255
+ lum_r = color2R(light_color) / 255
+ lum_g = color2G(light_color) / 255
+ lum_b = color2B(light_color) / 255
else
lum_r = 1
lum_g = 1
@@ -195,7 +195,7 @@
effect_str.Cut()
effect_turf.Cut()
-
+
/datum/light_source/proc/forget_turf(turf/T)
var/idx = effect_turf.Find(T)
effect_turf.Cut(idx, idx + 1)
diff --git a/code/modules/martial_arts/krav_maga.dm b/code/modules/martial_arts/krav_maga.dm
index 9b589878475..e1a577e24fa 100644
--- a/code/modules/martial_arts/krav_maga.dm
+++ b/code/modules/martial_arts/krav_maga.dm
@@ -88,7 +88,7 @@
D.visible_message("[A] pounds [D] on the chest!", \
"[A] slams your chest! You can't breathe!")
playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1)
- D.losebreath += 5
+ D.AdjustLoseBreath(5)
D.adjustOxyLoss(10)
return 1
@@ -97,7 +97,7 @@
"[A] karate chops your neck, rendering you unable to speak for a short time!")
playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1)
D.apply_damage(5, BRUTE)
- D.silent += 10
+ D.AdjustSilence(10)
return 1
datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
@@ -170,4 +170,4 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi
name = "krav maga gloves"
desc = "These gloves can teach you to perform Krav Maga using nanochips."
icon_state = "fightgloves"
- item_state = "fightgloves"
\ No newline at end of file
+ item_state = "fightgloves"
diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm
index bc4e15eb598..960844a063a 100644
--- a/code/modules/martial_arts/sleeping_carp.dm
+++ b/code/modules/martial_arts/sleeping_carp.dm
@@ -66,7 +66,7 @@
D.visible_message("[A] knees [D] in the stomach!", \
"[A] winds you with a knee in the stomach!")
D.audible_message("[D] gags!")
- D.losebreath += 3
+ D.AdjustLoseBreath(3)
D.Stun(2)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
if(prob(80))
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 1b1e4755e9b..9e4f7289532 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -344,7 +344,6 @@
desc = "An easily-compressable wall used for temporary shelter."
icon = 'icons/turf/walls/survival_pod_walls.dmi'
icon_state = "smooth"
- walltype = "shuttle"
smooth = SMOOTH_MORE // To Do: Add in Diagnaol Smooth Support
canSmoothWith = list(/turf/simulated/wall/survival, /obj/machinery/door/airlock/survival_pod)
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 50a9527326a..f158534475e 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -28,7 +28,7 @@
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if(language && (language.flags & NONVERBAL))
- if(disabilities & BLIND || blinded) //blind people can't see dumbass
+ if(!has_vision()) //blind people can't see dumbass
message = stars(message)
if(!speaker || !(speaker in view(src)))
@@ -65,7 +65,7 @@
if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src))
message = "[message]"
- if(disabilities & DEAF || ear_deaf)
+ if(!can_hear())
if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
if(speaker == src)
to_chat(src, "You cannot hear yourself speak!")
@@ -95,7 +95,7 @@
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if(language && (language.flags & NONVERBAL))
- if(disabilities & BLIND || blinded) //blind people can't see dumbass
+ if(!has_vision()) //blind people can't see dumbass
message = stars(message)
if(!speaker || !(speaker in view(src)))
@@ -182,7 +182,7 @@
formatted = language.format_message_radio(message, verb)
else
formatted = "[verb], \"[message]\""
- if(disabilities & DEAF || ear_deaf)
+ if(!can_hear())
if(prob(20))
to_chat(src, "You feel your headset vibrate but can hear nothing from it!")
else if(track)
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 81b54bcc3a6..c9e410d9e9b 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -605,7 +605,7 @@
return ..()
// Can we speak this language, as opposed to just understanding it?
-/mob/proc/can_speak(datum/language/speaking)
+/mob/proc/can_speak_language(datum/language/speaking)
return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages)
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 6797744fbf6..ca520ba9289 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -28,12 +28,14 @@
var/leaping = 0
ventcrawler = 2
+ var/list/alien_organs = list()
+
/mob/living/carbon/alien/New()
verbs += /mob/living/verb/mob_sleep
verbs += /mob/living/verb/lay_down
- internal_organs += new /obj/item/organ/internal/brain/xeno
- internal_organs += new /obj/item/organ/internal/xenos/hivenode
- for(var/obj/item/organ/internal/I in internal_organs)
+ alien_organs += new /obj/item/organ/internal/brain/xeno
+ alien_organs += new /obj/item/organ/internal/xenos/hivenode
+ for(var/obj/item/organ/internal/I in alien_organs)
I.insert(src)
..()
@@ -161,8 +163,8 @@
show_stat_emergency_shuttle_eta()
-/mob/living/carbon/alien/SetStunned(amount)
- ..(amount)
+/mob/living/carbon/alien/SetStunned(amount, updating = 1, force = 0)
+ ..()
if(!(status_flags & CANSTUN) && amount)
// add some movement delay
move_delay_add = min(move_delay_add + round(amount / 2), 10) // a maximum delay of 10
diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm
index 220b61e28d8..c6e2bcc510d 100644
--- a/code/modules/mob/living/carbon/alien/alien_defenses.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm
@@ -15,9 +15,8 @@ In all, this is a lot like the monkey code. /N
return
switch(M.a_intent)
-
if(I_HELP)
- sleeping = max(0,sleeping-5)
+ AdjustSleeping(-5)
resting = 0
AdjustParalysis(-3)
AdjustStunned(-3)
@@ -25,11 +24,12 @@ In all, this is a lot like the monkey code. /N
visible_message("[M.name] nuzzles [src] trying to wake it up!")
if(I_GRAB)
- src.grabbedby(M)
+ grabbedby(M)
return 1
else
if(health > 0)
+ M.do_attack_animation(src)
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
var/damage = 1
visible_message("[M.name] bites [src]!", \
@@ -39,13 +39,10 @@ In all, this is a lot like the monkey code. /N
updatehealth()
else
to_chat(M, "[name] is too injured for that.")
- return
-
/mob/living/carbon/alien/attack_larva(mob/living/carbon/alien/larva/L as mob)
return attack_alien(L)
-
/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M as mob)
if(..()) //to allow surgery to return properly.
return 0
@@ -56,7 +53,7 @@ In all, this is a lot like the monkey code. /N
if(I_HELP)
help_shake_act(M)
if(I_GRAB)
- src.grabbedby(M)
+ grabbedby(M)
if(I_HARM, I_DISARM)
return 1
return 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
index e45fa198006..1249c0f462c 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
@@ -6,15 +6,13 @@
icon_state = "aliend_s"
/mob/living/carbon/alien/humanoid/drone/New()
- var/datum/reagents/R = new/datum/reagents(100)
- reagents = R
- R.my_atom = src
+ create_reagents(100)
if(src.name == "alien drone")
src.name = text("alien drone ([rand(1, 1000)])")
src.real_name = src.name
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/drone
- internal_organs += new /obj/item/organ/internal/xenos/acidgland
- internal_organs += new /obj/item/organ/internal/xenos/resinspinner
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/drone
+ alien_organs += new /obj/item/organ/internal/xenos/acidgland
+ alien_organs += new /obj/item/organ/internal/xenos/resinspinner
..()
//Drones use the same base as generic humanoids.
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 60a1e5daa5f..bc1e1e4f56d 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -6,13 +6,11 @@
icon_state = "alienh_s"
/mob/living/carbon/alien/humanoid/hunter/New()
- var/datum/reagents/R = new/datum/reagents(100)
- reagents = R
- R.my_atom = src
+ create_reagents(100)
if(name == "alien hunter")
name = text("alien hunter ([rand(1, 1000)])")
real_name = name
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/hunter
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/hunter
..()
/mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates()
@@ -108,7 +106,7 @@
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
else
- weakened = 2
+ Weaken(2, 1, 1)
toggle_leap(0)
pounce_cooldown = !pounce_cooldown
@@ -116,7 +114,7 @@
pounce_cooldown = !pounce_cooldown
else if(A.density && !A.CanPass(src))
visible_message("[src] smashes into [A]!", "[src] smashes into [A]!")
- weakened = 2
+ Weaken(2, 1, 1)
if(leaping)
leaping = 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
index d93fb0a835c..2644ef8a306 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
@@ -35,15 +35,13 @@
overlays += I
/mob/living/carbon/alien/humanoid/sentinel/New()
- var/datum/reagents/R = new/datum/reagents(100)
- reagents = R
- R.my_atom = src
+ create_reagents(100)
if(name == "alien sentinel")
name = text("alien sentinel ([rand(1, 1000)])")
real_name = name
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel
- internal_organs += new /obj/item/organ/internal/xenos/acidgland
- internal_organs += new /obj/item/organ/internal/xenos/neurotoxin
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel
+ alien_organs += new /obj/item/organ/internal/xenos/acidgland
+ alien_organs += new /obj/item/organ/internal/xenos/neurotoxin
..()
/mob/living/carbon/alien/humanoid/sentinel/handle_regular_hud_updates()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm
index b49bc8c1ad1..d50befa47f0 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm
@@ -31,9 +31,7 @@
overlays += I
/mob/living/carbon/alien/humanoid/empress/New()
- var/datum/reagents/R = new/datum/reagents(100)
- reagents = R
- R.my_atom = src
+ create_reagents(100)
//there should only be one queen
for(var/mob/living/carbon/alien/humanoid/empress/E in living_mob_list)
@@ -44,11 +42,11 @@
break
real_name = src.name
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen
- internal_organs += new /obj/item/organ/internal/xenos/acidgland
- internal_organs += new /obj/item/organ/internal/xenos/eggsac
- internal_organs += new /obj/item/organ/internal/xenos/resinspinner
- internal_organs += new /obj/item/organ/internal/xenos/neurotoxin
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen
+ alien_organs += new /obj/item/organ/internal/xenos/acidgland
+ alien_organs += new /obj/item/organ/internal/xenos/eggsac
+ alien_organs += new /obj/item/organ/internal/xenos/resinspinner
+ alien_organs += new /obj/item/organ/internal/xenos/neurotoxin
..()
/mob/living/carbon/alien/humanoid/empress
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 5692c99e9be..b99cde337d6 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -16,9 +16,7 @@
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
- var/datum/reagents/R = new/datum/reagents(1000)
- reagents = R
- R.my_atom = src
+ create_reagents(1000)
if(name == "alien")
name = text("alien ([rand(1, 1000)])")
real_name = name
@@ -96,13 +94,15 @@
f_loss += 60
- adjustEarDamage(30, 120)
+ AdjustEarDamage(30)
+ AdjustEarDeaf(120)
if(3.0)
b_loss += 30
if(prob(50) && !shielded)
Paralyse(1)
- adjustEarDamage(15,60)
+ AdjustEarDamage(15)
+ AdjustEarDeaf(60)
adjustBruteLoss(b_loss)
adjustFireLoss(f_loss)
@@ -243,70 +243,6 @@
visible_message("[M] has attempted to disarm [src]!")
return
-/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
-As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
-In all, this is a lot like the monkey code. /N
-*/
-
-/mob/living/carbon/alien/humanoid/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if(!ticker)
- to_chat(M, "You cannot attack people before the game has started.")
- return
-
- if(istype(loc, /turf) && istype(loc.loc, /area/start))
- to_chat(M, "No attacking people at spawn, you jackass.")
- return
-
- ..()
-
- switch(M.a_intent)
-
- if(I_HELP)
- sleeping = max(0,sleeping-5)
- resting = 0
- AdjustParalysis(-3)
- AdjustStunned(-3)
- AdjustWeakened(-3)
- visible_message("[M.name] nuzzles [src] trying to wake it up!")
-
- else
- if(health > 0)
- M.do_attack_animation(src)
- playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
- var/damage = rand(1, 3)
- visible_message("[M.name] bites [src]!!", \
- "[M.name] bites [src]!!")
-
- adjustBruteLoss(damage)
- updatehealth()
- else
- to_chat(M, "[name] is too injured for that.")
- return
-
-
-/mob/living/carbon/alien/humanoid/attack_larva(mob/living/carbon/alien/larva/L as mob)
-
- switch(L.a_intent)
- if(I_HELP)
- visible_message("[L] rubs its head against [src].")
-
-
- else
- if(health > 0)
- L.do_attack_animation(src)
- playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
- var/damage = rand(1, 3)
- visible_message("[L.name] bites [src]!!", \
- "[L.name] bites [src]!!")
-
- adjustBruteLoss(damage)
- updatehealth()
- else
- to_chat(L, "[name] is too injured for that.")
- return
-
-
-
/mob/living/carbon/alien/humanoid/restrained()
if(handcuffed)
return 1
@@ -362,4 +298,4 @@ In all, this is a lot like the monkey code. /N
return initial(pixel_x)
/mob/living/carbon/alien/humanoid/get_permeability_protection()
- return 0.8
\ No newline at end of file
+ return 0.8
diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm
index 4cccb6e57ed..e6a2f6567c2 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/life.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm
@@ -57,18 +57,17 @@
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
blinded = 1
- silent = 0
+ SetSilence(0)
else //ALIVE. LIGHTS ARE ON
if(health < config.health_threshold_dead || !get_int_organ(/obj/item/organ/internal/brain))
death()
blinded = 1
- stat = DEAD
- silent = 0
+ SetSilence(0)
return 1
//UNCONSCIOUS. NO-ONE IS HOME
- if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) )
- if( health <= 20 && prob(1) )
+ if((getOxyLoss() > 50) || (config.health_threshold_crit >= health))
+ if(health <= 20 && prob(1))
spawn(0)
emote("gasp")
if(!reagents.has_reagent("epinephrine"))
@@ -76,14 +75,12 @@
Paralyse(3)
if(paralysis)
- AdjustParalysis(-1)
blinded = 1
stat = UNCONSCIOUS
else if(sleeping)
- sleeping = max(sleeping-1, 0)
blinded = 1
stat = UNCONSCIOUS
- if( prob(10) && health )
+ if(prob(10) && health)
spawn(0)
emote("hiss")
//CONSCIOUS
@@ -98,36 +95,25 @@
if(disabilities & BLIND) //disabled-blind, doesn't get better on its own
blinded = 1
else if(eye_blind) //blindness, heals slowly over time
- eye_blind = max(eye_blind-1,0)
+ AdjustEyeBlind(-1)
blinded = 1
else if(eye_blurry) //blurry eyes heal slowly
- eye_blurry = max(eye_blurry-1, 0)
+ AdjustEyeBlurry(-1)
//Ears
if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
- setEarDamage(-1, max(ear_deaf, 1))
+ EarDeaf(1)
else if(ear_deaf) //deafness, heals slowly over time
- adjustEarDamage(0,-1)
+ AdjustEarDeaf(-1)
else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs
- adjustEarDamage(-0.05, 0)
-
- //Other
- if(stunned)
- AdjustStunned(-1)
- if(!stunned)
- update_icons()
-
- if(weakened)
- weakened = max(weakened-1,0)
- if(!weakened)
- update_icons()
+ AdjustEarDamage(-0.05)
if(stuttering)
- stuttering = max(stuttering-1, 0)
+ AdjustStuttering(-1)
if(silent)
- silent = max(silent-1, 0)
+ AdjustSilence(-1)
if(druggy)
- druggy = max(druggy-1, 0)
- return 1
\ No newline at end of file
+ AdjustDruggy(-1)
+ return 1
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index daba3852764..11914d3c0ee 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -10,9 +10,7 @@
ventcrawler = 0
/mob/living/carbon/alien/humanoid/queen/New()
- var/datum/reagents/R = new/datum/reagents(100)
- reagents = R
- R.my_atom = src
+ create_reagents(100)
//there should only be one queen
for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list)
@@ -23,11 +21,11 @@
break
real_name = src.name
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen
- internal_organs += new /obj/item/organ/internal/xenos/acidgland
- internal_organs += new /obj/item/organ/internal/xenos/eggsac
- internal_organs += new /obj/item/organ/internal/xenos/resinspinner
- internal_organs += new /obj/item/organ/internal/xenos/neurotoxin
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen
+ alien_organs += new /obj/item/organ/internal/xenos/acidgland
+ alien_organs += new /obj/item/organ/internal/xenos/eggsac
+ alien_organs += new /obj/item/organ/internal/xenos/resinspinner
+ alien_organs += new /obj/item/organ/internal/xenos/neurotoxin
..()
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index eb5522cafac..c7c8c1cefa8 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -15,16 +15,14 @@
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/larva/New()
- var/datum/reagents/R = new/datum/reagents(100)
- reagents = R
- R.my_atom = src
+ create_reagents(100)
if(name == "alien larva")
name = "alien larva ([rand(1, 1000)])"
real_name = name
regenerate_icons()
add_language("Xenomorph")
add_language("Hivemind")
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/larva
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/larva
..()
@@ -88,13 +86,15 @@
f_loss += 60
- adjustEarDamage(30,120)
+ AdjustEarDamage(30)
+ AdjustEarDeaf(120)
if(3.0)
b_loss += 30
if(prob(50))
Paralyse(1)
- adjustEarDamage(15,60)
+ AdjustEarDamage(15)
+ AdjustEarDeaf(60)
adjustBruteLoss(b_loss)
adjustFireLoss(f_loss)
@@ -190,41 +190,6 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("[M] has attempted to kick [src]!", \
"[M] has attempted to kick [src]!")
- return
-
-/mob/living/carbon/alien/larva/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if(!ticker)
- to_chat(M, "You cannot attack people before the game has started.")
- return
-
- if(istype(loc, /turf) && istype(loc.loc, /area/start))
- to_chat(M, "No attacking people at spawn, you jackass.")
- return
-
- ..()
-
- switch(M.a_intent)
-
- if(I_HELP)
- sleeping = max(0,sleeping-5)
- resting = 0
- AdjustParalysis(-3)
- AdjustStunned(-3)
- AdjustWeakened(-3)
- visible_message("[M.name] nuzzles [src] trying to wake it up!")
-
- else
- if(health > 0)
- M.do_attack_animation(src)
- playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
- var/damage = 1
- visible_message("[M.name] bites [src]!", \
- "[M.name] bites [src]!")
- adjustBruteLoss(damage)
- updatehealth()
- else
- to_chat(M, "[name] is too injured for that.")
- return
/mob/living/carbon/alien/larva/restrained()
return 0
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index 76ceef6ad2e..447f65c6744 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -17,12 +17,12 @@
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
blinded = 1
- silent = 0
+ SetSilence(0)
else //ALIVE. LIGHTS ARE ON
if(health < -25 || !get_int_organ(/obj/item/organ/internal/brain))
death()
blinded = 1
- silent = 0
+ SetSilence(0)
return 1
//UNCONSCIOUS. NO-ONE IS HOME
@@ -35,11 +35,9 @@
Paralyse(3)
if(paralysis)
- AdjustParalysis(-2)
blinded = 1
stat = UNCONSCIOUS
else if(sleeping)
- sleeping = max(sleeping-1, 0)
blinded = 1
stat = UNCONSCIOUS
if( prob(10) && health )
@@ -57,32 +55,25 @@
if(disabilities & BLIND) //disabled-blind, doesn't get better on its own
blinded = 1
else if(eye_blind) //blindness, heals slowly over time
- eye_blind = max(eye_blind-1,0)
+ AdjustEyeBlind(-1)
blinded = 1
else if(eye_blurry) //blurry eyes heal slowly
- eye_blurry = max(eye_blurry-1, 0)
+ AdjustEyeBlurry(-1)
//Ears
if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
- setEarDamage(-1, max(ear_deaf, 1))
+ EarDeaf(1)
else if(ear_deaf) //deafness, heals slowly over time
- adjustEarDamage(0,-1)
+ AdjustEarDeaf(-1)
else if(ear_damage < 25) //ear damage heals slowly under this threshold.
- adjustEarDamage(-0.05,0)
-
- //Other
- if(stunned)
- AdjustStunned(-1)
-
- if(weakened)
- weakened = max(weakened-1,0)
+ AdjustEarDamage(-0.05)
if(stuttering)
- stuttering = max(stuttering-1, 0)
+ AdjustStuttering(-1)
if(silent)
- silent = max(silent-1, 0)
+ AdjustSilence(-1)
if(druggy)
- druggy = max(druggy-1, 0)
- return 1
\ No newline at end of file
+ AdjustDruggy(-1)
+ return 1
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 996687ee4b0..555fcff29da 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -8,45 +8,43 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "brain1"
- New()
- var/datum/reagents/R = new/datum/reagents(330)
- reagents = R
- R.my_atom = src
- ..()
+/mob/living/carbon/brain/New()
+ create_reagents(330)
+ ..()
- Destroy()
- if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting.
- if(stat!=DEAD) //If not dead.
- death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA
- ghostize() //Ghostize checks for key so nothing else is necessary.
- return ..()
+/mob/living/carbon/brain/Destroy()
+ if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting.
+ if(stat!=DEAD) //If not dead.
+ death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA
+ ghostize() //Ghostize checks for key so nothing else is necessary.
+ return ..()
- say_understands(var/other)//Goddamn is this hackish, but this say code is so odd
- if(istype(other, /mob/living/silicon/ai))
- if(!(container && istype(container, /obj/item/device/mmi)))
- return 0
- else
- return 1
- if(istype(other, /mob/living/silicon/decoy))
- if(!(container && istype(container, /obj/item/device/mmi)))
- return 0
- else
- return 1
- if(istype(other, /mob/living/silicon/pai))
- if(!(container && istype(container, /obj/item/device/mmi)))
- return 0
- else
- return 1
- if(istype(other, /mob/living/silicon/robot))
- if(!(container && istype(container, /obj/item/device/mmi)))
- return 0
- else
- return 1
- if(istype(other, /mob/living/carbon/human))
+/mob/living/carbon/brain/say_understands(other)//Goddamn is this hackish, but this say code is so odd
+ if(istype(other, /mob/living/silicon/ai))
+ if(!(container && istype(container, /obj/item/device/mmi)))
+ return 0
+ else
return 1
- if(istype(other, /mob/living/carbon/slime))
+ if(istype(other, /mob/living/silicon/decoy))
+ if(!(container && istype(container, /obj/item/device/mmi)))
+ return 0
+ else
return 1
- return ..()
+ if(istype(other, /mob/living/silicon/pai))
+ if(!(container && istype(container, /obj/item/device/mmi)))
+ return 0
+ else
+ return 1
+ if(istype(other, /mob/living/silicon/robot))
+ if(!(container && istype(container, /obj/item/device/mmi)))
+ return 0
+ else
+ return 1
+ if(istype(other, /mob/living/carbon/human))
+ return 1
+ if(istype(other, /mob/living/carbon/slime))
+ return 1
+ return ..()
/mob/living/carbon/brain/update_canmove(delay_action_updates = 0)
@@ -100,8 +98,8 @@ I'm using this for Stat to give it a more nifty interface to work with
/mob/living/carbon/brain/can_safely_leave_loc()
return 0 //You're not supposed to be ethereal jaunting, brains
-/mob/living/carbon/brain/adjustEarDamage()
+/mob/living/carbon/brain/SetEarDamage() // no ears to damage or heal
return
-/mob/living/carbon/brain/setEarDamage() // no ears to damage or heal
- return
\ No newline at end of file
+/mob/living/carbon/brain/SetEarDeaf()
+ return
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index fa466759bcc..e3ffe2074a7 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -21,7 +21,8 @@
/obj/item/organ/internal/brain/surgeryize()
if(!owner)
return
- owner.setEarDamage(0,0) //Yeah, didn't you...hear? The ears are totally inside the brain.
+ owner.SetEarDeaf(0)
+ owner.SetEarDamage(0) //Yeah, didn't you...hear? The ears are totally inside the brain.
/obj/item/organ/internal/brain/xeno
name = "xenomorph brain"
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index 40273bf66ad..74d096d9518 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -52,12 +52,12 @@
if(stat == DEAD)
blinded = 1
- silent = 0
+ SetSilence(0)
else
if(!container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)))
death()
- blinded =1
- silent = 0
+ blinded = 1
+ SetSilence(0)
return 1
. = 1
diff --git a/code/modules/mob/living/carbon/brain/login.dm b/code/modules/mob/living/carbon/brain/login.dm
index e90297dfe5b..622ae74656a 100644
--- a/code/modules/mob/living/carbon/brain/login.dm
+++ b/code/modules/mob/living/carbon/brain/login.dm
@@ -1,3 +1,3 @@
/mob/living/carbon/brain/Login()
..()
- sleeping = 0
\ No newline at end of file
+ SetSleeping(0)
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 4f76dce16bd..3b5b415964d 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -185,7 +185,7 @@
src.brainmob.loc = src
src.brainmob.container = src
src.brainmob.stat = 0
- src.brainmob.silent = 0
+ src.brainmob.SetSilence(0)
dead_mob_list -= src.brainmob
..()
diff --git a/code/modules/mob/living/carbon/brain/update_status.dm b/code/modules/mob/living/carbon/brain/update_status.dm
new file mode 100644
index 00000000000..2532edfe37d
--- /dev/null
+++ b/code/modules/mob/living/carbon/brain/update_status.dm
@@ -0,0 +1,8 @@
+/mob/living/carbon/brain/update_stat()
+ if(status_flags & GODMODE)
+ return
+ // if(health <= min_health)
+ if(health <= config.health_threshold_dead)
+ if(stat != DEAD)
+ death()
+ // Put brain(organ) damaging code here
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 688508c4bf3..f62df2ab76b 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -158,13 +158,13 @@
"You feel a powerful shock coursing through your body!", \
"You hear a heavy electrical crack." \
)
- jitteriness += 1000 //High numbers for violent convulsions
+ AdjustJitter(1000) //High numbers for violent convulsions
do_jitter_animation(jitteriness)
- stuttering += 2
+ AdjustStuttering(2)
if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5))
Stun(2)
spawn(20)
- jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less
+ AdjustJitter(-1000, bound_lower = 10) //Still jittery, but vastly less
if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5))
Stun(3)
Weaken(3)
@@ -268,7 +268,7 @@
if(istype(src,/mob/living/carbon/human) && src:w_uniform)
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
- src.sleeping = max(0,src.sleeping-5)
+ AdjustSleeping(-5)
if(src.sleeping == 0)
src.resting = 0
AdjustParalysis(-3)
@@ -327,8 +327,8 @@
E.damage += rand(12, 16)
if(E.damage > E.min_bruised_damage)
- eye_blind += damage
- eye_blurry += damage * rand(3, 6)
+ AdjustEyeBlind(damage)
+ AdjustEyeBlurry(damage * rand(3, 6))
if(E.damage > (E.min_bruised_damage + E.min_broken_damage) / 2)
if(!(E.status & ORGAN_ROBOT))
@@ -742,7 +742,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/mob/living/carbon/resist_fire()
fire_stacks -= 5
- weakened = max(weakened, 3)//We dont check for CANWEAKEN, I don't care how immune to weakening you are, if you're rolling on the ground, you're busy.
+ Weaken(3, 1, 1) //We dont check for CANWEAKEN, I don't care how immune to weakening you are, if you're rolling on the ground, you're busy.
update_canmove()
spin(32,2)
visible_message("[src] rolls on the floor, trying to put themselves out!", \
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index b0ccdc8381d..f8a9b38d098 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -1,9 +1,9 @@
/mob/living/carbon/death(gibbed)
- losebreath = 0
+ SetLoseBreath(0)
med_hud_set_health()
med_hud_set_status()
if(reagents)
reagents.death_metabolize(src)
- ..(gibbed)
\ No newline at end of file
+ ..(gibbed)
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 7802cfd53c6..eb58d39ea7c 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -4,32 +4,29 @@
AC.ui_interact(user, state = state)
/mob/living/carbon/human/proc/change_species(var/new_species)
- if(!new_species)
+ if(!new_species || species == new_species || !(new_species in all_species))
return
- if(species == new_species)
- return
-
- if(!(new_species in all_species))
- return
-
- set_species(new_species)
+ set_species(new_species, null, 1)
reset_hair()
+ if(species.bodyflags & HAS_MARKINGS)
+ reset_markings()
+
return 1
-/mob/living/carbon/human/proc/change_gender(var/gender, var/update_dna = 1)
+/mob/living/carbon/human/proc/change_gender(var/new_gender, var/update_dna = 1)
var/obj/item/organ/external/head/H = organs_by_name["head"]
- if(src.gender == gender)
+ if(gender == new_gender)
return
- src.gender = gender
+ gender = new_gender
var/datum/sprite_accessory/hair/current_hair = hair_styles_list[H.h_style]
- if(current_hair.gender != NEUTER && current_hair.gender != src.gender)
+ if(current_hair.gender != NEUTER && current_hair.gender != gender)
reset_head_hair()
var/datum/sprite_accessory/hair/current_fhair = facial_hair_styles_list[H.f_style]
- if(current_fhair.gender != NEUTER && current_fhair.gender != src.gender)
+ if(current_fhair.gender != NEUTER && current_fhair.gender != gender)
reset_facial_hair()
if(update_dna)
@@ -40,13 +37,7 @@
/mob/living/carbon/human/proc/change_hair(var/hair_style)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!hair_style)
- return
-
- if(H.h_style == hair_style)
- return
-
- if(!(hair_style in hair_styles_list))
+ if(!hair_style || !H || H.h_style == hair_style || !(hair_style in hair_styles_list))
return
H.h_style = hair_style
@@ -56,13 +47,7 @@
/mob/living/carbon/human/proc/change_facial_hair(var/facial_hair_style)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!facial_hair_style)
- return
-
- if(H.f_style == facial_hair_style)
- return
-
- if(!(facial_hair_style in facial_hair_styles_list))
+ if(!facial_hair_style || !H || H.f_style == facial_hair_style || !(facial_hair_style in facial_hair_styles_list))
return
H.f_style = facial_hair_style
@@ -72,13 +57,7 @@
/mob/living/carbon/human/proc/change_head_accessory(var/head_accessory_style)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!head_accessory_style)
- return
-
- if(H.ha_style == head_accessory_style)
- return
-
- if(!(head_accessory_style in head_accessory_styles_list))
+ if(!head_accessory_style || !H || H.ha_style == head_accessory_style || !(head_accessory_style in head_accessory_styles_list))
return
H.ha_style = head_accessory_style
@@ -86,52 +65,95 @@
update_head_accessory()
return 1
-/mob/living/carbon/human/proc/change_markings(var/marking_style)
- if(!marking_style)
+/mob/living/carbon/human/proc/change_markings(var/marking_style, var/location = "body")
+ if(!marking_style || m_styles[location] == marking_style || !(marking_style in marking_styles_list))
return
- if(src.m_style == marking_style)
+ var/datum/sprite_accessory/body_markings/marking = marking_styles_list[marking_style]
+ if(marking.name != "None" && marking.marking_location != location)
return
- if(!(marking_style in marking_styles_list))
- return
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ if(location == "head")
+ if(!head_organ)
+ return
- src.m_style = marking_style
+ if(head_organ.alt_head && head_organ.alt_head != "None")
+ var/datum/sprite_accessory/body_markings/head/H = marking_styles_list[marking_style]
+ if(marking.name != "None" && (!H.heads_allowed || (!("All" in H.heads_allowed) && !(head_organ.alt_head in H.heads_allowed))))
+ return
+ else
+ if(!head_organ.alt_head || head_organ.alt_head == "None")
+ head_organ.alt_head = "None"
+ var/datum/sprite_accessory/body_markings/head/H = marking_styles_list[marking_style]
+ if(H.heads_allowed && !("All" in H.heads_allowed))
+ return
- update_markings()
+ if(location == "tail" && marking.name != "None")
+ var/datum/sprite_accessory/body_markings/tail/tail_marking = marking_styles_list[marking_style]
+ if(!body_accessory)
+ if(tail_marking.tails_allowed)
+ return
+ else
+ if(!tail_marking.tails_allowed || !(body_accessory.name in tail_marking.tails_allowed))
+ return
+
+ m_styles[location] = marking_style
+
+ if(location == "tail")
+ stop_tail_wagging()
+ else
+ update_markings()
return 1
/mob/living/carbon/human/proc/change_body_accessory(var/body_accessory_style)
var/found
- if(!body_accessory_style)
+ if(!body_accessory_style || (body_accessory && body_accessory.name == body_accessory_style))
return
- if(src.body_accessory)
- if(src.body_accessory.name == body_accessory_style)
- return
-
for(var/B in body_accessory_by_name)
if(B == body_accessory_style)
- src.body_accessory = body_accessory_by_name[body_accessory_style]
+ body_accessory = body_accessory_by_name[body_accessory_style]
found = 1
if(!found)
return
+ m_styles["tail"] = "None"
update_tail_layer()
return 1
+/mob/living/carbon/human/proc/change_alt_head(var/alternate_head)
+ var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H || H.alt_head == alternate_head || (H.status & ORGAN_ROBOT) || (!(species.bodyflags & HAS_ALT_HEADS) && alternate_head != "None") || !(alternate_head in alt_heads_list))
+ return
+
+ H.alt_head = alternate_head
+
+ //Handle head markings if they're incompatible with the new alt head.
+ if(m_styles["head"])
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/body_markings/head/head_marking_style = marking_styles_list[head_marking]
+ if(!head_marking_style.heads_allowed || (!("All" in head_marking_style.heads_allowed) && !(H.alt_head in head_marking_style.heads_allowed)))
+ m_styles["head"] = "None"
+ update_markings()
+
+ update_body(1, 1) //Update the body and force limb icon regeneration to update the head with the new icon.
+ if(wear_mask)
+ update_inv_wear_mask()
+ return 1
+
/mob/living/carbon/human/proc/reset_hair()
reset_head_hair()
reset_facial_hair()
reset_head_accessory()
- if(m_style && m_style != "None") //Resets the markings if they were head markings.
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style && marking_style.marking_location == "head")
- reset_markings()
+ if(m_styles["head"] && m_styles["head"] != "None") //Resets head markings.
+ reset_markings("head")
/mob/living/carbon/human/proc/reset_head_hair()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
var/list/valid_hairstyles = generate_valid_hairstyles()
if(valid_hairstyles.len)
H.h_style = pick(valid_hairstyles)
@@ -143,6 +165,8 @@
/mob/living/carbon/human/proc/reset_facial_hair()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
var/list/valid_facial_hairstyles = generate_valid_facial_hairstyles()
if(valid_facial_hairstyles.len)
H.f_style = pick(valid_facial_hairstyles)
@@ -151,17 +175,32 @@
H.f_style = "Shaved"
update_fhair()
-/mob/living/carbon/human/proc/reset_markings()
- var/list/valid_markings = generate_valid_markings()
- if(valid_markings.len)
- m_style = pick(valid_markings)
+/mob/living/carbon/human/proc/reset_markings(var/location)
+ var/list/valid_markings
+
+ if(location)
+ valid_markings = generate_valid_markings(location)
+ if(valid_markings.len)
+ m_styles[location] = pick(valid_markings)
+ else
+ //this shouldn't happen
+ m_styles[location] = "None"
else
- //this shouldn't happen
- m_style = "None"
+ for(var/m_location in list("head", "body", "tail"))
+ valid_markings = generate_valid_markings(m_location)
+ if(valid_markings.len)
+ m_styles[m_location] = pick(valid_markings)
+ else
+ //this shouldn't happen
+ m_styles[m_location] = "None"
+
update_markings()
+ stop_tail_wagging()
/mob/living/carbon/human/proc/reset_head_accessory()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
var/list/valid_head_accessories = generate_valid_head_accessories()
if(valid_head_accessories.len)
H.ha_style = pick(valid_head_accessories)
@@ -193,32 +232,57 @@
update_body()
return 1
-/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue)
+/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue, var/secondary)
var/obj/item/organ/external/head/H = get_organ("head")
- if(red == H.r_hair && green == H.g_hair && blue == H.b_hair)
+ if(!H)
return
- H.r_hair = red
- H.g_hair = green
- H.b_hair = blue
+ if(!secondary)
+ if(red == H.r_hair && green == H.g_hair && blue == H.b_hair)
+ return
+
+ H.r_hair = red
+ H.g_hair = green
+ H.b_hair = blue
+ else
+ if(red == H.r_hair_sec && green == H.g_hair_sec && blue == H.b_hair_sec)
+ return
+
+ H.r_hair_sec = red
+ H.g_hair_sec = green
+ H.b_hair_sec = blue
update_hair()
return 1
-/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue)
+/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue, var/secondary)
var/obj/item/organ/external/head/H = get_organ("head")
- if(red == H.r_facial && green == H.g_facial && blue == H.b_facial)
+ if(!H)
return
- H.r_facial = red
- H.g_facial = green
- H.b_facial = blue
+ if(!secondary)
+ if(red == H.r_facial && green == H.g_facial && blue == H.b_facial)
+ return
+
+ H.r_facial = red
+ H.g_facial = green
+ H.b_facial = blue
+ else
+ if(red == H.r_facial_sec && green == H.g_facial_sec && blue == H.b_facial_sec)
+ return
+
+ H.r_facial_sec = red
+ H.g_facial_sec = green
+ H.b_facial_sec = blue
update_fhair()
return 1
/mob/living/carbon/human/proc/change_head_accessory_color(var/red, var/green, var/blue)
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
+
if(red == H.r_headacc && green == H.g_headacc && blue == H.b_headacc)
return
@@ -229,15 +293,16 @@
update_head_accessory()
return 1
-/mob/living/carbon/human/proc/change_marking_color(var/red, var/green, var/blue)
- if(red == r_markings && green == g_markings && blue == b_markings)
+/mob/living/carbon/human/proc/change_marking_color(var/colour, var/location = "body")
+ if(colour == m_colours[location])
return
- r_markings = red
- g_markings = green
- b_markings = blue
+ m_colours[location] = colour
- update_markings()
+ if(location == "tail")
+ update_tail_layer()
+ else
+ update_markings()
return 1
@@ -287,75 +352,66 @@
/mob/living/carbon/human/proc/generate_valid_hairstyles()
var/list/valid_hairstyles = new()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no hair.
+
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(gender == MALE && S.gender == FEMALE)
+ if(hairstyle == "Bald") //Just in case.
+ valid_hairstyles += hairstyle
continue
- if(gender == FEMALE && S.gender == MALE)
+ if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
continue
if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(!H)
- return
- if(H.species.name in S.species_allowed) //If this is a hairstyle native to the user's species...
- if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
- valid_hairstyles += hairstyle //Give them their hairstyles if they do.
- continue
- else //If they don't have the default head, they shouldn't be getting any hairstyles they wouldn't normally.
- continue
+ if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_hairstyles += hairstyle //Give them their hairstyles if they do.
else
- if(robohead.is_monitor) //If the hair style is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
- continue
- else
- if("Human" in S.species_allowed) //If the user has a robotic head and the hairstyle can fit humans, let them use it as a wig for their humanoid robot head.
- valid_hairstyles += hairstyle
- continue
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
+ valid_hairstyles += hairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the hair style allows, skip it. Otherwise, add it to the list.
- continue
- valid_hairstyles += hairstyle
+ if(H.species.name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ valid_hairstyles += hairstyle
return valid_hairstyles
/mob/living/carbon/human/proc/generate_valid_facial_hairstyles()
var/list/valid_facial_hairstyles = new()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no hair.
+
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(gender == MALE && S.gender == FEMALE)
+ if(facialhairstyle == "Shaved") //Just in case.
+ valid_facial_hairstyles += facialhairstyle
continue
- if(gender == FEMALE && S.gender == MALE)
+ if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
continue
if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(!H)
- continue // No head, no hair
if(H.species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
- if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
- valid_facial_hairstyles += facialhairstyle //Give them their facial hair styles if they do.
- continue
- else //If they don't have the default head, they shouldn't be getting any facial hair styles they wouldn't normally.
- continue
+ if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
else
-
- if(robohead.is_monitor) //If the facial hair style is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
- continue
- else
- if("Human" in S.species_allowed) //If the user has a robotic head and the facial hair style can fit humans, let them use it as a postiche for their humanoid robot head.
- valid_facial_hairstyles += facialhairstyle
- continue
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
+ valid_facial_hairstyles += facialhairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the facial hair style allows, skip it. Otherwise, add it to the list.
- continue
- valid_facial_hairstyles += facialhairstyle
+ if(H.species.name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ valid_facial_hairstyles += facialhairstyle
return valid_facial_hairstyles
/mob/living/carbon/human/proc/generate_valid_head_accessories()
var/list/valid_head_accessories = new()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no head accessory.
+
for(var/head_accessory in head_accessory_styles_list)
var/datum/sprite_accessory/S = head_accessory_styles_list[head_accessory]
@@ -365,18 +421,40 @@
return valid_head_accessories
-/mob/living/carbon/human/proc/generate_valid_markings()
+/mob/living/carbon/human/proc/generate_valid_markings(var/location = "body")
var/list/valid_markings = new()
var/obj/item/organ/external/head/H = get_organ("head")
- for(var/marking in marking_styles_list)
- var/datum/sprite_accessory/S = marking_styles_list[marking]
+ if(!H && location == "head")
+ return //No head, no head markings.
- if(!(species.name in S.species_allowed)) //If the user's head is not of a species the marking style allows, skip it. Otherwise, add it to the list.
+ for(var/marking in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/S = marking_styles_list[marking]
+ if(S.name == "None")
+ valid_markings += marking
continue
- if(H.species.flags & ALL_RPARTS) //If the user is a species that can have a robotic head...
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
- continue
+ if(S.marking_location != location) //If the marking isn't for the location we desire, skip.
+ continue
+ if(!(species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list.
+ continue
+ if(location == "tail")
+ if(!body_accessory)
+ if(S.tails_allowed)
+ continue
+ else
+ if(!S.tails_allowed || !(body_accessory.name in S.tails_allowed))
+ continue
+ if(location == "head")
+ var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name]
+ if(H.species.flags & ALL_RPARTS)//If the user is a species that can have a robotic head...
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
+ continue
+ else if(H.alt_head && H.alt_head != "None") //If the user's got an alt head, validate markings for that head.
+ if(!M.heads_allowed || (!("All" in M.heads_allowed) && !(H.alt_head in M.heads_allowed)))
+ continue
+ else
+ if(M.heads_allowed && !("All" in M.heads_allowed))
+ continue
valid_markings += marking
return valid_markings
@@ -389,10 +467,24 @@
valid_body_accessories = body_accessory_by_name.Copy()
else
if(!istype(A))
- valid_body_accessories += "None" //The only null entry should be the "None" option.
+ valid_body_accessories["None"] = "None" //The only null entry should be the "None" option.
continue
- if(!(species.name in A.allowed_species)) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
- continue
- valid_body_accessories += B
+ if(species.name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
+ valid_body_accessories += B
return valid_body_accessories
+
+/mob/living/carbon/human/proc/generate_valid_alt_heads()
+ var/list/valid_alt_heads = list()
+ var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no alt heads.
+ valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option, and there should always be a "None" option.
+ for(var/alternate_head in alt_heads_list)
+ var/datum/sprite_accessory/alt_heads/head = alt_heads_list[alternate_head]
+ if(!(H.species.name in head.species_allowed))
+ continue
+
+ valid_alt_heads += alternate_head
+
+ return valid_alt_heads
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm
index f4b95eec4d4..8744a09ea4d 100644
--- a/code/modules/mob/living/carbon/human/body_accessories.dm
+++ b/code/modules/mob/living/carbon/human/body_accessories.dm
@@ -112,36 +112,30 @@ var/global/list/body_accessory_by_species = list("None" = null)
//Vulpkanin
/datum/body_accessory/tail/vulpkanin_2
name = "Vulpkanin Alt 1 (Bushy)"
-
icon_state = "vulptail2"
animated_icon_state = "vulptail2_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_3
name = "Vulpkanin Alt 2 (Straight)"
-
icon_state = "vulptail3"
animated_icon_state = "vulptail3_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_4
name = "Vulpkanin Alt 3 (Tiny)"
-
icon_state = "vulptail4"
animated_icon_state = "vulptail4_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_5
name = "Vulpkanin Alt 4 (Short)"
-
icon_state = "vulptail5"
animated_icon_state = "vulptail5_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_6
name = "Vulpkanin Alt 5 (Straight Bushy)"
-
icon_state = "vulptail6"
animated_icon_state = "vulptail6_a"
allowed_species = list("Vulpkanin")
-
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index df78c286254..89c35870cad 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -97,8 +97,8 @@
emote("deathgasp") //let the world KNOW WE ARE DEAD
stat = DEAD
- dizziness = 0
- jitteriness = 0
+ SetDizzy(0)
+ SetJitter(0)
heart_attack = 0
//Handle species-specific deaths.
@@ -155,11 +155,19 @@
if(istype(H))
if(H.f_style)
- H.f_style = "Shaved"
+ H.f_style = initial(H.f_style)
if(H.h_style)
- H.h_style = "Bald"
+ H.h_style = initial(H.h_style)
+ if(H.ha_style)
+ H.ha_style = initial(H.ha_style)
+ if(H.alt_head)
+ H.alt_head = initial(H.alt_head)
+ H.handle_alt_icon()
+ m_styles = DEFAULT_MARKING_STYLES
update_fhair(0)
update_hair(0)
+ update_head_accessory(0)
+ update_markings(0)
mutations.Add(SKELETON)
mutations.Add(NOCLONE)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 0746cb30b2c..37826ae0a10 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -10,7 +10,7 @@
act = copytext(act, 1, t1)
var/muzzled = is_muzzled()
- if(disabilities & MUTE || silent)
+ if(!can_speak())
muzzled = 1
//var/m_type = 1
@@ -313,7 +313,7 @@
M = null
if(M)
- if(lying || weakened)
+ if(lying)
message = "[src] flops and flails around on the floor."
else
message = "[src] flips in [M]'s general direction."
@@ -378,7 +378,7 @@
message = "[src] faints."
if(src.sleeping)
return //Can't faint while asleep
- src.sleeping += 1
+ AdjustSleeping(2)
m_type = 1
if("cough", "coughs")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ed48c229b89..170673d2395 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -31,9 +31,7 @@
if(mind)
mind.name = real_name
- var/datum/reagents/R = new/datum/reagents(330)
- reagents = R
- R.my_atom = src
+ create_reagents(330)
prev_gender = gender // Debug for plural genders
make_blood()
@@ -352,7 +350,8 @@
else valid_limbs -= processing_dismember
if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
- adjustEarDamage(30, 120)
+ AdjustEarDamage(30)
+ AdjustEarDeaf(120)
if(prob(70) && !shielded)
Paralyse(10)
@@ -376,7 +375,8 @@
else valid_limbs -= processing_dismember
if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
- adjustEarDamage(15,60)
+ AdjustEarDamage(15)
+ AdjustEarDeaf(60)
if(prob(50) && !shielded)
Paralyse(10)
@@ -491,8 +491,7 @@
O.show_message(text("The [M.name] has shocked []!", src), 1)
Weaken(power)
- if(stuttering < power)
- stuttering = power
+ Stuttering(power)
Stun(power)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
@@ -709,12 +708,19 @@
if(!.) . = if_no_id //to prevent null-names making the mob unclickable
return
-//gets ID card object from special clothes slot or null.
-/mob/living/carbon/human/proc/get_idcard()
+//gets ID card object from special clothes slot or, if applicable, hands as well
+/mob/living/carbon/human/proc/get_idcard(var/check_hands = FALSE)
var/obj/item/weapon/card/id/id = wear_id
var/obj/item/device/pda/pda = wear_id
if(istype(pda) && pda.id)
id = pda.id
+
+ if(check_hands)
+ if(istype(get_active_hand(), /obj/item/weapon/card/id))
+ id = get_active_hand()
+ else if(istype(get_inactive_hand(), /obj/item/weapon/card/id))
+ id = get_inactive_hand()
+
if(istype(id))
return id
@@ -1472,7 +1478,6 @@
to_chat(usr, "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].")
/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0)
-
var/datum/species/oldspecies = species
if(!dna)
if(!new_species)
@@ -1525,9 +1530,9 @@
if(species.base_color && default_colour)
//Apply colour.
- r_skin = hex2num(copytext(species.base_color, 2, 4))
- g_skin = hex2num(copytext(species.base_color, 4, 6))
- b_skin = hex2num(copytext(species.base_color, 6, 8))
+ r_skin = color2R(species.base_color)
+ g_skin = color2G(species.base_color)
+ b_skin = color2B(species.base_color)
else
r_skin = 0
g_skin = 0
@@ -1542,37 +1547,47 @@
var/obj/item/organ/external/head/H = get_organ("head")
if(species.default_hair)
H.h_style = species.default_hair
+ else
+ H.h_style = "Bald"
if(species.default_fhair)
H.f_style = species.default_fhair
+ else
+ H.f_style = "Shaved"
if(species.default_headacc)
H.ha_style = species.default_headacc
+ else
+ H.ha_style = "None"
if(species.default_hair_colour)
//Apply colour.
- H.r_hair = hex2num(copytext(species.default_hair_colour, 2, 4))
- H.g_hair = hex2num(copytext(species.default_hair_colour, 4, 6))
- H.b_hair = hex2num(copytext(species.default_hair_colour, 6, 8))
+ H.r_hair = color2R(species.default_hair_colour)
+ H.g_hair = color2G(species.default_hair_colour)
+ H.b_hair = color2B(species.default_hair_colour)
else
H.r_hair = 0
H.g_hair = 0
H.b_hair = 0
if(species.default_fhair_colour)
- H.r_facial = hex2num(copytext(species.default_fhair_colour, 2, 4))
- H.g_facial = hex2num(copytext(species.default_fhair_colour, 4, 6))
- H.b_facial = hex2num(copytext(species.default_fhair_colour, 6, 8))
+ H.r_facial = color2R(species.default_fhair_colour)
+ H.g_facial = color2G(species.default_fhair_colour)
+ H.b_facial = color2B(species.default_fhair_colour)
else
H.r_facial = 0
H.g_facial = 0
H.b_facial = 0
if(species.default_headacc_colour)
- H.r_headacc = hex2num(copytext(species.default_headacc_colour, 2, 4))
- H.g_headacc = hex2num(copytext(species.default_headacc_colour, 4, 6))
- H.b_headacc = hex2num(copytext(species.default_headacc_colour, 6, 8))
+ H.r_headacc = color2R(species.default_headacc_colour)
+ H.g_headacc = color2G(species.default_headacc_colour)
+ H.b_headacc = color2B(species.default_headacc_colour)
else
H.r_headacc = 0
H.g_headacc = 0
H.b_headacc = 0
+ m_styles = DEFAULT_MARKING_STYLES //Wipes out markings, setting them all to "None".
+ m_colours = DEFAULT_MARKING_COLOURS //Defaults colour to #00000 for all markings.
+ body_accessory = null
+
if(!dna)
dna = new /datum/dna(null)
dna.species = species.name
@@ -1673,16 +1688,13 @@
if(!head_organ)
return
if(!robohead.is_monitor) //If they've got a prosthetic head and it isn't a monitor, they've no screen to adjust. Instead, let them change the colour of their optics!
- var/optic_colour = input(src, "Select optic colour", rgb(r_markings, g_markings, b_markings)) as color|null
+ var/optic_colour = input(src, "Select optic colour", m_colours["head"]) as color|null
if(incapacitated())
to_chat(src, "You were interrupted while changing the colour of your optics.")
return
if(optic_colour)
- r_markings = hex2num(copytext(optic_colour, 2, 4))
- g_markings = hex2num(copytext(optic_colour, 4, 6))
- b_markings = hex2num(copytext(optic_colour, 6, 8))
+ change_markings(optic_colour, "head")
- update_markings()
else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize.
var/list/hair = list()
for(var/i in hair_styles_list)
@@ -1690,14 +1702,12 @@
if((head_organ.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
- var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
+ var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
if(incapacitated())
to_chat(src, "You were interrupted while changing your monitor display.")
return
if(new_style)
- head_organ.h_style = new_style
-
- update_hair()
+ change_hair(new_style)
//Putting a couple of procs here that I don't know where else to dump.
//Mostly going to be used for Vox and Vox Armalis, but other human mobs might like them (for adminbuse).
@@ -1728,7 +1738,7 @@
if(last_special > world.time)
return
- if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
+ if(!canmove)
to_chat(src, "You cannot leap in your current state.")
return
@@ -1782,7 +1792,7 @@
if(last_special > world.time)
return
- if(stat || paralysis || stunned || weakened || lying)
+ if(!canmove)
to_chat(src, "\red You cannot do that in your current state.")
return
@@ -1977,6 +1987,12 @@
var/obj/item/weapon/card/id/id = wear_id
if(istype(id) && id.is_untrackable())
return 0
+ if(wear_pda)
+ var/obj/item/device/pda/pda = wear_pda
+ if(istype(pda))
+ var/obj/item/weapon/card/id/id = pda.id
+ if(istype(id) && id.is_untrackable())
+ return 0
if(istype(head, /obj/item/clothing/head))
var/obj/item/clothing/head/hat = head
if(hat.blockTracking)
@@ -1992,6 +2008,8 @@
if(wear_id)
. |= wear_id.GetAccess()
+ if(wear_pda)
+ . |= wear_pda.GetAccess()
if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
if(U.accessories)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 16d940dd439..0ceabc84bfe 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -254,7 +254,7 @@ emp_act
visible_message("[src] has been knocked down!", \
"[src] has been knocked down!")
apply_effect(5, WEAKEN, armor)
- confused += 15
+ AdjustConfused(15)
if(prob(I.force + ((100 - health)/2)) && src != user && I.damtype == BRUTE)
ticker.mode.remove_revolutionary(mind)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 272cb65e33a..0d30c5c8265 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -4,10 +4,8 @@ var/global/default_martial_art = new/datum/martial_art
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD)
//Marking colour and style
- var/r_markings = 0
- var/g_markings = 0
- var/b_markings = 0
- var/m_style = "None"
+ var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000.
+ var/list/m_styles = DEFAULT_MARKING_STYLES //All markings set to None.
var/s_tone = 0 //Skin tone
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 8288c2dbd8b..50f1e7cd342 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -152,7 +152,7 @@
mutations.Remove(FAT)
update_mutantrace(0)
update_mutations(0)
- update_body(0)
+ update_body(0, 1)
update_inv_w_uniform(0)
update_inv_wear_suit()
@@ -167,7 +167,7 @@
mutations.Add(FAT)
update_mutantrace(0)
update_mutations(0)
- update_body(0)
+ update_body(0, 1)
update_inv_w_uniform(0)
update_inv_wear_suit()
diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm
index 1862062e4cf..2dfc4f8d24e 100644
--- a/code/modules/mob/living/carbon/human/interactive/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm
@@ -167,7 +167,7 @@
/client/proc/customiseSNPC(mob/living/carbon/human/interactive/T in npc_master.botPool_l)
set name = "Customize SNPC"
- set desc = "Customise the SNPC"
+ set desc = "Customize the SNPC"
set category = "Debug"
if(!holder)
@@ -403,7 +403,7 @@
if(!hud_used)
hud_used = new /datum/hud/human(src)
-/mob/living/carbon/human/interactive/New()
+/mob/living/carbon/human/interactive/New(var/new_loc, var/new_species = null)
..()
snpc_list += src
@@ -916,7 +916,7 @@
TARGET = null
return 1
- if(!(get_turf(src) in validHome))
+ if(!(get_turf(src) in validHome) && validHome.len)
tryWalk(pick(get_area_turfs(job2area(myjob))))
return 1
return 0
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 78e9098f434..cfeb6e88faa 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -86,8 +86,8 @@
// If we have the gene for being crazy, have random events.
if(dna.GetSEState(HALLUCINATIONBLOCK))
- if(prob(1) && hallucination < 1)
- hallucination += 20
+ if(prob(1))
+ Hallucinate(20)
if(disabilities & COUGHING)
if((prob(5) && paralysis <= 1))
@@ -111,9 +111,9 @@
if(disabilities & NERVOUS)
speech_problem_flag = 1
if(prob(10))
- stuttering = max(10, stuttering)
+ Stuttering(10)
- if(getBrainLoss() >= 60 && stat != 2)
+ if(getBrainLoss() >= 60 && stat != DEAD)
speech_problem_flag = 1
if(prob(3))
var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH",
@@ -152,8 +152,8 @@
if(getBrainLoss() >= 100 && stat != 2) //you lapse into a coma and die without immediate aid; RIP. -Fox
Weaken(20)
- losebreath += 10
- silent += 2
+ AdjustLoseBreath(10)
+ AdjustSilence(2)
if(getBrainLoss() >= 120 && stat != 2) //they died from stupidity--literally. -Fox
visible_message("[src] goes limp, their facial expression utterly blank.")
@@ -281,10 +281,10 @@
var/datum/gas_mixture/breath
if(health <= config.health_threshold_crit)
- losebreath++
+ AdjustLoseBreath(1)
if(losebreath > 0)
- losebreath--
+ AdjustLoseBreath(-1)
if(prob(10))
spawn emote("gasp")
if(istype(loc, /obj/))
@@ -696,20 +696,20 @@
overeatduration -= 2
if(drowsyness)
- drowsyness--
- eye_blurry = max(2, eye_blurry)
+ AdjustDrowsy(-1)
+ EyeBlurry(2)
if(prob(5))
- sleeping += 1
+ AdjustSleeping(1)
Paralyse(5)
- confused = max(0, confused - 1)
+ AdjustConfused(-1)
// decrement dizziness counter, clamped to 0
if(resting)
- dizziness = max(0, dizziness - 15)
- jitteriness = max(0, jitteriness - 15)
+ AdjustDizzy(-15)
+ AdjustJitter(-15)
else
- dizziness = max(0, dizziness - 3)
- jitteriness = max(0, jitteriness - 3)
+ AdjustDizzy(-3)
+ AdjustJitter(-3)
if(species && species.flags & NO_INTORGANS) return
@@ -744,8 +744,7 @@
alcohol_strength *= 5
if(alcohol_strength >= slur_start) //slurring
- if(!slurring) slurring = 1
- slurring = drunk
+ Slur(drunk)
if(alcohol_strength >= brawl_start) //the drunken martial art
if(!istype(martial_art, /datum/martial_art/drunk_brawling))
var/datum/martial_art/drunk_brawling/F = new
@@ -754,18 +753,17 @@
if(istype(martial_art, /datum/martial_art/drunk_brawling))
martial_art.remove(src)
if(alcohol_strength >= confused_start && prob(33)) //confused walking
- if(!confused) confused = 1
- confused = max(confused+(3/sober_str),0)
+ if(!confused) Confused(1)
+ AdjustConfused(3/sober_str)
if(alcohol_strength >= blur_start) //blurry eyes
- eye_blurry = max(eye_blurry, 10/sober_str)
- drowsyness = max(drowsyness, 0)
+ EyeBlurry(10/sober_str)
if(!isSynthetic()) //stuff only for non-synthetics
if(alcohol_strength >= vomit_start) //vomiting
if(prob(8))
fakevomit()
if(alcohol_strength >= pass_out)
- Paralyse(5 / sober_str)
- drowsyness = max(drowsyness, 30/sober_str)
+ Paralyse(5/sober_str)
+ Drowsy(30/sober_str)
if(L)
L.take_damage(0.1, 1)
adjustToxLoss(0.1)
@@ -789,7 +787,7 @@
/mob/living/carbon/human/proc/has_booze() //checks if the human has ethanol or its subtypes inside
for(var/A in reagents.reagent_list)
var/datum/reagent/R = A
- if(istype(R, /datum/reagent/ethanol))
+ if(istype(R, /datum/reagent/consumable/ethanol))
return 1
return 0
@@ -837,14 +835,14 @@
vision = get_int_organ(species.vision_organ)
if(!species.vision_organ) // Presumably if a species has no vision organs, they see via some other means.
- eye_blind = 0
+ SetEyeBlind(0)
blinded = 0
- eye_blurry = 0
+ SetEyeBlurry(0)
else if(!vision || vision.is_broken()) // Vision organs cut out or broken? Permablind.
- eye_blind = 1
+ EyeBlind(2)
blinded = 1
- eye_blurry = 1
+ EyeBlurry(2)
else
//blindness
@@ -852,34 +850,34 @@
blinded = 1
else if(eye_blind) // Blindness, heals slowly over time
- eye_blind = max(eye_blind-1,0)
+ AdjustEyeBlind(-1)
blinded = 1
else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster
- eye_blurry = max(eye_blurry-3, 0)
+ AdjustEyeBlurry(-3)
blinded = 1
//blurry sight
if(vision.is_bruised()) // Vision organs impaired? Permablurry.
- eye_blurry = 1
+ EyeBlurry(2)
if(eye_blurry) // Blurry eyes heal slowly
- eye_blurry = max(eye_blurry-1, 0)
+ AdjustEyeBlurry(-1)
//Ears
if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
- setEarDamage(-1, max(ear_deaf, 1))
+ EarDeaf(1)
else if(ear_deaf) //deafness, heals slowly over time
- adjustEarDamage(0,-1)
+ AdjustEarDeaf(-1)
else if(istype(l_ear, /obj/item/clothing/ears/earmuffs) || istype(r_ear, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster
- adjustEarDamage(-0.15,0)
- setEarDamage(-1, max(ear_deaf, 1))
+ AdjustEarDamage(-0.15)
+ EarDeaf(1)
else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs
- adjustEarDamage(-0.05,0)
+ AdjustEarDamage(-0.05)
if(flying)
animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING)
@@ -896,7 +894,7 @@
else //dead
blinded = 1
- silent = 0
+ SetSilence(0)
/mob/living/carbon/human/handle_vision()
@@ -995,8 +993,8 @@
if(shock_stage >= 30)
if(shock_stage == 30) custom_emote(1,"is having trouble keeping their eyes open.")
- eye_blurry = max(2, eye_blurry)
- stuttering = max(stuttering, 5)
+ EyeBlurry(2)
+ Stuttering(5)
if(shock_stage == 40)
to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
@@ -1183,8 +1181,7 @@
if(!heart_attack)
return
else
- if(losebreath < 3)
- losebreath += 2
+ AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjustOxyLoss(5)
adjustBruteLoss(1)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 72e6ff63314..26ca4af83e8 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -142,7 +142,7 @@
message = uppertext(message)
verb = "yells loudly"
- if(locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs)
+ if((COMIC in mutations) || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs))
message = "[message]"
returns[1] = message
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index d8434a87223..5fe7d44ab6d 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -189,7 +189,7 @@
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
- H.sleeping = min(H.sleeping+2, 10)
+ H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10)
else if(SA_pp > 0.15) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
spawn(0)
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 33aa58b94d4..2af29aefe72 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -120,11 +120,11 @@
var/female_scream_sound = 'sound/goonstation/voice/female_scream.ogg'
//Default hair/headacc style vars.
- var/default_hair = "Bald" //Default hair style for newly created humans unless otherwise set.
+ var/default_hair //Default hair style for newly created humans unless otherwise set.
var/default_hair_colour
- var/default_fhair = "Shaved" //Default facial hair style for newly created humans unless otherwise set.
+ var/default_fhair //Default facial hair style for newly created humans unless otherwise set.
var/default_fhair_colour
- var/default_headacc = "None" //Default head accessory style for newly created humans unless otherwise set.
+ var/default_headacc //Default head accessory style for newly created humans unless otherwise set.
var/default_headacc_colour
//Defining lists of icon skin tones for species that have them.
@@ -305,7 +305,7 @@
if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so.
H.co2overloadtime = world.time
else if(world.time - H.co2overloadtime > 120)
- H.Paralyse(3)
+ H.Paralyse(5)
H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business
if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
H.adjustOxyLoss(8)
@@ -314,6 +314,7 @@
H.emote("cough")
else
H.clear_alert("co2")
+ H.co2overloadtime = 0
if(atmos_requirements["min_co2"]) //species breathes this gas, so they got their air
H.failed_last_breath = 0
H.adjustOxyLoss(-5)
@@ -332,7 +333,8 @@
if(SA_pp > atmos_requirements["sa_para"]) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > atmos_requirements["sa_sleep"]) // Enough to make us sleep as well
- H.sleeping = max(H.sleeping + 2, 10)
+ // This value is large because breaths are taken only once every 4 life ticks.
+ H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10)
else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
spawn(0)
@@ -509,7 +511,7 @@
if(tinted_weldhelh)
H.overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2)
if(H.tinttotal >= TINT_BLIND)
- H.eye_blind = max(H.eye_blind, 1)
+ H.EyeBlind(1)
else
H.clear_fullscreen("tint")
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 924a7c03bf4..1a6c8254a3e 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -8,7 +8,7 @@
language = "Sol Common"
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_TONE
+ bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
dietflags = DIET_OMNI
unarmed_type = /datum/unarmed_attack/punch
blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \
@@ -40,7 +40,7 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
+ bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING
dietflags = DIET_CARN
cold_level_1 = 280 //Default 260 - Lower is better
@@ -112,13 +112,11 @@
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
+ bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
flesh_color = "#AFA59E"
- base_color = "#333333"
- //Default styles for created mobs.
- default_headacc = "Tajaran Ears"
+ base_color = "#424242"
butt_sprite = "tajaran"
has_organ = list(
@@ -164,11 +162,11 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
+ bodyflags = FEET_PADDED | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | HAS_FUR
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
flesh_color = "#966464"
- base_color = "#B43214"
+ base_color = "#CF4D2F"
butt_sprite = "vulp"
has_organ = list(
@@ -212,7 +210,7 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_COLOR
+ bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS
dietflags = DIET_HERB
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
@@ -287,7 +285,7 @@
flags = NO_SCAN | IS_WHITELISTED
clothing_flags = HAS_SOCKS
dietflags = DIET_OMNI
- bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED
+ bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS
blood_color = "#2299FC"
flesh_color = "#808D11"
@@ -705,6 +703,7 @@
flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
+ bodyflags = HAS_BODY_MARKINGS
dietflags = DIET_HERB
reagent_tag = PROCESS_ORG
blood_color = "#A200FF"
@@ -855,7 +854,7 @@
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_COLOR | HAS_MARKINGS | HAS_HEAD_ACCESSORY
+ bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY
dietflags = 0 //IPCs can't eat, so no diet
blood_color = "#1F181F"
flesh_color = "#AAAAAA"
@@ -946,7 +945,7 @@
flags = IS_WHITELISTED | HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
- bodyflags = FEET_CLAWS | HAS_SKIN_TONE
+ bodyflags = FEET_CLAWS | HAS_SKIN_TONE | HAS_BODY_MARKINGS
dietflags = DIET_OMNI
cold_level_1 = -1 //Default 260 - Lower is better
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 8f7ed81a5fa..037e5234d27 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -212,15 +212,15 @@ var/global/list/damage_icon_parts = list()
if(update_icons) update_icons()
//BASE MOB SPRITE
-/mob/living/carbon/human/proc/update_body(var/update_icons=1)
+/mob/living/carbon/human/proc/update_body(var/update_icons=1, var/rebuild_base=0)
var/husk_color_mod = rgb(96,88,80)
var/hulk_color_mod = rgb(48,224,40)
- var/husk = (HUSK in src.mutations)
- var/fat = (FAT in src.mutations)
- var/hulk = (HULK in src.mutations)
- var/skeleton = (SKELETON in src.mutations)
+ var/husk = (HUSK in mutations)
+ var/fat = (FAT in mutations)
+ var/hulk = (HULK in mutations)
+ var/skeleton = (SKELETON in mutations)
if(species && species.bodyflags & HAS_ICON_SKIN_TONE)
species.updatespeciescolor(src)
@@ -262,7 +262,7 @@ var/global/list/damage_icon_parts = list()
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
- if(human_icon_cache[icon_key])
+ if(human_icon_cache[icon_key] && !rebuild_base)
base_icon = human_icon_cache[icon_key]
else
//BEGIN CACHED ICON GENERATION.
@@ -309,7 +309,7 @@ var/global/list/damage_icon_parts = list()
//END CACHED ICON GENERATION.
stand_icon.Blend(base_icon,ICON_OVERLAY)
- if(src.species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs...
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails).
else
overlays_standing[LIMBS_LAYER] = null // So we don't get the old species' sprite splatted on top of the new one's
@@ -360,29 +360,32 @@ var/global/list/damage_icon_parts = list()
//MARKINGS OVERLAY
/mob/living/carbon/human/proc/update_markings(var/update_icons=1)
- //Reset our markings
+ //Reset our markings.
overlays_standing[MARKINGS_LAYER] = null
+ //Base icon.
+ var/icon/markings_standing = new/icon('icons/mob/body_accessory.dmi',"accessory_none_s")
+
+ //Body markings.
var/obj/item/organ/external/chest/chest_organ = get_organ("chest")
- if(!chest_organ || chest_organ.is_stump() || (chest_organ.status & ORGAN_DESTROYED) )
- if(update_icons) update_icons()
- return
-
- //base icons
- var/icon/markings_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
-
- if(m_style && m_style != "None")
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style)
- var/obj/item/organ/external/head/head_organ = get_organ("head")
- if((!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) && marking_style.marking_location == "head")
- return //If the head is destroyed and it is the organ the marking is located on, get us out of here. This prevents floating optical markings on decapitated IPCs, for example.
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- if(marking_style.do_colouration)
- markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD)
- markings_standing.Blend(markings_s, ICON_OVERLAY)
- else
- //warning("Invalid m_style for [species.name]: [m_style]")
+ if(chest_organ && !chest_organ.is_stump() && !(chest_organ.status & ORGAN_DESTROYED) && m_styles["body"])
+ var/body_marking = m_styles["body"]
+ var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
+ if(body_marking_style && body_marking_style.species_allowed && (species.name in body_marking_style.species_allowed))
+ var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
+ if(body_marking_style.do_colouration)
+ b_marking_s.Blend(m_colours["body"], ICON_ADD)
+ markings_standing.Blend(b_marking_s, ICON_OVERLAY)
+ //Head markings.
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ if(head_organ && !head_organ.is_stump() && !(head_organ.status & ORGAN_DESTROYED) && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed && (head_organ.species.name in head_marking_style.species_allowed))
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ if(head_marking_style.do_colouration)
+ h_marking_s.Blend(m_colours["head"], ICON_ADD)
+ markings_standing.Blend(h_marking_s, ICON_OVERLAY)
overlays_standing[MARKINGS_LAYER] = image(markings_standing)
@@ -399,7 +402,7 @@ var/global/list/damage_icon_parts = list()
return
//masks and helmets can obscure our head accessory
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -426,15 +429,15 @@ var/global/list/damage_icon_parts = list()
//HAIR OVERLAY
/mob/living/carbon/human/proc/update_hair(var/update_icons=1)
//Reset our hair
- overlays_standing[HAIR_LAYER] = null
+ overlays_standing[HAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
- if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
+ if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
if(update_icons) update_icons()
return
//masks and helmets can obscure our hair, unless we're a synthetic
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -454,13 +457,19 @@ var/global/list/damage_icon_parts = list()
else if(hair_style.do_colouration)
hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
+ if(hair_style.secondary_theme)
+ var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
+ if(!hair_style.no_sec_colour)
+ hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD)
+ hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
+
hair_standing = hair_s //hair_standing.Blend(hair_s, ICON_OVERLAY)
//Having it this way preserves animations. Useful for IPC screens.
else
//warning("Invalid h_style for [species.name]: [h_style]")
//hair_standing.Blend(debrained_s, ICON_OVERLAY)//how does i overlay for fish?
- overlays_standing[HAIR_LAYER] = image(hair_standing)
+ overlays_standing[HAIR_LAYER] = image(hair_standing)
if(update_icons) update_icons()
@@ -468,15 +477,15 @@ var/global/list/damage_icon_parts = list()
//FACIAL HAIR OVERLAY
/mob/living/carbon/human/proc/update_fhair(var/update_icons=1)
//Reset our facial hair
- overlays_standing[FHAIR_LAYER] = null
+ overlays_standing[FHAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
- if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
+ if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
if(update_icons) update_icons()
return
//masks and helmets can obscure our facial hair, unless we're a synthetic
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -492,11 +501,18 @@ var/global/list/damage_icon_parts = list()
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND)
else if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD)
+
+ if(facial_hair_style.secondary_theme)
+ var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
+ if(!facial_hair_style.no_sec_colour)
+ facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD)
+ facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
+
face_standing.Blend(facial_s, ICON_OVERLAY)
else
//warning("Invalid f_style for [species.name]: [f_style]")
- overlays_standing[FHAIR_LAYER] = image(face_standing)
+ overlays_standing[FHAIR_LAYER] = image(face_standing)
if(update_icons) update_icons()
@@ -536,7 +552,7 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/update_mutantrace(var/update_icons=1)
//BS12 EDIT
- var/skel = (SKELETON in src.mutations)
+ var/skel = (SKELETON in mutations)
if(skel)
skeleton = 'icons/mob/human_races/r_skeleton.dmi'
else
@@ -562,7 +578,7 @@ var/global/list/damage_icon_parts = list()
..()
if(notransform) return
update_mutations(0)
- update_body(0)
+ update_body(0, 1) //Update the body and force limb icon regeneration.
update_hair(0)
update_head_accessory(0)
update_fhair(0)
@@ -997,13 +1013,21 @@ var/global/list/damage_icon_parts = list()
if(inv)
inv.update_icon()
if(wear_mask && (istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory)))
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ var/datum/sprite_accessory/alt_heads/alternate_head
+ if(head_organ.alt_head && head_organ.alt_head != "None")
+ alternate_head = alt_heads_list[head_organ.alt_head]
+
var/image/standing
+ var/icon/mask_icon = new(wear_mask.icon)
if(wear_mask.icon_override)
- standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state]")
+ mask_icon = new(wear_mask.icon_override)
+ standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[species.name])
- standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state]")
+ mask_icon = new(wear_mask.sprite_sheets[species.name])
+ standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
else
- standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]")
+ standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood")
@@ -1053,7 +1077,7 @@ var/global/list/damage_icon_parts = list()
clear_alert("legcuffed")
if(legcuffed)
overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1")
- throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed)
+ throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
if(m_intent != "walk")
m_intent = "walk"
if(hud_used && hud_used.move_intent)
@@ -1121,71 +1145,66 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1)
overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER.
- overlays_standing[TAIL_LAYER] = null // This will be one of two things:
- // If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
- // Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions.
+ overlays_standing[TAIL_LAYER] = null /* This will be one of two things:
+ If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
+ Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */
+
+ var/icon/tail_marking_icon
+ var/datum/sprite_accessory/body_markings/tail/tail_marking_style
+ if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ tail_marking_style = marking_styles_list[tail_marking]
+ tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
+ tail_marking_icon.Blend(m_colours["tail"], ICON_ADD)
if(body_accessory)
if(body_accessory.try_restrictions(src))
var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state)
if(species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
+ accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp1 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp1 = temp
+ var/icon/under = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
+ under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST)
- temp1.Insert(new/icon(accessory_s,dir=SOUTH),dir=SOUTH)
- temp1.Insert(new/icon(accessory_s,dir=EAST),dir=EAST)
- temp1.Insert(new/icon(accessory_s,dir=WEST),dir=WEST)
-
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
// Creates a blank icon, and copies accessory_s' north direction sprite into it
// before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp2 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp2 = temp
+ var/icon/over = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
+ over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
- temp2.Insert(new/icon(accessory_s,dir=NORTH),dir=NORTH)
-
- overlays_standing[TAIL_LAYER] = image(temp2, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
if(species.bodyflags & HAS_SKIN_COLOR)
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon)
+ tail_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp1.Insert(new/icon(tail_s,dir=SOUTH),dir=SOUTH)
- temp1.Insert(new/icon(tail_s,dir=EAST),dir=EAST)
- temp1.Insert(new/icon(tail_s,dir=WEST),dir=WEST)
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
+ under.Insert(new/icon(tail_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(tail_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(tail_s, dir=WEST), dir=WEST)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp2.Insert(new/icon(tail_s,dir=NORTH),dir=NORTH)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
+ over.Insert(new/icon(tail_s, dir=NORTH), dir=NORTH)
- overlays_standing[TAIL_LAYER] = image(temp2)
+ overlays_standing[TAIL_LAYER] = image(over)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(tail_s)
+ overlays_standing[TAIL_LAYER] = image(tail_s)
if(update_icons)
update_icons()
@@ -1193,70 +1212,67 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1)
overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER.
- overlays_standing[TAIL_LAYER] = null // This will be one of two things:
- // If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
- // Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions.
+ overlays_standing[TAIL_LAYER] = null /* This will be one of two things:
+ If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
+ Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */
+
+ var/icon/tail_marking_icon
+ var/datum/sprite_accessory/body_markings/tail/tail_marking_style
+ if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ tail_marking_style = marking_styles_list[tail_marking]
+ tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]w_s")
+ tail_marking_icon.Blend(m_colours["tail"], ICON_ADD)
if(body_accessory)
var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state())
if(species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
+ accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(body_accessory.allowed_species)
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp1 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp1 = temp
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
+ if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species))
+ under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST)
- temp1.Insert(accessory_s,dir=SOUTH)
- temp1.Insert(accessory_s,dir=EAST)
- temp1.Insert(accessory_s,dir=WEST)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
+ if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
+ over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp2 = temp
- else // Else if the user's species is not in the list of allowed species for the currently selected body accessory, this point must have been reached by admin-override. Use vulpkanin timings as default.
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp2 = temp
-
- temp2.Insert(accessory_s,dir=NORTH)
-
- overlays_standing[TAIL_LAYER] = image(temp2, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else if(species.tail && species.bodyflags & HAS_TAIL)
var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s")
if(species.bodyflags & HAS_SKIN_COLOR)
tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon)
+ tailw_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp1.Insert(tailw_s,dir=SOUTH)
- temp1.Insert(tailw_s,dir=EAST)
- temp1.Insert(tailw_s,dir=WEST)
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ under.Insert(new/icon(tailw_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(tailw_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(tailw_s, dir=WEST), dir=WEST)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp2.Insert(tailw_s,dir=NORTH)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH)
- overlays_standing[TAIL_LAYER] = image(temp2)
+ overlays_standing[TAIL_LAYER] = image(over)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(tailw_s)
+ overlays_standing[TAIL_LAYER] = image(tailw_s)
if(update_icons)
update_icons()
@@ -1282,17 +1298,17 @@ var/global/list/damage_icon_parts = list()
if(wear_suit.icon_override)
var/icon_path = "[wear_suit.icon_override]"
icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
- var/icon/icon_file
if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
- icon_file = new(icon_path)
- standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
+ var/icon/icon_file = new(icon_path)
+ if(wear_suit.icon_state in icon_file.IconStates())
+ standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name])
var/icon_path = "[wear_suit.sprite_sheets[species.name]]"
icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
- var/icon/icon_file
if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
- icon_file = new(icon_path)
- standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
+ var/icon/icon_file = new(icon_path)
+ if(wear_suit.icon_state in icon_file.IconStates())
+ standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
else
if(wear_suit.icon_state in C.IconStates())
standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]")
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 985047a8284..5e0841168e0 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -49,10 +49,10 @@
var/datum/gas_mixture/breath
if(health <= config.health_threshold_crit)
- losebreath++
+ AdjustLoseBreath(1)
if(losebreath > 0)
- losebreath--
+ AdjustLoseBreath(-1)
if(prob(10))
spawn emote("gasp")
if(istype(loc, /obj/))
@@ -165,7 +165,7 @@
if(SA_partialpressure > SA_para_min)
Paralyse(3)
if(SA_partialpressure > SA_sleep_min)
- sleeping = max(sleeping+2, 10)
+ AdjustSleeping(2, bound_lower = 0, bound_upper = 10)
else if(SA_partialpressure > 0.01)
if(prob(20))
spawn(0) emote(pick("giggle","laugh"))
@@ -319,30 +319,27 @@
C.pixel_x -= pixel_x_diff
C.pixel_y -= pixel_y_diff
src = oldsrc
- dizziness = max(dizziness - restingpwr, 0)
+ AdjustDizzy(-restingpwr)
if(drowsyness)
- drowsyness = max(drowsyness - restingpwr, 0)
- eye_blurry = max(2, eye_blurry)
+ AdjustDrowsy(-restingpwr)
+ EyeBlurry(2)
if(prob(5))
- sleeping += 1
+ AdjustSleeping(1)
Paralyse(5)
if(confused)
- confused = max(0, confused - 1)
+ AdjustConfused(-1)
//Jitteryness
if(jitteriness)
do_jitter_animation(jitteriness)
- jitteriness = max(jitteriness - restingpwr, 0)
+ AdjustJitter(-restingpwr)
if(hallucination)
spawn handle_hallucinations()
- if(hallucination<=2)
- hallucination = 0
- else
- hallucination -= 2
+ AdjustHallucinate(-2)
/mob/living/carbon/handle_sleeping()
if(..())
@@ -352,8 +349,8 @@
spawn(0)
emote("snore")
// Keep SSD people asleep
- if(player_logged && sleeping < 2)
- sleeping = 2
+ if(player_logged)
+ Sleeping(2)
return sleeping
diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm
index b51e0084ee3..6e3221c19fa 100644
--- a/code/modules/mob/living/carbon/slime/life.dm
+++ b/code/modules/mob/living/carbon/slime/life.dm
@@ -208,25 +208,25 @@
if(src.stuttering) src.stuttering = 0
if(src.eye_blind)
- src.eye_blind = 0
+ src.SetEyeBlind(0)
src.blinded = 1
- if(src.ear_deaf > 0) src.ear_deaf = 0
+ if(src.ear_deaf > 0) SetEarDeaf(0)
if(src.ear_damage < 25)
- src.ear_damage = 0
+ SetEarDamage(0)
src.density = !( src.lying )
if(src.disabilities & BLIND)
src.blinded = 1
if(src.disabilities & DEAF)
- src.ear_deaf = 1
+ EarDeaf(1)
if(src.eye_blurry > 0)
- src.eye_blurry = 0
+ SetEyeBlurry(0)
if(src.druggy > 0)
- src.druggy = 0
+ SetDruggy(0)
return 1
diff --git a/code/modules/mob/living/carbon/update_status.dm b/code/modules/mob/living/carbon/update_status.dm
new file mode 100644
index 00000000000..3b0d3a045fc
--- /dev/null
+++ b/code/modules/mob/living/carbon/update_status.dm
@@ -0,0 +1,17 @@
+/mob/living/carbon/update_stat()
+ if(status_flags & GODMODE)
+ return
+ if(stat != DEAD)
+// if(health <= min_health)
+ if(health <= config.health_threshold_dead)
+ death()
+ return
+// if(paralysis || sleeping || getOxyLoss() > low_oxy_ko || (status_flags & FAKEDEATH) || health <= crit_health)
+ if(paralysis || sleeping || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= config.health_threshold_crit)
+ if(stat == CONSCIOUS)
+ KnockOut()
+ else
+ if(stat == UNCONSCIOUS)
+ // updating=FALSE because `WakeUp` will handle canmove up for us
+ StopResting(updating=FALSE)
+ WakeUp()
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 921080c989a..ffd1fb9cd60 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -57,17 +57,16 @@
rad_damage = max(effect * ((100-run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm."))/100),0)
radiation += rad_damage
if(SLUR)
- slurring = max(slurring,(effect * blocked))
+ Slur(effect * blocked)
if(STUTTER)
- if(status_flags & CANSTUN) // stun is usually associated with stutter
- stuttering = max(stuttering,(effect * blocked))
+ Stuttering(effect * blocked)
if(EYE_BLUR)
- eye_blurry = max(eye_blurry,(effect * blocked))
+ EyeBlurry(effect * blocked)
if(DROWSY)
- drowsyness = max(drowsyness,(effect * blocked))
+ Drowsy(effect * blocked)
if(JITTER)
if(status_flags & CANSTUN)
- jitteriness = max(jitteriness,(effect * blocked))
+ Jitter(effect * blocked)
updatehealth()
return 1
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index e17d9af6250..c5ce705ba17 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -3,4 +3,4 @@
clear_fullscreens()
update_action_buttons_icon()
- ..(gibbed)
\ No newline at end of file
+ ..(gibbed)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index a151a062bce..e7222caa910 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -117,14 +117,14 @@
/mob/living/proc/handle_stunned()
if(stunned)
- AdjustStunned(-1)
+ AdjustStunned(-1, updating = 1, force = 1)
if(!stunned)
update_icons()
return stunned
/mob/living/proc/handle_weakened()
if(weakened)
- AdjustWeakened(-1)
+ AdjustWeakened(-1, updating = 1, force = 1)
if(!weakened)
update_icons()
return weakened
@@ -136,22 +136,22 @@
/mob/living/proc/handle_silent()
if(silent)
- silent = max(silent-1, 0)
+ AdjustSilence(-1)
return silent
/mob/living/proc/handle_drugged()
if(druggy)
- druggy = max(druggy-1, 0)
+ AdjustDruggy(-1)
return druggy
/mob/living/proc/handle_slurring()
if(slurring)
- slurring = max(slurring-1, 0)
+ AdjustSlur(-1)
return slurring
/mob/living/proc/handle_paralysed()
if(paralysis)
- AdjustParalysis(-1)
+ AdjustParalysis(-1, updating = 1, force = 1)
return paralysis
/mob/living/proc/handle_sleeping()
@@ -164,7 +164,7 @@
/mob/living/proc/handle_slowed()
if(slowed)
- slowed = max(slowed-1, 0)
+ AdjustSlowed(-1)
return slowed
/mob/living/proc/handle_drunk()
@@ -175,19 +175,20 @@
/mob/living/proc/handle_disabilities()
//Eyes
if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own
- eye_blind = max(eye_blind, 1)
+ EyeBlind(1)
else if(eye_blind) //blindness, heals slowly over time
- eye_blind = max(eye_blind-1,0)
+ AdjustEyeBlind(-1)
else if(eye_blurry) //blurry eyes heal slowly
- eye_blurry = max(eye_blurry-1, 0)
+ AdjustEyeBlurry(-1)
//Ears
if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
- setEarDamage(-1, max(ear_deaf, 1))
+ EarDeaf(1)
else
// deafness heals slowly over time, unless ear_damage is over 100
if(ear_damage < 100)
- adjustEarDamage(-0.05,-1)
+ AdjustEarDamage(-0.05)
+ AdjustEarDeaf(-1)
//this handles hud updates. Calls update_vision() and handle_hud_icons()
/mob/living/proc/handle_regular_hud_updates()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 72cc4789779..6be18445b44 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -261,19 +261,6 @@
var/obj/item/organ/external/def_zone = ran_zone(t)
return def_zone
-
-//damage/heal the mob ears and adjust the deaf amount
-/mob/living/adjustEarDamage(damage, deaf)
- ear_damage = max(0, ear_damage + damage)
- ear_deaf = max(0, ear_deaf + deaf)
-
-//pass a negative argument to skip one of the variable
-/mob/living/setEarDamage(damage, deaf)
- if(damage >= 0)
- ear_damage = damage
- if(deaf >= 0)
- ear_deaf = deaf
-
// heal ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/heal_organ_damage(var/brute, var/burn)
adjustBruteLoss(-brute)
@@ -323,14 +310,6 @@
C.reagents.clear_reagents()
C.reagents.addiction_list.Cut()
-/mob/living/proc/update_revive() // handles revival through other means than cloning or adminbus (defib, IPC repair)
- stat = CONSCIOUS
- dead_mob_list -= src
- living_mob_list |= src
- mob_list |= src
- setEarDamage(-1,0)
- timeofdeath = 0
-
/mob/living/proc/rejuvenate()
var/mob/living/carbon/human/human_mob = null //Get this declared for use later.
@@ -341,25 +320,33 @@
setBrainLoss(0)
setStaminaLoss(0)
SetSleeping(0)
- SetParalysis(0)
- SetStunned(0)
- SetWeakened(0)
- slowed = 0
- losebreath = 0
- dizziness = 0
- jitteriness = 0
- confused = 0
- drowsyness = 0
+ SetParalysis(0, 1, 1)
+ SetStunned(0, 1, 1)
+ SetWeakened(0, 1, 1)
+ SetSlowed(0)
+ SetLoseBreath(0)
+ SetDizzy(0)
+ SetJitter(0)
+ SetConfused(0)
+ SetDrowsy(0)
radiation = 0
- druggy = 0
- hallucination = 0
+ SetDruggy(0)
+ SetHallucinate(0)
+ blinded = 0
nutrition = 400
bodytemperature = 310
- disabilities = 0
- blinded = 0
- eye_blind = 0
- eye_blurry = 0
- setEarDamage(0,0)
+ CureBlind()
+ CureNearsighted()
+ CureMute()
+ CureDeaf()
+ CureTourettes()
+ CureEpilepsy()
+ CureCoughing()
+ CureNervous()
+ SetEyeBlind(0)
+ SetEyeBlurry(0)
+ SetEarDamage(0)
+ SetEarDeaf(0)
heal_overall_damage(1000, 1000)
ExtinguishMob()
fire_stacks = 0
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index c142c8d28d1..c3dab651906 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -15,8 +15,6 @@
var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot.
var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are stunned if it gets too high. Holodeck and hallucinations deal this.
- var/hallucination = 0 //Directly affects how long a mob will hallucinate for
-
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
@@ -32,7 +30,6 @@
var/update_slimes = 1
var/implanting = 0 //Used for the mind-slave implant
- var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
var/floating = 0
var/mob_size = MOB_SIZE_HUMAN
var/nightvision = 0
diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm
index 71e26e60858..10ba19b4302 100644
--- a/code/modules/mob/living/logout.dm
+++ b/code/modules/mob/living/logout.dm
@@ -4,6 +4,6 @@
if(!key) //key and mind have become seperated. I believe this is for when a staff member aghosts.
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
//This causes instant sleep and tags a player as SSD. See life.dm for furthering SSD.
- if(sleeping < 2 && mind.active)
- sleeping = 2
- player_logged = 1
\ No newline at end of file
+ if(mind.active)
+ Sleeping(2)
+ player_logged = 1
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index e534d67ee72..3987b709e3e 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -80,9 +80,6 @@ proc/get_radio_key_from_channel(var/channel)
verb = "stammers"
speech_problem_flag = 1
- if(COMIC in mutations)
- message = "[message]"
-
if(!IsVocal())
message = ""
speech_problem_flag = 1
@@ -283,8 +280,14 @@ proc/get_radio_key_from_channel(var/channel)
/mob/living/proc/GetVoice()
return name
-/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't
- if(stat) return 0 //already snowflaked to shit can call the parent and handle emoting sanely
+/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't already snowflaked to shit can call the parent and handle emoting sanely
+ if(client)
+ if(client.prefs.muted & MUTE_IC)
+ to_chat(src, "You cannot speak in IC (Muted).")
+ return
+
+ if(stat)
+ return 0
if(..(act, type, message))
return 1
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index 8cf6863eafb..2a3b39c1c9b 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -82,7 +82,7 @@ var/const/VOX_PATH = "sound/vox_fem/"
for(var/mob/M in player_list)
if(M.client)
var/turf/T = get_turf(M)
- if(T && T.z == z_level && !isdeaf(M))
+ if(T && T.z == z_level && M.can_hear())
M << voice
else
only_listener << voice
diff --git a/code/modules/mob/living/silicon/ai/update_status.dm b/code/modules/mob/living/silicon/ai/update_status.dm
new file mode 100644
index 00000000000..4fa060abf39
--- /dev/null
+++ b/code/modules/mob/living/silicon/ai/update_status.dm
@@ -0,0 +1,10 @@
+/mob/living/silicon/ai/update_stat()
+ if(status_flags & GODMODE)
+ return
+ if(stat != DEAD)
+ if(health <= config.health_threshold_dead)
+ death()
+ return
+ else if(stat == UNCONSCIOUS)
+ WakeUp()
+ //diag_hud_set_status()
diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm
index fa71b48232e..01240adf942 100644
--- a/code/modules/mob/living/silicon/login.dm
+++ b/code/modules/mob/living/silicon/login.dm
@@ -1,15 +1,12 @@
/mob/living/silicon/Login()
- sleeping = 0
+ SetSleeping(0)
if(mind && ticker && ticker.mode)
- ticker.mode.remove_traitor(mind)
- ticker.mode.remove_traitor_mind(mind)
ticker.mode.remove_revolutionary(mind, 1)
ticker.mode.remove_cultist(mind, 1)
ticker.mode.remove_wizard(mind)
ticker.mode.remove_changeling(mind)
ticker.mode.remove_vampire(mind)
ticker.mode.remove_thrall(mind, 0)
- ticker.mode.remove_operative(mind)
ticker.mode.remove_shadowling(mind)
ticker.mode.remove_abductor(mind)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index dfa79a0d0d1..104c2746d16 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -547,8 +547,7 @@
else
var/datum/gas_mixture/env = T.return_air()
data["reading"] = 1
- var/pres = env.return_pressure() * 10
- data["pressure"] = "[round(pres/10)].[pres%10]"
+ data["pressure"] = env.return_pressure()
data["temperature"] = round(env.temperature)
data["temperatureC"] = round(env.temperature-T0C)
diff --git a/code/modules/mob/living/silicon/pai/update_status.dm b/code/modules/mob/living/silicon/pai/update_status.dm
new file mode 100644
index 00000000000..155ecc84a28
--- /dev/null
+++ b/code/modules/mob/living/silicon/pai/update_status.dm
@@ -0,0 +1,3 @@
+/mob/living/silicon/pai/update_stat()
+ if(health <= 0)
+ death(gibbed = 0)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm
index 0a98e276c43..053384baba5 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm
@@ -1,4 +1,7 @@
-/mob/living/silicon/robot/drone/say(var/message, var/datum/language/speaking = null)
+/mob/living/silicon/robot/drone/say(var/message, var/datum/language/speaking = null)
+ if(copytext(message, 1, 2) == "*")
+ return emote(copytext(message, 2))
+
if(!speaking)
speaking = parse_language(message)
if(!speaking)
diff --git a/code/modules/mob/living/silicon/robot/drone/update_status.dm b/code/modules/mob/living/silicon/robot/drone/update_status.dm
new file mode 100644
index 00000000000..97d2214c2e2
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/drone/update_status.dm
@@ -0,0 +1,10 @@
+//Easiest to check this here, then check again in the robot proc.
+//Standard robots use config for crit, which is somewhat excessive for these guys.
+//Drones killed by damage will gib.
+/mob/living/silicon/robot/drone/update_stat()
+ if(status_flags & GODMODE)
+ return
+ if(health <= -35 && stat != DEAD)
+ gib()
+ return
+ return ..()
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index b2c8857f040..ca480d987f8 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -62,7 +62,7 @@
if(sleeping)
Paralyse(3)
- sleeping--
+ AdjustSleeping(-1)
if(resting)
Weaken(5)
@@ -90,7 +90,7 @@
stat = UNCONSCIOUS
if(!paralysis > 0)
- eye_blind = 0
+ SetEyeBlind(0)
else
stat = CONSCIOUS
@@ -98,7 +98,7 @@
diag_hud_set_health()
diag_hud_set_status()
else //dead
- eye_blind = 1
+ SetEyeBlind(0)
//update the state of modules and components here
if(stat != CONSCIOUS)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 7e771b2f372..335ecbcd1f6 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -730,18 +730,18 @@ var/list/robot_verbs_default = list(
else
to_chat(user, "Unable to locate a radio.")
- else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
+ else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
if(emagged)//still allow them to open the cover
- to_chat(user, "The interface seems slightly damaged")
+ to_chat(user, "The interface seems slightly damaged.")
if(opened)
to_chat(user, "You must close the cover to swipe an ID card.")
else
- if(allowed(usr))
+ if(allowed(W))
locked = !locked
to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.")
update_icons()
else
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied.")
else if(istype(W, /obj/item/borg/upgrade/))
var/obj/item/borg/upgrade/U = W
@@ -957,29 +957,15 @@ var/list/robot_verbs_default = list(
user.visible_message("[user] pets [src]!", \
"You pet [src]!")
-/mob/living/silicon/robot/proc/allowed(mob/M)
- //check if it doesn't require any access at all
- if(check_access(null))
+/mob/living/silicon/robot/proc/allowed(obj/item/I)
+ var/obj/dummy = new /obj(null) // Create a dummy object to check access on as to avoid having to snowflake check_access on every mob
+ dummy.req_access = req_access
+
+ if(dummy.check_access(I))
+ qdel(dummy)
return 1
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- //if they are holding or wearing a card that has access, that works
- if(check_access(H.get_active_hand()) || check_access(H.wear_id))
- return 1
- return 0
-
-/mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I)
- if(!istype(req_access, /list)) //something's very wrong
- return 1
-
- var/list/L = req_access
- if(!L.len) //no requirements
- return 1
- if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access
- return 0
- for(var/req in req_access)
- if(req in I.access) //have one of the required accesses
- return 1
+
+ qdel(dummy)
return 0
/mob/living/silicon/robot/update_icons()
diff --git a/code/modules/mob/living/silicon/robot/update_status.dm b/code/modules/mob/living/silicon/robot/update_status.dm
new file mode 100644
index 00000000000..a28aae28278
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/update_status.dm
@@ -0,0 +1,21 @@
+// No args for restraints because robots don't have those
+/mob/living/silicon/robot/incapacitated()
+ if(stat || lockcharge || weakened || stunned || paralysis || !is_component_functioning("actuator"))
+ return 1
+
+/mob/living/silicon/robot/update_stat()
+ if(status_flags & GODMODE)
+ return
+ if(stat != DEAD)
+ if(health <= -maxHealth) //die only once
+ death()
+ return
+ if(!is_component_functioning("actuator") || paralysis || sleeping || stunned || weakened || getOxyLoss() > maxHealth * 0.5)
+ if(stat == CONSCIOUS)
+ KnockOut()
+ else
+ if(stat == UNCONSCIOUS)
+ WakeUp()
+ // diag_hud_set_status()
+ // diag_hud_set_health()
+ // update_health_hud()
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 75bbec89a1b..469b6e86574 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -152,7 +152,7 @@
//Silicon mob language procs
-/mob/living/silicon/can_speak(datum/language/speaking)
+/mob/living/silicon/can_speak_language(datum/language/speaking)
return universal_speak || (speaking in src.speech_synthesizer_langs) //need speech synthesizer support to vocalize a language
/mob/living/silicon/add_language(var/language, var/can_speak=1)
@@ -355,8 +355,8 @@
/////////////////////////////////// EAR DAMAGE ////////////////////////////////////
-/mob/living/silicon/adjustEarDamage()
+/mob/living/silicon/SetEarDamage()
return
-/mob/living/silicon/setEarDamage()
- return
\ No newline at end of file
+/mob/living/silicon/SetEarDeaf()
+ return
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index fdad2a9e37b..d713c6dcf23 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -95,11 +95,6 @@
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall)
force_threshold = 11
-
-/mob/living/simple_animal/construct/armoured/Life()
- weakened = 0
- return ..()
-
/mob/living/simple_animal/construct/armoured/bullet_act(var/obj/item/projectile/P)
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
var/reflectchance = 80 - round(P.damage/3)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 4c974c46c16..47c243e970e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -466,6 +466,9 @@
return
if(istype(target, /obj/mecha/working/ripley))
var/obj/mecha/D = target
+ if(D.icon_state != "ripley-open")
+ to_chat(user, "You can't add armour onto the mech while someone is inside!")
+ return
var/list/damage_absorption = D.damage_absorption
if(damage_absorption["brute"] > 0.3)
damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3)
@@ -474,17 +477,11 @@
damage_absorption["laser"] = damage_absorption["laser"] - 0.025
to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
qdel(src)
- if(D.icon_state == "ripley-open")
- D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open")
- D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
- else
- to_chat(user, "You can't add armour onto the mech while someone is inside!")
+ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open")
+ D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
if(damage_absorption.["brute"] == 0.3)
- if(D.icon_state == "ripley-open")
- D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open")
- D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter."
- else
- to_chat(user, "You can't add armour onto the mech while someone is inside!")
+ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open")
+ D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter."
else
to_chat(user, "You can't improve [D] any further!")
return
diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
index c59cdf0570a..64469bb87ef 100644
--- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
+++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
@@ -154,7 +154,7 @@
if(istype(noms, /turf/simulated/wall))
W = noms
nomDelay *= 2
- if(W.walltype == "rwall")
+ if(istype(W, /turf/simulated/wall/r_wall))
nomDelay *= 2
else
return
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index cb48c63b66f..d749db16bf5 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -118,11 +118,11 @@
for(var/atom/check in check_list)
for(var/mob/living/M in viewers(world.view + 1, check) - src)
if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege)
- if(!M.eye_blind)
+ if(M.has_vision())
return M
for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you
if(M.occupant && M.occupant.client)
- if(!M.occupant.eye_blind)
+ if(M.occupant.has_vision())
return M.occupant
return null
@@ -185,7 +185,7 @@
continue
var/turf/T = get_turf(L.loc)
if(T && T in targets)
- L.eye_blind = max(L.eye_blind, 4)
+ L.EyeBlind(4)
return
//Toggle Night Vision
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 06160dca1fd..cc5b319c84f 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -706,8 +706,8 @@
/mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion
return
-/mob/living/simple_animal/adjustEarDamage()
+/mob/living/simple_animal/SetEarDamage()
return
-/mob/living/simple_animal/setEarDamage()
- return
\ No newline at end of file
+/mob/living/simple_animal/SetEarDeaf()
+ return
diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm
index b21c3110b1d..6a18da90aaa 100644
--- a/code/modules/mob/living/simple_animal/tribbles.dm
+++ b/code/modules/mob/living/simple_animal/tribbles.dm
@@ -212,9 +212,6 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
//||Fur and Fur Products ||
-/obj
- var/f_amt = 0 // registers fur amount as an object variable
-
/obj/item/stack/sheet/fur //basic fur sheets (very lumpy furry piles of sheets)
name = "pile of fur"
@@ -223,38 +220,40 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
icon = 'icons/mob/tribbles.dmi'
icon_state = "sheet-fur"
origin_tech = "materials=2"
- f_amt = 1000
max_amount = 50
+
/obj/item/clothing/ears/earmuffs/tribblemuffs //earmuffs but with tribbles
name = "earmuffs"
desc = "Protects your hearing from loud noises, and quiet ones as well."
icon = 'icons/mob/tribbles.dmi'
icon_state = "tribblemuffs"
item_state = "tribblemuffs"
- f_amt = 2000
+/* The advanced cold protection of the non-coat items has been removed, so as not
+ to give patreon donors an unfair advantage - the winter coat provides equivalent
+ cold protection
+*/
/obj/item/clothing/gloves/furgloves
desc = "These gloves are warm and furry."
name = "fur gloves"
icon = 'icons/mob/tribbles.dmi'
icon_state = "furglovesico"
item_state = "furgloves"
- f_amt = 3000
-
- cold_protection = HANDS
- min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
+ transfer_prints = TRUE
+ transfer_blood = TRUE
+ siemens_coefficient = 0
+// Equivalent to a winter coat's hood
/obj/item/clothing/head/furcap
name = "fur cap"
desc = "A warm furry cap."
icon = 'icons/mob/tribbles.dmi'
icon_state = "furcap"
item_state = "furcap"
- f_amt = 5000
cold_protection = HEAD
- min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
/obj/item/clothing/shoes/furboots
name = "fur boots"
@@ -262,11 +261,8 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
icon = 'icons/mob/tribbles.dmi'
icon_state = "furboots"
item_state = "furboots"
- f_amt = 4000
-
- cold_protection = FEET
- min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
+// As a donator piece of clothing, this is now in line with the winter coat
/obj/item/clothing/suit/furcoat
name = "fur coat"
desc = "A trenchcoat made from fur. You could put an oxygen tank in one of the pockets."
@@ -274,11 +270,10 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
icon_state = "furcoat"
item_state = "furcoat"
blood_overlay_type = "armor"
- f_amt = 15000
- body_parts_covered = UPPER_TORSO|LEGS|ARMS|LOWER_TORSO
+ body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO
allowed = list (/obj/item/weapon/tank/emergency_oxygen)
- cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | ARMS
- min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
+ cold_protection = UPPER_TORSO | LOWER_TORSO | ARMS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
/obj/item/clothing/suit/furcape
name = "fur cape"
@@ -287,7 +282,6 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
icon_state = "furcape"
item_state = "furcape"
blood_overlay_type = "armor"
- f_amt = 10000
- body_parts_covered = UPPER_TORSO|LEGS|ARMS
- cold_protection = UPPER_TORSO | LEGS | ARMS
- min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
+ body_parts_covered = UPPER_TORSO|ARMS
+ cold_protection = UPPER_TORSO | ARMS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
diff --git a/code/modules/mob/living/stat_states.dm b/code/modules/mob/living/stat_states.dm
new file mode 100644
index 00000000000..f04196f9fc9
--- /dev/null
+++ b/code/modules/mob/living/stat_states.dm
@@ -0,0 +1,51 @@
+// There, now `stat` is a proper state-machine
+
+/mob/living/proc/KnockOut(updating = 1)
+ if(stat == DEAD)
+ log_runtime(EXCEPTION("KnockOut called on a dead mob."), src)
+ return 0
+ else if(stat == UNCONSCIOUS)
+ return 0
+ add_logs(src, null, "fallen unconscious at [atom_loc_line(get_turf(src))]", admin=0)
+ stat = UNCONSCIOUS
+ if(updating)
+ // update_blind_effects()
+ update_canmove()
+ return 1
+
+/mob/living/proc/WakeUp(updating = 1)
+ if(stat == DEAD)
+ log_runtime(EXCEPTION("WakeUp called on a dead mob."), src)
+ return 0
+ else if(stat == CONSCIOUS)
+ return 0
+ add_logs(src, null, "woken up at [atom_loc_line(get_turf(src))]", admin=0)
+ stat = CONSCIOUS
+ if(updating)
+ // update_blind_effects()
+ update_canmove()
+ return 1
+
+/mob/living/proc/can_be_revived()
+ . = TRUE
+ // if(health <= min_health)
+ if(health <= config.health_threshold_dead)
+ return FALSE
+
+// death() is used to make a mob die
+
+// handles revival through other means than cloning or adminbus (defib, IPC repair)
+/mob/living/proc/update_revive(updating = TRUE)
+ if(stat != DEAD)
+ return
+ if(!can_be_revived())
+ return
+ add_logs(src, null, "came back to life at [atom_loc_line(get_turf(src))]", admin=0)
+ stat = CONSCIOUS
+ dead_mob_list -= src
+ living_mob_list += src
+ timeofdeath = null
+ if(updating)
+ update_canmove()
+ // update_blind_effects()
+ updatehealth()
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
new file mode 100644
index 00000000000..45207fd5426
--- /dev/null
+++ b/code/modules/mob/living/status_procs.dm
@@ -0,0 +1,513 @@
+//Here are the procs used to modify status effects of a mob.
+
+// We use these to automatically apply their effects when they are changed, as
+// opposed to setting them manually and having to either wait for the next `Life`
+// or update by hand
+
+// The `updating` argument is only available on effects that cause a visual/physical effect on the mob itself
+// when applied, such as Stun, Weaken, and Jitter - stuff like Blindness, which has a client-side effect,
+// lacks this argument.
+
+// Ideally, code should only read the vars in this file, and not ever directly
+// modify them
+
+// If you want a mob type to ignore a given status effect, just override the corresponding
+// `SetSTATE` proc - since all of the other procs are wrappers around that,
+// calling them will have no effect
+
+// BOOLEAN STATES
+
+/*
+ * EyesBlocked
+ Your eyes are covered somehow
+ * EarsBlocked
+ Your ears are covered somehow
+ * Resting
+ You are lying down of your own volition
+ * Flying
+ For some reason or another you can move while not touching the ground
+*/
+
+
+// STATUS EFFECTS
+// All of these decrement over time - at a rate of 1 per life cycle unless otherwise noted
+// Status effects sorted alphabetically:
+/*
+ * Confused *
+ Movement is scrambled
+ * Dizzy *
+ The screen goes all warped
+ * Drowsy
+ You begin to yawn, and have a chance of incrementing "Paralysis"
+ * Druggy *
+ A trippy overlay appears.
+ * Drunk *
+ Essentially what your "BAC" is - the higher it is, the more alcohol you have in you
+ * EarDamage *
+ Doesn't do much, but if it's 25+, you go deaf. Heals much slower than other statuses - 0.05 normally
+ * EarDeaf *
+ You cannot hear. Prevents EarDamage from healing naturally.
+ * EyeBlind *
+ You cannot see. Prevents EyeBlurry from healing naturally.
+ * EyeBlurry *
+ A hazy overlay appears on your screen.
+ * Hallucination *
+ Your character will imagine various effects happening to them, vividly.
+ * Jitter *
+ Your character will visibly twitch. Higher values amplify the effect.
+ * LoseBreath *
+ Your character is unable to breathe.
+ * Paralysis *
+ Your character is knocked out.
+ * Silent *
+ Your character is unable to speak.
+ * Sleeping *
+ Your character is asleep.
+ * Slowed *
+ Your character moves slower.
+ * Slurring *
+ Your character cannot enunciate clearly.
+ * Stunned *
+ Your character is unable to move, and drops stuff in their hands. They keep standing, though.
+ * Stuttering *
+ Your character stutters parts of their messages.
+ * Weakened *
+ Your character collapses, but is still conscious.
+*/
+
+// DISABILITIES
+// These are more permanent than the above.
+// Disabilities sorted alphabetically
+/*
+ * Blind (32)
+ Can't see. EyeBlind does not heal when this is active.
+ * Coughing (4)
+ Cough occasionally, causing you to drop your items
+ * Deaf (128)
+ Can't hear. EarDeaf does not heal when this is active
+ * Epilepsy (2)
+ Occasionally go "Epileptic", causing you to become very twitchy, drop all items, and fall to the floor
+ * Mute (64)
+ Cannot talk.
+ * Nearsighted (1)
+ My glasses! I can't see without my glasses! (Nearsighted overlay when not wearing prescription eyewear)
+ * Nervous (16)
+ Occasionally begin to stutter.
+ * Tourettes (8)
+ SHIT (say bad words, and drop stuff occasionally)
+*/
+
+/mob/living
+
+ // Booleans
+ var/resting = FALSE
+
+ /*
+ STATUS EFFECTS
+ */
+
+/mob // On `/mob` for now, to support legacy code
+ var/confused = 0
+ var/dizziness = 0
+ var/drowsyness = 0
+ var/druggy = 0
+ var/drunk = 0
+ var/ear_damage = 0
+ var/ear_deaf = 0
+ var/eye_blind = 0
+ var/eye_blurry = 0
+ var/hallucination = 0
+ var/jitteriness = 0
+ var/losebreath = 0
+ var/paralysis = 0
+ var/silent = 0
+ var/sleeping = 0
+ var/slowed = 0
+ var/slurring = 0
+ var/stunned = 0
+ var/stuttering = 0
+ var/weakened = 0
+
+/mob/living
+ // Bitfields
+ var/disabilities = 0
+
+// RESTING
+
+/mob/living/proc/StartResting(updating = 1)
+ var/val_change = !resting
+ resting = TRUE
+ if(updating && val_change)
+ update_canmove()
+
+/mob/living/proc/StopResting(updating = 1)
+ var/val_change = !!resting
+ resting = FALSE
+ if(updating && val_change)
+ update_canmove()
+
+/mob/living/proc/StartFlying()
+ var/val_change = !flying
+ flying = TRUE
+ if(val_change)
+ update_animations()
+
+/mob/living/proc/StopFlying()
+ var/val_change = !!flying
+ flying = FALSE
+ if(val_change)
+ update_animations()
+
+
+// SCALAR STATUS EFFECTS
+
+// CONFUSED
+
+/mob/living/Confused(amount)
+ SetConfused(max(confused, amount))
+
+/mob/living/SetConfused(amount)
+ confused = max(amount, 0)
+
+/mob/living/AdjustConfused(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(confused, amount, bound_lower, bound_upper)
+ SetConfused(new_value)
+
+// DIZZY
+
+/mob/living/Dizzy(amount)
+ SetDizzy(max(dizziness, amount))
+
+/mob/living/SetDizzy(amount)
+ dizziness = max(amount, 0)
+
+/mob/living/AdjustDizzy(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(dizziness, amount, bound_lower, bound_upper)
+ SetDizzy(new_value)
+
+// DROWSY
+
+/mob/living/Drowsy(amount)
+ SetDrowsy(max(drowsyness, amount))
+
+/mob/living/SetDrowsy(amount)
+ drowsyness = max(amount, 0)
+
+/mob/living/AdjustDrowsy(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(drowsyness, amount, bound_lower, bound_upper)
+ SetDrowsy(new_value)
+
+// DRUNK
+
+/mob/living/Drunk(amount)
+ SetDrunk(max(drunk, amount))
+
+/mob/living/SetDrunk(amount)
+ drunk = max(amount, 0)
+
+/mob/living/AdjustDrunk(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(drunk, amount, bound_lower, bound_upper)
+ SetDrunk(new_value)
+
+// DRUGGY
+
+/mob/living/Druggy(amount)
+ SetDruggy(max(druggy, amount))
+
+/mob/living/SetDruggy(amount)
+ var/old_val = druggy
+ druggy = max(amount, 0)
+ // We transitioned to/from 0, so update the druggy overlays
+ if((old_val == 0 || druggy == 0) && (old_val != druggy))
+ update_druggy_effects()
+
+/mob/living/AdjustDruggy(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(druggy, amount, bound_lower, bound_upper)
+ SetDruggy(new_value)
+
+// EAR_DAMAGE
+
+/mob/living/EarDamage(amount)
+ SetEarDamage(max(ear_damage, amount))
+
+/mob/living/SetEarDamage(amount)
+ ear_damage = max(amount, 0)
+
+/mob/living/AdjustEarDamage(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(ear_damage, amount, bound_lower, bound_upper)
+ SetEarDamage(new_value)
+
+// EAR_DEAF
+
+/mob/living/EarDeaf(amount)
+ SetEarDeaf(max(ear_deaf, amount))
+
+/mob/living/SetEarDeaf(amount)
+ ear_deaf = max(amount, 0)
+
+/mob/living/AdjustEarDeaf(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(ear_deaf, amount, bound_lower, bound_upper)
+ SetEarDeaf(new_value)
+
+// EYE_BLIND
+
+/mob/living/EyeBlind(amount)
+ SetEyeBlind(max(eye_blind, amount))
+
+/mob/living/SetEyeBlind(amount)
+ var/old_val = eye_blind
+ eye_blind = max(amount, 0)
+ // We transitioned to/from 0, so update the eye blind overlays
+ if((old_val == 0 || eye_blind == 0) && (old_val != eye_blind))
+ update_blind_effects()
+
+/mob/living/AdjustEyeBlind(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(eye_blind, amount, bound_lower, bound_upper)
+ SetEyeBlind(new_value)
+
+// EYE_BLURRY
+
+/mob/living/EyeBlurry(amount)
+ SetEyeBlurry(max(eye_blurry, amount))
+
+/mob/living/SetEyeBlurry(amount)
+ var/old_val = eye_blurry
+ eye_blurry = max(amount, 0)
+ // We transitioned to/from 0, so update the eye blur overlays
+ if((old_val == 0 || eye_blurry == 0) && (old_val != eye_blurry))
+ update_blurry_effects()
+
+/mob/living/AdjustEyeBlurry(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(eye_blurry, amount, bound_lower, bound_upper)
+ SetEyeBlurry(new_value)
+
+// HALLUCINATION
+
+/mob/living/Hallucinate(amount)
+ SetHallucinate(max(hallucination, amount))
+
+/mob/living/SetHallucinate(amount)
+ hallucination = max(amount, 0)
+
+/mob/living/AdjustHallucinate(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(hallucination, amount, bound_lower, bound_upper)
+ SetHallucinate(new_value)
+
+// JITTER
+
+/mob/living/Jitter(amount, force = 0)
+ SetJitter(max(jitteriness, amount), force)
+
+/mob/living/SetJitter(amount, force = 0)
+ // Jitter is also associated with stun
+ if(status_flags & CANSTUN || force)
+ jitteriness = max(amount, 0)
+
+/mob/living/AdjustJitter(amount, bound_lower = 0, bound_upper = INFINITY, force = 0)
+ var/new_value = directional_bounded_sum(jitteriness, amount, bound_lower, bound_upper)
+ SetJitter(new_value, force)
+
+// LOSE_BREATH
+
+/mob/living/LoseBreath(amount)
+ SetLoseBreath(max(losebreath, amount))
+
+/mob/living/SetLoseBreath(amount)
+ losebreath = max(amount, 0)
+
+/mob/living/AdjustLoseBreath(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(losebreath, amount, bound_lower, bound_upper)
+ SetLoseBreath(new_value)
+
+// PARALYSE
+
+/mob/living/Paralyse(amount, updating = 1, force = 0)
+ SetParalysis(max(paralysis, amount), updating, force)
+
+/mob/living/SetParalysis(amount, updating = 1, force = 0)
+ if(status_flags & CANPARALYSE || force)
+ paralysis = max(amount, 0)
+ if(updating)
+ update_canmove()
+ update_stat()
+
+/mob/living/AdjustParalysis(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1, force = 0)
+ var/new_value = directional_bounded_sum(paralysis, amount, bound_lower, bound_upper)
+ SetParalysis(new_value, updating, force)
+
+// SILENT
+
+/mob/living/Silence(amount)
+ SetSilence(max(silent, amount))
+
+/mob/living/SetSilence(amount)
+ silent = max(amount, 0)
+
+/mob/living/AdjustSilence(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(silent, amount, bound_lower, bound_upper)
+ SetSilence(new_value)
+
+// SLEEPING
+
+/mob/living/Sleeping(amount, updating = 1)
+ SetSleeping(max(sleeping, amount), updating)
+
+/mob/living/SetSleeping(amount, updating = 1)
+ sleeping = max(amount, 0)
+ update_sleeping_effects()
+ if(updating)
+ update_stat()
+ update_canmove()
+
+/mob/living/AdjustSleeping(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1)
+ var/new_value = directional_bounded_sum(sleeping, amount, bound_lower, bound_upper)
+ SetSleeping(new_value, updating)
+
+// SLOWED
+
+/mob/living/Slowed(amount, updating = 1)
+ SetSlowed(max(slowed, amount), updating)
+
+/mob/living/SetSlowed(amount, updating = 1)
+ slowed = max(amount, 0)
+
+/mob/living/AdjustSlowed(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1)
+ var/new_value = directional_bounded_sum(slowed, amount, bound_lower, bound_upper)
+ SetSlowed(new_value, updating)
+
+// SLURRING
+
+/mob/living/Slur(amount)
+ SetSlur(max(slurring, amount))
+
+/mob/living/SetSlur(amount)
+ slurring = max(amount, 0)
+
+/mob/living/AdjustSlur(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(slurring, amount, bound_lower, bound_upper)
+ SetSlur(new_value)
+
+// STUN
+
+/mob/living/Stun(amount, updating = 1, force = 0)
+ SetStunned(max(stunned, amount), updating, force)
+
+/mob/living/SetStunned(amount, updating = 1, force = 0) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
+ if(status_flags & CANSTUN || force)
+ stunned = max(amount, 0)
+ if(updating)
+ update_canmove()
+
+/mob/living/AdjustStunned(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1, force = 0)
+ var/new_value = directional_bounded_sum(stunned, amount, bound_lower, bound_upper)
+ SetStunned(new_value, updating, force)
+
+// STUTTERING
+
+
+/mob/living/Stuttering(amount, force = 0)
+ SetStuttering(max(stuttering, amount), force)
+
+/mob/living/SetStuttering(amount, force = 0)
+ //From mob/living/apply_effect: "Stuttering is often associated with Stun"
+ if(status_flags & CANSTUN || force)
+ stuttering = max(amount, 0)
+
+/mob/living/AdjustStuttering(amount, bound_lower = 0, bound_upper = INFINITY, force = 0)
+ var/new_value = directional_bounded_sum(stuttering, amount, bound_lower, bound_upper)
+ SetStuttering(new_value, force)
+
+// WEAKEN
+
+/mob/living/Weaken(amount, updating = 1, force = 0)
+ SetWeakened(max(weakened, amount), updating, force)
+
+/mob/living/SetWeakened(amount, updating = 1, force = 0)
+ if(status_flags & CANWEAKEN || force)
+ weakened = max(amount, 0)
+ if(updating)
+ update_canmove() //updates lying, canmove and icons
+
+/mob/living/AdjustWeakened(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1, force = 0)
+ var/new_value = directional_bounded_sum(weakened, amount, bound_lower, bound_upper)
+ SetWeakened(new_value, updating, force)
+
+//
+// DISABILITIES
+//
+
+// Blind
+
+/mob/living/proc/BecomeBlind()
+ var/val_change = !(disabilities & BLIND)
+ disabilities |= BLIND
+ if(val_change)
+ update_blind_effects()
+
+/mob/living/proc/CureBlind()
+ var/val_change = !!(disabilities & BLIND)
+ disabilities &= ~BLIND
+ if(val_change)
+ update_blind_effects()
+
+// Coughing
+
+/mob/living/proc/BecomeCoughing()
+ disabilities |= COUGHING
+
+/mob/living/proc/CureCoughing()
+ disabilities &= ~COUGHING
+
+// Deaf
+
+/mob/living/proc/BecomeDeaf()
+ disabilities |= DEAF
+
+/mob/living/proc/CureDeaf()
+ disabilities &= ~DEAF
+
+// Epilepsy
+
+/mob/living/proc/BecomeEpilepsy()
+ disabilities |= EPILEPSY
+
+/mob/living/proc/CureEpilepsy()
+ disabilities &= ~EPILEPSY
+
+// Mute
+
+/mob/living/proc/BecomeMute()
+ disabilities |= MUTE
+
+/mob/living/proc/CureMute()
+ disabilities &= ~MUTE
+
+// Nearsighted
+
+/mob/living/proc/BecomeNearsighted()
+ var/val_change = !(disabilities & NEARSIGHTED)
+ disabilities |= NEARSIGHTED
+ if(val_change)
+ update_nearsighted_effects()
+
+/mob/living/proc/CureNearsighted()
+ var/val_change = !!(disabilities & NEARSIGHTED)
+ disabilities &= ~NEARSIGHTED
+ if(val_change)
+ update_nearsighted_effects()
+
+// Nervous
+
+/mob/living/proc/BecomeNervous()
+ disabilities |= NERVOUS
+
+/mob/living/proc/CureNervous()
+ disabilities &= ~NERVOUS
+
+// Tourettes
+
+/mob/living/proc/BecomeTourettes()
+ disabilities |= TOURETTES
+
+/mob/living/proc/CureTourettes()
+ disabilities &= ~TOURETTES
diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm
new file mode 100644
index 00000000000..f817b03482e
--- /dev/null
+++ b/code/modules/mob/living/update_status.dm
@@ -0,0 +1,97 @@
+/mob/living/update_blind_effects()
+ if(!has_vision())
+ overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
+ throw_alert("blind", /obj/screen/alert/blind)
+ return 1
+ else
+ clear_fullscreen("blind")
+ clear_alert("blind")
+ return 0
+
+/mob/living/update_blurry_effects()
+ if(eyes_blurred())
+ overlay_fullscreen("blurry", /obj/screen/fullscreen/blurry)
+ return 1
+ else
+ clear_fullscreen("blurry")
+ return 0
+
+/mob/living/update_druggy_effects()
+ if(druggy)
+ overlay_fullscreen("high", /obj/screen/fullscreen/high)
+ throw_alert("high", /obj/screen/alert/high)
+ else
+ clear_fullscreen("high")
+ clear_alert("high")
+
+/mob/living/update_nearsighted_effects()
+ if(disabilities & NEARSIGHTED)
+ overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
+ else
+ clear_fullscreen("nearsighted")
+
+/mob/living/update_sleeping_effects()
+ if(sleeping)
+ throw_alert("asleep", /obj/screen/alert/asleep)
+ else
+ clear_alert("asleep")
+
+// Querying status of the mob
+
+// Whether the mob can hear things
+/mob/living/can_hear()
+ return !(ear_deaf || (disabilities & DEAF))
+
+// Whether the mob is able to see
+/mob/living/has_vision()
+ return !(eye_blind || (disabilities & BLIND) || stat)
+
+// Whether the mob is capable of talking
+/mob/living/can_speak()
+ return !(silent || (disabilities & MUTE) || is_muzzled())
+
+// Whether the mob is capable of standing or not
+/mob/living/proc/can_stand()
+ return !(weakened || paralysis || stat || (status_flags & FAKEDEATH))
+
+// Whether the mob is capable of actions or not
+/mob/living/incapacitated(ignore_restraints = 0, ignore_grab = 0, ignore_lying = 0)
+ if(stat || paralysis || stunned || (weakened && lying) || (!ignore_restraints && restrained()) || (!ignore_lying && lying))
+ return 1
+
+// wonderful proc names, I know - used to check whether the blur overlay
+// should show or not
+/mob/living/proc/eyes_blurred()
+ return eye_blurry
+
+//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
+/mob/living/update_canmove(delay_action_updates = 0)
+ var/fall_over = !can_stand()
+ var/buckle_lying = !(buckled && !buckled.buckle_lying)
+ if(fall_over || resting || stunned)
+ drop_r_hand()
+ drop_l_hand()
+ else
+ lying = 0
+ canmove = 1
+ if(buckled)
+ lying = 90 * buckle_lying
+ else if((fall_over || resting) && !lying)
+ fall(fall_over)
+
+ canmove = !(fall_over || resting || stunned || buckled)
+ density = !lying
+ if(lying)
+ if(layer == initial(layer))
+ layer = MOB_LAYER - 0.2
+ else
+ if(layer == MOB_LAYER - 0.2)
+ layer = initial(layer)
+
+ update_transform()
+ if(!delay_action_updates)
+ update_action_buttons_icon()
+ return canmove
+
+/mob/living/proc/update_stamina()
+ return
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 4a292328fb6..6415d077cf0 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -62,22 +62,22 @@
if(!client) return
if(type)
- if(type & 1 && (disabilities & BLIND || blinded || paralysis) )//Vision related
+ if(type & 1 && !has_vision())//Vision related
if(!( alt ))
return
else
msg = alt
type = alt_type
- if(type & 2 && (disabilities & DEAF || ear_deaf))//Hearing related
+ if(type & 2 && !can_hear())//Hearing related
if(!( alt ))
return
else
msg = alt
type = alt_type
- if((type & 1 && disabilities & BLIND))
+ if(type & 1 && !has_vision())
return
// Added voice muffling for Issue 41.
- if(stat == UNCONSCIOUS || (sleeping > 0 && stat != 2))
+ if(stat == UNCONSCIOUS || (sleeping > 0 && stat != DEAD))
to_chat(src, "... You can almost hear someone talking ...")
else
to_chat(src, msg)
@@ -163,13 +163,6 @@
// handle_typing_indicator()
return
-
-/mob/proc/restrained()
- return
-
-/mob/proc/incapacitated()
- return
-
//This proc is called whenever someone clicks an inventory ui slot.
/mob/proc/attack_ui(slot)
var/obj/item/W = get_active_hand()
@@ -1031,36 +1024,6 @@ var/list/slot_equipment_priority = list( \
if(restrained()) return 0
return 1
-//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
-/mob/proc/update_canmove(delay_action_updates = 0)
- var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH)
- var/buckle_lying = !(buckled && !buckled.buckle_lying)
- if(ko || resting || stunned)
- drop_r_hand()
- drop_l_hand()
- else
- lying = 0
- canmove = 1
- if(buckled)
- lying = 90 * buckle_lying
- else
- if((ko || resting) && !lying)
- fall(ko)
-
- canmove = !(ko || resting || stunned || buckled)
- density = !lying
- if(lying)
- if(layer == initial(layer))
- layer = MOB_LAYER - 0.2
- else
- if(layer == MOB_LAYER - 0.2)
- layer = initial(layer)
-
- update_transform()
- if(!delay_action_updates)
- update_action_buttons_icon()
- return canmove
-
/mob/proc/fall(var/forced)
drop_l_hand()
drop_r_hand()
@@ -1101,77 +1064,6 @@ var/list/slot_equipment_priority = list( \
/mob/proc/activate_hand(selhand)
return
-/mob/proc/Jitter(amount)
- jitteriness = max(jitteriness, amount, 0)
-
-/mob/proc/Dizzy(amount)
- dizziness = max(dizziness, amount, 0)
-
-/mob/proc/AdjustDrunk(amount)
- drunk = max(drunk + amount, 0)
-
-/mob/proc/Stun(amount)
- SetStunned(max(stunned, amount))
-
-/mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
- if(status_flags & CANSTUN)
- stunned = max(amount, 0)
- update_canmove()
- else if(stunned)
- stunned = 0
- update_canmove()
-
-/mob/proc/AdjustStunned(amount)
- SetStunned(stunned + amount)
-
-/mob/proc/Weaken(amount)
- SetWeakened(max(weakened, amount))
-
-/mob/proc/SetWeakened(amount)
- if(status_flags & CANWEAKEN)
- weakened = max(amount, 0)
- update_canmove() //updates lying, canmove and icons
- else if(weakened)
- weakened = 0
- update_canmove()
-
-/mob/proc/AdjustWeakened(amount)
- SetWeakened(weakened + amount)
-
-/mob/proc/Paralyse(amount)
- SetParalysis(max(paralysis, amount))
-
-/mob/proc/SetParalysis(amount)
- if(status_flags & CANPARALYSE)
- paralysis = max(amount, 0)
- update_canmove()
- else if(paralysis)
- paralysis = 0
- update_canmove()
-
-/mob/proc/AdjustParalysis(amount)
- SetParalysis(paralysis + amount)
-
-/mob/proc/Sleeping(amount)
- SetSleeping(max(sleeping, amount))
-
-/mob/proc/SetSleeping(amount)
- sleeping = max(amount, 0)
- update_canmove()
-
-/mob/proc/AdjustSleeping(amount)
- SetSleeping(sleeping + amount)
-
-/mob/proc/Resting(amount)
- SetResting(max(resting, amount))
-
-/mob/proc/SetResting(amount)
- resting = max(amount, 0)
- update_canmove()
-
-/mob/proc/AdjustResting(amount)
- SetResting(resting + amount)
-
/mob/proc/get_species()
return ""
@@ -1365,13 +1257,6 @@ mob/proc/yank_out_object()
location.add_vomit_floor(src, 1)
playsound(location, 'sound/effects/splat.ogg', 50, 1)
-
-/mob/proc/adjustEarDamage()
- return
-
-/mob/proc/setEarDamage()
- return
-
/mob/proc/AddSpell(obj/effect/proc_holder/spell/S)
mob_spell_list += S
S.action.Grant(src)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index f7bd04906ea..6cb582e94c1 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -33,18 +33,11 @@
var/obj/machinery/machine = null
var/other_mobs = null
var/memory = ""
- var/disabilities = 0 //Carbon
var/atom/movable/pulling = null
var/next_move = null
var/notransform = null //Carbon
var/other = 0.0
var/hand = null
- var/eye_blind = 0 //Carbon
- var/eye_blurry = 0 //Carbon
- var/ear_deaf = 0 //Carbon
- var/ear_damage = 0 //Carbon
- var/stuttering = 0 //Carbon
- var/slurring = 0 //Carbon
var/real_name = null
var/flavor_text = ""
var/med_record = ""
@@ -53,11 +46,6 @@
var/blinded = null
var/bhunger = 0 //Carbon
var/ajourn = 0
- var/druggy = 0 //Carbon
- var/confused = 0 //Carbon
- var/drunk = 0
- var/sleeping = 0 //Carbon
- var/resting = 0 //Carbon
var/lying = 0
var/lying_prev = 0
var/canmove = 1
@@ -77,19 +65,11 @@
var/bodytemperature = 310.055 //98.7 F
- var/drowsyness = 0.0//Carbon
- var/dizziness = 0//Carbon
- var/jitteriness = 0//Carbon
var/flying = 0
var/charges = 0.0
var/nutrition = 400.0//Carbon
var/overeatduration = 0 // How long this guy is overeating //Carbon
- var/paralysis = 0
- var/stunned = 0
- var/weakened = 0
- var/slowed = 0
- var/losebreath = 0 //Carbon
var/intent = null//Living
var/shakecamera = 0
var/a_intent = I_HELP//Living
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 90f84b7fc74..a22d9bf3c6b 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -175,9 +175,9 @@
if(state >= GRAB_KILL)
//affecting.apply_effect(STUTTER, 5) //would do this, but affecting isn't declared as mob/living for some stupid reason.
- affecting.stuttering = max(affecting.stuttering, 5) //It will hamper your voice, being choked and all.
+ affecting.Stuttering(5) //It will hamper your voice, being choked and all.
affecting.Weaken(5) //Should keep you down unless you get help.
- affecting.losebreath = max(affecting.losebreath + 2, 3)
+ affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjust_position()
@@ -290,7 +290,7 @@
msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]")
assailant.next_move = world.time + 10
- affecting.losebreath += 1
+ affecting.AdjustLoseBreath(1)
affecting.set_dir(WEST)
adjust_position()
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index ba47778c144..b03b9562949 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -75,12 +75,6 @@ proc/iscuffed(A)
return 1
return 0
-proc/isdeaf(A)
- if(istype(A, /mob))
- var/mob/M = A
- return (M.disabilities & DEAF) || M.ear_deaf
- return 0
-
proc/hassensorlevel(A, var/level)
var/mob/living/carbon/human/H = A
if(istype(H) && istype(H.w_uniform, /obj/item/clothing/under))
@@ -517,7 +511,8 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
var/length
var/pos
for(var/datum/objective/objective in all_objectives)
- if(objective.target != mind) continue
+ if(!mind || objective.target != mind)
+ continue
length = lentext(oldname)
pos = findtextEx(objective.explanation_text, oldname)
objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length)
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 4c210f6f8f8..d434ab633f7 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -162,11 +162,6 @@
if(!mob) return
- if(locate(/obj/effect/stop/, mob.loc))
- for(var/obj/effect/stop/S in mob.loc)
- if(S.victim == mob)
- return
-
if(mob.stat==DEAD) return
// handle possible spirit movement
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index dd48c1ce1a4..f8a73364264 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -565,3 +565,7 @@
/mob/new_player/is_ready()
return ready && ..()
+
+// No hearing announcements
+/mob/new_player/can_hear()
+ return 0
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index cf8a7f05574..efaf84798d1 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -1,6 +1,10 @@
/datum/preferences
//The mob should have a gender you want before running this proc. Will run fine without H
/datum/preferences/proc/random_character(gender_override)
+ var/datum/robolimb/robohead
+ if(species == "Machine")
+ var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
+ robohead = all_robolimbs[head_model]
if(gender_override)
gender = gender_override
else
@@ -8,18 +12,41 @@
underwear = random_underwear(gender, species)
undershirt = random_undershirt(gender, species)
socks = random_socks(gender, species)
- if(species in list("Human", "Drask"))
- s_tone = random_skin_tone()
- h_style = random_hair_style(gender, species)
- f_style = random_facial_hair_style(gender, species)
- if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin")
+ if(species == "Vulpkanin")
+ body_accessory = random_body_accessory(species)
+ if(body_accessory == "None") //Required to prevent a bug where the information/icons in the character preferences screen wouldn't update despite the data being changed.
+ body_accessory = null
+ if(species in list("Human", "Drask", "Vox"))
+ s_tone = random_skin_tone(species)
+ h_style = random_hair_style(gender, species, robohead)
+ f_style = random_facial_hair_style(gender, species, robohead)
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
randomize_hair_color("hair")
- randomize_hair_color("facial")
- randomize_eyes_color()
- if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Vulpkanin")
+ randomize_hair_color("facial")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))
+ ha_style = random_head_accessory(species)
+ var/list/colours = randomize_skin_color(1)
+ r_headacc = colours["red"]
+ g_headacc = colours["green"]
+ b_headacc = colours["blue"]
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin"))
+ m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["head"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask"))
+ m_styles["body"] = random_marking_style("body", species)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["body"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["tail"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species != "Machine")
+ randomize_eyes_color()
+ if(species in list("Unathi", "Tajaran", "Skrell", "Vulpkanin"))
randomize_skin_color()
backbag = 2
- age = rand(AGE_MIN,AGE_MAX)
+ age = rand(AGE_MIN, AGE_MAX)
/datum/preferences/proc/randomize_hair_color(var/target = "hair")
@@ -130,7 +157,7 @@
g_eyes = green
b_eyes = blue
-/datum/preferences/proc/randomize_skin_color()
+/datum/preferences/proc/randomize_skin_color(var/pass_to_list)
var/red
var/green
var/blue
@@ -174,9 +201,17 @@
green = max(min(green + rand (-25, 25), 255), 0)
blue = max(min(blue + rand (-25, 25), 255), 0)
- r_skin = red
- g_skin = green
- b_skin = blue
+ if(pass_to_list)
+ var/list/colours = list(
+ "red" = red,
+ "blue" = blue,
+ "green" = green
+ )
+ return colours
+ else
+ r_skin = red
+ g_skin = green
+ b_skin = blue
/datum/preferences/proc/blend_backpack(var/icon/clothes_s,var/backbag,var/satchel,var/backpack="backpack")
switch(backbag)
@@ -222,26 +257,12 @@
fat="_fat"
preview_icon = new /icon(icobase, "torso_[g][fat]")
preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY)
- preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY)
-
- //Tail
- if(current_species && (current_species.bodyflags & HAS_TAIL))
- var/tail_icon
- var/tail_icon_state
-
- if(body_accessory)
- var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory]
- tail_icon = accessory.icon
- tail_icon_state = accessory.icon_state
- else
- tail_icon = "icons/effects/species.dmi"
- if(coloured_tail)
- tail_icon_state = "[coloured_tail]_s"
- else
- tail_icon_state = "[current_species.tail]_s"
-
- var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state)
- preview_icon.Blend(temp, ICON_OVERLAY)
+ var/head = "head"
+ if(alt_head && current_species.bodyflags & HAS_ALT_HEADS)
+ var/datum/sprite_accessory/alt_heads/H = alt_heads_list[alt_head]
+ if(H.icon_state)
+ head = H.icon_state
+ preview_icon.Blend(new /icon(icobase, "[head]_[g]"), ICON_OVERLAY)
for(var/name in list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand"))
if(organ_data[name] == "amputated") continue
@@ -266,13 +287,66 @@
else
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
- //Body Markings
- if(current_species && (current_species.bodyflags & HAS_MARKINGS))
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style && marking_style.species_allowed)
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD)
- preview_icon.Blend(markings_s, ICON_OVERLAY)
+ //Tail
+ if(current_species && (current_species.bodyflags & HAS_TAIL))
+ var/tail_icon
+ var/tail_icon_state
+ var/tail_shift_x
+ var/tail_shift_y
+ var/blend_mode = ICON_ADD
+
+ if(body_accessory)
+ var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory]
+ tail_icon = accessory.icon
+ tail_icon_state = accessory.icon_state
+ if(accessory.blend_mode)
+ blend_mode = accessory.blend_mode
+ if(accessory.pixel_x_offset)
+ tail_shift_x = accessory.pixel_x_offset
+ if(accessory.pixel_y_offset)
+ tail_shift_y = accessory.pixel_y_offset
+ else
+ tail_icon = "icons/effects/species.dmi"
+ if(coloured_tail)
+ tail_icon_state = "[coloured_tail]_s"
+ else
+ tail_icon_state = "[current_species.tail]_s"
+
+ var/icon/temp = new/icon("icon" = tail_icon, "icon_state" = tail_icon_state)
+ if(tail_shift_x)
+ temp.Shift(EAST, tail_shift_x)
+ if(tail_shift_y)
+ temp.Shift(NORTH, tail_shift_y)
+
+ if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR))
+ temp.Blend(rgb(r_skin, g_skin, b_skin), blend_mode)
+
+ if(current_species && (current_species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ var/datum/sprite_accessory/tail_marking_style = marking_styles_list[tail_marking]
+ if(tail_marking_style && tail_marking_style.species_allowed)
+ var/icon/t_marking_s = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
+ t_marking_s.Blend(m_colours["tail"], ICON_ADD)
+ temp.Blend(t_marking_s, ICON_OVERLAY)
+
+ preview_icon.Blend(temp, ICON_OVERLAY)
+
+ //Markings
+ if(current_species && ((current_species.bodyflags & HAS_HEAD_MARKINGS) || (current_species.bodyflags & HAS_BODY_MARKINGS)))
+ if(current_species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
+ var/body_marking = m_styles["body"]
+ var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
+ if(body_marking_style && body_marking_style.species_allowed)
+ var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
+ b_marking_s.Blend(m_colours["body"], ICON_ADD)
+ preview_icon.Blend(b_marking_s, ICON_OVERLAY)
+ if(current_species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed)
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ h_marking_s.Blend(m_colours["head"], ICON_ADD)
+ preview_icon.Blend(h_marking_s, ICON_OVERLAY)
var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s")
@@ -289,6 +363,13 @@
hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
else
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
+
+ if(hair_style.secondary_theme)
+ var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
+ if(!hair_style.no_sec_colour)
+ hair_secondary_s.Blend(rgb(r_hair_sec, g_hair_sec, b_hair_sec), ICON_ADD)
+ hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
+
face_s.Blend(hair_s, ICON_OVERLAY)
//Head Accessory
@@ -306,6 +387,13 @@
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
else
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
+
+ if(facial_hair_style.secondary_theme)
+ var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
+ if(!facial_hair_style.no_sec_colour)
+ facial_secondary_s.Blend(rgb(r_facial_sec, g_facial_sec, b_facial_sec), ICON_ADD)
+ facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
+
face_s.Blend(facial_s, ICON_OVERLAY)
var/icon/underwear_s = null
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 3ade5970d03..0e8f3456335 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -25,14 +25,15 @@
for(var/path in subtypesof(prototype))
var/datum/sprite_accessory/D = new path()
- L[D.name] = D
+ if(D.name)
+ L[D.name] = D
- switch(D.gender)
- if(MALE) male[D.name] = D
- if(FEMALE) female[D.name] = D
- else
- male[D.name] = D
- female[D.name] = D
+ switch(D.gender)
+ if(MALE) male[D.name] = D
+ if(FEMALE) female[D.name] = D
+ else
+ male[D.name] = D
+ female[D.name] = D
return L
/datum/sprite_accessory
@@ -43,8 +44,12 @@
// Restrict some styles to specific species
var/list/species_allowed = list("Human", "Slime People")
- var/models_allowed = list() //Specifies which, if any, hairstyles can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm.
+ var/list/models_allowed = list() //Specifies which, if any, hairstyles or markings can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm.
+ var/list/heads_allowed = null //Specifies which, if any, alt heads a head marking, hairstyle or facial hair style is compatible with.
+ var/list/tails_allowed = null //Specifies which, if any, tails a tail marking is compatible with.
var/marking_location //Specifies which bodypart a body marking is located on.
+ var/secondary_theme = null //If exists, there's a secondary colour to that hair style and the secondary theme's icon state's suffix is equal to this.
+ var/no_sec_colour = null //If exists, prohibit the colouration of the secondary theme.
// Whether or not the accessory can be affected by colouration
var/do_colouration = 1
@@ -61,492 +66,762 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
- bald
- name = "Bald"
- icon_state = "bald"
- gender = MALE
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton")
+/datum/sprite_accessory/hair/bald
+ name = "Bald"
+ icon_state = "bald"
+ species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran")
- short
- name = "Short Hair" // try to capatilize the names please~
- icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
+/datum/sprite_accessory/hair/short
+ name = "Short Hair" // try to capatilize the names please~
+ icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
- cut
- name = "Cut Hair"
- icon_state = "hair_c"
+/datum/sprite_accessory/hair/cut
+ name = "Cut Hair"
+ icon_state = "hair_c"
- long
- name = "Shoulder-length Hair"
- icon_state = "hair_b"
+/datum/sprite_accessory/hair/long
+ name = "Shoulder-length Hair"
+ icon_state = "hair_b"
- longalt
- name = "Shoulder-length Hair Alt"
- icon_state = "hair_longfringe"
+/datum/sprite_accessory/hair/longalt
+ name = "Shoulder-length Hair Alt"
+ icon_state = "hair_longfringe"
- /*longish
- name = "Longer Hair"
- icon_state = "hair_b2"*/
+/*/datum/sprite_accessory/hair/longish
+ name = "Longer Hair"
+ icon_state = "hair_b2"*/
- longer
- name = "Long Hair"
- icon_state = "hair_vlong"
+/datum/sprite_accessory/hair/longer
+ name = "Long Hair"
+ icon_state = "hair_vlong"
- longeralt
- name = "Long Hair Alt"
- icon_state = "hair_vlongfringe"
+/datum/sprite_accessory/hair/longeralt
+ name = "Long Hair Alt"
+ icon_state = "hair_vlongfringe"
- longest
- name = "Very Long Hair"
- icon_state = "hair_longest"
+/datum/sprite_accessory/hair/longest
+ name = "Very Long Hair"
+ icon_state = "hair_longest"
- longfringe
- name = "Long Fringe"
- icon_state = "hair_longfringe"
+/datum/sprite_accessory/hair/longfringe
+ name = "Long Fringe"
+ icon_state = "hair_longfringe"
- longestalt
- name = "Longer Fringe"
- icon_state = "hair_vlongfringe"
+/datum/sprite_accessory/hair/longestalt
+ name = "Longer Fringe"
+ icon_state = "hair_vlongfringe"
- halfbang
- name = "Half-banged Hair"
- icon_state = "hair_halfbang"
+/datum/sprite_accessory/hair/halfbang
+ name = "Half-banged Hair"
+ icon_state = "hair_halfbang"
- halfbangalt
- name = "Half-banged Hair Alt"
- icon_state = "hair_halfbang_alt"
+/datum/sprite_accessory/hair/halfbangalt
+ name = "Half-banged Hair Alt"
+ icon_state = "hair_halfbang_alt"
- ponytail1
- name = "Ponytail male"
- icon_state = "hair_ponytailm"
- gender = MALE
+/datum/sprite_accessory/hair/ponytail1
+ name = "Ponytail male"
+ icon_state = "hair_ponytailm"
+ gender = MALE
- ponytail2
- name = "Ponytail female"
- icon_state = "hair_ponytailf"
- gender = FEMALE
+/datum/sprite_accessory/hair/ponytail2
+ name = "Ponytail female"
+ icon_state = "hair_ponytailf"
+ gender = FEMALE
- ponytail3
- name = "Ponytail alt"
- icon_state = "hair_ponytail3"
+/datum/sprite_accessory/hair/ponytail3
+ name = "Ponytail alt"
+ icon_state = "hair_ponytail3"
- sideponytail
- name = "Side Ponytail"
- icon_state = "hair_stail"
- gender = FEMALE
+/datum/sprite_accessory/hair/sideponytail
+ name = "Side Ponytail"
+ icon_state = "hair_stail"
+ gender = FEMALE
- highponytail
- name = "High Ponytail"
- icon_state = "hair_highponytail"
- gender = FEMALE
+/datum/sprite_accessory/hair/highponytail
+ name = "High Ponytail"
+ icon_state = "hair_highponytail"
+ gender = FEMALE
+/datum/sprite_accessory/hair/wisp
+ name = "Wisp"
+ icon_state = "hair_wisp"
+ gender = FEMALE
- wisp
- name = "Wisp"
- icon_state = "hair_wisp"
- gender = FEMALE
+/datum/sprite_accessory/hair/parted
+ name = "Parted"
+ icon_state = "hair_parted"
- parted
- name = "Parted"
- icon_state = "hair_parted"
+/datum/sprite_accessory/hair/pompadour
+ name = "Pompadour"
+ icon_state = "hair_pompadour"
+ gender = MALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- pompadour
- name = "Pompadour"
- icon_state = "hair_pompadour"
- gender = MALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/quiff
+ name = "Quiff"
+ icon_state = "hair_quiff"
+ gender = MALE
- quiff
- name = "Quiff"
- icon_state = "hair_quiff"
- gender = MALE
+/datum/sprite_accessory/hair/bedhead
+ name = "Bedhead"
+ icon_state = "hair_bedhead"
- bedhead
- name = "Bedhead"
- icon_state = "hair_bedhead"
+/datum/sprite_accessory/hair/bedhead2
+ name = "Bedhead 2"
+ icon_state = "hair_bedheadv2"
- bedhead2
- name = "Bedhead 2"
- icon_state = "hair_bedheadv2"
+/datum/sprite_accessory/hair/bedhead3
+ name = "Bedhead 3"
+ icon_state = "hair_bedheadv3"
- bedhead3
- name = "Bedhead 3"
- icon_state = "hair_bedheadv3"
+/datum/sprite_accessory/hair/beehive
+ name = "Beehive"
+ icon_state = "hair_beehive"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- beehive
- name = "Beehive"
- icon_state = "hair_beehive"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bobcurl
+ name = "Bobcurl"
+ icon_state = "hair_bobcurl"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- bobcurl
- name = "Bobcurl"
- icon_state = "hair_bobcurl"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bob
+ name = "Bob"
+ icon_state = "hair_bobcut"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- bob
- name = "Bob"
- icon_state = "hair_bobcut"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bowl
+ name = "Bowl"
+ icon_state = "hair_bowlcut"
+ gender = MALE
- bowl
- name = "Bowl"
- icon_state = "hair_bowlcut"
- gender = MALE
+/datum/sprite_accessory/hair/braid2
+ name = "Long Braid"
+ icon_state = "hair_hbraid"
+ gender = FEMALE
- braid2
- name = "Long Braid"
- icon_state = "hair_hbraid"
- gender = FEMALE
+/datum/sprite_accessory/hair/braid_hip
+ name = "Hippie Braid"
+ icon_state = "hair_hipbraid"
+ secondary_theme = "beads"
- buzz
- name = "Buzzcut"
- icon_state = "hair_buzzcut"
- gender = MALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/braid_hip_una
+ name = "Unathi Hippie Braid"
+ icon_state = "hair_ubraid"
+ species_allowed = list("Unathi")
+ secondary_theme = "beads"
- crew
- name = "Crewcut"
- icon_state = "hair_crewcut"
- gender = MALE
+/datum/sprite_accessory/hair/buzz
+ name = "Buzzcut"
+ icon_state = "hair_buzzcut"
+ gender = MALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- combover
- name = "Combover"
- icon_state = "hair_combover"
- gender = MALE
+/datum/sprite_accessory/hair/crew
+ name = "Crewcut"
+ icon_state = "hair_crewcut"
+ gender = MALE
- devillock
- name = "Devil Lock"
- icon_state = "hair_devilock"
+/datum/sprite_accessory/hair/combover
+ name = "Combover"
+ icon_state = "hair_combover"
+ gender = MALE
- dreadlocks
- name = "Dreadlocks"
- icon_state = "hair_dreads"
+/datum/sprite_accessory/hair/devillock
+ name = "Devil Lock"
+ icon_state = "hair_devilock"
- curls
- name = "Curls"
- icon_state = "hair_curls"
+/datum/sprite_accessory/hair/dreadlocks
+ name = "Dreadlocks"
+ icon_state = "hair_dreads"
- afro
- name = "Afro"
- icon_state = "hair_afro"
+/datum/sprite_accessory/hair/curls
+ name = "Curls"
+ icon_state = "hair_curls"
- afro2
- name = "Afro 2"
- icon_state = "hair_afro2"
+/datum/sprite_accessory/hair/afro
+ name = "Afro"
+ icon_state = "hair_afro"
- afro_large
- name = "Big Afro"
- icon_state = "hair_bigafro"
- gender = MALE
+/datum/sprite_accessory/hair/afro2
+ name = "Afro 2"
+ icon_state = "hair_afro2"
- sargeant
- name = "Flat Top"
- icon_state = "hair_sargeant"
- gender = MALE
+/datum/sprite_accessory/hair/afro_large
+ name = "Big Afro"
+ icon_state = "hair_bigafro"
+ gender = MALE
- emo
- name = "Emo"
- icon_state = "hair_emo"
+/datum/sprite_accessory/hair/sergeant
+ name = "Flat Top"
+ icon_state = "hair_sergeant"
+ gender = MALE
- fag
- name = "Flow Hair"
- icon_state = "hair_f"
+/datum/sprite_accessory/hair/emo
+ name = "Emo"
+ icon_state = "hair_emo"
- feather
- name = "Feather"
- icon_state = "hair_feather"
+/datum/sprite_accessory/hair/fag
+ name = "Flow Hair"
+ icon_state = "hair_f"
- hitop
- name = "Hitop"
- icon_state = "hair_hitop"
- gender = MALE
+/datum/sprite_accessory/hair/feather
+ name = "Feather"
+ icon_state = "hair_feather"
- mohawk
- name = "Mohawk"
- icon_state = "hair_d"
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/hitop
+ name = "Hitop"
+ icon_state = "hair_hitop"
+ gender = MALE
- jensen
- name = "Adam Jensen Hair"
- icon_state = "hair_jensen"
- gender = MALE
+/datum/sprite_accessory/hair/mohawk
+ name = "Mohawk"
+ icon_state = "hair_d"
+ species_allowed = list("Human", "Slime People", "Unathi")
- cia
- name = "CIA"
- icon_state = "hair_cia"
- gender = MALE
+/datum/sprite_accessory/hair/jensen
+ name = "Adam Jensen Hair"
+ icon_state = "hair_jensen"
+ gender = MALE
- mulder
- name = "Mulder"
- icon_state = "hair_mulder"
- gender = MALE
+/datum/sprite_accessory/hair/cia
+ name = "CIA"
+ icon_state = "hair_cia"
+ gender = MALE
- gelled
- name = "Gelled Back"
- icon_state = "hair_gelled"
- gender = FEMALE
+/datum/sprite_accessory/hair/mulder
+ name = "Mulder"
+ icon_state = "hair_mulder"
+ gender = MALE
- gentle
- name = "Gentle"
- icon_state = "hair_gentle"
- gender = FEMALE
+/datum/sprite_accessory/hair/gelled
+ name = "Gelled Back"
+ icon_state = "hair_gelled"
+ gender = FEMALE
- spiky
- name = "Spiky"
- icon_state = "hair_spikey"
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/gentle
+ name = "Gentle"
+ icon_state = "hair_gentle"
+ gender = FEMALE
- kusangi
- name = "Kusanagi Hair"
- icon_state = "hair_kusanagi"
+/datum/sprite_accessory/hair/spiky
+ name = "Spiky"
+ icon_state = "hair_spikey"
+ species_allowed = list("Human", "Slime People", "Unathi")
- kagami
- name = "Pigtails"
- icon_state = "hair_kagami"
- gender = FEMALE
+/datum/sprite_accessory/hair/kusanagi
+ name = "Kusanagi Hair"
+ icon_state = "hair_kusanagi"
- himecut
- name = "Hime Cut"
- icon_state = "hair_himecut"
- gender = FEMALE
+/datum/sprite_accessory/hair/kagami
+ name = "Pigtails"
+ icon_state = "hair_kagami"
+ gender = FEMALE
- braid
- name = "Floorlength Braid"
- icon_state = "hair_braid"
- gender = FEMALE
+/datum/sprite_accessory/hair/himecut
+ name = "Hime Cut"
+ icon_state = "hair_himecut"
+ gender = FEMALE
- odango
- name = "Odango"
- icon_state = "hair_odango"
- gender = FEMALE
+/datum/sprite_accessory/hair/braid
+ name = "Floorlength Braid"
+ icon_state = "hair_braid"
+ gender = FEMALE
- ombre
- name = "Ombre"
- icon_state = "hair_ombre"
- gender = FEMALE
+/datum/sprite_accessory/hair/odango
+ name = "Odango"
+ icon_state = "hair_odango"
+ gender = FEMALE
- updo
- name = "Updo"
- icon_state = "hair_updo"
- gender = FEMALE
+/datum/sprite_accessory/hair/ombre
+ name = "Ombre"
+ icon_state = "hair_ombre"
+ gender = FEMALE
- skinhead
- name = "Skinhead"
- icon_state = "hair_skinhead"
+/datum/sprite_accessory/hair/updo
+ name = "Updo"
+ icon_state = "hair_updo"
+ gender = FEMALE
- balding
- name = "Balding Hair"
- icon_state = "hair_e"
- gender = MALE // turnoff!
+/datum/sprite_accessory/hair/skinhead
+ name = "Skinhead"
+ icon_state = "hair_skinhead"
- longemo
- name = "Long Emo"
- icon_state = "hair_emolong"
- gender = FEMALE
+/datum/sprite_accessory/hair/balding
+ name = "Balding Hair"
+ icon_state = "hair_e"
+ gender = MALE // turnoff!
+
+/datum/sprite_accessory/hair/longemo
+ name = "Long Emo"
+ icon_state = "hair_emolong"
+ gender = FEMALE
//////////////////////////////
//////START VG HAIRSTYLES/////
//////////////////////////////
- birdnest
- name = "Bird Nest"
- icon_state = "hair_birdnest"
+/datum/sprite_accessory/hair/birdnest
+ name = "Bird Nest"
+ icon_state = "hair_birdnest"
- unkept
- name = "Unkempt"
- icon_state = "hair_unkept"
+/datum/sprite_accessory/hair/unkept
+ name = "Unkempt"
+ icon_state = "hair_unkept"
- duelist
- name = "Duelist"
- icon_state = "hair_duelist"
- gender = MALE
+/datum/sprite_accessory/hair/duelist
+ name = "Duelist"
+ icon_state = "hair_duelist"
+ gender = MALE
- modern
- name = "Modern"
- icon_state = "hair_modern"
- gender = FEMALE
+/datum/sprite_accessory/hair/modern
+ name = "Modern"
+ icon_state = "hair_modern"
+ gender = FEMALE
- unshavenmohawk
- name = "Unshaven Mohawk"
- icon_state = "hair_unshavenmohawk"
- gender = MALE
+/datum/sprite_accessory/hair/unshavenmohawk
+ name = "Unshaven Mohawk"
+ icon_state = "hair_unshavenmohawk"
+ gender = MALE
- drills
- name = "Twincurls"
- icon_state = "hair_twincurl"
- gender = FEMALE
+/datum/sprite_accessory/hair/drills
+ name = "Twincurls"
+ icon_state = "hair_twincurl"
+ gender = FEMALE
- minidrills
- name = "Twincurls 2"
- icon_state = "hair_twincurl2"
- gender = FEMALE
+/datum/sprite_accessory/hair/minidrills
+ name = "Twincurls 2"
+ icon_state = "hair_twincurl2"
+ gender = FEMALE
//////////////////////////////
//////END VG HAIRSTYLES///////
//////////////////////////////
+/datum/sprite_accessory/hair/ipc
+ species_allowed = list("Machine")
- ipc_screen_pink
- name = "Pink IPC Screen"
- icon_state = "ipc_pink"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_pink
+ name = "Pink IPC Screen"
+ icon_state = "ipc_pink"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_red
- name = "Red IPC Screen"
- icon_state = "ipc_red"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_red
+ name = "Red IPC Screen"
+ icon_state = "ipc_red"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_green
- name = "Green IPC Screen"
- icon_state = "ipc_green"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_green
+ name = "Green IPC Screen"
+ icon_state = "ipc_green"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_blue
- name = "Blue IPC Screen"
- icon_state = "ipc_blue"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_blue
+ name = "Blue IPC Screen"
+ icon_state = "ipc_blue"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_breakout
- name = "Breakout IPC Screen"
- icon_state = "ipc_breakout"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_breakout
+ name = "Breakout IPC Screen"
+ icon_state = "ipc_breakout"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_eight
- name = "Eight IPC Screen"
- icon_state = "ipc_eight"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_eight
+ name = "Eight IPC Screen"
+ icon_state = "ipc_eight"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_rainbow
- name = "Rainbow IPC Screen"
- icon_state = "ipc_rainbow"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_rainbow
+ name = "Rainbow IPC Screen"
+ icon_state = "ipc_rainbow"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_goggles
- name = "Goggles IPC Screen"
- icon_state = "ipc_goggles"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_goggles
+ name = "Goggles IPC Screen"
+ icon_state = "ipc_goggles"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_heart
- name = "Heart IPC Screen"
- icon_state = "ipc_heart"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_heart
+ name = "Heart IPC Screen"
+ icon_state = "ipc_heart"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_monoeye
- name = "Monoeye IPC Screen"
- icon_state = "ipc_monoeye"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_monoeye
+ name = "Monoeye IPC Screen"
+ icon_state = "ipc_monoeye"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_nature
- name = "Nature IPC Screen"
- icon_state = "ipc_nature"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_nature
+ name = "Nature IPC Screen"
+ icon_state = "ipc_nature"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_orange
- name = "Orange IPC Screen"
- icon_state = "ipc_orange"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_orange
+ name = "Orange IPC Screen"
+ icon_state = "ipc_orange"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_purple
- name = "Purple IPC Screen"
- icon_state = "ipc_purple"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_purple
+ name = "Purple IPC Screen"
+ icon_state = "ipc_purple"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_shower
- name = "Shower IPC Screen"
- icon_state = "ipc_shower"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_shower
+ name = "Shower IPC Screen"
+ icon_state = "ipc_shower"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_static
- name = "Static IPC Screen"
- icon_state = "ipc_static"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_static
+ name = "Static IPC Screen"
+ icon_state = "ipc_static"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_yellow
- name = "Yellow IPC Screen"
- icon_state = "ipc_yellow"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_yellow
+ name = "Yellow IPC Screen"
+ icon_state = "ipc_yellow"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_scrolling
- name = "Scanline IPC Screen"
- icon_state = "ipc_scroll"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_scrolling
+ name = "Scanline IPC Screen"
+ icon_state = "ipc_scroll"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_console
- name = "Console IPC Screen"
- icon_state = "ipc_console"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_console
+ name = "Console IPC Screen"
+ icon_state = "ipc_console"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_rgb
- name = "RGB IPC Screen"
- icon_state = "ipc_rgb"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_rgb
+ name = "RGB IPC Screen"
+ icon_state = "ipc_rgb"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_glider
- name = "Glider IPC Screen"
- icon_state = "ipc_gol_glider"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_glider
+ name = "Glider IPC Screen"
+ icon_state = "ipc_gol_glider"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- hesphiastos_alt_off
- name = "Dark Hesphiastos Screen"
- icon_state = "hesphiastos_alt_off"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_off
+ name = "Dark Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_off"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_pink
- name = "Pink Hesphiastos Screen"
- icon_state = "hesphiastos_alt_pink"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_pink
+ name = "Pink Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_pink"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_orange
- name = "Orange Hesphiastos Screen"
- icon_state = "hesphiastos_alt_orange"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_orange
+ name = "Orange Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_orange"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_goggle
- name = "Goggles Hesphiastos Screen"
- icon_state = "hesphiastos_alt_goggles"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_goggle
+ name = "Goggles Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_goggles"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_scroll
- name = "Scrolling Hesphiastos Screen"
- icon_state = "hesphiastos_alt_scroll"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_scroll
+ name = "Scrolling Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_scroll"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_rgb
- name = "RGB Hesphiastos Screen"
- icon_state = "hesphiastos_alt_rgb"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rgb
+ name = "RGB Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_rgb"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_rainbow
- name = "Rainbow Hesphiastos Screen"
- icon_state = "hesphiastos_alt_rainbow"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rainbow
+ name = "Rainbow Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_rainbow"
+ models_allowed = list("Hesphiastos Industries alt.")
+
+/*
+///////////////////////////////////
+/ =---------------------------= /
+/ == Alien Style Definitions == /
+/ =---------------------------= /
+///////////////////////////////////
+*/
+
+/datum/sprite_accessory/hair/unathi
+ species_allowed = list("Unathi")
+
+/datum/sprite_accessory/hair/unathi/una_horns
+ name = "Unathi Horns"
+ icon_state = "soghun_horns"
+
+/datum/sprite_accessory/hair/skrell
+ species_allowed = list("Skrell")
+
+/datum/sprite_accessory/hair/skrell/skr_tentacle_m
+ name = "Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+
+/datum/sprite_accessory/hair/skrell/skr_tentacle_f
+ name = "Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+
+/datum/sprite_accessory/hair/skrell/skr_gold_m
+ name = "Gold plated Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+ secondary_theme = "gold"
+ no_sec_colour = 1
+
+/datum/sprite_accessory/hair/skrell/skr_gold_f
+ name = "Gold chained Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+ secondary_theme = "gold"
+ no_sec_colour = 1
+
+/datum/sprite_accessory/hair/skrell/skr_clothtentacle_m
+ name = "Cloth draped Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+ secondary_theme = "cloth"
+
+/datum/sprite_accessory/hair/skrell/skr_clothtentacle_f
+ name = "Cloth draped Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+ secondary_theme = "cloth"
+
+/datum/sprite_accessory/hair/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/hair/tajara/taj_hair_clean
+ name = "Tajara Clean"
+ icon_state = "hair_clean"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_bangs
+ name = "Tajara Bangs"
+ icon_state = "hair_bangs"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_braid
+ name = "Tajara Braid"
+ icon_state = "hair_tbraid"
+ secondary_theme = "beads"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_shaggy
+ name = "Tajara Shaggy"
+ icon_state = "hair_shaggy"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_mohawk
+ name = "Tajaran Mohawk"
+ icon_state = "hair_mohawk"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_plait
+ name = "Tajara Plait"
+ icon_state = "hair_plait"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_straight
+ name = "Tajara Straight"
+ icon_state = "hair_straight"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_long
+ name = "Tajara Long"
+ icon_state = "hair_long"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_rattail
+ name = "Tajara Rat Tail"
+ icon_state = "hair_rattail"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_spiky
+ name = "Tajara Spikey"
+ icon_state = "hair_tajspikey"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_messy
+ name = "Tajara Messy"
+ icon_state = "hair_messy"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_curls
+ name = "Tajara Curly"
+ icon_state = "hair_curly"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_retro
+ name = "Tajaran Ladies' Retro"
+ icon_state = "hair_ladies_retro"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_victory
+ name = "Tajara Victory Curls"
+ icon_state = "hair_victory"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_bob
+ name = "Tajara Bob"
+ icon_state = "hair_tbob"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_fingercurl
+ name = "Tajara Finger Curls"
+ icon_state = "hair_fingerwave"
+
+/datum/sprite_accessory/hair/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kajam
+ name = "Kajam"
+ icon_state = "kajam"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_keid
+ name = "Keid"
+ icon_state = "keid"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_adhara
+ name = "Adhara"
+ icon_state = "adhara"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kleeia
+ name = "Kleeia"
+ icon_state = "kleeia"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_mizar
+ name = "Mizar"
+ icon_state = "mizar"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_apollo
+ name = "Apollo"
+ icon_state = "apollo"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_belle
+ name = "Belle"
+ icon_state = "belle"
+ secondary_theme = "bands"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_bun
+ name = "Bun"
+ icon_state = "bun"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_jagged
+ name = "Jagged"
+ icon_state = "jagged"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_curl
+ name = "Curl"
+ icon_state = "curl"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_hawk
+ name = "Hawk"
+ icon_state = "hawk"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_anita
+ name = "Anita"
+ icon_state = "anita"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_spike
+ name = "Spike"
+ icon_state = "spike"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_braided
+ name = "Braided"
+ icon_state = "braided"
+ secondary_theme = "beads"
+
+/datum/sprite_accessory/hair/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/hair/vox/vox_quills_short
+ name = "Short Vox Quills"
+ icon_state = "vox_shortquills"
+
+/datum/sprite_accessory/hair/vox/vox_crestedquills
+ name = "Crested Vox Quills"
+ icon_state = "vox_crestedquills"
+
+/datum/sprite_accessory/hair/vox/vox_tielquills
+ name = "Vox Tiel Quills"
+ icon_state = "vox_tielquills"
+
+/datum/sprite_accessory/hair/vox/vox_emperorquills
+ name = "Vox Emperor Quills"
+ icon_state = "vox_emperorquills"
+
+/datum/sprite_accessory/hair/vox/vox_keelquills
+ name = "Vox Keel Quills"
+ icon_state = "vox_keelquills"
+
+/datum/sprite_accessory/hair/vox/vox_keetquills
+ name = "Vox Keet Quills"
+ icon_state = "vox_keetquills"
+
+/datum/sprite_accessory/hair/vox/vox_quills_kingly
+ name = "Kingly Vox Quills"
+ icon_state = "vox_kingly"
+
+/datum/sprite_accessory/hair/vox/vox_quills_fluff
+ name = "Fluffy Vox Quills"
+ icon_state = "vox_afro"
+
+/datum/sprite_accessory/hair/vox/vox_quills_mohawk
+ name = "Vox Quill Mohawk"
+ icon_state = "vox_mohawk"
+
+/datum/sprite_accessory/hair/vox/vox_quills_long
+ name = "Long Vox Quills"
+ icon_state = "vox_yasu"
+
+/datum/sprite_accessory/hair/vox/vox_horns
+ name = "Vox Spikes"
+ icon_state = "vox_horns"
+
+/datum/sprite_accessory/hair/vox/vox_nights
+ name = "Vox Pigtails"
+ icon_state = "vox_nights"
+
+/datum/sprite_accessory/hair/vox/vox_razor
+ name = "Vox Razorback"
+ icon_state = "vox_razor"
+
+/datum/sprite_accessory/hair/vox/vox_razor_clipped
+ name = "Clipped Vox Razorback"
+ icon_state = "vox_razor_clipped"
+
+// Apollo-specific
+
+/datum/sprite_accessory/hair/wryn
+ species_allowed = list("Wryn")
+
+/datum/sprite_accessory/hair/wryn/wry_antennae_default
+ name = "Antennae"
+ icon_state = "wryn_antennae"
+
+/datum/sprite_accessory/hair/nucleation
+ species_allowed = list("Nucleation")
+
+/datum/sprite_accessory/hair/nucleation/nuc_crystals
+ name = "Nucleation Crystals"
+ icon_state = "nuc_crystal"
+
+/datum/sprite_accessory/hair/nucleation/nuc_betaburns
+ name = "Nucleation Beta Burns"
+ icon_state = "nuc_betaburns"
+
+/datum/sprite_accessory/hair/nucleation/nuc_fallout
+ name = "Nucleation Fallout"
+ icon_state = "nuc_fallout"
+
+/datum/sprite_accessory/hair/nucleation/nuc_frission
+ name = "Nucleation Frission"
+ icon_state = "nuc_frission"
+
+/datum/sprite_accessory/hair/nucleation/nuc_radical
+ name = "Nucleation Free Radical"
+ icon_state = "nuc_radical"
+
+/datum/sprite_accessory/hair/nucleation/nuc_gammaray
+ name = "Nucleation Gamma Ray"
+ icon_state = "nuc_gammaray"
+
+/datum/sprite_accessory/hair/nucleation/nuc_neutron
+ name = "Nucleation Neutron Bomb"
+ icon_state = "nuc_neutron"
/*
@@ -558,559 +833,232 @@
*/
/datum/sprite_accessory/facial_hair
-
icon = 'icons/mob/human_face.dmi'
gender = MALE // barf (unless you're a dorf, dorfs dig chix /w beards :P)
- shaved
- name = "Shaved"
- icon_state = "bald"
- gender = NEUTER
- species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People")
+/datum/sprite_accessory/facial_hair/shaved
+ name = "Shaved"
+ icon_state = "bald"
+ gender = NEUTER
+ species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People")
- watson
- name = "Watson Mustache"
- icon_state = "facial_watson"
+/datum/sprite_accessory/facial_hair/watson
+ name = "Watson Mustache"
+ icon_state = "facial_watson"
- hogan
- name = "Hulk Hogan Mustache"
- icon_state = "facial_hogan" //-Neek
+/datum/sprite_accessory/facial_hair/hogan
+ name = "Hulk Hogan Mustache"
+ icon_state = "facial_hogan" //-Neek
- vandyke
- name = "Van Dyke Mustache"
- icon_state = "facial_vandyke"
+/datum/sprite_accessory/facial_hair/vandyke
+ name = "Van Dyke Mustache"
+ icon_state = "facial_vandyke"
- chaplin
- name = "Square Mustache"
- icon_state = "facial_chaplin"
+/datum/sprite_accessory/facial_hair/chaplin
+ name = "Square Mustache"
+ icon_state = "facial_chaplin"
- selleck
- name = "Selleck Mustache"
- icon_state = "facial_selleck"
+/datum/sprite_accessory/facial_hair/selleck
+ name = "Selleck Mustache"
+ icon_state = "facial_selleck"
- neckbeard
- name = "Neckbeard"
- icon_state = "facial_neckbeard"
+/datum/sprite_accessory/facial_hair/neckbeard
+ name = "Neckbeard"
+ icon_state = "facial_neckbeard"
- fullbeard
- name = "Full Beard"
- icon_state = "facial_fullbeard"
+/datum/sprite_accessory/facial_hair/fullbeard
+ name = "Full Beard"
+ icon_state = "facial_fullbeard"
- longbeard
- name = "Long Beard"
- icon_state = "facial_longbeard"
+/datum/sprite_accessory/facial_hair/longbeard
+ name = "Long Beard"
+ icon_state = "facial_longbeard"
- vlongbeard
- name = "Very Long Beard"
- icon_state = "facial_wise"
+/datum/sprite_accessory/facial_hair/vlongbeard
+ name = "Very Long Beard"
+ icon_state = "facial_wise"
- elvis
- name = "Elvis Sideburns"
- icon_state = "facial_elvis"
- species_allowed = list("Human","Unathi")
+/datum/sprite_accessory/facial_hair/elvis
+ name = "Elvis Sideburns"
+ icon_state = "facial_elvis"
+ species_allowed = list("Human", "Slime People", "Unathi")
- abe
- name = "Abraham Lincoln Beard"
- icon_state = "facial_abe"
+/datum/sprite_accessory/facial_hair/abe
+ name = "Abraham Lincoln Beard"
+ icon_state = "facial_abe"
- chinstrap
- name = "Chinstrap"
- icon_state = "facial_chin"
+/datum/sprite_accessory/facial_hair/chinstrap
+ name = "Chinstrap"
+ icon_state = "facial_chin"
- hip
- name = "Hipster Beard"
- icon_state = "facial_hip"
+/datum/sprite_accessory/facial_hair/hip
+ name = "Hipster Beard"
+ icon_state = "facial_hip"
- gt
- name = "Goatee"
- icon_state = "facial_gt"
+/datum/sprite_accessory/facial_hair/gt
+ name = "Goatee"
+ icon_state = "facial_gt"
- jensen
- name = "Adam Jensen Beard"
- icon_state = "facial_jensen"
+/datum/sprite_accessory/facial_hair/jensen
+ name = "Adam Jensen Beard"
+ icon_state = "facial_jensen"
- dwarf
- name = "Dwarf Beard"
- icon_state = "facial_dwarf"
+/datum/sprite_accessory/facial_hair/dwarf
+ name = "Dwarf Beard"
+ icon_state = "facial_dwarf"
//////////////////////////////
//////START VG HAIRSTYLES/////
//////////////////////////////
- britstache
- name = "Brit Stache"
- icon_state = "facial_britstache"
+/datum/sprite_accessory/facial_hair/britstache
+ name = "Brit Stache"
+ icon_state = "facial_britstache"
- martialartist
- name = "Martial Artist"
- icon_state = "facial_martialartist"
+/datum/sprite_accessory/facial_hair/martialartist
+ name = "Martial Artist"
+ icon_state = "facial_martialartist"
- moonshiner
- name = "Moonshiner"
- icon_state = "facial_moonshiner"
+/datum/sprite_accessory/facial_hair/moonshiner
+ name = "Moonshiner"
+ icon_state = "facial_moonshiner"
- tribeard
- name = "Tri-beard"
- icon_state = "facial_tribeard"
+/datum/sprite_accessory/facial_hair/tribeard
+ name = "Tri-beard"
+ icon_state = "facial_tribeard"
- unshaven
- name = "Unshaven"
- icon_state = "facial_unshaven"
+/datum/sprite_accessory/facial_hair/unshaven
+ name = "Unshaven"
+ icon_state = "facial_unshaven"
//////////////////////////////
//////END VG HAIRSTYLES///////
//////////////////////////////
-/*
-///////////////////////////////////
-/ =---------------------------= /
-/ == Alien Style Definitions == /
-/ =---------------------------= /
-///////////////////////////////////
-*/
+/datum/sprite_accessory/facial_hair/tajara
+ species_allowed = list("Tajaran")
-/datum/sprite_accessory/hair
+/datum/sprite_accessory/facial_hair/tajara/taj_sideburns
+ name = "Tajara Sideburns"
+ icon_state = "facial_sideburns"
- una_horns
- name = "Unathi Horns"
- icon_state = "soghun_horns"
- species_allowed = list("Unathi")
+/datum/sprite_accessory/facial_hair/tajara/taj_mutton
+ name = "Tajara Mutton"
+ icon_state = "facial_mutton"
- skr_tentacle_m
- name = "Skrell Male Tentacles"
- icon_state = "skrell_hair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/tajara/taj_pencilstache
+ name = "Tajara Pencilstache"
+ icon_state = "facial_pencilstache"
- skr_tentacle_f
- name = "Skrell Female Tentacles"
- icon_state = "skrell_hair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
+/datum/sprite_accessory/facial_hair/tajara/taj_moustache
+ name = "Tajara Moustache"
+ icon_state = "facial_moustache"
- skr_gold_m
- name = "Gold plated Skrell Male Tentacles"
- icon_state = "skrell_goldhair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/tajara/taj_goatee
+ name = "Tajara Goatee"
+ icon_state = "facial_goatee"
- skr_gold_f
- name = "Gold chained Skrell Female Tentacles"
- icon_state = "skrell_goldhair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
+/datum/sprite_accessory/facial_hair/tajara/taj_smallstache
+ name = "Tajara Smallstache"
+ icon_state = "facial_smallstache"
+
+/datum/sprite_accessory/facial_hair/vox
+ species_allowed = list("Vox")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/vox/vox_colonel
+ name = "Vox Colonel Beard"
+ icon_state = "vox_colonel"
+
+/datum/sprite_accessory/facial_hair/vox/vox_long
+ name = "Long Mustache"
+ icon_state = "vox_fu"
+
+/datum/sprite_accessory/facial_hair/vox/vox_neck
+ name = "Neck Quills"
+ icon_state = "vox_neck"
+
+/datum/sprite_accessory/facial_hair/vox/vox_beard
+ name = "Vox Quill Beard"
+ icon_state = "vox_beard"
+
+/datum/sprite_accessory/facial_hair/vulpkanin
+ species_allowed = list("Vulpkanin")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_blaze
+ name = "Blaze"
+ icon_state = "vulp_facial_blaze"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine
+ name = "Vulpine"
+ icon_state = "vulp_facial_vulpine"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_brows
+ name = "Vulpine and Brows"
+ icon_state = "vulp_facial_vulpine_brows"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_fluff
+ name = "Vulpine and Earfluff"
+ icon_state = "vulp_facial_vulpine_fluff"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_mask
+ name = "Mask"
+ icon_state = "vulp_facial_mask"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_patch
+ name = "Patch"
+ icon_state = "vulp_facial_patch"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_ruff
+ name = "Ruff"
+ icon_state = "vulp_facial_ruff"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_kita
+ name = "Kita"
+ icon_state = "vulp_facial_kita"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_swift
+ name = "Swift"
+ icon_state = "vulp_facial_swift"
+
+/datum/sprite_accessory/facial_hair/unathi
+ species_allowed = list("Unathi")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/unathi/una_spines_long
+ name = "Long Spines"
+ icon_state = "soghun_longspines"
+
+/datum/sprite_accessory/facial_hair/unathi/una_spines_short
+ name = "Short Spines"
+ icon_state = "soghun_shortspines"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_aquatic
+ name = "Aquatic Frills"
+ icon_state = "soghun_aquaticfrills"
- skr_clothtentacle_m
- name = "Cloth draped Skrell Male Tentacles"
- icon_state = "skrell_clothhair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/unathi/una_frills_long
+ name = "Long Frills"
+ icon_state = "soghun_longfrills"
- skr_clothtentacle_f
- name = "Cloth draped Skrell Female Tentacles"
- icon_state = "skrell_clothhair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
-
- taj_ears
- name = "Tajaran Ears"
- icon_state = "ears_plain"
- species_allowed = list("Tajaran")
-
- taj_ears_clean
- name = "Tajara Clean"
- icon_state = "hair_clean"
- species_allowed = list("Tajaran")
-
- taj_ears_bangs
- name = "Tajara Bangs"
- icon_state = "hair_bangs"
- species_allowed = list("Tajaran")
-
- taj_ears_braid
- name = "Tajara Braid"
- icon_state = "hair_tbraid"
- species_allowed = list("Tajaran")
-
- taj_ears_shaggy
- name = "Tajara Shaggy"
- icon_state = "hair_shaggy"
- species_allowed = list("Tajaran")
-
- taj_ears_mohawk
- name = "Tajaran Mohawk"
- icon_state = "hair_mohawk"
- species_allowed = list("Tajaran")
-
- taj_ears_plait
- name = "Tajara Plait"
- icon_state = "hair_plait"
- species_allowed = list("Tajaran")
-
- taj_ears_straight
- name = "Tajara Straight"
- icon_state = "hair_straight"
- species_allowed = list("Tajaran")
-
- taj_ears_long
- name = "Tajara Long"
- icon_state = "hair_long"
- species_allowed = list("Tajaran")
-
- taj_ears_rattail
- name = "Tajara Rat Tail"
- icon_state = "hair_rattail"
- species_allowed = list("Tajaran")
-
- taj_ears_spiky
- name = "Tajara Spiky"
- icon_state = "hair_tajspiky"
- species_allowed = list("Tajaran")
-
- taj_ears_messy
- name = "Tajara Messy"
- icon_state = "hair_messy"
- species_allowed = list("Tajaran")
-
-//Vulpkanin
-
- vulp_hair_none
- name = "None"
- icon_state = "bald"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_kajam
- name = "Kajam"
- icon_state = "kajam"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_keid
- name = "Keid"
- icon_state = "keid"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_adhara
- name = "Adhara"
- icon_state = "adhara"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_kleeia
- name = "Kleeia"
- icon_state = "kleeia"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_mizar
- name = "Mizar"
- icon_state = "mizar"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_apollo
- name = "Apollo"
- icon_state = "apollo"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_belle
- name = "Belle"
- icon_state = "belle"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_bun
- name = "Bun"
- icon_state = "bun"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_jagged
- name = "Jagged"
- icon_state = "jagged"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_curl
- name = "Curl"
- icon_state = "curl"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_hawk
- name = "Hawk"
- icon_state = "hawk"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_anita
- name = "Anita"
- icon_state = "anita"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_short
- name = "Short"
- icon_state = "short"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_spike
- name = "Spike"
- icon_state = "spike"
- species_allowed = list("Vulpkanin")
-
-//Vox
-
- vox_quills_short
- name = "Short Vox Quills"
- icon_state = "vox_shortquills"
- species_allowed = list("Vox")
-
- vox_crestedquills
- name = "Crested Vox Quills"
- icon_state = "vox_crestedquills"
- species_allowed = list("Vox")
-
- vox_tielquills
- name = "Vox Tiel Quills"
- icon_state = "vox_tielquills"
- species_allowed = list("Vox")
-
- vox_emperorquills
- name = "Vox Emperor Quills"
- icon_state = "vox_emperorquills"
- species_allowed = list("Vox")
-
- vox_keelquills
- name = "Vox Keel Quills"
- icon_state = "vox_keelquills"
- species_allowed = list("Vox")
-
- vox_keetquills
- name = "Vox Keet Quills"
- icon_state = "vox_keetquills"
- species_allowed = list("Vox")
-
- vox_quills_kingly
- name = "Kingly Vox Quills"
- icon_state = "vox_kingly"
- species_allowed = list("Vox")
-
- vox_quills_fluff
- name = "Fluffy Vox Quills"
- icon_state = "vox_afro"
- species_allowed = list("Vox")
-
- vox_quills_mohawk
- name = "Vox Quill Mohawk"
- icon_state = "vox_mohawk"
- species_allowed = list("Vox")
-
- vox_quills_long
- name = "Long Vox Quills"
- icon_state = "vox_yasu"
- species_allowed = list("Vox")
-
- vox_horns
- name = "Vox Spikes"
- icon_state = "vox_horns"
- species_allowed = list("Vox")
-
- vox_nights
- name = "Vox Pigtails"
- icon_state = "vox_nights"
- species_allowed = list("Vox")
-
- vox_razor
- name = "Vox Razorback"
- icon_state = "vox_razor"
- species_allowed = list("Vox")
-
-// Apollo-specific
-
- //Wryn antennae
-
- wry_antennae_default
- name = "Antennae"
- icon_state = "wryn_antennae"
- species_allowed = list("Wryn")
-
- //Nucleation "hairstyles"
-
- nuc_crystals
- name = "Nucleation Crystals"
- icon_state = "nuc_crystal"
- species_allowed = list("Nucleation")
-
- nuc_betaburns
- name = "Nucleation Beta Burns"
- icon_state = "nuc_betaburns"
- species_allowed = list("Nucleation")
-
- nuc_fallout
- name = "Nucleation Fallout"
- icon_state = "nuc_fallout"
- species_allowed = list("Nucleation")
-
- nuc_frission
- name = "Nucleation Frission"
- icon_state = "nuc_frission"
- species_allowed = list("Nucleation")
-
- nuc_radical
- name = "Nucleation Free Radical"
- icon_state = "nuc_radical"
- species_allowed = list("Nucleation")
-
- nuc_gammaray
- name = "Nucleation Gamma Ray"
- icon_state = "nuc_gammaray"
- species_allowed = list("Nucleation")
-
- nuc_neutron
- name = "Nucleation Neutron Bomb"
- icon_state = "nuc_neutron"
- species_allowed = list("Nucleation")
-
-/datum/sprite_accessory/facial_hair
-
-//Tajara
-
- taj_sideburns
- name = "Tajara Sideburns"
- icon_state = "facial_sideburns"
- species_allowed = list("Tajaran")
-
- taj_mutton
- name = "Tajara Mutton"
- icon_state = "facial_mutton"
- species_allowed = list("Tajaran")
-
- taj_pencilstache
- name = "Tajara Pencilstache"
- icon_state = "facial_pencilstache"
- species_allowed = list("Tajaran")
-
- taj_moustache
- name = "Tajara Moustache"
- icon_state = "facial_moustache"
- species_allowed = list("Tajaran")
-
- taj_goatee
- name = "Tajara Goatee"
- icon_state = "facial_goatee"
- species_allowed = list("Tajaran")
-
- taj_smallstache
- name = "Tajara Smallstache"
- icon_state = "facial_smallstache"
- species_allowed = list("Tajaran")
-
-//Vox
-
- vox_colonel
- name = "Vox Colonel Beard"
- icon_state = "vox_colonel"
- species_allowed = list("Vox")
-
- vox_long
- name = "Long Mustache"
- icon_state = "vox_fu"
- species_allowed = list("Vox")
-
- vox_neck
- name = "Neck Quills"
- icon_state = "vox_neck"
- species_allowed = list("Vox")
-
- vox_beard
- name = "Vox Quill Beard"
- icon_state = "vox_beard"
- species_allowed = list("Vox")
-
-//Vulpkanin
-
- vulp_blaze
- name = "Blaze"
- icon_state = "vulp_facial_blaze"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_vulpine
- name = "Vulpine"
- icon_state = "vulp_facial_vulpine"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_vulpine_fluff
- name = "Vulpine and Earfluff"
- icon_state = "vulp_facial_vulpine_fluff"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_mask
- name = "Mask"
- icon_state = "vulp_facial_mask"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_patch
- name = "Patch"
- icon_state = "vulp_facial_patch"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_ruff
- name = "Ruff"
- icon_state = "vulp_facial_ruff"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_kita
- name = "Kita"
- icon_state = "vulp_facial_kita"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_swift
- name = "Swift"
- icon_state = "vulp_facial_swift"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
-//Unathi
-
- una_spines_long
- name = "Long Spines"
- icon_state = "soghun_longspines"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_spines_short
- name = "Short Spines"
- icon_state = "soghun_shortspines"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_long
- name = "Long Frills"
- icon_state = "soghun_longfrills"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_short
- name = "Short Frills"
- icon_state = "soghun_shortfrills"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_long
- name = "Long Webbed Frills"
- icon_state = "soghun_longfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_short
- name = "Short Webbed Frills"
- icon_state = "soghun_shortfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_aquatic
- name = "Aquatic Frills"
- icon_state = "soghun_aquaticfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
+/datum/sprite_accessory/facial_hair/unathi/una_frills_short
+ name = "Short Frills"
+ icon_state = "soghun_shortfrills"
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquatic
+ name = "Aquatic Webbed Frills"
+ icon_state = "soghun_aquaticfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_long
+ name = "Long Webbed Frills"
+ icon_state = "soghun_longfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_short
+ name = "Short Webbed Frills"
+ icon_state = "soghun_shortfrills"
+ secondary_theme = "webbing"
//skin styles - WIP
//going to have to re-integrate this with surgery
@@ -1118,420 +1066,355 @@
/datum/sprite_accessory/skin
icon = 'icons/mob/human_races/r_human.dmi'
- human
- name = "Default human skin"
- icon_state = "default"
- species_allowed = list("Human")
+/datum/sprite_accessory/skin/human
+ name = "Default human skin"
+ icon_state = "default"
+ species_allowed = list("Human")
- human_tatt01
- name = "Tatt01 human skin"
- icon_state = "tatt1"
- species_allowed = list("Human")
+/datum/sprite_accessory/skin/human/human_tatt01
+ name = "Tatt01 human skin"
+ icon_state = "tatt1"
- tajaran
- name = "Default tajaran skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_tajaran.dmi'
- species_allowed = list("Tajaran")
+/datum/sprite_accessory/skin/tajaran
+ name = "Default tajaran skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_tajaran.dmi'
+ species_allowed = list("Tajaran")
- vulpkanin
- name = "Default Vulpkanin skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_vulpkanin.dmi'
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/skin/vulpkanin
+ name = "Default Vulpkanin skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_vulpkanin.dmi'
+ species_allowed = list("Vulpkanin")
- unathi
- name = "Default Unathi skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_lizard.dmi'
- species_allowed = list("Unathi")
+/datum/sprite_accessory/skin/unathi
+ name = "Default Unathi skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_lizard.dmi'
+ species_allowed = list("Unathi")
- skrell
- name = "Default skrell skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_skrell.dmi'
- species_allowed = list("Skrell")
+/datum/sprite_accessory/skin/skrell
+ name = "Default skrell skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_skrell.dmi'
+ species_allowed = list("Skrell")
///////////////////////////
// Underwear Definitions //
///////////////////////////
/datum/sprite_accessory/underwear
icon = 'icons/mob/underwear.dmi'
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine")
+/datum/sprite_accessory/underwear/nude
+ name = "Nude"
+ icon_state = null
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
- nude
- name = "Nude"
- icon_state = null
- gender = NEUTER
+/datum/sprite_accessory/underwear/male
+ gender = MALE
- male_white
- name = "Mens White"
- icon_state = "male_white"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_white
+ name = "Mens White"
+ icon_state = "male_white"
- male_grey
- name = "Mens Grey"
- icon_state = "male_grey"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_grey
+ name = "Mens Grey"
+ icon_state = "male_grey"
- male_grey
- name = "Mens Grey Alt"
- icon_state = "male_greyalt"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_grey
+ name = "Mens Grey Alt"
+ icon_state = "male_greyalt"
- male_green
- name = "Mens Green"
- icon_state = "male_green"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_green
+ name = "Mens Green"
+ icon_state = "male_green"
- male_blue
- name = "Mens Blue"
- icon_state = "male_blue"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_blue
+ name = "Mens Blue"
+ icon_state = "male_blue"
- male_red
- name = "Mens Red"
- icon_state = "male_red"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_red
+ name = "Mens Red"
+ icon_state = "male_red"
- male_black
- name = "Mens Black"
- icon_state = "male_black"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_black
+ name = "Mens Black"
+ icon_state = "male_black"
- male_black_alt
- name = "Mens Black Alt"
- icon_state = "male_blackalt"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_black_alt
+ name = "Mens Black Alt"
+ icon_state = "male_blackalt"
- male_striped
- name = "Mens Striped"
- icon_state = "male_stripe"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_striped
+ name = "Mens Striped"
+ icon_state = "male_stripe"
- male_heart
- name = "Mens Hearts"
- icon_state = "male_hearts"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_heart
+ name = "Mens Hearts"
+ icon_state = "male_hearts"
- male_kinky
- name = "Mens Kinky"
- icon_state = "male_kinky"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_kinky
+ name = "Mens Kinky"
+ icon_state = "male_kinky"
- male_mankini
- name = "Mankini"
- icon_state = "male_mankini"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_mankini
+ name = "Mankini"
+ icon_state = "male_mankini"
- female_red
- name = "Ladies Red"
- icon_state = "female_red"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female
+ gender = FEMALE
- female_green
- name = "Ladies Green"
- icon_state = "female_green"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_red
+ name = "Ladies Red"
+ icon_state = "female_red"
- female_white
- name = "Ladies White"
- icon_state = "female_white"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_green
+ name = "Ladies Green"
+ icon_state = "female_green"
- female_whiter
- name = "Ladies Whiter"
- icon_state = "female_whiter"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_white
+ name = "Ladies White"
+ icon_state = "female_white"
- female_whitealt
- name = "Ladies White Alt"
- icon_state = "female_whitealt"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_whiter
+ name = "Ladies Whiter"
+ icon_state = "female_whiter"
- female_yellow
- name = "Ladies Yellow"
- icon_state = "female_yellow"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_whitealt
+ name = "Ladies White Alt"
+ icon_state = "female_whitealt"
- female_blue
- name = "Ladies Blue"
- icon_state = "female_blue"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_yellow
+ name = "Ladies Yellow"
+ icon_state = "female_yellow"
- female_babyblue
- name = "Ladies Baby Blue"
- icon_state = "female_babyblue"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blue
+ name = "Ladies Blue"
+ icon_state = "female_blue"
+/datum/sprite_accessory/underwear/female/female_babyblue
+ name = "Ladies Baby Blue"
+ icon_state = "female_babyblue"
- female_black
- name = "Ladies Black"
- icon_state = "female_black"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_black
+ name = "Ladies Black"
+ icon_state = "female_black"
- female_blacker
- name = "Ladies Blacker"
- icon_state = "female_blacker"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blacker
+ name = "Ladies Blacker"
+ icon_state = "female_blacker"
- female_blackalt
- name = "Ladies Black Alt"
- icon_state = "female_blackalt"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blackalt
+ name = "Ladies Black Alt"
+ icon_state = "female_blackalt"
- female_kinky
- name = "Ladies Kinky"
- icon_state = "female_kinky"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_kinky
+ name = "Ladies Kinky"
+ icon_state = "female_kinky"
- female_babydoll
- name = "Ladies Full Grey"
- icon_state = "female_babydoll"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_babydoll
+ name = "Ladies Full Grey"
+ icon_state = "female_babydoll"
- female_pink
- name = "Ladies Pink"
- icon_state = "female_pink"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_pink
+ name = "Ladies Pink"
+ icon_state = "female_pink"
- female_thong
- name = "Ladies Thong"
- icon_state = "female_thong"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_thong
+ name = "Ladies Thong"
+ icon_state = "female_thong"
////////////////////////////
// Undershirt Definitions //
////////////////////////////
/datum/sprite_accessory/undershirt
icon = 'icons/mob/underwear.dmi'
-
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
/datum/sprite_accessory/undershirt/nude
name = "Nude"
icon_state = null
- gender = NEUTER
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
//plain color shirts
/datum/sprite_accessory/undershirt/shirt_white
name = "White Shirt"
icon_state = "shirt_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_black
name = "Black Shirt"
icon_state = "shirt_black"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_blacker
name = "Blacker Shirt"
icon_state = "shirt_blacker"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_grey
name = "Grey Shirt"
icon_state = "shirt_grey"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_red
name = "Red Shirt"
icon_state = "shirt_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_blue
name = "Blue Shirt"
icon_state = "shirt_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_yellow
name = "Yellow Shirt"
icon_state = "shirt_yellow"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_green
name = "Green Shirt"
icon_state = "shirt_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkblue
name = "Dark Blue Shirt"
icon_state = "shirt_darkblue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkred
name = "Dark Red Shirt"
icon_state = "shirt_darkred"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkgreen
name = "Dark Green Shirt"
icon_state = "shirt_darkgreen"
- gender = NEUTER
//end plain color shirts
+//graphic shirts
/datum/sprite_accessory/undershirt/shirt_heart
name = "Heart Shirt"
icon_state = "shirt_heart"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_corgi
name = "Corgi Shirt"
icon_state = "shirt_corgi"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_clown
name = "Clown Shirt"
icon_state = "shirt_clown"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_alien
name = "Alien Shirt"
icon_state = "shirt_alien"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_jack
name = "Union Jack Shirt"
icon_state = "shirt_jack"
- gender = NEUTER
/datum/sprite_accessory/undershirt/love_nt
name = "I Love NT Shirt"
icon_state = "shirt_lovent"
- gender = NEUTER
/datum/sprite_accessory/undershirt/peace
name = "Peace Shirt"
icon_state = "shirt_peace"
- gender = NEUTER
/datum/sprite_accessory/undershirt/mondmondjaja
name = "Band Shirt"
icon_state = "shirt_band"
- gender = NEUTER
/datum/sprite_accessory/undershirt/pacman
name = "Pogoman Shirt"
icon_state = "shirt_pogoman"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_ss13
name = "SS13 Shirt"
icon_state = "shirt_ss13"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_question
name = "Question Mark Shirt"
icon_state = "shirt_question"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_skull
name = "Skull Shirt"
icon_state = "shirt_skull"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_commie
name = "Communist Shirt"
icon_state = "shirt_commie"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_nano
name = "Nanotrasen Shirt"
icon_state = "shirt_nano"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_meat
name = "Meat Shirt"
icon_state = "shirt_meat"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_tiedie
name = "Tiedie Shirt"
icon_state = "shirt_tiedie"
- gender = NEUTER
/datum/sprite_accessory/undershirt/blue_striped
name = "Striped Blue Shirt"
icon_state = "shirt_bluestripe"
- gender = NEUTER
/datum/sprite_accessory/undershirt/brightblue_striped
name = "Striped Bright Blue Shirt"
icon_state = "shirt_brightbluestripe"
- gender = NEUTER
-
+//end graphic shirts
//short sleeved
/datum/sprite_accessory/undershirt/short_white
name = "White Short-sleeved Shirt"
icon_state = "short_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_purple
name = "Purple Short-sleeved Shirt"
icon_state = "short_purple"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_blue
name = "Blue Short-sleeved Shirt"
icon_state = "short_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_green
name = "Green Short-sleeved Shirt"
icon_state = "short_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_black
name = "Black Short-sleeved Shirt"
icon_state = "short_black"
- gender = NEUTER
//end short sleeved
//polo shirts
/datum/sprite_accessory/undershirt/polo_blue
name = "Blue Polo Shirt"
icon_state = "polo_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/polo_red
name = "Red Polo Shirt"
icon_state = "polo_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/polo_greyelllow
name = "Grey-Yellow Polo Shirt"
icon_state = "polo_greyellow"
- gender = NEUTER
//end polo shirts
//sport shirts
/datum/sprite_accessory/undershirt/sport_green
name = "Green Sports Shirt"
icon_state = "sport_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/sport_red
name = "Red Sports Shirt"
icon_state = "sport_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/sport_blue
name = "Blue Sports Shirt"
icon_state = "sport_blue"
- gender = NEUTER
-//end sport shirts
/datum/sprite_accessory/undershirt/jersey_red
name = "Red Jersey"
icon_state = "jersey_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/jersey_blue
name = "Blue Jersey"
icon_state = "jersey_blue"
- gender = NEUTER
-
+//end sport shirts
//tanktops
/datum/sprite_accessory/undershirt/tank_redtop
@@ -1552,39 +1435,30 @@
/datum/sprite_accessory/undershirt/tank_white
name = "White Tank-Top"
icon_state = "tank_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_black
name = "Black Tank-Top"
icon_state = "tank_black"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_blacker
name = "Blacker Tank-Top"
icon_state = "tank_blacker"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_grey
name = "Grey Tank-Top"
icon_state = "tank_grey"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_red
name = "Red Tank-Top"
icon_state = "tank_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_fire
name = "Fire Tank-Top"
icon_state = "tank_fire"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_stripes
name = "Striped Tank-Top"
icon_state = "tank_stripes"
- gender = NEUTER
-
-
//end tanktops
///////////////////////
@@ -1592,174 +1466,127 @@
///////////////////////
/datum/sprite_accessory/socks
icon = 'icons/mob/underwear.dmi'
- species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
/datum/sprite_accessory/socks/nude
name = "Nude"
icon_state = null
- gender = NEUTER
- species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
-
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
/datum/sprite_accessory/socks/white_norm
name = "Normal White"
icon_state = "white_norm"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_norm
name = "Normal Black"
icon_state = "black_norm"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_short
name = "Short White"
icon_state = "white_short"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_short
name = "Short Black"
icon_state = "black_short"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_knee
name = "Knee-high White"
icon_state = "white_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_knee
name = "Knee-high Black"
icon_state = "black_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/thin_knee
name = "Knee-high Thin"
icon_state = "thin_knee"
gender = FEMALE
-
/datum/sprite_accessory/socks/striped_knee
name = "Knee-high Striped"
icon_state = "striped_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/rainbow_knee
name = "Knee-high Rainbow"
icon_state = "rainbow_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_thigh
name = "Thigh-high White"
icon_state = "white_thigh"
- gender = NEUTER
/datum/sprite_accessory/socks/black_thigh
name = "Thigh-high Black"
icon_state = "black_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/thin_thigh
name = "Thigh-high Thin"
icon_state = "thin_thigh"
gender = FEMALE
-
/datum/sprite_accessory/socks/striped_thigh
name = "Thigh-high Striped"
icon_state = "striped_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/rainbow_thigh
name = "Thigh-high Rainbow"
icon_state = "rainbow_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/pantyhose
name = "Pantyhose"
icon_state = "pantyhose"
gender = FEMALE
-
/datum/sprite_accessory/socks/black_fishnet
name = "Black Fishnet"
icon_state = "black_fishnet"
- gender = NEUTER
-/datum/sprite_accessory/socks/vox_white
+/datum/sprite_accessory/socks/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox/vox_white
name = "Vox White"
icon_state = "vox_white"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_black
+/datum/sprite_accessory/socks/vox/vox_black
name = "Vox Black"
icon_state = "vox_black"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_thin
+/datum/sprite_accessory/socks/vox/vox_thin
name = "Vox Black Thin"
icon_state = "vox_blackthin"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_rainbow
+/datum/sprite_accessory/socks/vox/vox_rainbow
name = "Vox Rainbow"
icon_state = "vox_rainbow"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_stripped
+/datum/sprite_accessory/socks/vox/vox_stripped
name = "Vox Striped"
icon_state = "vox_white"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_white_thigh
+/datum/sprite_accessory/socks/vox/vox_white_thigh
name = "Vox Thigh-high White"
icon_state = "vox_whiteTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_black_thigh
+/datum/sprite_accessory/socks/vox/vox_black_thigh
name = "Vox Thigh-high Black"
icon_state = "vox_blackTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_thin_thigh
+/datum/sprite_accessory/socks/vox/vox_thin_thigh
name = "Vox Thigh-high Thin"
icon_state = "vox_blackthinTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_rainbow_thigh
+/datum/sprite_accessory/socks/vox/vox_rainbow_thigh
name = "Vox Thigh-high Rainbow"
icon_state = "vox_rainbowTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_striped_thigh
+/datum/sprite_accessory/socks/vox/vox_striped_thigh
name = "Vox Thigh-high Striped"
icon_state = "vox_stripedTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_fishnet
+/datum/sprite_accessory/socks/vox/vox_fishnet
name = "Vox Fishnets"
icon_state = "vox_fishnet"
- gender = NEUTER
- species_allowed = list("Vox")
/* HEAD ACCESSORY */
@@ -1773,185 +1600,494 @@
species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
icon_state = "accessory_none"
-/datum/sprite_accessory/head_accessory/simple
- name = "Simple"
+/datum/sprite_accessory/head_accessory/unathi
species_allowed = list("Unathi")
+
+/datum/sprite_accessory/head_accessory/unathi/simple
+ name = "Simple"
icon_state = "horns_simple"
-/datum/sprite_accessory/head_accessory/short
+/datum/sprite_accessory/head_accessory/unathi/short
name = "Short"
- species_allowed = list("Unathi")
icon_state = "horns_short"
-/datum/sprite_accessory/head_accessory/curled
+/datum/sprite_accessory/head_accessory/unathi/curled
name = "Curled"
- species_allowed = list("Unathi")
icon_state = "horns_curled"
-/datum/sprite_accessory/head_accessory/ram
+/datum/sprite_accessory/head_accessory/unathi/ram
name = "Ram"
- species_allowed = list("Unathi")
icon_state = "horns_ram"
-/datum/sprite_accessory/head_accessory/vulp_earfluff
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpkanin Earfluff"
- icon_state = "vulp_facial_earfluff"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara
+ species_allowed = list("Tajaran")
-/datum/sprite_accessory/head_accessory/vulp_blaze
- icon = 'icons/mob/human_face.dmi'
- name = "Blaze"
- icon_state = "vulp_facial_blaze"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/outears_taj
+ name = "Tajaran Outer Ears"
+ icon_state = "markings_face_outears_taj"
-/datum/sprite_accessory/head_accessory/vulp_vulpine
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpine"
- icon_state = "vulp_facial_vulpine"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/inears_taj
+ name = "Tajaran Inner Ears"
+ icon_state = "markings_face_inears_taj"
-/datum/sprite_accessory/head_accessory/vulp_vulpine_fluff
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpine and Earfluff"
- icon_state = "vulp_facial_vulpine_fluff"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/muzzle_taj
+ name = "Tajaran Muzzle"
+ icon_state = "markings_face_muzzle_taj"
-/datum/sprite_accessory/head_accessory/vulp_mask
- icon = 'icons/mob/human_face.dmi'
- name = "Mask"
- icon_state = "vulp_facial_mask"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/muzzle_and_inears_taj
+ name = "Tajaran Muzzle and Inner Ears"
+ icon_state = "markings_face_muzzle_and_inears_taj"
-/datum/sprite_accessory/head_accessory/vulp_patch
- icon = 'icons/mob/human_face.dmi'
- name = "Patch"
- icon_state = "vulp_facial_patch"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_ruff
- icon = 'icons/mob/human_face.dmi'
- name = "Ruff"
- icon_state = "vulp_facial_ruff"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_kita
- icon = 'icons/mob/human_face.dmi'
- name = "Kita"
- icon_state = "vulp_facial_kita"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_swift
- icon = 'icons/mob/human_face.dmi'
- name = "Swift"
- icon_state = "vulp_facial_swift"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/taj_ears
+/datum/sprite_accessory/head_accessory/tajara/taj_ears
icon = 'icons/mob/human_face.dmi'
name = "Tajaran Ears"
icon_state = "ears_plain"
- species_allowed = list("Tajaran")
-/datum/sprite_accessory/head_accessory/ipc_antennae
+/datum/sprite_accessory/head_accessory/tajara/taj_nose
+ name = "Tajaran Nose"
+ icon_state = "markings_face_nose_taj"
+
+/datum/sprite_accessory/head_accessory/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_earfluff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpkanin Earfluff"
+ icon_state = "vulp_facial_earfluff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_blaze
+ icon = 'icons/mob/human_face.dmi'
+ name = "Blaze"
+ icon_state = "vulp_facial_blaze"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpine"
+ icon_state = "vulp_facial_vulpine"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine_fluff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpine and Earfluff"
+ icon_state = "vulp_facial_vulpine_fluff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_mask
+ icon = 'icons/mob/human_face.dmi'
+ name = "Mask"
+ icon_state = "vulp_facial_mask"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_patch
+ icon = 'icons/mob/human_face.dmi'
+ name = "Patch"
+ icon_state = "vulp_facial_patch"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_ruff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Ruff"
+ icon_state = "vulp_facial_ruff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_kita
+ icon = 'icons/mob/human_face.dmi'
+ name = "Kita"
+ icon_state = "vulp_facial_kita"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_swift
+ icon = 'icons/mob/human_face.dmi'
+ name = "Swift"
+ icon_state = "vulp_facial_swift"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose
+ name = "Vulpkanin Nose"
+ icon_state = "markings_face_nose_vulp"
+
+/datum/sprite_accessory/head_accessory/ipc
+ species_allowed = list("Machine")
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_antennae
name = "Antennae"
icon_state = "antennae"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_tv_antennae
+/datum/sprite_accessory/head_accessory/ipc/ipc_tv_antennae
name = "T.V. Antennae"
icon_state = "tvantennae"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_tesla_antennae
+/datum/sprite_accessory/head_accessory/ipc/ipc_tesla_antennae
name = "Tesla Antennae"
icon_state = "tesla"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_light
+/datum/sprite_accessory/head_accessory/ipc/ipc_light
name = "Head Light"
icon_state = "light"
- species_allowed = list("Machine")
/* BODY MARKINGS */
/datum/sprite_accessory/body_markings
icon = 'icons/mob/body_accessory.dmi'
- species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine")
+ species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine", "Vox")
icon_state = "accessory_none"
+ marking_location = "body"
/datum/sprite_accessory/body_markings/none
name = "None"
species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
icon_state = "accessory_none"
-/datum/sprite_accessory/body_markings/stripe
- name = "Stripe"
- species_allowed = list("Unathi")
- icon_state = "markings_stripe"
-
/datum/sprite_accessory/body_markings/tiger
name = "Tiger Body"
species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
icon_state = "markings_tiger"
-/datum/sprite_accessory/body_markings/tigerhead
- name = "Tiger Body and Head"
- species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
- icon_state = "markings_tigerhead"
-
-/datum/sprite_accessory/body_markings/tigerheadface_taj
- name = "Tajaran Tiger Body, Head and Face"
- species_allowed = list("Tajaran")
- icon_state = "markings_tigerheadface_taj"
-
-/datum/sprite_accessory/body_markings/tigerheadface_vulp
- name = "Vulpkanin Tiger Body, Head and Face"
- species_allowed = list("Vulpkanin")
- icon_state = "markings_tigerheadface_vulp"
-
-/datum/sprite_accessory/body_markings/tigerheadface_una
- name = "Unathi Tiger Body, Head and Face"
+/datum/sprite_accessory/body_markings/unathi
species_allowed = list("Unathi")
- icon_state = "markings_tigerheadface_una"
-/datum/sprite_accessory/body_markings/optics
+/datum/sprite_accessory/body_markings/unathi/stripe_una
+ name = "Unathi Stripe"
+ icon_state = "markings_stripe_una"
+
+/datum/sprite_accessory/body_markings/unathi/belly_narrow_una
+ name = "Unathi Belly"
+ icon_state = "markings_belly_narrow_una"
+
+/datum/sprite_accessory/body_markings/unathi/banded_una
+ name = "Unathi Banded"
+ icon_state = "markings_banded_una"
+
+/datum/sprite_accessory/body_markings/unathi/points_una
+ name = "Unathi Points"
+ icon_state = "markings_points_una"
+
+/datum/sprite_accessory/body_markings/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/body_markings/tajara/belly_flat_taj
+ name = "Tajaran Belly"
+ icon_state = "markings_belly_flat_taj"
+
+/datum/sprite_accessory/body_markings/tajara/belly_crest_taj
+ name = "Tajaran Chest Crest"
+ icon_state = "markings_belly_crest_taj"
+
+/datum/sprite_accessory/body_markings/tajara/belly_full_taj
+ name = "Tajaran Belly 2"
+ icon_state = "markings_belly_full_taj"
+
+/datum/sprite_accessory/body_markings/tajara/points_taj
+ name = "Tajaran Points"
+ icon_state = "markings_points_taj"
+
+/datum/sprite_accessory/body_markings/tajara/patchy_taj
+ name = "Tajaran Patches"
+ icon_state = "markings_patch_taj"
+
+/datum/sprite_accessory/body_markings/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_fox_vulp
+ name = "Vulpkanin Belly"
+ icon_state = "markings_belly_fox_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_full_vulp
+ name = "Vulpkanin Belly 2"
+ icon_state = "markings_belly_full_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_crest_vulp
+ name = "Vulpkanin Belly Crest"
+ icon_state = "markings_belly_crest_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_vulp
+ name = "Vulpkanin Points"
+ icon_state = "markings_points_fade_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_vulp
+ name = "Vulpkanin Points and Belly"
+ icon_state = "markings_points_fade_belly_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_alt_vulp
+ name = "Vulpkanin Points and Belly Alt."
+ icon_state = "markings_points_fade_belly_alt_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_sharp_vulp
+ name = "Vulpkanin Points 2"
+ icon_state = "markings_points_sharp_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_crest_vulp
+ name = "Vulpkanin Points and Crest"
+ icon_state = "markings_points_crest_vulp"
+
+/datum/sprite_accessory/body_markings/drask
+ species_allowed = list("Drask")
+
+/datum/sprite_accessory/body_markings/drask/arm_spines_drask
+ name = "Drask Arm Spines"
+ icon_state = "markings_armspines_drask"
+
+/datum/sprite_accessory/body_markings/head
+ marking_location = "head"
+ species_allowed = list()
+
+/datum/sprite_accessory/body_markings/head/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/body_markings/head/tajara/tiger_head_taj
+ name = "Tajaran Tiger Head"
+ icon_state = "markings_head_tiger_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/tiger_face_taj
+ name = "Tajaran Tiger Head and Face"
+ icon_state = "markings_face_tiger_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/outears_taj
+ name = "Tajaran Outer Ears"
+ icon_state = "markings_face_outears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/inears_taj
+ name = "Tajaran Inner Ears"
+ icon_state = "markings_face_inears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/nose_taj
+ name = "Tajaran Nose"
+ icon_state = "markings_face_nose_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_taj
+ name = "Tajaran Muzzle"
+ icon_state = "markings_face_muzzle_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_and_inears_taj
+ name = "Tajaran Muzzle and Inner Ears"
+ icon_state = "markings_face_muzzle_and_inears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_alt_taj //Companion marking for Tajaran Belly 2.
+ name = "Tajaran Muzzle 2"
+ icon_state = "markings_face_full_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/points_taj //Companion marking for Tajaran Points.
+ name = "Tajaran Points Head"
+ icon_state = "markings_face_points_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/patchy_taj //Companion marking for Tajaran Patches.
+ name = "Tajaran Patches Head"
+ icon_state = "markings_face_patch_taj"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_head_vulp
+ name = "Vulpkanin Tiger Head"
+ icon_state = "markings_head_tiger_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_face_vulp
+ name = "Vulpkanin Tiger Head and Face"
+ icon_state = "markings_face_tiger_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/nose_default_vulp
+ name = "Vulpkanin Nose"
+ icon_state = "markings_face_nose_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_vulp //Companion marking for Vulpkanin Belly Alt..
+ name = "Vulpkanin Muzzle"
+ icon_state = "markings_face_full_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_ears_vulp //Companion marking for Vulpkanin Belly Alt..
+ name = "Vulpkanin Muzzle and Ears"
+ icon_state = "markings_face_full_ears_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/points_fade_vulp //Companion marking for Vulpkanin Points Fade.
+ name = "Vulpkanin Points Head"
+ icon_state = "markings_face_points_fade_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/points_sharp_vulp //Companion marking for Vulpkanin Points Sharp.
+ name = "Vulpkanin Points Head 2"
+ icon_state = "markings_face_points_sharp_vulp"
+
+/datum/sprite_accessory/body_markings/head/unathi
+ species_allowed = list("Unathi")
+
+/datum/sprite_accessory/body_markings/head/unathi/tiger_head_una
+ name = "Unathi Tiger Head"
+ icon_state = "markings_head_tiger_una"
+ heads_allowed = list("All")
+
+/datum/sprite_accessory/body_markings/head/unathi/tiger_face_una
+ name = "Unathi Tiger Head and Face"
+ icon_state = "markings_face_tiger_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_una_round
+ name = "Unathi Round Snout"
+ icon_state = "markings_face_snout_una_round"
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_lower_una_round
+ name = "Unathi Lower Round Snout"
+ icon_state = "markings_face_snout_lower_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/banded_una //Companion marking for Unathi Banded.
+ name = "Unathi Banded Head"
+ icon_state = "markings_face_banded_una"
+ heads_allowed = list("All")
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_narrow_una //Companion marking for Unathi Narrow Belly.
+ name = "Unathi Snout 2"
+ icon_state = "markings_face_narrow_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/points_una //Companion marking for Unathi Points.
+ name = "Unathi Points Head"
+ icon_state = "markings_face_points_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp
+ heads_allowed = list("Unathi Sharp Snout")
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/tiger_face_una_sharp
+ name = "Unathi Sharp Tiger Head and Face"
+ icon_state = "markings_face_tiger_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_una_sharp
+ name = "Unathi Sharp Snout"
+ icon_state = "markings_face_snout_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_narrow_una_sharp //Companion marking for Unathi Narrow Belly.
+ name = "Unathi Sharp Snout 2"
+ icon_state = "markings_face_narrow_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/points_una_sharp //Companion marking for Unathi Points.
+ name = "Unathi Sharp Points Head"
+ icon_state = "markings_face_points_una"
+
+/datum/sprite_accessory/body_markings/head/optics
name = "Humanoid Optics"
species_allowed = list("Machine")
icon_state = "optics"
models_allowed = list("Bishop Cybernetics", "Hesphiastos Industries", "Ward-Takahashi", "Xion Manufacturing Group", "Zeng-Hu Pharmaceuticals") //Should be the same as the manufacturing company of the limb in robolimbs.dm
- marking_location = "head"
-/datum/sprite_accessory/body_markings/optics/bishop_alt
+/datum/sprite_accessory/body_markings/head/optics/bishop_alt
name = "Bishop Alt. Optics"
- species_allowed = list("Machine")
icon_state = "bishop_alt_optics"
models_allowed = list("Bishop Cybernetics alt.")
-/datum/sprite_accessory/body_markings/optics/morpheus_alt
+/datum/sprite_accessory/body_markings/head/optics/morpheus_alt
name = "Morpheus Alt. Optics"
- species_allowed = list("Machine")
icon_state = "morpheus_alt_optics"
models_allowed = list("Morpheus Cyberkinetics alt.")
-/datum/sprite_accessory/body_markings/optics/wardtakahashi_alt
+/datum/sprite_accessory/body_markings/head/optics/wardtakahashi_alt
name = "Ward-Takahashi Alt. Optics"
- species_allowed = list("Machine")
icon_state = "wardtakahashi_alt_optics"
models_allowed = list("Ward-Takahashi alt.")
-/datum/sprite_accessory/body_markings/optics/xion_alt
+/datum/sprite_accessory/body_markings/head/optics/xion_alt
name = "Xion Alt. Optics"
- species_allowed = list("Machine")
icon_state = "xion_alt_optics"
models_allowed = list("Xion Manufacturing Group alt.")
/datum/sprite_accessory/body_markings/tattoo // Tattoos applied post-round startup with tattoo guns in item_defines.dm
- name = "base tattoo"
- species_allowed = list()
+ species_allowed = list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell")
icon_state = "accessory_none"
/datum/sprite_accessory/body_markings/tattoo/elliot
name = "Elliot Circuit Tattoo"
- icon_state = "campbell_tattoo"
\ No newline at end of file
+ icon_state = "campbell_tattoo"
+ species_allowed = null
+
+/datum/sprite_accessory/body_markings/tattoo/tiger_body
+ name = "Tiger-stripe Tattoo"
+ species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell")
+ icon_state = "markings_tiger"
+
+/datum/sprite_accessory/body_markings/tattoo/heart
+ name = "Heart Tattoo"
+ icon_state = "markings_tattoo_heart"
+
+/datum/sprite_accessory/body_markings/tattoo/hive
+ name = "Hive Tattoo"
+ icon_state = "markings_tattoo_hive"
+
+/datum/sprite_accessory/body_markings/tattoo/nightling
+ name = "Nightling Tattoo"
+ icon_state = "markings_tattoo_nightling"
+
+/datum/sprite_accessory/body_markings/tattoo/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/body_markings/tattoo/vox/heart_vox
+ name = "Vox Heart Tattoo"
+ icon_state = "markings_tattoo_heart_vox"
+
+/datum/sprite_accessory/body_markings/tattoo/vox/hive_vox
+ name = "Vox Hive Tattoo"
+ icon_state = "markings_tattoo_hive_vox"
+
+/datum/sprite_accessory/body_markings/tattoo/vox/nightling_vox
+ name = "Vox Nightling Tattoo"
+ icon_state = "markings_tattoo_nightling_vox"
+
+/datum/sprite_accessory/body_markings/tail
+ species_allowed = list()
+ icon_state = "accessory_none"
+ marking_location = "tail"
+ tails_allowed = null
+
+/datum/sprite_accessory/body_markings/tail/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_band
+ name = "Vox Tail Band"
+ icon_state = "markings_voxtail_band"
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_tip
+ name = "Vox Tail Tip"
+ icon_state = "markings_voxtail_tip"
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_stripe
+ name = "Vox Tail Stripe"
+ icon_state = "markings_voxtail_stripe"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_tip
+ name = "Vulpkanin Default Tail Tip"
+ icon_state = "markings_vulptail_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_fade
+ name = "Vulpkanin Default Tail Fade"
+ icon_state = "markings_vulptail_fade"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_bushy_fluff
+ name = "Vulpkanin Bushy Tail Fluff"
+ tails_allowed = list("Vulpkanin Alt 1 (Bushy)")
+ icon_state = "markings_vulptail2_fluff"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_short_tip
+ name = "Vulpkanin Short Tail Tip"
+ tails_allowed = list("Vulpkanin Alt 4 (Short)")
+ icon_state = "markings_vulptail5_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_tip
+ name = "Vulpkanin Bushy Straight Tail Tip"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_fade
+ name = "Vulpkanin Bushy Straight Tail Fade"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_fade"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_silverf
+ name = "Vulpkanin Bushy Straight Tail Black Fade White Tip"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_silverf"
+
+/* ALT HEADS */
+
+/datum/sprite_accessory/alt_heads
+ icon = null
+ icon_state = null
+ species_allowed = null
+ var/suffix = null
+
+/datum/sprite_accessory/alt_heads/none
+ name = "None"
+
+/datum/sprite_accessory/alt_heads/una_sharp_snout
+ name = "Unathi Sharp Snout"
+ species_allowed = list("Unathi")
+ icon_state = "head_sharp"
+ suffix = "sharp"
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index f280bec0ce1..d010bdfa135 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -142,7 +142,7 @@
if(length(message) >= 2)
var/language_prefix = trim_right(lowertext(copytext(message, 1 ,4)))
var/datum/language/L = language_keys[language_prefix]
- if(can_speak(L))
+ if(can_speak_language(L))
return L
return null
diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm
new file mode 100644
index 00000000000..7358486deee
--- /dev/null
+++ b/code/modules/mob/status_procs.dm
@@ -0,0 +1,202 @@
+// A bunch of empty procs for all the status procs in living/status_procs.dm, because
+// I can't be bothered to deal with all the merge conflicts it would cause to
+// typecast every mob in the codebase correctly
+
+/mob/proc/Confused()
+ return
+
+/mob/proc/SetConfused()
+ return
+
+/mob/proc/AdjustConfused()
+ return
+
+
+/mob/proc/Dizzy()
+ return
+
+/mob/proc/SetDizzy()
+ return
+
+/mob/proc/AdjustDizzy()
+ return
+
+
+/mob/proc/Drowsy()
+ return
+
+/mob/proc/SetDrowsy()
+ return
+
+/mob/proc/AdjustDrowsy()
+ return
+
+
+/mob/proc/Drunk()
+ return
+
+/mob/proc/SetDrunk()
+ return
+
+/mob/proc/AdjustDrunk()
+ return
+
+
+/mob/proc/Druggy()
+ return
+
+/mob/proc/SetDruggy()
+ return
+
+/mob/proc/AdjustDruggy()
+ return
+
+
+/mob/proc/EarDamage()
+ return
+
+/mob/proc/SetEarDamage()
+ return
+
+/mob/proc/AdjustEarDamage()
+ return
+
+
+/mob/proc/EarDeaf()
+ return
+
+/mob/proc/SetEarDeaf()
+ return
+
+/mob/proc/AdjustEarDeaf()
+ return
+
+
+/mob/proc/EyeBlind()
+ return
+
+/mob/proc/SetEyeBlind()
+ return
+
+/mob/proc/AdjustEyeBlind()
+ return
+
+
+/mob/proc/EyeBlurry()
+ return
+
+/mob/proc/SetEyeBlurry()
+ return
+
+/mob/proc/AdjustEyeBlurry()
+ return
+
+
+/mob/proc/Hallucinate()
+ return
+
+/mob/proc/SetHallucinate()
+ return
+
+/mob/proc/AdjustHallucinate()
+ return
+
+
+/mob/proc/Jitter()
+ return
+
+/mob/proc/SetJitter()
+ return
+
+/mob/proc/AdjustJitter()
+ return
+
+
+/mob/proc/LoseBreath()
+ return
+
+/mob/proc/SetLoseBreath()
+ return
+
+/mob/proc/AdjustLoseBreath()
+ return
+
+
+/mob/proc/Paralyse()
+ return
+
+/mob/proc/SetParalysis()
+ return
+
+/mob/proc/AdjustParalysis()
+ return
+
+
+/mob/proc/Silence()
+ return
+
+/mob/proc/SetSilence()
+ return
+
+/mob/proc/AdjustSilence()
+ return
+
+
+/mob/proc/Sleeping()
+ return
+
+/mob/proc/SetSleeping()
+ return
+
+/mob/proc/AdjustSleeping()
+ return
+
+
+/mob/proc/Slowed()
+ return
+
+/mob/proc/SetSlowed()
+ return
+
+/mob/proc/AdjustSlowed()
+ return
+
+
+/mob/proc/Slur()
+ return
+
+/mob/proc/SetSlur()
+ return
+
+/mob/proc/AdjustSlur()
+ return
+
+
+/mob/proc/Stun()
+ return
+
+/mob/proc/SetStunned()
+ return
+
+/mob/proc/AdjustStunned()
+ return
+
+
+/mob/proc/Stuttering()
+ return
+
+/mob/proc/SetStuttering()
+ return
+
+/mob/proc/AdjustStuttering()
+ return
+
+
+/mob/proc/Weaken()
+ return
+
+/mob/proc/SetWeakened()
+ return
+
+/mob/proc/AdjustWeakened()
+ return
diff --git a/code/modules/mob/update_status.dm b/code/modules/mob/update_status.dm
new file mode 100644
index 00000000000..b9245fc1b6e
--- /dev/null
+++ b/code/modules/mob/update_status.dm
@@ -0,0 +1,65 @@
+// These are procs that cause immediate updates to features of the mob - prefixed with `update_`
+// Procs that have a stacking effect depending on how many times they are called
+// do not belong in this file - those go in `life.dm` instead, with the prefix `handle_`
+
+// OVERLAY/SIGHT PROCS
+
+// These return 0 if they are not applying an overlay, and 1 if they are
+
+// Call this to immediately apply blindness effects, instead of
+// waiting for the next `Life` tick
+/mob/proc/update_blind_effects()
+ // No handling for this on the mob level
+ return 0
+
+/mob/proc/update_blurry_effects()
+ // No handling for this on the mob level
+ return 0
+
+/mob/proc/update_druggy_effects()
+ // No handling for this on the mob level
+ return 0
+
+/mob/proc/update_nearsighted_effects()
+ // No handling for this on the mob level
+ return 0
+
+/mob/proc/update_sleeping_effects()
+ // No handling for this on the mob level
+ return 0
+
+/mob/proc/update_tint_effects()
+ // No handling for this on the mob level
+ return 0
+
+// Procs that give information about the status of the mob
+
+/mob/proc/can_hear()
+ return 1
+
+/mob/proc/has_vision()
+ return 1
+
+/mob/proc/can_speak()
+ return 1
+
+/mob/proc/incapacitated(ignore_restraints, ignore_grab)
+ return 0
+
+/mob/proc/restrained(ignore_grab)
+ // All are created free
+ return 0
+
+// Procs that update other things about the mob
+
+// Does various animations - Jitter, Flying, Spinning
+/mob/proc/update_animations()
+ if(flying)
+ animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING)
+ animate(pixel_y = pixel_y - 5, time = 10, loop = 1, easing = SINE_EASING)
+
+/mob/proc/update_stat()
+ return
+
+/mob/proc/update_canmove()
+ return 1
diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm
index 113c9e2878b..e4e5dd1a33b 100644
--- a/code/modules/nano/interaction/base.dm
+++ b/code/modules/nano/interaction/base.dm
@@ -14,10 +14,10 @@
/mob/proc/shared_nano_interaction()
if(stat || !client)
return STATUS_CLOSE // no updates, close the interface
- else if(restrained() || lying || stunned || weakened)
+ else if(incapacitated())
return STATUS_UPDATE // update only (orange visibility)
return STATUS_INTERACTIVE
-
+
/mob/dead/observer/shared_nano_interaction()
if(check_rights(R_ADMIN, 0, src))
return STATUS_INTERACTIVE // Admins are more equal
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 8606dafbd31..21c14077886 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -7,8 +7,11 @@
var/list/valid_hairstyles = list()
var/list/valid_facial_hairstyles = list()
var/list/valid_head_accessories = list()
- var/list/valid_marking_styles = list()
+ var/list/valid_head_marking_styles = list()
+ var/list/valid_body_marking_styles = list()
+ var/list/valid_tail_marking_styles = list()
var/list/valid_body_accessories = list()
+ var/list/valid_alt_head_styles = list()
var/check_whitelist
var/list/whitelist
@@ -48,7 +51,7 @@
else if(owner.species.bodyflags & HAS_ICON_SKIN_TONE)
var/const/MAX_LINE_ENTRIES = 4
var/prompt = "Choose your character's skin tone: 1-[owner.species.icon_skin_tones.len]\n("
- for(var/i = 1; i <= owner.species.icon_skin_tones.len; i++)
+ for(var/i = 1 to owner.species.icon_skin_tones.len)
if(i > MAX_LINE_ENTRIES && !((i - 1) % MAX_LINE_ENTRIES))
prompt += "\n"
prompt += "[i] = [owner.species.icon_skin_tones[i]]"
@@ -66,9 +69,9 @@
if(can_change_skin_color())
var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", rgb(owner.r_skin, owner.g_skin, owner.b_skin)) as color|null
if(new_skin && can_still_topic(state))
- var/r_skin = hex2num(copytext(new_skin, 2, 4))
- var/g_skin = hex2num(copytext(new_skin, 4, 6))
- var/b_skin = hex2num(copytext(new_skin, 6, 8))
+ var/r_skin = color2R(new_skin)
+ var/g_skin = color2G(new_skin)
+ var/b_skin = color2B(new_skin)
if(owner.change_skin_color(r_skin, g_skin, b_skin))
update_dna()
return 1
@@ -81,12 +84,22 @@
if(can_change(APPEARANCE_HAIR_COLOR))
var/new_hair = input("Please select hair color.", "Hair Color", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as color|null
if(new_hair && can_still_topic(state))
- var/r_hair = hex2num(copytext(new_hair, 2, 4))
- var/g_hair = hex2num(copytext(new_hair, 4, 6))
- var/b_hair = hex2num(copytext(new_hair, 6, 8))
+ var/r_hair = color2R(new_hair)
+ var/g_hair = color2G(new_hair)
+ var/b_hair = color2B(new_hair)
if(owner.change_hair_color(r_hair, g_hair, b_hair))
update_dna()
return 1
+ if(href_list["secondary_hair_color"])
+ if(can_change(APPEARANCE_SECONDARY_HAIR_COLOR))
+ var/new_hair = input("Please select secondary hair color.", "Secondary Hair Color", rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec)) as color|null
+ if(new_hair && can_still_topic(state))
+ var/r_hair_sec = color2R(new_hair)
+ var/g_hair_sec = color2G(new_hair)
+ var/b_hair_sec = color2B(new_hair)
+ if(owner.change_hair_color(r_hair_sec, g_hair_sec, b_hair_sec, 1))
+ update_dna()
+ return 1
if(href_list["facial_hair"])
if(can_change(APPEARANCE_FACIAL_HAIR) && (href_list["facial_hair"] in valid_facial_hairstyles))
if(owner.change_facial_hair(href_list["facial_hair"]))
@@ -96,12 +109,22 @@
if(can_change(APPEARANCE_FACIAL_HAIR_COLOR))
var/new_facial = input("Please select facial hair color.", "Facial Hair Color", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as color|null
if(new_facial && can_still_topic(state))
- var/r_facial = hex2num(copytext(new_facial, 2, 4))
- var/g_facial = hex2num(copytext(new_facial, 4, 6))
- var/b_facial = hex2num(copytext(new_facial, 6, 8))
+ var/r_facial = color2R(new_facial)
+ var/g_facial = color2G(new_facial)
+ var/b_facial = color2B(new_facial)
if(owner.change_facial_hair_color(r_facial, g_facial, b_facial))
update_dna()
return 1
+ if(href_list["secondary_facial_hair_color"])
+ if(can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR))
+ var/new_facial = input("Please select secondary facial hair color.", "Secondary Facial Hair Color", rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec)) as color|null
+ if(new_facial && can_still_topic(state))
+ var/r_facial_sec = color2R(new_facial)
+ var/g_facial_sec = color2G(new_facial)
+ var/b_facial_sec = color2B(new_facial)
+ if(owner.change_facial_hair_color(r_facial_sec, g_facial_sec, b_facial_sec, 1))
+ update_dna()
+ return 1
if(href_list["eye_color"])
if(can_change(APPEARANCE_EYE_COLOR))
var/obj/item/organ/internal/eyes/eyes_organ = owner.get_int_organ(/obj/item/organ/internal/eyes)
@@ -114,9 +137,9 @@
eyes_blue = eyes_organ.eye_colour[3]
var/new_eyes = input("Please select eye color.", "Eye Color", rgb(eyes_red, eyes_green, eyes_blue)) as color|null
if(new_eyes && can_still_topic(state))
- var/r_eyes = hex2num(copytext(new_eyes, 2, 4))
- var/g_eyes = hex2num(copytext(new_eyes, 4, 6))
- var/b_eyes = hex2num(copytext(new_eyes, 6, 8))
+ var/r_eyes = color2R(new_eyes)
+ var/g_eyes = color2G(new_eyes)
+ var/b_eyes = color2B(new_eyes)
if(owner.change_eye_color(r_eyes, g_eyes, b_eyes))
update_dna()
return 1
@@ -129,31 +152,60 @@
if(can_change_head_accessory())
var/new_head_accessory = input("Please select head accessory color.", "Head Accessory Color", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as color|null
if(new_head_accessory && can_still_topic(state))
- var/r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
- var/g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
- var/b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
+ var/r_headacc = color2R(new_head_accessory)
+ var/g_headacc = color2G(new_head_accessory)
+ var/b_headacc = color2B(new_head_accessory)
if(owner.change_head_accessory_color(r_headacc, g_headacc, b_headacc))
update_dna()
return 1
- if(href_list["marking"])
- if(can_change_markings() && (href_list["marking"] in valid_marking_styles))
- if(owner.change_markings(href_list["marking"]))
+ if(href_list["head_marking"])
+ if(can_change_markings("head") && (href_list["head_marking"] in valid_head_marking_styles))
+ if(owner.change_markings(href_list["head_marking"], "head"))
update_dna()
return 1
- if(href_list["marking_color"])
- if(can_change_markings())
- var/new_markings = input("Please select marking color.", "Marking Color", rgb(owner.r_markings, owner.g_markings, owner.b_markings)) as color|null
+ if(href_list["head_marking_color"])
+ if(can_change_markings("head"))
+ var/new_markings = input("Please select head marking color.", "Marking Color", owner.m_colours["head"]) as color|null
if(new_markings && can_still_topic(state))
- var/r_markings = hex2num(copytext(new_markings, 2, 4))
- var/g_markings = hex2num(copytext(new_markings, 4, 6))
- var/b_markings = hex2num(copytext(new_markings, 6, 8))
- if(owner.change_marking_color(r_markings, g_markings, b_markings))
+ if(owner.change_marking_color(new_markings, "head"))
+ update_dna()
+ return 1
+ if(href_list["body_marking"])
+ if(can_change_markings("body") && (href_list["body_marking"] in valid_body_marking_styles))
+ if(owner.change_markings(href_list["body_marking"], "body"))
+ update_dna()
+ return 1
+ if(href_list["body_marking_color"])
+ if(can_change_markings("body"))
+ var/new_markings = input("Please select body marking color.", "Marking Color", owner.m_colours["body"]) as color|null
+ if(new_markings && can_still_topic(state))
+ if(owner.change_marking_color(new_markings, "body"))
+ update_dna()
+ return 1
+ if(href_list["tail_marking"])
+ if(can_change_markings("tail") && (href_list["tail_marking"] in valid_tail_marking_styles))
+ if(owner.change_markings(href_list["tail_marking"], "tail"))
+ update_dna()
+ return 1
+ if(href_list["tail_marking_color"])
+ if(can_change_markings("tail"))
+ var/new_markings = input("Please select tail marking color.", "Marking Color", owner.m_colours["tail"]) as color|null
+ if(new_markings && can_still_topic(state))
+ if(owner.change_marking_color(new_markings, "tail"))
update_dna()
return 1
if(href_list["body_accessory"])
if(can_change_body_accessory() && (href_list["body_accessory"] in valid_body_accessories))
if(owner.change_body_accessory(href_list["body_accessory"]))
update_dna()
+ cut_and_generate_data()
+ return 1
+ if(href_list["alt_head"])
+ if(can_change_alt_head() && (href_list["alt_head"] in valid_alt_head_styles))
+ if(owner.change_alt_head(href_list["alt_head"]))
+ update_dna()
+ head_organ = owner.get_organ("head") //Update the head with the new information.
+ cut_and_generate_data()
return 1
return 0
@@ -199,13 +251,32 @@
data["facial_hair_styles"] = facial_hair_styles
data["facial_hair_style"] = (head_organ ? head_organ.f_style : "Shaved")
- data["change_markings"] = can_change_markings()
- if(data["change_markings"])
- var/marking_styles[0]
- for(var/marking_style in valid_marking_styles)
- marking_styles[++marking_styles.len] = list("markingstyle" = marking_style)
- data["marking_styles"] = marking_styles
- data["marking_style"] = owner.m_style
+ data["change_head_markings"] = can_change_markings("head")
+ if(data["change_head_markings"])
+ var/m_style = owner.m_styles["head"]
+ var/head_marking_styles[0]
+ for(var/head_marking_style in valid_head_marking_styles)
+ head_marking_styles[++head_marking_styles.len] = list("headmarkingstyle" = head_marking_style)
+ data["head_marking_styles"] = head_marking_styles
+ data["head_marking_style"] = m_style
+
+ data["change_body_markings"] = can_change_markings("body")
+ if(data["change_body_markings"])
+ var/m_style = owner.m_styles["body"]
+ var/body_marking_styles[0]
+ for(var/body_marking_style in valid_body_marking_styles)
+ body_marking_styles[++body_marking_styles.len] = list("bodymarkingstyle" = body_marking_style)
+ data["body_marking_styles"] = body_marking_styles
+ data["body_marking_style"] = m_style
+
+ data["change_tail_markings"] = can_change_markings("tail")
+ if(data["change_tail_markings"])
+ var/m_style = owner.m_styles["tail"]
+ var/tail_marking_styles[0]
+ for(var/tail_marking_style in valid_tail_marking_styles)
+ tail_marking_styles[++tail_marking_styles.len] = list("tailmarkingstyle" = tail_marking_style)
+ data["tail_marking_styles"] = tail_marking_styles
+ data["tail_marking_style"] = m_style
data["change_body_accessory"] = can_change_body_accessory()
if(data["change_body_accessory"])
@@ -213,15 +284,24 @@
for(var/body_accessory_style in valid_body_accessories)
body_accessory_styles[++body_accessory_styles.len] = list("bodyaccessorystyle" = body_accessory_style)
data["body_accessory_styles"] = body_accessory_styles
- var/datum/body_accessory/BA
- if(owner.body_accessory)
- BA = owner.body_accessory.name
- data["body_accessory_style"] = BA
+ data["body_accessory_style"] = (owner.body_accessory ? owner.body_accessory.name : "None")
+
+ data["change_alt_head"] = can_change_alt_head()
+ if(data["change_alt_head"])
+ var/alt_head_styles[0]
+ for(var/alt_head_style in valid_alt_head_styles)
+ alt_head_styles[++alt_head_styles.len] = list("altheadstyle" = alt_head_style)
+ data["alt_head_styles"] = alt_head_styles
+ data["alt_head_style"] = head_organ.alt_head
data["change_head_accessory_color"] = can_change_head_accessory()
data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR)
+ data["change_secondary_hair_color"] = can_change(APPEARANCE_SECONDARY_HAIR_COLOR)
data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR)
- data["change_marking_color"] = can_change_markings()
+ data["change_secondary_facial_hair_color"] = can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR)
+ data["change_head_marking_color"] = can_change_markings("head")
+ data["change_body_marking_color"] = can_change_markings("body")
+ data["change_tail_marking_color"] = can_change_markings("tail")
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src]", 800, 450, state = state)
@@ -248,19 +328,41 @@
return 0
return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
-/datum/nano_module/appearance_changer/proc/can_change_markings()
- return owner && (flags & APPEARANCE_MARKINGS) && (owner.species.bodyflags & HAS_MARKINGS)
+/datum/nano_module/appearance_changer/proc/can_change_markings(var/location = "body")
+ var/marking_flag = HAS_BODY_MARKINGS
+ var/body_flags = owner.species.bodyflags
+ if(location == "head")
+ if(!head_organ)
+ log_debug("Missing head!")
+ return 0
+ body_flags = head_organ.species.bodyflags
+ marking_flag = HAS_HEAD_MARKINGS
+ if(location == "body")
+ marking_flag = HAS_BODY_MARKINGS
+ if(location == "tail")
+ marking_flag = HAS_TAIL_MARKINGS
+
+ return owner && (flags & APPEARANCE_MARKINGS) && (body_flags & marking_flag)
/datum/nano_module/appearance_changer/proc/can_change_body_accessory()
return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.species.bodyflags & HAS_TAIL)
+/datum/nano_module/appearance_changer/proc/can_change_alt_head()
+ if(!head_organ)
+ log_debug("Missing head!")
+ return 0
+ return owner && (flags & APPEARANCE_ALT_HEAD) && (head_organ.species.bodyflags & HAS_ALT_HEADS)
+
/datum/nano_module/appearance_changer/proc/cut_and_generate_data()
// Making the assumption that the available species remain constant
valid_hairstyles.Cut()
valid_facial_hairstyles.Cut()
valid_head_accessories.Cut()
- valid_marking_styles.Cut()
+ valid_head_marking_styles.Cut()
+ valid_body_marking_styles.Cut()
+ valid_tail_marking_styles.Cut()
valid_body_accessories.Cut()
+ valid_alt_head_styles.Cut()
generate_data()
/datum/nano_module/appearance_changer/proc/generate_data()
@@ -273,7 +375,13 @@
valid_facial_hairstyles = owner.generate_valid_facial_hairstyles()
if(!valid_head_accessories.len)
valid_head_accessories = owner.generate_valid_head_accessories()
- if(!valid_marking_styles.len)
- valid_marking_styles = owner.generate_valid_markings()
+ if(!valid_head_marking_styles.len)
+ valid_head_marking_styles = owner.generate_valid_markings("head")
+ if(!valid_body_marking_styles.len)
+ valid_body_marking_styles = owner.generate_valid_markings("body")
+ if(!valid_tail_marking_styles.len)
+ valid_tail_marking_styles = owner.generate_valid_markings("tail")
if(!valid_body_accessories.len)
valid_body_accessories = owner.generate_valid_body_accessories()
+ if(!valid_alt_head_styles.len)
+ valid_alt_head_styles = owner.generate_valid_alt_heads()
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index f0af50d8d9e..9de96b73129 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -8,6 +8,7 @@
gender = PLURAL
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "paper"
+ item_state = "paper"
throwforce = 0
w_class = 1
throw_range = 1
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index f86b17eaab7..0ff6289ea66 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -1,211 +1,241 @@
-
/obj/machinery/power/generator
name = "thermoelectric generator"
desc = "It's a high efficiency thermoelectric generator."
icon_state = "teg"
- density = 1
anchored = 0
+ density = 1
+ use_power = 0
- use_power = 1
- idle_power_usage = 100 //Watts, I hope. Just enough to do the computer and display things.
-
- var/obj/machinery/atmospherics/binary/circulator/circ1
- var/obj/machinery/atmospherics/binary/circulator/circ2
+ var/obj/machinery/atmospherics/binary/circulator/cold_circ
+ var/obj/machinery/atmospherics/binary/circulator/hot_circ
+ var/cold_dir = WEST
+ var/hot_dir = EAST
+
var/lastgen = 0
var/lastgenlev = -1
-
- var/image/overlay_image
-
- var/power_multiplier = 1 // This is so admins can tweak how good it is to find a good balance for effort -> power
- var/powercap = 500000 //Not a hard cap, but outputs above this have a 10% chance to cause the TeG to lose half it's power.
-
+ var/lastcirc = "00"
+
/obj/machinery/power/generator/New()
..()
+ update_desc()
+
+/obj/machinery/power/generator/proc/update_desc()
+ desc = initial(desc) + " Its cold circulator is located on the [dir2text(cold_dir)] side, and its heat circulator is located on the [dir2text(hot_dir)] side."
+
+/obj/machinery/power/generator/Destroy()
+ disconnect()
+ return ..()
+
+/obj/machinery/power/generator/proc/disconnect()
+ if(cold_circ)
+ cold_circ.generator = null
+ if(hot_circ)
+ hot_circ.generator = null
+ if(powernet)
+ disconnect_from_network()
- spawn(1)
- reconnect()
+/obj/machinery/power/generator/initialize()
+ ..()
+ connect()
+
+/obj/machinery/power/generator/proc/connect()
+ connect_to_network()
+
+ var/obj/machinery/atmospherics/binary/circulator/circpath = /obj/machinery/atmospherics/binary/circulator
+ cold_circ = locate(circpath) in get_step(src, cold_dir)
+ hot_circ = locate(circpath) in get_step(src, hot_dir)
-//generators connect in dir and reverse_dir(dir) directions
-//mnemonic to determine circulator/generator directions: the cirulators orbit clockwise around the generator
-//so a circulator to the NORTH of the generator connects first to the EAST, then to the WEST
-//and a circulator to the WEST of the generator connects first to the NORTH, then to the SOUTH
-//note that the circulator's outlet dir is it's always facing dir, and it's inlet is always the reverse
-/obj/machinery/power/generator/proc/reconnect()
- circ1 = null
- circ2 = null
- if(src.loc && anchored)
- if(src.dir & (EAST|WEST))
- circ1 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,EAST)
- circ2 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,WEST)
+ if(cold_circ && cold_circ.side == cold_dir)
+ cold_circ.generator = src
+ cold_circ.update_icon()
+ else
+ cold_circ = null
- if(circ1 && circ2)
- if(circ1.dir != SOUTH || circ2.dir != NORTH)
- circ1 = null
- circ2 = null
+ if(hot_circ && hot_circ.side == hot_dir)
+ hot_circ.generator = src
+ hot_circ.update_icon()
+ else
+ hot_circ = null
- else if(src.dir & (NORTH|SOUTH))
- circ1 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,NORTH)
- circ2 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,SOUTH)
-
- if(circ1 && circ2 && (circ1.dir != EAST || circ2.dir != WEST))
- circ1 = null
- circ2 = null
-
-/obj/machinery/power/generator/proc/updateicon()
- if(isnull(src.overlay_image))
- src.overlay_image = image('icons/obj/power.dmi')
-
- overlays.Cut()
- if(!(stat & (NOPOWER|BROKEN)))
+ power_change()
+ update_icon()
+ updateDialog()
+
+/obj/machinery/power/generator/power_change()
+ if(!anchored)
+ stat |= NOPOWER
+ else
+ ..()
+
+/obj/machinery/power/generator/update_icon()
+ if(stat & (NOPOWER|BROKEN))
+ overlays.Cut()
+ else
+ overlays.Cut()
if(lastgenlev != 0)
- src.overlay_image.icon_state = "teg-op[lastgenlev]"
- overlays += src.overlay_image
+ overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]")
-/obj/machinery/power/generator/process()
- if(!circ1 || !circ2 || !anchored || stat & (BROKEN|NOPOWER))
+ overlays += image('icons/obj/power.dmi', "teg-oc[lastcirc]")
+
+/obj/machinery/power/generator/process()
+ if(stat & (NOPOWER|BROKEN))
return
+ if(!cold_circ || !hot_circ)
+ return
+
+ lastgen = 0
+
+ if(powernet)
+
+ //log_debug("cold_circ and hot_circ pass")
+
+ var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air()
+ var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air()
+
+ //log_debug("hot_air = [hot_air]; cold_air = [cold_air];")
+
+ if(cold_air && hot_air)
+
+ //log_debug("hot_air = [hot_air] temperature = [hot_air.temperature]; cold_air = [cold_air] temperature = [hot_air.temperature];")
+
+ //log_debug("coldair and hotair pass")
+ var/cold_air_heat_capacity = cold_air.heat_capacity()
+ var/hot_air_heat_capacity = hot_air.heat_capacity()
+
+ var/delta_temperature = hot_air.temperature - cold_air.temperature
+
+ //log_debug("delta_temperature = [delta_temperature]; cold_air_heat_capacity = [cold_air_heat_capacity]; hot_air_heat_capacity = [hot_air_heat_capacity]")
+
+ if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
+ var/efficiency = 0.65
+
+ var/energy_transfer = delta_temperature * hot_air_heat_capacity * cold_air_heat_capacity / (hot_air_heat_capacity + cold_air_heat_capacity)
+
+ var/heat = energy_transfer * (1 - efficiency)
+ lastgen = energy_transfer * efficiency
+
+ //log_debug("lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];")
+
+ hot_air.temperature = hot_air.temperature - energy_transfer / hot_air_heat_capacity
+ cold_air.temperature = cold_air.temperature + heat / cold_air_heat_capacity
+
+ //log_debug("POWER: [lastgen] W generated at [efficiency * 100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]")
+
+ add_avail(lastgen)
+ // update icon overlays only if displayed level has changed
+
+ if(hot_air)
+ var/datum/gas_mixture/hot_circ_air1 = hot_circ.air1
+ hot_circ_air1.merge(hot_air)
+
+ if(cold_air)
+ var/datum/gas_mixture/cold_circ_air1 = cold_circ.air1
+ cold_circ_air1.merge(cold_air)
+
+ var/genlev = max(0, min( round(11 * lastgen / 100000), 11))
+ var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]"
+ if((genlev != lastgenlev) || (circ != lastcirc))
+ lastgenlev = genlev
+ lastcirc = circ
+ update_icon()
+
updateDialog()
- var/datum/gas_mixture/air1 = circ1.return_transfer_air()
- var/datum/gas_mixture/air2 = circ2.return_transfer_air()
- lastgen = 0
-
- if(air1 && air2)
- var/air1_heat_capacity = air1.heat_capacity()
- var/air2_heat_capacity = air2.heat_capacity()
- var/delta_temperature = abs(air2.temperature - air1.temperature)
-
- if(delta_temperature > 0 && air1_heat_capacity > 0 && air2_heat_capacity > 0)
- var/efficiency = 0.65
- var/energy_transfer = delta_temperature*air2_heat_capacity*air1_heat_capacity/(air2_heat_capacity+air1_heat_capacity)
- var/heat = energy_transfer*(1-efficiency)
- lastgen = energy_transfer*efficiency*0.05*power_multiplier
-
- if(air2.temperature > air1.temperature)
- air2.temperature = air2.temperature - energy_transfer/air2_heat_capacity
- air1.temperature = air1.temperature + heat/air1_heat_capacity
- else
- air2.temperature = air2.temperature + heat/air2_heat_capacity
- air1.temperature = air1.temperature - energy_transfer/air1_heat_capacity
-
- //Transfer the air
- if(air1)
- circ1.air2.merge(air1)
- if(air2)
- circ2.air2.merge(air2)
-
- //Update the gas networks
- if(circ1.parent2)
- circ1.parent2.update = 1
- if(circ2.parent2)
- circ2.parent2.update = 1
-
- // update icon overlays and power usage only if displayed level has changed
- if(lastgen > powercap && prob(10))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- lastgen *= 0.5
- var/genlev = max(0, min( round(11*lastgen / powercap), 11))
- if(lastgen > 100 && genlev == 0)
- genlev = 1
- if(genlev != lastgenlev)
- lastgenlev = genlev
- updateicon()
- add_avail(lastgen)
-
/obj/machinery/power/generator/attack_ai(mob/user)
- if(stat & (BROKEN|NOPOWER)) return
+ return attack_hand(user)
+
+/obj/machinery/power/generator/attack_ghost(mob/user)
+ if(stat & (NOPOWER|BROKEN))
+ return
+ interact(user)
+
+/obj/machinery/power/generator/attack_hand(mob/user)
+ if(..())
+ user << browse(null, "window=teg")
+ return
interact(user)
/obj/machinery/power/generator/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
anchored = !anchored
- to_chat(user, "\blue You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.")
- use_power = anchored
- reconnect()
+ if(!anchored)
+ disconnect()
+ power_change()
+ else
+ connect()
+ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ to_chat(user, "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.")
+ else if(istype(W, /obj/item/device/multitool))
+ if(cold_dir == WEST)
+ cold_dir = EAST
+ hot_dir = WEST
+ else
+ cold_dir = WEST
+ hot_dir = EAST
+ connect()
+ to_chat(user, "You reverse the generator's circulator settings. The cold circulator is now on the [dir2text(cold_dir)] side, and the heat circulator is now on the [dir2text(hot_dir)] side.")
+ update_desc()
else
- ..()
+ ..()
+
+/obj/machinery/power/generator/proc/get_menu(include_link = 1)
+ var/t = ""
+ if(!powernet)
+ t += "Unable to connect to the power network!"
+ t += " Retry"
+ else if(cold_circ && hot_circ)
+ var/datum/gas_mixture/cold_circ_air1 = cold_circ.air1
+ var/datum/gas_mixture/cold_circ_air2 = cold_circ.air2
+ var/datum/gas_mixture/hot_circ_air1 = hot_circ.air1
+ var/datum/gas_mixture/hot_circ_air2 = hot_circ.air2
-/obj/machinery/power/generator/attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER) || !anchored) return
- interact(user)
+ t += ""
+ t += "Output: [round(lastgen)] W"
+
+ t += " "
+
+ t += "Cold loop "
+ t += "Temperature Inlet: [round(cold_circ_air2.temperature, 0.1)] K / Outlet: [round(cold_circ_air1.temperature, 0.1)] K "
+ t += "Pressure Inlet: [round(cold_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.return_pressure(), 0.1)] kPa "
+
+ t += "Hot loop "
+ t += "Temperature Inlet: [round(hot_circ_air2.temperature, 0.1)] K / Outlet: [round(hot_circ_air1.temperature, 0.1)] K "
+ t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa "
+
+ t += " "
+ else
+ t += "Unable to locate all parts!"
+ t += " Retry"
+ if(include_link)
+ t += " Close"
+
+ return t
/obj/machinery/power/generator/interact(mob/user)
- if( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
- user.unset_machine()
- user << browse(null, "window=teg")
- return
-
user.set_machine(src)
- var/t = "Thermo-Electric Generator "
-
- if(circ1 && circ2)
- t += "Output : [round(lastgen)] W
"
-
- t += "Primary Circulator (top or right) "
- t += "Inlet Pressure: [round(circ1.air1.return_pressure(), 0.1)] kPa "
- t += "Inlet Temperature: [round(circ1.air1.temperature, 0.1)] K "
- t += "Outlet Pressure: [round(circ1.air2.return_pressure(), 0.1)] kPa "
- t += "Outlet Temperature: [round(circ1.air2.temperature, 0.1)] K "
-
- t += "Secondary Circulator (bottom or left) "
- t += "Inlet Pressure: [round(circ2.air1.return_pressure(), 0.1)] kPa "
- t += "Inlet Temperature: [round(circ2.air1.temperature, 0.1)] K "
- t += "Outlet Pressure: [round(circ2.air2.return_pressure(), 0.1)] kPa "
- t += "Outlet Temperature: [round(circ2.air2.temperature, 0.1)] K "
-
- else
- t += "Unable to connect to circulators. "
- t += "Ensure both are in position and wrenched into place."
-
- t += " "
- t += " "
- t += "Refresh Close"
-
- user << browse(t, "window=teg;size=460x300")
- onclose(user, "teg")
+ var/datum/browser/popup = new(user, "teg", "Thermo-Electric Generator", 460, 300)
+ popup.set_content(get_menu())
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
return 1
-
/obj/machinery/power/generator/Topic(href, href_list)
- ..()
+ if(..())
+ return 0
if( href_list["close"] )
usr << browse(null, "window=teg")
usr.unset_machine()
return 0
-
- updateDialog()
+ if( href_list["check"] )
+ if(!powernet || !cold_circ || !hot_circ)
+ connect()
return 1
-
/obj/machinery/power/generator/power_change()
..()
- updateicon()
-
-
-/obj/machinery/power/generator/verb/rotate_clock()
- set category = "Object"
- set name = "Rotate Generator (Clockwise)"
- set src in view(1)
-
- if(usr.stat || usr.restrained() || anchored)
- return
-
- src.dir = turn(src.dir, 90)
-
-/obj/machinery/power/generator/verb/rotate_anticlock()
- set category = "Object"
- set name = "Rotate Generator (Counterclockwise)"
- set src in view(1)
-
- if(usr.stat || usr.restrained() || anchored)
- return
-
- src.dir = turn(src.dir, -90)
\ No newline at end of file
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm
deleted file mode 100644
index d1ff1f1079c..00000000000
--- a/code/modules/power/generator_type2.dm
+++ /dev/null
@@ -1,143 +0,0 @@
-/obj/machinery/power/generator_type2
- name = "thermoelectric generator"
- desc = "It's a high efficiency thermoelectric generator."
- icon_state = "teg"
- anchored = 1
- density = 1
- use_power = 0
-
- var/obj/machinery/atmospherics/unary/generator_input/input1
- var/obj/machinery/atmospherics/unary/generator_input/input2
-
- var/lastgen = 0
- var/lastgenlev = -1
-
- var/image/overlay_image
-
-/obj/machinery/power/generator_type2/New()
- ..()
- spawn(5)
- input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, 90))
- input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, -90))
- if(!input1 || !input2)
- stat |= BROKEN
- updateicon()
-
-
-/obj/machinery/power/generator_type2/proc/updateicon()
-
- if(isnull(src.overlay_image))
- src.overlay_image = image('icons/obj/power.dmi')
-
- overlays.Cut()
- if(!(stat & (NOPOWER|BROKEN)))
-
- if(lastgenlev != 0)
- src.overlay_image.icon_state = "teg-op[lastgenlev]"
- overlays += src.overlay_image
-
-#define GENRATE 800 // generator output coefficient from Q
-
-
-/obj/machinery/power/generator_type2/process()
- if(!input1 || !input2)
- return
-
- var/datum/gas_mixture/air1 = input1.return_exchange_air()
- var/datum/gas_mixture/air2 = input2.return_exchange_air()
-
-
- lastgen = 0
-
- if(air1 && air2)
- var/datum/gas_mixture/hot_air = air1
- var/datum/gas_mixture/cold_air = air2
- if(hot_air.temperature < cold_air.temperature)
- hot_air = air2
- cold_air = air1
-
- var/hot_air_heat_capacity = hot_air.heat_capacity()
- var/cold_air_heat_capacity = cold_air.heat_capacity()
-
- var/delta_temperature = hot_air.temperature - cold_air.temperature
-
- if(delta_temperature > 1 && cold_air_heat_capacity > 0.01 && hot_air_heat_capacity > 0.01)
- var/efficiency = (1 - cold_air.temperature/hot_air.temperature)*0.65 //65% of Carnot efficiency
-
- var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
-
- var/heat = energy_transfer*(1-efficiency)
- lastgen = energy_transfer*efficiency
-
- hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
- cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
-
-// to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]")
-
- input1.parent.update = 1
- input2.parent.update = 1
-
- add_avail(lastgen)
- // update icon overlays only if displayed level has changed
-
- var/genlev = max(0, min( round(11*lastgen / 100000), 11))
- if(genlev != lastgenlev)
- lastgenlev = genlev
- updateicon()
-
- src.updateDialog()
-
-
-/obj/machinery/power/generator_type2/attack_ai(mob/user)
- if(stat & (BROKEN|NOPOWER)) return
- interact(user)
-
-
-/obj/machinery/power/generator_type2/attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER)) return
- interact(user)
-
-
-/obj/machinery/power/generator_type2/interact(mob/user)
- if( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
- user.unset_machine()
- user << browse(null, "window=teg")
- return
-
- user.set_machine(src)
-
- var/t = "Thermo-Electric Generator "
-
- t += "Output : [round(lastgen)] W
"
-
- t += "Cold loop "
- t += "Temperature: [round(input1.air_contents.temperature, 0.1)] K "
- t += "Pressure: [round(input1.air_contents.return_pressure(), 0.1)] kPa "
-
- t += "Hot loop "
- t += "Temperature: [round(input2.air_contents.temperature, 0.1)] K "
- t += "Pressure: [round(input2.air_contents.return_pressure(), 0.1)] kPa "
-
- t += "
Close"
-
- t += " "
- user << browse(t, "window=teg;size=460x300")
- onclose(user, "teg")
- return 1
-
-
-/obj/machinery/power/generator_type2/Topic(href, href_list)
- ..()
-
- if( href_list["close"] )
- usr << browse(null, "window=teg")
- usr.unset_machine()
- return 0
-
- return 1
-
-
-/obj/machinery/power/generator_type2/power_change()
- ..()
- updateicon()
\ No newline at end of file
diff --git a/code/modules/power/singularity/particle_accelerator/particle_chamber.dm b/code/modules/power/singularity/particle_accelerator/particle_chamber.dm
index 8d8e23e9964..411c039d480 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_chamber.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_chamber.dm
@@ -1,6 +1,6 @@
/obj/structure/particle_accelerator/fuel_chamber
name = "EM Acceleration Chamber"
- desc_holder = "This is where the Alpha particles are accelerated to radical speeds."
+ desc_holder = "This part is where the Alpha particles are accelerated to radical speeds."
icon = 'icons/obj/machines/particle_accelerator.dmi'
icon_state = "fuel_chamber"
reference = "fuel_chamber"
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index ed4d300d7ab..ed2fb257015 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -2,7 +2,7 @@
/obj/machinery/particle_accelerator/control_box
name = "Particle Accelerator Control Console"
- desc = "This controls the density of the particles."
+ desc = "This part controls the density of the particles."
icon = 'icons/obj/machines/particle_accelerator.dmi'
icon_state = "control_box"
reference = "control_box"
diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
index 8e260a1115d..cbfd212e873 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
@@ -2,7 +2,7 @@
/obj/structure/particle_accelerator/particle_emitter
name = "EM Containment Grid"
- desc_holder = "This launchs the Alpha particles, might not want to stand near this end."
+ desc_holder = "This part launches the Alpha particles. You might not want to stand near this end."
icon = 'icons/obj/machines/particle_accelerator.dmi'
icon_state = "none"
var/fire_delay = 50
@@ -26,16 +26,16 @@
/obj/structure/particle_accelerator/particle_emitter/proc/set_delay(var/delay)
if(delay && delay >= 0)
- src.fire_delay = delay
+ fire_delay = delay
return 1
return 0
/obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(var/strength = 0)
- if((src.last_shot + src.fire_delay) <= world.time)
- src.last_shot = world.time
+ if((last_shot + fire_delay) <= world.time)
+ last_shot = world.time
var/obj/effect/accelerated_particle/A = null
- var/turf/T = get_step(src,dir)
+ var/turf/T = get_step(src, dir)
switch(strength)
if(0)
A = new/obj/effect/accelerated_particle/weak(T, dir)
@@ -46,6 +46,6 @@
if(3)
A = new/obj/effect/accelerated_particle/powerful(T, dir)
if(A)
- A.dir = src.dir
+ A.dir = dir
return 1
return 0
diff --git a/code/modules/power/singularity/particle_accelerator/particle_power.dm b/code/modules/power/singularity/particle_accelerator/particle_power.dm
index e6deff37ddf..dafd19917da 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_power.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_power.dm
@@ -1,6 +1,6 @@
/obj/structure/particle_accelerator/power_box
name = "Particle Focusing EM Lens"
- desc_holder = "This uses electromagnetic waves to focus the Alpha-Particles."
+ desc_holder = "This part uses electromagnetic waves to focus the Alpha particles."
icon = 'icons/obj/machines/particle_accelerator.dmi'
icon_state = "power_box"
reference = "power_box"
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 0f6d41fc145..420733f7c76 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -122,7 +122,7 @@
if(ishuman(mob))
//Hilariously enough, running into a closet should make you get hit the hardest.
var/mob/living/carbon/human/H = mob
- H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
+ H.AdjustHallucinate(max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)))))
var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
mob.apply_effect(rads, IRRADIATE)
@@ -189,7 +189,7 @@
var/obj/item/organ/internal/eyes/eyes = l.get_int_organ(/obj/item/organ/internal/eyes)
if(!istype(eyes))
continue
- l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) )
+ l.Hallucinate(min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)))))
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) )
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 6ede088c4ce..6cafcce56c3 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -334,7 +334,6 @@ obj/item/weapon/gun/proc/newshot()
/obj/item/weapon/gun/proc/rename_gun(mob/M)
var/input = stripped_input(M,"What do you want to name the gun?", ,"", MAX_NAME_LEN)
-
if(src && input && !M.stat && in_range(M,src) && !M.restrained() && M.canmove)
name = input
to_chat(M, "You name the gun [input]. Say hello to your new friend.")
diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm
index 0307755f3c7..b8f659eb09f 100644
--- a/code/modules/projectiles/guns/dartgun.dm
+++ b/code/modules/projectiles/guns/dartgun.dm
@@ -302,6 +302,4 @@
density = 0
/obj/effect/syringe_gun_dummy/New()
- var/datum/reagents/R = new/datum/reagents(15)
- reagents = R
- R.my_atom = src
+ create_reagents(15)
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 99a1660ba35..8d920a7e736 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -49,7 +49,7 @@
/obj/item/weapon/gun/energy/gun/hos
name = "\improper X-01 MultiPhase Energy Gun"
- desc = "This is a expensive, modern recreation of a antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
+ desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
icon_state = "hoslaser"
force = 10
ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler)
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index affc16de296..884b97c8ffb 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -34,10 +34,6 @@
update_icon()
chamber_round(0)
- if(unique_rename)
- if(istype(A, /obj/item/weapon/pen))
- rename_gun(user)
-
/obj/item/weapon/gun/projectile/revolver/attack_self(mob/living/user)
var/num_unloaded = 0
chambered = null
diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm
index 097f5fb4a58..d36ad1dd2c6 100644
--- a/code/modules/projectiles/guns/projectile/saw.dm
+++ b/code/modules/projectiles/guns/projectile/saw.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/gun/projectile/automatic/l6_saw
name = "\improper L6 SAW"
- desc = "A heavily modified 7.62 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the reciever below the designation."
+ desc = "A heavily modified 5.56 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the reciever below the designation."
icon_state = "l6closed100"
item_state = "l6closedmag"
w_class = 5
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 0ae9b10752e..9c3475d2141 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -23,18 +23,18 @@
/obj/item/projectile/bullet/weakbullet/booze/on_hit(atom/target, blocked = 0)
if(..(target, blocked))
var/mob/living/M = target
- M.dizziness += 20
- M.slurring += 20
- M.confused += 20
- M.eye_blurry += 20
- M.drowsyness += 20
- for(var/datum/reagent/ethanol/A in M.reagents.reagent_list)
+ M.AdjustDizzy(20)
+ M.AdjustSlur(20)
+ M.AdjustConfused(20)
+ M.AdjustEyeBlurry(20)
+ M.AdjustDrowsy(20)
+ for(var/datum/reagent/consumable/ethanol/A in M.reagents.reagent_list)
M.AdjustParalysis(2)
- M.dizziness += 10
- M.slurring += 10
- M.confused += 10
- M.eye_blurry += 10
- M.drowsyness += 10
+ M.AdjustDizzy(10)
+ M.AdjustSlur(10)
+ M.AdjustConfused(10)
+ M.AdjustEyeBlurry(10)
+ M.AdjustDrowsy(10)
A.volume += 5 //Because we can
/obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down
@@ -216,7 +216,7 @@
..(target, blocked)
if(iscarbon(target))
var/mob/living/carbon/M = target
- M.silent = max(M.silent, 10)
+ M.Silence(10)
else if(istype(target, /obj/mecha/combat/honker))
var/obj/mecha/chassis = target
chassis.occupant_message("A mimetech anti-honk bullet has hit \the [chassis]!")
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 0e1b7478cc8..bcc4335f66a 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -186,7 +186,7 @@
if(ishuman(target))
var/mob/living/carbon/human/M = target
M.adjustBrainLoss(20)
- M.hallucination += 20
+ M.AdjustHallucinate(20)
/obj/item/projectile/clown
name = "snap-pop"
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
deleted file mode 100644
index ddd53d98fdf..00000000000
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ /dev/null
@@ -1,1215 +0,0 @@
-#define SOLID 1
-#define LIQUID 2
-#define GAS 3
-
-/obj/machinery/chem_dispenser
- name = "chem dispenser"
- density = 1
- anchored = 1
- icon = 'icons/obj/chemical.dmi'
- icon_state = "dispenser"
- use_power = 0
- idle_power_usage = 40
- var/ui_title = "Chem Dispenser 5000"
- var/energy = 100
- var/max_energy = 100
- var/amount = 30
- var/obj/item/weapon/reagent_containers/beaker = null
- var/recharged = 0
- var/hackedcheck = 0
- var/list/dispensable_reagents = list("hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine",
- "sodium", "aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron",
- "copper", "mercury", "plasma", "radium", "water", "ethanol", "sugar", "iodine", "bromine", "silver")
- var/list/hacked_reagents = list("toxin")
- var/hack_message = "You disable the safety safeguards, enabling the \"Mad Scientist\" mode."
- var/unhack_message = "You re-enable the safety safeguards, enabling the \"NT Standard\" mode."
- var/list/broken_requirements = list()
- var/broken_on_spawn = 0
- var/recharge_delay = 5
- var/image/icon_beaker = null //cached overlay
-
-
-/obj/machinery/chem_dispenser/proc/recharge()
- if(stat & (BROKEN|NOPOWER)) return
- var/addenergy = 1
- var/oldenergy = energy
- energy = min(energy + addenergy, max_energy)
- if(energy != oldenergy)
- use_power(1500) // This thing uses up alot of power (this is still low as shit for creating reagents from thin air)
- nanomanager.update_uis(src) // update all UIs attached to src
-
-/obj/machinery/chem_dispenser/power_change()
- if(powered())
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- stat |= NOPOWER
- nanomanager.update_uis(src) // update all UIs attached to src
-
-/obj/machinery/chem_dispenser/process()
-
- if(recharged < 0)
- recharge()
- recharged = recharge_delay
- else
- recharged -= 1
-
-/obj/machinery/chem_dispenser/New()
- ..()
- recharge()
- dispensable_reagents = sortList(dispensable_reagents)
-
- if(broken_on_spawn)
- overlays.Cut()
- var/amount = pick(3,3,4)
- var/list/options = list()
- options[/obj/item/weapon/stock_parts/capacitor/adv] = "Add an advanced capacitor to fix it."
- options[/obj/item/weapon/stock_parts/console_screen] = "Replace the console screen to fix it."
- options[/obj/item/weapon/stock_parts/manipulator/pico] = "Upgrade to a pico manipulator to fix it."
- options[/obj/item/weapon/stock_parts/matter_bin/super] = "Give it a super matter bin to fix it."
- options[/obj/item/weapon/stock_parts/cell/super] = "Replace the reagent synthesizer with a super capacity cell to fix it."
- options[/obj/item/device/mass_spectrometer/adv] = "Replace the reagent scanner with an advanced mass spectrometer to fix it"
- options[/obj/item/weapon/stock_parts/micro_laser/high] = "Repair the reagent synthesizer with an high-power micro-laser to fix it"
- options[/obj/item/device/reagent_scanner/adv] = "Replace the reagent scanner with an advanced reagent scanner to fix it"
- options[/obj/item/stack/nanopaste] = "Apply some nanopaste to the broken nozzles to fix it."
- options[/obj/item/stack/sheet/plasteel] = "Surround the outside with a plasteel cover to fix it."
- options[/obj/item/stack/sheet/rglass] = "Insert a pane of reinforced glass to fix it."
-
- while(amount > 0)
- amount -= 1
-
- var/index = pick(options)
- broken_requirements[index] = options[index]
- options -= index
-
-
-/obj/machinery/chem_dispenser/ex_act(severity)
- switch(severity)
- if(1.0)
- qdel(src)
- return
- if(2.0)
- if(prob(50))
- qdel(src)
- return
-
-/obj/machinery/chem_dispenser/blob_act()
- if(prob(50))
- qdel(src)
-
- /**
- * The ui_interact proc is used to open and update Nano UIs
- * If ui_interact is not used then the UI will not update correctly
- * ui_interact is currently defined for /atom/movable
- *
- * @param user /mob The mob who is interacting with this ui
- * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
- *
- * @return nothing
- */
-
-/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
- if(broken_requirements.len)
- to_chat(user, "[src] is broken. [broken_requirements[broken_requirements[1]]]")
- return
-
-
- // this is the data which will be sent to the ui
- var/data[0]
- data["amount"] = amount
- data["energy"] = round(energy)
- data["maxEnergy"] = round(max_energy)
- data["isBeakerLoaded"] = beaker ? 1 : 0
-
- var beakerContents[0]
- var beakerCurrentVolume = 0
- if(beaker && beaker.reagents && beaker.reagents.reagent_list.len)
- for(var/datum/reagent/R in beaker.reagents.reagent_list)
- beakerContents.Add(list(list("name" = R.name, "id"=R.id, "volume" = R.volume))) // list in a list because Byond merges the first list...
- beakerCurrentVolume += R.volume
- data["beakerContents"] = beakerContents
-
- if(beaker)
- data["beakerCurrentVolume"] = beakerCurrentVolume
- data["beakerMaxVolume"] = beaker.volume
- else
- data["beakerCurrentVolume"] = null
- data["beakerMaxVolume"] = null
-
- var chemicals[0]
- for(var/re in dispensable_reagents)
- var/datum/reagent/temp = chemical_reagents_list[re]
- if(temp)
- chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list...
- data["chemicals"] = chemicals
-
- // update the ui if it exists, returns null if no ui is passed/found
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if(!ui)
- // the ui does not exist, so we'll create a new() one
- // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
- ui = new(user, src, ui_key, "chem_dispenser.tmpl", ui_title, 390, 655)
- // when the ui is first opened this is the data it will use
- ui.set_initial_data(data)
- // open the new ui window
- ui.open()
-
-/obj/machinery/chem_dispenser/Topic(href, href_list)
- if(..())
- return 1
-
- if(href_list["amount"])
- amount = round(text2num(href_list["amount"]), 5) // round to nearest 5
- if(amount < 0) // Since the user can actually type the commands himself, some sanity checking
- amount = 0
- if(amount > 100)
- amount = 100
-
- if(href_list["dispense"])
- if(dispensable_reagents.Find(href_list["dispense"]) && beaker != null)
- var/obj/item/weapon/reagent_containers/glass/B = beaker
- var/datum/reagents/R = B.reagents
- var/space = R.maximum_volume - R.total_volume
-
- R.add_reagent(href_list["dispense"], min(amount, energy * 10, space))
- energy = max(energy - min(amount, energy * 10, space) / 10, 0)
- overlays.Cut()
- icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position.
- icon_beaker.pixel_x = rand(-10,5)
- overlays += icon_beaker
-
- if(href_list["remove"])
- if(beaker)
- if(href_list["removeamount"])
- var/amount = text2num(href_list["removeamount"])
- if(isnum(amount) && (amount > 0))
- var/obj/item/weapon/reagent_containers/glass/B = beaker
- var/datum/reagents/R = B.reagents
- var/id = href_list["remove"]
- R.remove_reagent(id, amount)
-
- if(href_list["ejectBeaker"])
- if(beaker)
- var/obj/item/weapon/reagent_containers/glass/B = beaker
- B.forceMove(loc)
- beaker = null
- overlays.Cut()
- add_fingerprint(usr)
- return 1 // update UIs attached to this object
-
-/obj/machinery/chem_dispenser/attackby(obj/item/weapon/reagent_containers/B, mob/user, params)
- if(isrobot(user))
- return
-
- if(broken_requirements.len && B.type == broken_requirements[1])
- if(istype(B,/obj/item/stack))
- var/obj/item/stack/S = B
- S.use(1)
- else
- if(!user.drop_item())
- to_chat(user, "[B] is stuck to you!")
- return
- qdel(B)
- broken_requirements -= broken_requirements[1]
- to_chat(user, "You fix [src].")
- return
-
- if(beaker)
- to_chat(user, "Something is already loaded into the machine.")
- return
-
- if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks))
- beaker = B
- if(!user.drop_item())
- to_chat(user, "[B] is stuck to you!")
- return
- B.forceMove(src)
- to_chat(user, "You set [B] on the machine.")
- nanomanager.update_uis(src) // update all UIs attached to src
- if(!icon_beaker)
- icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position.
- icon_beaker.pixel_x = rand(-10,5)
- overlays += icon_beaker
- return
-
-/obj/machinery/chem_dispenser/attackby(obj/item/weapon/B, mob/user, params)
- ..()
- if(istype(B, /obj/item/device/multitool))
- if(hackedcheck == 0)
- to_chat(user, hack_message)
- dispensable_reagents += hacked_reagents
- hackedcheck = 1
- return
-
- else
- to_chat(user, unhack_message)
- dispensable_reagents -= hacked_reagents
- hackedcheck = 0
- return
-
-/obj/machinery/chem_dispenser/attack_ai(mob/user)
- return attack_hand(user)
-
-/obj/machinery/chem_dispenser/attack_ghost(mob/user)
- return attack_hand(user)
-
-/obj/machinery/chem_dispenser/attack_hand(mob/user)
- if(stat & BROKEN)
- return
-
- ui_interact(user)
-
-/obj/machinery/chem_dispenser/soda
- icon_state = "soda_dispenser"
- name = "soda fountain"
- desc = "A drink fabricating machine, capable of producing many sugary drinks with just one touch."
- ui_title = "Soda Dispens-o-matic"
- energy = 100
- max_energy = 100
- dispensable_reagents = list("water", "ice", "milk", "soymilk", "coffee", "tea", "hot_coco", "cola", "spacemountainwind", "dr_gibb", "space_up",
- "tonic", "sodawater", "lemon_lime", "grapejuice", "sugar", "orangejuice", "lemonjuice", "limejuice", "tomatojuice", "banana",
- "watermelonjuice", "carrotjuice", "potato", "berryjuice")
- hack_message = "You change the mode from 'McNano' to 'Pizza King'."
- unhack_message = "You change the mode from 'Pizza King' to 'McNano'."
- hacked_reagents = list("thirteenloko")
-
-/obj/machinery/chem_dispenser/beer
- icon_state = "booze_dispenser"
- name = "booze dispenser"
- ui_title = "Booze Portal 9001"
- energy = 100
- max_energy = 100
- desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
- dispensable_reagents = list("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequila", "vermouth", "cognac", "ale", "mead", "synthanol")
- hack_message = "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes."
- unhack_message = "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes."
- hacked_reagents = list("goldschlager", "patron", "absinthe", "ethanol", "nothing")
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/obj/machinery/chem_dispenser/constructable
- name = "portable chem dispenser"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "minidispenser"
- energy = 5
- max_energy = 5
- amount = 5
- recharge_delay = 10
- dispensable_reagents = list()
- var/list/special_reagents = list(list("hydrogen", "oxygen", "silicon", "phosphorus", "sulfur", "carbon", "nitrogen", "water"),
- list("lithium", "sugar", "copper", "mercury", "sodium","iodine","bromine"),
- list("ethanol", "chlorine", "potassium", "aluminum","plasma", "radium", "fluorine", "iron", "silver"),
- list("oil", "ash", "acetone", "saltpetre", "ammonia", "diethylamine", "fuel"))
-
-/obj/machinery/chem_dispenser/constructable/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/weapon/stock_parts/cell/super(null)
- RefreshParts()
-
-/obj/machinery/chem_dispenser/constructable/upgraded/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/weapon/stock_parts/cell/hyper(null)
- RefreshParts()
-
-/obj/machinery/chem_dispenser/constructable/RefreshParts()
- var/time = 0
- var/temp_energy = 0
- var/i
- for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
- temp_energy += M.rating
- temp_energy--
- max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest
- for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
- time += C.rating
- for(var/obj/item/weapon/stock_parts/cell/P in component_parts)
- time += round(P.maxcharge, 10000) / 10000
- recharge_delay = 10 / (time/2) //delay between recharges, double the usual time on lowest 33% less than usual on highest
- for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
- for(i=1, i<=M.rating, i++)
- dispensable_reagents = sortList(dispensable_reagents | special_reagents[i])
-
-/obj/machinery/chem_dispenser/constructable/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/reagent_containers/glass))
- if(panel_open)
- to_chat(user, "Close the maintenance panel first.")
- return
- ..()
- else
- ..()
-
- if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I))
- return
-
- if(exchange_parts(user, I))
- return
-
- if(istype(I, /obj/item/weapon/wrench))
- playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
- if(anchored)
- anchored = 0
- to_chat(user, "[src] can now be moved.")
- else if(!anchored)
- anchored = 1
- to_chat(user, "[src] is now secured.")
-
- if(panel_open)
- if(istype(I, /obj/item/weapon/crowbar))
- if(beaker)
- var/obj/item/weapon/reagent_containers/glass/B = beaker
- B.forceMove(loc)
- beaker = null
- default_deconstruction_crowbar(I)
- return 1
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/obj/machinery/chem_master
- name = "\improper ChemMaster 3000"
- density = 1
- anchored = 1
- icon = 'icons/obj/chemical.dmi'
- icon_state = "mixer0"
- use_power = 1
- idle_power_usage = 20
- var/obj/item/weapon/reagent_containers/beaker = null
- var/obj/item/weapon/storage/pill_bottle/loaded_pill_bottle = null
- var/mode = 0
- var/condi = 0
- var/useramount = 30 // Last used amount
- var/pillamount = 10
- var/patchamount = 10
- var/bottlesprite = "bottle"
- var/pillsprite = "1"
- var/client/has_sprites = list()
- var/printing = null
-
-/obj/machinery/chem_master/New()
- var/datum/reagents/R = new/datum/reagents(100)
- reagents = R
- R.my_atom = src
- overlays += "waitlight"
-
-/obj/machinery/chem_master/ex_act(severity)
- switch(severity)
- if(1.0)
- qdel(src)
- return
- if(2.0)
- if(prob(50))
- qdel(src)
- return
-
-/obj/machinery/chem_master/blob_act()
- if(prob(50))
- qdel(src)
-
-/obj/machinery/chem_master/power_change()
- if(powered())
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- stat |= NOPOWER
-
-/obj/machinery/chem_master/attackby(obj/item/weapon/B, mob/user, params)
-
- if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
-
- if(beaker)
- to_chat(user, "A beaker is already loaded into the machine.")
- return
- if(!user.drop_item())
- to_chat(user, "[B] is stuck to you!")
- return
- beaker = B
- B.forceMove(src)
- to_chat(user, "You add the beaker to the machine!")
- nanomanager.update_uis(src)
- icon_state = "mixer1"
-
- else if(istype(B, /obj/item/weapon/storage/pill_bottle))
-
- if(loaded_pill_bottle)
- to_chat(user, "A pill bottle is already loaded into the machine.")
- return
-
- if(!user.drop_item())
- to_chat(user, "[B] is stuck to you!")
- return
- loaded_pill_bottle = B
- B.forceMove(src)
- to_chat(user, "You add the pill bottle into the dispenser slot!")
- nanomanager.update_uis(src)
- return
-
-/obj/machinery/chem_master/Topic(href, href_list)
- if(..())
- return 1
-
- add_fingerprint(usr)
- usr.set_machine(src)
-
-
- if(href_list["ejectp"])
- if(loaded_pill_bottle)
- loaded_pill_bottle.forceMove(loc)
- loaded_pill_bottle = null
- else if(href_list["close"])
- usr << browse(null, "window=chem_master")
- onclose(usr, "chem_master")
- usr.unset_machine()
- return
-
- if(href_list["print_p"])
- if(!(printing))
- printing = 1
- visible_message("[src] rattles and prints out a sheet of paper.")
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
- P.info = "Chemical Analysis "
- P.info += "Time of analysis: [worldtime2text(world.time)]
"
- P.info += "Chemical name: [href_list["name"]] "
- if(href_list["name"] == "Blood")
- var/datum/reagents/R = beaker.reagents
- var/datum/reagent/blood/G
- for(var/datum/reagent/F in R.reagent_list)
- if(F.name == href_list["name"])
- G = F
- break
- var/B = G.data["blood_type"]
- var/C = G.data["blood_DNA"]
- P.info += "Description: Blood Type: [B] DNA: [C]"
- else
- P.info += "Description: [href_list["desc"]]"
- P.info += "
Notes: "
- P.name = "Chemical Analysis - [href_list["name"]]"
- printing = null
-
- if(beaker)
- var/datum/reagents/R = beaker.reagents
- if(href_list["analyze"])
- var/dat = ""
- if(!condi)
- if(href_list["name"] == "Blood")
- var/datum/reagent/blood/G
- for(var/datum/reagent/F in R.reagent_list)
- if(F.name == href_list["name"])
- G = F
- break
- var/A = G.name
- var/B = G.data["blood_type"]
- var/C = G.data["blood_DNA"]
- dat += "Chemmaster 3000Chemical infos:
Name: [A]
Description: Blood Type: [B] DNA: [C]"
- else
- dat += "Chemmaster 3000Chemical infos:
Name: [href_list["name"]]
Description: [href_list["desc"]]"
- dat += "
(Print Analysis) "
- dat += "(Back)"
- else
- dat += "Condimaster 3000Condiment infos:
Name: [href_list["name"]]
Description: [href_list["desc"]]
(Back)"
- usr << browse(dat, "window=chem_master;size=575x400")
- return
-
- else if(href_list["add"])
-
- if(href_list["amount"])
- var/id = href_list["add"]
- var/amount = text2num(href_list["amount"])
- R.trans_id_to(src, id, amount)
-
- else if(href_list["addcustom"])
-
- var/id = href_list["addcustom"]
- useramount = input("Select the amount to transfer.", 30, useramount) as num
- useramount = isgoodnumber(useramount)
- Topic(null, list("amount" = "[useramount]", "add" = "[id]"))
-
- else if(href_list["remove"])
-
- if(href_list["amount"])
- var/id = href_list["remove"]
- var/amount = text2num(href_list["amount"])
- if(mode)
- reagents.trans_id_to(beaker, id, amount)
- else
- reagents.remove_reagent(id, amount)
-
-
- else if(href_list["removecustom"])
-
- var/id = href_list["removecustom"]
- useramount = input("Select the amount to transfer.", 30, useramount) as num
- useramount = isgoodnumber(useramount)
- Topic(null, list("amount" = "[useramount]", "remove" = "[id]"))
-
- else if(href_list["toggle"])
- mode = !mode
-
- else if(href_list["main"])
- attack_hand(usr)
- return
- else if(href_list["eject"])
- if(beaker)
- beaker.forceMove(get_turf(src))
- beaker = null
- reagents.clear_reagents()
- icon_state = "mixer0"
- else if(href_list["createpill"] || href_list["createpill_multiple"])
- if(!condi)
- var/count = 1
- if(href_list["createpill_multiple"])
- count = input("Select the number of pills to make.", 10, pillamount) as num|null
- if(count == null)
- return
- count = isgoodnumber(count)
- if(count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines?
- if(count <= 0) return
- var/amount_per_pill = reagents.total_volume/count
- if(amount_per_pill > 50) amount_per_pill = 50
- var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill]u)") as text|null
- if(!name)
- return
- name = reject_bad_text(name)
- while(count--)
- var/obj/item/weapon/reagent_containers/food/pill/P = new/obj/item/weapon/reagent_containers/food/pill(loc)
- if(!name) name = reagents.get_master_reagent_name()
- P.name = "[name] pill"
- P.pixel_x = rand(-7, 7) //random position
- P.pixel_y = rand(-7, 7)
- P.icon_state = "pill"+pillsprite
- reagents.trans_to(P,amount_per_pill)
- if(loaded_pill_bottle)
- if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots)
- P.forceMove(loaded_pill_bottle)
- updateUsrDialog()
- else
- var/name = input(usr,"Name:","Name your bag!",reagents.get_master_reagent_name()) as text|null
- if(!name)
- return
- name = reject_bad_text(name)
- var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(loc)
- if(!name) name = reagents.get_master_reagent_name()
- P.originalname = name
- P.name = "[name] pack"
- P.desc = "A small condiment pack. The label says it contains [name]."
- reagents.trans_to(P,10)
- else if(href_list["createpatch"] || href_list["createpatch_multiple"])
- if(!condi)
- var/count = 1
- if(href_list["createpatch_multiple"])
- count = input("Select the number of patches to make.", 10, patchamount) as num|null
- if(count == null)
- return
- count = isgoodnumber(count)
- if(!count || count <= 0)
- return
- if(count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines?
- var/amount_per_patch = reagents.total_volume/count
- if(amount_per_patch > 40) amount_per_patch = 40
- var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch]u)") as text|null
- if(!name)
- return
- name = reject_bad_text(name)
- var/is_medical_patch = chemical_safety_check(reagents)
- while(count--)
- var/obj/item/weapon/reagent_containers/food/pill/patch/P = new/obj/item/weapon/reagent_containers/food/pill/patch(loc)
- if(!name) name = reagents.get_master_reagent_name()
- P.name = "[name] patch"
- P.pixel_x = rand(-7, 7) //random position
- P.pixel_y = rand(-7, 7)
- reagents.trans_to(P,amount_per_patch)
- if(is_medical_patch)
- P.instant_application = 1
- P.icon_state = "bandaid_med"
- else if(href_list["createbottle"])
- if(!condi)
- var/name = input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()) as text|null
- if(!name)
- return
- name = reject_bad_text(name)
- var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(loc)
- if(!name) name = reagents.get_master_reagent_name()
- P.name = "[name] bottle"
- P.pixel_x = rand(-7, 7) //random position
- P.pixel_y = rand(-7, 7)
- P.icon_state = bottlesprite
- reagents.trans_to(P,30)
- else
- var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(loc)
- reagents.trans_to(P,50)
- else if(href_list["change_pill"])
- #define MAX_PILL_SPRITE 20 //max icon state of the pill sprites
- var/dat = " "
- var/j = 0
- for(var/i = 1 to MAX_PILL_SPRITE)
- j++
- if(j == 1)
- dat += ""
- dat += " | "
- if(j == 5)
- dat += " "
- j = 0
- dat += " "
- usr << browse(dat, "window=chem_master_iconsel;size=225x193")
- return
- else if(href_list["change_bottle"])
- var/dat = ""
- var/j = 0
- for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle"))
- j++
- if(j == 1)
- dat += ""
- dat += " | "
- if(j == 5)
- dat += " "
- j = 0
- dat += " "
- usr << browse(dat, "window=chem_master_iconsel;size=225x193")
- return
- else if(href_list["pill_sprite"])
- pillsprite = href_list["pill_sprite"]
- usr << browse(null, "window=chem_master_iconsel")
- else if(href_list["bottle_sprite"])
- bottlesprite = href_list["bottle_sprite"]
- usr << browse(null, "window=chem_master_iconsel")
-
- nanomanager.update_uis(src)
- return
-
-/obj/machinery/chem_master/attack_ai(mob/user)
- return attack_hand(user)
-
-/obj/machinery/chem_master/attack_ghost(mob/user)
- return attack_hand(user)
-
-/obj/machinery/chem_master/attack_hand(mob/user)
- if(..())
- return 1
- ui_interact(user)
- return
-
-/obj/machinery/chem_master/ui_interact(mob/user, ui_key="main", datum/nanoui/ui = null, force_open = 1)
-
- var/datum/asset/chem_master/assets = get_asset_datum(/datum/asset/chem_master)
- assets.send(user)
-
- var/data = list()
-
- data["condi"] = condi
- data["loaded_pill_bottle"] = (loaded_pill_bottle ? 1 : 0)
- if(loaded_pill_bottle)
- data["loaded_pill_bottle_contents_len"] = loaded_pill_bottle.contents.len
- data["loaded_pill_bottle_storage_slots"] = loaded_pill_bottle.storage_slots
-
- data["beaker"] = (beaker ? 1 : 0)
- if(beaker)
- var/list/beaker_reagents_list = list()
- data["beaker_reagents"] = beaker_reagents_list
- for(var/datum/reagent/R in beaker.reagents.reagent_list)
- beaker_reagents_list[++beaker_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description)
- var/list/buffer_reagents_list = list()
- data["buffer_reagents"] = buffer_reagents_list
- for(var/datum/reagent/R in reagents.reagent_list)
- buffer_reagents_list[++buffer_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description)
-
- data["pillsprite"] = pillsprite
- data["bottlesprite"] = bottlesprite
- data["mode"] = mode
-
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "chem_master.tmpl", name, 575, 400)
- ui.set_initial_data(data)
- ui.open()
-
-/obj/machinery/chem_master/proc/isgoodnumber(num)
- if(isnum(num))
- if(num > 200)
- num = 200
- else if(num < 0)
- num = 1
- else
- num = round(num)
- return num
- else
- return 0
-
-/obj/machinery/chem_master/proc/chemical_safety_check(datum/reagents/R)
- var/all_safe = 1
- for(var/datum/reagent/A in R.reagent_list)
- if(!safe_chem_list.Find(A.id))
- all_safe = 0
- return all_safe
-
-/obj/machinery/chem_master/condimaster
- name = "\improper CondiMaster 3000"
- condi = 1
-
-/obj/machinery/chem_master/constructable
- name = "ChemMaster 2999"
- desc = "Used to seperate chemicals and distribute them in a variety of forms."
-
-/obj/machinery/chem_master/constructable/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/chem_master(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
-
-/obj/machinery/chem_master/constructable/attackby(obj/item/B, mob/user, params)
-
- if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B))
- if(beaker)
- beaker.forceMove(get_turf(src))
- beaker = null
- reagents.clear_reagents()
- if(loaded_pill_bottle)
- loaded_pill_bottle.forceMove(get_turf(src))
- loaded_pill_bottle = null
- return
-
- if(exchange_parts(user, B))
- return
-
- if(panel_open)
- if(istype(B, /obj/item/weapon/crowbar))
- default_deconstruction_crowbar(B)
- return 1
- else
- to_chat(user, "You can't use the [name] while it's panel is opened!")
- return 1
- else
- ..()
-
-/obj/machinery/reagentgrinder
-
- name = "\improper All-In-One Grinder"
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "juicer1"
- layer = 2.9
- density = 1
- anchored = 1
- use_power = 1
- idle_power_usage = 5
- active_power_usage = 100
- var/inuse = 0
- var/obj/item/weapon/reagent_containers/beaker = null
- var/limit = 10
-
- //IMPORTANT NOTE! A negative number is a multiplier, a positive number is a flat amount to add. 0 means equal to the amount of the original reagent
- var/list/blend_items = list (
-
- //Sheets
- /obj/item/stack/sheet/mineral/plasma = list("plasma_dust" = 20),
- /obj/item/stack/sheet/mineral/uranium = list("uranium" = 20),
- /obj/item/stack/sheet/mineral/bananium = list("banana" = 20),
- /obj/item/stack/sheet/mineral/tranquillite = list("nothing" = 20),
- /obj/item/stack/sheet/mineral/silver = list("silver" = 20),
- /obj/item/stack/sheet/mineral/gold = list("gold" = 20),
- /obj/item/weapon/grown/novaflower = list("capsaicin" = 0),
-
- //archaeology!
- ///obj/item/weapon/rocksliver = list("ground_rock" = 50),
-
-
- //All types that you can put into the grinder to transfer the reagents to the beaker. !Put all recipes above this.!
- /obj/item/weapon/reagent_containers/food = list(),
- /obj/item/weapon/reagent_containers/honeycomb = list()
- )
-
- var/list/blend_tags = list (
- "nettle" = list("sacid" = 0),
- "deathnettle" = list("facid" = 0),
- "soybeans" = list("soymilk" = 0),
- "tomato" = list("ketchup" = 0),
- "wheat" = list("flour" = -5),
- "rice" = list("rice" = -5),
- "cherries" = list("cherryjelly" = 0),
- )
-
- var/list/juice_items = list (
- /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0),
- )
-
- var/list/juice_tags = list (
- "tomato" = list("tomatojuice" = 0),
- "carrot" = list("carrotjuice" = 0),
- "berries" = list("berryjuice" = 0),
- "banana" = list("banana" = 0),
- "potato" = list("potato" = 0),
- "lemon" = list("lemonjuice" = 0),
- "orange" = list("orangejuice" = 0),
- "lime" = list("limejuice" = 0),
- "poisonberries" = list("poisonberryjuice" = 0),
- "grapes" = list("grapejuice" = 0),
- "corn" = list("cornoil" = 0),
- )
-
- var/list/holdingitems = list()
-
-/obj/machinery/reagentgrinder/New()
- ..()
- beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
- return
-
-/obj/machinery/reagentgrinder/update_icon()
- icon_state = "juicer"+num2text(!isnull(beaker))
- return
-
-/obj/machinery/reagentgrinder/attackby(obj/item/O, mob/user, params)
-
- if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
- istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \
- istype(O,/obj/item/weapon/reagent_containers/food/drinks/shaker))
-
- if(beaker)
- return 1
- else
- if(!user.drop_item())
- to_chat(user, "[O] is stuck to you!")
- return
- beaker = O
- O.forceMove(src)
- update_icon()
- updateUsrDialog()
- return 0
-
- if(holdingitems && holdingitems.len >= limit)
- to_chat(usr, "The machine cannot hold anymore items.")
- return 1
-
- //Fill machine with a plantbag!
- if(istype(O, /obj/item/weapon/storage/bag/plants))
- var/obj/item/weapon/storage/bag/plants/PB = O
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in PB.contents)
- PB.remove_from_storage(G, src)
- holdingitems += G
- if(holdingitems && holdingitems.len >= limit) //Sanity checking so the blender doesn't overfill
- to_chat(user, "You empty [PB] into the All-In-One grinder.")
-
- updateUsrDialog()
- return 0
-
-
- if(!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items))
- to_chat(user, "Cannot refine into a reagent.")
- return 1
-
- user.unEquip(O)
- O.forceMove(src)
- holdingitems += O
- updateUsrDialog()
- return 0
-
-/obj/machinery/reagentgrinder/attack_ai(mob/user)
- return 0
-
-/obj/machinery/reagentgrinder/attack_hand(mob/user)
- user.set_machine(src)
- interact(user)
-
-/obj/machinery/reagentgrinder/interact(mob/user) // The microwave Menu
- var/is_chamber_empty = 0
- var/is_beaker_ready = 0
- var/processing_chamber = ""
- var/beaker_contents = ""
- var/dat = ""
-
- if(!inuse)
- for(var/obj/item/O in holdingitems)
- processing_chamber += "\A [O.name] "
-
- if(!processing_chamber)
- is_chamber_empty = 1
- processing_chamber = "Nothing."
- if(!beaker)
- beaker_contents = "No beaker attached. "
- else
- is_beaker_ready = 1
- beaker_contents = "The beaker contains: "
- var/anything = 0
- for(var/datum/reagent/R in beaker.reagents.reagent_list)
- anything = 1
- beaker_contents += "[R.volume] - [R.name] "
- if(!anything)
- beaker_contents += "Nothing "
-
-
- dat = {"
- Processing chamber contains:
- [processing_chamber]
- [beaker_contents]
- "}
- if(is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
- dat += "Grind the reagents "
- dat += "Juice the reagents
"
- if(holdingitems && holdingitems.len > 0)
- dat += "Eject the reagents "
- if(beaker)
- dat += "Detach the beaker "
- else
- dat += "Please wait..."
- user << browse("All-In-One Grinder[dat]", "window=reagentgrinder")
- onclose(user, "reagentgrinder")
- return
-
-/obj/machinery/reagentgrinder/Topic(href, href_list)
- if(..())
- return
- usr.set_machine(src)
- switch(href_list["action"])
- if("grind")
- grind()
- if("juice")
- juice()
- if("eject")
- eject()
- if("detach")
- detach()
- updateUsrDialog()
- return
-
-/obj/machinery/reagentgrinder/proc/detach()
-
- if(usr.stat != 0)
- return
- if(!beaker)
- return
- beaker.forceMove(loc)
- beaker = null
- update_icon()
-
-/obj/machinery/reagentgrinder/proc/eject()
-
- if(usr.stat != 0)
- return
- if(holdingitems && holdingitems.len == 0)
- return
-
- for(var/obj/item/O in holdingitems)
- O.forceMove(loc)
- holdingitems -= O
- holdingitems = list()
-
-/obj/machinery/reagentgrinder/proc/is_allowed(obj/item/weapon/reagent_containers/O)
- for(var/i in blend_items)
- if(istype(O, i))
- return 1
- return 0
-
-/obj/machinery/reagentgrinder/proc/get_allowed_by_id(obj/item/weapon/grown/O)
- for(var/i in blend_items)
- if(istype(O, i))
- return blend_items[i]
-
-/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_id(obj/item/weapon/reagent_containers/food/snacks/O)
- for(var/i in blend_items)
- if(istype(O, i))
- return blend_items[i]
-
-/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_id(obj/item/weapon/reagent_containers/food/snacks/O)
- for(var/i in juice_items)
- if(istype(O, i))
- return juice_items[i]
-
-/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O)
- for(var/i in blend_tags)
- if(O.seed.kitchen_tag == i)
- return blend_tags[i]
-
-/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O)
- for(var/i in juice_tags)
- if(O.seed.kitchen_tag == i)
- return juice_tags[i]
-
-/obj/machinery/reagentgrinder/proc/get_grownweapon_amount(obj/item/weapon/grown/O)
- if(!istype(O))
- return 5
- else if(O.potency == -1)
- return 5
- else
- return round(O.potency)
-
-/obj/machinery/reagentgrinder/proc/get_juice_amount(obj/item/weapon/reagent_containers/food/snacks/grown/O)
- if(!istype(O))
- return 5
- else if(O.potency == -1)
- return 5
- else
- return round(5*sqrt(O.potency))
-
-/obj/machinery/reagentgrinder/proc/remove_object(obj/item/O)
- holdingitems -= O
- qdel(O)
-
-/obj/machinery/reagentgrinder/proc/juice()
- power_change()
- if(stat & (NOPOWER|BROKEN))
- return
- if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
- return
- playsound(loc, 'sound/machines/juicer.ogg', 20, 1)
- var/offset = prob(50) ? -2 : 2
- animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
- inuse = 1
- spawn(50)
- pixel_x = initial(pixel_x) //return to its spot after shaking
- inuse = 0
- interact(usr)
- //Snacks
- for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
-
- var/allowed = null
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
- allowed = get_allowed_juice_by_tag(O)
- else
- allowed = get_allowed_juice_by_id(O)
- if(isnull(allowed))
- break
-
- for(var/r_id in allowed)
-
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = get_juice_amount(O)
-
- beaker.reagents.add_reagent(r_id, min(amount, space))
-
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
-
- remove_object(O)
-
-/obj/machinery/reagentgrinder/proc/grind()
-
- power_change()
- if(stat & (NOPOWER|BROKEN))
- return
- if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
- return
- playsound(loc, 'sound/machines/blender.ogg', 50, 1)
- var/offset = prob(50) ? -2 : 2
- animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
- inuse = 1
- spawn(60)
- pixel_x = initial(pixel_x) //return to its spot after shaking
- inuse = 0
- interact(usr)
- //Snacks and Plants
- for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
-
- var/allowed = null
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
- allowed = get_allowed_snack_by_tag(O)
- else
- allowed = get_allowed_snack_by_id(O)
- if(isnull(allowed))
- break
-
- for(var/r_id in allowed)
-
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = allowed[r_id]
- if(amount <= 0) //Negative amounts are multipliers for the reagent amount (Example: "amount = -5" means "reagent_amount * 5")
- if(amount == 0)
- if(O.reagents != null && O.reagents.has_reagent("nutriment"))
- beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space))
- O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
- if(O.reagents != null && O.reagents.has_reagent("plantmatter"))
- beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("plantmatter"), space))
- O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
- else
- if(O.reagents != null && O.reagents.has_reagent("nutriment"))
- beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), space))
- O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
- if(O.reagents != null && O.reagents.has_reagent("plantmatter"))
- beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("plantmatter")*abs(amount)), space))
- O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
-
- else
- O.reagents.trans_id_to(beaker, r_id, min(amount, space))
-
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
-
- if(O.reagents.reagent_list.len == 0)
- remove_object(O)
-
- //Sheets
- for(var/obj/item/stack/sheet/O in holdingitems)
- var/allowed = get_allowed_by_id(O)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- for(var/i = 1; i <= round(O.amount, 1); i++)
- for(var/r_id in allowed)
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = allowed[r_id]
- beaker.reagents.add_reagent(r_id,min(amount, space))
- if(space < amount)
- break
- if(i == round(O.amount, 1))
- remove_object(O)
- break
- //Plants
- for(var/obj/item/weapon/grown/O in holdingitems)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- var/allowed = get_allowed_by_id(O)
- for(var/r_id in allowed)
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = allowed[r_id]
- if(amount == 0)
- if(O.reagents != null && O.reagents.has_reagent(r_id))
- beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id), space))
- else
- beaker.reagents.add_reagent(r_id,min(amount, space))
-
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- remove_object(O)
-
- //xenoarch
- /*for(var/obj/item/weapon/rocksliver/O in holdingitems)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- var/allowed = get_allowed_by_id(O)
- for(var/r_id in allowed)
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = allowed[r_id]
- beaker.reagents.add_reagent(r_id,min(amount, space), O.geological_data)
-
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- remove_object(O)*/
-
- //Everything else - Transfers reagents from it into beaker
- for(var/obj/item/weapon/reagent_containers/O in holdingitems)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- var/amount = O.reagents.total_volume
- O.reagents.trans_to(beaker, amount)
- if(!O.reagents.total_volume)
- remove_object(O)
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Colours.dm b/code/modules/reagents/chemistry/colors.dm
similarity index 80%
rename from code/modules/reagents/Chemistry-Colours.dm
rename to code/modules/reagents/chemistry/colors.dm
index 176ec99c4d4..3d4ab41fe9c 100644
--- a/code/modules/reagents/Chemistry-Colours.dm
+++ b/code/modules/reagents/chemistry/colors.dm
@@ -1,31 +1,31 @@
-/*
- * Returns:
- * #RRGGBB(AA) on success, null on failure
- */
-/proc/mix_color_from_reagents(const/list/reagent_list)
- if(!istype(reagent_list))
- return
-
- var/color
- var/reagent_color
- var/vol_counter = 0
- var/vol_temp
- // see libs/IconProcs/IconProcs.dm
- for(var/datum/reagent/reagent in reagent_list)
- if(reagent.id == "blood" && reagent.data && reagent.data["blood_colour"])
- reagent_color = reagent.data["blood_colour"]
- else
- reagent_color = reagent.color
-
- vol_temp = reagent.volume
- vol_counter += vol_temp
-
- if(isnull(color))
- color = reagent.color
- else if(length(color) >= length(reagent_color))
- color = BlendRGB(color, reagent_color, vol_temp/vol_counter)
- else
- color = BlendRGB(reagent_color, color, vol_temp/vol_counter)
- return color
-
-
+/*
+ * Returns:
+ * #RRGGBB(AA) on success, null on failure
+ */
+var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
+
+/proc/mix_color_from_reagents(const/list/reagent_list)
+ if(!istype(reagent_list))
+ return
+
+ var/color
+ var/reagent_color
+ var/vol_counter = 0
+ var/vol_temp
+ // see libs/IconProcs/IconProcs.dm
+ for(var/datum/reagent/reagent in reagent_list)
+ if(reagent.id == "blood" && reagent.data && reagent.data["blood_colour"])
+ reagent_color = reagent.data["blood_colour"]
+ else
+ reagent_color = reagent.color
+
+ vol_temp = reagent.volume
+ vol_counter += vol_temp
+
+ if(isnull(color))
+ color = reagent.color
+ else if(length(color) >= length(reagent_color))
+ color = BlendRGB(color, reagent_color, vol_temp/vol_counter)
+ else
+ color = BlendRGB(reagent_color, color, vol_temp/vol_counter)
+ return color
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/chemistry/holder.dm
similarity index 80%
rename from code/modules/reagents/Chemistry-Holder.dm
rename to code/modules/reagents/chemistry/holder.dm
index ecc9c9ddc18..9c0c14014e4 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -1,601 +1,730 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
-
-var/const/TOUCH = 1
-var/const/INGEST = 2
-
-///////////////////////////////////////////////////////////////////////////////////
-
-/datum/reagents
- var/list/datum/reagent/reagent_list = new/list()
- var/total_volume = 0
- var/maximum_volume = 100
- var/atom/my_atom = null
- var/chem_temp = 300
- var/list/datum/reagent/addiction_list = new/list()
-
-/datum/reagents/New(maximum=100)
- maximum_volume = maximum
-
- //I dislike having these here but map-objects are initialised before world/New() is called. >_>
- if(!chemical_reagents_list)
- //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
- var/paths = subtypesof(/datum/reagent)
- chemical_reagents_list = list()
- for(var/path in paths)
- var/datum/reagent/D = new path()
- chemical_reagents_list[D.id] = D
- if(!D.can_grow_in_plants)
- plant_blocked_chems.Add(D.id)
- if(!chemical_reactions_list)
- //Chemical Reactions - Initialises all /datum/chemical_reaction into a list
- // It is filtered into multiple lists within a list.
- // For example:
- // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma
-
- var/paths = subtypesof(/datum/chemical_reaction)
- chemical_reactions_list = list()
-
- for(var/path in paths)
-
- var/datum/chemical_reaction/D = new path()
- var/list/reaction_ids = list()
-
- if(D && D.required_reagents && D.required_reagents.len)
- for(var/reaction in D.required_reagents)
- reaction_ids += reaction
-
- // Create filters based on each reagent id in the required reagents list
- for(var/id in reaction_ids)
- if(!chemical_reactions_list[id])
- chemical_reactions_list[id] = list()
- chemical_reactions_list[id] += D
- break // Don't bother adding ourselves to other reagent ids, it is redundant.
-
-/datum/reagents/proc/remove_any(amount=1)
- var/total_transfered = 0
- var/current_list_element = 1
-
- current_list_element = rand(1,reagent_list.len)
-
- while(total_transfered != amount)
- if(total_transfered >= amount)
- break
- if(total_volume <= 0 || !reagent_list.len)
- break
-
- if(current_list_element > reagent_list.len) current_list_element = 1
- var/datum/reagent/current_reagent = reagent_list[current_list_element]
-
- remove_reagent(current_reagent.id, min(1, amount - total_transfered))
-
- current_list_element++
- total_transfered++
- update_total()
-
- handle_reactions()
- return total_transfered
-
-/datum/reagents/proc/get_master_reagent_name()
- var/the_name = null
- var/the_volume = 0
- for(var/datum/reagent/A in reagent_list)
- if(A.volume > the_volume)
- the_volume = A.volume
- the_name = A.name
-
- return the_name
-
-/datum/reagents/proc/get_master_reagent_id()
- var/the_id = null
- var/the_volume = 0
- for(var/datum/reagent/A in reagent_list)
- if(A.volume > the_volume)
- the_volume = A.volume
- the_id = A.id
-
- return the_id
-
-/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
- if(!target)
- return
- if(total_volume <= 0)
- return
- var/datum/reagents/R
- if(istype(target, /obj))
- var/obj/O = target
- if(!O.reagents )
- return
- R = O.reagents
- else if(isliving(target))
- var/mob/living/M = target
- if(!M.reagents)
- return
- R = M.reagents
- else if(istype(target, /datum/reagents))
- R = target
- else
- return
-
- amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume)
- var/part = amount / total_volume
- var/trans_data = null
- for(var/datum/reagent/current_reagent in reagent_list)
- if(!current_reagent)
- continue
- if(current_reagent.id == "blood" && ishuman(target))
- var/mob/living/carbon/human/H = target
- H.inject_blood(my_atom, amount)
- continue
- var/current_reagent_transfer = current_reagent.volume * part
- if(preserve_data)
- trans_data = copy_data(current_reagent)
-
- R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp)
- remove_reagent(current_reagent.id, current_reagent_transfer)
-
- update_total()
- R.update_total()
- R.handle_reactions()
- handle_reactions()
- return amount
-
-/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0)
- if(!target)
- return
- if(!target.reagents || total_volume<=0)
- return
- var/datum/reagents/R = target.reagents
- amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume)
- var/part = amount / total_volume
- var/trans_data = null
- for(var/datum/reagent/current_reagent in reagent_list)
- var/current_reagent_transfer = current_reagent.volume * part
- if(preserve_data)
- trans_data = copy_data(current_reagent)
- R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
-
- update_total()
- R.update_total()
- R.handle_reactions()
- handle_reactions()
- return amount
-
-/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
- if(!target)
- return
- if(!target.reagents || total_volume<=0 || !get_reagent_amount(reagent))
- return
-
- var/datum/reagents/R = target.reagents
- if(get_reagent_amount(reagent) R.maximum_volume) return 0
-
- current_list_element = rand(1,reagent_list.len) //Eh, bandaid fix.
-
- while(total_transfered != amount)
- if(total_transfered >= amount) break //Better safe than sorry.
- if(total_volume <= 0 || !reagent_list.len) break
- if(R.total_volume >= R.maximum_volume) break
-
- if(current_list_element > reagent_list.len) current_list_element = 1
- var/datum/reagent/current_reagent = reagent_list[current_list_element]
- if(preserve_data)
- trans_data = current_reagent.data
- R.add_reagent(current_reagent.id, (1 * multiplier), trans_data)
- remove_reagent(current_reagent.id, 1)
-
- current_list_element++
- total_transfered++
- update_total()
- R.update_total()
- R.handle_reactions()
- handle_reactions()
-
- return total_transfered
-*/
-
-
-/datum/reagents/proc/conditional_update_move(atom/A, Running = 0)
- for(var/datum/reagent/R in reagent_list)
- R.on_move (A, Running)
- update_total()
-
-/datum/reagents/proc/conditional_update(atom/A, )
- for(var/datum/reagent/R in reagent_list)
- R.on_update (A)
- update_total()
-
-/datum/reagents/proc/handle_reactions()
- if(my_atom.flags & NOREACT)
- return //Yup, no reactions here. No siree.
-
- var/reaction_occured = 0
- do
- reaction_occured = 0
- for(var/datum/reagent/R in reagent_list) // Usually a small list
- for(var/reaction in chemical_reactions_list[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id
- if(!reaction)
- continue
-
- var/datum/chemical_reaction/C = reaction
- var/total_required_reagents = C.required_reagents.len
- var/total_matching_reagents = 0
- var/total_required_catalysts = C.required_catalysts.len
- var/total_matching_catalysts= 0
- var/matching_container = 0
- var/matching_other = 0
- var/list/multipliers = new/list()
- var/min_temp = C.min_temp //Minimum temperature required for the reaction to occur (heat to/above this)
- var/max_temp = C.max_temp //Maximum temperature allowed for the reaction to occur (cool to/below this)
- for(var/B in C.required_reagents)
- if(!has_reagent(B, C.required_reagents[B]))
- break
- total_matching_reagents++
- multipliers += round(get_reagent_amount(B) / C.required_reagents[B])
- for(var/B in C.required_catalysts)
- if(!has_reagent(B, C.required_catalysts[B]))
- break
- total_matching_catalysts++
-
- if(!C.required_container)
- matching_container = 1
-
- else
- if(my_atom.type == C.required_container)
- matching_container = 1
-
- if(!C.required_other)
- matching_other = 1
-
- else if(istype(my_atom, /obj/item/slime_extract))
- var/obj/item/slime_extract/M = my_atom
-
- if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this
- matching_other = 1
-
- if(min_temp == 0)
- min_temp = chem_temp
-
- if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp <= max_temp && chem_temp >= min_temp)
- var/multiplier = min(multipliers)
- var/preserved_data = null
- for(var/B in C.required_reagents)
- if(!preserved_data)
- preserved_data = get_data(B)
- remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1)
-
- var/created_volume = C.result_amount*multiplier
- if(C.result)
- feedback_add_details("chemical_reaction","[C.result]|[C.result_amount*multiplier]")
- multiplier = max(multiplier, 1) //this shouldnt happen ...
- add_reagent(C.result, C.result_amount*multiplier)
- set_data(C.result, preserved_data)
-
- //add secondary products
- for(var/S in C.secondary_results)
- add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier)
-
- var/list/seen = viewers(4, get_turf(my_atom))
- for(var/mob/M in seen)
- if(!C.no_message)
- to_chat(M, "[bicon(my_atom)] [C.mix_message]")
-
- if(istype(my_atom, /obj/item/slime_extract))
- var/obj/item/slime_extract/ME2 = my_atom
- ME2.Uses--
- if(ME2.Uses <= 0) // give the notification that the slime core is dead
- for(var/mob/M in seen)
- to_chat(M, "[bicon(my_atom)] The [my_atom]'s power is consumed in the reaction.")
- ME2.name = "used slime extract"
- ME2.desc = "This extract has been used up."
-
- playsound(get_turf(my_atom), C.mix_sound, 80, 1)
-
- C.on_reaction(src, created_volume)
- reaction_occured = 1
- break
-
- while(reaction_occured)
- update_total()
- return 0
-
-/datum/reagents/proc/isolate_reagent(reagent)
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if(R.id != reagent)
- del_reagent(R.id)
- update_total()
-
-/datum/reagents/proc/del_reagent(reagent)
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if(R.id == reagent)
- if(isliving(my_atom))
- var/mob/living/M = my_atom
- R.reagent_deleted(M)
- reagent_list -= A
- qdel(A)
- update_total()
- my_atom.on_reagent_change()
- return 0
-
-
- return 1
-
-/datum/reagents/proc/update_total()
- total_volume = 0
- for(var/datum/reagent/R in reagent_list)
- if(R.volume < 0.1)
- del_reagent(R.id)
- else
- total_volume += R.volume
-
- return 0
-
-/datum/reagents/proc/clear_reagents()
- for(var/datum/reagent/R in reagent_list)
- del_reagent(R.id)
- return 0
-
-/datum/reagents/proc/reaction_check(mob/living/M, datum/reagent/R)
- var/can_process = 0
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- //Check if this mob's species is set and can process this type of reagent
- if(H.species && H.species.reagent_tag)
- if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
- can_process = 1
- if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
- can_process = 1
- //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
- if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
- can_process = 1
- if(H.species && H.species.exotic_blood)
- if(R.id == H.species.exotic_blood)
- can_process = 0
- //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
- else
- if(R.process_flags != SYNTHETIC)
- can_process = 1
- return can_process
-
-/datum/reagents/proc/reaction(atom/A, method=TOUCH, volume_modifier = 1)
- switch(method)
- if(TOUCH)
- for(var/datum/reagent/R in reagent_list)
- if(isliving(A))
- var/check = reaction_check(A, R)
- if(!check)
- continue
- else
- R.reaction_mob(A, TOUCH, R.volume*volume_modifier)
- if(isturf(A))
- R.reaction_turf(A, R.volume*volume_modifier)
- if(isobj(A))
- R.reaction_obj(A, R.volume*volume_modifier)
- if(INGEST)
- for(var/datum/reagent/R in reagent_list)
- if(isliving(A))
- var/check = reaction_check(A, R)
- if(!check)
- continue
- else
- R.reaction_mob(A, INGEST, R.volume*volume_modifier)
- if(isturf(A))
- R.reaction_turf(A, R.volume*volume_modifier)
- if(isobj(A))
- R.reaction_obj(A, R.volume*volume_modifier)
-
-/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15)
- for(var/r_id in list_reagents)
- var/amt = list_reagents[r_id]
- add_reagent(r_id, amt, data)
-
-/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300)
- if(!isnum(amount))
- return 1
- update_total()
- if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
- if(amount <= 0)
- return 0
- chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems
-
- for(var/A in reagent_list)
-
- var/datum/reagent/R = A
- if(R.id == reagent)
- R.volume += amount
- update_total()
- my_atom.on_reagent_change()
- R.on_merge(data)
- handle_reactions()
- return 0
-
- var/datum/reagent/D = chemical_reagents_list[reagent]
- if(D)
-
- var/datum/reagent/R = new D.type()
- reagent_list += R
- R.holder = src
- R.volume = amount
- if(data)
- R.data = data
- R.on_new(data)
-
- update_total()
- my_atom.on_reagent_change()
- handle_reactions()
- return 0
- else
- warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])")
-
- handle_reactions()
-
- return 1
-
-/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to
-
- if(!isnum(amount))
- return 1
-
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if(R.id == reagent)
- R.volume -= amount
- update_total()
- if(!safety)//So it does not handle reactions when it need not to
- handle_reactions()
- my_atom.on_reagent_change()
- return 0
-
- return 1
-
-/datum/reagents/proc/has_reagent(reagent, amount = -1)
-
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if(R.id == reagent)
- if(!amount)
- return R
- else
- if(R.volume >= amount)
- return R
- else
- return 0
-
- return 0
-
-/datum/reagents/proc/get_reagent_amount(reagent)
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if(R.id == reagent)
- return R.volume
-
- return 0
-
-/datum/reagents/proc/get_reagents()
- var/res = ""
- for(var/datum/reagent/A in reagent_list)
- if(res != "") res += ","
- res += A.name
-
- return res
-
-/datum/reagents/proc/get_reagent(type)
- . = locate(type) in reagent_list
-
-/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included.
- if(!isnum(amount))
- return 1
-
- var/has_removed_reagent = 0
-
- for(var/datum/reagent/R in reagent_list)
- var/matches = 0
- // Switch between how we check the reagent type
- if(strict)
- if(R.type == reagent_type)
- matches = 1
- else
- if(istype(R, reagent_type))
- matches = 1
- // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type.
- if(matches)
- // Have our other proc handle removement
- has_removed_reagent = remove_reagent(R.id, amount, safety)
-
- return has_removed_reagent
-
-// Admin logging.
-/datum/reagents/proc/get_reagent_ids(and_amount=0)
- var/list/stuff = list()
- for(var/datum/reagent/A in reagent_list)
- if(and_amount)
- stuff += "[get_reagent_amount(A.id)]U of [A.id]"
- else
- stuff += A.id
- return english_list(stuff)
-
-//two helper functions to preserve data across reactions (needed for xenoarch)
-/datum/reagents/proc/get_data(reagent_id)
- for(var/datum/reagent/D in reagent_list)
- if(D.id == reagent_id)
-// to_chat(world, "proffering a data-carrying reagent ([reagent_id])")
- return D.data
-
-/datum/reagents/proc/set_data(reagent_id, new_data)
- for(var/datum/reagent/D in reagent_list)
- if(D.id == reagent_id)
-// to_chat(world, "reagent data set ([reagent_id])")
- D.data = new_data
-
-/datum/reagents/proc/copy_data(datum/reagent/current_reagent)
- if(!current_reagent || !current_reagent.data)
- return null
- if(!istype(current_reagent.data, /list))
- return current_reagent.data
-
- var/list/trans_data = current_reagent.data.Copy()
-
- // We do this so that introducing a virus to a blood sample
- // doesn't automagically infect all other blood samples from
- // the same donor.
- //
- // Technically we should probably copy all data lists, but
- // that could possibly eat up a lot of memory needlessly
- // if most data lists are read-only.
- if(trans_data["viruses"])
- var/list/v = trans_data["viruses"]
- trans_data["viruses"] = v.Copy()
-
- return trans_data
-
-///////////////////////////////////////////////////////////////////////////////////
-
-
-// Convenience proc to create a reagents holder for an atom
-// Max vol is maximum volume of holder
-atom/proc/create_reagents(max_vol)
- reagents = new/datum/reagents(max_vol)
- reagents.my_atom = src
-
-/datum/reagents/proc/get_reagent_from_id(id)
- var/datum/reagent/result = null
- for(var/datum/reagent/R in reagent_list)
- if(R.id == id)
- result = R
- break
- return result
-
-/datum/reagents/Destroy()
- . = ..()
- processing_objects.Remove(src)
- for(var/datum/reagent/R in reagent_list)
- qdel(R)
- reagent_list.Cut()
- reagent_list = null
- if(my_atom && my_atom.reagents == src)
- my_atom.reagents = null
+//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
+
+var/const/TOUCH = 1
+var/const/INGEST = 2
+#define ADDICTION_TIME 4800 //8 minutes
+
+///////////////////////////////////////////////////////////////////////////////////
+
+/datum/reagents
+ var/list/datum/reagent/reagent_list = new/list()
+ var/total_volume = 0
+ var/maximum_volume = 100
+ var/atom/my_atom = null
+ var/chem_temp = 300
+ var/list/datum/reagent/addiction_list = new/list()
+
+/datum/reagents/New(maximum=100)
+ maximum_volume = maximum
+
+ //I dislike having these here but map-objects are initialised before world/New() is called. >_>
+ if(!chemical_reagents_list)
+ //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
+ var/paths = subtypesof(/datum/reagent)
+ chemical_reagents_list = list()
+ for(var/path in paths)
+ var/datum/reagent/D = new path()
+ chemical_reagents_list[D.id] = D
+ if(!D.can_grow_in_plants)
+ plant_blocked_chems.Add(D.id)
+ if(!chemical_reactions_list)
+ //Chemical Reactions - Initialises all /datum/chemical_reaction into a list
+ // It is filtered into multiple lists within a list.
+ // For example:
+ // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma
+
+ var/paths = subtypesof(/datum/chemical_reaction)
+ chemical_reactions_list = list()
+
+ for(var/path in paths)
+
+ var/datum/chemical_reaction/D = new path()
+ var/list/reaction_ids = list()
+
+ if(D && D.required_reagents && D.required_reagents.len)
+ for(var/reaction in D.required_reagents)
+ reaction_ids += reaction
+
+ // Create filters based on each reagent id in the required reagents list
+ for(var/id in reaction_ids)
+ if(!chemical_reactions_list[id])
+ chemical_reactions_list[id] = list()
+ chemical_reactions_list[id] += D
+ break // Don't bother adding ourselves to other reagent ids, it is redundant.
+
+/datum/reagents/proc/remove_any(amount=1)
+ var/total_transfered = 0
+ var/current_list_element = 1
+
+ current_list_element = rand(1,reagent_list.len)
+
+ while(total_transfered != amount)
+ if(total_transfered >= amount)
+ break
+ if(total_volume <= 0 || !reagent_list.len)
+ break
+
+ if(current_list_element > reagent_list.len) current_list_element = 1
+ var/datum/reagent/current_reagent = reagent_list[current_list_element]
+
+ remove_reagent(current_reagent.id, min(1, amount - total_transfered))
+
+ current_list_element++
+ total_transfered++
+ update_total()
+
+ handle_reactions()
+ return total_transfered
+
+/datum/reagents/proc/get_master_reagent()
+ var/the_reagent = null
+ var/the_volume = 0
+ for(var/datum/reagent/A in reagent_list)
+ if(A.volume > the_volume)
+ the_volume = A.volume
+ the_reagent = A
+
+ return the_reagent
+
+/datum/reagents/proc/get_master_reagent_name()
+ var/the_name = null
+ var/the_volume = 0
+ for(var/datum/reagent/A in reagent_list)
+ if(A.volume > the_volume)
+ the_volume = A.volume
+ the_name = A.name
+
+ return the_name
+
+/datum/reagents/proc/get_master_reagent_id()
+ var/the_id = null
+ var/the_volume = 0
+ for(var/datum/reagent/A in reagent_list)
+ if(A.volume > the_volume)
+ the_volume = A.volume
+ the_id = A.id
+
+ return the_id
+
+/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
+ if(!target)
+ return
+ if(total_volume <= 0)
+ return
+ var/datum/reagents/R
+ if(istype(target, /obj))
+ var/obj/O = target
+ if(!O.reagents )
+ return
+ R = O.reagents
+ else if(isliving(target))
+ var/mob/living/M = target
+ if(!M.reagents)
+ return
+ R = M.reagents
+ else if(istype(target, /datum/reagents))
+ R = target
+ else
+ return
+
+ amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume)
+ var/part = amount / total_volume
+ var/trans_data = null
+ for(var/datum/reagent/current_reagent in reagent_list)
+ if(!current_reagent)
+ continue
+ if(current_reagent.id == "blood" && ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.inject_blood(my_atom, amount)
+ continue
+ var/current_reagent_transfer = current_reagent.volume * part
+ if(preserve_data)
+ trans_data = copy_data(current_reagent)
+
+ R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp)
+ remove_reagent(current_reagent.id, current_reagent_transfer)
+
+ update_total()
+ R.update_total()
+ R.handle_reactions()
+ handle_reactions()
+ return amount
+
+/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0)
+ if(!target)
+ return
+ if(!target.reagents || total_volume<=0)
+ return
+ var/datum/reagents/R = target.reagents
+ amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume)
+ var/part = amount / total_volume
+ var/trans_data = null
+ for(var/datum/reagent/current_reagent in reagent_list)
+ var/current_reagent_transfer = current_reagent.volume * part
+ if(preserve_data)
+ trans_data = copy_data(current_reagent)
+ R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
+
+ update_total()
+ R.update_total()
+ R.handle_reactions()
+ handle_reactions()
+ return amount
+
+/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
+ if(!target)
+ return
+ if(!target.reagents || total_volume<=0 || !get_reagent_amount(reagent))
+ return
+
+ var/datum/reagents/R = target.reagents
+ if(get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0)
+ R.overdosed = 1
+ R.overdose_start(M)
+ if(R.volume < R.overdose_threshold && R.overdosed)
+ R.overdosed = 0
+ if(R.overdosed)
+ R.overdose_process(M, R.volume >= R.overdose_threshold*2 ? 2 : 1)
+
+ for(var/A in addiction_list)
+ var/datum/reagent/R = A
+ if(M && R)
+ if(R.addiction_stage < 5)
+ if(prob(5))
+ R.addiction_stage++
+ switch(R.addiction_stage)
+ if(1)
+ R.addiction_act_stage1(M)
+ if(2)
+ R.addiction_act_stage2(M)
+ if(3)
+ R.addiction_act_stage3(M)
+ if(4)
+ R.addiction_act_stage4(M)
+ if(5)
+ R.addiction_act_stage5(M)
+ if(prob(20) && (world.timeofday > (R.last_addiction_dose + ADDICTION_TIME))) //Each addiction lasts 8 minutes before it can end
+ to_chat(M, "You no longer feel reliant on [R.name]!")
+ addiction_list.Remove(R)
+ update_total()
+
+/datum/reagents/proc/death_metabolize(mob/living/M)
+ if(!M)
+ return
+ if(M.stat != DEAD) //what part of DEATH_metabolize don't you get?
+ return
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if(!istype(R))
+ continue
+ if(M && R)
+ R.on_mob_death(M)
+
+/datum/reagents/proc/overdose_list()
+ var/od_chems[0]
+ for(var/datum/reagent/R in reagent_list)
+ if(R.overdosed)
+ od_chems.Add(R.id)
+ return od_chems
+
+
+/datum/reagents/proc/reagent_on_tick()
+ for(var/datum/reagent/R in reagent_list)
+ R.on_tick()
+ return
+/*
+ if(!target) return
+ var/total_transfered = 0
+ var/current_list_element = 1
+ var/datum/reagents/R = target.reagents
+ var/trans_data = null
+ //if(R.total_volume + amount > R.maximum_volume) return 0
+
+ current_list_element = rand(1,reagent_list.len) //Eh, bandaid fix.
+
+ while(total_transfered != amount)
+ if(total_transfered >= amount) break //Better safe than sorry.
+ if(total_volume <= 0 || !reagent_list.len) break
+ if(R.total_volume >= R.maximum_volume) break
+
+ if(current_list_element > reagent_list.len) current_list_element = 1
+ var/datum/reagent/current_reagent = reagent_list[current_list_element]
+ if(preserve_data)
+ trans_data = current_reagent.data
+ R.add_reagent(current_reagent.id, (1 * multiplier), trans_data)
+ remove_reagent(current_reagent.id, 1)
+
+ current_list_element++
+ total_transfered++
+ update_total()
+ R.update_total()
+ R.handle_reactions()
+ handle_reactions()
+
+ return total_transfered
+*/
+
+
+/datum/reagents/proc/conditional_update_move(atom/A, Running = 0)
+ for(var/datum/reagent/R in reagent_list)
+ R.on_move (A, Running)
+ update_total()
+
+/datum/reagents/proc/conditional_update(atom/A, )
+ for(var/datum/reagent/R in reagent_list)
+ R.on_update (A)
+ update_total()
+
+/datum/reagents/proc/handle_reactions()
+ if(my_atom.flags & NOREACT)
+ return //Yup, no reactions here. No siree.
+
+ var/reaction_occured = 0
+ do
+ reaction_occured = 0
+ for(var/datum/reagent/R in reagent_list) // Usually a small list
+ for(var/reaction in chemical_reactions_list[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id
+ if(!reaction)
+ continue
+
+ var/datum/chemical_reaction/C = reaction
+ var/total_required_reagents = C.required_reagents.len
+ var/total_matching_reagents = 0
+ var/total_required_catalysts = C.required_catalysts.len
+ var/total_matching_catalysts= 0
+ var/matching_container = 0
+ var/matching_other = 0
+ var/list/multipliers = new/list()
+ var/min_temp = C.min_temp //Minimum temperature required for the reaction to occur (heat to/above this)
+ var/max_temp = C.max_temp //Maximum temperature allowed for the reaction to occur (cool to/below this)
+ for(var/B in C.required_reagents)
+ if(!has_reagent(B, C.required_reagents[B]))
+ break
+ total_matching_reagents++
+ multipliers += round(get_reagent_amount(B) / C.required_reagents[B])
+ for(var/B in C.required_catalysts)
+ if(!has_reagent(B, C.required_catalysts[B]))
+ break
+ total_matching_catalysts++
+
+ if(!C.required_container)
+ matching_container = 1
+
+ else
+ if(my_atom.type == C.required_container)
+ matching_container = 1
+
+ if(!C.required_other)
+ matching_other = 1
+
+ else if(istype(my_atom, /obj/item/slime_extract))
+ var/obj/item/slime_extract/M = my_atom
+
+ if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this
+ matching_other = 1
+
+ if(min_temp == 0)
+ min_temp = chem_temp
+
+ if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp <= max_temp && chem_temp >= min_temp)
+ var/multiplier = min(multipliers)
+ var/preserved_data = null
+ for(var/B in C.required_reagents)
+ if(!preserved_data)
+ preserved_data = get_data(B)
+ remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1)
+
+ var/created_volume = C.result_amount*multiplier
+ if(C.result)
+ feedback_add_details("chemical_reaction","[C.result]|[C.result_amount*multiplier]")
+ multiplier = max(multiplier, 1) //this shouldnt happen ...
+ add_reagent(C.result, C.result_amount*multiplier)
+ set_data(C.result, preserved_data)
+
+ //add secondary products
+ for(var/S in C.secondary_results)
+ add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier)
+
+ var/list/seen = viewers(4, get_turf(my_atom))
+ for(var/mob/M in seen)
+ if(!C.no_message)
+ to_chat(M, "[bicon(my_atom)] [C.mix_message]")
+
+ if(istype(my_atom, /obj/item/slime_extract))
+ var/obj/item/slime_extract/ME2 = my_atom
+ ME2.Uses--
+ if(ME2.Uses <= 0) // give the notification that the slime core is dead
+ for(var/mob/M in seen)
+ to_chat(M, "[bicon(my_atom)] The [my_atom]'s power is consumed in the reaction.")
+ ME2.name = "used slime extract"
+ ME2.desc = "This extract has been used up."
+
+ playsound(get_turf(my_atom), C.mix_sound, 80, 1)
+
+ C.on_reaction(src, created_volume)
+ reaction_occured = 1
+ break
+
+ while(reaction_occured)
+ update_total()
+ return 0
+
+/datum/reagents/proc/isolate_reagent(reagent)
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if(R.id != reagent)
+ del_reagent(R.id)
+ update_total()
+
+/datum/reagents/proc/del_reagent(reagent)
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if(R.id == reagent)
+ if(isliving(my_atom))
+ var/mob/living/M = my_atom
+ R.on_mob_delete(M)
+ reagent_list -= A
+ qdel(A)
+ update_total()
+ my_atom.on_reagent_change()
+ return 0
+
+
+ return 1
+
+/datum/reagents/proc/update_total()
+ total_volume = 0
+ for(var/datum/reagent/R in reagent_list)
+ if(R.volume < 0.1)
+ del_reagent(R.id)
+ else
+ total_volume += R.volume
+
+ return 0
+
+/datum/reagents/proc/clear_reagents()
+ for(var/datum/reagent/R in reagent_list)
+ del_reagent(R.id)
+ return 0
+
+/datum/reagents/proc/reaction_check(mob/living/M, datum/reagent/R)
+ var/can_process = 0
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ //Check if this mob's species is set and can process this type of reagent
+ if(H.species && H.species.reagent_tag)
+ if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
+ can_process = 1
+ if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
+ can_process = 1
+ //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
+ if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
+ can_process = 1
+ if(H.species && H.species.exotic_blood)
+ if(R.id == H.species.exotic_blood)
+ can_process = 0
+ //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
+ else
+ if(R.process_flags != SYNTHETIC)
+ can_process = 1
+ return can_process
+
+/datum/reagents/proc/reaction(atom/A, method=TOUCH, volume_modifier = 1)
+ switch(method)
+ if(TOUCH)
+ for(var/datum/reagent/R in reagent_list)
+ if(isliving(A))
+ var/check = reaction_check(A, R)
+ if(!check)
+ continue
+ else
+ R.reaction_mob(A, TOUCH, R.volume*volume_modifier)
+ if(isturf(A))
+ R.reaction_turf(A, R.volume*volume_modifier)
+ if(isobj(A))
+ R.reaction_obj(A, R.volume*volume_modifier)
+ if(INGEST)
+ for(var/datum/reagent/R in reagent_list)
+ if(isliving(A))
+ var/check = reaction_check(A, R)
+ if(!check)
+ continue
+ else
+ R.reaction_mob(A, INGEST, R.volume*volume_modifier)
+ if(isturf(A))
+ R.reaction_turf(A, R.volume*volume_modifier)
+ if(isobj(A))
+ R.reaction_obj(A, R.volume*volume_modifier)
+
+/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15)
+ for(var/r_id in list_reagents)
+ var/amt = list_reagents[r_id]
+ add_reagent(r_id, amt, data)
+
+/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300)
+ if(!isnum(amount))
+ return 1
+ update_total()
+ if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
+ if(amount <= 0)
+ return 0
+ chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems
+
+ for(var/A in reagent_list)
+
+ var/datum/reagent/R = A
+ if(R.id == reagent)
+ R.volume += amount
+ update_total()
+ my_atom.on_reagent_change()
+ R.on_merge(data)
+ handle_reactions()
+ return 0
+
+ var/datum/reagent/D = chemical_reagents_list[reagent]
+ if(D)
+
+ var/datum/reagent/R = new D.type()
+ reagent_list += R
+ R.holder = src
+ R.volume = amount
+ if(data)
+ R.data = data
+ R.on_new(data)
+
+ update_total()
+ my_atom.on_reagent_change()
+ handle_reactions()
+ return 0
+ else
+ warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])")
+
+ handle_reactions()
+
+ return 1
+
+/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to
+
+ if(!isnum(amount))
+ return 1
+
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if(R.id == reagent)
+ R.volume -= amount
+ update_total()
+ if(!safety)//So it does not handle reactions when it need not to
+ handle_reactions()
+ my_atom.on_reagent_change()
+ return 0
+
+ return 1
+
+/datum/reagents/proc/has_reagent(reagent, amount = -1)
+
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if(R.id == reagent)
+ if(!amount)
+ return R
+ else
+ if(R.volume >= amount)
+ return R
+ else
+ return 0
+
+ return 0
+
+/datum/reagents/proc/get_reagent_amount(reagent)
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if(R.id == reagent)
+ return R.volume
+
+ return 0
+
+/datum/reagents/proc/get_reagents()
+ var/res = ""
+ for(var/datum/reagent/A in reagent_list)
+ if(res != "") res += ","
+ res += A.name
+
+ return res
+
+/datum/reagents/proc/get_reagent(type)
+ . = locate(type) in reagent_list
+
+/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included.
+ if(!isnum(amount))
+ return 1
+
+ var/has_removed_reagent = 0
+
+ for(var/datum/reagent/R in reagent_list)
+ var/matches = 0
+ // Switch between how we check the reagent type
+ if(strict)
+ if(R.type == reagent_type)
+ matches = 1
+ else
+ if(istype(R, reagent_type))
+ matches = 1
+ // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type.
+ if(matches)
+ // Have our other proc handle removement
+ has_removed_reagent = remove_reagent(R.id, amount, safety)
+
+ return has_removed_reagent
+
+// Admin logging.
+/datum/reagents/proc/get_reagent_ids(and_amount=0)
+ var/list/stuff = list()
+ for(var/datum/reagent/A in reagent_list)
+ if(and_amount)
+ stuff += "[get_reagent_amount(A.id)]U of [A.id]"
+ else
+ stuff += A.id
+ return english_list(stuff)
+
+//two helper functions to preserve data across reactions (needed for xenoarch)
+/datum/reagents/proc/get_data(reagent_id)
+ for(var/datum/reagent/D in reagent_list)
+ if(D.id == reagent_id)
+// to_chat(world, "proffering a data-carrying reagent ([reagent_id])")
+ return D.data
+
+/datum/reagents/proc/set_data(reagent_id, new_data)
+ for(var/datum/reagent/D in reagent_list)
+ if(D.id == reagent_id)
+// to_chat(world, "reagent data set ([reagent_id])")
+ D.data = new_data
+
+/datum/reagents/proc/copy_data(datum/reagent/current_reagent)
+ if(!current_reagent || !current_reagent.data)
+ return null
+ if(!istype(current_reagent.data, /list))
+ return current_reagent.data
+
+ var/list/trans_data = current_reagent.data.Copy()
+
+ // We do this so that introducing a virus to a blood sample
+ // doesn't automagically infect all other blood samples from
+ // the same donor.
+ //
+ // Technically we should probably copy all data lists, but
+ // that could possibly eat up a lot of memory needlessly
+ // if most data lists are read-only.
+ if(trans_data["viruses"])
+ var/list/v = trans_data["viruses"]
+ trans_data["viruses"] = v.Copy()
+
+ return trans_data
+
+// For random item spawning. Takes a list of paths, and returns the same list without anything that contains admin only reagents
+/proc/adminReagentCheck(list/incoming)
+ var/list/outgoing[0]
+ for(var/tocheck in incoming)
+ if(ispath(tocheck))
+ var/check = new tocheck
+ if(istype(check, /atom))
+ var/atom/reagentCheck = check
+ var/datum/reagents/reagents = reagentCheck.reagents
+ var/admin = 0
+ for(var/reag in reagents.reagent_list)
+ var/datum/reagent/reagent = reag
+ if(reagent.admin_only)
+ admin = 1
+ break
+ if(!(admin))
+ outgoing += tocheck
+ else
+ outgoing += tocheck
+ return outgoing
+
+///////////////////////////////////////////////////////////////////////////////////
+
+
+// Convenience proc to create a reagents holder for an atom
+// Max vol is maximum volume of holder
+atom/proc/create_reagents(max_vol)
+ reagents = new/datum/reagents(max_vol)
+ reagents.my_atom = src
+
+/datum/reagents/proc/get_reagent_from_id(id)
+ var/datum/reagent/result = null
+ for(var/datum/reagent/R in reagent_list)
+ if(R.id == id)
+ result = R
+ break
+ return result
+
+/datum/reagents/Destroy()
+ . = ..()
+ processing_objects.Remove(src)
+ for(var/datum/reagent/R in reagent_list)
+ qdel(R)
+ reagent_list.Cut()
+ reagent_list = null
+ if(my_atom && my_atom.reagents == src)
+ my_atom.reagents = null
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
new file mode 100644
index 00000000000..5103f246a27
--- /dev/null
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -0,0 +1,377 @@
+#define SOLID 1
+#define LIQUID 2
+#define GAS 3
+
+/obj/machinery/chem_dispenser
+ name = "chem dispenser"
+ density = 1
+ anchored = 1
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "dispenser"
+ use_power = 0
+ idle_power_usage = 40
+ var/ui_title = "Chem Dispenser 5000"
+ var/energy = 100
+ var/max_energy = 100
+ var/amount = 30
+ var/obj/item/weapon/reagent_containers/beaker = null
+ var/recharged = 0
+ var/hackedcheck = 0
+ var/list/dispensable_reagents = list("hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine",
+ "sodium", "aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron",
+ "copper", "mercury", "plasma", "radium", "water", "ethanol", "sugar", "iodine", "bromine", "silver")
+ var/list/hacked_reagents = list("toxin")
+ var/hack_message = "You disable the safety safeguards, enabling the \"Mad Scientist\" mode."
+ var/unhack_message = "You re-enable the safety safeguards, enabling the \"NT Standard\" mode."
+ var/list/broken_requirements = list()
+ var/broken_on_spawn = 0
+ var/recharge_delay = 5
+ var/image/icon_beaker = null //cached overlay
+
+
+/obj/machinery/chem_dispenser/proc/recharge()
+ if(stat & (BROKEN|NOPOWER)) return
+ var/addenergy = 1
+ var/oldenergy = energy
+ energy = min(energy + addenergy, max_energy)
+ if(energy != oldenergy)
+ use_power(1500) // This thing uses up alot of power (this is still low as shit for creating reagents from thin air)
+ nanomanager.update_uis(src) // update all UIs attached to src
+
+/obj/machinery/chem_dispenser/power_change()
+ if(powered())
+ stat &= ~NOPOWER
+ else
+ spawn(rand(0, 15))
+ stat |= NOPOWER
+ nanomanager.update_uis(src) // update all UIs attached to src
+
+/obj/machinery/chem_dispenser/process()
+
+ if(recharged < 0)
+ recharge()
+ recharged = recharge_delay
+ else
+ recharged -= 1
+
+/obj/machinery/chem_dispenser/New()
+ ..()
+ recharge()
+ dispensable_reagents = sortList(dispensable_reagents)
+
+ if(broken_on_spawn)
+ overlays.Cut()
+ var/amount = pick(3,3,4)
+ var/list/options = list()
+ options[/obj/item/weapon/stock_parts/capacitor/adv] = "Add an advanced capacitor to fix it."
+ options[/obj/item/weapon/stock_parts/console_screen] = "Replace the console screen to fix it."
+ options[/obj/item/weapon/stock_parts/manipulator/pico] = "Upgrade to a pico manipulator to fix it."
+ options[/obj/item/weapon/stock_parts/matter_bin/super] = "Give it a super matter bin to fix it."
+ options[/obj/item/weapon/stock_parts/cell/super] = "Replace the reagent synthesizer with a super capacity cell to fix it."
+ options[/obj/item/device/mass_spectrometer/adv] = "Replace the reagent scanner with an advanced mass spectrometer to fix it"
+ options[/obj/item/weapon/stock_parts/micro_laser/high] = "Repair the reagent synthesizer with an high-power micro-laser to fix it"
+ options[/obj/item/device/reagent_scanner/adv] = "Replace the reagent scanner with an advanced reagent scanner to fix it"
+ options[/obj/item/stack/nanopaste] = "Apply some nanopaste to the broken nozzles to fix it."
+ options[/obj/item/stack/sheet/plasteel] = "Surround the outside with a plasteel cover to fix it."
+ options[/obj/item/stack/sheet/rglass] = "Insert a pane of reinforced glass to fix it."
+
+ while(amount > 0)
+ amount -= 1
+
+ var/index = pick(options)
+ broken_requirements[index] = options[index]
+ options -= index
+
+
+/obj/machinery/chem_dispenser/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ qdel(src)
+ return
+ if(2.0)
+ if(prob(50))
+ qdel(src)
+ return
+
+/obj/machinery/chem_dispenser/blob_act()
+ if(prob(50))
+ qdel(src)
+
+ /**
+ * The ui_interact proc is used to open and update Nano UIs
+ * If ui_interact is not used then the UI will not update correctly
+ * ui_interact is currently defined for /atom/movable
+ *
+ * @param user /mob The mob who is interacting with this ui
+ * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
+ *
+ * @return nothing
+ */
+
+/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ if(broken_requirements.len)
+ to_chat(user, "[src] is broken. [broken_requirements[broken_requirements[1]]]")
+ return
+
+
+ // this is the data which will be sent to the ui
+ var/data[0]
+ data["amount"] = amount
+ data["energy"] = round(energy)
+ data["maxEnergy"] = round(max_energy)
+ data["isBeakerLoaded"] = beaker ? 1 : 0
+
+ var beakerContents[0]
+ var beakerCurrentVolume = 0
+ if(beaker && beaker.reagents && beaker.reagents.reagent_list.len)
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
+ beakerContents.Add(list(list("name" = R.name, "id"=R.id, "volume" = R.volume))) // list in a list because Byond merges the first list...
+ beakerCurrentVolume += R.volume
+ data["beakerContents"] = beakerContents
+
+ if(beaker)
+ data["beakerCurrentVolume"] = beakerCurrentVolume
+ data["beakerMaxVolume"] = beaker.volume
+ else
+ data["beakerCurrentVolume"] = null
+ data["beakerMaxVolume"] = null
+
+ var chemicals[0]
+ for(var/re in dispensable_reagents)
+ var/datum/reagent/temp = chemical_reagents_list[re]
+ if(temp)
+ chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list...
+ data["chemicals"] = chemicals
+
+ // update the ui if it exists, returns null if no ui is passed/found
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ // the ui does not exist, so we'll create a new() one
+ // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
+ ui = new(user, src, ui_key, "chem_dispenser.tmpl", ui_title, 390, 655)
+ // when the ui is first opened this is the data it will use
+ ui.set_initial_data(data)
+ // open the new ui window
+ ui.open()
+
+/obj/machinery/chem_dispenser/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["amount"])
+ amount = round(text2num(href_list["amount"]), 5) // round to nearest 5
+ if(amount < 0) // Since the user can actually type the commands himself, some sanity checking
+ amount = 0
+ if(amount > 100)
+ amount = 100
+
+ if(href_list["dispense"])
+ if(dispensable_reagents.Find(href_list["dispense"]) && beaker != null)
+ var/obj/item/weapon/reagent_containers/glass/B = beaker
+ var/datum/reagents/R = B.reagents
+ var/space = R.maximum_volume - R.total_volume
+
+ R.add_reagent(href_list["dispense"], min(amount, energy * 10, space))
+ energy = max(energy - min(amount, energy * 10, space) / 10, 0)
+ overlays.Cut()
+ icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position.
+ icon_beaker.pixel_x = rand(-10,5)
+ overlays += icon_beaker
+
+ if(href_list["remove"])
+ if(beaker)
+ if(href_list["removeamount"])
+ var/amount = text2num(href_list["removeamount"])
+ if(isnum(amount) && (amount > 0))
+ var/obj/item/weapon/reagent_containers/glass/B = beaker
+ var/datum/reagents/R = B.reagents
+ var/id = href_list["remove"]
+ R.remove_reagent(id, amount)
+
+ if(href_list["ejectBeaker"])
+ if(beaker)
+ var/obj/item/weapon/reagent_containers/glass/B = beaker
+ B.forceMove(loc)
+ beaker = null
+ overlays.Cut()
+ add_fingerprint(usr)
+ return 1 // update UIs attached to this object
+
+/obj/machinery/chem_dispenser/attackby(obj/item/weapon/reagent_containers/B, mob/user, params)
+ if(isrobot(user))
+ return
+
+ if(broken_requirements.len && B.type == broken_requirements[1])
+ if(istype(B,/obj/item/stack))
+ var/obj/item/stack/S = B
+ S.use(1)
+ else
+ if(!user.drop_item())
+ to_chat(user, "[B] is stuck to you!")
+ return
+ qdel(B)
+ broken_requirements -= broken_requirements[1]
+ to_chat(user, "You fix [src].")
+ return
+
+ if(beaker)
+ to_chat(user, "Something is already loaded into the machine.")
+ return
+
+ if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks))
+ beaker = B
+ if(!user.drop_item())
+ to_chat(user, "[B] is stuck to you!")
+ return
+ B.forceMove(src)
+ to_chat(user, "You set [B] on the machine.")
+ nanomanager.update_uis(src) // update all UIs attached to src
+ if(!icon_beaker)
+ icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position.
+ icon_beaker.pixel_x = rand(-10,5)
+ overlays += icon_beaker
+ return
+
+/obj/machinery/chem_dispenser/attackby(obj/item/weapon/B, mob/user, params)
+ ..()
+ if(istype(B, /obj/item/device/multitool))
+ if(hackedcheck == 0)
+ to_chat(user, hack_message)
+ dispensable_reagents += hacked_reagents
+ hackedcheck = 1
+ return
+
+ else
+ to_chat(user, unhack_message)
+ dispensable_reagents -= hacked_reagents
+ hackedcheck = 0
+ return
+
+/obj/machinery/chem_dispenser/attack_ai(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/chem_dispenser/attack_ghost(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/chem_dispenser/attack_hand(mob/user)
+ if(stat & BROKEN)
+ return
+
+ ui_interact(user)
+
+/obj/machinery/chem_dispenser/soda
+ icon_state = "soda_dispenser"
+ name = "soda fountain"
+ desc = "A drink fabricating machine, capable of producing many sugary drinks with just one touch."
+ ui_title = "Soda Dispens-o-matic"
+ energy = 100
+ max_energy = 100
+ dispensable_reagents = list("water", "ice", "milk", "soymilk", "coffee", "tea", "hot_coco", "cola", "spacemountainwind", "dr_gibb", "space_up",
+ "tonic", "sodawater", "lemon_lime", "grapejuice", "sugar", "orangejuice", "lemonjuice", "limejuice", "tomatojuice", "banana",
+ "watermelonjuice", "carrotjuice", "potato", "berryjuice")
+ hack_message = "You change the mode from 'McNano' to 'Pizza King'."
+ unhack_message = "You change the mode from 'Pizza King' to 'McNano'."
+ hacked_reagents = list("thirteenloko")
+
+/obj/machinery/chem_dispenser/beer
+ icon_state = "booze_dispenser"
+ name = "booze dispenser"
+ ui_title = "Booze Portal 9001"
+ energy = 100
+ max_energy = 100
+ desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
+ dispensable_reagents = list("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequila", "vermouth", "cognac", "ale", "mead", "synthanol")
+ hack_message = "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes."
+ unhack_message = "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes."
+ hacked_reagents = list("goldschlager", "patron", "absinthe", "ethanol", "nothing")
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/obj/machinery/chem_dispenser/constructable
+ name = "portable chem dispenser"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "minidispenser"
+ energy = 5
+ max_energy = 5
+ amount = 5
+ recharge_delay = 10
+ dispensable_reagents = list()
+ var/list/special_reagents = list(list("hydrogen", "oxygen", "silicon", "phosphorus", "sulfur", "carbon", "nitrogen", "water"),
+ list("lithium", "sugar", "copper", "mercury", "sodium","iodine","bromine"),
+ list("ethanol", "chlorine", "potassium", "aluminum","plasma", "radium", "fluorine", "iron", "silver"),
+ list("oil", "ash", "acetone", "saltpetre", "ammonia", "diethylamine", "fuel"))
+
+/obj/machinery/chem_dispenser/constructable/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/weapon/stock_parts/cell/super(null)
+ RefreshParts()
+
+/obj/machinery/chem_dispenser/constructable/upgraded/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(null)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/weapon/stock_parts/cell/hyper(null)
+ RefreshParts()
+
+/obj/machinery/chem_dispenser/constructable/RefreshParts()
+ var/time = 0
+ var/temp_energy = 0
+ var/i
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ temp_energy += M.rating
+ temp_energy--
+ max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest
+ for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
+ time += C.rating
+ for(var/obj/item/weapon/stock_parts/cell/P in component_parts)
+ time += round(P.maxcharge, 10000) / 10000
+ recharge_delay = 10 / (time/2) //delay between recharges, double the usual time on lowest 33% less than usual on highest
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ for(i=1, i<=M.rating, i++)
+ dispensable_reagents = sortList(dispensable_reagents | special_reagents[i])
+
+/obj/machinery/chem_dispenser/constructable/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/reagent_containers/glass))
+ if(panel_open)
+ to_chat(user, "Close the maintenance panel first.")
+ return
+ ..()
+ else
+ ..()
+
+ if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I))
+ return
+
+ if(exchange_parts(user, I))
+ return
+
+ if(istype(I, /obj/item/weapon/wrench))
+ playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ if(anchored)
+ anchored = 0
+ to_chat(user, "[src] can now be moved.")
+ else if(!anchored)
+ anchored = 1
+ to_chat(user, "[src] is now secured.")
+
+ if(panel_open)
+ if(istype(I, /obj/item/weapon/crowbar))
+ if(beaker)
+ var/obj/item/weapon/reagent_containers/glass/B = beaker
+ B.forceMove(loc)
+ beaker = null
+ default_deconstruction_crowbar(I)
+ return 1
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
similarity index 100%
rename from code/modules/reagents/newchem/chem_heater.dm
rename to code/modules/reagents/chemistry/machinery/chem_heater.dm
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
new file mode 100644
index 00000000000..b6b0de6e0a0
--- /dev/null
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -0,0 +1,415 @@
+/obj/machinery/chem_master
+ name = "\improper ChemMaster 3000"
+ density = 1
+ anchored = 1
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "mixer0"
+ use_power = 1
+ idle_power_usage = 20
+ var/obj/item/weapon/reagent_containers/beaker = null
+ var/obj/item/weapon/storage/pill_bottle/loaded_pill_bottle = null
+ var/mode = 0
+ var/condi = 0
+ var/useramount = 30 // Last used amount
+ var/pillamount = 10
+ var/patchamount = 10
+ var/bottlesprite = "bottle"
+ var/pillsprite = "1"
+ var/client/has_sprites = list()
+ var/printing = null
+
+/obj/machinery/chem_master/New()
+ create_reagents(100)
+ overlays += "waitlight"
+
+/obj/machinery/chem_master/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ qdel(src)
+ return
+ if(2.0)
+ if(prob(50))
+ qdel(src)
+ return
+
+/obj/machinery/chem_master/blob_act()
+ if(prob(50))
+ qdel(src)
+
+/obj/machinery/chem_master/power_change()
+ if(powered())
+ stat &= ~NOPOWER
+ else
+ spawn(rand(0, 15))
+ stat |= NOPOWER
+
+/obj/machinery/chem_master/attackby(obj/item/weapon/B, mob/user, params)
+
+ if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
+
+ if(beaker)
+ to_chat(user, "A beaker is already loaded into the machine.")
+ return
+ if(!user.drop_item())
+ to_chat(user, "[B] is stuck to you!")
+ return
+ beaker = B
+ B.forceMove(src)
+ to_chat(user, "You add the beaker to the machine!")
+ nanomanager.update_uis(src)
+ icon_state = "mixer1"
+
+ else if(istype(B, /obj/item/weapon/storage/pill_bottle))
+
+ if(loaded_pill_bottle)
+ to_chat(user, "A pill bottle is already loaded into the machine.")
+ return
+
+ if(!user.drop_item())
+ to_chat(user, "[B] is stuck to you!")
+ return
+ loaded_pill_bottle = B
+ B.forceMove(src)
+ to_chat(user, "You add the pill bottle into the dispenser slot!")
+ nanomanager.update_uis(src)
+ return
+
+/obj/machinery/chem_master/Topic(href, href_list)
+ if(..())
+ return 1
+
+ add_fingerprint(usr)
+ usr.set_machine(src)
+
+
+ if(href_list["ejectp"])
+ if(loaded_pill_bottle)
+ loaded_pill_bottle.forceMove(loc)
+ loaded_pill_bottle = null
+ else if(href_list["close"])
+ usr << browse(null, "window=chem_master")
+ onclose(usr, "chem_master")
+ usr.unset_machine()
+ return
+
+ if(href_list["print_p"])
+ if(!(printing))
+ printing = 1
+ visible_message("[src] rattles and prints out a sheet of paper.")
+ playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
+ P.info = "Chemical Analysis "
+ P.info += "Time of analysis: [worldtime2text(world.time)]
"
+ P.info += "Chemical name: [href_list["name"]] "
+ if(href_list["name"] == "Blood")
+ var/datum/reagents/R = beaker.reagents
+ var/datum/reagent/blood/G
+ for(var/datum/reagent/F in R.reagent_list)
+ if(F.name == href_list["name"])
+ G = F
+ break
+ var/B = G.data["blood_type"]
+ var/C = G.data["blood_DNA"]
+ P.info += "Description: Blood Type: [B] DNA: [C]"
+ else
+ P.info += "Description: [href_list["desc"]]"
+ P.info += "
Notes: "
+ P.name = "Chemical Analysis - [href_list["name"]]"
+ printing = null
+
+ if(beaker)
+ var/datum/reagents/R = beaker.reagents
+ if(href_list["analyze"])
+ var/dat = ""
+ if(!condi)
+ if(href_list["name"] == "Blood")
+ var/datum/reagent/blood/G
+ for(var/datum/reagent/F in R.reagent_list)
+ if(F.name == href_list["name"])
+ G = F
+ break
+ var/A = G.name
+ var/B = G.data["blood_type"]
+ var/C = G.data["blood_DNA"]
+ dat += "Chemmaster 3000Chemical infos:
Name: [A]
Description: Blood Type: [B] DNA: [C]"
+ else
+ dat += "Chemmaster 3000Chemical infos:
Name: [href_list["name"]]
Description: [href_list["desc"]]"
+ dat += "
(Print Analysis) "
+ dat += "(Back)"
+ else
+ dat += "Condimaster 3000Condiment infos:
Name: [href_list["name"]]
Description: [href_list["desc"]]
(Back)"
+ usr << browse(dat, "window=chem_master;size=575x400")
+ return
+
+ else if(href_list["add"])
+
+ if(href_list["amount"])
+ var/id = href_list["add"]
+ var/amount = text2num(href_list["amount"])
+ R.trans_id_to(src, id, amount)
+
+ else if(href_list["addcustom"])
+
+ var/id = href_list["addcustom"]
+ useramount = input("Select the amount to transfer.", 30, useramount) as num
+ useramount = isgoodnumber(useramount)
+ Topic(null, list("amount" = "[useramount]", "add" = "[id]"))
+
+ else if(href_list["remove"])
+
+ if(href_list["amount"])
+ var/id = href_list["remove"]
+ var/amount = text2num(href_list["amount"])
+ if(mode)
+ reagents.trans_id_to(beaker, id, amount)
+ else
+ reagents.remove_reagent(id, amount)
+
+
+ else if(href_list["removecustom"])
+
+ var/id = href_list["removecustom"]
+ useramount = input("Select the amount to transfer.", 30, useramount) as num
+ useramount = isgoodnumber(useramount)
+ Topic(null, list("amount" = "[useramount]", "remove" = "[id]"))
+
+ else if(href_list["toggle"])
+ mode = !mode
+
+ else if(href_list["main"])
+ attack_hand(usr)
+ return
+ else if(href_list["eject"])
+ if(beaker)
+ beaker.forceMove(get_turf(src))
+ beaker = null
+ reagents.clear_reagents()
+ icon_state = "mixer0"
+ else if(href_list["createpill"] || href_list["createpill_multiple"])
+ if(!condi)
+ var/count = 1
+ if(href_list["createpill_multiple"])
+ count = input("Select the number of pills to make.", 10, pillamount) as num|null
+ if(count == null)
+ return
+ count = isgoodnumber(count)
+ if(count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines?
+ if(count <= 0) return
+ var/amount_per_pill = reagents.total_volume/count
+ if(amount_per_pill > 50) amount_per_pill = 50
+ var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill]u)") as text|null
+ if(!name)
+ return
+ name = reject_bad_text(name)
+ while(count--)
+ var/obj/item/weapon/reagent_containers/food/pill/P = new/obj/item/weapon/reagent_containers/food/pill(loc)
+ if(!name) name = reagents.get_master_reagent_name()
+ P.name = "[name] pill"
+ P.pixel_x = rand(-7, 7) //random position
+ P.pixel_y = rand(-7, 7)
+ P.icon_state = "pill"+pillsprite
+ reagents.trans_to(P,amount_per_pill)
+ if(loaded_pill_bottle)
+ if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots)
+ P.forceMove(loaded_pill_bottle)
+ updateUsrDialog()
+ else
+ var/name = input(usr,"Name:","Name your bag!",reagents.get_master_reagent_name()) as text|null
+ if(!name)
+ return
+ name = reject_bad_text(name)
+ var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(loc)
+ if(!name) name = reagents.get_master_reagent_name()
+ P.originalname = name
+ P.name = "[name] pack"
+ P.desc = "A small condiment pack. The label says it contains [name]."
+ reagents.trans_to(P,10)
+ else if(href_list["createpatch"] || href_list["createpatch_multiple"])
+ if(!condi)
+ var/count = 1
+ if(href_list["createpatch_multiple"])
+ count = input("Select the number of patches to make.", 10, patchamount) as num|null
+ if(count == null)
+ return
+ count = isgoodnumber(count)
+ if(!count || count <= 0)
+ return
+ if(count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines?
+ var/amount_per_patch = reagents.total_volume/count
+ if(amount_per_patch > 40) amount_per_patch = 40
+ var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch]u)") as text|null
+ if(!name)
+ return
+ name = reject_bad_text(name)
+ var/is_medical_patch = chemical_safety_check(reagents)
+ while(count--)
+ var/obj/item/weapon/reagent_containers/food/pill/patch/P = new/obj/item/weapon/reagent_containers/food/pill/patch(loc)
+ if(!name) name = reagents.get_master_reagent_name()
+ P.name = "[name] patch"
+ P.pixel_x = rand(-7, 7) //random position
+ P.pixel_y = rand(-7, 7)
+ reagents.trans_to(P,amount_per_patch)
+ if(is_medical_patch)
+ P.instant_application = 1
+ P.icon_state = "bandaid_med"
+ else if(href_list["createbottle"])
+ if(!condi)
+ var/name = input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()) as text|null
+ if(!name)
+ return
+ name = reject_bad_text(name)
+ var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(loc)
+ if(!name) name = reagents.get_master_reagent_name()
+ P.name = "[name] bottle"
+ P.pixel_x = rand(-7, 7) //random position
+ P.pixel_y = rand(-7, 7)
+ P.icon_state = bottlesprite
+ reagents.trans_to(P,30)
+ else
+ var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(loc)
+ reagents.trans_to(P,50)
+ else if(href_list["change_pill"])
+ #define MAX_PILL_SPRITE 20 //max icon state of the pill sprites
+ var/dat = ""
+ var/j = 0
+ for(var/i = 1 to MAX_PILL_SPRITE)
+ j++
+ if(j == 1)
+ dat += ""
+ dat += " | "
+ if(j == 5)
+ dat += " "
+ j = 0
+ dat += " "
+ usr << browse(dat, "window=chem_master_iconsel;size=225x193")
+ return
+ else if(href_list["change_bottle"])
+ var/dat = ""
+ var/j = 0
+ for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle"))
+ j++
+ if(j == 1)
+ dat += ""
+ dat += " | "
+ if(j == 5)
+ dat += " "
+ j = 0
+ dat += " "
+ usr << browse(dat, "window=chem_master_iconsel;size=225x193")
+ return
+ else if(href_list["pill_sprite"])
+ pillsprite = href_list["pill_sprite"]
+ usr << browse(null, "window=chem_master_iconsel")
+ else if(href_list["bottle_sprite"])
+ bottlesprite = href_list["bottle_sprite"]
+ usr << browse(null, "window=chem_master_iconsel")
+
+ nanomanager.update_uis(src)
+ return
+
+/obj/machinery/chem_master/attack_ai(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/chem_master/attack_ghost(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/chem_master/attack_hand(mob/user)
+ if(..())
+ return 1
+ ui_interact(user)
+ return
+
+/obj/machinery/chem_master/ui_interact(mob/user, ui_key="main", datum/nanoui/ui = null, force_open = 1)
+
+ var/datum/asset/chem_master/assets = get_asset_datum(/datum/asset/chem_master)
+ assets.send(user)
+
+ var/data = list()
+
+ data["condi"] = condi
+ data["loaded_pill_bottle"] = (loaded_pill_bottle ? 1 : 0)
+ if(loaded_pill_bottle)
+ data["loaded_pill_bottle_contents_len"] = loaded_pill_bottle.contents.len
+ data["loaded_pill_bottle_storage_slots"] = loaded_pill_bottle.storage_slots
+
+ data["beaker"] = (beaker ? 1 : 0)
+ if(beaker)
+ var/list/beaker_reagents_list = list()
+ data["beaker_reagents"] = beaker_reagents_list
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
+ beaker_reagents_list[++beaker_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description)
+ var/list/buffer_reagents_list = list()
+ data["buffer_reagents"] = buffer_reagents_list
+ for(var/datum/reagent/R in reagents.reagent_list)
+ buffer_reagents_list[++buffer_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description)
+
+ data["pillsprite"] = pillsprite
+ data["bottlesprite"] = bottlesprite
+ data["mode"] = mode
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "chem_master.tmpl", name, 575, 400)
+ ui.set_initial_data(data)
+ ui.open()
+
+/obj/machinery/chem_master/proc/isgoodnumber(num)
+ if(isnum(num))
+ if(num > 200)
+ num = 200
+ else if(num < 0)
+ num = 1
+ else
+ num = round(num)
+ return num
+ else
+ return 0
+
+/obj/machinery/chem_master/proc/chemical_safety_check(datum/reagents/R)
+ var/all_safe = 1
+ for(var/datum/reagent/A in R.reagent_list)
+ if(!safe_chem_list.Find(A.id))
+ all_safe = 0
+ return all_safe
+
+/obj/machinery/chem_master/condimaster
+ name = "\improper CondiMaster 3000"
+ condi = 1
+
+/obj/machinery/chem_master/constructable
+ name = "ChemMaster 2999"
+ desc = "Used to seperate chemicals and distribute them in a variety of forms."
+
+/obj/machinery/chem_master/constructable/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/chem_master(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
+ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
+
+/obj/machinery/chem_master/constructable/attackby(obj/item/B, mob/user, params)
+
+ if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B))
+ if(beaker)
+ beaker.forceMove(get_turf(src))
+ beaker = null
+ reagents.clear_reagents()
+ if(loaded_pill_bottle)
+ loaded_pill_bottle.forceMove(get_turf(src))
+ loaded_pill_bottle = null
+ return
+
+ if(exchange_parts(user, B))
+ return
+
+ if(panel_open)
+ if(istype(B, /obj/item/weapon/crowbar))
+ default_deconstruction_crowbar(B)
+ return 1
+ else
+ to_chat(user, "You can't use the [name] while it's panel is opened!")
+ return 1
+ else
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
similarity index 99%
rename from code/modules/reagents/pandemic.dm
rename to code/modules/reagents/chemistry/machinery/pandemic.dm
index 1f801d0ace5..1aa72ac0918 100644
--- a/code/modules/reagents/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -293,5 +293,4 @@
..()
return
else
- ..()
- return
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
new file mode 100644
index 00000000000..38cfdf4b0ae
--- /dev/null
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -0,0 +1,415 @@
+/obj/machinery/reagentgrinder
+ name = "\improper All-In-One Grinder"
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "juicer1"
+ layer = 2.9
+ density = 1
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 5
+ active_power_usage = 100
+ var/inuse = 0
+ var/obj/item/weapon/reagent_containers/beaker = null
+ var/limit = 10
+
+ //IMPORTANT NOTE! A negative number is a multiplier, a positive number is a flat amount to add. 0 means equal to the amount of the original reagent
+ var/list/blend_items = list (
+
+ //Sheets
+ /obj/item/stack/sheet/mineral/plasma = list("plasma_dust" = 20),
+ /obj/item/stack/sheet/mineral/uranium = list("uranium" = 20),
+ /obj/item/stack/sheet/mineral/bananium = list("banana" = 20),
+ /obj/item/stack/sheet/mineral/tranquillite = list("nothing" = 20),
+ /obj/item/stack/sheet/mineral/silver = list("silver" = 20),
+ /obj/item/stack/sheet/mineral/gold = list("gold" = 20),
+ /obj/item/weapon/grown/novaflower = list("capsaicin" = 0),
+
+ //archaeology!
+ ///obj/item/weapon/rocksliver = list("ground_rock" = 50),
+
+
+ //All types that you can put into the grinder to transfer the reagents to the beaker. !Put all recipes above this.!
+ /obj/item/weapon/reagent_containers/food = list(),
+ /obj/item/weapon/reagent_containers/honeycomb = list()
+ )
+
+ var/list/blend_tags = list (
+ "nettle" = list("sacid" = 0),
+ "deathnettle" = list("facid" = 0),
+ "soybeans" = list("soymilk" = 0),
+ "tomato" = list("ketchup" = 0),
+ "wheat" = list("flour" = -5),
+ "rice" = list("rice" = -5),
+ "cherries" = list("cherryjelly" = 0),
+ )
+
+ var/list/juice_items = list (
+ /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0),
+ )
+
+ var/list/juice_tags = list (
+ "tomato" = list("tomatojuice" = 0),
+ "carrot" = list("carrotjuice" = 0),
+ "berries" = list("berryjuice" = 0),
+ "banana" = list("banana" = 0),
+ "potato" = list("potato" = 0),
+ "lemon" = list("lemonjuice" = 0),
+ "orange" = list("orangejuice" = 0),
+ "lime" = list("limejuice" = 0),
+ "poisonberries" = list("poisonberryjuice" = 0),
+ "grapes" = list("grapejuice" = 0),
+ "corn" = list("cornoil" = 0),
+ )
+
+ var/list/holdingitems = list()
+
+/obj/machinery/reagentgrinder/New()
+ ..()
+ beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
+ return
+
+/obj/machinery/reagentgrinder/update_icon()
+ icon_state = "juicer"+num2text(!isnull(beaker))
+ return
+
+/obj/machinery/reagentgrinder/attackby(obj/item/O, mob/user, params)
+
+ if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
+ istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \
+ istype(O,/obj/item/weapon/reagent_containers/food/drinks/shaker))
+
+ if(beaker)
+ return 1
+ else
+ if(!user.drop_item())
+ to_chat(user, "[O] is stuck to you!")
+ return
+ beaker = O
+ O.forceMove(src)
+ update_icon()
+ updateUsrDialog()
+ return 0
+
+ if(holdingitems && holdingitems.len >= limit)
+ to_chat(usr, "The machine cannot hold anymore items.")
+ return 1
+
+ //Fill machine with a plantbag!
+ if(istype(O, /obj/item/weapon/storage/bag/plants))
+ var/obj/item/weapon/storage/bag/plants/PB = O
+ for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in PB.contents)
+ PB.remove_from_storage(G, src)
+ holdingitems += G
+ if(holdingitems && holdingitems.len >= limit) //Sanity checking so the blender doesn't overfill
+ to_chat(user, "You empty [PB] into the All-In-One grinder.")
+
+ updateUsrDialog()
+ return 0
+
+
+ if(!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items))
+ to_chat(user, "Cannot refine into a reagent.")
+ return 1
+
+ user.unEquip(O)
+ O.forceMove(src)
+ holdingitems += O
+ updateUsrDialog()
+ return 0
+
+/obj/machinery/reagentgrinder/attack_ai(mob/user)
+ return 0
+
+/obj/machinery/reagentgrinder/attack_hand(mob/user)
+ user.set_machine(src)
+ interact(user)
+
+/obj/machinery/reagentgrinder/interact(mob/user) // The microwave Menu
+ var/is_chamber_empty = 0
+ var/is_beaker_ready = 0
+ var/processing_chamber = ""
+ var/beaker_contents = ""
+ var/dat = ""
+
+ if(!inuse)
+ for(var/obj/item/O in holdingitems)
+ processing_chamber += "\A [O.name] "
+
+ if(!processing_chamber)
+ is_chamber_empty = 1
+ processing_chamber = "Nothing."
+ if(!beaker)
+ beaker_contents = "No beaker attached. "
+ else
+ is_beaker_ready = 1
+ beaker_contents = "The beaker contains: "
+ var/anything = 0
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
+ anything = 1
+ beaker_contents += "[R.volume] - [R.name] "
+ if(!anything)
+ beaker_contents += "Nothing "
+
+
+ dat = {"
+ Processing chamber contains:
+ [processing_chamber]
+ [beaker_contents]
+ "}
+ if(is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
+ dat += "Grind the reagents "
+ dat += "Juice the reagents
"
+ if(holdingitems && holdingitems.len > 0)
+ dat += "Eject the reagents "
+ if(beaker)
+ dat += "Detach the beaker "
+ else
+ dat += "Please wait..."
+ user << browse("All-In-One Grinder[dat]", "window=reagentgrinder")
+ onclose(user, "reagentgrinder")
+ return
+
+/obj/machinery/reagentgrinder/Topic(href, href_list)
+ if(..())
+ return
+ usr.set_machine(src)
+ switch(href_list["action"])
+ if("grind")
+ grind()
+ if("juice")
+ juice()
+ if("eject")
+ eject()
+ if("detach")
+ detach()
+ updateUsrDialog()
+ return
+
+/obj/machinery/reagentgrinder/proc/detach()
+
+ if(usr.stat != 0)
+ return
+ if(!beaker)
+ return
+ beaker.forceMove(loc)
+ beaker = null
+ update_icon()
+
+/obj/machinery/reagentgrinder/proc/eject()
+
+ if(usr.stat != 0)
+ return
+ if(holdingitems && holdingitems.len == 0)
+ return
+
+ for(var/obj/item/O in holdingitems)
+ O.forceMove(loc)
+ holdingitems -= O
+ holdingitems = list()
+
+/obj/machinery/reagentgrinder/proc/is_allowed(obj/item/weapon/reagent_containers/O)
+ for(var/i in blend_items)
+ if(istype(O, i))
+ return 1
+ return 0
+
+/obj/machinery/reagentgrinder/proc/get_allowed_by_id(obj/item/weapon/grown/O)
+ for(var/i in blend_items)
+ if(istype(O, i))
+ return blend_items[i]
+
+/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_id(obj/item/weapon/reagent_containers/food/snacks/O)
+ for(var/i in blend_items)
+ if(istype(O, i))
+ return blend_items[i]
+
+/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_id(obj/item/weapon/reagent_containers/food/snacks/O)
+ for(var/i in juice_items)
+ if(istype(O, i))
+ return juice_items[i]
+
+/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O)
+ for(var/i in blend_tags)
+ if(O.seed.kitchen_tag == i)
+ return blend_tags[i]
+
+/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O)
+ for(var/i in juice_tags)
+ if(O.seed.kitchen_tag == i)
+ return juice_tags[i]
+
+/obj/machinery/reagentgrinder/proc/get_grownweapon_amount(obj/item/weapon/grown/O)
+ if(!istype(O))
+ return 5
+ else if(O.potency == -1)
+ return 5
+ else
+ return round(O.potency)
+
+/obj/machinery/reagentgrinder/proc/get_juice_amount(obj/item/weapon/reagent_containers/food/snacks/grown/O)
+ if(!istype(O))
+ return 5
+ else if(O.potency == -1)
+ return 5
+ else
+ return round(5*sqrt(O.potency))
+
+/obj/machinery/reagentgrinder/proc/remove_object(obj/item/O)
+ holdingitems -= O
+ qdel(O)
+
+/obj/machinery/reagentgrinder/proc/juice()
+ power_change()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
+ return
+ playsound(loc, 'sound/machines/juicer.ogg', 20, 1)
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
+ inuse = 1
+ spawn(50)
+ pixel_x = initial(pixel_x) //return to its spot after shaking
+ inuse = 0
+ interact(usr)
+ //Snacks
+ for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+
+ var/allowed = null
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
+ allowed = get_allowed_juice_by_tag(O)
+ else
+ allowed = get_allowed_juice_by_id(O)
+ if(isnull(allowed))
+ break
+
+ for(var/r_id in allowed)
+
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ var/amount = get_juice_amount(O)
+
+ beaker.reagents.add_reagent(r_id, min(amount, space))
+
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+
+ remove_object(O)
+
+/obj/machinery/reagentgrinder/proc/grind()
+
+ power_change()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
+ return
+ playsound(loc, 'sound/machines/blender.ogg', 50, 1)
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
+ inuse = 1
+ spawn(60)
+ pixel_x = initial(pixel_x) //return to its spot after shaking
+ inuse = 0
+ interact(usr)
+ //Snacks and Plants
+ for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+
+ var/allowed = null
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
+ allowed = get_allowed_snack_by_tag(O)
+ else
+ allowed = get_allowed_snack_by_id(O)
+ if(isnull(allowed))
+ break
+
+ for(var/r_id in allowed)
+
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ var/amount = allowed[r_id]
+ if(amount <= 0) //Negative amounts are multipliers for the reagent amount (Example: "amount = -5" means "reagent_amount * 5")
+ if(amount == 0)
+ if(O.reagents != null && O.reagents.has_reagent("nutriment"))
+ beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space))
+ O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
+ if(O.reagents != null && O.reagents.has_reagent("plantmatter"))
+ beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("plantmatter"), space))
+ O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
+ else
+ if(O.reagents != null && O.reagents.has_reagent("nutriment"))
+ beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), space))
+ O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
+ if(O.reagents != null && O.reagents.has_reagent("plantmatter"))
+ beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("plantmatter")*abs(amount)), space))
+ O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
+
+ else
+ O.reagents.trans_id_to(beaker, r_id, min(amount, space))
+
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+
+ if(O.reagents.reagent_list.len == 0)
+ remove_object(O)
+
+ //Sheets
+ for(var/obj/item/stack/sheet/O in holdingitems)
+ var/allowed = get_allowed_by_id(O)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ for(var/i = 1; i <= round(O.amount, 1); i++)
+ for(var/r_id in allowed)
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ var/amount = allowed[r_id]
+ beaker.reagents.add_reagent(r_id,min(amount, space))
+ if(space < amount)
+ break
+ if(i == round(O.amount, 1))
+ remove_object(O)
+ break
+ //Plants
+ for(var/obj/item/weapon/grown/O in holdingitems)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ var/allowed = get_allowed_by_id(O)
+ for(var/r_id in allowed)
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ var/amount = allowed[r_id]
+ if(amount == 0)
+ if(O.reagents != null && O.reagents.has_reagent(r_id))
+ beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id), space))
+ else
+ beaker.reagents.add_reagent(r_id,min(amount, space))
+
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ remove_object(O)
+
+ //xenoarch
+ /*for(var/obj/item/weapon/rocksliver/O in holdingitems)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ var/allowed = get_allowed_by_id(O)
+ for(var/r_id in allowed)
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ var/amount = allowed[r_id]
+ beaker.reagents.add_reagent(r_id,min(amount, space), O.geological_data)
+
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ remove_object(O)*/
+
+ //Everything else - Transfers reagents from it into beaker
+ for(var/obj/item/weapon/reagent_containers/O in holdingitems)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ var/amount = O.reagents.total_volume
+ O.reagents.trans_to(beaker, amount)
+ if(!O.reagents.total_volume)
+ remove_object(O)
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/chemistry/readme.dm
similarity index 97%
rename from code/modules/reagents/Chemistry-Readme.dm
rename to code/modules/reagents/chemistry/readme.dm
index cae0c31162c..1fe946a10d1 100644
--- a/code/modules/reagents/Chemistry-Readme.dm
+++ b/code/modules/reagents/chemistry/readme.dm
@@ -1,249 +1,249 @@
-/*
-NOTE: IF YOU UPDATE THE REAGENT-SYSTEM, ALSO UPDATE THIS README.
-
-Structure: /////////////////// //////////////////////////
- // Mob or object // -------> // Reagents var (datum) // Is a reference to the datum that holds the reagents.
- /////////////////// //////////////////////////
- | |
- The object that holds everything. V
- reagent_list var (list) A List of datums, each datum is a reagent.
-
- | | |
- V V V
-
- reagents (datums) Reagents. I.e. Water , antitoxins or mercury.
-
-
-Random important notes:
-
- An objects on_reagent_change will be called every time the objects reagents change.
- Useful if you want to update the objects icon etc.
-
-About the Holder:
-
- The holder (reagents datum) is the datum that holds a list of all reagents
- currently in the object.It also has all the procs needed to manipulate reagents
-
- remove_any(amount)
- This proc removes reagents from the holder until the passed amount
- is matched. It'll try to remove some of ALL reagents contained.
-
- trans_to(obj/target, amount)
- This proc equally transfers the contents of the holder to another
- objects holder. You need to pass it the object (not the holder) you want
- to transfer to and the amount you want to transfer. Its return value is the
- actual amount transfered (if one of the objects is full/empty)
-
- trans_id_to(obj/target, reagent, amount)
- Same as above but only for a specific reagent in the reagent list.
- If the specified amount is greater than what is available, it will use
- the amount of the reagent that is available. If no reagent exists, returns null.
-
- metabolize(mob/living/M)
- This proc is called by the mobs life proc. It simply calls on_mob_life for
- all contained reagents. You shouldnt have to use this one directly.
-
- handle_reactions()
- This proc check all recipes and, on a match, uses them.
- It will also call the recipe's on_reaction proc (for explosions or w/e).
- Currently, this proc is automatically called by trans_to.
- - Modified from the original to preserve reagent data across reactions (originally for xenoarchaeology)
-
- isolate_reagent(reagent)
- Pass it a reagent id and it will remove all reagents but that one.
- It's that simple.
-
- del_reagent(reagent)
- Completely remove the reagent with the matching id.
-
- update_total()
- This one simply updates the total volume of the holder.
- (the volume of all reagents added together)
-
- clear_reagents()
- This proc removes ALL reagents from the holder.
-
- reaction(atom/A, method=TOUCH, volume_modifier=0)
- This proc calls the appropriate reaction procs of the reagents.
- I.e. if A is an object, it will call the reagents reaction_obj
- proc. The method var is used for reaction on mobs. It simply tells
- us if the mob TOUCHed the reagent or if it INGESTed the reagent.
- Since the volume can be checked in a reagents proc, you might want to
- use the volume_modifier var to modifiy the passed value without actually
- changing the volume of the reagents.
- If you're not sure if you need to use this the answer is very most likely 'No'.
- You'll want to use this proc whenever an atom first comes in
- contact with the reagents of a holder. (in the 'splash' part of a beaker i.e.)
- More on the reaction in the reagent part of this readme.
-
- add_reagent(reagent, amount, data)
- Attempts to add X of the matching reagent to the holder.
- You wont use this much. Mostly in new procs for pre-filled
- objects.
-
- remove_reagent(reagent, amount)
- The exact opposite of the add_reagent proc.
- - Modified from original to return the reagent's data, in order to preserve reagent data across reactions (originally for xenoarchaeology)
-
- has_reagent(reagent, amount)
- Returns 1 if the holder contains this reagent.
- Or 0 if not.
- If you pass it an amount it will additionally check
- if the amount is matched. This is optional.
-
- get_reagent_amount(reagent)
- Returns the amount of the matching reagent inside the
- holder. Returns 0 if the reagent is missing.
-
- overdose_list()
- Returns a list of all the chemical IDs in the reagent holder that are overdosing
-
- Important variables:
-
- total_volume
- This variable contains the total volume of all reagents in this holder.
-
- reagent_list
- This is a list of all contained reagents. More specifically, references
- to the reagent datums.
-
- maximum_volume
- This is the maximum volume of the holder.
-
- my_atom
- This is the atom the holder is 'in'. Useful if you need to find the location.
- (i.e. for explosions)
-
-
-About Reagents:
-
- Reagents are all the things you can mix and fille in bottles etc. This can be anything from
- rejuvs over water to ... iron. Each reagent also has a few procs - i'll explain those below.
-
- reaction_mob(mob/living/M, method=TOUCH)
- This is called by the holder's reation proc.
- This version is only called when the reagent
- reacts with a mob. The method var can be either
- TOUCH or INGEST. You'll want to put stuff like
- acid-facemelting in here. Should only ever be
- called, directly, on living mobs.
-
- reaction_obj(obj/O)
- This is called by the holder's reation proc.
- This version is called when the reagents reacts
- with an object. You'll want to put stuff like
- object melting in here ... or something. i dunno.
-
- reaction_turf(turf/T)
- This is called by the holder's reation proc.
- This version is called when the reagents reacts
- with a turf. You'll want to put stuff like extra
- slippery floors for lube or something in here.
-
- on_mob_life(mob/living/M)
- This proc is called everytime the mobs life proc executes.
- This is the place where you put damage for toxins ,
- drowsyness for sleep toxins etc etc.
- You'll want to call the parents proc by using ..() .
- If you dont, the chemical will stay in the mob forever -
- unless you write your own piece of code to slowly remove it.
- (Should be pretty easy, 1 line of code)
-
- Important variables:
-
- holder
- This variable contains a reference to the holder the chemical is 'in'
-
- volume
- This is the volume of the reagent.
-
- id
- The id of the reagent
-
- name
- The name of the reagent.
-
- data
- This var can be used for whatever the fuck you want.You could use this
- for DNA in a blood reagent or ... well whatever you want.
-
- color
- This is a hexadecimal color that represents the reagent outside of containers,
- you define it as "#RRGGBB", or, red green blue. You can also define it using the
- rgb() proc, which returns a hexadecimal value too. The color is black by default.
-
- A good website for color calculations: http://www.psyclops.com/tools/rgb/
-
-
-
-
-About Recipes:
-
- Recipes are simple datums that contain a list of required reagents and a result.
- They also have a proc that is called when the recipe is matched.
-
- on_reaction(datum/reagents/holder, created_volume)
- This proc is called when the recipe is matched.
- You'll want to add explosions etc here.
- To find the location you'll have to do something
- like get_turf(holder.my_atom)
-
- name & id
- Should be pretty obvious.
-
- result
- This var contains the id of the resulting reagent.
-
- required_reagents
- This is a list of ids of the required reagents.
- Each id also needs an associated value that gives us the minimum required amount
- of that reagent. The handle_reaction proc can detect mutiples of the same recipes
- so for most cases you want to set the required amount to 1.
-
- required_catalysts (Added May 2011)
- This is a list of the ids of the required catalysts.
- Functionally similar to required_reagents, it is a list of reagents that are required
- for the reaction. However, unlike required_reagents, catalysts are NOT consumed.
- They mearly have to be present in the container.
-
- result_amount
- This is the amount of the resulting reagent this recipe will produce.
- I recommend you set this to the total volume of all required reagent.
-
- required_container
- The container the recipe has to take place in in order to happen. Leave this blank/null
- if you want the reaction to happen anywhere.
-
- required_other
- Basically like a reagent's data variable. You can set extra requirements for a
- reaction with this.
-
-
-About the Tools:
-
- By default, all atom have a reagents var - but its empty. if you want to use an object for the chem.
- system you'll need to add something like this in its new proc:
-
- var/datum/reagents/R = new/datum/reagents(100), <<< create a new datum, 100 is the maximum_volume of the new holder datum.
- reagents = R, <<< assign the new datum to the objects reagents var
- R.my_atom = src, <<< set the holders my_atom to src so that we know where we are.
-
- This can also be done by calling a convenience proc:
- atom/proc/create_reagents(max_volume)
-
- Other important stuff:
-
- amount_per_transfer_from_this var
- This var is mostly used by beakers and bottles.
- It simply tells us how much to transfer when
- 'pouring' our reagents into something else.
-
- atom/proc/is_open_container()
- Checks atom/var/flags & OPENCONTAINER.
- If this returns 1 , you can use syringes, beakers etc
- to manipulate the contents of this object.
- If it's 0, you'll need to write your own custom reagent
- transfer code since you will not be able to use the standard
- tools to manipulate it.
-
+/*
+NOTE: IF YOU UPDATE THE REAGENT-SYSTEM, ALSO UPDATE THIS README.
+
+Structure: /////////////////// //////////////////////////
+ // Mob or object // -------> // Reagents var (datum) // Is a reference to the datum that holds the reagents.
+ /////////////////// //////////////////////////
+ | |
+ The object that holds everything. V
+ reagent_list var (list) A List of datums, each datum is a reagent.
+
+ | | |
+ V V V
+
+ reagents (datums) Reagents. I.e. Water , antitoxins or mercury.
+
+
+Random important notes:
+
+ An objects on_reagent_change will be called every time the objects reagents change.
+ Useful if you want to update the objects icon etc.
+
+About the Holder:
+
+ The holder (reagents datum) is the datum that holds a list of all reagents
+ currently in the object.It also has all the procs needed to manipulate reagents
+
+ remove_any(amount)
+ This proc removes reagents from the holder until the passed amount
+ is matched. It'll try to remove some of ALL reagents contained.
+
+ trans_to(obj/target, amount)
+ This proc equally transfers the contents of the holder to another
+ objects holder. You need to pass it the object (not the holder) you want
+ to transfer to and the amount you want to transfer. Its return value is the
+ actual amount transfered (if one of the objects is full/empty)
+
+ trans_id_to(obj/target, reagent, amount)
+ Same as above but only for a specific reagent in the reagent list.
+ If the specified amount is greater than what is available, it will use
+ the amount of the reagent that is available. If no reagent exists, returns null.
+
+ metabolize(mob/living/M)
+ This proc is called by the mobs life proc. It simply calls on_mob_life for
+ all contained reagents. You shouldnt have to use this one directly.
+
+ handle_reactions()
+ This proc check all recipes and, on a match, uses them.
+ It will also call the recipe's on_reaction proc (for explosions or w/e).
+ Currently, this proc is automatically called by trans_to.
+ - Modified from the original to preserve reagent data across reactions (originally for xenoarchaeology)
+
+ isolate_reagent(reagent)
+ Pass it a reagent id and it will remove all reagents but that one.
+ It's that simple.
+
+ del_reagent(reagent)
+ Completely remove the reagent with the matching id.
+
+ update_total()
+ This one simply updates the total volume of the holder.
+ (the volume of all reagents added together)
+
+ clear_reagents()
+ This proc removes ALL reagents from the holder.
+
+ reaction(atom/A, method=TOUCH, volume_modifier=0)
+ This proc calls the appropriate reaction procs of the reagents.
+ I.e. if A is an object, it will call the reagents reaction_obj
+ proc. The method var is used for reaction on mobs. It simply tells
+ us if the mob TOUCHed the reagent or if it INGESTed the reagent.
+ Since the volume can be checked in a reagents proc, you might want to
+ use the volume_modifier var to modifiy the passed value without actually
+ changing the volume of the reagents.
+ If you're not sure if you need to use this the answer is very most likely 'No'.
+ You'll want to use this proc whenever an atom first comes in
+ contact with the reagents of a holder. (in the 'splash' part of a beaker i.e.)
+ More on the reaction in the reagent part of this readme.
+
+ add_reagent(reagent, amount, data)
+ Attempts to add X of the matching reagent to the holder.
+ You wont use this much. Mostly in new procs for pre-filled
+ objects.
+
+ remove_reagent(reagent, amount)
+ The exact opposite of the add_reagent proc.
+ - Modified from original to return the reagent's data, in order to preserve reagent data across reactions (originally for xenoarchaeology)
+
+ has_reagent(reagent, amount)
+ Returns 1 if the holder contains this reagent.
+ Or 0 if not.
+ If you pass it an amount it will additionally check
+ if the amount is matched. This is optional.
+
+ get_reagent_amount(reagent)
+ Returns the amount of the matching reagent inside the
+ holder. Returns 0 if the reagent is missing.
+
+ overdose_list()
+ Returns a list of all the chemical IDs in the reagent holder that are overdosing
+
+ Important variables:
+
+ total_volume
+ This variable contains the total volume of all reagents in this holder.
+
+ reagent_list
+ This is a list of all contained reagents. More specifically, references
+ to the reagent datums.
+
+ maximum_volume
+ This is the maximum volume of the holder.
+
+ my_atom
+ This is the atom the holder is 'in'. Useful if you need to find the location.
+ (i.e. for explosions)
+
+
+About Reagents:
+
+ Reagents are all the things you can mix and fille in bottles etc. This can be anything from
+ rejuvs over water to ... iron. Each reagent also has a few procs - i'll explain those below.
+
+ reaction_mob(mob/living/M, method=TOUCH)
+ This is called by the holder's reation proc.
+ This version is only called when the reagent
+ reacts with a mob. The method var can be either
+ TOUCH or INGEST. You'll want to put stuff like
+ acid-facemelting in here. Should only ever be
+ called, directly, on living mobs.
+
+ reaction_obj(obj/O)
+ This is called by the holder's reation proc.
+ This version is called when the reagents reacts
+ with an object. You'll want to put stuff like
+ object melting in here ... or something. i dunno.
+
+ reaction_turf(turf/T)
+ This is called by the holder's reation proc.
+ This version is called when the reagents reacts
+ with a turf. You'll want to put stuff like extra
+ slippery floors for lube or something in here.
+
+ on_mob_life(mob/living/M)
+ This proc is called everytime the mobs life proc executes.
+ This is the place where you put damage for toxins ,
+ drowsyness for sleep toxins etc etc.
+ You'll want to call the parents proc by using ..() .
+ If you dont, the chemical will stay in the mob forever -
+ unless you write your own piece of code to slowly remove it.
+ (Should be pretty easy, 1 line of code)
+
+ Important variables:
+
+ holder
+ This variable contains a reference to the holder the chemical is 'in'
+
+ volume
+ This is the volume of the reagent.
+
+ id
+ The id of the reagent
+
+ name
+ The name of the reagent.
+
+ data
+ This var can be used for whatever the fuck you want.You could use this
+ for DNA in a blood reagent or ... well whatever you want.
+
+ color
+ This is a hexadecimal color that represents the reagent outside of containers,
+ you define it as "#RRGGBB", or, red green blue. You can also define it using the
+ rgb() proc, which returns a hexadecimal value too. The color is black by default.
+
+ A good website for color calculations: http://www.psyclops.com/tools/rgb/
+
+
+
+
+About Recipes:
+
+ Recipes are simple datums that contain a list of required reagents and a result.
+ They also have a proc that is called when the recipe is matched.
+
+ on_reaction(datum/reagents/holder, created_volume)
+ This proc is called when the recipe is matched.
+ You'll want to add explosions etc here.
+ To find the location you'll have to do something
+ like get_turf(holder.my_atom)
+
+ name & id
+ Should be pretty obvious.
+
+ result
+ This var contains the id of the resulting reagent.
+
+ required_reagents
+ This is a list of ids of the required reagents.
+ Each id also needs an associated value that gives us the minimum required amount
+ of that reagent. The handle_reaction proc can detect mutiples of the same recipes
+ so for most cases you want to set the required amount to 1.
+
+ required_catalysts (Added May 2011)
+ This is a list of the ids of the required catalysts.
+ Functionally similar to required_reagents, it is a list of reagents that are required
+ for the reaction. However, unlike required_reagents, catalysts are NOT consumed.
+ They mearly have to be present in the container.
+
+ result_amount
+ This is the amount of the resulting reagent this recipe will produce.
+ I recommend you set this to the total volume of all required reagent.
+
+ required_container
+ The container the recipe has to take place in in order to happen. Leave this blank/null
+ if you want the reaction to happen anywhere.
+
+ required_other
+ Basically like a reagent's data variable. You can set extra requirements for a
+ reaction with this.
+
+
+About the Tools:
+
+ By default, all atom have a reagents var - but its empty. if you want to use an object for the chem.
+ system you'll need to add something like this in its new proc:
+
+ var/datum/reagents/R = new/datum/reagents(100), <<< create a new datum, 100 is the maximum_volume of the new holder datum.
+ reagents = R, <<< assign the new datum to the objects reagents var
+ R.my_atom = src, <<< set the holders my_atom to src so that we know where we are.
+
+ This can also be done by calling a convenience proc:
+ atom/proc/create_reagents(max_volume)
+
+ Other important stuff:
+
+ amount_per_transfer_from_this var
+ This var is mostly used by beakers and bottles.
+ It simply tells us how much to transfer when
+ 'pouring' our reagents into something else.
+
+ atom/proc/is_open_container()
+ Checks atom/var/flags & OPENCONTAINER.
+ If this returns 1 , you can use syringes, beakers etc
+ to manipulate the contents of this object.
+ If it's 0, you'll need to write your own custom reagent
+ transfer code since you will not be able to use the standard
+ tools to manipulate it.
+
*/
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/chemistry/reagents.dm
similarity index 53%
rename from code/modules/reagents/oldchem/reagents/_reagent_base.dm
rename to code/modules/reagents/chemistry/reagents.dm
index fbf1398decb..367c747c4e0 100644
--- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -1,3 +1,7 @@
+#define SOLID 1
+#define LIQUID 2
+#define GAS 3
+
/datum/reagent
var/name = "Reagent"
var/id = "reagent"
@@ -6,7 +10,6 @@
var/reagent_state = SOLID
var/list/data = null
var/volume = 0
- var/nutriment_factor = 0
var/metabolization_rate = REAGENTS_METABOLISM
//var/list/viruses = list()
var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
@@ -20,6 +23,20 @@
//By default, all reagents will ONLY affect organics, not synthetics. Re-define in the reagent's definition if the reagent is meant to affect synths
var/process_flags = ORGANIC
var/admin_only = 0
+ var/can_synth = 1 //whether or not a mech syringe gun and synthesize this reagent
+ var/overdose_threshold = 0
+ var/addiction_chance = 0
+ var/addiction_stage = 1
+ var/last_addiction_dose = 0
+ var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick.
+ var/current_cycle = 1
+ var/drink_icon = "glass_brown" // what icon state/name/description a drinking glass will use if this is the master reagent.
+ var/drink_name = "Glass of ..what?"
+ var/drink_desc = "You can't really tell what this is."
+
+/datum/reagent/Destroy()
+ . = ..()
+ holder = null
/datum/reagent/proc/reaction_mob(mob/living/M, method=TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
if(holder) //for catching rare runtimes
@@ -61,20 +78,78 @@
/datum/reagent/proc/on_mob_death(mob/living/M) //use this to have chems have a "death-triggered" effect
return
-// Called when two reagents of the same are mixing.
-/datum/reagent/proc/on_merge(data)
+// Called when this reagent is removed while inside a mob
+/datum/reagent/proc/on_mob_delete(mob/living/M)
return
/datum/reagent/proc/on_move(mob/M)
return
-/datum/reagent/proc/on_update(atom/A)
- return
-
// Called after add_reagents creates a new reagent.
/datum/reagent/proc/on_new(data)
return
-/datum/reagent/Destroy()
- . = ..()
- holder = null
\ No newline at end of file
+// Called when two reagents of the same are mixing.
+/datum/reagent/proc/on_merge(data)
+ return
+
+/datum/reagent/proc/on_update(atom/A)
+ return
+
+// Called every time reagent containers process.
+/datum/reagent/proc/on_tick(data)
+ return
+
+// Called when the reagent container is hit by an explosion
+/datum/reagent/proc/on_ex_act(severity)
+ return
+
+// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects
+/datum/reagent/proc/overdose_process(mob/living/M, severity)
+ var/effect = rand(1, 100) - severity
+ if(effect <= 8)
+ M.adjustToxLoss(severity)
+ return effect
+
+/datum/reagent/proc/overdose_start(mob/living/M)
+ return
+
+/datum/reagent/proc/addiction_act_stage1(mob/living/M)
+ return
+
+/datum/reagent/proc/addiction_act_stage2(mob/living/M)
+ if(prob(8))
+ M.emote("shiver")
+ if(prob(8))
+ M.emote("sneeze")
+ if(prob(4))
+ to_chat(M, "You feel a dull headache.")
+
+/datum/reagent/proc/addiction_act_stage3(mob/living/M)
+ if(prob(8))
+ M.emote("twitch_s")
+ if(prob(8))
+ M.emote("shiver")
+ if(prob(4))
+ to_chat(M, "You begin craving [name]!")
+
+/datum/reagent/proc/addiction_act_stage4(mob/living/M)
+ if(prob(8))
+ M.emote("twitch")
+ if(prob(4))
+ to_chat(M, "You have the strong urge for some [name]!")
+ if(prob(4))
+ to_chat(M, "You REALLY crave some [name]!")
+
+/datum/reagent/proc/addiction_act_stage5(mob/living/M)
+ if(prob(8))
+ M.emote("twitch")
+ if(prob(6))
+ to_chat(M, "Your stomach lurches painfully!")
+ M.visible_message("[M] gags and retches!")
+ M.Stun(rand(2,4))
+ M.Weaken(rand(2,4))
+ if(prob(5))
+ to_chat(M, "You feel like you can't live without [name]!")
+ if(prob(5))
+ to_chat(M, "You would DIE for some [name] right now!")
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/admin.dm b/code/modules/reagents/chemistry/reagents/admin.dm
new file mode 100644
index 00000000000..a915ef8cd57
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/admin.dm
@@ -0,0 +1,61 @@
+/datum/reagent/medicine/adminordrazine //An OP chemical for admins
+ name = "Adminordrazine"
+ id = "adminordrazine"
+ description = "It's magic. We don't have to explain it."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds!
+ admin_only = 1
+ can_synth = 0
+
+/datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M)
+ M.setCloneLoss(0)
+ M.setOxyLoss(0)
+ M.radiation = 0
+ M.adjustBruteLoss(-5)
+ M.adjustFireLoss(-5)
+ M.adjustToxLoss(-5)
+ M.setBrainLoss(0)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ for(var/name in H.internal_organs)
+ var/obj/item/organ/internal/I = H.get_int_organ(name)
+ I.damage = max(0, I.damage-5)
+ for(var/obj/item/organ/external/E in H.organs)
+ if(E.mend_fracture())
+ E.perma_injury = 0
+ M.SetEyeBlind(0)
+ M.CureNearsighted()
+ M.CureBlind()
+ M.CureMute()
+ M.CureDeaf()
+ M.CureEpilepsy()
+ M.CureTourettes()
+ M.CureCoughing()
+ M.CureNervous()
+ M.SetEyeBlurry(0)
+ M.SetWeakened(0)
+ M.SetStunned(0)
+ M.SetParalysis(0)
+ M.SetSilence(0)
+ M.SetHallucinate(0)
+ M.SetDizzy(0)
+ M.SetDrowsy(0)
+ M.SetStuttering(0)
+ M.SetSlur(0)
+ M.SetConfused(0)
+ M.SetSleeping(0)
+ M.SetJitter(0)
+ for(var/datum/disease/D in M.viruses)
+ if(D.severity == NONTHREAT)
+ continue
+ D.spread_text = "Remissive"
+ D.stage--
+ if(D.stage < 1)
+ D.cure()
+ ..()
+
+/datum/reagent/medicine/adminordrazine/nanites
+ name = "Nanites"
+ id = "nanites"
+ description = "Nanomachines that aid in rapid cellular regeneration."
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm
new file mode 100644
index 00000000000..536385d7614
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/alcohol.dm
@@ -0,0 +1,1116 @@
+//ALCOHOL WOO
+/datum/reagent/consumable/ethanol
+ name = "Ethanol" //Parent class for all alcoholic reagents.
+ id = "ethanol"
+ description = "A well-known alcohol with a variety of applications."
+ reagent_state = LIQUID
+ nutriment_factor = 0 //So alcohol can fill you up! If they want to.
+ color = "#404030" // rgb: 64, 64, 48
+ can_grow_in_plants = 0 //Alcoholic drinks won't be grown in plants (would "water down" random seed chems too much)
+ var/dizzy_adj = 3
+ var/alcohol_perc = 1 //percentage of ethanol in a beverage 0.0 - 1.0
+
+/datum/reagent/consumable/ethanol/on_mob_life(mob/living/M)
+ M.AdjustDrunk(alcohol_perc)
+ M.AdjustDizzy(dizzy_adj)
+ ..()
+
+/datum/reagent/consumable/ethanol/reaction_obj(obj/O, volume)
+ if(istype(O,/obj/item/weapon/paper))
+ var/obj/item/weapon/paper/paperaffected = O
+ paperaffected.clearpaper()
+ to_chat(usr, "The solution melts away the ink on the paper.")
+ if(istype(O,/obj/item/weapon/book))
+ if(volume >= 5)
+ var/obj/item/weapon/book/affectedbook = O
+ affectedbook.dat = null
+ to_chat(usr, "The solution melts away the ink on the book.")
+ else
+ to_chat(usr, "It wasn't enough...")
+
+/datum/reagent/consumable/ethanol/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with ethanol isn't quite as good as fuel.
+ if(method == TOUCH)
+ M.adjust_fire_stacks(volume / 15)
+
+
+/datum/reagent/consumable/ethanol/beer
+ name = "Beer"
+ id = "beer"
+ description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
+ nutriment_factor = 2 * REAGENTS_METABOLISM
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon ="beerglass"
+ drink_name = "Beer glass"
+ drink_desc = "A freezing pint of beer"
+
+/datum/reagent/consumable/ethanol/cider
+ name = "Cider"
+ id = "cider"
+ description = "An alcoholic beverage derived from apples."
+ color = "#174116"
+ alcohol_perc = 0.2
+ drink_icon = "rewriter"
+ drink_name = "Cider"
+ drink_desc = "a refreshing glass of traditional cider"
+
+/datum/reagent/consumable/ethanol/whiskey
+ name = "Whiskey"
+ id = "whiskey"
+ description = "A superb and well-aged single-malt whiskey. Damn."
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 4
+ alcohol_perc = 0.4
+ drink_icon = "whiskeyglass"
+ drink_name = "Glass of whiskey"
+ drink_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
+
+/datum/reagent/consumable/ethanol/specialwhiskey
+ name = "Special Blend Whiskey"
+ id = "specialwhiskey"
+ description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything."
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.5
+
+/datum/reagent/consumable/ethanol/gin
+ name = "Gin"
+ id = "gin"
+ description = "It's gin. In space. I say, good sir."
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 3
+ alcohol_perc = 0.5
+ drink_icon = "ginvodkaglass"
+ drink_name = "Glass of gin"
+ drink_desc = "A crystal clear glass of Griffeater gin."
+
+/datum/reagent/consumable/ethanol/absinthe
+ name = "Absinthe"
+ id = "absinthe"
+ description = "Watch out that the Green Fairy doesn't come for you!"
+ color = "#33EE00" // rgb: lots, ??, ??
+ overdose_threshold = 30
+ dizzy_adj = 5
+ alcohol_perc = 0.7
+ drink_icon = "absinthebottle"
+ drink_name = "Glass of Absinthe"
+ drink_desc = "The green fairy is going to get you now!"
+
+//copy paste from LSD... shoot me
+/datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/M)
+ M.AdjustHallucinate(5)
+ ..()
+
+/datum/reagent/consumable/ethanol/absinthe/overdose_process(mob/living/M, severity)
+ M.adjustToxLoss(1)
+
+/datum/reagent/consumable/ethanol/rum
+ name = "Rum"
+ id = "rum"
+ description = "Popular with the sailors. Not very popular with everyone else."
+ color = "#664300" // rgb: 102, 67, 0
+ overdose_threshold = 30
+ alcohol_perc = 0.4
+ dizzy_adj = 5
+ drink_icon = "rumglass"
+ drink_name = "Glass of Rum"
+ drink_desc = "Now you want to Pray for a pirate suit, don't you?"
+
+/datum/reagent/consumable/ethanol/rum/overdose_process(mob/living/M, severity)
+ M.adjustToxLoss(1)
+
+/datum/reagent/consumable/ethanol/mojito
+ name = "Mojito"
+ id = "mojito"
+ description = "If it's good enough for Spesscuba, it's good enough for you."
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "mojito"
+ drink_name = "Glass of Mojito"
+ drink_desc = "Fresh from Spesscuba."
+
+/datum/reagent/consumable/ethanol/vodka
+ name = "Vodka"
+ id = "vodka"
+ description = "Number one drink AND fueling choice for Russians worldwide."
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.4
+ drink_icon = "ginvodkaglass"
+ drink_name = "Glass of vodka"
+ drink_desc = "The glass contain wodka. Xynta."
+
+/datum/reagent/consumable/ethanol/sake
+ name = "Sake"
+ id = "sake"
+ description = "Anime's favorite drink."
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "ginvodkaglass"
+ drink_name = "Glass of Sake"
+ drink_desc = "A glass of Sake."
+
+/datum/reagent/consumable/ethanol/tequila
+ name = "Tequila"
+ id = "tequila"
+ description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?"
+ color = "#A8B0B7" // rgb: 168, 176, 183
+ alcohol_perc = 0.4
+ drink_icon = "tequilaglass"
+ drink_name = "Glass of Tequila"
+ drink_desc = "Now all that's missing is the weird colored shades!"
+
+/datum/reagent/consumable/ethanol/vermouth
+ name = "Vermouth"
+ id = "vermouth"
+ description = "You suddenly feel a craving for a martini..."
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "vermouthglass"
+ drink_name = "Glass of Vermouth"
+ drink_desc = "You wonder why you're even drinking this straight."
+
+/datum/reagent/consumable/ethanol/wine
+ name = "Wine"
+ id = "wine"
+ description = "An premium alchoholic beverage made from distilled grape juice."
+ color = "#7E4043" // rgb: 126, 64, 67
+ dizzy_adj = 2
+ alcohol_perc = 0.2
+ drink_icon = "wineglass"
+ drink_name = "Glass of wine"
+ drink_desc = "A very classy looking drink."
+
+/datum/reagent/consumable/ethanol/cognac
+ name = "Cognac"
+ id = "cognac"
+ description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication."
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 4
+ alcohol_perc = 0.4
+ drink_icon = "cognacglass"
+ drink_name = "Glass of cognac"
+ drink_desc = "Damn, you feel like some kind of French aristocrat just by holding this."
+
+/datum/reagent/consumable/ethanol/suicider //otherwise known as "I want to get so smashed my liver gives out and I die from alcohol poisoning".
+ name = "Suicider"
+ id = "suicider"
+ description = "An unbelievably strong and potent variety of Cider."
+ color = "#CF3811"
+ dizzy_adj = 20
+ alcohol_perc = 1 //because that's a thing it's supposed to do, I guess
+ drink_icon = "suicider"
+ drink_name = "Suicider"
+ drink_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
+
+/datum/reagent/consumable/ethanol/ale
+ name = "Ale"
+ id = "ale"
+ description = "A dark alchoholic beverage made by malted barley and yeast."
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.1
+ drink_icon = "aleglass"
+ drink_name = "Ale glass"
+ drink_desc = "A freezing pint of delicious Ale"
+
+/datum/reagent/consumable/ethanol/thirteenloko
+ name = "Thirteen Loko"
+ id = "thirteenloko"
+ description = "A potent mixture of caffeine and alcohol."
+ reagent_state = LIQUID
+ color = "#102000" // rgb: 16, 32, 0
+ alcohol_perc = 0.3
+ heart_rate_increase = 1
+ drink_icon = "thirteen_loko_glass"
+ drink_name = "Glass of Thirteen Loko"
+ drink_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass"
+
+/datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/M)
+ M.AdjustDrowsy(-7)
+ M.AdjustSleeping(-2)
+ if(M.bodytemperature > 310)
+ M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
+ M.Jitter(5)
+ ..()
+
+
+/////////////////////////////////////////////////////////////////cocktail entities//////////////////////////////////////////////
+
+/datum/reagent/consumable/ethanol/bilk
+ name = "Bilk"
+ id = "bilk"
+ description = "This appears to be beer mixed with milk. Disgusting."
+ reagent_state = LIQUID
+ color = "#895C4C" // rgb: 137, 92, 76
+ alcohol_perc = 0.2
+ drink_icon = "glass_brown"
+ drink_name = "Glass of bilk"
+ drink_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis."
+
+/datum/reagent/consumable/ethanol/atomicbomb
+ name = "Atomic Bomb"
+ id = "atomicbomb"
+ description = "Nuclear proliferation never tasted so good."
+ reagent_state = LIQUID
+ color = "#666300" // rgb: 102, 99, 0
+ alcohol_perc = 0.2
+ drink_icon = "atomicbombglass"
+ drink_name = "Atomic Bomb"
+ drink_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing."
+
+/datum/reagent/consumable/ethanol/threemileisland
+ name = "THree Mile Island Iced Tea"
+ id = "threemileisland"
+ description = "Made for a woman, strong enough for a man."
+ reagent_state = LIQUID
+ color = "#666340" // rgb: 102, 99, 64
+ alcohol_perc = 0.2
+ drink_icon = "threemileislandglass"
+ drink_name = "Three Mile Island Ice Tea"
+ drink_desc = "A glass of this is sure to prevent a meltdown."
+
+/datum/reagent/consumable/ethanol/goldschlager
+ name = "Goldschlager"
+ id = "goldschlager"
+ description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.4
+ drink_icon = "ginvodkaglass"
+ drink_name = "Glass of goldschlager"
+ drink_desc = "100 proof that teen girls will drink anything with gold in it."
+
+/datum/reagent/consumable/ethanol/patron
+ name = "Patron"
+ id = "patron"
+ description = "Tequila with silver in it, a favorite of alcoholic women in the club scene."
+ reagent_state = LIQUID
+ color = "#585840" // rgb: 88, 88, 64
+ alcohol_perc = 0.4
+ drink_icon = "patronglass"
+ drink_name = "Glass of Patron"
+ drink_desc = "Drinking patron in the bar, with all the subpar ladies."
+
+/datum/reagent/consumable/ethanol/gintonic
+ name = "Gin and Tonic"
+ id = "gintonic"
+ description = "An all time classic, mild cocktail."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.4
+ drink_icon = "gintonicglass"
+ drink_name = "Gin and Tonic"
+ drink_desc = "A mild but still great cocktail. Drink up, like a true Englishman."
+
+/datum/reagent/consumable/ethanol/cuba_libre
+ name = "Cuba Libre"
+ id = "cubalibre"
+ description = "Rum, mixed with cola. Viva la revolution."
+ reagent_state = LIQUID
+ color = "#3E1B00" // rgb: 62, 27, 0
+ alcohol_perc = 0.2
+ drink_icon = "cubalibreglass"
+ drink_name = "Cuba Libre"
+ drink_desc = "A classic mix of rum and cola."
+
+/datum/reagent/consumable/ethanol/whiskey_cola
+ name = "Whiskey Cola"
+ id = "whiskeycola"
+ description = "Whiskey, mixed with cola. Surprisingly refreshing."
+ reagent_state = LIQUID
+ color = "#3E1B00" // rgb: 62, 27, 0
+ alcohol_perc = 0.3
+ drink_icon = "whiskeycolaglass"
+ drink_name = "Whiskey Cola"
+ drink_desc = "An innocent-looking mixture of cola and Whiskey. Delicious."
+
+/datum/reagent/consumable/ethanol/martini
+ name = "Classic Martini"
+ id = "martini"
+ description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.5
+ drink_icon = "martiniglass"
+ drink_name = "Classic Martini"
+ drink_desc = "Damn, the bartender even stirred it, not shook it."
+
+/datum/reagent/consumable/ethanol/vodkamartini
+ name = "Vodka Martini"
+ id = "vodkamartini"
+ description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.4
+ drink_icon = "martiniglass"
+ drink_name = "Vodka martini"
+ drink_desc ="A bastardisation of the classic martini. Still great."
+
+/datum/reagent/consumable/ethanol/white_russian
+ name = "White Russian"
+ id = "whiterussian"
+ description = "That's just, like, your opinion, man..."
+ reagent_state = LIQUID
+ color = "#A68340" // rgb: 166, 131, 64
+ alcohol_perc = 0.3
+ drink_icon = "whiterussianglass"
+ drink_name = "White Russian"
+ drink_desc = "A very nice looking drink. But that's just, like, your opinion, man."
+
+/datum/reagent/consumable/ethanol/screwdrivercocktail
+ name = "Screwdriver"
+ id = "screwdrivercocktail"
+ description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious."
+ reagent_state = LIQUID
+ color = "#A68310" // rgb: 166, 131, 16
+ alcohol_perc = 0.3
+ drink_icon = "screwdriverglass"
+ drink_name = "Screwdriver"
+ drink_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
+
+/datum/reagent/consumable/ethanol/booger
+ name = "Booger"
+ id = "booger"
+ description = "Ewww..."
+ reagent_state = LIQUID
+ color = "#A68310" // rgb: 166, 131, 16
+ alcohol_perc = 0.2
+ drink_icon = "booger"
+ drink_name = "Booger"
+ drink_desc = "Ewww..."
+
+/datum/reagent/consumable/ethanol/bloody_mary
+ name = "Bloody Mary"
+ id = "bloodymary"
+ description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "bloodymaryglass"
+ drink_name = "Bloody Mary"
+ drink_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder."
+
+/datum/reagent/consumable/ethanol/gargle_blaster
+ name = "Pan-Galactic Gargle Blaster"
+ id = "gargleblaster"
+ description = "Whoah, this stuff looks volatile!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.7 //ouch
+ drink_icon = "gargleblasterglass"
+ drink_name = "Pan-Galactic Gargle Blaster"
+ drink_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy."
+
+/datum/reagent/consumable/ethanol/brave_bull
+ name = "Brave Bull"
+ id = "bravebull"
+ description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.3
+ drink_icon = "bravebullglass"
+ drink_name = "Brave Bull"
+ drink_desc = "Tequila and Coffee liquor, brought together in a mouthwatering mixture. Drink up."
+
+/datum/reagent/consumable/ethanol/tequila_sunrise
+ name = "Tequila Sunrise"
+ id = "tequilasunrise"
+ description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.3
+ drink_icon = "tequilasunriseglass"
+ drink_name = "Tequila Sunrise"
+ drink_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..."
+
+/datum/reagent/consumable/ethanol/toxins_special
+ name = "Toxins Special"
+ id = "toxinsspecial"
+ description = "This thing is FLAMING!. CALL THE DAMN SHUTTLE!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.5
+ drink_icon = "toxinsspecialglass"
+ drink_name = "Toxins Special"
+ drink_desc = "Whoah, this thing is on FIRE"
+
+/datum/reagent/consumable/ethanol/toxins_special/on_mob_life(mob/living/M)
+ if(M.bodytemperature < 330)
+ M.bodytemperature = min(330, M.bodytemperature + (15 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
+ ..()
+
+/datum/reagent/consumable/ethanol/beepsky_smash
+ name = "Beepsky Smash"
+ id = "beepskysmash"
+ description = "Deny drinking this and prepare for THE LAW."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.5
+ drink_icon = "beepskysmashglass"
+ drink_name = "Beepsky Smash"
+ drink_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
+
+/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/M)
+ M.Stun(1)
+ ..()
+
+/datum/reagent/consumable/ethanol/irish_cream
+ name = "Irish Cream"
+ id = "irishcream"
+ description = "Whiskey-imbued cream, what else would you expect from the Irish."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.3
+ drink_icon = "irishcreamglass"
+ drink_name = "Irish Cream"
+ drink_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?"
+
+/datum/reagent/consumable/ethanol/manly_dorf
+ name = "The Manly Dorf"
+ id = "manlydorf"
+ description = "Beer and Ale, brought together in a delicious mix. Intended for true men only."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "manlydorfglass"
+ drink_name = "The Manly Dorf"
+ drink_desc = "A manly concotion made from Ale and Beer. Intended for true men only."
+
+/datum/reagent/consumable/ethanol/longislandicedtea
+ name = "Long Island Iced Tea"
+ id = "longislandicedtea"
+ description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.5
+ drink_icon = "longislandicedteaglass"
+ drink_name = "Long Island Iced Tea"
+ drink_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
+
+/datum/reagent/consumable/ethanol/moonshine
+ name = "Moonshine"
+ id = "moonshine"
+ description = "You've really hit rock bottom now... your liver packed its bags and left last night."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.8 //yeeehaw
+ drink_icon = "glass_clear"
+ drink_name = "Moonshine"
+ drink_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
+
+/datum/reagent/consumable/ethanol/b52
+ name = "B-52"
+ id = "b52"
+ description = "Coffee, Irish Cream, and congac. You will get bombed."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.3
+ drink_icon = "b52glass"
+ drink_name = "B-52"
+ drink_desc = "Kahlua, Irish Cream, and congac. You will get bombed."
+
+/datum/reagent/consumable/ethanol/irishcoffee
+ name = "Irish Coffee"
+ id = "irishcoffee"
+ description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "irishcoffeeglass"
+ drink_name = "Irish Coffee"
+ drink_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning."
+
+/datum/reagent/consumable/ethanol/margarita
+ name = "Margarita"
+ id = "margarita"
+ description = "On the rocks with salt on the rim. Arriba~!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.3
+ drink_icon = "margaritaglass"
+ drink_name = "Margarita"
+ drink_desc = "On the rocks with salt on the rim. Arriba~!"
+
+/datum/reagent/consumable/ethanol/black_russian
+ name = "Black Russian"
+ id = "blackrussian"
+ description = "For the lactose-intolerant. Still as classy as a White Russian."
+ reagent_state = LIQUID
+ color = "#360000" // rgb: 54, 0, 0
+ alcohol_perc = 0.4
+ drink_icon = "blackrussianglass"
+ drink_name = "Black Russian"
+ drink_desc = "For the lactose-intolerant. Still as classy as a White Russian."
+
+/datum/reagent/consumable/ethanol/manhattan
+ name = "Manhattan"
+ id = "manhattan"
+ description = "The Detective's undercover drink of choice. He never could stomach gin..."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.4
+ drink_icon = "manhattanglass"
+ drink_name = "Manhattan"
+ drink_desc = "The Detective's undercover drink of choice. He never could stomach gin..."
+
+/datum/reagent/consumable/ethanol/manhattan_proj
+ name = "Manhattan Project"
+ id = "manhattan_proj"
+ description = "A scienitst's drink of choice, for pondering ways to blow up the station."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.4
+ drink_icon = "proj_manhattanglass"
+ drink_name = "Manhattan Project"
+ drink_desc = "A scienitst drink of choice, for thinking how to blow up the station."
+
+/datum/reagent/consumable/ethanol/whiskeysoda
+ name = "Whiskey Soda"
+ id = "whiskeysoda"
+ description = "Ultimate refreshment."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.3
+ drink_icon = "whiskeysodaglass2"
+ drink_name = "Whiskey Soda"
+ drink_desc = "Ultimate refreshment."
+
+/datum/reagent/consumable/ethanol/antifreeze
+ name = "Anti-freeze"
+ id = "antifreeze"
+ description = "Ultimate refreshment."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "antifreeze"
+ drink_name = "Anti-freeze"
+ drink_desc = "The ultimate refreshment."
+
+/datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/M)
+ if(M.bodytemperature < 330)
+ M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
+ ..()
+
+/datum/reagent/consumable/ethanol/barefoot
+ name = "Barefoot"
+ id = "barefoot"
+ description = "Barefoot and pregnant"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "b&p"
+ drink_name = "Barefoot"
+ drink_desc = "Barefoot and pregnant"
+
+/datum/reagent/consumable/ethanol/snowwhite
+ name = "Snow White"
+ id = "snowwhite"
+ description = "A cold refreshment"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "snowwhite"
+ drink_name = "Snow White"
+ drink_desc = "A cold refreshment."
+
+/datum/reagent/consumable/ethanol/demonsblood
+ name = "Demons Blood"
+ id = "demonsblood"
+ description = "AHHHH!!!!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 10
+ alcohol_perc = 0.4
+ drink_icon = "demonsblood"
+ drink_name = "Demons Blood"
+ drink_desc = "Just looking at this thing makes the hair at the back of your neck stand up."
+
+/datum/reagent/consumable/ethanol/vodkatonic
+ name = "Vodka and Tonic"
+ id = "vodkatonic"
+ description = "For when a gin and tonic isn't russian enough."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 4
+ alcohol_perc = 0.3
+ drink_icon = "vodkatonicglass"
+ drink_name = "Vodka and Tonic"
+ drink_desc = "For when a gin and tonic isn't russian enough."
+
+/datum/reagent/consumable/ethanol/ginfizz
+ name = "Gin Fizz"
+ id = "ginfizz"
+ description = "Refreshingly lemony, deliciously dry."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 4
+ alcohol_perc = 0.4
+ drink_icon = "ginfizzglass"
+ drink_name = "Gin Fizz"
+ drink_desc = "Refreshingly lemony, deliciously dry."
+
+/datum/reagent/consumable/ethanol/bahama_mama
+ name = "Bahama mama"
+ id = "bahama_mama"
+ description = "Tropic cocktail."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "bahama_mama"
+ drink_name = "Bahama Mama"
+ drink_desc = "Tropic cocktail"
+
+/datum/reagent/consumable/ethanol/singulo
+ name = "Singulo"
+ id = "singulo"
+ description = "A blue-space beverage!"
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+ dizzy_adj = 15
+ alcohol_perc = 0.7
+ drink_icon = "singulo"
+ drink_name = "Singulo"
+ drink_desc = "A blue-space beverage."
+
+/datum/reagent/consumable/ethanol/sbiten
+ name = "Sbiten"
+ id = "sbiten"
+ description = "A spicy Vodka! Might be a little hot for the little guys!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.4
+ drink_icon = "sbitenglass"
+ drink_name = "Sbiten"
+ drink_desc = "A spicy mix of Vodka and Spice. Very hot."
+
+/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/M)
+ if(M.bodytemperature < 360)
+ M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
+ ..()
+
+/datum/reagent/consumable/ethanol/devilskiss
+ name = "Devils Kiss"
+ id = "devilskiss"
+ description = "Creepy time!"
+ reagent_state = LIQUID
+ color = "#A68310" // rgb: 166, 131, 16
+ alcohol_perc = 0.3
+ drink_icon = "devilskiss"
+ drink_name = "Devils Kiss"
+ drink_desc = "Creepy time!"
+
+/datum/reagent/consumable/ethanol/red_mead
+ name = "Red Mead"
+ id = "red_mead"
+ description = "The true Viking drink! Even though it has a strange red color."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "red_meadglass"
+ drink_name = "Red Mead"
+ drink_desc = "A True Vikings Beverage, though its color is strange."
+
+/datum/reagent/consumable/ethanol/mead
+ name = "Mead"
+ id = "mead"
+ description = "A Vikings drink, though a cheap one."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "meadglass"
+ drink_name = "Mead"
+ drink_desc = "A Vikings Beverage, though a cheap one."
+
+/datum/reagent/consumable/ethanol/iced_beer
+ name = "Iced Beer"
+ id = "iced_beer"
+ description = "A beer which is so cold the air around it freezes."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "iced_beerglass"
+ drink_name = "Iced Beer"
+ drink_desc = "A beer so frosty, the air around it freezes."
+
+/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/M)
+ if(M.bodytemperature > 270)
+ M.bodytemperature = max(270, M.bodytemperature - (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
+ ..()
+
+/datum/reagent/consumable/ethanol/grog
+ name = "Grog"
+ id = "grog"
+ description = "Watered down rum, Nanotrasen approves!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "grogglass"
+ drink_name = "Grog"
+ drink_desc = "A fine and cepa drink for Space."
+
+/datum/reagent/consumable/ethanol/aloe
+ name = "Aloe"
+ id = "aloe"
+ description = "So very, very, very good."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "aloe"
+ drink_name = "Aloe"
+ drink_desc = "Very, very, very good."
+
+/datum/reagent/consumable/ethanol/andalusia
+ name = "Andalusia"
+ id = "andalusia"
+ description = "A nice, strange named drink."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.4
+ drink_icon = "andalusia"
+ drink_name = "Andalusia"
+ drink_desc = "A nice, strange named drink."
+
+/datum/reagent/consumable/ethanol/alliescocktail
+ name = "Allies Cocktail"
+ id = "alliescocktail"
+ description = "A drink made from your allies."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.5
+ drink_icon = "alliescocktail"
+ drink_name = "Allies cocktail"
+ drink_desc = "A drink made from your allies."
+
+/datum/reagent/consumable/ethanol/acid_spit
+ name = "Acid Spit"
+ id = "acidspit"
+ description = "A drink by Nanotrasen. Made from live aliens."
+ reagent_state = LIQUID
+ color = "#365000" // rgb: 54, 80, 0
+ alcohol_perc = 0.3
+ drink_icon = "acidspitglass"
+ drink_name = "Acid Spit"
+ drink_desc = "A drink from Nanotrasen. Made from live aliens."
+
+/datum/reagent/consumable/ethanol/amasec
+ name = "Amasec"
+ id = "amasec"
+ description = "Official drink of the Imperium."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.3
+ drink_icon = "amasecglass"
+ drink_name = "Amasec"
+ drink_desc = "Always handy before COMBAT!!!"
+
+/datum/reagent/consumable/ethanol/neurotoxin
+ name = "Neuro-toxin"
+ id = "neurotoxin"
+ description = "A strong neurotoxin that puts the subject into a death-like state."
+ reagent_state = LIQUID
+ color = "#2E2E61" // rgb: 46, 46, 97
+ dizzy_adj = 6
+ alcohol_perc = 0.7
+ heart_rate_decrease = 1
+ drink_icon = "neurotoxinglass"
+ drink_name = "Neurotoxin"
+ drink_desc = "A drink that is guaranteed to knock you silly."
+
+/datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/M)
+ M.Weaken(3)
+ if(current_cycle >=55)
+ M.Druggy(55)
+ if(current_cycle >=200)
+ M.adjustToxLoss(2)
+ ..()
+
+/datum/reagent/consumable/ethanol/hippies_delight
+ name = "Hippie's Delight"
+ id = "hippiesdelight"
+ description = "You just don't get it maaaan."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ metabolization_rate = 0.2 * REAGENTS_METABOLISM
+ drink_icon = "hippiesdelightglass"
+ drink_name = "Hippie's Delight"
+ drink_desc = "A drink enjoyed by people during the 1960's."
+
+/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/M)
+ M.Druggy(50)
+ switch(current_cycle)
+ if(1 to 5)
+ if(!M.stuttering) M.stuttering = 1
+ M.Dizzy(10)
+ if(prob(10)) M.emote(pick("twitch","giggle"))
+ if(5 to 10)
+ if(!M.stuttering) M.stuttering = 1
+ M.Jitter(20)
+ M.Dizzy(20)
+ M.Druggy(45)
+ if(prob(20)) M.emote(pick("twitch","giggle"))
+ if(10 to INFINITY)
+ if(!M.stuttering) M.stuttering = 1
+ M.Jitter(40)
+ M.Dizzy(40)
+ M.Druggy(60)
+ if(prob(30)) M.emote(pick("twitch","giggle"))
+ ..()
+
+/datum/reagent/consumable/ethanol/changelingsting
+ name = "Changeling Sting"
+ id = "changelingsting"
+ description = "A stingy drink."
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+ alcohol_perc = 0.7
+ dizzy_adj = 5
+ drink_icon = "changelingsting"
+ drink_name = "Changeling Sting"
+ drink_desc = "A stingy drink."
+
+/datum/reagent/consumable/ethanol/irishcarbomb
+ name = "Irish Car Bomb"
+ id = "irishcarbomb"
+ description = "Mmm, tastes like chocolate cake..."
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+ alcohol_perc = 0.3
+ dizzy_adj = 5
+ drink_icon = "irishcarbomb"
+ drink_name = "Irish Car Bomb"
+ drink_desc = "An irish car bomb."
+
+/datum/reagent/consumable/ethanol/syndicatebomb
+ name = "Syndicate Bomb"
+ id = "syndicatebomb"
+ description = "A Syndicate bomb"
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+ alcohol_perc = 0.2
+ drink_icon = "syndicatebomb"
+ drink_name = "Syndicate Bomb"
+ drink_desc = "A syndicate bomb."
+
+/datum/reagent/consumable/ethanol/erikasurprise
+ name = "Erika Surprise"
+ id = "erikasurprise"
+ description = "The surprise is, it's green!"
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+ alcohol_perc = 0.2
+ drink_icon = "erikasurprise"
+ name = "Erika Surprise"
+ drink_desc = "The surprise is, it's green!"
+
+/datum/reagent/consumable/ethanol/driestmartini
+ name = "Driest Martini"
+ id = "driestmartini"
+ description = "Only for the experienced. You think you see sand floating in the glass."
+ nutriment_factor = 1 * REAGENTS_METABOLISM
+ color = "#2E6671" // rgb: 46, 102, 113
+ alcohol_perc = 0.5
+ dizzy_adj = 10
+ drink_icon = "driestmartiniglass"
+ drink_name = "Driest Martini"
+ drink_desc = "Only for the experienced. You think you see sand floating in the glass."
+
+/datum/reagent/consumable/ethanol/driestmartini/on_mob_life(mob/living/M)
+ if(current_cycle >= 55 && current_cycle < 115)
+ M.stuttering += 10
+ ..()
+
+/datum/reagent/consumable/ethanol/kahlua
+ name = "Kahlua"
+ id = "kahlua"
+ description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!"
+ color = "#664300" // rgb: 102, 67, 0
+ alcohol_perc = 0.2
+ drink_icon = "kahluaglass"
+ drink_name = "Glass of RR coffee Liquor"
+ drink_desc = "DAMN, THIS THING LOOKS ROBUST"
+
+/datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/M)
+ M.AdjustDizzy(-5)
+ M.AdjustDrowsy(-3)
+ M.AdjustSleeping(-2)
+ M.Jitter(5)
+ ..()
+
+/datum/reagent/ginsonic
+ name = "Gin and sonic"
+ id = "ginsonic"
+ description = "GOTTA GET CRUNK FAST BUT LIQUOR TOO SLOW"
+ reagent_state = LIQUID
+ color = "#1111CF"
+ drink_icon = "ginsonic"
+ drink_name = "Gin and Sonic"
+ drink_desc = "An extremely high amperage drink. Absolutely not for the true Englishman."
+
+/datum/reagent/ginsonic/on_mob_life(mob/living/M)
+ M.AdjustDrowsy(-5)
+ if(prob(25))
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ if(prob(8))
+ M.reagents.add_reagent("methamphetamine",1.2)
+ var/sonic_message = pick("Gotta go fast!", "Time to speed, keed!", "I feel a need for speed!", "Let's juice.", "Juice time.", "Way Past Cool!")
+ if(prob(50))
+ M.say("[sonic_message]")
+ else
+ to_chat(M, "[sonic_message ]")
+ ..()
+
+/datum/reagent/consumable/ethanol/applejack
+ name = "Applejack"
+ id = "applejack"
+ description = "A highly concentrated alcoholic beverage made by repeatedly freezing cider and removing the ice."
+ color = "#997A00"
+ alcohol_perc = 0.4
+ drink_icon = "cognacglass"
+ drink_name = "Glass of applejack"
+ drink_desc = "When cider isn't strong enough, you gotta jack it."
+
+/datum/reagent/consumable/ethanol/jackrose
+ name = "Jack Rose"
+ id = "jackrose"
+ description = "A classic cocktail that had fallen out of fashion, but never out of taste,"
+ color = "#664300"
+ alcohol_perc = 0.4
+ drink_icon = "patronglass"
+ drink_name = "Jack Rose"
+ drink_desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s."
+
+/datum/reagent/consumable/ethanol/dragons_breath //inaccessible to players, but here for admin shennanigans
+ name = "Dragon's Breath"
+ id = "dragonsbreath"
+ description = "Possessing this stuff probably breaks the Geneva convention."
+ reagent_state = LIQUID
+ color = "#DC0000"
+ alcohol_perc = 1
+ can_synth = 0
+
+/datum/reagent/consumable/ethanol/dragons_breath/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == INGEST && prob(20))
+ if(M.on_fire)
+ M.adjust_fire_stacks(3)
+
+/datum/reagent/consumable/ethanol/dragons_breath/on_mob_life(mob/living/M)
+ if(M.reagents.has_reagent("milk"))
+ to_chat(M, "The milk stops the burning. Ahhh.")
+ M.reagents.del_reagent("milk")
+ M.reagents.del_reagent("dragonsbreath")
+ return
+ if(prob(8))
+ to_chat(M, "Oh god! Oh GODD!!")
+ if(prob(50))
+ to_chat(M, "Your throat burns terribly!")
+ M.emote(pick("scream","cry","choke","gasp"))
+ M.Stun(1)
+ if(prob(8))
+ to_chat(M, "Why!? WHY!?")
+ if(prob(8))
+ to_chat(M, "ARGHHHH!")
+ if(prob(2 * volume))
+ to_chat(M, "OH GOD OH GOD PLEASE NO!!")
+ if(M.on_fire)
+ M.adjust_fire_stacks(5)
+ if(prob(50))
+ to_chat(M, "IT BURNS!!!!")
+ M.visible_message("[M] is consumed in flames!")
+ M.dust()
+ return
+ ..()
+
+// ROBOT ALCOHOL PAST THIS POINT
+// WOOO!
+
+/datum/reagent/consumable/ethanol/synthanol
+ name = "Synthanol"
+ id = "synthanol"
+ description = "A runny liquid with conductive capacities. Its effects on synthetics are similar to those of alcohol on organics."
+ reagent_state = LIQUID
+ color = "#1BB1FF"
+ process_flags = ORGANIC | SYNTHETIC
+ alcohol_perc = 0.5
+ drink_icon = "synthanolglass"
+ drink_name = "Glass of Synthanol"
+ drink_desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too."
+
+/datum/reagent/consumable/ethanol/synthanol/on_mob_life(mob/living/M)
+ if(!M.isSynthetic())
+ holder.remove_reagent(id, 3.6) //gets removed from organics very fast
+ if(prob(25))
+ holder.remove_reagent(id, 15)
+ M.fakevomit()
+ ..()
+
+/datum/reagent/consumable/ethanol/synthanol/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(M.isSynthetic())
+ return
+ if(method == INGEST)
+ to_chat(M, pick("That was awful!", "Yuck!"))
+
+/datum/reagent/consumable/ethanol/synthanol/robottears
+ name = "Robot Tears"
+ id = "robottears"
+ description = "An oily substance that an IPC could technically consider a 'drink'."
+ reagent_state = LIQUID
+ color = "#363636"
+ alcohol_perc = 0.25
+ drink_icon = "robottearsglass"
+ drink_name = "Glass of Robot Tears"
+ drink_desc = "No robots were hurt in the making of this drink."
+
+/datum/reagent/consumable/ethanol/synthanol/trinary
+ name = "Trinary"
+ id = "trinary"
+ description = "A fruit drink meant only for synthetics, however that works."
+ reagent_state = LIQUID
+ color = "#adb21f"
+ alcohol_perc = 0.2
+ drink_icon = "trinaryglass"
+ drink_name = "Glass of Trinary"
+ drink_desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well."
+
+/datum/reagent/consumable/ethanol/synthanol/servo
+ name = "Servo"
+ id = "servo"
+ description = "A drink containing some organic ingredients, but meant only for synthetics."
+ reagent_state = LIQUID
+ color = "#5b3210"
+ alcohol_perc = 0.25
+ drink_icon = "servoglass"
+ drink_name = "Glass of Servo"
+ drink_desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe."
+
+/datum/reagent/consumable/ethanol/synthanol/uplink
+ name = "Uplink"
+ id = "uplink"
+ description = "A potent mix of alcohol and synthanol. Will only work on synthetics."
+ reagent_state = LIQUID
+ color = "#e7ae04"
+ alcohol_perc = 0.15
+ drink_icon = "uplinkglass"
+ drink_name = "Glass of Uplink"
+ drink_desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics."
+
+/datum/reagent/consumable/ethanol/synthanol/synthnsoda
+ name = "Synth 'n Soda"
+ id = "synthnsoda"
+ description = "The classic drink adjusted for a robot's tastes."
+ reagent_state = LIQUID
+ color = "#7204e7"
+ alcohol_perc = 0.25
+ drink_icon = "synthnsodaglass"
+ drink_name = "Glass of Synth 'n Soda"
+ drink_desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon."
+
+/datum/reagent/consumable/ethanol/synthanol/synthignon
+ name = "Synthignon"
+ id = "synthignon"
+ description = "Someone mixed wine and alcohol for robots. Hope you're proud of yourself."
+ reagent_state = LIQUID
+ color = "#d004e7"
+ alcohol_perc = 0.25
+ drink_icon = "synthignonglass"
+ drink_name = "Glass of Synthignon"
+ drink_desc = "Someone mixed good wine and robot booze. Romantic, but atrocious."
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/chemistry/reagents/blob.dm
similarity index 97%
rename from code/modules/reagents/newchem/Blob-Reagents.dm
rename to code/modules/reagents/chemistry/reagents/blob.dm
index fa5e9747e34..895922c7542 100644
--- a/code/modules/reagents/newchem/Blob-Reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob.dm
@@ -4,6 +4,7 @@
description = ""
var/message = "The blob strikes you" //message sent to any mob hit by the blob
var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt
+ can_synth = 0
/datum/reagent/blob/reaction_mob(mob/living/M, method=TOUCH, volume, show_message, touch_protection)
return round(volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume.
@@ -61,7 +62,7 @@
volume = ..()
M.apply_damage(0.4*volume, BRUTE)
M.apply_damage(1*volume, OXY)
- M.losebreath += round(0.3*volume)
+ M.AdjustLoseBreath(round(0.3*volume))
/datum/reagent/blob/kinetic //does semi-random brute damage
@@ -149,4 +150,4 @@
if(message_living && !issilicon(M))
totalmessage += message_living
totalmessage += "!"
- to_chat(M, "[totalmessage]")
+ to_chat(M, "[totalmessage]")
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm
new file mode 100644
index 00000000000..f9fbf930e3e
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/disease.dm
@@ -0,0 +1,186 @@
+/datum/reagent/spider_eggs
+ name = "spider eggs"
+ id = "spidereggs"
+ description = "A fine dust containing spider eggs. Oh gosh."
+ reagent_state = SOLID
+ color = "#FFFFFF"
+ can_synth = 0
+
+/datum/reagent/spider_eggs/on_mob_life(mob/living/M)
+ if(volume > 2.5)
+ if(iscarbon(M))
+ if(!M.get_int_organ(/obj/item/organ/internal/body_egg))
+ new/obj/item/organ/internal/body_egg/spider_eggs(M) //Yes, even Xenos can fall victim to the plague that is spider infestation.
+ ..()
+
+
+/datum/reagent/nanomachines
+ name = "Nanomachines"
+ id = "nanomachines"
+ description = "Microscopic construction robots."
+ color = "#535E66" // rgb: 83, 94, 102
+ can_synth = 0
+
+/datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M)
+ if(volume > 1.5)
+ M.ForceContractDisease(new /datum/disease/transformation/robot(0))
+ ..()
+
+
+/datum/reagent/xenomicrobes
+ name = "Xenomicrobes"
+ id = "xenomicrobes"
+ description = "Microbes with an entirely alien cellular structure."
+ color = "#535E66" // rgb: 83, 94, 102
+ can_synth = 0
+
+/datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M)
+ if(volume > 1.5)
+ M.ContractDisease(new /datum/disease/transformation/xeno(0))
+ ..()
+
+/datum/reagent/fungalspores
+ name = "Tubercle bacillus Cosmosis microbes"
+ id = "fungalspores"
+ description = "Active fungal spores."
+ color = "#92D17D" // rgb: 146, 209, 125
+ can_synth = 0
+
+/datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M)
+ if(volume > 2.5)
+ M.ForceContractDisease(new /datum/disease/tuberculosis(0))
+ ..()
+
+/datum/reagent/jagged_crystals
+ name = "Jagged Crystals"
+ id = "jagged_crystals"
+ description = "Rapid chemical decomposition has warped these crystals into twisted spikes."
+ reagent_state = SOLID
+ color = "#FA0000" // rgb: 250, 0, 0
+ can_synth = 0
+
+/datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M)
+ M.ForceContractDisease(new /datum/disease/berserker(0))
+ ..()
+
+/datum/reagent/salmonella
+ name = "Salmonella"
+ id = "salmonella"
+ description = "A nasty bacteria found in spoiled food."
+ reagent_state = LIQUID
+ color = "#1E4600"
+ can_synth = 0
+
+/datum/reagent/salmonella/on_mob_life(mob/living/carbon/M)
+ M.ForceContractDisease(new /datum/disease/food_poisoning(0))
+ ..()
+
+/datum/reagent/gibbis
+ name = "Gibbis"
+ id = "gibbis"
+ description = "Liquid gibbis."
+ reagent_state = LIQUID
+ color = "#FF0000"
+ can_synth = 0
+
+/datum/reagent/gibbis/on_mob_life(mob/living/carbon/M)
+ if(volume > 2.5)
+ M.ForceContractDisease(new /datum/disease/gbs/curable(0))
+ ..()
+
+/datum/reagent/prions
+ name = "Prions"
+ id = "prions"
+ description = "A disease-causing agent that is neither bacterial nor fungal nor viral and contains no genetic material."
+ reagent_state = LIQUID
+ color = "#FFFFFF"
+ can_synth = 0
+
+/datum/reagent/prions/on_mob_life(mob/living/carbon/M)
+ if(volume > 4.5)
+ M.ForceContractDisease(new /datum/disease/kuru(0))
+ ..()
+
+/datum/reagent/grave_dust
+ name = "Grave Dust"
+ id = "grave_dust"
+ description = "Moldy old dust taken from a grave site."
+ reagent_state = LIQUID
+ color = "#465046"
+ can_synth = 0
+
+/datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M)
+ if(volume > 4.5)
+ M.ForceContractDisease(new /datum/disease/vampire(0))
+ ..()
+
+/datum/reagent/heartworms
+ name = "Space heartworms"
+ id = "heartworms"
+ description = "Aww, gross! These things can't be good for your heart. They're gunna eat it!"
+ reagent_state = SOLID
+ color = "#925D6C"
+ can_synth = 0
+
+/datum/reagent/heartworms/on_mob_life(mob/living/carbon/M)
+ if(volume > 4.5)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/internal/heart/ate_heart = H.get_int_organ(/obj/item/organ/internal/heart)
+ if(ate_heart)
+ ate_heart.remove(H)
+ qdel(ate_heart)
+ ..()
+
+/datum/reagent/concentrated_initro
+ name = "Concentrated Initropidril"
+ id = "concentrated_initro"
+ description = "A guaranteed heart-stopper!"
+ reagent_state = LIQUID
+ color = "#AB1CCF"
+ can_synth = 0
+
+/datum/reagent/concentrated_initro/on_mob_life(mob/living/M)
+ if(volume >=5)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(!H.heart_attack)
+ H.heart_attack = 1 // rip in pepperoni
+
+//virus foods
+
+/datum/reagent/consumable/virus_food
+ name = "Virus Food"
+ id = "virusfood"
+ description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce."
+ reagent_state = LIQUID
+ nutriment_factor = 2 * REAGENTS_METABOLISM
+ color = "#899613" // rgb: 137, 150, 19
+
+/datum/reagent/mutagen/mutagenvirusfood
+ name = "mutagenic agar"
+ id = "mutagenvirusfood"
+ description = "mutates blood"
+ color = "#A3C00F" // rgb: 163,192,15
+
+/datum/reagent/mutagen/mutagenvirusfood/sugar
+ name = "sucrose agar"
+ id = "sugarvirusfood"
+ color = "#41B0C0" // rgb: 65,176,192
+
+/datum/reagent/medicine/diphenhydramine/diphenhydraminevirusfood
+ name = "virus rations"
+ id = "diphenhydraminevirusfood"
+ description = "mutates blood"
+ color = "#D18AA5" // rgb: 209,138,165
+
+/datum/reagent/plasma_dust/plasmavirusfood
+ name = "virus plasma"
+ id = "plasmavirusfood"
+ description = "mutates blood"
+ color = "#A69DA9" // rgb: 166,157,169
+
+/datum/reagent/plasma_dust/plasmavirusfood/weak
+ name = "weakened virus plasma"
+ id = "weakplasmavirusfood"
+ color = "#CEC3C6" // rgb: 206,195,198
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm b/code/modules/reagents/chemistry/reagents/drink_base.dm
similarity index 73%
rename from code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm
rename to code/modules/reagents/chemistry/reagents/drink_base.dm
index 1868489adb7..25484983a4f 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_base.dm
@@ -1,9 +1,8 @@
-/datum/reagent/drink
+/datum/reagent/consumable/drink
name = "Drink"
id = "drink"
description = "Uh, some kind of drink."
reagent_state = LIQUID
- nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#E78108" // rgb: 231, 129, 8
var/adj_dizzy = 0
var/adj_drowsy = 0
@@ -11,12 +10,11 @@
var/adj_temp_hot = 0
var/adj_temp_cool = 0
-/datum/reagent/drink/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
+/datum/reagent/consumable/drink/on_mob_life(mob/living/M)
if(adj_dizzy)
- M.dizziness = max(0, M.dizziness + adj_dizzy)
+ M.AdjustDizzy(adj_dizzy)
if(adj_drowsy)
- M.drowsyness = max(0, M.drowsyness + adj_drowsy)
+ M.AdjustDrowsy(adj_drowsy)
if(adj_sleepy)
M.AdjustSleeping(adj_sleepy)
if(adj_temp_hot)
diff --git a/code/modules/reagents/chemistry/reagents/drink_cold.dm b/code/modules/reagents/chemistry/reagents/drink_cold.dm
new file mode 100644
index 00000000000..ffd43a81840
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/drink_cold.dm
@@ -0,0 +1,163 @@
+/datum/reagent/consumable/drink/cold
+ name = "Cold drink"
+ adj_temp_cool = 5
+
+/datum/reagent/consumable/drink/cold/tonic
+ name = "Tonic Water"
+ id = "tonic"
+ description = "It tastes strange but at least the quinine keeps the Space Malaria at bay."
+ color = "#664300" // rgb: 102, 67, 0
+ adj_dizzy = -5
+ adj_drowsy = -3
+ adj_sleepy = -2
+ drink_icon = "glass_clear"
+ drink_name = "Glass of Tonic Water"
+ drink_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
+
+/datum/reagent/consumable/drink/cold/sodawater
+ name = "Soda Water"
+ id = "sodawater"
+ description = "A can of club soda. Why not make a scotch and soda?"
+ color = "#619494" // rgb: 97, 148, 148
+ adj_dizzy = -5
+ adj_drowsy = -3
+ drink_icon = "glass_clear"
+ drink_name = "Glass of Soda Water"
+ drink_desc = "Soda water. Why not make a scotch and soda?"
+
+/datum/reagent/consumable/drink/cold/ice
+ name = "Ice"
+ id = "ice"
+ description = "Frozen water, your dentist wouldn't like you chewing this."
+ reagent_state = SOLID
+ color = "#619494" // rgb: 97, 148, 148
+ adj_temp_cool = 0
+ drink_icon = "iceglass"
+ drink_name = "Glass of ice"
+ drink_desc = "Generally, you're supposed to put something else in there too..."
+
+/datum/reagent/consumable/drink/cold/ice/on_mob_life(mob/living/M)
+ M.bodytemperature = max(M.bodytemperature - 5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0)
+ ..()
+
+/datum/reagent/consumable/drink/cold/space_cola
+ name = "Cola"
+ id = "cola"
+ description = "A refreshing beverage."
+ reagent_state = LIQUID
+ color = "#100800" // rgb: 16, 8, 0
+ adj_drowsy = -5
+ drink_icon = "glass_brown"
+ drink_name = "Glass of Space Cola"
+ drink_desc = "A glass of refreshing Space Cola"
+
+/datum/reagent/consumable/drink/cold/nuka_cola
+ name = "Nuka Cola"
+ id = "nuka_cola"
+ description = "Cola, cola never changes."
+ color = "#100800" // rgb: 16, 8, 0
+ adj_sleepy = -2
+ drink_icon = "nuka_colaglass"
+ drink_name = "Nuka Cola"
+ drink_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland"
+
+/datum/reagent/consumable/drink/cold/nuka_cola/on_mob_life(mob/living/M)
+ M.Jitter(20)
+ M.Druggy(30)
+ M.AdjustDizzy(5)
+ M.SetDrowsy(0)
+ M.status_flags |= GOTTAGOFAST
+ ..()
+
+/datum/reagent/consumable/drink/cold/nuka_cola/on_mob_delete(mob/living/M)
+ M.status_flags &= ~GOTTAGOFAST
+ ..()
+
+/datum/reagent/consumable/drink/cold/spacemountainwind
+ name = "Space Mountain Wind"
+ id = "spacemountainwind"
+ description = "Blows right through you like a space wind."
+ color = "#102000" // rgb: 16, 32, 0
+ adj_drowsy = -7
+ adj_sleepy = -1
+ drink_icon = "Space_mountain_wind_glass"
+ drink_name = "Glass of Space Mountain Wind"
+ drink_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind."
+
+/datum/reagent/consumable/drink/cold/dr_gibb
+ name = "Dr. Gibb"
+ id = "dr_gibb"
+ description = "A delicious blend of 42 different flavours"
+ color = "#102000" // rgb: 16, 32, 0
+ adj_drowsy = -6
+ drink_icon = "dr_gibb_glass"
+ drink_name = "Glass of Dr. Gibb"
+ drink_desc = "Dr. Gibb. Not as dangerous as the name might imply."
+
+/datum/reagent/consumable/drink/cold/space_up
+ name = "Space-Up"
+ id = "space_up"
+ description = "Tastes like a hull breach in your mouth."
+ color = "#202800" // rgb: 32, 40, 0
+ adj_temp_cool = 8
+ drink_icon = "space-up_glass"
+ drink_name = "Glass of Space-up"
+ drink_desc = "Space-up. It helps keep your cool."
+
+/datum/reagent/consumable/drink/cold/lemon_lime
+ name = "Lemon Lime"
+ description = "A tangy substance made of 0.5% natural citrus!"
+ id = "lemon_lime"
+ color = "#878F00" // rgb: 135, 40, 0
+ adj_temp_cool = 8
+
+/datum/reagent/consumable/drink/cold/lemonade
+ name = "Lemonade"
+ description = "Oh the nostalgia..."
+ id = "lemonade"
+ color = "#FFFF00" // rgb: 255, 255, 0
+ drink_icon = "lemonade"
+ drink_name = "Lemonade"
+ drink_desc = "Oh the nostalgia..."
+
+/datum/reagent/consumable/drink/cold/kiraspecial
+ name = "Kira Special"
+ description = "Long live the guy who everyone had mistaken for a girl. Baka!"
+ id = "kiraspecial"
+ color = "#CCCC99" // rgb: 204, 204, 153
+ drink_icon = "kiraspecial"
+ drink_name = "Kira Special"
+ drink_desc = "Long live the guy who everyone had mistaken for a girl. Baka!"
+
+/datum/reagent/consumable/drink/cold/brownstar
+ name = "Brown Star"
+ description = "It's not what it sounds like..."
+ id = "brownstar"
+ color = "#9F3400" // rgb: 159, 052, 000
+ adj_temp_cool = 2
+ drink_icon = "brownstar"
+ drink_name = "Brown Star"
+ drink_desc = "Its not what it sounds like..."
+
+/datum/reagent/consumable/drink/cold/milkshake
+ name = "Milkshake"
+ description = "Glorious brainfreezing mixture."
+ id = "milkshake"
+ color = "#AEE5E4" // rgb" 174, 229, 228
+ adj_temp_cool = 9
+ drink_icon = "milkshake"
+ drink_name = "Milkshake"
+ drink_desc = "Glorious brainfreezing mixture."
+
+/datum/reagent/consumable/drink/cold/rewriter
+ name = "Rewriter"
+ description = "The secert of the sanctuary of the Libarian..."
+ id = "rewriter"
+ color = "#485000" // rgb:72, 080, 0
+ drink_icon = "rewriter"
+ drink_name = "Rewriter"
+ drink_desc = "The secert of the sanctuary of the Libarian..."
+
+/datum/reagent/consumable/drink/cold/rewriter/on_mob_life(mob/living/M)
+ M.Jitter(5)
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm
new file mode 100644
index 00000000000..489eac3eb81
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/drinks.dm
@@ -0,0 +1,362 @@
+/datum/reagent/consumable/drink/orangejuice
+ name = "Orange juice"
+ id = "orangejuice"
+ description = "Both delicious AND rich in Vitamin C, what more do you need?"
+ color = "#E78108" // rgb: 231, 129, 8
+ drink_icon = "glass_orange"
+ drink_name = "Glass of Orange juice"
+ drink_desc = "Vitamins! Yay!"
+
+/datum/reagent/consumable/drink/orangejuicde/on_mob_life(mob/living/M)
+ if(M.getOxyLoss() && prob(30))
+ M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
+
+/datum/reagent/consumable/drink/tomatojuice
+ name = "Tomato Juice"
+ id = "tomatojuice"
+ description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?"
+ color = "#731008" // rgb: 115, 16, 8
+ drink_icon = "glass_red"
+ drink_name = "Glass of Tomato juice"
+ drink_desc = "Are you sure this is tomato juice?"
+
+/datum/reagent/consumable/drink/tomatojuice/on_mob_life(mob/living/M)
+ if(M.getFireLoss() && prob(20))
+ M.adjustFireLoss(-1)
+ ..()
+
+/datum/reagent/consumable/drink/limejuice
+ name = "Lime Juice"
+ id = "limejuice"
+ description = "The sweet-sour juice of limes."
+ color = "#365E30" // rgb: 54, 94, 48
+ drink_icon = "glass_green"
+ drink_name = "Glass of Lime juice"
+ drink_desc = "A glass of sweet-sour lime juice."
+
+/datum/reagent/consumable/drink/limejuice/on_mob_life(mob/living/M)
+ if(M.getToxLoss() && prob(20))
+ M.adjustToxLoss(-1)
+ ..()
+
+/datum/reagent/consumable/drink/carrotjuice
+ name = "Carrot juice"
+ id = "carrotjuice"
+ description = "It is just like a carrot but without crunching."
+ color = "#973800" // rgb: 151, 56, 0
+ drink_icon = "carrotjuice"
+ drink_name = "Glass of carrot juice"
+ drink_desc = "It is just like a carrot but without crunching."
+
+/datum/reagent/consumable/drink/carrotjuicde/on_mob_life(mob/living/M)
+ M.AdjustEyeBlurry(-1)
+ M.AdjustEyeBlind(-1)
+ switch(current_cycle)
+ if(1 to 20)
+ //nothing
+ if(21 to INFINITY)
+ if(prob(current_cycle-10))
+ M.disabilities &= ~NEARSIGHTED
+ ..()
+
+/datum/reagent/consumable/drink/doctor_delight
+ name = "The Doctor's Delight"
+ id = "doctorsdelight"
+ description = "A gulp a day keeps the MediBot away. That's probably for the best."
+ reagent_state = LIQUID
+ color = "#FF8CFF" // rgb: 255, 140, 255
+ drink_icon = "doctorsdelightglass"
+ drink_name = "Doctor's Delight"
+ drink_desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place."
+
+/datum/reagent/consumable/drink/doctors_delight/on_mob_life(mob/living/M)
+ if(M.getToxLoss() && prob(20))
+ M.adjustToxLoss(-1)
+ ..()
+
+/datum/reagent/consumable/drink/triple_citrus
+ name = "Triple Citrus"
+ id = "triple_citrus"
+ description = "A refreshing mixed drink of orange, lemon and lime juice."
+ reagent_state = LIQUID
+ color = "#23A046"
+ drink_icon = "triplecitrus"
+ drink_name = "Glass of Triplecitrus Juice"
+ drink_desc = "As colorful and healthy as it is delicious."
+
+/datum/reagent/consumable/drink/triple_citrus/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == INGEST)
+ M.adjustToxLoss(-rand(1,2))
+
+/datum/reagent/consumable/drink/berryjuice
+ name = "Berry Juice"
+ id = "berryjuice"
+ description = "A delicious blend of several different kinds of berries."
+ color = "#863333" // rgb: 134, 51, 51
+ drink_icon = "berryjuice"
+ drink_name = "Glass of berry juice"
+ drink_desc = "Berry juice. Or maybe its jam. Who cares?"
+
+/datum/reagent/consumable/drink/poisonberryjuice
+ name = "Poison Berry Juice"
+ id = "poisonberryjuice"
+ description = "A tasty juice blended from various kinds of very deadly and toxic berries."
+ color = "#863353" // rgb: 134, 51, 83
+ drink_icon = "poisonberryjuice"
+ drink_name = "Glass of poison berry juice"
+ drink_desc = "A glass of deadly juice."
+
+/datum/reagent/consumable/drink/poisonberryjuice/on_mob_life(mob/living/M)
+ M.adjustToxLoss(1)
+ ..()
+
+/datum/reagent/consumable/drink/watermelonjuice
+ name = "Watermelon Juice"
+ id = "watermelonjuice"
+ description = "Delicious juice made from watermelon."
+ color = "#863333" // rgb: 134, 51, 51
+
+/datum/reagent/consumable/drink/lemonjuice
+ name = "Lemon Juice"
+ id = "lemonjuice"
+ description = "This juice is VERY sour."
+ color = "#863333" // rgb: 175, 175, 0
+ drink_icon = "lemonglass"
+ drink_name = "Glass of lemonjuice"
+ drink_desc = "Sour..."
+
+/datum/reagent/consumable/drink/grapejuice
+ name = "Grape Juice"
+ id = "grapejuice"
+ description = "This juice is known to stain shirts."
+ color = "#993399" // rgb: 153, 51, 153
+
+/datum/reagent/consumable/drink/banana
+ name = "Banana Juice"
+ id = "banana"
+ description = "The raw essence of a banana."
+ color = "#863333" // rgb: 175, 175, 0
+ drink_icon = "banana"
+ drink_name = "Glass of banana juice"
+ drink_desc = "The raw essence of a banana. HONK"
+
+/datum/reagent/consumable/drink/banana/on_mob_life(mob/living/M)
+ if((ishuman(M) && M.job in list("Clown") ) || issmall(M))
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+ ..()
+
+/datum/reagent/consumable/drink/nothing
+ name = "Nothing"
+ id = "nothing"
+ description = "Absolutely nothing."
+ drink_icon = "nothing"
+ drink_name = "Nothing"
+ drink_desc = "Absolutely nothing."
+
+/datum/reagent/consumable/drink/nothing/on_mob_life(mob/living/M)
+ if(ishuman(M) && M.job in list("Mime"))
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+ ..()
+
+/datum/reagent/consumable/drink/potato_juice
+ name = "Potato Juice"
+ id = "potato"
+ description = "Juice of the potato. Bleh."
+ nutriment_factor = 2 * REAGENTS_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+ drink_icon = "glass_brown"
+ drink_name = "Glass of potato juice"
+ drink_desc = "Who in the hell requests this? Gross!"
+
+/datum/reagent/consumable/drink/milk
+ name = "Milk"
+ id = "milk"
+ description = "An opaque white liquid produced by the mammary glands of mammals."
+ color = "#DFDFDF" // rgb: 223, 223, 223
+ drink_icon = "glass_white"
+ drink_name = "Glass of milk"
+ drink_desc = "White and nutritious goodness!"
+
+/datum/reagent/consumable/drink/milk/on_mob_life(mob/living/M)
+ if(M.getBruteLoss() && prob(20))
+ M.adjustBruteLoss(-1)
+ if(holder.has_reagent("capsaicin"))
+ holder.remove_reagent("capsaicin", 2)
+ ..()
+
+/datum/reagent/consumable/drink/milk/soymilk
+ name = "Soy Milk"
+ id = "soymilk"
+ description = "An opaque white liquid made from soybeans."
+ color = "#DFDFC7" // rgb: 223, 223, 199
+ drink_name = "Glass of soy milk"
+ drink_desc = "White and nutritious soy goodness!"
+
+/datum/reagent/consumable/drink/milk/cream
+ name = "Cream"
+ id = "cream"
+ description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?"
+ color = "#DFD7AF" // rgb: 223, 215, 175
+ drink_name = "Glass of cream"
+ drink_desc = "Ewwww..."
+
+/datum/reagent/consumable/drink/milk/chocolate_milk
+ name = "Chocolate milk"
+ id ="chocolate_milk"
+ description = "Chocolate-flavored milk, tastes like being a kid again."
+ color = "#85432C"
+
+/datum/reagent/consumable/drink/hot_coco
+ name = "Hot Chocolate"
+ id = "hot_coco"
+ description = "Made with love! And coco beans."
+ nutriment_factor = 2 * REAGENTS_METABOLISM
+ color = "#403010" // rgb: 64, 48, 16
+ adj_temp_hot = 5
+ drink_icon = "hot_coco"
+ drink_name = "Glass of hot coco"
+ drink_desc = "Delicious and cozy"
+
+/datum/reagent/consumable/drink/coffee
+ name = "Coffee"
+ id = "coffee"
+ description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant."
+ color = "#482000" // rgb: 72, 32, 0
+ adj_dizzy = -5
+ adj_drowsy = -3
+ adj_sleepy = -2
+ adj_temp_hot = 25
+ overdose_threshold = 45
+ addiction_chance = 1 // It's true.
+ heart_rate_increase = 1
+ drink_icon = "glass_brown"
+ drink_name = "Glass of coffee"
+ drink_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere."
+
+/datum/reagent/consumable/drink/coffee/on_mob_life(mob/living/M)
+ if(holder.has_reagent("frostoil"))
+ holder.remove_reagent("frostoil", 5)
+ if(prob(50))
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ ..()
+
+/datum/reagent/consumable/drink/coffee/overdose_process(mob/living/M, severity)
+ if(volume > 45)
+ M.Jitter(5)
+
+/datum/reagent/consumable/drink/coffee/icecoffee
+ name = "Iced Coffee"
+ id = "icecoffee"
+ description = "Coffee and ice, refreshing and cool."
+ color = "#102838" // rgb: 16, 40, 56
+ adj_temp_hot = 0
+ adj_temp_cool = 5
+ drink_icon = "icedcoffeeglass"
+ drink_name = "Iced Coffee"
+ drink_desc = "A drink to perk you up and refresh you!"
+
+/datum/reagent/consumable/drink/coffee/soy_latte
+ name = "Soy Latte"
+ id = "soy_latte"
+ description = "A nice and tasty beverage while you are reading your hippie books."
+ color = "#664300" // rgb: 102, 67, 0
+ adj_sleepy = 0
+ adj_temp_hot = 5
+ drink_icon = "soy_latte"
+ drink_name = "Soy Latte"
+ drink_desc = "A nice and refrshing beverage while you are reading."
+
+/datum/reagent/consumable/drink/coffee/soy_latte/on_mob_life(mob/living/M)
+ ..()
+ M.SetSleeping(0)
+ if(M.getBruteLoss() && prob(20))
+ M.adjustBruteLoss(-1)
+
+/datum/reagent/consumable/drink/coffee/cafe_latte
+ name = "Cafe Latte"
+ id = "cafe_latte"
+ description = "A nice, strong and tasty beverage while you are reading."
+ color = "#664300" // rgb: 102, 67, 0
+ adj_sleepy = 0
+ adj_temp_hot = 5
+ drink_icon = "cafe_latte"
+ drink_name = "Cafe Latte"
+ drink_desc = "A nice, strong and refreshing beverage while you are reading."
+
+/datum/reagent/consumable/drink/coffee/cafe_latte/on_mob_life(mob/living/M)
+ ..()
+ M.SetSleeping(0)
+ if(M.getBruteLoss() && prob(20))
+ M.adjustBruteLoss(-1)
+
+/datum/reagent/consumable/drink/coffee/cafe_latte/cafe_mocha
+ name = "Cafe Mocha"
+ id = "cafe_mocha"
+ description = "The perfect blend of coffe, milk, and chocolate."
+ color = "#673629"
+ drink_name = "Cafe Mocha"
+ drink_desc = "The perfect blend of coffe, milk, and chocolate."
+
+/datum/reagent/consumable/drink/tea
+ name = "Tea"
+ id = "tea"
+ description = "Tasty black tea: It has antioxidants. It's good for you!"
+ color = "#101000" // rgb: 16, 16, 0
+ adj_dizzy = -2
+ adj_drowsy = -1
+ adj_sleepy = -3
+ adj_temp_hot = 20
+ drink_icon = "glass_brown"
+ drink_name = "Glass of Tea"
+ drink_desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?"
+
+/datum/reagent/consumable/drink/tea/on_mob_life(mob/living/M)
+ if(M.getToxLoss() && prob(20))
+ M.adjustToxLoss(-1)
+ ..()
+
+/datum/reagent/consumable/drink/tea/icetea
+ name = "Iced Tea"
+ id = "icetea"
+ description = "No relation to a certain rap artist/ actor."
+ color = "#104038" // rgb: 16, 64, 56
+ adj_temp_hot = 0
+ adj_temp_cool = 5
+ drink_icon = "icetea"
+ drink_name = "Iced Tea"
+ drink_desc = "No relation to a certain rap artist/ actor."
+
+/datum/reagent/consumable/drink/bananahonk
+ name = "Banana Mama"
+ id = "bananahonk"
+ description = "A drink from Clown Heaven."
+ color = "#664300" // rgb: 102, 67, 0
+ drink_icon = "bananahonkglass"
+ drink_name = "Banana Honk"
+ drink_desc = "A drink from Banana Heaven."
+
+/datum/reagent/consumable/drink/bananahonk/on_mob_life(mob/living/M)
+ if((ishuman(M) && M.job in list("Clown") ) || issmall(M))
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+ ..()
+
+/datum/reagent/consumable/drink/silencer
+ name = "Silencer"
+ id = "silencer"
+ description = "A drink from Mime Heaven."
+ color = "#664300" // rgb: 102, 67, 0
+ drink_icon = "silencerglass"
+ drink_name = "Silencer"
+ drink_desc = "A drink from mime Heaven."
+
+/datum/reagent/consumable/drink/silencer/on_mob_life(mob/living/M)
+ if(ishuman(M) && M.job in list("Mime"))
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm
similarity index 77%
rename from code/modules/reagents/newchem/drugs.dm
rename to code/modules/reagents/chemistry/reagents/drugs.dm
index 99a637e4fca..3719c6f49b8 100644
--- a/code/modules/reagents/newchem/drugs.dm
+++ b/code/modules/reagents/chemistry/reagents/drugs.dm
@@ -1,8 +1,88 @@
-#define SOLID 1
-#define LIQUID 2
-#define GAS 3
+/datum/reagent/serotrotium
+ name = "Serotrotium"
+ id = "serotrotium"
+ description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans."
+ reagent_state = LIQUID
+ color = "#202040" // rgb: 20, 20, 40
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
-#define REM REAGENTS_EFFECT_MULTIPLIER
+/datum/reagent/serotrotium/on_mob_life(mob/living/M)
+ if(ishuman(M))
+ if(prob(7))
+ M.emote(pick("twitch","drool","moan","gasp"))
+ ..()
+
+
+/datum/reagent/lithium
+ name = "Lithium"
+ id = "lithium"
+ description = "A chemical element."
+ reagent_state = SOLID
+ color = "#808080" // rgb: 128, 128, 128
+
+/datum/reagent/lithium/on_mob_life(mob/living/M)
+ if(isturf(M.loc) && !istype(M.loc, /turf/space))
+ if(M.canmove && !M.restrained())
+ step(M, pick(cardinal))
+ if(prob(5)) M.emote(pick("twitch","drool","moan"))
+ ..()
+
+/datum/reagent/lsd
+ name = "Lysergic acid diethylamide"
+ id = "lsd"
+ description = "A highly potent hallucinogenic substance. Far out, maaaan."
+ reagent_state = LIQUID
+ color = "#0000D8"
+
+/datum/reagent/lsd/on_mob_life(mob/living/M)
+ M.Druggy(15)
+ M.AdjustHallucinate(10)
+ ..()
+
+/datum/reagent/space_drugs
+ name = "Space drugs"
+ id = "space_drugs"
+ description = "An illegal chemical compound used as drug."
+ reagent_state = LIQUID
+ color = "#9087A2"
+ metabolization_rate = 0.2
+ addiction_chance = 65
+ heart_rate_decrease = 1
+
+/datum/reagent/space_drugs/on_mob_life(mob/living/M)
+ M.Druggy(15)
+ if(isturf(M.loc) && !istype(M.loc, /turf/space))
+ if(M.canmove && !M.restrained())
+ step(M, pick(cardinal))
+ if(prob(7)) M.emote(pick("twitch","drool","moan","giggle"))
+ ..()
+
+/datum/reagent/psilocybin
+ name = "Psilocybin"
+ id = "psilocybin"
+ description = "A strong psycotropic derived from certain species of mushroom."
+ color = "#E700E7" // rgb: 231, 0, 231
+
+/datum/reagent/psilocybin/on_mob_life(mob/living/M)
+ M.Druggy(30)
+ switch(current_cycle)
+ if(1 to 5)
+ M.Stuttering(1)
+ M.Dizzy(5)
+ if(prob(10)) M.emote(pick("twitch","giggle"))
+ if(5 to 10)
+ M.Stuttering(1)
+ M.Jitter(10)
+ M.Dizzy(10)
+ M.Druggy(35)
+ if(prob(20)) M.emote(pick("twitch","giggle"))
+ if(10 to INFINITY)
+ M.Stuttering(1)
+ M.Jitter(20)
+ M.Dizzy(20)
+ M.Druggy(40)
+ if(prob(30)) M.emote(pick("twitch","giggle"))
+ ..()
/datum/reagent/nicotine
name = "Nicotine"
@@ -22,7 +102,7 @@
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
- M.adjustStaminaLoss(-1*REM)
+ M.adjustStaminaLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
..()
/datum/reagent/nicotine/overdose_process(mob/living/M, severity)
@@ -30,7 +110,7 @@
if(severity == 1)
if(effect <= 2)
M.visible_message("[M] looks nervous!")
- M.confused += 15
+ M.AdjustConfused(15)
M.adjustToxLoss(2)
M.Jitter(10)
M.emote("twitch_s")
@@ -55,7 +135,7 @@
M.Jitter(10)
M.adjustToxLoss(5)
M.Weaken(1)
- M.confused += 33
+ M.AdjustConfused(33)
else if(effect <= 7)
M.emote("collapse")
to_chat(M, "Your heart is pounding!")
@@ -90,7 +170,7 @@
if(prob(4))
to_chat(M, "You feel kinda awful!")
M.adjustToxLoss(1)
- M.jitteriness += 30
+ M.AdjustJitter(30)
M.emote(pick("groan", "moan"))
..()
@@ -99,7 +179,7 @@
if(severity == 1)
if(effect <= 2)
M.visible_message("[M] looks confused!")
- M.confused += 20
+ M.AdjustConfused(20)
M.Jitter(20)
M.emote("scream")
else if(effect <= 4)
@@ -123,7 +203,7 @@
M.adjustToxLoss(2)
M.adjustBrainLoss(8)
M.Weaken(3)
- M.confused += 25
+ M.AdjustConfused(25)
M.emote("scream")
M.reagents.add_reagent("jagged_crystals", 5)
else if(effect <= 7)
@@ -133,22 +213,6 @@
M.adjustBruteLoss(5)
M.emote("twitch_s")
-/datum/chemical_reaction/crank
- name = "Crank"
- id = "crank"
- result = "crank"
- required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1)
- result_amount = 5
- mix_message = "The mixture violently reacts, leaving behind a few crystalline shards."
- mix_sound = 'sound/goonstation/effects/crystalshatter.ogg'
- min_temp = 390
-
-/datum/chemical_reaction/crank/on_reaction(datum/reagents/holder, created_volume)
- var/turf/T = get_turf(holder.my_atom)
- for(var/turf/turf in range(1,T))
- new /obj/effect/hotspot(turf)
- explosion(T,0,0,2)
-
/datum/reagent/krokodil
name = "Krokodil"
id = "krokodil"
@@ -160,7 +224,7 @@
/datum/reagent/krokodil/on_mob_life(mob/living/M)
- M.jitteriness -= 40
+ M.AdjustJitter(-40)
if(prob(25))
M.adjustBrainLoss(1)
if(prob(15))
@@ -216,16 +280,6 @@
M.emote("shiver")
M.bodytemperature -= 70
-/datum/chemical_reaction/krokodil
- name = "Krokodil"
- id = "krokodil"
- result = "krokodil"
- required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1)
- result_amount = 6
- mix_message = "The mixture dries into a pale blue powder."
- min_temp = 380
- mix_sound = 'sound/goonstation/misc/fuse.ogg'
-
/datum/reagent/methamphetamine
name = "Methamphetamine"
id = "methamphetamine"
@@ -241,8 +295,8 @@
if(prob(5))
M.emote(pick("twitch_s","blink_r","shiver"))
if(current_cycle >= 25)
- M.jitteriness += 5
- M.drowsyness = max(0, M.drowsyness-10)
+ M.AdjustJitter(5)
+ M.AdjustDrowsy(-10)
M.AdjustParalysis(-2.5)
M.AdjustStunned(-2.5)
M.AdjustWeakened(-2.5)
@@ -253,7 +307,7 @@
M.adjustBrainLoss(1.0)
..()
-/datum/reagent/methamphetamine/reagent_deleted(mob/living/M)
+/datum/reagent/methamphetamine/on_mob_delete(mob/living/M)
M.status_flags &= ~GOTTAGOREALLYFAST
..()
@@ -262,7 +316,7 @@
if(severity == 1)
if(effect <= 2)
M.visible_message("[M] can't seem to control their legs!")
- M.confused += 20
+ M.AdjustConfused(20)
M.Weaken(4)
else if(effect <= 4)
M.visible_message("[M]'s hands flip out and flail everywhere!")
@@ -282,39 +336,6 @@
else if(effect <= 7)
M.emote("laugh")
-/datum/chemical_reaction/methamphetamine
- name = "methamphetamine"
- id = "methamphetamine"
- result = "methamphetamine"
- required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1)
- result_amount = 4
- min_temp = 374
-
-/datum/chemical_reaction/methamphetamine/on_reaction(datum/reagents/holder)
- var/turf/T = get_turf(holder.my_atom)
- T.visible_message("The solution generates a strong vapor!")
- for(var/mob/living/carbon/C in range(T, 1))
- if(C.can_breathe_gas())
- C.emote("gasp")
- C.losebreath++
- C.reagents.add_reagent("toxin", 10)
- C.reagents.add_reagent("neurotoxin2", 20)
-
-/datum/chemical_reaction/saltpetre
- name = "saltpetre"
- id = "saltpetre"
- result = "saltpetre"
- required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3)
- result_amount = 3
- mix_sound = 'sound/goonstation/misc/fuse.ogg'
-
-/datum/reagent/saltpetre
- name = "Saltpetre"
- id = "saltpetre"
- description = "Volatile."
- reagent_state = LIQUID
- color = "#60A584" // rgb: 96, 165, 132
-
/datum/reagent/bath_salts
name = "Bath Salts"
id = "bath_salts"
@@ -342,15 +363,15 @@
M.SetWeakened(0)
if(check < 30)
M.emote(pick("twitch", "twitch_s", "scream", "drool", "grumble", "mumble"))
- M.druggy = max(M.druggy, 15)
+ M.Druggy(15)
if(check < 20)
- M.confused += 10
+ M.AdjustConfused(10)
if(check < 8)
M.reagents.add_reagent(pick("methamphetamine", "crank", "neurotoxin"), rand(1,5))
M.visible_message("[M] scratches at something under their skin!")
M.adjustBruteLoss(5)
else if(check < 16)
- M.hallucination += 30
+ M.AdjustHallucinate(30)
else if(check < 24)
to_chat(M, "They're coming for you!")
else if(check < 28)
@@ -373,7 +394,7 @@
if(severity == 1)
if(effect <= 2)
M.visible_message("[M] flails around like a lunatic!")
- M.confused += 25
+ M.AdjustConfused(25)
M.Jitter(10)
M.emote("scream")
M.reagents.add_reagent("jagged_crystals", 5)
@@ -383,7 +404,7 @@
M.adjustToxLoss(2)
M.adjustBrainLoss(1)
M.Stun(3)
- M.eye_blurry = max(M.eye_blurry, 7)
+ M.EyeBlurry(7)
M.reagents.add_reagent("jagged_crystals", 5)
else if(effect <= 7)
M.emote("faint")
@@ -394,7 +415,7 @@
M.adjustToxLoss(2)
M.adjustBrainLoss(1)
M.Stun(3)
- M.eye_blurry = max(M.eye_blurry, 7)
+ M.EyeBlurry(7)
M.reagents.add_reagent("jagged_crystals", 5)
else if(effect <= 4)
M.visible_message("[M] convulses violently and falls to the floor!")
@@ -411,32 +432,6 @@
M.reagents.add_reagent("jagged_crystals", 5)
M.emote("twitch")
-/datum/chemical_reaction/bath_salts
- name = "bath_salts"
- id = "bath_salts"
- result = "bath_salts"
- required_reagents = list("????" = 1, "saltpetre" = 1, "msg" = 1, "cleaner" = 1, "enzyme" = 1, "mugwort" = 1, "mercury" = 1)
- result_amount = 6
- min_temp = 374
- mix_message = "Tiny cubic crystals precipitate out of the mixture. Huh."
- mix_sound = 'sound/goonstation/misc/fuse.ogg'
-
-/datum/chemical_reaction/jenkem
- name = "Jenkem"
- id = "jenkem"
- result = "jenkem"
- required_reagents = list("toiletwater" = 1, "ammonia" = 1, "water" = 1)
- result_amount = 3
- mix_message = "The mixture ferments into a filthy morass."
- mix_sound = 'sound/effects/blobattack.ogg'
-
-/datum/chemical_reaction/jenkem/on_reaction(datum/reagents/holder)
- var/turf/T = get_turf(holder.my_atom)
- T.visible_message("The solution generates a strong vapor!")
- for(var/mob/living/carbon/C in range(T, 1))
- if(C.can_breathe_gas())
- C.reagents.add_reagent("jenkem", 25)
-
/datum/reagent/jenkem
name = "Jenkem"
id = "jenkem"
@@ -452,13 +447,6 @@
M.adjustToxLoss(1)
..()
-/datum/chemical_reaction/aranesp
- name = "Aranesp"
- id = "aranesp"
- result = "aranesp"
- required_reagents = list("epinephrine" = 1, "atropine" = 1, "insulin" = 1)
- result_amount = 3
-
/datum/reagent/aranesp
name = "Aranesp"
id = "aranesp"
@@ -479,7 +467,7 @@
to_chat(M, "You cannot breathe!")
M.adjustOxyLoss(15)
M.Stun(1)
- M.losebreath++
+ M.AdjustLoseBreath(1)
..()
/datum/reagent/thc
@@ -489,7 +477,6 @@
reagent_state = LIQUID
color = "#0FBE0F"
-
/datum/reagent/thc/on_mob_life(mob/living/M)
M.stuttering += rand(0,2)
if(prob(5))
@@ -497,10 +484,10 @@
if(prob(5))
to_chat(M, "[pick("You feel hungry.","Your stomach rumbles.","You feel cold.","You feel warm.")]")
if(prob(4))
- M.confused = max(M.confused, 10)
+ M.Confused(10)
if(volume >= 50 && prob(25))
if(prob(10))
- M.drowsyness = max(M.drowsyness, 10)
+ M.Drowsy(10)
..()
/datum/reagent/fliptonium
@@ -514,19 +501,6 @@
process_flags = ORGANIC | SYNTHETIC //Flipping for everyone!
addiction_chance = 10
-/datum/chemical_reaction/fliptonium
- name = "fliptonium"
- id = "fliptonium"
- result = "fliptonium"
- required_reagents = list("ephedrine" = 1, "liquid_dark_matter" = 1, "chocolate" = 1, "ginsonic" = 1)
- result_amount = 4
- mix_message = "The mixture swirls around excitedly!"
-
-/datum/reagent/fliptonium/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == INGEST || method == TOUCH)
- M.SpinAnimation(speed = 12, loops = -1)
- ..()
-
/datum/reagent/fliptonium/on_mob_life(mob/living/M)
if(current_cycle == 5)
M.SpinAnimation(speed = 11, loops = -1)
@@ -545,7 +519,7 @@
if(current_cycle == 50)
M.SpinAnimation(speed = 4, loops = -1)
- M.drowsyness = max(0, M.drowsyness-6)
+ M.AdjustDrowsy(-6)
M.AdjustParalysis(-1.5)
M.AdjustStunned(-1.5)
M.AdjustWeakened(-1.5)
@@ -553,7 +527,12 @@
M.SetSleeping(0)
..()
-/datum/reagent/fliptonium/reagent_deleted(mob/living/M)
+/datum/reagent/fliptonium/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == INGEST || method == TOUCH)
+ M.SpinAnimation(speed = 12, loops = -1)
+ ..()
+
+/datum/reagent/fliptonium/on_mob_delete(mob/living/M)
M.SpinAnimation(speed = 12, loops = -1)
/datum/reagent/fliptonium/overdose_process(mob/living/M, severity)
@@ -561,7 +540,7 @@
if(severity == 1)
if(effect <= 2)
M.visible_message("[M] can't seem to control their legs!")
- M.confused += 33
+ M.AdjustConfused(33)
M.Weaken(2)
else if(effect <= 4)
M.visible_message("[M]'s hands flip out and flail everywhere!")
@@ -592,20 +571,11 @@
description = "Ultra-Lube is an enhanced lubricant which induces effect similar to Methamphetamine in synthetic users by drastically reducing internal friction and increasing cooling capabilities."
reagent_state = LIQUID
color = "#1BB1FF"
-
process_flags = SYNTHETIC
overdose_threshold = 20
addiction_chance = 60
metabolization_rate = 0.6
-/datum/chemical_reaction/lube/ultra
- name = "Ultra-Lube"
- id = "ultralube"
- result = "ultralube"
- required_reagents = list("lube" = 2, "formaldehyde" = 1, "cryostylane" = 1)
- result_amount = 2
- mix_message = "The mixture darkens and appears to partially vaporize into a chilling aerosol."
-
/datum/reagent/lube/ultra/on_mob_life(mob/living/M)
var/high_message = pick("You feel your servos whir!", "You feel like you need to go faster.", "You feel like you were just overclocked!")
if(prob(1))
@@ -624,7 +594,7 @@
M.emote(pick("twitch", "shiver"))
..()
-/datum/reagent/lube/ultra/reagent_deleted(mob/living/M)
+/datum/reagent/lube/ultra/on_mob_delete(mob/living/M)
M.status_flags &= ~GOTTAGOREALLYFAST
..()
@@ -655,7 +625,7 @@
/datum/reagent/surge/on_mob_life(mob/living/M)
- M.druggy = max(M.druggy, 15)
+ M.Druggy(15)
var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.")
if(prob(1))
if(prob(1))
@@ -680,13 +650,5 @@
B.pixel_x = rand(-20, 0)
B.pixel_y = rand(-20, 0)
B.icon = I
- M.adjustFireLoss(rand(1,5)*REM)
- M.adjustBruteLoss(rand(1,5)*REM)
-
-/datum/chemical_reaction/surge
- name = "Surge"
- id = "surge"
- result = "surge"
- required_reagents = list("thermite" = 3, "uranium" = 1, "fluorosurfactant" = 1, "sacid" = 1)
- result_amount = 6
- mix_message = "The mixture congeals into a metallic green gel that crackles with electrical activity."
+ M.adjustFireLoss(rand(1,5)*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustBruteLoss(rand(1,5)*REAGENTS_EFFECT_MULTIPLIER)
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm
new file mode 100644
index 00000000000..e2aef002060
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/food.dm
@@ -0,0 +1,835 @@
+/////////////////////////Food Reagents////////////////////////////
+// Part of the food code. Nutriment is used instead of the old "heal_amt" code. Also is where all the food
+// condiments, additives, and such go.
+
+/datum/reagent/consumable
+ name = "Consumable"
+ id = "consumable"
+ var/nutriment_factor = 1 * REAGENTS_METABOLISM
+ var/diet_flags = DIET_OMNI | DIET_HERB | DIET_CARN
+
+/datum/reagent/consumable/on_mob_life(mob/living/M)
+ if(!(M.mind in ticker.mode.vampires))
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
+ H.nutrition += nutriment_factor // For hunger and fatness
+ ..()
+
+/datum/reagent/consumable/nutriment // Pure nutriment, universally digestable and thus slightly less effective
+ name = "Nutriment"
+ id = "nutriment"
+ description = "A questionable mixture of various pure nutrients commonly found in processed foods."
+ reagent_state = SOLID
+ nutriment_factor = 12 * REAGENTS_METABOLISM
+ color = "#664330" // rgb: 102, 67, 48
+
+/datum/reagent/consumable/nutriment/on_mob_life(mob/living/M)
+ if(!(M.mind in ticker.mode.vampires))
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
+ if(prob(50))
+ M.adjustBruteLoss(-1)
+ if(H.species.exotic_blood)
+ H.vessel.add_reagent(H.species.exotic_blood, 0.4)
+ else
+ if(!(H.species.flags & NO_BLOOD))
+ H.vessel.add_reagent("blood", 0.4)
+ ..()
+
+/datum/reagent/consumable/nutriment/protein // Meat-based protein, digestable by carnivores and omnivores, worthless to herbivores
+ name = "Protein"
+ id = "protein"
+ description = "Various essential proteins and fats commonly found in animal flesh and blood."
+ nutriment_factor = 15 * REAGENTS_METABOLISM
+ diet_flags = DIET_CARN | DIET_OMNI
+
+/datum/reagent/consumable/nutriment/plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores
+ name = "Plant-matter"
+ id = "plantmatter"
+ description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce."
+ nutriment_factor = 15 * REAGENTS_METABOLISM
+ diet_flags = DIET_HERB | DIET_OMNI
+
+/datum/reagent/consumable/vitamin
+ name = "Vitamin"
+ id = "vitamin"
+ description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form."
+ reagent_state = SOLID
+ color = "#664330" // rgb: 102, 67, 48
+
+/datum/reagent/consumable/vitamin/on_mob_life(mob/living/M)
+ if(prob(50))
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species.exotic_blood)
+ H.vessel.add_reagent(H.species.exotic_blood, 0.5)
+ else
+ if(!(H.species.flags & NO_BLOOD))
+ H.vessel.add_reagent("blood", 0.5)
+ ..()
+
+/datum/reagent/consumable/soysauce
+ name = "Soysauce"
+ id = "soysauce"
+ description = "A salty sauce made from the soy plant."
+ reagent_state = LIQUID
+ nutriment_factor = 2 * REAGENTS_METABOLISM
+ color = "#792300" // rgb: 121, 35, 0
+
+/datum/reagent/consumable/ketchup
+ name = "Ketchup"
+ id = "ketchup"
+ description = "Ketchup, catsup, whatever. It's tomato paste."
+ reagent_state = LIQUID
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#731008" // rgb: 115, 16, 8
+
+/datum/reagent/consumable/capsaicin
+ name = "Capsaicin Oil"
+ id = "capsaicin"
+ description = "This is what makes chilis hot."
+ reagent_state = LIQUID
+ color = "#B31008" // rgb: 179, 16, 8
+
+/datum/reagent/consumable/capsaicin/on_mob_life(mob/living/M)
+ switch(current_cycle)
+ if(1 to 15)
+ M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(holder.has_reagent("frostoil"))
+ holder.remove_reagent("frostoil", 5)
+ if(isslime(M))
+ M.bodytemperature += rand(5,20)
+ if(15 to 25)
+ M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(isslime(M))
+ M.bodytemperature += rand(10,20)
+ if(25 to 35)
+ M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(isslime(M))
+ M.bodytemperature += rand(15,20)
+ if(35 to INFINITY)
+ M.bodytemperature += 20 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(isslime(M))
+ M.bodytemperature += rand(20,25)
+ ..()
+
+/datum/reagent/consumable/condensedcapsaicin
+ name = "Condensed Capsaicin"
+ id = "condensedcapsaicin"
+ description = "This shit goes in pepperspray."
+ reagent_state = LIQUID
+ color = "#B31008" // rgb: 179, 16, 8
+
+/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/M)
+ if(prob(5))
+ M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]")
+ ..()
+
+/datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == TOUCH)
+ if(ishuman(M))
+ var/mob/living/carbon/human/victim = M
+ var/mouth_covered = 0
+ var/eyes_covered = 0
+ var/obj/item/safe_thing = null
+ if( victim.wear_mask )
+ if( victim.wear_mask.flags & MASKCOVERSEYES )
+ eyes_covered = 1
+ safe_thing = victim.wear_mask
+ if( victim.wear_mask.flags & MASKCOVERSMOUTH )
+ mouth_covered = 1
+ safe_thing = victim.wear_mask
+ if( victim.head )
+ if( victim.head.flags & MASKCOVERSEYES )
+ eyes_covered = 1
+ safe_thing = victim.head
+ if( victim.head.flags & MASKCOVERSMOUTH )
+ mouth_covered = 1
+ safe_thing = victim.head
+ if(victim.glasses)
+ eyes_covered = 1
+ if( !safe_thing )
+ safe_thing = victim.glasses
+ if( eyes_covered && mouth_covered )
+ to_chat(victim, "Your [safe_thing] protects you from the pepperspray!")
+ return
+ else if( mouth_covered ) // Reduced effects if partially protected
+ to_chat(victim, "Your [safe_thing] protect you from most of the pepperspray!")
+ if(prob(5))
+ victim.emote("scream")
+ victim.EyeBlurry(3)
+ victim.EyeBlind(1)
+ victim.Confused(3)
+ victim.damageoverlaytemp = 60
+ victim.Weaken(3)
+ victim.drop_item()
+ return
+ else if( eyes_covered ) // Eye cover is better than mouth cover
+ to_chat(victim, "Your [safe_thing] protects your eyes from the pepperspray!")
+ victim.EyeBlurry(3)
+ victim.damageoverlaytemp = 30
+ return
+ else // Oh dear :D
+ if(prob(5))
+ victim.emote("scream")
+ to_chat(victim, "You're sprayed directly in the eyes with pepperspray!")
+ victim.EyeBlurry(5)
+ victim.EyeBlind(2)
+ victim.Confused(6)
+ victim.damageoverlaytemp = 75
+ victim.Weaken(5)
+ victim.drop_item()
+
+/datum/reagent/consumable/frostoil
+ name = "Frost Oil"
+ id = "frostoil"
+ description = "A special oil that noticably chills the body. Extraced from Icepeppers."
+ reagent_state = LIQUID
+ color = "#8BA6E9" // rgb: 139, 166, 233
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/consumable/frostoil/on_mob_life(mob/living/M)
+ switch(current_cycle)
+ if(1 to 15)
+ M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(holder.has_reagent("capsaicin"))
+ holder.remove_reagent("capsaicin", 5)
+ if(isslime(M))
+ M.bodytemperature -= rand(5,20)
+ if(15 to 25)
+ M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(isslime(M))
+ M.bodytemperature -= rand(10,20)
+ if(25 to 35)
+ M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(prob(1))
+ M.emote("shiver")
+ if(isslime(M))
+ M.bodytemperature -= rand(15,20)
+ if(35 to INFINITY)
+ M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(prob(1))
+ M.emote("shiver")
+ if(isslime(M))
+ M.bodytemperature -= rand(20,25)
+ ..()
+
+/datum/reagent/consumable/frostoil/reaction_turf(turf/T, volume)
+ if(volume >= 5)
+ for(var/mob/living/carbon/slime/M in T)
+ M.adjustToxLoss(rand(15,30))
+
+/datum/reagent/consumable/sodiumchloride
+ name = "Salt"
+ id = "sodiumchloride"
+ description = "Sodium chloride, common table salt."
+ reagent_state = SOLID
+ color = "#B1B0B0"
+ overdose_threshold = 100
+
+/datum/reagent/consumable/sodiumchloride/overdose_process(mob/living/M, severity)
+ if(prob(70))
+ M.adjustBrainLoss(1)
+ ..()
+
+/datum/reagent/consumable/blackpepper
+ name = "Black Pepper"
+ id = "blackpepper"
+ description = "A powder ground from peppercorns. *AAAACHOOO*"
+ reagent_state = SOLID
+
+/datum/reagent/consumable/cocoa
+ name = "Cocoa Powder"
+ id = "cocoa"
+ description = "A fatty, bitter paste made from cocoa beans."
+ reagent_state = SOLID
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/consumable/hot_coco
+ name = "Hot Chocolate"
+ id = "hot_coco"
+ description = "Made with love! And cocoa beans."
+ reagent_state = LIQUID
+ nutriment_factor = 2 * REAGENTS_METABOLISM
+ color = "#403010" // rgb: 64, 48, 16
+
+/datum/reagent/consumable/hot_coco/on_mob_life(mob/living/M)
+ if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
+ M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
+ ..()
+
+/datum/reagent/consumable/sprinkles
+ name = "Sprinkles"
+ id = "sprinkles"
+ description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops."
+ color = "#FF00FF" // rgb: 255, 0, 255
+
+/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/M)
+ if(ishuman(M) && M.job in list("Security Officer", "Security Pod Pilot", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate"))
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+ ..()
+
+/datum/reagent/consumable/cornoil
+ name = "Corn Oil"
+ id = "cornoil"
+ description = "An oil derived from various types of corn."
+ reagent_state = LIQUID
+ nutriment_factor = 20 * REAGENTS_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/consumable/cornoil/reaction_turf(turf/simulated/T, volume)
+ if(!istype(T))
+ return
+ if(volume >= 3)
+ T.MakeSlippery()
+ var/hotspot = (locate(/obj/effect/hotspot) in T)
+ if(hotspot)
+ var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles())
+ lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0)
+ lowertemp.react()
+ T.assume_air(lowertemp)
+ qdel(hotspot)
+
+/datum/reagent/consumable/enzyme
+ name = "Denatured Enzyme"
+ id = "enzyme"
+ description = "Heated beyond usefulness, this enzyme is now worthless."
+ reagent_state = LIQUID
+ color = "#282314" // rgb: 54, 94, 48
+
+/datum/reagent/consumable/dry_ramen
+ name = "Dry Ramen"
+ id = "dry_ramen"
+ description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water."
+ reagent_state = SOLID
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/consumable/hot_ramen
+ name = "Hot Ramen"
+ id = "hot_ramen"
+ description = "The noodles are boiled, the flavors are artificial, just like being back in school."
+ reagent_state = LIQUID
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/consumable/hot_ramen/on_mob_life(mob/living/M)
+ if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
+ M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT))
+ ..()
+
+/datum/reagent/consumable/hell_ramen
+ name = "Hell Ramen"
+ id = "hell_ramen"
+ description = "The noodles are boiled, the flavors are artificial, just like being back in school."
+ reagent_state = LIQUID
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/consumable/hell_ramen/on_mob_life(mob/living/M)
+ M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
+ ..()
+
+/datum/reagent/consumable/flour
+ name = "flour"
+ id = "flour"
+ description = "This is what you rub all over yourself to pretend to be a ghost."
+ reagent_state = SOLID
+ color = "#FFFFFF" // rgb: 0, 0, 0
+
+/datum/reagent/consumable/flour/reaction_turf(turf/T, volume)
+ if(!istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/flour(T)
+
+/datum/reagent/consumable/rice
+ name = "Rice"
+ id = "rice"
+ description = "Enjoy the great taste of nothing."
+ reagent_state = SOLID
+ color = "#FFFFFF" // rgb: 0, 0, 0
+
+/datum/reagent/consumable/cherryjelly
+ name = "Cherry Jelly"
+ id = "cherryjelly"
+ description = "Totally the best. Only to be spread on foods with excellent lateral symmetry."
+ reagent_state = LIQUID
+ color = "#801E28" // rgb: 128, 30, 40
+
+/datum/reagent/consumable/egg
+ name = "Egg"
+ id = "egg"
+ description = "A runny and viscous mixture of clear and yellow fluids."
+ reagent_state = LIQUID
+ color = "#F0C814"
+
+/datum/reagent/consumable/egg/on_mob_life(mob/living/M)
+ if(prob(8))
+ M.emote("fart")
+ if(prob(3))
+ M.reagents.add_reagent("cholesterol", rand(1,2))
+ ..()
+
+/datum/reagent/consumable/corn_starch
+ name = "Corn Starch"
+ id = "corn_starch"
+ description = "The powdered starch of maize, derived from the kernel's endosperm. Used as a thickener for gravies and puddings."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+
+/datum/reagent/consumable/corn_syrup
+ name = "Corn Syrup"
+ id = "corn_syrup"
+ description = "A sweet syrup derived from corn starch that has had its starches converted into maltose and other sugars."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+
+/datum/reagent/consumable/corn_syrup/on_mob_life(mob/living/M)
+ M.reagents.add_reagent("sugar", 1.2)
+ ..()
+
+/datum/reagent/consumable/vhfcs
+ name = "Very-high-fructose corn syrup"
+ id = "vhfcs"
+ description = "An incredibly sweet syrup, created from corn syrup treated with enzymes to convert its sugars into fructose."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+
+/datum/reagent/consumable/vhfcs/on_mob_life(mob/living/M)
+ M.reagents.add_reagent("sugar", 2.4)
+ ..()
+
+/datum/reagent/consumable/honey
+ name = "Honey"
+ id = "honey"
+ description = "A sweet substance produced by bees through partial digestion. Bee barf."
+ reagent_state = LIQUID
+ color = "#d3a308"
+
+/datum/reagent/consumable/honey/on_mob_life(mob/living/M)
+ M.reagents.add_reagent("sugar", 0.4)
+ if(prob(20))
+ M.adjustBruteLoss(-3)
+ M.adjustFireLoss(-1)
+ ..()
+
+/datum/reagent/consumable/chocolate
+ name = "Chocolate"
+ id = "chocolate"
+ description = "Chocolate is a delightful product derived from the seeds of the theobroma cacao tree."
+ reagent_state = LIQUID
+ nutriment_factor = 5 * REAGENTS_METABOLISM //same as pure cocoa powder, because it makes no sense that chocolate won't fill you up and make you fat
+ color = "#2E2418"
+ drink_icon = "chocolateglass"
+ drink_name = "Glass of chocolate"
+ drink_desc = "Tasty"
+
+/datum/reagent/consumable/chocolate/on_mob_life(mob/living/M)
+ M.reagents.add_reagent("sugar", 0.8)
+ ..()
+
+/datum/reagent/consumable/chocolate/reaction_turf(turf/T, volume)
+ if(volume >= 5 && !istype(T, /turf/space))
+ new /obj/item/weapon/reagent_containers/food/snacks/choc_pile(T)
+
+/datum/reagent/consumable/mugwort
+ name = "Mugwort"
+ id = "mugwort"
+ description = "A rather bitter herb once thought to hold magical protective properties."
+ reagent_state = LIQUID
+ color = "#21170E"
+
+/datum/reagent/consumable/mugwort/on_mob_life(mob/living/M)
+ if(ishuman(M) && M.mind)
+ if(M.mind.special_role == SPECIAL_ROLE_WIZARD)
+ M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
+
+/datum/reagent/consumable/porktonium
+ name = "Porktonium"
+ id = "porktonium"
+ description = "A highly-radioactive pork byproduct first discovered in hotdogs."
+ reagent_state = LIQUID
+ color = "#AB5D5D"
+ metabolization_rate = 0.2
+ overdose_threshold = 133
+
+/datum/reagent/consumable/porktonium/overdose_process(mob/living/M, severity)
+ if(prob(15))
+ M.reagents.add_reagent("cholesterol", rand(1,3))
+ if(prob(8))
+ M.reagents.add_reagent("radium", 15)
+ M.reagents.add_reagent("cyanide", 10)
+
+/datum/reagent/consumable/chicken_soup
+ name = "Chicken soup"
+ id = "chicken_soup"
+ description = "An old household remedy for mild illnesses."
+ reagent_state = LIQUID
+ color = "#B4B400"
+ metabolization_rate = 0.2
+ nutriment_factor = 2
+
+/datum/reagent/consumable/cheese
+ name = "Cheese"
+ id = "cheese"
+ description = "Some cheese. Pour it out to make it solid."
+ reagent_state = SOLID
+ color = "#FFFF00"
+ metabolization_rate = 0 //heheheh
+ nutriment_factor = 0
+
+/datum/reagent/consumable/cheese/on_mob_life(mob/living/M)
+ if(prob(3))
+ M.reagents.add_reagent("cholesterol", rand(1,2))
+ ..()
+
+/datum/reagent/consumable/cheese/reaction_turf(turf/T, volume)
+ if(volume >= 5 && !istype(T, /turf/space))
+ new /obj/item/weapon/reagent_containers/food/snacks/cheesewedge(T)
+
+/datum/reagent/consumable/fake_cheese
+ name = "Cheese substitute"
+ id = "fake_cheese"
+ description = "A cheese-like substance derived loosely from actual cheese."
+ reagent_state = LIQUID
+ color = "#B2B139"
+ overdose_threshold = 50
+
+/datum/reagent/consumable/fake_cheese/overdose_process(mob/living/M, severity)
+ if(prob(8))
+ to_chat(M, "You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat.")
+ M.adjustToxLoss(rand(1,2))
+
+/datum/reagent/consumable/weird_cheese
+ name = "Weird cheese"
+ id = "weird_cheese"
+ description = "Hell, I don't even know if this IS cheese. Whatever it is, it ain't normal. If you want to, pour it out to make it solid."
+ reagent_state = SOLID
+ color = "#50FF00"
+ metabolization_rate = 0 //heheheh
+ addiction_chance = 5
+ nutriment_factor = 0
+
+/datum/reagent/consumable/weird_cheese/on_mob_life(mob/living/M)
+ if(prob(5))
+ M.reagents.add_reagent("cholesterol", rand(1,3))
+ ..()
+
+/datum/reagent/consumable/weird_cheese/reaction_turf(turf/T, volume)
+ if(volume >= 5 && !istype(T, /turf/space))
+ new /obj/item/weapon/reagent_containers/food/snacks/weirdcheesewedge(T)
+
+/datum/reagent/consumable/beans
+ name = "Refried beans"
+ id = "beans"
+ description = "A dish made of mashed beans cooked with lard."
+ reagent_state = LIQUID
+ color = "#684435"
+
+/datum/reagent/consumable/beans/on_mob_life(mob/living/M)
+ if(prob(10))
+ M.emote("fart")
+ ..()
+
+/datum/reagent/consumable/bread
+ name = "Bread"
+ id = "bread"
+ description = "Bread! Yep, bread."
+ reagent_state = SOLID
+ color = "#9C5013"
+
+/datum/reagent/consumable/soybeanoil
+ name = "Space-soybean oil"
+ id = "soybeanoil"
+ description = "An oil derived from extra-terrestrial soybeans."
+ reagent_state = LIQUID
+ color = "#B1B0B0"
+
+/datum/reagent/consumable/soybeanoil/on_mob_life(mob/living/M)
+ if(prob(10))
+ M.reagents.add_reagent("cholesterol", rand(1,3))
+ if(prob(8))
+ M.reagents.add_reagent("porktonium", 5)
+ ..()
+
+/datum/reagent/consumable/hydrogenated_soybeanoil
+ name = "Partially hydrogenated space-soybean oil"
+ id = "hydrogenated_soybeanoil"
+ description = "An oil derived from extra-terrestrial soybeans, with additional hydrogen atoms added to convert it into a saturated form."
+ reagent_state = LIQUID
+ color = "#B1B0B0"
+ metabolization_rate = 0.2
+ overdose_threshold = 75
+
+/datum/reagent/consumable/hydrogenated_soybeanoil/on_mob_life(mob/living/M)
+ if(prob(15))
+ M.reagents.add_reagent("cholesterol", rand(1,3))
+ if(prob(8))
+ M.reagents.add_reagent("porktonium", 5)
+ if(volume >= 75)
+ metabolization_rate = 0.4
+ else
+ metabolization_rate = 0.2
+ ..()
+
+/datum/reagent/consumable/hydrogenated_soybeanoil/overdose_process(mob/living/M, severity)
+ if(prob(33))
+ to_chat(M, "You feel horribly weak.")
+ if(prob(10))
+ to_chat(M, "You cannot breathe!")
+ M.adjustOxyLoss(5)
+ if(prob(5))
+ to_chat(M, "You feel a sharp pain in your chest!")
+ M.adjustOxyLoss(25)
+ M.Stun(5)
+ M.Paralyse(10)
+
+/datum/reagent/consumable/meatslurry
+ name = "Meat Slurry"
+ id = "meatslurry"
+ description = "A paste comprised of highly-processed organic material. Uncomfortably similar to deviled ham spread."
+ reagent_state = LIQUID
+ color = "#EBD7D7"
+
+/datum/reagent/consumable/meatslurry/on_mob_life(mob/living/M)
+ if(prob(4))
+ M.reagents.add_reagent("cholesterol", rand(1,3))
+ ..()
+
+/datum/reagent/consumable/meatslurry/reaction_turf(turf/T, volume)
+ if(volume >= 5 && prob(10) && !istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
+ playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
+
+/datum/reagent/consumable/mashedpotatoes
+ name = "Mashed potatoes"
+ id = "mashedpotatoes"
+ description = "A starchy food paste made from boiled potatoes."
+ reagent_state = SOLID
+ color = "#D6D9C1"
+
+/datum/reagent/consumable/gravy
+ name = "Gravy"
+ id = "gravy"
+ description = "A savory sauce made from a simple meat-dripping roux and milk."
+ reagent_state = LIQUID
+ color = "#B4641B"
+
+/datum/reagent/consumable/beff
+ name = "Beff"
+ id = "beff"
+ description = "An advanced blend of mechanically-recovered meat and textured synthesized protein product notable for its unusual crystalline grain when sliced."
+ reagent_state = SOLID
+ color = "#AC7E67"
+
+/datum/reagent/consumable/beff/on_mob_life(mob/living/M)
+ if(prob(5))
+ M.reagents.add_reagent("cholesterol", rand(1,3))
+ if(prob(8))
+ M.reagents.add_reagent(pick("blood", "corn_syrup", "synthflesh", "hydrogenated_soybeanoil", "porktonium", "toxic_slurry"), 0.8)
+ else if(prob(6))
+ to_chat(M, "[pick("You feel ill.","Your stomach churns.","You feel queasy.","You feel sick.")]")
+ M.emote(pick("groan","moan"))
+ ..()
+
+/datum/reagent/consumable/pepperoni
+ name = "Pepperoni"
+ id = "pepperoni"
+ description = "An Italian-American variety of salami usually made from beef and pork"
+ reagent_state = SOLID
+ color = "#AC7E67"
+
+/datum/reagent/consumable/pepperoni/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == TOUCH)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ if(H.wear_mask)
+ to_chat(H, "The pepperoni bounces off your mask!")
+ return
+
+ if(H.head)
+ to_chat(H, "Your mask protects you from the errant pepperoni!")
+ return
+
+ if(prob(50))
+ M.adjustBruteLoss(1)
+ playsound(M, 'sound/effects/woodhit.ogg', 50, 1)
+ to_chat(M, "A slice of pepperoni slaps you!")
+ else
+ M.emote("burp")
+ to_chat(M, "My goodness, that was tasty!")
+
+
+///Food Related, but non-nutritious
+
+/datum/reagent/sugar
+ name = "Sugar"
+ id = "sugar"
+ description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste."
+ reagent_state = SOLID
+ color = "#FFFFFF" // rgb: 255, 255, 255
+ overdose_threshold = 200 // Hyperglycaemic shock
+
+/datum/reagent/sugar/on_mob_life(mob/living/M)
+ M.AdjustDrowsy(-5)
+ if(current_cycle >= 90)
+ M.AdjustJitter(2)
+ if(prob(50))
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ if(prob(4))
+ M.reagents.add_reagent("epinephrine", 1.2)
+ ..()
+
+/datum/reagent/sugar/overdose_start(mob/living/M)
+ to_chat(M, "You pass out from hyperglycemic shock!")
+ M.emote("collapse")
+ ..()
+
+/datum/reagent/sugar/overdose_process(mob/living/M, severity)
+ M.Paralyse(3 * severity)
+ M.Weaken(4 * severity)
+ if(prob(8))
+ M.adjustToxLoss(severity)
+
+/datum/reagent/questionmark // food poisoning
+ name = "????"
+ id = "????"
+ description = "A gross and unidentifiable substance."
+ reagent_state = LIQUID
+ color = "#63DE63"
+
+/datum/reagent/questionmark/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == INGEST)
+ M.Stun(2)
+ M.Weaken(2)
+ to_chat(M, "Ugh! Eating that was a terrible idea!")
+ M.ForceContractDisease(new /datum/disease/food_poisoning(0))
+
+/datum/reagent/msg
+ name = "Monosodium glutamate"
+ id = "msg"
+ description = "Monosodium Glutamate is a sodium salt known chiefly for its use as a controversial flavor enhancer."
+ reagent_state = LIQUID
+ color = "#F5F5F5"
+ metabolization_rate = 0.2
+
+/datum/reagent/msg/on_mob_life(mob/living/M)
+ if(prob(5))
+ if(prob(10))
+ M.adjustToxLoss(rand(2.4))
+ if(prob(7))
+ to_chat(M, "A horrible migraine overpowers you.")
+ M.Stun(rand(2,5))
+ ..()
+
+/datum/reagent/msg/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == INGEST)
+ to_chat(M, "That tasted amazing!")
+
+/datum/reagent/cholesterol
+ name = "cholesterol"
+ id = "cholesterol"
+ description = "Pure cholesterol. Probably not very good for you."
+ reagent_state = LIQUID
+ color = "#FFFAC8"
+
+/datum/reagent/cholesterol/on_mob_life(mob/living/M)
+ if(volume >= 25 && prob(volume*0.15))
+ to_chat(M, "Your chest feels [pick("weird","uncomfortable","nasty","gross","odd","unusual","warm")]!")
+ M.adjustToxLoss(rand(1,2))
+ else if(volume >= 45 && prob(volume*0.08))
+ to_chat(M, "Your chest [pick("hurts","stings","aches","burns")]!")
+ M.adjustToxLoss(rand(2,4))
+ M.Stun(1)
+ else if(volume >= 150 && prob(volume*0.01))
+ to_chat(M, "Your chest is burning with pain!")
+ M.Stun(1)
+ M.Weaken(1)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(!H.heart_attack)
+ H.heart_attack = 1
+ ..()
+
+/datum/reagent/fungus
+ name = "Space fungus"
+ id = "fungus"
+ description = "Scrapings of some unknown fungus found growing on the station walls."
+ reagent_state = LIQUID
+ color = "#C87D28"
+
+/datum/reagent/fungus/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == INGEST)
+ var/ranchance = rand(1,10)
+ if(ranchance == 1)
+ to_chat(M, "You feel very sick.")
+ M.reagents.add_reagent("toxin", rand(1,5))
+ else if(ranchance <= 5)
+ to_chat(M, "That tasted absolutely FOUL.")
+ M.ForceContractDisease(new /datum/disease/food_poisoning(0))
+ else
+ to_chat(M, "Yuck!")
+
+/datum/reagent/ectoplasm
+ name = "Ectoplasm"
+ id = "ectoplasm"
+ description = "A bizarre gelatinous substance supposedly derived from ghosts."
+ reagent_state = LIQUID
+ color = "#8EAE7B"
+ process_flags = ORGANIC | SYNTHETIC //Because apparently ghosts in the shell
+
+/datum/reagent/ectoplasm/on_mob_life(mob/living/M)
+ var/spooky_message = pick("You notice something moving out of the corner of your eye, but nothing is there...", "Your eyes twitch, you feel like something you can't see is here...", "You've got the heebie-jeebies.", "You feel uneasy.", "You shudder as if cold...", "You feel something gliding across your back...")
+ if(prob(8))
+ to_chat(M, "[spooky_message]")
+ ..()
+
+/datum/reagent/ectoplasm/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == INGEST)
+ var/spooky_eat = pick("Ugh, why did you eat that? Your mouth feels haunted. Haunted with bad flavors.", "Ugh, why did you eat that? It has the texture of ham aspic. From the 1950s. Left out in the sun.", "Ugh, why did you eat that? It tastes like a ghost fart.", "Ugh, why did you eat that? It tastes like flavor died.")
+ to_chat(M, "[spooky_eat]")
+
+/datum/reagent/ectoplasm/reaction_turf(turf/T, volume)
+ if(volume >= 10 && !istype(T, /turf/space))
+ new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm(T)
+
+///Vomit///
+
+/datum/reagent/consumable/bread/reaction_turf(turf/T, volume)
+ if(volume >= 5 && !istype(T, /turf/space))
+ new /obj/item/weapon/reagent_containers/food/snacks/breadslice(T)
+
+/datum/reagent/vomit
+ name = "Vomit"
+ id = "vomit"
+ description = "Looks like someone lost their lunch. And then collected it. Yuck."
+ reagent_state = LIQUID
+ color = "#FFFF00"
+
+/datum/reagent/vomit/reaction_turf(turf/T, volume)
+ if(volume >= 5 && !istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/vomit(T)
+ playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
+
+/datum/reagent/greenvomit
+ name = "Green vomit"
+ id = "green_vomit"
+ description = "Whoa, that can't be natural. That's horrible."
+ reagent_state = LIQUID
+ color = "#78FF74"
+
+/datum/reagent/greenvomit/reaction_turf(turf/T, volume)
+ if(volume >= 5 && !istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/vomit/green(T)
+ playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
similarity index 56%
rename from code/modules/reagents/newchem/medicine.dm
rename to code/modules/reagents/chemistry/reagents/medicine.dm
index 777c10ebfd7..b3b94ff7e88 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -1,10 +1,151 @@
-#define SOLID 1
-#define LIQUID 2
-#define GAS 3
+/datum/reagent/medicine
+ name = "Medicine"
+ id = "medicine"
-#define REM REAGENTS_EFFECT_MULTIPLIER
+/datum/reagent/medicine/hydrocodone
+ name = "Hydrocodone"
+ id = "hydrocodone"
+ description = "An extremely effective painkiller; may have long term abuse consequences."
+ reagent_state = LIQUID
+ color = "#C805DC"
+ metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units
+ shock_reduction = 200
-/datum/reagent/silver_sulfadiazine
+/datum/reagent/medicine/hydrocodone/on_mob_life(mob/living/M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.traumatic_shock < 100)
+ H.shock_stage = 0
+ ..()
+
+/datum/reagent/medicine/sterilizine
+ name = "Sterilizine"
+ id = "sterilizine"
+ description = "Sterilizes wounds in preparation for surgery."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+ //makes you squeaky clean
+/datum/reagent/medicine/sterilizine/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == TOUCH)
+ M.germ_level -= min(volume*20, M.germ_level)
+
+/datum/reagent/medicine/sterilizine/reaction_obj(obj/O, volume)
+ O.germ_level -= min(volume*20, O.germ_level)
+
+/datum/reagent/medicine/sterilizine/reaction_turf(turf/T, volume)
+ T.germ_level -= min(volume*20, T.germ_level)
+
+/datum/reagent/medicine/synaptizine
+ name = "Synaptizine"
+ id = "synaptizine"
+ description = "Synaptizine is used to treat neuroleptic shock. Can be used to help remove disabling symptoms such as paralysis."
+ reagent_state = LIQUID
+ color = "#FA46FA"
+ overdose_threshold = 40
+
+/datum/reagent/medicine/synaptizine/on_mob_life(mob/living/M)
+ M.AdjustDrowsy(-5)
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ M.SetSleeping(0)
+ if(prob(50))
+ M.adjustBrainLoss(-1.0)
+ ..()
+
+/datum/reagent/medicine/synaptizine/overdose_process(mob/living/M, severity)
+ var/effect = ..()
+ if(severity == 1)
+ if(effect <= 1)
+ M.visible_message("[M] suddenly and violently vomits!")
+ M.fakevomit(no_text = 1)
+ else if(effect <= 3)
+ M.emote(pick("groan","moan"))
+ if(effect <= 8)
+ M.adjustToxLoss(1)
+ else if(severity == 2)
+ if(effect <= 2)
+ M.visible_message("[M] suddenly and violently vomits!")
+ M.fakevomit(no_text = 1)
+ else if(effect <= 5)
+ M.visible_message("[M] staggers and drools, their eyes bloodshot!")
+ M.Dizzy(8)
+ M.Weaken(4)
+ if(effect <= 15)
+ M.adjustToxLoss(1)
+
+/datum/reagent/medicine/mitocholide
+ name = "Mitocholide"
+ id = "mitocholide"
+ description = "A specialized drug that stimulates the mitochondria of cells to encourage healing of internal organs."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/reagent/medicine/mitocholide/on_mob_life(mob/living/M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ //Mitocholide is hard enough to get, it's probably fair to make this all internal organs
+ for(var/name in H.internal_organs)
+ var/obj/item/organ/internal/I = H.get_int_organ(name)
+ if(I.damage > 0)
+ I.damage = max(I.damage-0.4, 0)
+ ..()
+
+/datum/reagent/medicine/mitocholide/reaction_obj(obj/O, volume)
+ if(istype(O, /obj/item/organ))
+ var/obj/item/organ/Org = O
+ Org.rejuvenate()
+
+/datum/reagent/medicine/cryoxadone
+ name = "Cryoxadone"
+ id = "cryoxadone"
+ description = "A plasma mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 265K for it to metabolise correctly."
+ reagent_state = LIQUID
+ color = "#0000C8" // rgb: 200, 165, 220
+ heart_rate_decrease = 1
+
+/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/M)
+ if(M.bodytemperature < 265)
+ M.adjustCloneLoss(-4)
+ M.adjustOxyLoss(-10)
+ M.adjustToxLoss(-3)
+ M.adjustBruteLoss(-12)
+ M.adjustFireLoss(-12)
+ M.status_flags &= ~DISFIGURED
+ ..()
+
+/datum/reagent/medicine/rezadone
+ name = "Rezadone"
+ id = "rezadone"
+ description = "A powder derived from fish toxin, Rezadone can effectively treat genetic damage as well as restoring minor wounds. Overdose will cause intense nausea and minor toxin damage."
+ reagent_state = SOLID
+ color = "#669900" // rgb: 102, 153, 0
+ overdose_threshold = 30
+
+/datum/reagent/medicine/rezadone/on_mob_life(mob/living/M)
+ M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that.
+ M.adjustCloneLoss(-1) //What? We just set cloneloss to 0. Why? Simple; this is so external organs properly unmutate.
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+ M.status_flags &= ~DISFIGURED
+ ..()
+
+/datum/reagent/medicine/rezadone/overdose_process(mob/living/M, severity)
+ M.adjustToxLoss(1)
+ M.Dizzy(5)
+ M.Jitter(5)
+
+/datum/reagent/medicine/spaceacillin
+ name = "Spaceacillin"
+ id = "spaceacillin"
+ description = "An all-purpose antibiotic agent extracted from space fungus."
+ reagent_state = LIQUID
+ color = "#0AB478"
+ metabolization_rate = 0.2
+
+/datum/reagent/medicine/silver_sulfadiazine
name = "Silver Sulfadiazine"
id = "silver_sulfadiazine"
description = "This antibacterial compound is used to treat burn victims."
@@ -12,7 +153,11 @@
color = "#F0C814"
metabolization_rate = 3
-/datum/reagent/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
+/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/M)
+ M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
+
+/datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
if(iscarbon(M))
if(method == TOUCH)
M.adjustFireLoss(-volume)
@@ -24,11 +169,7 @@
to_chat(M, "You feel sick...")
..()
-/datum/reagent/silver_sulfadiazine/on_mob_life(mob/living/M)
- M.adjustFireLoss(-2*REM)
- ..()
-
-/datum/reagent/styptic_powder
+/datum/reagent/medicine/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
description = "Styptic (aluminium sulfate) powder helps control bleeding and heal physical wounds."
@@ -36,7 +177,11 @@
color = "#C8A5DC"
metabolization_rate = 3
-/datum/reagent/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
+/datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/M)
+ M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
+
+/datum/reagent/medicine/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
if(iscarbon(M))
if(method == TOUCH)
M.adjustBruteLoss(-volume)
@@ -49,11 +194,7 @@
to_chat(M, "You feel gross!")
..()
-/datum/reagent/styptic_powder/on_mob_life(mob/living/M)
- M.adjustBruteLoss(-2*REM)
- ..()
-
-/datum/reagent/salglu_solution
+/datum/reagent/medicine/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
description = "This saline and glucose solution can help stabilize critically injured patients and cleanse wounds."
@@ -62,24 +203,24 @@
penetrates_skin = 1
metabolization_rate = 0.15
-/datum/reagent/salglu_solution/on_mob_life(mob/living/M)
+/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/M)
if(prob(33))
- M.adjustBruteLoss(-2*REM)
- M.adjustFireLoss(-2*REM)
+ M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD) && prob(33))
H.vessel.add_reagent("blood", 1)
..()
-/datum/reagent/synthflesh
+/datum/reagent/medicine/synthflesh
name = "Synthflesh"
id = "synthflesh"
description = "A resorbable microfibrillar collagen and protein mixture that can rapidly heal injuries when applied topically."
reagent_state = LIQUID
color = "#FFEBEB"
-/datum/reagent/synthflesh/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
+/datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
if(iscarbon(M))
if(method == TOUCH)
M.adjustBruteLoss(-1.5*volume)
@@ -88,70 +229,27 @@
to_chat(M, "The synthetic flesh integrates itself into your wounds, healing you.")
..()
-/datum/reagent/synthflesh/reaction_turf(turf/T, volume) //let's make a mess!
+/datum/reagent/medicine/synthflesh/reaction_turf(turf/T, volume) //let's make a mess!
if(volume >= 5 && !istype(T, /turf/space))
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
-/datum/reagent/charcoal
+/datum/reagent/medicine/charcoal
name = "Charcoal"
id = "charcoal"
description = "Activated charcoal helps to absorb toxins."
reagent_state = LIQUID
color = "#000000"
-/datum/reagent/charcoal/on_mob_life(mob/living/M)
- M.adjustToxLoss(-1.5*REM)
+/datum/reagent/medicine/charcoal/on_mob_life(mob/living/M)
+ M.adjustToxLoss(-1.5*REAGENTS_EFFECT_MULTIPLIER)
if(prob(50))
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,1)
..()
-/datum/chemical_reaction/charcoal
- name = "Charcoal"
- id = "charcoal"
- result = "charcoal"
- required_reagents = list("ash" = 1, "sodiumchloride" = 1)
- result_amount = 2
- mix_message = "The mixture yields a fine black powder."
- min_temp = 380
- mix_sound = 'sound/goonstation/misc/fuse.ogg'
-
-/datum/chemical_reaction/silver_sulfadiazine
- name = "Silver Sulfadiazine"
- id = "silver_sulfadiazine"
- result = "silver_sulfadiazine"
- required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1)
- result_amount = 5
- mix_message = "A strong and cloying odor begins to bubble from the mixture."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/chemical_reaction/salglu_solution
- name = "Saline-Glucose Solution"
- id = "salglu_solution"
- result = "salglu_solution"
- required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/synthflesh
- name = "Synthflesh"
- id = "synthflesh"
- result = "synthflesh"
- required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1)
- result_amount = 3
- mix_message = "The mixture knits together into a fibrous, bloody mass."
- mix_sound = 'sound/effects/blobattack.ogg'
-
-/datum/chemical_reaction/styptic_powder
- name = "Styptic Powder"
- id = "styptic_powder"
- result = "styptic_powder"
- required_reagents = list("aluminum" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1)
- result_amount = 4
- mix_message = "The solution yields an astringent powder."
-
-/datum/reagent/omnizine
+/datum/reagent/medicine/omnizine
name = "Omnizine"
id = "omnizine"
description = "Omnizine is a highly potent healing medication that can be used to treat a wide range of injuries."
@@ -161,16 +259,16 @@
overdose_threshold = 30
addiction_chance = 5
-/datum/reagent/omnizine/on_mob_life(mob/living/M)
- M.adjustToxLoss(-1*REM)
- M.adjustOxyLoss(-1*REM)
- M.adjustBruteLoss(-2*REM)
- M.adjustFireLoss(-2*REM)
+/datum/reagent/medicine/omnizine/on_mob_life(mob/living/M)
+ M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
if(prob(50))
- M.losebreath -= 1
+ M.AdjustLoseBreath(-1)
..()
-/datum/reagent/omnizine/overdose_process(mob/living/M, severity)
+/datum/reagent/medicine/omnizine/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1) //lesser
M.stuttering += 1
@@ -181,7 +279,7 @@
M.Weaken(4)
else if(effect <= 3)
M.visible_message("[M] completely spaces out for a moment.")
- M.confused += 15
+ M.AdjustConfused(15)
else if(effect <= 5)
M.visible_message("[M] stumbles and staggers.")
M.Dizzy(5)
@@ -204,7 +302,7 @@
M.Dizzy(5)
M.Weaken(3)
-/datum/reagent/calomel
+/datum/reagent/medicine/calomel
name = "Calomel"
id = "calomel"
description = "This potent purgative rids the body of impurities. It is highly toxic however and close supervision is required."
@@ -212,74 +310,48 @@
color = "#22AB35"
metabolization_rate = 0.8
-/datum/reagent/calomel/on_mob_life(mob/living/M)
+/datum/reagent/medicine/calomel/on_mob_life(mob/living/M)
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,5)
if(M.health > 20)
- M.adjustToxLoss(5*REM)
+ M.adjustToxLoss(5*REAGENTS_EFFECT_MULTIPLIER)
if(prob(6))
M.fakevomit()
..()
-/datum/chemical_reaction/calomel
- name = "Calomel"
- id = "calomel"
- result = "calomel"
- required_reagents = list("mercury" = 1, "chlorine" = 1)
- result_amount = 2
- min_temp = 374
- mix_message = "Stinging vapors rise from the solution."
-
-/datum/reagent/potass_iodide
+/datum/reagent/medicine/potass_iodide
name = "Potassium Iodide"
id = "potass_iodide"
description = "Potassium Iodide is a medicinal drug used to counter the effects of radiation poisoning."
reagent_state = LIQUID
color = "#B4DCBE"
-/datum/reagent/potass_iodide/on_mob_life(mob/living/M)
+/datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/M)
if(prob(80))
M.radiation = max(0, M.radiation-1)
..()
-/datum/chemical_reaction/potass_iodide
- name = "Potassium Iodide"
- id = "potass_iodide"
- result = "potass_iodide"
- required_reagents = list("potassium" = 1, "iodine" = 1)
- result_amount = 2
- mix_message = "The solution settles calmly and emits gentle fumes."
-
-/datum/reagent/pen_acid
+/datum/reagent/medicine/pen_acid
name = "Pentetic Acid"
id = "pen_acid"
description = "Pentetic Acid is an aggressive chelation agent. May cause tissue damage. Use with caution."
reagent_state = LIQUID
color = "#C8A5DC"
-/datum/reagent/pen_acid/on_mob_life(mob/living/M)
+/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/M)
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,4)
M.radiation = max(0, M.radiation-7)
if(prob(75))
- M.adjustToxLoss(-4*REM)
+ M.adjustToxLoss(-4*REAGENTS_EFFECT_MULTIPLIER)
if(prob(33))
- M.adjustBruteLoss(1*REM)
- M.adjustFireLoss(1*REM)
+ M.adjustBruteLoss(1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(1*REAGENTS_EFFECT_MULTIPLIER)
..()
- return
-/datum/chemical_reaction/pen_acid
- name = "Pentetic Acid"
- id = "pen_acid"
- result = "pen_acid"
- required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1)
- result_amount = 6
- mix_message = "The substance becomes very still, emitting a curious haze."
-
-/datum/reagent/sal_acid
+/datum/reagent/medicine/sal_acid
name = "Salicylic Acid"
id = "sal_acid"
description = "This is a is a standard salicylate pain reliever and fever reducer."
@@ -289,25 +361,16 @@
shock_reduction = 25
overdose_threshold = 25
-/datum/reagent/sal_acid/on_mob_life(mob/living/M)
+/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/M)
if(prob(55))
- M.adjustBruteLoss(-2*REM)
+ M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.traumatic_shock < 100)
H.shock_stage = 0
..()
-/datum/chemical_reaction/sal_acid
- name = "Salicyclic Acid"
- id = "sal_acid"
- result = "sal_acid"
- required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1)
- result_amount = 5
- mix_message = "The mixture crystallizes."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/salbutamol
+/datum/reagent/medicine/salbutamol
name = "Salbutamol"
id = "salbutamol"
description = "Salbutamol is a common bronchodilation medication for asthmatics. It may help with other breathing problems as well."
@@ -315,21 +378,12 @@
color = "#00FFFF"
metabolization_rate = 0.2
-/datum/reagent/salbutamol/on_mob_life(mob/living/M)
- M.adjustOxyLoss(-6*REM)
- M.losebreath = max(0, M.losebreath-4)
+/datum/reagent/medicine/salbutamol/on_mob_life(mob/living/M)
+ M.adjustOxyLoss(-6*REAGENTS_EFFECT_MULTIPLIER)
+ M.AdjustLoseBreath(-4)
..()
-/datum/chemical_reaction/salbutamol
- name = "Salbutamol"
- id = "salbutamol"
- result = "salbutamol"
- required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminum" = 1, "bromine" = 1, "ammonia" = 1)
- result_amount = 5
- mix_message = "The solution bubbles freely, creating a head of bluish foam."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/perfluorodecalin
+/datum/reagent/medicine/perfluorodecalin
name = "Perfluorodecalin"
id = "perfluorodecalin"
description = "This experimental perfluoronated solvent has applications in liquid breathing and tissue oxygenation. Use with caution."
@@ -338,27 +392,17 @@
metabolization_rate = 0.2
addiction_chance = 20
-/datum/reagent/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
- M.adjustOxyLoss(-25*REM)
+/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
+ M.adjustOxyLoss(-25*REAGENTS_EFFECT_MULTIPLIER)
if(volume >= 4)
- M.losebreath = max(M.losebreath, 6)
- M.silent = max(M.silent, 6)
+ M.LoseBreath(6)
+ M.Silence(6)
if(prob(33))
- M.adjustBruteLoss(-1*REM)
- M.adjustFireLoss(-1*REM)
+ M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
..()
-/datum/chemical_reaction/perfluorodecalin
- name = "Perfluorodecalin"
- id = "perfluorodecalin"
- result = "perfluorodecalin"
- required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1)
- result_amount = 3
- min_temp = 370
- mix_message = "The mixture rapidly turns into a dense pink liquid."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/ephedrine
+/datum/reagent/medicine/ephedrine
name = "Ephedrine"
id = "ephedrine"
description = "Ephedrine is a plant-derived stimulant."
@@ -368,14 +412,13 @@
overdose_threshold = 35
addiction_chance = 25
-/datum/reagent/ephedrine/on_mob_life(mob/living/M)
- M.drowsyness = max(0, M.drowsyness-5)
+/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/M)
+ M.AdjustDrowsy(-5)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
- M.adjustStaminaLoss(-1*REM)
- if(M.losebreath > 5)
- M.losebreath = max(5, M.losebreath-1)
+ M.adjustStaminaLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.AdjustLoseBreath(-1, bound_lower = 5)
if(M.oxyloss > 75)
M.adjustOxyLoss(-1)
if(M.health < 0 || M.health > 0 && prob(33))
@@ -384,7 +427,7 @@
M.adjustFireLoss(-1)
..()
-/datum/reagent/ephedrine/overdose_process(mob/living/M, severity)
+/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 1)
@@ -405,15 +448,7 @@
if(effect <= 15)
M.emote("collapse")
-/datum/chemical_reaction/ephedrine
- name = "Ephedrine"
- id = "ephedrine"
- result = "ephedrine"
- required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1)
- result_amount = 4
- mix_message = "The solution fizzes and gives off toxic fumes."
-
-/datum/reagent/diphenhydramine
+/datum/reagent/medicine/diphenhydramine
name = "Diphenhydramine"
id = "diphenhydramine"
description = "Anti-allergy medication. May cause drowsiness, do not operate heavy machinery while using this."
@@ -421,28 +456,19 @@
color = "#5BCBE1"
addiction_chance = 10
-/datum/reagent/diphenhydramine/on_mob_life(mob/living/M)
- M.jitteriness = max(0, M.jitteriness-20)
+/datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/M)
+ M.AdjustJitter(-20)
M.reagents.remove_reagent("histamine",3)
M.reagents.remove_reagent("itching_powder",3)
if(prob(7))
M.emote("yawn")
if(prob(3))
M.Stun(2)
- M.drowsyness += 1
+ M.AdjustDrowsy(1)
M.visible_message("[M] looks a bit dazed.")
..()
-/datum/chemical_reaction/diphenhydramine
- name = "Diphenhydramine"
- id = "diphenhydramine"
- result = "diphenhydramine"
- required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1)
- result_amount = 4
- mix_message = "The mixture fizzes gently."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/morphine
+/datum/reagent/medicine/morphine
name = "Morphine"
id = "morphine"
description = "A strong but highly addictive opiate painkiller with sedative side effects."
@@ -452,60 +478,50 @@
addiction_chance = 50
shock_reduction = 50
-/datum/reagent/morphine/on_mob_life(mob/living/M)
- M.jitteriness = max(0, M.jitteriness-25)
+/datum/reagent/medicine/morphine/on_mob_life(mob/living/M)
+ M.AdjustJitter(-25)
switch(current_cycle)
if(1 to 15)
if(prob(7))
M.emote("yawn")
if(16 to 35)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(36 to INFINITY)
M.Paralyse(15)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.traumatic_shock < 100)
H.shock_stage = 0
..()
-/datum/reagent/oculine/on_mob_life(mob/living/M)
+/datum/reagent/medicine/oculine
+ name = "Oculine"
+ id = "oculine"
+ description = "Oculine is a saline eye medication with mydriatic and antibiotic effects."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+
+/datum/reagent/medicine/oculine/on_mob_life(mob/living/M)
if(prob(80))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
if(istype(E))
E.damage = max(E.damage-1, 0)
- M.eye_blurry = max(M.eye_blurry-1 , 0)
- M.adjustEarDamage(-1,0)
+ M.AdjustEyeBlurry(-1)
+ M.AdjustEarDamage(-1)
if(prob(50))
- M.disabilities &= ~NEARSIGHTED
+ M.CureNearsighted()
if(prob(30))
- M.disabilities &= ~BLIND
- M.eye_blind = 0
+ M.CureBlind()
+ M.SetEyeBlind(0)
if(M.ear_damage <= 25)
if(prob(30))
- M.setEarDamage(-1,0)
+ M.SetEarDeaf(0)
..()
-/datum/chemical_reaction/oculine
- name = "Oculine"
- id = "oculine"
- result = "oculine"
- required_reagents = list("atropine" = 1, "spaceacillin" = 1, "salglu_solution" = 1)
- result_amount = 3
- mix_message = "The mixture settles, becoming a milky white."
-
-/datum/reagent/oculine
- name = "Oculine"
- id = "oculine"
- description = "Oculine is a saline eye medication with mydriatic and antibiotic effects."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.4
- var/cycle_amount = 0
-
-/datum/reagent/atropine
+/datum/reagent/medicine/atropine
name = "Atropine"
id = "atropine"
description = "Atropine is a potent cardiac resuscitant but it can causes confusion, dizzyness and hyperthermia."
@@ -514,33 +530,24 @@
metabolization_rate = 0.2
overdose_threshold = 25
-/datum/reagent/atropine/on_mob_life(mob/living/M)
- M.dizziness += 1
- M.confused = max(M.confused, 5)
+/datum/reagent/medicine/atropine/on_mob_life(mob/living/M)
+ M.AdjustDizzy(1)
+ M.Confused(5)
if(prob(4))
M.emote("collapse")
- if(M.losebreath > 5)
- M.losebreath = max(5, M.losebreath-5)
+ M.AdjustLoseBreath(-5, bound_lower = 5)
if(M.oxyloss > 65)
- M.adjustOxyLoss(-10*REM)
+ M.adjustOxyLoss(-10*REAGENTS_EFFECT_MULTIPLIER)
if(M.health < -25)
M.adjustToxLoss(-1)
- M.adjustBruteLoss(-3*REM)
- M.adjustFireLoss(-3*REM)
+ M.adjustBruteLoss(-3*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-3*REAGENTS_EFFECT_MULTIPLIER)
else if(M.health > -60)
M.adjustToxLoss(1)
M.reagents.remove_reagent("sarin", 20)
..()
-/datum/chemical_reaction/atropine
- name = "Atropine"
- id = "atropine"
- result = "atropine"
- required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1)
- result_amount = 5
- mix_message = "A horrid smell like something died drifts from the mixture."
-
-/datum/reagent/epinephrine
+/datum/reagent/medicine/epinephrine
name = "Epinephrine"
id = "epinephrine"
description = "Epinephrine is a potent neurotransmitter, used in medical emergencies to halt anaphylactic shock and prevent cardiac arrest."
@@ -549,8 +556,8 @@
metabolization_rate = 0.2
overdose_threshold = 20
-/datum/reagent/epinephrine/on_mob_life(mob/living/M)
- M.drowsyness = max(0, M.drowsyness-5)
+/datum/reagent/medicine/epinephrine/on_mob_life(mob/living/M)
+ M.AdjustDrowsy(-5)
if(prob(20))
M.AdjustParalysis(-1)
if(prob(20))
@@ -562,17 +569,16 @@
if(prob(5))
M.adjustBrainLoss(-1)
holder.remove_reagent("histamine", 15)
- if(M.losebreath > 3)
- M.losebreath--
+ M.AdjustLoseBreath(-1, bound_lower = 3)
if(M.oxyloss > 35)
- M.adjustOxyLoss(-10*REM)
+ M.adjustOxyLoss(-10*REAGENTS_EFFECT_MULTIPLIER)
if(M.health < -10 && M.health > -65)
- M.adjustToxLoss(-1*REM)
- M.adjustBruteLoss(-1*REM)
- M.adjustFireLoss(-1*REM)
+ M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
..()
-/datum/reagent/epinephrine/overdose_process(mob/living/M, severity)
+/datum/reagent/medicine/epinephrine/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 1)
@@ -593,16 +599,7 @@
if(effect <= 15)
M.emote("collapse")
-/datum/chemical_reaction/epinephrine
- name = "Epinephrine"
- id = "epinephrine"
- result = "epinephrine"
- required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1)
- result_amount = 6
- mix_message = "Tiny white crystals precipitate out of the solution."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/strange_reagent
+/datum/reagent/medicine/strange_reagent
name = "Strange Reagent"
id = "strange_reagent"
description = "A glowing green fluid highly reminiscent of nuclear waste."
@@ -610,7 +607,13 @@
color = "#A0E85E"
metabolization_rate = 0.2
-/datum/reagent/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, volume)
+/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/M)
+ if(prob(10))
+ M.adjustBruteLoss(2*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
+
+/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, volume)
if(isanimal(M))
if(method == TOUCH)
var/mob/living/simple_animal/SM = M
@@ -642,59 +645,24 @@
add_logs(M, M, "revived", object="strange reagent") //Yes, the logs say you revived yourself.
..()
-/datum/reagent/strange_reagent/on_mob_life(mob/living/M)
- if(prob(10))
- M.adjustBruteLoss(2*REM)
- M.adjustToxLoss(2*REM)
- ..()
-
-/datum/chemical_reaction/strange_reagent
- name = "Strange Reagent"
- id = "strange_reagent"
- result = "strange_reagent"
- required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1)
- result_amount = 3
- mix_message = "The substance begins moving on its own somehow."
-
-/datum/reagent/life
- name = "Life"
- id = "life"
- description = "Can create a life form, however it is not guaranteed to be friendly. May want to have Security on hot standby."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.2
-
-/datum/chemical_reaction/life
- name = "Life"
- id = "life"
- result = null
- required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1)
- result_amount = 3
- min_temp = 374
-
-/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume)
- chemical_mob_spawn(holder, 1, "Life")
-
-/datum/reagent/mannitol/on_mob_life(mob/living/M)
- M.adjustBrainLoss(-3)
- ..()
-
-/datum/chemical_reaction/mannitol
- name = "Mannitol"
- id = "mannitol"
- result = "mannitol"
- required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1)
- result_amount = 3
- mix_message = "The mixture bubbles slowly, making a slightly sweet odor."
-
-/datum/reagent/mannitol
+/datum/reagent/medicine/mannitol
name = "Mannitol"
id = "mannitol"
description = "Mannitol is a sugar alcohol that can help alleviate cranial swelling."
color = "#D1D1F1"
-/datum/reagent/mutadone/on_mob_life(mob/living/carbon/human/M)
- M.jitteriness = 0
+/datum/reagent/medicine/mannitol/on_mob_life(mob/living/M)
+ M.adjustBrainLoss(-3)
+ ..()
+
+/datum/reagent/medicine/mutadone
+ name = "Mutadone"
+ id = "mutadone"
+ description = "Mutadone is an experimental bromide that can cure genetic abnomalities."
+ color = "#5096C8"
+
+/datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/human/M)
+ M.SetJitter(0)
var/needs_update = M.mutations.len > 0 || M.disabilities > 0
if(needs_update)
@@ -711,62 +679,38 @@
H.update_mutations()
..()
-/datum/chemical_reaction/mutadone
- name = "Mutadone"
- id = "mutadone"
- result = "mutadone"
- required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1)
- result_amount = 3
- mix_message = "A foul astringent liquid emerges from the reaction."
-
-
-/datum/reagent/mutadone
- name = "Mutadone"
- id = "mutadone"
- description = "Mutadone is an experimental bromide that can cure genetic abnomalities."
- color = "#5096C8"
-
-/datum/reagent/antihol
+/datum/reagent/medicine/antihol
name = "Antihol"
id = "antihol"
description = "A medicine which quickly eliminates alcohol in the body."
color = "#009CA8"
-/datum/reagent/antihol/on_mob_life(mob/living/M)
- M.slurring = 0
+/datum/reagent/medicine/antihol/on_mob_life(mob/living/M)
+ M.SetSlur(0)
M.AdjustDrunk(-4)
- M.reagents.remove_all_type(/datum/reagent/ethanol, 8, 0, 1)
+ M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 8, 0, 1)
if(M.toxloss <= 25)
M.adjustToxLoss(-2.0)
..()
-/datum/chemical_reaction/antihol
- name = "antihol"
- id = "antihol"
- result = "antihol"
- required_reagents = list("ethanol" = 1, "charcoal" = 1)
- result_amount = 2
- mix_message = "A minty and refreshing smell drifts from the effervescent mixture."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/stimulants
+/datum/reagent/medicine/stimulants
name = "Stimulants"
id = "stimulants"
description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun."
color = "#C8A5DC"
- metabolization_rate = 0.4
+ can_synth = 0
-/datum/reagent/stimulants/on_mob_life(mob/living/M)
+/datum/reagent/medicine/stimulants/on_mob_life(mob/living/M)
if(volume > 5)
- M.adjustOxyLoss(-5*REM)
- M.adjustToxLoss(-5*REM)
- M.adjustBruteLoss(-10*REM)
- M.adjustFireLoss(-10*REM)
+ M.adjustOxyLoss(-5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustToxLoss(-5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustBruteLoss(-10*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-10*REAGENTS_EFFECT_MULTIPLIER)
M.setStaminaLoss(0)
- M.slowed = 0
- M.dizziness = max(0,M.dizziness-10)
- M.drowsyness = max(0,M.drowsyness-10)
- M.confused = 0
+ M.SetSlowed(0)
+ M.AdjustDizzy(-10)
+ M.AdjustDrowsy(-10)
+ M.SetConfused(0)
M.SetSleeping(0)
var/status = CANSTUN | CANWEAKEN | CANPARALYSE
M.status_flags &= ~status
@@ -778,7 +722,7 @@
M.Stun(3)
..()
-/datum/reagent/stimulants/reagent_deleted(mob/living/M)
+/datum/reagent/medicine/stimulants/on_mob_delete(mob/living/M)
M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE
..()
@@ -789,57 +733,49 @@
color = "#C8A5DC"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
overdose_threshold = 60
+ can_synth = 0
/datum/reagent/medicine/stimulative_agent/on_mob_life(mob/living/M)
M.status_flags |= GOTTAGOFAST
if(M.health < 50 && M.health > 0)
- M.adjustOxyLoss(-1*REM)
- M.adjustToxLoss(-1*REM)
- M.adjustBruteLoss(-1*REM)
- M.adjustFireLoss(-1*REM)
+ M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
M.AdjustParalysis(-3)
M.AdjustStunned(-3)
M.AdjustWeakened(-3)
- M.adjustStaminaLoss(-5*REM)
+ M.adjustStaminaLoss(-5*REAGENTS_EFFECT_MULTIPLIER)
..()
-/datum/reagent/medicine/stimulative_agent/reagent_deleted(mob/living/M)
+/datum/reagent/medicine/stimulative_agent/on_mob_delete(mob/living/M)
M.status_flags &= ~GOTTAGOFAST
..()
/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M, severity)
if(prob(33))
- M.adjustStaminaLoss(2.5*REM)
- M.adjustToxLoss(1*REM)
- M.losebreath++
+ M.adjustStaminaLoss(2.5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
+ M.AdjustLoseBreath(1)
-/datum/reagent/insulin
+/datum/reagent/medicine/insulin
name = "Insulin"
id = "insulin"
description = "A hormone generated by the pancreas responsible for metabolizing carbohydrates and fat in the bloodstream."
reagent_state = LIQUID
color = "#C8A5DC"
-/datum/reagent/insulin/on_mob_life(mob/living/M)
+/datum/reagent/medicine/insulin/on_mob_life(mob/living/M)
M.reagents.remove_reagent("sugar", 5)
..()
-
-/datum/reagent/simethicone
+/datum/reagent/medicine/simethicone
name = "Simethicone"
id = "simethicone"
description = "This strange liquid seems to have no bubbles on the surface."
color = "#14AA46"
-/datum/chemical_reaction/Simethicone
- name = "Simethicone"
- id = "simethicone"
- result = "simethicone"
- required_reagents = list("hydrogen" = 1, "chlorine" = 1, "silicon" = 1, "oxygen" = 1)
- result_amount = 4
-
-
-/datum/reagent/teporone
+/datum/reagent/medicine/teporone
name = "Teporone"
id = "teporone"
description = "This experimental plasma-based compound seems to regulate body temperature."
@@ -848,30 +784,21 @@
addiction_chance = 20
overdose_threshold = 50
-/datum/reagent/teporone/on_mob_life(mob/living/M)
+/datum/reagent/medicine/teporone/on_mob_life(mob/living/M)
if(M.bodytemperature > 310)
M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT))
else if(M.bodytemperature < 311)
M.bodytemperature = min(310, M.bodytemperature + (40 * TEMPERATURE_DAMAGE_COEFFICIENT))
..()
-/datum/chemical_reaction/teporone
- name = "Teporone"
- id = "teporone"
- result = "teporone"
- required_reagents = list("acetone" = 1, "silicon" = 1, "plasma" = 1)
- result_amount = 2
- mix_message = "The mixture turns an odd lavender color."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/haloperidol
+/datum/reagent/medicine/haloperidol
name = "Haloperidol"
id = "haloperidol"
description = "Haloperidol is a powerful antipsychotic and sedative. Will help control psychiatric problems, but may cause brain damage."
reagent_state = LIQUID
color = "#FFDCFF"
-/datum/reagent/haloperidol/on_mob_life(mob/living/M)
+/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/M)
M.reagents.remove_reagent("crank", 5)
M.reagents.remove_reagent("methamphetamine", 5)
M.reagents.remove_reagent("space_drugs", 5)
@@ -882,135 +809,55 @@
M.reagents.remove_reagent("bath_salts", 5)
M.reagents.remove_reagent("lsd", 5)
M.reagents.remove_reagent("thc", 5)
- M.druggy -= 5
- M.hallucination -= 5
- M.jitteriness -= 5
+ M.AdjustDruggy(-5)
+ M.AdjustHallucinate(-5)
+ M.AdjustJitter(-5)
if(prob(50))
- M.drowsyness = max(M.drowsyness, 3)
+ M.Drowsy(3)
if(prob(10))
M.emote("drool")
if(prob(20))
M.adjustBrainLoss(1)
..()
-/datum/chemical_reaction/haloperidol
- name = "Haloperidol"
- id = "haloperidol"
- result = "haloperidol"
- required_reagents = list("chlorine" = 1, "fluorine" = 1, "aluminum" = 1, "potass_iodide" = 1, "oil" = 1)
- result_amount = 4
- mix_message = "The chemicals mix into an odd pink slush."
-
-
-/datum/reagent/ether
+/datum/reagent/medicine/ether
name = "Ether"
id = "ether"
description = "A strong anesthetic and sedative."
reagent_state = LIQUID
color = "#96DEDE"
-/datum/reagent/ether/on_mob_life(mob/living/M)
- M.jitteriness = max(M.jitteriness-25,0)
+/datum/reagent/medicine/ether/on_mob_life(mob/living/M)
+ M.AdjustJitter(-25)
switch(current_cycle)
if(1 to 15)
if(prob(7))
M.emote("yawn")
if(16 to 35)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(36 to INFINITY)
M.Paralyse(15)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
..()
-/datum/chemical_reaction/ether
- name = "Ether"
- id = "ether"
- result = "ether"
- required_reagents = list("sacid" = 1, "ethanol" = 1, "oxygen" = 1)
- result_amount = 1
- mix_message = "The mixture yields a pungent odor, which makes you tired."
-
-//////////////////////////////
-// Synth-Meds //
-//////////////////////////////
-
-//Degreaser: Mild Purgative / Lube Remover
-/datum/reagent/degreaser
- name = "Degreaser"
- id = "degreaser"
- description = "An industrial degreaser which can be used to clean residual build-up from machinery and surfaces."
- reagent_state = LIQUID
- color = "#CC7A00"
- process_flags = SYNTHETIC
-
-/datum/chemical_reaction/degreaser
- name = "Degreaser"
- id = "degreaser"
- result = "degreaser"
- required_reagents = list("oil" = 1, "sterilizine" = 1)
- result_amount = 2
-
-/datum/reagent/degreaser/reaction_turf(turf/simulated/T, volume)
- if(volume >= 1 && istype(T))
- if(T.wet)
- T.MakeDry(TURF_WET_LUBE)
-
-/datum/reagent/degreaser/on_mob_life(mob/living/M)
- if(prob(50)) //Same effects as coffee, to help purge ill effects like paralysis
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- M.confused = max(0, M.confused-5)
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(R != src)
- if(R.id == "ultralube" || R.id == "lube")
- //Flushes lube and ultra-lube even faster than other chems
- M.reagents.remove_reagent(R.id, 5)
- else
- M.reagents.remove_reagent(R.id,1)
- ..()
-
-//Liquid Solder: Mannitol
-/datum/reagent/liquid_solder
- name = "Liquid Solder"
- id = "liquid_solder"
- description = "A solution formulated to clean and repair damaged connections in posibrains while in use."
- reagent_state = LIQUID
- color = "#D7B395"
- process_flags = SYNTHETIC
-
-/datum/reagent/liquid_solder/on_mob_life(mob/living/M)
- M.adjustBrainLoss(-3)
- ..()
-
-/datum/chemical_reaction/liquid_solder
- name = "Liquid Solder"
- id = "liquid_solder"
- result = "liquid_solder"
- required_reagents = list("ethanol" = 1, "copper" = 1, "silver" = 1)
- result_amount = 3
- min_temp = 370
- mix_message = "The solution gently swirls with a metallic sheen."
-
-
/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
name = "Restorative Nanites"
id = "syndicate_nanites"
description = "Miniature medical robots that swiftly restore bodily damage. May begin to attack their host's cells in high amounts."
reagent_state = SOLID
color = "#555555"
+ can_synth = 0
/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/M)
- M.adjustBruteLoss(-5*REM) //A ton of healing - this is a 50 telecrystal investment.
- M.adjustFireLoss(-5*REM)
- M.adjustOxyLoss(-15*REM)
- M.adjustToxLoss(-5*REM)
- M.adjustBrainLoss(-15*REM)
- M.adjustCloneLoss(-3*REM)
+ M.adjustBruteLoss(-5*REAGENTS_EFFECT_MULTIPLIER) //A ton of healing - this is a 50 telecrystal investment.
+ M.adjustFireLoss(-5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustOxyLoss(-15*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustToxLoss(-5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustBrainLoss(-15*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustCloneLoss(-3*REAGENTS_EFFECT_MULTIPLIER)
..()
-
-/datum/reagent/omnizine_diluted
+/datum/reagent/medicine/omnizine_diluted
name = "Diluted Omnizine"
id = "weak_omnizine"
description = "Slowly heals all damage types. A far weaker substitute than actual omnizine."
@@ -1019,14 +866,14 @@
overdose_threshold = 30
metabolization_rate = 0.1
-/datum/reagent/omnizine_diluted/on_mob_life(mob/living/M)
- M.adjustToxLoss(-0.5*REM)
- M.adjustOxyLoss(-0.5*REM)
- M.adjustBruteLoss(-0.5*REM)
- M.adjustFireLoss(-0.5*REM)
+/datum/reagent/medicine/omnizine_diluted/on_mob_life(mob/living/M)
+ M.adjustToxLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustOxyLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
..()
-/datum/reagent/omnizine_diluted/overdose_process(mob/living/M, severity)
+/datum/reagent/medicine/omnizine_diluted/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1) //lesser
M.stuttering += 1
@@ -1037,7 +884,7 @@
M.Weaken(4)
else if(effect <= 3)
M.visible_message("[M] completely spaces out for a moment.")
- M.confused += 15
+ M.AdjustConfused(15)
else if(effect <= 5)
M.visible_message("[M] stumbles and staggers.")
M.Dizzy(5)
@@ -1059,3 +906,68 @@
M.visible_message("[M] stumbles and staggers.")
M.Dizzy(5)
M.Weaken(3)
+
+//virus-specific symptom reagents
+
+/datum/reagent/medicine/synaphydramine
+ name = "Diphen-Synaptizine"
+ id = "synaphydramine"
+ description = "Reduces drowsiness and hallucinations while also purging histamine from the body."
+ color = "#EC536D" // rgb: 236, 83, 109
+
+/datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/M)
+ M.AdjustDrowsy(-5)
+ if(holder.has_reagent("lsd"))
+ holder.remove_reagent("lsd", 5)
+ if(holder.has_reagent("histamine"))
+ holder.remove_reagent("histamine", 5)
+ M.AdjustHallucinate(-10)
+ if(prob(30))
+ M.adjustToxLoss(1)
+ ..()
+
+//////////////////////////////
+// Synth-Meds //
+//////////////////////////////
+
+//Degreaser: Mild Purgative / Lube Remover
+/datum/reagent/medicine/degreaser
+ name = "Degreaser"
+ id = "degreaser"
+ description = "An industrial degreaser which can be used to clean residual build-up from machinery and surfaces."
+ reagent_state = LIQUID
+ color = "#CC7A00"
+ process_flags = SYNTHETIC
+
+/datum/reagent/medicine/degreaser/on_mob_life(mob/living/M)
+ if(prob(50)) //Same effects as coffee, to help purge ill effects like paralysis
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ M.AdjustConfused(-5)
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ if(R.id == "ultralube" || R.id == "lube")
+ //Flushes lube and ultra-lube even faster than other chems
+ M.reagents.remove_reagent(R.id, 5)
+ else
+ M.reagents.remove_reagent(R.id,1)
+ ..()
+
+/datum/reagent/medicine/degreaser/reaction_turf(turf/simulated/T, volume)
+ if(volume >= 1 && istype(T))
+ if(T.wet)
+ T.MakeDry(TURF_WET_LUBE)
+
+//Liquid Solder: Mannitol
+/datum/reagent/medicine/liquid_solder
+ name = "Liquid Solder"
+ id = "liquid_solder"
+ description = "A solution formulated to clean and repair damaged connections in posibrains while in use."
+ reagent_state = LIQUID
+ color = "#D7B395"
+ process_flags = SYNTHETIC
+
+/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M)
+ M.adjustBrainLoss(-3)
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/chemistry/reagents/misc.dm
similarity index 57%
rename from code/modules/reagents/newchem/other.dm
rename to code/modules/reagents/chemistry/reagents/misc.dm
index 2ff4a18c3d0..bb386d0215c 100644
--- a/code/modules/reagents/newchem/other.dm
+++ b/code/modules/reagents/chemistry/reagents/misc.dm
@@ -1,9 +1,189 @@
-#define SOLID 1
-#define LIQUID 2
-#define GAS 3
-#define REM REAGENTS_EFFECT_MULTIPLIER
+/*/datum/reagent/silicate
+ name = "Silicate"
+ id = "silicate"
+ description = "A compound that can be used to reinforce glass."
+ reagent_state = LIQUID
+ color = "#C7FFFF" // rgb: 199, 255, 255
-var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
+/datum/reagent/silicate/reaction_obj(obj/O, volume)
+ if(istype(O, /obj/structure/window))
+ if(O:silicate <= 200)
+
+ O:silicate += volume
+ O:health += volume * 3
+
+ if(!O:silicateIcon)
+ var/icon/I = icon(O.icon,O.icon_state,O.dir)
+
+ var/r = (volume / 100) + 1
+ var/g = (volume / 70) + 1
+ var/b = (volume / 50) + 1
+ I.SetIntensity(r,g,b)
+ O.icon = I
+ O:silicateIcon = I
+ else
+ var/icon/I = O:silicateIcon
+
+ var/r = (volume / 100) + 1
+ var/g = (volume / 70) + 1
+ var/b = (volume / 50) + 1
+ I.SetIntensity(r,g,b)
+ O.icon = I
+ O:silicateIcon = I */
+
+
+/datum/reagent/oxygen
+ name = "Oxygen"
+ id = "oxygen"
+ description = "A colorless, odorless gas."
+ reagent_state = GAS
+ color = "#808080" // rgb: 128, 128, 128
+
+
+/datum/reagent/nitrogen
+ name = "Nitrogen"
+ id = "nitrogen"
+ description = "A colorless, odorless, tasteless gas."
+ reagent_state = GAS
+ color = "#808080" // rgb: 128, 128, 128
+
+
+/datum/reagent/hydrogen
+ name = "Hydrogen"
+ id = "hydrogen"
+ description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas."
+ reagent_state = GAS
+ color = "#808080" // rgb: 128, 128, 128
+
+
+/datum/reagent/potassium
+ name = "Potassium"
+ id = "potassium"
+ description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water."
+ reagent_state = SOLID
+ color = "#A0A0A0" // rgb: 160, 160, 160
+
+
+/datum/reagent/sulfur
+ name = "Sulfur"
+ id = "sulfur"
+ description = "A chemical element."
+ reagent_state = SOLID
+ color = "#BF8C00" // rgb: 191, 140, 0
+
+
+/datum/reagent/sodium
+ name = "Sodium"
+ id = "sodium"
+ description = "A chemical element."
+ reagent_state = SOLID
+ color = "#808080" // rgb: 128, 128, 128
+
+
+/datum/reagent/phosphorus
+ name = "Phosphorus"
+ id = "phosphorus"
+ description = "A chemical element."
+ reagent_state = SOLID
+ color = "#832828" // rgb: 131, 40, 40
+
+
+/datum/reagent/carbon
+ name = "Carbon"
+ id = "carbon"
+ description = "A chemical element."
+ reagent_state = SOLID
+ color = "#1C1300" // rgb: 30, 20, 0
+
+/datum/reagent/carbon/reaction_turf(turf/T, volume)
+ if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T)) // Only add one dirt per turf. Was causing people to crash.
+ new /obj/effect/decal/cleanable/dirt(T)
+
+/datum/reagent/gold
+ name = "Gold"
+ id = "gold"
+ description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known."
+ reagent_state = SOLID
+ color = "#F7C430" // rgb: 247, 196, 48
+
+
+/datum/reagent/silver
+ name = "Silver"
+ id = "silver"
+ description = "A lustrous metallic element regarded as one of the precious metals."
+ reagent_state = SOLID
+ color = "#D0D0D0" // rgb: 208, 208, 208
+
+
+/datum/reagent/aluminum
+ name = "Aluminum"
+ id = "aluminum"
+ description = "A silvery white and ductile member of the boron group of chemical elements."
+ reagent_state = SOLID
+ color = "#A8A8A8" // rgb: 168, 168, 168
+
+
+/datum/reagent/silicon
+ name = "Silicon"
+ id = "silicon"
+ description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon."
+ reagent_state = SOLID
+ color = "#A8A8A8" // rgb: 168, 168, 168
+
+
+/datum/reagent/copper
+ name = "Copper"
+ id = "copper"
+ description = "A highly ductile metal."
+ color = "#6E3B08" // rgb: 110, 59, 8
+
+
+/datum/reagent/iron
+ name = "Iron"
+ id = "iron"
+ description = "Pure iron is a metal."
+ reagent_state = SOLID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/reagent/iron/on_mob_life(mob/living/M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD))
+ H.vessel.add_reagent("blood", 0.8)
+ ..()
+
+//foam
+/datum/reagent/fluorosurfactant
+ name = "Fluorosurfactant"
+ id = "fluorosurfactant"
+ description = "A perfluoronated sulfonic acid that forms a foam when mixed with water."
+ reagent_state = LIQUID
+ color = "#9E6B38" // rgb: 158, 107, 56
+
+// metal foaming agent
+// this is lithium hydride. Add other recipies (e.g. LiH + H2O -> LiOH + H2) eventually
+/datum/reagent/ammonia
+ name = "Ammonia"
+ id = "ammonia"
+ description = "A caustic substance commonly used in fertilizer or household cleaners."
+ reagent_state = GAS
+ color = "#404030" // rgb: 64, 64, 48
+
+/datum/reagent/diethylamine
+ name = "Diethylamine"
+ id = "diethylamine"
+ description = "A secondary amine, useful as a plant nutrient and as building block for other compounds."
+ reagent_state = LIQUID
+ color = "#322D00"
+
+// Allows you to make planks from any plant that has this reagent in it.
+// Also vines with this reagent are considered dense.
+/datum/reagent/woodpulp
+ name = "Wood Pulp"
+ id = "woodpulp"
+ description = "A mass of wood fibers."
+ reagent_state = LIQUID
+ color = "#B97A57"
/datum/reagent/oil
name = "Oil"
@@ -64,49 +244,12 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
M.adjustToxLoss(1.5)
..()
-/datum/chemical_reaction/acetone
- name = "acetone"
- id = "acetone"
- result = "acetone"
- required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1)
- result_amount = 3
- mix_message = "The smell of paint thinner assaults you as the solution bubbles."
-
-/datum/chemical_reaction/carpet
- name = "carpet"
- id = "carpet"
- result = "carpet"
- required_reagents = list("fungus" = 1, "blood" = 1)
- result_amount = 2
- mix_message = "The substance turns thick and stiff, yet soft."
-
-
-/datum/chemical_reaction/oil
- name = "Oil"
- id = "oil"
- result = "oil"
- required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1)
- result_amount = 3
- mix_message = "An iridescent black chemical forms in the container."
-
-/datum/chemical_reaction/phenol
- name = "phenol"
- id = "phenol"
- result = "phenol"
- required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1)
- result_amount = 3
- mix_message = "The mixture bubbles and gives off an unpleasant medicinal odor."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/chemical_reaction/ash
- name = "Ash"
- id = "ash"
- result = "ash"
- required_reagents = list("oil" = 1)
- result_amount = 0.5
- min_temp = 480
- mix_sound = null
- no_message = 1
+/datum/reagent/saltpetre
+ name = "Saltpetre"
+ id = "saltpetre"
+ description = "Volatile."
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
/datum/reagent/colorful_reagent
name = "Colorful Reagent"
@@ -115,14 +258,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
reagent_state = LIQUID
color = "#FFFFFF"
-/datum/chemical_reaction/colorful_reagent
- name = "colorful_reagent"
- id = "colorful_reagent"
- result = "colorful_reagent"
- required_reagents = list("plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1, "stabilizing_agent" = 1)
- result_amount = 6
- mix_message = "The substance flashes multiple colors and emits the smell of a pocket protector."
-
/datum/reagent/colorful_reagent/reaction_mob(mob/living/simple_animal/M, method=TOUCH, volume)
if(isanimal(M))
M.color = pick(random_color_list)
@@ -138,40 +273,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
T.color = pick(random_color_list)
..()
-/datum/chemical_reaction/corgium
- name = "corgium"
- id = "corgium"
- result = null
- required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1)
- result_amount = 3
- min_temp = 374
-
-/datum/reagent/corgium
- name = "Corgium"
- id = "corgium"
- description = "Corgi in liquid form. Don't ask."
- reagent_state = LIQUID
- color = "#F9A635"
-
-/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
- new /mob/living/simple_animal/pet/corgi(location)
- ..()
-
-/datum/chemical_reaction/flaptonium
- name = "Flaptonium"
- id = "flaptonium"
- result = null
- required_reagents = list("egg" = 1, "colorful_reagent" = 1, "chicken_soup" = 1, "strange_reagent" = 1, "blood" = 1)
- result_amount = 5
- min_temp = 374
- mix_message = "The substance turns an airy sky-blue and foams up into a new shape."
-
-/datum/chemical_reaction/flaptonium/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
- new /mob/living/simple_animal/parrot(location)
- ..()
-
/datum/reagent/hair_dye
name = "Quantum Hair Dye"
id = "hair_dye"
@@ -179,13 +280,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
reagent_state = LIQUID
color = "#960096"
-/datum/chemical_reaction/hair_dye
- name = "hair_dye"
- id = "hair_dye"
- result = "hair_dye"
- required_reagents = list("colorful_reagent" = 1, "hairgrownium" = 1)
- result_amount = 2
-
/datum/reagent/hair_dye/reaction_mob(mob/living/M, volume)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -208,14 +302,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
color = "#5DDA5D"
penetrates_skin = 1
-/datum/chemical_reaction/hairgrownium
- name = "hairgrownium"
- id = "hairgrownium"
- result = "hairgrownium"
- required_reagents = list("carpet" = 1, "synthflesh" = 1, "ephedrine" = 1)
- result_amount = 3
- mix_message = "The liquid becomes slightly hairy."
-
/datum/reagent/hairgrownium/reaction_mob(mob/living/M, volume)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -234,15 +320,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
color = "#5DD95D"
penetrates_skin = 1
-
-/datum/chemical_reaction/super_hairgrownium
- name = "Super Hairgrownium"
- id = "super_hairgrownium"
- result = "super_hairgrownium"
- required_reagents = list("iron" = 1, "methamphetamine" = 1, "hairgrownium" = 1)
- result_amount = 3
- mix_message = "The liquid becomes amazingly furry and smells peculiar."
-
/datum/reagent/super_hairgrownium/reaction_mob(mob/living/M, volume)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -275,14 +352,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
reagent_state = GAS
color = "#D06E27"
-/datum/chemical_reaction/fartonium
- name = "Fartonium"
- id = "fartonium"
- result = "fartonium"
- required_reagents = list("fake_cheese" = 1, "beans" = 1, "????" = 1, "egg" = 1)
- result_amount = 2
- mix_message = "The substance makes a little 'toot' noise and starts to smell pretty bad."
-
/datum/reagent/fartonium/on_mob_life(mob/living/M)
if(prob(66))
M.emote("fart")
@@ -299,49 +368,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
M.adjustBruteLoss(4)
..()
-/datum/chemical_reaction/soapification
- name = "Soapification"
- id = "soapification"
- result = null
- required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles
- min_temp = 374
- result_amount = 1
-
-
-/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
- new /obj/item/weapon/soap/homemade(location)
-
-/datum/chemical_reaction/candlefication
- name = "Candlefication"
- id = "candlefication"
- result = null
- required_reagents = list("liquidgibs" = 5, "oxygen" = 5) //
- min_temp = 374
- result_amount = 1
-
-/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
- new /obj/item/candle(location)
-
-/datum/chemical_reaction/meatification
- name = "Meatification"
- id = "meatification"
- result = null
- required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10)
- result_amount = 1
-
-/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
- new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct(location)
-
-/datum/chemical_reaction/lye
- name = "lye"
- id = "lye"
- result = "lye"
- required_reagents = list("sodium" = 1, "hydrogen" = 1, "oxygen" = 1)
- result_amount = 3
-
/datum/reagent/hugs
name = "Pure hugs"
id = "hugs"
@@ -356,9 +382,6 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
reagent_state = LIQUID
color = "#FF83A5"
-/datum/reagent/love/reaction_mob(mob/living/M, method=TOUCH, volume)
- to_chat(M, "You feel loved!")
-
/datum/reagent/love/on_mob_life(mob/living/M)
if(M.a_intent == I_HARM)
M.a_intent = I_HELP
@@ -378,13 +401,53 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
break
..()
-/datum/chemical_reaction/love
- name = "pure love"
- id = "love"
- result = "love"
- required_reagents = list("hugs" = 1, "chocolate" = 1)
- result_amount = 2
- mix_message = "The substance gives off a lovely scent!"
+/datum/reagent/love/reaction_mob(mob/living/M, method=TOUCH, volume)
+ to_chat(M, "You feel loved!")
+
+/datum/reagent/royal_bee_jelly
+ name = "royal bee jelly"
+ id = "royal_bee_jelly"
+ description = "Royal Bee Jelly, if injected into a Queen Space Bee said bee will split into two bees."
+ color = "#00ff80"
+
+/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/M)
+ if(prob(2))
+ M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."))
+ ..()
+
+/datum/reagent/toxin/coffeepowder
+ name = "Coffee Grounds"
+ id = "coffeepowder"
+ description = "Finely ground Coffee beans, used to make coffee."
+ reagent_state = SOLID
+ color = "#5B2E0D" // rgb: 91, 46, 13
+
+/datum/reagent/toxin/teapowder
+ name = "Ground Tea Leaves"
+ id = "teapowder"
+ description = "Finely shredded Tea leaves, used for making tea."
+ reagent_state = SOLID
+ color = "#7F8400" // rgb: 127, 132, 0
+
+//Reagents used for plant fertilizers.
+/datum/reagent/toxin/fertilizer
+ name = "fertilizer"
+ id = "fertilizer"
+ description = "A chemical mix good for growing plants with."
+ reagent_state = LIQUID
+ color = "#664330" // rgb: 102, 67, 48
+
+/datum/reagent/toxin/fertilizer/eznutrient
+ name = "EZ Nutrient"
+ id = "eznutrient"
+
+/datum/reagent/toxin/fertilizer/left4zed
+ name = "Left-4-Zed"
+ id = "left4zed"
+
+/datum/reagent/toxin/fertilizer/robustharvest
+ name = "Robust Harvest"
+ id = "robustharvest"
///Alchemical Reagents
@@ -421,22 +484,4 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
id = "triplepiss"
description = "Ewwwwwwwww."
reagent_state = LIQUID
- color = "#857400"
-
-/datum/reagent/royal_bee_jelly
- name = "royal bee jelly"
- id = "royal_bee_jelly"
- description = "Royal Bee Jelly, if injected into a Queen Space Bee said bee will split into two bees."
- color = "#00ff80"
-
-/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/M)
- if(prob(2))
- M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."))
- ..()
-
-/datum/chemical_reaction/royal_bee_jelly
- name = "royal bee jelly"
- id = "royal_bee_jelly"
- result = "royal_bee_jelly"
- required_reagents = list("mutagen" = 10, "honey" = 40)
- result_amount = 5
\ No newline at end of file
+ color = "#857400"
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_paint.dm b/code/modules/reagents/chemistry/reagents/paint.dm
similarity index 100%
rename from code/modules/reagents/oldchem/reagents/reagents_paint.dm
rename to code/modules/reagents/chemistry/reagents/paint.dm
diff --git a/code/modules/reagents/newchem/paradise_pop.dm b/code/modules/reagents/chemistry/reagents/paradise_pop.dm
similarity index 76%
rename from code/modules/reagents/newchem/paradise_pop.dm
rename to code/modules/reagents/chemistry/reagents/paradise_pop.dm
index 055b96020db..17fdc2cb444 100644
--- a/code/modules/reagents/newchem/paradise_pop.dm
+++ b/code/modules/reagents/chemistry/reagents/paradise_pop.dm
@@ -1,4 +1,3 @@
-
/*
Paradise Pop reagents
Created through the bottler machine via bottler_recipes, not through standard reactions
@@ -10,7 +9,7 @@
//Paradise Punch: No effect, aside from maybe messages about how tasty it is or something
-/datum/reagent/paradise_punch
+/datum/reagent/consumable/drink/paradise_punch
name = "Paradise Punch"
id = "paradise_punch"
description = "Tastes just how you'd think Paradise would if you could bottle it."
@@ -18,14 +17,14 @@
color = "#cc0044"
//Apple-pocalypse: Low chance to cause a goonchem vortex that pulls things within a very small radius (2 tiles?) towards the drinker
-/datum/reagent/apple_pocalypse
+/datum/reagent/consumable/drink/apple_pocalypse
name = "Apple-pocalypse"
id = "apple-pocalypse"
description = "If doomsday came in fruit form, it'd probably be apples."
reagent_state = LIQUID
color = "#44FF44"
-/datum/reagent/apple_pocalypse/on_mob_life(mob/living/M)
+/datum/reagent/consumable/drink/apple_pocalypse/on_mob_life(mob/living/M)
if(prob(1))
var/turf/simulated/T = get_turf(M)
goonchem_vortex(T, 0, 2, 1)
@@ -33,61 +32,61 @@
..()
//Berry Banned: This one is tasty and safe to drink, might have a low chance of healing a random damage type?
-/datum/reagent/berry_banned
+/datum/reagent/consumable/drink/berry_banned
name = "Berry Banned"
id = "berry_banned"
description = "Reason for ban: Excessive Flavor."
reagent_state = LIQUID
color = "#FF44FF"
-/datum/reagent/berry_banned/on_mob_life(mob/living/M)
+/datum/reagent/consumable/drink/berry_banned/on_mob_life(mob/living/M)
if(prob(10))
var/heal_type = rand(0, 5) //still prefer the string version
switch(heal_type)
if(0)
- M.adjustBruteLoss(-0.5*REM)
+ M.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
if(1)
- M.adjustFireLoss(-0.5*REM)
+ M.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
if(2)
- M.adjustToxLoss(-0.5*REM)
+ M.adjustToxLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
if(3)
- M.adjustOxyLoss(-0.5*REM)
+ M.adjustOxyLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
if(4)
- M.adjustCloneLoss(-0.5*REM)
+ M.adjustCloneLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
if(5)
- M.adjustBrainLoss(-1*REM)
+ M.adjustBrainLoss(-1*REAGENTS_EFFECT_MULTIPLIER)
to_chat(M, "You feel slightly rejuvinated!")
..()
//Berry Banned 2: This one is tasty and toxic. Deals toxin damage and MAYBE plays the "BWOINK!" sound if it kills someone?
-/datum/reagent/berry_banned2
+/datum/reagent/consumable/drink/berry_banned2
name = "Berry Banned"
id = "berry_banned2"
description = "Reason for ban: Excessive Flavor."
reagent_state = LIQUID
color = "#FF44FF"
-/datum/reagent/berry_banned2/on_mob_life(mob/living/M)
+/datum/reagent/consumable/drink/berry_banned2/on_mob_life(mob/living/M)
if(prob(50))
- M.adjustToxLoss(2*REM) //double strength of poison berry juice alone, because it's concentrated (this is equal to the damage of normal toxin, less often)
+ M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER) //double strength of poison berry juice alone, because it's concentrated (this is equal to the damage of normal toxin, less often)
if(prob(10))
to_chat(M, "You feel slightly rejuvinated!") //meta this!
..()
-/datum/reagent/berry_banned2/on_mob_death(mob/living/M)
+/datum/reagent/consumable/drink/berry_banned2/on_mob_death(mob/living/M)
M << sound('sound/effects/adminhelp.ogg',0,1,0,25)
to_chat(M, "PM from-Administrator: BWOINK!")
..()
//Blackeye Brew: Chance to make the drinker say greytider-themed things like "I thought clown was valid!"
-/datum/reagent/blackeye_brew
+/datum/reagent/consumable/drink/blackeye_brew
name = "Blackeye Brew"
id = "blackeye_brew"
description = "Creamy, smooth flavor, just like the bald heads of the masses. Supposedly aged for 30 years."
reagent_state = LIQUID
color = "#4d2600"
-/datum/reagent/blackeye_brew/on_mob_life(mob/living/M)
+/datum/reagent/consumable/drink/blackeye_brew/on_mob_life(mob/living/M)
if(prob(25))
var/list/tider_talk = list("CLOWN IS VALID, RIGHT?",
"SHITMINS! SHITMINS! SHITMINS!",
@@ -103,14 +102,14 @@
..()
//Grape Granade: causes the drinker to sometimes burp, has a low chance to cause a goonchem vortex that pushes things within a very small radius (1-2 tiles) away from the drinker
-/datum/reagent/grape_granade
+/datum/reagent/consumable/drink/grape_granade
name = "Grape Granade"
id = "grape_granade"
description = "Exploding with grape flavor and a favorite among ERT members system-wide."
reagent_state = LIQUID
color = "#9933ff"
-/datum/reagent/grape_granade/on_mob_life(mob/living/M)
+/datum/reagent/consumable/drink/grape_granade/on_mob_life(mob/living/M)
if(prob(1))
var/turf/simulated/T = get_turf(M)
goonchem_vortex(T, 1, 1, 2)
@@ -121,14 +120,14 @@
..()
//Meteor Malt: Sometimes causes screen shakes for the drinker like a meteor impact, low chance to add 1-5 units of a random mineral reagent to the drinker's blood (iron, copper, silver, gold, uranium, carbon, etc)
-/datum/reagent/meteor_malt
+/datum/reagent/consumable/drink/meteor_malt
name = "Meteor Malt"
id = "meteor_malt"
description = "Soft drinks have been detected on collision course with your tastebuds."
reagent_state = LIQUID
color = "#cc9900"
-/datum/reagent/meteor_malt/on_mob_life(mob/living/M)
+/datum/reagent/consumable/drink/meteor_malt/on_mob_life(mob/living/M)
if(prob(25))
M << sound('sound/effects/meteorimpact.ogg',0,1,0,25)
shake_camera(M, 3, 1)
@@ -136,4 +135,4 @@
var/amount = rand(1, 5)
var/mineral = pick("copper", "iron", "gold", "carbon", "silver", "aluminum", "silicon", "sodiumchloride", "plasma")
M.reagents.add_reagent(mineral, amount)
- ..()
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
new file mode 100644
index 00000000000..a92982a8aaf
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
@@ -0,0 +1,302 @@
+/datum/reagent/fuel
+ name = "Welding fuel"
+ id = "fuel"
+ description = "A highly flammable blend of basic hydrocarbons, mostly Acetylene. Useful for both welding and organic chemistry, and can be fortified into a heavier oil."
+ reagent_state = LIQUID
+ color = "#060606"
+ drink_icon = "dr_gibb_glass"
+ drink_name = "Glass of welder fuel"
+ drink_desc = "Unless you are an industrial tool, this is probably not safe for consumption."
+
+/datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with welding fuel to make them easy to ignite!
+ if(method == TOUCH)
+ M.adjust_fire_stacks(volume / 10)
+ return
+ ..()
+
+/datum/reagent/plasma
+ name = "Plasma"
+ id = "plasma"
+ description = "The liquid phase of an unusual extraterrestrial compound."
+ reagent_state = LIQUID
+ color = "#7A2B94"
+
+/datum/reagent/plasma/on_mob_life(mob/living/M)
+ M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
+ if(holder.has_reagent("epinephrine"))
+ holder.remove_reagent("epinephrine", 2)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ C.adjustPlasma(10)
+ ..()
+
+/datum/reagent/plasma/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma is stronger than fuel!
+ if(method == TOUCH)
+ M.adjust_fire_stacks(volume / 5)
+ ..()
+
+
+/datum/reagent/thermite
+ name = "Thermite"
+ id = "thermite"
+ description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
+ reagent_state = SOLID
+ color = "#673910" // rgb: 103, 57, 16
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/thermite/reaction_turf(turf/simulated/wall/W, volume)
+ if(volume >= 5 && istype(W))
+ W.thermite = 1
+ W.overlays.Cut()
+ W.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
+
+/datum/reagent/glycerol
+ name = "Glycerol"
+ id = "glycerol"
+ description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity."
+ reagent_state = LIQUID
+ color = "#808080" // rgb: 128, 128, 128
+
+/datum/reagent/stabilizing_agent
+ name = "Stabilizing Agent"
+ id = "stabilizing_agent"
+ description = "A chemical that stabilises normally volatile compounds, preventing them from reacting immediately."
+ reagent_state = LIQUID
+ color = "#FFFF00"
+
+/datum/reagent/clf3
+ name = "Chlorine Trifluoride"
+ id = "clf3"
+ description = "An extremely volatile substance, handle with the utmost care."
+ reagent_state = LIQUID
+ color = "#FF0000"
+ metabolization_rate = 4
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/clf3/on_mob_life(mob/living/M)
+ M.adjust_fire_stacks(2)
+ var/burndmg = max(0.3*M.fire_stacks, 0.3)
+ M.adjustFireLoss(burndmg)
+ ..()
+
+/datum/reagent/clf3/reaction_turf(turf/simulated/T, volume)
+ if(istype(T, /turf/simulated/floor/plating))
+ var/turf/simulated/floor/plating/F = T
+ if(prob(1))
+ F.ChangeTurf(/turf/space)
+ if(istype(T, /turf/simulated/floor/))
+ var/turf/simulated/floor/F = T
+ if(prob(volume/10))
+ F.make_plating()
+ if(istype(F, /turf/simulated/floor/))
+ new /obj/effect/hotspot(F)
+ if(istype(T, /turf/simulated/wall/))
+ var/turf/simulated/wall/W = T
+ if(prob(volume/10))
+ W.ChangeTurf(/turf/simulated/floor)
+ if(istype(T, /turf/simulated/shuttle/))
+ new /obj/effect/hotspot(T)
+
+/datum/reagent/clf3/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == TOUCH)
+ M.adjust_fire_stacks(min(volume/5, 10))
+ M.IgniteMob()
+ M.bodytemperature += 30
+
+/datum/reagent/sorium
+ name = "Sorium"
+ id = "sorium"
+ description = "Sends everything flying from the detonation point."
+ reagent_state = LIQUID
+ color = "#FFA500"
+
+/datum/reagent/liquid_dark_matter
+ name = "Liquid Dark Matter"
+ id = "liquid_dark_matter"
+ description = "Sucks everything into the detonation point."
+ reagent_state = LIQUID
+ color = "#800080"
+
+/datum/reagent/blackpowder
+ name = "Black Powder"
+ id = "blackpowder"
+ description = "Explodes. Violently."
+ reagent_state = LIQUID
+ color = "#000000"
+ metabolization_rate = 0.05
+ penetrates_skin = 1
+
+/datum/reagent/blackpowder/reaction_turf(turf/T, volume) //oh shit
+ if(volume >= 5 && !istype(T, /turf/space))
+ if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in T) //let's not have hundreds of decals of black powder on the same turf
+ new /obj/effect/decal/cleanable/dirt/blackpowder(T)
+
+/*
+/datum/reagent/blackpowder/on_ex_act()
+ var/location = get_turf(holder.my_atom)
+ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ s.set_up(2, 1, location)
+ s.start()
+ sleep(rand(10,15))
+ blackpowder_detonate(holder, volume)
+ holder.remove_reagent("blackpowder", volume)
+ return */
+
+/datum/reagent/flash_powder
+ name = "Flash Powder"
+ id = "flash_powder"
+ description = "Makes a very bright flash."
+ reagent_state = LIQUID
+ color = "#FFFF00"
+
+/datum/reagent/smoke_powder
+ name = "Smoke Powder"
+ id = "smoke_powder"
+ description = "Makes a large cloud of smoke that can carry reagents."
+ reagent_state = LIQUID
+ color = "#808080"
+
+/datum/reagent/sonic_powder
+ name = "Sonic Powder"
+ id = "sonic_powder"
+ description = "Makes a deafening noise."
+ reagent_state = LIQUID
+ color = "#0000FF"
+
+/datum/reagent/phlogiston
+ name = "Phlogiston"
+ id = "phlogiston"
+ description = "Catches you on fire and makes you ignite."
+ reagent_state = LIQUID
+ color = "#FF9999"
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/phlogiston/on_mob_life(mob/living/M)
+ M.adjust_fire_stacks(1)
+ var/burndmg = max(0.3*M.fire_stacks, 0.3)
+ M.adjustFireLoss(burndmg)
+ ..()
+
+/datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, volume)
+ M.IgniteMob()
+ ..()
+
+/datum/reagent/napalm
+ name = "Napalm"
+ id = "napalm"
+ description = "Very flammable."
+ reagent_state = LIQUID
+ color = "#FF9999"
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/napalm/on_mob_life(mob/living/M)
+ M.adjust_fire_stacks(1)
+ ..()
+
+/datum/reagent/napalm/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == TOUCH)
+ M.adjust_fire_stacks(min(volume/4, 20))
+
+/datum/reagent/cryostylane
+ name = "Cryostylane"
+ id = "cryostylane"
+ description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K."
+ color = "#B2B2FF" // rgb: 139, 166, 233
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/cryostylane/on_mob_life(mob/living/M) //TODO: code freezing into an ice cube
+ if(M.reagents.has_reagent("oxygen"))
+ M.reagents.remove_reagent("oxygen", 1)
+ M.bodytemperature -= 30
+ ..()
+
+/datum/reagent/cryostylane/on_tick()
+ if(holder.has_reagent("oxygen"))
+ holder.remove_reagent("oxygen", 1)
+ holder.chem_temp -= 10
+ holder.handle_reactions()
+ ..()
+
+/datum/reagent/cryostylane/reaction_turf(turf/T, volume)
+ if(volume >= 5)
+ for(var/mob/living/carbon/slime/M in T)
+ M.adjustToxLoss(rand(15,30))
+
+/datum/reagent/pyrosium
+ name = "Pyrosium"
+ id = "pyrosium"
+ description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K."
+ color = "#B20000" // rgb: 139, 166, 233
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/pyrosium/on_mob_life(mob/living/M)
+ if(M.reagents.has_reagent("oxygen"))
+ M.reagents.remove_reagent("oxygen", 1)
+ M.bodytemperature += 30
+ ..()
+
+/datum/reagent/pyrosium/on_tick()
+ if(holder.has_reagent("oxygen"))
+ holder.remove_reagent("oxygen", 1)
+ holder.chem_temp += 10
+ holder.handle_reactions()
+ ..()
+
+/datum/reagent/firefighting_foam
+ name = "Firefighting foam"
+ id = "firefighting_foam"
+ description = "Carbon Tetrachloride is a foam used for fire suppression."
+ reagent_state = LIQUID
+ color = "#A0A090"
+ var/cooling_temperature = 3 // more effective than water
+
+/datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume)
+// Put out fire
+ if(method == TOUCH)
+ M.adjust_fire_stacks(-(volume / 5)) // more effective than water
+ M.ExtinguishMob()
+
+/datum/reagent/firefighting_foam/reaction_obj(obj/O, volume)
+ if(istype(O))
+ O.extinguish()
+
+/datum/reagent/firefighting_foam/reaction_turf(turf/simulated/T, volume)
+ if(!istype(T))
+ return
+ var/CT = cooling_temperature
+ new /obj/effect/decal/cleanable/flour/foam(T) //foam mess; clears up quickly.
+ var/hotspot = (locate(/obj/effect/hotspot) in T)
+ if(hotspot)
+ var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles())
+ lowertemp.temperature = max(min(lowertemp.temperature-(CT*1000), lowertemp.temperature / CT), 0)
+ lowertemp.react()
+ T.assume_air(lowertemp)
+ qdel(hotspot)
+
+/datum/reagent/plasma_dust
+ name = "Plasma Dust"
+ id = "plasma_dust"
+ description = "A fine dust of plasma. This chemical has unusual mutagenic properties for viruses and slimes alike."
+ color = "#500064" // rgb: 80, 0, 100
+
+/datum/reagent/plasma_dust/on_mob_life(mob/living/M)
+ M.adjustToxLoss(3)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ C.adjustPlasma(20)
+ ..()
+
+/datum/reagent/plasma_dust/reaction_obj(obj/O, volume)
+ if((!O) || (!volume))
+ return 0
+ O.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume)
+
+/datum/reagent/plasma_dust/reaction_turf(turf/simulated/T, volume)
+ if(istype(T))
+ T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume)
+
+/datum/reagent/plasma_dust/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma dust is stronger than fuel!
+ if(method == TOUCH)
+ M.adjust_fire_stacks(volume / 5)
+ return
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
similarity index 65%
rename from code/modules/reagents/newchem/toxins.dm
rename to code/modules/reagents/chemistry/reagents/toxins.dm
index 56d64d9a62e..3b59ff8e0b7 100644
--- a/code/modules/reagents/newchem/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -1,8 +1,336 @@
-#define SOLID 1
-#define LIQUID 2
-#define GAS 3
+/datum/reagent/toxin
+ name = "Toxin"
+ id = "toxin"
+ description = "A Toxic chemical."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
-#define REM REAGENTS_EFFECT_MULTIPLIER
+/datum/reagent/toxin/on_mob_life(mob/living/M)
+ M.adjustToxLoss(2)
+ ..()
+
+/datum/reagent/spider_venom
+ name = "Spider venom"
+ id = "spidertoxin"
+ description = "A toxic venom injected by spacefaring arachnids."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+
+/datum/reagent/spider_venom/on_mob_life(mob/living/M)
+ M.adjustToxLoss(1.5)
+ ..()
+
+/datum/reagent/plasticide
+ name = "Plasticide"
+ id = "plasticide"
+ description = "Liquid plastic, do not eat."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+
+/datum/reagent/plasticide/on_mob_life(mob/living/M)
+ M.adjustToxLoss(1.5)
+ ..()
+
+
+/datum/reagent/minttoxin
+ name = "Mint Toxin"
+ id = "minttoxin"
+ description = "Useful for dealing with undesirable customers."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+
+/datum/reagent/minttoxin/on_mob_life(mob/living/M)
+ if(FAT in M.mutations)
+ M.gib()
+ ..()
+
+/datum/reagent/slimejelly
+ name = "Slime Jelly"
+ id = "slimejelly"
+ description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL."
+ reagent_state = LIQUID
+ color = "#801E28" // rgb: 128, 30, 40
+
+/datum/reagent/slimejelly/on_mob_life(mob/living/M)
+ if(prob(10))
+ to_chat(M, "Your insides are burning!")
+ M.adjustToxLoss(rand(20,60)*REAGENTS_EFFECT_MULTIPLIER)
+ else if(prob(40))
+ M.adjustBruteLoss(-5*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
+
+/datum/reagent/slimetoxin
+ name = "Mutation Toxin"
+ id = "mutationtoxin"
+ description = "A corruptive toxin produced by slimes."
+ reagent_state = LIQUID
+ color = "#13BC5E" // rgb: 19, 188, 94
+ can_synth = 0
+
+/datum/reagent/slimetoxin/on_mob_life(mob/living/M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/human = M
+ if(human.species.name != "Shadow")
+ to_chat(M, "Your flesh rapidly mutates!")
+ to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
+ to_chat(M, "Your body reacts violently to light. \green However, it naturally heals in darkness.")
+ to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
+ human.set_species("Shadow")
+ ..()
+
+/datum/reagent/aslimetoxin
+ name = "Advanced Mutation Toxin"
+ id = "amutationtoxin"
+ description = "An advanced corruptive toxin produced by slimes."
+ reagent_state = LIQUID
+ color = "#13BC5E" // rgb: 19, 188, 94
+ can_synth = 0
+
+/datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method != TOUCH)
+ M.ForceContractDisease(new /datum/disease/transformation/slime(0))
+
+
+/datum/reagent/mercury
+ name = "Mercury"
+ id = "mercury"
+ description = "A chemical element."
+ reagent_state = LIQUID
+ color = "#484848" // rgb: 72, 72, 72
+ metabolization_rate = 0.2
+ penetrates_skin = 1
+
+/datum/reagent/mercury/on_mob_life(mob/living/M)
+ if(prob(70))
+ M.adjustBrainLoss(1)
+ ..()
+
+/datum/reagent/chlorine
+ name = "Chlorine"
+ id = "chlorine"
+ description = "A chemical element."
+ reagent_state = GAS
+ color = "#808080" // rgb: 128, 128, 128
+ penetrates_skin = 1
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/chlorine/on_mob_life(mob/living/M)
+ M.adjustFireLoss(1)
+ ..()
+
+/datum/reagent/fluorine
+ name = "Fluorine"
+ id = "fluorine"
+ description = "A highly-reactive chemical element."
+ reagent_state = GAS
+ color = "#6A6054"
+ penetrates_skin = 1
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/fluorine/on_mob_life(mob/living/M)
+ M.adjustFireLoss(1)
+ M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
+
+/datum/reagent/radium
+ name = "Radium"
+ id = "radium"
+ description = "Radium is an alkaline earth metal. It is extremely radioactive."
+ reagent_state = SOLID
+ color = "#C7C7C7" // rgb: 199,199,199
+ penetrates_skin = 1
+
+/datum/reagent/radium/on_mob_life(mob/living/M)
+ if(M.radiation < 80)
+ M.apply_effect(4, IRRADIATE, negate_armor = 1)
+ ..()
+
+/datum/reagent/radium/reaction_turf(turf/T, volume)
+ if(volume >= 3 && !istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/greenglow(T)
+
+/datum/reagent/mutagen
+ name = "Unstable mutagen"
+ id = "mutagen"
+ description = "Might cause unpredictable mutations. Keep away from children."
+ reagent_state = LIQUID
+ color = "#04DF27"
+ metabolization_rate = 0.3
+
+/datum/reagent/mutagen/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(!..())
+ return
+ if(!M.dna)
+ return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
+ if((method==TOUCH && prob(33)) || method==INGEST)
+ randmutb(M)
+ domutcheck(M, null)
+ M.UpdateAppearance()
+
+/datum/reagent/mutagen/on_mob_life(mob/living/M)
+ if(!M.dna)
+ return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
+ M.apply_effect(2*REAGENTS_EFFECT_MULTIPLIER, IRRADIATE, negate_armor = 1)
+ if(prob(4))
+ randmutb(M)
+ ..()
+
+
+/datum/reagent/uranium
+ name ="Uranium"
+ id = "uranium"
+ description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive."
+ reagent_state = SOLID
+ color = "#B8B8C0" // rgb: 184, 184, 192
+
+/datum/reagent/uranium/on_mob_life(mob/living/M)
+ M.apply_effect(2, IRRADIATE, negate_armor = 1)
+ ..()
+
+/datum/reagent/uranium/reaction_turf(turf/T, volume)
+ if(volume >= 3 && !istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/greenglow(T)
+
+
+/datum/reagent/lexorin
+ name = "Lexorin"
+ id = "lexorin"
+ description = "Lexorin temporarily stops respiration. Causes tissue damage."
+ reagent_state = LIQUID
+ color = "#52685D"
+ metabolization_rate = 0.2
+
+/datum/reagent/lexorin/on_mob_life(mob/living/M)
+ M.adjustToxLoss(1)
+ ..()
+
+
+/datum/reagent/sacid
+ name = "Sulphuric acid"
+ id = "sacid"
+ description = "A strong mineral acid with the molecular formula H2SO4."
+ reagent_state = LIQUID
+ color = "#00D72B"
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/sacid/on_mob_life(mob/living/M)
+ M.adjustFireLoss(1)
+ ..()
+
+/datum/reagent/sacid/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == TOUCH)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ if(volume > 25)
+
+ if(H.wear_mask)
+ to_chat(H, "Your mask protects you from the acid!")
+ return
+
+ if(H.head)
+ to_chat(H, "Your helmet protects you from the acid!")
+ return
+
+ if(!M.unacidable)
+ if(prob(75))
+ var/obj/item/organ/external/affecting = H.get_organ("head")
+ if(affecting)
+ affecting.take_damage(5, 10)
+ H.UpdateDamageIcon()
+ H.emote("scream")
+ else
+ M.take_organ_damage(5,10)
+ else
+ M.take_organ_damage(5,10)
+
+ if(method == INGEST)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ if(volume < 10)
+ to_chat(M, "The greenish acidic substance stings you, but isn't concentrated enough to harm you!")
+
+ if(volume >=10 && volume <=25)
+ if(!H.unacidable)
+ M.take_organ_damage(0,min(max(volume-10,2)*2,20))
+ M.emote("scream")
+
+
+ if(volume > 25)
+ if(!M.unacidable)
+ if(prob(75))
+ var/obj/item/organ/external/affecting = H.get_organ("head")
+ if(affecting)
+ affecting.take_damage(0, 20)
+ H.UpdateDamageIcon()
+ H.emote("scream")
+ else
+ M.take_organ_damage(0,20)
+
+/datum/reagent/sacid/reaction_obj(obj/O, volume)
+ if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(40))
+ if(!O.unacidable)
+ var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
+ I.desc = "Looks like this was \an [O] some time ago."
+ O.visible_message("[O] melts.")
+ qdel(O)
+
+/datum/reagent/carpotoxin
+ name = "Carpotoxin"
+ id = "carpotoxin"
+ description = "A deadly neurotoxin produced by the dreaded spess carp."
+ reagent_state = LIQUID
+ color = "#003333" // rgb: 0, 51, 51
+
+/datum/reagent/carpotoxin/on_mob_life(mob/living/M)
+ M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
+
+/datum/reagent/staminatoxin
+ name = "Tirizene"
+ id = "tirizene"
+ description = "A toxin that affects the stamina of a person when injected into the bloodstream."
+ reagent_state = LIQUID
+ color = "#6E2828"
+ data = 13
+
+/datum/reagent/staminatoxin/on_mob_life(mob/living/M)
+ M.adjustStaminaLoss(REAGENTS_EFFECT_MULTIPLIER * data)
+ data = max(data - 1, 3)
+ ..()
+
+
+/datum/reagent/spore
+ name = "Spore Toxin"
+ id = "spore"
+ description = "A natural toxin produced by blob spores that inhibits vision when ingested."
+ color = "#9ACD32"
+
+/datum/reagent/spores/on_mob_life(mob/living/M)
+ M.adjustToxLoss(1)
+ M.damageoverlaytemp = 60
+ M.EyeBlurry(3)
+ ..()
+
+/datum/reagent/beer2 //disguised as normal beer for use by emagged brobots
+ name = "Beer"
+ id = "beer2"
+ description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
+ color = "#664300" // rgb: 102, 67, 0
+ metabolization_rate = 1.5 * REAGENTS_METABOLISM
+ drink_icon ="beerglass"
+ drink_name = "Beer glass"
+ drink_desc = "A freezing pint of beer"
+
+/datum/reagent/beer2/on_mob_life(mob/living/M)
+ switch(current_cycle)
+ if(1 to 50)
+ M.Sleeping(2)
+ if(51 to INFINITY)
+ M.Sleeping(2)
+ M.adjustToxLoss((current_cycle - 50)*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
/datum/reagent/polonium
name = "Polonium"
@@ -12,12 +340,12 @@
color = "#CF3600"
metabolization_rate = 0.1
penetrates_skin = 1
+ can_synth = 0
/datum/reagent/polonium/on_mob_life(mob/living/M)
M.apply_effect(8, IRRADIATE, negate_armor = 1)
..()
-
/datum/reagent/histamine
name = "Histamine"
id = "histamine"
@@ -41,7 +369,7 @@
if(prob(10))
to_chat(M, "Your eyes itch.")
M.emote(pick("blink", "sneeze"))
- M.eye_blurry += 3
+ M.AdjustEyeBlurry(3)
if(prob(10))
M.visible_message("[M] scratches at an itch.")
M.adjustBruteLoss(1)
@@ -100,20 +428,11 @@
penetrates_skin = 1
/datum/reagent/formaldehyde/on_mob_life(mob/living/M)
- M.adjustToxLoss(1*REM)
+ M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
if(prob(10))
M.reagents.add_reagent("histamine",rand(5,15))
..()
-/datum/chemical_reaction/formaldehyde
- name = "formaldehyde"
- id = "formaldehyde"
- result = "formaldehyde"
- required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1)
- result_amount = 3
- min_temp = 420
- mix_message = "Ugh, it smells like the morgue in here."
-
/datum/reagent/venom
name = "Venom"
id = "venom"
@@ -122,6 +441,7 @@
color = "#CF3600"
metabolization_rate = 0.2
overdose_threshold = 40
+ can_synth = 0
/datum/reagent/venom/on_mob_life(mob/living/M)
if(prob(25))
@@ -141,7 +461,7 @@
if(prob(4))
M.visible_message("[M] starts convulsing violently!", "You feel as if your body is tearing itself apart!")
M.Weaken(15)
- M.jitteriness += 1000
+ M.AdjustJitter(1000)
spawn(rand(20, 100))
M.gib()
@@ -159,19 +479,19 @@
current_cycle++
return
if(5 to 8)
- M.dizziness += 1
- M.confused = max(M.confused, 10)
+ M.AdjustDizzy(1)
+ M.Confused(10)
if(9 to 12)
- M.drowsyness = max(M.drowsyness, 10)
- M.dizziness += 1
- M.confused = max(M.confused, 20)
+ M.Drowsy(10)
+ M.AdjustDizzy(1)
+ M.Confused(20)
if(13)
M.emote("faint")
if(14 to INFINITY)
M.Paralyse(10)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
- M.jitteriness = max(0, M.jitteriness-30)
+ M.AdjustJitter(-30)
if(M.getBrainLoss() <= 80)
M.adjustBrainLoss(1)
else
@@ -182,16 +502,6 @@
M.adjustToxLoss(1)
..()
-/datum/chemical_reaction/neurotoxin2
- name = "neurotoxin2"
- id = "neurotoxin2"
- result = "neurotoxin2"
- required_reagents = list("space_drugs" = 1)
- result_amount = 1
- min_temp = 674
- mix_sound = null
- no_message = 1
-
/datum/reagent/cyanide
name = "Cyanide"
id = "cyanide"
@@ -202,12 +512,12 @@
penetrates_skin = 1
/datum/reagent/cyanide/on_mob_life(mob/living/M)
- M.adjustToxLoss(1.5*REM)
+ M.adjustToxLoss(1.5*REAGENTS_EFFECT_MULTIPLIER)
if(prob(5))
M.emote("drool")
if(prob(10))
to_chat(M, "You cannot breathe!")
- M.losebreath += 1
+ M.AdjustLoseBreath(1)
M.emote("gasp")
if(prob(8))
to_chat(M, "You feel horrendously weak!")
@@ -215,23 +525,6 @@
M.adjustToxLoss(2)
..()
-/datum/chemical_reaction/cyanide
- name = "Cyanide"
- id = "cyanide"
- result = "cyanide"
- required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1)
- result_amount = 3
- min_temp = 380
- mix_message = "The mixture gives off a faint scent of almonds."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/chemical_reaction/cyanide/on_reaction(datum/reagents/holder)
- var/turf/T = get_turf(holder.my_atom)
- T.visible_message("The solution generates a strong vapor!")
- for(var/mob/living/carbon/C in range(T, 1))
- if(C.can_breathe_gas())
- C.reagents.add_reagent("cyanide", 7)
-
/datum/reagent/itching_powder
name = "Itching Powder"
id = "itching_powder"
@@ -261,25 +554,11 @@
to_chat(M, "AHHHHHH!")
M.adjustBruteLoss(5)
M.Weaken(5)
- M.jitteriness += 6
+ M.AdjustJitter(6)
M.visible_message("[M] falls to the floor, scratching themselves violently!")
M.emote("scream")
..()
-/datum/chemical_reaction/itching_powder
- name = "Itching Powder"
- id = "itching_powder"
- result = "itching_powder"
- required_reagents = list("fuel" = 1, "ammonia" = 1, "fungus" = 1)
- result_amount = 3
- mix_message = "The mixture congeals and dries up, leaving behind an abrasive powder."
- mix_sound = 'sound/effects/blobattack.ogg'
-
-/datum/reagent/facid/on_mob_life(mob/living/M)
- M.adjustToxLoss(1*REM)
- M.adjustFireLoss(1)
- ..()
-
/datum/reagent/facid
name = "Fluorosulfuric Acid"
id = "facid"
@@ -288,6 +567,11 @@
color = "#4141D2"
process_flags = ORGANIC | SYNTHETIC
+/datum/reagent/facid/on_mob_life(mob/living/M)
+ M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(1)
+ ..()
+
/datum/reagent/facid/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH || method == INGEST)
if(ishuman(M))
@@ -338,22 +622,13 @@
O.visible_message("[O] melts.")
qdel(O)
-/datum/chemical_reaction/facid
- name = "Fluorosulfuric Acid"
- id = "facid"
- result = "facid"
- required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1)
- result_amount = 4
- min_temp = 380
- mix_message = "The mixture deepens to a dark blue, and slowly begins to corrode its container."
-
/datum/reagent/initropidril
name = "Initropidril"
id = "initropidril"
description = "A highly potent cardiac poison - can kill within minutes."
reagent_state = LIQUID
color = "#7F10C0"
- metabolization_rate = 0.4
+ can_synth = 0
/datum/reagent/initropidril/on_mob_life(mob/living/M)
if(prob(33))
@@ -364,11 +639,11 @@
if(prob(10))
to_chat(M, "You cannot breathe!")
M.adjustOxyLoss(10)
- M.losebreath++
+ M.AdjustLoseBreath(1)
if(prob(10))
to_chat(M, "Your chest is burning with pain!")
M.adjustOxyLoss(10)
- M.losebreath++
+ M.AdjustLoseBreath(1)
M.Stun(3)
M.Weaken(2)
if(ishuman(M))
@@ -377,30 +652,6 @@
H.heart_attack = 1 // rip in pepperoni
..()
-/datum/chemical_reaction/initropidril
- name = "Initropidril"
- id = "initropidril"
- result = "initropidril"
- required_reagents = list("crank" = 1, "histamine" = 1, "krokodil" = 1, "bath_salts" = 1, "atropine" = 1, "nicotine" = 1, "morphine" = 1)
- result_amount = 4
- mix_message = "A sweet and sugary scent drifts from the unpleasant milky substance."
-
-
-/datum/reagent/concentrated_initro
- name = "Concentrated Initropidril"
- id = "concentrated_initro"
- description = "A guaranteed heart-stopper!"
- reagent_state = LIQUID
- color = "#AB1CCF"
- metabolization_rate = 0.4
-
-/datum/reagent/concentrated_initro/on_mob_life(mob/living/M)
- if(volume >=5)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(!H.heart_attack)
- H.heart_attack = 1 // rip in pepperoni
-
/datum/reagent/pancuronium
name = "Pancuronium"
id = "pancuronium"
@@ -425,12 +676,12 @@
M.Weaken(20)
if(prob(10))
M.emote(pick("drool", "tremble", "gasp"))
- M.losebreath++
+ M.AdjustLoseBreath(1)
if(prob(9))
to_chat(M, "You can't [pick("move", "feel your legs", "feel your face", "feel anything")]!")
if(prob(7))
to_chat(M, "You can't breathe!")
- M.losebreath += 3
+ M.AdjustLoseBreath(3)
..()
/datum/reagent/sodium_thiopental
@@ -440,20 +691,21 @@
reagent_state = LIQUID
color = "#5F8BE1"
metabolization_rate = 0.7
+ can_synth = 0
/datum/reagent/sodium_thiopental/on_mob_life(mob/living/M)
switch(current_cycle)
if(1)
M.emote("drool")
- M.confused = max(M.confused, 5)
+ M.Confused(5)
if(2 to 4)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(5)
M.emote("faint")
M.Weaken(5)
if(6 to INFINITY)
M.Paralyse(20)
- M.jitteriness = max(0, M.jitteriness-50)
+ M.AdjustJitter(-50)
if(prob(10))
M.emote("drool")
M.adjustBrainLoss(1)
@@ -467,6 +719,7 @@
color = "#646EA0"
metabolization_rate = 0.8
penetrates_skin = 1
+ can_synth = 0
/datum/reagent/ketamine/on_mob_life(mob/living/M)
switch(current_cycle)
@@ -474,7 +727,7 @@
if(prob(25))
M.emote("yawn")
if(6 to 9)
- M.eye_blurry += 5
+ M.AdjustEyeBlurry(5)
if(prob(35))
M.emote("yawn")
if(10)
@@ -492,30 +745,21 @@
color = "#6BA688"
metabolization_rate = 0.1
-/datum/chemical_reaction/sulfonal
- name = "sulfonal"
- id = "sulfonal"
- result = "sulfonal"
- required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1)
- result_amount = 3
- mix_message = "The mixture gives off quite a stench."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
/datum/reagent/sulfonal/on_mob_life(mob/living/M)
- M.jitteriness = max(0, M.jitteriness-30)
+ M.AdjustJitter(-30)
switch(current_cycle)
if(1 to 10)
if(prob(7))
M.emote("yawn")
if(11 to 20)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(21)
M.emote("faint")
if(22 to INFINITY)
if(prob(20))
M.emote("faint")
M.Paralyse(5)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
M.adjustToxLoss(1)
..()
@@ -526,7 +770,7 @@
reagent_state = LIQUID
color = "#D9D9D9"
-/datum/reagent/amanitin/reagent_deleted(mob/living/M)
+/datum/reagent/amanitin/on_mob_delete(mob/living/M)
M.adjustToxLoss(current_cycle*rand(2,4))
..()
@@ -538,13 +782,6 @@
color = "#D1DED1"
metabolization_rate = 0.2
-/datum/chemical_reaction/lipolicide
- name = "lipolicide"
- id = "lipolicide"
- result = "lipolicide"
- required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1)
- result_amount = 3
-
/datum/reagent/lipolicide/on_mob_life(mob/living/M)
if(!M.nutrition)
switch(rand(1,3))
@@ -567,10 +804,11 @@
reagent_state = LIQUID
color = "#C2D8CD"
metabolization_rate = 0.05
+ can_synth = 0
/datum/reagent/coniine/on_mob_life(mob/living/M)
M.adjustToxLoss(2)
- M.losebreath += 5
+ M.AdjustLoseBreath(5)
..()
/datum/reagent/curare
@@ -590,7 +828,7 @@
if(prob(20))
M.emote(pick("drool", "pale", "gasp"))
if(6 to 10)
- M.eye_blurry += 5
+ M.AdjustEyeBlurry(5)
if(prob(8))
to_chat(M, "You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")].")
M.Stun(1)
@@ -598,12 +836,12 @@
M.emote(pick("drool","pale", "gasp"))
if(11 to INFINITY)
M.Stun(30)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(prob(20))
M.emote(pick("drool", "faint", "pale", "gasp", "collapse"))
else if(prob(8))
to_chat(M, "You can't [pick("breathe", "move", "feel your legs", "feel your face", "feel anything")]!")
- M.losebreath++
+ M.AdjustLoseBreath(1)
..()
/datum/reagent/sarin
@@ -616,42 +854,25 @@
penetrates_skin = 1
overdose_threshold = 25
-/datum/chemical_reaction/sarin
- name = "sarin"
- id = "sarin"
- result = "sarin"
- required_reagents = list("chlorine" = 1, "fuel" = 1, "oxygen" = 1, "phosphorus" = 1, "fluorine" = 1, "hydrogen" = 1, "acetone" = 1, "atrazine" = 1)
- result_amount = 3
- mix_message = "The mixture yields a colorless, odorless liquid."
- min_temp = 374
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/chemical_reaction/sarin/on_reaction(datum/reagents/holder)
- var/turf/T = get_turf(holder.my_atom)
- T.visible_message("The solution generates a strong vapor!")
- for(var/mob/living/carbon/C in range(T, 2))
- if(C.can_breathe_gas())
- C.reagents.add_reagent("sarin", 4)
-
/datum/reagent/sarin/on_mob_life(mob/living/M)
switch(current_cycle)
if(1 to 15)
- M.jitteriness += 20
+ M.AdjustJitter(20)
if(prob(20))
M.emote(pick("twitch","twitch_s","quiver"))
if(16 to 30)
if(prob(25))
M.emote(pick("twitch","twitch","drool","quiver","tremble"))
- M.eye_blurry += 5
- M.stuttering = max(M.stuttering, 5)
+ M.AdjustEyeBlurry(5)
+ M.Stuttering(5)
if(prob(10))
- M.confused = max(M.confused, 15)
+ M.Confused(15)
if(prob(15))
M.Stun(1)
M.emote("scream")
if(30 to 60)
- M.eye_blurry += 5
- M.stuttering = max(M.stuttering, 5)
+ M.AdjustEyeBlurry(5)
+ M.Stuttering(5)
if(prob(10))
M.Stun(1)
M.emote(pick("twitch","twitch","drool","shake","tremble"))
@@ -660,15 +881,15 @@
if(prob(5))
M.Weaken(3)
M.visible_message("[M] has a seizure!")
- M.jitteriness = 1000
+ M.SetJitter(1000)
if(prob(5))
to_chat(M, "You can't breathe!")
M.emote(pick("gasp", "choke", "cough"))
- M.losebreath++
+ M.AdjustLoseBreath(1)
if(61 to INFINITY)
if(prob(15))
M.emote(pick("gasp", "choke", "cough","twitch", "shake", "tremble","quiver","drool", "twitch","collapse"))
- M.losebreath = max(5, M.losebreath + 5)
+ M.LoseBreath(5)
M.adjustToxLoss(1)
M.adjustBrainLoss(1)
M.Weaken(4)
@@ -690,8 +911,7 @@
M.adjustToxLoss(2)
..()
- // Clear off wallrot fungi
-/datum/reagent/atrazine/reaction_turf(turf/simulated/wall/W, volume)
+/datum/reagent/atrazine/reaction_turf(turf/simulated/wall/W, volume) // Clear off wallrot fungi
if(istype(W) && W.rotting)
W.rotting = 0
for(var/obj/effect/overlay/O in W)
@@ -727,14 +947,6 @@
D.adjustHealth(100)
..()
-/datum/chemical_reaction/atrazine
- name = "atrazine"
- id = "atrazine"
- result = "atrazine"
- required_reagents = list("chlorine" = 1, "hydrogen" = 1, "nitrogen" = 1)
- result_amount = 3
- mix_message = "The mixture gives off a harsh odor"
-
/datum/reagent/capulettium
name = "Capulettium"
id = "capulettium"
@@ -743,27 +955,19 @@
color = "#60A584"
heart_rate_stop = 1
-/datum/chemical_reaction/capulettium
- name = "capulettium"
- id = "capulettium"
- result = "capulettium"
- required_reagents = list("neurotoxin2" = 1, "chlorine" = 1, "hydrogen" = 1)
- result_amount = 1
- mix_message = "The smell of death wafts up from the solution."
-
/datum/reagent/capulettium/on_mob_life(mob/living/M)
switch(current_cycle)
if(1 to 5)
- M.eye_blurry += 10
+ M.AdjustEyeBlurry(10)
if(6 to 10)
- M.drowsyness = max(M.drowsyness, 10)
+ M.Drowsy(10)
if(11)
M.Paralyse(10)
M.visible_message("[M] seizes up and falls limp, their eyes dead and lifeless...") //so you can't trigger deathgasp emote on people. Edge case, but necessary.
if(12 to 60)
M.Paralyse(10)
if(61 to INFINITY)
- M.eye_blurry += 10
+ M.AdjustEyeBlurry(10)
..()
/datum/reagent/capulettium_plus
@@ -774,16 +978,8 @@
color = "#60A584"
heart_rate_stop = 1
-/datum/chemical_reaction/capulettium_plus
- name = "capulettium_plus"
- id = "capulettium_plus"
- result = "capulettium_plus"
- required_reagents = list("capulettium" = 1, "ephedrine" = 1, "methamphetamine" = 1)
- result_amount = 3
- mix_message = "The solution begins to slosh about violently by itself."
-
/datum/reagent/capulettium_plus/on_mob_life(mob/living/M)
- M.silent = max(M.silent, 2)
+ M.Silence(2)
..()
/datum/reagent/toxic_slurry
@@ -840,6 +1036,10 @@
color = "#993333"
process_flags = ORGANIC | SYNTHETIC
+/datum/reagent/ants/on_mob_life(mob/living/M)
+ M.adjustBruteLoss(2)
+ ..()
+
/datum/reagent/ants/reaction_mob(mob/living/M, method=TOUCH, volume) //NOT THE ANTS
if(iscarbon(M))
if(method == TOUCH || method==INGEST)
@@ -847,11 +1047,6 @@
M.emote("scream")
M.adjustBruteLoss(4)
-
-/datum/reagent/ants/on_mob_life(mob/living/M)
- M.adjustBruteLoss(2)
- ..()
-
/datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective.
name = "Teslium"
id = "teslium"
@@ -868,20 +1063,4 @@
shock_timer = 0
M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you
playsound(M, "sparks", 50, 1)
- ..()
-
-/datum/chemical_reaction/teslium
- name = "Teslium"
- id = "teslium"
- result = "teslium"
- required_reagents = list("plasma" = 1, "silver" = 1, "blackpowder" = 1)
- result_amount = 3
- mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry."
- min_temp = 400
- mix_sound = null
-
-/datum/chemical_reaction/teslium/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(6, 1, location)
- s.start()
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/chemistry/reagents/water.dm
similarity index 85%
rename from code/modules/reagents/oldchem/reagents/reagents_water.dm
rename to code/modules/reagents/chemistry/reagents/water.dm
index bbfcbeb8142..ef00ea54c61 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -15,6 +15,9 @@
color = "#0064C8" // rgb: 0, 100, 200
var/cooling_temperature = 2
process_flags = ORGANIC | SYNTHETIC
+ drink_icon = "glass_clear"
+ drink_name = "Glass of Water"
+ drink_desc = "The father of all refreshments."
/datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume)
// Put out fire
@@ -133,6 +136,9 @@
id = "blood"
reagent_state = LIQUID
color = "#C80000" // rgb: 200, 0, 0
+ drink_icon = "glass_red"
+ drink_name = "Glass of Tomato juice"
+ drink_desc = "Are you sure this is tomato juice?"
/datum/reagent/blood/reaction_mob(mob/living/M, method=TOUCH, volume)
if(data && data["viruses"])
@@ -262,29 +268,32 @@
reagent_state = LIQUID
color = "#0064C8" // rgb: 0, 100, 200
process_flags = ORGANIC | SYNTHETIC
+ drink_icon = "glass_clear"
+ drink_name = "Glass of Water"
+ drink_desc = "The father of all refreshments."
/datum/reagent/holywater/on_mob_life(mob/living/M)
- M.jitteriness = max(M.jitteriness-5,0)
+ M.AdjustJitter(-5)
if(current_cycle >= 30) // 12 units, 60 seconds @ metabolism 0.4 units & tick rate 2.0 sec
- M.stuttering = min(M.stuttering+4, 20)
+ M.AdjustStuttering(4, bound_lower = 0, bound_upper = 20)
M.Dizzy(5)
if(iscultist(M) && prob(5))
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu"))
if(current_cycle >= 75 && prob(33)) // 30 units, 150 seconds
- M.confused += 3
+ M.AdjustConfused(3)
if(isvampirethrall(M))
ticker.mode.remove_vampire_mind(M.mind)
holder.remove_reagent(id, volume)
- M.jitteriness = 0
- M.stuttering = 0
- M.confused = 0
+ M.SetJitter(0)
+ M.SetStuttering(0)
+ M.SetConfused(0)
return
if(iscultist(M))
ticker.mode.remove_cultist(M.mind)
holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
- M.jitteriness = 0
- M.stuttering = 0
- M.confused = 0
+ M.SetJitter(0)
+ M.SetStuttering(0)
+ M.SetConfused(0)
return
if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full) && prob(80))
switch(current_cycle)
@@ -330,6 +339,47 @@
qdel(R)
T.Bless()
+/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
+ name = "Unholy Water"
+ id = "unholywater"
+ description = "Something that shouldn't exist on this plane of existance."
+ process_flags = ORGANIC | SYNTHETIC //ethereal means everything processes it.
+ metabolization_rate = 1
+
+/datum/reagent/fuel/unholywater/on_mob_life(mob/living/M)
+ M.adjustBrainLoss(3)
+ if(iscultist(M))
+ M.status_flags |= GOTTAGOFAST
+ M.AdjustDrowsy(-5)
+ M.AdjustParalysis(-2)
+ M.AdjustStunned(-2)
+ M.AdjustWeakened(-2)
+ else
+ M.adjustToxLoss(2)
+ M.adjustFireLoss(2)
+ M.adjustOxyLoss(2)
+ M.adjustBruteLoss(2)
+ ..()
+
+/datum/reagent/fuel/unholywater/on_mob_delete(mob/living/M)
+ M.status_flags &= ~GOTTAGOFAST
+ ..()
+
+/datum/reagent/hellwater
+ name = "Hell Water"
+ id = "hell_water"
+ description = "YOUR FLESH! IT BURNS!"
+ process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL.
+ metabolization_rate = 1
+ can_synth = 0
+
+/datum/reagent/hellwater/on_mob_life(mob/living/M)
+ M.fire_stacks = min(5, M.fire_stacks + 3)
+ M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
+ M.adjustToxLoss(1)
+ M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard?
+ M.adjustBrainLoss(5)
+ ..()
/datum/reagent/liquidgibs
name = "Liquid gibs"
@@ -365,4 +415,4 @@
if(istype(O, /obj/item/clothing/shoes/galoshes))
var/t_loc = get_turf(O)
qdel(O)
- new /obj/item/clothing/shoes/galoshes/dry(t_loc)
+ new /obj/item/clothing/shoes/galoshes/dry(t_loc)
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
new file mode 100644
index 00000000000..28994d10fb2
--- /dev/null
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -0,0 +1,81 @@
+///////////////////////////////////////////////////////////////////////////////////
+/datum/chemical_reaction
+ var/name = null
+ var/id = null
+ var/result = null
+ var/list/required_reagents = list()
+ var/list/required_catalysts = list()
+
+ // Both of these variables are mostly going to be used with slime cores - but if you want to, you can use them for other things
+ var/atom/required_container = null // the container required for the reaction to happen
+ var/required_other = 0 // an integer required for the reaction to happen
+
+ var/result_amount = 0
+ var/secondary = 0 // set to nonzero if secondary reaction
+ var/list/secondary_results = list() //additional reagents produced by the reaction
+ var/min_temp = 0 //Minimum temperature required for the reaction to occur (heat to/above this). min_temp = 0 means no requirement
+ var/max_temp = 9999 //Maximum temperature allowed for the reaction to occur (cool to/below this).
+ var/mix_message = "The solution begins to bubble."
+ var/mix_sound = 'sound/effects/bubbles.ogg'
+ var/no_message = 0
+
+/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume)
+ return
+
+var/list/chemical_mob_spawn_meancritters = list() // list of possible hostile mobs
+var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs
+/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon")
+ if(holder && holder.my_atom)
+ if(chemical_mob_spawn_meancritters.len <= 0 || chemical_mob_spawn_nicecritters.len <= 0)
+ for(var/T in typesof(/mob/living/simple_animal))
+ var/mob/living/simple_animal/SA = T
+ switch(initial(SA.gold_core_spawnable))
+ if(CHEM_MOB_SPAWN_HOSTILE)
+ chemical_mob_spawn_meancritters += T
+ if(CHEM_MOB_SPAWN_FRIENDLY)
+ chemical_mob_spawn_nicecritters += T
+ var/atom/A = holder.my_atom
+ var/turf/T = get_turf(A)
+ var/area/my_area = get_area(T)
+ var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)"
+ message += " (VV)"
+
+ var/mob/M = get(A, /mob)
+ if(M)
+ message += " - Carried By: [key_name_admin(M)](?) (FLW)"
+ else
+ message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
+
+ message_admins(message, 0, 1)
+
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
+ C.flash_eyes()
+ for(var/i = 1, i <= amount_to_spawn, i++)
+ var/chosen
+ if(reaction_name == "Friendly Gold Slime")
+ chosen = pick(chemical_mob_spawn_nicecritters)
+ else
+ chosen = pick(chemical_mob_spawn_meancritters)
+ var/mob/living/simple_animal/C = new chosen
+ C.faction |= mob_faction
+ C.forceMove(get_turf(holder.my_atom))
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
+
+/proc/goonchem_vortex(turf/simulated/T, setting_type, range, pull_times)
+ for(var/atom/movable/X in orange(range, T))
+ if(istype(X, /obj/effect))
+ continue //stop pulling smoke and hotspots please
+ if(istype(X, /atom/movable))
+ if((X) && !X.anchored)
+ if(setting_type)
+ playsound(T, 'sound/effects/bang.ogg', 25, 1)
+ for(var/i = 0, i < pull_times, i++)
+ step_away(X,T)
+ else
+ playsound(T, 'sound/effects/whoosh.ogg', 25, 1) //credit to Robinhood76 of Freesound.org for this.
+ for(var/i = 0, i < pull_times, i++)
+ step_towards(X,T)
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm b/code/modules/reagents/chemistry/recipes/drinks.dm
similarity index 86%
rename from code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm
rename to code/modules/reagents/chemistry/recipes/drinks.dm
index 1b69b88e071..d1866a2b2f1 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm
+++ b/code/modules/reagents/chemistry/recipes/drinks.dm
@@ -676,3 +676,96 @@
required_reagents = list("spacemountainwind" = 1, "coffee" = 1)
result_amount = 2
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/ginsonic
+ name = "ginsonic"
+ id = "ginsonic"
+ result = "ginsonic"
+ required_reagents = list("gintonic" = 1, "methamphetamine" = 1)
+ result_amount = 2
+ mix_message = "The drink turns electric blue and starts quivering violently."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/applejack
+ name = "applejack"
+ id = "applejack"
+ result = "applejack"
+ required_reagents = list("cider" = 2)
+ max_temp = 270
+ result_amount = 1
+ mix_message = "The drink darkens as the water freezes, leaving the concentrated cider behind."
+ mix_sound = null
+
+/datum/chemical_reaction/jackrose
+ name = "jackrose"
+ id = "jackrose"
+ result = "jackrose"
+ required_reagents = list("applejack" = 4, "lemonjuice" = 1)
+ result_amount = 5
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/synthanol
+ name = "Synthanol"
+ id = "synthanol"
+ result = "synthanol"
+ required_reagents = list("lube" = 1, "plasma" = 1, "fuel" = 1)
+ result_amount = 3
+ mix_message = "The chemicals mix to create shiny, blue substance."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/synthanol/robottears
+ name = "Robot Tears"
+ id = "robottears"
+ result = "robottears"
+ required_reagents = list("synthanol" = 1, "oil" = 1, "sodawater" = 1)
+ result_amount = 3
+ mix_message = "The ingredients combine into a stiff, dark goo."
+
+/datum/chemical_reaction/synthanol/trinary
+ name = "Trinary"
+ id = "trinary"
+ result = "trinary"
+ required_reagents = list("synthanol" = 1, "limejuice" = 1, "orangejuice" = 1)
+ result_amount = 3
+ mix_message = "The ingredients mix into a colorful substance."
+
+/datum/chemical_reaction/synthanol/servo
+ name = "Servo"
+ id = "servo"
+ result = "servo"
+ required_reagents = list("synthanol" = 2, "cream" = 1, "hot_coco" = 1)
+ result_amount = 4
+ mix_message = "The ingredients mix into a dark brown substance."
+
+/datum/chemical_reaction/synthanol/uplink
+ name = "Uplink"
+ id = "uplink"
+ result = "uplink"
+ required_reagents = list("rum" = 1, "vodka" = 1, "tequila" = 1, "whiskey" = 1, "synthanol" = 1)
+ result_amount = 5
+ mix_message = "The chemicals mix to create a shiny, orange substance."
+
+/datum/chemical_reaction/synthanol/synthnsoda
+ name = "Synth 'n Soda"
+ id = "synthnsoda"
+ result = "synthnsoda"
+ required_reagents = list("synthanol" = 1, "cola" = 1)
+ result_amount = 2
+ mix_message = "The chemicals mix to create a smooth, fizzy substance."
+
+/datum/chemical_reaction/synthanol/synthignon
+ name = "Synthignon"
+ id = "synthignon"
+ result = "synthignon"
+ required_reagents = list("synthanol" = 1, "wine" = 1)
+ result_amount = 2
+ mix_message = "The chemicals mix to create a fine, red substance."
+
+/datum/chemical_reaction/triple_citrus
+ name = "triple_citrus"
+ id = "triple_citrus"
+ result = "triple_citrus"
+ required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1)
+ result_amount = 3
+ mix_message = "The citrus juices begin to blend together."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm
new file mode 100644
index 00000000000..e44ace8f511
--- /dev/null
+++ b/code/modules/reagents/chemistry/recipes/drugs.dm
@@ -0,0 +1,117 @@
+/datum/chemical_reaction/space_drugs
+ name = "Space Drugs"
+ id = "space_drugs"
+ result = "space_drugs"
+ required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1)
+ result_amount = 3
+ mix_message = "Slightly dizzying fumes drift from the solution."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/crank
+ name = "Crank"
+ id = "crank"
+ result = "crank"
+ required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1)
+ result_amount = 5
+ mix_message = "The mixture violently reacts, leaving behind a few crystalline shards."
+ mix_sound = 'sound/goonstation/effects/crystalshatter.ogg'
+ min_temp = 390
+
+/datum/chemical_reaction/crank/on_reaction(datum/reagents/holder, created_volume)
+ var/turf/T = get_turf(holder.my_atom)
+ for(var/turf/turf in range(1,T))
+ new /obj/effect/hotspot(turf)
+ explosion(T,0,0,2)
+
+/datum/chemical_reaction/krokodil
+ name = "Krokodil"
+ id = "krokodil"
+ result = "krokodil"
+ required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1)
+ result_amount = 6
+ mix_message = "The mixture dries into a pale blue powder."
+ min_temp = 380
+ mix_sound = 'sound/goonstation/misc/fuse.ogg'
+
+/datum/chemical_reaction/methamphetamine
+ name = "methamphetamine"
+ id = "methamphetamine"
+ result = "methamphetamine"
+ required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1)
+ result_amount = 4
+ min_temp = 374
+
+/datum/chemical_reaction/methamphetamine/on_reaction(datum/reagents/holder)
+ var/turf/T = get_turf(holder.my_atom)
+ T.visible_message("The solution generates a strong vapor!")
+ for(var/mob/living/carbon/C in range(T, 1))
+ if(C.can_breathe_gas())
+ C.emote("gasp")
+ C.AdjustLoseBreath(1)
+ C.reagents.add_reagent("toxin", 10)
+ C.reagents.add_reagent("neurotoxin2", 20)
+
+/datum/chemical_reaction/bath_salts
+ name = "bath_salts"
+ id = "bath_salts"
+ result = "bath_salts"
+ required_reagents = list("????" = 1, "saltpetre" = 1, "msg" = 1, "cleaner" = 1, "enzyme" = 1, "mugwort" = 1, "mercury" = 1)
+ result_amount = 6
+ min_temp = 374
+ mix_message = "Tiny cubic crystals precipitate out of the mixture. Huh."
+ mix_sound = 'sound/goonstation/misc/fuse.ogg'
+
+/datum/chemical_reaction/jenkem
+ name = "Jenkem"
+ id = "jenkem"
+ result = "jenkem"
+ required_reagents = list("toiletwater" = 1, "ammonia" = 1, "water" = 1)
+ result_amount = 3
+ mix_message = "The mixture ferments into a filthy morass."
+ mix_sound = 'sound/effects/blobattack.ogg'
+
+/datum/chemical_reaction/jenkem/on_reaction(datum/reagents/holder)
+ var/turf/T = get_turf(holder.my_atom)
+ T.visible_message("The solution generates a strong vapor!")
+ for(var/mob/living/carbon/C in range(T, 1))
+ if(C.can_breathe_gas())
+ C.reagents.add_reagent("jenkem", 25)
+
+/datum/chemical_reaction/aranesp
+ name = "Aranesp"
+ id = "aranesp"
+ result = "aranesp"
+ required_reagents = list("epinephrine" = 1, "atropine" = 1, "insulin" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/fliptonium
+ name = "fliptonium"
+ id = "fliptonium"
+ result = "fliptonium"
+ required_reagents = list("ephedrine" = 1, "liquid_dark_matter" = 1, "chocolate" = 1, "ginsonic" = 1)
+ result_amount = 4
+ mix_message = "The mixture swirls around excitedly!"
+
+/datum/chemical_reaction/lsd
+ name = "Lysergic acid diethylamide"
+ id = "lsd"
+ result = "lsd"
+ required_reagents = list("diethylamine" = 1, "fungus" = 1)
+ result_amount = 3
+ mix_message = "The mixture turns a rather unassuming color and settles."
+
+/datum/chemical_reaction/lube/ultra
+ name = "Ultra-Lube"
+ id = "ultralube"
+ result = "ultralube"
+ required_reagents = list("lube" = 2, "formaldehyde" = 1, "cryostylane" = 1)
+ result_amount = 2
+ mix_message = "The mixture darkens and appears to partially vaporize into a chilling aerosol."
+
+/datum/chemical_reaction/surge
+ name = "Surge"
+ id = "surge"
+ result = "surge"
+ required_reagents = list("thermite" = 3, "uranium" = 1, "fluorosurfactant" = 1, "sacid" = 1)
+ result_amount = 6
+ mix_message = "The mixture congeals into a metallic green gel that crackles with electrical activity."
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm b/code/modules/reagents/chemistry/recipes/food.dm
similarity index 51%
rename from code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm
rename to code/modules/reagents/chemistry/recipes/food.dm
index b43c9b344f1..02453d44e31 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm
+++ b/code/modules/reagents/chemistry/recipes/food.dm
@@ -89,34 +89,6 @@
required_reagents = list("flour" = 15, "water" = 5)
required_catalysts = list("enzyme" = 5)
-/datum/chemical_reaction/sodiumchloride
- name = "Sodium Chloride"
- id = "sodiumchloride"
- result = "sodiumchloride"
- required_reagents = list("sodium" = 1, "chlorine" = 1, "water" = 1)
- result_amount = 3
- mix_message = "The solution crystallizes with a brief flare of light."
-
-/datum/chemical_reaction/ice
- name = "Ice"
- id = "ice"
- result = "ice"
- required_reagents = list("water" = 1)
- result_amount = 1
- max_temp = 273
- mix_message = "Ice forms as the water freezes."
- mix_sound = null
-
-/datum/chemical_reaction/water
- name = "Water"
- id = "water"
- result = "water"
- required_reagents = list("ice" = 1)
- result_amount = 1
- min_temp = 301 // In Space.....ice melts at 82F...don't ask
- mix_message = "Water pools as the ice melts."
- mix_sound = null
-
/datum/chemical_reaction/dough
name = "Dough"
id = "dough"
@@ -128,4 +100,101 @@
/datum/chemical_reaction/dough/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
- new /obj/item/weapon/reagent_containers/food/snacks/dough(location)
\ No newline at end of file
+ new /obj/item/weapon/reagent_containers/food/snacks/dough(location)
+
+/datum/chemical_reaction/corn_syrup
+ name = "corn_syrup"
+ id = "corn_syrup"
+ result = "corn_syrup"
+ required_reagents = list("corn_starch" = 1, "sacid" = 1)
+ result_amount = 2
+ min_temp = 374
+ mix_message = "The mixture forms a viscous, clear fluid!"
+
+/datum/chemical_reaction/vhfcs
+ name = "vhfcs"
+ id = "vhfcs"
+ result = "vhfcs"
+ required_reagents = list("corn_syrup" = 1)
+ required_catalysts = list("enzyme" = 1)
+ result_amount = 1
+ mix_message = "The mixture emits a sickly-sweet smell."
+
+/datum/chemical_reaction/cola
+ name = "cola"
+ id = "cola"
+ result = "cola"
+ required_reagents = list("carbon" = 1, "oxygen" = 1, "water" = 1, "sugar" = 1)
+ result_amount = 4
+ mix_message = "The mixture begins to fizz."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/cheese
+ name = "cheese"
+ id = "cheese"
+ result = "cheese"
+ required_reagents = list("vomit" = 1, "milk" = 1)
+ result_amount = 1
+ mix_message = "The mixture curdles up."
+
+/datum/chemical_reaction/cheese/on_reaction(datum/reagents/holder)
+ var/turf/T = get_turf(holder.my_atom)
+ T.visible_message("A faint cheesy smell drifts through the air...")
+
+/datum/chemical_reaction/weird_cheese
+ name = "Weird cheese"
+ id = "weird_cheese"
+ result = "weird_cheese"
+ required_reagents = list("green_vomit" = 1, "milk" = 1)
+ result_amount = 1
+ mix_message = "The disgusting mixture sloughs together horribly, emitting a foul stench."
+ mix_sound = 'sound/goonstation/misc/gurggle.ogg'
+
+/datum/chemical_reaction/weird_cheese/on_reaction(datum/reagents/holder)
+ var/turf/T = get_turf(holder.my_atom)
+ T.visible_message("A horrible smell assaults your nose! What in space is it?")
+
+/datum/chemical_reaction/hydrogenated_soybeanoil
+ name = "Partially hydrogenated space-soybean oil"
+ id = "hydrogenated_soybeanoil"
+ result = "hydrogenated_soybeanoil"
+ required_reagents = list("soybeanoil" = 1, "hydrogen" = 1)
+ result_amount = 2
+ min_temp = 520
+ mix_message = "The mixture emits a burnt, oily smell."
+
+/datum/chemical_reaction/meatslurry
+ name = "Meat Slurry"
+ id = "meatslurry"
+ result = "meatslurry"
+ required_reagents = list("corn_starch" = 1, "blood" = 1)
+ result_amount = 2
+ mix_message = "The mixture congeals into a bloody mass."
+ mix_sound = 'sound/effects/blobattack.ogg'
+
+/datum/chemical_reaction/gravy
+ name = "Gravy"
+ id = "gravy"
+ result = "gravy"
+ required_reagents = list("porktonium" = 1, "corn_starch" = 1, "milk" = 1)
+ result_amount = 3
+ min_temp = 374
+ mix_message = "The substance thickens and takes on a meaty odor."
+
+/datum/chemical_reaction/beff
+ name = "Beff"
+ id = "beff"
+ result = "beff"
+ required_reagents = list("hydrogenated_soybeanoil" = 2, "meatslurry" = 1, "plasma" = 1)
+ result_amount = 4
+ mix_message = "The mixture solidifies, taking a crystalline appearance."
+ mix_sound = 'sound/effects/blobattack.ogg'
+
+/datum/chemical_reaction/pepperoni
+ name = "Pepperoni"
+ id = "pepperoni"
+ result = "pepperoni"
+ required_reagents = list("beff" = 1, "saltpetre" = 1, "synthflesh" = 1)
+ result_amount = 2
+ mix_message = "The beff and the synthflesh combine to form a smoky red log."
+ mix_sound = 'sound/effects/blobattack.ogg'
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
new file mode 100644
index 00000000000..1c22693513f
--- /dev/null
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -0,0 +1,274 @@
+/datum/chemical_reaction/hydrocodone
+ name = "Hydrocodone"
+ id = "hydrocodone"
+ result = "hydrocodone"
+ required_reagents = list("morphine" = 1, "sacid" = 1, "water" = 1, "oil" = 1)
+ result_amount = 2
+
+/datum/chemical_reaction/mitocholide
+ name = "mitocholide"
+ id = "mitocholide"
+ result = "mitocholide"
+ required_reagents = list("synthflesh" = 1, "cryoxadone" = 1, "plasma" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/cryoxadone
+ name = "Cryoxadone"
+ id = "cryoxadone"
+ result = "cryoxadone"
+ required_reagents = list("cryostylane" = 1, "plasma" = 1, "acetone" = 1, "mutagen" = 1)
+ result_amount = 4
+ mix_message = "The solution bubbles softly."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/spaceacillin
+ name = "Spaceacillin"
+ id = "spaceacillin"
+ result = "spaceacillin"
+ required_reagents = list("fungus" = 1, "ethanol" = 1)
+ result_amount = 2
+ mix_message = "The solvent extracts an antibiotic compound from the fungus."
+
+/datum/chemical_reaction/rezadone
+ name = "Rezadone"
+ id = "rezadone"
+ result = "rezadone"
+ required_reagents = list("carpotoxin" = 1, "spaceacillin" = 1, "copper" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/sterilizine
+ name = "Sterilizine"
+ id = "sterilizine"
+ result = "sterilizine"
+ required_reagents = list("antihol" = 2, "chlorine" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/charcoal
+ name = "Charcoal"
+ id = "charcoal"
+ result = "charcoal"
+ required_reagents = list("ash" = 1, "sodiumchloride" = 1)
+ result_amount = 2
+ mix_message = "The mixture yields a fine black powder."
+ min_temp = 380
+ mix_sound = 'sound/goonstation/misc/fuse.ogg'
+
+/datum/chemical_reaction/silver_sulfadiazine
+ name = "Silver Sulfadiazine"
+ id = "silver_sulfadiazine"
+ result = "silver_sulfadiazine"
+ required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1)
+ result_amount = 5
+ mix_message = "A strong and cloying odor begins to bubble from the mixture."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/salglu_solution
+ name = "Saline-Glucose Solution"
+ id = "salglu_solution"
+ result = "salglu_solution"
+ required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/synthflesh
+ name = "Synthflesh"
+ id = "synthflesh"
+ result = "synthflesh"
+ required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1)
+ result_amount = 3
+ mix_message = "The mixture knits together into a fibrous, bloody mass."
+ mix_sound = 'sound/effects/blobattack.ogg'
+
+/datum/chemical_reaction/styptic_powder
+ name = "Styptic Powder"
+ id = "styptic_powder"
+ result = "styptic_powder"
+ required_reagents = list("aluminum" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1)
+ result_amount = 4
+ mix_message = "The solution yields an astringent powder."
+
+/datum/chemical_reaction/calomel
+ name = "Calomel"
+ id = "calomel"
+ result = "calomel"
+ required_reagents = list("mercury" = 1, "chlorine" = 1)
+ result_amount = 2
+ min_temp = 374
+ mix_message = "Stinging vapors rise from the solution."
+
+/datum/chemical_reaction/potass_iodide
+ name = "Potassium Iodide"
+ id = "potass_iodide"
+ result = "potass_iodide"
+ required_reagents = list("potassium" = 1, "iodine" = 1)
+ result_amount = 2
+ mix_message = "The solution settles calmly and emits gentle fumes."
+
+/datum/chemical_reaction/pen_acid
+ name = "Pentetic Acid"
+ id = "pen_acid"
+ result = "pen_acid"
+ required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1)
+ result_amount = 6
+ mix_message = "The substance becomes very still, emitting a curious haze."
+
+/datum/chemical_reaction/sal_acid
+ name = "Salicyclic Acid"
+ id = "sal_acid"
+ result = "sal_acid"
+ required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1)
+ result_amount = 5
+ mix_message = "The mixture crystallizes."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/salbutamol
+ name = "Salbutamol"
+ id = "salbutamol"
+ result = "salbutamol"
+ required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminum" = 1, "bromine" = 1, "ammonia" = 1)
+ result_amount = 5
+ mix_message = "The solution bubbles freely, creating a head of bluish foam."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/perfluorodecalin
+ name = "Perfluorodecalin"
+ id = "perfluorodecalin"
+ result = "perfluorodecalin"
+ required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1)
+ result_amount = 3
+ min_temp = 370
+ mix_message = "The mixture rapidly turns into a dense pink liquid."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/ephedrine
+ name = "Ephedrine"
+ id = "ephedrine"
+ result = "ephedrine"
+ required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1)
+ result_amount = 4
+ mix_message = "The solution fizzes and gives off toxic fumes."
+
+/datum/chemical_reaction/diphenhydramine
+ name = "Diphenhydramine"
+ id = "diphenhydramine"
+ result = "diphenhydramine"
+ required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1)
+ result_amount = 4
+ mix_message = "The mixture fizzes gently."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/oculine
+ name = "Oculine"
+ id = "oculine"
+ result = "oculine"
+ required_reagents = list("atropine" = 1, "spaceacillin" = 1, "salglu_solution" = 1)
+ result_amount = 3
+ mix_message = "The mixture settles, becoming a milky white."
+
+/datum/chemical_reaction/atropine
+ name = "Atropine"
+ id = "atropine"
+ result = "atropine"
+ required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1)
+ result_amount = 5
+ mix_message = "A horrid smell like something died drifts from the mixture."
+
+/datum/chemical_reaction/epinephrine
+ name = "Epinephrine"
+ id = "epinephrine"
+ result = "epinephrine"
+ required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1)
+ result_amount = 6
+ mix_message = "Tiny white crystals precipitate out of the solution."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/strange_reagent
+ name = "Strange Reagent"
+ id = "strange_reagent"
+ result = "strange_reagent"
+ required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1)
+ result_amount = 3
+ mix_message = "The substance begins moving on its own somehow."
+
+/datum/chemical_reaction/life
+ name = "Life"
+ id = "life"
+ result = null
+ required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1)
+ result_amount = 3
+ min_temp = 374
+
+/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume)
+ chemical_mob_spawn(holder, 1, "Life")
+
+/datum/chemical_reaction/mannitol
+ name = "Mannitol"
+ id = "mannitol"
+ result = "mannitol"
+ required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1)
+ result_amount = 3
+ mix_message = "The mixture bubbles slowly, making a slightly sweet odor."
+
+/datum/chemical_reaction/mutadone
+ name = "Mutadone"
+ id = "mutadone"
+ result = "mutadone"
+ required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1)
+ result_amount = 3
+ mix_message = "A foul astringent liquid emerges from the reaction."
+
+/datum/chemical_reaction/antihol
+ name = "antihol"
+ id = "antihol"
+ result = "antihol"
+ required_reagents = list("ethanol" = 1, "charcoal" = 1)
+ result_amount = 2
+ mix_message = "A minty and refreshing smell drifts from the effervescent mixture."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/simethicone
+ name = "simethicone"
+ id = "simethicone"
+ result = "simethicone"
+ required_reagents = list("hydrogen" = 1, "chlorine" = 1, "silicon" = 1, "oxygen" = 1)
+ result_amount = 4
+
+/datum/chemical_reaction/teporone
+ name = "Teporone"
+ id = "teporone"
+ result = "teporone"
+ required_reagents = list("acetone" = 1, "silicon" = 1, "plasma" = 1)
+ result_amount = 2
+ mix_message = "The mixture turns an odd lavender color."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/haloperidol
+ name = "Haloperidol"
+ id = "haloperidol"
+ result = "haloperidol"
+ required_reagents = list("chlorine" = 1, "fluorine" = 1, "aluminum" = 1, "potass_iodide" = 1, "oil" = 1)
+ result_amount = 4
+ mix_message = "The chemicals mix into an odd pink slush."
+
+/datum/chemical_reaction/ether
+ name = "Ether"
+ id = "ether"
+ result = "ether"
+ required_reagents = list("sacid" = 1, "ethanol" = 1, "oxygen" = 1)
+ result_amount = 1
+ mix_message = "The mixture yields a pungent odor, which makes you tired."
+
+/datum/chemical_reaction/degreaser
+ name = "Degreaser"
+ id = "degreaser"
+ result = "degreaser"
+ required_reagents = list("oil" = 1, "sterilizine" = 1)
+ result_amount = 2
+
+/datum/chemical_reaction/liquid_solder
+ name = "Liquid Solder"
+ id = "liquid_solder"
+ result = "liquid_solder"
+ required_reagents = list("ethanol" = 1, "copper" = 1, "silver" = 1)
+ result_amount = 3
+ min_temp = 370
+ mix_message = "The solution gently swirls with a metallic sheen."
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
new file mode 100644
index 00000000000..b97deb0ae8f
--- /dev/null
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -0,0 +1,482 @@
+// foam and foam precursor
+
+/datum/chemical_reaction/surfactant
+ name = "Foam surfactant"
+ id = "foam surfactant"
+ result = "fluorosurfactant"
+ required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1)
+ result_amount = 5
+ mix_message = "A head of foam results from the mixture's constant fizzing."
+
+/datum/chemical_reaction/foam
+ name = "Foam"
+ id = "foam"
+ result = null
+ required_reagents = list("fluorosurfactant" = 1, "water" = 1)
+ result_amount = 2
+
+/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume)
+ var/location = get_turf(holder.my_atom)
+ holder.my_atom.visible_message("The solution spews out foam!")
+
+ var/datum/effect/system/foam_spread/s = new()
+ s.set_up(created_volume, location, holder, 0)
+ s.start()
+ holder.clear_reagents()
+
+
+/datum/chemical_reaction/metalfoam
+ name = "Metal Foam"
+ id = "metalfoam"
+ result = null
+ required_reagents = list("aluminum" = 3, "fluorosurfactant" = 1, "sacid" = 1)
+ result_amount = 5
+
+/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume)
+ var/location = get_turf(holder.my_atom)
+
+ holder.my_atom.visible_message("The solution spews out a metalic foam!")
+
+ var/datum/effect/system/foam_spread/s = new()
+ s.set_up(created_volume, location, holder, MFOAM_ALUMINUM)
+ s.start()
+
+
+/datum/chemical_reaction/ironfoam
+ name = "Iron Foam"
+ id = "ironlfoam"
+ result = null
+ required_reagents = list("iron" = 3, "fluorosurfactant" = 1, "sacid" = 1)
+ result_amount = 5
+
+/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume)
+ var/location = get_turf(holder.my_atom)
+
+ holder.my_atom.visible_message("= 5 && !istype(T, /turf/space))
- if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in T) //let's not have hundreds of decals of black powder on the same turf
- new /obj/effect/decal/cleanable/dirt/blackpowder(T)
-
/datum/chemical_reaction/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
@@ -190,17 +136,6 @@
sleep(rand(20,30))
blackpowder_detonate(holder, created_volume)
-/*
-/datum/reagent/blackpowder/on_ex_act()
- var/location = get_turf(holder.my_atom)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(2, 1, location)
- s.start()
- sleep(rand(10,15))
- blackpowder_detonate(holder, volume)
- holder.remove_reagent("blackpowder", volume)
- return */
-
/proc/blackpowder_detonate(datum/reagents/holder, created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
var/ex_severe = round(created_volume / 100)
@@ -213,20 +148,28 @@
spawn(0)
qdel(holder.my_atom)
-/datum/reagent/flash_powder
- name = "Flash Powder"
- id = "flash_powder"
- description = "Makes a very bright flash."
- reagent_state = LIQUID
- color = "#FFFF00"
-
-/datum/chemical_reaction/flash_powder
+datum/chemical_reaction/flash_powder
name = "Flash powder"
id = "flash_powder"
result = "flash_powder"
required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1)
result_amount = 3
+/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume)
+ if(holder.has_reagent("stabilizing_agent"))
+ return
+ var/location = get_turf(holder.my_atom)
+ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ s.set_up(2, 1, location)
+ s.start()
+ for(var/mob/living/carbon/C in viewers(5, location))
+ if(C.flash_eyes())
+ if(get_dist(C, location) < 4)
+ C.Weaken(5)
+ continue
+ C.Stun(5)
+ holder.remove_reagent("flash_powder", created_volume)
+
/datum/chemical_reaction/flash_powder_flash
name = "Flash powder activation"
id = "flash_powder_flash"
@@ -246,29 +189,6 @@
continue
C.Stun(5)
-
-/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume)
- if(holder.has_reagent("stabilizing_agent"))
- return
- var/location = get_turf(holder.my_atom)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(2, 1, location)
- s.start()
- for(var/mob/living/carbon/C in viewers(5, location))
- if(C.flash_eyes())
- if(get_dist(C, location) < 4)
- C.Weaken(5)
- continue
- C.Stun(5)
- holder.remove_reagent("flash_powder", created_volume)
-
-/datum/reagent/smoke_powder
- name = "Smoke Powder"
- id = "smoke_powder"
- description = "Makes a large cloud of smoke that can carry reagents."
- reagent_state = LIQUID
- color = "#808080"
-
/datum/chemical_reaction/smoke_powder
name = "smoke_powder"
id = "smoke_powder"
@@ -318,13 +238,6 @@
forbidden_reagents = list("stimulants")
mix_sound = null
-/datum/reagent/sonic_powder
- name = "Sonic Powder"
- id = "sonic_powder"
- description = "Makes a deafening noise."
- reagent_state = LIQUID
- color = "#0000FF"
-
/datum/chemical_reaction/sonic_powder
name = "sonic_powder"
id = "sonic_powder"
@@ -332,6 +245,35 @@
required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1)
result_amount = 3
+/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume)
+ if(holder.has_reagent("stabilizing_agent"))
+ return
+ var/location = get_turf(holder.my_atom)
+ playsound(location, 'sound/effects/bang.ogg', 25, 1)
+ for(var/mob/living/M in hearers(5, location))
+ var/ear_safety = 0
+ var/distance = max(1,get_dist(src,T))
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT)))
+ ear_safety++
+ to_chat(C, "BANG")
+ if(!ear_safety)
+ M.Stun(max(10/distance, 3))
+ M.Weaken(max(10/distance, 3))
+ M.AdjustEarDamage(rand(0, 5))
+ M.EarDeaf(15)
+ if(M.ear_damage >= 15)
+ to_chat(M, "Your ears start to ring badly!")
+ if(prob(M.ear_damage - 5))
+ to_chat(M, "You can't hear anything!")
+ M.disabilities |= DEAF
+ else
+ if(M.ear_damage >= 5)
+ to_chat(M, "Your ears start to ring!")
+ holder.remove_reagent("sonic_powder", created_volume)
/datum/chemical_reaction/sonic_powder_deafen
name = "sonic_powder_deafen"
@@ -356,53 +298,17 @@
if(!ear_safety)
M.Stun(max(10/distance, 3))
M.Weaken(max(10/distance, 3))
- M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15))
+ M.AdjustEarDamage(rand(0, 5))
+ M.EarDeaf(15)
if(M.ear_damage >= 15)
to_chat(M, "Your ears start to ring badly!")
- if(prob(M.ear_damage - 10 + 5))
+ if(prob(M.ear_damage - 5))
to_chat(M, "You can't hear anything!")
- M.disabilities |= DEAF
+ M.BecomeDeaf()
else
if(M.ear_damage >= 5)
to_chat(M, "Your ears start to ring!")
-/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume)
- if(holder.has_reagent("stabilizing_agent"))
- return
- var/location = get_turf(holder.my_atom)
- playsound(location, 'sound/effects/bang.ogg', 25, 1)
- for(var/mob/living/M in hearers(5, location))
- var/ear_safety = 0
- var/distance = max(1,get_dist(src,T))
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT)))
- ear_safety++
- to_chat(C, "BANG")
- if(!ear_safety)
- M.Stun(max(10/distance, 3))
- M.Weaken(max(10/distance, 3))
- M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15))
- if(M.ear_damage >= 15)
- to_chat(M, "Your ears start to ring badly!")
- if(prob(M.ear_damage - 10 + 5))
- to_chat(M, "You can't hear anything!")
- M.disabilities |= DEAF
- else
- if(M.ear_damage >= 5)
- to_chat(M, "Your ears start to ring!")
- holder.remove_reagent("sonic_powder", created_volume)
-
-/datum/reagent/phlogiston
- name = "Phlogiston"
- id = "phlogiston"
- description = "Catches you on fire and makes you ignite."
- reagent_state = LIQUID
- color = "#FF9999"
- process_flags = ORGANIC | SYNTHETIC
-
/datum/chemical_reaction/phlogiston
name = "phlogiston"
id = "phlogiston"
@@ -417,32 +323,6 @@
for(var/turf/simulated/turf in range(min(created_volume/10,4),T))
new /obj/effect/hotspot(turf)
-/datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, volume)
- M.IgniteMob()
- ..()
-
-/datum/reagent/phlogiston/on_mob_life(mob/living/M)
- M.adjust_fire_stacks(1)
- var/burndmg = max(0.3*M.fire_stacks, 0.3)
- M.adjustFireLoss(burndmg)
- ..()
-
-/datum/reagent/napalm
- name = "Napalm"
- id = "napalm"
- description = "Very flammable."
- reagent_state = LIQUID
- color = "#FF9999"
- process_flags = ORGANIC | SYNTHETIC
-
-/datum/reagent/napalm/on_mob_life(mob/living/M)
- M.adjust_fire_stacks(1)
- ..()
-
-/datum/reagent/napalm/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == TOUCH)
- M.adjust_fire_stacks(min(volume/4, 20))
-
/datum/chemical_reaction/napalm
name = "Napalm"
id = "napalm"
@@ -450,13 +330,6 @@
required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 )
result_amount = 1
-/datum/reagent/cryostylane
- name = "Cryostylane"
- id = "cryostylane"
- description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K."
- color = "#B2B2FF" // rgb: 139, 166, 233
- process_flags = ORGANIC | SYNTHETIC
-
/datum/chemical_reaction/cryostylane
name = "cryostylane"
id = "cryostylane"
@@ -465,31 +338,6 @@
result_amount = 3
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-/datum/reagent/cryostylane/on_mob_life(mob/living/M) //TODO: code freezing into an ice cube
- if(M.reagents.has_reagent("oxygen"))
- M.reagents.remove_reagent("oxygen", 1)
- M.bodytemperature -= 30
- ..()
-
-/datum/reagent/cryostylane/on_tick()
- if(holder.has_reagent("oxygen"))
- holder.remove_reagent("oxygen", 1)
- holder.chem_temp -= 10
- holder.handle_reactions()
- ..()
-
-/datum/reagent/cryostylane/reaction_turf(turf/T, volume)
- if(volume >= 5)
- for(var/mob/living/carbon/slime/M in T)
- M.adjustToxLoss(rand(15,30))
-
-/datum/reagent/pyrosium
- name = "Pyrosium"
- id = "pyrosium"
- description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K."
- color = "#B20000" // rgb: 139, 166, 233
- process_flags = ORGANIC | SYNTHETIC
-
/datum/chemical_reaction/pyrosium
name = "pyrosium"
id = "pyrosium"
@@ -497,19 +345,6 @@
required_reagents = list("plasma" = 1, "radium" = 1, "phosphorus" = 1)
result_amount = 3
-/datum/reagent/pyrosium/on_mob_life(mob/living/M)
- if(M.reagents.has_reagent("oxygen"))
- M.reagents.remove_reagent("oxygen", 1)
- M.bodytemperature += 30
- ..()
-
-/datum/reagent/pyrosium/on_tick()
- if(holder.has_reagent("oxygen"))
- holder.remove_reagent("oxygen", 1)
- holder.chem_temp += 10
- holder.handle_reactions()
- ..()
-
/datum/chemical_reaction/azide
name = "azide"
id = "azide"
@@ -523,14 +358,6 @@
var/location = get_turf(holder.my_atom)
explosion(location, 0, 1, 4)
-/datum/reagent/firefighting_foam
- name = "Firefighting foam"
- id = "firefighting_foam"
- description = "Carbon Tetrachloride is a foam used for fire suppression."
- reagent_state = LIQUID
- color = "#A0A090"
- var/cooling_temperature = 3 // more effective than water
-
/datum/chemical_reaction/firefighting_foam
name = "firefighting_foam"
id = "firefighting_foam"
@@ -540,29 +367,6 @@
mix_message = "The mixture bubbles gently."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-/datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume)
-// Put out fire
- if(method == TOUCH)
- M.adjust_fire_stacks(-(volume / 5)) // more effective than water
- M.ExtinguishMob()
-
-/datum/reagent/firefighting_foam/reaction_obj(obj/O, volume)
- if(istype(O))
- O.extinguish()
-
-/datum/reagent/firefighting_foam/reaction_turf(turf/simulated/T, volume)
- if(!istype(T))
- return
- var/CT = cooling_temperature
- new /obj/effect/decal/cleanable/flour/foam(T) //foam mess; clears up quickly.
- var/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot)
- var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles())
- lowertemp.temperature = max(min(lowertemp.temperature-(CT*1000), lowertemp.temperature / CT), 0)
- lowertemp.react()
- T.assume_air(lowertemp)
- qdel(hotspot)
-
/datum/chemical_reaction/clf3_firefighting
name = "clf3_firefighting"
id = "clf3_firefighting"
@@ -593,30 +397,9 @@
holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched.
holder.del_reagent("uranium")
-/datum/reagent/plasma_dust
- name = "Plasma Dust"
- id = "plasma_dust"
- description = "A fine dust of plasma. This chemical has unusual mutagenic properties for viruses and slimes alike."
- color = "#500064" // rgb: 80, 0, 100
-
-/datum/reagent/plasma_dust/on_mob_life(mob/living/M)
- M.adjustToxLoss(3)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- C.adjustPlasma(20)
- ..()
-
-/datum/reagent/plasma_dust/reaction_obj(obj/O, volume)
- if((!O) || (!volume))
- return 0
- O.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume)
-
-/datum/reagent/plasma_dust/reaction_turf(turf/simulated/T, volume)
- if(istype(T))
- T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume)
-
-/datum/reagent/plasma_dust/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma dust is stronger than fuel!
- if(method == TOUCH)
- M.adjust_fire_stacks(volume / 5)
- return
- ..()
\ No newline at end of file
+/datum/chemical_reaction/thermite
+ name = "Thermite"
+ id = "thermite"
+ result = "thermite"
+ required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1)
+ result_amount = 3
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
similarity index 100%
rename from code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
rename to code/modules/reagents/chemistry/recipes/slime_extracts.dm
diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm
new file mode 100644
index 00000000000..2181401b2da
--- /dev/null
+++ b/code/modules/reagents/chemistry/recipes/toxins.dm
@@ -0,0 +1,142 @@
+/datum/chemical_reaction/formaldehyde
+ name = "formaldehyde"
+ id = "formaldehyde"
+ result = "formaldehyde"
+ required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1)
+ result_amount = 3
+ min_temp = 420
+ mix_message = "Ugh, it smells like the morgue in here."
+
+/datum/chemical_reaction/neurotoxin2
+ name = "neurotoxin2"
+ id = "neurotoxin2"
+ result = "neurotoxin2"
+ required_reagents = list("space_drugs" = 1)
+ result_amount = 1
+ min_temp = 674
+ mix_sound = null
+ no_message = 1
+
+/datum/chemical_reaction/cyanide
+ name = "Cyanide"
+ id = "cyanide"
+ result = "cyanide"
+ required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1)
+ result_amount = 3
+ min_temp = 380
+ mix_message = "The mixture gives off a faint scent of almonds."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/cyanide/on_reaction(datum/reagents/holder)
+ var/turf/T = get_turf(holder.my_atom)
+ T.visible_message("The solution generates a strong vapor!")
+ for(var/mob/living/carbon/C in range(T, 1))
+ if(C.can_breathe_gas())
+ C.reagents.add_reagent("cyanide", 7)
+
+/datum/chemical_reaction/itching_powder
+ name = "Itching Powder"
+ id = "itching_powder"
+ result = "itching_powder"
+ required_reagents = list("fuel" = 1, "ammonia" = 1, "fungus" = 1)
+ result_amount = 3
+ mix_message = "The mixture congeals and dries up, leaving behind an abrasive powder."
+ mix_sound = 'sound/effects/blobattack.ogg'
+
+/datum/chemical_reaction/facid
+ name = "Fluorosulfuric Acid"
+ id = "facid"
+ result = "facid"
+ required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1)
+ result_amount = 4
+ min_temp = 380
+ mix_message = "The mixture deepens to a dark blue, and slowly begins to corrode its container."
+
+/datum/chemical_reaction/initropidril
+ name = "Initropidril"
+ id = "initropidril"
+ result = "initropidril"
+ required_reagents = list("crank" = 1, "histamine" = 1, "krokodil" = 1, "bath_salts" = 1, "atropine" = 1, "nicotine" = 1, "morphine" = 1)
+ result_amount = 4
+ mix_message = "A sweet and sugary scent drifts from the unpleasant milky substance."
+
+/datum/chemical_reaction/sulfonal
+ name = "sulfonal"
+ id = "sulfonal"
+ result = "sulfonal"
+ required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1)
+ result_amount = 3
+ mix_message = "The mixture gives off quite a stench."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/lipolicide
+ name = "lipolicide"
+ id = "lipolicide"
+ result = "lipolicide"
+ required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/sarin
+ name = "sarin"
+ id = "sarin"
+ result = "sarin"
+ required_reagents = list("chlorine" = 1, "fuel" = 1, "oxygen" = 1, "phosphorus" = 1, "fluorine" = 1, "hydrogen" = 1, "acetone" = 1, "atrazine" = 1)
+ result_amount = 3
+ mix_message = "The mixture yields a colorless, odorless liquid."
+ min_temp = 374
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/sarin/on_reaction(datum/reagents/holder)
+ var/turf/T = get_turf(holder.my_atom)
+ T.visible_message("The solution generates a strong vapor!")
+ for(var/mob/living/carbon/C in range(T, 2))
+ if(C.can_breathe_gas())
+ C.reagents.add_reagent("sarin", 4)
+
+/datum/chemical_reaction/atrazine
+ name = "atrazine"
+ id = "atrazine"
+ result = "atrazine"
+ required_reagents = list("chlorine" = 1, "hydrogen" = 1, "nitrogen" = 1)
+ result_amount = 3
+ mix_message = "The mixture gives off a harsh odor"
+
+/datum/chemical_reaction/capulettium
+ name = "capulettium"
+ id = "capulettium"
+ result = "capulettium"
+ required_reagents = list("neurotoxin2" = 1, "chlorine" = 1, "hydrogen" = 1)
+ result_amount = 1
+ mix_message = "The smell of death wafts up from the solution."
+
+/datum/chemical_reaction/capulettium_plus
+ name = "capulettium_plus"
+ id = "capulettium_plus"
+ result = "capulettium_plus"
+ required_reagents = list("capulettium" = 1, "ephedrine" = 1, "methamphetamine" = 1)
+ result_amount = 3
+ mix_message = "The solution begins to slosh about violently by itself."
+
+/datum/chemical_reaction/teslium
+ name = "Teslium"
+ id = "teslium"
+ result = "teslium"
+ required_reagents = list("plasma" = 1, "silver" = 1, "blackpowder" = 1)
+ result_amount = 3
+ mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry."
+ min_temp = 400
+ mix_sound = null
+
+/datum/chemical_reaction/teslium/on_reaction(datum/reagents/holder, created_volume)
+ var/location = get_turf(holder.my_atom)
+ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ s.set_up(6, 1, location)
+ s.start()
+
+/datum/chemical_reaction/mutagen
+ name = "Unstable mutagen"
+ id = "mutagen"
+ result = "mutagen"
+ required_reagents = list("radium" = 1, "plasma" = 1, "chlorine" = 1)
+ result_amount = 3
+ mix_message = "The substance turns neon green and bubbles unnervingly."
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm
deleted file mode 100644
index def94ba9a2c..00000000000
--- a/code/modules/reagents/newchem/disease.dm
+++ /dev/null
@@ -1,320 +0,0 @@
-/datum/reagent/spider_eggs
- name = "spider eggs"
- id = "spidereggs"
- description = "A fine dust containing spider eggs. Oh gosh."
- reagent_state = SOLID
- color = "#FFFFFF"
-
-/datum/reagent/spider_eggs/on_mob_life(mob/living/M)
- if(volume > 2.5)
- if(iscarbon(M))
- if(!M.get_int_organ(/obj/item/organ/internal/body_egg))
- new/obj/item/organ/internal/body_egg/spider_eggs(M) //Yes, even Xenos can fall victim to the plague that is spider infestation.
- ..()
-
-
-/datum/reagent/nanomachines
- name = "Nanomachines"
- id = "nanomachines"
- description = "Microscopic construction robots."
- color = "#535E66" // rgb: 83, 94, 102
-
-/datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M)
- if(volume > 1.5)
- M.ForceContractDisease(new /datum/disease/transformation/robot(0))
- ..()
-
-
-/datum/reagent/xenomicrobes
- name = "Xenomicrobes"
- id = "xenomicrobes"
- description = "Microbes with an entirely alien cellular structure."
- color = "#535E66" // rgb: 83, 94, 102
-
-/datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M)
- if(volume > 1.5)
- M.ContractDisease(new /datum/disease/transformation/xeno(0))
- ..()
-
-/datum/reagent/fungalspores
- name = "Tubercle bacillus Cosmosis microbes"
- id = "fungalspores"
- description = "Active fungal spores."
- color = "#92D17D" // rgb: 146, 209, 125
-
-/datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M)
- if(volume > 2.5)
- M.ForceContractDisease(new /datum/disease/tuberculosis(0))
- ..()
-
-/datum/reagent/jagged_crystals
- name = "Jagged Crystals"
- id = "jagged_crystals"
- description = "Rapid chemical decomposition has warped these crystals into twisted spikes."
- reagent_state = SOLID
- color = "#FA0000" // rgb: 250, 0, 0
-
-/datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M)
- M.ForceContractDisease(new /datum/disease/berserker(0))
- ..()
-
-/datum/reagent/salmonella
- name = "Salmonella"
- id = "salmonella"
- description = "A nasty bacteria found in spoiled food."
- reagent_state = LIQUID
- color = "#1E4600"
-
-/datum/reagent/salmonella/on_mob_life(mob/living/carbon/M)
- M.ForceContractDisease(new /datum/disease/food_poisoning(0))
- ..()
-
-/datum/reagent/gibbis
- name = "Gibbis"
- id = "gibbis"
- description = "Liquid gibbis."
- reagent_state = LIQUID
- color = "#FF0000"
-
-/datum/reagent/gibbis/on_mob_life(mob/living/carbon/M)
- if(volume > 2.5)
- M.ForceContractDisease(new /datum/disease/gbs/curable(0))
- ..()
-
-/datum/reagent/prions
- name = "Prions"
- id = "prions"
- description = "A disease-causing agent that is neither bacterial nor fungal nor viral and contains no genetic material."
- reagent_state = LIQUID
- color = "#FFFFFF"
-
-/datum/reagent/prions/on_mob_life(mob/living/carbon/M)
- if(volume > 4.5)
- M.ForceContractDisease(new /datum/disease/kuru(0))
- ..()
-
-/datum/reagent/grave_dust
- name = "Grave Dust"
- id = "grave_dust"
- description = "Moldy old dust taken from a grave site."
- reagent_state = LIQUID
- color = "#465046"
-
-/datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M)
- if(volume > 4.5)
- M.ForceContractDisease(new /datum/disease/vampire(0))
- ..()
-
-/datum/reagent/heartworms
- name = "Space heartworms"
- id = "heartworms"
- description = "Aww, gross! These things can't be good for your heart. They're gunna eat it!"
- reagent_state = SOLID
- color = "#925D6C"
-
-/datum/reagent/heartworms/on_mob_life(mob/living/carbon/M)
- if(volume > 4.5)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/internal/heart/ate_heart = H.get_int_organ(/obj/item/organ/internal/heart)
- if(ate_heart)
- ate_heart.remove(H)
- qdel(ate_heart)
- ..()
-
-//virus-specific symptom reagents
-
-/datum/reagent/synaphydramine
- name = "Diphen-Synaptizine"
- id = "synaphydramine"
- description = "Reduces drowsiness and hallucinations while also purging histamine from the body."
- color = "#EC536D" // rgb: 236, 83, 109
-
-/datum/reagent/synaphydramine/on_mob_life(mob/living/M)
- M.drowsyness = max(M.drowsyness-5, 0)
- if(holder.has_reagent("lsd"))
- holder.remove_reagent("lsd", 5)
- if(holder.has_reagent("histamine"))
- holder.remove_reagent("histamine", 5)
- M.hallucination = max(0, M.hallucination - 10)
- if(prob(30))
- M.adjustToxLoss(1)
- ..()
-
-//virus food
-/datum/reagent/virus_food
- name = "Virus Food"
- id = "virusfood"
- description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce."
- reagent_state = LIQUID
- nutriment_factor = 2 * REAGENTS_METABOLISM
- color = "#899613" // rgb: 137, 150, 19
-
-/datum/reagent/virus_food/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor * REAGENTS_EFFECT_MULTIPLIER
- ..()
-
-/datum/reagent/mutagen/mutagenvirusfood
- name = "mutagenic agar"
- id = "mutagenvirusfood"
- description = "mutates blood"
- color = "#A3C00F" // rgb: 163,192,15
-
-/datum/reagent/mutagen/mutagenvirusfood/sugar
- name = "sucrose agar"
- id = "sugarvirusfood"
- color = "#41B0C0" // rgb: 65,176,192
-
-/datum/reagent/diphenhydramine/diphenhydraminevirusfood
- name = "virus rations"
- id = "diphenhydraminevirusfood"
- description = "mutates blood"
- color = "#D18AA5" // rgb: 209,138,165
-
-/datum/reagent/plasma_dust/plasmavirusfood
- name = "virus plasma"
- id = "plasmavirusfood"
- description = "mutates blood"
- color = "#A69DA9" // rgb: 166,157,169
-
-/datum/reagent/plasma_dust/plasmavirusfood/weak
- name = "weakened virus plasma"
- id = "weakplasmavirusfood"
- color = "#CEC3C6" // rgb: 206,195,198
-
-//reactions
-/datum/chemical_reaction/virus_food
- name = "Virus Food"
- id = "virusfood"
- result = "virusfood"
- required_reagents = list("water" = 1, "milk" = 1, "oxygen" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/virus_food_mutagen
- name = "mutagenic agar"
- id = "mutagenvirusfood"
- result = "mutagenvirusfood"
- required_reagents = list("mutagen" = 1, "virusfood" = 1)
- result_amount = 1
-
-/datum/chemical_reaction/virus_food_diphenhydramine
- name = "virus rations"
- id = "diphenhydraminevirusfood"
- result = "diphenhydraminevirusfood"
- required_reagents = list("diphenhydramine" = 1, "virusfood" = 1)
- result_amount = 1
-
-/datum/chemical_reaction/virus_food_plasma
- name = "virus plasma"
- id = "plasmavirusfood"
- result = "plasmavirusfood"
- required_reagents = list("plasma_dust" = 1, "virusfood" = 1)
- result_amount = 1
-
-/datum/chemical_reaction/virus_food_plasma_diphenhydramine
- name = "weakened virus plasma"
- id = "weakplasmavirusfood"
- result = "weakplasmavirusfood"
- required_reagents = list("diphenhydramine" = 1, "plasmavirusfood" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/virus_food_mutagen_sugar
- name = "sucrose agar"
- id = "sugarvirusfood"
- result = "sugarvirusfood"
- required_reagents = list("sugar" = 1, "mutagenvirusfood" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/virus_food_mutagen_salineglucose
- name = "sucrose agar"
- id = "salineglucosevirusfood"
- result = "sugarvirusfood"
- required_reagents = list("salglu_solution" = 1, "mutagenvirusfood" = 1)
- result_amount = 2
-
-
-//mix virus
-/datum/chemical_reaction/mix_virus
- name = "Mix Virus"
- id = "mixvirus"
- required_reagents = list("virusfood" = 1)
- required_catalysts = list("blood" = 1)
- var/level_min = 0
- var/level_max = 2
-
-/datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, created_volume)
- var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
- if(B && B.data)
- var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
- if(D)
- D.Evolve(level_min, level_max)
-
-
-/datum/chemical_reaction/mix_virus/mix_virus_2
- name = "Mix Virus 2"
- id = "mixvirus2"
- required_reagents = list("mutagen" = 1)
- level_min = 2
- level_max = 4
-
-/datum/chemical_reaction/mix_virus/mix_virus_3
- name = "Mix Virus 3"
- id = "mixvirus3"
- required_reagents = list("plasma_dust" = 1)
- level_min = 4
- level_max = 6
-
-/datum/chemical_reaction/mix_virus/mix_virus_4
- name = "Mix Virus 4"
- id = "mixvirus4"
- required_reagents = list("uranium" = 1)
- level_min = 5
- level_max = 6
-
-/datum/chemical_reaction/mix_virus/mix_virus_5
- name = "Mix Virus 5"
- id = "mixvirus5"
- required_reagents = list("mutagenvirusfood" = 1)
- level_min = 3
- level_max = 3
-
-/datum/chemical_reaction/mix_virus/mix_virus_6
- name = "Mix Virus 6"
- id = "mixvirus6"
- required_reagents = list("sugarvirusfood" = 1)
- level_min = 4
- level_max = 4
-
-/datum/chemical_reaction/mix_virus/mix_virus_7
- name = "Mix Virus 7"
- id = "mixvirus7"
- required_reagents = list("weakplasmavirusfood" = 1)
- level_min = 5
- level_max = 5
-
-/datum/chemical_reaction/mix_virus/mix_virus_8
- name = "Mix Virus 8"
- id = "mixvirus8"
- required_reagents = list("plasmavirusfood" = 1)
- level_min = 6
- level_max = 6
-
-/datum/chemical_reaction/mix_virus/mix_virus_9
- name = "Mix Virus 9"
- id = "mixvirus9"
- required_reagents = list("diphenhydraminevirusfood" = 1)
- level_min = 1
- level_max = 1
-
-/datum/chemical_reaction/mix_virus/rem_virus
- name = "Devolve Virus"
- id = "remvirus"
- required_reagents = list("diphenhydramine" = 1)
- required_catalysts = list("blood" = 1)
-
-/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, created_volume)
- var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
- if(B && B.data)
- var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
- if(D)
- D.Devolve()
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm
deleted file mode 100644
index b1f789b7f22..00000000000
--- a/code/modules/reagents/newchem/drinks.dm
+++ /dev/null
@@ -1,238 +0,0 @@
-/datum/reagent/ginsonic
- name = "Gin and sonic"
- id = "ginsonic"
- description = "GOTTA GET CRUNK FAST BUT LIQUOR TOO SLOW"
- reagent_state = LIQUID
- color = "#1111CF"
-
-/datum/chemical_reaction/ginsonic
- name = "ginsonic"
- id = "ginsonic"
- result = "ginsonic"
- required_reagents = list("gintonic" = 1, "methamphetamine" = 1)
- result_amount = 2
- mix_message = "The drink turns electric blue and starts quivering violently."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/ginsonic/on_mob_life(mob/living/M)
- M.drowsyness = max(0, M.drowsyness-5)
- if(prob(25))
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- if(prob(8))
- M.reagents.add_reagent("methamphetamine",1.2)
- var/sonic_message = pick("Gotta go fast!", "Time to speed, keed!", "I feel a need for speed!", "Let's juice.", "Juice time.", "Way Past Cool!")
- if(prob(50))
- M.say("[sonic_message]")
- else
- to_chat(M, "[sonic_message ]")
- ..()
-
-/datum/reagent/ethanol/applejack
- name = "Applejack"
- id = "applejack"
- description = "A highly concentrated alcoholic beverage made by repeatedly freezing cider and removing the ice."
- color = "#997A00"
- alcohol_perc = 0.4
-
-/datum/chemical_reaction/applejack
- name = "applejack"
- id = "applejack"
- result = "applejack"
- required_reagents = list("cider" = 2)
- max_temp = 270
- result_amount = 1
- mix_message = "The drink darkens as the water freezes, leaving the concentrated cider behind."
- mix_sound = null
-
-/datum/reagent/ethanol/jackrose
- name = "Jack Rose"
- id = "jackrose"
- description = "A classic cocktail that had fallen out of fashion, but never out of taste,"
- color = "#664300"
- alcohol_perc = 0.4
-
-/datum/chemical_reaction/jackrose
- name = "jackrose"
- id = "jackrose"
- result = "jackrose"
- required_reagents = list("applejack" = 4, "lemonjuice" = 1)
- result_amount = 5
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-
-/datum/reagent/ethanol/dragons_breath //inaccessible to players, but here for admin shennanigans
- name = "Dragon's Breath"
- id = "dragonsbreath"
- description = "Possessing this stuff probably breaks the Geneva convention."
- reagent_state = LIQUID
- color = "#DC0000"
- alcohol_perc = 1
-
-/datum/reagent/ethanol/dragons_breath/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == INGEST && prob(20))
- if(M.on_fire)
- M.adjust_fire_stacks(3)
-
-/datum/reagent/ethanol/dragons_breath/on_mob_life(mob/living/M)
- if(M.reagents.has_reagent("milk"))
- to_chat(M, "The milk stops the burning. Ahhh.")
- M.reagents.del_reagent("milk")
- M.reagents.del_reagent("dragonsbreath")
- return
- if(prob(8))
- to_chat(M, "Oh god! Oh GODD!!")
- if(prob(50))
- to_chat(M, "Your throat burns terribly!")
- M.emote(pick("scream","cry","choke","gasp"))
- M.Stun(1)
- if(prob(8))
- to_chat(M, "Why!? WHY!?")
- if(prob(8))
- to_chat(M, "ARGHHHH!")
- if(prob(2 * volume))
- to_chat(M, "OH GOD OH GOD PLEASE NO!!")
- if(M.on_fire)
- M.adjust_fire_stacks(5)
- if(prob(50))
- to_chat(M, "IT BURNS!!!!")
- M.visible_message("[M] is consumed in flames!")
- M.dust()
- return
- ..()
-
-// ROBOT ALCOHOL PAST THIS POINT
-// WOOO!
-
-
-/datum/reagent/ethanol/synthanol
- name = "Synthanol"
- id = "synthanol"
- description = "A runny liquid with conductive capacities. Its effects on synthetics are similar to those of alcohol on organics."
- reagent_state = LIQUID
- color = "#1BB1FF"
- process_flags = ORGANIC | SYNTHETIC
- metabolization_rate = 0.4
- alcohol_perc = 0.5
-
-/datum/chemical_reaction/synthanol
- name = "Synthanol"
- id = "synthanol"
- result = "synthanol"
- required_reagents = list("lube" = 1, "plasma" = 1, "fuel" = 1)
- result_amount = 3
- mix_message = "The chemicals mix to create shiny, blue substance."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/ethanol/synthanol/on_mob_life(mob/living/M)
- if(!M.isSynthetic())
- holder.remove_reagent(id, 3.6) //gets removed from organics very fast
- if(prob(25))
- holder.remove_reagent(id, 15)
- M.fakevomit()
- ..()
-
-/datum/reagent/ethanol/synthanol/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(M.isSynthetic())
- return
- if(method == INGEST)
- to_chat(M, pick("That was awful!", "Yuck!"))
-
-/datum/reagent/ethanol/synthanol/robottears
- name = "Robot Tears"
- id = "robottears"
- description = "An oily substance that an IPC could technically consider a 'drink'."
- reagent_state = LIQUID
- color = "#363636"
- alcohol_perc = 0.25
-
-/datum/chemical_reaction/synthanol/robottears
- name = "Robot Tears"
- id = "robottears"
- result = "robottears"
- required_reagents = list("synthanol" = 1, "oil" = 1, "sodawater" = 1)
- result_amount = 3
- mix_message = "The ingredients combine into a stiff, dark goo."
-
-/datum/reagent/ethanol/synthanol/trinary
- name = "Trinary"
- id = "trinary"
- description = "A fruit drink meant only for synthetics, however that works."
- reagent_state = LIQUID
- color = "#adb21f"
- alcohol_perc = 0.2
-
-/datum/chemical_reaction/synthanol/trinary
- name = "Trinary"
- id = "trinary"
- result = "trinary"
- required_reagents = list("synthanol" = 1, "limejuice" = 1, "orangejuice" = 1)
- result_amount = 3
- mix_message = "The ingredients mix into a colorful substance."
-
-/datum/reagent/ethanol/synthanol/servo
- name = "Servo"
- id = "servo"
- description = "A drink containing some organic ingredients, but meant only for synthetics."
- reagent_state = LIQUID
- color = "#5b3210"
- alcohol_perc = 0.25
-
-/datum/chemical_reaction/synthanol/servo
- name = "Servo"
- id = "servo"
- result = "servo"
- required_reagents = list("synthanol" = 2, "cream" = 1, "hot_coco" = 1)
- result_amount = 4
- mix_message = "The ingredients mix into a dark brown substance."
-
-/datum/reagent/ethanol/synthanol/uplink
- name = "Uplink"
- id = "uplink"
- description = "A potent mix of alcohol and synthanol. Will only work on synthetics."
- reagent_state = LIQUID
- color = "#e7ae04"
- alcohol_perc = 0.15
-
-/datum/chemical_reaction/synthanol/uplink
- name = "Uplink"
- id = "uplink"
- result = "uplink"
- required_reagents = list("rum" = 1, "vodka" = 1, "tequila" = 1, "whiskey" = 1, "synthanol" = 1)
- result_amount = 5
- mix_message = "The chemicals mix to create a shiny, orange substance."
-
-/datum/reagent/ethanol/synthanol/synthnsoda
- name = "Synth 'n Soda"
- id = "synthnsoda"
- description = "The classic drink adjusted for a robot's tastes."
- reagent_state = LIQUID
- color = "#7204e7"
- alcohol_perc = 0.25
-
-/datum/chemical_reaction/synthanol/synthnsoda
- name = "Synth 'n Soda"
- id = "synthnsoda"
- result = "synthnsoda"
- required_reagents = list("synthanol" = 1, "cola" = 1)
- result_amount = 2
- mix_message = "The chemicals mix to create a smooth, fizzy substance."
-
-/datum/reagent/ethanol/synthanol/synthignon
- name = "Synthignon"
- id = "synthignon"
- description = "Someone mixed wine and alcohol for robots. Hope you're proud of yourself."
- reagent_state = LIQUID
- color = "#d004e7"
- alcohol_perc = 0.25
-
-/datum/chemical_reaction/synthanol/synthignon
- name = "Synthignon"
- id = "synthignon"
- result = "synthignon"
- required_reagents = list("synthanol" = 1, "wine" = 1)
- result_amount = 2
- mix_message = "The chemicals mix to create a fine, red substance."
-
-// ROBOT ALCOHOL ENDS
diff --git a/code/modules/reagents/newchem/food.dm b/code/modules/reagents/newchem/food.dm
deleted file mode 100644
index 7f529b6b815..00000000000
--- a/code/modules/reagents/newchem/food.dm
+++ /dev/null
@@ -1,557 +0,0 @@
-/datum/reagent/questionmark // food poisoning
- name = "????"
- id = "????"
- description = "A gross and unidentifiable substance."
- reagent_state = LIQUID
- color = "#63DE63"
- metabolization_rate = 0.4
-
-/datum/reagent/questionmark/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == INGEST)
- M.Stun(2)
- M.Weaken(2)
- to_chat(M, "Ugh! Eating that was a terrible idea!")
- M.ForceContractDisease(new /datum/disease/food_poisoning(0))
-
-/datum/reagent/egg
- name = "Egg"
- id = "egg"
- description = "A runny and viscous mixture of clear and yellow fluids."
- reagent_state = LIQUID
- color = "#F0C814"
-
-/datum/reagent/egg/on_mob_life(mob/living/M)
- if(prob(8))
- M.emote("fart")
- if(prob(3))
- M.reagents.add_reagent("cholesterol", rand(1,2))
- ..()
-
-/datum/reagent/triple_citrus
- name = "Triple Citrus"
- id = "triple_citrus"
- description = "A refreshing mixed drink of orange, lemon and lime juice."
- reagent_state = LIQUID
- color = "#23A046"
-
-/datum/chemical_reaction/triple_citrus
- name = "triple_citrus"
- id = "triple_citrus"
- result = "triple_citrus"
- required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1)
- result_amount = 3
- mix_message = "The citrus juices begin to blend together."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/triple_citrus/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == INGEST)
- M.adjustToxLoss(-rand(1,2))
-
-/datum/reagent/corn_starch
- name = "Corn Starch"
- id = "corn_starch"
- description = "The powdered starch of maize, derived from the kernel's endosperm. Used as a thickener for gravies and puddings."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-/datum/chemical_reaction/corn_syrup
- name = "corn_syrup"
- id = "corn_syrup"
- result = "corn_syrup"
- required_reagents = list("corn_starch" = 1, "sacid" = 1)
- result_amount = 2
- min_temp = 374
- mix_message = "The mixture forms a viscous, clear fluid!"
-
-/datum/reagent/corn_syrup
- name = "Corn Syrup"
- id = "corn_syrup"
- description = "A sweet syrup derived from corn starch that has had its starches converted into maltose and other sugars."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-/datum/reagent/corn_syrup/on_mob_life(mob/living/M)
- M.reagents.add_reagent("sugar", 1.2)
- ..()
-
-/datum/chemical_reaction/vhfcs
- name = "vhfcs"
- id = "vhfcs"
- result = "vhfcs"
- required_reagents = list("corn_syrup" = 1)
- required_catalysts = list("enzyme" = 1)
- result_amount = 1
- mix_message = "The mixture emits a sickly-sweet smell."
-
-/datum/reagent/vhfcs
- name = "Very-high-fructose corn syrup"
- id = "vhfcs"
- description = "An incredibly sweet syrup, created from corn syrup treated with enzymes to convert its sugars into fructose."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-/datum/reagent/vhfcs/on_mob_life(mob/living/M)
- M.reagents.add_reagent("sugar", 2.4)
- ..()
-
-/datum/chemical_reaction/cola
- name = "cola"
- id = "cola"
- result = "cola"
- required_reagents = list("carbon" = 1, "oxygen" = 1, "water" = 1, "sugar" = 1)
- result_amount = 4
- mix_message = "The mixture begins to fizz."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/reagent/honey
- name = "Honey"
- id = "honey"
- description = "A sweet substance produced by bees through partial digestion. Bee barf."
- reagent_state = LIQUID
- color = "#d3a308"
-
-/datum/reagent/honey/on_mob_life(mob/living/M)
- M.reagents.add_reagent("sugar", 0.4)
- if(prob(20))
- M.heal_organ_damage(3,1)
- ..()
-
-/datum/reagent/chocolate
- name = "Chocolate"
- id = "chocolate"
- description = "Chocolate is a delightful product derived from the seeds of the theobroma cacao tree."
- reagent_state = LIQUID
- nutriment_factor = 5 * REAGENTS_METABOLISM //same as pure cocoa powder, because it makes no sense that chocolate won't fill you up and make you fat
- color = "#2E2418"
-
-/datum/reagent/chocolate/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- M.reagents.add_reagent("sugar", 0.8)
- ..()
-
-/datum/reagent/chocolate/reaction_turf(turf/T, volume)
- if(volume >= 5 && !istype(T, /turf/space))
- new /obj/item/weapon/reagent_containers/food/snacks/choc_pile(T)
-
-/datum/reagent/mugwort
- name = "Mugwort"
- id = "mugwort"
- description = "A rather bitter herb once thought to hold magical protective properties."
- reagent_state = LIQUID
- color = "#21170E"
-
-/datum/reagent/mugwort/on_mob_life(mob/living/M)
- if(ishuman(M) && M.mind)
- if(M.mind.special_role == SPECIAL_ROLE_WIZARD)
- M.adjustToxLoss(-1*REM)
- M.adjustOxyLoss(-1*REM)
- M.adjustBruteLoss(-1*REM)
- M.adjustFireLoss(-1*REM)
- ..()
-
-/datum/reagent/porktonium
- name = "Porktonium"
- id = "porktonium"
- description = "A highly-radioactive pork byproduct first discovered in hotdogs."
- reagent_state = LIQUID
- color = "#AB5D5D"
- metabolization_rate = 0.2
- overdose_threshold = 133
-
-/datum/reagent/porktonium/overdose_process(mob/living/M, severity)
- if(prob(15))
- M.reagents.add_reagent("cholesterol", rand(1,3))
- if(prob(8))
- M.reagents.add_reagent("radium", 15)
- M.reagents.add_reagent("cyanide", 10)
-
-/datum/reagent/fungus
- name = "Space fungus"
- id = "fungus"
- description = "Scrapings of some unknown fungus found growing on the station walls."
- reagent_state = LIQUID
- color = "#C87D28"
-
-/datum/reagent/fungus/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == INGEST)
- var/ranchance = rand(1,10)
- if(ranchance == 1)
- to_chat(M, "You feel very sick.")
- M.reagents.add_reagent("toxin", rand(1,5))
- else if(ranchance <= 5)
- to_chat(M, "That tasted absolutely FOUL.")
- M.ForceContractDisease(new /datum/disease/food_poisoning(0))
- else
- to_chat(M, "Yuck!")
-
-/datum/reagent/chicken_soup
- name = "Chicken soup"
- id = "chicken_soup"
- description = "An old household remedy for mild illnesses."
- reagent_state = LIQUID
- color = "#B4B400"
- metabolization_rate = 0.2
-
-/datum/reagent/chicken_soup/on_mob_life(mob/living/M)
- M.nutrition += 2
- ..()
-
-/datum/reagent/msg
- name = "Monosodium glutamate"
- id = "msg"
- description = "Monosodium Glutamate is a sodium salt known chiefly for its use as a controversial flavor enhancer."
- reagent_state = LIQUID
- color = "#F5F5F5"
- metabolization_rate = 0.2
-
-/datum/reagent/msg/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == INGEST)
- to_chat(M, "That tasted amazing!")
-
-
-/datum/reagent/msg/on_mob_life(mob/living/M)
- if(prob(5))
- if(prob(10))
- M.adjustToxLoss(rand(2.4))
- if(prob(7))
- to_chat(M, "A horrible migraine overpowers you.")
- M.Stun(rand(2,5))
- ..()
-
-/datum/reagent/cheese
- name = "Cheese"
- id = "cheese"
- description = "Some cheese. Pour it out to make it solid."
- reagent_state = SOLID
- color = "#FFFF00"
- metabolization_rate = 0 //heheheh
-
-
-/datum/reagent/cheese/on_mob_life(mob/living/M)
- if(prob(3))
- M.reagents.add_reagent("cholesterol", rand(1,2))
- ..()
-
-/datum/reagent/cheese/reaction_turf(turf/T, volume)
- if(volume >= 5 && !istype(T, /turf/space))
- new /obj/item/weapon/reagent_containers/food/snacks/cheesewedge(T)
-
-/datum/chemical_reaction/cheese
- name = "cheese"
- id = "cheese"
- result = "cheese"
- required_reagents = list("vomit" = 1, "milk" = 1)
- result_amount = 1
- mix_message = "The mixture curdles up."
-
-/datum/chemical_reaction/cheese/on_reaction(datum/reagents/holder)
- var/turf/T = get_turf(holder.my_atom)
- T.visible_message("A faint cheesy smell drifts through the air...")
-
-/datum/reagent/fake_cheese
- name = "Cheese substitute"
- id = "fake_cheese"
- description = "A cheese-like substance derived loosely from actual cheese."
- reagent_state = LIQUID
- color = "#B2B139"
- overdose_threshold = 50
-
-/datum/reagent/fake_cheese/overdose_process(mob/living/M, severity)
- if(prob(8))
- to_chat(M, "You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat.")
- M.adjustToxLoss(rand(1,2))
-
-/datum/reagent/weird_cheese
- name = "Weird cheese"
- id = "weird_cheese"
- description = "Hell, I don't even know if this IS cheese. Whatever it is, it ain't normal. If you want to, pour it out to make it solid."
- reagent_state = SOLID
- color = "#50FF00"
- metabolization_rate = 0 //heheheh
- addiction_chance = 5
-
-/datum/reagent/weird_cheese/on_mob_life(mob/living/M)
- if(prob(5))
- M.reagents.add_reagent("cholesterol", rand(1,3))
- ..()
-
-/datum/reagent/weird_cheese/reaction_turf(turf/T, volume)
- if(volume >= 5 && !istype(T, /turf/space))
- new /obj/item/weapon/reagent_containers/food/snacks/weirdcheesewedge(T)
-
-/datum/chemical_reaction/weird_cheese
- name = "Weird cheese"
- id = "weird_cheese"
- result = "weird_cheese"
- required_reagents = list("green_vomit" = 1, "milk" = 1)
- result_amount = 1
- mix_message = "The disgusting mixture sloughs together horribly, emitting a foul stench."
- mix_sound = 'sound/goonstation/misc/gurggle.ogg'
-
-/datum/chemical_reaction/weird_cheese/on_reaction(datum/reagents/holder)
- var/turf/T = get_turf(holder.my_atom)
- T.visible_message("A horrible smell assaults your nose! What in space is it?")
-
-/datum/reagent/beans
- name = "Refried beans"
- id = "beans"
- description = "A dish made of mashed beans cooked with lard."
- reagent_state = LIQUID
- color = "#684435"
-
-/datum/reagent/beans/on_mob_life(mob/living/M)
- if(prob(10))
- M.emote("fart")
- ..()
-
-/datum/reagent/bread
- name = "Bread"
- id = "bread"
- description = "Bread! Yep, bread."
- reagent_state = SOLID
- color = "#9C5013"
-
-/datum/reagent/bread/reaction_turf(turf/T, volume)
- if(volume >= 5 && !istype(T, /turf/space))
- new /obj/item/weapon/reagent_containers/food/snacks/breadslice(T)
-
-/datum/reagent/vomit
- name = "Vomit"
- id = "vomit"
- description = "Looks like someone lost their lunch. And then collected it. Yuck."
- reagent_state = LIQUID
- color = "#FFFF00"
-
-/datum/reagent/vomit/reaction_turf(turf/T, volume)
- if(volume >= 5 && !istype(T, /turf/space))
- new /obj/effect/decal/cleanable/vomit(T)
- playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
-
-/datum/reagent/greenvomit
- name = "Green vomit"
- id = "green_vomit"
- description = "Whoa, that can't be natural. That's horrible."
- reagent_state = LIQUID
- color = "#78FF74"
-
-/datum/reagent/greenvomit/reaction_turf(turf/T, volume)
- if(volume >= 5 && !istype(T, /turf/space))
- new /obj/effect/decal/cleanable/vomit/green(T)
- playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
-
-
-/datum/reagent/ectoplasm
- name = "Ectoplasm"
- id = "ectoplasm"
- description = "A bizarre gelatinous substance supposedly derived from ghosts."
- reagent_state = LIQUID
- color = "#8EAE7B"
- process_flags = ORGANIC | SYNTHETIC //Because apparently ghosts in the shell
-
-/datum/reagent/ectoplasm/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == INGEST)
- var/spooky_eat = pick("Ugh, why did you eat that? Your mouth feels haunted. Haunted with bad flavors.", "Ugh, why did you eat that? It has the texture of ham aspic. From the 1950s. Left out in the sun.", "Ugh, why did you eat that? It tastes like a ghost fart.", "Ugh, why did you eat that? It tastes like flavor died.")
- to_chat(M, "[spooky_eat]")
-
-/datum/reagent/ectoplasm/on_mob_life(mob/living/M)
- var/spooky_message = pick("You notice something moving out of the corner of your eye, but nothing is there...", "Your eyes twitch, you feel like something you can't see is here...", "You've got the heebie-jeebies.", "You feel uneasy.", "You shudder as if cold...", "You feel something gliding across your back...")
- if(prob(8))
- to_chat(M, "[spooky_message]")
- ..()
-
-/datum/reagent/ectoplasm/reaction_turf(turf/T, volume)
- if(volume >= 10 && !istype(T, /turf/space))
- new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm(T)
-
-/datum/reagent/soybeanoil
- name = "Space-soybean oil"
- id = "soybeanoil"
- description = "An oil derived from extra-terrestrial soybeans."
- reagent_state = LIQUID
- color = "#B1B0B0"
-
-/datum/reagent/soybeanoil/on_mob_life(mob/living/M)
- if(prob(10))
- M.reagents.add_reagent("cholesterol", rand(1,3))
- if(prob(8))
- M.reagents.add_reagent("porktonium", 5)
- ..()
-
-/datum/reagent/hydrogenated_soybeanoil
- name = "Partially hydrogenated space-soybean oil"
- id = "hydrogenated_soybeanoil"
- description = "An oil derived from extra-terrestrial soybeans, with additional hydrogen atoms added to convert it into a saturated form."
- reagent_state = LIQUID
- color = "#B1B0B0"
- metabolization_rate = 0.2
- overdose_threshold = 75
-
-/datum/reagent/hydrogenated_soybeanoil/on_mob_life(mob/living/M)
- if(prob(15))
- M.reagents.add_reagent("cholesterol", rand(1,3))
- if(prob(8))
- M.reagents.add_reagent("porktonium", 5)
- if(volume >= 75)
- metabolization_rate = 0.4
- else
- metabolization_rate = 0.2
- ..()
-
-/datum/reagent/hydrogenated_soybeanoil/overdose_process(mob/living/M, severity)
- if(prob(33))
- to_chat(M, "You feel horribly weak.")
- if(prob(10))
- to_chat(M, "You cannot breathe!")
- M.adjustOxyLoss(5)
- if(prob(5))
- to_chat(M, "You feel a sharp pain in your chest!")
- M.adjustOxyLoss(25)
- M.Stun(5)
- M.Paralyse(10)
-
-/datum/chemical_reaction/hydrogenated_soybeanoil
- name = "Partially hydrogenated space-soybean oil"
- id = "hydrogenated_soybeanoil"
- result = "hydrogenated_soybeanoil"
- required_reagents = list("soybeanoil" = 1, "hydrogen" = 1)
- result_amount = 2
- min_temp = 520
- mix_message = "The mixture emits a burnt, oily smell."
-
-/datum/reagent/meatslurry
- name = "Meat Slurry"
- id = "meatslurry"
- description = "A paste comprised of highly-processed organic material. Uncomfortably similar to deviled ham spread."
- reagent_state = LIQUID
- color = "#EBD7D7"
-
-/datum/reagent/meatslurry/on_mob_life(mob/living/M)
- if(prob(4))
- M.reagents.add_reagent("cholesterol", rand(1,3))
- ..()
-
-/datum/reagent/meatslurry/reaction_turf(turf/T, volume)
- if(volume >= 5 && prob(10) && !istype(T, /turf/space))
- new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
- playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
-
-/datum/chemical_reaction/meatslurry
- name = "Meat Slurry"
- id = "meatslurry"
- result = "meatslurry"
- required_reagents = list("corn_starch" = 1, "blood" = 1)
- result_amount = 2
- mix_message = "The mixture congeals into a bloody mass."
- mix_sound = 'sound/effects/blobattack.ogg'
-
-/datum/reagent/mashedpotatoes
- name = "Mashed potatoes"
- id = "mashedpotatoes"
- description = "A starchy food paste made from boiled potatoes."
- reagent_state = SOLID
- color = "#D6D9C1"
-
-/datum/reagent/gravy
- name = "Gravy"
- id = "gravy"
- description = "A savory sauce made from a simple meat-dripping roux and milk."
- reagent_state = LIQUID
- color = "#B4641B"
-
-/datum/chemical_reaction/gravy
- name = "Gravy"
- id = "gravy"
- result = "gravy"
- required_reagents = list("porktonium" = 1, "corn_starch" = 1, "milk" = 1)
- result_amount = 3
- min_temp = 374
- mix_message = "The substance thickens and takes on a meaty odor."
-
-/datum/reagent/beff
- name = "Beff"
- id = "beff"
- description = "An advanced blend of mechanically-recovered meat and textured synthesized protein product notable for its unusual crystalline grain when sliced."
- reagent_state = SOLID
- color = "#AC7E67"
-
-/datum/reagent/beff/on_mob_life(mob/living/M)
- if(prob(5))
- M.reagents.add_reagent("cholesterol", rand(1,3))
- if(prob(8))
- M.reagents.add_reagent(pick("blood", "corn_syrup", "synthflesh", "hydrogenated_soybeanoil", "porktonium", "toxic_slurry"), 0.8)
- else if(prob(6))
- to_chat(M, "[pick("You feel ill.","Your stomach churns.","You feel queasy.","You feel sick.")]")
- M.emote(pick("groan","moan"))
- ..()
-
-/datum/chemical_reaction/beff
- name = "Beff"
- id = "beff"
- result = "beff"
- required_reagents = list("hydrogenated_soybeanoil" = 2, "meatslurry" = 1, "plasma" = 1)
- result_amount = 4
- mix_message = "The mixture solidifies, taking a crystalline appearance."
- mix_sound = 'sound/effects/blobattack.ogg'
-
-/datum/reagent/pepperoni
- name = "Pepperoni"
- id = "pepperoni"
- description = "An Italian-American variety of salami usually made from beef and pork"
- reagent_state = SOLID
- color = "#AC7E67"
-
-/datum/reagent/pepperoni/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == TOUCH)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
-
- if(H.wear_mask)
- to_chat(H, "The pepperoni bounces off your mask!")
- return
-
- if(H.head)
- to_chat(H, "Your mask protects you from the errant pepperoni!")
- return
-
- if(prob(50))
- M.adjustBruteLoss(1)
- playsound(M, 'sound/effects/woodhit.ogg', 50, 1)
- to_chat(M, "A slice of pepperoni slaps you!")
- else
- M.emote("burp")
- to_chat(M, "My goodness, that was tasty!")
-
-
-/datum/chemical_reaction/pepperoni
- name = "Pepperoni"
- id = "pepperoni"
- result = "pepperoni"
- required_reagents = list("beff" = 1, "saltpetre" = 1, "synthflesh" = 1)
- result_amount = 2
- mix_message = "The beff and the synthflesh combine to form a smoky red log."
- mix_sound = 'sound/effects/blobattack.ogg'
-
-/datum/reagent/cholesterol
- name = "cholesterol"
- id = "cholesterol"
- description = "Pure cholesterol. Probably not very good for you."
- reagent_state = LIQUID
- color = "#FFFAC8"
-
-/datum/reagent/cholesterol/on_mob_life(mob/living/M)
- if(volume >= 25 && prob(volume*0.15))
- to_chat(M, "Your chest feels [pick("weird","uncomfortable","nasty","gross","odd","unusual","warm")]!")
- M.adjustToxLoss(rand(1,2))
- else if(volume >= 45 && prob(volume*0.08))
- to_chat(M, "Your chest [pick("hurts","stings","aches","burns")]!")
- M.adjustToxLoss(rand(2,4))
- M.Stun(1)
- else if(volume >= 150 && prob(volume*0.01))
- to_chat(M, "Your chest is burning with pain!")
- M.Stun(1)
- M.Weaken(1)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(!H.heart_attack)
- H.heart_attack = 1
- ..()
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm
deleted file mode 100644
index 7ad083407d9..00000000000
--- a/code/modules/reagents/newchem/newchem_procs.dm
+++ /dev/null
@@ -1,212 +0,0 @@
-#define ADDICTION_TIME 4800 //8 minutes
-
-/datum/reagent
- var/overdose_threshold = 0
- var/addiction_chance = 0
- var/addiction_stage = 1
- var/last_addiction_dose = 0
- var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick.
- var/current_cycle = 1
-
-/datum/reagents/proc/metabolize(mob/living/M)
- if(M)
- chem_temp = M.bodytemperature
- handle_reactions()
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if(!istype(R)) // How are non-reagents ending up in the reagents_list?
- continue
- if(!R.holder)
- continue
- if(!M)
- M = R.holder.my_atom
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- //Check if this mob's species is set and can process this type of reagent
- var/can_process = 0
- //If we somehow avoided getting a species or reagent_tag set, we'll assume we aren't meant to process ANY reagents (CODERS: SET YOUR SPECIES AND TAG!)
- if(H.species && H.species.reagent_tag)
- if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
- can_process = 1
- if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
- can_process = 1
- //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
- if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
- can_process = 1
-
- //If handle_reagents returns 0, it's doing the reagent removal on its own
- var/species_handled = !(H.species.handle_reagents(H, R))
- can_process = can_process && !species_handled
- //If the mob can't process it, remove the reagent at it's normal rate without doing any addictions, overdoses, or on_mob_life() for the reagent
- if(can_process == 0)
- if(!species_handled)
- R.holder.remove_reagent(R.id, R.metabolization_rate)
- continue
- //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
- else
- if(R.process_flags == SYNTHETIC)
- R.holder.remove_reagent(R.id, R.metabolization_rate)
- continue
- //If you got this far, that means we can process whatever reagent this iteration is for. Handle things normally from here.
- if(M && R)
- R.on_mob_life(M)
- if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0)
- R.overdosed = 1
- R.overdose_start(M)
- if(R.volume < R.overdose_threshold && R.overdosed)
- R.overdosed = 0
- if(R.overdosed)
- R.overdose_process(M, R.volume >= R.overdose_threshold*2 ? 2 : 1)
-
- for(var/A in addiction_list)
- var/datum/reagent/R = A
- if(M && R)
- if(R.addiction_stage < 5)
- if(prob(5))
- R.addiction_stage++
- switch(R.addiction_stage)
- if(1)
- R.addiction_act_stage1(M)
- if(2)
- R.addiction_act_stage2(M)
- if(3)
- R.addiction_act_stage3(M)
- if(4)
- R.addiction_act_stage4(M)
- if(5)
- R.addiction_act_stage5(M)
- if(prob(20) && (world.timeofday > (R.last_addiction_dose + ADDICTION_TIME))) //Each addiction lasts 8 minutes before it can end
- to_chat(M, "You no longer feel reliant on [R.name]!")
- addiction_list.Remove(R)
- update_total()
-
-/datum/reagents/proc/death_metabolize(mob/living/M)
- if(!M)
- return
- if(M.stat != DEAD) //what part of DEATH_metabolize don't you get?
- return
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if(!istype(R))
- continue
- if(M && R)
- R.on_mob_death(M)
-
-/datum/reagents/proc/overdose_list()
- var/od_chems[0]
- for(var/datum/reagent/R in reagent_list)
- if(R.overdosed)
- od_chems.Add(R.id)
- return od_chems
-
-
-/datum/reagents/proc/reagent_on_tick()
- for(var/datum/reagent/R in reagent_list)
- R.on_tick()
- return
-
-// Called every time reagent containers process.
-/datum/reagent/proc/on_tick(data)
- return
-
-// Called when the reagent container is hit by an explosion
-/datum/reagent/proc/on_ex_act(severity)
- return
-
-// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects
-/datum/reagent/proc/overdose_process(mob/living/M, severity)
- var/effect = rand(1, 100) - severity
- if(effect <= 8)
- M.adjustToxLoss(severity)
- return effect
-
-/datum/reagent/proc/overdose_start(mob/living/M)
- return
-
-/datum/reagent/proc/addiction_act_stage1(mob/living/M)
- return
-
-/datum/reagent/proc/addiction_act_stage2(mob/living/M)
- if(prob(8))
- M.emote("shiver")
- if(prob(8))
- M.emote("sneeze")
- if(prob(4))
- to_chat(M, "You feel a dull headache.")
-
-/datum/reagent/proc/addiction_act_stage3(mob/living/M)
- if(prob(8))
- M.emote("twitch_s")
- if(prob(8))
- M.emote("shiver")
- if(prob(4))
- to_chat(M, "You begin craving [name]!")
-
-/datum/reagent/proc/addiction_act_stage4(mob/living/M)
- if(prob(8))
- M.emote("twitch")
- if(prob(4))
- to_chat(M, "You have the strong urge for some [name]!")
- if(prob(4))
- to_chat(M, "You REALLY crave some [name]!")
-
-/datum/reagent/proc/addiction_act_stage5(mob/living/M)
- if(prob(8))
- M.emote("twitch")
- if(prob(6))
- to_chat(M, "Your stomach lurches painfully!")
- M.visible_message("[M] gags and retches!")
- M.Stun(rand(2,4))
- M.Weaken(rand(2,4))
- if(prob(5))
- to_chat(M, "You feel like you can't live without [name]!")
- if(prob(5))
- to_chat(M, "You would DIE for some [name] right now!")
-
-/datum/reagent/proc/reagent_deleted()
- return
-
-var/list/chemical_mob_spawn_meancritters = list() // list of possible hostile mobs
-var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs
-/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon")
- if(holder && holder.my_atom)
- if(chemical_mob_spawn_meancritters.len <= 0 || chemical_mob_spawn_nicecritters.len <= 0)
- for(var/T in typesof(/mob/living/simple_animal))
- var/mob/living/simple_animal/SA = T
- switch(initial(SA.gold_core_spawnable))
- if(CHEM_MOB_SPAWN_HOSTILE)
- chemical_mob_spawn_meancritters += T
- if(CHEM_MOB_SPAWN_FRIENDLY)
- chemical_mob_spawn_nicecritters += T
- var/atom/A = holder.my_atom
- var/turf/T = get_turf(A)
- var/area/my_area = get_area(T)
- var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)"
- message += " (VV)"
-
- var/mob/M = get(A, /mob)
- if(M)
- message += " - Carried By: [key_name_admin(M)](?) (FLW)"
- else
- message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
-
- message_admins(message, 0, 1)
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
- C.flash_eyes()
- for(var/i = 1, i <= amount_to_spawn, i++)
- var/chosen
- if(reaction_name == "Friendly Gold Slime")
- chosen = pick(chemical_mob_spawn_nicecritters)
- else
- chosen = pick(chemical_mob_spawn_meancritters)
- var/mob/living/simple_animal/C = new chosen
- C.faction |= mob_faction
- C.forceMove(get_turf(holder.my_atom))
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(C, pick(NORTH,SOUTH,EAST,WEST))
-
-#undef ADDICTION_TIME
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm b/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm
deleted file mode 100644
index 3b4cc507415..00000000000
--- a/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-/datum/chemical_reaction
- var/name = null
- var/id = null
- var/result = null
- var/list/required_reagents = list()
- var/list/required_catalysts = list()
-
- // Both of these variables are mostly going to be used with slime cores - but if you want to, you can use them for other things
- var/atom/required_container = null // the container required for the reaction to happen
- var/required_other = 0 // an integer required for the reaction to happen
-
- var/result_amount = 0
- var/secondary = 0 // set to nonzero if secondary reaction
- var/list/secondary_results = list() //additional reagents produced by the reaction
- var/min_temp = 0 //Minimum temperature required for the reaction to occur (heat to/above this). min_temp = 0 means no requirement
- var/max_temp = 9999 //Maximum temperature allowed for the reaction to occur (cool to/below this).
- var/mix_message = "The solution begins to bubble."
- var/mix_sound = 'sound/effects/bubbles.ogg'
- var/no_message = 0
-
-/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume)
- return
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm
deleted file mode 100644
index afcd0d398ce..00000000000
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm
+++ /dev/null
@@ -1,71 +0,0 @@
-//Anything for harm or hostile intents go here (explosions, EMPs, thermite, mutagen)
-/datum/chemical_reaction/explosion_potassium
- name = "Explosion"
- id = "explosion_potassium"
- result = null
- required_reagents = list("water" = 1, "potassium" = 1)
- result_amount = 2
- mix_message = "The mixture explodes!"
-
-/datum/chemical_reaction/explosion_potassium/on_reaction(datum/reagents/holder, created_volume)
- var/datum/effect/system/reagents_explosion/e = new()
- e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0)
- e.start()
- holder.clear_reagents()
-
-/datum/chemical_reaction/emp_pulse
- name = "EMP Pulse"
- id = "emp_pulse"
- result = null
- required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense
- result_amount = 2
-
-/datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
- // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
- // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
- empulse(location, round(created_volume / 24), round(created_volume / 14), 1)
- holder.clear_reagents()
-
-/datum/chemical_reaction/mutagen
- name = "Unstable mutagen"
- id = "mutagen"
- result = "mutagen"
- required_reagents = list("radium" = 1, "plasma" = 1, "chlorine" = 1)
- result_amount = 3
- mix_message = "The substance turns neon green and bubbles unnervingly."
-
-/datum/chemical_reaction/thermite
- name = "Thermite"
- id = "thermite"
- result = "thermite"
- required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/glycerol
- name = "Glycerol"
- id = "glycerol"
- result = "glycerol"
- required_reagents = list("cornoil" = 3, "sacid" = 1)
- result_amount = 1
-
-/datum/chemical_reaction/nitroglycerin
- name = "Nitroglycerin"
- id = "nitroglycerin"
- result = "nitroglycerin"
- required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/nitroglycerin/on_reaction(datum/reagents/holder, created_volume)
- var/datum/effect/system/reagents_explosion/e = new()
- e.set_up(round(created_volume/2, 1), holder.my_atom, 0, 0)
- e.start()
- holder.clear_reagents()
-
-/datum/chemical_reaction/condensedcapsaicin
- name = "Condensed Capsaicin"
- id = "condensedcapsaicin"
- result = "condensedcapsaicin"
- required_reagents = list("capsaicin" = 2)
- required_catalysts = list("plasma" = 5)
- result_amount = 1
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm
deleted file mode 100644
index 0550813849c..00000000000
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-/datum/chemical_reaction/hydrocodone
- name = "Hydrocodone"
- id = "hydrocodone"
- result = "hydrocodone"
- required_reagents = list("morphine" = 1, "sacid" = 1, "water" = 1, "oil" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/mitocholide
- name = "mitocholide"
- id = "mitocholide"
- result = "mitocholide"
- required_reagents = list("synthflesh" = 1, "cryoxadone" = 1, "plasma" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/cryoxadone
- name = "Cryoxadone"
- id = "cryoxadone"
- result = "cryoxadone"
- required_reagents = list("cryostylane" = 1, "plasma" = 1, "acetone" = 1, "mutagen" = 1)
- result_amount = 4
- mix_message = "The solution bubbles softly."
- mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-
-/datum/chemical_reaction/spaceacillin
- name = "Spaceacillin"
- id = "spaceacillin"
- result = "spaceacillin"
- required_reagents = list("fungus" = 1, "ethanol" = 1)
- result_amount = 2
- mix_message = "The solvent extracts an antibiotic compound from the fungus."
-
-/datum/chemical_reaction/rezadone
- name = "Rezadone"
- id = "rezadone"
- result = "rezadone"
- required_reagents = list("carpotoxin" = 1, "spaceacillin" = 1, "copper" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/sterilizine
- name = "Sterilizine"
- id = "sterilizine"
- result = "sterilizine"
- required_reagents = list("antihol" = 2, "chlorine" = 1)
- result_amount = 3
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm
deleted file mode 100644
index 8a5dedf218b..00000000000
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm
+++ /dev/null
@@ -1,147 +0,0 @@
-// foam and foam precursor
-
-/datum/chemical_reaction/surfactant
- name = "Foam surfactant"
- id = "foam surfactant"
- result = "fluorosurfactant"
- required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1)
- result_amount = 5
- mix_message = "A head of foam results from the mixture's constant fizzing."
-
-/datum/chemical_reaction/foam
- name = "Foam"
- id = "foam"
- result = null
- required_reagents = list("fluorosurfactant" = 1, "water" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
- holder.my_atom.visible_message("The solution spews out foam!")
-
- var/datum/effect/system/foam_spread/s = new()
- s.set_up(created_volume, location, holder, 0)
- s.start()
- holder.clear_reagents()
-
-
-/datum/chemical_reaction/metalfoam
- name = "Metal Foam"
- id = "metalfoam"
- result = null
- required_reagents = list("aluminum" = 3, "fluorosurfactant" = 1, "sacid" = 1)
- result_amount = 5
-
-/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
-
- holder.my_atom.visible_message("The solution spews out a metalic foam!")
-
- var/datum/effect/system/foam_spread/s = new()
- s.set_up(created_volume, location, holder, MFOAM_ALUMINUM)
- s.start()
-
-
-/datum/chemical_reaction/ironfoam
- name = "Iron Foam"
- id = "ironlfoam"
- result = null
- required_reagents = list("iron" = 3, "fluorosurfactant" = 1, "sacid" = 1)
- result_amount = 5
-
-/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
-
- holder.my_atom.visible_message("= 5)
- var/obj/item/weapon/book/affectedbook = O
- affectedbook.dat = null
- to_chat(usr, "The solution melts away the ink on the book.")
- else
- to_chat(usr, "It wasn't enough...")
-
-/datum/reagent/ethanol/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with ethanol isn't quite as good as fuel.
- if(method == TOUCH)
- M.adjust_fire_stacks(volume / 15)
-
-
-/datum/reagent/ethanol/beer
- name = "Beer"
- id = "beer"
- description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
- nutriment_factor = 2 * FOOD_METABOLISM
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/cider
- name = "Cider"
- id = "cider"
- description = "An alcoholic beverage derived from apples."
- color = "#174116"
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/whiskey
- name = "Whiskey"
- id = "whiskey"
- description = "A superb and well-aged single-malt whiskey. Damn."
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 4
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/specialwhiskey
- name = "Special Blend Whiskey"
- id = "specialwhiskey"
- description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything."
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.5
-
-/datum/reagent/ethanol/gin
- name = "Gin"
- id = "gin"
- description = "It's gin. In space. I say, good sir."
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 3
- alcohol_perc = 0.5
-
-/datum/reagent/ethanol/absinthe
- name = "Absinthe"
- id = "absinthe"
- description = "Watch out that the Green Fairy doesn't come for you!"
- color = "#33EE00" // rgb: lots, ??, ??
- overdose_threshold = 30
- dizzy_adj = 5
- alcohol_perc = 0.7
-
-//copy paste from LSD... shoot me
-/datum/reagent/ethanol/absinthe/on_mob_life(mob/living/M)
- M.hallucination += 5
- ..()
-
-/datum/reagent/ethanol/absinthe/overdose_process(mob/living/M, severity)
- M.adjustToxLoss(1)
-
-/datum/reagent/ethanol/rum
- name = "Rum"
- id = "rum"
- description = "Popular with the sailors. Not very popular with everyone else."
- color = "#664300" // rgb: 102, 67, 0
- overdose_threshold = 30
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/rum/on_mob_life(mob/living/M)
- M.dizziness +=5
- ..()
-
-/datum/reagent/ethanol/rum/overdose_process(mob/living/M, severity)
- M.adjustToxLoss(1)
-
-/datum/reagent/ethanol/mojito
- name = "Mojito"
- id = "mojito"
- description = "If it's good enough for Spesscuba, it's good enough for you."
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/vodka
- name = "Vodka"
- id = "vodka"
- description = "Number one drink AND fueling choice for Russians worldwide."
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/sake
- name = "Sake"
- id = "sake"
- description = "Anime's favorite drink."
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/tequila
- name = "Tequila"
- id = "tequila"
- description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?"
- color = "#A8B0B7" // rgb: 168, 176, 183
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/vermouth
- name = "Vermouth"
- id = "vermouth"
- description = "You suddenly feel a craving for a martini..."
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/wine
- name = "Wine"
- id = "wine"
- description = "An premium alchoholic beverage made from distilled grape juice."
- color = "#7E4043" // rgb: 126, 64, 67
- dizzy_adj = 2
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/cognac
- name = "Cognac"
- id = "cognac"
- description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication."
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 4
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/suicider //otherwise known as "I want to get so smashed my liver gives out and I die from alcohol poisoning".
- name = "Suicider"
- id = "suicider"
- description = "An unbelievably strong and potent variety of Cider."
- color = "#CF3811"
- dizzy_adj = 20
- alcohol_perc = 1 //because that's a thing it's supposed to do, I guess
-
-/datum/reagent/ethanol/ale
- name = "Ale"
- id = "ale"
- description = "A dark alchoholic beverage made by malted barley and yeast."
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.1
-
-/datum/reagent/ethanol/thirteenloko
- name = "Thirteen Loko"
- id = "thirteenloko"
- description = "A potent mixture of caffeine and alcohol."
- reagent_state = LIQUID
- color = "#102000" // rgb: 16, 32, 0
- alcohol_perc = 0.3
- heart_rate_increase = 1
-
-/datum/reagent/ethanol/thirteenloko/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- M.drowsyness = max(0, M.drowsyness-7)
- M.AdjustSleeping(-2)
- if(M.bodytemperature > 310)
- M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
- M.Jitter(5)
- ..()
-
-
-/////////////////////////////////////////////////////////////////cocktail entities//////////////////////////////////////////////
-
-/datum/reagent/ethanol/bilk
- name = "Bilk"
- id = "bilk"
- description = "This appears to be beer mixed with milk. Disgusting."
- reagent_state = LIQUID
- color = "#895C4C" // rgb: 137, 92, 76
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/atomicbomb
- name = "Atomic Bomb"
- id = "atomicbomb"
- description = "Nuclear proliferation never tasted so good."
- reagent_state = LIQUID
- color = "#666300" // rgb: 102, 99, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/threemileisland
- name = "THree Mile Island Iced Tea"
- id = "threemileisland"
- description = "Made for a woman, strong enough for a man."
- reagent_state = LIQUID
- color = "#666340" // rgb: 102, 99, 64
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/goldschlager
- name = "Goldschlager"
- id = "goldschlager"
- description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/patron
- name = "Patron"
- id = "patron"
- description = "Tequila with silver in it, a favorite of alcoholic women in the club scene."
- reagent_state = LIQUID
- color = "#585840" // rgb: 88, 88, 64
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/gintonic
- name = "Gin and Tonic"
- id = "gintonic"
- description = "An all time classic, mild cocktail."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/cuba_libre
- name = "Cuba Libre"
- id = "cubalibre"
- description = "Rum, mixed with cola. Viva la revolution."
- reagent_state = LIQUID
- color = "#3E1B00" // rgb: 62, 27, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/whiskey_cola
- name = "Whiskey Cola"
- id = "whiskeycola"
- description = "Whiskey, mixed with cola. Surprisingly refreshing."
- reagent_state = LIQUID
- color = "#3E1B00" // rgb: 62, 27, 0
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/martini
- name = "Classic Martini"
- id = "martini"
- description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.5
-
-/datum/reagent/ethanol/vodkamartini
- name = "Vodka Martini"
- id = "vodkamartini"
- description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/white_russian
- name = "White Russian"
- id = "whiterussian"
- description = "That's just, like, your opinion, man..."
- reagent_state = LIQUID
- color = "#A68340" // rgb: 166, 131, 64
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/screwdrivercocktail
- name = "Screwdriver"
- id = "screwdrivercocktail"
- description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious."
- reagent_state = LIQUID
- color = "#A68310" // rgb: 166, 131, 16
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/booger
- name = "Booger"
- id = "booger"
- description = "Ewww..."
- reagent_state = LIQUID
- color = "#A68310" // rgb: 166, 131, 16
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/bloody_mary
- name = "Bloody Mary"
- id = "bloodymary"
- description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/gargle_blaster
- name = "Pan-Galactic Gargle Blaster"
- id = "gargleblaster"
- description = "Whoah, this stuff looks volatile!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.7 //ouch
-
-/datum/reagent/ethanol/brave_bull
- name = "Brave Bull"
- id = "bravebull"
- description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/tequila_sunrise
- name = "Tequila Sunrise"
- id = "tequilasunrise"
- description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/toxins_special
- name = "Toxins Special"
- id = "toxinsspecial"
- description = "This thing is FLAMING!. CALL THE DAMN SHUTTLE!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.5
-
-/datum/reagent/ethanol/toxins_special/on_mob_life(mob/living/M)
- if(M.bodytemperature < 330)
- M.bodytemperature = min(330, M.bodytemperature + (15 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
- ..()
-
-/datum/reagent/ethanol/beepsky_smash
- name = "Beepsky Smash"
- id = "beepskysmash"
- description = "Deny drinking this and prepare for THE LAW."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.5
-
-/datum/reagent/ethanol/beepsky_smash/on_mob_life(mob/living/M)
- M.Stun(1)
- ..()
-
-/datum/reagent/ethanol/irish_cream
- name = "Irish Cream"
- id = "irishcream"
- description = "Whiskey-imbued cream, what else would you expect from the Irish."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/manly_dorf
- name = "The Manly Dorf"
- id = "manlydorf"
- description = "Beer and Ale, brought together in a delicious mix. Intended for true men only."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/longislandicedtea
- name = "Long Island Iced Tea"
- id = "longislandicedtea"
- description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.5
-
-/datum/reagent/ethanol/moonshine
- name = "Moonshine"
- id = "moonshine"
- description = "You've really hit rock bottom now... your liver packed its bags and left last night."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.8 //yeeehaw
-
-/datum/reagent/ethanol/b52
- name = "B-52"
- id = "b52"
- description = "Coffee, Irish Cream, and congac. You will get bombed."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/irishcoffee
- name = "Irish Coffee"
- id = "irishcoffee"
- description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/margarita
- name = "Margarita"
- id = "margarita"
- description = "On the rocks with salt on the rim. Arriba~!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/black_russian
- name = "Black Russian"
- id = "blackrussian"
- description = "For the lactose-intolerant. Still as classy as a White Russian."
- reagent_state = LIQUID
- color = "#360000" // rgb: 54, 0, 0
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/manhattan
- name = "Manhattan"
- id = "manhattan"
- description = "The Detective's undercover drink of choice. He never could stomach gin..."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/manhattan_proj
- name = "Manhattan Project"
- id = "manhattan_proj"
- description = "A scienitst's drink of choice, for pondering ways to blow up the station."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/whiskeysoda
- name = "Whiskey Soda"
- id = "whiskeysoda"
- description = "Ultimate refreshment."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/antifreeze
- name = "Anti-freeze"
- id = "antifreeze"
- description = "Ultimate refreshment."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/antifreeze/on_mob_life(mob/living/M)
- if(M.bodytemperature < 330)
- M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
- ..()
-
-/datum/reagent/ethanol/barefoot
- name = "Barefoot"
- id = "barefoot"
- description = "Barefoot and pregnant"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/snowwhite
- name = "Snow White"
- id = "snowwhite"
- description = "A cold refreshment"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/demonsblood
- name = "Demons Blood"
- id = "demonsblood"
- description = "AHHHH!!!!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 10
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/vodkatonic
- name = "Vodka and Tonic"
- id = "vodkatonic"
- description = "For when a gin and tonic isn't russian enough."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 4
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/ginfizz
- name = "Gin Fizz"
- id = "ginfizz"
- description = "Refreshingly lemony, deliciously dry."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 4
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/bahama_mama
- name = "Bahama mama"
- id = "bahama_mama"
- description = "Tropic cocktail."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/singulo
- name = "Singulo"
- id = "singulo"
- description = "A blue-space beverage!"
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
- dizzy_adj = 15
- alcohol_perc = 0.7
-
-/datum/reagent/ethanol/sbiten
- name = "Sbiten"
- id = "sbiten"
- description = "A spicy Vodka! Might be a little hot for the little guys!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/sbiten/on_mob_life(mob/living/M)
- if(M.bodytemperature < 360)
- M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
- ..()
-
-/datum/reagent/ethanol/devilskiss
- name = "Devils Kiss"
- id = "devilskiss"
- description = "Creepy time!"
- reagent_state = LIQUID
- color = "#A68310" // rgb: 166, 131, 16
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/red_mead
- name = "Red Mead"
- id = "red_mead"
- description = "The true Viking drink! Even though it has a strange red color."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/mead
- name = "Mead"
- id = "mead"
- description = "A Vikings drink, though a cheap one."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/iced_beer
- name = "Iced Beer"
- id = "iced_beer"
- description = "A beer which is so cold the air around it freezes."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/iced_beer/on_mob_life(mob/living/M)
- if(M.bodytemperature > 270)
- M.bodytemperature = max(270, M.bodytemperature - (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
- ..()
-
-/datum/reagent/ethanol/grog
- name = "Grog"
- id = "grog"
- description = "Watered down rum, Nanotrasen approves!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/aloe
- name = "Aloe"
- id = "aloe"
- description = "So very, very, very good."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/andalusia
- name = "Andalusia"
- id = "andalusia"
- description = "A nice, strange named drink."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.4
-
-/datum/reagent/ethanol/alliescocktail
- name = "Allies Cocktail"
- id = "alliescocktail"
- description = "A drink made from your allies."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.5
-
-/datum/reagent/ethanol/acid_spit
- name = "Acid Spit"
- id = "acidspit"
- description = "A drink by Nanotrasen. Made from live aliens."
- reagent_state = LIQUID
- color = "#365000" // rgb: 54, 80, 0
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/amasec
- name = "Amasec"
- id = "amasec"
- description = "Official drink of the Imperium."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/neurotoxin
- name = "Neuro-toxin"
- id = "neurotoxin"
- description = "A strong neurotoxin that puts the subject into a death-like state."
- reagent_state = LIQUID
- color = "#2E2E61" // rgb: 46, 46, 97
- dizzy_adj = 6
- alcohol_perc = 0.7
- heart_rate_decrease = 1
-
-/datum/reagent/ethanol/neurotoxin/on_mob_life(mob/living/M)
- M.weakened = max(M.weakened, 3)
- if(current_cycle >=55)
- M.druggy = max(M.druggy, 55)
- if(current_cycle >=200)
- M.adjustToxLoss(2)
- ..()
-
-/datum/reagent/ethanol/changelingsting
- name = "Changeling Sting"
- id = "changelingsting"
- description = "A stingy drink."
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
- alcohol_perc = 0.7
-
-/datum/reagent/ethanol/changelingsting/on_mob_life(mob/living/M)
- M.dizziness +=5
- ..()
-
-/datum/reagent/ethanol/irishcarbomb
- name = "Irish Car Bomb"
- id = "irishcarbomb"
- description = "Mmm, tastes like chocolate cake..."
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
- alcohol_perc = 0.3
-
-/datum/reagent/ethanol/irishcarbomb/on_mob_life(mob/living/M)
- M.dizziness +=5
- ..()
-
-/datum/reagent/ethanol/syndicatebomb
- name = "Syndicate Bomb"
- id = "syndicatebomb"
- description = "A Syndicate bomb"
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/erikasurprise
- name = "Erika Surprise"
- id = "erikasurprise"
- description = "The surprise is, it's green!"
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/driestmartini
- name = "Driest Martini"
- id = "driestmartini"
- description = "Only for the experienced. You think you see sand floating in the glass."
- nutriment_factor = 1 * FOOD_METABOLISM
- color = "#2E6671" // rgb: 46, 102, 113
- alcohol_perc = 0.5
-
-/datum/reagent/ethanol/driestmartini/on_mob_life(mob/living/M)
- M.dizziness +=10
- if(current_cycle >= 55 && current_cycle < 115)
- M.stuttering += 10
- ..()
-
-/datum/reagent/ethanol/kahlua
- name = "Kahlua"
- id = "kahlua"
- description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!"
- color = "#664300" // rgb: 102, 67, 0
- alcohol_perc = 0.2
-
-/datum/reagent/ethanol/kahlua/on_mob_life(mob/living/M)
- M.dizziness = max(0, M.dizziness-5)
- M.drowsyness = max(0, M.drowsyness-3)
- M.AdjustSleeping(-2)
- M.Jitter(5)
- ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
deleted file mode 100644
index 26bad6c1665..00000000000
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
+++ /dev/null
@@ -1,285 +0,0 @@
-/datum/reagent/drink/orangejuice
- name = "Orange juice"
- id = "orangejuice"
- description = "Both delicious AND rich in Vitamin C, what more do you need?"
- color = "#E78108" // rgb: 231, 129, 8
-
-/datum/reagent/drink/orangejuicde/on_mob_life(mob/living/M)
- if(M.getOxyLoss() && prob(30))
- M.adjustOxyLoss(-1*REM)
- ..()
-
-/datum/reagent/drink/tomatojuice
- name = "Tomato Juice"
- id = "tomatojuice"
- description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?"
- color = "#731008" // rgb: 115, 16, 8
-
-/datum/reagent/drink/tomatojuice/on_mob_life(mob/living/M)
- if(M.getFireLoss() && prob(20))
- M.adjustFireLoss(-1)
- ..()
-
-/datum/reagent/drink/limejuice
- name = "Lime Juice"
- id = "limejuice"
- description = "The sweet-sour juice of limes."
- color = "#365E30" // rgb: 54, 94, 48
-
-/datum/reagent/drink/limejuice/on_mob_life(mob/living/M)
- if(M.getToxLoss() && prob(20))
- M.adjustToxLoss(-1)
- ..()
-
-/datum/reagent/drink/carrotjuice
- name = "Carrot juice"
- id = "carrotjuice"
- description = "It is just like a carrot but without crunching."
- color = "#973800" // rgb: 151, 56, 0
-
-/datum/reagent/drink/carrotjuicde/on_mob_life(mob/living/M)
- M.eye_blurry = max(M.eye_blurry-1 , 0)
- M.eye_blind = max(M.eye_blind-1 , 0)
- switch(current_cycle)
- if(1 to 20)
- //nothing
- if(21 to INFINITY)
- if(prob(current_cycle-10))
- M.disabilities &= ~NEARSIGHTED
- ..()
-
-/datum/reagent/drink/doctor_delight
- name = "The Doctor's Delight"
- id = "doctorsdelight"
- description = "A gulp a day keeps the MediBot away. That's probably for the best."
- reagent_state = LIQUID
- color = "#FF8CFF" // rgb: 255, 140, 255
-
-/datum/reagent/drink/doctors_delight/on_mob_life(mob/living/M)
- if(M.getToxLoss() && prob(20))
- M.adjustToxLoss(-1)
- ..()
-
-/datum/reagent/drink/berryjuice
- name = "Berry Juice"
- id = "berryjuice"
- description = "A delicious blend of several different kinds of berries."
- color = "#863333" // rgb: 134, 51, 51
-
-/datum/reagent/drink/poisonberryjuice
- name = "Poison Berry Juice"
- id = "poisonberryjuice"
- description = "A tasty juice blended from various kinds of very deadly and toxic berries."
- color = "#863353" // rgb: 134, 51, 83
-
-/datum/reagent/drink/poisonberryjuice/on_mob_life(mob/living/M)
- M.adjustToxLoss(1)
- ..()
-
-/datum/reagent/drink/watermelonjuice
- name = "Watermelon Juice"
- id = "watermelonjuice"
- description = "Delicious juice made from watermelon."
- color = "#863333" // rgb: 134, 51, 51
-
-/datum/reagent/drink/lemonjuice
- name = "Lemon Juice"
- id = "lemonjuice"
- description = "This juice is VERY sour."
- color = "#863333" // rgb: 175, 175, 0
-
-/datum/reagent/drink/grapejuice
- name = "Grape Juice"
- id = "grapejuice"
- description = "This juice is known to stain shirts."
- color = "#993399" // rgb: 153, 51, 153
-
-/datum/reagent/drink/banana
- name = "Banana Juice"
- id = "banana"
- description = "The raw essence of a banana."
- color = "#863333" // rgb: 175, 175, 0
-
-/datum/reagent/drink/banana/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- if((ishuman(M) && M.job in list("Clown") ) || issmall(M))
- M.adjustBruteLoss(-1)
- M.adjustFireLoss(-1)
- ..()
-
-/datum/reagent/drink/nothing
- name = "Nothing"
- id = "nothing"
- description = "Absolutely nothing."
-
-/datum/reagent/drink/nothing/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- if(ishuman(M) && M.job in list("Mime"))
- M.adjustBruteLoss(-1)
- M.adjustFireLoss(-1)
- ..()
-
-/datum/reagent/drink/potato_juice
- name = "Potato Juice"
- id = "potato"
- description = "Juice of the potato. Bleh."
- nutriment_factor = 2 * FOOD_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
-/datum/reagent/drink/milk
- name = "Milk"
- id = "milk"
- description = "An opaque white liquid produced by the mammary glands of mammals."
- color = "#DFDFDF" // rgb: 223, 223, 223
-
-/datum/reagent/drink/milk/on_mob_life(mob/living/M)
- if(M.getBruteLoss() && prob(20))
- M.adjustBruteLoss(-1)
- if(holder.has_reagent("capsaicin"))
- holder.remove_reagent("capsaicin", 2)
- ..()
-
-/datum/reagent/drink/milk/soymilk
- name = "Soy Milk"
- id = "soymilk"
- description = "An opaque white liquid made from soybeans."
- color = "#DFDFC7" // rgb: 223, 223, 199
-
-/datum/reagent/drink/milk/cream
- name = "Cream"
- id = "cream"
- description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?"
- color = "#DFD7AF" // rgb: 223, 215, 175
-
-/datum/reagent/drink/milk/chocolate_milk
- name = "Chocolate milk"
- id ="chocolate_milk"
- description = "Chocolate-flavored milk, tastes like being a kid again."
- color = "#85432C"
-
-/datum/reagent/drink/hot_coco
- name = "Hot Chocolate"
- id = "hot_coco"
- description = "Made with love! And coco beans."
- nutriment_factor = 2 * FOOD_METABOLISM
- color = "#403010" // rgb: 64, 48, 16
- adj_temp_hot = 5
-
-/datum/reagent/drink/coffee
- name = "Coffee"
- id = "coffee"
- description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant."
- color = "#482000" // rgb: 72, 32, 0
- adj_dizzy = -5
- adj_drowsy = -3
- adj_sleepy = -2
- adj_temp_hot = 25
- overdose_threshold = 45
- addiction_chance = 1 // It's true.
- heart_rate_increase = 1
-
-/datum/reagent/drink/coffee/on_mob_life(mob/living/M)
- if(holder.has_reagent("frostoil"))
- holder.remove_reagent("frostoil", 5)
- if(prob(50))
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- ..()
-
-/datum/reagent/drink/coffee/overdose_process(mob/living/M, severity)
- if(volume > 45)
- M.Jitter(5)
-
-/datum/reagent/drink/coffee/icecoffee
- name = "Iced Coffee"
- id = "icecoffee"
- description = "Coffee and ice, refreshing and cool."
- color = "#102838" // rgb: 16, 40, 56
- adj_temp_hot = 0
- adj_temp_cool = 5
-
-/datum/reagent/drink/coffee/soy_latte
- name = "Soy Latte"
- id = "soy_latte"
- description = "A nice and tasty beverage while you are reading your hippie books."
- color = "#664300" // rgb: 102, 67, 0
- adj_sleepy = 0
- adj_temp_hot = 5
-
-/datum/reagent/drink/coffee/soy_latte/on_mob_life(mob/living/M)
- ..()
- M.SetSleeping(0)
- if(M.getBruteLoss() && prob(20))
- M.adjustBruteLoss(-1)
-
-/datum/reagent/drink/coffee/cafe_latte
- name = "Cafe Latte"
- id = "cafe_latte"
- description = "A nice, strong and tasty beverage while you are reading."
- color = "#664300" // rgb: 102, 67, 0
- adj_sleepy = 0
- adj_temp_hot = 5
-
-/datum/reagent/drink/coffee/cafe_latte/on_mob_life(mob/living/M)
- ..()
- M.SetSleeping(0)
- if(M.getBruteLoss() && prob(20))
- M.adjustBruteLoss(-1)
-
-/datum/reagent/drink/coffee/cafe_latte/cafe_mocha
- name = "Cafe Mocha"
- id = "cafe_mocha"
- description = "The perfect blend of coffe, milk, and chocolate."
- color = "#673629"
-
-/datum/reagent/drink/tea
- name = "Tea"
- id = "tea"
- description = "Tasty black tea: It has antioxidants. It's good for you!"
- color = "#101000" // rgb: 16, 16, 0
- adj_dizzy = -2
- adj_drowsy = -1
- adj_sleepy = -3
- adj_temp_hot = 20
-
-/datum/reagent/drink/tea/on_mob_life(mob/living/M)
- if(M.getToxLoss() && prob(20))
- M.adjustToxLoss(-1)
- ..()
-
-/datum/reagent/drink/tea/icetea
- name = "Iced Tea"
- id = "icetea"
- description = "No relation to a certain rap artist/ actor."
- color = "#104038" // rgb: 16, 64, 56
- adj_temp_hot = 0
- adj_temp_cool = 5
-
-/datum/reagent/drink/bananahonk
- name = "Banana Mama"
- id = "bananahonk"
- description = "A drink from Clown Heaven."
- nutriment_factor = 1 * FOOD_METABOLISM
- color = "#664300" // rgb: 102, 67, 0
-
-/datum/reagent/drink/bananahonk/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- if((ishuman(M) && M.job in list("Clown") ) || issmall(M))
- M.adjustBruteLoss(-1)
- M.adjustFireLoss(-1)
- ..()
-
-/datum/reagent/drink/silencer
- name = "Silencer"
- id = "silencer"
- description = "A drink from Mime Heaven."
- nutriment_factor = 1 * FOOD_METABOLISM
- color = "#664300" // rgb: 102, 67, 0
-
-/datum/reagent/drink/silencer/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- if(ishuman(M) && M.job in list("Mime"))
- M.adjustBruteLoss(-1)
- M.adjustFireLoss(-1)
- ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm
deleted file mode 100644
index fe54ed97246..00000000000
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm
+++ /dev/null
@@ -1,124 +0,0 @@
-/datum/reagent/drink/cold
- name = "Cold drink"
- adj_temp_cool = 5
-
-/datum/reagent/drink/cold/tonic
- name = "Tonic Water"
- id = "tonic"
- description = "It tastes strange but at least the quinine keeps the Space Malaria at bay."
- color = "#664300" // rgb: 102, 67, 0
- adj_dizzy = -5
- adj_drowsy = -3
- adj_sleepy = -2
-
-/datum/reagent/drink/cold/sodawater
- name = "Soda Water"
- id = "sodawater"
- description = "A can of club soda. Why not make a scotch and soda?"
- color = "#619494" // rgb: 97, 148, 148
- adj_dizzy = -5
- adj_drowsy = -3
-
-/datum/reagent/drink/cold/ice
- name = "Ice"
- id = "ice"
- description = "Frozen water, your dentist wouldn't like you chewing this."
- reagent_state = SOLID
- color = "#619494" // rgb: 97, 148, 148
- adj_temp_cool = 0
-
-/datum/reagent/drink/cold/ice/on_mob_life(mob/living/M)
- M.bodytemperature = max(M.bodytemperature - 5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0)
- ..()
-
-/datum/reagent/drink/cold/space_cola
- name = "Cola"
- id = "cola"
- description = "A refreshing beverage."
- reagent_state = LIQUID
- color = "#100800" // rgb: 16, 8, 0
- adj_drowsy = -5
-
-/datum/reagent/drink/cold/nuka_cola
- name = "Nuka Cola"
- id = "nuka_cola"
- description = "Cola, cola never changes."
- color = "#100800" // rgb: 16, 8, 0
- adj_sleepy = -2
-
-/datum/reagent/drink/cold/nuka_cola/on_mob_life(mob/living/M)
- M.Jitter(20)
- M.druggy = max(M.druggy, 30)
- M.dizziness +=5
- M.drowsyness = 0
- M.status_flags |= GOTTAGOFAST
- ..()
-
-/datum/reagent/drink/cold/nuka_cola/reagent_deleted(mob/living/M)
- M.status_flags &= ~GOTTAGOFAST
- ..()
-
-/datum/reagent/drink/cold/spacemountainwind
- name = "Space Mountain Wind"
- id = "spacemountainwind"
- description = "Blows right through you like a space wind."
- color = "#102000" // rgb: 16, 32, 0
- adj_drowsy = -7
- adj_sleepy = -1
-
-/datum/reagent/drink/cold/dr_gibb
- name = "Dr. Gibb"
- id = "dr_gibb"
- description = "A delicious blend of 42 different flavours"
- color = "#102000" // rgb: 16, 32, 0
- adj_drowsy = -6
-
-/datum/reagent/drink/cold/space_up
- name = "Space-Up"
- id = "space_up"
- description = "Tastes like a hull breach in your mouth."
- color = "#202800" // rgb: 32, 40, 0
- adj_temp_cool = 8
-
-/datum/reagent/drink/cold/lemon_lime
- name = "Lemon Lime"
- description = "A tangy substance made of 0.5% natural citrus!"
- id = "lemon_lime"
- color = "#878F00" // rgb: 135, 40, 0
- adj_temp_cool = 8
-
-/datum/reagent/drink/cold/lemonade
- name = "Lemonade"
- description = "Oh the nostalgia..."
- id = "lemonade"
- color = "#FFFF00" // rgb: 255, 255, 0
-
-/datum/reagent/drink/cold/kiraspecial
- name = "Kira Special"
- description = "Long live the guy who everyone had mistaken for a girl. Baka!"
- id = "kiraspecial"
- color = "#CCCC99" // rgb: 204, 204, 153
-
-/datum/reagent/drink/cold/brownstar
- name = "Brown Star"
- description = "It's not what it sounds like..."
- id = "brownstar"
- color = "#9F3400" // rgb: 159, 052, 000
- adj_temp_cool = 2
-
-/datum/reagent/drink/cold/milkshake
- name = "Milkshake"
- description = "Glorious brainfreezing mixture."
- id = "milkshake"
- color = "#AEE5E4" // rgb" 174, 229, 228
- adj_temp_cool = 9
-
-/datum/reagent/drink/cold/rewriter
- name = "Rewriter"
- description = "The secert of the sanctuary of the Libarian..."
- id = "rewriter"
- color = "#485000" // rgb:72, 080, 0
-
-/datum/reagent/drink/cold/rewriter/on_mob_life(mob/living/M)
- M.Jitter(5)
- ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_admin.dm b/code/modules/reagents/oldchem/reagents/reagents_admin.dm
deleted file mode 100644
index ccc617d2aaa..00000000000
--- a/code/modules/reagents/oldchem/reagents/reagents_admin.dm
+++ /dev/null
@@ -1,76 +0,0 @@
-/datum/reagent/adminordrazine //An OP chemical for admins
- name = "Adminordrazine"
- id = "adminordrazine"
- description = "It's magic. We don't have to explain it."
- reagent_state = LIQUID
- color = "#C8A5DC" // rgb: 200, 165, 220
- process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds!
- admin_only = 1
-
-/datum/reagent/adminordrazine/on_mob_life(mob/living/carbon/M)
- M.setCloneLoss(0)
- M.setOxyLoss(0)
- M.radiation = 0
- M.adjustBruteLoss(-5)
- M.adjustFireLoss(-5)
- M.adjustToxLoss(-5)
- M.hallucination = 0
- M.setBrainLoss(0)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- for(var/name in H.internal_organs)
- var/obj/item/organ/internal/I = H.get_int_organ(name)
- I.damage = max(0, I.damage-5)
- for(var/obj/item/organ/external/E in H.organs)
- if(E.mend_fracture())
- E.perma_injury = 0
- M.disabilities = 0
- M.eye_blurry = 0
- M.eye_blind = 0
- M.SetWeakened(0)
- M.SetStunned(0)
- M.SetParalysis(0)
- M.silent = 0
- M.dizziness = 0
- M.drowsyness = 0
- M.stuttering = 0
- M.slurring = 0
- M.confused = 0
- M.SetSleeping(0)
- M.jitteriness = 0
- for(var/datum/disease/D in M.viruses)
- if(D.severity == NONTHREAT)
- continue
- D.spread_text = "Remissive"
- D.stage--
- if(D.stage < 1)
- D.cure()
- ..()
-
-/datum/reagent/adminordrazine/nanites
- name = "Nanites"
- id = "nanites"
- description = "Nanomachines that aid in rapid cellular regeneration."
-
-
-// For random item spawning. Takes a list of paths, and returns the same list without anything that contains admin only reagents
-
-/proc/adminReagentCheck(var/list/incoming)
- var/list/outgoing[0]
- for(var/tocheck in incoming)
- if(ispath(tocheck))
- var/check = new tocheck
- if(istype(check, /atom))
- var/atom/reagentCheck = check
- var/datum/reagents/reagents = reagentCheck.reagents
- var/admin = 0
- for(var/reag in reagents.reagent_list)
- var/datum/reagent/reagent = reag
- if(reagent.admin_only)
- admin = 1
- break
- if(!(admin))
- outgoing += tocheck
- else
- outgoing += tocheck
- return outgoing
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm
deleted file mode 100644
index 7cbc79b41b0..00000000000
--- a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm
+++ /dev/null
@@ -1,115 +0,0 @@
-/datum/reagent/serotrotium
- name = "Serotrotium"
- id = "serotrotium"
- description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans."
- reagent_state = LIQUID
- color = "#202040" // rgb: 20, 20, 40
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
-
-/datum/reagent/serotrotium/on_mob_life(mob/living/M)
- if(ishuman(M))
- if(prob(7))
- M.emote(pick("twitch","drool","moan","gasp"))
- ..()
-
-
-/datum/reagent/lithium
- name = "Lithium"
- id = "lithium"
- description = "A chemical element."
- reagent_state = SOLID
- color = "#808080" // rgb: 128, 128, 128
-
-/datum/reagent/lithium/on_mob_life(mob/living/M)
- if(isturf(M.loc) && !istype(M.loc, /turf/space))
- if(M.canmove && !M.restrained())
- step(M, pick(cardinal))
- if(prob(5)) M.emote(pick("twitch","drool","moan"))
- ..()
-
-
-/datum/reagent/hippies_delight
- name = "Hippie's Delight"
- id = "hippiesdelight"
- description = "You just don't get it maaaan."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- metabolization_rate = 0.2 * REAGENTS_METABOLISM
-
-/datum/reagent/hippies_delight/on_mob_life(mob/living/M)
- M.druggy = max(M.druggy, 50)
- switch(current_cycle)
- if(1 to 5)
- if(!M.stuttering) M.stuttering = 1
- M.Dizzy(10)
- if(prob(10)) M.emote(pick("twitch","giggle"))
- if(5 to 10)
- if(!M.stuttering) M.stuttering = 1
- M.Jitter(20)
- M.Dizzy(20)
- M.druggy = max(M.druggy, 45)
- if(prob(20)) M.emote(pick("twitch","giggle"))
- if(10 to INFINITY)
- if(!M.stuttering) M.stuttering = 1
- M.Jitter(40)
- M.Dizzy(40)
- M.druggy = max(M.druggy, 60)
- if(prob(30)) M.emote(pick("twitch","giggle"))
- ..()
-
-/datum/reagent/lsd
- name = "Lysergic acid diethylamide"
- id = "lsd"
- description = "A highly potent hallucinogenic substance. Far out, maaaan."
- reagent_state = LIQUID
- color = "#0000D8"
-
-/datum/reagent/lsd/on_mob_life(mob/living/M)
- M.druggy = max(M.druggy, 15)
- M.hallucination += 10
- ..()
-
-/datum/reagent/space_drugs
- name = "Space drugs"
- id = "space_drugs"
- description = "An illegal chemical compound used as drug."
- reagent_state = LIQUID
- color = "#9087A2"
- metabolization_rate = 0.2
- addiction_chance = 65
- heart_rate_decrease = 1
-
-/datum/reagent/space_drugs/on_mob_life(mob/living/M)
- M.druggy = max(M.druggy, 15)
- if(isturf(M.loc) && !istype(M.loc, /turf/space))
- if(M.canmove && !M.restrained())
- step(M, pick(cardinal))
- if(prob(7)) M.emote(pick("twitch","drool","moan","giggle"))
- ..()
-
-/datum/reagent/psilocybin
- name = "Psilocybin"
- id = "psilocybin"
- description = "A strong psycotropic derived from certain species of mushroom."
- color = "#E700E7" // rgb: 231, 0, 231
-
-/datum/reagent/psilocybin/on_mob_life(mob/living/M)
- M.druggy = max(M.druggy, 30)
- switch(current_cycle)
- if(1 to 5)
- if(!M.stuttering) M.stuttering = 1
- M.Dizzy(5)
- if(prob(10)) M.emote(pick("twitch","giggle"))
- if(5 to 10)
- if(!M.stuttering) M.stuttering = 1
- M.Jitter(10)
- M.Dizzy(10)
- M.druggy = max(M.druggy, 35)
- if(prob(20)) M.emote(pick("twitch","giggle"))
- if(10 to INFINITY)
- if(!M.stuttering) M.stuttering = 1
- M.Jitter(20)
- M.Dizzy(20)
- M.druggy = max(M.druggy, 40)
- if(prob(30)) M.emote(pick("twitch","giggle"))
- ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
deleted file mode 100644
index 52d33e21e07..00000000000
--- a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
+++ /dev/null
@@ -1,81 +0,0 @@
-/datum/reagent/fuel
- name = "Welding fuel"
- id = "fuel"
- description = "A highly flammable blend of basic hydrocarbons, mostly Acetylene. Useful for both welding and organic chemistry, and can be fortified into a heavier oil."
- reagent_state = LIQUID
- color = "#060606"
-
-/datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with welding fuel to make them easy to ignite!
- if(method == TOUCH)
- M.adjust_fire_stacks(volume / 10)
- return
- ..()
-
-/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
- name = "Unholy Water"
- id = "unholywater"
- description = "Something that shouldn't exist on this plane of existance."
- process_flags = ORGANIC | SYNTHETIC //ethereal means everything processes it.
- metabolization_rate = 1
-
-/datum/reagent/fuel/unholywater/on_mob_life(mob/living/M)
- M.adjustBrainLoss(3)
- if(iscultist(M))
- M.status_flags |= GOTTAGOFAST
- M.drowsyness = max(M.drowsyness-5, 0)
- M.AdjustParalysis(-2)
- M.AdjustStunned(-2)
- M.AdjustWeakened(-2)
- else
- M.adjustToxLoss(2)
- M.adjustFireLoss(2)
- M.adjustOxyLoss(2)
- M.adjustBruteLoss(2)
- ..()
-
-/datum/reagent/fuel/unholywater/reagent_deleted(mob/living/M)
- M.status_flags &= ~GOTTAGOFAST
- ..()
-
-/datum/reagent/plasma
- name = "Plasma"
- id = "plasma"
- description = "The liquid phase of an unusual extraterrestrial compound."
- reagent_state = LIQUID
- color = "#7A2B94"
-
-/datum/reagent/plasma/on_mob_life(mob/living/M)
- M.adjustToxLoss(1*REM)
- if(holder.has_reagent("epinephrine"))
- holder.remove_reagent("epinephrine", 2)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- C.adjustPlasma(10)
- ..()
-
-/datum/reagent/plasma/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma is stronger than fuel!
- if(method == TOUCH)
- M.adjust_fire_stacks(volume / 5)
- ..()
-
-
-/datum/reagent/thermite
- name = "Thermite"
- id = "thermite"
- description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
- reagent_state = SOLID
- color = "#673910" // rgb: 103, 57, 16
- process_flags = ORGANIC | SYNTHETIC
-
-/datum/reagent/thermite/reaction_turf(turf/simulated/wall/W, volume)
- if(volume >= 5 && istype(W))
- W.thermite = 1
- W.overlays.Cut()
- W.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
-
-/datum/reagent/glycerol
- name = "Glycerol"
- id = "glycerol"
- description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity."
- reagent_state = LIQUID
- color = "#808080" // rgb: 128, 128, 128
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm
deleted file mode 100644
index 1dbe1f05a20..00000000000
--- a/code/modules/reagents/oldchem/reagents/reagents_food.dm
+++ /dev/null
@@ -1,394 +0,0 @@
-/////////////////////////Food Reagents////////////////////////////
-// Part of the food code. Nutriment is used instead of the old "heal_amt" code. Also is where all the food
-// condiments, additives, and such go.
-/datum/reagent/nutriment // Pure nutriment, universally digestable and thus slightly less effective
- name = "Nutriment"
- id = "nutriment"
- description = "A questionable mixture of various pure nutrients commonly found in processed foods."
- reagent_state = SOLID
- nutriment_factor = 12 * REAGENTS_METABOLISM
- color = "#664330" // rgb: 102, 67, 48
- var/diet_flags = DIET_OMNI | DIET_HERB | DIET_CARN
-
-/datum/reagent/nutriment/on_mob_life(mob/living/M)
- if(!(M.mind in ticker.mode.vampires))
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
- H.nutrition += nutriment_factor // For hunger and fatness
- if(prob(50))
- M.adjustBruteLoss(-1)
- if(H.species.exotic_blood)
- H.vessel.add_reagent(H.species.exotic_blood, 0.4)
- else
- if(!(H.species.flags & NO_BLOOD))
- H.vessel.add_reagent("blood", 0.4)
- ..()
-
-/datum/reagent/nutriment/protein // Meat-based protein, digestable by carnivores and omnivores, worthless to herbivores
- name = "Protein"
- id = "protein"
- description = "Various essential proteins and fats commonly found in animal flesh and blood."
- nutriment_factor = 15 * REAGENTS_METABOLISM
- diet_flags = DIET_CARN | DIET_OMNI
-
-/datum/reagent/nutriment/plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores
- name = "Plant-matter"
- id = "plantmatter"
- description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce."
- nutriment_factor = 15 * REAGENTS_METABOLISM
- diet_flags = DIET_HERB | DIET_OMNI
-
-
-/datum/reagent/vitamin
- name = "Vitamin"
- id = "vitamin"
- description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form."
- reagent_state = SOLID
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#664330" // rgb: 102, 67, 48
-
-/datum/reagent/vitamin/on_mob_life(mob/living/M) //everyone needs vitamins, so this works on everyone, regardless of diet or if they're a vampire.
- M.nutrition += nutriment_factor
- if(prob(50))
- M.adjustBruteLoss(-1)
- M.adjustFireLoss(-1)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.species.exotic_blood)
- H.vessel.add_reagent(H.species.exotic_blood, 0.5)
- else
- if(!(H.species.flags & NO_BLOOD))
- H.vessel.add_reagent("blood", 0.5)
- ..()
-
-/datum/reagent/soysauce
- name = "Soysauce"
- id = "soysauce"
- description = "A salty sauce made from the soy plant."
- reagent_state = LIQUID
- nutriment_factor = 2 * REAGENTS_METABOLISM
- color = "#792300" // rgb: 121, 35, 0
-
-/datum/reagent/ketchup
- name = "Ketchup"
- id = "ketchup"
- description = "Ketchup, catsup, whatever. It's tomato paste."
- reagent_state = LIQUID
- nutriment_factor = 5 * REAGENTS_METABOLISM
- color = "#731008" // rgb: 115, 16, 8
-
-
-/datum/reagent/capsaicin
- name = "Capsaicin Oil"
- id = "capsaicin"
- description = "This is what makes chilis hot."
- reagent_state = LIQUID
- color = "#B31008" // rgb: 179, 16, 8
-
-/datum/reagent/capsaicin/on_mob_life(mob/living/M)
- switch(current_cycle)
- if(1 to 15)
- M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(holder.has_reagent("frostoil"))
- holder.remove_reagent("frostoil", 5)
- if(isslime(M))
- M.bodytemperature += rand(5,20)
- if(15 to 25)
- M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(isslime(M))
- M.bodytemperature += rand(10,20)
- if(25 to 35)
- M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(isslime(M))
- M.bodytemperature += rand(15,20)
- if(35 to INFINITY)
- M.bodytemperature += 20 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(isslime(M))
- M.bodytemperature += rand(20,25)
- ..()
-
-/datum/reagent/frostoil
- name = "Frost Oil"
- id = "frostoil"
- description = "A special oil that noticably chills the body. Extraced from Icepeppers."
- reagent_state = LIQUID
- color = "#8BA6E9" // rgb: 139, 166, 233
- process_flags = ORGANIC | SYNTHETIC
-
-/datum/reagent/frostoil/on_mob_life(mob/living/M)
- switch(current_cycle)
- if(1 to 15)
- M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(holder.has_reagent("capsaicin"))
- holder.remove_reagent("capsaicin", 5)
- if(isslime(M))
- M.bodytemperature -= rand(5,20)
- if(15 to 25)
- M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(isslime(M))
- M.bodytemperature -= rand(10,20)
- if(25 to 35)
- M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(prob(1))
- M.emote("shiver")
- if(isslime(M))
- M.bodytemperature -= rand(15,20)
- if(35 to INFINITY)
- M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(prob(1))
- M.emote("shiver")
- if(isslime(M))
- M.bodytemperature -= rand(20,25)
- ..()
-
-/datum/reagent/frostoil/reaction_turf(turf/T, volume)
- if(volume >= 5)
- for(var/mob/living/carbon/slime/M in T)
- M.adjustToxLoss(rand(15,30))
-
-
-/datum/reagent/sodiumchloride
- name = "Salt"
- id = "sodiumchloride"
- description = "Sodium chloride, common table salt."
- reagent_state = SOLID
- color = "#B1B0B0"
- overdose_threshold = 100
-
-/datum/reagent/sodiumchloride/overdose_process(mob/living/M, severity)
- if(prob(70))
- M.adjustBrainLoss(1)
- ..()
-
-/datum/reagent/blackpepper
- name = "Black Pepper"
- id = "blackpepper"
- description = "A powder ground from peppercorns. *AAAACHOOO*"
- reagent_state = SOLID
-
-/datum/reagent/cocoa
- name = "Cocoa Powder"
- id = "cocoa"
- description = "A fatty, bitter paste made from cocoa beans."
- reagent_state = SOLID
- nutriment_factor = 5 * REAGENTS_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
-/datum/reagent/cocoa/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- ..()
-
-/datum/reagent/hot_coco
- name = "Hot Chocolate"
- id = "hot_coco"
- description = "Made with love! And cocoa beans."
- reagent_state = LIQUID
- nutriment_factor = 2 * REAGENTS_METABOLISM
- color = "#403010" // rgb: 64, 48, 16
-
-/datum/reagent/hot_coco/on_mob_life(mob/living/M)
- if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
- M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
- M.nutrition += nutriment_factor
- ..()
-
-/datum/reagent/sprinkles
- name = "Sprinkles"
- id = "sprinkles"
- description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops."
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#FF00FF" // rgb: 255, 0, 255
-
-/datum/reagent/sprinkles/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- if(ishuman(M) && M.job in list("Security Officer", "Security Pod Pilot", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate"))
- M.adjustBruteLoss(-1)
- M.adjustFireLoss(-1)
- ..()
-
-
-/datum/reagent/cornoil
- name = "Corn Oil"
- id = "cornoil"
- description = "An oil derived from various types of corn."
- reagent_state = LIQUID
- nutriment_factor = 20 * REAGENTS_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
-/datum/reagent/cornoil/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- ..()
-
-/datum/reagent/cornoil/reaction_turf(turf/simulated/T, volume)
- if(!istype(T))
- return
- if(volume >= 3)
- T.MakeSlippery()
- var/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot)
- var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles())
- lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0)
- lowertemp.react()
- T.assume_air(lowertemp)
- qdel(hotspot)
-
-
-/datum/reagent/enzyme
- name = "Denatured Enzyme"
- id = "enzyme"
- description = "Heated beyond usefulness, this enzyme is now worthless."
- reagent_state = LIQUID
- color = "#282314" // rgb: 54, 94, 48
-
-
-/datum/reagent/dry_ramen
- name = "Dry Ramen"
- id = "dry_ramen"
- description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water."
- reagent_state = SOLID
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
-/datum/reagent/dry_ramen/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- ..()
-
-
-/datum/reagent/hot_ramen
- name = "Hot Ramen"
- id = "hot_ramen"
- description = "The noodles are boiled, the flavors are artificial, just like being back in school."
- reagent_state = LIQUID
- nutriment_factor = 5 * REAGENTS_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
-/datum/reagent/hot_ramen/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
- M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT))
- ..()
-
-
-/datum/reagent/hell_ramen
- name = "Hell Ramen"
- id = "hell_ramen"
- description = "The noodles are boiled, the flavors are artificial, just like being back in school."
- reagent_state = LIQUID
- nutriment_factor = 5 * REAGENTS_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
-/datum/reagent/hell_ramen/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- ..()
-
-
-/datum/reagent/flour
- name = "flour"
- id = "flour"
- description = "This is what you rub all over yourself to pretend to be a ghost."
- reagent_state = SOLID
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#FFFFFF" // rgb: 0, 0, 0
-
-/datum/reagent/flour/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- ..()
-
-/datum/reagent/flour/reaction_turf(turf/T, volume)
- if(!istype(T, /turf/space))
- new /obj/effect/decal/cleanable/flour(T)
-
-
-/datum/reagent/rice
- name = "Rice"
- id = "rice"
- description = "Enjoy the great taste of nothing."
- reagent_state = SOLID
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#FFFFFF" // rgb: 0, 0, 0
-
-/datum/reagent/rice/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- ..()
-
-
-/datum/reagent/cherryjelly
- name = "Cherry Jelly"
- id = "cherryjelly"
- description = "Totally the best. Only to be spread on foods with excellent lateral symmetry."
- reagent_state = LIQUID
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#801E28" // rgb: 128, 30, 40
-
-/datum/reagent/cherryjelly/on_mob_life(mob/living/M)
- M.nutrition += nutriment_factor
- ..()
-
-/datum/reagent/toxin/coffeepowder
- name = "Coffee Grounds"
- id = "coffeepowder"
- description = "Finely ground Coffee beans, used to make coffee."
- reagent_state = SOLID
- color = "#5B2E0D" // rgb: 91, 46, 13
-
-/datum/reagent/toxin/teapowder
- name = "Ground Tea Leaves"
- id = "teapowder"
- description = "Finely shredded Tea leaves, used for making tea."
- reagent_state = SOLID
- color = "#7F8400" // rgb: 127, 132, 0
-
-//Reagents used for plant fertilizers.
-/datum/reagent/toxin/fertilizer
- name = "fertilizer"
- id = "fertilizer"
- description = "A chemical mix good for growing plants with."
- reagent_state = LIQUID
- color = "#664330" // rgb: 102, 67, 48
-
-/datum/reagent/toxin/fertilizer/eznutrient
- name = "EZ Nutrient"
- id = "eznutrient"
-
-/datum/reagent/toxin/fertilizer/left4zed
- name = "Left-4-Zed"
- id = "left4zed"
-
-/datum/reagent/toxin/fertilizer/robustharvest
- name = "Robust Harvest"
- id = "robustharvest"
-
-
-/datum/reagent/sugar
- name = "Sugar"
- id = "sugar"
- description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste."
- reagent_state = SOLID
- color = "#FFFFFF" // rgb: 255, 255, 255
- overdose_threshold = 200 // Hyperglycaemic shock
-
-/datum/reagent/sugar/on_mob_life(mob/living/M)
- M.drowsyness = max(0, M.drowsyness-5)
- if(current_cycle >= 90)
- M.jitteriness += 2
- if(prob(50))
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- if(prob(4))
- M.reagents.add_reagent("epinephrine", 1.2)
- ..()
-
-/datum/reagent/sugar/overdose_start(mob/living/M)
- to_chat(M, "You pass out from hyperglycemic shock!")
- M.emote("collapse")
- ..()
-
-/datum/reagent/sugar/overdose_process(mob/living/M, severity)
- M.Paralyse(3 * severity)
- M.Weaken(4 * severity)
- if(prob(8))
- M.adjustToxLoss(severity)
-
diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm
deleted file mode 100644
index cc5592dd42e..00000000000
--- a/code/modules/reagents/oldchem/reagents/reagents_med.dm
+++ /dev/null
@@ -1,142 +0,0 @@
-/datum/reagent/hydrocodone
- name = "Hydrocodone"
- id = "hydrocodone"
- description = "An extremely effective painkiller; may have long term abuse consequences."
- reagent_state = LIQUID
- color = "#C805DC"
- metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units
- shock_reduction = 200
-
-/datum/reagent/hydrocodone/on_mob_life(mob/living/M)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.traumatic_shock < 100)
- H.shock_stage = 0
- ..()
-
-/datum/reagent/sterilizine
- name = "Sterilizine"
- id = "sterilizine"
- description = "Sterilizes wounds in preparation for surgery."
- reagent_state = LIQUID
- color = "#C8A5DC" // rgb: 200, 165, 220
-
- //makes you squeaky clean
-/datum/reagent/sterilizine/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == TOUCH)
- M.germ_level -= min(volume*20, M.germ_level)
-
-/datum/reagent/sterilizine/reaction_obj(obj/O, volume)
- O.germ_level -= min(volume*20, O.germ_level)
-
-/datum/reagent/sterilizine/reaction_turf(turf/T, volume)
- T.germ_level -= min(volume*20, T.germ_level)
-
-/datum/reagent/synaptizine
- name = "Synaptizine"
- id = "synaptizine"
- description = "Synaptizine is used to treat neuroleptic shock. Can be used to help remove disabling symptoms such as paralysis."
- reagent_state = LIQUID
- color = "#FA46FA"
- overdose_threshold = 40
-
-/datum/reagent/synaptizine/on_mob_life(mob/living/M)
- M.drowsyness = max(0, M.drowsyness-5)
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- M.SetSleeping(0)
- if(prob(50))
- M.adjustBrainLoss(-1.0)
- ..()
-
-/datum/reagent/synaptizine/overdose_process(mob/living/M, severity)
- var/effect = ..()
- if(severity == 1)
- if(effect <= 1)
- M.visible_message("[M] suddenly and violently vomits!")
- M.fakevomit(no_text = 1)
- else if(effect <= 3)
- M.emote(pick("groan","moan"))
- if(effect <= 8)
- M.adjustToxLoss(1)
- else if(severity == 2)
- if(effect <= 2)
- M.visible_message("[M] suddenly and violently vomits!")
- M.fakevomit(no_text = 1)
- else if(effect <= 5)
- M.visible_message("[M] staggers and drools, their eyes bloodshot!")
- M.Dizzy(8)
- M.Weaken(4)
- if(effect <= 15)
- M.adjustToxLoss(1)
-
-/datum/reagent/mitocholide
- name = "Mitocholide"
- id = "mitocholide"
- description = "A specialized drug that stimulates the mitochondria of cells to encourage healing of internal organs."
- reagent_state = LIQUID
- color = "#C8A5DC" // rgb: 200, 165, 220
-
-/datum/reagent/mitocholide/on_mob_life(mob/living/M)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
-
- //Mitocholide is hard enough to get, it's probably fair to make this all internal organs
- for(var/name in H.internal_organs)
- var/obj/item/organ/internal/I = H.get_int_organ(name)
- if(I.damage > 0)
- I.damage = max(I.damage-0.4, 0)
- ..()
-
-/datum/reagent/mitocholide/reaction_obj(obj/O, volume)
- if(istype(O, /obj/item/organ))
- var/obj/item/organ/Org = O
- Org.rejuvenate()
-
-/datum/reagent/cryoxadone
- name = "Cryoxadone"
- id = "cryoxadone"
- description = "A plasma mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 265K for it to metabolise correctly."
- reagent_state = LIQUID
- color = "#0000C8" // rgb: 200, 165, 220
- heart_rate_decrease = 1
-
-/datum/reagent/cryoxadone/on_mob_life(mob/living/M)
- if(M.bodytemperature < 265)
- M.adjustCloneLoss(-4)
- M.adjustOxyLoss(-10)
- M.adjustToxLoss(-3)
- M.adjustBruteLoss(-12)
- M.adjustFireLoss(-12)
- M.status_flags &= ~DISFIGURED
- ..()
-
-/datum/reagent/rezadone
- name = "Rezadone"
- id = "rezadone"
- description = "A powder derived from fish toxin, Rezadone can effectively treat genetic damage as well as restoring minor wounds. Overdose will cause intense nausea and minor toxin damage."
- reagent_state = SOLID
- color = "#669900" // rgb: 102, 153, 0
- overdose_threshold = 30
-
-/datum/reagent/rezadone/on_mob_life(mob/living/M)
- M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that.
- M.adjustCloneLoss(-1) //What? We just set cloneloss to 0. Why? Simple; this is so external organs properly unmutate.
- M.adjustBruteLoss(-1)
- M.adjustFireLoss(-1)
- M.status_flags &= ~DISFIGURED
- ..()
-
-/datum/reagent/rezadone/overdose_process(mob/living/M, severity)
- M.adjustToxLoss(1)
- M.Dizzy(5)
- M.Jitter(5)
-
-/datum/reagent/spaceacillin
- name = "Spaceacillin"
- id = "spaceacillin"
- description = "An all-purpose antibiotic agent extracted from space fungus."
- reagent_state = LIQUID
- color = "#0AB478"
- metabolization_rate = 0.2
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_misc.dm b/code/modules/reagents/oldchem/reagents/reagents_misc.dm
deleted file mode 100644
index ff729dcdf3f..00000000000
--- a/code/modules/reagents/oldchem/reagents/reagents_misc.dm
+++ /dev/null
@@ -1,189 +0,0 @@
-/*/datum/reagent/silicate
- name = "Silicate"
- id = "silicate"
- description = "A compound that can be used to reinforce glass."
- reagent_state = LIQUID
- color = "#C7FFFF" // rgb: 199, 255, 255
-
-/datum/reagent/silicate/reaction_obj(obj/O, volume)
- if(istype(O, /obj/structure/window))
- if(O:silicate <= 200)
-
- O:silicate += volume
- O:health += volume * 3
-
- if(!O:silicateIcon)
- var/icon/I = icon(O.icon,O.icon_state,O.dir)
-
- var/r = (volume / 100) + 1
- var/g = (volume / 70) + 1
- var/b = (volume / 50) + 1
- I.SetIntensity(r,g,b)
- O.icon = I
- O:silicateIcon = I
- else
- var/icon/I = O:silicateIcon
-
- var/r = (volume / 100) + 1
- var/g = (volume / 70) + 1
- var/b = (volume / 50) + 1
- I.SetIntensity(r,g,b)
- O.icon = I
- O:silicateIcon = I */
-
-
-/datum/reagent/oxygen
- name = "Oxygen"
- id = "oxygen"
- description = "A colorless, odorless gas."
- reagent_state = GAS
- color = "#808080" // rgb: 128, 128, 128
-
-
-/datum/reagent/nitrogen
- name = "Nitrogen"
- id = "nitrogen"
- description = "A colorless, odorless, tasteless gas."
- reagent_state = GAS
- color = "#808080" // rgb: 128, 128, 128
-
-
-/datum/reagent/hydrogen
- name = "Hydrogen"
- id = "hydrogen"
- description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas."
- reagent_state = GAS
- color = "#808080" // rgb: 128, 128, 128
-
-
-/datum/reagent/potassium
- name = "Potassium"
- id = "potassium"
- description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water."
- reagent_state = SOLID
- color = "#A0A0A0" // rgb: 160, 160, 160
-
-
-/datum/reagent/sulfur
- name = "Sulfur"
- id = "sulfur"
- description = "A chemical element."
- reagent_state = SOLID
- color = "#BF8C00" // rgb: 191, 140, 0
-
-
-/datum/reagent/sodium
- name = "Sodium"
- id = "sodium"
- description = "A chemical element."
- reagent_state = SOLID
- color = "#808080" // rgb: 128, 128, 128
-
-
-/datum/reagent/phosphorus
- name = "Phosphorus"
- id = "phosphorus"
- description = "A chemical element."
- reagent_state = SOLID
- color = "#832828" // rgb: 131, 40, 40
-
-
-/datum/reagent/carbon
- name = "Carbon"
- id = "carbon"
- description = "A chemical element."
- reagent_state = SOLID
- color = "#1C1300" // rgb: 30, 20, 0
-
-/datum/reagent/carbon/reaction_turf(turf/T, volume)
- if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T)) // Only add one dirt per turf. Was causing people to crash.
- new /obj/effect/decal/cleanable/dirt(T)
-
-/datum/reagent/gold
- name = "Gold"
- id = "gold"
- description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known."
- reagent_state = SOLID
- color = "#F7C430" // rgb: 247, 196, 48
-
-
-/datum/reagent/silver
- name = "Silver"
- id = "silver"
- description = "A lustrous metallic element regarded as one of the precious metals."
- reagent_state = SOLID
- color = "#D0D0D0" // rgb: 208, 208, 208
-
-
-/datum/reagent/aluminum
- name = "Aluminum"
- id = "aluminum"
- description = "A silvery white and ductile member of the boron group of chemical elements."
- reagent_state = SOLID
- color = "#A8A8A8" // rgb: 168, 168, 168
-
-
-/datum/reagent/silicon
- name = "Silicon"
- id = "silicon"
- description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon."
- reagent_state = SOLID
- color = "#A8A8A8" // rgb: 168, 168, 168
-
-
-/datum/reagent/copper
- name = "Copper"
- id = "copper"
- description = "A highly ductile metal."
- color = "#6E3B08" // rgb: 110, 59, 8
-
-
-/datum/reagent/iron
- name = "Iron"
- id = "iron"
- description = "Pure iron is a metal."
- reagent_state = SOLID
- color = "#C8A5DC" // rgb: 200, 165, 220
-
-/datum/reagent/iron/on_mob_life(mob/living/M)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD))
- H.vessel.add_reagent("blood", 0.8)
- ..()
-
-
-//foam
-/datum/reagent/fluorosurfactant
- name = "Fluorosurfactant"
- id = "fluorosurfactant"
- description = "A perfluoronated sulfonic acid that forms a foam when mixed with water."
- reagent_state = LIQUID
- color = "#9E6B38" // rgb: 158, 107, 56
-
-// metal foaming agent
-// this is lithium hydride. Add other recipies (e.g. LiH + H2O -> LiOH + H2) eventually
-/datum/reagent/ammonia
- name = "Ammonia"
- id = "ammonia"
- description = "A caustic substance commonly used in fertilizer or household cleaners."
- reagent_state = GAS
- color = "#404030" // rgb: 64, 64, 48
-
-/datum/reagent/diethylamine
- name = "Diethylamine"
- id = "diethylamine"
- description = "A secondary amine, useful as a plant nutrient and as building block for other compounds."
- reagent_state = LIQUID
- color = "#322D00"
-
-
-// Ported from Bay as part of the Botany Update
-// Allows you to make planks from any plant that has this reagent in it.
-// Also vines with this reagent are considered dense.
-/datum/reagent/woodpulp
- name = "Wood Pulp"
- id = "woodpulp"
- description = "A mass of wood fibers."
- reagent_state = LIQUID
- color = "#B97A57"
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
deleted file mode 100644
index bbdf92b8693..00000000000
--- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
+++ /dev/null
@@ -1,414 +0,0 @@
-/datum/reagent/toxin
- name = "Toxin"
- id = "toxin"
- description = "A Toxic chemical."
- reagent_state = LIQUID
- color = "#CF3600" // rgb: 207, 54, 0
-
-/datum/reagent/toxin/on_mob_life(mob/living/M)
- M.adjustToxLoss(2)
- ..()
-
-/datum/reagent/spider_venom
- name = "Spider venom"
- id = "spidertoxin"
- description = "A toxic venom injected by spacefaring arachnids."
- reagent_state = LIQUID
- color = "#CF3600" // rgb: 207, 54, 0
-
-/datum/reagent/spider_venom/on_mob_life(mob/living/M)
- M.adjustToxLoss(1.5)
- ..()
-
-/datum/reagent/plasticide
- name = "Plasticide"
- id = "plasticide"
- description = "Liquid plastic, do not eat."
- reagent_state = LIQUID
- color = "#CF3600" // rgb: 207, 54, 0
-
-/datum/reagent/plasticide/on_mob_life(mob/living/M)
- M.adjustToxLoss(1.5)
- ..()
-
-
-/datum/reagent/minttoxin
- name = "Mint Toxin"
- id = "minttoxin"
- description = "Useful for dealing with undesirable customers."
- reagent_state = LIQUID
- color = "#CF3600" // rgb: 207, 54, 0
-
-/datum/reagent/minttoxin/on_mob_life(mob/living/M)
- if(FAT in M.mutations)
- M.gib()
- ..()
-
-/datum/reagent/slimejelly
- name = "Slime Jelly"
- id = "slimejelly"
- description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL."
- reagent_state = LIQUID
- color = "#801E28" // rgb: 128, 30, 40
-
-/datum/reagent/slimejelly/on_mob_life(mob/living/M)
- if(prob(10))
- to_chat(M, "Your insides are burning!")
- M.adjustToxLoss(rand(20,60)*REM)
- else if(prob(40))
- M.adjustBruteLoss(-5*REM)
- ..()
-
-/datum/reagent/slimetoxin
- name = "Mutation Toxin"
- id = "mutationtoxin"
- description = "A corruptive toxin produced by slimes."
- reagent_state = LIQUID
- color = "#13BC5E" // rgb: 19, 188, 94
-
-/datum/reagent/slimetoxin/on_mob_life(mob/living/M)
- if(ishuman(M))
- var/mob/living/carbon/human/human = M
- if(human.species.name != "Shadow")
- to_chat(M, "Your flesh rapidly mutates!")
- to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
- to_chat(M, "Your body reacts violently to light. \green However, it naturally heals in darkness.")
- to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
- ..()
-
-/datum/reagent/aslimetoxin
- name = "Advanced Mutation Toxin"
- id = "amutationtoxin"
- description = "An advanced corruptive toxin produced by slimes."
- reagent_state = LIQUID
- color = "#13BC5E" // rgb: 19, 188, 94
-
-/datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method != TOUCH)
- M.ForceContractDisease(new /datum/disease/transformation/slime(0))
-
-
-/datum/reagent/mercury
- name = "Mercury"
- id = "mercury"
- description = "A chemical element."
- reagent_state = LIQUID
- color = "#484848" // rgb: 72, 72, 72
- metabolization_rate = 0.2
- penetrates_skin = 1
-
-/datum/reagent/mercury/on_mob_life(mob/living/M)
- if(prob(70))
- M.adjustBrainLoss(1)
- ..()
-
-/datum/reagent/chlorine
- name = "Chlorine"
- id = "chlorine"
- description = "A chemical element."
- reagent_state = GAS
- color = "#808080" // rgb: 128, 128, 128
- penetrates_skin = 1
- process_flags = ORGANIC | SYNTHETIC
-
-/datum/reagent/chlorine/on_mob_life(mob/living/M)
- M.adjustFireLoss(1)
- ..()
-
-/datum/reagent/fluorine
- name = "Fluorine"
- id = "fluorine"
- description = "A highly-reactive chemical element."
- reagent_state = GAS
- color = "#6A6054"
- penetrates_skin = 1
- process_flags = ORGANIC | SYNTHETIC
-
-/datum/reagent/fluorine/on_mob_life(mob/living/M)
- M.adjustFireLoss(1)
- M.adjustToxLoss(1*REM)
- ..()
-
-/datum/reagent/radium
- name = "Radium"
- id = "radium"
- description = "Radium is an alkaline earth metal. It is extremely radioactive."
- reagent_state = SOLID
- color = "#C7C7C7" // rgb: 199,199,199
- metabolization_rate = 0.4
- penetrates_skin = 1
-
-/datum/reagent/radium/on_mob_life(mob/living/M)
- if(M.radiation < 80)
- M.apply_effect(4, IRRADIATE, negate_armor = 1)
- ..()
-
-/datum/reagent/radium/reaction_turf(turf/T, volume)
- if(volume >= 3 && !istype(T, /turf/space))
- new /obj/effect/decal/cleanable/greenglow(T)
-
-/datum/reagent/mutagen
- name = "Unstable mutagen"
- id = "mutagen"
- description = "Might cause unpredictable mutations. Keep away from children."
- reagent_state = LIQUID
- color = "#04DF27"
- metabolization_rate = 0.3
-
-/datum/reagent/mutagen/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(!..())
- return
- if(!M.dna)
- return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
- if((method==TOUCH && prob(33)) || method==INGEST)
- randmutb(M)
- domutcheck(M, null)
- M.UpdateAppearance()
-
-/datum/reagent/mutagen/on_mob_life(mob/living/M)
- if(!M.dna)
- return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
- M.apply_effect(2*REM, IRRADIATE, negate_armor = 1)
- if(prob(4))
- randmutb(M)
- ..()
-
-
-/datum/reagent/uranium
- name ="Uranium"
- id = "uranium"
- description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive."
- reagent_state = SOLID
- color = "#B8B8C0" // rgb: 184, 184, 192
-
-/datum/reagent/uranium/on_mob_life(mob/living/M)
- M.apply_effect(2, IRRADIATE, negate_armor = 1)
- ..()
-
-/datum/reagent/uranium/reaction_turf(turf/T, volume)
- if(volume >= 3 && !istype(T, /turf/space))
- new /obj/effect/decal/cleanable/greenglow(T)
-
-
-/datum/reagent/lexorin
- name = "Lexorin"
- id = "lexorin"
- description = "Lexorin temporarily stops respiration. Causes tissue damage."
- reagent_state = LIQUID
- color = "#52685D"
- metabolization_rate = 0.2
-
-/datum/reagent/lexorin/on_mob_life(mob/living/M)
- M.adjustToxLoss(1)
- ..()
-
-
-/datum/reagent/sacid
- name = "Sulphuric acid"
- id = "sacid"
- description = "A strong mineral acid with the molecular formula H2SO4."
- reagent_state = LIQUID
- color = "#00D72B"
- process_flags = ORGANIC | SYNTHETIC
-
-/datum/reagent/sacid/on_mob_life(mob/living/M)
- M.adjustFireLoss(1)
- ..()
-
-/datum/reagent/sacid/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == TOUCH)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
-
- if(volume > 25)
-
- if(H.wear_mask)
- to_chat(H, "Your mask protects you from the acid!")
- return
-
- if(H.head)
- to_chat(H, "Your helmet protects you from the acid!")
- return
-
- if(!M.unacidable)
- if(prob(75))
- var/obj/item/organ/external/affecting = H.get_organ("head")
- if(affecting)
- affecting.take_damage(5, 10)
- H.UpdateDamageIcon()
- H.emote("scream")
- else
- M.take_organ_damage(5,10)
- else
- M.take_organ_damage(5,10)
-
- if(method == INGEST)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
-
- if(volume < 10)
- to_chat(M, "The greenish acidic substance stings you, but isn't concentrated enough to harm you!")
-
- if(volume >=10 && volume <=25)
- if(!H.unacidable)
- M.take_organ_damage(0,min(max(volume-10,2)*2,20))
- M.emote("scream")
-
-
- if(volume > 25)
- if(!M.unacidable)
- if(prob(75))
- var/obj/item/organ/external/affecting = H.get_organ("head")
- if(affecting)
- affecting.take_damage(0, 20)
- H.UpdateDamageIcon()
- H.emote("scream")
- else
- M.take_organ_damage(0,20)
-
-/datum/reagent/sacid/reaction_obj(obj/O, volume)
- if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(40))
- if(!O.unacidable)
- var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
- I.desc = "Looks like this was \an [O] some time ago."
- O.visible_message("[O] melts.")
- qdel(O)
-
-
-/datum/reagent/hellwater
- name = "Hell Water"
- id = "hell_water"
- description = "YOUR FLESH! IT BURNS!"
- process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL.
- metabolization_rate = 1
-
-/datum/reagent/hellwater/on_mob_life(mob/living/M)
- M.fire_stacks = min(5, M.fire_stacks + 3)
- M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
- M.adjustToxLoss(1)
- M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard?
- M.adjustBrainLoss(5)
- ..()
-
-
-/datum/reagent/carpotoxin
- name = "Carpotoxin"
- id = "carpotoxin"
- description = "A deadly neurotoxin produced by the dreaded spess carp."
- reagent_state = LIQUID
- color = "#003333" // rgb: 0, 51, 51
-
-/datum/reagent/carpotoxin/on_mob_life(mob/living/M)
- M.adjustToxLoss(2*REM)
- ..()
-
-/datum/reagent/staminatoxin
- name = "Tirizene"
- id = "tirizene"
- description = "A toxin that affects the stamina of a person when injected into the bloodstream."
- reagent_state = LIQUID
- color = "#6E2828"
- data = 13
-
-/datum/reagent/staminatoxin/on_mob_life(mob/living/M)
- M.adjustStaminaLoss(REM * data)
- data = max(data - 1, 3)
- ..()
-
-
-/datum/reagent/spore
- name = "Spore Toxin"
- id = "spore"
- description = "A natural toxin produced by blob spores that inhibits vision when ingested."
- color = "#9ACD32"
-
-/datum/reagent/spores/on_mob_life(mob/living/M)
- M.adjustToxLoss(1)
- M.damageoverlaytemp = 60
- M.eye_blurry = max(M.eye_blurry, 3)
- ..()
-
-/datum/reagent/beer2 //disguised as normal beer for use by emagged brobots
- name = "Beer"
- id = "beer2"
- description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
- color = "#664300" // rgb: 102, 67, 0
- metabolization_rate = 1.5 * REAGENTS_METABOLISM
-
-/datum/reagent/beer2/on_mob_life(mob/living/M)
- switch(current_cycle)
- if(1 to 50)
- M.AdjustSleeping(1)
- if(51 to INFINITY)
- M.AdjustSleeping(1)
- M.adjustToxLoss((current_cycle - 50)*REM)
- ..()
-
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////
-/datum/reagent/condensedcapsaicin
- name = "Condensed Capsaicin"
- id = "condensedcapsaicin"
- description = "This shit goes in pepperspray."
- reagent_state = LIQUID
- color = "#B31008" // rgb: 179, 16, 8
-
-/datum/reagent/condensedcapsaicin/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == TOUCH)
- if(ishuman(M))
- var/mob/living/carbon/human/victim = M
- var/mouth_covered = 0
- var/eyes_covered = 0
- var/obj/item/safe_thing = null
- if( victim.wear_mask )
- if( victim.wear_mask.flags & MASKCOVERSEYES )
- eyes_covered = 1
- safe_thing = victim.wear_mask
- if( victim.wear_mask.flags & MASKCOVERSMOUTH )
- mouth_covered = 1
- safe_thing = victim.wear_mask
- if( victim.head )
- if( victim.head.flags & MASKCOVERSEYES )
- eyes_covered = 1
- safe_thing = victim.head
- if( victim.head.flags & MASKCOVERSMOUTH )
- mouth_covered = 1
- safe_thing = victim.head
- if(victim.glasses)
- eyes_covered = 1
- if( !safe_thing )
- safe_thing = victim.glasses
- if( eyes_covered && mouth_covered )
- to_chat(victim, "Your [safe_thing] protects you from the pepperspray!")
- return
- else if( mouth_covered ) // Reduced effects if partially protected
- to_chat(victim, "Your [safe_thing] protect you from most of the pepperspray!")
- if(prob(5))
- victim.emote("scream")
- victim.eye_blurry = max(M.eye_blurry, 3)
- victim.eye_blind = max(M.eye_blind, 1)
- victim.confused = max(M.confused, 3)
- victim.damageoverlaytemp = 60
- victim.Weaken(3)
- victim.drop_item()
- return
- else if( eyes_covered ) // Eye cover is better than mouth cover
- to_chat(victim, "Your [safe_thing] protects your eyes from the pepperspray!")
- victim.eye_blurry = max(M.eye_blurry, 3)
- victim.damageoverlaytemp = 30
- return
- else // Oh dear :D
- if(prob(5))
- victim.emote("scream")
- to_chat(victim, "You're sprayed directly in the eyes with pepperspray!")
- victim.eye_blurry = max(M.eye_blurry, 5)
- victim.eye_blind = max(M.eye_blind, 2)
- victim.confused = max(M.confused, 6)
- victim.damageoverlaytemp = 75
- victim.Weaken(5)
- victim.drop_item()
-
-/datum/reagent/condensedcapsaicin/on_mob_life(mob/living/M)
- if(prob(5))
- M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]")
- ..()
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index f8e6f626bb1..f46d4010e69 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -29,9 +29,7 @@
..()
if(!possible_transfer_amounts)
verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT
- var/datum/reagents/R = new/datum/reagents(volume)
- reagents = R
- R.my_atom = src
+ create_reagents(volume)
processing_objects.Add(src)
if(spawned_disease)
var/datum/disease/F = new spawned_disease(0)
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 634e0875aaf..c69c7b4a0ef 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -118,4 +118,4 @@
empty = 0
if(empty)
- to_chat(user, "It is currently empty. Allow some time for the internal syntheszier to produce more.")
+ to_chat(user, "It is currently empty. Allow some time for the internal syntheszier to produce more.")
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index a22802a4a45..d46ba85c3c9 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -1,4 +1,3 @@
-
//Not to be confused with /obj/item/weapon/reagent_containers/food/drinks/bottle
@@ -331,4 +330,4 @@
name = "BVAK bottle"
desc = "A small bottle containing Bio Virus Antidote Kit."
icon_state = "wide_bottle"
- list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10)
+ list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10)
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 32836a15cc9..60c924e0515 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -1,4 +1,4 @@
- ////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
/// (Mixing)Glass.
////////////////////////////////////////////////////////////////////////////////
/obj/item/weapon/reagent_containers/glass
@@ -331,7 +331,7 @@
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_HEAD
flags = OPENCONTAINER
-
+
/obj/item/weapon/reagent_containers/glass/bucket/equipped(mob/user, slot)
..()
if(slot == slot_head && reagents.total_volume)
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 6533dbf52c2..490f46e0a52 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -110,4 +110,4 @@
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(50)
volume = 50
- list_reagents = list("stimulants" = 50)
+ list_reagents = list("stimulants" = 50)
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/patch.dm b/code/modules/reagents/reagent_containers/patch.dm
similarity index 100%
rename from code/modules/reagents/newchem/patch.dm
rename to code/modules/reagents/reagent_containers/patch.dm
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 1da5f07b2e5..a6fd792e795 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -80,12 +80,6 @@
icon_state = "pill8"
list_reagents = list("haloperidol" = 15)
-/obj/item/weapon/reagent_containers/food/pill/paroxetine
- name = "Paroxetine pill"
- desc = "Heavy anti-depressant."
- icon_state = "pill8"
- list_reagents = list("paroxetine" = 15)
-
/obj/item/weapon/reagent_containers/food/pill/happy
name = "Happy pill"
desc = "Happy happy joy joy!"
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 3972f0a4a13..a706d443d90 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -216,4 +216,4 @@
if(istype(A, /obj/effect/blob)) // blob damage in blob code
return
- ..()
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index f5225daeae1..4c2d2caa6b8 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -16,9 +16,7 @@
return
/obj/structure/reagent_dispensers/New()
- var/datum/reagents/R = new/datum/reagents(1000)
- reagents = R
- R.my_atom = src
+ create_reagents(1000)
if(!possible_transfer_amounts)
verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
..()
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 2a36ba585df..1e56d9d6d57 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -300,7 +300,7 @@
/obj/machinery/conveyor_switch/multitool_menu(var/mob/user, var/obj/item/device/multitool/P)
return {"
"}
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 85657dd2b5b..232d2a9b3c5 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -255,20 +255,20 @@
/obj/machinery/disposal/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
- var/pressure = 100 * air_contents.return_pressure() / (SEND_PRESSURE)
+ var/pressure = Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100)
var/pressure_round = round(pressure,1)
data["isAI"] = isAI(user)
data["flushing"] = flush
data["mode"] = mode
if(mode <= 0)
- data["pumpstatus"] = ""
+ data["pumpstatus"] = "N/A"
else if(mode == 1)
- data["pumpstatus"] = "(pressurizing)"
+ data["pumpstatus"] = "Pressurizing"
else if(mode == 2)
- data["pumpstatus"] = "(ready)"
+ data["pumpstatus"] = "Ready"
else
- data["pumpstatus"] = "(idle)"
+ data["pumpstatus"] = "Idle"
data["pressure"] = pressure_round
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index c373513a5f1..702afa68f2f 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -953,7 +953,7 @@
desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles."
id = "mech_plasma_cutter"
build_type = MECHFAB
- req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3, "combat" = 1, "plasma" = 2)
+ req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3, "combat" = 1, "plasmatech" = 2)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
materials = list(MAT_METAL=1500, MAT_GLASS=500, MAT_PLASMA=200)
construction_time = 100
diff --git a/code/modules/research/designs/spacepod_designs.dm b/code/modules/research/designs/spacepod_designs.dm
index 759af82404d..4638a1bb830 100644
--- a/code/modules/research/designs/spacepod_designs.dm
+++ b/code/modules/research/designs/spacepod_designs.dm
@@ -121,7 +121,7 @@
desc = "Allows for the construction of a spacepod mounted laser."
id = "podgun_laser"
build_type = PODFAB
- req_tech = list("materials" = 3, "combat" = 3, "plasma" = 2)
+ req_tech = list("materials" = 3, "combat" = 3, "plasmatech" = 2)
build_path = /obj/item/device/spacepod_equipment/weaponry/laser
category = list("Pod_Weaponry")
materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_GOLD=1000,MAT_SILVER=2000)
@@ -250,4 +250,4 @@
build_type = PODFAB
materials = list(MAT_METAL=500)
build_path = /obj/item/device/spacepod_key
- category = list("Pod_Parts")
\ No newline at end of file
+ category = list("Pod_Parts")
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 1fec6186c60..421f0cf8e92 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -680,7 +680,7 @@
warn_admins(user, "Flash")
/obj/item/weapon/relic/proc/petSpray(mob/user)
- var/message = "[src] begans to shake, and in the distance the sound of rampaging animals arises!"
+ var/message = "[src] begins to shake, and in the distance the sound of rampaging animals arises!"
visible_message(message)
to_chat(user, message)
var/animals = rand(1,25)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
index 373b5d9454f..0e83e5812c3 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
@@ -37,7 +37,7 @@
to_chat(H, "[pick(messages)]")
if(prob(50))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
/datum/artifact_effect/badfeeling/DoEffectAura()
if(holder)
@@ -50,7 +50,7 @@
to_chat(H, "[pick(drastic_messages)]")
if(prob(10))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
return 1
/datum/artifact_effect/badfeeling/DoEffectPulse()
@@ -64,7 +64,7 @@
to_chat(H, "[pick(messages)]")
if(prob(50))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
else if(prob(25))
- H.dizziness += rand(5,15)
+ H.AdjustDizzy(rand(5,15))
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
index 08639dec98f..dd42c44204c 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
@@ -35,7 +35,7 @@
to_chat(H, "[pick(messages)]")
if(prob(50))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
/datum/artifact_effect/goodfeeling/DoEffectAura()
if(holder)
@@ -48,7 +48,7 @@
to_chat(H, "[pick(drastic_messages)]")
if(prob(5))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
return 1
/datum/artifact_effect/goodfeeling/DoEffectPulse()
@@ -62,7 +62,7 @@
to_chat(H, "[pick(messages)]")
if(prob(50))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
else if(prob(25))
- H.dizziness += rand(5,15)
+ H.AdjustDizzy(rand(5,15))
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
index bbb16d76a3d..1f098ddfa6b 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
@@ -13,8 +13,8 @@
if(ishuman(toucher) && prob(weakness * 100))
var/mob/living/carbon/human/H = toucher
to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
- H.drowsyness = min(H.drowsyness + rand(5,25) * weakness, 50 * weakness)
- H.eye_blurry = min(H.eye_blurry + rand(1,3) * weakness, 50 * weakness)
+ H.AdjustDrowsy(rand(5,25) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
+ H.AdjustEyeBlurry(rand(1,3) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
return 1
else if(isrobot(toucher))
to_chat(toucher, "\red SYSTEM ALERT: CPU cycles slowing down.")
@@ -28,8 +28,8 @@
if(prob(weakness * 100))
if(prob(10))
to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
- H.drowsyness = min(H.drowsyness + 1 * weakness, 25 * weakness)
- H.eye_blurry = min(H.eye_blurry + 1 * weakness, 25 * weakness)
+ H.AdjustDrowsy(1 * weakness, bound_lower = 0, bound_upper = 25 * weakness)
+ H.AdjustEyeBlurry(1 * weakness, bound_lower = 0, bound_upper = 25 * weakness)
for(var/mob/living/silicon/robot/R in range(src.effectrange,holder))
to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.")
return 1
@@ -41,8 +41,8 @@
var/weakness = GetAnomalySusceptibility(H)
if(prob(weakness * 100))
to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
- H.drowsyness = min(H.drowsyness + rand(5,15) * weakness, 50 * weakness)
- H.eye_blurry = min(H.eye_blurry + rand(5,15) * weakness, 50 * weakness)
+ H.AdjustDrowsy(rand(5,15) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
+ H.AdjustEyeBlurry(rand(5,15) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
for(var/mob/living/silicon/robot/R in range(src.effectrange,holder))
to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.")
return 1
diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm
index ce6fb4c2663..8ddcf27593b 100644
--- a/code/modules/research/xenoarchaeology/finds/finds_special.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm
@@ -194,7 +194,7 @@
'sound/hallucinations/turn_around1.ogg',\
'sound/hallucinations/turn_around2.ogg',\
), 50, 1, -3)
- M.sleeping = max(M.sleeping,rand(5,10))
+ M.Sleeping(rand(5,10))
src.loc = null
else
processing_objects.Remove(src)
diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm
index 188bf7597c2..8ff0ed6eb64 100644
--- a/code/modules/security_levels/keycard authentication.dm
+++ b/code/modules/security_levels/keycard authentication.dm
@@ -3,6 +3,7 @@
desc = "This device is used to trigger station functions, which require more than one ID card to authenticate."
icon = 'icons/obj/monitors.dmi'
icon_state = "auth_off"
+
var/active = 0 //This gets set to 1 on all devices except the one where the initial request was made.
var/event = ""
var/screen = 1
@@ -14,25 +15,25 @@
var/mob/event_triggered_by
var/mob/event_confirmed_by
var/ert_reason = "Reason for ERT"
- //1 = select event
- //2 = authenticate
- anchored = 1.0
+
+ anchored = 1
use_power = 1
idle_power_usage = 2
active_power_usage = 6
power_channel = ENVIRON
+
+ req_access = list(access_keycard_auth)
/obj/machinery/keycard_auth/attack_ai(mob/user as mob)
- to_chat(user, "The station AI is not to interact with these devices.")
+ to_chat(user, "The station AI is not to interact with these devices.")
return
/obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(stat & (NOPOWER|BROKEN))
to_chat(user, "This device is not powered.")
return
- if(istype(W,/obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/ID = W
- if(access_keycard_auth in ID.access)
+ if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
+ if(check_access(W))
if(active == 1)
//This is not the device that made the initial request. It is the device confirming the request.
if(event_source)
@@ -44,6 +45,8 @@
return
event_triggered_by = usr
broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices
+ else
+ to_chat(user, "Access denied.")
/obj/machinery/keycard_auth/power_change()
if(powered(ENVIRON))
@@ -51,16 +54,16 @@
icon_state = "auth_off"
else
stat |= NOPOWER
+
+/obj/machinery/keycard_auth/attack_ghost(mob/user)
+ ui_interact(user)
/obj/machinery/keycard_auth/attack_hand(mob/user as mob)
- if(!user.IsAdvancedToolUser())
- return 0
+ if(..())
+ return 1
ui_interact(user)
/obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(user.stat || stat & (NOPOWER|BROKEN))
- to_chat(user, "This device is not powered.")
- return
if(busy)
to_chat(user, "This device is busy.")
return
@@ -74,19 +77,18 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
- ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 520, 320)
+ ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 540, 320)
ui.set_initial_data(data)
ui.open()
/obj/machinery/keycard_auth/Topic(href, href_list)
if(..())
- return
+ return 1
+
if(busy)
to_chat(usr, "This device is busy.")
return
- if(usr.stat || stat & (BROKEN|NOPOWER))
- to_chat(usr, "This device is without power.")
- return
+
if(href_list["triggerevent"])
event = href_list["triggerevent"]
screen = 2
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index b17eb9940ea..1c71f8837ee 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -141,6 +141,9 @@
qdel(ion_trail)
ion_trail = null
occupant_sanity_check()
+ if(pilot)
+ pilot.forceMove(get_turf(src))
+ pilot = null
if(passengers)
for(var/mob/M in passengers)
M.forceMove(get_turf(src))
@@ -197,8 +200,7 @@
/obj/spacepod/bullet_act(var/obj/item/projectile/P)
if(P.damage_type == BRUTE || P.damage_type == BURN)
deal_damage(P.damage)
- else if(P.flag == "energy" && istype(P,/obj/item/projectile/ion)) //needed to make sure ions work properly
- empulse(src, 1, 1)
+ P.on_hit(src)
/obj/spacepod/blob_act()
deal_damage(30)
@@ -227,29 +229,15 @@
health = max(0, health - damage)
var/percentage = (health / initial(health)) * 100
occupant_sanity_check()
- if(passengers && oldhealth > health && percentage <= 25 && percentage > 0)
- var/sound/S = sound('sound/effects/engine_alert2.ogg')
- S.wait = 0 //No queue
- S.channel = 0 //Any channel
- S.volume = 50
- for(var/mob/M in passengers)
- M << S
- if(passengers && oldhealth > health && !health)
- var/sound/S = sound('sound/effects/engine_alert1.ogg')
- S.wait = 0
- S.channel = 0
- S.volume = 50
- for(var/mob/M in passengers)
- M << S
+ if(oldhealth > health && percentage <= 25 && percentage > 0)
+ play_sound_to_riders('sound/effects/engine_alert2.ogg')
+ if(oldhealth > health && !health)
+ play_sound_to_riders('sound/effects/engine_alert1.ogg')
if(!health)
spawn(0)
- if(passengers)
- for(var/mob/M in passengers)
- to_chat(M, "Critical damage to the vessel detected, core explosion imminent!")
+ message_to_riders("Critical damage to the vessel detected, core explosion imminent!")
for(var/i = 10, i >= 0; --i)
- if(passengers)
- for(var/mob/M in passengers)
- to_chat(M, "[i]")
+ message_to_riders("[i]")
if(i == 0)
explosion(loc, 2, 4, 8)
qdel(src)
@@ -267,12 +255,13 @@
occupant_sanity_check()
switch(severity)
if(1)
- for(var/mob/M in passengers)
- var/mob/living/carbon/human/H = M
- if(H)
- H.forceMove(get_turf(src))
- H.ex_act(severity + 1)
- to_chat(H, "You are forcefully thrown from \the [src]!")
+ if(passengers || pilot)
+ for(var/mob/M in passengers | pilot)
+ var/mob/living/carbon/human/H = M
+ if(H)
+ H.forceMove(get_turf(src))
+ H.ex_act(severity + 1)
+ to_chat(H, "You are forcefully thrown from \the [src]!")
qdel(ion_trail)
qdel(src)
if(2)
@@ -284,35 +273,35 @@
/obj/spacepod/emp_act(severity)
occupant_sanity_check()
cargo_hold.emp_act(severity)
+
+ if(battery && battery.charge > 0)
+ battery.use((battery.charge / 2) / severity)
+ deal_damage(80 / severity)
+ if(empcounter < (40 / severity))
+ empcounter = 40 / severity
+ processing_objects.Add(src)
+
switch(severity)
if(1)
- if(pilot)
- to_chat(pilot, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")
- if(passengers)
- for(var/mob/M in passengers)
- to_chat(M, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")//warn the passengers
-
-
- if(battery)
- battery.charge = max(0, battery.charge - 5000) //Cell EMP act is too weak, this pod needs to be sapped.
- src.deal_damage(100)
- if(src.empcounter < 40)
- src.empcounter = 40 //Disable movement for 40 ticks. Plenty long enough.
- processing_objects.Add(src)
-
+ message_to_riders("The pod console flashes 'Heavy EMP WAVE DETECTED'.")
if(2)
- if(pilot)
- to_chat(pilot, "The pod console flashes 'EMP WAVE DETECTED'.")
- if(passengers)
- for(var/mob/M in passengers)
- to_chat(M, "The pod console flashes 'EMP WAVE DETECTED'.")//warn the passengers
+ message_to_riders("The pod console flashes 'EMP WAVE DETECTED'.")
- deal_damage(40)
- if(battery)
- battery.charge = max(0, battery.charge - 2500) //Cell EMP act is too weak, this pod needs to be sapped.
- if(empcounter < 20)
- empcounter = 20 //Disable movement for 20 ticks.
- processing_objects.Add(src)
+/obj/spacepod/proc/play_sound_to_riders(mysound)
+ if(length(passengers | pilot) == 0)
+ return
+ var/sound/S = sound(mysound)
+ S.wait = 0 //No queue
+ S.channel = 0 //Any channel
+ S.volume = 50
+ for(var/mob/M in passengers | pilot)
+ M << S
+
+/obj/spacepod/proc/message_to_riders(mymessage)
+ if(length(passengers | pilot) == 0)
+ return
+ for(var/mob/M in passengers | pilot)
+ to_chat(M, mymessage)
/obj/spacepod/attackby(obj/item/W as obj, mob/user as mob, params)
if(user.a_intent == I_HARM)
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index 406c1f83083..6c2f7354b43 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -55,7 +55,7 @@
user.visible_message(" [user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \
" Your hand slips, slicing [target]'s throat wth \the [tool]!" )
affected.createwound(CUT, 60)
- target.losebreath += 4
+ target.AdjustLoseBreath(4)
return 0
@@ -83,7 +83,7 @@
/datum/surgery_step/face/mend_vocal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
user.visible_message(" [user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \
" Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!")
- target.losebreath += 4
+ target.AdjustLoseBreath(4)
return 0
/datum/surgery_step/face/fix_face
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index a0dcd29525f..794bf2a3e9f 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -162,9 +162,9 @@
var/obj/item/organ/external/head/H = target.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[H.model]
if(robohead.is_monitor) //Ensures that if an IPC gets a head that's got a human hair wig attached to their body, the hair won't wipe.
- H.h_style = ""
- H.f_style = ""
- target.m_style = ""
+ H.h_style = "Bald"
+ H.f_style = "Shaved"
+ target.m_styles["head"] = "None"
E.status &= ~ORGAN_DESTROYED
if(E.children)
for(var/obj/item/organ/external/C in E.children)
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index b860e3f062c..88f8078a2ba 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -133,9 +133,9 @@
if(crit_fail)
return
if(owner.stunned > STUN_SET_AMOUNT)
- owner.stunned = STUN_SET_AMOUNT
+ owner.SetStunned(STUN_SET_AMOUNT)
if(owner.weakened > STUN_SET_AMOUNT)
- owner.weakened = STUN_SET_AMOUNT
+ owner.SetWeakened(STUN_SET_AMOUNT)
/obj/item/organ/internal/cyberimp/brain/anti_stun/emp_act(severity)
if(crit_fail)
diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm
index 9034393bfe2..f71e9bff0be 100644
--- a/code/modules/surgery/organs/blood.dm
+++ b/code/modules/surgery/organs/blood.dm
@@ -101,7 +101,7 @@
else
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
if(prob(5))
- eye_blurry = max(eye_blurry, 6)
+ EyeBlurry(6)
var/word = pick("dizzy","woozy","faint")
to_chat(src, "You feel very [word].")
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index d10fea6b7aa..ce4b55efb11 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -860,11 +860,13 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/proc/mutate()
src.status |= ORGAN_MUTATED
- if(owner) owner.update_body()
+ if(owner)
+ owner.update_body(1, 1) //Forces all bodyparts to update in order to correctly render the deformed sprite.
/obj/item/organ/external/proc/unmutate()
src.status &= ~ORGAN_MUTATED
- if(owner) owner.update_body()
+ if(owner)
+ owner.update_body(1, 1) //Forces all bodyparts to update in order to correctly return them to normal.
/obj/item/organ/external/proc/get_damage() //returns total damage
return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use health?
diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm
index 31ef55f4919..03690ef3279 100644
--- a/code/modules/surgery/organs/organ_icon.dm
+++ b/code/modules/surgery/organs/organ_icon.dm
@@ -107,13 +107,14 @@ var/global/list/limb_icon_cache = list()
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
- if(owner.m_style)
- var/datum/sprite_accessory/marking_style = marking_styles_list[owner.m_style]
- if(marking_style && marking_style.species_allowed && (species.name in marking_style.species_allowed) && marking_style.marking_location == "head")
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- if(marking_style.do_colouration)
- markings_s.Blend(rgb(owner.r_markings, owner.g_markings, owner.b_markings), ICON_ADD)
- overlays |= markings_s
+ var/head_marking = owner.m_styles["head"]
+ if(head_marking && head_marking != "None")
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed && (species.name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head")
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ if(head_marking_style.do_colouration)
+ h_marking_s.Blend(owner.m_colours["head"], ICON_ADD)
+ overlays |= h_marking_s
if(ha_style)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style]
@@ -158,6 +159,10 @@ var/global/list/limb_icon_cache = list()
gender = "f"
else
gender = "m"
+ if(limb_name == "head" && !is_stump() && !(status & ORGAN_DESTROYED))
+ var/obj/item/organ/external/head/head_organ = src
+ head_organ.handle_alt_icon()
+
new_icon_state = "[icon_name][gender ? "_[gender]" : ""]"
if(skeletal)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index bb408f51726..5dd4d570ee2 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -307,7 +307,7 @@
owner.drip(10)
if(prob(4))
spawn owner.custom_emote(1, "gasps for air!")
- owner.losebreath += 5
+ owner.AdjustLoseBreath(5)
/obj/item/organ/internal/kidneys
name = "kidneys"
@@ -327,7 +327,7 @@
// Coffee is really bad for you with busted kidneys.
// This should probably be expanded in some way, but fucked if I know
// what else kidneys can process in our reagent list.
- var/datum/reagent/coffee = locate(/datum/reagent/drink/coffee) in owner.reagents.reagent_list
+ var/datum/reagent/coffee = locate(/datum/reagent/consumable/drink/coffee) in owner.reagents.reagent_list
if(coffee)
if(is_bruised())
owner.adjustToxLoss(0.1 * PROCESS_ACCURACY)
@@ -357,10 +357,10 @@
/obj/item/organ/internal/eyes/surgeryize()
if(!owner)
return
- owner.disabilities &= ~NEARSIGHTED
- owner.disabilities &= ~BLIND
- owner.eye_blurry = 0
- owner.eye_blind = 0
+ owner.CureNearsighted()
+ owner.CureBlind()
+ owner.SetEyeBlurry(0)
+ owner.SetEyeBlind(0)
/obj/item/organ/internal/liver
@@ -416,7 +416,7 @@
if(src.damage >= src.min_bruised_damage)
for(var/datum/reagent/R in owner.reagents.reagent_list)
// Ethanol and all drinks are bad
- if(istype(R, /datum/reagent/ethanol))
+ if(istype(R, /datum/reagent/consumable/ethanol))
owner.adjustToxLoss(0.1 * PROCESS_ACCURACY)
// Can't cope with toxins at all
@@ -493,6 +493,7 @@
slot = "brain_tumor"
health = 3
var/organhonked = 0
+ var/suffering_delay = 900
/obj/item/organ/internal/honktumor/New()
..()
@@ -535,11 +536,11 @@
return
if(organhonked < world.time)
- organhonked = world.time+900
+ organhonked = world.time + suffering_delay
to_chat(owner, "HONK")
- owner.sleeping = 0
- owner.stuttering = 20
- owner.adjustEarDamage(0, 30)
+ owner.SetSleeping(0)
+ owner.Stuttering(20)
+ owner.AdjustEarDeaf(30)
owner.Weaken(3)
owner << 'sound/items/AirHorn.ogg'
if(prob(30))
diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm
index 23d2af69bf3..f0b4b912eaf 100644
--- a/code/modules/surgery/organs/pain.dm
+++ b/code/modules/surgery/organs/pain.dm
@@ -15,8 +15,8 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0
if(world.time < next_pain_time && !force)
return
if(amount > 10 && istype(src,/mob/living/carbon/human))
- if(src:paralysis)
- src:paralysis = max(0, src:paralysis-round(amount/10))
+ if(paralysis)
+ AdjustParalysis(-round(amount/10))
if(amount > 50 && prob(amount / 5))
src:drop_item()
var/msg
@@ -132,4 +132,4 @@ mob/living/carbon/human/proc/handle_pain()
toxDamageMessage = "Your body aches all over, it's driving you mad."
if(toxDamageMessage && prob(toxMessageProb))
- src.custom_pain(toxDamageMessage, getToxLoss() >= 15)
\ No newline at end of file
+ src.custom_pain(toxDamageMessage, getToxLoss() >= 15)
diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm
index 0f75fe9f80f..a4b0d8fb92b 100644
--- a/code/modules/surgery/organs/subtypes/diona.dm
+++ b/code/modules/surgery/organs/subtypes/diona.dm
@@ -169,10 +169,10 @@
/obj/item/organ/internal/diona_receptor/surgeryize()
if(!owner)
return
- owner.disabilities &= ~NEARSIGHTED
- owner.disabilities &= ~BLIND
- owner.eye_blurry = 0
- owner.eye_blind = 0
+ owner.CureNearsighted()
+ owner.CureBlind()
+ owner.SetEyeBlurry(0)
+ owner.SetEyeBlind(0)
//TODO:Make absorb rads on insert
diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm
index 61b2f143f69..0f402a42e5d 100644
--- a/code/modules/surgery/organs/subtypes/machine.dm
+++ b/code/modules/surgery/organs/subtypes/machine.dm
@@ -142,10 +142,10 @@
/obj/item/organ/internal/optical_sensor/surgeryize()
if(!owner)
return
- owner.disabilities &= ~NEARSIGHTED
- owner.disabilities &= ~BLIND
- owner.eye_blurry = 0
- owner.eye_blind = 0
+ owner.CureNearsighted()
+ owner.CureBlind()
+ owner.SetEyeBlurry(0)
+ owner.SetEyeBlind(0)
// Used for an MMI or posibrain being installed into a human.
diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm
index 02351f523a8..faa6c403355 100644
--- a/code/modules/surgery/organs/subtypes/standard.dm
+++ b/code/modules/surgery/organs/subtypes/standard.dm
@@ -159,11 +159,15 @@
gendered_icon = 1
encased = "skull"
var/can_intake_reagents = 1
+ var/alt_head = "None"
//Hair colour and style
var/r_hair = 0
var/g_hair = 0
var/b_hair = 0
+ var/r_hair_sec = 0
+ var/g_hair_sec = 0
+ var/b_hair_sec = 0
var/h_style = "Bald"
//Head accessory colour and style
@@ -176,6 +180,9 @@
var/r_facial = 0
var/g_facial = 0
var/b_facial = 0
+ var/r_facial_sec = 0
+ var/g_facial_sec = 0
+ var/b_facial_sec = 0
var/f_style = "Shaved"
/obj/item/organ/external/head/remove()
@@ -197,6 +204,8 @@
if(owner)//runtimer no runtiming
owner.update_hair()
owner.update_fhair()
+ owner.update_head_accessory()
+ owner.update_markings()
. = ..()
/obj/item/organ/external/head/replaced()
@@ -213,6 +222,17 @@
if(burn_dam > 40)
disfigure("burn")
+/obj/item/organ/external/head/proc/handle_alt_icon()
+ if(alt_head && alt_heads_list[alt_head])
+ var/datum/sprite_accessory/alt_heads/alternate_head = alt_heads_list[alt_head]
+ if(alternate_head.icon_state)
+ icon_name = alternate_head.icon_state
+ else //If alternate_head.icon_state doesn't exist, that means alternate_head is "None", so default icon_name back to "head".
+ icon_name = initial(icon_name)
+ else //If alt_head is null, set it to "None" and default icon_name for sanity.
+ alt_head = initial(alt_head)
+ icon_name = initial(icon_name)
+
/obj/item/organ/external/head/set_dna(datum/dna/new_dna)
..()
new_dna.write_head_attributes(src)
diff --git a/html/browser/common.css b/html/browser/common.css
index 8c0a0253599..23b675f7fa2 100644
--- a/html/browser/common.css
+++ b/html/browser/common.css
@@ -339,4 +339,10 @@ div.notice
{
width: 100%;
clear: both;
+}
+.charPreview
+{
+ -ms-interpolation-mode: nearest-neighbor;
+ width: 64px;
+ height:64px;
}
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index 8279fa001b3..46d21c4293a 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,203 @@
-->
+ 01 December 2016
+ Crazylemon64 updated:
+
+ - Cryo tubes no longer let you excessively multiply the efficiency of touch chems
+
+ KasparoVy updated:
+
+ - The character preview icon in character creation is now more detailed and less blurry.
+ - ID cards now show tails, body accessories and tail markings correctly.
+
+ Twinmold93 updated:
+
+ - Pilots of spacepods will no longer be sent to the void when the space pod is destroyed in any method.
+ - Pilots of spacepods will now get the same warnings for damage/core destruction that passengers get.
+
+
+ 29 November 2016
+ KasparoVy updated:
+
+ - Head, body and tail markings are now loaded correctly from genes (UI).
+ - Changes to a person's skin-tone gene are now immediately apparent.
+
+
+ 28 November 2016
+ Allfd updated:
+
+ - Fixes an issue with the processing of GitHub changelog emoji in the php webhook.
+
+ Crazylemon64 updated:
+
+ - The RCD no longer shall work as a remote permissions control
+
+ KasparoVy updated:
+
+ - Pressing the light switch in one OR will no longer turn off the lights for both.
+ - The fire alarms in each OR now work independently of each-other.
+ - The second operating room now has its own APC and wiring.
+
+
+ 26 November 2016
+ Fox McCloud updated:
+
+ - Fixes faint emote doing nothing
+ - Fixes Mickey Finn's Special Brew not functioning properly/not making you fall asleep
+
+
+ 23 November 2016
+ Fethas updated:
+
+ - Fixes human jetpacks..maybe...
+
+ FlattestNerd updated:
+
+ - the e20 will now get logged when it goes BEWM, as it should.
+
+ Fox McCloud updated:
+
+ - Fixes double-breaking news newscaster
+
+
+ 22 November 2016
+ KasparoVy updated:
+
+ - You now stutter when you're in shock/crit and when you've got the nervous disability as you used to.
+
+ Twinmold93 updated:
+
+ - Runtime caused by lack of settlers in the Orion arcade game.
+
+
+ 20 November 2016
+ KasparoVy updated:
+
+ - The DNA SE injectors one can find in the abandoned mining crates now correctly activate/deactivate the powers they may contain.
+
+
+ 15 November 2016
+ KasparoVy updated:
+
+ - Adding cable to multiple computer frames at the same time while not having the correct amount of cables will no longer cause busted coils with a negative number of cables.
+
+
+ 13 November 2016
+ Fox McCloud updated:
+
+ - Fixes BSA having peculiar results.
+
+
+ 07 November 2016
+ Crazylemon updated:
+
+ - Status effects should work a little more consistently now
+
+ Crazylemon64 updated:
+
+ - The mech-mounted plasma cutter can now be constructed again
+ - Space pod lasers can now be constructed again
+
+ Fox McCloud updated:
+
+ - Fixes hunters not being weakened when crashing into a shield/wall
+ - Fixes xeno stuns half the time intended
+ - Fixes stopping, dropping, and rolling not properly weakening Xenos/Hulks
+
+ KasparoVy updated:
+
+ - Fixes a bug where changing your alt head required two icon updates to show.
+ - Fixes a bug where you couldn't choose head marking styles that would ordinarily be available regardless of your alt head.
+ - Fixes a bug where Tajara couldn't choose undergarments.
+ - Resolves an issue with the Vulpkanin Jagged hairstyle missing a pixel.
+
+ Twinmold93 updated:
+
+ - Fixes a runtime issue caused by using the detective's scanner on the space hotel cleaver.
+ - Scrubber pipe missing segment behind the operating theatres.
+
+
+ 23 October 2016
+ KasparoVy updated:
+
+ - Refactors markings. Now split into head, body and tail markings.
+ - Refactors morph again. Changes made while morphing are now reflected instantly on your sprite.
+ - Darkens Vulpkanin and Tajara for improved colour fidelity. Species base colour changed to compensate. Add 27 to R, G and B values if Vulp, 15 if Taj to keep the same colour on your character.
+ - Darkens Vulpkanin facial fur patterns for improved colour fidelity. Add 23 to the R, G and B values of your facial hair/head accessory to keep the same colour on your character.
+ - Darkens Unathi frills and horns. Add 27 to the R, G and B values of your frills and 21 for horns to keep the same colour on your character.
+ - Vulpkanin tails are now split-rendered. Tails overlap hair when facing north, but are overlapped by hair when facing all other directions. No other differences, only affects the fluffy husky tail.
+ - The heads of tiger markings have been isolated and can now be coloured independently.
+ - Hair can now cover facial hair, and glasses are no longer covered by facial hair and head accessories. Means that two-piece Vulpkanin facial fur patterns won't almost entirely cover whatever glasses they're wearing.
+ - Tajaran head and facial hair have been darkened. Add 28 to the R, G and B values of your Tajara head/facial hair to keep the same colour on your character.
+ - Vulpkanin head hair and one facial hair style has been darkened. Refer to PR notes for darkening factors.
+ - The HAS_MARKINGS flag now represents all marking locations. The HAS_location_MARKINGS flags are for specific locations (head, body, tail).
+ - Improves the quality of some Vulpkanin/Tajara/Unathi mask sprites.
+ - Naked Humans and Skrell will no longer have exposed flesh poking out their wrists when facing east or west. Male Humans now no longer lack a butt pixel when facing east or west.
+ - Mutated limbs now render correctly as soon as they're mutated.
+ - Mobs will now correctly appear as fat/skinny.
+ - Species with TAIL_OVERLAPPED will no longer wag tail at max speed when facing north.
+ - Species with TAIL_OVERLAPPED and body accessories won't crash the game when they wag.
+ - Tiger Head and Face markings adjusted so they don't look ugly on certain species' ears.
+ - Fixes issue where Unathi dorsal stripe didn't render.
+ - Tajaran ears are no longer in their hair sprites, but on their actual heads.
+ - The adminbus body accessory now overrides the TAIL_OVERLAPPED flag and will now be rendered correctly on a body regardless of species bodyflags.
+ - Changing a person's species via CMA will no longer result in a mob with all the same cosmetic attributes as the old species.
+ - Dressers now have species fitting checks for undergarments. Drask are now able to wear undershirts and underwear like they were originally meant to.
+ - Adds some head markings for Tajara and Vulpkanin.
+ - Adds body marking(s) for Tajara, Vulpkanin, Unathi and Drask.
+ - Adds tail markings for Vox and Vulpkanin.
+ - Adds 5 Tajaran hairstyles.
+ - Adds a tweaked version of an existing Vox hairstyle. Shouldn't clip with certain jackets as much.
+ - Adds a hairstyle for Humans, Unathi and Vulpkanin.
+ - Adds a facial hairstyle for Vulpkanin.
+ - Adds secondary hair (head and facial) themes. Skrell can now colour their tentacle cloths independently, the beads in the Tajaran/Hippie braid hairstyles can be coloured and the same with the webbing in Unathi frills. Can be changed at nanomirrors, via morph and CMA.
+ - Adds alternate heads. Unathi can now choose a head with a sharp snout. Can be changed via morph and CMA.
+ - Helper procs to convert a hex colour into either R, G, or B.
+ - Markings, body accessories, head accessories, alt heads and their colours (if they have colours) can now be randomized at the character preferences screen.
+ - Adds a system that attempts to fit mobs with alternate heads with appropriate mask sprites. The sprites just need to be suffixed with the alt_head suffix in sprite_accessories.dm.
+ - Adds mask sprites tweaked to fit the new Unathi alternate head to go along with the new alt. head mask fitting system.
+
+
+ 15 October 2016
+ Crazylemon64 updated:
+
+ - The R&D console should now no longer freeze on the "Syncing Database" message or whatever.
+ - Borg coolers and SMES boards can be made again
+ - Maroon now works
+
+ FlattestGuitar updated:
+
+ - pAIs no longer turn into debris when wiped
+ - SNPCs no longer get targeted by assasinate objectives
+ - fixes a hallucination runtime, actually making one more aspect of being high as f*** work for the first time in ages
+ - NODROP items will no longer attempt to be dropped if your hand is broken
+
+ Fox McCloud updated:
+
+ - Cloners will now put you inside the cloned body when it is fully grown as opposed to initially created
+ - Examining a cloner will tell you the clone progress
+ - Observers can now see a visual countdown of the cloning status progression
+ - Atmos grenades cost increased from 6 to 11
+ - Mice now have sprites when worn
+ - Fixes various ghost alerts having barely visible icons
+ - Fixes items being in two locations at once when loading things into the bio-generator or reagent grinder.
+
+ GeneralChaos81 updated:
+
+ - Ability to place and remove conveyor belts and levers.
+
+ KasparoVy updated:
+
+ - Botany, viro and xenobio bottles will no longer be invisible.
+
+ Krausus updated:
+
+ - Fixed full chat panes scrolling unpredictably when trying to view old messages.
+ - Fixed camera monitors immobilizing you if you reconnect while using one.
+ - Fixed selecting datum types through SDQL2 never returning any datums.
+
+
16 September 2016
Aurorablade updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 884eb062051..da0a01e1120 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2947,3 +2947,183 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
had hit a wall. The leap still goes on a 3 second cooldown as normal.
Ty-Omaha:
- rscadd: Adds fluff item "Tacticool EyePro"
+2016-10-15:
+ Crazylemon64:
+ - bugfix: The R&D console should now no longer freeze on the "Syncing Database"
+ message or whatever.
+ - bugfix: Borg coolers and SMES boards can be made again
+ - bugfix: Maroon now works
+ FlattestGuitar:
+ - tweak: pAIs no longer turn into debris when wiped
+ - bugfix: SNPCs no longer get targeted by assasinate objectives
+ - bugfix: fixes a hallucination runtime, actually making one more aspect of being
+ high as f*** work for the first time in ages
+ - bugfix: NODROP items will no longer attempt to be dropped if your hand is broken
+ Fox McCloud:
+ - tweak: Cloners will now put you inside the cloned body when it is fully grown
+ as opposed to initially created
+ - tweak: Examining a cloner will tell you the clone progress
+ - rscadd: Observers can now see a visual countdown of the cloning status progression
+ - tweak: Atmos grenades cost increased from 6 to 11
+ - rscadd: Mice now have sprites when worn
+ - bugfix: Fixes various ghost alerts having barely visible icons
+ - bugfix: Fixes items being in two locations at once when loading things into the
+ bio-generator or reagent grinder.
+ GeneralChaos81:
+ - rscadd: Ability to place and remove conveyor belts and levers.
+ KasparoVy:
+ - bugfix: Botany, viro and xenobio bottles will no longer be invisible.
+ Krausus:
+ - bugfix: Fixed full chat panes scrolling unpredictably when trying to view old
+ messages.
+ - bugfix: Fixed camera monitors immobilizing you if you reconnect while using one.
+ - bugfix: Fixed selecting datum types through SDQL2 never returning any datums.
+2016-10-23:
+ KasparoVy:
+ - tweak: Refactors markings. Now split into head, body and tail markings.
+ - tweak: Refactors morph again. Changes made while morphing are now reflected instantly
+ on your sprite.
+ - tweak: Darkens Vulpkanin and Tajara for improved colour fidelity. Species base
+ colour changed to compensate. Add 27 to R, G and B values if Vulp, 15 if Taj
+ to keep the same colour on your character.
+ - tweak: Darkens Vulpkanin facial fur patterns for improved colour fidelity. Add
+ 23 to the R, G and B values of your facial hair/head accessory to keep the same
+ colour on your character.
+ - tweak: Darkens Unathi frills and horns. Add 27 to the R, G and B values of your
+ frills and 21 for horns to keep the same colour on your character.
+ - tweak: Vulpkanin tails are now split-rendered. Tails overlap hair when facing
+ north, but are overlapped by hair when facing all other directions. No other
+ differences, only affects the fluffy husky tail.
+ - tweak: The heads of tiger markings have been isolated and can now be coloured
+ independently.
+ - tweak: Hair can now cover facial hair, and glasses are no longer covered by facial
+ hair and head accessories. Means that two-piece Vulpkanin facial fur patterns
+ won't almost entirely cover whatever glasses they're wearing.
+ - tweak: Tajaran head and facial hair have been darkened. Add 28 to the R, G and
+ B values of your Tajara head/facial hair to keep the same colour on your character.
+ - tweak: Vulpkanin head hair and one facial hair style has been darkened. Refer
+ to PR notes for darkening factors.
+ - tweak: The HAS_MARKINGS flag now represents all marking locations. The HAS_location_MARKINGS
+ flags are for specific locations (head, body, tail).
+ - tweak: Improves the quality of some Vulpkanin/Tajara/Unathi mask sprites.
+ - bugfix: Naked Humans and Skrell will no longer have exposed flesh poking out their
+ wrists when facing east or west. Male Humans now no longer lack a butt pixel
+ when facing east or west.
+ - bugfix: Mutated limbs now render correctly as soon as they're mutated.
+ - bugfix: Mobs will now correctly appear as fat/skinny.
+ - bugfix: Species with TAIL_OVERLAPPED will no longer wag tail at max speed when
+ facing north.
+ - bugfix: Species with TAIL_OVERLAPPED and body accessories won't crash the game
+ when they wag.
+ - bugfix: Tiger Head and Face markings adjusted so they don't look ugly on certain
+ species' ears.
+ - bugfix: Fixes issue where Unathi dorsal stripe didn't render.
+ - bugfix: Tajaran ears are no longer in their hair sprites, but on their actual
+ heads.
+ - bugfix: The adminbus body accessory now overrides the TAIL_OVERLAPPED flag and
+ will now be rendered correctly on a body regardless of species bodyflags.
+ - bugfix: Changing a person's species via CMA will no longer result in a mob with
+ all the same cosmetic attributes as the old species.
+ - bugfix: Dressers now have species fitting checks for undergarments. Drask are
+ now able to wear undershirts and underwear like they were originally meant to.
+ - rscadd: Adds some head markings for Tajara and Vulpkanin.
+ - rscadd: Adds body marking(s) for Tajara, Vulpkanin, Unathi and Drask.
+ - rscadd: Adds tail markings for Vox and Vulpkanin.
+ - rscadd: Adds 5 Tajaran hairstyles.
+ - rscadd: Adds a tweaked version of an existing Vox hairstyle. Shouldn't clip with
+ certain jackets as much.
+ - rscadd: Adds a hairstyle for Humans, Unathi and Vulpkanin.
+ - rscadd: Adds a facial hairstyle for Vulpkanin.
+ - rscadd: Adds secondary hair (head and facial) themes. Skrell can now colour their
+ tentacle cloths independently, the beads in the Tajaran/Hippie braid hairstyles
+ can be coloured and the same with the webbing in Unathi frills. Can be changed
+ at nanomirrors, via morph and CMA.
+ - rscadd: Adds alternate heads. Unathi can now choose a head with a sharp snout.
+ Can be changed via morph and CMA.
+ - rscadd: Helper procs to convert a hex colour into either R, G, or B.
+ - rscadd: Markings, body accessories, head accessories, alt heads and their colours
+ (if they have colours) can now be randomized at the character preferences screen.
+ - rscadd: Adds a system that attempts to fit mobs with alternate heads with appropriate
+ mask sprites. The sprites just need to be suffixed with the alt_head suffix
+ in sprite_accessories.dm.
+ - imageadd: Adds mask sprites tweaked to fit the new Unathi alternate head to go
+ along with the new alt. head mask fitting system.
+2016-11-07:
+ Crazylemon:
+ - tweak: Status effects should work a little more consistently now
+ Crazylemon64:
+ - bugfix: The mech-mounted plasma cutter can now be constructed again
+ - bugfix: Space pod lasers can now be constructed again
+ Fox McCloud:
+ - bugfix: Fixes hunters not being weakened when crashing into a shield/wall
+ - bugfix: Fixes xeno stuns half the time intended
+ - bugfix: Fixes stopping, dropping, and rolling not properly weakening Xenos/Hulks
+ KasparoVy:
+ - bugfix: Fixes a bug where changing your alt head required two icon updates to
+ show.
+ - bugfix: Fixes a bug where you couldn't choose head marking styles that would ordinarily
+ be available regardless of your alt head.
+ - bugfix: Fixes a bug where Tajara couldn't choose undergarments.
+ - bugfix: Resolves an issue with the Vulpkanin Jagged hairstyle missing a pixel.
+ Twinmold93:
+ - bugfix: Fixes a runtime issue caused by using the detective's scanner on the space
+ hotel cleaver.
+ - bugfix: Scrubber pipe missing segment behind the operating theatres.
+2016-11-13:
+ Fox McCloud:
+ - bugfix: Fixes BSA having peculiar results.
+2016-11-15:
+ KasparoVy:
+ - bugfix: Adding cable to multiple computer frames at the same time while not having
+ the correct amount of cables will no longer cause busted coils with a negative
+ number of cables.
+2016-11-20:
+ KasparoVy:
+ - bugfix: The DNA SE injectors one can find in the abandoned mining crates now correctly
+ activate/deactivate the powers they may contain.
+2016-11-22:
+ KasparoVy:
+ - bugfix: You now stutter when you're in shock/crit and when you've got the nervous
+ disability as you used to.
+ Twinmold93:
+ - bugfix: Runtime caused by lack of settlers in the Orion arcade game.
+2016-11-23:
+ Fethas:
+ - bugfix: Fixes human jetpacks..maybe...
+ FlattestNerd:
+ - tweak: the e20 will now get logged when it goes BEWM, as it should.
+ Fox McCloud:
+ - bugfix: Fixes double-breaking news newscaster
+2016-11-26:
+ Fox McCloud:
+ - bugfix: Fixes faint emote doing nothing
+ - bugfix: Fixes Mickey Finn's Special Brew not functioning properly/not making you
+ fall asleep
+2016-11-28:
+ Allfd:
+ - bugfix: Fixes an issue with the processing of GitHub changelog emoji in the php
+ webhook.
+ Crazylemon64:
+ - bugfix: The RCD no longer shall work as a remote permissions control
+ KasparoVy:
+ - bugfix: Pressing the light switch in one OR will no longer turn off the lights
+ for both.
+ - tweak: The fire alarms in each OR now work independently of each-other.
+ - rscadd: The second operating room now has its own APC and wiring.
+2016-11-29:
+ KasparoVy:
+ - bugfix: Head, body and tail markings are now loaded correctly from genes (UI).
+ - bugfix: Changes to a person's skin-tone gene are now immediately apparent.
+2016-12-01:
+ Crazylemon64:
+ - bugfix: Cryo tubes no longer let you excessively multiply the efficiency of touch
+ chems
+ KasparoVy:
+ - tweak: The character preview icon in character creation is now more detailed and
+ less blurry.
+ - bugfix: ID cards now show tails, body accessories and tail markings correctly.
+ Twinmold93:
+ - bugfix: Pilots of spacepods will no longer be sent to the void when the space
+ pod is destroyed in any method.
+ - bugfix: Pilots of spacepods will now get the same warnings for damage/core destruction
+ that passengers get.
diff --git a/html/changelogs/AutoChangeLog-pr-5581.yml b/html/changelogs/AutoChangeLog-pr-5581.yml
deleted file mode 100644
index f79c2493863..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5581.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - tweak: "Cloners will now put you inside the cloned body when it is fully grown as opposed to initially created"
- - tweak: "Examining a cloner will tell you the clone progress"
- - rscadd: "Observers can now see a visual countdown of the cloning status progression"
diff --git a/html/changelogs/AutoChangeLog-pr-5644.yml b/html/changelogs/AutoChangeLog-pr-5644.yml
deleted file mode 100644
index f336a56d07a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5644.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: GeneralChaos81
-delete-after: True
-changes:
- - rscadd: "Ability to place and remove conveyor belts and levers."
diff --git a/html/changelogs/AutoChangeLog-pr-5646.yml b/html/changelogs/AutoChangeLog-pr-5646.yml
deleted file mode 100644
index 022b08350f1..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5646.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - tweak: "Atmos grenades cost increased from 6 to 11"
diff --git a/html/changelogs/AutoChangeLog-pr-5649.yml b/html/changelogs/AutoChangeLog-pr-5649.yml
deleted file mode 100644
index 5dddb44c4c3..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5649.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - rscadd: "Mice now have sprites when worn"
diff --git a/html/changelogs/AutoChangeLog-pr-5679.yml b/html/changelogs/AutoChangeLog-pr-5679.yml
deleted file mode 100644
index 9292e91fee9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5679.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Crazylemon64
-delete-after: True
-changes:
- - bugfix: "The R&D console should now no longer freeze on the \"Syncing Database\" message or whatever."
diff --git a/html/changelogs/AutoChangeLog-pr-5685.yml b/html/changelogs/AutoChangeLog-pr-5685.yml
deleted file mode 100644
index 0fdc18d2454..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5685.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes various ghost alerts having barely visible icons"
diff --git a/html/changelogs/AutoChangeLog-pr-5691.yml b/html/changelogs/AutoChangeLog-pr-5691.yml
deleted file mode 100644
index d88812f1585..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5691.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: KasparoVy
-delete-after: True
-changes:
- - bugfix: "Botany, viro and xenobio bottles will no longer be invisible."
diff --git a/html/changelogs/AutoChangeLog-pr-5697.yml b/html/changelogs/AutoChangeLog-pr-5697.yml
deleted file mode 100644
index 9b853c7f031..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5697.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Crazylemon64
-delete-after: True
-changes:
- - bugfix: "Borg coolers and SMES boards can be made again"
diff --git a/html/changelogs/AutoChangeLog-pr-5703.yml b/html/changelogs/AutoChangeLog-pr-5703.yml
deleted file mode 100644
index a206365db26..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5703.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - bugfix: "Fixed full chat panes scrolling unpredictably when trying to view old messages."
diff --git a/html/changelogs/AutoChangeLog-pr-5708.yml b/html/changelogs/AutoChangeLog-pr-5708.yml
deleted file mode 100644
index db2fd949d15..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5708.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - bugfix: "Fixed camera monitors immobilizing you if you reconnect while using one."
diff --git a/html/changelogs/AutoChangeLog-pr-5713.yml b/html/changelogs/AutoChangeLog-pr-5713.yml
deleted file mode 100644
index 9ece18ba44e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5713.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - bugfix: "Fixed selecting datum types through SDQL2 never returning any datums."
diff --git a/html/changelogs/AutoChangeLog-pr-5715.yml b/html/changelogs/AutoChangeLog-pr-5715.yml
deleted file mode 100644
index b2f8901db43..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5715.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - tweak: "pAIs no longer turn into debris when wiped"
diff --git a/html/changelogs/AutoChangeLog-pr-5716.yml b/html/changelogs/AutoChangeLog-pr-5716.yml
deleted file mode 100644
index 29235ac7342..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5716.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - bugfix: "SNPCs no longer get targeted by assasinate objectives"
diff --git a/html/changelogs/AutoChangeLog-pr-5735.yml b/html/changelogs/AutoChangeLog-pr-5735.yml
deleted file mode 100644
index a390302ce8c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5735.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - bugfix: "fixes a hallucination runtime, actually making one more aspect of being high as f*** work for the first time in ages"
diff --git a/html/changelogs/AutoChangeLog-pr-5737.yml b/html/changelogs/AutoChangeLog-pr-5737.yml
deleted file mode 100644
index 533cba860c7..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5737.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Crazylemon64
-delete-after: True
-changes:
- - bugfix: "Maroon now works"
diff --git a/html/changelogs/AutoChangeLog-pr-5744.yml b/html/changelogs/AutoChangeLog-pr-5744.yml
deleted file mode 100644
index 982ede22fe8..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5744.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - bugfix: "NODROP items will no longer attempt to be dropped if your hand is broken"
diff --git a/html/changelogs/AutoChangeLog-pr-5755.yml b/html/changelogs/AutoChangeLog-pr-5755.yml
deleted file mode 100644
index d1d10015a82..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5755.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes items being in two locations at once when loading things into the bio-generator or reagent grinder."
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index ee3da07c3c5..87c047f397a 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi
index c45bd957a1a..6e94d89854d 100644
Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index ad4f2d137a6..9d8462c03c5 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index e0cc9a7e997..b3af414cde5 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 79df46605a2..bf6507c412c 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/r_def_human.dmi b/icons/mob/human_races/r_def_human.dmi
index 9d6af67be61..92ee97b4aba 100644
Binary files a/icons/mob/human_races/r_def_human.dmi and b/icons/mob/human_races/r_def_human.dmi differ
diff --git a/icons/mob/human_races/r_def_lizard.dmi b/icons/mob/human_races/r_def_lizard.dmi
index 3926ca17092..e1c40712b23 100644
Binary files a/icons/mob/human_races/r_def_lizard.dmi and b/icons/mob/human_races/r_def_lizard.dmi differ
diff --git a/icons/mob/human_races/r_def_tajaran.dmi b/icons/mob/human_races/r_def_tajaran.dmi
index 1e7da69c495..e62f4228fc6 100644
Binary files a/icons/mob/human_races/r_def_tajaran.dmi and b/icons/mob/human_races/r_def_tajaran.dmi differ
diff --git a/icons/mob/human_races/r_grey.dmi b/icons/mob/human_races/r_grey.dmi
index d270ab83934..4f603380545 100644
Binary files a/icons/mob/human_races/r_grey.dmi and b/icons/mob/human_races/r_grey.dmi differ
diff --git a/icons/mob/human_races/r_human.dmi b/icons/mob/human_races/r_human.dmi
index 0aa7295b8d3..0cbbde7fb3a 100644
Binary files a/icons/mob/human_races/r_human.dmi and b/icons/mob/human_races/r_human.dmi differ
diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi
index 457e50b204e..d60ae4979df 100644
Binary files a/icons/mob/human_races/r_lizard.dmi and b/icons/mob/human_races/r_lizard.dmi differ
diff --git a/icons/mob/human_races/r_skrell.dmi b/icons/mob/human_races/r_skrell.dmi
index f1c4966dc51..586714c7da8 100644
Binary files a/icons/mob/human_races/r_skrell.dmi and b/icons/mob/human_races/r_skrell.dmi differ
diff --git a/icons/mob/human_races/r_tajaran.dmi b/icons/mob/human_races/r_tajaran.dmi
index c287ef822f3..3f45032951d 100644
Binary files a/icons/mob/human_races/r_tajaran.dmi and b/icons/mob/human_races/r_tajaran.dmi differ
diff --git a/icons/mob/human_races/r_vulpkanin.dmi b/icons/mob/human_races/r_vulpkanin.dmi
index 0f1b6956c10..3bcdb3539b7 100644
Binary files a/icons/mob/human_races/r_vulpkanin.dmi and b/icons/mob/human_races/r_vulpkanin.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 3fe35fe7651..34e2a6ce696 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index 590945e9e15..2753f52dfee 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/species/drask/helmet.dmi b/icons/mob/species/drask/helmet.dmi
index 9e8953e4c4f..9c4ccd89c4b 100644
Binary files a/icons/mob/species/drask/helmet.dmi and b/icons/mob/species/drask/helmet.dmi differ
diff --git a/icons/mob/species/drask/uniform.dmi b/icons/mob/species/drask/uniform.dmi
index 66c5851122e..6610948f641 100644
Binary files a/icons/mob/species/drask/uniform.dmi and b/icons/mob/species/drask/uniform.dmi differ
diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi
index ea17113a2fc..9217fb7730c 100644
Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index 4ad3b228849..46b11152ba7 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi
index a211a035012..e0571e592db 100644
Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index ae10eaa4b5c..21ed6e38001 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi
index b39ee5577a6..93dacb8f058 100644
Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ
diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi
index f0353c1766d..14a70e1bb4c 100644
Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 022ad5e407c..31be4923470 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 95a1a902aa0..74ef949dd10 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/atmospherics/circulator.dmi b/icons/obj/atmospherics/circulator.dmi
new file mode 100644
index 00000000000..45f7a626ef6
Binary files /dev/null and b/icons/obj/atmospherics/circulator.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index a3d78f0a1c9..63af8386202 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 47a1c97a9a9..e45908cb152 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index a555009ae6a..4380c3a34bb 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi
index 34fedaa560f..73d62edfaa8 100644
Binary files a/icons/obj/pipe-item.dmi and b/icons/obj/pipe-item.dmi differ
diff --git a/icons/obj/pipes.dmi b/icons/obj/pipes.dmi
index 45f79d9e66b..99e6e84d185 100644
Binary files a/icons/obj/pipes.dmi and b/icons/obj/pipes.dmi differ
diff --git a/icons/ooc_tag_16x.dmi b/icons/ooc_tag_16x.dmi
new file mode 100644
index 00000000000..2165a593220
Binary files /dev/null and b/icons/ooc_tag_16x.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index 4baa2b25ae6..baf07678ed8 100755
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl
index 886076f21d2..47a3ce113e2 100644
--- a/nano/templates/appearance_changer.tmpl
+++ b/nano/templates/appearance_changer.tmpl
@@ -23,7 +23,7 @@
{{/if}}
-{{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_head_accessory_color || data.change_hair_color || data.change_facial_hair_color || data.change_marking_color}}
+{{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_head_accessory_color || data.change_hair_color || data.change_facial_hair_color || data.change_head_marking_color || data.change_body_marking_color || data.change_tail_marking_color}}
Colors:
@@ -44,11 +44,23 @@
{{if data.change_hair_color}}
{{:helper.link('Change hair color', null, { 'hair_color' : 1})}}
{{/if}}
+ {{if data.change_secondary_hair_color}}
+ {{:helper.link('Change secondary hair color', null, { 'secondary_hair_color' : 1})}}
+ {{/if}}
{{if data.change_facial_hair_color}}
{{:helper.link('Change facial hair color', null, { 'facial_hair_color' : 1})}}
{{/if}}
- {{if data.change_marking_color}}
- {{:helper.link('Change marking color', null, { 'marking_color' : 1})}}
+ {{if data.change_secondary_facial_hair_color}}
+ {{:helper.link('Change secondary facial hair color', null, { 'secondary_facial_hair_color' : 1})}}
+ {{/if}}
+ {{if data.change_head_marking_color}}
+ {{:helper.link('Change head marking color', null, { 'head_marking_color' : 1})}}
+ {{/if}}
+ {{if data.change_body_marking_color}}
+ {{:helper.link('Change body marking color', null, { 'body_marking_color' : 1})}}
+ {{/if}}
+ {{if data.change_tail_marking_color}}
+ {{:helper.link('Change tail marking color', null, { 'tail_marking_color' : 1})}}
{{/if}}
@@ -93,14 +105,40 @@
{{/if}}
-{{if data.change_markings}}
+{{if data.change_head_markings}}
- Marking styles:
+ Head Marking styles:
- {{for data.marking_styles}}
- {{:helper.link(value.markingstyle, null, { 'marking' : value.markingstyle}, null, data.marking_style == value.markingstyle ? 'selected' : null)}}
+ {{for data.head_marking_styles}}
+ {{:helper.link(value.headmarkingstyle, null, { 'head_marking' : value.headmarkingstyle}, null, data.head_marking_style == value.headmarkingstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
+
+{{if data.change_body_markings}}
+
+
+ Body Marking styles:
+
+
+ {{for data.body_marking_styles}}
+ {{:helper.link(value.bodymarkingstyle, null, { 'body_marking' : value.bodymarkingstyle}, null, data.body_marking_style == value.bodymarkingstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
+
+{{if data.change_tail_markings}}
+
+
+ Tail Marking styles:
+
+
+ {{for data.tail_marking_styles}}
+ {{:helper.link(value.tailmarkingstyle, null, { 'tail_marking' : value.tailmarkingstyle}, null, data.tail_marking_style == value.tailmarkingstyle ? 'selected' : null)}}
{{/for}}
@@ -118,3 +156,16 @@
{{/if}}
+
+{{if data.change_alt_head}}
+
+
+ Alternate Heads:
+
+
+ {{for data.alt_head_styles}}
+ {{:helper.link(value.altheadstyle, null, { 'alt_head' : value.altheadstyle}, null, data.alt_head_style == value.altheadstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
diff --git a/nano/templates/chem_dispenser.tmpl b/nano/templates/chem_dispenser.tmpl
index cec3028652e..f8988e35e43 100644
--- a/nano/templates/chem_dispenser.tmpl
+++ b/nano/templates/chem_dispenser.tmpl
@@ -78,24 +78,12 @@ Used In File(s): \code\modules\reagents\Chemistry-Machinery.dm
{{empty}}
-
- {{if data.glass}}
- Glass
- {{else}}
- Beaker
- {{/if}}
- is empty
+ {{if data.glass}}Glass{{else}}Beaker{{/if}} is empty
{{/for}}
{{else}}
- No
- {{if data.glass}}
- Glass
- {{else}}
- Beaker
- {{/if}}
- loaded
+ No {{if data.glass}}Glass{{else}}Beaker{{/if}} loaded
{{/if}}
diff --git a/nano/templates/disposal_bin.tmpl b/nano/templates/disposal_bin.tmpl
index c68389a95cb..d211b3fbb17 100644
--- a/nano/templates/disposal_bin.tmpl
+++ b/nano/templates/disposal_bin.tmpl
@@ -31,6 +31,13 @@ Used In File(s): \code\modules\recycling\disposal.dm
{{:helper.link('On', 'gear', {'pump' : 1}, data.mode > 0 ? 'selected' : '')}}
{{:helper.link('Off', 'gear', {'pump' : 0}, data.mode <= 0 ? 'selected' : '')}}
+
+
+
+
+ Pump Status:
+
+
{{:data.pumpstatus}}
diff --git a/nano/templates/keycard_auth.tmpl b/nano/templates/keycard_auth.tmpl
index 7f8f24b80eb..af58b061a9f 100644
--- a/nano/templates/keycard_auth.tmpl
+++ b/nano/templates/keycard_auth.tmpl
@@ -29,7 +29,7 @@ Used In File(s): \code\modules\security_levels\keycard_authentication.dm
{{/if}}
-
+ Please swipe your card to authorize the following event:
{{:data.event}}
{{:helper.link('Back', 'close', { 'reset' : 1 })}}
{{/if}}
diff --git a/nano/templates/supply_console.tmpl b/nano/templates/supply_console.tmpl
index accafa99626..3402e8982b5 100644
--- a/nano/templates/supply_console.tmpl
+++ b/nano/templates/supply_console.tmpl
@@ -52,8 +52,8 @@ Used In File(s): \code\game\supplyshuttle.dm
Shuttle Control:
- {{:helper.link('Call Shuttle', 'circle-triangle-e', data.send, data.moving || data.at_station || !data.can_launch ? 'disabled' : '')}}
- {{:helper.link('Return Shuttle', 'circle-triangle-w', data.send, data.moving || !data.at_station || !data.can_launch ? 'disabled' : '')}}
+ {{:helper.link('Call Shuttle', 'arrow-circle-down', data.send, data.moving || data.at_station || !data.can_launch ? 'disabled' : '')}}
+ {{:helper.link('Return Shuttle', 'arrow-circle-up', data.send, data.moving || !data.at_station || !data.can_launch ? 'disabled' : '')}}
diff --git a/paradise.dme b/paradise.dme
index d41caf2d9e2..23bfc38dafe 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -359,7 +359,6 @@
#include "code\game\dna\genes\vg_powers.dm"
#include "code\game\gamemodes\antag_hud.dm"
#include "code\game\gamemodes\antag_spawner.dm"
-#include "code\game\gamemodes\events.dm"
#include "code\game\gamemodes\factions.dm"
#include "code\game\gamemodes\game_mode.dm"
#include "code\game\gamemodes\gameticker.dm"
@@ -1118,6 +1117,7 @@
#include "code\modules\client\preference\loadout\loadout.dm"
#include "code\modules\client\preference\loadout\loadout_accessories.dm"
#include "code\modules\client\preference\loadout\loadout_cosmetics.dm"
+#include "code\modules\client\preference\loadout\loadout_donor.dm"
#include "code\modules\client\preference\loadout\loadout_general.dm"
#include "code\modules\client\preference\loadout\loadout_hat.dm"
#include "code\modules\client\preference\loadout\loadout_shoes.dm"
@@ -1143,6 +1143,8 @@
#include "code\modules\clothing\masks\gasmask.dm"
#include "code\modules\clothing\masks\miscellaneous.dm"
#include "code\modules\clothing\masks\voice.dm"
+#include "code\modules\clothing\patreon\glasses.dm"
+#include "code\modules\clothing\patreon\hats.dm"
#include "code\modules\clothing\shoes\colour.dm"
#include "code\modules\clothing\shoes\magboots.dm"
#include "code\modules\clothing\shoes\miscellaneous.dm"
@@ -1435,9 +1437,11 @@
#include "code\modules\mob\mob_movement.dm"
#include "code\modules\mob\mob_transformation_simple.dm"
#include "code\modules\mob\say.dm"
+#include "code\modules\mob\status_procs.dm"
#include "code\modules\mob\transform_procs.dm"
#include "code\modules\mob\typing_indicator.dm"
#include "code\modules\mob\update_icons.dm"
+#include "code\modules\mob\update_status.dm"
#include "code\modules\mob\camera\camera.dm"
#include "code\modules\mob\dead\death.dm"
#include "code\modules\mob\dead\observer\login.dm"
@@ -1456,6 +1460,9 @@
#include "code\modules\mob\living\login.dm"
#include "code\modules\mob\living\logout.dm"
#include "code\modules\mob\living\say.dm"
+#include "code\modules\mob\living\stat_states.dm"
+#include "code\modules\mob\living\status_procs.dm"
+#include "code\modules\mob\living\update_status.dm"
#include "code\modules\mob\living\carbon\_defines.dm"
#include "code\modules\mob\living\carbon\carbon.dm"
#include "code\modules\mob\living\carbon\carbon_defenses.dm"
@@ -1466,6 +1473,7 @@
#include "code\modules\mob\living\carbon\shock.dm"
#include "code\modules\mob\living\carbon\superheroes.dm"
#include "code\modules\mob\living\carbon\update_icons.dm"
+#include "code\modules\mob\living\carbon\update_status.dm"
#include "code\modules\mob\living\carbon\alien\alien.dm"
#include "code\modules\mob\living\carbon\alien\alien_defenses.dm"
#include "code\modules\mob\living\carbon\alien\death.dm"
@@ -1502,6 +1510,7 @@
#include "code\modules\mob\living\carbon\brain\MMI.dm"
#include "code\modules\mob\living\carbon\brain\posibrain.dm"
#include "code\modules\mob\living\carbon\brain\say.dm"
+#include "code\modules\mob\living\carbon\brain\update_status.dm"
#include "code\modules\mob\living\carbon\human\appearance.dm"
#include "code\modules\mob\living\carbon\human\body_accessories.dm"
#include "code\modules\mob\living\carbon\human\death.dm"
@@ -1559,6 +1568,7 @@
#include "code\modules\mob\living\silicon\ai\login.dm"
#include "code\modules\mob\living\silicon\ai\logout.dm"
#include "code\modules\mob\living\silicon\ai\say.dm"
+#include "code\modules\mob\living\silicon\ai\update_status.dm"
#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm"
#include "code\modules\mob\living\silicon\ai\freelook\eye.dm"
@@ -1575,6 +1585,7 @@
#include "code\modules\mob\living\silicon\pai\say.dm"
#include "code\modules\mob\living\silicon\pai\software.dm"
#include "code\modules\mob\living\silicon\pai\software_modules.dm"
+#include "code\modules\mob\living\silicon\pai\update_status.dm"
#include "code\modules\mob\living\silicon\robot\component.dm"
#include "code\modules\mob\living\silicon\robot\death.dm"
#include "code\modules\mob\living\silicon\robot\emote.dm"
@@ -1589,6 +1600,7 @@
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
+#include "code\modules\mob\living\silicon\robot\update_status.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm"
@@ -1596,6 +1608,7 @@
#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm"
+#include "code\modules\mob\living\silicon\robot\drone\update_status.dm"
#include "code\modules\mob\living\simple_animal\constructs.dm"
#include "code\modules\mob\living\simple_animal\corpse.dm"
#include "code\modules\mob\living\simple_animal\parrot.dm"
@@ -1738,7 +1751,6 @@
#include "code\modules\power\cell.dm"
#include "code\modules\power\engine.dm"
#include "code\modules\power\generator.dm"
-#include "code\modules\power\generator_type2.dm"
#include "code\modules\power\gravitygenerator.dm"
#include "code\modules\power\lighting.dm"
#include "code\modules\power\port_gen.dm"
@@ -1822,54 +1834,49 @@
#include "code\modules\projectiles\projectile\magic.dm"
#include "code\modules\projectiles\projectile\reusable.dm"
#include "code\modules\projectiles\projectile\special.dm"
-#include "code\modules\reagents\Chemistry-Colours.dm"
-#include "code\modules\reagents\Chemistry-Holder.dm"
-#include "code\modules\reagents\Chemistry-Machinery.dm"
-#include "code\modules\reagents\Chemistry-Readme.dm"
-#include "code\modules\reagents\pandemic.dm"
#include "code\modules\reagents\reagent_containers.dm"
#include "code\modules\reagents\reagent_dispenser.dm"
-#include "code\modules\reagents\newchem\Blob-Reagents.dm"
-#include "code\modules\reagents\newchem\chem_heater.dm"
-#include "code\modules\reagents\newchem\disease.dm"
-#include "code\modules\reagents\newchem\drinks.dm"
-#include "code\modules\reagents\newchem\drugs.dm"
-#include "code\modules\reagents\newchem\food.dm"
-#include "code\modules\reagents\newchem\medicine.dm"
-#include "code\modules\reagents\newchem\newchem_procs.dm"
-#include "code\modules\reagents\newchem\other.dm"
-#include "code\modules\reagents\newchem\paradise_pop.dm"
-#include "code\modules\reagents\newchem\patch.dm"
-#include "code\modules\reagents\newchem\pyro.dm"
-#include "code\modules\reagents\newchem\toxins.dm"
-#include "code\modules\reagents\oldchem\chemical_reaction\_chemical_reaction_base.dm"
-#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_drink.dm"
-#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_food.dm"
-#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_harm.dm"
-#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_med.dm"
-#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_misc.dm"
-#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_slime.dm"
-#include "code\modules\reagents\oldchem\reagents\__oldchem_defines.dm"
-#include "code\modules\reagents\oldchem\reagents\_reagent_base.dm"
-#include "code\modules\reagents\oldchem\reagents\reagents_admin.dm"
-#include "code\modules\reagents\oldchem\reagents\reagents_drugs.dm"
-#include "code\modules\reagents\oldchem\reagents\reagents_flammable.dm"
-#include "code\modules\reagents\oldchem\reagents\reagents_food.dm"
-#include "code\modules\reagents\oldchem\reagents\reagents_med.dm"
-#include "code\modules\reagents\oldchem\reagents\reagents_misc.dm"
-#include "code\modules\reagents\oldchem\reagents\reagents_paint.dm"
-#include "code\modules\reagents\oldchem\reagents\reagents_toxin.dm"
-#include "code\modules\reagents\oldchem\reagents\reagents_water.dm"
-#include "code\modules\reagents\oldchem\reagents\drink\reagents_alcohol.dm"
-#include "code\modules\reagents\oldchem\reagents\drink\reagents_drink.dm"
-#include "code\modules\reagents\oldchem\reagents\drink\reagents_drink_base.dm"
-#include "code\modules\reagents\oldchem\reagents\drink\reagents_drink_cold.dm"
+#include "code\modules\reagents\chemistry\colors.dm"
+#include "code\modules\reagents\chemistry\holder.dm"
+#include "code\modules\reagents\chemistry\readme.dm"
+#include "code\modules\reagents\chemistry\reagents.dm"
+#include "code\modules\reagents\chemistry\recipes.dm"
+#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm"
+#include "code\modules\reagents\chemistry\machinery\chem_heater.dm"
+#include "code\modules\reagents\chemistry\machinery\chem_master.dm"
+#include "code\modules\reagents\chemistry\machinery\pandemic.dm"
+#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm"
+#include "code\modules\reagents\chemistry\reagents\admin.dm"
+#include "code\modules\reagents\chemistry\reagents\alcohol.dm"
+#include "code\modules\reagents\chemistry\reagents\blob.dm"
+#include "code\modules\reagents\chemistry\reagents\disease.dm"
+#include "code\modules\reagents\chemistry\reagents\drink_base.dm"
+#include "code\modules\reagents\chemistry\reagents\drink_cold.dm"
+#include "code\modules\reagents\chemistry\reagents\drinks.dm"
+#include "code\modules\reagents\chemistry\reagents\drugs.dm"
+#include "code\modules\reagents\chemistry\reagents\food.dm"
+#include "code\modules\reagents\chemistry\reagents\medicine.dm"
+#include "code\modules\reagents\chemistry\reagents\misc.dm"
+#include "code\modules\reagents\chemistry\reagents\paint.dm"
+#include "code\modules\reagents\chemistry\reagents\paradise_pop.dm"
+#include "code\modules\reagents\chemistry\reagents\pyrotechnic.dm"
+#include "code\modules\reagents\chemistry\reagents\toxins.dm"
+#include "code\modules\reagents\chemistry\reagents\water.dm"
+#include "code\modules\reagents\chemistry\recipes\drinks.dm"
+#include "code\modules\reagents\chemistry\recipes\drugs.dm"
+#include "code\modules\reagents\chemistry\recipes\food.dm"
+#include "code\modules\reagents\chemistry\recipes\medicine.dm"
+#include "code\modules\reagents\chemistry\recipes\others.dm"
+#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm"
+#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm"
+#include "code\modules\reagents\chemistry\recipes\toxins.dm"
#include "code\modules\reagents\reagent_containers\blood_pack.dm"
#include "code\modules\reagents\reagent_containers\borghydro.dm"
#include "code\modules\reagents\reagent_containers\bottle.dm"
#include "code\modules\reagents\reagent_containers\dropper.dm"
#include "code\modules\reagents\reagent_containers\glass_containers.dm"
#include "code\modules\reagents\reagent_containers\hypospray.dm"
+#include "code\modules\reagents\reagent_containers\patch.dm"
#include "code\modules\reagents\reagent_containers\pill.dm"
#include "code\modules\reagents\reagent_containers\spray.dm"
#include "code\modules\reagents\reagent_containers\syringes.dm"
diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php
index 26a08418d69..c27a7eb4c5b 100644
--- a/tools/github_webhook_processor.php
+++ b/tools/github_webhook_processor.php
@@ -20,7 +20,7 @@
//Github lets you have it sign the message with a secret that you can validate. This prevents people from faking events.
//This var should match the secret you configured for this webhook on github.
-//set to NULL (no quotes) to disable validation.
+//This is required as otherwise somebody could trick the script into leaking the api key.
$hookSecret = '08ajh0qj93209qj90jfq932j32r';
//Api key for pushing changelogs.
@@ -49,27 +49,36 @@ set_exception_handler(function($e) {
die();
});
$rawPost = NULL;
-if ($hookSecret !== NULL) {
- if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) {
- throw new \Exception("HTTP header 'X-Hub-Signature' is missing.");
- } elseif (!extension_loaded('hash')) {
- throw new \Exception("Missing 'hash' extension to check the secret code validity.");
- }
- list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', '');
- if (!in_array($algo, hash_algos(), TRUE)) {
- throw new \Exception("Hash algorithm '$algo' is not supported.");
- }
- $rawPost = file_get_contents('php://input');
- if ($hash !== hash_hmac($algo, $rawPost, $hookSecret)) {
- throw new \Exception('Hook secret does not match.');
- }
+if (!$hookSecret || $hookSecret == '08ajh0qj93209qj90jfq932j32r')
+ throw new \Exception("Hook secret is required and can not be default");
+if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) {
+ throw new \Exception("HTTP header 'X-Hub-Signature' is missing.");
+} elseif (!extension_loaded('hash')) {
+ throw new \Exception("Missing 'hash' extension to check the secret code validity.");
}
+list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', '');
+if (!in_array($algo, hash_algos(), TRUE)) {
+ throw new \Exception("Hash algorithm '$algo' is not supported.");
+}
+$rawPost = file_get_contents('php://input');
+if ($hash !== hash_hmac($algo, $rawPost, $hookSecret)) {
+ throw new \Exception('Hook secret does not match.');
+}
+
+$contenttype = null;
+//apache and nginx/fastcgi/phpfpm call this two different things.
if (!isset($_SERVER['HTTP_CONTENT_TYPE'])) {
- throw new \Exception("Missing HTTP 'Content-Type' header.");
-} elseif (!isset($_SERVER['HTTP_X_GITHUB_EVENT'])) {
+ if (!isset($_SERVER['CONTENT_TYPE']))
+ throw new \Exception("Missing HTTP 'Content-Type' header.");
+ else
+ $contenttype = $_SERVER['CONTENT_TYPE'];
+} else {
+ $contenttype = $_SERVER['HTTP_CONTENT_TYPE'];
+}
+if (!isset($_SERVER['HTTP_X_GITHUB_EVENT'])) {
throw new \Exception("Missing HTTP 'X-Github-Event' header.");
}
-switch ($_SERVER['HTTP_CONTENT_TYPE']) {
+switch ($contenttype) {
case 'application/json':
$json = $rawPost ?: file_get_contents('php://input');
break;
@@ -77,7 +86,7 @@ switch ($_SERVER['HTTP_CONTENT_TYPE']) {
$json = $_POST['payload'];
break;
default:
- throw new \Exception("Unsupported content type: $_SERVER[HTTP_CONTENT_TYPE]");
+ throw new \Exception("Unsupported content type: $contenttype");
}
# Payload structure depends on triggered event
# https://developer.github.com/v3/activity/events/types/
@@ -146,14 +155,14 @@ function checkchangelog($payload, $merge = false) {
$foundcltag = false;
foreach ($body as $line) {
$line = trim($line);
- if (substr($line,0,4) == ':cl:') {
+ if (substr($line,0,4) == ':cl:' || substr($line,0,4) == '🆑') {
$incltag = true;
$foundcltag = true;
$pos = strpos($line, " ");
if ($pos)
$username = substr($line, $pos+1);
continue;
- } else if (substr($line,0,5) == '/:cl:' || substr($line,0,6) == '/ :cl:' || substr($line,0,5) == ':/cl:') {
+ } else if (substr($line,0,5) == '/:cl:' || substr($line,0,6) == '/ :cl:' || substr($line,0,5) == ':/cl:' || substr($line,0,5) == '/🆑' || substr($line,0,6) == '/ 🆑' ) {
$incltag = false;
$changelogbody = array_merge($changelogbody, $currentchangelogblock);
continue;
@@ -242,7 +251,7 @@ function checkchangelog($payload, $merge = false) {
if (!count($changelogbody))
return;
- $file = 'author: '.$username."\n";
+ $file = 'author: "'.trim(str_replace(array("\\", '"'), array("\\\\", "\\\""), $username)).'"'."\n";
$file .= "delete-after: True\n";
$file .= "changes: \n";
foreach ($changelogbody as $changelogitem) {
@@ -252,8 +261,9 @@ function checkchangelog($payload, $merge = false) {
$file .= "\n";
}
$content = array (
- 'message' => 'Automatic changelog generation for PR #'.$payload['pull_request']['number'],
- 'content' => base64_encode($file)
+ 'branch' => $payload['pull_request']['base']['ref'],
+ 'message' => 'Automatic changelog generation for PR #'.$payload['pull_request']['number'].' [ci skip]',
+ 'content' => base64_encode($file)
);
$scontext = array('http' => array(
'method' => 'PUT',
@@ -342,4 +352,4 @@ function export($addr, $port, $str) {
$error = true;
return "ERROR";
}
-?>
+?>
\ No newline at end of file
| |