From ac6a2baa802245e3cb7899d15a89a88bf2c76a23 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Fri, 21 Aug 2015 17:43:16 -0400 Subject: [PATCH 01/15] Sock port Plus fix to secruity records text --- code/__HELPERS/global_lists.dm | 4 + code/__HELPERS/mobs.dm | 6 ++ code/_globalvars/lists/flavor_misc.dm | 4 + code/game/objects/structures/dresser.dm | 8 +- code/modules/client/preferences.dm | 16 +++ code/modules/client/preferences_savefile.dm | 2 + code/modules/computer3/computers/security.dm | 10 +- .../mob/living/carbon/human/human_defines.dm | 3 +- .../mob/living/carbon/human/update_icons.dm | 7 ++ .../mob/new_player/preferences_setup.dm | 10 ++ .../mob/new_player/sprite_accessories.dm | 94 +++++++++++++++++- icons/mob/underwear.dmi | Bin 33606 -> 37928 bytes 12 files changed, 156 insertions(+), 8 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index c69742b94c8..a81a99c540b 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -12,6 +12,10 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear, underwear_list, underwear_m, underwear_f) //undershirt init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f) + //socks + init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f) + + var/list/paths //Surgery Steps - Initialize all /datum/surgery_step into a list diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 619716363f9..fe27e399c84 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -10,6 +10,12 @@ if(FEMALE) return pick(undershirt_f) else return pick(undershirt_list) +/proc/random_socks(gender) + switch(gender) + if(MALE) return pick(socks_m) + if(FEMALE) return pick(socks_f) + else return pick(socks_list) + proc/random_hair_style(var/gender, species = "Human") var/h_style = "Bald" diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 882331d21de..516ae5630f9 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -15,6 +15,10 @@ var/global/list/underwear_f = list() //stores only underwear name var/global/list/undershirt_list = list() //stores /datum/sprite_accessory/undershirt indexed by name var/global/list/undershirt_m = list() //stores only undershirt name var/global/list/undershirt_f = list() //stores only undershirt name + //Socks +var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name +var/global/list/socks_m = list() //stores only socks name +var/global/list/socks_f = list() //stores only socks name //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt") diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 10898e80a47..f1eca747755 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -12,7 +12,7 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user - var/choice = input(user, "Underwear or Undershirt?", "Changing") as null|anything in list("Underwear","Undershirt") + var/choice = input(user, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in list("Underwear","Undershirt","Socks") if(!Adjacent(user)) return @@ -27,5 +27,11 @@ if(new_undershirt) H.undershirt = new_undershirt + if("Socks") + var/new_socks = input(user, "Select your socks", "Changing") as null|anything in socks_list + if(new_socks) + H.socks= new_socks + + add_fingerprint(H) H.update_body() \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e2d4a48e58d..e3696ae4703 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -106,6 +106,7 @@ datum/preferences var/b_type = "A+" //blood type (not-chooseable) var/underwear = "Nude" //underwear type var/undershirt = "Nude" //undershirt type + var/socks = "Nude" //socks type var/backbag = 2 //backpack type var/h_style = "Bald" //Hair type var/r_hair = 0 //Hair color @@ -321,6 +322,7 @@ datum/preferences dat += "

" dat += "Underwear:
[underwear]
" dat += "Undershirt:
[undershirt]
" + dat += "Socks:
[socks]
" dat += "Backpack Type:
[backbaglist[backbag]]
" dat += "Nanotrasen Relation:
[nanotrasen_relation]
" dat += "Preview
" @@ -989,6 +991,9 @@ datum/preferences if("undershirt") undershirt = random_undershirt(gender) ShowChoices(user) + if("socks") + socks = random_socks(gender) + ShowChoices(user) if("eyes") r_eyes = rand(0,255) g_eyes = rand(0,255) @@ -1189,6 +1194,16 @@ datum/preferences undershirt = new_undershirt ShowChoices(user) + if("socks") + var/new_socks + if(gender == MALE) + new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in socks_m + else + new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in socks_f + if(new_socks) + socks = new_socks + ShowChoices(user) + if("eyes") var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") as color|null if(new_eyes) @@ -1523,6 +1538,7 @@ datum/preferences character.underwear = underwear character.undershirt = undershirt + character.socks = socks if(backbag > 4 || backbag < 1) backbag = 1 //Same as above diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 8e1c0e12964..f1dd7b307f3 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -141,6 +141,7 @@ S["eyes_blue"] >> b_eyes S["underwear"] >> underwear S["undershirt"] >> undershirt + S["socks"] >> socks S["backbag"] >> backbag S["b_type"] >> b_type S["accent"] >> accent @@ -203,6 +204,7 @@ b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear)) undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt)) + socks = sanitize_integer(socks,1 socks_t.len, initial(socks)) backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) b_type = sanitize_text(b_type, initial(b_type)) accent = sanitize_text(accent, initial(accent)) diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm index 4f9d2088074..22081177a61 100644 --- a/code/modules/computer3/computers/security.dm +++ b/code/modules/computer3/computers/security.dm @@ -497,31 +497,31 @@ What a mess.*/ active1.fields["age"] = t1 if("mi_crim") if (istype(active2, /datum/data/record)) - var/t1 = sanitize(copytext(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text,1,MAX_MESSAGE_LEN)) + var/t1 = sanitize(copytext(input("Please input minor crime list:", "Secure. records", active2.fields["mi_crim"], null) as text,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["mi_crim"] = t1 if("mi_crim_d") if (istype(active2, /datum/data/record)) - var/t1 = sanitize(copytext(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN)) + var/t1 = sanitize(copytext(input("Please summarize minor crimes.:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["mi_crim_d"] = t1 if("ma_crim") if (istype(active2, /datum/data/record)) - var/t1 = sanitize(copytext(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text,1,MAX_MESSAGE_LEN)) + var/t1 = sanitize(copytext(input("Please input major crime list:", "Secure. records", active2.fields["ma_crim"], null) as text,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["ma_crim"] = t1 if("ma_crim_d") if (istype(active2, /datum/data/record)) - var/t1 = sanitize(copytext(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message,1,MAX_MESSAGE_LEN)) + var/t1 = sanitize(copytext(input("Please summarize major crimes:", "Secure. records", active2.fields["ma_crim_d"], null) as message,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["ma_crim_d"] = t1 if("notes") if (istype(active2, /datum/data/record)) - var/t1 = trim(sanitize(copytext(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN))) + var/t1 = trim(sanitize(copytext(input("Please summarize other details:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["notes"] = t1 diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index bc10d54b1c8..7d7d400c9c3 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -30,7 +30,8 @@ var/b_type = "A+" //Player's bloodtype var/underwear = "Nude" //Which underwear the player wants - var/undershirt = "Nude" //Which undershirt the player wants. + var/undershirt = "Nude" //Which undershirt the player wants + var/socks = "Nude" //Which socks the player wants var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack. //Equipment slots diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 2e7a5e2be23..e6f6856b2b7 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -327,6 +327,13 @@ var/global/list/damage_icon_parts = list() if(U2) stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) + + if(socks && species.flags & HAS_UNDERWEAR) + var/datum/sprite_accessory/socks/U3 = socks_list[socks] + if(U3) + stand_icon.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY) + + if(update_icons) update_icons() diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index b60ebe12c5d..a05a2af391c 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -7,6 +7,7 @@ datum/preferences gender = pick(MALE, FEMALE) underwear = random_underwear(gender) undershirt = random_undershirt(gender) + socks = random_socks(gender) if(species == "Human") s_tone = random_skin_tone() h_style = random_hair_style(gender, species) @@ -264,6 +265,12 @@ datum/preferences if(U2) undershirt_s = new/icon(U2.icon, "[U2.icon_state]_s", ICON_OVERLAY) + var/icon/socks_s = null + if(socks && current_species.flags & HAS_UNDERWEAR) + var/datum/sprite_accessory/socks/U3 = socks_list[socks] + if(U3) + socks_s = new/icon(U3.icon, "[U3.icon_state]_s", ICON_OVERLAY) + var/icon/clothes_s = null var/uniform_dmi='icons/mob/uniform.dmi' if(disabilities&DISABILITY_FLAG_FAT) @@ -792,6 +799,8 @@ datum/preferences preview_icon.Blend(underwear_s, ICON_OVERLAY) if(undershirt_s) preview_icon.Blend(undershirt_s, ICON_OVERLAY) + if(socks_s) + preview_icon.Blend(socks_s, ICON_OVERLAY) if(clothes_s) preview_icon.Blend(clothes_s, ICON_OVERLAY) preview_icon_front = new(preview_icon, dir = SOUTH) @@ -800,4 +809,5 @@ datum/preferences del(eyes_s) del(underwear_s) del(undershirt_s) + del(socks_s) del(clothes_s) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 45fe53c3d82..0175c6d9663 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1260,4 +1260,96 @@ name = "Fire Tank-Top" icon_state = "tank_fire" gender = NEUTER -//end tanktops \ No newline at end of file +//end tanktops + +/////////////////////// +// Socks Definitions // +/////////////////////// +/datum/sprite_accessory/socks + icon = 'icons/mob/underwear.dmi' + species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington") + +/datum/sprite_accessory/socks/nude + name = "Nude" + icon_state = null + gender = NEUTER + +/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 \ No newline at end of file diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index 5c303cbf642fffb2402895328c32221b94219806..ad5e5019fd8c26faeb677e02bef5641df0353dcb 100644 GIT binary patch literal 37928 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 H8NK;m71ff# literal 33606 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 F{{cx2m?8iG From 347bf52e5503cd5fa7c2417921a52e51ef2c9c3b Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Fri, 21 Aug 2015 19:54:47 -0400 Subject: [PATCH 02/15] Reverting change to sec records Will make seperate PR for it. --- code/modules/computer3/computers/security.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm index 22081177a61..12ae9e50475 100644 --- a/code/modules/computer3/computers/security.dm +++ b/code/modules/computer3/computers/security.dm @@ -497,31 +497,31 @@ What a mess.*/ active1.fields["age"] = t1 if("mi_crim") if (istype(active2, /datum/data/record)) - var/t1 = sanitize(copytext(input("Please input minor crime list:", "Secure. records", active2.fields["mi_crim"], null) as text,1,MAX_MESSAGE_LEN)) + var/t1 = sanitize(copytext(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["mi_crim"] = t1 if("mi_crim_d") if (istype(active2, /datum/data/record)) - var/t1 = sanitize(copytext(input("Please summarize minor crimes.:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN)) + var/t1 = sanitize(copytext(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["mi_crim_d"] = t1 if("ma_crim") if (istype(active2, /datum/data/record)) - var/t1 = sanitize(copytext(input("Please input major crime list:", "Secure. records", active2.fields["ma_crim"], null) as text,1,MAX_MESSAGE_LEN)) + var/t1 = sanitize(copytext(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["ma_crim"] = t1 if("ma_crim_d") if (istype(active2, /datum/data/record)) - var/t1 = sanitize(copytext(input("Please summarize major crimes:", "Secure. records", active2.fields["ma_crim_d"], null) as message,1,MAX_MESSAGE_LEN)) + var/t1 = sanitize(copytext(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message,1,MAX_MESSAGE_LEN)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["ma_crim_d"] = t1 if("notes") if (istype(active2, /datum/data/record)) - var/t1 = trim(sanitize(copytext(input("Please summarize other details:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN))) + var/t1 = trim(sanitize(copytext(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN))) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["notes"] = t1 @@ -629,4 +629,4 @@ What a mess.*/ /obj/machinery/computer3/secure_data/detective_computer icon = 'icons/obj/computer.dmi' - icon_state = "messyfiles" + icon_state = "messyfiles" \ No newline at end of file From 3560722717ae7ea39aa1af1a4a8435ab8666aa54 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Mon, 24 Aug 2015 07:42:37 -0400 Subject: [PATCH 03/15] SQL files, Structure rearrange, Vox Sox I still need to get species restrict to work properly for vox sox. Not the BEST sprite edit for it but it works. --- SQL/paradise_schema.sql | 1 + code/modules/client/preferences_mysql.dm | 9 +- .../mob/living/carbon/human/update_icons.dm | 2 +- .../mob/new_player/preferences_setup.dm | 2 +- .../mob/new_player/sprite_accessories.dm | 185 +++++++++++------- icons/mob/underwear.dmi | Bin 37928 -> 38361 bytes 6 files changed, 126 insertions(+), 73 deletions(-) diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index 043a47a02ad..ffc0e770e83 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -52,6 +52,7 @@ CREATE TABLE `characters` ( `eyes_blue` smallint(4) NOT NULL, `underwear` mediumtext NOT NULL, `undershirt` mediumtext NOT NULL, + `socks` mediumtext NOT NULL, `backbag` smallint(4) NOT NULL, `b_type` varchar(45) NOT NULL, `alternate_option` smallint(4) NOT NULL, diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index 816bb2d080e..086b2b4c9d1 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -149,6 +149,9 @@ nanotrasen_relation = query.item[52] speciesprefs = text2num(query.item[53]) + //socks + socks = query.item[54] + //Sanitize metadata = sanitize_text(metadata, initial(metadata)) real_name = reject_bad_name(real_name) @@ -177,6 +180,7 @@ b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) underwear = sanitize_text(underwear, initial(underwear)) undershirt = sanitize_text(undershirt, initial(undershirt)) + socks = sanitize_text(socks, initial(socks)) backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) b_type = sanitize_text(b_type, initial(b_type)) @@ -242,6 +246,7 @@ eyes_blue='[b_eyes]', underwear='[underwear]', undershirt='[undershirt]', + socks='[socks]', backbag='[backbag]', b_type='[b_type]', alternate_option='[alternate_option]', @@ -287,7 +292,7 @@ skin_tone, skin_red, skin_green, skin_blue, hair_style_name, facial_style_name, eyes_red, eyes_green, eyes_blue, - underwear, undershirt, + underwear, undershirt,socks, backbag, b_type, alternate_option, job_support_high, job_support_med, job_support_low, job_medsci_high, job_medsci_med, job_medsci_low, @@ -304,7 +309,7 @@ '[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]', '[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]', '[r_eyes]', '[g_eyes]', '[b_eyes]', - '[underwear]', '[undershirt]', + '[underwear]', '[undershirt]','[socks]', '[backbag]', '[b_type]', '[alternate_option]', '[job_support_high]', '[job_support_med]', '[job_support_low]', '[job_medsci_high]', '[job_medsci_med]', '[job_medsci_low]', diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e6f6856b2b7..f7493c272d8 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -328,7 +328,7 @@ var/global/list/damage_icon_parts = list() stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) - if(socks && species.flags & HAS_UNDERWEAR) + if(socks) var/datum/sprite_accessory/socks/U3 = socks_list[socks] if(U3) stand_icon.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index a05a2af391c..77f48b976d5 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -266,7 +266,7 @@ datum/preferences undershirt_s = new/icon(U2.icon, "[U2.icon_state]_s", ICON_OVERLAY) var/icon/socks_s = null - if(socks && current_species.flags & HAS_UNDERWEAR) + if(socks) var/datum/sprite_accessory/socks/U3 = socks_list[socks] if(U3) socks_s = new/icon(U3.icon, "[U3.icon_state]_s", ICON_OVERLAY) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 0175c6d9663..9882e9a1c6e 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1267,89 +1267,136 @@ /////////////////////// /datum/sprite_accessory/socks icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington") -/datum/sprite_accessory/socks/nude - name = "Nude" - icon_state = null - gender = NEUTER + nude + name = "Nude" + icon_state = null + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") -/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 + white_norm + name = "Normal White" + icon_state = "white_norm" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") -/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 + black_norm + name = "Normal Black" + icon_state = "black_norm" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") -/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 + white_short + name = "Short White" + icon_state = "white_short" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") -/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 + black_short + name = "Short Black" + icon_state = "black_short" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") -/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 + white_knee + name = "Knee-high White" + icon_state = "white_knee" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") -/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 + black_knee + name = "Knee-high Black" + icon_state = "black_knee" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") -/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 + thin_knee + name = "Knee-high Thin" + icon_state = "thin_knee" + gender = FEMALE + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") -/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 \ No newline at end of file + striped_knee + name = "Knee-high Striped" + icon_state = "striped_knee" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") + + + rainbow_knee + name = "Knee-high Rainbow" + icon_state = "rainbow_knee" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") + + + white_thigh + name = "Thigh-high White" + icon_state = "white_thigh" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") + + black_thigh + name = "Thigh-high Black" + icon_state = "black_thigh" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") + + + thin_thigh + name = "Thigh-high Thin" + icon_state = "thin_thigh" + gender = FEMALE + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") + + + striped_thigh + name = "Thigh-high Striped" + icon_state = "striped_thigh" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") + + + rainbow_thigh + name = "Thigh-high Rainbow" + icon_state = "rainbow_thigh" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") + + + pantyhose + name = "Pantyhose" + icon_state = "pantyhose" + gender = FEMALE + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") + + + black_fishnet + name = "Black Fishnet" + icon_state = "black_fishnet" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") + + +/datum/sprite_accessory/socks/ + + vox_white + name = "Vox White" + icon_state = "vox_white" + gender = NEUTER + species_allowed = list("Vox") + + vox_white_thigh + name = "Vox Thigh-high White" + icon_state = "vox_whiteTH" + gender = NEUTER + species_allowed = list("Vox") + diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index ad5e5019fd8c26faeb677e02bef5641df0353dcb..e923f3f3814ab6a6f7fcca780a31cc842d236b55 100644 GIT binary patch delta 16712 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 GefVG6Nb$Y^ delta 16289 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 L1y(F){QiFck)^v5 From 1104ca5d2b44dc018a440886f7f22643716719cf Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Tue, 25 Aug 2015 06:33:56 -0400 Subject: [PATCH 04/15] Ever try to put a vox in fishnets? --- SQL/paradise_schema.sql | 2 +- code/modules/client/preferences.dm | 18 ++++++++++++------ code/modules/client/preferences_mysql.dm | 14 ++++++++------ .../mob/new_player/sprite_accessories.dm | 7 ++++++- icons/mob/underwear.dmi | Bin 38361 -> 39100 bytes 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index ffc0e770e83..c35edc56969 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -52,7 +52,6 @@ CREATE TABLE `characters` ( `eyes_blue` smallint(4) NOT NULL, `underwear` mediumtext NOT NULL, `undershirt` mediumtext NOT NULL, - `socks` mediumtext NOT NULL, `backbag` smallint(4) NOT NULL, `b_type` varchar(45) NOT NULL, `alternate_option` smallint(4) NOT NULL, @@ -79,6 +78,7 @@ CREATE TABLE `characters` ( `rlimb_data` mediumtext NOT NULL, `nanotrasen_relation` varchar(45) NOT NULL, `speciesprefs` int(1) NOT NULL, + `socks` mediumtext NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e3696ae4703..a36743760d7 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1195,14 +1195,20 @@ datum/preferences ShowChoices(user) if("socks") - var/new_socks - if(gender == MALE) - new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in socks_m - else - new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in socks_f + var/list/valid_sockstyles = list() + for(var/sockstyle in socks_list) + var/datum/sprite_accessory/S = socks_list[sockstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if( !(species in S.species_allowed)) + continue + valid_sockstyles[sockstyle] = socks_list[sockstyle] + var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles + ShowChoices(user) if(new_socks) socks = new_socks - ShowChoices(user) if("eyes") var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") as color|null diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index 086b2b4c9d1..572bb054326 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -180,7 +180,6 @@ b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) underwear = sanitize_text(underwear, initial(underwear)) undershirt = sanitize_text(undershirt, initial(undershirt)) - socks = sanitize_text(socks, initial(socks)) backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) b_type = sanitize_text(b_type, initial(b_type)) @@ -200,6 +199,9 @@ disabilities = sanitize_integer(disabilities, 0, 65535, initial(disabilities)) be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) + socks = sanitize_text(socks, initial(socks)) + + // if(isnull(disabilities)) disabilities = 0 if(!player_alt_titles) player_alt_titles = new() if(!organ_data) src.organ_data = list() @@ -246,7 +248,6 @@ eyes_blue='[b_eyes]', underwear='[underwear]', undershirt='[undershirt]', - socks='[socks]', backbag='[backbag]', b_type='[b_type]', alternate_option='[alternate_option]', @@ -273,6 +274,7 @@ rlimb_data='[rlimblist]', nanotrasen_relation='[nanotrasen_relation]', speciesprefs='[speciesprefs]' + socks='[socks]', WHERE ckey='[C.ckey]' AND slot='[default_slot]'"} ) @@ -292,7 +294,7 @@ skin_tone, skin_red, skin_green, skin_blue, hair_style_name, facial_style_name, eyes_red, eyes_green, eyes_blue, - underwear, undershirt,socks, + underwear, undershirt, backbag, b_type, alternate_option, job_support_high, job_support_med, job_support_low, job_medsci_high, job_medsci_med, job_medsci_low, @@ -300,7 +302,7 @@ job_karma_high, job_karma_med, job_karma_low, flavor_text, med_record, sec_record, gen_record, player_alt_titles, be_special, - disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs) + disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, socks) VALUES ('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]', '[age]', '[sql_sanitize_text(species)]', '[sql_sanitize_text(language)]', @@ -309,7 +311,7 @@ '[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]', '[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]', '[r_eyes]', '[g_eyes]', '[b_eyes]', - '[underwear]', '[undershirt]','[socks]', + '[underwear]', '[undershirt]', '[backbag]', '[b_type]', '[alternate_option]', '[job_support_high]', '[job_support_med]', '[job_support_low]', '[job_medsci_high]', '[job_medsci_med]', '[job_medsci_low]', @@ -317,7 +319,7 @@ '[job_karma_high]', '[job_karma_med]', '[job_karma_low]', '[sql_sanitize_text(flavor_text)]', '[sql_sanitize_text(med_record)]', '[sql_sanitize_text(sec_record)]', '[sql_sanitize_text(gen_record)]', '[playertitlelist]', '[be_special]', - '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]') + '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]','[socks]') "} ) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 9882e9a1c6e..cd4c9c2a554 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1,4 +1,4 @@ -/* +/paradise_schema.sql/* Hello and welcome to sprite_accessories: For sprite accessories, such as hair, facial hair, and possibly tattoos and stuff somewhere along the line. This file is @@ -1400,3 +1400,8 @@ gender = NEUTER species_allowed = list("Vox") + vox_fishnet + name = "Vox Fishnets" + icon_state = "vox_fishnet" + gender = NEUTER + species_allowed = list("Vox") \ No newline at end of file diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index e923f3f3814ab6a6f7fcca780a31cc842d236b55..a8b4d971b101de9af2656f3835d84dec7fd70a51 100644 GIT binary patch delta 18198 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 G_WuFrVAj9@ delta 17453 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 Date: Tue, 25 Aug 2015 08:28:06 -0400 Subject: [PATCH 05/15] Changes pathing back probaly only need the species allowed for non-vox once though will fix later. --- .../mob/new_player/sprite_accessories.dm | 203 +++++++++--------- 1 file changed, 100 insertions(+), 103 deletions(-) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index cd4c9c2a554..0fbe56607c8 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1268,140 +1268,137 @@ /datum/sprite_accessory/socks icon = 'icons/mob/underwear.dmi' - nude - name = "Nude" - icon_state = null - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/nude + name = "Nude" + icon_state = null + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - white_norm - name = "Normal White" - icon_state = "white_norm" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/white_norm + name = "Normal White" + icon_state = "white_norm" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - black_norm - name = "Normal Black" - icon_state = "black_norm" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/black_norm + name = "Normal Black" + icon_state = "black_norm" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - white_short - name = "Short White" - icon_state = "white_short" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/white_short + name = "Short White" + icon_state = "white_short" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - black_short - name = "Short Black" - icon_state = "black_short" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/black_short + name = "Short Black" + icon_state = "black_short" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - white_knee - name = "Knee-high White" - icon_state = "white_knee" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/white_knee + name = "Knee-high White" + icon_state = "white_knee" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - black_knee - name = "Knee-high Black" - icon_state = "black_knee" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/black_knee + name = "Knee-high Black" + icon_state = "black_knee" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - thin_knee - name = "Knee-high Thin" - icon_state = "thin_knee" - gender = FEMALE - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/thin_knee + name = "Knee-high Thin" + icon_state = "thin_knee" + gender = FEMALE + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - striped_knee - name = "Knee-high Striped" - icon_state = "striped_knee" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/striped_knee + name = "Knee-high Striped" + icon_state = "striped_knee" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - rainbow_knee - name = "Knee-high Rainbow" - icon_state = "rainbow_knee" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/rainbow_knee + name = "Knee-high Rainbow" + icon_state = "rainbow_knee" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - white_thigh - name = "Thigh-high White" - icon_state = "white_thigh" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/white_thigh + name = "Thigh-high White" + icon_state = "white_thigh" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - black_thigh - name = "Thigh-high Black" - icon_state = "black_thigh" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/black_thigh + name = "Thigh-high Black" + icon_state = "black_thigh" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - thin_thigh - name = "Thigh-high Thin" - icon_state = "thin_thigh" - gender = FEMALE - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/thin_thigh + name = "Thigh-high Thin" + icon_state = "thin_thigh" + gender = FEMALE + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - striped_thigh - name = "Thigh-high Striped" - icon_state = "striped_thigh" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/striped_thigh + name = "Thigh-high Striped" + icon_state = "striped_thigh" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - rainbow_thigh - name = "Thigh-high Rainbow" - icon_state = "rainbow_thigh" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/rainbow_thigh + name = "Thigh-high Rainbow" + icon_state = "rainbow_thigh" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - pantyhose - name = "Pantyhose" - icon_state = "pantyhose" - gender = FEMALE - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/pantyhose + name = "Pantyhose" + icon_state = "pantyhose" + gender = FEMALE + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") - black_fishnet - name = "Black Fishnet" - icon_state = "black_fishnet" - gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/black_fishnet + name = "Black Fishnet" + icon_state = "black_fishnet" + gender = NEUTER + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington") +/datum/sprite_accessory/socks/vox_white + name = "Vox White" + icon_state = "vox_white" + gender = NEUTER + species_allowed = list("Vox") -/datum/sprite_accessory/socks/ +/datum/sprite_accessory/socks/vox_white_thigh + name = "Vox Thigh-high White" + icon_state = "vox_whiteTH" + gender = NEUTER + species_allowed = list("Vox") - vox_white - name = "Vox White" - icon_state = "vox_white" - gender = NEUTER - species_allowed = list("Vox") - - vox_white_thigh - name = "Vox Thigh-high White" - icon_state = "vox_whiteTH" - gender = NEUTER - species_allowed = list("Vox") - - vox_fishnet - name = "Vox Fishnets" - icon_state = "vox_fishnet" - gender = NEUTER - species_allowed = list("Vox") \ No newline at end of file +/datum/sprite_accessory/socks/vox_fishnet + name = "Vox Fishnets" + icon_state = "vox_fishnet" + gender = NEUTER + species_allowed = list("Vox") \ No newline at end of file From 7ef6ae96c6b4bfd2d9b0ad41f25cc13e5af03877 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Wed, 26 Aug 2015 21:30:42 -0400 Subject: [PATCH 06/15] Finishes voxxy soxs --- .../mob/new_player/sprite_accessories.dm | 48 ++++++++++++++++++ icons/mob/underwear.dmi | Bin 39100 -> 41973 bytes 2 files changed, 48 insertions(+) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 0fbe56607c8..f5e8db924a9 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1391,12 +1391,60 @@ gender = NEUTER species_allowed = list("Vox") +/datum/sprite_accessory/socks/vox_black + name = "Vox Black" + icon_state = "vox_black" + gender = NEUTER + species_allowed = list("Vox") + +/datum/sprite_accessory/socks/vox_thin + name = "Vox Black Thin" + icon_state = "vox_blackthin" + gender = NEUTER + species_allowed = list("Vox") + +/datum/sprite_accessory/socks/vox_rainbow + name = "Vox Rainbow" + icon_state = "vox_rainbow" + gender = NEUTER + species_allowed = list("Vox") + +/datum/sprite_accessory/socks/vox_stripped + name = "Vox Stripped" + icon_state = "vox_white" + gender = NEUTER + species_allowed = list("Vox") + /datum/sprite_accessory/socks/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 + name = "Vox Thigh-high Black" + icon_state = "vox_blackTH" + gender = NEUTER + species_allowed = list("Vox") + +/datum/sprite_accessory/socks/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 + name = "Vox Thigh-high Rainbow" + icon_state = "vox_rainbowTH" + gender = NEUTER + species_allowed = list("Vox") + +/datum/sprite_accessory/socks/vox_stripped_thigh + name = "Vox Thigh-high Stripped" + icon_state = "vox_strippedTH" + gender = NEUTER + species_allowed = list("Vox") + /datum/sprite_accessory/socks/vox_fishnet name = "Vox Fishnets" icon_state = "vox_fishnet" diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index a8b4d971b101de9af2656f3835d84dec7fd70a51..3ec99db4cee1e6b5eb074b4e6b5373f1fb9e5215 100644 GIT binary patch literal 41973 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 From dd558c68e201db349e0fb1b8e0796e729b113415 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sat, 29 Aug 2015 20:05:25 -0400 Subject: [PATCH 07/15] Remove an opps and sprite name tweak --- .../mob/new_player/sprite_accessories.dm | 2 +- icons/mob/underwear.dmi | Bin 41973 -> 41975 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index f5e8db924a9..5cc722bb7fd 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1,4 +1,4 @@ -/paradise_schema.sql/* +/* Hello and welcome to sprite_accessories: For sprite accessories, such as hair, facial hair, and possibly tattoos and stuff somewhere along the line. This file is diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index 3ec99db4cee1e6b5eb074b4e6b5373f1fb9e5215..6c36fd0651b951735bb2fe6a60b7427a043d8863 100644 GIT binary patch delta 545 zcmV++0^a@g#{&1q0+1vDDUl^7f7U}XWf#uYS!77@Sdy~pf8RlpHg2_1o`a>8IH-|t+59kMq-bJS)e@;A5;5Kuo z(~q&^JTc{!1hQR-3x^;Rgy<8y0_w~b!n^2IO)qV+E?0fwE1>qY0@^WL^~xrG_|b*B z>h*oQDM0sQtUyQEqqaKA9<02h>|t+~DOUtIO72yE;R?Ki^AY6C5wet+j@Zmngpy6t z%Ro@BrEDJ%{g07Lb%NdDf5#B8-VK9;l8O`s(GN^e>#E}pb94wJmzrI|sO)-MaaPck zD7m(2%qc(wvK<6nL4s}RBtZZ}NrLEibdn%Qph<$XeP(D&Cp4lY&^wc`mc4T>e9@o3 z==B#=iXI8IQuN3~REi#Wwkt*7o?O*9YuAJ8X?^&H&;MRhd@VPt&0e> j6oMdYDgR>b&GYM%4taXnH@^TXwl;rVy(ChzR05%)=iL(( delta 543 zcmV+)0^t4k#{%`o0+1vDCy^y5f7C-VWf#uYS!77@Sdy~pf8RlpW1vNGZ|ErCedN1$ zr{lf({`|6kGf%Jk=FGV`iDqXWzkF>rlk2KAJM-|Z*;sbHt@B5zRN3sz-8i)a1#Tzn zD!1jX*>o-!vonv)=9FpRVs>Wxr@qg8!Q>nP{UMBqn?sBrb{o|y7V0@*Iag+q`DLiCAU0d-~z;a&8qrkA!@m#e<;6;OLx0qq#BdSw$o{pdnn z_4>Zu6rlStR-mKoQCl5l4_4k$_OLh0lq&)pCHJboa0NcV`3Q362w6%@M{H&(LdhoS zWgsZmQnn9>{^!W0I>GMne`5$(?}ouaNkxi+=m#dKb=7f)IXZ-qOU*7}RCc|sI4kH% zlw8|1<`f_T*$#rPAi=hDk|2PgBti5$I!O>D&?G_HJ~OnX6B7~Bn8PHcS>wyZYb@9KS59kxcda+WJelodukO`<@B>+$JOVk0El$u>i z+~Koya>YhgPRCh(sn^M^{QZX>fDLK))vf&9I?WTXAZrWNz_lHqD Date: Sat, 5 Sep 2015 02:18:42 -0400 Subject: [PATCH 08/15] Space Cleaner Feature: Color Removal --- code/modules/reagents/Chemistry-Reagents.dm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 615eefbcf5a..a2e6dd57498 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1118,13 +1118,18 @@ datum color = "#61C2C2" reaction_obj(var/obj/O, var/volume) + if(O) + O.color = initial(O.color) if(istype(O,/obj/effect/decal/cleanable)) qdel(O) else if(O) O.clean_blood() + reaction_turf(var/turf/T, var/volume) if(volume >= 1) + if(T) + T.color = initial(T.color) T.overlays.Cut() T.clean_blood() for(var/obj/effect/decal/cleanable/C in src) @@ -1132,9 +1137,10 @@ datum for(var/mob/living/carbon/slime/M in T) M.adjustToxLoss(rand(5,10)) - reaction_turf(var/turf/simulated/S, var/volume) - if(volume >= 1) - S.dirt = 0 + if(istype(T,/turf/simulated)) + var/turf/simulated/S = T + S.dirt = 0 + reaction_mob(var/mob/M, var/method=TOUCH, var/volume) if(iscarbon(M)) var/mob/living/carbon/C = M @@ -2242,11 +2248,11 @@ datum M.AdjustWeakened(-1) ..() return - + overdose_process(var/mob/living/M as mob) if(volume > 45) M.Jitter(5) - + ..() return From 2214a8b455f3944dd09a97eb089ca3127b065d9d Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sat, 5 Sep 2015 23:57:22 -0400 Subject: [PATCH 09/15] R&D Update: Implants and Autolathes --- .../objects/items/weapons/implants/implant.dm | 12 ++++- .../items/weapons/implants/implantcase.dm | 20 ++++++++ .../items/weapons/implants/implanter.dm | 7 +++ .../items/weapons/implants/implantfreedom.dm | 4 +- .../items/weapons/implants/implantuplink.dm | 1 + code/modules/reagents/newchem/medicine.dm | 29 ++++++++++++ .../modules/reagents/newchem/newchem_procs.dm | 2 +- code/modules/recycling/sortingmachinery.dm | 2 +- .../research/designs/autolathe_designs.dm | 16 +++++++ .../research/designs/medical_designs.dm | 44 ++++++++++++++++++ icons/obj/device.dmi | Bin 32014 -> 31998 bytes 11 files changed, 131 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index c964dd1e0b4..820a3311cff 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -4,6 +4,7 @@ name = "implant" icon = 'icons/obj/device.dmi' icon_state = "implant" + origin_tech = "materials=2;biotech=3;programming=2" var/implanted = null var/mob/living/imp_in = null var/obj/item/organ/external/part = null @@ -52,6 +53,7 @@ /obj/item/weapon/implant/tracking name = "tracking" desc = "Track with this." + origin_tech = "materials=2;magnets=2;programming=2;biotech=2" var/id = 1.0 @@ -92,6 +94,7 @@ Implant Specifics:
"} /obj/item/weapon/implant/dexplosive name = "explosive" desc = "And boom goes the weasel." + origin_tech = "materials=2;combat=3;biotech=4;syndicate=4" icon_state = "implant_evil" get_data() @@ -127,6 +130,7 @@ Implant Specifics:
"} /obj/item/weapon/implant/explosive name = "explosive implant" desc = "A military grade micro bio-explosive. Highly dangerous." + origin_tech = "materials=2;combat=3;biotech=4;syndicate=4" var/elevel = "Localized Limb" var/phrase = "supercalifragilisticexpialidocious" icon_state = "implant_evil" @@ -252,6 +256,7 @@ Implant Specifics:
"} /obj/item/weapon/implant/chem name = "chem" desc = "Injects things." + origin_tech = "materials=3;biotech=4" allow_reagents = 1 get_data() @@ -316,6 +321,7 @@ the implant may become unstable and either pre-maturely inject the subject or si /obj/item/weapon/implant/loyalty name = "loyalty" desc = "Makes you loyal or such." + origin_tech = "materials=2;biotech=4;programming=4" get_data() var/dat = {" @@ -406,6 +412,7 @@ the implant may become unstable and either pre-maturely inject the subject or si /obj/item/weapon/implant/adrenalin name = "adrenalin" desc = "Removes all stuns and knockdowns." + origin_tech = "materials=2;biotech=4;combat=3;syndicate=4" var/uses = 3 get_data() @@ -436,7 +443,7 @@ the implant may become unstable and either pre-maturely inject the subject or si source.reagents.add_reagent("synaptizine", 10) source.reagents.add_reagent("omnizine", 10) - source.reagents.add_reagent("methamphetamine", 10) + source.reagents.add_reagent("stimulative_agent", 10) return @@ -523,6 +530,7 @@ the implant may become unstable and either pre-maturely inject the subject or si name = "compressed matter implant" desc = "Based on compressed matter technology, can store a single item." icon_state = "implant_evil" + origin_tech = "materials=2;magnets=4;bluespace=4;syndicate=4" var/activation_emote = "sigh" var/obj/item/scanned = null @@ -574,7 +582,7 @@ the implant may become unstable and either pre-maturely inject the subject or si /obj/item/weapon/implant/emp name = "emp implant" desc = "Triggers an EMP." - + origin_tech = "materials=2;biotech=3;magnets=4;syndicate=4" var/activation_emote = "chuckle" var/uses = 2 diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index f4f9f3d2400..f32764ae410 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -8,7 +8,14 @@ throw_speed = 1 throw_range = 5 w_class = 1.0 + origin_tech = "materials=1;biotech=2" + materials = list(MAT_GLASS=500) var/obj/item/weapon/implant/imp = null + + New() + ..() + update() + proc update() @@ -16,8 +23,10 @@ update() if (src.imp) src.icon_state = text("implantcase-[]", src.imp._color) + src.origin_tech = src.imp.origin_tech else src.icon_state = "implantcase-0" + src.origin_tech = initial(src.origin_tech) return @@ -148,4 +157,15 @@ New() src.imp = new /obj/item/weapon/implant/freedom( src ) ..() + return + +/obj/item/weapon/implantcase/adrenaline + name = "Glass Case- 'Adrenaline'" + desc = "A glass case containing an adrenaline implant." + icon = 'icons/obj/items.dmi' + icon_state = "implantcase-b" + + New() + src.imp = new /obj/item/weapon/implant/adrenalin( src ) + ..() return \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 423ab379253..f0cad339826 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -6,16 +6,23 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 + origin_tech = "materials=1;biotech=3;programming=2" var/obj/item/weapon/implant/imp = null +/obj/item/weapon/implanter/New() + ..() + update() + /obj/item/weapon/implanter/proc/update() /obj/item/weapon/implanter/update() if (src.imp) src.icon_state = "implanter1" + src.origin_tech = src.imp.origin_tech else src.icon_state = "implanter0" + src.origin_tech = initial(src.origin_tech) return diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm index 9b225ac70fc..68497e500b7 100644 --- a/code/game/objects/items/weapons/implants/implantfreedom.dm +++ b/code/game/objects/items/weapons/implants/implantfreedom.dm @@ -5,12 +5,12 @@ desc = "Use this to escape from those evil Red Shirts." _color = "r" var/activation_emote = "chuckle" - var/uses = 1.0 + origin_tech = "materials=2;magnets=3;biotech=3;syndicate=4" + var/uses = 4 New() src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") - src.uses = rand(1, 5) ..() return diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm index 05b50b49b03..6e7fac76a6c 100644 --- a/code/game/objects/items/weapons/implants/implantuplink.dm +++ b/code/game/objects/items/weapons/implants/implantuplink.dm @@ -1,6 +1,7 @@ /obj/item/weapon/implant/uplink name = "uplink" desc = "Summon things." + origin_tech = "materials=2;magnets=4;programming=4;biotech=4;syndicate=8;bluespace=5" var/activation_emote = "chuckle" /obj/item/weapon/implant/uplink/New() diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index ea2675034e7..add5d264d4f 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -825,6 +825,35 @@ datum/reagent/stimulants/reagent_deleted(var/mob/living/M as mob) ..() return +/datum/reagent/medicine/stimulative_agent + name = "Stimulative Agent" + id = "stimulative_agent" + description = "An illegal compound that darmatically enhances the body's performance and healing capabilities." + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 60 + +/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.AdjustParalysis(-3) + M.AdjustStunned(-3) + M.AdjustWeakened(-3) + M.adjustStaminaLoss(-5*REM) + ..() + +/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M) + if(prob(33)) + M.adjustStaminaLoss(2.5*REM) + M.adjustToxLoss(1*REM) + M.losebreath++ + ..() + return + datum/reagent/insulin name = "Insulin" id = "insulin" diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 5c87c0f0044..b2d6edc0995 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -96,7 +96,7 @@ datum/reagents/proc/check_ignoreslow(var/mob/M) datum/reagents/proc/check_gofast(var/mob/M) if(istype(M, /mob)) - if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")) + if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulative_agent")) return 1 else M.status_flags &= ~GOTTAGOFAST diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 07c245d889d..11ca778f6c0 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -190,7 +190,7 @@ /obj/item/device/destTagger name = "destination tagger" desc = "Used to set the destination of properly wrapped packages." - icon_state = "dest_tagger" + icon_state = "cargotagger" var/currTag = 0 //The whole system for the sorttype var is determined based on the order of this list, //disposals must always be 1, since anything that's untagged will automatically go to disposals, or sorttype = 1 --Superxpdude diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 247bfdf25d8..bfaf774c42f 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -546,3 +546,19 @@ materials = list(MAT_METAL = 4000) build_path = /obj/item/ammo_casing/shotgun category = list("hacked", "Security") + +/datum/design/desttagger + name = "Destination tagger" + id = "desttagger" + build_type = AUTOLATHE + materials = list(MAT_METAL = 250, MAT_GLASS = 125) + build_path = /obj/item/device/destTagger + category = list("initial", "Electronics") + +/datum/design/handlabeler + name = "Hand labeler" + id = "handlabel" + build_type = AUTOLATHE + materials = list(MAT_METAL = 150, MAT_GLASS = 125) + build_path = /obj/item/weapon/hand_labeler + category = list("initial", "Electronics") \ No newline at end of file diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index cf945134663..1cfd36c2bd6 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -204,4 +204,48 @@ build_type = PROTOLATHE materials = list (MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 1500, MAT_GOLD = 1500, MAT_DIAMOND = 750) build_path = /obj/item/weapon/scalpel/manager + category = list("Medical") + +///////////////////////////////////////// +////////////Regular Implants///////////// +///////////////////////////////////////// + +/datum/design/implanter + name = "Implanter" + desc = "A sterile automatic implant injector." + id = "implanter" + req_tech = list("materials" = 1, "programming" = 2, "biotech" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 600, MAT_GLASS = 200) + build_path = /obj/item/weapon/implanter + category = list("Medical") + +/datum/design/implantcase + name = "Implant Case" + desc = "A glass case containing an implant." + id = "implantcase" + req_tech = list("materials" = 1, "biotech" = 2) + build_type = PROTOLATHE + materials = list(MAT_GLASS = 500) + build_path = /obj/item/weapon/implantcase + category = list("Medical") + +/datum/design/implant_freedom + name = "Freedom Implant Case" + desc = "A glass case containing an implant." + id = "implant_freedom" + req_tech = list("materials" = 2, "biotech" = 3, "magnets" = 3, "syndicate" = 5) + build_type = PROTOLATHE + materials = list(MAT_METAL = 50, MAT_GLASS = 500, MAT_GOLD = 250) + build_path = /obj/item/weapon/implantcase/freedom + category = list("Medical") + +/datum/design/implant_adrenalin + name = "Adrenalin Implant Case" + desc = "A glass case containing an implant." + id = "implant_adrenalin" + req_tech = list("materials" = 2, "biotech" = 5, "combat" = 3, "syndicate" = 6) + build_type = PROTOLATHE + materials = list(MAT_METAL = 50, MAT_GLASS = 500, MAT_GOLD = 500, MAT_URANIUM = 100, MAT_DIAMOND = 200) + build_path = /obj/item/weapon/implantcase/adrenaline category = list("Medical") \ No newline at end of file diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 64e1b4941be17ca1ab0d7b6dcbef393a2d51543f..471cad514e521e68f9b7156e4b38d776bb878843 100644 GIT binary patch literal 31998 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

HRVW&V&W7_?C?o7Vn`ssHSdTsmEugy;J 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 literal 32014 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 sj~>1xb?4GF0m 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 From 3250621552627f8c133ae487f34c942768a90561 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 6 Sep 2015 02:19:44 -0400 Subject: [PATCH 10/15] Health Assembly --- code/game/machinery/vending.dm | 3 +- code/modules/assembly/health.dm | 104 ++++++++++++++++++ code/modules/mob/living/carbon/human/human.dm | 30 ++--- .../research/designs/autolathe_designs.dm | 8 ++ icons/obj/assemblies/new_assemblies.dmi | Bin 11088 -> 11591 bytes paradise.dme | 1 + 6 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 code/modules/assembly/health.dm diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 4cfdc0a6c29..1b3f89af28a 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -729,7 +729,7 @@ /obj/machinery/vending/assist products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4, /obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4) - contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2) + contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2, /obj/item/device/assembly/voice = 2, /obj/item/device/assembly/health = 2) product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" /obj/machinery/vending/boozeomat/New() @@ -887,6 +887,7 @@ products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6, /obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6, /obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6) + contraband = list(/obj/item/device/assembly/health = 3) /obj/machinery/vending/wallmed1 name = "NanoMed" diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm new file mode 100644 index 00000000000..f1a3f402336 --- /dev/null +++ b/code/modules/assembly/health.dm @@ -0,0 +1,104 @@ +/obj/item/device/assembly/health + name = "health sensor" + desc = "Used for scanning and monitoring health." + icon_state = "health" + materials = list(MAT_METAL=800, MAT_GLASS=200) + origin_tech = "magnets=1;biotech=1" + secured = 0 + + var/scanning = 0 + var/health_scan + var/alarm_health = 0 + + + +/obj/item/device/assembly/health/activate() + if(!..()) return 0//Cooldown check + toggle_scan() + return 0 + +/obj/item/device/assembly/health/toggle_secure() + secured = !secured + if(secured && scanning) + processing_objects.Add(src) + else + scanning = 0 + processing_objects.Remove(src) + update_icon() + return secured + +/obj/item/device/assembly/health/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/device/multitool)) + if(alarm_health == 0) + alarm_health = -90 + user.show_message("You toggle [src] to \"detect death\" mode.") + else + alarm_health = 0 + user.show_message("You toggle [src] to \"detect critical state\" mode.") + return + else + return ..() + +/obj/item/device/assembly/health/process() + if(!scanning || !secured) + return + + var/atom/A = src + if(connected && connected.holder) + A = connected.holder + + for(A, A && !ismob(A), A=A.loc); + // like get_turf(), but for mobs. + var/mob/living/M = A + + if(M) + health_scan = M.health + if(health_scan <= alarm_health) + pulse() + audible_message("\icon[src] *beep* *beep*", "*beep* *beep*") + toggle_scan() + return + return + +/obj/item/device/assembly/health/proc/toggle_scan() + if(!secured) return 0 + scanning = !scanning + if(scanning) + processing_objects.Add(src) + else + processing_objects.Remove(src) + return + +/obj/item/device/assembly/health/interact(mob/user as mob)//TODO: Change this to the wires thingy + if(!secured) + user.show_message("The [name] is unsecured!") + return 0 + var/dat = text("Health Sensor [scanning?"On":"Off"]") + if(scanning && health_scan) + dat += "
Health: [health_scan]" + user << browse(dat, "window=hscan") + onclose(user, "hscan") + return + + +/obj/item/device/assembly/health/Topic(href, href_list) + ..() + if(!ismob(usr)) + return + + var/mob/user = usr + + if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + usr << browse(null, "window=hscan") + onclose(usr, "hscan") + return + + if(href_list["scanning"]) + toggle_scan() + + if(href_list["close"]) + usr << browse(null, "window=hscan") + return + + attack_self(user) + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a63f487aec7..b5e637fa546 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -244,6 +244,8 @@ stat(null, eta_status) if (client.statpanel == "Status") + if(locate(/obj/item/device/assembly/health) in src) + stat(null, "Health: [health]") if (internal) if (!internal.air_contents) qdel(internal) @@ -431,7 +433,7 @@ var/armor_block = run_armor_check(affecting, "melee") apply_damage(damage, BRUTE, affecting, armor_block) -/mob/living/carbon/human/proc/is_loyalty_implanted() +/mob/living/carbon/human/proc/is_loyalty_implanted() for(var/L in contents) if(istype(L, /obj/item/weapon/implant/loyalty)) for(var/obj/item/organ/external/O in organs) @@ -694,7 +696,7 @@ // if looting pockets with gloves, do it quietly if(href_list["pockets"]) - if(isanimal(usr)) + if(isanimal(usr)) return //animals cannot strip people if(frozen) @@ -726,19 +728,19 @@ // Update strip window if(usr.machine == src && in_range(src, usr)) show_inv(usr) - + else if(!pickpocket) // Display a warning if the user mocks up src << "You feel your [pocket_side] pocket being fumbled with!" // if looting id with gloves, do it quietly - this allows pickpocket gloves to take/place id stealthily - Bone White if(href_list["item"]) - if(isanimal(usr)) + if(isanimal(usr)) return //animals cannot strip people - + if(frozen) usr << "\red Do not attempt to strip frozen people." - return + return var/itemTarget = href_list["item"] if(itemTarget == "id") if(pickpocket) @@ -1158,7 +1160,7 @@ if(!fail_msg) fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into." user << "[fail_msg]" - + /mob/living/carbon/human/proc/check_has_mouth() // Todo, check stomach organ when implemented. var/obj/item/organ/external/head/H = get_organ("head") @@ -1170,7 +1172,7 @@ if(stat==DEAD)return if(!check_has_mouth()) - return + return if(!lastpuke) lastpuke = 1 @@ -1517,16 +1519,16 @@ W.add_fingerprint(src) -// Allows IPC's to change their monitor display +// Allows IPC's to change their monitor display /mob/living/carbon/human/proc/change_monitor() - set category = "IC" + set category = "IC" set name = "Change Monitor Display" set desc = "Change the display on your monitor." - + if(stat || paralysis || stunned || weakened) src << "You cannot change your monitor display in your current state." - return - + return + var/list/hair = list() for(var/i in hair_styles_list) var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] @@ -1540,7 +1542,7 @@ h_style = new_style update_hair() - + //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). /mob/living/carbon/human/proc/leap() diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 247bfdf25d8..5b324c2736a 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -162,6 +162,14 @@ build_path = /obj/item/device/assembly/infra category = list("initial", "Miscellaneous") +/datum/design/health_sensor + name = "Health sensor" + id = "health_sensor" + build_type = AUTOLATHE + materials = list(MAT_METAL = 800, MAT_GLASS = 200) + build_path = /obj/item/device/assembly/health + category = list("initial", "Medical") + /datum/design/kitchen_knife name = "Kitchen knife" id = "kitchen_knife" diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi index 0f9dc4608250148b2c0809fb17bc14789cb0f7c2..b50ef0e13e393b83900afb893b12b07d6ecbc205 100644 GIT binary patch literal 11591 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 diff --git a/paradise.dme b/paradise.dme index b8184ad6713..238cea3415c 100644 --- a/paradise.dme +++ b/paradise.dme @@ -959,6 +959,7 @@ #include "code\modules\alarm\power_alarm.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\bomb.dm" +#include "code\modules\assembly\health.dm" #include "code\modules\assembly\helpers.dm" #include "code\modules\assembly\holder.dm" #include "code\modules\assembly\igniter.dm" From 156bdb64c23009a30867ae617961503e00a74d52 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 6 Sep 2015 20:41:37 -0700 Subject: [PATCH 11/15] Split giant chemistry files into oldchem folder This commit does the following: - Removes relative pathing from: - Chemistry-Holder.dm - grenade_launcher.dm - reagent_dispenser.dm - Splits Chemistry-Reagents.dm into oldchem/reagents/ - Splits Chemistry-Recipies.dm into oldchem/chemical_reaction/ Another couple of huge relative-pathed files resolved. --- code/modules/reagents/Chemistry-Holder.dm | 1087 +++--- code/modules/reagents/Chemistry-Reagents.dm | 3283 ----------------- code/modules/reagents/Chemistry-Recipes.dm | 1576 -------- code/modules/reagents/grenade_launcher.dm | 94 +- .../_chemical_reaction_base.dm | 23 + .../chemical_reaction_drink.dm | 590 +++ .../chemical_reaction_food.dm | 108 + .../chemical_reaction_harm.dm | 76 + .../chemical_reaction_med.dm | 98 + .../chemical_reaction_misc.dm | 199 + .../chemical_reaction_slime.dm | 487 +++ .../oldchem/reagents/__oldchem_defines.dm | 5 + .../oldchem/reagents/_reagent_base.dm | 82 + .../reagents/drink/reagents_alcohol.dm | 748 ++++ .../oldchem/reagents/drink/reagents_drink.dm | 279 ++ .../reagents/drink/reagents_drink_base.dm | 26 + .../reagents/drink/reagents_drink_cold.dm | 141 + .../oldchem/reagents/reagents_admin.dm | 54 + .../oldchem/reagents/reagents_drugs.dm | 95 + .../oldchem/reagents/reagents_flammable.dm | 136 + .../oldchem/reagents/reagents_food.dm | 425 +++ .../reagents/oldchem/reagents/reagents_med.dm | 152 + .../oldchem/reagents/reagents_misc.dm | 222 ++ .../oldchem/reagents/reagents_toxin.dm | 597 +++ .../oldchem/reagents/reagents_water.dm | 348 ++ code/modules/reagents/reagent_dispenser.dm | 166 +- paradise.dme | 23 +- 27 files changed, 5588 insertions(+), 5532 deletions(-) delete mode 100644 code/modules/reagents/Chemistry-Reagents.dm delete mode 100644 code/modules/reagents/Chemistry-Recipes.dm create mode 100644 code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm create mode 100644 code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm create mode 100644 code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm create mode 100644 code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm create mode 100644 code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm create mode 100644 code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm create mode 100644 code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm create mode 100644 code/modules/reagents/oldchem/reagents/__oldchem_defines.dm create mode 100644 code/modules/reagents/oldchem/reagents/_reagent_base.dm create mode 100644 code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm create mode 100644 code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm create mode 100644 code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm create mode 100644 code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm create mode 100644 code/modules/reagents/oldchem/reagents/reagents_admin.dm create mode 100644 code/modules/reagents/oldchem/reagents/reagents_drugs.dm create mode 100644 code/modules/reagents/oldchem/reagents/reagents_flammable.dm create mode 100644 code/modules/reagents/oldchem/reagents/reagents_food.dm create mode 100644 code/modules/reagents/oldchem/reagents/reagents_med.dm create mode 100644 code/modules/reagents/oldchem/reagents/reagents_misc.dm create mode 100644 code/modules/reagents/oldchem/reagents/reagents_toxin.dm create mode 100644 code/modules/reagents/oldchem/reagents/reagents_water.dm diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index f8661d168e8..29a67ffe492 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -5,621 +5,618 @@ 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 +/datum/reagents + var/list/datum/reagent/reagent_list = new/list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null - New(maximum=100) - maximum_volume = maximum +/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(!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 + //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(!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() + var/paths = subtypesof(/datum/chemical_reaction) + chemical_reactions_list = list() - for(var/path in paths) + for(var/path in paths) - var/datum/chemical_reaction/D = new path() - var/list/reaction_ids = list() + 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 + 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. + // 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. - proc +/datum/reagents/proc/remove_any(var/amount=1) + var/total_transfered = 0 + var/current_list_element = 1 - remove_any(var/amount=1) - var/total_transfered = 0 - var/current_list_element = 1 + current_list_element = rand(1,reagent_list.len) - 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 - 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] - if(current_list_element > reagent_list.len) current_list_element = 1 - var/datum/reagent/current_reagent = reagent_list[current_list_element] + src.remove_reagent(current_reagent.id, min(1, amount - total_transfered)) - src.remove_reagent(current_reagent.id, min(1, amount - total_transfered)) + current_list_element++ + total_transfered++ + src.update_total() - current_list_element++ - total_transfered++ - src.update_total() + handle_reactions() + return total_transfered - 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 - 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 - 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 - 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 - return the_id +/datum/reagents/proc/trans_to(var/obj/target, var/amount=1, var/multiplier=1, var/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 (!target.reagents || src.total_volume<=0) + return + var/datum/reagents/R = target.reagents + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + var/part = amount / src.total_volume + var/trans_data = null + for (var/datum/reagent/current_reagent in src.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) - trans_to(var/obj/target, var/amount=1, var/multiplier=1, var/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 (!target.reagents || src.total_volume<=0) - return - var/datum/reagents/R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume - var/trans_data = null - for (var/datum/reagent/current_reagent in src.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, src.chem_temp) + src.remove_reagent(current_reagent.id, current_reagent_transfer) - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp) - src.remove_reagent(current_reagent.id, current_reagent_transfer) + src.update_total() + R.update_total() + R.handle_reactions() + src.handle_reactions() + return amount - src.update_total() - R.update_total() - R.handle_reactions() - src.handle_reactions() - return amount +/datum/reagents/proc/trans_to_ingest(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//For items ingested. A delay is added between ingestion and addition of the reagents + if (!target ) + return + if (!target.reagents || src.total_volume<=0) + return - trans_to_ingest(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//For items ingested. A delay is added between ingestion and addition of the reagents - if (!target ) - return - if (!target.reagents || src.total_volume<=0) - return + var/obj/item/weapon/reagent_containers/glass/beaker/noreact/B = new /obj/item/weapon/reagent_containers/glass/beaker/noreact //temporary holder + B.volume = 1000 - var/obj/item/weapon/reagent_containers/glass/beaker/noreact/B = new /obj/item/weapon/reagent_containers/glass/beaker/noreact //temporary holder - B.volume = 1000 + var/datum/reagents/BR = B.reagents + var/datum/reagents/R = target.reagents - var/datum/reagents/BR = B.reagents - var/datum/reagents/R = target.reagents + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + src.trans_to(B, amount) - src.trans_to(B, amount) + spawn(-1) + src = null // Survive through deletion of the reagent holder + sleep(100) + if(!target) + return + BR.trans_to(target, BR.total_volume) + qdel(B) - spawn(-1) - src = null // Survive through deletion of the reagent holder - sleep(100) - if(!target) - return - BR.trans_to(target, BR.total_volume) - qdel(B) + return amount - return amount +/datum/reagents/proc/copy_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1, var/safety = 0) + if(!target) + return + if(!target.reagents || src.total_volume<=0) + return + var/datum/reagents/R = target.reagents + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + var/part = amount / src.total_volume + var/trans_data = null + for (var/datum/reagent/current_reagent in src.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) - copy_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1, var/safety = 0) - if(!target) - return - if(!target.reagents || src.total_volume<=0) - return - var/datum/reagents/R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume - var/trans_data = null - for (var/datum/reagent/current_reagent in src.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) + src.update_total() + R.update_total() + R.handle_reactions() + src.handle_reactions() + return amount - src.update_total() - R.update_total() - R.handle_reactions() - src.handle_reactions() - return amount +/datum/reagents/proc/trans_id_to(var/obj/target, var/reagent, var/amount=1, var/preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N + if (!target) + return + if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) + return - trans_id_to(var/obj/target, var/reagent, var/amount=1, var/preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N - if (!target) - return - if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) - return + var/datum/reagents/R = target.reagents + if(src.get_reagent_amount(reagent) R.maximum_volume) return 0 + 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. + 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 + 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) - src.remove_reagent(current_reagent.id, 1) + 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) + src.remove_reagent(current_reagent.id, 1) - current_list_element++ - total_transfered++ - src.update_total() - R.update_total() - R.handle_reactions() - handle_reactions() + current_list_element++ + total_transfered++ + src.update_total() + R.update_total() + R.handle_reactions() + handle_reactions() - return total_transfered + return total_transfered */ - conditional_update_move(var/atom/A, var/Running = 0) - for(var/datum/reagent/R in reagent_list) - R.on_move (A, Running) - update_total() +/datum/reagents/proc/conditional_update_move(var/atom/A, var/Running = 0) + for(var/datum/reagent/R in reagent_list) + R.on_move (A, Running) + update_total() - conditional_update(var/atom/A, ) - for(var/datum/reagent/R in reagent_list) - R.on_update (A) - update_total() +/datum/reagents/proc/conditional_update(var/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_core)) + var/obj/item/slime_core/M = my_atom + + if(M.POWERFLAG == C.required_other && M.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = 1*/ + 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) + M << "\blue \icon[my_atom] [C.mix_message]" + + /* if(istype(my_atom, /obj/item/slime_core)) + var/obj/item/slime_core/ME = my_atom + ME.Uses-- + if(ME.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in viewers(4, get_turf(my_atom)) ) + M << "\blue \icon[my_atom] The innards begin to boil!" + */ + 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) + M << "\blue \icon[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(var/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(var/reagent) + for(var/A in reagent_list) + var/datum/reagent/R = A + if (R.id == reagent) + if(istype(my_atom, /mob/living)) + var/mob/living/M = my_atom + R.reagent_deleted(M) + reagent_list -= A + qdel(A) + update_total() + my_atom.on_reagent_change() + check_ignoreslow(my_atom) + check_gofast(my_atom) + check_goreallyfast(my_atom) + 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(var/mob/M, var/datum/reagent/R) + var/can_process = 0 + if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check) + return can_process + 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 + //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(var/atom/A, var/method=TOUCH, var/volume_modifier=0) + + switch(method) + if(TOUCH) + for(var/datum/reagent/R in reagent_list) + if(ismob(A)) + spawn(0) + if(!R) return + var/check = reaction_check(A, R) + if(!check) + continue + else + R.reaction_mob(A, TOUCH, R.volume+volume_modifier) + if(isturf(A)) + spawn(0) + if(!R) return + else R.reaction_turf(A, R.volume+volume_modifier) + if(isobj(A)) + spawn(0) + if(!R) return + else R.reaction_obj(A, R.volume+volume_modifier) + if(INGEST) + for(var/datum/reagent/R in reagent_list) + if(ismob(A) && R) + spawn(0) + if(!R) return + var/check = reaction_check(A, R) + if(!check) + continue + else + R.reaction_mob(A, INGEST, R.volume+volume_modifier) + if(isturf(A) && R) + spawn(0) + if(!R) return + else R.reaction_turf(A, R.volume+volume_modifier) + if(isobj(A) && R) + spawn(0) + if(!R) return + else R.reaction_obj(A, R.volume+volume_modifier) + return + +/datum/reagents/proc/add_reagent(var/reagent, var/amount, var/list/data=null, var/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() +/* + // mix dem viruses + if(R.id == "blood" && reagent == "blood") + if(R.data && data) + + if(R.data["viruses"] || data["viruses"]) + + var/list/mix1 = R.data["viruses"] + var/list/mix2 = data["viruses"] + + // Stop issues with the list changing during mixing. + var/list/to_mix = list() + + for(var/datum/disease/advance/AD in mix1) + to_mix += AD + for(var/datum/disease/advance/AD in mix2) + to_mix += AD + + var/datum/disease/advance/AD = Advance_Mix(to_mix) + if(AD) + var/list/preserve = list(AD) + for(var/D in R.data["viruses"]) + if(!istype(D, /datum/disease/advance)) + preserve += D + R.data["viruses"] = preserve +*/ handle_reactions() - if(my_atom.flags & NOREACT) return //Yup, no reactions here. No siree. + return 0 - 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 + var/datum/reagent/D = chemical_reagents_list[reagent] + if(D) - 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_core)) - var/obj/item/slime_core/M = my_atom - - if(M.POWERFLAG == C.required_other && M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1*/ - 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) - M << "\blue \icon[my_atom] [C.mix_message]" - - /* if(istype(my_atom, /obj/item/slime_core)) - var/obj/item/slime_core/ME = my_atom - ME.Uses-- - if(ME.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in viewers(4, get_turf(my_atom)) ) - M << "\blue \icon[my_atom] The innards begin to boil!" - */ - 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) - M << "\blue \icon[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 - - isolate_reagent(var/reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if (R.id != reagent) - del_reagent(R.id) - update_total() - - del_reagent(var/reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if (R.id == reagent) - if(istype(my_atom, /mob/living)) - var/mob/living/M = my_atom - R.reagent_deleted(M) - reagent_list -= A - qdel(A) - update_total() - my_atom.on_reagent_change() - check_ignoreslow(my_atom) - check_gofast(my_atom) - check_goreallyfast(my_atom) - return 0 - - - return 1 - - 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 - - clear_reagents() - for(var/datum/reagent/R in reagent_list) - del_reagent(R.id) - return 0 - - reaction_check(var/mob/M, var/datum/reagent/R) - var/can_process = 0 - if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check) - return can_process - 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 - //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 - - reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0) - - switch(method) - if(TOUCH) - for(var/datum/reagent/R in reagent_list) - if(ismob(A)) - spawn(0) - if(!R) return - var/check = reaction_check(A, R) - if(!check) - continue - else - R.reaction_mob(A, TOUCH, R.volume+volume_modifier) - if(isturf(A)) - spawn(0) - if(!R) return - else R.reaction_turf(A, R.volume+volume_modifier) - if(isobj(A)) - spawn(0) - if(!R) return - else R.reaction_obj(A, R.volume+volume_modifier) - if(INGEST) - for(var/datum/reagent/R in reagent_list) - if(ismob(A) && R) - spawn(0) - if(!R) return - var/check = reaction_check(A, R) - if(!check) - continue - else - R.reaction_mob(A, INGEST, R.volume+volume_modifier) - if(isturf(A) && R) - spawn(0) - if(!R) return - else R.reaction_turf(A, R.volume+volume_modifier) - if(isobj(A) && R) - spawn(0) - if(!R) return - else R.reaction_obj(A, R.volume+volume_modifier) - return - - add_reagent(var/reagent, var/amount, var/list/data=null, var/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() -/* - // mix dem viruses - if(R.id == "blood" && reagent == "blood") - if(R.data && data) - - if(R.data["viruses"] || data["viruses"]) - - var/list/mix1 = R.data["viruses"] - var/list/mix2 = data["viruses"] - - // Stop issues with the list changing during mixing. - var/list/to_mix = list() - - for(var/datum/disease/advance/AD in mix1) - to_mix += AD - for(var/datum/disease/advance/AD in mix2) - to_mix += AD - - var/datum/disease/advance/AD = Advance_Mix(to_mix) - if(AD) - var/list/preserve = list(AD) - for(var/D in R.data["viruses"]) - if(!istype(D, /datum/disease/advance)) - preserve += D - R.data["viruses"] = preserve -*/ - - 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 + var/datum/reagent/R = new D.type() + reagent_list += R + R.holder = src + R.volume = amount // SetViruses(R, data) // Includes setting data - if(data) R.data = data - //debug - //world << "Adding data" - //for(var/D in R.data) - // world << "Container data: [D] = [R.data[D]]" - //debug - 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])") + if(data) R.data = data + //debug + //world << "Adding data" + //for(var/D in R.data) + // world << "Container data: [D] = [R.data[D]]" + //debug + 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(var/reagent, var/amount, var/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 + return 1 - remove_reagent(var/reagent, var/amount, var/safety)//Added a safety check for the trans_id_to +/datum/reagents/proc/has_reagent(var/reagent, var/amount = -1) - if(!isnum(amount)) return 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 - 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 0 - return 1 +/datum/reagents/proc/get_reagent_amount(var/reagent) + for(var/A in reagent_list) + var/datum/reagent/R = A + if (R.id == reagent) + return R.volume - has_reagent(var/reagent, var/amount = -1) + return 0 - 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 +/datum/reagents/proc/get_reagents() + var/res = "" + for(var/datum/reagent/A in reagent_list) + if (res != "") res += "," + res += A.name - return 0 + return res - get_reagent_amount(var/reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if (R.id == reagent) - return R.volume +/datum/reagents/proc/remove_all_type(var/reagent_type, var/amount, var/strict = 0, var/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 - return 0 + var/has_removed_reagent = 0 - get_reagents() - var/res = "" - for(var/datum/reagent/A in reagent_list) - if (res != "") res += "," - res += A.name + 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 res + return has_removed_reagent - remove_all_type(var/reagent_type, var/amount, var/strict = 0, var/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 +// Admin logging. +/datum/reagents/proc/get_reagent_ids(var/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) - var/has_removed_reagent = 0 +//two helper functions to preserve data across reactions (needed for xenoarch) +/datum/reagents/proc/get_data(var/reagent_id) + for(var/datum/reagent/D in reagent_list) + if(D.id == reagent_id) + //world << "proffering a data-carrying reagent ([reagent_id])" + return D.data - 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) +/datum/reagents/proc/set_data(var/reagent_id, var/new_data) + for(var/datum/reagent/D in reagent_list) + if(D.id == reagent_id) + //world << "reagent data set ([reagent_id])" + D.data = new_data - return has_removed_reagent +/datum/reagents/proc/copy_data(var/datum/reagent/current_reagent) + if (!current_reagent || !current_reagent.data) return null + if (!istype(current_reagent.data, /list)) return current_reagent.data - // Admin logging. - get_reagent_ids(var/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) + var/list/trans_data = current_reagent.data.Copy() - //two helper functions to preserve data across reactions (needed for xenoarch) - get_data(var/reagent_id) - for(var/datum/reagent/D in reagent_list) - if(D.id == reagent_id) - //world << "proffering a data-carrying reagent ([reagent_id])" - return D.data + // 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["virus2"]) + var/list/v = trans_data["virus2"] + trans_data["virus2"] = v.Copy() - set_data(var/reagent_id, var/new_data) - for(var/datum/reagent/D in reagent_list) - if(D.id == reagent_id) - //world << "reagent data set ([reagent_id])" - D.data = new_data - - copy_data(var/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["virus2"]) - var/list/v = trans_data["virus2"] - trans_data["virus2"] = v.Copy() - - return trans_data + return trans_data /////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm deleted file mode 100644 index 238724c0b09..00000000000 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ /dev/null @@ -1,3283 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 -#define FOOD_METABOLISM 0.4 -#define REM REAGENTS_EFFECT_MULTIPLIER - -//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent) -//so that it can continue working when the reagent is deleted while the proc is still active. - -datum - reagent - var/name = "Reagent" - var/id = "reagent" - var/description = "" - var/datum/reagents/holder = null - 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!) - var/shock_reduction = 0 - var/penetrates_skin = 0 //Whether or not a reagent penetrates the skin - //Processing flags, defines the type of mobs the reagent will affect - //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 - proc - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not. - if(!istype(M, /mob/living)) return 0 - var/datum/reagent/self = src - src = null - - if(self.holder) //for catching rare runtimes - if(method == TOUCH && self.penetrates_skin) - var/block = 0 - for(var/obj/item/clothing/C in M.get_equipped_items()) - if(istype(C, /obj/item/clothing/suit/bio_suit)) - block += 1 - if(istype(C, /obj/item/clothing/head/bio_hood)) - block += 1 - if(block < 2) - if(M.reagents) - M.reagents.add_reagent(self.id,self.volume) - -/* - if(method == INGEST && istype(M, /mob/living/carbon)) - if(prob(1 * self.addictiveness)) - if(prob(5 * volume)) - var/datum/disease/addiction/A = new /datum/disease/addiction - A.addicted_to = self - A.name = "[self.name] Addiction" - A.addiction ="[self.name]" - A.cure = self.id - M.viruses += A - A.affected_mob = M - A.holder = M -*/ - return 1 - - reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object - src = null //if it can hold reagents. nope! - //if(O.reagents) - // O.reagents.add_reagent(id,volume/3) - return - - reaction_turf(var/turf/T, var/volume) - src = null - return - - on_mob_life(var/mob/living/M as mob, var/alien) - if(!istype(M, /mob/living)) // YOU'RE A FUCKING RETARD NEO WHY CAN'T YOU JUST FIX THE PROBLEM ON THE REAGENT - Iamgoofball - return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO - // Certain elements in too large amounts cause side-effects - holder.remove_reagent(src.id, metabolization_rate) //By default it slowly disappears. - current_cycle++ - return - - // Called when two reagents of the same are mixing. - on_merge(var/data) - return - - on_move(var/mob/M) - return - - on_update(var/atom/A) - return - - 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 - on_mob_life(var/mob/living/M as mob) - if(prob(10)) - M << "\red Your insides are burning!" - M.adjustToxLoss(rand(20,60)*REM) - else if(prob(40)) - M.heal_organ_damage(5*REM,0) - ..() - return - - - blood - data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"blood_colour"= "#A10808","resistances"=null,"trace_chem"=null, "antibodies" = null) - name = "Blood" - id = "blood" - reagent_state = LIQUID - color = "#C80000" // rgb: 200, 0, 0 - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - var/datum/reagent/blood/self = src - src = null - if(self.data && self.data["virus2"] && istype(M, /mob/living/carbon))//infecting... - var/list/vlist = self.data["virus2"] - if (vlist.len) - for (var/ID in vlist) - var/datum/disease2/disease/V = vlist[ID] - - if(method == TOUCH) - infect_virus2(M,V.getcopy()) - else - infect_virus2(M,V.getcopy(),1) //injected, force infection! - if(self.data && self.data["antibodies"] && istype(M, /mob/living/carbon))//... and curing - var/mob/living/carbon/C = M - C.antibodies |= self.data["antibodies"] - - on_merge(var/data) - if(data["blood_colour"]) - color = data["blood_colour"] - return ..() - - on_update(var/atom/A) - if(data["blood_colour"]) - color = data["blood_colour"] - return ..() - - - - reaction_turf(var/turf/simulated/T, var/volume)//splash the blood all over the place - if(!istype(T)) return - var/datum/reagent/blood/self = src - src = null - if(!(volume >= 3)) return - //var/datum/disease/D = self.data["virus"] - if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human)) - var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here - if(!blood_prop) //first blood! - blood_prop = new(T) - blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"] - - if(self.data["virus2"]) - blood_prop.virus2 = virus_copylist(self.data["virus2"]) - - else if(istype(self.data["donor"], /mob/living/carbon/alien)) - var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T - if(!blood_prop) - blood_prop = new(T) - blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" - return - -/* Must check the transfering of reagents and their data first. They all can point to one disease datum. - - Destroy() - if(src.data["virus"]) - var/datum/disease/D = src.data["virus"] - D.cure(0) - return ..() -*/ - -/* - vaccine - //data must contain virus type - name = "Vaccine" - id = "vaccine" - reagent_state = LIQUID - color = "#C81040" // rgb: 200, 16, 64 - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - var/datum/reagent/vaccine/self = src - src = null - if(self.data&&method == INGEST) - for(var/datum/disease/D in M.viruses) - if(istype(D, /datum/disease/advance)) - var/datum/disease/advance/A = D - if(A.GetDiseaseID() == self.data) - D.cure() - else - if(D.type == self.data) - D.cure() - - M.resistances += self.data - return -*/ - - // 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. - woodpulp - name = "Wood Pulp" - id = "woodpulp" - description = "A mass of wood fibers." - reagent_state = LIQUID - color = "#B97A57" - - fishwater - name = "Fish Water" - id = "fishwater" - description = "Smelly water from a fish tank. Gross!" - reagent_state = LIQUID - color = "#757547" - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - if(!istype(M, /mob/living)) - return - if(method == INGEST) - M << "Oh god, why did you drink that?" - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(30)) // Nasty, you drank this stuff? 30% chance of the fakevomit (non-stunning version) - if(prob(50)) // 50/50 chance of green vomit vs normal vomit - M.fakevomit(1) - else - M.fakevomit(0) - ..() - return - - water - name = "Water" - id = "water" - description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." - reagent_state = LIQUID - color = "#0064C8" // rgb: 0, 100, 200 - var/cooling_temperature = 2 - process_flags = ORGANIC | SYNTHETIC - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(!istype(M, /mob/living)) - return - - // Put out fire - if(method == TOUCH) - M.adjust_fire_stacks(-(volume / 10)) - if(M.fire_stacks <= 0) - M.ExtinguishMob() - return - - reaction_turf(var/turf/simulated/T, var/volume) - if (!istype(T)) return - src = null - if(volume >= 3) - if(T.wet >= 1) return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - spawn(800) - if (!istype(T)) return - if(T.wet >= 2) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - - for(var/mob/living/carbon/slime/M in T) - M.apply_water() - - var/hotspot = (locate(/obj/effect/hotspot) in T) - if(hotspot && !istype(T, /turf/space)) - 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) - return - - reaction_obj(var/obj/O, var/volume) - src = null - var/turf/T = get_turf(O) - var/hotspot = (locate(/obj/effect/hotspot) in T) - if(hotspot && !istype(T, /turf/space)) - 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) - if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) - var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O - if(!cube.wrapped) - cube.Expand() - // Dehydrated carp - if(istype(O,/obj/item/toy/carpplushie/dehy_carp)) - var/obj/item/toy/carpplushie/dehy_carp/dehy = O - dehy.Swell() // Makes a carp - return - - hellwater - name = "Hell Water" - id = "hell_water" - description = "YOUR FLESH! IT BURNS!" - process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL. - - on_mob_life(var/mob/living/M as mob) - 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) - holder.remove_reagent(src.id, 1) - - lube - name = "Space Lube" - id = "lube" - description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." - reagent_state = LIQUID - color = "#1BB1AB" - - reaction_turf(var/turf/simulated/T, var/volume) - if (!istype(T)) return - src = null - if(volume >= 1) - if(T.wet >= 2) return - T.wet = 2 - spawn(800) - if (!istype(T)) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - return - - toxin - name = "Toxin" - id = "toxin" - description = "A Toxic chemical." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(2) - ..() - return - - spider_venom - name = "Spider venom" - id = "spidertoxin" - description = "A toxic venom injected by spacefaring arachnids." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1.5) - ..() - return - - plasticide - name = "Plasticide" - id = "plasticide" - description = "Liquid plastic, do not eat." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1.5) - ..() - return - - minttoxin - name = "Mint Toxin" - id = "minttoxin" - description = "Useful for dealing with undesirable customers." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if (FAT in M.mutations) - M.gib() - ..() - return - - slimetoxin - name = "Mutation Toxin" - id = "mutationtoxin" - description = "A corruptive toxin produced by slimes." - reagent_state = LIQUID - color = "#13BC5E" // rgb: 19, 188, 94 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(ishuman(M)) - var/mob/living/carbon/human/human = M - if(human.species.name != "Shadow") - M << "\red Your flesh rapidly mutates!" - M << "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids." - M << "\red Your body reacts violently to light. \green However, it naturally heals in darkness." - M << "Aside from your new traits, you are mentally unchanged and retain your prior obligations." - human.set_species("Shadow") - ..() - return - - - - aslimetoxin - name = "Advanced Mutation Toxin" - id = "amutationtoxin" - description = "An advanced corruptive toxin produced by slimes." - reagent_state = LIQUID - color = "#13BC5E" // rgb: 19, 188, 94 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(istype(M, /mob/living/carbon) && M.stat != DEAD) - M << "\red Your flesh rapidly mutates!" - if(M.notransform) return - M.notransform = 1 - M.canmove = 0 - M.icon = null - M.overlays.Cut() - M.invisibility = 101 - for(var/obj/item/W in M) - if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something - qdel(W) - continue - W.layer = initial(W.layer) - W.loc = M.loc - W.dropped(M) - var/mob/living/carbon/slime/new_mob = new /mob/living/carbon/slime(M.loc) - new_mob.a_intent = "harm" - new_mob.universal_speak = 1 - if(M.mind) - M.mind.transfer_to(new_mob) - else - new_mob.key = M.key - qdel(M) - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.druggy = max(M.druggy, 15) - if(isturf(M.loc) && !istype(M.loc, /turf/space)) - if(M.canmove && !M.restrained()) - if(prob(10)) step(M, pick(cardinal)) - if(prob(7)) M.emote(pick("twitch","drool","moan","giggle")) - ..() - return - - holywater - name = "Water" - id = "holywater" - description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." - reagent_state = LIQUID - color = "#0064C8" // rgb: 0, 100, 200 - process_flags = ORGANIC | SYNTHETIC - - on_mob_life(var/mob/living/M as mob) - if(!data) data = 1 - data++ - M.jitteriness = max(M.jitteriness-5,0) - if(data >= 30) // 12 units, 60 seconds @ metabolism 0.4 units & tick rate 2.0 sec - if (!M.stuttering) M.stuttering = 1 - M.stuttering += 4 - 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(data >= 75 && prob(33)) // 30 units, 150 seconds - if (!M.confused) M.confused = 1 - M.confused += 3 - if(iscultist(M)) - ticker.mode.remove_cultist(M.mind) - holder.remove_reagent(src.id, src.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 - if(ishuman(M)) . - if(((M.mind in ticker.mode.vampires) || M.mind.vampire) && (!(VAMP_FULL in M.mind.vampire.powers)) && prob(80)) - switch(data) - if(1 to 4) - M << "Something sizzles in your veins!" - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) - if(5 to 12) - M << "You feel an intense burning inside of you!" - M.adjustFireLoss(1) - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) - if(13 to INFINITY) - M << "You suddenly ignite in a holy fire!" - for(var/mob/O in viewers(M, null)) - O.show_message(text("[] suddenly bursts into flames!", M), 1) - 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.adjustFireLoss(3) //Hence the other damages... ain't I a bastard? - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) - ..() - return - - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - // Vampires have their powers weakened by holy water applied to the skin. - if(ishuman(M)) - if((M.mind in ticker.mode.vampires) && !(VAMP_FULL in M.mind.vampire.powers)) - var/mob/living/carbon/human/H=M - if(method == TOUCH) - if(H.wear_mask) - H << "\red Your mask protects you from the holy water!" - return - else if(H.head) - H << "\red Your helmet protects you from the holy water!" - return - else - M << "Something holy interferes with your powers!" - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) - return - - - reaction_turf(var/turf/simulated/T, var/volume) - ..() - if(!istype(T)) return - if(volume>=10) - for(var/obj/effect/rune/R in T) - qdel(R) - T.Bless() - - 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 - - on_mob_life(var/mob/living/M as mob) - if(ishuman(M)) - if(prob(7)) M.emote(pick("twitch","drool","moan","gasp")) - holder.remove_reagent(src.id, 0.25 * REAGENTS_METABOLISM) - return - -/* silicate - name = "Silicate" - id = "silicate" - description = "A compound that can be used to reinforce glass." - reagent_state = LIQUID - color = "#C7FFFF" // rgb: 199, 255, 255 - - reaction_obj(var/obj/O, var/volume) - src = null - 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 - - return*/ - - oxygen - name = "Oxygen" - id = "oxygen" - description = "A colorless, odorless gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - - on_mob_life(var/mob/living/M as mob, var/alien) - if(M.stat == 2) return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis")) - M.adjustToxLoss(REAGENTS_METABOLISM) - holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears. - return - ..() - - copper - name = "Copper" - id = "copper" - description = "A highly ductile metal." - color = "#6E3B08" // rgb: 110, 59, 8 - - - nitrogen - name = "Nitrogen" - id = "nitrogen" - description = "A colorless, odorless, tasteless gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - - - on_mob_life(var/mob/living/M as mob, var/alien) - if(M.stat == 2) return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis")) - M.adjustOxyLoss(-2*REM) - holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears. - return - ..() - - hydrogen - name = "Hydrogen" - id = "hydrogen" - description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - - - 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 - - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(70)) - M.adjustBrainLoss(1) - ..() - return - - sulfur - name = "Sulfur" - id = "sulfur" - description = "A chemical element." - reagent_state = SOLID - color = "#BF8C00" // rgb: 191, 140, 0 - - carbon - name = "Carbon" - id = "carbon" - description = "A chemical element." - reagent_state = SOLID - color = "#1C1300" // rgb: 30, 20, 0 - - - reaction_turf(var/turf/T, var/volume) - src = null - // Only add one dirt per turf. Was causing people to crash. - if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T)) - new /obj/effect/decal/cleanable/dirt(T) - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustFireLoss(1) - ..() - return - - fluorine - name = "Fluorine" - id = "fluorine" - description = "A highly-reactive chemical element." - reagent_state = GAS - color = "#6A6054" - penetrates_skin = 1 - process_flags = ORGANIC | SYNTHETIC - - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustFireLoss(1) - M.adjustToxLoss(1*REM) - ..() - return - - sodium - name = "Sodium" - id = "sodium" - description = "A chemical element." - reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 - - - phosphorus - name = "Phosphorus" - id = "phosphorus" - description = "A chemical element." - reagent_state = SOLID - color = "#832828" // rgb: 131, 40, 40 - - - lithium - name = "Lithium" - id = "lithium" - description = "A chemical element." - reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.canmove && !M.restrained() && istype(M.loc, /turf/space)) - step(M, pick(cardinal)) - if(prob(5)) M.emote(pick("twitch","drool","moan")) - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - if(prob(4)) - M.reagents.add_reagent("epinephrine", 1.2) - if(prob(50)) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - if(current_cycle >= 90) - M.jitteriness += 10 - ..() - return - - overdose_process(var/mob/living/M as mob) - if(volume > 200) - M << "You pass out from hyperglycemic shock!" - M.Paralyse(1) - if(prob(8)) - M.adjustToxLoss(rand(1,2)) - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustFireLoss(1) - ..() - return - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - if(volume > 25) - - if(H.wear_mask) - H << "\red Your mask protects you from the acid!" - return - - if(H.head) - H << "\red 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(20, 0) - H.UpdateDamageIcon() - H.emote("scream") - else - M.take_organ_damage(15,0) - else - M.take_organ_damage(15,0) - - if(method == INGEST) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - if(volume < 10) - 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(min(max(volume-10,2)*2,20),0) - 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(20, 0) - H.UpdateDamageIcon() - H.emote("scream") - else - M.take_organ_damage(15,0) - - reaction_obj(var/obj/O, var/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." - for(var/mob/M in viewers(5, O)) - M << "\red \the [O] melts." - qdel(O) - - 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 - - - nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." - reagent_state = LIQUID - color = "#808080" // rgb: 128, 128, 128 - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.apply_effect(4*REM,IRRADIATE,0) - // radium may increase your chances to cure a disease - if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs - var/mob/living/carbon/C = M - if(C.virus2.len) - for (var/ID in C.virus2) - var/datum/disease2/disease/V = C.virus2[ID] - if(prob(5)) - if(prob(50)) - M.apply_effect(50,IRRADIATE,0) // curing it that way may kill you instead - M.adjustToxLoss(100) - C.antibodies |= V.antigen - ..() - return - - reaction_turf(var/turf/T, var/volume) - src = null - if(volume >= 3) - if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/greenglow(T) - return - - 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 - - reaction_turf(var/turf/T, var/volume) - src = null - if(volume >= 5) - if(istype(T, /turf/simulated/wall)) - T:thermite = 1 - T.overlays.Cut() - T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite") - return - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustFireLoss(1) - ..() - return - - mutagen - name = "Unstable mutagen" - id = "mutagen" - description = "Might cause unpredictable mutations. Keep away from children." - reagent_state = LIQUID - color = "#04DF27" - metabolization_rate = 0.3 - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - if(!..()) return - if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. - src = null - if((method==TOUCH && prob(33)) || method==INGEST) - if(prob(98)) - randmutb(M) - else - randmutg(M) - domutcheck(M, null) - M.UpdateAppearance() - return - on_mob_life(var/mob/living/M as mob) - if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. - if(!M) M = holder.my_atom - M.apply_effect(2*REM,IRRADIATE,0) - if(prob(4)) - randmutb(M) - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.nutrition += nutriment_factor*REM - ..() - return - - 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 - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if (method == TOUCH) - M.germ_level -= min(volume*20, M.germ_level) - - reaction_obj(var/obj/O, var/volume) - O.germ_level -= min(volume*20, O.germ_level) - - reaction_turf(var/turf/T, var/volume) - T.germ_level -= min(volume*20, T.germ_level) - - iron - name = "Iron" - id = "iron" - description = "Pure iron is a metal." - reagent_state = SOLID - color = "#C8A5DC" // rgb: 200, 165, 220 -/* - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if((M.virus) && (prob(8) && (M.virus.name=="Magnitis"))) - if(M.virus.spread == "Airborne") - M.virus.spread = "Remissive" - M.virus.stage-- - if(M.virus.stage <= 0) - M.resistances += M.virus.type - M.virus = null - holder.remove_reagent(src.id, 0.2) - return -*/ - - 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 - - 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 - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.apply_effect(2,IRRADIATE,0) - ..() - return - - - reaction_turf(var/turf/T, var/volume) - src = null - if(volume >= 3) - if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/greenglow(T) - - 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 - - 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 - - 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" - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - M.adjust_fire_stacks(volume / 10) - return - ..() - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1) - ..() - return - - 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. - - 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) - holder.remove_reagent(src.id, 1) - - incendiary_fuel //copy-pasta of welding fuel; allow incendiary grenades to function better without the headache of people spraying fuel everywhere with regular welding fuel. - name = "Incendiary fuel" - id = "incendiaryfuel" - description = "A highly flammable compound used in incendiary grenades." - reagent_state = LIQUID - color = "#660000" // rgb: 102, 0, 0 - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - M.adjust_fire_stacks(volume / 10) - return - - reaction_obj(var/obj/O, var/volume) - var/turf/the_turf = get_turf(O) - if(!the_turf) - return //No sense trying to start a fire if you don't have a turf to set on fire. --NEO - new /obj/effect/decal/cleanable/liquid_fuel(the_turf, volume) - reaction_turf(var/turf/T, var/volume) - new /obj/effect/decal/cleanable/liquid_fuel(T, volume) - return - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1) - ..() - return - - space_cleaner - name = "Space cleaner" - id = "cleaner" - description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" - reagent_state = LIQUID - color = "#61C2C2" - - reaction_obj(var/obj/O, var/volume) - if(istype(O,/obj/effect/decal/cleanable)) - qdel(O) - else - if(O) - O.clean_blood() - reaction_turf(var/turf/T, var/volume) - if(volume >= 1) - T.overlays.Cut() - T.clean_blood() - for(var/obj/effect/decal/cleanable/C in src) - qdel(C) - - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(5,10)) - reaction_turf(var/turf/simulated/S, var/volume) - if(volume >= 1) - S.dirt = 0 - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.lip_style) - H.lip_style = null - H.update_body() - if(C.r_hand) - C.r_hand.clean_blood() - if(C.l_hand) - C.l_hand.clean_blood() - if(C.wear_mask) - if(C.wear_mask.clean_blood()) - C.update_inv_wear_mask(0) - if(ishuman(M)) - var/mob/living/carbon/human/H = C - if(H.head) - if(H.head.clean_blood()) - H.update_inv_head(0,0) - if(H.wear_suit) - if(H.wear_suit.clean_blood()) - H.update_inv_wear_suit(0,0) - else if(H.w_uniform) - if(H.w_uniform.clean_blood()) - H.update_inv_w_uniform(0,0) - if(H.shoes) - if(H.shoes.clean_blood()) - H.update_inv_shoes(0,0) - M.clean_blood() - ..() - return - - plasma - name = "Plasma" - id = "plasma" - description = "The liquid phase of an unusual extraterrestrial compound." - reagent_state = LIQUID - color = "#7A2B94" - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1*REM) - if(holder.has_reagent("epinephrine")) - holder.remove_reagent("epinephrine", 2) - ..() - return - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with plasma is stronger than fuel! - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - M.adjust_fire_stacks(volume / 5) - ..() - return - lexorin - name = "Lexorin" - id = "lexorin" - description = "Lexorin temporarily stops respiration. Causes tissue damage." - reagent_state = LIQUID - color = "#52685D" - metabolization_rate = 0.2 - - on_mob_life(var/mob/living/M as mob) - if(M.stat == 2.0) - return - if(!M) M = holder.my_atom - M.adjustToxLoss(1) - ..() - return - - 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! - - on_mob_life(var/mob/living/carbon/M as mob) - if(!M) M = holder.my_atom ///This can even heal dead people. - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.id,5) - M.setCloneLoss(0) - M.setOxyLoss(0) - M.radiation = 0 - M.heal_organ_damage(5,5) - M.adjustToxLoss(-5) - M.hallucination = 0 - M.setBrainLoss(0) - M.disabilities = 0 - M.sdisabilities = 0 - M.eye_blurry = 0 - M.eye_blind = 0 - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] - if(istype(E)) - E.damage = max(E.damage-5 , 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.sleeping = 0 - M.jitteriness = 0 - if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs - var/mob/living/carbon/C = M - if(C.virus2.len) - for (var/ID in C.virus2) - var/datum/disease2/disease/V = C.virus2[ID] - C.antibodies |= V.antigen - ..() - return - - nanites - name = "Nanites" - id = "nanites" - description = "Nanomachines that aid in rapid cellular regeneration." - - - 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" - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - if(prob(50)) - M.adjustBrainLoss(-1.0) - ..() - return - - audioline - name = "Audioline" - id = "audioline" - description = "Heals ear damage." - reagent_state = LIQUID - color = "#6600FF" // rgb: 100, 165, 255 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.ear_damage = 0 - M.ear_deaf = 0 - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - 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_by_name) - var/obj/item/organ/I = H.internal_organs_by_name[name] - if(I.damage > 0) - I.damage -= 0.20 - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.bodytemperature < 265) - M.adjustCloneLoss(-4) - M.adjustOxyLoss(-10) - M.heal_organ_damage(12,12) - M.adjustToxLoss(-3) - M.status_flags &= ~DISFIGURED - ..() - return - - rezadone - name = "Rezadone" - id = "rezadone" - description = "A powder derived from fish toxin, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." - reagent_state = SOLID - color = "#669900" // rgb: 102, 153, 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!data) data = 1 - data++ - switch(data) - if(1 to 15) - M.adjustCloneLoss(-1) - M.heal_organ_damage(1,1) - if(15 to 35) - M.adjustCloneLoss(-2) - M.heal_organ_damage(2,1) - M.status_flags &= ~DISFIGURED - if(35 to INFINITY) - M.adjustToxLoss(1) - M.Dizzy(5) - M.Jitter(5) - - ..() - return - - spaceacillin - name = "Spaceacillin" - id = "spaceacillin" - description = "An all-purpose antibiotic agent extracted from space fungus." - reagent_state = LIQUID - color = "#0AB478" - - on_mob_life(var/mob/living/M as mob) - ..() - return - - carpotoxin - name = "Carpotoxin" - id = "carpotoxin" - description = "A deadly neurotoxin produced by the dreaded spess carp." - reagent_state = LIQUID - color = "#003333" // rgb: 0, 51, 51 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(2*REM) - ..() - return - - 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 - - on_mob_life(var/mob/living/M) - M.adjustStaminaLoss(REM * data) - data = max(data - 1, 3) - ..() - - lsd - name = "Lysergic acid diethylamide" - id = "lsd" - description = "A highly potent hallucinogenic substance. Far out, maaaan." - reagent_state = LIQUID - color = "#0000D8" - - on_mob_life(var/mob/living/M) - if(!M) M = holder.my_atom - M.hallucination += 10 - ..() - return - - - spores - name = "Spore Toxin" - id = "spores" - description = "A toxic spore cloud which blocks vision when ingested." - color = "#9ACD32" - - on_mob_life(var/mob/living/M as mob) - M.adjustToxLoss(0.5) - M.damageoverlaytemp = 60 - M.eye_blurry = max(M.eye_blurry, 3) - ..() - return - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - nanomachines - name = "Nanomachines" - id = "nanomachines" - description = "Microscopic construction robots." - reagent_state = LIQUID - color = "#535E66" // rgb: 83, 94, 102 - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - src = null - if( (prob(10) && method==TOUCH) || method==INGEST) - M.contract_disease(new /datum/disease/robotic_transformation(0),1) - - xenomicrobes - name = "Xenomicrobes" - id = "xenomicrobes" - description = "Microbes with an entirely alien cellular structure." - reagent_state = LIQUID - color = "#535E66" // rgb: 83, 94, 102 - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - src = null - if( (prob(10) && method==TOUCH) || method==INGEST) - M.contract_disease(new /datum/disease/xeno_transformation(0),1) -*/ - - spore - name = "Blob Spores" - id = "spore" - description = "Spores of some blob creature thingy." - reagent_state = LIQUID - color = "#CE760A" // rgb: 206, 118, 10 - var/client/blob_client = null - var/blob_point_rate = 3 - - on_mob_life(var/mob/living/M) - if(!M) M = holder.my_atom - if (holder.has_reagent("atrazine",45)) - holder.del_reagent("spore") - if (prob(1)) - M << "\red Your mouth tastes funny." - if (prob(1) && prob(25)) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(directory[ckey(C.key)]) - blob_client = directory[ckey(C.key)] - C.gib() - if(blob_client) - var/obj/effect/blob/core/core = new(get_turf(C), 200, blob_client, blob_point_rate) - if(core.overmind && core.overmind.mind) - core.overmind.mind.name = C.name - - return - -//foam - - 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 - - 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 - - - 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" - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - switch(data) - if(1 to 50) - M.sleeping += 1 - if(51 to INFINITY) - M.sleeping += 1 - M.adjustToxLoss((data - 50)*REM) - data++ - holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM) - ..() - return - -/////////////////////////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. - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!(M.mind in ticker.mode.vampires)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species && H.species.dietflags) //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.heal_organ_damage(1,0) - if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals - if(prob(50)) M.heal_organ_damage(1,0) - ..() - return - - 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." - reagent_state = SOLID - nutriment_factor = 15 * REAGENTS_METABOLISM - color = "#664330" // rgb: 102, 67, 48 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!(M.mind in ticker.mode.vampires)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species && H.species.dietflags && !(H.species.dietflags & DIET_HERB)) //Make sure the species has it's dietflag set, and that it is not a herbivore - H.nutrition += nutriment_factor // For hunger and fatness - if(prob(50)) M.heal_organ_damage(1,0) - if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals - if(prob(50)) M.heal_organ_damage(1,0) - ..() - return - - 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." - reagent_state = SOLID - nutriment_factor = 15 * REAGENTS_METABOLISM - color = "#664330" // rgb: 102, 67, 48 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!(M.mind in ticker.mode.vampires)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species && H.species.dietflags && !(H.species.dietflags & DIET_CARN)) //Make sure the species has it's dietflag set, and that it is not a carnivore - H.nutrition += nutriment_factor // For hunger and fatness - if(prob(50)) M.heal_organ_damage(1,0) - if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals - if(prob(50)) M.heal_organ_damage(1,0) - ..() - return - - 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 - - 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 - - - capsaicin - name = "Capsaicin Oil" - id = "capsaicin" - description = "This is what makes chilis hot." - reagent_state = LIQUID - color = "#B31008" // rgb: 179, 16, 8 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!data) data = 1 - switch(data) - if(1 to 15) - M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 5) - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature += rand(5,20) - if(15 to 25) - M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature += rand(10,20) - if(25 to INFINITY) - M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature += rand(15,20) - holder.remove_reagent(src.id, FOOD_METABOLISM) - data++ - ..() - return - - condensedcapsaicin - name = "Condensed Capsaicin" - id = "condensedcapsaicin" - description = "This shit goes in pepperspray." - reagent_state = LIQUID - color = "#B31008" // rgb: 179, 16, 8 - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - if(istype(M, /mob/living/carbon/human)) - 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 ) - victim << "\red Your [safe_thing] protects you from the pepperspray!" - return - else if ( mouth_covered ) // Reduced effects if partially protected - victim << "\red 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 - victim << "\red 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") - victim << "\red 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() - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(5)) - M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]") - ..() - return - - frostoil - name = "Frost Oil" - id = "frostoil" - description = "A special oil that noticably chills the body. Extraced from Icepeppers." - reagent_state = LIQUID - color = "#B31008" // rgb: 139, 166, 233 - process_flags = ORGANIC | SYNTHETIC - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!data) data = 1 - switch(data) - if(1 to 15) - M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 5) - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature -= rand(5,20) - if(15 to 25) - M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature -= rand(10,20) - if(25 to INFINITY) - M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT - if(prob(1)) - M.emote("shiver") - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature -= rand(15,20) - data++ - holder.remove_reagent(src.id, FOOD_METABOLISM) - ..() - return - - reaction_turf(var/turf/simulated/T, var/volume) - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(15,30)) - - sodiumchloride - name = "Salt" - id = "sodiumchloride" - description = "Sodium chloride, common table salt." - reagent_state = SOLID - color = "#B1B0B0" - - overdose_process(var/mob/living/M as mob) - if(volume > 100) - if(prob(70)) - M.adjustBrainLoss(1) - if(prob(8)) - M.adjustToxLoss(rand(1,2)) - ..() - return - - blackpepper - name = "Black Pepper" - id = "blackpepper" - description = "A powder ground from peppercorns. *AAAACHOOO*" - reagent_state = SOLID - // no color (ie, black) - - coco - name = "Coco Powder" - id = "coco" - description = "A fatty, bitter paste made from coco beans." - reagent_state = SOLID - nutriment_factor = 5 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - - hot_coco - name = "Hot Chocolate" - id = "hot_coco" - description = "Made with love! And coco beans." - reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#403010" // rgb: 64, 48, 16 - - on_mob_life(var/mob/living/M as mob) - 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 - ..() - return - - psilocybin - name = "Psilocybin" - id = "psilocybin" - description = "A strong psycotropic derived from certain species of mushroom." - color = "#E700E7" // rgb: 231, 0, 231 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.druggy = max(M.druggy, 30) - if(!data) data = 1 - switch(data) - 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")) - data++ - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) - if(!M) M = holder.my_atom - M.heal_organ_damage(1,1) - M.nutrition += nutriment_factor - ..() - return - ..() - - 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 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - reaction_turf(var/turf/simulated/T, var/volume) - if (!istype(T)) return - src = null - if(volume >= 3) - if(T.wet >= 1) return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - spawn(800) - if (!istype(T)) return - if(T.wet >= 2) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - 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) - - enzyme - name = "Denatured Enzyme" - id = "enzyme" - description = "Heated beyond usefulness, this enzyme is now worthless." - reagent_state = LIQUID - color = "#282314" // rgb: 54, 94, 48 - - 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 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - 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)) - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT - ..() - return - - - 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 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - - reaction_turf(var/turf/T, var/volume) - src = null - if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/flour(T) - - 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 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - - 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 - - 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. - toxin/fertilizer - name = "fertilizer" - id = "fertilizer" - description = "A chemical mix good for growing plants with." - reagent_state = LIQUID -// toxpwr = 0.2 //It's not THAT poisonous. - color = "#664330" // rgb: 102, 67, 48 - - - toxin/fertilizer/eznutrient - name = "EZ Nutrient" - id = "eznutrient" - - toxin/fertilizer/left4zed - name = "Left-4-Zed" - id = "left4zed" - - toxin/fertilizer/robustharvest - name = "Robust Harvest" - id = "robustharvest" - - -///////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum//////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////// - - 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 - var/adj_sleepy = 0 - var/adj_temp = 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) - if (adj_dizzy) M.dizziness = max(0,M.dizziness + adj_dizzy) - if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy) - if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy) - if (adj_temp) - if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 - M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT)) - // Drinks should be used up faster than other reagents. - holder.remove_reagent(src.id, FOOD_METABOLISM) - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - ..() - if(M.getOxyLoss() && prob(30)) M.adjustOxyLoss(-1*REM) - return - - 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 - - on_mob_life(var/mob/living/M as mob) - ..() - if(M.getFireLoss() && prob(20)) M.heal_organ_damage(0,1) - return - - limejuice - name = "Lime Juice" - id = "limejuice" - description = "The sweet-sour juice of limes." - color = "#365E30" // rgb: 54, 94, 48 - on_mob_life(var/mob/living/M as mob) - ..() - if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1) - return - - - carrotjuice - name = "Carrot juice" - id = "carrotjuice" - description = "It is just like a carrot but without crunching." - color = "#973800" // rgb: 151, 56, 0 - - on_mob_life(var/mob/living/M as mob) - ..() - M.eye_blurry = max(M.eye_blurry-1 , 0) - M.eye_blind = max(M.eye_blind-1 , 0) - if(!data) data = 1 - switch(data) - if(1 to 20) - //nothing - if(21 to INFINITY) - if (prob(data-10)) - M.disabilities &= ~NEARSIGHTED - data++ - return - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1) - ..() - return - - berryjuice - name = "Berry Juice" - id = "berryjuice" - description = "A delicious blend of several different kinds of berries." - color = "#863333" // rgb: 134, 51, 51 - - 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 - - on_mob_life(var/mob/living/M as mob) - ..() - M.adjustToxLoss(1) - return - - watermelonjuice - name = "Watermelon Juice" - id = "watermelonjuice" - description = "Delicious juice made from watermelon." - color = "#863333" // rgb: 134, 51, 51 - - lemonjuice - name = "Lemon Juice" - id = "lemonjuice" - description = "This juice is VERY sour." - color = "#863333" // rgb: 175, 175, 0 - - grapejuice - name = "Grape Juice" - id = "grapejuice" - description = "This juice is known to stain shirts." - color = "#993399" // rgb: 153, 51, 153 - - banana - name = "Banana Juice" - id = "banana" - description = "The raw essence of a banana." - color = "#863333" // rgb: 175, 175, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Clown")) - if(!M) M = holder.my_atom - M.heal_organ_damage(1,1) - M.nutrition += nutriment_factor - ..() - return - ..() - - nothing - name = "Nothing" - id = "nothing" - description = "Absolutely nothing." - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Mime")) - if(!M) M = holder.my_atom - M.heal_organ_damage(1,1) - M.nutrition += nutriment_factor - ..() - return - ..() - - potato_juice - name = "Potato Juice" - id = "potato" - description = "Juice of the potato. Bleh." - nutriment_factor = 2 * FOOD_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - milk - name = "Milk" - id = "milk" - description = "An opaque white liquid produced by the mammary glands of mammals." - color = "#DFDFDF" // rgb: 223, 223, 223 - - on_mob_life(var/mob/living/M as mob) - if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) - if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM) - ..() - return - - soymilk - name = "Soy Milk" - id = "soymilk" - description = "An opaque white liquid made from soybeans." - color = "#DFDFC7" // rgb: 223, 223, 199 - - 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 - - chocolate_milk - name = "Chocolate milk" - id ="chocolate_milk" - description = "Chocolate-flavored milk, tastes like being a kid again." - color = "#85432C" - - 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 = 5 - - 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 = 25 - overdose_threshold = 45 - - on_mob_life(var/mob/living/M as mob) - if(adj_temp > 0 && holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM) - if(prob(50)) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - ..() - return - - overdose_process(var/mob/living/M as mob) - if(volume > 45) - M.Jitter(5) - - ..() - return - - icecoffee - name = "Iced Coffee" - id = "icecoffee" - description = "Coffee and ice, refreshing and cool." - color = "#102838" // rgb: 16, 40, 56 - adj_temp = -5 - - 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 = 5 - - on_mob_life(var/mob/living/M as mob) - ..() - M.sleeping = 0 - if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) - return - - 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 = 5 - - on_mob_life(var/mob/living/M as mob) - ..() - M.sleeping = 0 - if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) - return - - 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 = 20 - - on_mob_life(var/mob/living/M as mob) - ..() - if(M.getToxLoss() && prob(20)) - M.adjustToxLoss(-1) - return - - icetea - name = "Iced Tea" - id = "icetea" - description = "No relation to a certain rap artist/ actor." - color = "#104038" // rgb: 16, 64, 56 - adj_temp = -5 - - kahlua - name = "Kahlua" - id = "kahlua" - description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" - color = "#664300" // rgb: 102, 67, 0 - adj_dizzy = -5 - adj_drowsy = -3 - adj_sleepy = -2 - - on_mob_life(var/mob/living/M as mob) - ..() - M.Jitter(5) - return - - cold - name = "Cold drink" - adj_temp = -5 - - 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 - - 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 - - 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 - - space_cola - name = "Cola" - id = "cola" - description = "A refreshing beverage." - reagent_state = LIQUID - color = "#100800" // rgb: 16, 8, 0 - adj_drowsy = -3 - - nuka_cola - name = "Nuka Cola" - id = "nuka_cola" - description = "Cola, cola never changes." - color = "#100800" // rgb: 16, 8, 0 - adj_sleepy = -2 - - on_mob_life(var/mob/living/M as mob) - M.Jitter(20) - M.druggy = max(M.druggy, 30) - M.dizziness +=5 - M.drowsyness = 0 - M.status_flags |= GOTTAGOFAST - ..() - return - - 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 - - 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 - - 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 = -8 - - 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 = -8 - - lemonade - name = "Lemonade" - description = "Oh the nostalgia..." - id = "lemonade" - color = "#FFFF00" // rgb: 255, 255, 0 - - 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 - - brownstar - name = "Brown Star" - description = "Its not what it sounds like..." - id = "brownstar" - color = "#9F3400" // rgb: 159, 052, 000 - adj_temp = - 2 - - milkshake - name = "Milkshake" - description = "Glorious brainfreezing mixture." - id = "milkshake" - color = "#AEE5E4" // rgb" 174, 229, 228 - adj_temp = -9 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!data) data = 1 - switch(data) - if(1 to 15) - M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 5) - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature -= rand(5,20) - if(15 to 25) - M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature -= rand(10,20) - if(25 to INFINITY) - M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(prob(1)) M.emote("shiver") - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature -= rand(15,20) - data++ - holder.remove_reagent(src.id, FOOD_METABOLISM) - ..() - return - - rewriter - name = "Rewriter" - description = "The secert of the sanctuary of the Libarian..." - id = "rewriter" - color = "#485000" // rgb:72, 080, 0 - - on_mob_life(var/mob/living/M as mob) - ..() - M.Jitter(5) - return - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.druggy = max(M.druggy, 50) - if(!data) data = 1 - switch(data) - 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")) - holder.remove_reagent(src.id, 0.2) - data++ - ..() - return - -//ALCOHOL WOO - 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 - var/datum/martial_art/drunk_brawling/F = new - var/dizzy_adj = 3 - var/slurr_adj = 3 - var/confused_adj = 2 - var/slur_start = 65 //amount absorbed after which mob starts slurring - var/brawl_start = 75 //amount absorbed after which mob switches to drunken brawling as a fighting style - var/confused_start = 130 //amount absorbed after which mob starts confusing directions - var/vomit_start = 180 //amount absorbed after which mob starts vomitting - var/blur_start = 260 //amount absorbed after which mob starts getting blurred vision - var/pass_out = 325 //amount absorbed after which mob starts passing out - - on_mob_life(var/mob/living/M as mob, var/alien) - // Sobering multiplier. - // Sober block makes it more difficult to get drunk - var/sober_str=!(SOBER in M.mutations)?1:2 - M:nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) - if(!src.data) data = 1 - src.data++ - - var/d = data - - // make all the beverages work together - for(var/datum/reagent/ethanol/A in holder.reagent_list) - if(isnum(A.data)) d += A.data - - d/=sober_str - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly. - d*=5 - - M.dizziness += dizzy_adj. - if(d >= slur_start && d < pass_out) - if (!M:slurring) M:slurring = 1 - M:slurring += slurr_adj/sober_str - if(d >= brawl_start && ishuman(M)) - var/mob/living/carbon/human/H = M - F.teach(H,1) - if(src.volume < 3) - if(H.martial_art == F) - F.remove(H) - if(d >= confused_start && prob(33)) - if (!M:confused) M:confused = 1 - M.confused = max(M:confused+(confused_adj/sober_str),0) - if(d >= blur_start) - M.eye_blurry = max(M.eye_blurry, 10/sober_str) - M:drowsyness = max(M:drowsyness, 0) - if(d >= vomit_start) - if(prob(8)) - M.fakevomit() - if(d >= pass_out) - M:paralysis = max(M:paralysis, 20/sober_str) - M:drowsyness = max(M:drowsyness, 30/sober_str) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"] - if (istype(L)) - L.take_damage(0.1, 1) - H.adjustToxLoss(0.1) - holder.remove_reagent(src.id, 0.4) - ..() - return - - reaction_obj(var/obj/O, var/volume) - if(istype(O,/obj/item/weapon/paper)) - var/obj/item/weapon/paper/paperaffected = O - paperaffected.clearpaper() - 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 - usr << "The solution melts away the ink on the book." - else - usr << "It wasn't enough..." - return - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with ethanol isn't quite as good as fuel. - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - M.adjust_fire_stacks(volume / 15) - return - - beer //It's really much more stronger than other drinks. - 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 - on_mob_life(var/mob/living/M as mob) - ..() - M:jitteriness = max(M:jitteriness-3,0) - return - - cider - name = "Cider" - id = "cider" - description = "An alcoholic beverage derived from apples." - color = "#174116" - - whiskey - name = "Whiskey" - id = "whiskey" - description = "A superb and well-aged single-malt whiskey. Damn." - color = "#664300" // rgb: 102, 67, 0 - dizzy_adj = 4 - - 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 - slur_start = 30 //amount absorbed after which mob starts slurring - brawl_start = 40 - - gin - name = "Gin" - id = "gin" - description = "It's gin. In space. I say, good sir." - color = "#664300" // rgb: 102, 67, 0 - dizzy_adj = 3 - - 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 - slur_start = 25 - brawl_start = 40 - confused_start = 100 - - //copy paste from LSD... shoot me - on_mob_life(var/mob/M) - if(!M) M = holder.my_atom - if(!data) data = 1 - data++ - M:hallucination += 5 - if(volume > overdose_threshold) - M:adjustToxLoss(1) - ..() - return - - 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 - - on_mob_life(var/mob/living/M as mob) - ..() - M.dizziness +=5 - if(volume > overdose_threshold) - M:adjustToxLoss(1) - return - - 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 - - vodka - name = "Vodka" - id = "vodka" - description = "Number one drink AND fueling choice for Russians worldwide." - color = "#664300" // rgb: 102, 67, 0 - - sake - name = "Sake" - id = "sake" - description = "Anime's favorite drink." - color = "#664300" // rgb: 102, 67, 0 - - tequilla - name = "Tequila" - id = "tequilla" - description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" - color = "#A8B0B7" // rgb: 168, 176, 183 - - vermouth - name = "Vermouth" - id = "vermouth" - description = "You suddenly feel a craving for a martini..." - color = "#664300" // rgb: 102, 67, 0 - - wine - name = "Wine" - id = "wine" - description = "An premium alchoholic beverage made from distilled grape juice." - color = "#7E4043" // rgb: 126, 64, 67 - dizzy_adj = 2 - slur_start = 65 //amount absorbed after which mob starts slurring - confused_start = 145 //amount absorbed after which mob starts confusing directions - - 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 - confused_start = 115 //amount absorbed after which mob starts confusing directions - - 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 - slurr_adj = 20 - confused_adj = 3 - slur_start = 15 - brawl_start = 25 - confused_start = 40 - blur_start = 60 - pass_out = 80 - - ale - name = "Ale" - id = "ale" - description = "A dark alchoholic beverage made by malted barley and yeast." - color = "#664300" // rgb: 102, 67, 0 - - thirteenloko - name = "Thirteen Loko" - id = "thirteenloko" - description = "A potent mixture of caffeine and alcohol." - reagent_state = LIQUID - color = "#102000" // rgb: 16, 32, 0 - - on_mob_life(var/mob/living/M as mob) - ..() - M:nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) - M:drowsyness = max(0,M:drowsyness-7) - //if(!M:sleeping_willingly) - // M:sleeping = max(0,M.sleeping-2) - if (M.bodytemperature > 310) - M.bodytemperature = max(310, M.bodytemperature-5) - M.Jitter(1) - return - - -/////////////////////////////////////////////////////////////////cocktail entities////////////////////////////////////////////// - - bilk - name = "Bilk" - id = "bilk" - description = "This appears to be beer mixed with milk. Disgusting." - reagent_state = LIQUID - color = "#895C4C" // rgb: 137, 92, 76 - - atomicbomb - name = "Atomic Bomb" - id = "atomicbomb" - description = "Nuclear proliferation never tasted so good." - reagent_state = LIQUID - color = "#666300" // rgb: 102, 99, 0 - - 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 - - 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 - - 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 - - gintonic - name = "Gin and Tonic" - id = "gintonic" - description = "An all time classic, mild cocktail." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - cuba_libre - name = "Cuba Libre" - id = "cubalibre" - description = "Rum, mixed with cola. Viva la revolution." - reagent_state = LIQUID - color = "#3E1B00" // rgb: 62, 27, 0 - - whiskey_cola - name = "Whiskey Cola" - id = "whiskeycola" - description = "Whiskey, mixed with cola. Surprisingly refreshing." - reagent_state = LIQUID - color = "#3E1B00" // rgb: 62, 27, 0 - - 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 - - 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 - - white_russian - name = "White Russian" - id = "whiterussian" - description = "That's just, like, your opinion, man..." - reagent_state = LIQUID - color = "#A68340" // rgb: 166, 131, 64 - - 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 - - booger - name = "Booger" - id = "booger" - description = "Ewww..." - reagent_state = LIQUID - color = "#A68310" // rgb: 166, 131, 16 - - 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 - - gargle_blaster - name = "Pan-Galactic Gargle Blaster" - id = "gargleblaster" - description = "Whoah, this stuff looks volatile!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - 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 - - tequilla_sunrise - name = "Tequila Sunrise" - id = "tequillasunrise" - description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - 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 - - 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 - - changelingsting - name = "Changeling Sting" - id = "changelingsting" - description = "You take a tiny sip and feel a burning sensation..." - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - margarita - name = "Margarita" - id = "margarita" - description = "On the rocks with salt on the rim. Arriba~!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - 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 - - 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 - - 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 - - whiskeysoda - name = "Whiskey Soda" - id = "whiskeysoda" - description = "Ultimate refreshment." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - antifreeze - name = "Anti-freeze" - id = "antifreeze" - description = "Ultimate refreshment." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - barefoot - name = "Barefoot" - id = "barefoot" - description = "Barefoot and pregnant" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - snowwhite - name = "Snow White" - id = "snowwhite" - description = "A cold refreshment" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - demonsblood - name = "Demons Blood" - id = "demonsblood" - description = "AHHHH!!!!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - dizzy_adj = 10 - slurr_adj = 10 - - 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 - slurr_adj = 3 - - ginfizz - name = "Gin Fizz" - id = "ginfizz" - description = "Refreshingly lemony, deliciously dry." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - dizzy_adj = 4 - slurr_adj = 3 - - bahama_mama - name = "Bahama mama" - id = "bahama_mama" - description = "Tropic cocktail." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - singulo - name = "Singulo" - id = "singulo" - description = "A blue-space beverage!" - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - dizzy_adj = 15 - slurr_adj = 15 - - 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 - - on_mob_life(var/mob/living/M as mob) - ..() - if (M.bodytemperature < 360) - M.bodytemperature = min(360, M.bodytemperature+50) //310 is the normal bodytemp. 310.055 - return - - devilskiss - name = "Devils Kiss" - id = "devilskiss" - description = "Creepy time!" - reagent_state = LIQUID - color = "#A68310" // rgb: 166, 131, 16 - - 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 - - mead - name = "Mead" - id = "mead" - description = "A Vikings drink, though a cheap one." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - 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 - - on_mob_life(var/mob/living/M as mob) - ..() - if (M.bodytemperature < 270) - M.bodytemperature = min(270, M.bodytemperature-40) //310 is the normal bodytemp. 310.055 - return - - grog - name = "Grog" - id = "grog" - description = "Watered down rum, Nanotrasen approves!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - aloe - name = "Aloe" - id = "aloe" - description = "So very, very, very good." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - andalusia - name = "Andalusia" - id = "andalusia" - description = "A nice, strange named drink." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - alliescocktail - name = "Allies Cocktail" - id = "alliescocktail" - description = "A drink made from your allies." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - 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 - - amasec - name = "Amasec" - id = "amasec" - description = "Official drink of the Imperium." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - - neurotoxin - name = "Neurotoxin" - id = "neurotoxin" - description = "A strong neurotoxin that puts the subject into a death-like state." - reagent_state = LIQUID - color = "#2E2E61" // rgb: 46, 46, 97 - - on_mob_life(var/mob/living/M as mob) - M.weakened = max(M.weakened, 3) - if(!data) - data = 1 - data++ - M.dizziness +=6 - if(data >= 15 && data <45) - if (!M.slurring) - M.slurring = 1 - M.slurring += 3 - else if(data >= 45 && prob(50) && data <55) - M.confused = max(M.confused+3,0) - else if(data >=55) - M.druggy = max(M.druggy, 55) - else if(data >=200) - M.adjustToxLoss(2) - ..() - return - - bananahonk - name = "Banana Mama" - id = "bananahonk" - description = "A drink from Clown Heaven." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Clown")) - if(!M) M = holder.my_atom - M.heal_organ_damage(1,1) - M.nutrition += nutriment_factor - ..() - return - ..() - - silencer - name = "Silencer" - id = "silencer" - description = "A drink from Mime Heaven." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Mime")) - if(!M) M = holder.my_atom - M.heal_organ_damage(1,1) - M.nutrition += nutriment_factor - ..() - return - ..() - - changelingsting - name = "Changeling Sting" - id = "changelingsting" - description = "A stingy drink." - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - - on_mob_life(var/mob/living/M as mob) - ..() - M.dizziness +=5 - return - - erikasurprise - name = "Erika Surprise" - id = "erikasurprise" - description = "The surprise is, it's green!" - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - - irishcarbomb - name = "Irish Car Bomb" - id = "irishcarbomb" - description = "Mmm, tastes like chocolate cake..." - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - - on_mob_life(var/mob/living/M as mob) - ..() - M.dizziness +=5 - return - - syndicatebomb - name = "Syndicate Bomb" - id = "syndicatebomb" - description = "A Syndicate bomb" - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - - erikasurprise - name = "Erika Surprise" - id = "erikasurprise" - description = "The surprise is, it's green!" - reagent_state = LIQUID - color = "#2E6671" // rgb: 46, 102, 113 - - 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 - - on_mob_life(var/mob/living/M as mob) - if(!data) data = 1 - data++ - M.dizziness +=10 - if(data >= 55 && data <115) - if (!M.stuttering) M.stuttering = 1 - M.stuttering += 10 - else if(data >= 115 && prob(33)) - M.confused = max(M.confused+15,15) - ..() - - return - -// Undefine the alias for REAGENTS_EFFECT_MULTIPLER -#undef REM - - -/datum/reagent/Destroy() - holder = null - return ..() diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm deleted file mode 100644 index 8fcd9e8117b..00000000000 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ /dev/null @@ -1,1576 +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 - - - proc - on_reaction(var/datum/reagents/holder, var/created_volume) - return - - //I recommend you set the result amount to the total volume of all components. - - explosion_potassium - name = "Explosion" - id = "explosion_potassium" - result = null - required_reagents = list("water" = 1, "potassium" = 1) - result_amount = 2 - mix_message = "The mixture explodes!" - - on_reaction(var/datum/reagents/holder, var/created_volume) - var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0) - e.start() - holder.clear_reagents() - return - - 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 - - on_reaction(var/datum/reagents/holder, var/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() - return -/* - silicate - name = "Silicate" - id = "silicate" - result = "silicate" - required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 3 -*/ - - 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 - - sterilizine - name = "Sterilizine" - id = "sterilizine" - result = "sterilizine" - required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1) - result_amount = 3 - - 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." - - hydrocodone - name = "Hydrocodone" - id = "hydrocodone" - result = "hydrocodone" - required_reagents = list("morphine" = 1, "sacid" = 1, "water" = 1, "oil" = 1) - result_amount = 2 - - thermite - name = "Thermite" - id = "thermite" - result = "thermite" - required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1) - result_amount = 3 - - 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." - - lube - name = "Space Lube" - id = "lube" - result = "lube" - required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 3 - mix_message = "The substance turns a striking cyan and becomes oily." - - mitocholide - name = "mitocholide" - id = "mitocholide" - result = "mitocholide" - required_reagents = list("synthflesh" = 1, "cryoxadone" = 1, "plasma" = 1) - result_amount = 3 - - holy_water - name = "Holy Water" - id = "holywater" - result = "holywater" - required_reagents = list("water" = 1, "mercury" = 1, "wine" = 1) - result_amount = 3 - mix_message = "The water somehow seems purified. Or maybe defiled." - - 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." - - 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." - - Audioline - name = "Audioline" - id = "audioline" - result = "audioline" - required_reagents = list("spaceacillin" = 1, "salglu_solution" = 1, "epinephrine" = 1) - result_amount = 3 - - glycerol - name = "Glycerol" - id = "glycerol" - result = "glycerol" - required_reagents = list("cornoil" = 3, "sacid" = 1) - result_amount = 1 - - nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - result = "nitroglycerin" - required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) - result_amount = 2 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/2, 1), holder.my_atom, 0, 0) - e.start() - - holder.clear_reagents() - return - - 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." - - rezadone - name = "Rezadone" - id = "rezadone" - result = "rezadone" - required_reagents = list("carpotoxin" = 1, "spaceacillin" = 1, "copper" = 1) - result_amount = 3 - - 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." - - plastication - name = "Plastic" - id = "solidplastic" - result = null - required_reagents = list("facid" = 10, "plasticide" = 20) - result_amount = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/mineral/plastic - M.amount = 10 - M.loc = get_turf(holder.my_atom) - return - - virus_food - name = "Virus Food" - id = "virusfood" - result = "virusfood" - required_reagents = list("water" = 1, "milk" = 1, "oxygen" = 1) - result_amount = 3 -/* - mix_virus - name = "Mix Virus" - id = "mixvirus" - result = "blood" - required_reagents = list("virusfood" = 5) - required_catalysts = list("blood") - var/level = 2 - - on_reaction(var/datum/reagents/holder, var/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 - rand(0, 1)) - - - mix_virus_2 - - name = "Mix Virus 2" - id = "mixvirus2" - required_reagents = list("mutagen" = 5) - level = 4 - - rem_virus - - name = "Devolve Virus" - id = "remvirus" - required_reagents = list("synaptizine" = 5) - - on_reaction(var/datum/reagents/holder, var/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() -*/ - condensedcapsaicin - name = "Condensed Capsaicin" - id = "condensedcapsaicin" - result = "condensedcapsaicin" - required_reagents = list("capsaicin" = 2) - required_catalysts = list("plasma" = 5) - result_amount = 1 -/////////////////////////////////////////////////////////////////////////////////// - -// foam and foam precursor - - 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." - - - foam - name = "Foam" - id = "foam" - result = null - required_reagents = list("fluorosurfactant" = 1, "water" = 1) - result_amount = 2 - - on_reaction(var/datum/reagents/holder, var/created_volume) - - - var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) - M << "\red The solution violently bubbles!" - - location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out foam!" - - //world << "Holder volume is [holder.total_volume]" - //for(var/datum/reagent/R in holder.reagent_list) - // world << "[R.name] = [R.volume]" - - var/datum/effect/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder, 0) - s.start() - holder.clear_reagents() - return - - metalfoam - name = "Metal Foam" - id = "metalfoam" - result = null - required_reagents = list("aluminum" = 3, "fluorosurfactant" = 1, "sacid" = 1) - result_amount = 5 - - on_reaction(var/datum/reagents/holder, var/created_volume) - - - var/location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out a metalic foam!" - - var/datum/effect/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder, 1) - s.start() - return - - ironfoam - name = "Iron Foam" - id = "ironlfoam" - result = null - required_reagents = list("iron" = 3, "fluorosurfactant" = 1, "sacid" = 1) - result_amount = 5 - - on_reaction(var/datum/reagents/holder, var/created_volume) - - - var/location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out a metalic foam!" - - var/datum/effect/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder, 2) - s.start() - return - - // Synthesizing these three chemicals is pretty complex in real life, but fuck it, it's just a game! - ammonia - name = "Ammonia" - id = "ammonia" - result = "ammonia" - required_reagents = list("hydrogen" = 3, "nitrogen" = 1) - result_amount = 3 - mix_message = "The mixture bubbles, emitting an acrid reek." - - diethylamine - name = "Diethylamine" - id = "diethylamine" - result = "diethylamine" - required_reagents = list ("ammonia" = 1, "ethanol" = 1) - result_amount = 2 - min_temp = 374 - mix_message = "A horrible smell pours forth from the mixture." - - space_cleaner - name = "Space cleaner" - id = "cleaner" - result = "cleaner" - required_reagents = list("ammonia" = 1, "water" = 1, "ethanol" = 1) - result_amount = 3 - mix_message = "Ick, this stuff really stinks. Sure does make the container sparkle though!" - - sulfuric_acid - name = "Sulfuric Acid" - id = "sacid" - result = "sacid" - required_reagents = list("sulfur" = 1, "oxygen" = 1, "hydrogen" = 1) - result_amount = 2 - mix_message = "The mixture gives off a sharp acidic tang." - -///////Changeling Blood Test///////////// -/* - changeling_test - name = "Changeling blood test" - id = "changelingblood" - result = "blood" - required_reagents = list("blood" = 5) - required_catalysts = list("fuel") - result_amount = 1 //Needs this in order to check the donor, as the data var in the reacted blood gets transferred. - on_reaction(var/datum/reagents/holder, var/created_volume) - if(!holder.reagent_list) //reagent_list is not null - return - var/datum/reagent/blood/B = locate() in holder.reagent_list - if(!B) //B is not null - return - var/mob/living/carbon/human/H = B.data["donor"] - if(!H) //H is not null. - return - if(H.mind && H.mind.changeling) //Checks if H, the blood donor is a ling. - for(var/mob/M in viewers(get_turf(holder.my_atom), null)) - M.show_message( "The blood writhes and wriggles and sizzles away from the container!", 1, "You hear bubbling and sizzling.", 2) - else - for(var/mob/M in viewers(get_turf(holder.my_atom), null)) - M.show_message( "The blood seems to break apart in the fuel.", 1) - holder.del_reagent("blood") - return -*/ - -/////////////////////////////////////////////NEW SLIME CORE REACTIONS///////////////////////////////////////////// - -//Grey - slimespawn - name = "Slime Spawn" - id = "m_spawn" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/grey - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) - var/mob/living/carbon/slime/S = new /mob/living/carbon/slime - S.loc = get_turf(holder.my_atom) - - - slimeinaprov - name = "Slime Epinephrine" - id = "m_epinephrine" - result = "epinephrine" - required_reagents = list("water" = 5) - result_amount = 3 - required_other = 1 - required_container = /obj/item/slime_extract/grey - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - - - slimemonkey - name = "Slime Monkey" - id = "m_monkey" - result = null - required_reagents = list("blood" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/grey - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/i = 1, i <= 3, i++) - var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube - M.loc = get_turf(holder.my_atom) - -//Green - slimemutate - name = "Mutation Toxin" - id = "mutationtoxin" - result = "mutationtoxin" - required_reagents = list("plasma" = 5) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/green - -//Metal - slimemetal - name = "Slime Metal" - id = "m_metal" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/metal - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal - M.amount = 15 - M.loc = get_turf(holder.my_atom) - var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel - P.amount = 5 - P.loc = get_turf(holder.my_atom) - -//Gold - slimecrit - name = "Slime Crit" - id = "m_tele" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/gold - required_other = 1 - on_reaction(var/datum/reagents/holder) - - var/blocked = blocked_mobs //global variable of blocked mobs - - var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) - - for(var/i = 1, i <= 5, i++) - var/chosen = pick(critters) - var/mob/living/simple_animal/hostile/C = new chosen - C.faction |= "slimesummon" - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) -// for(var/mob/O in viewers(get_turf(holder.my_atom), null)) -// O.show_message(text("\red The slime core fizzles disappointingly,"), 1) - - - slimecritlesser - name = "Slime Crit Lesser" - id = "m_tele3" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/gold - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently!"), 1) - spawn(50) - - if(holder && holder.my_atom) - - var/blocked = blocked_mobs - - var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) - - var/chosen = pick(critters) - var/mob/living/simple_animal/hostile/C = new chosen - C.faction |= "neutral" - C.loc = get_turf(holder.my_atom) - -//Silver - slimebork - name = "Slime Bork" - id = "m_tele2" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/silver - required_other = 1 - on_reaction(var/datum/reagents/holder) - - var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks) - // BORK BORK BORK - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) - - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - slimedrinks - name = "Slime Drinks" - id = "m_tele3" - result = null - required_reagents = list("water" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/silver - required_other = 1 - on_reaction(var/datum/reagents/holder) - - var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks) - // BORK BORK BORK - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) - - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - - -//Blue - slimefrost - name = "Slime Frost Oil" - id = "m_frostoil" - result = "frostoil" - required_reagents = list("plasma" = 5) - result_amount = 10 - required_container = /obj/item/slime_extract/blue - required_other = 1 -//Dark Blue - slimefreeze - name = "Slime Freeze" - id = "m_freeze" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/darkblue - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - sleep(50) - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) - M.bodytemperature -= 140 - M << "\blue You feel a chill!" - -//Orange - slimecasp - name = "Slime Capsaicin Oil" - id = "m_capsaicinoil" - result = "capsaicin" - required_reagents = list("blood" = 5) - result_amount = 10 - required_container = /obj/item/slime_extract/orange - required_other = 1 - - slimefire - name = "Slime fire" - id = "m_fire" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/orange - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - sleep(50) - var/turf/simulated/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50) - -//Yellow - slimeoverload - name = "Slime EMP" - id = "m_emp" - result = null - required_reagents = list("blood" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - empulse(get_turf(holder.my_atom), 3, 7) - - - slimecell - name = "Slime Powercell" - id = "m_cell" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/obj/item/weapon/stock_parts/cell/slime/P = new /obj/item/weapon/stock_parts/cell/slime - P.loc = get_turf(holder.my_atom) - - slimeglow - name = "Slime Glow" - id = "m_glow" - result = null - required_reagents = list("water" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The contents of the slime core harden and begin to emit a warm, bright light."), 1) - var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime - F.loc = get_turf(holder.my_atom) - -//Purple - - slimepsteroid - name = "Slime Steroid" - id = "m_steroid" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/purple - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid - P.loc = get_turf(holder.my_atom) - - - - slimejam - name = "Slime Jam" - id = "m_jam" - result = "slimejelly" - required_reagents = list("sugar" = 5) - result_amount = 10 - required_container = /obj/item/slime_extract/purple - required_other = 1 - - -//Dark Purple - slimeplasma - name = "Slime Plasma" - id = "m_plasma" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/darkpurple - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma - P.amount = 10 - P.loc = get_turf(holder.my_atom) - -//Red - slimeglycerol - name = "Slime Glycerol" - id = "m_glycerol" - result = "glycerol" - required_reagents = list("plasma" = 5) - result_amount = 8 - required_container = /obj/item/slime_extract/red - required_other = 1 - - - slimebloodlust - name = "Bloodlust" - id = "m_bloodlust" - result = null - required_reagents = list("blood" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/red - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null)) - slime.rabid = 1 - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The [slime] is driven into a frenzy!."), 1) - -//Pink - slimeppotion - name = "Slime Potion" - id = "m_potion" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/pink - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/slimepotion/P = new /obj/item/weapon/slimepotion - P.loc = get_turf(holder.my_atom) - - -//Black - slimemutate2 - name = "Advanced Mutation Toxin" - id = "mutationtoxin2" - result = "amutationtoxin" - required_reagents = list("plasma" = 5) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/black - -//Oil - slimeexplosion - name = "Slime Explosion" - id = "m_explosion" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/oil - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - sleep(50) - explosion(get_turf(holder.my_atom), 1 ,3, 6) -//Light Pink - slimepotion2 - name = "Slime Potion 2" - id = "m_potion2" - result = null - result_amount = 1 - required_container = /obj/item/slime_extract/lightpink - required_reagents = list("plasma" = 5) - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/slimepotion2/P = new /obj/item/weapon/slimepotion2 - P.loc = get_turf(holder.my_atom) -//Adamantine - slimegolem - name = "Slime Golem" - id = "m_golem" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/adamantine - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/effect/goleRUNe/Z = new /obj/effect/goleRUNe - Z.loc = get_turf(holder.my_atom) - Z.announce_to_ghosts() -//Bluespace - slimecrystal - name = "Slime Crystal" - id = "m_crystal" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/bluespace - required_other = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - if(holder.my_atom) - var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom)) - BC.visible_message("The [BC.name] appears out of thin air!") -//Cerulean - slimepsteroid2 - name = "Slime Steroid 2" - id = "m_steroid2" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/cerulean - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2 - P.loc = get_turf(holder.my_atom) -//Sepia - slimecamera - name = "Slime Camera" - id = "m_camera" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/sepia - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/device/camera/P = new /obj/item/device/camera - P.loc = get_turf(holder.my_atom) - - - slimefilm - name = "Slime Film" - id = "m_film" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/sepia - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/device/camera_film/P = new /obj/item/device/camera_film - P.loc = get_turf(holder.my_atom) -//Pyrite - slimepaint - name = "Slime Paint" - id = "s_paint" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/pyrite - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/list/paints = subtypesof(/obj/item/weapon/reagent_containers/glass/paint) - var/chosen = pick(paints) - var/obj/P = new chosen - if(P) - P.loc = get_turf(holder.my_atom) - - -//////////////////////////////////////////FOOD MIXTURES//////////////////////////////////// - - tofu - name = "Tofu" - id = "tofu" - result = null - required_reagents = list("soymilk" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/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/tofu(location) - return - - chocolate_bar - name = "Chocolate Bar" - id = "chocolate_bar" - result = null - required_reagents = list("soymilk" = 2, "coco" = 2, "sugar" = 2) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/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/chocolatebar(location) - return - - chocolate_bar2 - name = "Chocolate Bar" - id = "chocolate_bar" - result = null - required_reagents = list("milk" = 2, "coco" = 2, "sugar" = 2) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/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/chocolatebar(location) - return - - hot_coco - name = "Hot Coco" - id = "hot_coco" - result = "hot_coco" - required_reagents = list("water" = 5, "coco" = 1) - result_amount = 5 - - chocolate_milk - name = "Chocolate Milk" - id = "chocolate_milk" - result = "chocolate_milk" - required_reagents = list("chocolate" = 1, "milk" = 1) - result_amount = 2 - mix_message = "The mixture turns a nice brown color." - - coffee - name = "Coffee" - id = "coffee" - result = "coffee" - required_reagents = list("coffeepowder" = 1, "water" = 5) - result_amount = 5 - - tea - name = "Tea" - id = "tea" - result = "tea" - required_reagents = list("teapowder" = 1, "water" = 5) - result_amount = 5 - - soysauce - name = "Soy Sauce" - id = "soysauce" - result = "soysauce" - required_reagents = list("soymilk" = 2, "flour" = 1, "sodiumchloride" = 1, "water" = 3) - result_amount = 7 - - cheesewheel - name = "Cheesewheel" - id = "cheesewheel" - result = null - required_reagents = list("milk" = 40) - required_catalysts = list("enzyme" = 5) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel(location) - return - - syntiflesh - name = "Syntiflesh" - id = "syntiflesh" - result = null - required_reagents = list("blood" = 5, "cryoxadone" = 1) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh(location) - return - - hot_ramen - name = "Hot Ramen" - id = "hot_ramen" - result = "hot_ramen" - required_reagents = list("water" = 1, "dry_ramen" = 3) - result_amount = 3 - - hell_ramen - name = "Hell Ramen" - id = "hell_ramen" - result = "hell_ramen" - required_reagents = list("capsaicin" = 1, "hot_ramen" = 6) - result_amount = 6 - - doughball - name = "Ball of dough" - id = "dough_ball" - result = "dough_ball" - required_reagents = list("flour" = 15, "water" = 5) - required_catalysts = list("enzyme" = 5) - - -////////////////////////////////////////// COCKTAILS ////////////////////////////////////// - - - goldschlager - name = "Goldschlager" - id = "goldschlager" - result = "goldschlager" - required_reagents = list("vodka" = 10, "gold" = 1) - result_amount = 10 - - patron - name = "Patron" - id = "patron" - result = "patron" - required_reagents = list("tequilla" = 10, "silver" = 1) - result_amount = 10 - - bilk - name = "Bilk" - id = "bilk" - result = "bilk" - required_reagents = list("milk" = 1, "beer" = 1) - result_amount = 2 - - icetea - name = "Iced Tea" - id = "icetea" - result = "icetea" - required_reagents = list("ice" = 1, "tea" = 3) - result_amount = 4 - - icecoffee - name = "Iced Coffee" - id = "icecoffee" - result = "icecoffee" - required_reagents = list("ice" = 1, "coffee" = 3) - result_amount = 4 - - nuka_cola - name = "Nuka Cola" - id = "nuka_cola" - result = "nuka_cola" - required_reagents = list("uranium" = 1, "cola" = 6) - result_amount = 6 - - moonshine - name = "Moonshine" - id = "moonshine" - result = "moonshine" - required_reagents = list("nutriment" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 - - wine - name = "Wine" - id = "wine" - result = "wine" - required_reagents = list("berryjuice" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 - - spacebeer - name = "Space Beer" - id = "spacebeer" - result = "beer" - required_reagents = list("cornoil" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 - - vodka - name = "Vodka" - id = "vodka" - result = "vodka" - required_reagents = list("potato" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 - sake - name = "Sake" - id = "sake" - result = "sake" - required_reagents = list("rice" = 10,"water" = 5) - required_catalysts = list("enzyme" = 5) - result_amount = 15 - - kahlua - name = "Kahlua" - id = "kahlua" - result = "kahlua" - required_reagents = list("coffee" = 5, "sugar" = 5, "rum" = 5) - required_catalysts = list("enzyme" = 5) - result_amount = 5 - - kahluaVodka - name = "KahluaVodka" - id = "kahlauVodka" - result = "kahlua" - required_reagents = list("coffee" = 5, "sugar" = 5, "vodka" = 5) - required_catalysts = list("enzyme" = 5) - result_amount = 5 - gin_tonic - name = "Gin and Tonic" - id = "gintonic" - result = "gintonic" - required_reagents = list("gin" = 2, "tonic" = 1) - result_amount = 3 - mix_message = "The tonic water and gin mix together perfectly." - - cuba_libre - name = "Cuba Libre" - id = "cubalibre" - result = "cubalibre" - required_reagents = list("rum" = 2, "cola" = 1) - result_amount = 3 - - mojito - name = "Mojito" - id = "mojito" - result = "mojito" - required_reagents = list("rum" = 1, "sugar" = 1, "limejuice" = 1, "sodawater" = 1) - result_amount = 4 - - martini - name = "Classic Martini" - id = "martini" - result = "martini" - required_reagents = list("gin" = 2, "vermouth" = 1) - result_amount = 3 - - vodkamartini - name = "Vodka Martini" - id = "vodkamartini" - result = "vodkamartini" - required_reagents = list("vodka" = 2, "vermouth" = 1) - result_amount = 3 - - white_russian - name = "White Russian" - id = "whiterussian" - result = "whiterussian" - required_reagents = list("blackrussian" = 3, "cream" = 2) - result_amount = 5 - - whiskey_cola - name = "Whiskey Cola" - id = "whiskeycola" - result = "whiskeycola" - required_reagents = list("whiskey" = 2, "cola" = 1) - result_amount = 3 - - screwdriver - name = "Screwdriver" - id = "screwdrivercocktail" - result = "screwdrivercocktail" - required_reagents = list("vodka" = 2, "orangejuice" = 1) - result_amount = 3 - - bloody_mary - name = "Bloody Mary" - id = "bloodymary" - result = "bloodymary" - required_reagents = list("vodka" = 1, "tomatojuice" = 2, "limejuice" = 1) - result_amount = 4 - - gargle_blaster - name = "Pan-Galactic Gargle Blaster" - id = "gargleblaster" - result = "gargleblaster" - required_reagents = list("vodka" = 1, "gin" = 1, "whiskey" = 1, "cognac" = 1, "limejuice" = 1) - result_amount = 5 - - brave_bull - name = "Brave Bull" - id = "bravebull" - result = "bravebull" - required_reagents = list("tequilla" = 2, "kahlua" = 1) - result_amount = 3 - - tequilla_sunrise - name = "Tequilla Sunrise" - id = "tequillasunrise" - result = "tequillasunrise" - required_reagents = list("tequilla" = 2, "orangejuice" = 1) - result_amount = 3 - - toxins_special - name = "Toxins Special" - id = "toxinsspecial" - result = "toxinsspecial" - required_reagents = list("rum" = 2, "vermouth" = 1, "plasma" = 2) - result_amount = 5 - - beepsky_smash - name = "Beepksy Smash" - id = "beepksysmash" - result = "beepskysmash" - required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1) - result_amount = 4 - - doctor_delight - name = "The Doctor's Delight" - id = "doctordelight" - result = "doctorsdelight" - required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1) - result_amount = 5 - - irish_cream - name = "Irish Cream" - id = "irishcream" - result = "irishcream" - required_reagents = list("whiskey" = 2, "cream" = 1) - result_amount = 3 - - manly_dorf - name = "The Manly Dorf" - id = "manlydorf" - result = "manlydorf" - required_reagents = list ("beer" = 1, "ale" = 2) - result_amount = 3 - - suicider - name = "Suicider" - id = "suicider" - result = "suicider" - required_reagents = list ("vodka" = 1, "cider" = 1, "fuel" = 1, "epinephrine" = 1) - result_amount = 4 - mix_message = "The drinks and chemicals mix together, emitting a potent smell." - - irish_coffee - name = "Irish Coffee" - id = "irishcoffee" - result = "irishcoffee" - required_reagents = list("irishcream" = 1, "coffee" = 1) - result_amount = 2 - - b52 - name = "B-52" - id = "b52" - result = "b52" - required_reagents = list("irishcream" = 1, "kahlua" = 1, "cognac" = 1) - result_amount = 3 - - atomicbomb - name = "Atomic Bomb" - id = "atomicbomb" - result = "atomicbomb" - required_reagents = list("b52" = 10, "uranium" = 1) - result_amount = 10 - - margarita - name = "Margarita" - id = "margarita" - result = "margarita" - required_reagents = list("tequilla" = 2, "limejuice" = 1) - result_amount = 3 - - longislandicedtea - name = "Long Island Iced Tea" - id = "longislandicedtea" - result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1) - result_amount = 4 - - threemileisland - name = "Three Mile Island Iced Tea" - id = "threemileisland" - result = "threemileisland" - required_reagents = list("longislandicedtea" = 10, "uranium" = 1) - result_amount = 10 - - whiskeysoda - name = "Whiskey Soda" - id = "whiskeysoda" - result = "whiskeysoda" - required_reagents = list("whiskey" = 2, "sodawater" = 1) - result_amount = 3 - - black_russian - name = "Black Russian" - id = "blackrussian" - result = "blackrussian" - required_reagents = list("vodka" = 3, "kahlua" = 2) - result_amount = 5 - - manhattan - name = "Manhattan" - id = "manhattan" - result = "manhattan" - required_reagents = list("whiskey" = 2, "vermouth" = 1) - result_amount = 3 - - manhattan_proj - name = "Manhattan Project" - id = "manhattan_proj" - result = "manhattan_proj" - required_reagents = list("manhattan" = 10, "uranium" = 1) - result_amount = 10 - - vodka_tonic - name = "Vodka and Tonic" - id = "vodkatonic" - result = "vodkatonic" - required_reagents = list("vodka" = 2, "tonic" = 1) - result_amount = 3 - - gin_fizz - name = "Gin Fizz" - id = "ginfizz" - result = "ginfizz" - required_reagents = list("gin" = 2, "sodawater" = 1, "limejuice" = 1) - result_amount = 4 - - bahama_mama - name = "Bahama mama" - id = "bahama_mama" - result = "bahama_mama" - required_reagents = list("rum" = 2, "orangejuice" = 2, "limejuice" = 1, "ice" = 1) - result_amount = 6 - - singulo - name = "Singulo" - id = "singulo" - result = "singulo" - required_reagents = list("vodka" = 5, "radium" = 1, "wine" = 5) - result_amount = 10 - - alliescocktail - name = "Allies Cocktail" - id = "alliescocktail" - result = "alliescocktail" - required_reagents = list("martini" = 1, "vodka" = 1) - result_amount = 2 - - demonsblood - name = "Demons Blood" - id = "demonsblood" - result = "demonsblood" - required_reagents = list("rum" = 1, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1) - result_amount = 4 - - booger - name = "Booger" - id = "booger" - result = "booger" - required_reagents = list("cream" = 1, "banana" = 1, "rum" = 1, "watermelonjuice" = 1) - result_amount = 4 - - antifreeze - name = "Anti-freeze" - id = "antifreeze" - result = "antifreeze" - required_reagents = list("vodka" = 2, "cream" = 1, "ice" = 1) - result_amount = 4 - - barefoot - name = "Barefoot" - id = "barefoot" - result = "barefoot" - required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1) - result_amount = 3 - - -////DRINKS THAT REQUIRED IMPROVED SPRITES BELOW:: -Agouri///// - - sbiten - name = "Sbiten" - id = "sbiten" - result = "sbiten" - required_reagents = list("vodka" = 10, "capsaicin" = 1) - result_amount = 10 - - red_mead - name = "Red Mead" - id = "red_mead" - result = "red_mead" - required_reagents = list("blood" = 1, "mead" = 1) - result_amount = 2 - - mead - name = "Mead" - id = "mead" - result = "mead" - required_reagents = list("sugar" = 1, "water" = 1) - required_catalysts = list("enzyme" = 5) - result_amount = 2 - - iced_beer - name = "Iced Beer" - id = "iced_beer" - result = "iced_beer" - required_reagents = list("beer" = 10, "frostoil" = 1) - result_amount = 10 - - iced_beer2 - name = "Iced Beer" - id = "iced_beer" - result = "iced_beer" - required_reagents = list("beer" = 5, "ice" = 1) - result_amount = 6 - - grog - name = "Grog" - id = "grog" - result = "grog" - required_reagents = list("rum" = 1, "water" = 1) - result_amount = 2 - - soy_latte - name = "Soy Latte" - id = "soy_latte" - result = "soy_latte" - required_reagents = list("coffee" = 1, "soymilk" = 1) - result_amount = 2 - - cafe_latte - name = "Cafe Latte" - id = "cafe_latte" - result = "cafe_latte" - required_reagents = list("coffee" = 1, "milk" = 1) - result_amount = 2 - - acidspit - name = "Acid Spit" - id = "acidspit" - result = "acidspit" - required_reagents = list("sacid" = 1, "wine" = 5) - result_amount = 6 - - amasec - name = "Amasec" - id = "amasec" - result = "amasec" - required_reagents = list("iron" = 1, "wine" = 5, "vodka" = 5) - result_amount = 10 - - changelingsting - name = "Changeling Sting" - id = "changelingsting" - result = "changelingsting" - required_reagents = list("screwdrivercocktail" = 1, "limejuice" = 1, "lemonjuice" = 1) - result_amount = 5 - - aloe - name = "Aloe" - id = "aloe" - result = "aloe" - required_reagents = list("cream" = 1, "whiskey" = 1, "watermelonjuice" = 1) - result_amount = 2 - - andalusia - name = "Andalusia" - id = "andalusia" - result = "andalusia" - required_reagents = list("rum" = 1, "whiskey" = 1, "lemonjuice" = 1) - result_amount = 3 - - neurotoxin - name = "Neurotoxin" - id = "neurotoxin" - result = "neurotoxin" - required_reagents = list("gargleblaster" = 1, "ether" = 1) - result_amount = 2 - - snowwhite - name = "Snow White" - id = "snowwhite" - result = "snowwhite" - required_reagents = list("beer" = 1, "lemon_lime" = 1) - result_amount = 2 - - irishcarbomb - name = "Irish Car Bomb" - id = "irishcarbomb" - result = "irishcarbomb" - required_reagents = list("ale" = 1, "irishcream" = 1) - result_amount = 2 - - syndicatebomb - name = "Syndicate Bomb" - id = "syndicatebomb" - result = "syndicatebomb" - required_reagents = list("beer" = 1, "whiskeycola" = 1) - result_amount = 2 - - erikasurprise - name = "Erika Surprise" - id = "erikasurprise" - result = "erikasurprise" - required_reagents = list("ale" = 1, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1) - result_amount = 5 - - devilskiss - name = "Devils Kiss" - id = "devilskiss" - result = "devilskiss" - required_reagents = list("blood" = 1, "kahlua" = 1, "rum" = 1) - result_amount = 3 - - hippiesdelight - name = "Hippies Delight" - id = "hippiesdelight" - result = "hippiesdelight" - required_reagents = list("psilocybin" = 1, "gargleblaster" = 1) - result_amount = 2 - - bananahonk - name = "Banana Honk" - id = "bananahonk" - result = "bananahonk" - required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1) - result_amount = 3 - - silencer - name = "Silencer" - id = "silencer" - result = "silencer" - required_reagents = list("nothing" = 1, "cream" = 1, "sugar" = 1) - result_amount = 3 - - driestmartini - name = "Driest Martini" - id = "driestmartini" - result = "driestmartini" - required_reagents = list("nothing" = 1, "gin" = 1) - result_amount = 2 - - lemonade - name = "Lemonade" - id = "lemonade" - result = "lemonade" - required_reagents = list("lemonjuice" = 1, "sugar" = 1, "water" = 1) - result_amount = 3 - - kiraspecial - name = "Kira Special" - id = "kiraspecial" - result = "kiraspecial" - required_reagents = list("orangejuice" = 1, "limejuice" = 1, "sodawater" = 1) - result_amount = 2 - - brownstar - name = "Brown Star" - id = "brownstar" - result = "brownstar" - required_reagents = list("orangejuice" = 2, "cola" = 1) - result_amount = 2 - - milkshake - name = "Milkshake" - id = "milkshake" - result = "milkshake" - required_reagents = list("cream" = 1, "ice" = 2, "milk" = 2) - result_amount = 5 - - rewriter - name = "Rewriter" - id = "rewriter" - result = "rewriter" - required_reagents = list("spacemountainwind" = 1, "coffee" = 1) - result_amount = 2 diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm index 3107faaae69..48c467fed02 100644 --- a/code/modules/reagents/grenade_launcher.dm +++ b/code/modules/reagents/grenade_launcher.dm @@ -17,57 +17,57 @@ materials = list(MAT_METAL=2000) - examine() - set src in view() - ..() - if (!(usr in view(2)) && usr!=src.loc) return - usr << "\icon [name]:" - usr << "\blue [grenades.len] / [max_grenades] [ammo_name]s." +/obj/item/weapon/gun/grenadelauncher/examine() + set src in view() + ..() + if (!(usr in view(2)) && usr!=src.loc) return + usr << "\icon [name]:" + usr << "\blue [grenades.len] / [max_grenades] [ammo_name]s." - attackby(obj/item/I as obj, mob/user as mob, params) +/obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) - if((istype(I, ammo_type))) - if(grenades.len < max_grenades) - user.drop_item() - I.loc = src - grenades += I - user << "\blue You put the [ammo_name] in the [name]." - user << "\blue [grenades.len] / [max_grenades] [ammo_name]s." - else - usr << "\red The grenade launcher cannot hold more [ammo_name]s." - - afterattack(obj/target, mob/user , flag) - - if (istype(target, /obj/item/weapon/storage/backpack )) - return - - else if (locate (/obj/structure/table, src.loc)) - return - - else if(target == user) - return - - if(grenades.len) - spawn(0) fire_grenade(target,user) + if((istype(I, ammo_type))) + if(grenades.len < max_grenades) + user.drop_item() + I.loc = src + grenades += I + user << "\blue You put the [ammo_name] in the [name]." + user << "\blue [grenades.len] / [max_grenades] [ammo_name]s." else - usr << "\red The [name] is empty." + usr << "\red The grenade launcher cannot hold more [ammo_name]s." + +/obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) + + if (istype(target, /obj/item/weapon/storage/backpack )) + return + + else if (locate (/obj/structure/table, src.loc)) + return + + else if(target == user) + return + + if(grenades.len) + spawn(0) fire_grenade(target,user) + else + usr << "\red The [name] is empty." + +/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) + for(var/mob/O in viewers(world.view, user)) + O.show_message(text("\red [] fired a [ammo_name]!", user), 1) + user << "\red You fire the [name]!" + var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! + grenades -= F + F.loc = user.loc + F.throw_at(target, 30, 2, user) + message_admins("[key_name_admin(user)] fired a [ammo_name] ([F.name]) from a launcher ([name]).") + log_game("[key_name_admin(user)] used a [ammo_name] ([name]).") + F.active = 1 + F.icon_state = initial(icon_state) + "_active" + playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + spawn(15) + F.prime() - proc - fire_grenade(atom/target, mob/user) - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("\red [] fired a [ammo_name]!", user), 1) - user << "\red You fire the [name]!" - var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! - grenades -= F - F.loc = user.loc - F.throw_at(target, 30, 2, user) - message_admins("[key_name_admin(user)] fired a [ammo_name] ([F.name]) from a launcher ([name]).") - log_game("[key_name_admin(user)] used a [ammo_name] ([name]).") - F.active = 1 - F.icon_state = initial(icon_state) + "_active" - playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(15) - F.prime() /obj/item/weapon/gun/grenadelauncher/piecannon name = "pie cannon" diff --git a/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm b/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm new file mode 100644 index 00000000000..6b5656c8dc5 --- /dev/null +++ b/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////////////////////////// +/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(var/datum/reagents/holder, var/created_volume) + return \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm new file mode 100644 index 00000000000..d56cdcf5644 --- /dev/null +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm @@ -0,0 +1,590 @@ +/datum/chemical_reaction/ + + hot_coco + name = "Hot Coco" + id = "hot_coco" + result = "hot_coco" + required_reagents = list("water" = 5, "coco" = 1) + result_amount = 5 + + chocolate_milk + name = "Chocolate Milk" + id = "chocolate_milk" + result = "chocolate_milk" + required_reagents = list("chocolate" = 1, "milk" = 1) + result_amount = 2 + mix_message = "The mixture turns a nice brown color." + + coffee + name = "Coffee" + id = "coffee" + result = "coffee" + required_reagents = list("coffeepowder" = 1, "water" = 5) + result_amount = 5 + + tea + name = "Tea" + id = "tea" + result = "tea" + required_reagents = list("teapowder" = 1, "water" = 5) + result_amount = 5 + + + + + goldschlager + name = "Goldschlager" + id = "goldschlager" + result = "goldschlager" + required_reagents = list("vodka" = 10, "gold" = 1) + result_amount = 10 + + patron + name = "Patron" + id = "patron" + result = "patron" + required_reagents = list("tequilla" = 10, "silver" = 1) + result_amount = 10 + + bilk + name = "Bilk" + id = "bilk" + result = "bilk" + required_reagents = list("milk" = 1, "beer" = 1) + result_amount = 2 + + icetea + name = "Iced Tea" + id = "icetea" + result = "icetea" + required_reagents = list("ice" = 1, "tea" = 3) + result_amount = 4 + + icecoffee + name = "Iced Coffee" + id = "icecoffee" + result = "icecoffee" + required_reagents = list("ice" = 1, "coffee" = 3) + result_amount = 4 + + nuka_cola + name = "Nuka Cola" + id = "nuka_cola" + result = "nuka_cola" + required_reagents = list("uranium" = 1, "cola" = 6) + result_amount = 6 + + moonshine + name = "Moonshine" + id = "moonshine" + result = "moonshine" + required_reagents = list("nutriment" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 + + wine + name = "Wine" + id = "wine" + result = "wine" + required_reagents = list("berryjuice" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 + + spacebeer + name = "Space Beer" + id = "spacebeer" + result = "beer" + required_reagents = list("cornoil" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 + + vodka + name = "Vodka" + id = "vodka" + result = "vodka" + required_reagents = list("potato" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 + sake + name = "Sake" + id = "sake" + result = "sake" + required_reagents = list("rice" = 10,"water" = 5) + required_catalysts = list("enzyme" = 5) + result_amount = 15 + + kahlua + name = "Kahlua" + id = "kahlua" + result = "kahlua" + required_reagents = list("coffee" = 5, "sugar" = 5, "rum" = 5) + required_catalysts = list("enzyme" = 5) + result_amount = 5 + + kahluaVodka + name = "KahluaVodka" + id = "kahlauVodka" + result = "kahlua" + required_reagents = list("coffee" = 5, "sugar" = 5, "vodka" = 5) + required_catalysts = list("enzyme" = 5) + result_amount = 5 + gin_tonic + name = "Gin and Tonic" + id = "gintonic" + result = "gintonic" + required_reagents = list("gin" = 2, "tonic" = 1) + result_amount = 3 + mix_message = "The tonic water and gin mix together perfectly." + + cuba_libre + name = "Cuba Libre" + id = "cubalibre" + result = "cubalibre" + required_reagents = list("rum" = 2, "cola" = 1) + result_amount = 3 + + mojito + name = "Mojito" + id = "mojito" + result = "mojito" + required_reagents = list("rum" = 1, "sugar" = 1, "limejuice" = 1, "sodawater" = 1) + result_amount = 4 + + martini + name = "Classic Martini" + id = "martini" + result = "martini" + required_reagents = list("gin" = 2, "vermouth" = 1) + result_amount = 3 + + vodkamartini + name = "Vodka Martini" + id = "vodkamartini" + result = "vodkamartini" + required_reagents = list("vodka" = 2, "vermouth" = 1) + result_amount = 3 + + white_russian + name = "White Russian" + id = "whiterussian" + result = "whiterussian" + required_reagents = list("blackrussian" = 3, "cream" = 2) + result_amount = 5 + + whiskey_cola + name = "Whiskey Cola" + id = "whiskeycola" + result = "whiskeycola" + required_reagents = list("whiskey" = 2, "cola" = 1) + result_amount = 3 + + screwdriver + name = "Screwdriver" + id = "screwdrivercocktail" + result = "screwdrivercocktail" + required_reagents = list("vodka" = 2, "orangejuice" = 1) + result_amount = 3 + + bloody_mary + name = "Bloody Mary" + id = "bloodymary" + result = "bloodymary" + required_reagents = list("vodka" = 1, "tomatojuice" = 2, "limejuice" = 1) + result_amount = 4 + + gargle_blaster + name = "Pan-Galactic Gargle Blaster" + id = "gargleblaster" + result = "gargleblaster" + required_reagents = list("vodka" = 1, "gin" = 1, "whiskey" = 1, "cognac" = 1, "limejuice" = 1) + result_amount = 5 + + brave_bull + name = "Brave Bull" + id = "bravebull" + result = "bravebull" + required_reagents = list("tequilla" = 2, "kahlua" = 1) + result_amount = 3 + + tequilla_sunrise + name = "Tequilla Sunrise" + id = "tequillasunrise" + result = "tequillasunrise" + required_reagents = list("tequilla" = 2, "orangejuice" = 1) + result_amount = 3 + + toxins_special + name = "Toxins Special" + id = "toxinsspecial" + result = "toxinsspecial" + required_reagents = list("rum" = 2, "vermouth" = 1, "plasma" = 2) + result_amount = 5 + + beepsky_smash + name = "Beepksy Smash" + id = "beepksysmash" + result = "beepskysmash" + required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1) + result_amount = 4 + + doctor_delight + name = "The Doctor's Delight" + id = "doctordelight" + result = "doctorsdelight" + required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1) + result_amount = 5 + + irish_cream + name = "Irish Cream" + id = "irishcream" + result = "irishcream" + required_reagents = list("whiskey" = 2, "cream" = 1) + result_amount = 3 + + manly_dorf + name = "The Manly Dorf" + id = "manlydorf" + result = "manlydorf" + required_reagents = list ("beer" = 1, "ale" = 2) + result_amount = 3 + + suicider + name = "Suicider" + id = "suicider" + result = "suicider" + required_reagents = list ("vodka" = 1, "cider" = 1, "fuel" = 1, "epinephrine" = 1) + result_amount = 4 + mix_message = "The drinks and chemicals mix together, emitting a potent smell." + + irish_coffee + name = "Irish Coffee" + id = "irishcoffee" + result = "irishcoffee" + required_reagents = list("irishcream" = 1, "coffee" = 1) + result_amount = 2 + + b52 + name = "B-52" + id = "b52" + result = "b52" + required_reagents = list("irishcream" = 1, "kahlua" = 1, "cognac" = 1) + result_amount = 3 + + atomicbomb + name = "Atomic Bomb" + id = "atomicbomb" + result = "atomicbomb" + required_reagents = list("b52" = 10, "uranium" = 1) + result_amount = 10 + + margarita + name = "Margarita" + id = "margarita" + result = "margarita" + required_reagents = list("tequilla" = 2, "limejuice" = 1) + result_amount = 3 + + longislandicedtea + name = "Long Island Iced Tea" + id = "longislandicedtea" + result = "longislandicedtea" + required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1) + result_amount = 4 + + threemileisland + name = "Three Mile Island Iced Tea" + id = "threemileisland" + result = "threemileisland" + required_reagents = list("longislandicedtea" = 10, "uranium" = 1) + result_amount = 10 + + whiskeysoda + name = "Whiskey Soda" + id = "whiskeysoda" + result = "whiskeysoda" + required_reagents = list("whiskey" = 2, "sodawater" = 1) + result_amount = 3 + + black_russian + name = "Black Russian" + id = "blackrussian" + result = "blackrussian" + required_reagents = list("vodka" = 3, "kahlua" = 2) + result_amount = 5 + + manhattan + name = "Manhattan" + id = "manhattan" + result = "manhattan" + required_reagents = list("whiskey" = 2, "vermouth" = 1) + result_amount = 3 + + manhattan_proj + name = "Manhattan Project" + id = "manhattan_proj" + result = "manhattan_proj" + required_reagents = list("manhattan" = 10, "uranium" = 1) + result_amount = 10 + + vodka_tonic + name = "Vodka and Tonic" + id = "vodkatonic" + result = "vodkatonic" + required_reagents = list("vodka" = 2, "tonic" = 1) + result_amount = 3 + + gin_fizz + name = "Gin Fizz" + id = "ginfizz" + result = "ginfizz" + required_reagents = list("gin" = 2, "sodawater" = 1, "limejuice" = 1) + result_amount = 4 + + bahama_mama + name = "Bahama mama" + id = "bahama_mama" + result = "bahama_mama" + required_reagents = list("rum" = 2, "orangejuice" = 2, "limejuice" = 1, "ice" = 1) + result_amount = 6 + + singulo + name = "Singulo" + id = "singulo" + result = "singulo" + required_reagents = list("vodka" = 5, "radium" = 1, "wine" = 5) + result_amount = 10 + + alliescocktail + name = "Allies Cocktail" + id = "alliescocktail" + result = "alliescocktail" + required_reagents = list("martini" = 1, "vodka" = 1) + result_amount = 2 + + demonsblood + name = "Demons Blood" + id = "demonsblood" + result = "demonsblood" + required_reagents = list("rum" = 1, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1) + result_amount = 4 + + booger + name = "Booger" + id = "booger" + result = "booger" + required_reagents = list("cream" = 1, "banana" = 1, "rum" = 1, "watermelonjuice" = 1) + result_amount = 4 + + antifreeze + name = "Anti-freeze" + id = "antifreeze" + result = "antifreeze" + required_reagents = list("vodka" = 2, "cream" = 1, "ice" = 1) + result_amount = 4 + + barefoot + name = "Barefoot" + id = "barefoot" + result = "barefoot" + required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1) + result_amount = 3 + + +////DRINKS THAT REQUIRED IMPROVED SPRITES BELOW:: -Agouri///// + + sbiten + name = "Sbiten" + id = "sbiten" + result = "sbiten" + required_reagents = list("vodka" = 10, "capsaicin" = 1) + result_amount = 10 + + red_mead + name = "Red Mead" + id = "red_mead" + result = "red_mead" + required_reagents = list("blood" = 1, "mead" = 1) + result_amount = 2 + + mead + name = "Mead" + id = "mead" + result = "mead" + required_reagents = list("sugar" = 1, "water" = 1) + required_catalysts = list("enzyme" = 5) + result_amount = 2 + + iced_beer + name = "Iced Beer" + id = "iced_beer" + result = "iced_beer" + required_reagents = list("beer" = 10, "frostoil" = 1) + result_amount = 10 + + iced_beer2 + name = "Iced Beer" + id = "iced_beer" + result = "iced_beer" + required_reagents = list("beer" = 5, "ice" = 1) + result_amount = 6 + + grog + name = "Grog" + id = "grog" + result = "grog" + required_reagents = list("rum" = 1, "water" = 1) + result_amount = 2 + + soy_latte + name = "Soy Latte" + id = "soy_latte" + result = "soy_latte" + required_reagents = list("coffee" = 1, "soymilk" = 1) + result_amount = 2 + + cafe_latte + name = "Cafe Latte" + id = "cafe_latte" + result = "cafe_latte" + required_reagents = list("coffee" = 1, "milk" = 1) + result_amount = 2 + + acidspit + name = "Acid Spit" + id = "acidspit" + result = "acidspit" + required_reagents = list("sacid" = 1, "wine" = 5) + result_amount = 6 + + amasec + name = "Amasec" + id = "amasec" + result = "amasec" + required_reagents = list("iron" = 1, "wine" = 5, "vodka" = 5) + result_amount = 10 + + changelingsting + name = "Changeling Sting" + id = "changelingsting" + result = "changelingsting" + required_reagents = list("screwdrivercocktail" = 1, "limejuice" = 1, "lemonjuice" = 1) + result_amount = 5 + + aloe + name = "Aloe" + id = "aloe" + result = "aloe" + required_reagents = list("cream" = 1, "whiskey" = 1, "watermelonjuice" = 1) + result_amount = 2 + + andalusia + name = "Andalusia" + id = "andalusia" + result = "andalusia" + required_reagents = list("rum" = 1, "whiskey" = 1, "lemonjuice" = 1) + result_amount = 3 + + neurotoxin + name = "Neurotoxin" + id = "neurotoxin" + result = "neurotoxin" + required_reagents = list("gargleblaster" = 1, "ether" = 1) + result_amount = 2 + + snowwhite + name = "Snow White" + id = "snowwhite" + result = "snowwhite" + required_reagents = list("beer" = 1, "lemon_lime" = 1) + result_amount = 2 + + irishcarbomb + name = "Irish Car Bomb" + id = "irishcarbomb" + result = "irishcarbomb" + required_reagents = list("ale" = 1, "irishcream" = 1) + result_amount = 2 + + syndicatebomb + name = "Syndicate Bomb" + id = "syndicatebomb" + result = "syndicatebomb" + required_reagents = list("beer" = 1, "whiskeycola" = 1) + result_amount = 2 + + erikasurprise + name = "Erika Surprise" + id = "erikasurprise" + result = "erikasurprise" + required_reagents = list("ale" = 1, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1) + result_amount = 5 + + devilskiss + name = "Devils Kiss" + id = "devilskiss" + result = "devilskiss" + required_reagents = list("blood" = 1, "kahlua" = 1, "rum" = 1) + result_amount = 3 + + hippiesdelight + name = "Hippies Delight" + id = "hippiesdelight" + result = "hippiesdelight" + required_reagents = list("psilocybin" = 1, "gargleblaster" = 1) + result_amount = 2 + + bananahonk + name = "Banana Honk" + id = "bananahonk" + result = "bananahonk" + required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1) + result_amount = 3 + + silencer + name = "Silencer" + id = "silencer" + result = "silencer" + required_reagents = list("nothing" = 1, "cream" = 1, "sugar" = 1) + result_amount = 3 + + driestmartini + name = "Driest Martini" + id = "driestmartini" + result = "driestmartini" + required_reagents = list("nothing" = 1, "gin" = 1) + result_amount = 2 + + lemonade + name = "Lemonade" + id = "lemonade" + result = "lemonade" + required_reagents = list("lemonjuice" = 1, "sugar" = 1, "water" = 1) + result_amount = 3 + + kiraspecial + name = "Kira Special" + id = "kiraspecial" + result = "kiraspecial" + required_reagents = list("orangejuice" = 1, "limejuice" = 1, "sodawater" = 1) + result_amount = 2 + + brownstar + name = "Brown Star" + id = "brownstar" + result = "brownstar" + required_reagents = list("orangejuice" = 2, "cola" = 1) + result_amount = 2 + + milkshake + name = "Milkshake" + id = "milkshake" + result = "milkshake" + required_reagents = list("cream" = 1, "ice" = 2, "milk" = 2) + result_amount = 5 + + rewriter + name = "Rewriter" + id = "rewriter" + result = "rewriter" + required_reagents = list("spacemountainwind" = 1, "coffee" = 1) + result_amount = 2 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm new file mode 100644 index 00000000000..146dc1da95c --- /dev/null +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm @@ -0,0 +1,108 @@ +/datum/chemical_reaction/ + + tofu + name = "Tofu" + id = "tofu" + result = null + required_reagents = list("soymilk" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 1 + on_reaction(var/datum/reagents/holder, var/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/tofu(location) + return + + chocolate_bar + name = "Chocolate Bar" + id = "chocolate_bar" + result = null + required_reagents = list("soymilk" = 2, "coco" = 2, "sugar" = 2) + result_amount = 1 + on_reaction(var/datum/reagents/holder, var/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/chocolatebar(location) + return + + chocolate_bar2 + name = "Chocolate Bar" + id = "chocolate_bar" + result = null + required_reagents = list("milk" = 2, "coco" = 2, "sugar" = 2) + result_amount = 1 + on_reaction(var/datum/reagents/holder, var/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/chocolatebar(location) + return + + + soysauce + name = "Soy Sauce" + id = "soysauce" + result = "soysauce" + required_reagents = list("soymilk" = 2, "flour" = 1, "sodiumchloride" = 1, "water" = 3) + result_amount = 7 + + cheesewheel + name = "Cheesewheel" + id = "cheesewheel" + result = null + required_reagents = list("milk" = 40) + required_catalysts = list("enzyme" = 5) + result_amount = 1 + on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel(location) + return + + syntiflesh + name = "Syntiflesh" + id = "syntiflesh" + result = null + required_reagents = list("blood" = 5, "cryoxadone" = 1) + result_amount = 1 + on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh(location) + return + + hot_ramen + name = "Hot Ramen" + id = "hot_ramen" + result = "hot_ramen" + required_reagents = list("water" = 1, "dry_ramen" = 3) + result_amount = 3 + + hell_ramen + name = "Hell Ramen" + id = "hell_ramen" + result = "hell_ramen" + required_reagents = list("capsaicin" = 1, "hot_ramen" = 6) + result_amount = 6 + + doughball + name = "Ball of dough" + id = "dough_ball" + result = "dough_ball" + required_reagents = list("flour" = 15, "water" = 5) + required_catalysts = list("enzyme" = 5) + + 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." + + 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 \ 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 new file mode 100644 index 00000000000..4ec4c1bb9e4 --- /dev/null +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm @@ -0,0 +1,76 @@ +//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!" + + on_reaction(var/datum/reagents/holder, var/created_volume) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0) + e.start() + holder.clear_reagents() + return + + 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 + + on_reaction(var/datum/reagents/holder, var/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() + return + + 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." + + thermite + name = "Thermite" + id = "thermite" + result = "thermite" + required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1) + result_amount = 3 + + glycerol + name = "Glycerol" + id = "glycerol" + result = "glycerol" + required_reagents = list("cornoil" = 3, "sacid" = 1) + result_amount = 1 + + nitroglycerin + name = "Nitroglycerin" + id = "nitroglycerin" + result = "nitroglycerin" + required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) + result_amount = 2 + on_reaction(var/datum/reagents/holder, var/created_volume) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round (created_volume/2, 1), holder.my_atom, 0, 0) + e.start() + + holder.clear_reagents() + return + + 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 new file mode 100644 index 00000000000..02e1f4a65cd --- /dev/null +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm @@ -0,0 +1,98 @@ +/datum/chemical_reaction/ + + hydrocodone + name = "Hydrocodone" + id = "hydrocodone" + result = "hydrocodone" + required_reagents = list("morphine" = 1, "sacid" = 1, "water" = 1, "oil" = 1) + result_amount = 2 + + mitocholide + name = "mitocholide" + id = "mitocholide" + result = "mitocholide" + required_reagents = list("synthflesh" = 1, "cryoxadone" = 1, "plasma" = 1) + result_amount = 3 + + 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." + + 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." + + audioline + name = "Audioline" + id = "audioline" + result = "audioline" + required_reagents = list("spaceacillin" = 1, "salglu_solution" = 1, "epinephrine" = 1) + result_amount = 3 + + rezadone + name = "Rezadone" + id = "rezadone" + result = "rezadone" + required_reagents = list("carpotoxin" = 1, "spaceacillin" = 1, "copper" = 1) + result_amount = 3 + + virus_food + name = "Virus Food" + id = "virusfood" + result = "virusfood" + required_reagents = list("water" = 1, "milk" = 1, "oxygen" = 1) + result_amount = 3 +/* + mix_virus + name = "Mix Virus" + id = "mixvirus" + result = "blood" + required_reagents = list("virusfood" = 5) + required_catalysts = list("blood") + var/level = 2 + + on_reaction(var/datum/reagents/holder, var/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 - rand(0, 1)) + + + mix_virus_2 + + name = "Mix Virus 2" + id = "mixvirus2" + required_reagents = list("mutagen" = 5) + level = 4 + + rem_virus + + name = "Devolve Virus" + id = "remvirus" + required_reagents = list("synaptizine" = 5) + + on_reaction(var/datum/reagents/holder, var/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() +*/ + + sterilizine + name = "Sterilizine" + id = "sterilizine" + result = "sterilizine" + required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1) + result_amount = 3 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm new file mode 100644 index 00000000000..020caed47ee --- /dev/null +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm @@ -0,0 +1,199 @@ +/datum/chemical_reaction/ +// foam and foam precursor + + 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." + + + foam + name = "Foam" + id = "foam" + result = null + required_reagents = list("fluorosurfactant" = 1, "water" = 1) + result_amount = 2 + + on_reaction(var/datum/reagents/holder, var/created_volume) + + + var/location = get_turf(holder.my_atom) + for(var/mob/M in viewers(5, location)) + M << "\red The solution violently bubbles!" + + location = get_turf(holder.my_atom) + + for(var/mob/M in viewers(5, location)) + M << "\red The solution spews out foam!" + + //world << "Holder volume is [holder.total_volume]" + //for(var/datum/reagent/R in holder.reagent_list) + // world << "[R.name] = [R.volume]" + + var/datum/effect/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, 0) + s.start() + holder.clear_reagents() + return + + metalfoam + name = "Metal Foam" + id = "metalfoam" + result = null + required_reagents = list("aluminum" = 3, "fluorosurfactant" = 1, "sacid" = 1) + result_amount = 5 + + on_reaction(var/datum/reagents/holder, var/created_volume) + + + var/location = get_turf(holder.my_atom) + + for(var/mob/M in viewers(5, location)) + M << "\red The solution spews out a metalic foam!" + + var/datum/effect/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, 1) + s.start() + return + + ironfoam + name = "Iron Foam" + id = "ironlfoam" + result = null + required_reagents = list("iron" = 3, "fluorosurfactant" = 1, "sacid" = 1) + result_amount = 5 + + on_reaction(var/datum/reagents/holder, var/created_volume) + + + var/location = get_turf(holder.my_atom) + + for(var/mob/M in viewers(5, location)) + M << "\red The solution spews out a metalic foam!" + + var/datum/effect/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, 2) + s.start() + return + + // Synthesizing these three chemicals is pretty complex in real life, but fuck it, it's just a game! + ammonia + name = "Ammonia" + id = "ammonia" + result = "ammonia" + required_reagents = list("hydrogen" = 3, "nitrogen" = 1) + result_amount = 3 + mix_message = "The mixture bubbles, emitting an acrid reek." + + diethylamine + name = "Diethylamine" + id = "diethylamine" + result = "diethylamine" + required_reagents = list ("ammonia" = 1, "ethanol" = 1) + result_amount = 2 + min_temp = 374 + mix_message = "A horrible smell pours forth from the mixture." + + space_cleaner + name = "Space cleaner" + id = "cleaner" + result = "cleaner" + required_reagents = list("ammonia" = 1, "water" = 1, "ethanol" = 1) + result_amount = 3 + mix_message = "Ick, this stuff really stinks. Sure does make the container sparkle though!" + + sulfuric_acid + name = "Sulfuric Acid" + id = "sacid" + result = "sacid" + required_reagents = list("sulfur" = 1, "oxygen" = 1, "hydrogen" = 1) + result_amount = 2 + mix_message = "The mixture gives off a sharp acidic tang." + +///////Changeling Blood Test///////////// +/* + changeling_test + name = "Changeling blood test" + id = "changelingblood" + result = "blood" + required_reagents = list("blood" = 5) + required_catalysts = list("fuel") + result_amount = 1 //Needs this in order to check the donor, as the data var in the reacted blood gets transferred. + on_reaction(var/datum/reagents/holder, var/created_volume) + if(!holder.reagent_list) //reagent_list is not null + return + var/datum/reagent/blood/B = locate() in holder.reagent_list + if(!B) //B is not null + return + var/mob/living/carbon/human/H = B.data["donor"] + if(!H) //H is not null. + return + if(H.mind && H.mind.changeling) //Checks if H, the blood donor is a ling. + for(var/mob/M in viewers(get_turf(holder.my_atom), null)) + M.show_message( "The blood writhes and wriggles and sizzles away from the container!", 1, "You hear bubbling and sizzling.", 2) + else + for(var/mob/M in viewers(get_turf(holder.my_atom), null)) + M.show_message( "The blood seems to break apart in the fuel.", 1) + holder.del_reagent("blood") + return +*/ + + plastication + name = "Plastic" + id = "solidplastic" + result = null + required_reagents = list("facid" = 10, "plasticide" = 20) + result_amount = 1 + on_reaction(var/datum/reagents/holder) + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/mineral/plastic + M.amount = 10 + M.loc = get_turf(holder.my_atom) + return + + + +//Not really misc chems, but not enough to deserve their own file +/* + silicate + name = "Silicate" + id = "silicate" + result = "silicate" + required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1) + result_amount = 3 +*/ + + 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." + + lube + name = "Space Lube" + id = "lube" + result = "lube" + required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) + result_amount = 3 + mix_message = "The substance turns a striking cyan and becomes oily." + + holy_water + name = "Holy Water" + id = "holywater" + result = "holywater" + required_reagents = list("water" = 1, "mercury" = 1, "wine" = 1) + result_amount = 3 + mix_message = "The water somehow seems purified. Or maybe defiled." + + + 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." \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm new file mode 100644 index 00000000000..a1d8b033672 --- /dev/null +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -0,0 +1,487 @@ +/////////////////////////////////////////////NEW SLIME CORE REACTIONS///////////////////////////////////////////// + +//Grey +/datum/chemical_reaction/ + + slimespawn + name = "Slime Spawn" + id = "m_spawn" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/grey + required_other = 1 + + on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) + var/mob/living/carbon/slime/S = new /mob/living/carbon/slime + S.loc = get_turf(holder.my_atom) + + + slimeinaprov + name = "Slime Epinephrine" + id = "m_epinephrine" + result = "epinephrine" + required_reagents = list("water" = 5) + result_amount = 3 + required_other = 1 + required_container = /obj/item/slime_extract/grey + + on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + + + slimemonkey + name = "Slime Monkey" + id = "m_monkey" + result = null + required_reagents = list("blood" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/grey + required_other = 1 + on_reaction(var/datum/reagents/holder) + for(var/i = 1, i <= 3, i++) + var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube + M.loc = get_turf(holder.my_atom) + +//Green + slimemutate + name = "Mutation Toxin" + id = "mutationtoxin" + result = "mutationtoxin" + required_reagents = list("plasma" = 5) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/green + +//Metal + slimemetal + name = "Slime Metal" + id = "m_metal" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/metal + required_other = 1 + on_reaction(var/datum/reagents/holder) + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal + M.amount = 15 + M.loc = get_turf(holder.my_atom) + var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel + P.amount = 5 + P.loc = get_turf(holder.my_atom) + +//Gold + slimecrit + name = "Slime Crit" + id = "m_tele" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 + on_reaction(var/datum/reagents/holder) + + var/blocked = blocked_mobs //global variable of blocked mobs + + var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) + + for(var/i = 1, i <= 5, i++) + var/chosen = pick(critters) + var/mob/living/simple_animal/hostile/C = new chosen + C.faction |= "slimesummon" + C.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(C, pick(NORTH,SOUTH,EAST,WEST)) +// for(var/mob/O in viewers(get_turf(holder.my_atom), null)) +// O.show_message(text("\red The slime core fizzles disappointingly,"), 1) + + + slimecritlesser + name = "Slime Crit Lesser" + id = "m_tele3" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 + on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently!"), 1) + spawn(50) + + if(holder && holder.my_atom) + + var/blocked = blocked_mobs + + var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) + + var/chosen = pick(critters) + var/mob/living/simple_animal/hostile/C = new chosen + C.faction |= "neutral" + C.loc = get_turf(holder.my_atom) + +//Silver + slimebork + name = "Slime Bork" + id = "m_tele2" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/silver + required_other = 1 + on_reaction(var/datum/reagents/holder) + + var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks) + // BORK BORK BORK + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) + + for(var/i = 1, i <= 4 + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) + slimedrinks + name = "Slime Drinks" + id = "m_tele3" + result = null + required_reagents = list("water" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/silver + required_other = 1 + on_reaction(var/datum/reagents/holder) + + var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks) + // BORK BORK BORK + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) + + for(var/i = 1, i <= 4 + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) + + +//Blue + slimefrost + name = "Slime Frost Oil" + id = "m_frostoil" + result = "frostoil" + required_reagents = list("plasma" = 5) + result_amount = 10 + required_container = /obj/item/slime_extract/blue + required_other = 1 +//Dark Blue + slimefreeze + name = "Slime Freeze" + id = "m_freeze" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/darkblue + required_other = 1 + on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + sleep(50) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) + M.bodytemperature -= 140 + M << "\blue You feel a chill!" + +//Orange + slimecasp + name = "Slime Capsaicin Oil" + id = "m_capsaicinoil" + result = "capsaicin" + required_reagents = list("blood" = 5) + result_amount = 10 + required_container = /obj/item/slime_extract/orange + required_other = 1 + + slimefire + name = "Slime fire" + id = "m_fire" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/orange + required_other = 1 + on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + sleep(50) + var/turf/simulated/T = get_turf(holder.my_atom) + if(istype(T)) + T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50) + +//Yellow + slimeoverload + name = "Slime EMP" + id = "m_emp" + result = null + required_reagents = list("blood" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + on_reaction(var/datum/reagents/holder, var/created_volume) + empulse(get_turf(holder.my_atom), 3, 7) + + + slimecell + name = "Slime Powercell" + id = "m_cell" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + on_reaction(var/datum/reagents/holder, var/created_volume) + var/obj/item/weapon/stock_parts/cell/slime/P = new /obj/item/weapon/stock_parts/cell/slime + P.loc = get_turf(holder.my_atom) + + slimeglow + name = "Slime Glow" + id = "m_glow" + result = null + required_reagents = list("water" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The contents of the slime core harden and begin to emit a warm, bright light."), 1) + var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime + F.loc = get_turf(holder.my_atom) + +//Purple + + slimepsteroid + name = "Slime Steroid" + id = "m_steroid" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/purple + required_other = 1 + on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid + P.loc = get_turf(holder.my_atom) + + + + slimejam + name = "Slime Jam" + id = "m_jam" + result = "slimejelly" + required_reagents = list("sugar" = 5) + result_amount = 10 + required_container = /obj/item/slime_extract/purple + required_other = 1 + + +//Dark Purple + slimeplasma + name = "Slime Plasma" + id = "m_plasma" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/darkpurple + required_other = 1 + on_reaction(var/datum/reagents/holder) + var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma + P.amount = 10 + P.loc = get_turf(holder.my_atom) + +//Red + slimeglycerol + name = "Slime Glycerol" + id = "m_glycerol" + result = "glycerol" + required_reagents = list("plasma" = 5) + result_amount = 8 + required_container = /obj/item/slime_extract/red + required_other = 1 + + + slimebloodlust + name = "Bloodlust" + id = "m_bloodlust" + result = null + required_reagents = list("blood" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/red + required_other = 1 + on_reaction(var/datum/reagents/holder) + for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null)) + slime.rabid = 1 + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The [slime] is driven into a frenzy!."), 1) + +//Pink + slimeppotion + name = "Slime Potion" + id = "m_potion" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/pink + required_other = 1 + on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/slimepotion/P = new /obj/item/weapon/slimepotion + P.loc = get_turf(holder.my_atom) + + +//Black + slimemutate2 + name = "Advanced Mutation Toxin" + id = "mutationtoxin2" + result = "amutationtoxin" + required_reagents = list("plasma" = 5) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/black + +//Oil + slimeexplosion + name = "Slime Explosion" + id = "m_explosion" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/oil + required_other = 1 + on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + sleep(50) + explosion(get_turf(holder.my_atom), 1 ,3, 6) +//Light Pink + slimepotion2 + name = "Slime Potion 2" + id = "m_potion2" + result = null + result_amount = 1 + required_container = /obj/item/slime_extract/lightpink + required_reagents = list("plasma" = 5) + required_other = 1 + on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/slimepotion2/P = new /obj/item/weapon/slimepotion2 + P.loc = get_turf(holder.my_atom) +//Adamantine + slimegolem + name = "Slime Golem" + id = "m_golem" + result = null + required_reagents = list("plasma" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/adamantine + required_other = 1 + on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/effect/goleRUNe/Z = new /obj/effect/goleRUNe + Z.loc = get_turf(holder.my_atom) + Z.announce_to_ghosts() +//Bluespace + slimecrystal + name = "Slime Crystal" + id = "m_crystal" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/bluespace + required_other = 1 + on_reaction(var/datum/reagents/holder, var/created_volume) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + if(holder.my_atom) + var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom)) + BC.visible_message("The [BC.name] appears out of thin air!") +//Cerulean + slimepsteroid2 + name = "Slime Steroid 2" + id = "m_steroid2" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/cerulean + required_other = 1 + on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2 + P.loc = get_turf(holder.my_atom) +//Sepia + slimecamera + name = "Slime Camera" + id = "m_camera" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/sepia + required_other = 1 + on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/device/camera/P = new /obj/item/device/camera + P.loc = get_turf(holder.my_atom) + + + slimefilm + name = "Slime Film" + id = "m_film" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/sepia + required_other = 1 + on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/device/camera_film/P = new /obj/item/device/camera_film + P.loc = get_turf(holder.my_atom) +//Pyrite + slimepaint + name = "Slime Paint" + id = "s_paint" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/pyrite + required_other = 1 + on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/list/paints = subtypesof(/obj/item/weapon/reagent_containers/glass/paint) + var/chosen = pick(paints) + var/obj/P = new chosen + if(P) + P.loc = get_turf(holder.my_atom) \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/__oldchem_defines.dm b/code/modules/reagents/oldchem/reagents/__oldchem_defines.dm new file mode 100644 index 00000000000..815c1208dd9 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/__oldchem_defines.dm @@ -0,0 +1,5 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 +#define FOOD_METABOLISM 0.4 +#define REM REAGENTS_EFFECT_MULTIPLIER \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm new file mode 100644 index 00000000000..2b2a94ee149 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm @@ -0,0 +1,82 @@ +/datum/reagent + var/name = "Reagent" + var/id = "reagent" + var/description = "" + var/datum/reagents/holder = null + 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!) + var/shock_reduction = 0 + var/penetrates_skin = 0 //Whether or not a reagent penetrates the skin + //Processing flags, defines the type of mobs the reagent will affect + //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 + + +/datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not. + if(!istype(M, /mob/living)) return 0 + var/datum/reagent/self = src + src = null + + if(self.holder) //for catching rare runtimes + if(method == TOUCH && self.penetrates_skin) + var/block = 0 + for(var/obj/item/clothing/C in M.get_equipped_items()) + if(istype(C, /obj/item/clothing/suit/bio_suit)) + block += 1 + if(istype(C, /obj/item/clothing/head/bio_hood)) + block += 1 + if(block < 2) + if(M.reagents) + M.reagents.add_reagent(self.id,self.volume) + +/* + if(method == INGEST && istype(M, /mob/living/carbon)) + if(prob(1 * self.addictiveness)) + if(prob(5 * volume)) + var/datum/disease/addiction/A = new /datum/disease/addiction + A.addicted_to = self + A.name = "[self.name] Addiction" + A.addiction ="[self.name]" + A.cure = self.id + M.viruses += A + A.affected_mob = M + A.holder = M +*/ + return 1 + +/datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object + src = null //if it can hold reagents. nope! + //if(O.reagents) + // O.reagents.add_reagent(id,volume/3) + return + +/datum/reagent/proc/reaction_turf(var/turf/T, var/volume) + src = null + return + +/datum/reagent/proc/on_mob_life(var/mob/living/M as mob, var/alien) + if(!istype(M, /mob/living)) // YOU'RE A FUCKING RETARD NEO WHY CAN'T YOU JUST FIX THE PROBLEM ON THE REAGENT - Iamgoofball + return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO + // Certain elements in too large amounts cause side-effects + holder.remove_reagent(src.id, metabolization_rate) //By default it slowly disappears. + current_cycle++ + return + +// Called when two reagents of the same are mixing. +/datum/reagent/proc/on_merge(var/data) + return + +/datum/reagent/proc/on_move(var/mob/M) + return + +/datum/reagent/proc/on_update(var/atom/A) + return + +/datum/reagent/Destroy() + holder = null + return ..() \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm new file mode 100644 index 00000000000..b07cd8355e3 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -0,0 +1,748 @@ +//ALCOHOL WOO +/datum/reagent/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 + var/datum/martial_art/drunk_brawling/F = new + var/dizzy_adj = 3 + var/slurr_adj = 3 + var/confused_adj = 2 + var/slur_start = 65 //amount absorbed after which mob starts slurring + var/brawl_start = 75 //amount absorbed after which mob switches to drunken brawling as a fighting style + var/confused_start = 130 //amount absorbed after which mob starts confusing directions + var/vomit_start = 180 //amount absorbed after which mob starts vomitting + var/blur_start = 260 //amount absorbed after which mob starts getting blurred vision + var/pass_out = 325 //amount absorbed after which mob starts passing out + +/datum/reagent/ethanol/on_mob_life(var/mob/living/M as mob, var/alien) + // Sobering multiplier. + // Sober block makes it more difficult to get drunk + var/sober_str=!(SOBER in M.mutations)?1:2 + M:nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) + if(!src.data) data = 1 + src.data++ + + var/d = data + + // make all the beverages work together + for(var/datum/reagent/ethanol/A in holder.reagent_list) + if(isnum(A.data)) d += A.data + + d/=sober_str + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly. + d*=5 + + M.dizziness += dizzy_adj. + if(d >= slur_start && d < pass_out) + if (!M:slurring) M:slurring = 1 + M:slurring += slurr_adj/sober_str + if(d >= brawl_start && ishuman(M)) + var/mob/living/carbon/human/H = M + F.teach(H,1) + if(src.volume < 3) + if(H.martial_art == F) + F.remove(H) + if(d >= confused_start && prob(33)) + if (!M:confused) M:confused = 1 + M.confused = max(M:confused+(confused_adj/sober_str),0) + if(d >= blur_start) + M.eye_blurry = max(M.eye_blurry, 10/sober_str) + M:drowsyness = max(M:drowsyness, 0) + if(d >= vomit_start) + if(prob(8)) + M.fakevomit() + if(d >= pass_out) + M:paralysis = max(M:paralysis, 20/sober_str) + M:drowsyness = max(M:drowsyness, 30/sober_str) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"] + if (istype(L)) + L.take_damage(0.1, 1) + H.adjustToxLoss(0.1) + holder.remove_reagent(src.id, 0.4) + ..() + return + +/datum/reagent/ethanol/reaction_obj(var/obj/O, var/volume) + if(istype(O,/obj/item/weapon/paper)) + var/obj/item/weapon/paper/paperaffected = O + paperaffected.clearpaper() + 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 + usr << "The solution melts away the ink on the book." + else + usr << "It wasn't enough..." + return + +/datum/reagent/ethanol/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with ethanol isn't quite as good as fuel. + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 15) + return + + +/datum/reagent/ethanol/beer //It's really much more stronger than other drinks. + 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 + +/datum/reagent/ethanol/beer/on_mob_life(var/mob/living/M as mob) + ..() + M:jitteriness = max(M:jitteriness-3,0) + return + +/datum/reagent/ethanol/cider + name = "Cider" + id = "cider" + description = "An alcoholic beverage derived from apples." + color = "#174116" + +/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 + +/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 + slur_start = 30 //amount absorbed after which mob starts slurring + brawl_start = 40 + +/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 + +/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 + slur_start = 25 + brawl_start = 40 + confused_start = 100 + +//copy paste from LSD... shoot me +/datum/reagent/ethanol/absinthe/on_mob_life(var/mob/M) + if(!M) M = holder.my_atom + if(!data) data = 1 + data++ + M:hallucination += 5 + if(volume > overdose_threshold) + M:adjustToxLoss(1) + ..() + return + +/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 + +/datum/reagent/ethanol/rum/on_mob_life(var/mob/living/M as mob) + ..() + M.dizziness +=5 + if(volume > overdose_threshold) + M:adjustToxLoss(1) + return + +/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 + +/datum/reagent/ethanol/vodka + name = "Vodka" + id = "vodka" + description = "Number one drink AND fueling choice for Russians worldwide." + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/ethanol/sake + name = "Sake" + id = "sake" + description = "Anime's favorite drink." + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/ethanol/tequilla + name = "Tequila" + id = "tequilla" + description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" + color = "#A8B0B7" // rgb: 168, 176, 183 + +/datum/reagent/ethanol/vermouth + name = "Vermouth" + id = "vermouth" + description = "You suddenly feel a craving for a martini..." + color = "#664300" // rgb: 102, 67, 0 + +/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 + slur_start = 65 //amount absorbed after which mob starts slurring + confused_start = 145 //amount absorbed after which mob starts confusing directions + +/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 + confused_start = 115 //amount absorbed after which mob starts confusing directions + +/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 + slurr_adj = 20 + confused_adj = 3 + slur_start = 15 + brawl_start = 25 + confused_start = 40 + blur_start = 60 + pass_out = 80 + +/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 + +/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 + +/datum/reagent/ethanol/thirteenloko/on_mob_life(var/mob/living/M as mob) + ..() + M:nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) + M:drowsyness = max(0,M:drowsyness-7) + //if(!M:sleeping_willingly) + // M:sleeping = max(0,M.sleeping-2) + if (M.bodytemperature > 310) + M.bodytemperature = max(310, M.bodytemperature-5) + M.Jitter(1) + return + + +/////////////////////////////////////////////////////////////////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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/datum/reagent/ethanol/booger + name = "Booger" + id = "booger" + description = "Ewww..." + reagent_state = LIQUID + color = "#A68310" // rgb: 166, 131, 16 + +/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 + +/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 + +/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 + +/datum/reagent/ethanol/tequilla_sunrise + name = "Tequila Sunrise" + id = "tequillasunrise" + description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + +/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 + +/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 + +/datum/reagent/ethanol/changelingsting + name = "Changeling Sting" + id = "changelingsting" + description = "You take a tiny sip and feel a burning sensation..." + reagent_state = LIQUID + color = "#2E6671" // rgb: 46, 102, 113 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/datum/reagent/ethanol/whiskeysoda + name = "Whiskey Soda" + id = "whiskeysoda" + description = "Ultimate refreshment." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/ethanol/antifreeze + name = "Anti-freeze" + id = "antifreeze" + description = "Ultimate refreshment." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/ethanol/barefoot + name = "Barefoot" + id = "barefoot" + description = "Barefoot and pregnant" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/ethanol/snowwhite + name = "Snow White" + id = "snowwhite" + description = "A cold refreshment" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/ethanol/demonsblood + name = "Demons Blood" + id = "demonsblood" + description = "AHHHH!!!!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + dizzy_adj = 10 + slurr_adj = 10 + +/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 + slurr_adj = 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 + slurr_adj = 3 + +/datum/reagent/ethanol/bahama_mama + name = "Bahama mama" + id = "bahama_mama" + description = "Tropic cocktail." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + +/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 + slurr_adj = 15 + +/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 + +/datum/reagent/ethanol/sbiten/on_mob_life(var/mob/living/M as mob) + ..() + if (M.bodytemperature < 360) + M.bodytemperature = min(360, M.bodytemperature+50) //310 is the normal bodytemp. 310.055 + return + +/datum/reagent/ethanol/devilskiss + name = "Devils Kiss" + id = "devilskiss" + description = "Creepy time!" + reagent_state = LIQUID + color = "#A68310" // rgb: 166, 131, 16 + +/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 + +/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 + +/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 + +/datum/reagent/ethanol/iced_beer/on_mob_life(var/mob/living/M as mob) + ..() + if (M.bodytemperature < 270) + M.bodytemperature = min(270, M.bodytemperature-40) //310 is the normal bodytemp. 310.055 + return + +/datum/reagent/ethanol/grog + name = "Grog" + id = "grog" + description = "Watered down rum, Nanotrasen approves!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/ethanol/aloe + name = "Aloe" + id = "aloe" + description = "So very, very, very good." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/ethanol/andalusia + name = "Andalusia" + id = "andalusia" + description = "A nice, strange named drink." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + +/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 + +/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 + +/datum/reagent/ethanol/amasec + name = "Amasec" + id = "amasec" + description = "Official drink of the Imperium." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + + +/datum/reagent/ethanol/neurotoxin + name = "Neurotoxin" + id = "neurotoxin" + description = "A strong neurotoxin that puts the subject into a death-like state." + reagent_state = LIQUID + color = "#2E2E61" // rgb: 46, 46, 97 + +/datum/reagent/ethanol/neurotoxin/on_mob_life(var/mob/living/M as mob) + M.weakened = max(M.weakened, 3) + if(!data) + data = 1 + data++ + M.dizziness +=6 + if(data >= 15 && data <45) + if (!M.slurring) + M.slurring = 1 + M.slurring += 3 + else if(data >= 45 && prob(50) && data <55) + M.confused = max(M.confused+3,0) + else if(data >=55) + M.druggy = max(M.druggy, 55) + else if(data >=200) + M.adjustToxLoss(2) + ..() + return + +/datum/reagent/ethanol/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/ethanol/bananahonk/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Clown")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + ..() + +/datum/reagent/ethanol/silencer + name = "Silencer" + id = "silencer" + description = "A drink from Mime Heaven." + nutriment_factor = 1 * FOOD_METABOLISM + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/ethanol/silencer/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Mime")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + ..() + +/datum/reagent/ethanol/changelingsting + name = "Changeling Sting" + id = "changelingsting" + description = "A stingy drink." + reagent_state = LIQUID + color = "#2E6671" // rgb: 46, 102, 113 + +/datum/reagent/ethanol/changelingsting/on_mob_life(var/mob/living/M as mob) + ..() + M.dizziness +=5 + return + +/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 + +/datum/reagent/ethanol/irishcarbomb/on_mob_life(var/mob/living/M as mob) + ..() + M.dizziness +=5 + return + +/datum/reagent/ethanol/syndicatebomb + name = "Syndicate Bomb" + id = "syndicatebomb" + description = "A Syndicate bomb" + reagent_state = LIQUID + color = "#2E6671" // rgb: 46, 102, 113 + +/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 + +/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 + +/datum/reagent/ethanol/driestmartini/on_mob_life(var/mob/living/M as mob) + if(!data) data = 1 + data++ + M.dizziness +=10 + if(data >= 55 && data <115) + if (!M.stuttering) M.stuttering = 1 + M.stuttering += 10 + else if(data >= 115 && prob(33)) + M.confused = max(M.confused+15,15) + ..() + + return \ 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 new file mode 100644 index 00000000000..e66e48fbdfe --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm @@ -0,0 +1,279 @@ +/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(var/mob/living/M as mob) + ..() + if(M.getOxyLoss() && prob(30)) M.adjustOxyLoss(-1*REM) + return + +/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(var/mob/living/M as mob) + ..() + if(M.getFireLoss() && prob(20)) M.heal_organ_damage(0,1) + return + +/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(var/mob/living/M as mob) + ..() + if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1) + return + + +/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(var/mob/living/M as mob) + ..() + M.eye_blurry = max(M.eye_blurry-1 , 0) + M.eye_blind = max(M.eye_blind-1 , 0) + if(!data) data = 1 + switch(data) + if(1 to 20) + //nothing + if(21 to INFINITY) + if (prob(data-10)) + M.disabilities &= ~NEARSIGHTED + data++ + return + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1) + ..() + return + +/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(var/mob/living/M as mob) + ..() + M.adjustToxLoss(1) + return + +/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(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Clown")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + ..() + +/datum/reagent/drink/nothing + name = "Nothing" + id = "nothing" + description = "Absolutely nothing." + +/datum/reagent/drink/nothing/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Mime")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + ..() + +/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(var/mob/living/M as mob) + if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) + if(holder.has_reagent("capsaicin")) + holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM) + ..() + return + +/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 = 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 = 25 + overdose_threshold = 45 + +/datum/reagent/drink/coffee/on_mob_life(var/mob/living/M as mob) + if(adj_temp > 0 && holder.has_reagent("frostoil")) + holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM) + if(prob(50)) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + ..() + return + +/datum/reagent/drink/coffee/overdose_process(var/mob/living/M as mob) + if(volume > 45) + M.Jitter(5) + + ..() + return + +/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 = -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 = 5 + +/datum/reagent/drink/coffee/soy_latte/on_mob_life(var/mob/living/M as mob) + ..() + M.sleeping = 0 + if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) + return + +/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 = 5 + +/datum/reagent/drink/coffee/cafe_latte/on_mob_life(var/mob/living/M as mob) + ..() + M.sleeping = 0 + if(M.getBruteLoss() && prob(20)) + M.heal_organ_damage(1,0) + return + +/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 = 20 + +/datum/reagent/drink/tea/on_mob_life(var/mob/living/M as mob) + ..() + if(M.getToxLoss() && prob(20)) + M.adjustToxLoss(-1) + return + +/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 = -5 + +/datum/reagent/drink/kahlua + name = "Kahlua" + id = "kahlua" + description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" + color = "#664300" // rgb: 102, 67, 0 + adj_dizzy = -5 + adj_drowsy = -3 + adj_sleepy = -2 + +/datum/reagent/drink/kahlua/on_mob_life(var/mob/living/M as mob) + ..() + M.Jitter(5) + return \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm new file mode 100644 index 00000000000..3bc3b364929 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm @@ -0,0 +1,26 @@ +/datum/reagent/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 + var/adj_sleepy = 0 + var/adj_temp = 0 + +/datum/reagent/drink/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) + if (adj_dizzy) M.dizziness = max(0,M.dizziness + adj_dizzy) + if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy) + if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy) + if (adj_temp) + if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 + M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT)) + // Drinks should be used up faster than other reagents. + holder.remove_reagent(src.id, FOOD_METABOLISM) + ..() + return diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm new file mode 100644 index 00000000000..e9acef2da7d --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm @@ -0,0 +1,141 @@ +/datum/reagent/drink/cold + name = "Cold drink" + adj_temp = -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 + +/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 = -3 + +/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(var/mob/living/M as mob) + M.Jitter(20) + M.druggy = max(M.druggy, 30) + M.dizziness +=5 + M.drowsyness = 0 + M.status_flags |= GOTTAGOFAST + ..() + return + +/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 = -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 = -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 = "Its not what it sounds like..." + id = "brownstar" + color = "#9F3400" // rgb: 159, 052, 000 + adj_temp = - 2 + +/datum/reagent/drink/cold/milkshake + name = "Milkshake" + description = "Glorious brainfreezing mixture." + id = "milkshake" + color = "#AEE5E4" // rgb" 174, 229, 228 + adj_temp = -9 + +/datum/reagent/drink/cold/milkshake/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!data) data = 1 + switch(data) + if(1 to 15) + M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT + if(holder.has_reagent("capsaicin")) + holder.remove_reagent("capsaicin", 5) + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature -= rand(5,20) + if(15 to 25) + M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature -= rand(10,20) + if(25 to INFINITY) + M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT + if(prob(1)) M.emote("shiver") + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature -= rand(15,20) + data++ + holder.remove_reagent(src.id, FOOD_METABOLISM) + ..() + return + +/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(var/mob/living/M as mob) + ..() + M.Jitter(5) + return \ 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 new file mode 100644 index 00000000000..dd9e73a96b1 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/reagents_admin.dm @@ -0,0 +1,54 @@ +/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! + +/datum/reagent/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom ///This can even heal dead people. + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.id,5) + M.setCloneLoss(0) + M.setOxyLoss(0) + M.radiation = 0 + M.heal_organ_damage(5,5) + M.adjustToxLoss(-5) + M.hallucination = 0 + M.setBrainLoss(0) + M.disabilities = 0 + M.sdisabilities = 0 + M.eye_blurry = 0 + M.eye_blind = 0 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] + if(istype(E)) + E.damage = max(E.damage-5 , 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.sleeping = 0 + M.jitteriness = 0 + if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs + var/mob/living/carbon/C = M + if(C.virus2.len) + for (var/ID in C.virus2) + var/datum/disease2/disease/V = C.virus2[ID] + C.antibodies |= V.antigen + ..() + return + + +/datum/reagent/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/oldchem/reagents/reagents_drugs.dm b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm new file mode 100644 index 00000000000..a00da8f283a --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm @@ -0,0 +1,95 @@ +/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 + +/datum/reagent/serotrotium/on_mob_life(var/mob/living/M as mob) + if(ishuman(M)) + if(prob(7)) M.emote(pick("twitch","drool","moan","gasp")) + holder.remove_reagent(src.id, 0.25 * REAGENTS_METABOLISM) + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.canmove && !M.restrained() && istype(M.loc, /turf/space)) + step(M, pick(cardinal)) + if(prob(5)) M.emote(pick("twitch","drool","moan")) + ..() + return + + +/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 + +/datum/reagent/hippies_delight/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.druggy = max(M.druggy, 50) + if(!data) data = 1 + switch(data) + 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")) + holder.remove_reagent(src.id, 0.2) + data++ + ..() + return + + +/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(var/mob/living/M) + if(!M) M = holder.my_atom + M.hallucination += 10 + ..() + return + + +/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 + +/datum/reagent/space_drugs/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.druggy = max(M.druggy, 15) + if(isturf(M.loc) && !istype(M.loc, /turf/space)) + if(M.canmove && !M.restrained()) + if(prob(10)) step(M, pick(cardinal)) + if(prob(7)) M.emote(pick("twitch","drool","moan","giggle")) + ..() + return \ 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 new file mode 100644 index 00000000000..4603aa6c238 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm @@ -0,0 +1,136 @@ +/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(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 10) + return + ..() + +/datum/reagent/fuel/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(1) + ..() + 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. + +/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) + holder.remove_reagent(src.id, 1) + + +/datum/reagent/incendiary_fuel //copy-pasta of welding fuel; allow incendiary grenades to function better without the headache of people spraying fuel everywhere with regular welding fuel. + name = "Incendiary fuel" + id = "incendiaryfuel" + description = "A highly flammable compound used in incendiary grenades." + reagent_state = LIQUID + color = "#660000" // rgb: 102, 0, 0 + +/datum/reagent/incendiary_fuel/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 10) + return + +/datum/reagent/incendiary_fuel/reaction_obj(var/obj/O, var/volume) + var/turf/the_turf = get_turf(O) + if(!the_turf) + return //No sense trying to start a fire if you don't have a turf to set on fire. --NEO + new /obj/effect/decal/cleanable/liquid_fuel(the_turf, volume) + +/datum/reagent/incendiary_fuel/reaction_turf(var/turf/T, var/volume) + new /obj/effect/decal/cleanable/liquid_fuel(T, volume) + return + +/datum/reagent/incendiary_fuel/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(1) + ..() + 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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(1*REM) + if(holder.has_reagent("epinephrine")) + holder.remove_reagent("epinephrine", 2) + ..() + return + +/datum/reagent/plasma/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with plasma is stronger than fuel! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 5) + ..() + return + + +/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(var/turf/T, var/volume) + src = null + if(volume >= 5) + if(istype(T, /turf/simulated/wall)) + T:thermite = 1 + T.overlays.Cut() + T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite") + return + +/datum/reagent/thermite/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustFireLoss(1) + ..() + return + + +/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/nitroglycerin + name = "Nitroglycerin" + id = "nitroglycerin" + description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." + 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 new file mode 100644 index 00000000000..485a42e7ca7 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm @@ -0,0 +1,425 @@ +/////////////////////////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 + +/datum/reagent/nutriment/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!(M.mind in ticker.mode.vampires)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && H.species.dietflags) //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.heal_organ_damage(1,0) + if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals + if(prob(50)) M.heal_organ_damage(1,0) + ..() + return + + +/datum/reagent/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." + reagent_state = SOLID + nutriment_factor = 15 * REAGENTS_METABOLISM + color = "#664330" // rgb: 102, 67, 48 + +/datum/reagent/protein/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!(M.mind in ticker.mode.vampires)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && H.species.dietflags && !(H.species.dietflags & DIET_HERB)) //Make sure the species has it's dietflag set, and that it is not a herbivore + H.nutrition += nutriment_factor // For hunger and fatness + if(prob(50)) M.heal_organ_damage(1,0) + if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals + if(prob(50)) M.heal_organ_damage(1,0) + ..() + return + + +/datum/reagent/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." + reagent_state = SOLID + nutriment_factor = 15 * REAGENTS_METABOLISM + color = "#664330" // rgb: 102, 67, 48 + +/datum/reagent/plantmatter/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!(M.mind in ticker.mode.vampires)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && H.species.dietflags && !(H.species.dietflags & DIET_CARN)) //Make sure the species has it's dietflag set, and that it is not a carnivore + H.nutrition += nutriment_factor // For hunger and fatness + if(prob(50)) M.heal_organ_damage(1,0) + if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals + if(prob(50)) M.heal_organ_damage(1,0) + ..() + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!data) data = 1 + switch(data) + if(1 to 15) + M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT + if(holder.has_reagent("frostoil")) + holder.remove_reagent("frostoil", 5) + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature += rand(5,20) + if(15 to 25) + M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature += rand(10,20) + if(25 to INFINITY) + M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature += rand(15,20) + holder.remove_reagent(src.id, FOOD_METABOLISM) + data++ + ..() + return + + +/datum/reagent/sodiumchloride + name = "Salt" + id = "sodiumchloride" + description = "Sodium chloride, common table salt." + reagent_state = SOLID + color = "#B1B0B0" + +/datum/reagent/sodiumchloride/overdose_process(var/mob/living/M as mob) + if(volume > 100) + if(prob(70)) + M.adjustBrainLoss(1) + if(prob(8)) + M.adjustToxLoss(rand(1,2)) + ..() + return + + +/datum/reagent/blackpepper + name = "Black Pepper" + id = "blackpepper" + description = "A powder ground from peppercorns. *AAAACHOOO*" + reagent_state = SOLID + // no color (ie, black) + +/datum/reagent/coco + name = "Coco Powder" + id = "coco" + description = "A fatty, bitter paste made from coco beans." + reagent_state = SOLID + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/coco/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + +/datum/reagent/hot_coco + name = "Hot Chocolate" + id = "hot_coco" + description = "Made with love! And coco beans." + reagent_state = LIQUID + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#403010" // rgb: 64, 48, 16 + +/datum/reagent/hot_coco/on_mob_life(var/mob/living/M as mob) + 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 + ..() + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.druggy = max(M.druggy, 30) + if(!data) data = 1 + switch(data) + 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")) + data++ + ..() + return + + +/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(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + ..() + + +/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(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + +/datum/reagent/cornoil/reaction_turf(var/turf/simulated/T, var/volume) + if (!istype(T)) return + src = null + if(volume >= 3) + if(T.wet >= 1) return + T.wet = 1 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") + T.overlays += T.wet_overlay + + spawn(800) + if (!istype(T)) return + if(T.wet >= 2) return + T.wet = 0 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + 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(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + + +/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(var/mob/living/M as mob) + 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)) + ..() + return + + +/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(var/mob/living/M as mob) + M.nutrition += nutriment_factor + M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT + ..() + return + + +/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(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + +/datum/reagent/flour/reaction_turf(var/turf/T, var/volume) + src = null + 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(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + + +/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(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + + +/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 +// toxpwr = 0.2 //It's not THAT poisonous. + 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(var/mob/living/M as mob) + if(prob(4)) + M.reagents.add_reagent("epinephrine", 1.2) + if(prob(50)) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + if(current_cycle >= 90) + M.jitteriness += 10 + ..() + return + +/datum/reagent/sugar/overdose_process(var/mob/living/M as mob) + if(volume > 200) + M << "You pass out from hyperglycemic shock!" + M.Paralyse(1) + if(prob(8)) + M.adjustToxLoss(rand(1,2)) + ..() + return diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm new file mode 100644 index 00000000000..696fa6354a5 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/reagents_med.dm @@ -0,0 +1,152 @@ +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + ..() + return + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.nutrition += nutriment_factor*REM + ..() + return + +/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(var/mob/living/M, var/method=TOUCH, var/volume) + if (method == TOUCH) + M.germ_level -= min(volume*20, M.germ_level) + +/datum/reagent/sterilizine/reaction_obj(var/obj/O, var/volume) + O.germ_level -= min(volume*20, O.germ_level) + +/datum/reagent/sterilizine/reaction_turf(var/turf/T, var/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" + +/datum/reagent/synaptizine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + if(prob(50)) + M.adjustBrainLoss(-1.0) + ..() + return + +/datum/reagent/audioline + name = "Audioline" + id = "audioline" + description = "Heals ear damage." + reagent_state = LIQUID + color = "#6600FF" // rgb: 100, 165, 255 + +/datum/reagent/audioline/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.ear_damage = 0 + M.ear_deaf = 0 + ..() + return + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + 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_by_name) + var/obj/item/organ/I = H.internal_organs_by_name[name] + if(I.damage > 0) + I.damage -= 0.20 + ..() + return + +/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 + +/datum/reagent/cryoxadone/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.bodytemperature < 265) + M.adjustCloneLoss(-4) + M.adjustOxyLoss(-10) + M.heal_organ_damage(12,12) + M.adjustToxLoss(-3) + M.status_flags &= ~DISFIGURED + ..() + return + +/datum/reagent/rezadone + name = "Rezadone" + id = "rezadone" + description = "A powder derived from fish toxin, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." + reagent_state = SOLID + color = "#669900" // rgb: 102, 153, 0 + +/datum/reagent/rezadone/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!data) data = 1 + data++ + switch(data) + if(1 to 15) + M.adjustCloneLoss(-1) + M.heal_organ_damage(1,1) + if(15 to 35) + M.adjustCloneLoss(-2) + M.heal_organ_damage(2,1) + M.status_flags &= ~DISFIGURED + if(35 to INFINITY) + M.adjustToxLoss(1) + M.Dizzy(5) + M.Jitter(5) + + ..() + return + +/datum/reagent/spaceacillin + name = "Spaceacillin" + id = "spaceacillin" + description = "An all-purpose antibiotic agent extracted from space fungus." + reagent_state = LIQUID + color = "#0AB478" + +/datum/reagent/spaceacillin/on_mob_life(var/mob/living/M as mob) + ..() + return \ 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 new file mode 100644 index 00000000000..8c3352243eb --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/reagents_misc.dm @@ -0,0 +1,222 @@ +/*/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(var/obj/O, var/volume) + src = null + 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 + + return*/ + + +/datum/reagent/oxygen + name = "Oxygen" + id = "oxygen" + description = "A colorless, odorless gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + +/datum/reagent/oxygen/on_mob_life(var/mob/living/M as mob, var/alien) + if(M.stat == 2) return + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis")) + M.adjustToxLoss(REAGENTS_METABOLISM) + holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears. + return + ..() + + +/datum/reagent/nitrogen + name = "Nitrogen" + id = "nitrogen" + description = "A colorless, odorless, tasteless gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + +/datum/reagent/nitrogen/on_mob_life(var/mob/living/M as mob, var/alien) + if(M.stat == 2) return + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis")) + M.adjustOxyLoss(-2*REM) + holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears. + return + ..() + + +/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(var/turf/T, var/volume) + src = null + // Only add one dirt per turf. Was causing people to crash. + if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T)) + 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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if((M.virus) && (prob(8) && (M.virus.name=="Magnitis"))) + if(M.virus.spread == "Airborne") + M.virus.spread = "Remissive" + M.virus.stage-- + if(M.virus.stage <= 0) + M.resistances += M.virus.type + M.virus = null + holder.remove_reagent(src.id, 0.2) + return +*/ + + + +//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 new file mode 100644 index 00000000000..89bc66cda68 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm @@ -0,0 +1,597 @@ +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(2) + ..() + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(1.5) + ..() + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(1.5) + ..() + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if (FAT in M.mutations) + M.gib() + ..() + return + + +/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(var/mob/living/M as mob) + if(prob(10)) + M << "\red Your insides are burning!" + M.adjustToxLoss(rand(20,60)*REM) + else if(prob(40)) + M.heal_organ_damage(5*REM,0) + ..() + return + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(ishuman(M)) + var/mob/living/carbon/human/human = M + if(human.species.name != "Shadow") + M << "\red Your flesh rapidly mutates!" + M << "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids." + M << "\red Your body reacts violently to light. \green However, it naturally heals in darkness." + M << "Aside from your new traits, you are mentally unchanged and retain your prior obligations." + human.set_species("Shadow") + ..() + return + +/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/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(istype(M, /mob/living/carbon) && M.stat != DEAD) + M << "\red Your flesh rapidly mutates!" + if(M.notransform) return + M.notransform = 1 + M.canmove = 0 + M.icon = null + M.overlays.Cut() + M.invisibility = 101 + for(var/obj/item/W in M) + if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something + qdel(W) + continue + W.layer = initial(W.layer) + W.loc = M.loc + W.dropped(M) + var/mob/living/carbon/slime/new_mob = new /mob/living/carbon/slime(M.loc) + new_mob.a_intent = "harm" + new_mob.universal_speak = 1 + if(M.mind) + M.mind.transfer_to(new_mob) + else + new_mob.key = M.key + qdel(M) + ..() + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(prob(70)) + M.adjustBrainLoss(1) + ..() + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustFireLoss(1) + ..() + return + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustFireLoss(1) + M.adjustToxLoss(1*REM) + ..() + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.apply_effect(4*REM,IRRADIATE,0) + // radium may increase your chances to cure a disease + if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs + var/mob/living/carbon/C = M + if(C.virus2.len) + for (var/ID in C.virus2) + var/datum/disease2/disease/V = C.virus2[ID] + if(prob(5)) + if(prob(50)) + M.apply_effect(50,IRRADIATE,0) // curing it that way may kill you instead + M.adjustToxLoss(100) + C.antibodies |= V.antigen + ..() + return + +/datum/reagent/radium/reaction_turf(var/turf/T, var/volume) + src = null + if(volume >= 3) + if(!istype(T, /turf/space)) + new /obj/effect/decal/cleanable/greenglow(T) + return + + +/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(var/mob/M, var/method=TOUCH, var/volume) + if(!..()) return + if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. + src = null + if((method==TOUCH && prob(33)) || method==INGEST) + if(prob(98)) + randmutb(M) + else + randmutg(M) + domutcheck(M, null) + M.UpdateAppearance() + return + +/datum/reagent/mutagen/on_mob_life(var/mob/living/M as mob) + if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. + if(!M) M = holder.my_atom + M.apply_effect(2*REM,IRRADIATE,0) + if(prob(4)) + randmutb(M) + ..() + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.apply_effect(2,IRRADIATE,0) + ..() + return + +/datum/reagent/uranium/reaction_turf(var/turf/T, var/volume) + src = null + if(volume >= 3) + if(!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(var/mob/living/M as mob) + if(M.stat == 2.0) + return + if(!M) M = holder.my_atom + M.adjustToxLoss(1) + ..() + return + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustFireLoss(1) + ..() + return + +/datum/reagent/sacid/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(volume > 25) + + if(H.wear_mask) + H << "\red Your mask protects you from the acid!" + return + + if(H.head) + H << "\red 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(20, 0) + H.UpdateDamageIcon() + H.emote("scream") + else + M.take_organ_damage(15,0) + else + M.take_organ_damage(15,0) + + if(method == INGEST) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(volume < 10) + 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(min(max(volume-10,2)*2,20),0) + 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(20, 0) + H.UpdateDamageIcon() + H.emote("scream") + else + M.take_organ_damage(15,0) + +/datum/reagent/sacid/reaction_obj(var/obj/O, var/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." + for(var/mob/M in viewers(5, O)) + M << "\red \the [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. + +/datum/reagent/hellwater/on_mob_life(var/mob/living/M as mob) + 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) + holder.remove_reagent(src.id, 1) + + +/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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(2*REM) + ..() + return + + +/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(var/mob/living/M) + M.adjustStaminaLoss(REM * data) + data = max(data - 1, 3) + ..() + + +/datum/reagent/spores + name = "Spore Toxin" + id = "spores" + description = "A toxic spore cloud which blocks vision when ingested." + color = "#9ACD32" + +/datum/reagent/spores/on_mob_life(var/mob/living/M as mob) + M.adjustToxLoss(0.5) + M.damageoverlaytemp = 60 + M.eye_blurry = max(M.eye_blurry, 3) + ..() + return + + +/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 + +/datum/reagent/beer2/on_mob_life(var/mob/living/M as mob) + if(!data) + data = 1 + switch(data) + if(1 to 50) + M.sleeping += 1 + if(51 to INFINITY) + M.sleeping += 1 + M.adjustToxLoss((data - 50)*REM) + data++ + holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM) + ..() + return + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +/datum/reagent/nanomachines + name = "Nanomachines" + id = "nanomachines" + description = "Microscopic construction robots." + reagent_state = LIQUID + color = "#535E66" // rgb: 83, 94, 102 + +/datum/reagent/nanomachines/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + src = null + if( (prob(10) && method==TOUCH) || method==INGEST) + M.contract_disease(new /datum/disease/robotic_transformation(0),1) + +/datum/reagent/xenomicrobes + name = "Xenomicrobes" + id = "xenomicrobes" + description = "Microbes with an entirely alien cellular structure." + reagent_state = LIQUID + color = "#535E66" // rgb: 83, 94, 102 + +/datum/reagent/xenomicrobes/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + src = null + if( (prob(10) && method==TOUCH) || method==INGEST) + M.contract_disease(new /datum/disease/xeno_transformation(0),1) +*/ + +/datum/reagent/spore + name = "Blob Spores" + id = "spore" + description = "Spores of some blob creature thingy." + reagent_state = LIQUID + color = "#CE760A" // rgb: 206, 118, 10 + var/client/blob_client = null + var/blob_point_rate = 3 + +/datum/reagent/spore/on_mob_life(var/mob/living/M) + if(!M) M = holder.my_atom + if (holder.has_reagent("atrazine",45)) + holder.del_reagent("spore") + if (prob(1)) + M << "\red Your mouth tastes funny." + if (prob(1) && prob(25)) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(directory[ckey(C.key)]) + blob_client = directory[ckey(C.key)] + C.gib() + if(blob_client) + var/obj/effect/blob/core/core = new(get_turf(C), 200, blob_client, blob_point_rate) + if(core.overmind && core.overmind.mind) + core.overmind.mind.name = C.name + + return + +/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(var/mob/living/M, var/method=TOUCH, var/volume) + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + if(istype(M, /mob/living/carbon/human)) + 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 ) + victim << "\red Your [safe_thing] protects you from the pepperspray!" + return + else if ( mouth_covered ) // Reduced effects if partially protected + victim << "\red 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 + victim << "\red 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") + victim << "\red 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(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(prob(5)) + M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]") + ..() + return + +/datum/reagent/frostoil + name = "Frost Oil" + id = "frostoil" + description = "A special oil that noticably chills the body. Extraced from Icepeppers." + reagent_state = LIQUID + color = "#B31008" // rgb: 139, 166, 233 + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/frostoil/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!data) data = 1 + switch(data) + if(1 to 15) + M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT + if(holder.has_reagent("capsaicin")) + holder.remove_reagent("capsaicin", 5) + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature -= rand(5,20) + if(15 to 25) + M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature -= rand(10,20) + if(25 to INFINITY) + M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT + if(prob(1)) + M.emote("shiver") + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature -= rand(15,20) + data++ + holder.remove_reagent(src.id, FOOD_METABOLISM) + ..() + return + +/datum/reagent/frostoil/reaction_turf(var/turf/simulated/T, var/volume) + for(var/mob/living/carbon/slime/M in T) + M.adjustToxLoss(rand(15,30)) diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm new file mode 100644 index 00000000000..a94ab397cd8 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -0,0 +1,348 @@ +/* +// Frankly, this is just for chemicals that are sortof 'watery', which really didn't seem to fit under any other file +// Current chems: Water, Space Lube, Space Cleaner, Blood, Fish Water, Holy water +// +// +*/ + + + +/datum/reagent/water + name = "Water" + id = "water" + description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." + reagent_state = LIQUID + color = "#0064C8" // rgb: 0, 100, 200 + var/cooling_temperature = 2 + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/water/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(!istype(M, /mob/living)) + return + +// Put out fire + if(method == TOUCH) + M.adjust_fire_stacks(-(volume / 10)) + if(M.fire_stacks <= 0) + M.ExtinguishMob() + return + +/datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume) + if (!istype(T)) return + src = null + if(volume >= 3) + if(T.wet >= 1) return + T.wet = 1 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") + T.overlays += T.wet_overlay + + spawn(800) + if (!istype(T)) return + if(T.wet >= 2) return + T.wet = 0 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + + for(var/mob/living/carbon/slime/M in T) + M.apply_water() + + var/hotspot = (locate(/obj/effect/hotspot) in T) + if(hotspot && !istype(T, /turf/space)) + 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) + return + +/datum/reagent/water/reaction_obj(var/obj/O, var/volume) + src = null + var/turf/T = get_turf(O) + var/hotspot = (locate(/obj/effect/hotspot) in T) + if(hotspot && !istype(T, /turf/space)) + 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) + if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) + var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O + if(!cube.wrapped) + cube.Expand() + // Dehydrated carp + if(istype(O,/obj/item/toy/carpplushie/dehy_carp)) + var/obj/item/toy/carpplushie/dehy_carp/dehy = O + dehy.Swell() // Makes a carp + return + + +/datum/reagent/lube + name = "Space Lube" + id = "lube" + description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." + reagent_state = LIQUID + color = "#1BB1AB" + +/datum/reagent/lube/reaction_turf(var/turf/simulated/T, var/volume) + if (!istype(T)) return + src = null + if(volume >= 1) + if(T.wet >= 2) return + T.wet = 2 + spawn(800) + if (!istype(T)) return + T.wet = 0 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + return + + +/datum/reagent/space_cleaner + name = "Space cleaner" + id = "cleaner" + description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" + reagent_state = LIQUID + color = "#61C2C2" + +/datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume) + if(istype(O,/obj/effect/decal/cleanable)) + qdel(O) + else + if(O) + O.clean_blood() + +/datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume) + if(volume >= 1) + T.overlays.Cut() + T.clean_blood() + for(var/obj/effect/decal/cleanable/C in src) + qdel(C) + + for(var/mob/living/carbon/slime/M in T) + M.adjustToxLoss(rand(5,10)) + +/datum/reagent/space_cleaner/reaction_turf(var/turf/simulated/S, var/volume) + if(volume >= 1) + S.dirt = 0 + +/datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(H.lip_style) + H.lip_style = null + H.update_body() + if(C.r_hand) + C.r_hand.clean_blood() + if(C.l_hand) + C.l_hand.clean_blood() + if(C.wear_mask) + if(C.wear_mask.clean_blood()) + C.update_inv_wear_mask(0) + if(ishuman(M)) + var/mob/living/carbon/human/H = C + if(H.head) + if(H.head.clean_blood()) + H.update_inv_head(0,0) + if(H.wear_suit) + if(H.wear_suit.clean_blood()) + H.update_inv_wear_suit(0,0) + else if(H.w_uniform) + if(H.w_uniform.clean_blood()) + H.update_inv_w_uniform(0,0) + if(H.shoes) + if(H.shoes.clean_blood()) + H.update_inv_shoes(0,0) + M.clean_blood() + ..() + return + + +/datum/reagent/blood + data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"blood_colour"= "#A10808","resistances"=null,"trace_chem"=null, "antibodies" = null) + name = "Blood" + id = "blood" + reagent_state = LIQUID + color = "#C80000" // rgb: 200, 0, 0 + +/datum/reagent/blood/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + var/datum/reagent/blood/self = src + src = null + if(self.data && self.data["virus2"] && istype(M, /mob/living/carbon))//infecting... + var/list/vlist = self.data["virus2"] + if (vlist.len) + for (var/ID in vlist) + var/datum/disease2/disease/V = vlist[ID] + + if(method == TOUCH) + infect_virus2(M,V.getcopy()) + else + infect_virus2(M,V.getcopy(),1) //injected, force infection! + if(self.data && self.data["antibodies"] && istype(M, /mob/living/carbon))//... and curing + var/mob/living/carbon/C = M + C.antibodies |= self.data["antibodies"] + +/datum/reagent/blood/on_merge(var/data) + if(data["blood_colour"]) + color = data["blood_colour"] + return ..() + +/datum/reagent/blood/on_update(var/atom/A) + if(data["blood_colour"]) + color = data["blood_colour"] + return ..() + + + +/datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume)//splash the blood all over the place + if(!istype(T)) return + var/datum/reagent/blood/self = src + src = null + if(!(volume >= 3)) return + //var/datum/disease/D = self.data["virus"] + if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human)) + var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here + if(!blood_prop) //first blood! + blood_prop = new(T) + blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"] + + if(self.data["virus2"]) + blood_prop.virus2 = virus_copylist(self.data["virus2"]) + + else if(istype(self.data["donor"], /mob/living/carbon/alien)) + var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T + if(!blood_prop) + blood_prop = new(T) + blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" + return + + +/datum/reagent/fishwater + name = "Fish Water" + id = "fishwater" + description = "Smelly water from a fish tank. Gross!" + reagent_state = LIQUID + color = "#757547" + +/datum/reagent/fishwater/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + if(!istype(M, /mob/living)) + return + if(method == INGEST) + M << "Oh god, why did you drink that?" + +/datum/reagent/fishwater/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(prob(30)) // Nasty, you drank this stuff? 30% chance of the fakevomit (non-stunning version) + if(prob(50)) // 50/50 chance of green vomit vs normal vomit + M.fakevomit(1) + else + M.fakevomit(0) + ..() + return + + +/datum/reagent/holywater + name = "Water" + id = "holywater" + description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." + reagent_state = LIQUID + color = "#0064C8" // rgb: 0, 100, 200 + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/holywater/on_mob_life(var/mob/living/M as mob) + if(!data) data = 1 + data++ + M.jitteriness = max(M.jitteriness-5,0) + if(data >= 30) // 12 units, 60 seconds @ metabolism 0.4 units & tick rate 2.0 sec + if (!M.stuttering) M.stuttering = 1 + M.stuttering += 4 + 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(data >= 75 && prob(33)) // 30 units, 150 seconds + if (!M.confused) M.confused = 1 + M.confused += 3 + if(iscultist(M)) + ticker.mode.remove_cultist(M.mind) + holder.remove_reagent(src.id, src.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 + if(ishuman(M)) . + if(((M.mind in ticker.mode.vampires) || M.mind.vampire) && (!(VAMP_FULL in M.mind.vampire.powers)) && prob(80)) + switch(data) + if(1 to 4) + M << "Something sizzles in your veins!" + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) + if(5 to 12) + M << "You feel an intense burning inside of you!" + M.adjustFireLoss(1) + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) + if(13 to INFINITY) + M << "You suddenly ignite in a holy fire!" + for(var/mob/O in viewers(M, null)) + O.show_message(text("[] suddenly bursts into flames!", M), 1) + 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.adjustFireLoss(3) //Hence the other damages... ain't I a bastard? + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) + ..() + return + + +/datum/reagent/holywater/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + // Vampires have their powers weakened by holy water applied to the skin. + if(ishuman(M)) + if((M.mind in ticker.mode.vampires) && !(VAMP_FULL in M.mind.vampire.powers)) + var/mob/living/carbon/human/H=M + if(method == TOUCH) + if(H.wear_mask) + H << "\red Your mask protects you from the holy water!" + return + else if(H.head) + H << "\red Your helmet protects you from the holy water!" + return + else + M << "Something holy interferes with your powers!" + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) + return + + +/datum/reagent/holywater/reaction_turf(var/turf/simulated/T, var/volume) + ..() + if(!istype(T)) return + if(volume>=10) + for(var/obj/effect/rune/R in T) + qdel(R) + T.Bless() + +/* +/datum/reagent/vaccine + //data must contain virus type + name = "Vaccine" + id = "vaccine" + reagent_state = LIQUID + color = "#C81040" // rgb: 200, 16, 64 + +/datum/reagent/vaccine/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + var/datum/reagent/vaccine/self = src + src = null + if(self.data&&method == INGEST) + for(var/datum/disease/D in M.viruses) + if(istype(D, /datum/disease/advance)) + var/datum/disease/advance/A = D + if(A.GetDiseaseID() == self.data) + D.cure() + else + if(D.type == self.data) + D.cure() + + M.resistances += self.data + return +*/ \ No newline at end of file diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index cd306a78e49..6c3b0db41e0 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -12,60 +12,60 @@ var/amount_per_transfer_from_this = 10 var/possible_transfer_amounts = list(10,25,50,100) - attackby(obj/item/weapon/W as obj, mob/user as mob, params) +/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + return + +/obj/structure/reagent_dispensers/New() + var/datum/reagents/R = new/datum/reagents(1000) + reagents = R + R.my_atom = src + if (!possible_transfer_amounts) + src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT + ..() + +/obj/structure/reagent_dispensers/examine() + set src in view() + ..() + if (!(usr in view(2)) && usr!=src.loc) return + usr << "\blue It contains:" + if(reagents && reagents.reagent_list.len) + for(var/datum/reagent/R in reagents.reagent_list) + usr << "\blue [R.volume] units of [R.name]" + else + usr << "\blue Nothing." + +/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this + set name = "Set transfer amount" + set category = "Object" + set src in view(1) + if(usr.stat || !usr.canmove || usr.restrained()) return + var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts + if (N) + amount_per_transfer_from_this = N - New() - var/datum/reagents/R = new/datum/reagents(1000) - reagents = R - R.my_atom = src - if (!possible_transfer_amounts) - src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT - ..() - - examine() - set src in view() - ..() - if (!(usr in view(2)) && usr!=src.loc) return - usr << "\blue It contains:" - if(reagents && reagents.reagent_list.len) - for(var/datum/reagent/R in reagents.reagent_list) - usr << "\blue [R.volume] units of [R.name]" - else - usr << "\blue Nothing." - - verb/set_APTFT() //set amount_per_transfer_from_this - set name = "Set transfer amount" - set category = "Object" - set src in view(1) - if(usr.stat || !usr.canmove || usr.restrained()) +/obj/structure/reagent_dispensers/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) return - var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts - if (N) - amount_per_transfer_from_this = N - - ex_act(severity) - switch(severity) - if(1.0) + if(2.0) + if (prob(50)) + new /obj/effect/effect/water(src.loc) qdel(src) return - if(2.0) - if (prob(50)) - new /obj/effect/effect/water(src.loc) - qdel(src) - return - if(3.0) - if (prob(5)) - new /obj/effect/effect/water(src.loc) - qdel(src) - return - else - return + if(3.0) + if (prob(5)) + new /obj/effect/effect/water(src.loc) + qdel(src) + return + else + return - blob_act() - if(prob(50)) - new /obj/effect/effect/water(src.loc) - qdel(src) +/obj/structure/reagent_dispensers/blob_act() + if(prob(50)) + new /obj/effect/effect/water(src.loc) + qdel(src) @@ -80,9 +80,11 @@ icon = 'icons/obj/objects.dmi' icon_state = "watertank" amount_per_transfer_from_this = 10 - New() - ..() - reagents.add_reagent("water",1000) + +/obj/structure/reagent_dispensers/watertank/New() + ..() + reagents.add_reagent("water",1000) + /obj/structure/reagent_dispensers/fueltank name = "fueltank" @@ -91,22 +93,23 @@ icon_state = "weldtank" amount_per_transfer_from_this = 10 var/obj/item/device/assembly_holder/rig = null - New() - ..() - reagents.add_reagent("fuel",1000) - bullet_act(var/obj/item/projectile/Proj) - if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) - if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) - message_admins("[key_name_admin(Proj.firer)] triggered a fueltank explosion.") - log_game("[key_name(Proj.firer)] triggered a fueltank explosion.") - explode() +/obj/structure/reagent_dispensers/fueltank/New() + ..() + reagents.add_reagent("fuel",1000) - blob_act() - explosion(src.loc,0,1,5,7,10, flame_range = 5) +/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) + if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) + if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) + message_admins("[key_name_admin(Proj.firer)] triggered a fueltank explosion.") + log_game("[key_name(Proj.firer)] triggered a fueltank explosion.") + explode() - ex_act() - explode() +/obj/structure/reagent_dispensers/fueltank/blob_act() + explosion(src.loc,0,1,5,7,10, flame_range = 5) + +/obj/structure/reagent_dispensers/fueltank/ex_act() + explode() /obj/structure/reagent_dispensers/fueltank/examine() set src in view() @@ -180,6 +183,7 @@ if(rig) rig.process_movement() + /obj/structure/reagent_dispensers/peppertank name = "Pepper Spray Refiller" desc = "Refill pepper spray canisters." @@ -188,9 +192,10 @@ anchored = 1 density = 0 amount_per_transfer_from_this = 45 - New() - ..() - reagents.add_reagent("condensedcapsaicin",1000) + +/obj/structure/reagent_dispensers/peppertank/New() + ..() + reagents.add_reagent("condensedcapsaicin",1000) /obj/structure/reagent_dispensers/water_cooler @@ -201,9 +206,10 @@ icon_state = "water_cooler" possible_transfer_amounts = null anchored = 1 - New() - ..() - reagents.add_reagent("water",500) + +/obj/structure/reagent_dispensers/water_cooler/New() + ..() + reagents.add_reagent("water",500) /obj/structure/reagent_dispensers/beerkeg @@ -212,9 +218,10 @@ icon = 'icons/obj/objects.dmi' icon_state = "beertankTEMP" amount_per_transfer_from_this = 10 - New() - ..() - reagents.add_reagent("beer",1000) + +/obj/structure/reagent_dispensers/beerkeg/New() + ..() + reagents.add_reagent("beer",1000) /obj/structure/reagent_dispensers/beerkeg/blob_act() explosion(src.loc,0,3,5,7,10) @@ -229,9 +236,9 @@ anchored = 1 density = 0 - New() - ..() - reagents.add_reagent("virusfood", 1000) +/obj/structure/reagent_dispensers/virusfood/New() + ..() + reagents.add_reagent("virusfood", 1000) /obj/structure/reagent_dispensers/spacecleanertank name = "space cleaner refiller" @@ -241,6 +248,7 @@ anchored = 1 density = 0 amount_per_transfer_from_this = 250 - New() - ..() - reagents.add_reagent("cleaner",5000) + +/obj/structure/reagent_dispensers/spacecleanertank/New() + ..() + reagents.add_reagent("cleaner",5000) diff --git a/paradise.dme b/paradise.dme index b8184ad6713..6b0e84f845d 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1624,8 +1624,6 @@ #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\Chemistry-Reagents.dm" -#include "code\modules\reagents\Chemistry-Recipes.dm" #include "code\modules\reagents\dartgun.dm" #include "code\modules\reagents\grenade_launcher.dm" #include "code\modules\reagents\reagent_containers.dm" @@ -1642,6 +1640,27 @@ #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_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\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" From e30ae7dbc33592f4519bd92f38bea74e4dc8a946 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 6 Sep 2015 21:04:51 -0700 Subject: [PATCH 12/15] Whoops, tabbing. --- .../chemical_reaction_misc.dm | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm index 020caed47ee..f884ef6cb63 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm @@ -141,17 +141,17 @@ return */ - plastication - name = "Plastic" - id = "solidplastic" - result = null - required_reagents = list("facid" = 10, "plasticide" = 20) - result_amount = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/mineral/plastic - M.amount = 10 - M.loc = get_turf(holder.my_atom) - return + plastication + name = "Plastic" + id = "solidplastic" + result = null + required_reagents = list("facid" = 10, "plasticide" = 20) + result_amount = 1 + on_reaction(var/datum/reagents/holder) + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/mineral/plastic + M.amount = 10 + M.loc = get_turf(holder.my_atom) + return From fc82cc69760d395ad7fa1ce639f1539a8434fe2a Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 7 Sep 2015 13:52:37 -0400 Subject: [PATCH 13/15] typo --- code/modules/reagents/newchem/medicine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index add5d264d4f..a54072e9bbb 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -828,7 +828,7 @@ datum/reagent/stimulants/reagent_deleted(var/mob/living/M as mob) /datum/reagent/medicine/stimulative_agent name = "Stimulative Agent" id = "stimulative_agent" - description = "An illegal compound that darmatically enhances the body's performance and healing capabilities." + description = "An illegal compound that dramatically enhances the body's performance and healing capabilities." color = "#C8A5DC" metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 60 From a8f41c69fb11e0103f62da678692ef359bdb303e Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 7 Sep 2015 16:55:40 -0400 Subject: [PATCH 14/15] sprite-revert --- code/modules/recycling/sortingmachinery.dm | 2 +- icons/obj/device.dmi | Bin 31998 -> 31660 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 11ca778f6c0..07c245d889d 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -190,7 +190,7 @@ /obj/item/device/destTagger name = "destination tagger" desc = "Used to set the destination of properly wrapped packages." - icon_state = "cargotagger" + icon_state = "dest_tagger" var/currTag = 0 //The whole system for the sorttype var is determined based on the order of this list, //disposals must always be 1, since anything that's untagged will automatically go to disposals, or sorttype = 1 --Superxpdude diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 471cad514e521e68f9b7156e4b38d776bb878843..6ee1fbd0fd3bf2a22465f0618cbf48da81437556 100644 GIT binary patch delta 10618 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 Date: Mon, 7 Sep 2015 14:16:59 -0700 Subject: [PATCH 15/15] fix sock sql --- code/modules/client/preferences_mysql.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index df57e988e1b..8470ece80a9 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -273,8 +273,8 @@ organ_data='[organlist]', rlimb_data='[rlimblist]', nanotrasen_relation='[nanotrasen_relation]', - speciesprefs='[speciesprefs]' - socks='[socks]', + speciesprefs='[speciesprefs]', + socks='[socks]' WHERE ckey='[C.ckey]' AND slot='[default_slot]'"} )