Merge pull request #11401 from VOREStation/master

August 13th 2021 Update
This commit is contained in:
Aronai Sieyes
2021-08-13 11:57:02 -04:00
committed by GitHub
55 changed files with 70615 additions and 65638 deletions
+3 -2
View File
@@ -79,7 +79,7 @@
/obj/item/stack/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
data["amount"] = get_amount()
return data
@@ -123,7 +123,7 @@
if(get_amount() < 1)
qdel(src)
return
var/datum/stack_recipe/R = locate(params["ref"])
if(!is_valid_recipe(R, recipes)) //href exploit protection
return FALSE
@@ -302,6 +302,7 @@
if(uses_charge)
return null
tamount = round(tamount)
var/transfer = max(min(tamount, src.amount, initial(max_amount)), 0)
var/orig_amount = src.amount
+444
View File
@@ -1377,3 +1377,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>
"}
@@ -60,7 +60,7 @@
//VOREStation Add Start
/obj/structure/closet/walllocker/medical
name = "first-aid closet"
desc = "It's wall-mounted storage unit for first aid supplies."
desc = "It's a wall-mounted storage unit for first aid supplies."
closet_appearance = /decl/closet_appearance/wall/medical
/obj/structure/closet/walllocker/medical/north
@@ -92,6 +92,7 @@
wall_mounted = 1
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
door_anim_time = 0 //Unsupported
/obj/structure/closet/walllocker_double/north
pixel_y = 32
@@ -72,6 +72,8 @@
to_chat(M, "<span class='notice'>You are <b>[newPred]</b>, somehow having gotten aboard the station in search of food. \
You are wary of environment around you, but you do feel rather peckish. Stick around dark, secluded places to avoid danger or, \
if you are cute enough, try to make friends with this place's inhabitants.</span>")
to_chat(M, "<span class='critical'>Please be advised, this role is NOT AN ANTAGONIST.</span>")
to_chat(M, "<span class='warning'>You may be a spooky space monster, but your role is to facilitate spooky space monster roleplay, not to fight the station and kill people. You can of course eat and/or digest people as you like if OOC prefs align, but this should be done as part of roleplay. If you intend to fight the station and kill people and such, you need permission from the staff team. GENERALLY, this role should avoid well populated areas. Youre a weird spooky space monster, so the bar is probably not where youd want to go if you intend to survive. Of course, youre welcome to try to make friends and roleplay how you will in this regard, but something to keep in mind.</span>")
newPred.ckey = M.ckey
newPred.visible_message("<span class='warning'>[newPred] emerges from somewhere!</span>")
@@ -108,6 +110,9 @@
to_chat(M, "<span class='notice'>You can use shift + click on objects to disguise yourself as them, but your strikes are nearly useless when you are disguised. \
You can undisguise yourself by shift + clicking yourself, but disguise being switched, or turned on and off has a short cooldown. You can also ventcrawl, \
by using alt + click on the vent or scrubber.</span>")
to_chat(M, "<span class='critical'>Please be advised, this role is NOT AN ANTAGONIST.</span>")
to_chat(M, "<span class='warning'>You may be a spooky space monster, but your role is to facilitate spooky space monster roleplay, not to fight the station and kill people. You can of course eat and/or digest people as you like if OOC prefs align, but this should be done as part of roleplay. If you intend to fight the station and kill people and such, you need permission from the staff team. GENERALLY, this role should avoid well populated areas. Youre a weird spooky space monster, so the bar is probably not where youd want to go if you intend to survive. Of course, youre welcome to try to make friends and roleplay how you will in this regard, but something to keep in mind.</span>")
newMorph.ckey = M.ckey
newMorph.visible_message("<span class='warning'>A morph appears to crawl out of somewhere.</span>")
+25 -5
View File
@@ -2,7 +2,7 @@
* To map these, place down a /obj/effect/fancy_shuttle on the map and lay down /turf/simulated/wall/fancy_shuttle
* everywhere that is included in the sprite. Up to you if you want to make some opacity=FALSE or density=FALSE
* Set a matching fancy_shuttle_tag on your walls and on the /obj/effect/fancy_shuttle. Make sure it's unique.
*
*
* If you want flooring to look like the shuttle flooring, put /obj/effect/floor_decal/fancy_shuttle on all of it.
* You can add your own decals on top of that. Just make sure to put the fancy_shuttle decal lowest.
* Also set the same tag as your /obj/effect/fancy_shuttle on the decals.
@@ -56,7 +56,7 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
// Reinforced hull steel
/turf/simulated/wall/fancy_shuttle/Initialize(mapload, materialtype, rmaterialtype, girdertype)
. = ..(mapload, MAT_STEELHULL, MAT_STEELHULL, MAT_STEELHULL)
. = ..(mapload, MAT_STEELHULL, MAT_STEELHULL, MAT_STEELHULL)
/turf/simulated/wall/fancy_shuttle/window
opacity = FALSE
@@ -108,14 +108,14 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
remove_underlay()
var/turf/path = get_base_turf_by_area(src) || /turf/space
var/do_plane = null
var/do_state = initial(path.icon_state)
var/do_icon = initial(path.icon)
if(ispath(path, /turf/space))
do_plane = SPACE_PLANE
do_state = "white"
under_EM = mutable_appearance('icons/turf/space.dmi', "white", plane = PLANE_O_LIGHTING_VISUAL)
under_EM.filters = filter(type = "alpha", icon = icon(src.icon, src.icon_state), flags = MASK_INVERSE)
@@ -128,7 +128,7 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
/turf/simulated/wall/fancy_shuttle/update_icon()
if(!damage_overlays[1])
generate_overlays()
cut_overlays()
if(fancy_shuttle_tag) // after a shuttle jump it won't be set anymore, but the shuttle jump proc will set our icon and state
var/obj/effect/fancy_shuttle/F = GLOB.fancy_shuttles[fancy_shuttle_tag]
@@ -321,6 +321,26 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
/obj/effect/fancy_shuttle_floor_preview/lifeboat
icon = 'icons/turf/fancy_shuttles/lifeboat_preview.dmi'
/**
* Lifeboat1 (Tether)
* North facing: W:5, H:7
*/
/obj/effect/fancy_shuttle/lifeboat1
icon = 'icons/turf/fancy_shuttles/lifeboat1_preview.dmi'
split_file = 'icons/turf/fancy_shuttles/lifeboat1.dmi'
/obj/effect/fancy_shuttle_floor_preview/lifeboat1
icon = 'icons/turf/fancy_shuttles/lifeboat1_preview.dmi'
/**
* Lifeboat2 (Tether)
* North facing: W:5, H:12
*/
/obj/effect/fancy_shuttle/lifeboat2
icon = 'icons/turf/fancy_shuttles/lifeboat2_preview.dmi'
split_file = 'icons/turf/fancy_shuttles/lifeboat2.dmi'
/obj/effect/fancy_shuttle_floor_preview/lifeboat2
icon = 'icons/turf/fancy_shuttles/lifeboat2_preview.dmi'
/**
* Pod
* North facing: W:3, H:4
+26 -1
View File
@@ -572,7 +572,6 @@ var/failed_old_db_connections = 0
return 1
/proc/setup_database_connection()
if(failed_db_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to conenct anymore.
return 0
@@ -650,6 +649,32 @@ var/failed_old_db_connections = 0
else
return 1
// Cleans up DB connections and recreates them
/proc/reset_database_connections()
var/list/results = list("-- Resetting DB connections --")
failed_db_connections = 0
if(dbcon?.IsConnected())
dbcon.Disconnect()
results += "dbcon was connected and asked to disconnect"
else
results += "dbcon was not connected"
if(dbcon_old?.IsConnected())
results += "WARNING: dbcon_old is connected, not touching it, but is this intentional?"
if(!config.sql_enabled)
results += "stopping because config.sql_enabled = false"
else
. = setup_database_connection()
if(.)
results += "SUCCESS: set up a connection successfully with setup_database_connection()"
else
results += "FAIL: failed to connect to the database with setup_database_connection()"
results += "-- DB Reset End --"
to_world_log(results.Join("\n"))
// Things to do when a new z-level was just made.
/world/proc/max_z_changed()
if(!istype(GLOB.players_by_zlevel, /list))
@@ -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)
@@ -47,6 +47,58 @@
w_class = ITEMSIZE_NORMAL
update_icon()
// Baton chompers
/obj/item/weapon/dogborg/jaws/ert
name = "ert jaws"
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "ertjaws"
desc = "Shockingly chompy!"
force = 15
throwforce = 0
hitsound = 'sound/weapons/bite.ogg'
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
w_class = ITEMSIZE_NORMAL
var/charge_cost = 15
/obj/item/weapon/dogborg/jaws/ert/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
if(isrobot(target))
return ..()
var/agony = 60 // Copied from stun batons
var/stun = 0 // ... same
var/obj/item/organ/external/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
affecting = H.get_organ(hit_zone)
if(user.a_intent == I_HURT)
// Parent handles messages
. = ..()
//whacking someone causes a much poorer electrical contact than deliberately prodding them.
agony *= 0.5
stun *= 0.5
else
if(affecting)
target.visible_message("<span class='danger'>[target] has been zap-chomped in the [affecting.name] with [src] by [user]!</span>")
else
target.visible_message("<span class='danger'>[target] has been zap-chomped with [src] by [user]!</span>")
playsound(src, 'sound/weapons/Egloves.ogg', 50, 1, -1)
// Try to use power
var/stunning = FALSE
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc
if(R.cell?.use(charge_cost) == charge_cost)
stunning = TRUE
if(stunning)
target.stun_effect_act(stun, agony, hit_zone, src)
msg_admin_attack("[key_name(user)] stunned [key_name(target)] with the [src].")
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.forcesay(hit_appends)
//Boop //New and improved, now a simple reagent sniffer.
/obj/item/device/dogborg/boop_module
name = "boop module"
@@ -314,7 +366,7 @@
name = "disabler"
desc = "A small and nonlethal gun produced by NT.."
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "projgun"
icon_state = "ertgunstun"
fire_sound = 'sound/weapons/eLuger.ogg'
projectile_type = /obj/item/projectile/beam/disable
charge_cost = 240 //Normal cost of a taser. It used to be 1000, but after some testing it was found that it would sap a borg's battery to quick
@@ -714,11 +714,16 @@
max_item_count = 10
recycles = FALSE
#undef SLEEPER_INJECT_COST
/obj/item/device/dogborg/sleeper/compactor/brewer
name = "Brew Belly"
desc = "A mounted drunk tank unit with fuel processor."
icon_state = "brewer"
injection_chems = null
injection_chems = null
/obj/item/device/dogborg/sleeper/K9/ert
name = "ERT Belly"
desc = "A mounted 'emergency containment cell'."
icon_state = "sleeperert"
injection_chems = list("inaprovaline", "paracetamol") // short list
#undef SLEEPER_INJECT_COST
@@ -311,13 +311,13 @@
can_be_pushed = 0
sprites = list(
"Standard" = "ert",
"Classic" = "ertold",
"Borgi" = "borgi"
)
/obj/item/weapon/robot_module/robot/ert/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
src.modules += new /obj/item/weapon/dogborg/jaws/big(src)
src.modules += new /obj/item/weapon/melee/baton/robot(src)
src.modules += new /obj/item/weapon/dogborg/jaws/ert(src)
src.modules += new /obj/item/taperoll/police(src)
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg/ertgun(src)
src.modules += new /obj/item/weapon/dogborg/swordtail(src)
@@ -333,11 +333,12 @@
T.water = water
src.modules += T
var/obj/item/device/dogborg/sleeper/K9/B = new /obj/item/device/dogborg/sleeper/K9(src)
var/obj/item/device/dogborg/sleeper/K9/B = new /obj/item/device/dogborg/sleeper/K9/ert(src)
B.water = water
src.modules += B
R.icon = 'icons/mob/64x64robot_vr.dmi'
R.icon = 'icons/mob/widerobot_ert_vr.dmi'
R.wideborg_dept = 'icons/mob/widerobot_ert_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
R.pixel_x = -16
@@ -145,7 +145,7 @@
if(custom_sprite == TRUE)
return
if(wideborg == TRUE)
if(icontype== "Drake") // Why, Why can't we have normal nice things
if(icontype == "Drake") // Why, Why can't we have normal nice things
icon = 'icons/mob/drakeborg/drakeborg_vr.dmi'
else
icon = wideborg_dept
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,164 @@
/mob/living/simple_mob/vore/greatwolf
name = "great white wolf"
desc = "A massive white wolf, with piercing green eyes. Much like a dire wolf, but bigger. Passive, until you give it a reason to not be."
catalogue_data = list(/datum/category_item/catalogue/fauna/greatwolf)
tt_desc = "Canis lupus greatus"
icon = 'icons/mob/vore128x64.dmi'
icon_dead = "whitewolf-dead"
icon_living = "whitewolf"
icon_state = "whitewolf"
icon_rest = "whitewolf-rest"
faction = "sif"
has_eye_glow = TRUE
meat_amount = 40 //Big dog, lots of meat
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
old_x = -48
old_y = 0
melee_damage_lower = 20
melee_damage_upper = 15
friendly = list("nudges", "sniffs on", "rumbles softly at", "slobberlicks")
default_pixel_x = -48
pixel_x = -48
pixel_y = 0
response_help = "pets"
response_disarm = "shoves"
response_harm = "smacks"
movement_cooldown = 2
harm_intent_damage = 10
melee_damage_lower = 10
melee_damage_upper = 20
maxHealth = 500
attacktext = list("chomped")
see_in_dark = 8
minbodytemp = 0
ai_holder_type = /datum/ai_holder/simple_mob/retaliate
max_buckled_mobs = 1
mount_offset_y = 32
mount_offset_x = -16
can_buckle = TRUE
buckle_movable = TRUE
buckle_lying = FALSE
/mob/living/simple_mob/vore/greatwolf
vore_bump_chance = 25
vore_digest_chance = 5
vore_escape_chance = 5
vore_pounce_chance = 25
vore_active = 1
vore_icons = 2
vore_icons = SA_ICON_LIVING | SA_ICON_REST
vore_capacity = 2
swallowTime = 50
vore_ignores_undigestable = TRUE
vore_default_mode = DM_HEAL
vore_pounce_maxhealth = 125
vore_bump_emote = "tries to snap up"
/mob/living/simple_mob/vore/greatwolf/black
name = "great black wolf"
desc = "A massive black wolf with a sandy colored underside, and intimidating amber eyes. Much like a dire wolf, but bigger. Passive, until you give it a reason to not be."
icon_dead = "blackwolf-dead"
icon_living = "blackwolf"
icon_state = "blackwolf"
icon_rest = "blackwolf-rest"
/mob/living/simple_mob/vore/greatwolf/grey
name = "great grey wolf"
desc = "Shouldn't he have a sword or something?"
icon_dead = "sifwolf-dead"
icon_living = "sifwolf"
icon_state = "sifwolf"
icon_rest = "blackwolf-rest"
maxHealth = 900 //boss, with air quotes
harm_intent_damage = 10
melee_damage_lower = 15
melee_damage_upper = 25
/datum/category_item/catalogue/fauna/greatwolf
name = "Sivian Fauna - Great Wolf"
desc = "Classification: Canis lupus greatus\
<br><br>\
Canis Lupus Greatus, or Great Wolf, is a very large predator not beleived to be native to Sif (because it's a wolf, duh), but it has been never been found anywhere else. Despite their size, they are gentle, unless disturbed.\
The majority of a great white wolf's long life is spent much the same as ordinary wolves. However, great wolves usually do not trouble themselves with small prey like humans, \
usually preferring instead to hunt Saviks and Kururaks, and sometimes, leopardmanders or invasive red dragons. \
Though usually docile towards humans and other large sapients, neesless to say, these wolves posesses great strength and a lethal bite. \
a provoked great wolf can be a danger to even the most hardy of explorers due to its speed, crushing bite, and sometimes, it's appetite. \
The great wolves have been hunted to near extinction by poachers due to its extremely valuable hide. They are very rare, as one would expect, and generally cautious around people."
value = CATALOGUER_REWARD_HARD
/mob/living/simple_mob/vore/greatwolf/Login()
. = ..()
if(!riding_datum)
riding_datum = new /datum/riding/simple_mob(src)
verbs |= /mob/living/simple_mob/proc/animal_mount
verbs |= /mob/living/proc/toggle_rider_reins
movement_cooldown = 1.5
/mob/living/simple_mob/vore/greatwolf/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/vore/greatwolf/attackby(var/obj/item/O, var/mob/user) // Trade food for people!
if(istype(O, /obj/item/weapon/reagent_containers/food))
qdel(O)
playsound(src,'sound/vore/gulp.ogg', rand(10,50), 1)
if(!has_AI())//No autobarf on player control.
return
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/donut) && istype(src, /mob/living/simple_mob/vore/greatwolf/black))
to_chat(user,"<span class='notice'>The huge wolf begrudgingly accepts your offer in exchange for it's catch.</span>")
release_vore_contents()
else if(prob(2)) //Small chance to get prey out from white doggos
to_chat(user,"<span class='notice'>The huge wolf accepts your offer for their catch.</span>")
release_vore_contents()
return
. = ..()
/mob/living/simple_mob/vore/greatwolf/init_vore()
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The moment the wolf gets its jaws around you, it scoops you right up off of the ground, and greedily scarfs you down with a few swift gulps. Your small frame alone is hardly enough to make him look somewhat plump as you slop wetly into that dark, hot chamber, although the dense squish is rather comfortable. The thick, humid air is tinged with the smell of digested meat, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder."
B.vore_sound = "Tauric Swallow"
B.release_sound = "Pred Escape"
B.mode_flags = list(DM_FLAG_NUMBING, DM_FLAG_THICKBELLY, DM_FLAG_AFFECTWORN)
B.fancy_vore = 1
B.vore_verb = "slurp"
B.contamination_color = "grey"
B.contamination_flavor = "Wet"
B.emote_lists[DM_HOLD] = list(
"The wolf's idle wandering helps its stomach gently churn around you, slimily squelching against your figure.",
"The lupine predator takes a moment to intentionally clench its gut around you, encapsulating you in a strange, fleshy hug.",
"Some hot, viscous slime oozes down over your form, helping slicken you up during your stay.",
"During a moment of relative silence, you can hear the beast's soft, relaxed breathing as it casually goes about its day.",
"The thick, humid atmosphere within the wolf's hanging belly works in tandem with its steady heartbeat to soothe you.",
"Your surroundings sway from side to side as the wolf wanders about, looking for its next treat.")
B.emote_lists[DM_DIGEST] = list(
"The wolf huffs in annoyance before clenching those soft wrinkled walls tight against your form, lathering you in digestive enzymes!",
"As the beast wanders about, you're forced to slip and slide around amidst a pool of thick digestive goop!",
"You can barely hear the wolf let out a pleased growl as its stomach eagerly gurgles around its newfound meal!",
"As the thinning air begins to make you feel dizzy, menacing bworps and grumbles fill that dark, constantly shifting organ!",
"The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!",
"The wolf happily wanders around while digesting its meal, slow calculated motions suggesting the beast is still on the hunt.")
B.struggle_messages_outside = list(
"%pred's %belly wobbles ever so slightly with a squirming meal.",
"%pred's %belly jostles subtly with movement.",
"%pred's %belly briefly swells downward as someone pushes from inside.",
"%pred's %belly sloshes and churns noisily with a trapped victim.",
"%pred's %belly swells in a few places as someone pushes from inside.",
"%pred's %belly sloshes around.",
"%pred's %belly sloshes and sways softly.",
"%pred's %belly lets out a wet squelch as a few rounded shapes appear on its surface for a moment.")
B.struggle_messages_inside = list(
"Your squirming seems to please the canine, though it's hard to tell wether or not it's helping get you out or not.",
"Your struggles only cause %pred's %belly to groan and gurgle softly around you.",
"Your movement only causes %pred's %belly to clench down upon you, smothering you briefly in thick gutflesh.",
"Your motion causes %pred's %belly to rumble irritably as you sink hands into the thick flesh.",
"You fidget around awkwardly inside of %pred's %belly.",
"You shove against the walls of %pred's %belly, making it briefly swell outward.",
"You jostle %pred's %belly with movement, earning yourself another tight smothering squeeze in the process.",
"You squirm inside of %pred's %belly, making it sway from side to side.")
@@ -0,0 +1,171 @@
/mob/living/simple_mob/vore/leopardmander
name = "leopardmander"
desc = "A huge salamander-like drake. They are best known for their rarity, their voracity, their very potent paralyzing venom, and their healing stomach. This one is white."
catalogue_data = list(/datum/category_item/catalogue/fauna/leopardmander)
tt_desc = "S Draconis uncia"
icon = 'icons/mob/vore128x64.dmi'
icon_dead = "leopardmander-dead"
icon_living = "leopardmander"
icon_state = "leopardmander"
faction = "neutral"
meat_amount = 40 //I mean...
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
old_x = -48
old_y = 0
melee_damage_lower = 10
melee_damage_upper = 25
friendly = list("nudges", "sniffs on", "rumbles softly at", "slobberlicks")
default_pixel_x = -48
pixel_x = -48
pixel_y = 0
response_help = "pats"
response_disarm = "shoves"
response_harm = "bops"
movement_cooldown = 2
maxHealth = 1500
attacktext = list("chomped")
see_in_dark = 8
minbodytemp = 0
ai_holder_type = /datum/ai_holder/simple_mob/healbelly
max_buckled_mobs = 1
mount_offset_y = 32
mount_offset_x = -16
can_buckle = TRUE
buckle_movable = TRUE
buckle_lying = FALSE
vore_icons = SA_ICON_LIVING
vore_bump_chance = 50
vore_digest_chance = 0
vore_escape_chance = 50
vore_pounce_chance = 100
vore_active = 1
vore_icons = 4
vore_capacity = 4
swallowTime = 100
vore_default_mode = DM_HEAL
vore_pounce_maxhealth = 125
vore_bump_emote = "tries to snap up"
/datum/category_item/catalogue/fauna/leopardmander
name = "Sivian Fauna - Va'aen Drake"
desc = "Classification: S Draconis uncia\
<br><br>\
The Va'aen drake, or Sivian leopardmander, is a very large predator known for its unusual ability to heal people's wounds via saliva, or storing them in one of its multiple stomachs for extended periods of time. \
The majority of the Va'aen drake's long life is spent in isolation, hunting saviks and shantaks in Sif's mountainous regions or roaming the vast tundras of Sif, \
only seeking out other individuals during the summer mating season where they spend several months in courtship, usually only producing a single egg. \
Though completely docile towards humans and other large sapients, the Va'aen drake posesses great strength and a very potent paralyzing venom; \
a provoked Va'aen can be a danger to even the most hardy of explorers due to its surprising speed, crushing bite, and long lasting venom. \
The Va'aen has been hunted to near extinction by poachers due to its secretions' unusual healing properties, and its beautiful hide; encountering one has become very rare."
value = CATALOGUER_REWARD_HARD
/mob/living/simple_mob/vore/leopardmander/Login()
. = ..()
if(!riding_datum)
riding_datum = new /datum/riding/simple_mob(src)
verbs |= /mob/living/simple_mob/proc/animal_mount
verbs |= /mob/living/proc/toggle_rider_reins
movement_cooldown = 2
/mob/living/simple_mob/vore/leopardmander/Initialize()
..()
src.adjust_nutrition(src.max_nutrition)
/mob/living/simple_mob/vore/leopardmander/init_vore()
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, dark gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you with unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~"
B.vore_sound = "Tauric Swallow"
B.release_sound = "Pred Escape"
B.mode_flags = DM_FLAG_NUMBING
B.fancy_vore = 1
B.vore_verb = "slurp"
B.contamination_color = "grey"
B.contamination_flavor = "Wet"
B.emote_lists[DM_HEAL] = list(
"The drake's idle movement helps its stomach gently churn around you, slimily squelching against your figure.",
"The draconic predator takes a moment to intentionally clench its gut around you, encapsulating you in a strange, fleshy hug.",
"Some hot, viscous slime oozes down over your form, helping slicken you up, and heal your injuries during your stay.",
"During a moment of relative silence, you can hear the beast's soft, relaxed breathing as it casually goes about its day.",
"The thick, humid atmosphere within the drake's thick hanging belly works in tandem with its steady, metronome-like heartbeat to soothe you.",
"Your surroundings sway from side to side as the drake wanders about, your form sinking bodily into the doughy, soft gutflesh.")
B.emote_lists[DM_DIGEST] = list(
"The drake growls in annoyance before clenching those wrinkled walls tight against your form, grinding away at you!",
"As the beast wanders about, you're forced to slip and slide around amidst a pool of thick digestive goop, sinking briefly into the thick, heavy walls!",
"You can barely hear the drake let out a pleased rumble as its stomach eagerly gurgles around its newfound meal!",
"As the thinning air begins to make you feel dizzy, menacing bworps and grumbles fill that dark, constantly shifting organ!",
"The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!",
"The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~")
/datum/say_list/leopardmander
speak = list("Prurr.", "Rrrhf.", "Rrrrrll.", "Mrrrrph.")
emote_hear = list("chuffs", "murrs", "churls", "hisses", "rrrrrls", "yawns that big ol' maw open.")
emote_see = list("licks their chops", "stretches", "yawns", "whisker-twitches")
say_maybe_target = list("Rrrrh?")
say_got_target = list("Rurrr!", "ROAR!", "RAH!")
/mob/living/simple_mob/vore/leopardmander/blue
name = "blue leopardmander"
desc = "A huge, pale blue, salamander-like drake. They are best known for their rarity, their voracity, their very potent paralyzing, yet somehow very beneficial venom, and their healing stomach. This one seems to have had a rare genetic mutation, making its skin appear blue."
tt_desc = "Draconis Va'aen"
icon_dead = "leopardmander_blue-dead"
icon_living = "leopardmander_blue"
icon_state = "leopardmander_blue"
/mob/living/simple_mob/vore/leopardmander/exotic
name = "glass-belly leopardmander"
desc = "A huge salamander-like drake. They are best known for their rarity, their voracity, their very potent paralyzing venom, and their healing stomach. This one seems to have had a rare genetic mutation, making its entire underside somewhat translucent! A dazzling pink glow comes from within its soft, squishy underside."
tt_desc = "Draconis Va'essa Lucent"
icon_dead = "leopardmander_exotic-dead"
icon_living = "leopardmander_exotic"
icon_state = "leopardmander_exotic"
glow_toggle = TRUE //Glow!
glow_range = 2
glow_color = "#FF006E"
glow_intensity = 1.5
/mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow()
set name = "Toggle Glow"
set desc = "Switch between glowing and not glowing."
set category = "Abilities"
glow_toggle = !glow_toggle
/mob/living/simple_mob/vore/leopardmander/exotic/New()
..()
verbs |= /mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow
/mob/living/simple_mob/vore/leopardmander/exotic/init_vore()
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The exotic leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, brightly glowing gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you, with their unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~ You can only really sort of see outside that thick-walled gut."
B.vore_sound = "Tauric Swallow"
B.release_sound = "Pred Escape"
B.mode_flags = DM_FLAG_NUMBING
B.fancy_vore = 1
B.vore_verb = "slurp"
B.contamination_color = "pink"
B.contamination_flavor = "Wet"
B.emote_lists[DM_HEAL] = list(
"The drake's idle movement helps its stomach gently churn around you, slimily squelching against your figure.",
"The draconic predator takes a moment to intentionally clench its gut around you, encapsulating you in a strange, fleshy hug.",
"Some hot, viscous slime oozes down over your form, helping slicken you up, and heal your injuries during your stay.",
"During a moment of relative silence, you can hear the beast's soft, relaxed breathing as it casually goes about its day.",
"The thick, humid atmosphere within the drake's thick hanging belly works in tandem with its steady, metronome-like heartbeat to soothe you.",
"Your surroundings sway from side to side as the drake wanders about, your form sinking bodily into the doughy, soft gutflesh.")
B.emote_lists[DM_DIGEST] = list(
"The drake growls in annoyance before clenching those wrinkled walls tight against your form, grinding away at you!",
"As the beast wanders about, you're forced to slip and slide around amidst a pool of thick digestive goop, sinking briefly into the thick, heavy walls!",
"You can barely hear the drake let out a pleased rumble as its stomach eagerly gurgles around its newfound meal!",
"As the thinning air begins to make you feel dizzy, menacing bworps and grumbles fill that dark, constantly shifting organ!",
"The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!",
"The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~")
/obj/random/mob/leopardmander/item_to_spawn() //Random map spawner
return pick(prob(89);/mob/living/simple_mob/vore/leopardmander,
prob(10);/mob/living/simple_mob/vore/leopardmander/blue,
prob(1);/mob/living/simple_mob/vore/leopardmander/exotic)
@@ -558,6 +558,14 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/tail/special/foxdefault
name = "default zorren tail, colorable"
desc = ""
icon = "icons/mob/human_races/r_fox_vr.dmi"
icon_state = "tail_s"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/tail/special/foxhc
name = "highlander zorren tail, colorable"
desc = ""
@@ -1146,4 +1146,4 @@
icon_state = "tentacle"
ani_state = "tentacle_w"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
color_blend_mode = ICON_MULTIPLY
@@ -429,7 +429,7 @@
/obj/structure/reagent_dispensers/virusfood
name = "Virus Food Dispenser"
desc = "A dispenser of virus food. Yum."
icon = 'icons/obj/objects.dmi'
icon = 'icons/obj/virology_vr.dmi'
icon_state = "virusfoodtank"
amount_per_transfer_from_this = 10
anchored = TRUE
+12 -4
View File
@@ -58,7 +58,7 @@
"loaded_item" = linked_destroy.loaded_item,
"origin_tech" = tgui_GetOriginTechForItem(linked_destroy.loaded_item),
)
data["info"]["linked_lathe"] = list("present" = FALSE)
if(linked_lathe)
data["info"]["linked_lathe"] = list(
@@ -165,7 +165,7 @@
data["info"]["t_disk"]["name"] = t_disk.stored.name
data["info"]["t_disk"]["level"] = t_disk.stored.level
data["info"]["t_disk"]["desc"] = t_disk.stored.desc
data["info"]["d_disk"] = list("present" = FALSE)
if(d_disk)
data["info"]["d_disk"] = list(
@@ -423,6 +423,14 @@
to_chat(usr, "<span class='notice'>The destructive analyzer appears to be empty.</span>")
return
if(istype(linked_destroy.loaded_item,/obj/item/stack))//Only deconsturcts one sheet at a time instead of the entire stack
var/obj/item/stack/ST = linked_destroy.loaded_item
if(ST.get_amount() < 1)
playsound(linked_destroy, 'sound/machines/destructive_analyzer.ogg', 50, 1)
qdel(ST)
linked_destroy.icon_state = "d_analyzer"
return
for(var/T in linked_destroy.loaded_item.origin_tech)
files.UpdateTech(T, linked_destroy.loaded_item.origin_tech[T])
if(linked_lathe && linked_destroy.loaded_item.matter) // Also sends salvaged materials to a linked protolathe, if any.
@@ -491,7 +499,7 @@
if(!istype(S, /obj/machinery/r_n_d/server/centcom) && server_processed)
S.produce_heat()
busy_msg = null
files.RefreshResearch()
files.RefreshResearch()
update_tgui_static_data(usr, ui)
return TRUE
@@ -583,7 +591,7 @@
if("find_device") //The R&D console looks for devices nearby to link up with.
busy_msg = "Updating Database..."
spawn(10)
busy_msg = null
SyncRDevices()
+1 -1
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(
+2 -1
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"
+25
View File
@@ -46,6 +46,11 @@
var/emote_time = 60 // How long between stomach emotes at prey (in seconds)
var/emote_active = TRUE // Are we even giving emotes out at all or not?
var/next_emote = 0 // When we're supposed to print our next emote, as a world.time
// Generally just used by AI
var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
var/autotransferwait = 10 // Time between trying to transfer.
var/autotransferlocation // Place to send them
//I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
//Actual full digest modes
@@ -220,6 +225,10 @@
if(M.ai_holder)
M.ai_holder.handle_eaten()
// Intended for simple mobs
if(!owner.client && autotransferlocation && autotransferchance > 0)
addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, thing, autotransferlocation), autotransferwait)
// Called whenever an atom leaves this belly
/obj/belly/Exited(atom/movable/thing, atom/OldLoc)
. = ..()
@@ -780,6 +789,22 @@
for(var/mob/living/M in contents)
M.updateVRPanel()
//Autotransfer callback
/obj/belly/proc/check_autotransfer(var/prey, var/autotransferlocation)
if(autotransferlocation && (autotransferchance > 0) && (prey in contents))
if(prob(autotransferchance))
var/obj/belly/dest_belly
for(var/obj/belly/B in owner.vore_organs)
if(B.name == autotransferlocation)
dest_belly = B
break
if(dest_belly)
transfer_contents(prey, dest_belly)
else
// Didn't transfer, so wait before retrying
// I feel like there's a way to make this timer looping using the normal looping thing, but pass in the ID and cancel it if we aren't looping again
addtimer(CALLBACK(src, .proc/check_autotransfer, prey, autotransferlocation), autotransferwait)
// Belly copies and then returns the copy
// Needs to be updated for any var changes
/obj/belly/proc/copy(mob/new_owner)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 877 KiB

After

Width:  |  Height:  |  Size: 876 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 695 KiB

After

Width:  |  Height:  |  Size: 695 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 557 KiB

After

Width:  |  Height:  |  Size: 557 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 665 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

+2 -2
View File
@@ -49,7 +49,7 @@
/area/shuttle/salamander_q2
name = "\improper Salamander Quarters 2"
icon = 'icons/turf/areas_vr_talon.dmi'
icon_state = "gray-p"
icon_state = "gray-s"
requires_power = 1
has_gravity = 0
@@ -98,7 +98,7 @@
/area/shuttle/salamander_wreck_q2
name = "\improper Wrecked Salamander Quarters 2"
icon = 'icons/turf/areas_vr_talon.dmi'
icon_state = "gray-p"
icon_state = "gray-s"
requires_power = 1
has_gravity = 0
+72 -17
View File
@@ -194,7 +194,7 @@
dir = 1
},
/turf/simulated/floor/tiled/techfloor,
/area/shuttle/salamander_q2)
/area/shuttle/salamander_q1)
"dj" = (
/turf/simulated/floor/plating,
/area/shuttle/salamander_engineering)
@@ -270,7 +270,7 @@
"eG" = (
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/tiled/techfloor,
/area/shuttle/salamander_q2)
/area/shuttle/salamander_q1)
"eJ" = (
/obj/effect/map_helper/airlock/sensor/int_sensor,
/obj/machinery/airlock_sensor{
@@ -319,6 +319,16 @@
},
/turf/simulated/floor/plating,
/area/shuttle/salamander_engineering)
"fu" = (
/obj/structure/bed/pod,
/obj/item/weapon/bedsheet/blue,
/obj/machinery/light_switch{
dir = 4;
pixel_x = 22
},
/obj/effect/landmark/late_antag/trader,
/turf/simulated/floor/tiled/techfloor,
/area/shuttle/salamander_q1)
"fB" = (
/obj/machinery/light,
/turf/simulated/floor/plating,
@@ -402,7 +412,7 @@
dir = 10
},
/turf/simulated/floor/tiled/techfloor,
/area/shuttle/salamander_q2)
/area/shuttle/salamander_q1)
"gv" = (
/obj/machinery/power/apc{
dir = 8;
@@ -1323,6 +1333,9 @@
/obj/structure/catwalk,
/turf/simulated/floor/plating,
/area/shuttle/salamander)
"xj" = (
/turf/simulated/wall/shull,
/area/shuttle/salamander_q1)
"xL" = (
/obj/structure/cable{
d1 = 4;
@@ -1407,7 +1420,7 @@
pixel_x = -32
},
/turf/simulated/floor/tiled/techfloor,
/area/shuttle/salamander_q2)
/area/shuttle/salamander_q1)
"Bf" = (
/obj/machinery/light{
dir = 1
@@ -1503,6 +1516,12 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/shuttle/salamander)
"FV" = (
/obj/machinery/power/pointdefense{
id_tag = "salamander_pd"
},
/turf/simulated/floor/plating,
/area/shuttle/salamander_q1)
"Gj" = (
/obj/machinery/door/firedoor/glass,
/obj/structure/grille,
@@ -1624,6 +1643,22 @@
},
/turf/simulated/floor/tiled/techfloor,
/area/shuttle/salamander)
"Lb" = (
/obj/machinery/door/firedoor/glass,
/obj/structure/cable{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/door/airlock/voidcraft{
req_one_access = list(160)
},
/turf/simulated/floor/tiled/techmaint,
/area/shuttle/salamander_q1)
"Lf" = (
/obj/effect/floor_decal/industrial/warning,
/turf/simulated/floor/tiled/techfloor,
@@ -1753,6 +1788,26 @@
},
/turf/simulated/floor/tiled/techfloor,
/area/shuttle/salamander)
"Rj" = (
/obj/machinery/door/firedoor/glass,
/obj/structure/grille,
/obj/structure/window/reinforced/full,
/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
dir = 1
},
/turf/simulated/floor/plating,
/area/shuttle/salamander_q1)
"Rm" = (
/obj/structure/bed/pod,
/obj/item/weapon/bedsheet/blue,
/obj/machinery/alarm/alarms_hidden{
dir = 8;
pixel_x = 26
},
/obj/effect/landmark/late_antag/trader,
/turf/simulated/floor/tiled/techfloor,
/area/shuttle/salamander_q1)
"RO" = (
/obj/structure/bed/pod,
/obj/item/weapon/bedsheet/blue,
@@ -2495,11 +2550,11 @@ WP
(26,1,1) = {"
WP
WP
bk
Vz
FV
xj
cY
AN
Vz
xj
hn
yv
Vz
@@ -2514,10 +2569,10 @@ WP
WP
WP
WP
ci
Rj
eG
gl
ld
Lb
hp
jT
ld
@@ -2532,10 +2587,10 @@ WP
WP
WP
WP
Vz
oF
RO
Vz
xj
fu
Rm
xj
fh
xL
Vz
@@ -2550,10 +2605,10 @@ WP
WP
WP
WP
Vz
Vz
Vz
Vz
xj
xj
xj
xj
DB
jV
Vz
+77 -17
View File
@@ -213,7 +213,7 @@
nitrogen = 0;
oxygen = 0
},
/area/shuttle/salamander_wreck_q2)
/area/shuttle/salamander_wreck_q1)
"dm" = (
/obj/machinery/light{
dir = 1
@@ -270,6 +270,9 @@
},
/turf/simulated/floor/airless,
/area/shuttle/salamander_wreck_engineering)
"el" = (
/turf/simulated/wall/shull,
/area/shuttle/salamander_wreck_q1)
"ey" = (
/obj/machinery/atmospherics/pipe/manifold/visible{
dir = 4
@@ -292,7 +295,7 @@
nitrogen = 0;
oxygen = 0
},
/area/shuttle/salamander_wreck_q2)
/area/shuttle/salamander_wreck_q1)
"eJ" = (
/obj/effect/map_helper/airlock/sensor/int_sensor,
/obj/machinery/airlock_sensor{
@@ -427,7 +430,7 @@
nitrogen = 0;
oxygen = 0
},
/area/shuttle/salamander_wreck_q2)
/area/shuttle/salamander_wreck_q1)
"gv" = (
/obj/structure/cable{
d2 = 2;
@@ -1313,6 +1316,18 @@
oxygen = 0
},
/area/shuttle/salamander_wreck_galley)
"vt" = (
/obj/structure/bed/pod,
/obj/item/weapon/bedsheet/blue,
/obj/machinery/alarm/alarms_hidden{
dir = 8;
pixel_x = 26
},
/turf/simulated/floor/tiled/techfloor{
nitrogen = 0;
oxygen = 0
},
/area/shuttle/salamander_wreck_q1)
"vI" = (
/obj/structure/cable{
d1 = 1;
@@ -1398,6 +1413,18 @@
/obj/structure/catwalk,
/turf/simulated/floor/airless,
/area/shuttle/salamander_wreck_engineering)
"AK" = (
/obj/structure/bed/pod,
/obj/item/weapon/bedsheet/blue,
/obj/machinery/light_switch{
dir = 4;
pixel_x = 22
},
/turf/simulated/floor/tiled/techfloor{
nitrogen = 0;
oxygen = 0
},
/area/shuttle/salamander_wreck_q1)
"AN" = (
/obj/structure/handrail{
dir = 1
@@ -1422,7 +1449,7 @@
nitrogen = 0;
oxygen = 0
},
/area/shuttle/salamander_wreck_q2)
/area/shuttle/salamander_wreck_q1)
"Bf" = (
/obj/machinery/light{
dir = 1
@@ -1522,6 +1549,23 @@
/obj/structure/window/reinforced,
/turf/simulated/floor/plating,
/area/shuttle/salamander_wreck_cockpit)
"Gr" = (
/obj/machinery/door/firedoor/glass,
/obj/structure/cable{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/door/airlock/voidcraft{
density = 0;
icon_state = "door_open"
},
/turf/simulated/floor/tiled/techmaint/airless,
/area/shuttle/salamander_wreck_q1)
"HG" = (
/obj/structure/cable{
d1 = 4;
@@ -1726,6 +1770,12 @@
},
/turf/simulated/floor/tiled/techmaint/airless,
/area/shuttle/salamander_wreck)
"Pr" = (
/obj/machinery/power/pointdefense{
id_tag = "salamander_wreck_pd"
},
/turf/simulated/floor/airless,
/area/shuttle/salamander_wreck_q1)
"Ps" = (
/obj/structure/girder,
/turf/simulated/floor/airless,
@@ -1899,6 +1949,16 @@
},
/turf/simulated/floor/tiled/techmaint/airless,
/area/shuttle/salamander_wreck)
"UB" = (
/obj/machinery/door/firedoor/glass,
/obj/structure/grille,
/obj/structure/window/reinforced/full,
/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
dir = 1
},
/turf/simulated/floor/plating,
/area/shuttle/salamander_wreck_q1)
"UT" = (
/obj/machinery/door/airlock/glass_external/public{
density = 0;
@@ -2545,11 +2605,11 @@ WP
(26,1,1) = {"
WP
WP
bk
Vz
Pr
el
cY
AN
Vz
el
hn
yv
Vz
@@ -2564,10 +2624,10 @@ WP
WP
WP
WP
ci
UB
eG
gl
ld
Gr
hp
jT
ld
@@ -2582,10 +2642,10 @@ WP
WP
WP
WP
Vz
oF
RO
Vz
el
AK
vt
el
fh
xL
Vz
@@ -2600,10 +2660,10 @@ WP
WP
WP
WP
Vz
Vz
Vz
Vz
el
el
el
el
DB
jV
Vz
@@ -0,0 +1,90 @@
// Compile in the map for CI testing if we're testing compileability of all the maps
#if MAP_TEST
#include "salamander_trader.dmm"
#endif
// The shuttle's area(s)
/area/shuttle/salamander_trader
name = "\improper Salamander Trader Cabin"
icon = 'icons/turf/areas_vr_talon.dmi'
icon_state = "gray"
requires_power = 1
has_gravity = 0
/area/shuttle/salamander_trader_engineering
name = "\improper Salamander Trader Engineering"
icon = 'icons/turf/areas_vr_talon.dmi'
icon_state = "yellow"
requires_power = 1
has_gravity = 0
/area/shuttle/salamander_trader_cockpit
name = "\improper Salamander Trader Cockpit"
icon = 'icons/turf/areas_vr_talon.dmi'
icon_state = "blue"
requires_power = 1
has_gravity = 0
/area/shuttle/salamander_trader_q1
name = "\improper Salamander Trader Quarters 1"
icon = 'icons/turf/areas_vr_talon.dmi'
icon_state = "gray-p"
requires_power = 1
has_gravity = 0
/area/shuttle/salamander_trader_q2
name = "\improper Salamander Trader Quarters 2"
icon = 'icons/turf/areas_vr_talon.dmi'
icon_state = "gray-s"
requires_power = 1
has_gravity = 0
/area/shuttle/salamander_trader_galley
name = "\improper Salamander Trader Galley"
icon = 'icons/turf/areas_vr_talon.dmi'
icon_state = "dark-s"
requires_power = 1
has_gravity = 0
/area/shuttle/salamander_trader_head
name = "\improper Salamander Trader Head"
icon = 'icons/turf/areas_vr_talon.dmi'
icon_state = "dark-p"
requires_power = 1
has_gravity = 0
// The shuttle's 'shuttle' computer
/obj/machinery/computer/shuttle_control/explore/salamander_trader
name = "short jump console"
shuttle_tag = "Salamander Trader"
req_one_access = list()
// The 'shuttle'
/datum/shuttle/autodock/overmap/salamander_trader
name = "Salamander Trader"
current_location = "omship_spawn_salamander_trader"
docking_controller_tag = "salamander_trader_docking"
shuttle_area = list(/area/shuttle/salamander_trader,/area/shuttle/salamander_trader_cockpit,/area/shuttle/salamander_trader_engineering,/area/shuttle/salamander_trader_q1,/area/shuttle/salamander_trader_q2,/area/shuttle/salamander_trader_galley,/area/shuttle/salamander_trader_head)
defer_initialisation = TRUE //We're not loaded until an admin does it
fuel_consumption = 5
ceiling_type = /turf/simulated/floor/reinforced/airless
// A shuttle lateloader landmark
/obj/effect/shuttle_landmark/shuttle_initializer/salamander_trader
name = "ITV Freedom"
base_area = /area/space
base_turf = /turf/space
landmark_tag = "omship_spawn_salamander_trader"
shuttle_type = /datum/shuttle/autodock/overmap/salamander_trader
// The 'ship'
/obj/effect/overmap/visitable/ship/landable/salamander_trader
name = "Salamander-class Corvette"
scanner_desc = @{"[i]Registration[/i]: ITV Freedom
[i]Class[/i]: Corvette
[i]Transponder[/i]: Transmitting (CIV), non-hostile
[b]Notice[/b]: Multirole independent vessel"}
vessel_mass = 4500
vessel_size = SHIP_SIZE_LARGE
fore_dir = EAST
shuttle = "Salamander Trader"
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -57,6 +57,7 @@
#include "../../submaps/admin_use_vr/ert.dm"
#include "../../submaps/admin_use_vr/mercship.dm"
#include "../../submaps/admin_use_vr/salamander_trader.dm"
/datum/map_template/admin_use/ert
name = "Special Area - ERT"
@@ -71,7 +72,7 @@
/datum/map_template/admin_use/salamander_trader
name = "Special Area - Salamander Trader"
desc = "Modest trader ship."
mappath = 'maps/offmap_vr/om_ships/salamander.dmm'
mappath = 'maps/submaps/admin_use_vr/salamander_trader.dmm'
/datum/map_template/admin_use/mercenary
name = "Special Area - Merc Ship"
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+120 -135
View File
@@ -18808,6 +18808,11 @@
/obj/machinery/vending/coffee,
/turf/simulated/floor/tiled/monotile,
/area/quartermaster/foyer)
"fyi" = (
/turf/simulated/wall/fancy_shuttle/window{
fancy_shuttle_tag = "lifeboat2"
},
/area/shuttle/large_escape_pod1)
"fyF" = (
/obj/machinery/power/apc{
cell_type = /obj/item/weapon/cell/super;
@@ -21015,13 +21020,14 @@
/turf/simulated/floor/tiled,
/area/quartermaster/belterdock/surface_mining_outpost_shuttle_hangar)
"hGr" = (
/obj/structure/shuttle/engine/heater{
dir = 8
/obj/machinery/light{
dir = 1
},
/obj/structure/window/reinforced{
dir = 4
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/turf/simulated/floor/airless,
/obj/structure/bed/chair/shuttle,
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"hGI" = (
/obj/machinery/atmospherics/binary/pump/fuel{
@@ -21039,23 +21045,13 @@
},
/turf/simulated/floor/tiled/steel,
/area/shuttle/excursion/cargo)
"hHc" = (
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/closet/walllocker/emerglocker/north,
/obj/structure/bed/chair/shuttle,
/turf/simulated/floor/tiled/eris/white/gray_perforated,
/area/shuttle/large_escape_pod1)
"hHo" = (
/obj/machinery/vending/wallmed1{
layer = 3.3;
name = "Emergency NanoMed";
pixel_x = 28
},
/obj/structure/closet/walllocker/emerglocker/north,
/obj/structure/bed/chair/shuttle,
/turf/simulated/floor/tiled/eris/white/gray_perforated,
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"hHJ" = (
/obj/structure/cable/yellow{
@@ -21240,6 +21236,16 @@
},
/turf/simulated/floor/tiled,
/area/hallway/station/atrium)
"hPw" = (
/obj/machinery/light,
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/obj/structure/bed/chair/shuttle{
dir = 1
},
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"hPQ" = (
/obj/effect/floor_decal/industrial/warning/corner,
/obj/structure/cable/green{
@@ -21417,12 +21423,6 @@
},
/turf/simulated/floor,
/area/maintenance/substation/exploration)
"hWs" = (
/obj/structure/window/reinforced{
dir = 8
},
/turf/simulated/floor/tiled/eris/white/gray_perforated,
/area/shuttle/large_escape_pod1)
"hXK" = (
/obj/structure/cable/green{
d1 = 4;
@@ -21521,19 +21521,6 @@
/turf/simulated/floor/tiled/dark,
/area/tether/station/dock_two)
"hZW" = (
/obj/machinery/door/firedoor/glass,
/obj/structure/grille,
/obj/structure/window/reinforced/full,
/obj/structure/window/reinforced{
dir = 4
},
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
id = "medivac blast";
name = "Shuttle Blast Doors";
opacity = 0
},
/obj/effect/shuttle_landmark{
base_area = /area/hallway/secondary/escape/medical_escape_pod_hallway;
base_turf = /turf/simulated/floor/plating;
@@ -21541,7 +21528,9 @@
landmark_tag = "escapepod1_station";
name = "Tether Station"
},
/turf/simulated/floor/plating/eris/under,
/turf/simulated/wall/fancy_shuttle/window{
fancy_shuttle_tag = "lifeboat2"
},
/area/shuttle/large_escape_pod1)
"iaf" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -22263,16 +22252,6 @@
},
/turf/simulated/floor/tiled,
/area/tether/station/dock_two)
"iOG" = (
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/closet/walllocker/emerglocker/south,
/obj/structure/bed/chair/shuttle{
dir = 1
},
/turf/simulated/floor/tiled/eris/white/gray_perforated,
/area/shuttle/large_escape_pod1)
"iOW" = (
/obj/structure/extinguisher_cabinet{
dir = 8;
@@ -23052,11 +23031,16 @@
/turf/simulated/floor/tiled/dark,
/area/tether/station/dock_two)
"jRT" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8;
icon_state = "propulsion_r"
/obj/effect/fancy_shuttle/lifeboat2{
dir = 4;
fancy_shuttle_tag = "lifeboat2"
},
/obj/effect/fancy_shuttle_floor_preview/lifeboat2{
dir = 4
},
/turf/simulated/wall/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/turf/simulated/shuttle/plating/airless/carry,
/area/shuttle/large_escape_pod1)
"jSj" = (
/obj/structure/cable/yellow{
@@ -23100,9 +23084,12 @@
/turf/simulated/floor/tiled/dark,
/area/tether/station/dock_one)
"jSR" = (
/obj/machinery/door/airlock/glass_external,
/obj/effect/map_helper/airlock/door/simple,
/turf/simulated/floor/tiled/eris/white/gray_platform,
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/obj/machinery/door/airlock/glass_external,
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"jTP" = (
/obj/effect/floor_decal/borderfloor{
@@ -29365,22 +29352,17 @@
/obj/random/maintenance/cargo,
/turf/simulated/floor,
/area/maintenance/cargo)
"qaY" = (
/obj/structure/bed/chair/shuttle{
dir = 1
},
/obj/machinery/light,
/turf/simulated/floor/tiled/eris/white/gray_perforated,
/area/shuttle/large_escape_pod1)
"qbk" = (
/obj/effect/floor_decal/industrial/outline/yellow,
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{
frequency = 1380;
id_tag = "large_escape_pod_1";
pixel_x = -28;
pixel_y = -28
pixel_y = -24
},
/turf/simulated/floor/tiled/eris/white/gray_platform,
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"qbm" = (
/obj/structure/cable/cyan{
@@ -29412,10 +29394,18 @@
})
"qcz" = (
/obj/structure/bed/chair/shuttle,
/turf/simulated/floor/tiled/eris/white/gray_perforated,
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"qdq" = (
/turf/simulated/floor/tiled/eris/white/gray_perforated,
/obj/machinery/vending/wallmed1{
layer = 3.3;
name = "Emergency NanoMed";
pixel_y = 30
},
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"qdy" = (
/obj/structure/cable/green{
@@ -29677,15 +29667,10 @@
/turf/simulated/floor/tiled,
/area/hallway/station/atrium)
"qqe" = (
/obj/effect/floor_decal/industrial/outline/yellow,
/turf/simulated/floor/tiled/eris/white/gray_platform,
/area/shuttle/large_escape_pod1)
"qqq" = (
/obj/machinery/light,
/obj/structure/bed/chair/shuttle{
dir = 1
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/turf/simulated/floor/tiled/eris/white/gray_perforated,
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"qqY" = (
/obj/machinery/alarm{
@@ -29817,14 +29802,13 @@
/turf/simulated/floor/tiled/eris/white,
/area/shuttle/medivac/general)
"qum" = (
/obj/machinery/status_display{
layer = 4;
pixel_y = -32
},
/obj/structure/bed/chair/shuttle{
dir = 1
},
/turf/simulated/floor/tiled/eris/white/gray_perforated,
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"qve" = (
/obj/structure/disposalpipe/segment{
@@ -29844,7 +29828,10 @@
/obj/structure/bed/chair/shuttle{
dir = 1
},
/turf/simulated/floor/tiled/eris/white/gray_perforated,
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"qvC" = (
/obj/structure/disposalpipe/segment{
@@ -29859,9 +29846,6 @@
/obj/item/device/radio/beacon,
/turf/simulated/floor/tiled,
/area/hallway/station/docks)
"qvR" = (
/turf/simulated/wall/rshull,
/area/shuttle/large_escape_pod1)
"qvS" = (
/obj/machinery/power/terminal{
dir = 1
@@ -35085,6 +35069,15 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled,
/area/tether/exploration/pathfinder_office)
"wPp" = (
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/obj/machinery/status_display{
pixel_y = 32
},
/turf/simulated/floor/tiled,
/area/shuttle/large_escape_pod1)
"wPV" = (
/obj/structure/bed/chair/comfy/brown{
dir = 4
@@ -35167,13 +35160,6 @@
},
/turf/simulated/floor/plating,
/area/maintenance/station/cargo)
"wTw" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8;
icon_state = "propulsion_l"
},
/turf/simulated/shuttle/plating/airless/carry,
/area/shuttle/large_escape_pod1)
"wUa" = (
/obj/machinery/door/blast/shutters{
dir = 2;
@@ -35804,10 +35790,9 @@
/turf/simulated/floor/plating,
/area/maintenance/station/cargo)
"xIm" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8
/turf/simulated/wall/fancy_shuttle{
fancy_shuttle_tag = "lifeboat2"
},
/turf/simulated/shuttle/plating/airless/carry,
/area/shuttle/large_escape_pod1)
"xIp" = (
/turf/simulated/floor/plating,
@@ -48924,7 +48909,7 @@ aac
aam
aaa
aaa
wTw
xIm
xIm
xIm
xIm
@@ -49066,11 +49051,11 @@ aac
aam
aaa
aaa
qvR
xIm
hGr
hGr
hGr
qvR
qqe
hPw
xIm
fLT
wMe
rQq
@@ -49208,11 +49193,11 @@ aac
aaa
aaa
aaa
qvR
hHc
hWs
iOG
qvR
xIm
hHo
qqe
qvg
xIm
fLT
cOV
rQq
@@ -49350,11 +49335,11 @@ aac
aaa
aaa
aaa
qvR
fyi
qcz
qdq
qqe
qum
qvR
fyi
fLT
wMe
rQq
@@ -49492,11 +49477,11 @@ aac
aaa
aaa
aaa
qvR
fyi
qcz
qdq
qaY
qvR
qqe
qum
fyi
fLT
qCV
qOx
@@ -49634,9 +49619,9 @@ aac
aaa
aaa
aaa
qvR
qdq
xIm
qdq
qqe
qbk
jSR
tZN
@@ -49776,9 +49761,9 @@ aac
aam
aaa
aaa
qvR
qdq
qdq
xIm
wPp
qqe
qqe
jSR
auX
@@ -49918,11 +49903,11 @@ aac
aam
aaa
aaa
qvR
fyi
qcz
qdq
qqq
qvR
qqe
qum
fyi
fLT
klW
rQq
@@ -50060,11 +50045,11 @@ aam
aam
aaa
aaa
qvR
fyi
qcz
qdq
qqe
qum
qvR
fyi
qBP
kiB
etg
@@ -50202,11 +50187,11 @@ aaa
aaa
aaa
aaa
qvR
xIm
hHo
qdq
qqe
qvg
qvR
xIm
qBP
wMe
rQq
@@ -50344,11 +50329,11 @@ aaa
aaa
aaa
aaa
qvR
qvR
qdq
qvR
qvR
xIm
hGr
qqe
hPw
xIm
qBP
wMe
rQq
@@ -50486,11 +50471,11 @@ aaa
aaa
aaa
aaa
aaa
qvR
xIm
fyi
hZW
qvR
aaa
fyi
xIm
fLT
cOV
rQq
+3
View File
@@ -3062,6 +3062,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes_vr.dm"
#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\xenobio.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\bee.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\bigdragon.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\c_pet.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\catgirl.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\cookiegirl.dm"
@@ -3072,10 +3073,12 @@
#include "code\modules\mob\living\simple_mob\subtypes\vore\fennec.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\fennix.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\frog.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\greatwolf.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\hippo.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\horse.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\lamia.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\leopardmander.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm"