diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 1c3e24152da..d5f47e7827e 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -529,6 +529,10 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline, /obj/item/weapon/reagent_containers/glass/bottle/stoxin, /obj/item/weapon/reagent_containers/glass/bottle/stoxin, + /obj/item/weapon/reagent_containers/glass/bottle/morphine, + /obj/item/weapon/reagent_containers/glass/bottle/morphine, + /obj/item/weapon/reagent_containers/glass/bottle/morphine, + /obj/item/weapon/reagent_containers/glass/bottle/morphine, /obj/item/weapon/reagent_containers/glass/bottle/toxin, /obj/item/weapon/reagent_containers/glass/bottle/toxin, /obj/item/weapon/reagent_containers/glass/beaker/large, diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 781f3ff9009..c1ab434fd07 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -313,6 +313,13 @@ var/list/uplink_items = list() cost = 1 surplus = 50 +/datum/uplink_item/stealthy_weapons/traitor_chem_bottle + name = "Poison Kit" + desc = "An assortment of nasty chemicals." + item = /obj/item/weapon/storage/box/syndie_kit/chemical + cost = 2 + surplus = 50 + /datum/uplink_item/stealthy_weapons/detomatix name = "Detomatix PDA Cartridge" desc = "When inserted into a personal digital assistant, this cartridge gives you five opportunities to detonate PDAs of crewmembers who have their message feature enabled. \ diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 9fcfad2d30f..01a96fbf6c6 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -108,12 +108,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/type_butt = /obj/item/weapon/cigbutt var/lastHolder = null var/smoketime = 300 - var/chem_volume = 15 + var/chem_volume = 30 /obj/item/clothing/mask/cigarette/New() ..() flags |= NOREACT // so it doesn't react until you light it create_reagents(chem_volume) // making the cigarette a chemical holder with a maximum volume of 15 + reagents.add_reagent("nicotine", 15) /obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 95318319f48..e3ed3af1d42 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -161,4 +161,17 @@ new /obj/item/weapon/grenade/empgrenade(src) new /obj/item/weapon/implanter/emp/(src) new /obj/item/device/flashlight/emp/(src) + return + +/obj/item/weapon/storage/box/syndie_kit/chemical + name = "boxed chemical kit" + +/obj/item/weapon/storage/box/syndie_kit/chemical/New() + ..() + new /obj/item/weapon/reagent_containers/glass/bottle/polonium(src) + new /obj/item/weapon/reagent_containers/glass/bottle/venom(src) + new /obj/item/weapon/reagent_containers/glass/bottle/neurotoxin2(src) + new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src) + new /obj/item/weapon/reagent_containers/glass/bottle/cyanide(src) + new /obj/item/weapon/reagent_containers/glass/bottle/histamine(src) return \ No newline at end of file diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 775656ead7d..91a1cc97a96 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -130,7 +130,6 @@ user << "You need a tighter grip." - /obj/machinery/shower name = "shower" desc = "The HS-451. Installed in the 2550s by the Nanotrasen Hygiene Division." diff --git a/code/modules/food&drinks/food/snacks_other.dm b/code/modules/food&drinks/food/snacks_other.dm index df65352f4dc..ce6a4650934 100644 --- a/code/modules/food&drinks/food/snacks_other.dm +++ b/code/modules/food&drinks/food/snacks_other.dm @@ -128,8 +128,7 @@ /obj/item/weapon/reagent_containers/food/snacks/badrecipe/New() ..() eatverb = pick("choke down","nibble","gnaw","chomp") - reagents.add_reagent("toxin", 1) - reagents.add_reagent("carbon", 3) + reagents.add_reagent("????", 30) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff @@ -254,4 +253,4 @@ ..() reagents.add_reagent("nutriment", 4) reagents.add_reagent("sugar", 2) - reagents.add_reagent("coco", 2) \ No newline at end of file + reagents.add_reagent("coco", 2) diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm new file mode 100644 index 00000000000..3a8a0e7f449 --- /dev/null +++ b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm @@ -0,0 +1,100 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +#define REM REAGENTS_EFFECT_MULTIPLIER + +datum/reagent/nicotine + name = "Nicotine" + id = "nicotine" + description = "Stun reduction per cycle, slight stamina regeneration buff. Overdoses become rapidly deadly." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + +datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.") + if(prob(5)) + M << "[smoke_message]" + M.AdjustStunned(-1) + M.adjustStaminaLoss(-1*REM) + if(volume > 35) + M << "You feel like you smoked too much." + M.adjustToxLoss(2*REM) + M.adjustOxyLoss(2*REM) + ..() + return + +datum/reagent/crank + name = "Crank" + id = "crank" + description = "2x stun reduction per cycle. Warms you up, makes you jittery as hell." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + +datum/reagent/crank/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.") + if(prob(5)) + M << "[high_message]" + M.AdjustParalysis(-2) + M.AdjustStunned(-2) + M.AdjustWeakened(-2) + if(volume > 20) + M.adjustBrainLoss(rand(1,10)*REM) + M.adjustToxLoss(rand(1,10)*REM) + M.adjustBruteLoss(rand(1,10)*REM) + ..() + return + +/datum/chemical_reaction/crank + name = "Crank" + id = "crank" + result = "crank" + required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1) + result_amount = 5 + mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." + required_temp = 390 + +/datum/reagent/krokodil + name = "Krokodil" + id = "krokodil" + description = "Cools and calms you down, occasional BRAIN and TOX damage." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + var/cycle_count = 0 + var/overdosed + + +/datum/reagent/krokodil/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.") + if(prob(5)) + M << "[high_message]" + if(prob(10)) + M.adjustBrainLoss(rand(1,5)*REM) + M.adjustToxLoss(rand(1,5)*REM) + if(cycle_count == 10) + M.adjustBrainLoss(rand(1,10)*REM) + M.adjustToxLoss(rand(1,10)*REM) + if(cycle_count == 20) + M << "Your skin feels loose..." + if(cycle_count == 50) + M << "Your skin falls off!" + M.adjustBruteLoss(rand(10,30)*REM) + hardset_dna(M, null, null, null, null, /datum/species/skeleton) + if(volume > 20) + overdosed = 1 + if(overdosed) + cycle_count++ + ..() + return + +/datum/chemical_reaction/krokodil + name = "Krokodil" + id = "krokodil" + result = "krokodil" + required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorous" = 1, "fuel" = 1) + result_amount = 6 + mix_message = "The mixture dries into a pale blue powder." + required_temp = 380 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm new file mode 100644 index 00000000000..4c83e5a1187 --- /dev/null +++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm @@ -0,0 +1,381 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +#define REM REAGENTS_EFFECT_MULTIPLIER + +datum/reagent/silver_sulfadiazine + name = "Silver Sulfadiazine" + id = "silver_sulfadiazine" + description = "100% chance per cycle of healing 2 points of BURN damage." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + metabolization_rate = 2 + +datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.adjustFireLoss((volume-(volume*2))*REM) + M << "You feel your burns healing!" + M.emote("scream") + if(method == INGEST) + M.adjustToxLoss(0.5*volume) + M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" + ..() + return + +datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(prob(55)) + M.adjustFireLoss(-2*REM) + ..() + return + +datum/reagent/styptic_powder + name = "Styptic Powder" + id = "styptic_powder" + description = "100% chance per cycle of healing 2 points of BRUTE damage." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + metabolization_rate = 2 + +datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.heal_organ_damage(volume*REM,0) + M << "You feel your wounds knitting back together!" + M.emote("scream") + if(method == INGEST) + M.adjustToxLoss(0.5*volume) + M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" + ..() + return + +datum/reagent/styptic_powder/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(prob(55)) + M.adjustBruteLoss(-2*REM) + ..() + return + +datum/reagent/salglu_solution + name = "Saline-Glucose Solution" + id = "salglu_solution" + description = "100% chance per cycle of healing 1 point each of OXY and TOX damage." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob) + if(M.stat == DEAD) + return + if(!M) M = holder.my_atom + if(M.getOxyLoss()) M.adjustOxyLoss(-1*REM) + if(M.getToxLoss()) M.adjustToxLoss(-1*REM) + ..() + return + +datum/reagent/synthflesh + name = "Synthflesh" + id = "synthflesh" + description = "100% chance per cycle of healing 1 point each of BRUTE and BURN damage." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(!M) M = holder.my_atom + if(method == TOUCH) + M.heal_organ_damage(volume*REM,0) + M.adjustFireLoss((volume-(volume*2)*REM)) + M << "You feel your burns healing and your flesh knitting together!" + ..() + return + +datum/reagent/charcoal + name = "Charcoal" + id = "charcoal" + description = "Heals 2 TOX damage per cycle." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(-1.5*REM) + for(var/datum/reagent/R in M.reagents) + if(M != src) + M.reagents.remove_reagent(R.id,0.5) + ..() + return + +/datum/chemical_reaction/charcoal + name = "Charcoal" + id = "charcoal" + result = "charcoal" + required_reagents = list("ash" = 1, "sodiumchloride" = 1) + result_amount = 2 + mix_message = "The mixture yields a fine black powder." + required_temp = 380 + +/datum/chemical_reaction/silver_sulfadiazine + name = "Silver Sulfadiazine" + id = "silver_sulfadiazine" + result = "silver_sulfadiazine" + required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1) + result_amount = 5 + +/datum/chemical_reaction/salglu_solution + name = "Saline-Glucose Solution" + id = "salglu_solution" + result = "salglu_solution" + required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1) + result_amount = 3 + +/datum/chemical_reaction/synthflesh + name = "Synthflesh" + id = "synthflesh" + result = "synthflesh" + required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1) + result_amount = 3 + +/datum/chemical_reaction/styptic_powder + name = "Styptic Powder" + id = "styptic_powder" + result = "styptic_powder" + required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1) + result_amount = 4 + mix_message = "The solution yields an astringent powder." + +datum/reagent/omnizine + name = "Omnizine" + id = "omnizine" + description = "Heals one each of OXY, TOX, BRUTE and BURN per cycle." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + metabolization_rate = 0.2 + +datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(-1*REM) + M.adjustOxyLoss(-1*REM) + M.adjustBruteLoss(-1*REM) + M.adjustFireLoss(-1*REM) + ..() + return + +datum/reagent/calomel + name = "Calomel" + id = "calomel" + description = "Increases all depletion rates by 5. +5 TOX damage while health > 20." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/calomel/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + for(var/datum/reagent/R in M.reagents) + if(M != src) + M.reagents.remove_reagent(R.id,5) + if(M.health > 20) + M.adjustToxLoss(5*REM) + ..() + return + +/datum/chemical_reaction/calomel + name = "Calomel" + id = "calomel" + result = "calomel" + required_reagents = list("mercury" = 1, "chlorine" = 1) + result_amount = 2 + required_temp = 374 + +datum/reagent/potass_iodide + name = "Potassium Iodide" + id = "potass_iodide" + description = "80% chance of removing 1 RAD. Radiation is cumulative and causes tox+burn." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.radiation > 0) + if(prob(80)) + M.radiation-- + if(M.radiation < 0) + M.radiation = 0 + ..() + return + +/datum/chemical_reaction/potass_iodide + name = "Potassium Iodide" + id = "potass_iodide" + result = "potass_iodide" + required_reagents = list("potassium" = 1, "iodine" = 1) + result_amount = 2 + +datum/reagent/pen_acid + name = "Pentetic Acid" + id = "pen_acid" + description = "Reduces 7 RAD, heals 4 TOX damage, increases all depletion rates by 4. 33% chance of taking 1 unit brute damage" + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.radiation > 0) + M.radiation -= 7 + M.adjustToxLoss(-4*REM) + if(prob(33)) + M.adjustBruteLoss(1*REM) + if(M.radiation < 0) + M.radiation = 0 + for(var/datum/reagent/R in M.reagents) + if(M != src) + M.reagents.remove_reagent(R.id,4) + ..() + return + +/datum/chemical_reaction/pen_acid + name = "Pentetic Acid" + id = "pen_acid" + result = "pen_acid" + required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1) + result_amount = 6 + +datum/reagent/sal_acid + name = "Salicyclic Acid" + id = "sal_acid" + description = "If BRUTE damage is under 50, 50% chance to heal one unit." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.getBruteLoss() < 50) + if(prob(50)) + M.adjustBruteLoss(-1*REM) + ..() + return + +/datum/chemical_reaction/sal_acid + name = "Salicyclic Acid" + id = "sal_acid" + result = "sal_acid" + required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) + result_amount = 5 + +datum/reagent/salbutamol + name = "Salbutamol" + id = "salbutamol" + description = "Heals 6 OXY damage, reduces LOSEBREATH by 4." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + metabolization_rate = 0.2 + +datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustOxyLoss(-6*REM) + if(M.losebreath >= 4) + M.losebreath -= 4 + ..() + return + +/datum/chemical_reaction/salbutamol + name = "Salbutamol" + id = "salbutamol" + result = "salbutamol" + required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1) + result_amount = 5 + +datum/reagent/perfluorodecalin + name = "Perfluorodecalin" + id = "perfluorodecalin" + description = "Heals 25 OXY damage, but you can't talk. 33% chance of healing 1 BRUTE and 1 BURN." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + metabolization_rate = 0.2 + +datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) + if(!M) M = holder.my_atom + M.adjustOxyLoss(-25*REM) + M.silent = max(M.silent, 5) + if(prob(33)) + M.adjustBruteLoss(-1*REM) + M.adjustFireLoss(-1*REM) + ..() + return + +/datum/chemical_reaction/perfluorodecalin + name = "Perfluorodecalin" + id = "perfluorodecalin" + result = "perfluorodecalin" + required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1) + result_amount = 3 + required_temp = 370 + mix_message = "The mixture rapidly turns into a dense pink liquid." + +datum/reagent/ephedrine + name = "Ephedrine" + id = "ephedrine" + description = "Stun reduction per cycle, increases run speed slightly, minor stamina regeneration buff, stabilizes crit." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + metabolization_rate = 0.3 + +datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.status_flags |= GOTTAGOFAST + if(M.losebreath >= 10) + M.losebreath = max(10, M.losebreath-5) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + M.adjustStaminaLoss(-1*REM) + ..() + return + +/datum/chemical_reaction/ephedrine + name = "Ephedrine" + id = "ephedrine" + result = "ephedrine" + required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1) + result_amount = 4 + mix_message = "The solution fizzes and gives off toxic fumes." + +datum/reagent/diphenhydramine + name = "Diphenhydramine" + id = "diphenhydramine" + description = "Causes a little bit of drowsiness, reduces jitteriness. Raises histamine depletion rates by 3" + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 +datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.drowsyness += 1 + M.jitteriness -= 1 + M.reagents.remove_reagent("histamine",3) + ..() + return + +/datum/chemical_reaction/diphenhydramine + name = "Diphenhydramine" + id = "diphenhydramine" + result = "diphenhydramine" + required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1) + result_amount = 4 + mix_message = "The mixture dries into a pale blue powder." + +datum/reagent/morphine + name = "Morphine" + id = "morphine" + description = "Dramatically counters movement reduction from severe injury. Reduces jitteriness if someone is shaking like crazy from whatever. Will knock you out within 36 cycles if any remains in you." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + var/cycle_count = 0 + +datum/reagent/morphine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.status_flags |= GOTTAGOFAST + if(cycle_count == 36) + M.sleeping += 1 + if(volume > 20) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + cycle_count++ + ..() + return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Other.dm b/code/modules/reagents/Chemistry-Goon-Other.dm new file mode 100644 index 00000000000..33752902ea8 --- /dev/null +++ b/code/modules/reagents/Chemistry-Goon-Other.dm @@ -0,0 +1,104 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +#define REM REAGENTS_EFFECT_MULTIPLIER + +datum/reagent/oil + name = "Oil" + id = "oil" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/stable_plasma + name = "Stable Plasma" + id = "stable_plasma" + description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/iodine + name = "Iodine" + id = "iodine" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/fluorine + name = "Fluorine" + id = "fluorine" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/carpet + name = "Carpet" + id = "carpet" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/bromine + name = "Bromine" + id = "bromine" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/phenol + name = "Phenol" + id = "phenol" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/ash + name = "Ash" + id = "ash" + description = "A burnt solution." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/acetone + name = "Acetone" + id = "acetone" + description = "A solution." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +/datum/chemical_reaction/acetone + name = "acetone" + id = "acetone" + result = "acetone" + required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1) + result_amount = 3 + +/datum/chemical_reaction/carpet + name = "carpet" + id = "carpet" + result = "carpet" + required_reagents = list("space_drugs" = 1, "blood" = 1) + result_amount = 2 + +/datum/chemical_reaction/oil + name = "Oil" + id = "oil" + result = "oil" + required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/phenol + name = "phenol" + id = "phenol" + result = "phenol" + required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1) + result_amount = 3 + +/datum/chemical_reaction/ash + name = "Ash" + id = "ash" + result = "ash" + required_reagents = list("oil" = 1) + result_amount = 1 + required_temp = 480 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm new file mode 100644 index 00000000000..6edcc664817 --- /dev/null +++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm @@ -0,0 +1,119 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +#define REM REAGENTS_EFFECT_MULTIPLIER + +/datum/reagent/clf3 + name = "Chlorine Trifluoride" + id = "clf3" + description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + + +/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + ..() + return + +/datum/chemical_reaction/clf3 + name = "Chlorine Trifluoride" + id = "clf3" + result = "clf3" + required_reagents = list("chlorine" = 1, "fluorine" = 3) + result_amount = 4 + required_temp = 424 + +/datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume) + var/turf/simulated/T = get_turf(holder.my_atom) + for(var/turf/simulated/turf in orange(1,T)) + new /obj/effect/hotspot(turf) + return + +/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume) + if(istype(T, /turf/simulated/floor/)) + var/turf/simulated/floor/F = T + if(prob(66)) + F.make_plating() + if(prob(11)) + F.ChangeTurf(/turf/space) + return + +/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(20) + return + +/datum/reagent/sorium + name = "Sorium" + id = "sorium" + description = "Sends everything flying from the detonation point." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + +/datum/chemical_reaction/sorium + name = "Sorium" + id = "sorium" + result = "sorium" + required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1) + result_amount = 4 + required_temp = 474 + +/datum/reagent/sorium/reaction_turf(var/turf/simulated/T, var/volume) + if(istype(T, /turf/simulated/floor/)) + goonchem_vortex(T, 1, 5, 3) +/datum/reagent/sorium/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + var/turf/simulated/T = get_turf(M) + goonchem_vortex(T, 1, 5, 3) + + +/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume) + var/turf/simulated/T = get_turf(holder.my_atom) + goonchem_vortex(T, 1, 5, 6) + +/datum/reagent/liquid_dark_matter + name = "Liquid Dark Matter" + id = "liquid_dark_matter" + description = "Sucks everything into the detonation point." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + +/datum/chemical_reaction/liquid_dark_matter + name = "Liquid Dark Matter" + id = "liquid_dark_matter" + result = "liquid_dark_matter" + required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1) + result_amount = 3 + required_temp = 474 + +/datum/reagent/liquid_dark_matter/reaction_turf(var/turf/simulated/T, var/volume) + if(istype(T, /turf/simulated/floor/)) + goonchem_vortex(T, 0, 5, 3) + return +/datum/reagent/liquid_dark_matter/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + var/turf/simulated/T = get_turf(M) + goonchem_vortex(T, 0, 5, 3) + return +/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume) + var/turf/simulated/T = get_turf(holder.my_atom) + goonchem_vortex(T, 0, 5, 6) + return + +proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times) + for(var/atom/movable/X in orange(range, T)) + if(istype(X, /atom/movable)) + if((X)) + if(setting_type) + for(var/i = 0, i < pull_times, i++) + step_towards(X,T) + else + X.throw_at(T) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Readme.dm b/code/modules/reagents/Chemistry-Goon-Readme.dm new file mode 100644 index 00000000000..0731e28ba93 --- /dev/null +++ b/code/modules/reagents/Chemistry-Goon-Readme.dm @@ -0,0 +1,34 @@ +/* + Credit goes to Cogwerks, and all the other goonstation coders + for the original idea and implementation of this over at goonstation. + + THE REQUESTED DON'T PORT LIST: IF YOU PORT THESE THE GOONS WILL MURDER US IN OUR SLEEP SO PLEASE DON'T KTHX - Iamgoofball + Any of the Secret Chems + Goon in-joke chems (Eg. Cat Drugs, Hairgrownium) + Liquid Electricity + Rajajajah + + +/datum/reagent/blankgoonchembase + name = "blank goonchem base" + id = "blankgoonchembase" + description = "A blank chem" + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + + +/datum/reagent/blankgoonchembase/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + ..() + return + +/datum/chemical_reaction/blankgoonchembase + name = "blank goonchem base" + id = "blankgoonchembase" + result = "blankgoonchembase" + required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1) + result_amount = 3 + mix_message = "The mixture dries into a pale blue powder." + required_temp = 420 + +*/ \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm new file mode 100644 index 00000000000..3361df63c77 --- /dev/null +++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm @@ -0,0 +1,159 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +#define REM REAGENTS_EFFECT_MULTIPLIER + +datum/reagent/polonium + name = "Polonium" + id = "polonium" + description = "+8 RAD." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.1 + +datum/reagent/polonium/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.radiation += 8 + ..() + return + + +datum/reagent/histamine + name = "Histamine" + id = "histamine" + description = "Dose-dependent, ranges from annoying to incredibly lethal." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.2 + +datum/reagent/histamine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(volume >= 20) + M.adjustOxyLoss(pick(5,10)*REM) + M.adjustBruteLoss(pick(5,10)*REM) + M.adjustToxLoss(pick(5,10)*REM) + if(volume < 20) + switch(pick(1, 2, 3)) + if(1) + M << "You are unable to look straight!" + M.Dizzy(10) + if(2) + M.emote("cough") + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + if(3) + M.adjustBruteLoss(5*REM) + ..() + return + +datum/reagent/formaldehyde + name = "Formaldehyde" + id = "formaldehyde" + description = "+1 TOX, 10% chance to decay into 5-15 units of histamine." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + +datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(1*REM) + if(prob(10)) + M.reagents.add_reagent("histamine",pick(5,15)) + M.reagents.remove_reagent("formaldehyde",1) + ..() + return + +/datum/chemical_reaction/formaldehyde + name = "formaldehyde" + id = "Formaldehyde" + result = "formaldehyde" + required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1) + result_amount = 3 + required_temp = 420 + +datum/reagent/venom + name = "Venom" + id = "venom" + description = "Scaling TOX and BRUTE damage with dose. 25% chance to decay into 5-10 histamine." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.2 +datum/reagent/venom/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss((0.1*volume)*REM) + M.adjustBruteLoss((0.1*volume)*REM) + if(prob(25)) + M.reagents.add_reagent("histamine",pick(5,10)) + M.reagents.remove_reagent("venom",1) + ..() + return + +datum/reagent/neurotoxin2 + name = "Neurotoxin" + id = "neurotoxin2" + description = "+1 TOX, +1 BRAIN up to 60 before it slows down, confusion, knockout after 17 elapsed cycles." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + var/cycle_count = 0 + metabolization_rate = 1 + +datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob) + cycle_count++ + if(!M) M = holder.my_atom + if(!(M.brainloss + M.toxloss) >= 60) + M.adjustBrainLoss(1*REM) + M.adjustToxLoss(1*REM) + if(cycle_count == 17) + M.sleeping += 1 + ..() + return + +/datum/chemical_reaction/neurotoxin2 + name = "neurotoxin2" + id = "neurotoxin2" + result = "neurotoxin2" + required_reagents = list("space_drugs" = 1) + result_amount = 1 + required_temp = 200 + +datum/reagent/cyanide + name = "Cyanide" + id = "cyanide" + description = "+1.5 TOX, 10% chance of +1 LOSEBREATH, 8% chance of stun and extra +2 TOX." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.1 + +datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(1.5*REM) + if(prob(10)) + M.adjustOxyLoss(1*REM) + if(prob(8)) + M.sleeping += 1 + M.adjustToxLoss(4*REM) + ..() + return + +/datum/chemical_reaction/cyanide + name = "Cyanide" + id = "cyanide" + result = "cyanide" + required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1) + result_amount = 3 + required_temp = 380 + +/datum/reagent/questionmark // food poisoning + name = "Bad Food" + id = "????" + description = "????" + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.2 + +datum/reagent/questionmark/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(1*REM) + ..() + return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 254b10db479..dde04bfbc43 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -10,6 +10,7 @@ datum/reagents var/total_volume = 0 var/maximum_volume = 100 var/atom/my_atom = null + var/chem_temp = 150 datum/reagents/New(maximum=100) maximum_volume = maximum @@ -232,6 +233,7 @@ datum/reagents/proc/handle_reactions() var/matching_container = 0 var/matching_other = 0 var/list/multipliers = new/list() + var/required_temp = C.required_temp for(var/B in C.required_reagents) if(!has_reagent(B, C.required_reagents[B])) break @@ -259,10 +261,11 @@ datum/reagents/proc/handle_reactions() if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this matching_other = 1 + if(required_temp == 0) + required_temp = chem_temp - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other) + if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp >= required_temp) var/multiplier = min(multipliers) for(var/B in C.required_reagents) remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1) @@ -277,7 +280,7 @@ datum/reagents/proc/handle_reactions() if(!istype(my_atom, /mob)) // No bubbling mobs for(var/mob/M in seen) - M << "\icon[my_atom] The solution begins to bubble." + M << "\icon[my_atom] [C.mix_message]" if(istype(my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 46b6ccc971b..9821c71e5b7 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -11,16 +11,16 @@ icon_state = "dispenser" use_power = 1 idle_power_usage = 40 - var/energy = 50 - var/max_energy = 50 + var/energy = 100 + var/max_energy = 100 var/amount = 30 var/beaker = null var/recharged = 0 - var/recharge_delay = 15 //Time it game ticks between recharges + var/recharge_delay = 5 //Time it game ticks between recharges var/image/icon_beaker = null //cached overlay var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine", "sodium","aluminium","silicon","phosphorus","sulfur","chlorine","potassium","iron", - "copper","mercury","radium","water","ethanol","sugar","sacid") + "copper","mercury","radium","water","ethanol","sugar","sacid","fuel","silver","iodine","bromine","fluorine","stable_plasma") /obj/machinery/chem_dispenser/proc/recharge() if(stat & (BROKEN|NOPOWER)) return @@ -108,7 +108,7 @@ if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm - ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 390, 610) + ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 490, 710) // when the ui is first opened this is the data it will use ui.set_initial_data(data) // open the new ui window @@ -276,6 +276,7 @@ spawn(rand(0, 15)) stat |= NOPOWER + /obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob) if(default_unfasten_wrench(user, B)) @@ -422,6 +423,23 @@ else var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc) reagents.trans_to(P,50) + else if(href_list["createpatch"]) + if(reagents.total_volume == 0) return + var/amount = 1 + var/vol_each = min(reagents.total_volume, 50) + if(text2num(href_list["many"])) + amount = min(max(round(input(usr, "Amount:", "How many patches?") as num), 1), 10) + vol_each = min(reagents.total_volume/amount, 50) + var/name = reject_bad_text(input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)")) + var/obj/item/weapon/reagent_containers/pill/P + + for(var/i = 0; i < amount; i++) + P = new/obj/item/weapon/reagent_containers/pill/patch(src.loc) + if(!name) name = reagents.get_master_reagent_name() + P.name = "[name] patch" + P.pixel_x = rand(-7, 7) //random position + P.pixel_y = rand(-7, 7) + reagents.trans_to(P,vol_each) src.updateUsrDialog() return @@ -479,6 +497,8 @@ if(!condi) dat += "