'. If you're successful, they will be added to the records (note that this can be done at any time, even with living people, so that they can be cloned without a body in the event that they are lying dead on port solars and didn't turn on their suit sensors As an added bonus, they have a health monitoring implant, which'll allow you to check their vitals from their record in the cloning console)! If not, and it says 'Error: Mental interface failure.', then they have left their bodily confines and are one with the spirits. If this happens, just shout at them to get back in their body, click 'Refresh' and try scanning them again. If there's no success, threaten them with gibbing. Still no success? Skip over to Step 7 and don't continue after it, as you have an unresponsive body and it cannot be cloned. If you got 'Error: Unable to locate valid genetic data', you are trying to clone a monkey - start over.
+
+ Step 4: Clone the body/head/brain
+ Now that the body has a record, click 'View Records', click the subject's name, and then click 'Clone' to start the cloning process. Congratulations! You're halfway there. Remember not to 'Eject' the cloning pod as this will kill the developing clone and you'll have to start the process again.
+
+ Step 5: Get Mannitol, Mutadone, or a clean SE for the clone
+ Cloning is a finicky and unreliable process. Whilst it will most certainly bring someone back from the dead, they can have any number of nasty disabilities given to them during the cloning process! For this reason, you need Mutadone, or a clean, defect-free Structural Enzyme (SE) injection for when they're done. If you're a competent Geneticist, you will already have one ready on your working computer. If, for any reason, you do not, then eject the body from the DNA modifier (NOT THE CLONING POD) and take it next door to the Genetics research room. Put the body in one of those DNA modifiers and then go onto the console. Go into View/Edit/Transfer Buffer, find an open slot and click 'SE' to save it. Then click 'Injector' to get the SEs in syringe form. Put this in your pocket or something for when the body is done. Do note, most Genetic labs have Mannitol and Mutadone pills readily available, provided no-one has stolen them or ate them all. Don't forget most clones will also have severe brain damage as well, to fix this, give them a Mannitol pill or injection.
+
+ Step 6: Put remains in morgue
+ Now that the cloning process has been initiated and you hopefully have some Mannitol, Mutadone, and a clean Structural Enzymes, you no longer need the body! Drag it to the morgue and tell the Chef over the radio that they have some fresh meat waiting for them in there, or call the Chaplain so they can prepare an impromptu funeral. To put a body in a morgue bed, simply open the tray, grab the body, put it on the open tray, then close the tray again. Use a pen to label the morgue tray 'CHEF MEAT' or 'CLONED' in order to avoid confusion.
+
+ Step 7: Await cloned body
+ Now go back to the lab and wait for your patient to be cloned. This can take atleast three minutes at the least.
+
+ Step 8: Give the clone Mannitol and Mutadone, or a clean SE
+ Has your patient been cloned yet? Great! As soon as the clone pops out, administer Mannitol and Mutadone. Then move onto the next step. In the event you have no Mutadone, a clean SE will suffice, but keep in mind this may irradiate the patient, causing more problems!
+
+ Step 9: Give person their clothes back
+ Obviously the person will be naked after they have been cloned. Provided you weren't an irresponsible little shit, you should have protected their possessions from thieves and should be able to give them back to the patient. No matter how cruel you are, it's simply against protocol to force your patients to walk outside naked.
+
+ Step 10: Place clone in cryo
+ An unfortunate problem with speedcloning technology is that the clone will suffer from severe genetic degradation upon exiting the pod. To rectify this, ensure the nearby cryogenic cells are 1.) at freezing temperatures (normally around 73.15 K), and 2.) filled with cryoxadone, or clonexadone. Once you've assured both conditions are met, place the clone in the cryogenic tube, and turn it on. Remember to set the door to 'Auto' ejection, else the clone will be stuck in cryo until someone releases them. You can also kill two birds with one stone and add Mannitol and Mutadone to the beaker, which'll heal the brain damage, along with removing any genetic defects.
+
+ Step 11: Send person on their way
+ Give the patient one last check-over - make sure they don't still have any defects and that they have all their possessions. Ask them how they died, if they know, so that you can report any foul play over the radio. Once you're done, your patient is ready to go back to work! Chances are they do not have Medbay access, so you should let them out of Genetics and the Medbay main entrance.
+
+ If you've gotten this far, congratulations! You have mastered the art of cloning. Now, the real problem is how to resurrect yourself after that traitor had his way with you for cloning his target.
+
+
+
+
+
+ "}
+
+
+/obj/item/book/manual/ripley_build_and_repair
+ name = "APLU \"Ripley\" Construction and Operation Manual"
+ icon_state ="book"
+ author = "Weyland-Yutani Corp"
+ title = "APLU \"Ripley\" Construction and Operation Manual"
+ dat = {"
+
+
+
+
+
+ Weyland-Yutani - Building Better Worlds
+ Autonomous Power Loader Unit \"Ripley\"
+
+ Specifications:
+
+ - Class: Autonomous Power Loader
+ - Scope: Logistics and Construction
+ - Weight: 820kg (without operator and with empty cargo compartment)
+ - Height: 2.5m
+ - Width: 1.8m
+ - Top speed: 5km/hour
+ - Operation in vacuum/hostile environment: Possible
+
- Airtank Volume: 500liters
+ - Devices:
+
+ - Hydraulic Clamp
+ - High-speed Drill
+
+
+ - Propulsion Device: Powercell-powered electro-hydraulic system.
+ - Powercell capacity: Varies.
+
+
+ Construction:
+
+ - Connect all exosuit parts to the chassis frame
+ - Connect all hydraulic fittings and tighten them up with a wrench
+ - Adjust the servohydraulics with a screwdriver
+ - Wire the chassis. (Cable is not included.)
+ - Use the wirecutters to remove the excess cable if needed.
+ - Install the central control module (Not included. Use supplied datadisk to create one).
+ - Secure the mainboard with a screwdriver.
+ - Install the peripherals control module (Not included. Use supplied datadisk to create one).
+ - Secure the peripherals control module with a screwdriver
+ - Install the internal armor plating (Not included due to Nanotrasen regulations. Can be made using 5 metal sheets.)
+ - Secure the internal armor plating with a wrench
+ - Weld the internal armor plating to the chassis
+ - Install the external reinforced armor plating (Not included due to Nanotrasen regulations. Can be made using 5 reinforced metal sheets.)
+ - Secure the external reinforced armor plating with a wrench
+ - Weld the external reinforced armor plating to the chassis
+
+ - Additional Information:
+ - The firefighting variation is made in a similar fashion.
+ - A firesuit must be connected to the Firefighter chassis for heat shielding.
+ - Internal armor is plasteel for additional strength.
+ - External armor must be installed in 2 parts, totaling 10 sheets.
+ - Completed mech is more resiliant against fire, and is a bit more durable overall
+ - Nanotrasen is determined to the safety of its
investments employees.
+
+
+
+
+ Operation
+ Coming soon...
+ "}
+
+/obj/item/book/manual/experimentor
+ name = "Mentoring your Experiments"
+ icon_state = "rdbook"
+ author = "Dr. H.P. Kritz"
+ title = "Mentoring your Experiments"
+ dat = {"
+
+
+
+
+ THE E.X.P.E.R.I-MENTOR
+ The Enhanced Xenobiological Period Extraction (and) Restoration Instructor is a machine designed to discover the secrets behind every item in existence.
+ With advanced technology, it can process 99.95% of items, and discover their uses and secrets.
+ The E.X.P.E.R.I-MENTOR is a Research apparatus that takes items, and through a process of elimination, it allows you to deduce new technological designs from them.
+ Due to the volatile nature of the E.X.P.E.R.I-MENTOR, there is a slight chance for malfunction, potentially causing irreparable damage to you or your environment.
+ However, upgrading the apparatus has proven to decrease the chances of undesirable, potentially life-threatening outcomes.
+ Please note that the E.X.P.E.R.I-MENTOR uses a state-of-the-art random generator, which has a larger entropy than the observable universe,
+ therefore it can generate wildly different results each day, therefore it is highly suggested to re-scan objects of interests frequently (e.g. each shift).
+
+ BASIC PROCESS
+ The usage of the E.X.P.E.R.I-MENTOR is quite simple:
+
+ - Find an item with a technological background
+ - Insert the item into the E.X.P.E.R.I-MENTOR
+ - Cycle through each processing method of the device.
+ - Stand back, even in case of a successful experiment, as the machine might produce undesired behaviour.
+
+
+ ADVANCED USAGE
+ The E.X.P.E.R.I-MENTOR has a variety of uses, beyond menial research work. The different results can be used to combat localised events, or even to get special items.
+
+ The E.X.P.E.R.I-MENTOR's OBLITERATE function has the added use of transferring the destroyed item's material into a linked lathe.
+
+ The IRRADIATE function can be used to transform items into other items, resulting in potential upgrades (or downgrades).
+
+ Users should remember to always wear appropriate protection when using the machine, because malfunction can occur at any moment!
+
+ EVENTS
+ GLOBAL (happens at any time):
+
+ - DETECTION MALFUNCTION - The machine's onboard sensors have malfunctioned, causing it to redefine the item's experiment type.
+ Produces the message: The E.X.P.E.R.I-MENTOR's onboard detection system has malfunctioned!
+
+ - IANIZATION - The machine's onboard corgi-filter has malfunctioned, causing it to produce a corgi from.. somewhere.
+ Produces the message: The E.X.P.E.R.I-MENTOR melts the banana, ian-izing the air around it!
+
+ - RUNTIME ERROR - The machine's onboard C4T-P processor has encountered a critical error, causing it to produce a cat from.. somewhere.
+ Produces the message: The E.X.P.E.R.I-MENTOR encounters a run-time error!
+
+ - B100DG0D.EXE - The machine has encountered an unknown subroutine, which has been injected into its runtime. It upgrades the held item!
+ Produces the message: The E.X.P.E.R.I-MENTOR improves the banana, drawing the life essence of those nearby!
+
+ - POWERSINK - The machine's PSU has tripped the charging mechanism! It consumes massive amounts of power!
+ Produces the message: The E.X.P.E.R.I-MENTOR begins to smoke and hiss, shaking violently!
+
+ FAIL:
+ This event is produced when the item mismatches the selected experiment.
+ Produces a random message similar to: "the Banana rumbles, and shakes, the experiment was a failure!"
+
+ POKE:
+
+ - WILD ARMS - The machine's gryoscopic processors malfunction, causing it to lash out at nearby people with its arms.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions and destroys the banana, lashing its arms out at nearby people!
+
+ - MISTYPE - The machine's interface has been garbled, and it switches to OBLITERATE.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions!
+
+ - THROW - The machine's spatial recognition device has shifted several meters across the room, causing it to try and repostion the item there.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, throwing the banana!
+
+ IRRADIATE:
+
+ - RADIATION LEAK - The machine's shield has failed, resulting in a toxic radiation leak.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, melting the banana and leaking radiation!
+
+ - RADIATION DUMP - The machine's recycling and containment functions have failed, resulting in a dump of toxic waste around it
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, spewing toxic waste!
+
+ - MUTATION - The machine's radio-isotope level meter has malfunctioned, causing it over-irradiate the item, making it transform.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, transforming the banana!
+
+ GAS:
+
+ - TOXIN LEAK - The machine's filtering and vent systems have failed, resulting in a cloud of toxic gas being expelled.
+ Produces the message: The E.X.P.E.R.I-MENTOR destroys the banana, leaking dangerous gas!
+
+ - GAS LEAK - The machine's vent systems have failed, resulting in a cloud of harmless, but obscuring gas.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, spewing harmless gas!
+
+ - ELECTROMAGNETIC IONS - The machine's electrolytic scanners have failed, causing a dangerous Electromagnetic reaction.
+ Produces the message: The E.X.P.E.R.I-MENTOR melts the banana, ionizing the air around it!
+
+ HEAT:
+
+ - TOASTER - The machine's heating coils have come into contact with the machine's gas storage, causing a large, sudden blast of flame.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, melting the banana and releasing a burst of flame!
+
+ - SAUNA - The machine's vent loop has sprung a leak, resulting in a large amount of superheated air being dumped around it.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, melting the banana and leaking hot air!
+
+ - EMERGENCY VENT - The machine's temperature gauge has malfunctioned, resulting in it attempting to cool the area around it, but instead, dumping a cloud of steam.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, activating its emergency coolant systems!
+
+ COLD:
+
+ - FREEZER - The machine's cooling loop has sprung a leak, resulting in a cloud of super-cooled liquid being blasted into the air.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, shattering the banana and releasing a dangerous cloud of coolant!
+
+ - FRIDGE - The machine's cooling loop has been exposed to the outside air, resulting in a large decrease in temperature.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, shattering the banana and leaking cold air!
+
+ - SNOWSTORM - The machine's cooling loop has come into contact with the heating coils, resulting in a sudden blast of cool air.
+ Produces the message: The E.X.P.E.R.I-MENTOR malfunctions, releasing a flurry of chilly air as the banana pops out!
+
+ OBLITERATE:
+
+ - IMPLOSION - The machine's pressure leveller has malfunctioned, causing it to pierce the space-time momentarily, making everything in the area fly towards it.
+ Produces the message: The E.X.P.E.R.I-MENTOR's crusher goes way too many levels too high, crushing right through space-time!
+
+ - DISTORTION - The machine's pressure leveller has completely disabled, resulting in a momentary space-time distortion, causing everything to fly around.
+ Produces the message: The E.X.P.E.R.I-MENTOR's crusher goes one level too high, crushing right into space-time!
+
+
+
+ "}
+
+/obj/item/book/manual/research_and_development
+ name = "Research and Development 101"
+ icon_state = "rdbook"
+ author = "Dr. L. Ight"
+ title = "Research and Development 101"
+ dat = {"
+
+
+
+
+
+ Science For Dummies
+ So you want to further SCIENCE? Good man/woman/thing! However, SCIENCE is a complicated process even though it's quite easy. For the most part, it's a three step process:
+
+ - 1) Deconstruct items in the Destructive Analyzer to advance technology or improve the design.
+ - 2) Build unlocked designs in the Protolathe and Circuit Imprinter
+ - 3) Repeat!
+
+
+ Those are the basic steps to furthing science. What do you do science with, however? Well, you have four major tools: R&D Console, the Destructive Analyzer, the Protolathe, and the Circuit Imprinter.
+
+ The R&D Console
+ The R&D console is the cornerstone of any research lab. It is the central system from which the Destructive Analyzer, Protolathe, and Circuit Imprinter (your R&D systems) are controled. More on those systems in their own sections. On its own, the R&D console acts as a database for all your technological gains and new devices you discover. So long as the R&D console remains intact, you'll retain all that SCIENCE you've discovered. Protect it though, because if it gets damaged, you'll lose your data! In addition to this important purpose, the R&D console has a disk menu that lets you transfer data from the database onto disk or from the disk into the database. It also has a settings menu that lets you re-sync with nearby R&D devices (if they've become disconnected), lock the console from the unworthy, upload the data to all other R&D consoles in the network (all R&D consoles are networked by default), connect/disconnect from the network, and purge all data from the database.
+ NOTE: The technology list screen, circuit imprinter, and protolathe menus are accessible by non-scientists. This is intended to allow 'public' systems for the plebians to utilize some new devices.
+
+ Destructive Analyzer
+ This is the source of all technology. Whenever you put a handheld object in it, it analyzes it and determines what sort of technological advancements you can discover from it. If the technology of the object is equal or higher then your current knowledge, you can destroy the object to further those sciences. Some devices (notably, some devices made from the protolathe and circuit imprinter) aren't 100% reliable when you first discover them. If these devices break down, you can put them into the Destructive Analyzer and improve their reliability rather then futher science. If their reliability is high enough ,it'll also advance their related technologies.
+
+ Circuit Imprinter
+ This machine, along with the Protolathe, is used to actually produce new devices. The Circuit Imprinter takes glass and various chemicals (depends on the design) to produce new circuit boards to build new machines or computers. It can even be used to print AI modules.
+
+ Protolathe
+ This machine is an advanced form of the Autolathe that produce non-circuit designs. Unlike the Autolathe, it can use processed metal, glass, solid plasma, silver, gold, and diamonds along with a variety of chemicals to produce devices. The downside is that, again, not all devices you make are 100% reliable when you first discover them.
+
+ Reliability and You
+ As it has been stated, many devices when they're first discovered do not have a 100% reliablity when you first discover them. Instead, the reliablity of the device is dependent upon a base reliability value, whatever improvements to the design you've discovered through the Destructive Analyzer, and any advancements you've made with the device's source technologies. To be able to improve the reliability of a device, you have to use the device until it breaks beyond repair. Once that happens, you can analyze it in a Destructive Analyzer. Once the device reachs a certain minimum reliability, you'll gain tech advancements from it.
+
+ Building a Better Machine
+ Many machines produces from circuit boards and inserted into a machine frame require a variety of parts to construct. These are parts like capacitors, batteries, matter bins, and so forth. As your knowledge of science improves, more advanced versions are unlocked. If you use these parts when constructing something, its attributes may be improved. For example, if you use an advanced matter bin when constructing an autolathe (rather then a regular one), it'll hold more materials. Experiment around with stock parts of various qualities to see how they affect the end results! Be warned, however: Tier 3 and higher stock parts don't have 100% reliability and their low reliability may affect the reliability of the end machine.
+
+
+ "}
+
+
+/obj/item/book/manual/robotics_cyborgs
+ name = "Cyborgs for Dummies"
+ icon_state = "borgbook"
+ author = "XISC"
+ title = "Cyborgs for Dummies"
+ dat = {"
+
+
+
+
+
+ Cyborgs for Dummies
+
+ Chapters
+
+
+ - Cyborg Related Equipment
+ - Cyborg Modules
+ - Cyborg Construction
+ - Cyborg Deconstruction
+ - Cyborg Maintenance
+ - Cyborg Repairs
+ - In Case of Emergency
+
+
+
+
+
+ Exosuit Fabricator
+ The Exosuit Fabricator is the most important piece of equipment related to cyborgs. It allows the construction of the core cyborg parts. Without these machines, cyborgs can not be built. It seems that they may also benefit from advanced research techniques.
+
+ Cyborg Recharging Station
+ This useful piece of equipment will suck power out of the power systems to charge a cyborg's power cell back up to full charge.
+
+ Robotics Control Console
+ This useful piece of equipment can be used to immobolize or destroy a cyborg. A word of warning: Cyborgs are expensive pieces of equipment, do not destroy them without good reason, or Nanotrasen may see to it that it never happens again.
+
+
+
+ When a cyborg is created it picks out of an array of modules to designate its purpose. There are 6 different cyborg modules.
+
+ Standard Cyborg
+ The standard cyborg module is a multi-purpose cyborg. It is equipped with various modules, allowing it to do basic tasks.
+
+ Engineering Cyborg
+ The Engineering cyborg module comes equipped with various engineering-related tools to help with engineering-related tasks.
+
+ Mining Cyborg
+ The Mining Cyborg module comes equipped with the latest in mining equipment. They are efficient at mining due to no need for oxygen, but their power cells limit their time in the mines.
+
+ Security Cyborg
+ The Security Cyborg module is equipped with effective security measures used to apprehend and arrest criminals without harming them a bit.
+
+ Janitor Cyborg
+ The Janitor Cyborg module is equipped with various cleaning-facilitating devices.
+
+ Service Cyborg
+ The service cyborg module comes ready to serve your human needs. It includes various entertainment and refreshment devices. Occasionally some service cyborgs may have been referred to as "Bros"
+
+
+ Cyborg construction is a rather easy process, requiring a decent amount of metal and a few other supplies.
The required materials to make a cyborg are:
+
+ - Metal
+ - Two Flashes
+ - One Power Cell (Preferrably rated to 15000w)
+ - Some electrical wires
+ - One Human Brain
+ - One Man-Machine Interface
+
+ Once you have acquired the materials, you can start on construction of your cyborg.
To construct a cyborg, follow the steps below:
+
+ - Start the Exosuit Fabricators constructing all of the cyborg parts
+ - While the parts are being constructed, take your human brain, and place it inside the Man-Machine Interface
+ - Once you have a Robot Head, place your two flashes inside the eye sockets
+ - Once you have your Robot Chest, wire the Robot chest, then insert the power cell
+ - Attach all of the Robot parts to the Robot frame
+ - Insert the Man-Machine Interface (With the Brain inside) Into the Robot Body
+ - Congratulations! You have a new cyborg!
+
+
+
+ If you want to deconstruct a cyborg, say to remove its MMI without blowing the Cyborg to pieces, they come apart very quickly, and very safely, in a few simple steps.
+
+ - Crowbar
+ - Wrench
+ Optional:
+ - Screwdriver
+ - Wirecutters
+
+
+ - Begin by unlocking the Cyborg's access panel using your ID
+ - Use your crowbar to open the Cyborg's access panel
+ - Using your bare hands, remove the power cell from the Cyborg
+ - Lockdown the Cyborg to disengage safety protocols
+
+ Option 1: Robotics console
+ - Use the Robotics console in the RD's office
+ - Find the entry for your Cyborg
+ - Press the Lockdown button on the Robotics console
+
+
+ Option 2: Lockdown wire
+ - Use your screwdriver to expose the Cyborg's wiring
+ - Use your wirecutters to start cutting all of the wires until the lockdown light turns off, cutting all of the wires irregardless of the lockdown light works as well
+
+ - Use your wrench to unfasten the Cyborg's bolts, the Cyborg will then fall apart onto the floor, the MMI will be there as well
+
+
+
+ Occasionally Cyborgs may require maintenance of a couple types, this could include replacing a power cell with a charged one, or possibly maintaining the cyborg's internal wiring.
+
+ Replacing a Power Cell
+ Replacing a Power cell is a common type of maintenance for cyborgs. It usually involves replacing the cell with a fully charged one, or upgrading the cell with a larger capacity cell.
The steps to replace a cell are follows:
+
+ - Unlock the Cyborg's Interface by swiping your ID on it
+ - Open the Cyborg's outer panel using a crowbar
+ - Remove the old power cell
+ - Insert the new power cell
+ - Close the Cyborg's outer panel using a crowbar
+ - Lock the Cyborg's Interface by swiping your ID on it, this will prevent non-qualified personnel from attempting to remove the power cell
+
+
+ Exposing the Internal Wiring
+ Exposing the internal wiring of a cyborg is fairly easy to do, and is mainly used for cyborg repairs.
You can easily expose the internal wiring by following the steps below:
+
+ - Follow Steps 1 - 3 of "Replacing a Cyborg's Power Cell"
+ - Open the cyborg's internal wiring panel by using a screwdriver to unsecure the panel
+
+ To re-seal the cyborg's internal wiring:
+
+ - Use a screwdriver to secure the cyborg's internal panel
+ - Follow steps 4 - 6 of "Replacing a Cyborg's Power Cell" to close up the cyborg
+
+
+
+ Occasionally a Cyborg may become damaged. This could be in the form of impact damage from a heavy or fast-travelling object, or it could be heat damage from high temperatures, or even lasers or Electromagnetic Pulses (EMPs).
+
+ Dents
+ If a cyborg becomes damaged due to impact from heavy or fast-moving objects, it will become dented. Sure, a dent may not seem like much, but it can compromise the structural integrity of the cyborg, possibly causing a critical failure.
+ Dents in a cyborg's frame are rather easy to repair, all you need is to apply a welding tool to the dented area, and the high-tech cyborg frame will repair the dent under the heat of the welder.
+
+ Excessive Heat Damage
+ If a cyborg becomes damaged due to excessive heat, it is likely that the internal wires will have been damaged. You must replace those wires to ensure that the cyborg remains functioning properly.
To replace the internal wiring follow the steps below:
+
+ - Unlock the Cyborg's Interface by swiping your ID
+ - Open the Cyborg's External Panel using a crowbar
+ - Remove the Cyborg's Power Cell
+ - Using a screwdriver, expose the internal wiring or the Cyborg
+ - Replace the damaged wires inside the cyborg
+ - Secure the internal wiring cover using a screwdriver
+ - Insert the Cyborg's Power Cell
+ - Close the Cyborg's External Panel using a crowbar
+ - Lock the Cyborg's Interface by swiping your ID
+
+ These repair tasks may seem difficult, but are essential to keep your cyborgs running at peak efficiency.
+
+
+ In case of emergency, there are a few steps you can take.
+
+ "Rogue" Cyborgs
+ If the cyborgs seem to become "rogue", they may have non-standard laws. In this case, use extreme caution.
+ To repair the situation, follow these steps:
+
+ - Locate the nearest robotics console
+ - Determine which cyborgs are "Rogue"
+ - Press the lockdown button to immobolize the cyborg
+ - Locate the cyborg
+ - Expose the cyborg's internal wiring
+ - Check to make sure the LawSync and AI Sync lights are lit
+ - If they are not lit, pulse the LawSync wire using a multitool to enable the cyborg's Law Sync
+ - Proceed to a cyborg upload console. Nanotrasen usually places these in the same location as AI uplaod consoles.
+ - Use a "Reset" upload moduleto reset the cyborg's laws
+ - Proceed to a Robotics Control console
+ - Remove the lockdown on the cyborg
+
+
+ As a last resort
+ If all else fails in a case of cyborg-related emergency. There may be only one option. Using a Robotics Control console, you may have to remotely detonate the cyborg.
+ WARNING:
Do not detonate a borg without an explicit reason for doing so. Cyborgs are expensive pieces of Nanotrasen equipment, and you may be punished for detonating them without reason.
+
+
+
+ "}
+
+
+
+/obj/item/book/manual/chef_recipes
+ name = "Chef Recipes"
+ icon_state = "cooked_book"
+ author = "Lord Frenrir Cageth"
+ title = "Chef Recipes"
+ dat = {"
+
+
+
+
+
+ Food for Dummies
+ Here is a guide on basic food recipes and also how to not poison your customers accidentally.
+
+
+ Basic ingredients preparation:
+
+ Dough: 10u water + 15u flour for simple dough.
+ 15u egg yolk + 15u flour + 5u sugar for cake batter.
+ Doughs can be transformed by using a knife and rolling pin.
+ All doughs can be microwaved.
+ Bowl: Add water to it for soup preparation.
+ Meat: Microwave it, process it, slice it into microwavable cutlets with your knife, or use it raw.
+ Cheese: Add 5u universal enzyme (catalyst) to milk and soy milk to prepare cheese (sliceable) and tofu.
+ Rice: Mix 10u rice with 10u water in a bowl then microwave it.
+
+ Custom food:
+ Add ingredients to a base item to prepare a custom meal.
+ The bases are:
+ - bun (burger)
+ - breadslices(sandwich)
+ - plain bread
+ - plain pie
+ - vanilla cake
+ - empty bowl (salad)
+ - bowl with 10u water (soup)
+ - boiled spaghetti
+ - pizza bread
+ - metal rod (kebab)
+
+ Table Craft:
+ Put ingredients on table, then click and drag the table onto yourself to see what recipes you can prepare.
+
+ Microwave:
+ Use it to cook or boil food ingredients (meats, doughs, egg, spaghetti, donkpocket, etc...).
+ It can cook multiple items at once.
+
+ Processor:
+ Use it to process certain ingredients (meat into faggot, doughslice into spaghetti, potato into fries,etc...)
+
+ Gibber:
+ Stuff an animal in it to grind it into meat.
+
+ Meat spike:
+ Stick an animal on it then begin collecting its meat.
+
+
+ Example recipes:
+ Vanilla Cake: Microwave cake batter.
+ Burger: 1 bun + 1 meat steak
+ Bread: Microwave dough.
+ Waffles: 2 pastry base
+ Popcorn: Microwave corn.
+ Meat Steak: Microwave meat.
+ Meat Pie: 1 plain pie + 1u black pepper + 1u salt + 2 meat cutlets
+ Boiled Spagetti: Microwave spaghetti.
+ Donuts: 1u sugar + 1 pastry base
+ Fries: Process potato.
+
+ Sharing your food:
+ You can put your meals on your kitchen counter or load them in the snack vending machines.
+
+
+ "}
+
+
+/obj/item/book/manual/barman_recipes
+ name = "Barman Recipes"
+ icon_state = "barbook"
+ author = "Sir John Rose"
+ title = "Barman Recipes"
+ dat = {"
+
+
+
+
+
+ Drinks for dummies
+ Heres a guide for some basic drinks.
+
+ Manly Dorf:
+ Mix ale and beer into a glass.
+
+ Grog:
+ Mix rum and water into a glass.
+
+ Black Russian:
+ Mix vodka and kahlua into a glass.
+
+ Irish Cream:
+ Mix cream and whiskey into a glass.
+
+ Screwdriver:
+ Mix vodka and orange juice into a glass.
+
+ Cafe Latte:
+ Mix milk and coffee into a glass.
+
+ Mead:
+ Mix Enzyme, water and sugar into a glass.
+
+ Gin Tonic:
+ Mix gin and tonic into a glass.
+
+ Classic Martini:
+ Mix vermouth and gin into a glass.
+
+
+
+
+ "}
+
+
+/obj/item/book/manual/detective
+ name = "The Film Noir: Proper Procedures for Investigations"
+ icon_state ="bookDetective"
+ author = "Nanotrasen"
+ title = "The Film Noir: Proper Procedures for Investigations"
+ dat = {"
+
+
+
+
+ Detective Work
+
+ Between your bouts of self-narration, and drinking whiskey on the rocks, you might get a case or two to solve.
+ To have the best chance to solve your case, follow these directions:
+
+
+ - Go to the crime scene.
+ - Take your scanner and scan EVERYTHING (Yes, the doors, the tables, even the dog.)
+ - Once you are reasonably certain you have every scrap of evidence you can use, find all possible entry points and scan them, too.
+ - Return to your office.
+ - Using your forensic scanning computer, scan your Scanner to upload all of your evidence into the database.
+ - Browse through the resulting dossiers, looking for the one that either has the most complete set of prints, or the most suspicious items handled.
+ - If you have 80% or more of the print (The print is displayed) go to step 10, otherwise continue to step 8.
+ - Look for clues from the suit fibres you found on your perp, and go about looking for more evidence with this new information, scanning as you go.
+ - Try to get a fingerprint card of your perp, as if used in the computer, the prints will be completed on their dossier.
+ - Assuming you have enough of a print to see it, grab the biggest complete piece of the print and search the security records for it.
+ - Since you now have both your dossier and the name of the person, print both out as evidence, and get security to nab your baddie.
+ - Give yourself a pat on the back and a bottle of the ships finest vodka, you did it!
+
+
+ It really is that easy! Good luck!
+
+
+ "}
+
+/obj/item/book/manual/nuclear
+ name = "Fission Mailed: Nuclear Sabotage 101"
+ icon_state ="bookNuclear"
+ author = "Syndicate"
+ title = "Fission Mailed: Nuclear Sabotage 101"
+ dat = {"
+ Nuclear Explosives 101:
+ Hello and thank you for choosing the Syndicate for your nuclear information needs.
+ Today's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.
+ First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.
+ Pressing any button on the compacted bomb will cause it to extend and bolt itself into place.
+ If this is done to unbolt it one must completely log in which at this time may not be possible.
+ To make the nuclear device functional:
+
Place the nuclear device in the designated detonation zone.
+ Extend and anchor the nuclear device from its interface.
+ Insert the nuclear authorisation disk into slot.
+ Type numeric authorisation code into the keypad. This should have been provided. Note: If you make a mistake press R to reset the device.
+ Press the E button to log onto the device.
+ You now have activated the device. To deactivate the buttons at anytime for example when you've already prepped the bomb for detonation remove the auth disk OR press the R on the keypad.
+ Now the bomb CAN ONLY be detonated using the timer. Manual detonation is not an option.
+ Note: Nanotrasen is a pain in the neck.
+ Toggle off the SAFETY.
+ Note: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step.
+ So use the - - and + + to set a det time between 5 seconds and 10 minutes.
+ Then press the timer toggle button to start the countdown.
+ Now remove the auth. disk so that the buttons deactivate.
+ Note: THE BOMB IS STILL SET AND WILL DETONATE
+ Now before you remove the disk if you need to move the bomb you can:
+ Toggle off the anchor, move it, and re-anchor.
+ Good luck. Remember the order:
+ Disk, Code, Safety, Timer, Disk, RUN!
+ Intelligence Analysts believe that normal Nanotrasen procedure is for the Captain to secure the nuclear authorisation disk.
+ Good luck!
+ "}
+
+// Wiki books that are linked to the configured wiki link.
+
+// A book that links to the wiki
+/obj/item/book/manual/wiki
+ var/page_link = ""
+ window_size = "970x710"
+
+/obj/item/book/manual/wiki/attack_self()
+ if(!dat)
+ initialize_wikibook()
+ ..()
+
+/obj/item/book/manual/wiki/proc/initialize_wikibook()
+ var/wikiurl = CONFIG_GET(string/wikiurl)
+ if(wikiurl)
+ dat = {"
+
+
+
+
+
+
+ You start skimming through the manual...
+
+
+
+
+
+ "}
+
+/obj/item/book/manual/wiki/chemistry
+ name = "Chemistry Textbook"
+ icon_state ="chemistrybook"
+ author = "Nanotrasen"
+ title = "Chemistry Textbook"
+ page_link = "Guide_to_chemistry"
+
+/obj/item/book/manual/wiki/engineering_construction
+ name = "Station Repairs and Construction"
+ icon_state ="bookEngineering"
+ author = "Engineering Encyclopedia"
+ title = "Station Repairs and Construction"
+ page_link = "Guide_to_construction"
+
+/obj/item/book/manual/wiki/engineering_guide
+ name = "Engineering Textbook"
+ icon_state ="bookEngineering2"
+ author = "Engineering Encyclopedia"
+ title = "Engineering Textbook"
+ page_link = "Guide_to_engineering"
+
+/obj/item/book/manual/wiki/security_space_law
+ name = "Space Law"
+ desc = "A set of Nanotrasen guidelines for keeping law and order on their space stations."
+ icon_state = "bookSpaceLaw"
+ author = "Nanotrasen"
+ title = "Space Law"
+ page_link = "Space_Law"
+
+/obj/item/book/manual/wiki/infections
+ name = "Infections - Making your own pandemic!"
+ icon_state = "bookInfections"
+ author = "Infections Encyclopedia"
+ title = "Infections - Making your own pandemic!"
+ page_link = "Infections"
+
+/obj/item/book/manual/wiki/telescience
+ name = "Teleportation Science - Bluespace for dummies!"
+ icon_state = "book7"
+ author = "University of Bluespace"
+ title = "Teleportation Science - Bluespace for dummies!"
+ page_link = "Guide_to_telescience"
+
+/obj/item/book/manual/wiki/engineering_hacking
+ name = "Hacking"
+ icon_state ="bookHacking"
+ author = "Engineering Encyclopedia"
+ title = "Hacking"
+ page_link = "Hacking"
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index a0f4b2a928..89fdc6d694 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -169,6 +169,11 @@
W.ini_dir = W.dir
//END: oh fuck i'm so sorry
+ else if(istype(O, /obj/item/restraints/handcuffs/cable))
+ var/obj/item/cuffs = O
+ cuffs.item_color = item_color
+ cuffs.update_icon()
+
if (QDELETED(O))
return //It's a stack and has already been merged
@@ -261,7 +266,7 @@
if (user.get_inactive_held_item() == src)
if(zero_amount())
return
- change_stack(user,1)
+ return change_stack(user,1)
else
..()
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 8f5d43d51e..513bdd2474 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -31,7 +31,7 @@
H.internal = null
H.update_internals_hud_icon(0)
else
- if(!H.getorganslot("breathing_tube"))
+ if(!H.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
if(!H.wear_mask)
to_chat(H, "You need a mask!")
return
diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm
index 628b731197..5f3e493677 100644
--- a/code/game/objects/items/theft_tools.dm
+++ b/code/game/objects/items/theft_tools.dm
@@ -157,7 +157,7 @@
/obj/item/nuke_core_container/supermatter
name = "supermatter bin"
- desc = "A tiny receptacle that releases an inert freon mix upon sealing, allowing a sliver of a supermatter crystal to be safely stored.."
+ desc = "A tiny receptacle that releases an inert hyper-noblium mix upon sealing, allowing a sliver of a supermatter crystal to be safely stored.."
var/obj/item/nuke_core/supermatter_sliver/sliver
/obj/item/nuke_core_container/supermatter/Destroy()
@@ -193,7 +193,7 @@
/obj/item/scalpel/supermatter
name = "supermatter scalpel"
- desc = "A scalpel with a tip of condensed freon gas, searingly cold to the touch, that can safely shave a sliver off a supermatter crystal."
+ desc = "A scalpel with a tip of condensed hyper-noblium gas, searingly cold to the touch, that can safely shave a sliver off a supermatter crystal."
icon = 'icons/obj/nuke_tools.dmi'
icon_state = "supermatter_scalpel"
toolspeed = 0.5
@@ -202,7 +202,7 @@
/obj/item/hemostat/supermatter
name = "supermatter extraction tongs"
- desc = "A pair of tongs made from condensed freon gas, searingly cold to the touch, that can safely grip a supermatter sliver."
+ desc = "A pair of tongs made from condensed hyper-noblium gas, searingly cold to the touch, that can safely grip a supermatter sliver."
icon = 'icons/obj/nuke_tools.dmi'
icon_state = "supermatter_tongs"
toolspeed = 0.75
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 90a0ec7f99..a8c80e5e83 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -601,12 +601,11 @@
if(ishuman(M))
var/mob/living/carbon/human/L = M
L.endTailWag()
- if(user.a_intent != INTENT_HARM)
- var/aim_for_face = ((user.zone_selected == "mouth") || (user.zone_selected == "eyes") || (user.zone_selected == "head"))
+ if(user.a_intent != INTENT_HARM && ((user.zone_selected == "mouth") || (user.zone_selected == "eyes") || (user.zone_selected == "head")))
user.do_attack_animation(M)
playsound(M, 'sound/weapons/slap.ogg', 50, 1, -1)
- user.visible_message("[user] slaps [M] in the [(aim_for_face)?"face":user.zone_selected]!",
- "You slap [M] in the [(aim_for_face)?"face":user.zone_selected]! ",\
+ user.visible_message("[user] slaps [M]!",
+ "You slap [M]!",\
"You hear a slap.")
return
else
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 296e4ba757..711f9baf0b 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -101,8 +101,7 @@
..()
/obj/structure/mirror/magic/lesser/New()
- var/list/L = CONFIG_GET(keyed_flag_list/roundstart_races)
- choosable_races = L.Copy()
+ choosable_races = GLOB.roundstart_races.Copy()
..()
/obj/structure/mirror/magic/badmin/New()
diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm
index 1f25c0dbbb..45f9c3614d 100644
--- a/code/game/objects/structures/reflector.dm
+++ b/code/game/objects/structures/reflector.dm
@@ -58,7 +58,8 @@
playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You dismantle [src].")
new framebuildstacktype(loc, framebuildstackamount)
- new buildstacktype(loc, buildstackamount)
+ if(buildstackamount)
+ new buildstacktype(loc, buildstackamount)
qdel(src)
else if(istype(W, /obj/item/weldingtool))
var/obj/item/weldingtool/WT = W
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index 3f5cb9b27f..d227710b32 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -177,11 +177,6 @@
for(var/obj/effect/O in src)
if(is_cleanable(O))
qdel(O)
-
- var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in src)
- if(hotspot && !isspaceturf(src))
- air.temperature = max(min(air.temperature-2000,air.temperature/2),0)
- qdel(hotspot)
return 1
/turf/open/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube)
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 3889872275..0135bfbfa0 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -237,6 +237,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
. += " (IC)"
. += " (CLOSE)"
. += " (RSLVE)"
+ . += " (HANDLE)"
//private
/datum/admin_help/proc/LinkedReplyName(ref_src)
@@ -382,6 +383,22 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
AddInteraction("Marked as IC issue by [key_name]")
Resolve(silent = TRUE)
+//Let the initiator know their ahelp is being handled
+/datum/admin_help/proc/HandleIssue(key_name = key_name_admin(usr))
+ if(state != AHELP_ACTIVE)
+ return
+
+ var/msg = "Your ticket is now being handled by an admin. Please be patient."
+
+ if(initiator)
+ to_chat(initiator, msg)
+
+ SSblackbox.inc("ahelp_handleissue")
+ msg = "Ticket [TicketHref("#[id]")] is being handled by [key_name]"
+ message_admins(msg)
+ log_admin_private(msg)
+ AddInteraction("Being handled by [key_name]")
+
//Show the ticket panel
/datum/admin_help/proc/TicketPanel()
var/list/dat = list("Ticket #[id]")
@@ -442,6 +459,8 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
Close()
if("resolve")
Resolve()
+ if("handleissue")
+ HandleIssue()
if("reopen")
Reopen()
@@ -489,9 +508,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
return
if(handle_spam_prevention(msg,MUTE_ADMINHELP))
return
-
+
msg = trim(msg)
-
+
if(!msg)
return
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index 94b1b8ee45..025c05f6d4 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -14,10 +14,10 @@
var/oxy = air_contents.gases[/datum/gas/oxygen] ? air_contents.gases[/datum/gas/oxygen][MOLES] : 0
var/tox = air_contents.gases[/datum/gas/plasma] ? air_contents.gases[/datum/gas/plasma][MOLES] : 0
-
+ var/trit = air_contents.gases[/datum/gas/tritium] ? air_contents.gases[/datum/gas/tritium][MOLES] : 0
if(active_hotspot)
if(soh)
- if(tox > 0.5 && oxy > 0.5)
+ if((tox > 0.5 || trit > 0.5) && oxy > 0.5)
if(active_hotspot.temperature < exposed_temperature)
active_hotspot.temperature = exposed_temperature
if(active_hotspot.volume < exposed_volume)
@@ -26,11 +26,11 @@
var/igniting = 0
- if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && tox > 0.5)
+ if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && (tox > 0.5 || trit > 0.5))
igniting = 1
if(igniting)
- if(oxy < 0.5 || tox < 0.5)
+ if(oxy < 0.5)
return 0
active_hotspot = new /obj/effect/hotspot(src)
@@ -112,7 +112,7 @@
qdel(src)
return
- if(!(location.air) || !location.air.gases[/datum/gas/plasma] || !location.air.gases[/datum/gas/oxygen] || location.air.gases[/datum/gas/plasma][MOLES] < 0.5 || location.air.gases[/datum/gas/oxygen][MOLES] < 0.5)
+ if(!(location.air) || !(location.air.gases[/datum/gas/plasma] || location.air.gases[/datum/gas/tritium]) || !location.air.gases[/datum/gas/oxygen] || (location.air.gases[/datum/gas/plasma][MOLES] < 0.5 && location.air.gases[/datum/gas/tritium][MOLES] < 0.5) || location.air.gases[/datum/gas/oxygen][MOLES] < 0.5)
qdel(src)
return
diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
index 9b5ea089c2..8ddde526a7 100644
--- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
@@ -6,7 +6,6 @@ What are the archived variables for?
#define MINIMUM_HEAT_CAPACITY 0.0003
#define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that
once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */
-
GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
@@ -401,6 +400,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
/datum/gas_mixture/react(turf/open/dump_location)
. = 0
+
reaction_results = new
var/list/cached_gases = gases
@@ -438,6 +438,9 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
*/
. |= reaction.react(src, dump_location)
+ //to_chat(world,reaction.name)
+ if (. & STOP_REACTIONS)
+ break
if(.)
garbage_collect()
if(temperature < TCMB) //just for safety
diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm
index e8e25fb912..8296ab56f4 100644
--- a/code/modules/atmospherics/gasmixtures/gas_types.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_types.dm
@@ -58,7 +58,7 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /
specific_heat = 200
name = "Plasma"
gas_overlay = "plasma"
- moles_visible = MOLES_PLASMA_VISIBLE
+ moles_visible = MOLES_GAS_VISIBLE
dangerous = TRUE
/datum/gas/water_vapor
@@ -66,14 +66,14 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /
specific_heat = 40
name = "Water Vapor"
gas_overlay = "water_vapor"
- moles_visible = MOLES_PLASMA_VISIBLE
+ moles_visible = MOLES_GAS_VISIBLE
-/datum/gas/freon
- id = "freon"
+/datum/gas/hypernoblium
+ id = "nob"
specific_heat = 2000
- name = "Freon"
+ name = "Hyper-noblium"
gas_overlay = "freon"
- moles_visible = MOLES_PLASMA_VISIBLE
+ moles_visible = MOLES_GAS_VISIBLE
dangerous = TRUE
/datum/gas/nitrous_oxide
@@ -84,15 +84,21 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /
moles_visible = 1
dangerous = TRUE
-/datum/gas/oxygen_agent_b
- id = "agent_b"
- specific_heat = 300
- name = "Oxygen Agent B"
+/datum/gas/brown_gas //This is nitric oxide, but given generic name to avoid confusion with nitrous oxide(N20 vs. NO2)
+ id = "browns"
+ specific_heat = 20
+ name = "Brown Gas"
+ gas_overlay = "browns"
+ moles_visible = MOLES_GAS_VISIBLE
+ dangerous = TRUE
-/datum/gas/volatile_fuel
- id = "v_fuel"
- specific_heat = 30
- name = "Volatile Fuel"
+/datum/gas/tritium
+ id = "tritium"
+ specific_heat = 10
+ name = "Tritium"
+ gas_overlay = "tritium"
+ moles_visible = MOLES_GAS_VISIBLE
+ dangerous = TRUE
/datum/gas/bz
id = "bz"
@@ -100,6 +106,16 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /
name = "BZ"
dangerous = TRUE
+/datum/gas/stimulum
+ id = "stim"
+ specific_heat = 5
+ name = "Stimulum"
+
+/datum/gas/pluoxium
+ id = "pluox"
+ specific_heat = 80
+ name = "Pluoxium"
+
/obj/effect/overlay/gas
icon = 'icons/effects/tile_effects.dmi'
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index d9389975bb..63b84832af 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -1,6 +1,33 @@
#define NO_REACTION 0
#define REACTING 1
-
+//Plasma fire properties
+#define OXYGEN_BURN_RATE_BASE 1.4
+#define PLASMA_BURN_RATE_DELTA 9
+#define PLASMA_UPPER_TEMPERATURE 1370+T0C
+#define PLASMA_MINIMUM_OXYGEN_NEEDED 2
+#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30
+#define PLASMA_OXYGEN_FULLBURN 10
+#define FIRE_CARBON_ENERGY_RELEASED 100000 //Amount of heat released per mole of burnt carbon into the tile
+#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile
+//General assmos defines.
+#define WATER_VAPOR_FREEZE 200
+#define BROWNS_FORMATION_ENERGY 100000
+#define TRITIUM_BURN_OXY_FACTOR 100
+#define TRITIUM_BURN_TRIT_FACTOR 10
+#define SUPER_SATURATION_THRESHOLD 96
+#define STIMULUM_HEAT_SCALE 100000
+#define STIMULUM_FIRST_RISE 0.65
+#define STIMULUM_FIRST_DROP 0.065
+#define STIMULUM_SECOND_RISE 0.0009
+#define STIMULUM_ABSOLUTE_DROP 0.00000335
+#define REACTION_OPPRESSION_THRESHOLD 5
+ //Plasma fusion properties
+#define PLASMA_BINDING_ENERGY 3000000
+#define MAX_CATALYST_EFFICENCY 9
+#define PLASMA_FUSED_COEFFICENT 0.08
+#define CATALYST_COEFFICENT 0.01
+#define FUSION_PURITY_THRESHOLD 0.9
+#define FUSION_HEAT_DROPOFF 20000+T0C
/datum/controller/subsystem/air/var/list/gas_reactions //this is our singleton of all reactions
/proc/init_gas_reactions()
@@ -35,48 +62,15 @@
/datum/gas_reaction/proc/react(datum/gas_mixture/air, atom/location)
return NO_REACTION
-//agent b: converts hot co2 and agent b to oxygen. requires plasma as a catalyst. endothermic
-/datum/gas_reaction/agent_b
- priority = 2
- name = "Agent B"
- id = "agent_b"
+/datum/gas_reaction/nobliumsupression
+ priority = INFINITY
+ name = "Hyper-Noblium Reaction Supression"
+ id = "nobstop"
+/datum/gas_reaction/nobliumsupression/init_reqs()
+ min_requirements = list(/datum/gas/hypernoblium = REACTION_OPPRESSION_THRESHOLD)
-/datum/gas_reaction/agent_b/init_reqs()
- min_requirements = list(
- "TEMP" = 900,
- /datum/gas/oxygen_agent_b = MINIMUM_HEAT_CAPACITY,
- /datum/gas/plasma = MINIMUM_HEAT_CAPACITY,
- /datum/gas/carbon_dioxide = MINIMUM_HEAT_CAPACITY
- )
-
-
-/datum/gas_reaction/agent_b/react(datum/gas_mixture/air)
- var/list/cached_gases = air.gases
- var/reaction_rate = min(cached_gases[/datum/gas/carbon_dioxide][MOLES]*0.75, cached_gases[/datum/gas/plasma][MOLES]*0.25, cached_gases[/datum/gas/oxygen_agent_b][MOLES]*0.05)
-
- cached_gases[/datum/gas/carbon_dioxide][MOLES] -= reaction_rate
- cached_gases[/datum/gas/oxygen_agent_b][MOLES] -= reaction_rate*0.05
-
- ASSERT_GAS(/datum/gas/oxygen, air) //only need to assert oxygen, as this reaction doesn't occur without the other gases existing
- cached_gases[/datum/gas/oxygen][MOLES] += reaction_rate
-
- air.temperature -= (reaction_rate*20000)/air.heat_capacity()
-
- return REACTING
-
-//freon: does a freezy thing?
-/datum/gas_reaction/freon
- priority = 1
- name = "Freon"
- id = "freon"
-
-/datum/gas_reaction/freon/init_reqs()
- min_requirements = list(/datum/gas/freon = MOLES_PLASMA_VISIBLE)
-
-/datum/gas_reaction/freon/react(datum/gas_mixture/air, turf/open/location)
- . = NO_REACTION
- if(location && location.freon_gas_act())
- . = REACTING
+/datum/gas_reaction/nobliumsupression/react()
+ return STOP_REACTIONS
//water vapor: puts out fires?
/datum/gas_reaction/water_vapor
@@ -85,12 +79,15 @@
id = "vapor"
/datum/gas_reaction/water_vapor/init_reqs()
- min_requirements = list(/datum/gas/water_vapor = MOLES_PLASMA_VISIBLE)
+ min_requirements = list(/datum/gas/water_vapor = MOLES_GAS_VISIBLE)
/datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, turf/open/location)
. = NO_REACTION
- if(location && location.water_vapor_gas_act())
- air.gases[/datum/gas/water_vapor][MOLES] -= MOLES_PLASMA_VISIBLE
+ if (air.temperature <= WATER_VAPOR_FREEZE)
+ if(location && location.freon_gas_act())
+ . = REACTING
+ else if(location && location.water_vapor_gas_act())
+ air.gases[/datum/gas/water_vapor][MOLES] -= MOLES_GAS_VISIBLE
. = REACTING
//fire: combustion of plasma and volatile fuel (treated as hydrocarbons). creates hotspots. exothermic
@@ -100,7 +97,7 @@
id = "fire"
/datum/gas_reaction/fire/init_reqs()
- min_requirements = list("TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST) //doesn't include plasma reqs b/c of volatile fuel stuff - consider finally axing volatile fuel
+ min_requirements = list("TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST) //doesn't include plasma reqs b/c of other, rarer, burning gases.
/datum/gas_reaction/fire/react(datum/gas_mixture/air, turf/open/location)
var/energy_released = 0
@@ -111,23 +108,23 @@
cached_results[id] = 0
//General volatile gas burn
- if(cached_gases[/datum/gas/volatile_fuel] && cached_gases[/datum/gas/volatile_fuel][MOLES])
+ if(cached_gases[/datum/gas/tritium] && cached_gases[/datum/gas/tritium][MOLES])
var/burned_fuel
if(!cached_gases[/datum/gas/oxygen])
burned_fuel = 0
- else if(cached_gases[/datum/gas/oxygen][MOLES] < cached_gases[/datum/gas/volatile_fuel][MOLES])
- burned_fuel = cached_gases[/datum/gas/oxygen][MOLES]
- cached_gases[/datum/gas/volatile_fuel][MOLES] -= burned_fuel
- cached_gases[/datum/gas/oxygen][MOLES] = 0
+ else if(cached_gases[/datum/gas/oxygen][MOLES] < cached_gases[/datum/gas/tritium][MOLES])
+ burned_fuel = cached_gases[/datum/gas/oxygen][MOLES]/TRITIUM_BURN_OXY_FACTOR
+ cached_gases[/datum/gas/tritium][MOLES] -= burned_fuel
else
- burned_fuel = cached_gases[/datum/gas/volatile_fuel][MOLES]
- cached_gases[/datum/gas/oxygen][MOLES] -= cached_gases[/datum/gas/volatile_fuel][MOLES]
+ burned_fuel = cached_gases[/datum/gas/tritium][MOLES]*TRITIUM_BURN_TRIT_FACTOR
+ cached_gases[/datum/gas/tritium][MOLES] -= cached_gases[/datum/gas/tritium][MOLES]/TRITIUM_BURN_TRIT_FACTOR
+ cached_gases[/datum/gas/oxygen][MOLES] -= cached_gases[/datum/gas/tritium][MOLES]
if(burned_fuel)
energy_released += FIRE_CARBON_ENERGY_RELEASED * burned_fuel
ASSERT_GAS(/datum/gas/carbon_dioxide, air)
- cached_gases[/datum/gas/carbon_dioxide][MOLES] += burned_fuel
+ cached_gases[/datum/gas/carbon_dioxide][MOLES] += burned_fuel/TRITIUM_BURN_OXY_FACTOR
cached_results[id] += burned_fuel
@@ -137,6 +134,7 @@
var/oxygen_burn_rate = 0
//more plasma released at higher temperatures
var/temperature_scale
+ var/super_saturation
if(temperature > PLASMA_UPPER_TEMPERATURE)
temperature_scale = 1
else
@@ -144,15 +142,25 @@
if(temperature_scale > 0)
var/o2 = cached_gases[/datum/gas/oxygen] ? cached_gases[/datum/gas/oxygen][MOLES] : 0
oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale
+ if (o2 > cached_gases[/datum/gas/plasma][MOLES]*PLASMA_OXYGEN_FULLBURN)
+ plasma_burn_rate = (cached_gases[/datum/gas/plasma][MOLES]*temperature_scale)/PLASMA_BURN_RATE_DELTA
+ if(o2 / cached_gases[/datum/gas/plasma][MOLES] > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium.
+ super_saturation = TRUE
if(o2 > cached_gases[/datum/gas/plasma][MOLES]*PLASMA_OXYGEN_FULLBURN)
plasma_burn_rate = (cached_gases[/datum/gas/plasma][MOLES]*temperature_scale)/PLASMA_BURN_RATE_DELTA
else
plasma_burn_rate = (temperature_scale*(o2/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
+
if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY)
ASSERT_GAS(/datum/gas/carbon_dioxide, air) //don't need to assert o2, since if it isn't present we'll never reach this point anyway
cached_gases[/datum/gas/plasma][MOLES] = QUANTIZE(cached_gases[/datum/gas/plasma][MOLES] - plasma_burn_rate)
cached_gases[/datum/gas/oxygen][MOLES] = QUANTIZE(cached_gases[/datum/gas/oxygen][MOLES] - (plasma_burn_rate * oxygen_burn_rate))
- cached_gases[/datum/gas/carbon_dioxide][MOLES] += plasma_burn_rate
+ if (super_saturation)
+ ASSERT_GAS(/datum/gas/tritium,air)
+ cached_gases[/datum/gas/tritium][MOLES] += plasma_burn_rate
+ else
+ ASSERT_GAS(/datum/gas/carbon_dioxide,air)
+ cached_gases[/datum/gas/carbon_dioxide][MOLES] += plasma_burn_rate
energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate)
@@ -175,9 +183,9 @@
return cached_results[id] ? REACTING : NO_REACTION
-//fusion: a terrible idea that was fun to try. turns co2 and plasma into REALLY HOT oxygen and nitrogen. super exothermic lol
+//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting.
/datum/gas_reaction/fusion
- exclude = TRUE
+ exclude = FALSE
priority = 2
name = "Plasmic Fusion"
id = "fusion"
@@ -186,35 +194,37 @@
min_requirements = list(
"ENER" = PLASMA_BINDING_ENERGY * 10,
/datum/gas/plasma = MINIMUM_HEAT_CAPACITY,
- /datum/gas/carbon_dioxide = MINIMUM_HEAT_CAPACITY
+ /datum/gas/tritium = MINIMUM_HEAT_CAPACITY
)
/datum/gas_reaction/fusion/react(datum/gas_mixture/air)
var/list/cached_gases = air.gases
var/temperature = air.temperature
- if((cached_gases[/datum/gas/plasma][MOLES]+cached_gases[/datum/gas/carbon_dioxide][MOLES])/air.total_moles() < FUSION_PURITY_THRESHOLD)
- //Fusion wont occur if the level of impurities is too high.
+ if(((cached_gases[/datum/gas/plasma][MOLES]+cached_gases[/datum/gas/tritium][MOLES])/air.total_moles() < FUSION_PURITY_THRESHOLD) || air.return_pressure() < 10*ONE_ATMOSPHERE)
+ //Fusion wont occur if the level of impurities is too high or if there is too little pressure.
return NO_REACTION
var/old_heat_capacity = air.heat_capacity()
- var/carbon_efficency = min(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/carbon_dioxide][MOLES],MAX_CARBON_EFFICENCY)
+ var/catalyst_efficency = max(min(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/tritium][MOLES],MAX_CATALYST_EFFICENCY)-(temperature/FUSION_HEAT_DROPOFF),1)
var/reaction_energy = THERMAL_ENERGY(air)
- var/moles_impurities = air.total_moles()-(cached_gases[/datum/gas/plasma][MOLES]+cached_gases[/datum/gas/carbon_dioxide][MOLES])
+ var/moles_impurities = air.total_moles()-(cached_gases[/datum/gas/plasma][MOLES]+cached_gases[/datum/gas/tritium][MOLES])
- var/plasma_fused = (PLASMA_FUSED_COEFFICENT*carbon_efficency)*(temperature/PLASMA_BINDING_ENERGY)
- var/carbon_catalyzed = (CARBON_CATALYST_COEFFICENT*carbon_efficency)*(temperature/PLASMA_BINDING_ENERGY)
- var/oxygen_added = carbon_catalyzed
- var/nitrogen_added = (plasma_fused-oxygen_added)-(THERMAL_ENERGY(air)/PLASMA_BINDING_ENERGY)
+ var/plasma_fused = (PLASMA_FUSED_COEFFICENT*catalyst_efficency)*(temperature/PLASMA_BINDING_ENERGY)*4
+ var/tritium_catalyzed = (CATALYST_COEFFICENT*catalyst_efficency)*(temperature/PLASMA_BINDING_ENERGY)
+ var/oxygen_added = tritium_catalyzed
+ var/waste_added = (plasma_fused-oxygen_added)-((air.total_moles()*air.heat_capacity())/PLASMA_BINDING_ENERGY)
+ reaction_energy = max(reaction_energy+((catalyst_efficency*cached_gases[/datum/gas/plasma][MOLES])/((moles_impurities/catalyst_efficency)+2)*10)+((plasma_fused/((moles_impurities/catalyst_efficency)))*PLASMA_BINDING_ENERGY),0)
- reaction_energy = max(reaction_energy+((carbon_efficency*cached_gases[/datum/gas/plasma][MOLES])/((moles_impurities/carbon_efficency)+2)*10)+((plasma_fused/(moles_impurities/carbon_efficency))*PLASMA_BINDING_ENERGY),0)
-
- air.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
-
- cached_gases[/datum/gas/plasma][MOLES] -= plasma_fused
- cached_gases[/datum/gas/carbon_dioxide][MOLES] -= carbon_catalyzed
+ air.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/water_vapor, /datum/gas/nitrous_oxide, /datum/gas/brown_gas)
+ //Fusion produces an absurd amount of waste products now, requiring active filtration.
+ cached_gases[/datum/gas/plasma][MOLES] = max(cached_gases[/datum/gas/plasma][MOLES] - plasma_fused,0)
+ cached_gases[/datum/gas/tritium][MOLES] = max(cached_gases[/datum/gas/tritium][MOLES] - tritium_catalyzed,0)
cached_gases[/datum/gas/oxygen][MOLES] += oxygen_added
- cached_gases[/datum/gas/nitrogen][MOLES] += nitrogen_added
+ cached_gases[/datum/gas/nitrogen][MOLES] += waste_added
+ cached_gases[/datum/gas/water_vapor][MOLES] += waste_added
+ cached_gases[/datum/gas/nitrous_oxide][MOLES] += waste_added
+ cached_gases[/datum/gas/brown_gas][MOLES] += waste_added
if(reaction_energy > 0)
var/new_heat_capacity = air.heat_capacity()
@@ -223,5 +233,152 @@
//Prevents whatever mechanism is causing it to hit negative temperatures.
return REACTING
+/datum/gas_reaction/brownsformation //The formation of brown gas. Endothermic. Requires N2O as a catalyst.
+ priority = 3
+ name = "Brown Gas formation"
+ id = "brownsformation"
+
+/datum/gas_reaction/brownsformation/init_reqs()
+ min_requirements = list(
+ /datum/gas/oxygen = 20,
+ /datum/gas/nitrogen = 20,
+ /datum/gas/nitrous_oxide = 5,
+ "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST*400
+ )
+
+/datum/gas_reaction/brownsformation/react(datum/gas_mixture/air)
+ var/list/cached_gases = air.gases
+ var/temperature = air.temperature
+
+ var/old_heat_capacity = air.heat_capacity()
+ var/heat_efficency = temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100)
+ var/energy_used = heat_efficency*BROWNS_FORMATION_ENERGY
+ ASSERT_GAS(/datum/gas/brown_gas,air)
+
+ cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficency
+ cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficency
+ cached_gases[/datum/gas/brown_gas][MOLES] += heat_efficency*2
+
+ if(energy_used > 0)
+ var/new_heat_capacity = air.heat_capacity()
+ if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ air.temperature = max(((temperature*old_heat_capacity - energy_used)/new_heat_capacity),TCMB)
+ return REACTING
+
+/datum/gas_reaction/bzformation //Formation of BZ by combining plasma and tritium at low pressures. Exothermic.
+ priority = 4
+ name = "BZ Gas formation"
+ id = "bzformation"
+
+/datum/gas_reaction/bzformation/init_reqs()
+ min_requirements = list(
+ /datum/gas/tritium = 10,
+ /datum/gas/plasma = 10
+ )
+
+
+/datum/gas_reaction/bzformation/react(datum/gas_mixture/air)
+ var/list/cached_gases = air.gases
+ var/temperature = air.temperature
+ var/pressure = air.return_pressure()
+
+ var/old_heat_capacity = air.heat_capacity()
+ var/reaction_efficency = 1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/tritium][MOLES],1)))
+ var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED
+
+ ASSERT_GAS(/datum/gas/bz,air)
+ cached_gases[/datum/gas/bz][MOLES]+= reaction_efficency
+ cached_gases[/datum/gas/tritium][MOLES] = max(cached_gases[/datum/gas/tritium][MOLES]- 2*reaction_efficency,0)
+ cached_gases[/datum/gas/plasma][MOLES] = max(cached_gases[/datum/gas/plasma][MOLES] - reaction_efficency,0)
+
+
+ if(energy_released > 0)
+ var/new_heat_capacity = air.heat_capacity()
+ if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ air.temperature = max(((temperature*old_heat_capacity + energy_released)/new_heat_capacity),TCMB)
+ return REACTING
+
+/datum/gas_reaction/stimformation //Stimulum formation follows a strange pattern of how effective it will be at a given temperature, having some multiple peaks and some large dropoffs. Exo and endo thermic.
+ priority = 5
+ name = "Stimulum formation"
+ id = "stimformation"
+/datum/gas_reaction/stimformation/init_reqs()
+ min_requirements = list(
+ /datum/gas/tritium = 30,
+ /datum/gas/plasma = 10,
+ /datum/gas/bz = 20,
+ /datum/gas/brown_gas = 30,
+ "TEMP" = STIMULUM_HEAT_SCALE/2)
+
+/datum/gas_reaction/stimformation/react(datum/gas_mixture/air)
+ var/list/cached_gases = air.gases
+
+ var/old_heat_capacity = air.heat_capacity()
+ var/heat_scale = air.temperature/STIMULUM_HEAT_SCALE
+ var/stim_energy_change
+ stim_energy_change =heat_scale + (STIMULUM_FIRST_RISE(heat_scale**2)) - (STIMULUM_FIRST_DROP(heat_scale**3)) + (STIMULUM_SECOND_RISE(heat_scale**4)) - (STIMULUM_ABSOLUTE_DROP(heat_scale**5))
+
+ ASSERT_GAS(/datum/gas/stimulum,air)
+ cached_gases[/datum/gas/stimulum][MOLES]+= heat_scale/10
+ cached_gases[/datum/gas/tritium][MOLES] = max(cached_gases[/datum/gas/tritium][MOLES]- heat_scale,0)
+ cached_gases[/datum/gas/plasma][MOLES] = max(cached_gases[/datum/gas/plasma][MOLES]- heat_scale,0)
+ cached_gases[/datum/gas/brown_gas][MOLES] = max(cached_gases[/datum/gas/brown_gas][MOLES]- heat_scale,0)
+
+ if(stim_energy_change)
+ var/new_heat_capacity = air.heat_capacity()
+ if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ air.temperature = max(((air.temperature*old_heat_capacity + stim_energy_change)/new_heat_capacity),TCMB)
+ return REACTING
+
+/datum/gas_reaction/nobliumformation //Hyper-Nobelium formation is extrememly endothermic, but requires high temperatures to start. Due to its high mass, hyper-nobelium uses large amounts of nitrogen and tritium. BZ can be used as a catalyst to make it less endothermic.
+ priority = 6
+ name = "Hyper-Noblium condensation"
+ id = "nobformation"
+
+/datum/gas_reaction/nobliumformation/init_reqs()
+ min_requirements = list(
+ /datum/gas/nitrogen = 10,
+ /datum/gas/tritium = 5,
+ "TEMP" = 5000000)
+
+/datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air)
+ var/list/cached_gases = air.gases
+ air.assert_gases(/datum/gas/hypernoblium,/datum/gas/bz)
+ var/old_heat_capacity = air.heat_capacity()
+ var/nob_formed = (cached_gases[/datum/gas/nitrogen][MOLES]*cached_gases[/datum/gas/tritium][MOLES])/100
+ var/energy_taken = nob_formed*(10000000/(max(cached_gases[/datum/gas/bz][MOLES],1)))
+ cached_gases[/datum/gas/tritium][MOLES] = max(cached_gases[/datum/gas/tritium][MOLES]- 10*nob_formed,0)
+ cached_gases[/datum/gas/nitrogen][MOLES] = max(cached_gases[/datum/gas/nitrogen][MOLES]- 20*nob_formed,0)
+ cached_gases[/datum/gas/hypernoblium][MOLES]+= nob_formed
+
+
+ if (nob_formed)
+ var/new_heat_capacity = air.heat_capacity()
+ if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ air.temperature = max(((air.temperature*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB)
#undef REACTING
#undef NO_REACTION
+#undef OXYGEN_BURN_RATE_BASE
+#undef PLASMA_BURN_RATE_DELTA
+#undef PLASMA_UPPER_TEMPERATURE
+#undef PLASMA_MINIMUM_OXYGEN_NEEDED
+#undef PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO
+#undef PLASMA_OXYGEN_FULLBURN
+#undef FIRE_CARBON_ENERGY_RELEASED
+#undef FIRE_PLASMA_ENERGY_RELEASED
+#undef WATER_VAPOR_FREEZE
+#undef BROWNS_FORMATION_ENERGY
+#undef TRITIUM_BURN_OXY_FACTOR
+#undef SUPER_SATURATION_THRESHOLD
+#undef STIMULUM_HEAT_SCALE
+#undef STIMULUM_FIRST_RISE
+#undef STIMULUM_FIRST_DROP
+#undef STIMULUM_SECOND_RISE
+#undef STIMULUM_ABSOLUTE_DROP
+#undef REACTION_OPPRESSION_THRESHOLD
+#undef PLASMA_BINDING_ENERGY
+#undef MAX_CATALYST_EFFICENCY
+#undef PLASMA_FUSED_COEFFICENT
+#undef CATALYST_COEFFICENT
+#undef FUSION_PURITY_THRESHOLD
+#undef FUSION_HEAT_DROPOFF
\ No newline at end of file
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 18f88874e8..d2603208e5 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -5,10 +5,10 @@
var/max2
/datum/tlv/New(min2 as num, min1 as num, max1 as num, max2 as num)
- src.min2 = min2
- src.min1 = min1
- src.max1 = max1
- src.max2 = max2
+ if(min2) src.min2 = min2
+ if(min1) src.min1 = min1
+ if(max1) src.max1 = max1
+ if(max2) src.max2 = max2
/datum/tlv/proc/get_danger_level(val as num)
if(max2 != -1 && val >= max2)
@@ -21,6 +21,18 @@
return 1
return 0
+/datum/tlv/no_checks
+ min2 = -1
+ min1 = -1
+ max1 = -1
+ max2 = -1
+
+/datum/tlv/dangerous
+ min2 = -1
+ min1 = -1
+ max1 = 0.2
+ max2 = 0.5
+
/obj/item/electronics/airalarm
name = "air alarm electronics"
icon_state = "airalarm_electronics"
@@ -78,25 +90,33 @@
/datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
/datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), // Partial pressure, kpa
/datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), // Partial pressure, kpa
- /datum/gas/plasma = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
- /datum/gas/nitrous_oxide = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
- /datum/gas/bz = new/datum/tlv(-1, -1, 0.2, 0.5),
- /datum/gas/freon = new/datum/tlv(-1, -1, 0.2, 0.5),
- /datum/gas/water_vapor = new/datum/tlv(-1, -1, 0.2, 0.5)
+ /datum/gas/plasma = new/datum/tlv/dangerous, // Partial pressure, kpa
+ /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, // Partial pressure, kpa
+ /datum/gas/bz = new/datum/tlv/dangerous,
+ /datum/gas/hypernoblium = new/datum/tlv/dangerous,
+ /datum/gas/water_vapor = new/datum/tlv/dangerous,
+ /datum/gas/tritium = new/datum/tlv/dangerous,
+ /datum/gas/stimulum = new/datum/tlv/dangerous,
+ /datum/gas/brown_gas = new/datum/tlv/dangerous,
+ /datum/gas/pluoxium = new/datum/tlv/dangerous
)
/obj/machinery/airalarm/server // No checks here.
TLV = list(
- "pressure" = new/datum/tlv(-1, -1, -1, -1),
- "temperature" = new/datum/tlv(-1, -1, -1, -1),
- /datum/gas/oxygen = new/datum/tlv(-1, -1, -1, -1),
- /datum/gas/nitrogen = new/datum/tlv(-1, -1, -1, -1),
- /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, -1, -1),
- /datum/gas/plasma = new/datum/tlv(-1, -1, -1, -1),
- /datum/gas/nitrous_oxide = new/datum/tlv(-1, -1, -1, -1),
- /datum/gas/bz = new/datum/tlv(-1, -1, -1, -1),
- /datum/gas/freon = new/datum/tlv(-1, -1, -1, -1),
- /datum/gas/water_vapor = new/datum/tlv(-1, -1, -1, -1)
+ "pressure" = new/datum/tlv/no_checks,
+ "temperature" = new/datum/tlv/no_checks,
+ /datum/gas/oxygen = new/datum/tlv/no_checks,
+ /datum/gas/nitrogen = new/datum/tlv/no_checks,
+ /datum/gas/carbon_dioxide = new/datum/tlv/no_checks,
+ /datum/gas/plasma = new/datum/tlv/no_checks,
+ /datum/gas/nitrous_oxide = new/datum/tlv/no_checks,
+ /datum/gas/bz = new/datum/tlv/no_checks,
+ /datum/gas/hypernoblium = new/datum/tlv/no_checks,
+ /datum/gas/water_vapor = new/datum/tlv/no_checks,
+ /datum/gas/tritium = new/datum/tlv/no_checks,
+ /datum/gas/stimulum = new/datum/tlv/no_checks,
+ /datum/gas/brown_gas = new/datum/tlv/no_checks,
+ /datum/gas/pluoxium = new/datum/tlv/no_checks
)
/obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures.
@@ -106,11 +126,15 @@
/datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
/datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), // Partial pressure, kpa
/datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), // Partial pressure, kpa
- /datum/gas/plasma = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
- /datum/gas/nitrous_oxide = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
- /datum/gas/bz = new/datum/tlv(-1, -1, 0.2, 0.5),
- /datum/gas/freon = new/datum/tlv(-1, -1, 0.2, 0.5),
- /datum/gas/water_vapor = new/datum/tlv(-1, -1, 0.2, 0.5)
+ /datum/gas/plasma = new/datum/tlv/dangerous, // Partial pressure, kpa
+ /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, // Partial pressure, kpa
+ /datum/gas/bz = new/datum/tlv/dangerous,
+ /datum/gas/hypernoblium = new/datum/tlv/dangerous,
+ /datum/gas/water_vapor = new/datum/tlv/dangerous,
+ /datum/gas/tritium = new/datum/tlv/dangerous,
+ /datum/gas/stimulum = new/datum/tlv/dangerous,
+ /datum/gas/brown_gas = new/datum/tlv/dangerous,
+ /datum/gas/pluoxium = new/datum/tlv/dangerous
)
/obj/machinery/airalarm/engine
@@ -256,8 +280,7 @@
"filter_co2" = info["filter_co2"],
"filter_toxins" = info["filter_toxins"],
"filter_n2o" = info["filter_n2o"],
- "filter_bz" = info["filter_bz"],
- "filter_freon" = info["filter_freon"],
+ "filter_rare" = info["filter_rare"],
"filter_water_vapor" = info["filter_water_vapor"]
))
data["mode"] = mode
@@ -314,7 +337,7 @@
if(usr.has_unlimited_silicon_privilege && !wires.is_cut(WIRE_IDSCAN))
locked = !locked
. = TRUE
- if("power", "co2_scrub", "tox_scrub", "n2o_scrub", "bz_scrub", "freon_scrub","water_vapor_scrub", "widenet", "scrubbing")
+ if("power", "co2_scrub", "tox_scrub", "n2o_scrub", "rare_scrub","water_vapor_scrub", "widenet", "scrubbing")
send_signal(device_id, list("[action]" = text2num(params["val"])))
. = TRUE
if("excheck")
@@ -433,8 +456,7 @@
"co2_scrub" = 1,
"tox_scrub" = 0,
"n2o_scrub" = 0,
- "bz_scrub" = 0,
- "freon_scrub"= 0,
+ "rare_scrub"= 0,
"water_vapor_scrub"= 0,
"scrubbing" = 1,
"widenet" = 0,
@@ -452,8 +474,7 @@
"co2_scrub" = 1,
"tox_scrub" = 1,
"n2o_scrub" = 1,
- "bz_scrub" = 1,
- "freon_scrub"= 1,
+ "rare_scrub"= 1,
"water_vapor_scrub"= 1,
"scrubbing" = 1,
"widenet" = 1,
@@ -484,8 +505,7 @@
"co2_scrub" = 1,
"tox_scrub" = 0,
"n2o_scrub" = 0,
- "bz_scrub" = 0,
- "freon_scrub"= 0,
+ "rare_scrub"= 0,
"water_vapor_scrub"= 0,
"scrubbing" = 1,
"widenet" = 0,
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 4eb43d6d11..6c335bf896 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -36,6 +36,9 @@ Pipelines + Other Objects -> Pipe network
var/device_type = 0
var/list/obj/machinery/atmospherics/nodes
+ var/construction_type
+ var/pipe_state //icon_state as a pipe item
+
/obj/machinery/atmospherics/examine(mob/user)
..()
if(is_type_in_list(src, GLOB.ventcrawl_machinery) && isliving(user))
@@ -239,7 +242,7 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
if(can_unwrench)
- var/obj/item/pipe/stored = new(loc, piping_layer, dir, src)
+ var/obj/item/pipe/stored = new construction_type(loc, null, dir, src)
stored.setPipingLayer(piping_layer)
if(!disassembled)
stored.obj_integrity = stored.max_integrity * 0.5
@@ -271,7 +274,7 @@ Pipelines + Other Objects -> Pipe network
if(unconnected & direction)
underlays += getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', "pipe_exposed", direction)
-/obj/machinery/atmospherics/on_construction(pipe_type, obj_color, set_layer)
+/obj/machinery/atmospherics/on_construction(obj_color, set_layer)
if(can_unwrench)
add_atom_colour(obj_color, FIXED_COLOUR_PRIORITY)
pipe_color = obj_color
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
index 158c272543..86c5375d07 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
@@ -21,6 +21,9 @@ Passive gate is similar to the regular pump except:
var/id = null
var/datum/radio_frequency/radio_connection
+ construction_type = /obj/item/pipe/directional
+ pipe_state = "passivegate"
+
/obj/machinery/atmospherics/components/binary/passive_gate/Destroy()
SSradio.remove_object(src,frequency)
return ..()
@@ -167,4 +170,3 @@ Passive gate is similar to the regular pump except:
if(. && on)
to_chat(user, "You cannot unwrench [src], turn it off first!")
return FALSE
-
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index c5242fb5cc..97bba0e534 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -26,6 +26,9 @@ Thus, the two variables affect pump operation are set in New():
var/id = null
var/datum/radio_frequency/radio_connection
+ construction_type = /obj/item/pipe/directional
+ pipe_state = "pump"
+
/obj/machinery/atmospherics/components/binary/pump/on
on = TRUE
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
index dbe1343667..e613012e82 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
@@ -15,6 +15,9 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
var/open = FALSE
var/valve_type = "m" //lets us have a nice, clean, OOP update_icon_nopipes()
+ construction_type = /obj/item/pipe/binary
+ pipe_state = "mvalve"
+
/obj/machinery/atmospherics/components/binary/valve/open
open = TRUE
@@ -65,6 +68,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
desc = "A digitally controlled valve."
icon_state = "dvalve_map"
valve_type = "d"
+ pipe_state = "dvalve"
/obj/machinery/atmospherics/components/binary/valve/digital/attack_ai(mob/user)
return src.attack_hand(user)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index 227c34d9ca..b154c0d3e4 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -26,6 +26,9 @@ Thus, the two variables affect pump operation are set in New():
var/id = null
var/datum/radio_frequency/radio_connection
+ construction_type = /obj/item/pipe/directional
+ pipe_state = "volumepump"
+
/obj/machinery/atmospherics/components/binary/volume_pump/Destroy()
SSradio.remove_object(src,frequency)
return ..()
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index 68814e38b9..d0cba4d581 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -10,6 +10,9 @@
var/frequency = 0
var/datum/radio_frequency/radio_connection
+ construction_type = /obj/item/pipe/trinary/flippable
+ pipe_state = "filter"
+
/obj/machinery/atmospherics/components/trinary/filter/flipped
icon_state = "filter_off_f"
flipped = TRUE
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
index 1fb8b072c6..b706cd3cd9 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
@@ -12,6 +12,9 @@
var/node1_concentration = 0.5
var/node2_concentration = 0.5
+ construction_type = /obj/item/pipe/trinary/flippable
+ pipe_state = "mixer"
+
//node 3 is the outlet, nodes 1 & 2 are intakes
/obj/machinery/atmospherics/components/trinary/mixer/flipped
@@ -171,4 +174,3 @@
if(. && on && is_operational())
to_chat(user, "You cannot unwrench [src], turn it off first!")
return FALSE
-
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
index 1b1a470315..c8daf29ad3 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
@@ -12,6 +12,8 @@
var/obj/machinery/atmospherics/components/unary/heat_exchanger/partner = null
var/update_cycle
+ pipe_state = "heunary"
+
/obj/machinery/atmospherics/components/unary/heat_exchanger/update_icon()
if(NODE1)
icon_state = "he_intact"
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
index b7db6e3eb5..37bfb5d952 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -18,6 +18,8 @@
level = 1
layer = GAS_SCRUBBER_LAYER
+ pipe_state = "injector"
+
/obj/machinery/atmospherics/components/unary/outlet_injector/Destroy()
SSradio.remove_object(src,frequency)
return ..()
@@ -188,4 +190,3 @@
if(. && on && is_operational())
to_chat(user, "You cannot unwrench [src], turn it off first!")
return FALSE
-
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
index ee48889041..051f3136ee 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
@@ -9,6 +9,7 @@
level = 0
layer = GAS_FILTER_LAYER
pipe_flags = PIPING_ONE_PER_TURF
+ pipe_state = "connector"
/obj/machinery/atmospherics/components/unary/portables_connector/New()
..()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
index 04f1068a00..ec1fcdfc52 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
@@ -28,9 +28,6 @@
icon_state = "orange"
gas_type = /datum/gas/plasma
-/obj/machinery/atmospherics/components/unary/tank/oxygen_agent_b
- icon_state = "orange_2"
- gas_type = /datum/gas/oxygen_agent_b
/obj/machinery/atmospherics/components/unary/tank/oxygen
icon_state = "blue"
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm
index f629020d74..a335fd2f59 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm
@@ -4,6 +4,7 @@
initialize_directions = SOUTH
device_type = UNARY
pipe_flags = PIPING_ONE_PER_TURF
+ construction_type = /obj/item/pipe/directional
/obj/machinery/atmospherics/components/unary/SetInitDirections()
initialize_directions = dir
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index 28a76f0a2d..82482b562f 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -31,6 +31,8 @@
var/radio_filter_out
var/radio_filter_in
+ pipe_state = "uvent"
+
/obj/machinery/atmospherics/components/unary/vent_pump/on
on = TRUE
icon_state = "vent_map_on"
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index 7665f93af3..e0567ee967 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -20,8 +20,7 @@
var/scrub_CO2 = TRUE
var/scrub_Toxins = FALSE
var/scrub_N2O = FALSE
- var/scrub_BZ = FALSE
- var/scrub_Freon = FALSE
+ var/scrub_Rare = FALSE
var/scrub_WaterVapor = FALSE
@@ -34,6 +33,8 @@
var/radio_filter_out
var/radio_filter_in
+ pipe_state = "scrubber"
+
/obj/machinery/atmospherics/components/unary/vent_scrubber/New()
..()
if(!id_tag)
@@ -70,9 +71,7 @@
amount += idle_power_usage
if(scrub_N2O)
amount += idle_power_usage
- if(scrub_BZ)
- amount += idle_power_usage
- if(scrub_Freon)
+ if(scrub_Rare)
amount += idle_power_usage
if(scrub_WaterVapor)
amount += idle_power_usage
@@ -125,8 +124,7 @@
"filter_co2" = scrub_CO2,
"filter_toxins" = scrub_Toxins,
"filter_n2o" = scrub_N2O,
- "filter_bz" = scrub_BZ,
- "filter_freon" = scrub_Freon,
+ "filter_rare" =scrub_Rare,
"filter_water_vapor" = scrub_WaterVapor,
"sigtype" = "status"
)
@@ -198,37 +196,52 @@
filtered_out.temperature = removed.temperature
if(scrub_Toxins && removed_gases[/datum/gas/plasma])
- ADD_GAS(/datum/gas/plasma, filtered_out.gases)
+ ADD_GAS(/datum/gas/plasma, filtered_gases)
filtered_gases[/datum/gas/plasma][MOLES] = removed_gases[/datum/gas/plasma][MOLES]
removed_gases[/datum/gas/plasma][MOLES] = 0
if(scrub_CO2 && removed_gases[/datum/gas/carbon_dioxide])
- ADD_GAS(/datum/gas/carbon_dioxide, filtered_out.gases)
+ ADD_GAS(/datum/gas/carbon_dioxide, filtered_gases)
filtered_gases[/datum/gas/carbon_dioxide][MOLES] = removed_gases[/datum/gas/carbon_dioxide][MOLES]
removed_gases[/datum/gas/carbon_dioxide][MOLES] = 0
- if(removed_gases[/datum/gas/oxygen_agent_b])
- ADD_GAS(/datum/gas/oxygen_agent_b, filtered_out.gases)
- filtered_gases[/datum/gas/oxygen_agent_b][MOLES] = removed_gases[/datum/gas/oxygen_agent_b][MOLES]
- removed_gases[/datum/gas/oxygen_agent_b][MOLES] = 0
-
if(scrub_N2O && removed_gases[/datum/gas/nitrous_oxide])
- ADD_GAS(/datum/gas/nitrous_oxide, filtered_out.gases)
+ ADD_GAS(/datum/gas/nitrous_oxide, filtered_gases)
filtered_gases[/datum/gas/nitrous_oxide][MOLES] = removed_gases[/datum/gas/nitrous_oxide][MOLES]
removed_gases[/datum/gas/nitrous_oxide][MOLES] = 0
- if(scrub_BZ && removed_gases[/datum/gas/bz])
- ADD_GAS(/datum/gas/bz, filtered_out.gases)
+ if(scrub_Rare && removed_gases[/datum/gas/bz])
+ ADD_GAS(/datum/gas/bz, filtered_gases)
filtered_gases[/datum/gas/bz][MOLES] = removed_gases[/datum/gas/bz][MOLES]
removed_gases[/datum/gas/bz][MOLES] = 0
- if(scrub_Freon && removed_gases[/datum/gas/freon])
- ADD_GAS(/datum/gas/freon, filtered_out.gases)
- filtered_gases[/datum/gas/freon][MOLES] = removed_gases[/datum/gas/freon][MOLES]
- removed_gases[/datum/gas/freon][MOLES] = 0
+ if(scrub_Rare && removed_gases[/datum/gas/hypernoblium])
+ ADD_GAS(/datum/gas/hypernoblium, filtered_gases)
+ filtered_gases[/datum/gas/hypernoblium][MOLES] = removed_gases[/datum/gas/hypernoblium][MOLES]
+ removed_gases[/datum/gas/hypernoblium][MOLES] = 0
+
+ if(scrub_Rare && removed_gases[/datum/gas/stimulum])
+ ADD_GAS(/datum/gas/stimulum, filtered_gases)
+ filtered_gases[/datum/gas/stimulum][MOLES] = removed_gases[/datum/gas/stimulum][MOLES]
+ removed_gases[/datum/gas/stimulum][MOLES] = 0
+
+ if(scrub_Rare && removed_gases[/datum/gas/pluoxium])
+ ADD_GAS(/datum/gas/pluoxium, filtered_gases)
+ filtered_gases[/datum/gas/pluoxium][MOLES] = removed_gases[/datum/gas/pluoxium][MOLES]
+ removed_gases[/datum/gas/pluoxium][MOLES] = 0
+
+ if(scrub_Rare && removed_gases[/datum/gas/brown_gas])
+ ADD_GAS(/datum/gas/brown_gas, filtered_gases)
+ filtered_gases[/datum/gas/brown_gas][MOLES] = removed_gases[/datum/gas/brown_gas][MOLES]
+ removed_gases[/datum/gas/brown_gas][MOLES] = 0
+
+ if(scrub_Rare && removed_gases[/datum/gas/tritium])
+ ADD_GAS(/datum/gas/tritium, filtered_gases)
+ filtered_gases[/datum/gas/tritium][MOLES] = removed_gases[/datum/gas/tritium][MOLES]
+ removed_gases[/datum/gas/tritium][MOLES] = 0
if(scrub_WaterVapor && removed_gases[/datum/gas/water_vapor])
- ADD_GAS(/datum/gas/water_vapor, filtered_out.gases)
+ ADD_GAS(/datum/gas/water_vapor, filtered_gases)
filtered_gases[/datum/gas/water_vapor][MOLES] = removed_gases[/datum/gas/water_vapor][MOLES]
removed_gases[/datum/gas/water_vapor][MOLES] = 0
@@ -303,15 +316,10 @@
if("toggle_n2o_scrub" in signal.data)
scrub_N2O = !scrub_N2O
- if("bz_scrub" in signal.data)
- scrub_BZ = text2num(signal.data["bz_scrub"])
- if("toggle_bz_scrub" in signal.data)
- scrub_BZ = !scrub_BZ
-
- if("freon_scrub" in signal.data)
- scrub_Freon = text2num(signal.data["freon_scrub"])
- if("toggle_freon_scrub" in signal.data)
- scrub_Freon = !scrub_Freon
+ if("rare_scrub" in signal.data)
+ scrub_Rare = text2num(signal.data["rare_scrub"])
+ if("toggle_rare_scrub" in signal.data)
+ scrub_Rare = !scrub_Rare
if("water_vapor_scrub" in signal.data)
scrub_WaterVapor = text2num(signal.data["water_vapor_scrub"])
diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm
index 99e6cda6af..cb28f17802 100644
--- a/code/modules/atmospherics/machinery/other/miner.dm
+++ b/code/modules/atmospherics/machinery/other/miner.dm
@@ -173,21 +173,6 @@
overlay_color = "#FAFF00"
spawn_id = /datum/gas/bz
-/obj/machinery/atmospherics/miner/freon
- name = "\improper Freon Gas Miner"
- overlay_color = "#00FFE5"
- spawn_id = /datum/gas/freon
-
-/obj/machinery/atmospherics/miner/volatile_fuel
- name = "\improper Volatile Fuel Gas Miner"
- overlay_color = "#564040"
- spawn_id = /datum/gas/volatile_fuel
-
-/obj/machinery/atmospherics/miner/agent_b
- name = "\improper Agent B Gas Miner"
- overlay_color = "#E81E24"
- spawn_id = /datum/gas/oxygen_agent_b
-
/obj/machinery/atmospherics/miner/water_vapor
name = "\improper Water Vapor Gas Miner"
overlay_color = "#99928E"
diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm
index 2645e0f9fa..67186f09f5 100644
--- a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm
+++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm
@@ -13,6 +13,9 @@
initialize_directions_he = SOUTH
device_type = BINARY
+
+ construction_type = /obj/item/pipe/directional
+ pipe_state = "junction"
/obj/machinery/atmospherics/pipe/heat_exchanging/junction/SetInitDirections()
switch(dir)
@@ -43,4 +46,4 @@
return 0
init_dir = H.initialize_directions_he
if(init_dir & get_dir(target,src))
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm
index d305bf1064..e4df82073b 100644
--- a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm
@@ -10,6 +10,9 @@
device_type = TRINARY
+ construction_type = /obj/item/pipe/trinary
+ pipe_state = "he_manifold"
+
/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/SetInitDirections()
switch(dir)
if(NORTH)
@@ -44,6 +47,9 @@
device_type = QUATERNARY
+ construction_type = /obj/item/pipe/quaternary
+ pipe_state = "he_manifold4w"
+
/obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w/SetInitDirections()
initialize_directions_he = initial(initialize_directions_he)
@@ -57,4 +63,4 @@
//Add non-broken pieces
for(DEVICE_TYPE_LOOP)
if(NODE_I)
- add_overlay(getpipeimage('icons/obj/atmospherics/pipes/heat.dmi', "manifold_intact[invis]", get_dir(src, NODE_I)))
\ No newline at end of file
+ add_overlay(getpipeimage('icons/obj/atmospherics/pipes/heat.dmi', "manifold_intact[invis]", get_dir(src, NODE_I)))
diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm
index e69e30f327..637d55306f 100644
--- a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm
+++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm
@@ -9,6 +9,9 @@
device_type = BINARY
+ construction_type = /obj/item/pipe/binary/bendable
+ pipe_state = "he"
+
/obj/machinery/atmospherics/pipe/heat_exchanging/simple/SetInitDirections()
if(dir in GLOB.diagonals)
initialize_directions_he = dir
@@ -30,4 +33,4 @@
/obj/machinery/atmospherics/pipe/heat_exchanging/simple/update_icon()
normalize_dir()
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm
index cc9ef36678..fee00baf50 100644
--- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm
@@ -11,6 +11,8 @@
volume = 260
var/list/front_nodes
var/list/back_nodes
+ construction_type = /obj/item/pipe/binary
+ pipe_state = "layer_manifold"
/obj/machinery/atmospherics/pipe/layer_manifold/Initialize()
front_nodes = list()
@@ -31,17 +33,7 @@
A.build_network()
/obj/machinery/atmospherics/pipe/layer_manifold/proc/get_all_connected_nodes()
- var/list/obj/machinery/atmospherics/all_connected = list()
- for(var/obj/machinery/atmospherics/I in front_nodes)
- all_connected[I] = I
- for(var/obj/machinery/atmospherics/I in back_nodes)
- all_connected[I] = I
- for(var/obj/machinery/atmospherics/I in nodes)
- all_connected[I] = I
- var/list/obj/machinery/atmospherics/returnlist = list()
- for(var/obj/machinery/atmospherics/A in all_connected)
- returnlist += all_connected[A]
- return returnlist
+ return front_nodes + back_nodes + nodes
/obj/machinery/atmospherics/pipe/layer_manifold/update_icon() //HEAVILY WIP FOR UPDATE ICONS!!
layer = (initial(layer) + (PIPING_LAYER_MAX * PIPING_LAYER_LCHANGE)) //This is above everything else.
diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm
index 5be4b63d88..8560addc3a 100644
--- a/code/modules/atmospherics/machinery/pipes/manifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/manifold.dm
@@ -13,6 +13,9 @@
device_type = TRINARY
+ construction_type = /obj/item/pipe/trinary
+ pipe_state = "manifold"
+
/obj/machinery/atmospherics/pipe/manifold/SetInitDirections()
switch(dir)
if(NORTH)
@@ -168,4 +171,4 @@
layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold/brown/hidden
- level = PIPE_HIDDEN_LEVEL
\ No newline at end of file
+ level = PIPE_HIDDEN_LEVEL
diff --git a/code/modules/atmospherics/machinery/pipes/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/manifold4w.dm
index fa21275ca3..f368c6bb0f 100644
--- a/code/modules/atmospherics/machinery/pipes/manifold4w.dm
+++ b/code/modules/atmospherics/machinery/pipes/manifold4w.dm
@@ -12,6 +12,9 @@
device_type = QUATERNARY
+ construction_type = /obj/item/pipe/quaternary
+ pipe_state = "manifold4w"
+
/obj/machinery/atmospherics/pipe/manifold4w/SetInitDirections()
initialize_directions = initial(initialize_directions)
@@ -160,4 +163,4 @@
layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold4w/brown/hidden
- level = PIPE_HIDDEN_LEVEL
\ No newline at end of file
+ level = PIPE_HIDDEN_LEVEL
diff --git a/code/modules/atmospherics/machinery/pipes/simple.dm b/code/modules/atmospherics/machinery/pipes/simple.dm
index e8d82c611c..0d6537b3d1 100644
--- a/code/modules/atmospherics/machinery/pipes/simple.dm
+++ b/code/modules/atmospherics/machinery/pipes/simple.dm
@@ -16,6 +16,9 @@ The regular pipe you see everywhere, including bent ones.
device_type = BINARY
+ construction_type = /obj/item/pipe/binary/bendable
+ pipe_state = "simple"
+
/obj/machinery/atmospherics/pipe/simple/SetInitDirections()
normalize_cardinal_directions()
if(dir in GLOB.diagonals)
@@ -158,4 +161,4 @@ The regular pipe you see everywhere, including bent ones.
layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/simple/brown/hidden
- level = PIPE_HIDDEN_LEVEL
\ No newline at end of file
+ level = PIPE_HIDDEN_LEVEL
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index 38c96a8ec9..0a7f43b383 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -43,7 +43,6 @@
"n2o" = /obj/machinery/portable_atmospherics/canister/nitrous_oxide,
"bz" = /obj/machinery/portable_atmospherics/canister/bz,
"air" = /obj/machinery/portable_atmospherics/canister/air,
- "freon" = /obj/machinery/portable_atmospherics/canister/freon,
"water vapor" = /obj/machinery/portable_atmospherics/canister/water_vapor,
"caution" = /obj/machinery/portable_atmospherics/canister,
)
@@ -79,11 +78,6 @@
icon_state = "orange"
gas_type = /datum/gas/plasma
-/obj/machinery/portable_atmospherics/canister/agent_b
- name = "agent b canister"
- desc = "Oxygen Agent B. You're not quite sure what it does."
- gas_type = /datum/gas/oxygen_agent_b
-
/obj/machinery/portable_atmospherics/canister/bz
name = "BZ canister"
desc = "BZ, a powerful hallucinogenic nerve agent."
@@ -101,12 +95,30 @@
desc = "Pre-mixed air."
icon_state = "grey"
-/obj/machinery/portable_atmospherics/canister/freon
- name = "freon canister"
- desc = "Freon. Great for the atmosphere!"
- icon_state = "freon"
- gas_type = /datum/gas/freon
- starter_temp = 120
+/obj/machinery/portable_atmospherics/canister/tritium
+ name = "tritium canister"
+ desc = "Tritium. Inhalation might cause irradiation."
+ gas_type = /datum/gas/tritium
+
+/obj/machinery/portable_atmospherics/canister/nob
+ name = "hyper-noblium canister"
+ desc = "Hyper-Noblium. More noble than all other gases."
+ gas_type = /datum/gas/hypernoblium
+
+/obj/machinery/portable_atmospherics/canister/browns
+ name = "brown gas canister"
+ desc = "Browns gas. Feels great 'til the acid eats your lungs."
+ gas_type = /datum/gas/brown_gas
+
+/obj/machinery/portable_atmospherics/canister/stimulum
+ name = "stimulum canister"
+ desc = "Stimulum. High energy gas, high energy people."
+ gas_type = /datum/gas/stimulum
+
+/obj/machinery/portable_atmospherics/canister/pluoxium
+ name = "pluoxium canister"
+ desc = "Pluoxium. Like oxygen, but more bang for your buck."
+ gas_type = /datum/gas/pluoxium
/obj/machinery/portable_atmospherics/canister/water_vapor
name = "water vapor canister"
@@ -115,6 +127,7 @@
gas_type = /datum/gas/water_vapor
filled = 1
+
/obj/machinery/portable_atmospherics/canister/proc/get_time_left()
if(timing)
. = round(max(0, valve_timer - world.time) / 10, 1)
@@ -402,7 +415,7 @@
var/gas = air_contents.gases[id]
if(!gas[GAS_META][META_GAS_DANGER])
continue
- if(gas[MOLES] > (gas[GAS_META][META_GAS_MOLES_VISIBLE] || MOLES_PLASMA_VISIBLE)) //if moles_visible is undefined, default to plasma visibility
+ if(gas[MOLES] > (gas[GAS_META][META_GAS_MOLES_VISIBLE] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility
danger[gas[GAS_META][META_GAS_NAME]] = gas[MOLES] //ex. "plasma" = 20
if(danger.len)
diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm
index cd857d19a1..bb203fd6ee 100644
--- a/code/modules/atmospherics/machinery/portable/scrubber.dm
+++ b/code/modules/atmospherics/machinery/portable/scrubber.dm
@@ -7,7 +7,7 @@
var/volume_rate = 1000
volume = 1000
- var/list/scrubbing = list(/datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/oxygen_agent_b, /datum/gas/bz, /datum/gas/freon, /datum/gas/water_vapor)
+ var/list/scrubbing = list(/datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/brown_gas, /datum/gas/tritium, /datum/gas/hypernoblium, /datum/gas/water_vapor)
/obj/machinery/portable_atmospherics/scrubber/Destroy()
var/turf/T = get_turf(src)
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index c5b180d8a1..4269de6069 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -937,23 +937,6 @@
crate_type = /obj/structure/closet/crate/secure/science
dangerous = TRUE
-/datum/supply_pack/science/bz_canister
- name = "BZ Canister"
- cost = 2000
- access_any = list(ACCESS_RD, ACCESS_ATMOSPHERICS)
- contains = list(/obj/machinery/portable_atmospherics/canister/bz)
- crate_name = "bz canister crate"
- crate_type = /obj/structure/closet/crate/secure/science
- dangerous = TRUE
-
-/datum/supply_pack/science/freon_canister
- name = "Freon Canister"
- cost = 6000
- access_any = list(ACCESS_RD, ACCESS_ATMOSPHERICS)
- contains = list(/obj/machinery/portable_atmospherics/canister/freon)
- crate_name = "freon canister crate"
- crate_type = /obj/structure/closet/crate/secure/science
- dangerous = TRUE
/datum/supply_pack/science/research
name = "Machine Prototype Crate"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 62243067f7..c493008256 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -45,7 +45,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/allow_midround_antag = 1
var/preferred_map = null
var/pda_style = MONO
-
+
var/uses_glasses_colour = 0
var/screenshake = 100
@@ -1185,7 +1185,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("species")
- var/result = input(user, "Select a species", "Species Selection") as null|anything in CONFIG_GET(keyed_flag_list/roundstart_races)
+ var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_races
if(result)
var/newtype = GLOB.species_list[result]
diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm
index 42c20a2dc6..5e07134d4f 100644
--- a/code/modules/client/verbs/looc.dm
+++ b/code/modules/client/verbs/looc.dm
@@ -4,12 +4,12 @@
set category = "OOC"
if(GLOB.say_disabled) //This is here to try to identify lag problems
- usr << " Speech is currently admin-disabled."
+ to_chat(usr, " Speech is currently admin-disabled.")
return
if(!mob) return
if(IsGuestKey(key))
- src << "Guests may not use OOC."
+ to_chat(src, "Guests may not use OOC.")
return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
@@ -17,23 +17,23 @@
return
if(!(prefs.toggles & CHAT_OOC))
- src << " You have OOC muted."
+ to_chat(src, " You have OOC muted.")
return
if(!holder)
if(!GLOB.ooc_allowed)
- src << " OOC is globally muted"
+ to_chat(src, " OOC is globally muted")
return
if(!GLOB.dooc_allowed && (mob.stat == DEAD))
- usr << " OOC for dead mobs has been turned off."
+ to_chat(usr, " OOC for dead mobs has been turned off.")
return
if(prefs.muted & MUTE_OOC)
- src << " You cannot use OOC (muted)."
+ to_chat(src, " You cannot use OOC (muted).")
return
if(handle_spam_prevention(msg,MUTE_OOC))
return
if(findtext(msg, "byond://"))
- src << "Advertising other servers is not allowed."
+ to_chat(src, "Advertising other servers is not allowed.")
log_admin("[key_name(src)] has attempted to advertise in LOOC: [msg]")
return
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 74e2f70c37..2b66a85fe6 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -59,8 +59,8 @@
var/heart_strength = "no"
var/lung_strength = "no"
- var/obj/item/organ/heart/heart = M.getorganslot("heart")
- var/obj/item/organ/lungs/lungs = M.getorganslot("lungs")
+ var/obj/item/organ/heart/heart = M.getorganslot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/lungs/lungs = M.getorganslot(ORGAN_SLOT_LUNGS)
if(!(M.stat == DEAD || (M.status_flags&FAKEDEATH)))
if(heart && istype(heart))
@@ -179,4 +179,4 @@
desc = "Damn, it feels good to be a gangster."
icon = 'icons/obj/clothing/neck.dmi'
icon_state = "bling"
- item_color = "bling"
+ item_color = "bling"
\ No newline at end of file
diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm
index 5415eab386..f83024bd3d 100644
--- a/code/modules/events/holiday/halloween.dm
+++ b/code/modules/events/holiday/halloween.dm
@@ -10,12 +10,8 @@
..()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
var/obj/item/storage/backpack/b = locate() in H.contents
- new /obj/item/storage/spooky(b)
- if(ishuman(H) || islizard(H))
- if(prob(50))
- H.set_species(/datum/species/skeleton)
- else
- H.set_species(/datum/species/zombie)
+ if(b)
+ new /obj/item/storage/spooky(b)
for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_list)
Ian.place_on_head(new /obj/item/bedsheet(Ian))
@@ -26,77 +22,6 @@
/datum/round_event/spooky/announce()
priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE")
-//Eyeball migration
-/datum/round_event_control/carp_migration/eyeballs
- name = "Eyeball Migration"
- typepath = /datum/round_event/carp_migration/eyeballs
- holidayID = HALLOWEEN
- weight = 25
- earliest_start = 0
-
-/datum/round_event/carp_migration/eyeballs/start()
- for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
- new /mob/living/simple_animal/hostile/carp/eyeball(C.loc)
-
-//Pumpking meteors waves
-/datum/round_event_control/meteor_wave/spooky
- name = "Pumpkin Wave"
- typepath = /datum/round_event/meteor_wave/spooky
- holidayID = HALLOWEEN
- weight = 20
- max_occurrences = 2
-
-/datum/round_event/meteor_wave/spooky
- endWhen = 40
-
-/datum/round_event/meteor_wave/spooky/tick()
- if(IsMultiple(activeFor, 4))
- spawn_meteors(3, GLOB.meteorsSPOOKY) //meteor list types defined in gamemode/meteor/meteors.dm
-
-//Creepy clown invasion
-/datum/round_event_control/creepy_clowns
- name = "Clowns"
- typepath = /datum/round_event/creepy_clowns
- holidayID = HALLOWEEN
- weight = 20
- earliest_start = 0
-
-/datum/round_event/creepy_clowns
- endWhen = 40
-
-/datum/round_event/creepy_clowns/start()
- for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
- if(!H.client || !istype(H))
- return
- to_chat(H, "Honk...")
- SEND_SOUND(H, sound('sound/spookoween/scary_clown_appear.ogg'))
- var/turf/T = get_turf(H)
- if(T)
- new /obj/effect/hallucination/simple/clown(T, H, 50)
-
-/datum/round_event/creepy_clowns/tick()
- if(IsMultiple(activeFor, 4))
- for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
- if (prob(66))
- playsound(H.loc, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, 1)
- if (prob(33))
- var/turf/T = get_turf(H)
- if(T)
- new /obj/effect/hallucination/simple/clown(T, H, 25)
- else if (prob(25))
- var/turf/T = get_turf(H)
- if(T)
- new /obj/effect/hallucination/simple/clown/scary(T, H, 25)
- else if (prob(5))
- var/turf/T = get_turf(H)
- if(T)
- spawn_atom_to_turf(/obj/effect/mob_spawn/human/clown/corpse, H, 1)
- else if (prob(1))
- spawn_atom_to_turf(/mob/living/simple_animal/hostile/retaliate/clown, H, 1)
-
-/datum/round_event/creepy_clowns/announce()
- priority_announce("Honk... Honk... honk... HONK! HONK! HONKHONKHONKHONKHONK", "HONK!", 'sound/spookoween/scary_horn.ogg')
-
//spooky foods (you can't actually make these when it's not halloween)
/obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull
name = "skull cookie"
@@ -110,7 +35,6 @@
icon = 'icons/obj/halloween_items.dmi'
icon_state = "coffincookie"
-
//spooky items
/obj/item/storage/spooky
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index d46525a0eb..7940eaeec8 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -1,68 +1,72 @@
-// Normal strength
-
-/datum/round_event_control/meteor_wave
- name = "Meteor Wave: Normal"
- typepath = /datum/round_event/meteor_wave
- weight = 4
- min_players = 5
- max_occurrences = 3
-
-/datum/round_event/meteor_wave
- startWhen = 6
- endWhen = 66
- announceWhen = 1
- var/list/wave_type
- var/wave_name = "normal"
-
-/datum/round_event/meteor_wave/New()
- ..()
- if(!wave_type)
- determine_wave_type()
-
-/datum/round_event/meteor_wave/proc/determine_wave_type()
- if(!wave_name)
- wave_name = pickweight(list(
- "normal" = 50,
- "threatening" = 40,
- "catastrophic" = 10))
- switch(wave_name)
- if("normal")
- wave_type = GLOB.meteors_normal
- if("threatening")
- wave_type = GLOB.meteors_threatening
- if("catastrophic")
- wave_type = GLOB.meteors_catastrophic
- if("meaty")
- wave_type = GLOB.meteorsB
- if("space dust")
- wave_type = GLOB.meteorsC
- else
- WARNING("Wave name of [wave_name] not recognised.")
- kill()
-
-/datum/round_event/meteor_wave/announce()
- priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg')
-
-/datum/round_event/meteor_wave/tick()
- if(IsMultiple(activeFor, 3))
- spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm
-
-/datum/round_event_control/meteor_wave/threatening
- name = "Meteor Wave: Threatening"
- typepath = /datum/round_event/meteor_wave/threatening
- weight = 2
- min_players = 5
- max_occurrences = 3
-
-/datum/round_event/meteor_wave/threatening
- wave_name = "threatening"
-
-/datum/round_event_control/meteor_wave/catastrophic
- name = "Meteor Wave: Catastrophic"
- typepath = /datum/round_event/meteor_wave/catastrophic
- weight = 1
- min_players = 5
- max_occurrences = 3
-
-/datum/round_event/meteor_wave/catastrophic
- wave_name = "catastrophic"
+// Normal strength
+
+/datum/round_event_control/meteor_wave
+ name = "Meteor Wave: Normal"
+ typepath = /datum/round_event/meteor_wave
+ weight = 4
+ min_players = 5
+ max_occurrences = 3
+
+/datum/round_event/meteor_wave
+ startWhen = 6
+ endWhen = 66
+ announceWhen = 1
+ var/list/wave_type
+ var/wave_name = "normal"
+
+/datum/round_event/meteor_wave/New()
+ ..()
+ if(!wave_type)
+ determine_wave_type()
+
+/datum/round_event/meteor_wave/proc/determine_wave_type()
+ if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
+ wave_name = "halloween"
+ if(!wave_name)
+ wave_name = pickweight(list(
+ "normal" = 50,
+ "threatening" = 40,
+ "catastrophic" = 10))
+ switch(wave_name)
+ if("normal")
+ wave_type = GLOB.meteors_normal
+ if("threatening")
+ wave_type = GLOB.meteors_threatening
+ if("catastrophic")
+ wave_type = GLOB.meteors_catastrophic
+ if("meaty")
+ wave_type = GLOB.meteorsB
+ if("space dust")
+ wave_type = GLOB.meteorsC
+ if("halloween")
+ wave_type = GLOB.meteorsSPOOKY
+ else
+ WARNING("Wave name of [wave_name] not recognised.")
+ kill()
+
+/datum/round_event/meteor_wave/announce()
+ priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg')
+
+/datum/round_event/meteor_wave/tick()
+ if(IsMultiple(activeFor, 3))
+ spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm
+
+/datum/round_event_control/meteor_wave/threatening
+ name = "Meteor Wave: Threatening"
+ typepath = /datum/round_event/meteor_wave/threatening
+ weight = 2
+ min_players = 5
+ max_occurrences = 3
+
+/datum/round_event/meteor_wave/threatening
+ wave_name = "threatening"
+
+/datum/round_event_control/meteor_wave/catastrophic
+ name = "Meteor Wave: Catastrophic"
+ typepath = /datum/round_event/meteor_wave/catastrophic
+ weight = 1
+ min_players = 5
+ max_occurrences = 3
+
+/datum/round_event/meteor_wave/catastrophic
+ wave_name = "catastrophic"
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index c8e9235646..751bc53eac 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -272,7 +272,7 @@
/datum/holiday/halloween
name = HALLOWEEN
- begin_day = 30
+ begin_day = 28
begin_month = OCTOBER
end_day = 2
end_month = NOVEMBER
diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm
index 80a7b7a545..680300b404 100644
--- a/code/modules/holodeck/turfs.dm
+++ b/code/modules/holodeck/turfs.dm
@@ -106,7 +106,7 @@
slowdown = 2
/turf/open/floor/holofloor/snow/cold
- initial_gas_mix = "freon=7500;TEMP=0"
+ initial_gas_mix = "nob=7500;TEMP=2.7"
/turf/open/floor/holofloor/asteroid
name = "asteroid sand"
diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm
index dd5cd53690..178f091fb7 100644
--- a/code/modules/lighting/lighting_source.dm
+++ b/code/modules/lighting/lighting_source.dm
@@ -56,10 +56,11 @@
if (top_atom)
LAZYREMOVE(top_atom.light_sources, src)
-
+
+ if (needs_update)
+ GLOB.lighting_update_lights -= src
+
. = ..()
- if(!force)
- return QDEL_HINT_IWILLGC
// Yes this doesn't align correctly on anything other than 4 width tabs.
// If you want it to go switch everybody to elastic tab stops.
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index 831fde141e..f362f09a65 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -14,7 +14,7 @@
facial_hair_color = hair_color
eye_color = random_eye_color()
if(!pref_species)
- var/rando_race = pick(CONFIG_GET(keyed_flag_list/roundstart_races))
+ var/rando_race = pick(GLOB.roundstart_races)
pref_species = new rando_race()
features = random_features()
age = rand(AGE_MIN,AGE_MAX)
@@ -59,7 +59,7 @@
if(previewJob && !nude)
mannequin.job = previewJob.title
previewJob.equip(mannequin, TRUE)
- mannequin.compile_overlays()
+ COMPILE_OVERLAYS(mannequin)
CHECK_TICK
preview_icon = icon('icons/effects/effects.dmi', "nothing")
preview_icon.Scale(48+32, 16+32)
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index 30d5652ab4..45f26d55c3 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -216,25 +216,23 @@
. = list()
if(!bloodtype)
return
- switch(bloodtype)
- if("A-")
- return list("A-", "O-")
- if("A+")
- return list("A-", "A+", "O-", "O+")
- if("B-")
- return list("B-", "O-")
- if("B+")
- return list("B-", "B+", "O-", "O+")
- if("AB-")
- return list("A-", "B-", "O-", "AB-")
- if("AB+")
- return list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+")
- if("O-")
- return list("O-")
- if("O+")
- return list("O-", "O+")
- if("L")
- return list("L")
+
+ var/static/list/bloodtypes_safe = list(
+ "A-" = list("A-", "O-"),
+ "A+" = list("A-", "A+", "O-", "O+"),
+ "B-" = list("B-", "O-"),
+ "B+" = list("B-", "B+", "O-", "O+"),
+ "AB-" = list("A-", "B-", "O-", "AB-"),
+ "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+"),
+ "O-" = list("O-"),
+ "O+" = list("O-", "O+"),
+ "L" = list("L"),
+ "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U")
+ )
+
+ var/safe = bloodtypes_safe[bloodtype]
+ if(safe)
+ . = safe
//to add a splatter of blood or other mob liquid.
/mob/living/proc/add_splatter_floor(turf/T, small_drip)
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 94ed0129c7..c175acf9d6 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -19,7 +19,7 @@
/mob/living/brain/proc/create_dna()
stored_dna = new /datum/dna/stored(src)
if(!stored_dna.species)
- var/rando_race = pick(CONFIG_GET(keyed_flag_list/roundstart_races))
+ var/rando_race = pick(GLOB.roundstart_races)
stored_dna.species = new rando_race()
/mob/living/brain/Destroy()
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index 6ac5ab1bad..a3642684db 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -6,7 +6,7 @@
throw_range = 5
layer = ABOVE_MOB_LAYER
zone = "head"
- slot = "brain"
+ slot = ORGAN_SLOT_BRAIN
vital = TRUE
origin_tech = "biotech=5"
attack_verb = list("attacked", "slapped", "whacked")
@@ -70,7 +70,7 @@
C.dna.copy_dna(brainmob.stored_dna)
if(L.disabilities & NOCLONE)
brainmob.disabilities |= NOCLONE //This is so you can't just decapitate a husked guy and clone them without needing to get a new body
- var/obj/item/organ/zombie_infection/ZI = L.getorganslot("zombie_infection")
+ var/obj/item/organ/zombie_infection/ZI = L.getorganslot(ORGAN_SLOT_ZOMBIE)
if(ZI)
brainmob.set_species(ZI.old_species) //For if the brain is cloned
if(L.mind && L.mind.current)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 218af45c6e..4174b08642 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -224,7 +224,7 @@
internal = null
update_internals_hud_icon(0)
else if(ITEM && istype(ITEM, /obj/item/tank))
- if((wear_mask && (wear_mask.flags_1 & MASKINTERNALS_1)) || getorganslot("breathing_tube"))
+ if((wear_mask && (wear_mask.flags_1 & MASKINTERNALS_1)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE))
internal = ITEM
update_internals_hud_icon(1)
@@ -523,7 +523,7 @@
sight = initial(sight)
lighting_alpha = initial(lighting_alpha)
- var/obj/item/organ/eyes/E = getorganslot("eye_sight")
+ var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES)
if(!E)
update_tint()
else
@@ -580,7 +580,7 @@
if(wear_mask)
. += wear_mask.tint
- var/obj/item/organ/eyes/E = getorganslot("eye_sight")
+ var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES)
if(E)
. += E.tint
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 66f4fc8fb2..1d6f7f6484 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -14,7 +14,7 @@
var/obj/item/clothing/mask/MFP = src.wear_mask
number += MFP.flash_protect
- var/obj/item/organ/eyes/E = getorganslot("eye_sight")
+ var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES)
if(!E)
number = INFINITY //Can't get flashed without eyes
else
@@ -28,7 +28,7 @@
number += 1
if(head && (head.flags_2 & BANG_PROTECT_2))
number += 1
- var/obj/item/organ/ears/E = getorganslot("ears")
+ var/obj/item/organ/ears/E = getorganslot(ORGAN_SLOT_EARS)
if(!E)
number = INFINITY
else
@@ -279,7 +279,7 @@
var/damage = intensity - get_eye_protection()
if(.) // we've been flashed
- var/obj/item/organ/eyes/eyes = getorganslot("eye_sight")
+ var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES)
if (!eyes)
return
if(visual)
@@ -323,7 +323,7 @@
/mob/living/carbon/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15)
var/ear_safety = get_ear_protection()
- var/obj/item/organ/ears/ears = getorganslot("ears")
+ var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS)
var/effect_amount = intensity - ear_safety
if(effect_amount > 0)
if(stun_pwr)
@@ -363,6 +363,6 @@
/mob/living/carbon/can_hear()
. = FALSE
- var/obj/item/organ/ears/ears = getorganslot("ears")
+ var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS)
if(istype(ears) && !ears.deaf)
. = TRUE
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index aa37315b13..ed731408d8 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -39,7 +39,7 @@
return 1
// Do we have a jetpack implant (and is it on)?
- var/obj/item/organ/cyberimp/chest/thrusters/T = getorganslot("thrusters")
+ var/obj/item/organ/cyberimp/chest/thrusters/T = getorganslot(ORGAN_SLOT_THRUSTERS)
if(istype(T) && movement_dir && T.allow_thrust(0.01))
return 1
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index c3ae5c39c3..4b1afe0780 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -20,7 +20,7 @@
if(stat == DEAD)
return
stop_sound_channel(CHANNEL_HEARTBEAT)
- var/obj/item/organ/heart/H = getorganslot("heart")
+ var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART)
if(H)
H.beat = BEAT_NONE
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 1d7b482875..a39b84e47c 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -270,13 +270,13 @@
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
var/perpname = get_face_name(get_id_name(""))
- if(istype(H.glasses, /obj/item/clothing/glasses/hud) || istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud))
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud))
var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general)
if(href_list["photo_front"] || href_list["photo_side"])
if(R)
if(!H.canUseHUD())
return
- else if(!istype(H.glasses, /obj/item/clothing/glasses/hud) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/medical))
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical))
return
var/obj/item/photo/P = null
if(href_list["photo_front"])
@@ -287,13 +287,13 @@
P.show(H)
if(href_list["hud"] == "m")
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/medical))
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical))
if(href_list["p_stat"])
var/health_status = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel")
if(R)
if(!H.canUseHUD())
return
- else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/medical))
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical))
return
if(health_status && health_status != "Cancel")
R.fields["p_stat"] = health_status
@@ -303,7 +303,7 @@
if(R)
if(!H.canUseHUD())
return
- else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/medical))
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical))
return
if(health_status && health_status != "Cancel")
R.fields["m_stat"] = health_status
@@ -352,7 +352,7 @@
to_chat(usr, "Gathered data is inconsistent with the analysis, possible cause: poisoning.")
if(href_list["hud"] == "s")
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security))
if(usr.stat || usr == src) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten
// Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access
@@ -379,7 +379,7 @@
if(setcriminal != "Cancel")
if(R)
if(H.canUseHUD())
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security))
investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", INVESTIGATE_RECORDS)
R.fields["criminal"] = setcriminal
sec_hud_set_security_status()
@@ -389,7 +389,7 @@
if(R)
if(!H.canUseHUD())
return
- else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security))
return
to_chat(usr, "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]")
to_chat(usr, "Minor Crimes:")
@@ -418,7 +418,7 @@
return
else if(!H.canUseHUD())
return
- else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security))
return
var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text())
GLOB.data_core.addMinorCrime(R.fields["id"], crime)
@@ -433,7 +433,7 @@
return
else if (!H.canUseHUD())
return
- else if (!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
+ else if (!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security))
return
var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text())
GLOB.data_core.addMajorCrime(R.fields["id"], crime)
@@ -444,7 +444,7 @@
if(R)
if(!H.canUseHUD())
return
- else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security))
return
to_chat(usr, "Comments/Log:")
var/counter = 1
@@ -462,7 +462,7 @@
return
else if(!H.canUseHUD())
return
- else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security))
return
var/counter = 1
while(R.fields[text("com_[]", counter)])
@@ -637,7 +637,7 @@
return 0
var/they_breathe = (!(NOBREATH in C.dna.species.species_traits))
- var/they_lung = C.getorganslot("lungs")
+ var/they_lung = C.getorganslot(ORGAN_SLOT_LUNGS)
if(C.health > HEALTH_THRESHOLD_CRIT)
return
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 07bcb484a0..f21f872d0a 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -451,7 +451,7 @@
siemens_coeff = gloves_siemens_coeff
if(undergoing_cardiac_arrest() && !illusion)
if(shock_damage * siemens_coeff >= 1 && prob(25))
- var/obj/item/organ/heart/heart = getorganslot("heart")
+ var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART)
heart.beating = TRUE
if(stat == CONSCIOUS)
to_chat(src, "You feel your heart beating again!")
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 1679ff5d42..71c5dedc26 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -225,7 +225,7 @@
/mob/living/carbon/human/wear_mask_update(obj/item/clothing/C, toggle_off = 1)
if((C.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(C.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR)))
update_hair()
- if(toggle_off && internal && !getorganslot("breathing_tube"))
+ if(toggle_off && internal && !getorganslot(ORGAN_SLOT_BREATHING_TUBE))
update_internals_hud_icon(0)
internal = null
if(C.flags_inv & HIDEEYES)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index a17dbd6f75..67843b3e64 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -93,7 +93,7 @@
#define HUMAN_CRIT_MAX_OXYLOSS (SSmobs.wait/30)
/mob/living/carbon/human/check_breath(datum/gas_mixture/breath)
- var/L = getorganslot("lungs")
+ var/L = getorganslot(ORGAN_SLOT_LUNGS)
if(!L)
if(health >= HEALTH_THRESHOLD_CRIT)
@@ -338,7 +338,7 @@
/mob/living/carbon/human/proc/undergoing_cardiac_arrest()
if(!can_heartattack())
return FALSE
- var/obj/item/organ/heart/heart = getorganslot("heart")
+ var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART)
if(istype(heart) && heart.beating)
return FALSE
return TRUE
@@ -347,7 +347,7 @@
if(!can_heartattack())
return FALSE
- var/obj/item/organ/heart/heart = getorganslot("heart")
+ var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART)
if(!istype(heart))
return
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index d38fa73761..1374b391ce 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -49,7 +49,7 @@
CHECK_DNA_AND_SPECIES(src)
// how do species that don't breathe talk? magic, that's what.
- if(!(NOBREATH in dna.species.species_traits) && !getorganslot("lungs"))
+ if(!(NOBREATH in dna.species.species_traits) && !getorganslot(ORGAN_SLOT_LUNGS))
return 0
if(mind)
return !mind.miming
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 7a212d371b..f5b339405d 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1,5 +1,7 @@
// This code handles different species in the game.
+GLOBAL_LIST_EMPTY(roundstart_races)
+
#define HEAT_DAMAGE_LEVEL_1 2
#define HEAT_DAMAGE_LEVEL_2 3
#define HEAT_DAMAGE_LEVEL_3 8
@@ -12,7 +14,6 @@
var/id // if the game needs to manually check your race to do something not included in a proc here, it will use this
var/limbs_id //this is used if you want to use a different species limb sprites. Mainly used for angels as they look like humans.
var/name // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever
- var/roundstart = 0 // can this mob be chosen at roundstart? (assuming the config option is checked?)
var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race
var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows
@@ -65,6 +66,7 @@
var/breathid = "o2"
var/obj/item/organ/brain/mutant_brain = /obj/item/organ/brain
+ var/obj/item/organ/heart/mutant_heart = /obj/item/organ/heart
var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes
var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
var/obj/item/mutanthands
@@ -92,6 +94,20 @@
..()
+/proc/generate_selectable_species()
+ for(var/I in subtypesof(/datum/species))
+ var/datum/species/S = new I
+ if(S.check_roundstart_eligible())
+ GLOB.roundstart_races += S.id
+ qdel(S)
+ if(!GLOB.roundstart_races.len)
+ GLOB.roundstart_races += "human"
+
+/datum/species/proc/check_roundstart_eligible()
+ if(id in (CONFIG_GET(keyed_flag_list/roundstart_races)))
+ return TRUE
+ return FALSE
+
/datum/species/proc/random_name(gender,unique,lastname)
if(unique)
return random_unique_name(gender)
@@ -122,15 +138,15 @@
//Will regenerate missing organs
/datum/species/proc/regenerate_organs(mob/living/carbon/C,datum/species/old_species,replace_current=TRUE)
- var/obj/item/organ/brain/brain = C.getorganslot("brain")
- var/obj/item/organ/heart/heart = C.getorganslot("heart")
- var/obj/item/organ/lungs/lungs = C.getorganslot("lungs")
- var/obj/item/organ/appendix/appendix = C.getorganslot("appendix")
- var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight")
- var/obj/item/organ/ears/ears = C.getorganslot("ears")
- var/obj/item/organ/tongue/tongue = C.getorganslot("tongue")
- var/obj/item/organ/liver/liver = C.getorganslot("liver")
- var/obj/item/organ/stomach/stomach = C.getorganslot("stomach")
+ var/obj/item/organ/brain/brain = C.getorganslot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/heart/heart = C.getorganslot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/lungs/lungs = C.getorganslot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/appendix/appendix = C.getorganslot(ORGAN_SLOT_APPENDIX)
+ var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/tongue/tongue = C.getorganslot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/stomach/stomach = C.getorganslot(ORGAN_SLOT_STOMACH)
var/should_have_brain = TRUE
var/should_have_heart = !(NOBLOOD in species_traits)
@@ -154,7 +170,7 @@
heart.Remove(C,1)
QDEL_NULL(heart)
if(should_have_heart && !heart)
- heart = new()
+ heart = new mutant_heart()
heart.Insert(C)
if(lungs && (replace_current || !should_have_lungs))
@@ -1152,7 +1168,7 @@
if(radiation > RAD_MOB_VOMIT && prob(RAD_MOB_VOMIT_PROB))
H.vomit(10, TRUE)
-
+
if(radiation > RAD_MOB_MUTATE)
if(prob(1))
to_chat(H, "You mutate!")
@@ -1204,7 +1220,7 @@
if(!gravity)
var/obj/item/tank/jetpack/J = H.back
var/obj/item/clothing/suit/space/hardsuit/C = H.wear_suit
- var/obj/item/organ/cyberimp/chest/thrusters/T = H.getorganslot("thrusters")
+ var/obj/item/organ/cyberimp/chest/thrusters/T = H.getorganslot(ORGAN_SLOT_THRUSTERS)
if(!istype(J) && istype(C))
J = C.jetpack
if(istype(J) && J.full_speed && J.allow_thrust(0.01, H)) //Prevents stacking
@@ -1260,7 +1276,7 @@
return 1
else
var/we_breathe = (!(NOBREATH in user.dna.species.species_traits))
- var/we_lung = user.getorganslot("lungs")
+ var/we_lung = user.getorganslot(ORGAN_SLOT_LUNGS)
if(we_breathe && we_lung)
user.do_cpr(target)
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index d15280790e..bff4d8554a 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -8,7 +8,6 @@
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
- roundstart = 1
liked_food = MEAT | FRIED
disliked_food = TOXIC
@@ -31,7 +30,6 @@
attack_verb = "peck"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
- roundstart = 1
liked_food = MEAT | FRUIT
disliked_food = TOXIC
@@ -53,7 +51,6 @@
attack_verb = "bite"
attack_sound = 'sound/weapons/bite.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
- roundstart = 1
liked_food = MEAT
disliked_food = TOXIC
@@ -75,7 +72,6 @@
attack_verb = "flutter" //wat?
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
- roundstart = 1
liked_food = MEAT | FRUIT
disliked_food = TOXIC
@@ -105,7 +101,6 @@
skinned_type = /obj/item/stack/sheet/animalhide/xeno
exotic_bloodtype = "L"
damage_overlay_type = "xeno"
- roundstart = 1
liked_food = MEAT
//Praise the Omnissiah, A challange worthy of my skills - HS
@@ -138,7 +133,6 @@
meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
skinned_type = /obj/item/stack/sheet/animalhide/xeno
// safe_toxins_max = 32 //Too much of anything is bad.
- roundstart = 0
// whitelisted = 1
// whitelist = list("talkingcactus") //testing whitelisting
@@ -182,7 +176,6 @@
punchdamagehigh = 14
punchstunthreshold = 13
blacklisted = 1
- roundstart = 0
whitelist = 1
whitelist = list("talkingcactus")
@@ -233,7 +226,6 @@
attack_verb = "bite"
attack_sound = 'sound/weapons/bite.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
-// roundstart = 1
whitelisted = 1
whitelist = list("rubyflamewing")
blacklisted = 0
@@ -248,4 +240,3 @@
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
- roundstart = 1
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index 84bf5bdf80..3881eae6f5 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -13,7 +13,6 @@
disliked_food = NONE
liked_food = NONE
toxic_food = NONE
- roundstart = TRUE
/datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index d75d3f4679..a326150c60 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -25,6 +25,10 @@
else if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //heal in the dark
H.heal_overall_damage(1,1)
+/datum/species/shadow/check_roundstart_eligible()
+ if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
+ return TRUE
+ return ..()
/datum/species/shadow/nightmare
name = "Nightmare"
@@ -61,7 +65,8 @@
return -1
return 0
-
+/datum/species/shadow/nightmare/check_roundstart_eligible()
+ return FALSE
//Organs
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index be03e591aa..acaa182ad0 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -11,3 +11,8 @@
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
disliked_food = NONE
liked_food = NONE
+
+/datum/species/skeleton/check_roundstart_eligible()
+ if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
+ return TRUE
+ return ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index 45b4a28bb5..8b21c2a237 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -118,4 +118,4 @@
else
return ..()
else
- return ..()
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
new file mode 100644
index 0000000000..de0b5efdff
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -0,0 +1,130 @@
+/datum/species/vampire
+ name = "vampire"
+ id = "vampire"
+ default_color = "FFFFFF"
+ species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NOHUNGER,NOBREATH,DRINKSBLOOD)
+ mutant_bodyparts = list("tail_human", "ears", "wings")
+ default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
+ exotic_bloodtype = "U"
+ use_skintones = TRUE
+ mutant_heart = /obj/item/organ/heart/vampire
+ mutanttongue = /obj/item/organ/tongue/vampire
+ blacklisted = TRUE
+ limbs_id = "human"
+ skinned_type = /obj/item/stack/sheet/animalhide/human
+ var/info_text = "You are a Vampire. You will slowly but constantly lose blood if outside of a coffin. If inside a coffin, you will slowly heal. You may gain more blood by grabbing a live victim and using your drain ability."
+
+/datum/species/vampire/check_roundstart_eligible()
+ if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
+ return TRUE
+ return FALSE
+
+/datum/species/vampire/on_species_gain(mob/living/carbon/human/C, datum/species/old_species)
+ . = ..()
+ to_chat(C, "[info_text]")
+ C.skin_tone = "albino"
+ C.update_body(0)
+ if(C.mind)
+ var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/B = new
+ C.mind.AddSpell(B)
+
+/datum/species/vampire/on_species_loss(mob/living/carbon/C)
+ . = ..()
+ if(C.mind)
+ for(var/S in C.mind.spell_list)
+ var/obj/effect/proc_holder/spell/S2 = S
+ if(S2.type == /obj/effect/proc_holder/spell/targeted/shapeshift/bat)
+ C.mind.spell_list.Remove(S2)
+ qdel(S2)
+
+/datum/species/vampire/spec_life(mob/living/carbon/human/C)
+ . = ..()
+ if(istype(C.loc, /obj/structure/closet/coffin))
+ C.heal_overall_damage(4,4)
+ C.adjustToxLoss(-4)
+ C.adjustOxyLoss(-4)
+ C.adjustCloneLoss(-4)
+ return
+ C.blood_volume -= 1.5
+ if(C.blood_volume <= BLOOD_VOLUME_SURVIVE)
+ to_chat(C, "You ran out of blood!")
+ C.dust()
+ var/area/A = get_area(C)
+ if(istype(A, /area/chapel))
+ to_chat(C, "You don't belong here!")
+ C.adjustFireLoss(20)
+ C.adjust_fire_stacks(6)
+ C.IgniteMob()
+
+/obj/item/organ/tongue/vampire
+ name = "vampire tongue"
+ actions_types = list(/datum/action/item_action/organ_action/vampire)
+ color = "#1C1C1C"
+ var/drain_cooldown = 0
+
+#define VAMP_DRAIN_AMOUNT 50
+
+/datum/action/item_action/organ_action/vampire
+ name = "Drain Victim"
+ desc = "Leech blood from any carbon victim you are passively grabbing."
+
+/datum/action/item_action/organ_action/vampire/Trigger()
+ . = ..()
+ if(iscarbon(owner))
+ var/mob/living/carbon/H = owner
+ var/obj/item/organ/tongue/vampire/V = target
+ if(V.drain_cooldown >= world.time)
+ to_chat(H, "You just drained blood, wait a few seconds.")
+ return
+ if(H.pulling && iscarbon(H.pulling))
+ var/mob/living/carbon/victim = H.pulling
+ if(H.blood_volume >= BLOOD_VOLUME_MAXIMUM)
+ to_chat(H, "You're already full!")
+ return
+ if(victim.stat == DEAD)
+ to_chat(H, "You need a living victim!")
+ return
+ if(!victim.blood_volume || (victim.dna && ((NOBLOOD in victim.dna.species.species_traits) || victim.dna.species.exotic_blood)))
+ to_chat(H, "[victim] doesn't have blood!")
+ return
+ V.drain_cooldown = world.time + 30
+ if(!do_after(H, 30, target = victim))
+ return
+ var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood
+ var/drained_blood = min(victim.blood_volume, VAMP_DRAIN_AMOUNT, blood_volume_difference)
+ to_chat(victim, "[H] is draining your blood!")
+ to_chat(H, "You drain some blood!")
+ playsound(H, 'sound/items/drink.ogg', 30, 1, -2)
+ victim.blood_volume = Clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM)
+ H.blood_volume = Clamp(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM)
+ if(!victim.blood_volume)
+ to_chat(H, "You finish off [victim]'s blood supply!")
+
+#undef VAMP_DRAIN_AMOUNT
+
+/obj/item/organ/heart/vampire
+ name = "vampire heart"
+ actions_types = list(/datum/action/item_action/organ_action/vampire_heart)
+ color = "#1C1C1C"
+
+/datum/action/item_action/organ_action/vampire_heart
+ name = "Check Blood Level"
+ desc = "Check how much blood you have remaining."
+
+/datum/action/item_action/organ_action/vampire_heart/Trigger()
+ . = ..()
+ if(iscarbon(owner))
+ var/mob/living/carbon/H = owner
+ to_chat(H, "Current blood level: [H.blood_volume]/[BLOOD_VOLUME_MAXIMUM].")
+
+/obj/effect/proc_holder/spell/targeted/shapeshift/bat
+ name = "Bat Form"
+ desc = "Take on the shape a space bat."
+ invocation = "Squeak!"
+ charge_max = 50
+ cooldown_min = 50
+
+ shapeshift_type = /mob/living/simple_animal/hostile/retaliate/bat
+ current_shapes = list(/mob/living/simple_animal/hostile/retaliate/bat)
+ current_casters = list()
+ possible_shapes = list(/mob/living/simple_animal/hostile/retaliate/bat)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 016a3635ef..8c87e1c9c9 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -14,6 +14,11 @@
disliked_food = NONE
liked_food = NONE
+/datum/species/zombie/check_roundstart_eligible()
+ if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
+ return TRUE
+ return ..()
+
/datum/species/zombie/infectious
name = "Infectious Zombie"
id = "memezombies"
@@ -24,6 +29,10 @@
mutanteyes = /obj/item/organ/eyes/night_vision/zombie
var/regen_cooldown = 0
+/datum/species/zombie/infectious/check_roundstart_eligible()
+ return FALSE
+
+
/datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount)
. = min(2, amount)
@@ -52,7 +61,7 @@
// Infection organ needs to be handled separately from mutant_organs
// because it persists through species transitions
var/obj/item/organ/zombie_infection/infection
- infection = C.getorganslot("zombie_infection")
+ infection = C.getorganslot(ORGAN_SLOT_ZOMBIE)
if(!infection)
infection = new()
infection.Insert(C)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 31f8eb3f73..0d50285859 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -58,7 +58,7 @@
var/datum/gas_mixture/breath
- if(!getorganslot("breathing_tube"))
+ if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE))
if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL))
losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath
@@ -110,7 +110,7 @@
if((status_flags & GODMODE))
return
- var/lungs = getorganslot("lungs")
+ var/lungs = getorganslot(ORGAN_SLOT_LUNGS)
if(!lungs)
adjustOxyLoss(2)
@@ -203,6 +203,16 @@
hallucination += 20
else if(bz_partialpressure > 0.01)
hallucination += 5//Removed at 2 per tick so this will slowly build up
+ //TRITIUM
+ if(breath_gases[/datum/gas/tritium])
+ var/tritium_partialpressure = (breath_gases[/datum/gas/tritium][MOLES]/breath.total_moles())*breath_pressure
+ radiation += tritium_partialpressure/10
+ //Brown Gas
+ if (breath_gases[/datum/gas/brown_gas])
+ var/browns_partialpressure = (breath_gases[/datum/gas/brown_gas][MOLES]/breath.total_moles())*breath_pressure
+ adjustFireLoss(browns_partialpressure/4)
+
+
breath.garbage_collect()
@@ -220,7 +230,7 @@
if(internal.loc != src)
internal = null
update_internals_hud_icon(0)
- else if ((!wear_mask || !(wear_mask.flags_1 & MASKINTERNALS_1)) && !getorganslot("breathing_tube"))
+ else if ((!wear_mask || !(wear_mask.flags_1 & MASKINTERNALS_1)) && !getorganslot(ORGAN_SLOT_BREATHING_TUBE))
internal = null
update_internals_hud_icon(0)
else
@@ -391,7 +401,7 @@
/////////
/mob/living/carbon/proc/handle_liver()
- var/obj/item/organ/liver/liver = getorganslot("liver")
+ var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER)
if((!dna && !liver) || (NOLIVER in dna.species.species_traits))
return
if(liver)
@@ -404,17 +414,17 @@
liver_failure()
/mob/living/carbon/proc/undergoing_liver_failure()
- var/obj/item/organ/liver/liver = getorganslot("liver")
+ var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER)
if(liver && liver.failing)
return TRUE
/mob/living/carbon/proc/return_liver_damage()
- var/obj/item/organ/liver/liver = getorganslot("liver")
+ var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER)
if(liver)
return liver.damage
/mob/living/carbon/proc/applyLiverDamage(var/d)
- var/obj/item/organ/liver/L = getorganslot("liver")
+ var/obj/item/organ/liver/L = getorganslot(ORGAN_SLOT_LIVER)
if(L)
L.damage += d
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 2fcfe97d65..779e7f2f90 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -140,7 +140,7 @@
return protection
/mob/living/carbon/monkey/IsVocal()
- if(!getorganslot("lungs"))
+ if(!getorganslot(ORGAN_SLOT_LUNGS))
return 0
return 1
diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm
index d6ee2ebbfc..526a2ea09b 100644
--- a/code/modules/mob/living/carbon/say.dm
+++ b/code/modules/mob/living/carbon/say.dm
@@ -1,6 +1,6 @@
/mob/living/carbon/treat_message(message)
message = ..(message)
- var/obj/item/organ/tongue/T = getorganslot("tongue")
+ var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE)
if(!T) //hoooooouaah!
var/regex/tongueless_lower = new("\[gdntke]+", "g")
var/regex/tongueless_upper = new("\[GDNTKE]+", "g")
@@ -21,7 +21,7 @@
/mob/living/carbon/get_spans()
. = ..()
- var/obj/item/organ/tongue/T = getorganslot("tongue")
+ var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE)
if(T)
. |= T.get_spans()
@@ -30,7 +30,7 @@
. |= I.get_held_item_speechspans(src)
/mob/living/carbon/could_speak_in_language(datum/language/dt)
- var/obj/item/organ/tongue/T = getorganslot("tongue")
+ var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE)
if(T)
. = T.could_speak_in_language(dt)
else
diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm
index 13a97c4407..ccd5f7296b 100644
--- a/code/modules/mob/living/carbon/status_procs.dm
+++ b/code/modules/mob/living/carbon/status_procs.dm
@@ -3,7 +3,7 @@
// eye damage, eye_blind, eye_blurry, druggy, BLIND disability, NEARSIGHT disability, and HUSK disability.
/mob/living/carbon/damage_eyes(amount)
- var/obj/item/organ/eyes/eyes = getorganslot("eye_sight")
+ var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES)
if (!eyes)
return
if(amount>0)
@@ -15,7 +15,7 @@
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1)
/mob/living/carbon/set_eye_damage(amount)
- var/obj/item/organ/eyes/eyes = getorganslot("eye_sight")
+ var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES)
if (!eyes)
return
eyes.eye_damage = max(amount,0)
@@ -28,7 +28,7 @@
clear_fullscreen("eye_damage")
/mob/living/carbon/adjust_eye_damage(amount)
- var/obj/item/organ/eyes/eyes = getorganslot("eye_sight")
+ var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES)
if (!eyes)
return
eyes.eye_damage = max(eyes.eye_damage+amount, 0)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 9c34ca4dbd..7e3d1cd320 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -362,7 +362,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if(message_mode == MODE_VOCALCORDS)
if(iscarbon(src))
var/mob/living/carbon/C = src
- var/obj/item/organ/vocal_cords/V = C.getorganslot("vocal_cords")
+ var/obj/item/organ/vocal_cords/V = C.getorganslot(ORGAN_SLOT_VOICE)
if(V && V.can_speak_with())
V.handle_speech(message) //message
V.speak_with(message) //action
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 7cf68dc401..a214895b83 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -616,7 +616,7 @@ Difficulty: Very Hard
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
- gold_core_spawnable = 0
+ gold_core_spawnable = TRUE
verb_say = "warps"
verb_ask = "floats inquisitively"
verb_exclaim = "zaps"
@@ -634,7 +634,6 @@ Difficulty: Very Hard
environment_smash = ENVIRONMENT_SMASH_NONE
AIStatus = AI_OFF
stop_automated_movement = 1
- gold_core_spawnable = TRUE
var/heal_power = 5
/mob/living/simple_animal/hostile/lightgeist/Initialize()
diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm
index 45fdf55fb4..c66168cee4 100644
--- a/code/modules/mob/living/taste.dm
+++ b/code/modules/mob/living/taste.dm
@@ -8,7 +8,7 @@
return DEFAULT_TASTE_SENSITIVITY
/mob/living/carbon/get_taste_sensitivity()
- var/obj/item/organ/tongue/tongue = getorganslot("tongue")
+ var/obj/item/organ/tongue/tongue = getorganslot(ORGAN_SLOT_TONGUE)
if(istype(tongue))
. = tongue.taste_sensitivity
else
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index beb64a9e6e..ddd1d3e2dc 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -31,6 +31,7 @@
continue
var/datum/atom_hud/alternate_appearance/AA = v
AA.onNewMob(src)
+ hook_vr("mob_new",list(src))
. = ..()
/atom/proc/prepare_huds()
@@ -389,7 +390,7 @@
pulling = null
grab_state = 0
update_pull_hud_icon()
-
+
if(isliving(ex_pulled))
var/mob/living/L = ex_pulled
L.update_canmove()// mob gets up if it was lyng down in a chokehold
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index ec63a33568..ec23f5b7f8 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -1,3 +1,14 @@
+GLOBAL_LIST_INIT(cable_colors, list(
+ "yellow" = "#ffff00",
+ "green" = "#00aa00",
+ "blue" = "#1919c8",
+ "pink" = "#ff3cc8",
+ "orange" = "#ff8000",
+ "cyan" = "#00ffff",
+ "white" = "#ffffff",
+ "red" = "#ff0000"
+ ))
+
///////////////////////////////
//CABLE STRUCTURE
///////////////////////////////
@@ -23,61 +34,52 @@ By design, d1 is the smallest direction and d2 is the highest
*/
/obj/structure/cable
- level = 1 //is underfloor
- anchored =1
- on_blueprints = TRUE
- var/datum/powernet/powernet
name = "power cable"
desc = "A flexible, superconducting insulated cable for heavy-duty power transfer."
- icon = 'icons/obj/power_cond/power_cond_red.dmi'
+ icon = 'icons/obj/power_cond/cables.dmi'
icon_state = "0-1"
+ level = 1 //is underfloor
+ layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER
+ anchored = TRUE
+ on_blueprints = TRUE
var/d1 = 0 // cable direction 1 (see above)
var/d2 = 1 // cable direction 2 (see above)
- layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER
- var/cable_color = "red"
+ var/datum/powernet/powernet
var/obj/item/stack/cable_coil/stored
+ var/cable_color = "red"
+
/obj/structure/cable/yellow
cable_color = "yellow"
- icon = 'icons/obj/power_cond/power_cond_yellow.dmi'
/obj/structure/cable/green
cable_color = "green"
- icon = 'icons/obj/power_cond/power_cond_green.dmi'
/obj/structure/cable/blue
cable_color = "blue"
- icon = 'icons/obj/power_cond/power_cond_blue.dmi'
/obj/structure/cable/pink
cable_color = "pink"
- icon = 'icons/obj/power_cond/power_cond_pink.dmi'
/obj/structure/cable/orange
cable_color = "orange"
- icon = 'icons/obj/power_cond/power_cond_orange.dmi'
/obj/structure/cable/cyan
cable_color = "cyan"
- icon = 'icons/obj/power_cond/power_cond_cyan.dmi'
/obj/structure/cable/white
cable_color = "white"
- icon = 'icons/obj/power_cond/power_cond_white.dmi'
// the power cable object
-/obj/structure/cable/Initialize()
+/obj/structure/cable/Initialize(mapload, param_color)
. = ..()
// ensure d1 & d2 reflect the icon_state for entering and exiting cable
var/dash = findtext(icon_state, "-")
-
d1 = text2num( copytext( icon_state, 1, dash ) )
-
d2 = text2num( copytext( icon_state, dash+1 ) )
var/turf/T = get_turf(src) // hide if turf is not intact
-
if(level==1)
hide(T.intact)
GLOB.cable_list += src //add it to the global cable list
@@ -87,6 +89,12 @@ By design, d1 is the smallest direction and d2 is the highest
else
stored = new/obj/item/stack/cable_coil(null,1,cable_color)
+ var/list/cable_colors = GLOB.cable_colors
+ cable_color = param_color || cable_color || pick(cable_colors)
+ if(cable_colors[cable_color])
+ cable_color = cable_colors[cable_color]
+ update_icon()
+
/obj/structure/cable/Destroy() // called when a cable is deleted
if(powernet)
cut_cable_from_powernet() // update the powernets
@@ -115,6 +123,7 @@ By design, d1 is the smallest direction and d2 is the highest
icon_state = "[d1]-[d2]-f"
else
icon_state = "[d1]-[d2]"
+ add_atom_colour(cable_color, FIXED_COLOUR_PRIORITY)
/obj/structure/cable/proc/handlecable(obj/item/W, mob/user, params)
var/turf/T = get_turf(src)
@@ -175,26 +184,6 @@ By design, d1 is the smallest direction and d2 is the highest
if(current_size >= STAGE_FIVE)
deconstruct()
-/obj/structure/cable/proc/cableColor(colorC = "red")
- cable_color = colorC
- switch(colorC)
- if("red")
- icon = 'icons/obj/power_cond/power_cond_red.dmi'
- if("yellow")
- icon = 'icons/obj/power_cond/power_cond_yellow.dmi'
- if("green")
- icon = 'icons/obj/power_cond/power_cond_green.dmi'
- if("blue")
- icon = 'icons/obj/power_cond/power_cond_blue.dmi'
- if("pink")
- icon = 'icons/obj/power_cond/power_cond_pink.dmi'
- if("orange")
- icon = 'icons/obj/power_cond/power_cond_orange.dmi'
- if("cyan")
- icon = 'icons/obj/power_cond/power_cond_cyan.dmi'
- if("white")
- icon = 'icons/obj/power_cond/power_cond_white.dmi'
-
/obj/structure/cable/proc/update_stored(length = 1, colorC = "red")
stored.amount = length
stored.item_color = colorC
@@ -456,8 +445,8 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
name = "cable coil"
gender = NEUTER //That's a cable coil sounds better than that's some cable coils
icon = 'icons/obj/power.dmi'
- icon_state = "coil_red"
- item_state = "coil_red"
+ icon_state = "coil"
+ item_state = "coil"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
max_amount = MAXCOIL
@@ -497,8 +486,12 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
. = ..()
if(new_amount) // MAXCOIL by default
amount = new_amount
- if(param_color)
- item_color = param_color
+
+ var/list/cable_colors = GLOB.cable_colors
+ item_color = param_color || item_color || pick(cable_colors)
+ if(cable_colors[item_color])
+ item_color = cable_colors[item_color]
+
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
update_icon()
@@ -528,18 +521,9 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
/obj/item/stack/cable_coil/update_icon()
- if(!item_color)
- item_color = pick("red", "yellow", "blue", "green")
- item_state = "coil_[item_color]"
- if(amount == 1)
- icon_state = "coil_[item_color]1"
- name = "cable piece"
- else if(amount == 2)
- icon_state = "coil_[item_color]2"
- name = "cable piece"
- else
- icon_state = "coil_[item_color]"
- name = "cable coil"
+ icon_state = "[initial(item_state)][amount < 3 ? amount : ""]"
+ name = "cable [amount < 3 ? "piece" : "coil"]"
+ add_atom_colour(item_color, FIXED_COLOUR_PRIORITY)
/obj/item/stack/cable_coil/attack_hand(mob/user)
var/obj/item/stack/cable_coil/new_cable = ..()
@@ -562,8 +546,8 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
//////////////////////////////////////////////
/obj/item/stack/cable_coil/proc/get_new_cable(location)
- var/path = "/obj/structure/cable" + (item_color == "red" ? "" : "/" + item_color)
- return new path (location)
+ var/path = /obj/structure/cable
+ return new path(location, item_color)
// called when cable_coil is clicked on a turf
/obj/item/stack/cable_coil/proc/place_turf(turf/T, mob/user, dirnew)
@@ -714,7 +698,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
return
- C.cableColor(item_color)
+ C.update_icon()
C.d1 = nd1
C.d2 = nd2
@@ -750,11 +734,8 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
// Misc.
/////////////////////////////
-/obj/item/stack/cable_coil/cut
- item_state = "coil_red2"
-
/obj/item/stack/cable_coil/cut/Initialize(mapload)
- . =..()
+ . = ..()
amount = rand(1,2)
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
@@ -762,42 +743,30 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
/obj/item/stack/cable_coil/red
item_color = "red"
- icon_state = "coil_red"
/obj/item/stack/cable_coil/yellow
item_color = "yellow"
- icon_state = "coil_yellow"
/obj/item/stack/cable_coil/blue
item_color = "blue"
- icon_state = "coil_blue"
- item_state = "coil_blue"
/obj/item/stack/cable_coil/green
item_color = "green"
- icon_state = "coil_green"
/obj/item/stack/cable_coil/pink
item_color = "pink"
- icon_state = "coil_pink"
/obj/item/stack/cable_coil/orange
item_color = "orange"
- icon_state = "coil_orange"
/obj/item/stack/cable_coil/cyan
item_color = "cyan"
- icon_state = "coil_cyan"
/obj/item/stack/cable_coil/white
item_color = "white"
- icon_state = "coil_white"
-
-/obj/item/stack/cable_coil/random/Initialize(mapload)
- . = ..()
- item_color = pick("red","orange","yellow","green","cyan","blue","pink","white")
- icon_state = "coil_[item_color]"
+/obj/item/stack/cable_coil/random
+ item_color = null
/obj/item/stack/cable_coil/random/five
amount = 5
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index d927b5c4f1..6031f6edab 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -15,6 +15,15 @@
var/power_output = 1
var/consumption = 0
var/base_icon = "portgen0"
+ var/datum/looping_sound/generator/soundloop
+
+/obj/machinery/power/port_gen/Initialize()
+ . = ..()
+ soundloop = new(list(src), active)
+
+/obj/machinery/power/port_gen/Destroy()
+ QDEL_NULL(soundloop)
+ return ..()
/obj/machinery/power/port_gen/proc/HasFuel() //Placeholder for fuel check.
return 1
@@ -36,11 +45,13 @@
add_avail(power_gen * power_output)
UseFuel()
src.updateDialog()
+ soundloop.start()
else
active = 0
handleInactive()
update_icon()
+ soundloop.stop()
/obj/machinery/power/port_gen/attack_hand(mob/user)
if(..())
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index d9aabd1197..7ce459a712 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -9,7 +9,6 @@
#define OXYGEN_TRANSMIT_MODIFIER 1.5 //Higher == Bigger bonus to power generation.
#define PLASMA_TRANSMIT_MODIFIER 4
-#define FREON_TRANSMIT_PENALTY 0.75 // Scales how much freon reduces total power transmission. 1 equals 1% per 1% of freon in the mix.
#define N2O_HEAT_RESISTANCE 6 //Higher == Gas makes the crystal more resistant against heat damage.
@@ -30,7 +29,7 @@
#define THERMAL_RELEASE_MODIFIER 5 //Higher == less heat released during reaction, not to be confused with the above values
#define PLASMA_RELEASE_MODIFIER 750 //Higher == less plasma released by reaction
#define OXYGEN_RELEASE_MODIFIER 325 //Higher == less oxygen released at high temperature/power
-#define FREON_BREEDING_MODIFIER 100 //Higher == less freon created
+
#define REACTION_POWER_MODIFIER 0.55 //Higher == more overall power
#define MATTER_POWER_CONVERSION 10 //Crystal converts 1/this value of stored matter into energy.
@@ -92,7 +91,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
var/power = 0
var/n2comp = 0 // raw composition of each gas in the chamber, ranges from 0 to 1
- var/freoncomp = 0
var/plasmacomp = 0
var/o2comp = 0
@@ -107,7 +105,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
var/powerloss_dynamic_scaling= 0
var/power_transmission_bonus = 0
var/mole_heat_penalty = 0
- var/freon_transmit_modifier = 1
+
var/matter_power = 0
@@ -135,6 +133,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
var/is_main_engine = FALSE
+ var/datum/looping_sound/supermatter/soundloop
+
/obj/machinery/power/supermatter_shard/Initialize()
. = ..()
SSair.atmos_machinery += src
@@ -149,6 +149,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
if(is_main_engine)
GLOB.main_supermatter_engine = src
+ soundloop = new(list(src), TRUE)
+
/obj/machinery/power/supermatter_shard/Destroy()
investigate_log("has been destroyed.", INVESTIGATE_SUPERMATTER)
SSair.atmos_machinery -= src
@@ -157,7 +159,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
QDEL_NULL(countdown)
if(is_main_engine && GLOB.main_supermatter_engine == src)
GLOB.main_supermatter_engine = null
- . = ..()
+ QDEL_NULL(soundloop)
+ return ..()
/obj/machinery/power/supermatter_shard/examine(mob/user)
..()
@@ -251,6 +254,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
if(!istype(T)) //We are in a crate or somewhere that isn't turf, if we return to turf resume processing but for now.
return //Yeah just stop.
+ if(power)
+ soundloop.volume = min(50, (round(power, 50)/50)+1) // 5 +1 volume per 20 power. 2500 power is max
+
//Ok, get the air from the turf
var/datum/gas_mixture/env = T.return_air()
@@ -284,7 +290,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
if(damage > damage_archived && prob(10))
playsound(get_turf(src), 'sound/effects/empulse.ogg', 50, 1)
- removed.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/nitrogen, /datum/gas/freon)
+ removed.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/nitrogen)
//calculating gas related values
combined_gas = max(removed.total_moles(), 0)
@@ -294,16 +300,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide][MOLES]/combined_gas, 0)
n2comp = max(removed.gases[/datum/gas/nitrogen][MOLES]/combined_gas, 0)
- freoncomp = max(removed.gases[/datum/gas/freon][MOLES]/combined_gas, 0)
- gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp - n2comp - freoncomp, 0), 1)
+ gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp - n2comp, 0), 1)
dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY)+(o2comp * OXYGEN_HEAT_PENALTY)+(co2comp * CO2_HEAT_PENALTY)+(n2comp * NITROGEN_HEAT_MODIFIER), 0.5)
dynamic_heat_resistance = max(n2ocomp * N2O_HEAT_RESISTANCE, 1)
power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER), 0)
- freon_transmit_modifier = max(1-(freoncomp * FREON_TRANSMIT_PENALTY), 0)
+
//more moles of gases are harder to heat than fewer, so let's scale heat damage around them
mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25)
@@ -332,7 +337,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
power = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload
if(prob(50))
- radiation_pulse(src, power * (1 + power_transmission_bonus/10 * freon_transmit_modifier))
+ radiation_pulse(src, power * (1 + power_transmission_bonus/10))
var/device_energy = power * REACTION_POWER_MODIFIER
@@ -352,9 +357,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
removed.gases[/datum/gas/oxygen][MOLES] += max(((device_energy + removed.temperature * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
- if(combined_gas < 50)
- removed.gases[/datum/gas/freon][MOLES] = max((removed.gases[/datum/gas/freon][MOLES] + device_energy) * freoncomp / FREON_BREEDING_MODIFIER, 0)
-
if(produces_gas)
env.merge(removed)
air_update_turf()
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 7073b98ca1..b7db29084a 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -139,7 +139,7 @@
#define BRAINS_BLOWN_THROW_RANGE 3
#define BRAINS_BLOWN_THROW_SPEED 1
/obj/item/gun/ballistic/suicide_act(mob/user)
- var/obj/item/organ/brain/B = user.getorganslot("brain")
+ var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN)
if (B && chambered && chambered.BB && can_trigger_gun(user) && !chambered.BB.nodamage)
user.visible_message("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!")
sleep(25)
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index f3bc7ab9e0..57960fcea7 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -132,16 +132,14 @@
if("monkey")
new_mob = new /mob/living/carbon/monkey(M.loc)
if("robot")
- var/robot = pick("cyborg","syndiborg","drone")
+ var/robot = pick("random_cyborg","syndiborg","drone")
+ var/path
switch(robot)
- if("cyborg")
- new_mob = new /mob/living/silicon/robot(M.loc)
+ if("random_cyborg")
+ path = pick(typesof(/mob/living/silicon/robot/modules) - typesof(/mob/living/silicon/robot/modules/syndicate))
+ new_mob = new path(M.loc)
if("syndiborg")
- var/path
- if(prob(50))
- path = /mob/living/silicon/robot/modules/syndicate
- else
- path = /mob/living/silicon/robot/modules/syndicate/medical
+ path = pick(typesof(/mob/living/silicon/robot/modules/syndicate))
new_mob = new path(M.loc)
if("drone")
new_mob = new /mob/living/simple_animal/drone/polymorphed(M.loc)
@@ -158,9 +156,15 @@
new_mob = new /mob/living/simple_animal/slime/random(M.loc)
if("xeno")
if(prob(50))
- new_mob = new /mob/living/carbon/alien/humanoid/hunter(M.loc)
+ if(!M.ckey) //spawn an AI alien if it isn't a player controlled mob.
+ new_mob = new /mob/living/simple_animal/hostile/alien(M.loc)
+ else
+ new_mob = new /mob/living/carbon/alien/humanoid/hunter(M.loc)
else
- new_mob = new /mob/living/carbon/alien/humanoid/sentinel(M.loc)
+ if(!M.ckey)
+ new_mob = new /mob/living/simple_animal/hostile/alien/sentinel(M.loc)
+ else
+ new_mob = new /mob/living/carbon/alien/humanoid/sentinel(M.loc)
if("animal")
var/path
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index c114f7017b..cc91819611 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -38,7 +38,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
var/mob/living/carbon/human/H = M
if(H.drunkenness < volume * boozepwr * ALCOHOL_THRESHOLD_MODIFIER)
H.drunkenness = max((H.drunkenness + (sqrt(volume) * boozepwr * ALCOHOL_RATE)), 0) //Volume, power, and server alcohol rate effect how quickly one gets drunk
- var/obj/item/organ/liver/L = H.getorganslot("liver")
+ var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER)
H.applyLiverDamage((max(sqrt(volume) * boozepwr * L.alcohol_tolerance, 0))/10)
return ..() || .
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index f1b076ca68..d25df998e3 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -550,7 +550,7 @@
if(!M.is_mouth_covered() && !M.is_eyes_covered())
unprotected = TRUE
if(unprotected)
- if(!M.getorganslot("eye_sight")) //can't blind somebody with no eyes
+ if(!M.getorganslot(ORGAN_SLOT_EYES)) //can't blind somebody with no eyes
to_chat(M, "Your eye sockets feel wet.")
else
if(!M.eye_blurry)
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index b83e651eda..24b424e156 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -671,7 +671,7 @@
taste_description = "dull toxin"
/datum/reagent/medicine/oculine/on_mob_life(mob/living/M)
- var/obj/item/organ/eyes/eyes = M.getorganslot("eyes_sight")
+ var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if (!eyes)
return
if(M.disabilities & BLIND)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 0a437f120e..c93ca30841 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -24,9 +24,9 @@
else //ingest, patch or inject
M.ForceContractDisease(D)
- if(method == INJECT && iscarbon(M))
+ if(iscarbon(M))
var/mob/living/carbon/C = M
- if(C.get_blood_id() == "blood")
+ if(C.get_blood_id() == "blood" && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits))))
if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type)))
C.reagents.add_reagent("toxin", reac_volume * 0.5)
else
@@ -1159,6 +1159,34 @@
M.confused = min(M.confused + 2, 5)
..()
+/datum/reagent/stimulum
+ name = "Stimulum"
+ id = "stimulum"
+ description = "An unstable experimental gas that greatly increases the energy of those that inhale it"
+ reagent_state = GAS
+ metabolization_rate = 1.5 * REAGENTS_METABOLISM
+ color = "E1A116"
+ taste_description = "sourness"
+
+/datum/reagent/stimulum/on_mob_life(mob/living/M) // Has a speedup, and the anti-stun effects of nicotine.
+ M.status_flags |= GOTTAGOFAST
+ M.AdjustStun(-20, 0)
+ M.AdjustKnockdown(-20, 0)
+ M.AdjustUnconscious(-20, 0)
+ M.adjustStaminaLoss(-0.5*REM, 0)
+
+/datum/reagent/browngas
+ name = "Brown gas"
+ id = "brown_gas"
+ description = "A strange brown gas that makes you feel faster"
+ reagent_state = GAS
+ metabolization_rate = REAGENTS_METABOLISM
+ color = "90560B"
+ taste_description = "burning"
+
+/datum/reagent/browngas/on_mob_life(mob/living/M) //Has just a speedup
+ M.status_flags |= GOTTAGOFAST
+
/////////////////////////Coloured Crayon Powder////////////////////////////
//For colouring in /proc/mix_color_from_reagents
@@ -1568,7 +1596,7 @@
/datum/reagent/romerol/on_mob_life(mob/living/carbon/human/H)
// Silently add the zombie infection organ to be activated upon death
- if(!H.getorganslot("zombie_infection"))
+ if(!H.getorganslot(ORGAN_SLOT_ZOMBIE))
var/obj/item/organ/zombie_infection/ZI = new()
ZI.Insert(H)
..()
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 62e5fd723d..27bf596df0 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -243,7 +243,7 @@
if(holder && holder.my_atom)
var/turf/open/T = get_turf(holder.my_atom)
if(istype(T))
- T.atmos_spawn_air("freon=50;TEMP=120")
+ T.atmos_spawn_air("nitrogen=50;TEMP=2.7")
/datum/chemical_reaction/slime/slimefireproof
name = "Slime Fireproof"
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 2f2ef108ea..d4b8e165ee 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -65,6 +65,9 @@
/obj/item/reagent_containers/blood/lizard
blood_type = "L"
+/obj/item/reagent_containers/blood/universal
+ blood_type = "U"
+
/obj/item/reagent_containers/blood/empty
name = "blood pack"
icon_state = "empty"
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index cfa95f2d1a..a90b3598ce 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -253,7 +253,7 @@
if(VAULT_TOXIN)
to_chat(H, "You feel resistant to airborne toxins.")
if(locate(/obj/item/organ/lungs) in H.internal_organs)
- var/obj/item/organ/lungs/L = H.internal_organs_slot["lungs"]
+ var/obj/item/organ/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS]
L.tox_breath_dam_min = 0
L.tox_breath_dam_max = 0
S.species_traits |= VIRUSIMMUNE
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index ce1c4df56e..9099489420 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -1,38 +1,38 @@
-/datum/surgery/eye_surgery
- name = "eye surgery"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
- species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
- possible_locs = list("eyes")
- requires_bodypart_type = 0
-
-//fix eyes
-/datum/surgery_step/fix_eyes
- name = "fix eyes"
- implements = list(/obj/item/hemostat = 100, /obj/item/screwdriver = 45, /obj/item/pen = 25)
- time = 64
-
-/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target)
- var/obj/item/organ/eyes/E = target.getorganslot("eye_sight")
- if(!E)
- to_chat(user, "It's hard to do surgery on someones eyes when they don't have any.")
- return FALSE
-
-/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...")
-
-/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully fixes [target]'s eyes!", "You succeed in fixing [target]'s eyes.")
- target.cure_blind()
- target.set_blindness(0)
- target.cure_nearsighted()
- target.blur_eyes(35) //this will fix itself slowly.
- target.set_eye_damage(0)
- return TRUE
-
-/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(target.getorgan(/obj/item/organ/brain))
- user.visible_message("[user] accidentally stabs [target] right in the brain!", "You accidentally stab [target] right in the brain!")
- target.adjustBrainLoss(100)
- else
- user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.")
- return FALSE
+/datum/surgery/eye_surgery
+ name = "eye surgery"
+ steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
+ species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ possible_locs = list("eyes")
+ requires_bodypart_type = 0
+
+//fix eyes
+/datum/surgery_step/fix_eyes
+ name = "fix eyes"
+ implements = list(/obj/item/hemostat = 100, /obj/item/screwdriver = 45, /obj/item/pen = 25)
+ time = 64
+
+/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target)
+ var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES)
+ if(!E)
+ to_chat(user, "It's hard to do surgery on someones eyes when they don't have any.")
+ return FALSE
+
+/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...")
+
+/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] successfully fixes [target]'s eyes!", "You succeed in fixing [target]'s eyes.")
+ target.cure_blind()
+ target.set_blindness(0)
+ target.cure_nearsighted()
+ target.blur_eyes(35) //this will fix itself slowly.
+ target.set_eye_damage(0)
+ return TRUE
+
+/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(target.getorgan(/obj/item/organ/brain))
+ user.visible_message("[user] accidentally stabs [target] right in the brain!", "You accidentally stab [target] right in the brain!")
+ target.adjustBrainLoss(100)
+ else
+ user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.")
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm
index ad51c48d85..35a2d851e3 100644
--- a/code/modules/surgery/organs/appendix.dm
+++ b/code/modules/surgery/organs/appendix.dm
@@ -2,7 +2,7 @@
name = "appendix"
icon_state = "appendix"
zone = "groin"
- slot = "appendix"
+ slot = ORGAN_SLOT_APPENDIX
var/inflamed = 0
/obj/item/organ/appendix/update_icon()
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index b51fc98f15..aa1ea10cd0 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -2,7 +2,6 @@
name = "arm-mounted implant"
desc = "You shouldn't see this! Adminhelp and report this as an issue on github!"
zone = "r_arm"
- slot = "r_arm_device"
icon_state = "implant-toolkit"
w_class = WEIGHT_CLASS_NORMAL
actions_types = list(/datum/action/item_action/organ_action/toggle)
@@ -20,9 +19,18 @@
holder = new holder(src)
update_icon()
- slot = zone + "_device"
+ SetSlotFromZone()
items_list = contents.Copy()
+/obj/item/organ/cyberimp/arm/proc/SetSlotFromZone()
+ switch(zone)
+ if("l_arm")
+ slot = ORGAN_SLOT_LEFT_ARM_AUG
+ if("r_arm")
+ slot = ORGAN_SLOT_RIGHT_ARM_AUG
+ else
+ CRASH("Invalid zone for [type]")
+
/obj/item/organ/cyberimp/arm/update_icon()
if(zone == "r_arm")
transform = null
@@ -40,7 +48,7 @@
zone = "l_arm"
else
zone = "r_arm"
- slot = zone + "_device"
+ SetSlotFromZone()
to_chat(user, "You modify [src] to be installed on the [zone == "r_arm" ? "right" : "left"] arm.")
update_icon()
else if(istype(W, /obj/item/card/emag))
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index 70a8f05b8a..1e93c4df4a 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -13,7 +13,7 @@
var/hunger_threshold = NUTRITION_LEVEL_STARVING
var/synthesizing = 0
var/poison_amount = 5
- slot = "stomach"
+ slot = ORGAN_SLOT_STOMACH
origin_tech = "materials=2;powerstorage=2;biotech=2"
/obj/item/organ/cyberimp/chest/nutriment/on_life()
@@ -51,7 +51,7 @@
icon_state = "chest_implant"
implant_color = "#AD0000"
origin_tech = "materials=5;programming=4;biotech=4"
- slot = "heartdrive"
+ slot = ORGAN_SLOT_HEART_AID
var/revive_cost = 0
var/reviving = 0
var/cooldown = 0
@@ -119,8 +119,8 @@
/obj/item/organ/cyberimp/chest/thrusters
name = "implantable thrusters set"
desc = "An implantable set of thruster ports. They use the gas from environment or subject's internals for propulsion in zero-gravity areas. \
- Unlike regular jetpacks, this device has no stabilization system."
- slot = "thrusters"
+ Unlike regular jetpack, this device has no stabilization system."
+ slot = ORGAN_SLOT_THRUSTERS
icon_state = "imp_jetpack"
origin_tech = "materials=4;magnets=4;biotech=4;engineering=5"
implant_overlay = null
diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm
index 62b427f883..f928db5dd6 100644
--- a/code/modules/surgery/organs/augments_eyes.dm
+++ b/code/modules/surgery/organs/augments_eyes.dm
@@ -3,7 +3,7 @@
desc = "artificial photoreceptors with specialized functionality"
icon_state = "eye_implant"
implant_overlay = "eye_implant_overlay"
- slot = "eye_sight"
+ slot = ORGAN_SLOT_EYES
zone = "eyes"
w_class = WEIGHT_CLASS_TINY
@@ -11,7 +11,7 @@
/obj/item/organ/cyberimp/eyes/hud
name = "HUD implant"
desc = "These cybernetic eyes will display a HUD over everything you see. Maybe."
- slot = "eye_hud"
+ slot = ORGAN_SLOT_HUD
var/HUD_type = 0
/obj/item/organ/cyberimp/eyes/hud/Insert(var/mob/living/carbon/M, var/special = 0, drop_if_replaced = FALSE)
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index 9b3c23b3a8..a6c1517faa 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -44,7 +44,7 @@
var/active = 0
var/list/stored_items = list()
implant_color = "#DE7E00"
- slot = "brain_antidrop"
+ slot = ORGAN_SLOT_BRAIN_ANTIDROP
origin_tech = "materials=4;programming=5;biotech=4"
actions_types = list(/datum/action/item_action/organ_action/toggle)
@@ -101,7 +101,7 @@
name = "CNS Rebooter implant"
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
implant_color = "#FFFF00"
- slot = "brain_antistun"
+ slot = ORGAN_SLOT_BRAIN_ANTISTUN
origin_tech = "materials=5;programming=4;biotech=5"
/obj/item/organ/cyberimp/brain/anti_stun/on_life()
@@ -133,7 +133,7 @@
name = "breathing tube implant"
desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked."
icon_state = "implant_mask"
- slot = "breathing_tube"
+ slot = ORGAN_SLOT_BREATHING_TUBE
w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=2;biotech=3"
diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm
index f8a310c8f7..e3aaec0266 100644
--- a/code/modules/surgery/organs/ears.dm
+++ b/code/modules/surgery/organs/ears.dm
@@ -3,7 +3,7 @@
icon_state = "ears"
desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible."
zone = "head"
- slot = "ears"
+ slot = ORGAN_SLOT_EARS
gender = PLURAL
// `deaf` measures "ticks" of deafness. While > 0, the person is unable
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index ddb6eb453f..75d4aa0bcc 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -3,7 +3,7 @@
icon_state = "eyeballs"
desc = "I see you!"
zone = "eyes"
- slot = "eye_sight"
+ slot = ORGAN_SLOT_EYES
gender = PLURAL
var/sight_flags = 0
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 9308154c48..30825f46bb 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -3,7 +3,7 @@
desc = "I feel bad for the heartless bastard who lost this."
icon_state = "heart-on"
zone = "chest"
- slot = "heart"
+ slot = ORGAN_SLOT_HEART
origin_tech = "biotech=5"
// Heart attack code is in code/modules/mob/living/carbon/human/life.dm
var/beating = 1
@@ -63,10 +63,9 @@
H.stop_sound_channel(CHANNEL_HEARTBEAT)
beat = BEAT_NONE
- if(H.jitteriness)
- if(!beat || beat == BEAT_SLOW)
- H.playsound_local(get_turf(H),fastbeat,40,0, channel = CHANNEL_HEARTBEAT)
- beat = BEAT_FAST
+ if(H.jitteriness && H.health > HEALTH_THRESHOLD_FULLCRIT && (!beat || beat == BEAT_SLOW))
+ H.playsound_local(get_turf(H),fastbeat,40,0, channel = CHANNEL_HEARTBEAT)
+ beat = BEAT_FAST
/obj/item/organ/heart/cursed
name = "cursed heart"
diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm
index eae5e8aee8..352958d9b8 100755
--- a/code/modules/surgery/organs/liver.dm
+++ b/code/modules/surgery/organs/liver.dm
@@ -8,7 +8,7 @@
origin_tech = "biotech=3"
w_class = WEIGHT_CLASS_NORMAL
zone = "chest"
- slot = "liver"
+ slot = ORGAN_SLOT_LIVER
desc = "Pairing suggestion: chianti and fava beans."
var/damage = 0 //liver damage, 0 is no damage, damage=maxHealth causes liver failure
var/alcohol_tolerance = ALCOHOL_RATE//affects how much damage the liver takes from alcohol
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index eb1be67af2..65c1e3e1fb 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -12,7 +12,7 @@
name = "lungs"
icon_state = "lungs"
zone = "chest"
- slot = "lungs"
+ slot = ORGAN_SLOT_LUNGS
gender = PLURAL
w_class = WEIGHT_CLASS_NORMAL
@@ -95,10 +95,10 @@
var/list/breath_gases = breath.gases
- breath.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/nitrogen)
+ breath.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/nitrogen, /datum/gas/tritium, /datum/gas/brown_gas, /datum/gas/pluoxium, /datum/gas/stimulum)
//Partial pressures in our breath
- var/O2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen][MOLES])
+ var/O2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen][MOLES])+(8*breath.get_breath_partial_pressure(breath_gases[/datum/gas/pluoxium][MOLES]))
var/N2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen][MOLES])
var/Toxins_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/plasma][MOLES])
var/CO2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/carbon_dioxide][MOLES])
@@ -252,9 +252,40 @@
H.adjustBrainLoss(3)
else if(bz_pp > 0.01)
H.hallucination += 5//Removed at 2 per tick so this will slowly build up
+
+
+ // Tritium
+ var/trit_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/tritium][MOLES])
+ if (trit_pp > 50)
+ H.radiation += trit_pp/2 //If you're breathing in half an atmosphere of radioactive gas, you fucked up.
+ else
+ H.radiation += trit_pp/10
+
+ //Brown Gas
+ var/brown_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/brown_gas][MOLES])
+ if (prob(brown_pp))
+ to_chat(H, "Your mouth feels like it's burning!")
+ if (brown_pp >40)
+ H.emote("gasp")
+ H.adjustFireLoss(10)
+ if (prob(brown_pp/2))
+ to_chat(H, "Your throat closes up!")
+ H.silent = max(H.silent, 3)
+ else
+ H.adjustFireLoss(brown_pp/4)
+ gas_breathed = breath_gases[/datum/gas/brown_gas][MOLES]
+ if (gas_breathed > GAS_STIM_MINIMUM)
+ H.reagents.add_reagent("brown_gas",1)
+
+ breath_gases[/datum/gas/brown_gas][MOLES]-=gas_breathed
+ gas_breathed = 0
+ //Stimulum
+ gas_breathed = breath_gases[/datum/gas/stimulum][MOLES]
+ if (gas_breathed > GAS_STIM_MINIMUM)
+ H.reagents.add_reagent("stimulum",1)
+ breath_gases[/datum/gas/stimulum][MOLES]-=gas_breathed
handle_breath_temperature(breath, H)
breath.garbage_collect()
-
return TRUE
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 681dcb21cf..85a6b098e1 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -22,7 +22,7 @@
if(replaced)
replaced.Remove(M, special = 1)
if(drop_if_replaced)
- replaced.forceMove(get_turf(src))
+ replaced.forceMove(get_turf(M))
else
qdel(replaced)
@@ -118,7 +118,7 @@
var/has_liver = (!(NOLIVER in dna.species.species_traits))
var/has_stomach = (!(NOSTOMACH in dna.species.species_traits))
- if(has_liver && !getorganslot("liver"))
+ if(has_liver && !getorganslot(ORGAN_SLOT_LIVER))
var/obj/item/organ/liver/LI
if(dna.species.mutantliver)
@@ -127,7 +127,7 @@
LI = new()
LI.Insert(src)
- if(has_stomach && !getorganslot("stomach"))
+ if(has_stomach && !getorganslot(ORGAN_SLOT_STOMACH))
var/obj/item/organ/stomach/S
if(dna.species.mutantstomach)
@@ -136,15 +136,15 @@
S = new()
S.Insert(src)
- if(breathes && !getorganslot("lungs"))
+ if(breathes && !getorganslot(ORGAN_SLOT_LUNGS))
var/obj/item/organ/lungs/L = new()
L.Insert(src)
- if(blooded && !getorganslot("heart"))
+ if(blooded && !getorganslot(ORGAN_SLOT_HEART))
var/obj/item/organ/heart/H = new()
H.Insert(src)
- if(!getorganslot("tongue"))
+ if(!getorganslot(ORGAN_SLOT_TONGUE))
var/obj/item/organ/tongue/T
if(dna && dna.species && dna.species.mutanttongue)
@@ -155,7 +155,7 @@
// if they have no mutant tongues, give them a regular one
T.Insert(src)
- if(!getorganslot("eye_sight"))
+ if(!getorganslot(ORGAN_SLOT_EYES))
var/obj/item/organ/eyes/E
if(dna && dna.species && dna.species.mutanteyes)
@@ -165,7 +165,7 @@
E = new()
E.Insert(src)
- if(!getorganslot("ears"))
+ if(!getorganslot(ORGAN_SLOT_EARS))
var/obj/item/organ/ears/ears
if(dna && dna.species && dna.species.mutantears)
ears = new dna.species.mutantears
diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm
index 36cd28ac98..2bf34334f4 100755
--- a/code/modules/surgery/organs/stomach.dm
+++ b/code/modules/surgery/organs/stomach.dm
@@ -4,7 +4,7 @@
origin_tech = "biotech=4"
w_class = WEIGHT_CLASS_NORMAL
zone = "chest"
- slot = "stomach"
+ slot = ORGAN_SLOT_STOMACH
attack_verb = list("gored", "squished", "slapped", "digested")
desc = "Onaka ga suite imasu."
var/disgust_metabolism = 1
diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm
index 99d1ed2442..a909463585 100644
--- a/code/modules/surgery/organs/tails.dm
+++ b/code/modules/surgery/organs/tails.dm
@@ -2,7 +2,7 @@
name = "tail"
desc = "What did you cut this off of?"
zone = "groin"
- slot = "tail"
+ slot = ORGAN_SLOT_TAIL
/obj/item/organ/tail/cat
name = "cat tail"
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index 449e88dc58..6420d8610e 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -3,7 +3,7 @@
desc = "A fleshy muscle mostly used for lying."
icon_state = "tonguenormal"
zone = "mouth"
- slot = "tongue"
+ slot = ORGAN_SLOT_TONGUE
attack_verb = list("licked", "slobbered", "slapped", "frenched", "tongued")
var/list/languages_possible
var/say_mod = null
@@ -83,7 +83,7 @@
var/mob/living/carbon/human/user = usr
var/rendered = "[user.name]: [message]"
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
- var/obj/item/organ/tongue/T = H.getorganslot("tongue")
+ var/obj/item/organ/tongue/T = H.getorganslot(ORGAN_SLOT_TONGUE)
if(!T || T.type != type)
continue
if(H.dna && H.dna.species.id == "abductor" && user.dna && user.dna.species.id == "abductor")
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 8b7f325f22..85dc2ae1c3 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -7,7 +7,7 @@
name = "vocal cords"
icon_state = "appendix"
zone = "mouth"
- slot = "vocal_cords"
+ slot = ORGAN_SLOT_VOICE
gender = PLURAL
var/list/spans = null
@@ -24,15 +24,13 @@
name = "adamantine resonator"
desc = "Fragments of adamantine exist in all golems, stemming from their origins as purely magical constructs. These are used to \"hear\" messages from their leaders."
zone = "head"
- slot = "adamantine_resonator"
+ slot = ORGAN_SLOT_ADAMANTINE_RESONATOR
icon_state = "adamantine_resonator"
/obj/item/organ/vocal_cords/adamantine
name = "adamantine vocal cords"
desc = "When adamantine resonates, it causes all nearby pieces of adamantine to resonate as well. Adamantine golems use this to broadcast messages to nearby golems."
actions_types = list(/datum/action/item_action/organ_action/use/adamantine_vocal_cords)
- zone = "mouth"
- slot = "vocal_cords"
icon_state = "adamantine_cords"
/datum/action/item_action/organ_action/use/adamantine_vocal_cords/Trigger()
@@ -48,7 +46,7 @@
for(var/m in GLOB.player_list)
if(iscarbon(m))
var/mob/living/carbon/C = m
- if(C.getorganslot("adamantine_resonator"))
+ if(C.getorganslot(ORGAN_SLOT_ADAMANTINE_RESONATOR))
to_chat(C, msg)
if(isobserver(m))
var/link = FOLLOW_LINK(m, owner)
@@ -59,8 +57,6 @@
name = "divine vocal cords"
desc = "They carry the voice of an ancient god."
icon_state = "voice_of_god"
- zone = "mouth"
- slot = "vocal_cords"
actions_types = list(/datum/action/item_action/organ_action/colossus)
var/next_command = 0
var/cooldown_mod = 1
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index 8db4e492e4..f203af610a 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -44,7 +44,7 @@
return
var/obj/item/organ/zombie_infection/infection
- infection = target.getorganslot("zombie_infection")
+ infection = target.getorganslot(ORGAN_SLOT_ZOMBIE)
if(!infection)
infection = new()
infection.Insert(target)
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index 81d3457d40..0b7a54ee1f 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -2,7 +2,7 @@
name = "festering ooze"
desc = "A black web of pus and viscera."
zone = "head"
- slot = "zombie_infection"
+ slot = ORGAN_SLOT_ZOMBIE
icon_state = "blacktumor"
origin_tech = "biotech=5"
var/datum/species/old_species = /datum/species/human
diff --git a/config/game_options.txt b/config/game_options.txt
index e835a4b1a6..d3fa274ed8 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -395,6 +395,13 @@ JOIN_WITH_MUTANT_RACE
## You probably want humans on your space station, but technically speaking you can turn them off without any ill effect
ROUNDSTART_RACES human
+ROUNDSTART_RACES mammal
+ROUNDSTART_RACES avian
+ROUNDSTART_RACES aquatic
+ROUNDSTART_RACES insect
+ROUNDSTART_RACES xeno
+ROUNDSTART_RACES datashark
+ROUNDSTART_RACES guilmon
## Races that are strictly worse than humans that could probably be turned on without balance concerns
ROUNDSTART_RACES lizard
diff --git a/html/changelogs/AutoChangeLog-pr-3524.yml b/html/changelogs/AutoChangeLog-pr-3524.yml
new file mode 100644
index 0000000000..8966133a1d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3524.yml
@@ -0,0 +1,4 @@
+author: "Kor"
+delete-after: True
+changes:
+ - rscadd: "You can now select your Halloween race, rather than having it assigned randomly via event."
diff --git a/html/changelogs/AutoChangeLog-pr-3603.yml b/html/changelogs/AutoChangeLog-pr-3603.yml
new file mode 100644
index 0000000000..502e536684
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3603.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - bugfix: "You can no longer stack infinitely many stargazers on one tile."
diff --git a/html/changelogs/AutoChangeLog-pr-3604.yml b/html/changelogs/AutoChangeLog-pr-3604.yml
new file mode 100644
index 0000000000..d4bbd36f07
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3604.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - bugfix: "Cogscarab shells and marauder armor now appear in the spawners menu."
diff --git a/html/changelogs/AutoChangeLog-pr-3606.yml b/html/changelogs/AutoChangeLog-pr-3606.yml
new file mode 100644
index 0000000000..74fb1e3772
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3606.yml
@@ -0,0 +1,6 @@
+author: "ninjanomnom & Wjohn"
+delete-after: True
+changes:
+ - bugfix: "Cable cuffs now inherit the color of the cables used to make them."
+ - bugfix: "Split cable stacks keep their color."
+ - tweak: "The blue cable color is now a better blue."
diff --git a/html/changelogs/AutoChangeLog-pr-3610.yml b/html/changelogs/AutoChangeLog-pr-3610.yml
new file mode 100644
index 0000000000..4d7996fd0c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3610.yml
@@ -0,0 +1,4 @@
+author: "nicbn"
+delete-after: True
+changes:
+ - imageadd: "Chemical heater and smoke machine resprited."
diff --git a/html/changelogs/AutoChangeLog-pr-3611.yml b/html/changelogs/AutoChangeLog-pr-3611.yml
new file mode 100644
index 0000000000..4cf47effae
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3611.yml
@@ -0,0 +1,5 @@
+author: "ninjanomnom"
+delete-after: True
+changes:
+ - soundadd: "Portable generators have a sound while active."
+ - soundadd: "The supermatter has a sound that scales with stored energy."
diff --git a/html/changelogs/AutoChangeLog-pr-3614.yml b/html/changelogs/AutoChangeLog-pr-3614.yml
new file mode 100644
index 0000000000..f14c2f29a5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3614.yml
@@ -0,0 +1,4 @@
+author: "ShizCalev"
+delete-after: True
+changes:
+ - bugfix: "You can no longer teleport past the ticket stands of the Luxury Emergency Shuttle."
diff --git a/html/changelogs/AutoChangeLog-pr-3615.yml b/html/changelogs/AutoChangeLog-pr-3615.yml
new file mode 100644
index 0000000000..ce963f647e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3615.yml
@@ -0,0 +1,4 @@
+author: "ShizCalev"
+delete-after: True
+changes:
+ - tweak: "The Staff of Change will now randomly assign a cyborg module when transforming a mob into a cyborg."
diff --git a/html/changelogs/AutoChangeLog-pr-3617.yml b/html/changelogs/AutoChangeLog-pr-3617.yml
new file mode 100644
index 0000000000..23c34fe480
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3617.yml
@@ -0,0 +1,4 @@
+author: "ShizCalev"
+delete-after: True
+changes:
+ - bugfix: "You will no longer be prompted to reenter your body while being defibbed if you can't actually be revived."
diff --git a/html/changelogs/AutoChangeLog-pr-3618.yml b/html/changelogs/AutoChangeLog-pr-3618.yml
new file mode 100644
index 0000000000..3b90caf60e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3618.yml
@@ -0,0 +1,4 @@
+author: "ShizCalev"
+delete-after: True
+changes:
+ - bugfix: "Lightgeists can now -actually- be spawned with gold slime cores."
diff --git a/html/changelogs/AutoChangeLog-pr-3623.yml b/html/changelogs/AutoChangeLog-pr-3623.yml
new file mode 100644
index 0000000000..5e385f17f4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3623.yml
@@ -0,0 +1,4 @@
+author: "ShizCalev"
+delete-after: True
+changes:
+ - bugfix: "Reflectors will no longer drop more materials than they took to make when deconstructed."
diff --git a/html/changelogs/AutoChangeLog-pr-3624.yml b/html/changelogs/AutoChangeLog-pr-3624.yml
new file mode 100644
index 0000000000..c98047a04c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3624.yml
@@ -0,0 +1,6 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - balance: "Clockwork marauders now move more slowly below 40% health."
+ - balance: "Instead of a 40% chance (or more) chance to block projectiles, clockwork marauders now have three fixed 100% blocks; after using those three, they cannot block anymore without avoiding projectiles for ten seconds. This number increases to four if war is declared."
+ - balance: "Projectiles that deal no damage DO reduce marauders' shield health. Use disabler shots to open them up, then use lasers to go for the kill!"
diff --git a/html/changelogs/AutoChangeLog-pr-3630.yml b/html/changelogs/AutoChangeLog-pr-3630.yml
new file mode 100644
index 0000000000..0c69e04f40
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3630.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - rscadd: "Admins are now able to mark open tickets as being handled. This makes it easier for staff members to provide feedback to players reporting issues via the admin help button."
diff --git a/html/changelogs/AutoChangeLog-pr-3634.yml b/html/changelogs/AutoChangeLog-pr-3634.yml
new file mode 100644
index 0000000000..3345c5ba6b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3634.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "The vore panel and other vore-related commands are now operational again."
diff --git a/html/changelogs/AutoChangeLog-pr-3635.yml b/html/changelogs/AutoChangeLog-pr-3635.yml
new file mode 100644
index 0000000000..99fb1d5289
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3635.yml
@@ -0,0 +1,4 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - rscdel: "Removed borer-HUDs"
diff --git a/html/changelogs/AutoChangeLog-pr-3637.yml b/html/changelogs/AutoChangeLog-pr-3637.yml
new file mode 100644
index 0000000000..b9dfcaecb8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3637.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Fixed LOOC error messages not appearing in goonchat"
diff --git a/html/changelogs/AutoChangeLog-pr-3638.yml b/html/changelogs/AutoChangeLog-pr-3638.yml
new file mode 100644
index 0000000000..d661f94d61
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3638.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Miscreants will now generate properly."
diff --git a/html/changelogs/AutoChangeLog-pr-3641.yml b/html/changelogs/AutoChangeLog-pr-3641.yml
new file mode 100644
index 0000000000..004acb1aaa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3641.yml
@@ -0,0 +1,19 @@
+author: "as334"
+delete-after: True
+changes:
+ - rscadd: "Massively Expands Atmospherics."
+ - rscadd: "New gases have been added:Brown Gas, Pluoxium, Stimulum, Hyper-Noblium and Tritium"
+ - rscadd: "Brown gas is acidic to breath, but mildly stimulation."
+ - rscadd: "Stimulum is more stimulating and much safer."
+ - rscadd: "Pluoxium is a non-reactive form of oxygen that delivers more oxygen into the bloodstream."
+ - rscadd: "Hyper-Noblium is an extremely noble gas, and stops gases from reacting."
+ - rscadd: "Tritium is radioactive and flammable."
+ - rscadd: "New reactions have also been added."
+ - rscadd: "Fusion. Plasma will fuse when heated to a high thermal energy, with tritium as a catalyst. Make
+sure to manage the waste products."
+ - rscadd: "Brown gas formation: Heat oxygen and nitrogen."
+ - rscadd: "BZ fixation: Heat Tritium and Plasma."
+ - rscadd: "Stimulum formation: Heated tritium,plasma,bz and browns."
+ - rscadd: "Hyper-Noblium condensation: Needs nitrogen and tritium at a high heat. Cools rapidly."
+ - rscdel: "Freon has been removed."
+ - rscadd: "Water vapor now freezes the tile it is on when it is cooled heavily."
diff --git a/html/changelogs/AutoChangeLog-pr-3649.yml b/html/changelogs/AutoChangeLog-pr-3649.yml
new file mode 100644
index 0000000000..04a9765da6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3649.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Cable coils will no longer appear as weirdly colored APCs"
diff --git a/html/changelogs/AutoChangeLog-pr-3663.yml b/html/changelogs/AutoChangeLog-pr-3663.yml
new file mode 100644
index 0000000000..7fe666a739
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3663.yml
@@ -0,0 +1,4 @@
+author: "Mark9013100"
+delete-after: True
+changes:
+ - tweak: "The Medical Cloning manual has been updated."
diff --git a/icons/effects/tile_effects.dmi b/icons/effects/tile_effects.dmi
index 0bd03133ea..8111fef6db 100644
Binary files a/icons/effects/tile_effects.dmi and b/icons/effects/tile_effects.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 2eab8fa78e..de8587dba5 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index fe9e9eed05..3507d9db53 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 77b62691d2..2cf675c571 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index b5ac65c2a8..636d895450 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index e1604715ac..5482873c8a 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/power_cond/cables.dmi b/icons/obj/power_cond/cables.dmi
new file mode 100644
index 0000000000..523947a3e7
Binary files /dev/null and b/icons/obj/power_cond/cables.dmi differ
diff --git a/icons/obj/power_cond/power_cond_blue.dmi b/icons/obj/power_cond/power_cond_blue.dmi
deleted file mode 100644
index 5cd500c4f1..0000000000
Binary files a/icons/obj/power_cond/power_cond_blue.dmi and /dev/null differ
diff --git a/icons/obj/power_cond/power_cond_cyan.dmi b/icons/obj/power_cond/power_cond_cyan.dmi
deleted file mode 100644
index 742d1f76ea..0000000000
Binary files a/icons/obj/power_cond/power_cond_cyan.dmi and /dev/null differ
diff --git a/icons/obj/power_cond/power_cond_green.dmi b/icons/obj/power_cond/power_cond_green.dmi
deleted file mode 100644
index d7a391d505..0000000000
Binary files a/icons/obj/power_cond/power_cond_green.dmi and /dev/null differ
diff --git a/icons/obj/power_cond/power_cond_orange.dmi b/icons/obj/power_cond/power_cond_orange.dmi
deleted file mode 100644
index 4777ddd665..0000000000
Binary files a/icons/obj/power_cond/power_cond_orange.dmi and /dev/null differ
diff --git a/icons/obj/power_cond/power_cond_pink.dmi b/icons/obj/power_cond/power_cond_pink.dmi
deleted file mode 100644
index 5ebda7c989..0000000000
Binary files a/icons/obj/power_cond/power_cond_pink.dmi and /dev/null differ
diff --git a/icons/obj/power_cond/power_cond_red.dmi b/icons/obj/power_cond/power_cond_red.dmi
deleted file mode 100644
index ffa8eb2405..0000000000
Binary files a/icons/obj/power_cond/power_cond_red.dmi and /dev/null differ
diff --git a/icons/obj/power_cond/power_cond_white.dmi b/icons/obj/power_cond/power_cond_white.dmi
deleted file mode 100644
index 313348dc85..0000000000
Binary files a/icons/obj/power_cond/power_cond_white.dmi and /dev/null differ
diff --git a/icons/obj/power_cond/power_cond_yellow.dmi b/icons/obj/power_cond/power_cond_yellow.dmi
deleted file mode 100644
index 908e22b778..0000000000
Binary files a/icons/obj/power_cond/power_cond_yellow.dmi and /dev/null differ
diff --git a/sound/machines/generator/generator_end.ogg b/sound/machines/generator/generator_end.ogg
new file mode 100644
index 0000000000..4397991167
Binary files /dev/null and b/sound/machines/generator/generator_end.ogg differ
diff --git a/sound/machines/generator/generator_mid1.ogg b/sound/machines/generator/generator_mid1.ogg
new file mode 100644
index 0000000000..10a0d01a7e
Binary files /dev/null and b/sound/machines/generator/generator_mid1.ogg differ
diff --git a/sound/machines/generator/generator_mid2.ogg b/sound/machines/generator/generator_mid2.ogg
new file mode 100644
index 0000000000..77656772cc
Binary files /dev/null and b/sound/machines/generator/generator_mid2.ogg differ
diff --git a/sound/machines/generator/generator_mid3.ogg b/sound/machines/generator/generator_mid3.ogg
new file mode 100644
index 0000000000..812a10e6fc
Binary files /dev/null and b/sound/machines/generator/generator_mid3.ogg differ
diff --git a/sound/machines/generator/generator_start.ogg b/sound/machines/generator/generator_start.ogg
new file mode 100644
index 0000000000..53f734388e
Binary files /dev/null and b/sound/machines/generator/generator_start.ogg differ
diff --git a/sound/machines/sm/supermatter1.ogg b/sound/machines/sm/supermatter1.ogg
new file mode 100644
index 0000000000..1860e78800
Binary files /dev/null and b/sound/machines/sm/supermatter1.ogg differ
diff --git a/sound/machines/sm/supermatter2.ogg b/sound/machines/sm/supermatter2.ogg
new file mode 100644
index 0000000000..fb2d39fe26
Binary files /dev/null and b/sound/machines/sm/supermatter2.ogg differ
diff --git a/sound/machines/sm/supermatter3.ogg b/sound/machines/sm/supermatter3.ogg
new file mode 100644
index 0000000000..93ac3d505b
Binary files /dev/null and b/sound/machines/sm/supermatter3.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 912f3cc89e..a07447e250 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1731,6 +1731,7 @@
#include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\skeletons.dm"
#include "code\modules\mob\living\carbon\human\species_types\synths.dm"
+#include "code\modules\mob\living\carbon\human\species_types\vampire.dm"
#include "code\modules\mob\living\carbon\human\species_types\zombies.dm"
#include "code\modules\mob\living\carbon\monkey\combat.dm"
#include "code\modules\mob\living\carbon\monkey\death.dm"
diff --git a/tgui/src/interfaces/airalarm/scrubbers.ract b/tgui/src/interfaces/airalarm/scrubbers.ract
index 83693106b1..2d8d50a1fc 100644
--- a/tgui/src/interfaces/airalarm/scrubbers.ract
+++ b/tgui/src/interfaces/airalarm/scrubbers.ract
@@ -25,10 +25,8 @@
action='n2o_scrub' params='{"id_tag": "{{id_tag}}", "val": {{+!filter_n2o}}}'>N2O
Plasma
- BZ
- Freon
+ Rare Gases
Water Vapor
diff --git a/tgui/src/interfaces/atmos_filter.ract b/tgui/src/interfaces/atmos_filter.ract
index bb48a78891..f8b62f3908 100644
--- a/tgui/src/interfaces/atmos_filter.ract
+++ b/tgui/src/interfaces/atmos_filter.ract
@@ -23,8 +23,16 @@
action='filter' params='{"mode": "/datum/gas/nitrous_oxide"}'>N2O
BZ
- Freon
+ Hyper-Noblium
+ Brown Gas
+ Tritium
+ Stimulum
+ Pluoxium
Water Vapor
diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php
index 40583d94c4..da5b037237 100644
--- a/tools/WebhookProcessor/github_webhook_processor.php
+++ b/tools/WebhookProcessor/github_webhook_processor.php
@@ -167,8 +167,6 @@ function check_tag_and_replace($payload, $title_tag, $label, &$array_to_add_labe
$title = $payload['pull_request']['title'];
if(stripos($title, $title_tag) !== FALSE){
$array_to_add_label_to[] = $label;
- $title = trim(str_ireplace($title_tag, '', $title));
- apisend($payload['pull_request']['url'], 'PATCH', array('title' => $title));
return true;
}
return false;
diff --git a/tools/travis/build_tools.sh b/tools/travis/build_tools.sh
index 2e9810b470..193ad261a6 100755
--- a/tools/travis/build_tools.sh
+++ b/tools/travis/build_tools.sh
@@ -7,6 +7,8 @@ if [ "$BUILD_TOOLS" = true ];
then
md5sum -c - <<< "49bc6b1b9ed56c83cceb6674bd97cb34 *html/changelogs/example.yml";
cd tgui && source ~/.nvm/nvm.sh && gulp && cd ..;
- php5.6 -l tools/WebhookProcessor/github_webhook_processor.php;
+ phpenv global 5.6
+ php -l tools/WebhookProcessor/github_webhook_processor.php;
+ php -l tools/TGUICompiler.php;
python tools/ss13_genchangelog.py html/changelog.html html/changelogs;
fi;