From c9d1e3452f41a453e12e2383a9afc71bb9d80128 Mon Sep 17 00:00:00 2001 From: "vageyenaman@gmail.com" Date: Fri, 22 Jul 2011 22:42:59 +0000 Subject: [PATCH] I ain't gonna lie, this is a pretty big revision. Chemistry: I added a new variable to each reagent called "color". It's a hexadecimal string used to give a reagent a unique color for use in future shenanigans that are in development atm. Updooted the Chemistry-Readme.dm file to include some other variables I included into the recipie system as well as this new color variable. Implementing these colors is still an ongoing effort, and yes you will be able to "blend" these colors. Viruses: Nothing has been CHANGED (yet) but there is some framework for a new virus system to work alongside our current one, special thanks to Googolplexed of Baystation 12! If this weren't tied to some other things I changed, I wouldn't be committing this in the first place. While experimental, you shouldn't even notice this exists. !!BUGFIXES!!: Wow, there's so many I'm having a hard time keeping track of it all! A bunch of runtime errors were hopefully fixed. There were some problems with slicing stuff spitting out runtime errors because an istype() was missing. The same goes for ritual tomes and some other things. Medical cyborgs were also fixed: their pills will now recharge properly and stop spitting out atrocious runtime errors. It was intended for it to be possible to shoot people on top of Mulebots, but a runtime error always cut the proc off before it could execute. This has been fixed. There are probably some other things I'm missing, but all in all, that's about it for the bugfixes. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1905 316c924e-a436-60f5-8080-3fe189b3f50e --- code/WorkInProgress/Chemistry-Readme.dm | 17 + code/WorkInProgress/Chemistry-Reagents.dm | 366 +++++++++++++++++- code/WorkInProgress/Chemistry-Tools.dm | 14 +- code/defines/mob/living/carbon/carbon.dm | 5 +- code/defines/obj/decal.dm | 1 + .../game/machinery/computer/buildandrepair.dm | 9 + code/game/magic/cultist/ritual.dm | 23 +- code/game/objects/alien/facehugger.dm | 3 +- code/game/objects/items/weapons/guns_new.dm | 32 +- code/modules/admin/admin_verbs.dm | 13 +- .../carbon/alien/humanoid/alien_powers.dm | 5 + code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 17 + code/modules/mob/living/carbon/monkey/life.dm | 11 + .../mob/living/silicon/robot/robot_modules.dm | 5 +- code/modules/mob/new_player/new_player.dm | 2 +- code/modules/virus2/Disease2/curer.dm | 154 ++++++++ code/modules/virus2/Prob.dm | 12 + icons/obj/chempuff.dmi | Bin 0 -> 7671 bytes icons/obj/virology.dmi | Bin 0 -> 5796 bytes tgstation.dme | 16 +- 21 files changed, 673 insertions(+), 34 deletions(-) create mode 100644 code/modules/virus2/Disease2/curer.dm create mode 100644 code/modules/virus2/Prob.dm create mode 100644 icons/obj/chempuff.dmi create mode 100644 icons/obj/virology.dmi diff --git a/code/WorkInProgress/Chemistry-Readme.dm b/code/WorkInProgress/Chemistry-Readme.dm index 165f025c02..e3eab685c7 100644 --- a/code/WorkInProgress/Chemistry-Readme.dm +++ b/code/WorkInProgress/Chemistry-Readme.dm @@ -165,6 +165,15 @@ About Reagents: toxins to make them work slowly instead of instantly. You could also use this for DNA in a blood reagent or ... well whatever you want. + color + This is a hexadecimal color that represents the reagent outside of containers, + you define it as "#RRGGBB", or, red green blue. You can also define it using the + rgb() proc, which returns a hexadecimal value too. The color is black by default. + + A good website for color calculations: http://www.psyclops.com/tools/rgb/ + + + About Recipes: @@ -199,6 +208,14 @@ About Recipes: This is the amount of the resulting reagent this recipe will produce. I recommend you set this to the total volume of all required reagent. + required_container + The container the recipe has to take place in in order to happen. Leave this blank/null + if you want the reaction to happen anywhere. + + required_other + Basically like a reagent's data variable. You can set extra requirements for a + reaction with this. + About the Tools: diff --git a/code/WorkInProgress/Chemistry-Reagents.dm b/code/WorkInProgress/Chemistry-Reagents.dm index 9fa35a5f55..ddf847ad58 100644 --- a/code/WorkInProgress/Chemistry-Reagents.dm +++ b/code/WorkInProgress/Chemistry-Reagents.dm @@ -16,6 +16,7 @@ datum var/volume = 0 var/nutriment_factor = 0 //var/list/viruses = list() + var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) proc reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //By default we have a chance to transfer some @@ -58,10 +59,11 @@ datum id = "metroid" description = "A green semi-liquid produced from one of the deadliest lifeforms in existence." reagent_state = LIQUID + color = "#005020" // rgb: 0, 50, 20 on_mob_life(var/mob/living/M as mob) if(prob(10)) - M << "You don't feel too good." - M.toxloss+=20 + M << "\red Your insides are burning!" + M.toxloss+=rand(20,60) else if(prob(40)) M:heal_organ_damage(5,0) ..() @@ -69,10 +71,11 @@ datum blood - data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null) + data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=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 @@ -84,6 +87,13 @@ datum else //injected M.contract_disease(virus, 1, 0) + + if(self.data["virus2"]) + if(method == TOUCH) + infect_virus2(M,self.data["virus2"]) + else + infect_virus2(M,self.data["virus2"],1) + /* if(self.data["virus"]) var/datum/disease/V = self.data["virus"] @@ -113,6 +123,10 @@ datum blood_prop.viruses += newVirus newVirus.holder = blood_prop + var/datum/disease2/disease/v = self.data["virus2"] + if(v) + blood_prop.virus2 = v.getcopy() + // this makes it almost impossible for airborne diseases to spread // THIS SHIT HAS TO GO, SORRY! /* @@ -169,6 +183,7 @@ datum 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 @@ -187,6 +202,7 @@ datum id = "water" description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." reagent_state = LIQUID + color = "#0064C8" // rgb: 0, 100, 200 reaction_turf(var/turf/simulated/T, var/volume) if (!istype(T)) return @@ -209,7 +225,7 @@ datum T.wet_overlay = null for(var/mob/living/carbon/metroid/M in T) - M.toxloss+=rand(5,10) + M.toxloss+=rand(15,20) var/hotspot = (locate(/obj/hotspot) in T) if(hotspot && !istype(T, /turf/space)) @@ -240,6 +256,7 @@ datum 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 = "#009CA8" // rgb: 0, 156, 168 reaction_turf(var/turf/simulated/T, var/volume) if (!istype(T)) return @@ -259,6 +276,7 @@ datum id = "anti_toxin" description = "Dylovene is a broad-spectrum antitoxin." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -290,6 +308,8 @@ datum 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:toxloss += 1.5 @@ -301,6 +321,8 @@ datum id = "cyanide" description = "A highly 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:toxloss += 3 @@ -314,6 +336,8 @@ datum id = "stoxin" description = "An effective hypnotic used to treat insomnia." reagent_state = LIQUID + color = "#E895CC" // rgb: 232, 149, 204 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(!data) data = 1 @@ -334,6 +358,8 @@ datum id = "stoxin" description = "Put people to sleep, and heals them." 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(!data) data = 1 @@ -365,6 +391,7 @@ datum id = "inaprovaline" description = "Inaprovaline is a synaptic stimulant and cardiostimulant. Commonly used to stabilize patients." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -378,6 +405,8 @@ datum id = "space_drugs" description = "An illegal chemical compound used as drug." reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.druggy = max(M.druggy, 15) @@ -391,6 +420,8 @@ datum 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/window)) @@ -405,35 +436,41 @@ datum id = "oxygen" description = "A colorless, odorless gas." reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 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 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 on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -447,12 +484,14 @@ datum 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 = "#C77400" // rgb: 199, 116, 0 reaction_turf(var/turf/T, var/volume) src = null @@ -464,6 +503,8 @@ datum id = "chlorine" description = "A chemical element." reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.take_organ_damage(1, 0) @@ -475,6 +516,8 @@ datum id = "fluorine" description = "A highly-reactive chemical element." reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:toxloss++ @@ -486,18 +529,21 @@ datum 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 @@ -511,6 +557,8 @@ datum 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 = "#808080" // rgb: 128, 128, 128 + on_mob_life(var/mob/living/M as mob) M:nutrition += 1 ..() @@ -521,6 +569,8 @@ datum id = "acid" description = "A strong mineral acid with the molecular formula H2SO4." reagent_state = LIQUID + color = "#DB5008" // rgb: 219, 80, 8 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:toxloss++ @@ -571,6 +621,8 @@ datum id = "pacid" description = "Polytrinic acid is a an extremely corrosive chemical substance." reagent_state = LIQUID + color = "#8E18A9" // rgb: 142, 24, 169 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:toxloss++ @@ -626,18 +678,22 @@ datum 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 = "#604838" // rgb: 96, 72, 56 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.radiation += 3 @@ -656,6 +712,8 @@ datum id = "ryetalyn" description = "Ryetalyn can cure all genetic abnomalities." reagent_state = SOLID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.mutations = 0 @@ -669,6 +727,8 @@ datum 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 + reaction_turf(var/turf/T, var/volume) src = null if(istype(T, /turf/simulated/wall)) @@ -684,6 +744,8 @@ datum id = "mutagen" description = "Might cause unpredictable mutations. Keep away from children." reagent_state = LIQUID + color = "#13BC5E" // rgb: 19, 188, 94 + reaction_mob(var/mob/M, var/method=TOUCH, var/volume) src = null if ( (method==TOUCH && prob(33)) || method==INGEST) @@ -701,11 +763,26 @@ datum ..() 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 + ..() + return + sterilizine name = "Sterilizine" id = "sterilizine" description = "Sterilizes wounds in preparation for surgery." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 /* reaction_mob(var/mob/M, var/method=TOUCH, var/volume) src = null if (method==TOUCH) @@ -727,6 +804,7 @@ datum 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 @@ -746,18 +824,22 @@ datum 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 soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." 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.radiation += 1 @@ -775,18 +857,22 @@ datum 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 = "Required for welders. Flamable." reagent_state = LIQUID + color = "#660000" // rgb: 102, 0, 0 + reaction_obj(var/obj/O, var/volume) src = null var/turf/the_turf = get_turf(O) @@ -814,6 +900,8 @@ datum id = "cleaner" description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" reagent_state = LIQUID + color = "#A5F0EE" // rgb: 165, 240, 238 + reaction_obj(var/obj/O, var/volume) if(istype(O,/obj/decal/cleanable)) del(O) @@ -857,6 +945,7 @@ datum id = "plantbgone" description = "A harmful toxic mixture to kill plantlife. Do not ingest!" reagent_state = LIQUID + color = "#49002E" // rgb: 73, 0, 46 /* Don't know if this is necessary. on_mob_life(var/mob/living/carbon/M) if(!M) M = holder.my_atom @@ -891,6 +980,8 @@ datum id = "plasma" description = "Plasma in its liquid form." reagent_state = LIQUID + color = "#E71B00" // rgb: 231, 27, 0 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(holder.has_reagent("inaprovaline")) @@ -920,6 +1011,8 @@ datum id = "leporazine" description = "Leporazine can be use to stabilize an individuals body temperature." 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(M.bodytemperature > 310) @@ -934,6 +1027,8 @@ datum id = "cryptobiolin" description = "Cryptobiolin causes confusion and dizzyness." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.make_dizzy(1) @@ -948,6 +1043,8 @@ datum id = "lexorin" description = "Lexorin temporarily stops respiration. Causes tissue damage." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(M.stat == 2.0) return @@ -964,6 +1061,8 @@ datum id = "kelotane" description = "Kelotane is a drug used to treat burns." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(M.stat == 2.0) return @@ -977,6 +1076,8 @@ datum id = "dermaline" description = "Dermaline is the next step in burn medication. Works twice as good as kelotane and enables the body to restore even the direst heat-damaged tissue." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(M.stat == 2.0) //THE GUY IS **DEAD**! BEREFT OF ALL LIFE HE RESTS IN PEACE etc etc. He does NOT metabolise shit anymore, god DAMN return @@ -990,6 +1091,8 @@ datum id = "dexalin" description = "Dexalin is used in the treatment of oxygen deprivation." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(M.stat == 2.0) return //See above, down and around. --Agouri @@ -1005,6 +1108,8 @@ datum id = "dexalinp" description = "Dexalin Plus is used in the treatment of oxygen deprivation. Its highly effective." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(M.stat == 2.0) return @@ -1020,6 +1125,8 @@ datum id = "tricordrazine" description = "Tricordrazine is a highly potent stimulant, originally derived from cordrazine. Can be used to treat a wide range of injuries." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(M.stat == 2.0) return @@ -1036,6 +1143,8 @@ datum id = "adminordrazine" description = "It's magic. We don't have to explain it." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom ///This can even heal dead people. M:cloneloss = 0 @@ -1095,6 +1204,8 @@ datum 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 = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:drowsyness = max(M:drowsyness-5, 0) @@ -1109,6 +1220,8 @@ datum id = "impedrezene" description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:jitteriness = max(M:jitteriness-5,0) @@ -1123,6 +1236,8 @@ datum id = "hyronalin" description = "Hyronalin is a medicinal drug used to counter the effects of radiation poisoning." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:radiation = max(M:radiation-3,0) @@ -1134,6 +1249,8 @@ datum id = "arithrazine" description = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(M.stat == 2.0) return //See above, down and around. --Agouri @@ -1150,6 +1267,8 @@ datum id = "alkysine" description = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:brainloss = max(M:brainloss-3 , 0) @@ -1161,6 +1280,8 @@ datum id = "imidazoline" description = "Heals eye damage" reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:eye_blurry = max(M:eye_blurry-5 , 0) @@ -1175,6 +1296,8 @@ datum id = "bicaridine" description = "Bicaridine is an analgesic medication and can be used to treat blunt trauma." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + on_mob_life(var/mob/living/M as mob) if(M.stat == 2.0) return @@ -1188,6 +1311,8 @@ datum id = "hyperzine" description = "Hyperzine is a highly effective, long lasting, muscle stimulant." 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(prob(5)) M:emote(pick("twitch","blink_r","shiver")) @@ -1200,6 +1325,8 @@ datum id = "cryoxadone" description = "A chemical mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 170K for it to metabolise correctly." 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(M.bodytemperature < 170) @@ -1215,6 +1342,8 @@ datum id = "clonexadone" description = "A liquid compound similar to that used in the cloning process. Can be used to 'finish' clones that get ejected early when used in conjunction with a cryo tube." 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(M.bodytemperature < 170) @@ -1230,6 +1359,7 @@ datum id = "spaceacillin" description = "An all-purpose antiviral agent." reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 on_mob_life(var/mob/living/M as mob)//no more mr. panacea holder.remove_reagent(src.id, 0.2) @@ -1241,6 +1371,7 @@ datum 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 @@ -1252,6 +1383,8 @@ datum name = "Zombie Powder" id = "zombiepowder" description = "A strong neurotoxin that puts the subject into a death-like state." + color = "#669900" // rgb: 102, 153, 0 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:oxyloss += 0.5 @@ -1269,6 +1402,8 @@ datum id = "nanites" 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) @@ -1279,6 +1414,8 @@ datum 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) @@ -1291,7 +1428,7 @@ datum 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 @@ -1301,18 +1438,22 @@ datum id = "foaming_agent" description = "A agent that yields metallic foam when mixed with light metal and a strong acid." reagent_state = SOLID + color = "#664B63" // rgb: 102, 75, 99 nicotine name = "Nicotine" id = "nicotine" description = "A highly addictive stimulant extracted from the tobacco plant." reagent_state = LIQUID + color = "#181818" // rgb: 24, 24, 24 ethanol name = "Ethanol" id = "ethanol" description = "A well-known alcohol with a variety of applications." reagent_state = LIQUID + color = "#404030" // rgb: 64, 64, 48 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -1332,18 +1473,22 @@ datum 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, mildly corrosive." reagent_state = LIQUID + color = "#604030" // rgb: 96, 64, 48 ethylredoxrazine // FUCK YOU, ALCOHOL name = "Ethylredoxrazine" id = "ethylredoxrazine" description = "A powerfuld oxidizer that reacts with ethanol." reagent_state = SOLID + color = "#605048" // rgb: 96, 80, 72 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.dizziness = 0 @@ -1358,6 +1503,8 @@ datum id = "chloralhydrate" description = "A powerful sedative." reagent_state = SOLID + color = "#000067" // rgb: 0, 0, 103 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(!data) data = 1 @@ -1379,6 +1526,8 @@ datum id = "beer2" description = "An alcoholic beverage made from malted grains, hops, yeast, and water." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(!data) data = 1 @@ -1405,6 +1554,8 @@ datum description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." 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(prob(50)) M:heal_organ_damage(1,0) @@ -1431,6 +1582,7 @@ datum 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" @@ -1438,6 +1590,7 @@ datum description = "Ketchup, catsup, whatever. It's tomato paste." reagent_state = LIQUID nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#731008" // rgb: 115, 16, 8 capsaicin @@ -1445,6 +1598,8 @@ datum 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 M:bodytemperature += 5 @@ -1461,6 +1616,8 @@ datum id = "frostoil" description = "A special oil that noticably chills the body. Extraced from Icepeppers." reagent_state = LIQUID + color = "#B31008" // rgb: 139, 166, 233 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:bodytemperature -= 5 @@ -1481,12 +1638,14 @@ datum id = "sodiumchloride" description = "A salt made of sodium chloride. Commonly used to season food." reagent_state = SOLID + color = "#282828" // rgb: 40, 40, 40 blackpepper name = "Black Pepper" id = "blackpepper" description = "A power ground from peppercorns. *AAAACHOOO*" reagent_state = SOLID + // no color (ie, black) coco name = "Coco Powder" @@ -1494,6 +1653,8 @@ datum 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 ..() @@ -1505,6 +1666,8 @@ datum 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) @@ -1516,6 +1679,8 @@ datum name = "Amatoxin" id = "amatoxin" description = "A powerful poison derived from certain species of mushroom." + color = "#792300" // rgb: 121, 35, 0 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:toxloss++ @@ -1526,6 +1691,8 @@ datum 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) @@ -1557,6 +1724,8 @@ datum id = "sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 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("Security Officer", "Head of Security", "Detective", "Warden")) @@ -1572,6 +1741,8 @@ datum id = "syndicream" description = "Delicious cream filling of a mysterious origin. Tastes criminally good." nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#AB7878" // rgb: 171, 120, 120 + on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor if(istype(M, /mob/living/carbon/human) && M.mind) @@ -1589,6 +1760,8 @@ datum 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 ..() @@ -1625,6 +1798,7 @@ datum id = "enzyme" description = "A universal enzyme used in the preperation of certain chemicals and foods." reagent_state = LIQUID + color = "#365E30" // rgb: 54, 94, 48 dry_ramen name = "Dry Ramen" @@ -1632,6 +1806,8 @@ datum 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 ..() @@ -1643,6 +1819,8 @@ datum 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 @@ -1656,6 +1834,8 @@ datum 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 @@ -1673,6 +1853,8 @@ datum description = "Both delicious AND rich in Vitamin C, what more do you need?" reagent_state = LIQUID nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#E78108" // rgb: 231, 129, 8 + on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor if(!M) M = holder.my_atom @@ -1687,6 +1869,8 @@ datum description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" reagent_state = LIQUID nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#731008" // rgb: 115, 16, 8 + on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor if(!M) M = holder.my_atom @@ -1701,6 +1885,8 @@ datum description = "The sweet-sour juice of limes." reagent_state = LIQUID nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#365E30" // rgb: 54, 94, 48 + on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor if(!M) M = holder.my_atom @@ -1715,6 +1901,8 @@ datum description = "It is just like a carrot but without crunching." reagent_state = LIQUID nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#973800" // rgb: 151, 56, 0 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:nutrition += nutriment_factor @@ -1737,6 +1925,8 @@ datum description = "A delicious blend of several different kinds of berries." reagent_state = LIQUID nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#863333" // rgb: 134, 51, 51 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:nutrition += nutriment_factor @@ -1749,6 +1939,8 @@ datum description = "A tasty juice blended from various kinds of very deadly and toxic berries." reagent_state = LIQUID nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#863353" // rgb: 134, 51, 83 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:nutrition += nutriment_factor @@ -1762,6 +1954,8 @@ datum description = "Delicious juice made from watermelon." reagent_state = LIQUID nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#863333" // rgb: 134, 51, 51 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:nutrition += nutriment_factor @@ -1774,6 +1968,8 @@ datum description = "This juice is VERY sour." reagent_state = LIQUID nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#863333" // rgb: 175, 175, 0 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:nutrition += nutriment_factor @@ -1785,6 +1981,8 @@ datum id = "banana" description = "The raw essence of a banana. HONK" nutriment_factor = 1 * REAGENTS_METABOLISM + 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")) @@ -1819,6 +2017,8 @@ datum description = "Juice of the potato. Bleh." reagent_state = LIQUID nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor ..() @@ -1829,6 +2029,8 @@ datum id = "milk" description = "An opaque white liquid produced by the mammary glands of mammals." reagent_state = LIQUID + color = "#DFDFDF" // rgb: 223, 223, 223 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M:bruteloss && prob(20)) M:heal_organ_damage(1,0) @@ -1841,6 +2043,8 @@ datum id = "soymilk" description = "An opaque white liquid made from soybeans." reagent_state = LIQUID + color = "#DFDFC7" // rgb: 223, 223, 199 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M:bruteloss && prob(20)) M:heal_organ_damage(1,0) @@ -1854,6 +2058,8 @@ datum description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" reagent_state = LIQUID nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#DFD7AF" // rgb: 223, 215, 175 + on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor if(M:bruteloss && prob(20)) M:heal_organ_damage(1,0) @@ -1865,6 +2071,8 @@ datum id = "coffee" description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." reagent_state = LIQUID + color = "#482000" // rgb: 72, 32, 0 + on_mob_life(var/mob/living/M as mob) ..() M.dizziness = max(0,M.dizziness-5) @@ -1881,6 +2089,8 @@ datum id = "tea" description = "Tasty black tea, it has antioxidants, it's good for you!" reagent_state = LIQUID + color = "#101000" // rgb: 16, 16, 0 + on_mob_life(var/mob/living/M as mob) ..() M.dizziness = max(0,M.dizziness-2) @@ -1899,6 +2109,8 @@ datum id = "icecoffee" description = "Coffee and ice, refreshing and cool." reagent_state = LIQUID + color = "#102838" // rgb: 16, 40, 56 + on_mob_life(var/mob/living/M as mob) ..() M.dizziness = max(0,M.dizziness-5) @@ -1915,6 +2127,8 @@ datum id = "icetea" description = "No relation to a certain rap artist/ actor." reagent_state = LIQUID + color = "#104038" // rgb: 16, 64, 56 + on_mob_life(var/mob/living/M as mob) ..() M.dizziness = max(0,M.dizziness-2) @@ -1931,6 +2145,8 @@ datum id = "cola" description = "A refreshing beverage." reagent_state = LIQUID + color = "#100800" // rgb: 16, 8, 0 + on_mob_life(var/mob/living/M as mob) M:drowsyness = max(0,M:drowsyness-5) if (M.bodytemperature > 310)//310 is the normal bodytemp. 310.055 @@ -1944,6 +2160,8 @@ datum id = "nuka_cola" description = "Cola, cola never changes." reagent_state = LIQUID + color = "#100800" // rgb: 16, 8, 0 + on_mob_life(var/mob/living/M as mob) M.make_jittery(20) M.druggy = max(M.druggy, 30) @@ -1961,6 +2179,8 @@ datum id = "spacemountainwind" description = "Blows right through you like a space wind." reagent_state = LIQUID + color = "#102000" // rgb: 16, 32, 0 + on_mob_life(var/mob/living/M as mob) M:drowsyness = max(0,M:drowsyness-7) M:sleeping = 0 @@ -1976,6 +2196,8 @@ datum 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:drowsyness = max(0,M:drowsyness-7) M:sleeping = 0 @@ -1999,6 +2221,8 @@ datum id = "dr_gibb" description = "A delicious blend of 42 different flavours" reagent_state = LIQUID + color = "#102000" // rgb: 16, 32, 0 + on_mob_life(var/mob/living/M as mob) M:drowsyness = max(0,M:drowsyness-6) if (M.bodytemperature > 310) @@ -2012,6 +2236,8 @@ datum id = "space_up" description = "Tastes like a hull breach in your mouth." reagent_state = LIQUID + color = "#202800" // rgb: 32, 40, 0 + on_mob_life(var/mob/living/M as mob) if (M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature-8) //310 is the normal bodytemp. 310.055 @@ -2024,6 +2250,8 @@ datum description = "A tangy substance made of 0.5% natural citrus!" id = "lemon_lime" reagent_state = LIQUID + color = "#878F00" // rgb: 135, 40, 0 + on_mob_life(var/mob/living/M as mob) if (M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature-8) //310 is the normal bodytemp. 310.055 @@ -2036,6 +2264,8 @@ datum id = "beer" description = "An alcoholic beverage made from malted grains, hops, yeast, and water." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2057,6 +2287,8 @@ datum id = "whiskey" description = "A superb and well-aged single-malt whiskey. Damn." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2074,6 +2306,8 @@ datum id = "specialwhiskey" description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2092,6 +2326,8 @@ datum id = "gin" description = "It's gin. In space. I say, good sir." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2109,6 +2345,8 @@ datum id = "rum" description = "Yohoho and all that." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2126,6 +2364,8 @@ datum id = "vodka" description = "Number one drink AND fueling choice for Russians worldwide." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2143,6 +2383,8 @@ datum id = "holywater" description = "The chaplains holy water." reagent_state = LIQUID + color = "#E0E8EF" // rgb: 224, 232, 239 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2160,6 +2402,8 @@ datum id = "tequilla" description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" reagent_state = LIQUID + color = "#A8B0B7" // rgb: 168, 176, 183 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2177,6 +2421,8 @@ datum id = "vermouth" description = "You suddenly feel a craving for a martini..." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2194,6 +2440,8 @@ datum id = "wine" description = "An premium alchoholic beverage made from distilled grape juice." reagent_state = LIQUID + color = "#7E4043" // rgb: 126, 64, 67 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2211,6 +2459,8 @@ datum id = "tonic" description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) M.dizziness = max(0,M.dizziness-5) M:drowsyness = max(0,M:drowsyness-3) @@ -2225,6 +2475,8 @@ datum id = "kahlua" description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) M.dizziness = max(0,M.dizziness-5) M:drowsyness = max(0,M:drowsyness-3) @@ -2239,6 +2491,8 @@ datum id = "cognac" description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2256,6 +2510,8 @@ datum id = "hooch" description = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?" reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2273,6 +2529,8 @@ datum id = "ale" description = "A dark alchoholic beverage made by malted barley and yeast." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2290,6 +2548,8 @@ datum id = "sodawater" description = "A can of club soda. Why not make a scotch and soda?" reagent_state = LIQUID + color = "#619494" // rgb: 97, 148, 148 + on_mob_life(var/mob/living/M as mob) M.dizziness = max(0,M.dizziness-5) M:drowsyness = max(0,M:drowsyness-3) @@ -2304,6 +2564,8 @@ datum id = "ice" description = "Frozen water, your dentist wouldn't like you chewing this." reagent_state = SOLID + color = "#619494" // rgb: 97, 148, 148 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M:bodytemperature -= 5 @@ -2317,6 +2579,8 @@ datum id = "bilk" description = "This appears to be beer mixed with milk. Disgusting." reagent_state = LIQUID + color = "#895C4C" // rgb: 137, 92, 76 + on_mob_life(var/mob/living/M as mob) if(M:bruteloss && prob(10)) M:heal_organ_damage(1,0) M:nutrition += 2 @@ -2338,6 +2602,8 @@ datum id = "atomicbomb" description = "Nuclear proliferation never tasted so good." reagent_state = LIQUID + color = "#666300" // rgb: 102, 99, 0 + on_mob_life(var/mob/living/M as mob) M.druggy = max(M.druggy, 50) M.confused = max(M:confused+2,0) @@ -2357,6 +2623,8 @@ datum id = "threemileisland" description = "Made for a woman, strong enough for a man." reagent_state = LIQUID + color = "#666340" // rgb: 102, 99, 64 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2375,6 +2643,8 @@ datum id = "goldschlager" description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2392,6 +2662,8 @@ datum 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 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2409,6 +2681,8 @@ datum id = "gintonic" description = "An all time classic, mild cocktail." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2426,6 +2700,8 @@ datum id = "cubalibre" description = "Rum, mixed with cola. Viva la revolution." reagent_state = LIQUID + color = "#3E1B00" // rgb: 62, 27, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2443,6 +2719,8 @@ datum id = "whiskeycola" description = "Whiskey, mixed with cola. Surprisingly refreshing." reagent_state = LIQUID + color = "#3E1B00" // rgb: 62, 27, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2460,6 +2738,8 @@ datum id = "martini" description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2477,6 +2757,8 @@ datum id = "vodkamartini" description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2494,6 +2776,8 @@ datum id = "whiterussian" description = "That's just, like, your opinion, man..." reagent_state = LIQUID + color = "#A68340" // rgb: 166, 131, 64 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2511,6 +2795,8 @@ datum id = "screwdrivercocktail" description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." reagent_state = LIQUID + color = "#A68310" // rgb: 166, 131, 16 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2528,6 +2814,8 @@ datum 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 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2545,6 +2833,8 @@ datum id = "gargleblaster" description = "Whoah, this stuff looks volatile!" reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2564,6 +2854,8 @@ datum 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 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2581,6 +2873,8 @@ datum id = "tequillasunrise" description = "Tequilla and orange juice. Much like a Screwdriver, only Mexican~" reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2598,6 +2892,8 @@ datum id = "toxinsspecial" description = "This thing is FLAMING!. CALL THE DAMN SHUTTLE!" reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if (M.bodytemperature < 330) M.bodytemperature = min(330, M.bodytemperature+15) //310 is the normal bodytemp. 310.055 @@ -2617,6 +2913,8 @@ datum id = "beepskysmash" description = "Deny drinking this and prepare for THE LAW." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) M.stunned = 2 if(!data) data = 1 @@ -2635,6 +2933,8 @@ datum id = "doctorsdelight" description = "A gulp a day keeps the MediBot away. That's probably for the best." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M:oxyloss && prob(50)) M:oxyloss -= 2 @@ -2651,6 +2951,8 @@ datum id = "irishcream" description = "Whiskey-imbued cream, what else would you expect from the Irish." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2668,6 +2970,8 @@ datum 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 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2685,6 +2989,8 @@ datum 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 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2702,6 +3008,8 @@ datum 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 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2719,6 +3027,8 @@ datum id = "b52" description = "Coffee, Irish Cream, and congac. You will get bombed." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2736,6 +3046,8 @@ datum 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 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2753,6 +3065,8 @@ datum id = "margarita" description = "On the rocks with salt on the rim. Arriba~!" reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2770,6 +3084,8 @@ datum id = "blackrussian" description = "For the lactose-intolerant. Still as classy as a White Russian." reagent_state = LIQUID + color = "#360000" // rgb: 54, 0, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2787,6 +3103,8 @@ datum id = "manhattan" description = "The Detective's undercover drink of choice. He never could stomach gin..." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2804,6 +3122,8 @@ datum id = "manhattan_proj" description = "A scienitst drink of choice, for thinking how to blow up the station." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2822,6 +3142,8 @@ datum id = "whiskeysoda" description = "Ultimate refreshment." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2839,6 +3161,8 @@ datum id = "vodkatonic" description = "For when a gin and tonic isn't russian enough." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2856,6 +3180,8 @@ datum id = "ginfizz" description = "Refreshingly lemony, deliciously dry." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2873,6 +3199,8 @@ datum id = "bahama_mama" description = "Tropic cocktail." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2892,6 +3220,8 @@ datum 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 @@ -2911,6 +3241,8 @@ datum 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 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2928,6 +3260,8 @@ datum id = "mead" description = "A Vikings drink, though a cheap one." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2949,6 +3283,8 @@ datum 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 @@ -2972,6 +3308,8 @@ datum id = "grog" description = "Watered down rum, Nanotrasen approves!" reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -2989,6 +3327,8 @@ datum id = "soy_latte" description = "A nice and tasty beverage while you are reading your hippie books." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) ..() M.dizziness = max(0,M.dizziness-5) @@ -3007,6 +3347,8 @@ datum id = "cafe_latte" description = "A nice, strong and tasty beverage while you are reading." reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) ..() M.dizziness = max(0,M.dizziness-5) @@ -3025,6 +3367,8 @@ datum id = "acidspit" description = "A drink by Nanotrasen. Made from live aliens." reagent_state = LIQUID + color = "#365000" // rgb: 54, 80, 0 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ @@ -3042,6 +3386,8 @@ datum id = "amasec" description = "Always before COMBAT!!!" reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) M.stunned = 4 if(!data) data = 1 @@ -3060,6 +3406,8 @@ datum 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) if(!M) M = holder.my_atom M:oxyloss += 0.5 @@ -3086,6 +3434,8 @@ datum id = "hippiesdelight" description = "A drink enjoyed by people during the 1960's." 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) @@ -3117,6 +3467,8 @@ datum id = "bananahonk" description = "A drink from Clown Heaven." nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor if(!data) data = 1 @@ -3149,6 +3501,8 @@ datum id = "silencer" description = "A drink from Mime Heaven." nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) M:nutrition += nutriment_factor if(!data) data = 1 @@ -3170,6 +3524,8 @@ datum id = "singulo" description = "A blue-space beverage!" reagent_state = LIQUID + color = "#2E6671" // rgb: 46, 102, 113 + on_mob_life(var/mob/living/M as mob) if(!data) data = 1 data++ diff --git a/code/WorkInProgress/Chemistry-Tools.dm b/code/WorkInProgress/Chemistry-Tools.dm index a5af6e4a89..d3a8d3a2dc 100644 --- a/code/WorkInProgress/Chemistry-Tools.dm +++ b/code/WorkInProgress/Chemistry-Tools.dm @@ -609,7 +609,10 @@ /obj/item/weapon/chem_grenade, /obj/machinery/bot/medbot, /obj/machinery/computer/pandemic, - /obj/item/weapon/secstorage/ssafe + /obj/item/weapon/secstorage/ssafe, + /obj/machinery/disease2/incubator, + /obj/machinery/disease2/isolator, + /obj/machinery/disease2/biodestroyer ) examine() @@ -878,6 +881,8 @@ B.data["viruses"] += new D.type + B.data["virus2"] = T.virus2.getcopy() + B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0) if(T.resistances&&T.resistances.len) B.data["resistances"] = T.resistances.Copy() @@ -1294,6 +1299,9 @@ var/slice_path var/slices_num attackby(obj/item/weapon/W as obj, mob/user as mob) + + if((slices_num <= 0 || !slices_num) || !slice_path) + return 1 var/inaccurate = 0 if( \ istype(W, /obj/item/weapon/kitchenknife) || \ @@ -1327,8 +1335,8 @@ ) else user.visible_message( \ - "\blue [user] inaccurate slices \the [src] with [W]!", \ - "\blue You inaccurate slice \the [src] with your [W]!" \ + "\blue [user] inaccurately slices \the [src] with [W]!", \ + "\blue You inaccurately slice \the [src] with your [W]!" \ ) slices_lost = rand(1,min(1,round(slices_num/2))) var/reagents_per_slice = reagents.total_volume/slices_num diff --git a/code/defines/mob/living/carbon/carbon.dm b/code/defines/mob/living/carbon/carbon.dm index d7c7b0355b..aab5d4ee6b 100644 --- a/code/defines/mob/living/carbon/carbon.dm +++ b/code/defines/mob/living/carbon/carbon.dm @@ -4,4 +4,7 @@ var/brain_op_stage = 0.0 var/eye_op_stage = 0.0 - var/appendix_op_stage = 0.0 \ No newline at end of file + var/appendix_op_stage = 0.0 + + var/datum/disease2/disease/virus2 = null + var/list/datum/disease2/disease/resistances2 = list() \ No newline at end of file diff --git a/code/defines/obj/decal.dm b/code/defines/obj/decal.dm index cb64dd65a3..04fcc1ca79 100644 --- a/code/defines/obj/decal.dm +++ b/code/defines/obj/decal.dm @@ -51,6 +51,7 @@ var/list/viruses = list() blood_DNA = null blood_type = null + var/datum/disease2/disease/virus2 = null Del() for(var/datum/disease/D in viruses) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index cd57816924..07603a0d0d 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -158,6 +158,15 @@ build_path = "/obj/machinery/computer/security/mining" origin_tech = "programming=2" +/obj/item/weapon/circuitboard/curefab + name = "Circuit board (Cure fab)" + build_path = "/obj/machinery/computer/curer" + +/obj/item/weapon/circuitboard/splicer + name = "Circuit board (Disease Splicer)" + build_path = "/obj/machinery/computer/diseasesplicer" + + /obj/computerframe/attackby(obj/item/P as obj, mob/user as mob) switch(state) diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm index da128a6212..62fa3ccee3 100644 --- a/code/game/magic/cultist/ritual.dm +++ b/code/game/magic/cultist/ritual.dm @@ -534,17 +534,18 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return attackby(obj/item/weapon/tome/T as obj, mob/living/user as mob) - switch(alert("Copy the runes from your tome?",,"Copy", "Cancel")) - if("cancel") - return -// var/list/nearby = viewers(1,src) //- Fuck this as well. No clue why this doesnt work. -K0000 -// if (T.loc != user) -// return -// for(var/mob/M in nearby) -// if(M == user) - for(var/w in words) - words[w] = T.words[w] - user << "You copy the translation notes from your tome." + if(istype(T, /obj/item/weapon/tome)) // sanity check to prevent a runtime error + switch(alert("Copy the runes from your tome?",,"Copy", "Cancel")) + if("cancel") + return + // var/list/nearby = viewers(1,src) //- Fuck this as well. No clue why this doesnt work. -K0000 + // if (T.loc != user) + // return + // for(var/mob/M in nearby) + // if(M == user) + for(var/w in words) + words[w] = T.words[w] + user << "You copy the translation notes from your tome." examine() diff --git a/code/game/objects/alien/facehugger.dm b/code/game/objects/alien/facehugger.dm index a827c9fc47..68ba085f27 100644 --- a/code/game/objects/alien/facehugger.dm +++ b/code/game/objects/alien/facehugger.dm @@ -247,8 +247,7 @@ //trg.virus.cure(0)//You need to either cure() or del() them to stop their processing. trg.contract_disease(new /datum/disease/alien_embryo(0))//So after that you need to infect the target anew. for(var/datum/disease/alien_embryo/A in trg.viruses) - if(target.virus)//If they actually get infected. They may not. - target.alien_egg_flag = 1//We finally set their flag to 1. + target.alien_egg_flag = 1//We finally set their flag to 1. return else sleep(50) diff --git a/code/game/objects/items/weapons/guns_new.dm b/code/game/objects/items/weapons/guns_new.dm index 16a1006278..c60491c584 100644 --- a/code/game/objects/items/weapons/guns_new.dm +++ b/code/game/objects/items/weapons/guns_new.dm @@ -194,7 +194,16 @@ if(istype(A,/turf) && !istype(src, /obj/item/projectile/beam)) for(var/obj/O in A) O.bullet_act(src, def_zone) - del(src) + + // Okay this code, along with the sleep(10) {del(src)} up ahead is to make + // sure the projectile doesn't cut off any procs it's executing. this may seem + // incredibly stupid, I know, but it's to workaround pesky runtime error spam + invisibility = 101 + loc = locate(1,1,1) + + sleep(10) + del(src) // wait exactly 1 second, then delete itself. See above comments ^ + return CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -432,18 +441,22 @@ load_method = 0 //0 = Single shells or quick loader, 1 = magazine // Shotgun variables - pumped = 1 + pumped = 0 maxpump = 1 + list/Storedshots = list() // a list where "used" shots are stored to be dumped or something + load_into_chamber() if(!loaded.len) return 0 - if(pumped >= maxpump && istype(src, /obj/item/weapon/gun/projectile/shotgun)) - return 1 var/obj/item/ammo_casing/AC = loaded[1] //load next casing. loaded -= AC //Remove casing from loaded list. - AC.loc = get_turf(src) //Eject casing onto ground. + if(!istype(src, /obj/item/weapon/gun/projectile/shotgun)) + AC.loc = get_turf(src) //Eject casing onto ground. + else + Storedshots += AC + if(AC.BB) in_chamber = AC.BB //Load projectile into chamber. AC.BB.loc = src //Set projectile loc to gun. @@ -451,6 +464,7 @@ else return 0 + New() for(var/i = 1, i <= max_shells, i++) loaded += new /obj/item/ammo_casing(src) @@ -542,7 +556,10 @@ for(var/i = 1, i <= max_shells, i++) loaded += new /obj/item/ammo_casing/shotgun/beanbag(src) update_icon() - pumped = maxpump + + attack_self(mob/living/user as mob) + pump() + return combat name = "combat shotgun" @@ -561,6 +578,9 @@ proc/pump(mob/M) playsound(M, 'shotgunpump.ogg', 60, 1) pumped = 0 + for(var/obj/item/ammo_casing/AC in Storedshots) + Storedshots -= AC //Remove casing from loaded list. + AC.loc = get_turf(src) //Eject casing onto ground. automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude name = "Submachine Gun" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index db2b704876..209bb75811 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -135,6 +135,7 @@ verbs += /client/proc/jumptokey verbs += /client/proc/jumptomob verbs += /client/proc/jumptoturf + //verbs += /client/proc/givedisease verbs += /client/proc/cmd_admin_add_freeform_ai_law verbs += /client/proc/cmd_admin_add_random_ai_law @@ -268,7 +269,6 @@ verbs += /client/proc/cmd_admin_ninjafy //N //verbs += /client/proc/makepAI // -- TLE verbs += /client/proc/respawn_character //N - verbs += /client/proc/Getmob verbs += /client/proc/sendmob verbs += /client/proc/Jump @@ -1488,6 +1488,17 @@ kill_air = 1 usr << "Disabled air processing." +/* +/client/proc/givedisease(var/mob/living/carbon/M in world) + set category = "Debug" + set name = "Give disease 2.0" + set desc = "Does what it says on the tin" + infect_mob_random(M) + message_admins("\blue [src.ckey] infected [M.real_name]([M.ckey]) with a random disease 2.0") +*/ + + + /client/proc/unstealthadmin() set name = "Toggle admin verb visibility" set category = "Admin" diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index b6c29aab21..278f0b5150 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -156,6 +156,11 @@ I kind of like the right click only--the window version can get a little confusi var/obj/selection = input("Select a destination.", "Duct System") in choices var/selection_position = choices.Find(selection) if(loc==startloc) + + // Hacky way of hopefully preventing a runtime error from happening + if(vents.len < selection_position) + vents.len = selection_position + var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection_position] if(target_vent) for(var/mob/O in viewers(src, null)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 75f110341e..990cba5f9c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -252,7 +252,7 @@ var/obj/item/weapon.grab/G = r_hand if ((G.state == 3 && get_dir(src, A) == dir)) safe = G.affecting - if (safe) + if (safe && A) return safe.bullet_act(A) var/absorb diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 47bddb1334..d01ee6e6d5 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -864,6 +864,9 @@ if(!D.hidden[SCANNER]) foundVirus++ + if(patient.virus2) + foundVirus++ + client.images += image(tempHud,patient,"hud[RoundHealth(patient.health)]") if(patient.stat == 2) client.images += image(tempHud,patient,"huddead") @@ -1013,6 +1016,20 @@ if(bodytemperature > 406) for(var/datum/disease/D in viruses) D.cure() + + + if(!virus2) + for(var/mob/living/carbon/M in oviewers(4,src)) + if(M.virus2) + infect_virus2(src,M.virus2) + for(var/obj/decal/cleanable/blood/B in view(4, src)) + if(B.virus2) + infect_virus2(src,B.virus2) + else + virus2.activate(src) + + + return diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 58aff33aa0..37e089ded5 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -569,6 +569,17 @@ D.cure() return + if(!virus2) + for(var/mob/living/carbon/M in oviewers(4,src)) + if(M.virus2) + infect_virus2(src,M.virus2) + for(var/obj/decal/cleanable/blood/B in view(4, src)) + if(B.virus2) + infect_virus2(src,B.virus2) + else + virus2.activate(src) + + check_if_buckled() if (src.buckled) src.lying = istype(src.buckled, /obj/stool/bed) || istype(src.buckled, /obj/machinery/conveyor) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 2378e82c5b..12611f3cd7 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -127,14 +127,15 @@ obj/item/weapon/robot_module/syndicate var/list/what = list ( /obj/item/weapon/reagent_containers/pill/kelotane, /obj/item/weapon/reagent_containers/pill/dexalin, - /obj/item/weapon/reagent_containers/pill/cyanide, ) for (var/T in what) if (!(locate(T) in src.modules)) src.modules -= null var/O = new T(src) src.modules += O - O:amount = 1 + if (R.emagged && !src.emag) //thanks to cyborg-900 for uncovering this + src.emag = new /obj/item/weapon/reagent_containers/pill/cyanide(src) + /obj/item/weapon/robot_module/medical/New() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 26f6d5a7d9..82859c6879 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -148,7 +148,7 @@ mob/new_player return 1 if(href_list["ready"]) - if (!usr.client.authenticated) + if (!src.client.authenticated) src << "You are not authorized to enter the game." return diff --git a/code/modules/virus2/Disease2/curer.dm b/code/modules/virus2/Disease2/curer.dm new file mode 100644 index 0000000000..87179b82f5 --- /dev/null +++ b/code/modules/virus2/Disease2/curer.dm @@ -0,0 +1,154 @@ +/obj/machinery/computer/curer + name = "Cure Research Machine" + icon = 'computer.dmi' + icon_state = "dna" +// brightnessred = 0 +// brightnessgreen = 2 //Used for multicoloured lighting on BS12 +// brightnessblue = 2 + var/curing + var/virusing + circuit = "/obj/item/weapon/circuitboard/mining" + + var/obj/item/weapon/virusdish/dish = null + +/obj/machinery/computer/curer/attackby(var/obj/I as obj, var/mob/user as mob) + /*if(istype(I, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'Screwdriver.ogg', 50, 1) + if(do_after(user, 20)) + if (src.stat & BROKEN) + user << "\blue The broken glass falls out." + var/obj/computerframe/A = new /obj/computerframe( src.loc ) + new /obj/item/weapon/shard( src.loc ) + var/obj/item/weapon/circuitboard/curer/M = new /obj/item/weapon/circuitboard/curer( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 3 + A.icon_state = "3" + A.anchored = 1 + del(src) + else + user << "\blue You disconnect the monitor." + var/obj/computerframe/A = new /obj/computerframe( src.loc ) + var/obj/item/weapon/circuitboard/curer/M = new /obj/item/weapon/circuitboard/curer( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 4 + A.icon_state = "4" + A.anchored = 1 + del(src)*/ + if(istype(I,/obj/item/weapon/virusdish)) + var/mob/living/carbon/c = user + if(!dish) + + dish = I + c.drop_item() + I.loc = src + + //else + src.attack_hand(user) + return + +/obj/machinery/computer/curer/attack_ai(var/mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/computer/curer/attack_paw(var/mob/user as mob) + + return src.attack_hand(user) + return + +/obj/machinery/computer/curer/attack_hand(var/mob/user as mob) + if(..()) + return + user.machine = src + var/dat + if(curing) + dat = "Antibody production in progress" + else if(virusing) + dat = "Virus production in progress" + else if(dish) + dat = "Virus dish inserted" + if(dish.virus2) + if(dish.growth >= 100) + dat += "
Begin antibody production" + dat += "
Begin virus production" + else + dat += "
Insufficent cells to attempt to create cure" + else + dat += "
Please check dish contents" + + dat += "
Eject disk" + else + dat = "Please insert dish" + + user << browse(dat, "window=computer;size=400x500") + onclose(user, "computer") + return + +/obj/machinery/computer/curer/process() + ..() + + if(stat & (NOPOWER|BROKEN)) + return + use_power(500) + src.updateDialog() + + if(curing) + curing -= 1 + if(curing == 0) + icon_state = "dna" + if(dish.virus2) + createcure(dish.virus2) + if(virusing) + virusing -= 1 + if(virusing == 0) + icon_state = "dna" + if(dish.virus2) + createvirus(dish.virus2) + + return + +/obj/machinery/computer/curer/Topic(href, href_list) + if(..()) + return + if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + usr.machine = src + + if (href_list["antibody"]) + curing = 30 + dish.growth -= 50 + src.icon_state = "dna" + if (href_list["virus"]) + virusing = 30 + dish.growth -= 100 + src.icon_state = "dna" + else if(href_list["eject"]) + dish.loc = src.loc + dish = null + + src.add_fingerprint(usr) + src.updateUsrDialog() + return + + +/obj/machinery/computer/curer/proc/createcure(var/datum/disease2/disease/virus2) + var/obj/item/weapon/cureimplanter/implanter = new /obj/item/weapon/cureimplanter(src.loc) + implanter.resistance = new /datum/disease2/resistance(dish.virus2) + if(probG("Virus curing",3)) + implanter.works = 0 + else + implanter.works = rand(1,2) + state("The [src.name] Buzzes") + +/obj/machinery/computer/curer/proc/createvirus(var/datum/disease2/disease/virus2) + var/obj/item/weapon/cureimplanter/implanter = new /obj/item/weapon/cureimplanter(src.loc) + implanter.name = "Viral implanter (MAJOR BIOHAZARD)" + implanter.virus2 = dish.virus2.getcopy() + implanter.works = 3 + state("The [src.name] Buzzes") + + +/obj/machinery/computer/curer/proc/state(var/msg) + for(var/mob/O in hearers(src, null)) + O.show_message("\icon[src] \blue [msg]", 2) diff --git a/code/modules/virus2/Prob.dm b/code/modules/virus2/Prob.dm new file mode 100644 index 0000000000..bf9868041d --- /dev/null +++ b/code/modules/virus2/Prob.dm @@ -0,0 +1,12 @@ +var/list/prob_G_list = list() + +/proc/probG(var/define,var/everyother) + if(prob_G_list["[define]"]) + prob_G_list["[define]"] += 1 + if(prob_G_list["[define]"] == everyother) + prob_G_list["[define]"] = 0 + return 1 + else + (prob_G_list["[define]"]) = 0 + (prob_G_list["[define]"]) = rand(1,everyother-1) + return 0 diff --git a/icons/obj/chempuff.dmi b/icons/obj/chempuff.dmi new file mode 100644 index 0000000000000000000000000000000000000000..811c5e82142e5e63a4a5253ac054f7908bc14bc0 GIT binary patch literal 7671 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 pjQgQiIse