Virology Revamp

This commit is contained in:
Chompstation Bot
2021-08-13 15:38:46 +00:00
parent 6b5aad478a
commit beef8e7f82
9 changed files with 3560 additions and 120 deletions

View File

@@ -1388,3 +1388,447 @@
</body>
</html>
"}
/obj/item/weapon/book/manual/virology
name = "Sneezes and Coughs: A Guide To Virology, 1st Edition"
icon_state = "bookvirology"
item_state = "book5"
author = "James Simpson, Chief Virologist"
title = "Sneezes and Coughs: A Guide To Virology, 1st Edition"
dat = {"<html>
<head>
<style>
h1 {font-size: 21px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
b {font-size: 12px}
body {font-size: 13px; font-family: Verdana;}
table {font-family: arial, sans-serif;
border-collapse: collapse;
width: 50%;
font-size: 13px;}
td, th {border: 1px solid #000000;
text-align: left;
padding: 8px;}
tr:nth-child(even) {background-color: #dddddd;}
padding {padding-bottom: 50px;}
</style>
</head>
<body>
<h1>A Guide to Virology, 1st Edition</h1>
Welcome to virology! <br><br>
A virologist spends much of their time isolated in the virology department fiddling with deadly and annoying plagues. This guide will get you on the right path to properly<br>
creating and curing the worst of the worst.<br><br>
<h2>Anatomy of a Virus</h2>
Before you jump in to making the next Black Death, you need to understand what's what. When you pop a tray into the disease analyzer you'll get a paper listing quite a few<br>
things about that virus!<br><br>
<b>Antigens</b><br>
The first thing you might notice on this analysis is the listed antigens of a virus. This, essentially, is what you need for cures. When a patient develops an antibody that<br>
matches a disease's antigen, they'll be immune to the virus.<br><br>
<b>Transmission</b><br>
This will list one of three methods of transmission: airborne, contact, or blood. Airborne viruses will spread through the air, meaning if a patient is coughing or sneezing<br>
it will spread quicker. Contactviruses need some sort of, well, contact. Blood on the floor, mucus, and vomit should all be cleaned up. Blood-transmission viruses will only<br>
spread through actual blood contact, meaning an injection of the virus would be necessary to spread it.<br><br>
<b>Species</b><br>
Not all viruses are compatible with all species! This will list off what can be infected by a particular virus. This can be changed through splicing. In rare cases you will<br>
get a virus that has infected crewmembers but cannot infect your lab monkeys. In these cases, you will likely have to splice different species data to safely make a cure.<br><br>
<b>Symptoms</b><br>
This lists what all the virus does, along with the strength of the symptoms and their aggressiveness. A full list of symptoms and their stages can be found below.<br><br>
<h2>Protection</h2>
First off, any good virologist needs to gear up!<br><br>
Your virology lab should have the following:
<ul>
<li>Two (2) Level-3 Bio Hoods</li>
<li>Two (2) Level-3 Bio Suits</li>
<li>Two (2) sets of sealed internals</li>
<li>One (1) box of sterile masks</li>
<li>One (1) box of latex gloves</li>
</ul><br>
<b>Make sure to gear up appropriately and take precautions to not bring the virus out of the lab!</b><br><br>
What needs to be worn varies from race to race, as some species cannot be affected by a virus, but<br>
precautions should always be taken to prevent accidentally carrying the virus out of containment.<br><br>
<h2>Machinery</h2>
These are the types of machines that you will be expected to use in this department. Study them, know them, and make sure you use them correctly!<br><br>
<b>Antibody Scanner</b><br>
A device similar to a health analyzer, when scanned over a patient it will tell you any present antibodies in their bloodstream.<br><br>
<b>Pathogenic Isolator</b><br>
This device can be loaded with blood samples via a syringe. It will tell you if there is a present viral pathogen, and if so it can isolate the pathogen,<br>
producing a virus dish for further research. This is the primary means of creating virus dishes.<br><br>
<b>Pathogenic Incubator</b><br>
One of the most important machines, you'll be sitting here a lot. Virus trays you produce will start small, and you will need to grow them to get anywhere.<br>
Load it with virus food (diluted milk, found in a wall mounted dispenser nearby) as well as a virus dish and turn it on. It will slowly grow the virus<br>
for analysis, splicing, or whatever other use you might find for it. It can also inject the virus into other chemicals (i.e. blood) which will allow you<br>
to artificially infect a blood sample to infect test subjects.<br><br>
Additionally, it can irradiate a virus dish to cause mutation. This randomly alters the syndromes, allowing you to collect new data.<br><br>
<b>Disease Analyser</b><br>
Virus dishes may be placed into this machine after it has been incubated sufficiently. It will create a reading of the virus' symptoms, species targeted,<br>
associated antibodies, and so on. It will also update the disease into the digital database, allowing it to be detected via Medical HUD or health analyzer.<br><br>
<b>Isolation Centrifuge</b><br>
Inserting a vial of blood into this machine will allow it to take a present pathogen or antibody, turning it into a pure virus or pure cure for your use.<br>
It will automatically detect if either are in the blood sample, so it is useful for determining if a sample is infected. The sample will be reusable if creating<br>
more of the virus, but will be expended upon creating antibodies.<br><br>
<b>Disease Splicer</b><br>
As it's name implied, this machine is for splicing the disease symptoms and creating new viruses. Insert an analyzed virus sample to take a symptom which can<br>
then be saved on a GNA disk (created by the machine), or use an existing disk on the machine to load up a symptom and splice it in.<br><br>
<h2>Syndromes</h2>
While curing patients is the obvious side to virology, there's more you can do! For a variety of reasons you may wish to engineer your own virus through mutations<br>
and splicing. Keep in mind that infecting the whole station with a deadly virus is generally frowned upon in most societies, and even in an antagonistic role simply<br>
infecting everyone with a very deadly virus is not ideal.<br><br>
<b>Obtaining a Sample</b><br>
The first step to making your own virus is to find a virus to start tinkering with. There are two ways of doing this: grabbing the pre-spawned virus dish from the<br>
freezer create in your laboratory, or taking a blood sample from an infected patient that you haven't cured yet and running it through the Pathogenic Isolator to<br>
produce a virus dish.<br><br>
In either case, you'll then need to incubate the virus in the Pathogenic Incubator until it is of sufficient size for you to work with, and ideally also run it<br>
through the Disease Analyzer to get an idea of what it does. This will also keep the rest of Medical from getting on your case about not giving them the ability to<br>
detect viral outbreaks without you, and will help prevent public lynchings if someone sneezes.<br><br>
Once that's all done, you're ready to start the real work.<br><br>
<b>Obtaining a Sample</b><br>
Sometimes you just need to infect somebody. Usually, this is because you're doing some splicing work and want to make sure that you'll have some copies of a virus<br>
in reserve for future study. Fortunately, the process of deliberately infecting patients, as well as creating backups of your viruses, is actually very simple.<br><br>
If you have a virus dish and wish to infect a patient, place the dish into the <b>Pathogenic Incubator</b> along with a beaker full of blood. Ideally, this is the<br>
patient's (or test monkey's) blood, though anyone's will do in a pinch - just be aware of the possibility of blood rejection, and be ready to deal with it accordingly.<br>
The incubator can inject a sample of the virus into the blood, which you can then inject into the patient to infect them. Alternatively, once a blood sample is infected<br>
you may place it in either the <b>Pathogenic Isolator</b> or <b>Isolation Centrifuge</b> to make as many samples of that virus you need without destroying the sample.<br>
No infections necessary!<br><br>
<b>Splicing</b><br>
To understand splicing, you must know that every virus has 4 GNA strands, each of which is tied to one of the syndromes that it can manifest. Each syndrome, and thus each<br>
strand, is ranked in order of its appearance when symptoms begin to manifest in a patient, and higher-ranked (and thus slower to appear) syndromes are likely to be more<br>
powerful than lower-ranked ones. (1) is the lowest, first symptom to manifest, and (4) is the highest, final symptom to manifest.<br><br>
The Disease Splicer will allow you to examine and manipulate a virus' GNA strands to create a virus with any syndromes that you want.<br><br>
The splicer has main three functions which allow you to modify viruses and define which GNA strands they contain. The first of these functions is the splicing function,<br>
which copies a GNA strand from an inserted virus tray to the disease splicer buffer. This is done by selecting the desired GNA strand under "Reverse Engineering".<br>
Doing so will destroy the virus tray in the process, so be sure that you have more samples of the virus on hand if you want to preserve it.<br><br>
The disease splicers second function is to copy whatever strand it has stored in its buffer to a disk the machine creates. These disks can be re-inserted into<br>
the disease splicer later, making their stored GNA strand immediately available for use. Unlike virus trays, disks can be reused without destroying them.<br><br>
The final function of the disease splicer is to copy over a GNA strand of its loaded virus dish with the corresponding GNA strand that is currently stored in<br>
its buffer. This effectively allows you to give a virus any set of symptoms you want, so long as it follows the rules of the ranking. A rank (1) symptom can fill<br>
any slot, while a (3) can only fill 3 and up, and a (4) can only be in the fourth slot.<br><br>
<b>Mutating</b><br>
Sometimes you just don't have any of the symptoms you want. Fortunately, mutating a virus dish is very simple. Simply place a dish in the <b>Pathogenic Incubator</b><br>
to get started and click 'add radiation'. This will fill up the radiation bar with each press. When the machine is on, this bar will slowly tick down as the radiation<br>
is applied to the sample. For any significant mutation the radiation should be over 500k, meaning at least half the bar. When a mutation occurs -- and multiple<br>
mutations can occur in a single sample -- there will be a ping from the machine. Once it's done growing and mutating, throw it into the analyzer and see what you got!<br><br>
With these functions in mind, the process in order for you to develop your own virus is as follows:
<ol>
<li>Create lots of virus sample dishes.</li>
<li>If the virus dishes you have already created don't contain the syndromes that you want in<br>
your custom virus, irradiate them in the Pathogenic Incubator until they do.</li>
<li>Create backup dishes of your new viruses.</li>
<li>Strip the GNA strands that you want from your virus dishes, saving each one onto a disk.</li>
<li>Load a new virus dish into the Disease Splicer.</li>
<li>Copy over the virus dish's GNA strands with your disks.</li>
<li>Once you have your final product, you can use the Pathogenic Incubator to create a beaker<br>
of blood containing the virus. Congratulations! You are now officially a bioweapon<br>
manufacturer.</li>
</ol>
<h2>Curing</h2>
Curing a virus is relatively simple, but the below will leave you without a sample to work with. If this is a concern, see 'obtaining a sample' above. Alternatively to<br>
the below, spacecillin can be used in a pinch to attempt to treat a virus if no virologist is present and someone decided to roll around in mucus. However this is not<br>
guaranteed to work, and can in fact simply make the virus more resistant to spacecillin.<br><br>
<b>Quarantine</b><br>
If you or a crew member becomes infected by a virus, your first concern should be to isolate them as quickly as possible to prevent the disease from spreading. Ideally,<br>
this means getting the patient back to Virology and into a holding cell, but failing that, it's important to get them into an isolated room, shut the door, and keep anyone<br>
else from entering. It is also important to clean up any blood, vomit, or mucus left behind by the patient, as it may spread the virus as well.<br><br>
<b>Antibodies</b><br>
Now that your patient is safely hidden away where they can't infect people without your permission, you want to cure them. The basic idea behind that is to get them to start<br>
synthesizing antibodies.<br><br>
Antibodies are produced by living organisms that have started to fight off a virus in their bloodstream. An organism that has produced antibodies is effectively<br>
immune to any virus that is weak to those antibodies, which are generally denoted by a short string of letters (say, "KM" or similar) to let you know which viruses they<br>
are effective against. Even better, once an organism has synthesized antibodies for itself, you can take a blood sample and use that to create more antibodies, which you<br>
can then inject into other people to cure the virus in them, or even to prevent them from catching it in the first place. And you can take blood samples from those people<br>
to make even more antibodies.<br><br>
The issue is that, most of the time, a patient's immune system is not powerful enough to create antibodies on its own (space plagues are nasty things), so you have to do that<br>
for them. You do that by injecting them with Radium.<br><br>
Since Radium is radioactive, this is obviously not something that you want to do to your actual patients. It'll cause major toxin damage when an antibody is<br>
made and quickly lead to organ failure. You get around this by using monkeys, which you can get from the box of monkey cubes very handily left on the desk in Virology for<br>
this very purpose.<br><br>
So the process of curing diseases is, really, quite simple. Find an infected patient. Make a monkey (ideally, strap this monkey to a bed in an isolation cell to make the<br>
rest of this process easier). Take a blood sample from the infected patient, then inject it into the monkey to infect the monkey. Inject the monkey with Radium. Use the antibody<br>
scanner on the monkey every few seconds until it says that the monkey has begun producing antibodies, then take a blood sample (or two or three or four) from the<br>
monkey. Put the blood sample(s) into a vial, then put the vial into the isolation centrifuge and isolate the antibodies. Voila: a bottle of virus cure. Inject it into as many<br>
people as you like, then throw the (likely dead) monkey into the disposals chute to eject its disease-ridden body into space and clean the isolation cell. Or, if you're on<br>
the ball and wish to be conservative with your limited monkey cubes, save the monkey, too.<br><br>
Congratulations! You have now cured a disease.<br><br>
The important thing to remember is that anyone injected with antibodies becomes a source of those antibodies for the future. You can take a sample of their blood<br>
and put it into the isolation centrifuge just like you did with the monkey's to produce more antibodies if you ever run out. For this reason, and because you might have<br>
gotten infected yourself in the process of synthesizing a cure, most Virologists will inject themselves with any antibodies they produce.<br><br>
<h2>Syndromes</h2>
Below are the possible syndromes of a virus and the stages they can appear at. A stage covers that stage and higher, so a stage 1 syndrome can appear at stage 4.<br>
A stage 4 syndrome, however, cannot appear any earlier than stage 4.<br><br>
<table>
<caption> <b>Syndromes</b> </caption>
<tr>
<th scope="col"> Stage</th>
<th scope="col"> Name</th>
<th scope="col" class="unsortable"> Effects
</th></tr>
<tr>
<td> 1 </td>
<td> Sneezing </td>
<td> Makes the patient sneeze. <b>Spreads airborne disease!</b>
</td></tr>
<tr>
<td> 1 </td>
<td> Mucus Buildup </td>
<td> Makes the patient's throat fill with mucus.
</td></tr>
<tr>
<td> 1 </td>
<td> Salivary Gland Stimulation </td>
<td> Makes the patient drool. <b>Spreads the disease!</b>
</td></tr>
<tr>
<td> 1 </td>
<td> Involuntary Twitching </td>
<td> Makes the patient twitch.
</td></tr>
<tr>
<td> 1 </td>
<td> Headache </td>
<td> Gives the patient a headache.
</td></tr>
<tr>
<td> 1 </td>
<td> Mlemington's Syndrome </td>
<td> Makes the patient 'mlem' uncontrollably.
</td></tr>
<tr>
<td> 1 </td>
<td> Spyndrome </td>
<td> Makes the patient spin uncontrollably.
</td></tr>
<tr>
<td> 2 </td>
<td> Involuntary Vocalization </td>
<td> Makes the patient scream.
</td></tr>
<tr>
<td> 2 </td>
<td> Vomiting </td>
<td> Makes the patient vomit. <b>Spreads the disease!</b>
</td></tr>
<tr>
<td> 2 </td>
<td> Excessive Sleepiness </td>
<td> Makes the patient drowsy.
</td></tr>
<tr>
<td> 2 </td>
<td> Narcolepsy </td>
<td> Makes the patient pass out at random.
</td></tr>
<tr>
<td> 2 </td>
<td> Vision Loss </td>
<td> Causes partial blindness.
</td></tr>
<tr>
<td> 2 </td>
<td> Severe Cough </td>
<td> Causes coughing. <b>Spreads airborne disease!</b>
</td></tr>
<tr>
<td> 2 </td>
<td> Digestive Inefficiency </td>
<td> Makes the patient always hungry.
</td></tr>
<tr>
<td> 2 </td>
<td> Reduced Circulation </td>
<td> Makes the patient shiver.
</td></tr>
<tr>
<td> 2 </td>
<td> Hair Loss </td>
<td> Causes the patient's hair to fall out.
</td></tr>
<tr>
<td> 2 </td>
<td> Overactive Adrenal Gland </td>
<td> Makes the patient jittery, but also faster.
</td></tr>
<tr>
<td> 2 </td>
<td> Tinnitus </td>
<td> Causes ringing in the patient's ears.
</td></tr>
<tr>
<td> 2 </td>
<td> Lingual Dissocation </td>
<td> Scrambles the patients language center of their brain.
</td></tr>
<tr>
<td> 3 </td>
<td> Hyperacidity </td>
<td> Causes small amounts of toxin damage.
</td></tr>
<tr>
<td> 3 </td>
<td> Nervous Motor Instability </td>
<td> Makes the patient shaky.
</td></tr>
<tr>
<td> 3 </td>
<td> Pineal Gland Decalcification </td>
<td> Gives the patient telepathy.
</td></tr>
<tr>
<td> 3 </td>
<td> Neurodegeneration </td>
<td> Causes brain damage.
</td></tr>
<tr>
<td> 3 </td>
<td> Hallucination </td>
<td> Causes hallucinations.
</td></tr>
<tr>
<td> 3 </td>
<td> Hearing Loss </td>
<td> A less severe hearing damage.
</td></tr>
<tr>
<td> 3 </td>
<td> Topographical Cretinism </td>
<td> Makes the patient incapable of walking straight.
</td></tr>
<tr>
<td> 3 </td>
<td> Uncontrolled Laughter </td>
<td> Causes the patient to laugh uncontrollably.
</td></tr>
<tr>
<td> 3 </td>
<td> DNA Degradation </td>
<td> Causes genetic damage.
</td></tr>
<tr>
<td> 3 </td>
<td> Phantom Aches </td>
<td> Causes groaning.
</td></tr>
<tr>
<td> 3 </td>
<td> Chemical Synthesis </td>
<td> Causes the synthesis of a certain chemical in the patient's bloodstream.
</td></tr>
<tr>
<td> 3 </td>
<td> Genetic Chameleonism </td>
<td> Prevents the patient from experiencing organ rejection.
</td></tr>
<tr>
<td> 3 </td>
<td> Mass Revectoring </td>
<td> Causes the patient to suddenly change size.
</td></tr>
<tr>
<td> 3 </td>
<td> Flipponov's Disease </td>
<td> Causes the patient to uncontrollably do a flip.
</td></tr>
<tr>
<td> 4 </td>
<td> Gibbingtons </td>
<td> Gibs the patients slowly.
</td></tr>
<tr>
<td> 4 </td>
<td> Radian's Syndrome </td>
<td> Irradiates the patient from the inside.
</td></tr>
<tr>
<td> 4 </td>
<td> Deafness </td>
<td> Causes complete deafness.
</td></tr>
<tr>
<td> 4 </td>
<td> Genome Regression </td>
<td> Turns the patient into the primitive form of their species.
</td></tr>
<tr>
<td> 4 </td>
<td> Windpipe Contraction </td>
<td> Causes the patient to involuntarily hold their breath.
</td></tr>
<tr>
<td> 4 </td>
<td> Autoimmune Response </td>
<td> Adds toxins to the patient's bloodstream.
</td></tr>
<tr>
<td> 4 </td>
<td> Catastrophic DNA Degeneration </td>
<td> Causes genetic damage and scrambles the patient's genes.
</td></tr>
<tr>
<td> 4 </td>
<td> Limb Paralysis </td>
<td> Temporary loss of use in the patient's individual arms and legs.
</td></tr>
<tr>
<td> 4 </td>
<td> Organ Shutdown </td>
<td> Slowly causes internal organ damage at random.
</td></tr>
<tr>
<td> 4 </td>
<td> Hyperaccelerated Aging </td>
<td> Ages the patient, causing external damage.
</td></tr>
<tr>
<td> 4 </td>
<td> Brittle Bones </td>
<td> Causes bones to break more easily.
</td></tr>
<tr>
<td> 4 </td>
<td> Organic Ignition </td>
<td> Slowly causes the patient to burst into flames.
</td></tr></table>
<br>
</body>
</html>
"}

View File

@@ -15,7 +15,7 @@
/obj/machinery/smartfridge/secure/virology
name = "\improper Refrigerated Virus Storage"
desc = "A refrigerated storage unit for storing viral material."
icon_contents = "drink"
icon_contents = "misc"
req_access = list(access_virology)
/obj/machinery/smartfridge/secure/virology/accept_check(var/obj/item/O as obj)

View File

@@ -1,3 +1,4 @@
<<<<<<< HEAD
/obj/structure/reagent_dispensers
name = "Dispenser"
desc = "..."
@@ -473,3 +474,956 @@
reagents.splash_area(get_turf(src), 3)
visible_message(span("danger", "The [src] bursts open, spreading oil all over the area."))
qdel(src)
||||||| parent of 257f18b7ed... Virology Revamp (#11384)
/obj/structure/reagent_dispensers
name = "Dispenser"
desc = "..."
icon = 'icons/obj/chemical_tanks.dmi'
icon_state = "tank"
layer = TABLE_LAYER
density = TRUE
anchored = FALSE
pressure_resistance = 2*ONE_ATMOSPHERE
var/obj/item/hose_connector/input/active/InputSocket
var/obj/item/hose_connector/output/active/OutputSocket
var/amount_per_transfer_from_this = 10
var/possible_transfer_amounts = list(10,25,50,100)
/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W as obj, mob/user as mob)
return
/obj/structure/reagent_dispensers/Destroy()
QDEL_NULL(InputSocket)
QDEL_NULL(OutputSocket)
..()
/obj/structure/reagent_dispensers/Initialize()
var/datum/reagents/R = new/datum/reagents(5000)
reagents = R
R.my_atom = src
if (!possible_transfer_amounts)
src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
InputSocket = new(src)
InputSocket.carrier = src
OutputSocket = new(src)
OutputSocket.carrier = src
. = ..()
/obj/structure/reagent_dispensers/examine(mob/user)
. = ..()
if(get_dist(user, src) <= 2)
. += "<span class='notice'>It contains:</span>"
if(reagents && reagents.reagent_list.len)
for(var/datum/reagent/R in reagents.reagent_list)
. += "<span class='notice'>[R.volume] units of [R.name]</span>"
else
. += "<span class='notice'>Nothing.</span>"
/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
set name = "Set transfer amount"
set category = "Object"
set src in view(1)
var/N = tgui_input_list(usr, "Amount per transfer from this:","[src]", possible_transfer_amounts)
if (N)
amount_per_transfer_from_this = N
/obj/structure/reagent_dispensers/ex_act(severity)
switch(severity)
if(1.0)
qdel(src)
return
if(2.0)
if (prob(50))
new /obj/effect/effect/water(src.loc)
qdel(src)
return
if(3.0)
if (prob(5))
new /obj/effect/effect/water(src.loc)
qdel(src)
return
else
return
/obj/structure/reagent_dispensers/blob_act()
qdel(src)
/*
* Tanks
*/
//Water
/obj/structure/reagent_dispensers/watertank
name = "water tank"
desc = "A water tank."
icon_state = "water"
amount_per_transfer_from_this = 10
/obj/structure/reagent_dispensers/watertank/Initialize()
. = ..()
reagents.add_reagent("water", 1000)
/obj/structure/reagent_dispensers/watertank/high
name = "high-capacity water tank"
desc = "A highly-pressurized water tank made to hold vast amounts of water.."
icon_state = "water_high"
/obj/structure/reagent_dispensers/watertank/high/Initialize()
. = ..()
reagents.add_reagent("water", 4000)
//Fuel
/obj/structure/reagent_dispensers/fueltank
name = "fuel tank"
desc = "A fuel tank."
icon_state = "fuel"
amount_per_transfer_from_this = 10
var/modded = 0
var/obj/item/device/assembly_holder/rig = null
/obj/structure/reagent_dispensers/fueltank/Initialize()
. = ..()
reagents.add_reagent("fuel",1000)
/obj/structure/reagent_dispensers/fueltank/high
name = "high-capacity fuel tank"
desc = "A highly-pressurized fuel tank made to hold vast amounts of fuel."
icon_state = "fuel_high"
/obj/structure/reagent_dispensers/fueltank/high/Initialize()
. = ..()
reagents.add_reagent("fuel",4000)
//Foam
/obj/structure/reagent_dispensers/foam
name = "foam tank"
desc = "A foam tank."
icon_state = "foam"
amount_per_transfer_from_this = 10
/obj/structure/reagent_dispensers/foam/Initialize()
. = ..()
reagents.add_reagent("firefoam",1000)
//Helium3
/obj/structure/reagent_dispensers/he3
name = "/improper He3 tank"
desc = "A Helium3 tank."
icon_state = "he3"
amount_per_transfer_from_this = 10
/obj/structure/reagent_dispenser/he3/Initialize()
..()
reagents.add_reagent("helium3",1000)
/*
* Misc
*/
/obj/structure/reagent_dispensers/fueltank/barrel
name = "hazardous barrel"
desc = "An open-topped barrel full of nasty-looking liquid."
icon = 'icons/obj/objects_vr.dmi'
icon_state = "barrel"
modded = TRUE
/obj/structure/reagent_dispensers/fueltank/barrel/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (W.is_wrench()) //can't wrench it shut, it's always open
return
return ..()
//VOREStation Add End
/obj/structure/reagent_dispensers/fueltank/examine(mob/user)
. = ..()
if(get_dist(user, src) <= 2)
if(modded)
. += "<span class='warning'>Fuel faucet is wrenched open, leaking the fuel!</span>"
if(rig)
. += "<span class='notice'>There is some kind of device rigged to the tank.</span>"
/obj/structure/reagent_dispensers/fueltank/attack_hand()
if (rig)
usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]")
if(do_after(usr, 20))
usr.visible_message("<span class='notice'>[usr] detaches [rig] from \the [src].</span>", "<span class='notice'>You detach [rig] from \the [src]</span>")
rig.loc = get_turf(usr)
rig = null
overlays = new/list()
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob)
src.add_fingerprint(user)
if (W.is_wrench())
user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \
"You wrench [src]'s faucet [modded ? "closed" : "open"]")
modded = modded ? 0 : 1
playsound(src, W.usesound, 75, 1)
if (modded)
message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>)")
log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.")
leak_fuel(amount_per_transfer_from_this)
if (istype(W,/obj/item/device/assembly_holder))
if (rig)
to_chat(user, "<span class='warning'>There is another device in the way.</span>")
return ..()
user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]")
if(do_after(user, 20))
user.visible_message("<span class='notice'>[user] rigs [W] to \the [src].</span>", "<span class='notice'>You rig [W] to \the [src]</span>")
var/obj/item/device/assembly_holder/H = W
if (istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter))
message_admins("[key_name_admin(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>)")
log_game("[key_name(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion.")
rig = W
user.drop_item()
W.loc = src
var/icon/test = getFlatIcon(W)
test.Shift(NORTH,1)
test.Shift(EAST,6)
add_overlay(test)
return ..()
/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj)
if(Proj.get_structure_damage())
if(istype(Proj.firer))
message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>).")
log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).")
if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
explode()
/obj/structure/reagent_dispensers/fueltank/ex_act()
explode()
/obj/structure/reagent_dispensers/fueltank/blob_act()
explode()
/obj/structure/reagent_dispensers/fueltank/proc/explode()
if (reagents.total_volume > 500)
explosion(src.loc,1,2,4)
else if (reagents.total_volume > 100)
explosion(src.loc,0,1,3)
else if (reagents.total_volume > 50)
explosion(src.loc,-1,1,2)
if(src)
qdel(src)
/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume)
if (modded)
explode()
else if (temperature > T0C+500)
explode()
return ..()
/obj/structure/reagent_dispensers/fueltank/Move()
if (..() && modded)
leak_fuel(amount_per_transfer_from_this/10.0)
/obj/structure/reagent_dispensers/fueltank/proc/leak_fuel(amount)
if (reagents.total_volume == 0)
return
amount = min(amount, reagents.total_volume)
reagents.remove_reagent("fuel",amount)
new /obj/effect/decal/cleanable/liquid_fuel(src.loc, amount,1)
/obj/structure/reagent_dispensers/peppertank
name = "Pepper Spray Refiller"
desc = "Refills pepper spray canisters."
icon = 'icons/obj/objects.dmi'
icon_state = "peppertank"
anchored = TRUE
density = FALSE
amount_per_transfer_from_this = 45
/obj/structure/reagent_dispensers/peppertank/Initialize()
. = ..()
reagents.add_reagent("condensedcapsaicin",1000)
/obj/structure/reagent_dispensers/water_cooler
name = "Water-Cooler"
desc = "A machine that dispenses water to drink."
amount_per_transfer_from_this = 5
icon = 'icons/obj/vending.dmi'
icon_state = "water_cooler"
possible_transfer_amounts = null
anchored = TRUE
var/bottle = 0
var/cups = 0
var/cupholder = 0
/obj/structure/reagent_dispensers/water_cooler/full
bottle = 1
cupholder = 1
cups = 10
/obj/structure/reagent_dispensers/water_cooler/Initialize()
. = ..()
if(bottle)
reagents.add_reagent("water",120)
update_icon()
/obj/structure/reagent_dispensers/water_cooler/examine(mob/user)
. = ..()
if(cupholder)
. += "<span class='notice'>There are [cups] cups in the cup dispenser.</span>"
/obj/structure/reagent_dispensers/water_cooler/verb/rotate_clockwise()
set name = "Rotate Cooler Clockwise"
set category = "Object"
set src in oview(1)
if (src.anchored || usr:stat)
to_chat(usr, "It is fastened to the floor!")
return 0
src.set_dir(turn(src.dir, 270))
return 1
/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/I as obj, mob/user as mob)
if(I.is_wrench())
src.add_fingerprint(user)
if(bottle)
playsound(src, I.usesound, 50, 1)
if(do_after(user, 20) && bottle)
to_chat(user, "<span class='notice'>You unfasten the jug.</span>")
var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = new /obj/item/weapon/reagent_containers/glass/cooler_bottle( src.loc )
for(var/datum/reagent/R in reagents.reagent_list)
var/total_reagent = reagents.get_reagent_amount(R.id)
G.reagents.add_reagent(R.id, total_reagent)
reagents.clear_reagents()
bottle = 0
update_icon()
else
if(anchored)
user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
else
user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
if(do_after(user, 20 * I.toolspeed, src))
if(!src) return
to_chat(user, "<span class='notice'>You [anchored? "un" : ""]secured \the [src]!</span>")
anchored = !anchored
playsound(src, I.usesound, 50, 1)
return
if(I.is_screwdriver())
if(cupholder)
playsound(src, I.usesound, 50, 1)
to_chat(user, "<span class='notice'>You take the cup dispenser off.</span>")
new /obj/item/stack/material/plastic( src.loc )
if(cups)
for(var/i = 0 to cups)
new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src.loc)
cups = 0
cupholder = 0
update_icon()
return
if(!bottle && !cupholder)
playsound(src, I.usesound, 50, 1)
to_chat(user, "<span class='notice'>You start taking the water-cooler apart.</span>")
if(do_after(user, 20 * I.toolspeed) && !bottle && !cupholder)
to_chat(user, "<span class='notice'>You take the water-cooler apart.</span>")
new /obj/item/stack/material/plastic( src.loc, 4 )
qdel(src)
return
if(istype(I, /obj/item/weapon/reagent_containers/glass/cooler_bottle))
src.add_fingerprint(user)
if(!bottle)
if(anchored)
var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = I
to_chat(user, "<span class='notice'>You start to screw the bottle onto the water-cooler.</span>")
if(do_after(user, 20) && !bottle && anchored)
bottle = 1
update_icon()
to_chat(user, "<span class='notice'>You screw the bottle onto the water-cooler!</span>")
for(var/datum/reagent/R in G.reagents.reagent_list)
var/total_reagent = G.reagents.get_reagent_amount(R.id)
reagents.add_reagent(R.id, total_reagent)
qdel(G)
else
to_chat(user, "<span class='warning'>You need to wrench down the cooler first.</span>")
else
to_chat(user, "<span class='warning'>There is already a bottle there!</span>")
return 1
if(istype(I, /obj/item/stack/material/plastic))
if(!cupholder)
if(anchored)
var/obj/item/stack/material/plastic/P = I
src.add_fingerprint(user)
to_chat(user, "<span class='notice'>You start to attach a cup dispenser onto the water-cooler.</span>")
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20) && !cupholder && anchored)
if (P.use(1))
to_chat(user, "<span class='notice'>You attach a cup dispenser onto the water-cooler.</span>")
cupholder = 1
update_icon()
else
to_chat(user, "<span class='warning'>You need to wrench down the cooler first.</span>")
else
to_chat(user, "<span class='warning'>There is already a cup dispenser there!</span>")
return
/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/user)
if(cups)
new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src.loc)
cups--
flick("[icon_state]-vend", src)
return
/obj/structure/reagent_dispensers/water_cooler/update_icon()
icon_state = "water_cooler"
cut_overlays()
if(bottle)
add_overlay("water_cooler_bottle")
/obj/structure/reagent_dispensers/beerkeg
name = "beer keg"
desc = "A beer keg."
icon = 'icons/obj/objects.dmi'
icon_state = "beertankTEMP"
amount_per_transfer_from_this = 10
/obj/structure/reagent_dispensers/beerkeg/Initialize()
. = ..()
reagents.add_reagent("beer",1000)
/obj/structure/reagent_dispensers/beerkeg/fakenuke
name = "nuclear beer keg"
desc = "A beer keg in the form of a nuclear bomb! An absolute blast at parties!"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "nuclearbomb0"
/obj/structure/reagent_dispensers/virusfood
name = "Virus Food Dispenser"
desc = "A dispenser of virus food. Yum."
icon = 'icons/obj/objects.dmi'
icon_state = "virusfoodtank"
amount_per_transfer_from_this = 10
anchored = TRUE
/obj/structure/reagent_dispensers/virusfood/Initialize()
. = ..()
reagents.add_reagent("virusfood", 1000)
/obj/structure/reagent_dispensers/acid
name = "Sulphuric Acid Dispenser"
desc = "A dispenser of acid for industrial processes."
icon = 'icons/obj/objects.dmi'
icon_state = "acidtank"
amount_per_transfer_from_this = 10
anchored = TRUE
/obj/structure/reagent_dispensers/acid/Initialize()
. = ..()
reagents.add_reagent("sacid", 1000)
//Cooking oil refill tank
/obj/structure/reagent_dispensers/cookingoil
name = "cooking oil tank"
desc = "A fifty-litre tank of commercial-grade corn oil, intended for use in large scale deep fryers. Store in a cool, dark place"
icon = 'icons/obj/objects.dmi'
icon_state = "oiltank"
amount_per_transfer_from_this = 120
/obj/structure/reagent_dispensers/cookingoil/New()
..()
reagents.add_reagent("cornoil",5000)
/obj/structure/reagent_dispensers/cookingoil/bullet_act(var/obj/item/projectile/Proj)
if(Proj.get_structure_damage())
explode()
/obj/structure/reagent_dispensers/cookingoil/ex_act()
explode()
/obj/structure/reagent_dispensers/cookingoil/proc/explode()
reagents.splash_area(get_turf(src), 3)
visible_message(span("danger", "The [src] bursts open, spreading oil all over the area."))
qdel(src)
=======
/obj/structure/reagent_dispensers
name = "Dispenser"
desc = "..."
icon = 'icons/obj/chemical_tanks.dmi'
icon_state = "tank"
layer = TABLE_LAYER
density = TRUE
anchored = FALSE
pressure_resistance = 2*ONE_ATMOSPHERE
var/obj/item/hose_connector/input/active/InputSocket
var/obj/item/hose_connector/output/active/OutputSocket
var/amount_per_transfer_from_this = 10
var/possible_transfer_amounts = list(10,25,50,100)
/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W as obj, mob/user as mob)
return
/obj/structure/reagent_dispensers/Destroy()
QDEL_NULL(InputSocket)
QDEL_NULL(OutputSocket)
..()
/obj/structure/reagent_dispensers/Initialize()
var/datum/reagents/R = new/datum/reagents(5000)
reagents = R
R.my_atom = src
if (!possible_transfer_amounts)
src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
InputSocket = new(src)
InputSocket.carrier = src
OutputSocket = new(src)
OutputSocket.carrier = src
. = ..()
/obj/structure/reagent_dispensers/examine(mob/user)
. = ..()
if(get_dist(user, src) <= 2)
. += "<span class='notice'>It contains:</span>"
if(reagents && reagents.reagent_list.len)
for(var/datum/reagent/R in reagents.reagent_list)
. += "<span class='notice'>[R.volume] units of [R.name]</span>"
else
. += "<span class='notice'>Nothing.</span>"
/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
set name = "Set transfer amount"
set category = "Object"
set src in view(1)
var/N = tgui_input_list(usr, "Amount per transfer from this:","[src]", possible_transfer_amounts)
if (N)
amount_per_transfer_from_this = N
/obj/structure/reagent_dispensers/ex_act(severity)
switch(severity)
if(1.0)
qdel(src)
return
if(2.0)
if (prob(50))
new /obj/effect/effect/water(src.loc)
qdel(src)
return
if(3.0)
if (prob(5))
new /obj/effect/effect/water(src.loc)
qdel(src)
return
else
return
/obj/structure/reagent_dispensers/blob_act()
qdel(src)
/*
* Tanks
*/
//Water
/obj/structure/reagent_dispensers/watertank
name = "water tank"
desc = "A water tank."
icon_state = "water"
amount_per_transfer_from_this = 10
/obj/structure/reagent_dispensers/watertank/Initialize()
. = ..()
reagents.add_reagent("water", 1000)
/obj/structure/reagent_dispensers/watertank/high
name = "high-capacity water tank"
desc = "A highly-pressurized water tank made to hold vast amounts of water.."
icon_state = "water_high"
/obj/structure/reagent_dispensers/watertank/high/Initialize()
. = ..()
reagents.add_reagent("water", 4000)
//Fuel
/obj/structure/reagent_dispensers/fueltank
name = "fuel tank"
desc = "A fuel tank."
icon_state = "fuel"
amount_per_transfer_from_this = 10
var/modded = 0
var/obj/item/device/assembly_holder/rig = null
/obj/structure/reagent_dispensers/fueltank/Initialize()
. = ..()
reagents.add_reagent("fuel",1000)
/obj/structure/reagent_dispensers/fueltank/high
name = "high-capacity fuel tank"
desc = "A highly-pressurized fuel tank made to hold vast amounts of fuel."
icon_state = "fuel_high"
/obj/structure/reagent_dispensers/fueltank/high/Initialize()
. = ..()
reagents.add_reagent("fuel",4000)
//Foam
/obj/structure/reagent_dispensers/foam
name = "foam tank"
desc = "A foam tank."
icon_state = "foam"
amount_per_transfer_from_this = 10
/obj/structure/reagent_dispensers/foam/Initialize()
. = ..()
reagents.add_reagent("firefoam",1000)
//Helium3
/obj/structure/reagent_dispensers/he3
name = "/improper He3 tank"
desc = "A Helium3 tank."
icon_state = "he3"
amount_per_transfer_from_this = 10
/obj/structure/reagent_dispenser/he3/Initialize()
..()
reagents.add_reagent("helium3",1000)
/*
* Misc
*/
/obj/structure/reagent_dispensers/fueltank/barrel
name = "hazardous barrel"
desc = "An open-topped barrel full of nasty-looking liquid."
icon = 'icons/obj/objects_vr.dmi'
icon_state = "barrel"
modded = TRUE
/obj/structure/reagent_dispensers/fueltank/barrel/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (W.is_wrench()) //can't wrench it shut, it's always open
return
return ..()
//VOREStation Add End
/obj/structure/reagent_dispensers/fueltank/examine(mob/user)
. = ..()
if(get_dist(user, src) <= 2)
if(modded)
. += "<span class='warning'>Fuel faucet is wrenched open, leaking the fuel!</span>"
if(rig)
. += "<span class='notice'>There is some kind of device rigged to the tank.</span>"
/obj/structure/reagent_dispensers/fueltank/attack_hand()
if (rig)
usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]")
if(do_after(usr, 20))
usr.visible_message("<span class='notice'>[usr] detaches [rig] from \the [src].</span>", "<span class='notice'>You detach [rig] from \the [src]</span>")
rig.loc = get_turf(usr)
rig = null
overlays = new/list()
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob)
src.add_fingerprint(user)
if (W.is_wrench())
user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \
"You wrench [src]'s faucet [modded ? "closed" : "open"]")
modded = modded ? 0 : 1
playsound(src, W.usesound, 75, 1)
if (modded)
message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>)")
log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.")
leak_fuel(amount_per_transfer_from_this)
if (istype(W,/obj/item/device/assembly_holder))
if (rig)
to_chat(user, "<span class='warning'>There is another device in the way.</span>")
return ..()
user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]")
if(do_after(user, 20))
user.visible_message("<span class='notice'>[user] rigs [W] to \the [src].</span>", "<span class='notice'>You rig [W] to \the [src]</span>")
var/obj/item/device/assembly_holder/H = W
if (istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter))
message_admins("[key_name_admin(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>)")
log_game("[key_name(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion.")
rig = W
user.drop_item()
W.loc = src
var/icon/test = getFlatIcon(W)
test.Shift(NORTH,1)
test.Shift(EAST,6)
add_overlay(test)
return ..()
/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj)
if(Proj.get_structure_damage())
if(istype(Proj.firer))
message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>).")
log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).")
if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
explode()
/obj/structure/reagent_dispensers/fueltank/ex_act()
explode()
/obj/structure/reagent_dispensers/fueltank/blob_act()
explode()
/obj/structure/reagent_dispensers/fueltank/proc/explode()
if (reagents.total_volume > 500)
explosion(src.loc,1,2,4)
else if (reagents.total_volume > 100)
explosion(src.loc,0,1,3)
else if (reagents.total_volume > 50)
explosion(src.loc,-1,1,2)
if(src)
qdel(src)
/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume)
if (modded)
explode()
else if (temperature > T0C+500)
explode()
return ..()
/obj/structure/reagent_dispensers/fueltank/Move()
if (..() && modded)
leak_fuel(amount_per_transfer_from_this/10.0)
/obj/structure/reagent_dispensers/fueltank/proc/leak_fuel(amount)
if (reagents.total_volume == 0)
return
amount = min(amount, reagents.total_volume)
reagents.remove_reagent("fuel",amount)
new /obj/effect/decal/cleanable/liquid_fuel(src.loc, amount,1)
/obj/structure/reagent_dispensers/peppertank
name = "Pepper Spray Refiller"
desc = "Refills pepper spray canisters."
icon = 'icons/obj/objects.dmi'
icon_state = "peppertank"
anchored = TRUE
density = FALSE
amount_per_transfer_from_this = 45
/obj/structure/reagent_dispensers/peppertank/Initialize()
. = ..()
reagents.add_reagent("condensedcapsaicin",1000)
/obj/structure/reagent_dispensers/water_cooler
name = "Water-Cooler"
desc = "A machine that dispenses water to drink."
amount_per_transfer_from_this = 5
icon = 'icons/obj/vending.dmi'
icon_state = "water_cooler"
possible_transfer_amounts = null
anchored = TRUE
var/bottle = 0
var/cups = 0
var/cupholder = 0
/obj/structure/reagent_dispensers/water_cooler/full
bottle = 1
cupholder = 1
cups = 10
/obj/structure/reagent_dispensers/water_cooler/Initialize()
. = ..()
if(bottle)
reagents.add_reagent("water",120)
update_icon()
/obj/structure/reagent_dispensers/water_cooler/examine(mob/user)
. = ..()
if(cupholder)
. += "<span class='notice'>There are [cups] cups in the cup dispenser.</span>"
/obj/structure/reagent_dispensers/water_cooler/verb/rotate_clockwise()
set name = "Rotate Cooler Clockwise"
set category = "Object"
set src in oview(1)
if (src.anchored || usr:stat)
to_chat(usr, "It is fastened to the floor!")
return 0
src.set_dir(turn(src.dir, 270))
return 1
/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/I as obj, mob/user as mob)
if(I.is_wrench())
src.add_fingerprint(user)
if(bottle)
playsound(src, I.usesound, 50, 1)
if(do_after(user, 20) && bottle)
to_chat(user, "<span class='notice'>You unfasten the jug.</span>")
var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = new /obj/item/weapon/reagent_containers/glass/cooler_bottle( src.loc )
for(var/datum/reagent/R in reagents.reagent_list)
var/total_reagent = reagents.get_reagent_amount(R.id)
G.reagents.add_reagent(R.id, total_reagent)
reagents.clear_reagents()
bottle = 0
update_icon()
else
if(anchored)
user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
else
user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
if(do_after(user, 20 * I.toolspeed, src))
if(!src) return
to_chat(user, "<span class='notice'>You [anchored? "un" : ""]secured \the [src]!</span>")
anchored = !anchored
playsound(src, I.usesound, 50, 1)
return
if(I.is_screwdriver())
if(cupholder)
playsound(src, I.usesound, 50, 1)
to_chat(user, "<span class='notice'>You take the cup dispenser off.</span>")
new /obj/item/stack/material/plastic( src.loc )
if(cups)
for(var/i = 0 to cups)
new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src.loc)
cups = 0
cupholder = 0
update_icon()
return
if(!bottle && !cupholder)
playsound(src, I.usesound, 50, 1)
to_chat(user, "<span class='notice'>You start taking the water-cooler apart.</span>")
if(do_after(user, 20 * I.toolspeed) && !bottle && !cupholder)
to_chat(user, "<span class='notice'>You take the water-cooler apart.</span>")
new /obj/item/stack/material/plastic( src.loc, 4 )
qdel(src)
return
if(istype(I, /obj/item/weapon/reagent_containers/glass/cooler_bottle))
src.add_fingerprint(user)
if(!bottle)
if(anchored)
var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = I
to_chat(user, "<span class='notice'>You start to screw the bottle onto the water-cooler.</span>")
if(do_after(user, 20) && !bottle && anchored)
bottle = 1
update_icon()
to_chat(user, "<span class='notice'>You screw the bottle onto the water-cooler!</span>")
for(var/datum/reagent/R in G.reagents.reagent_list)
var/total_reagent = G.reagents.get_reagent_amount(R.id)
reagents.add_reagent(R.id, total_reagent)
qdel(G)
else
to_chat(user, "<span class='warning'>You need to wrench down the cooler first.</span>")
else
to_chat(user, "<span class='warning'>There is already a bottle there!</span>")
return 1
if(istype(I, /obj/item/stack/material/plastic))
if(!cupholder)
if(anchored)
var/obj/item/stack/material/plastic/P = I
src.add_fingerprint(user)
to_chat(user, "<span class='notice'>You start to attach a cup dispenser onto the water-cooler.</span>")
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20) && !cupholder && anchored)
if (P.use(1))
to_chat(user, "<span class='notice'>You attach a cup dispenser onto the water-cooler.</span>")
cupholder = 1
update_icon()
else
to_chat(user, "<span class='warning'>You need to wrench down the cooler first.</span>")
else
to_chat(user, "<span class='warning'>There is already a cup dispenser there!</span>")
return
/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/user)
if(cups)
new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src.loc)
cups--
flick("[icon_state]-vend", src)
return
/obj/structure/reagent_dispensers/water_cooler/update_icon()
icon_state = "water_cooler"
cut_overlays()
if(bottle)
add_overlay("water_cooler_bottle")
/obj/structure/reagent_dispensers/beerkeg
name = "beer keg"
desc = "A beer keg."
icon = 'icons/obj/objects.dmi'
icon_state = "beertankTEMP"
amount_per_transfer_from_this = 10
/obj/structure/reagent_dispensers/beerkeg/Initialize()
. = ..()
reagents.add_reagent("beer",1000)
/obj/structure/reagent_dispensers/beerkeg/fakenuke
name = "nuclear beer keg"
desc = "A beer keg in the form of a nuclear bomb! An absolute blast at parties!"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "nuclearbomb0"
/obj/structure/reagent_dispensers/virusfood
name = "Virus Food Dispenser"
desc = "A dispenser of virus food. Yum."
icon = 'icons/obj/virology_vr.dmi'
icon_state = "virusfoodtank"
amount_per_transfer_from_this = 10
anchored = TRUE
/obj/structure/reagent_dispensers/virusfood/Initialize()
. = ..()
reagents.add_reagent("virusfood", 1000)
/obj/structure/reagent_dispensers/acid
name = "Sulphuric Acid Dispenser"
desc = "A dispenser of acid for industrial processes."
icon = 'icons/obj/objects.dmi'
icon_state = "acidtank"
amount_per_transfer_from_this = 10
anchored = TRUE
/obj/structure/reagent_dispensers/acid/Initialize()
. = ..()
reagents.add_reagent("sacid", 1000)
//Cooking oil refill tank
/obj/structure/reagent_dispensers/cookingoil
name = "cooking oil tank"
desc = "A fifty-litre tank of commercial-grade corn oil, intended for use in large scale deep fryers. Store in a cool, dark place"
icon = 'icons/obj/objects.dmi'
icon_state = "oiltank"
amount_per_transfer_from_this = 120
/obj/structure/reagent_dispensers/cookingoil/New()
..()
reagents.add_reagent("cornoil",5000)
/obj/structure/reagent_dispensers/cookingoil/bullet_act(var/obj/item/projectile/Proj)
if(Proj.get_structure_damage())
explode()
/obj/structure/reagent_dispensers/cookingoil/ex_act()
explode()
/obj/structure/reagent_dispensers/cookingoil/proc/explode()
reagents.splash_area(get_turf(src), 3)
visible_message(span("danger", "The [src] bursts open, spreading oil all over the area."))
qdel(src)
>>>>>>> 257f18b7ed... Virology Revamp (#11384)

View File

@@ -255,7 +255,7 @@ var/global/list/virusDB = list()
"species" = jointext(affected_species, ", "),
"ref" = "\ref[src]",
)
var/list/symptoms = list()
for(var/datum/disease2/effectholder/E in effects)
symptoms.Add(list(list(

View File

@@ -3,7 +3,8 @@
/obj/item/device/antibody_scanner
name = "antibody scanner"
desc = "Scans living beings for antibodies in their blood."
icon_state = "health"
icon = 'icons/obj/device_vr.dmi'
icon_state = "antibody"
w_class = ITEMSIZE_SMALL
item_state = "electronic"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

File diff suppressed because it is too large Load Diff