diff --git a/__DEFINES/gases.dm b/__DEFINES/gases.dm
index a0aad1d76d77..530f584d66e1 100644
--- a/__DEFINES/gases.dm
+++ b/__DEFINES/gases.dm
@@ -6,3 +6,4 @@
#define GAS_CRYOTHEUM "cryotheum"
#define GAS_VOLATILE "volatile_fuel"
#define GAS_OXAGENT "oxygen_agent_b"
+#define GAS_RADON "radon"
diff --git a/__DEFINES/reagents.dm b/__DEFINES/reagents.dm
index cdb02d030132..b9238a26cb1b 100644
--- a/__DEFINES/reagents.dm
+++ b/__DEFINES/reagents.dm
@@ -9,6 +9,7 @@
#define CHEMFLAG_DISHONORABLE 1
#define CHEMFLAG_OBSCURING 2
#define CHEMFLAG_PIGMENT 4
+#define CHEMFLAG_NOTREMOVABLE 8 //cannot be rid of by charcoal (or other reagent tomfoolery means).
#define EXPLICITLY_INVALID_REAGENT_ID "Use this ID if the reagent is not supposed to be used, like for the base type of other reagents."
@@ -541,6 +542,13 @@
#define FLAXOIL "flax_oil"
#define WAX "wax"
+#define PLUTONIUM "plutonium"
+#define RADON "radon"
+#define LEAD "lead"
+#define THALLIUM "thallium"
+#define REGENERATECALCIUM "regeneratecalcium"
+#define EQUALIZONE "equalizone"
+
#define DYE_DANDELIONS "dandelion_dye"
// How many units of reagent are consumed per tick, by default.
diff --git a/__DEFINES/setup.dm b/__DEFINES/setup.dm
index e7db5d33fcb5..6ea59399a389 100644
--- a/__DEFINES/setup.dm
+++ b/__DEFINES/setup.dm
@@ -1775,6 +1775,7 @@ var/proccalls = 1
#define COMPUTER "computer"
#define EMBEDDED_CONTROLLER "embedded controller"
#define OTHER "other"
+#define MACHINE_REINFORCED "reinforced machine"
// Bedsheet altering
#define PLAIDPATTERN_INCOMPATIBLE 0
diff --git a/code/ZAS/Radon.dm b/code/ZAS/Radon.dm
new file mode 100644
index 000000000000..c322e9035844
--- /dev/null
+++ b/code/ZAS/Radon.dm
@@ -0,0 +1,10 @@
+/mob/proc/radon_effects()
+
+/mob/living/radon_effects()
+ if(flags & INVULNERABLE)
+ return
+ if(!src.loc)
+ return
+
+ var/molesofradon=src.loc.return_air().molar_density(GAS_RADON)*CELL_VOLUME
+ src.apply_radiation(molesofradon*1.5, RAD_EXTERNAL)
\ No newline at end of file
diff --git a/code/ZAS/XGM_gases.dm b/code/ZAS/XGM_gases.dm
index 4c0a84f8d50d..4837571be54b 100644
--- a/code/ZAS/XGM_gases.dm
+++ b/code/ZAS/XGM_gases.dm
@@ -143,3 +143,21 @@
/obj/effect/overlay/gas_overlay/cryotheum
name = "cryotheum"
icon_state = "cryotheum"
+
+/datum/gas/radon
+ id = GAS_RADON
+ name = "Radon"
+ short_name = "Rn"
+ specific_heat = 20
+
+ molar_mass = 0.222 //i think i did this right
+
+ flags = XGM_GAS_NOTEWORTHY | XGM_GAS_LOGGED
+
+/datum/gas/radon/is_human_safe(moles, datum/gas_mixture/mixture)
+ return moles/mixture.total_moles() < 0.01
+
+
+
+
+
diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm
index caa31ea71125..0eeddc5f4ca4 100644
--- a/code/controllers/subsystem/machinery.dm
+++ b/code/controllers/subsystem/machinery.dm
@@ -2,6 +2,7 @@ var/datum/subsystem/machinery/SSmachinery
var/list/machines = list()
+var/list/global/fissionreactorlist=list()
/datum/subsystem/machinery
name = "Machinery"
@@ -32,6 +33,11 @@ var/list/machines = list()
if (!resumed)
currentrun = get_currenrun()
+ for(var/datum/fission_reactor_holder/reactor in fissionreactorlist)
+ reactor.fissioncycle()
+ reactor.coolantcycle()
+ reactor.misccycle()
+
var/obj/machinery/M
var/c = currentrun_index
while (c)
diff --git a/code/datums/supply_packs/engineering.dm b/code/datums/supply_packs/engineering.dm
index fb70451fc698..3cfda8f117e0 100644
--- a/code/datums/supply_packs/engineering.dm
+++ b/code/datums/supply_packs/engineering.dm
@@ -420,3 +420,71 @@
access = list(access_engine_minor)
group = "Engineering"
containsdesc = "A cutting edge machine that tears into a universe orthogonal to ours and applies alternative laws of physics to gaseous oxygen in its immediate vicinity. Requires a bluespace crystal to work (an artificial crystal comes with this crate!)."
+
+/datum/supply_packs/fissionreactor_starterkit
+ contains = list(
+ /obj/item/weapon/fuelrod/small/starter,
+ /obj/item/weapon/book/manual/engineering_fissionreactor_guide,
+ /obj/item/weapon/storage/box/fissionsupply_controller, //makes a crappy 1x2 interior. but it'll do.
+ /obj/item/weapon/storage/box/fissionsupply_genericassembly,
+ /obj/item/weapon/storage/box/fissionsupply_genericassembly,
+ /obj/item/weapon/storage/box/fissionsupply_fuelmaker,
+ /obj/item/weapon/circuitboard/fission_control_rod,
+ /obj/item/weapon/circuitboard/fission_fuel_rod,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+
+ )
+ name = "Fission reactor starter kit"
+ cost = 500 //Includes a lot of plasteel. Fuck you, ask the miners for more you socially inept jobbie.
+ containertype = /obj/structure/closet/crate/secure/large/reinforced/shard/empty
+ containername = "Fission reactor starter kit"
+ group = "Engineering"
+ access = list(access_engine_major)
+ containsdesc = "Everything you need to build a very basic fission reactor. Comes with a pre-filled (albeit small) fuel rod."
+
+/datum/supply_packs/fissionreactor_expansion
+ contains = list(
+ /obj/item/weapon/storage/box/fissionsupply_genericassembly,
+ /obj/item/weapon/storage/box/fissionsupply_genericassembly,
+ /obj/item/weapon/circuitboard/fission_control_rod, //gives you 2 expansion parts (control/fuel rod) and the casing needed to add.
+ /obj/item/weapon/circuitboard/fission_fuel_rod,
+ /obj/item/weapon/circuitboard/fission_control_rod,
+ /obj/item/weapon/circuitboard/fission_fuel_rod,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ /obj/item/weapon/storage/box/fissionsupply_casing,
+ )
+ name = "Fission reactor expansion pak"
+ cost = 200 //See above.
+ containertype = /obj/structure/closet/crate/secure/large/reinforced/shard/empty
+ containername = "Fission reactor expansion pak"
+ group = "Engineering"
+ access = list(access_engine_major)
+ containsdesc = "Contains supplies to expand an existing fission reactor. Remember to turn it off and drain the coolant first!"
+
+/datum/supply_packs/fissionreactor_bigrod
+ contains = list(
+ /obj/item/weapon/fuelrod/large
+ )
+ name = "High-capacity fuel rod"
+ cost = 100 //It's a one time purchance, really. somewhat costy, but not that much for a department. watch for meltdowns.
+ containertype = /obj/structure/closet/crate/secure/large/reinforced/shard/empty
+ containername = "Large fuel rod"
+ group = "Engineering"
+ access = list(access_engine_major)
+ containsdesc = "An extra-large fuel rod, for extra power or for more complex fuel mixes. Use with extreme caution and control rods inserted."
+
+
+
+
+
+
\ No newline at end of file
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index be5d944bb211..c322c7d1a83b 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1351,6 +1351,10 @@ var/global/list/adminbusteleportlocs = list()
name = "Antimatter Engine Room"
icon_state = "antimatter"
+/area/engineering/reactor_room
+ name = "Fission Reactor Room"
+ icon_state = "fission"
+
/area/engineering/engineering_auxiliary
name = "Auxiliary Engineering"
icon_state = "engiaux"
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 9b1cc11a01e0..617bd1404cfe 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -105,7 +105,8 @@
GAS_CARBON = new /datum/airalarm_threshold(-1, -1, -1, -1),
GAS_PLASMA = new /datum/airalarm_threshold(-1, -1, -1, -1),
GAS_SLEEPING = new /datum/airalarm_threshold(-1, -1, -1, -1),
- GAS_CRYOTHEUM = new /datum/airalarm_threshold(-1, -1, -1, -1) )
+ GAS_CRYOTHEUM = new /datum/airalarm_threshold(-1, -1, -1, -1),
+ GAS_RADON = new /datum/airalarm_threshold(-1, -1, -1, -1))
// Partial pressure, kpa threshold for any gas not included in gas_thresholds. These gasses are added up.
var/datum/airalarm_threshold/other_gas_threshold = new /datum/airalarm_threshold(-1, -1, -1, -1)
// Kpa thresholds for what pressures are acceptable.
@@ -196,6 +197,7 @@
GAS_NITROGEN = new /datum/airalarm_threshold(-1, -1, -1, -1),
GAS_CARBON = new /datum/airalarm_threshold(-1, -1, 5, 10),
GAS_PLASMA = new /datum/airalarm_threshold(-1, -1, 0.2, 0.5),
+ GAS_RADON = new /datum/airalarm_threshold(-1, -1, 0.05, 0.1),
GAS_SLEEPING = new /datum/airalarm_threshold(-1, -1, 0.5, 1),
GAS_CRYOTHEUM = new /datum/airalarm_threshold(-1, -1, 0.5, 1) )
other_gas_threshold = new /datum/airalarm_threshold(-1, -1, 0.5, 1)
@@ -212,6 +214,7 @@
GAS_NITROGEN = new /datum/airalarm_threshold(16, 18, 135, 140),
GAS_CARBON = new /datum/airalarm_threshold(-1, -1, 5, 10),
GAS_PLASMA = new /datum/airalarm_threshold(-1, -1, 0.2, 0.5),
+ GAS_RADON = new /datum/airalarm_threshold(-1, -1, 0.05, 0.1),
GAS_SLEEPING = new /datum/airalarm_threshold(-1, -1, 0.5, 1),
GAS_CRYOTHEUM = new /datum/airalarm_threshold(-1, -1, 0.5, 1) )
other_gas_threshold = new /datum/airalarm_threshold(-1, -1, 0.5, 1)
@@ -228,6 +231,7 @@
GAS_NITROGEN = new /datum/airalarm_threshold(-1, -1, -1, -1),
GAS_CARBON = new /datum/airalarm_threshold(-1, -1, 5, 10),
GAS_PLASMA = new /datum/airalarm_threshold(-1, -1, 0.2, 0.5),
+ GAS_RADON = new /datum/airalarm_threshold(-1, -1, 0.05, 0.1),
GAS_SLEEPING = new /datum/airalarm_threshold(-1, -1, 0.5, 1),
GAS_CRYOTHEUM = new /datum/airalarm_threshold(-1, -1, 0.5, 1) )
other_gas_threshold = new /datum/airalarm_threshold(-1, -1, 0.5, 1)
@@ -244,6 +248,7 @@
GAS_NITROGEN = new /datum/airalarm_threshold(-1, -1, -1, -1),
GAS_CARBON = new /datum/airalarm_threshold(-1, -1, 5, 10),
GAS_PLASMA = new /datum/airalarm_threshold(16, 18, 135, 140),
+ GAS_RADON = new /datum/airalarm_threshold(-1, -1, 0.05, 0.1),
GAS_SLEEPING = new /datum/airalarm_threshold(-1, -1, 0.5, 1),
GAS_CRYOTHEUM = new /datum/airalarm_threshold(-1, -1, 0.5, 1) )
other_gas_threshold = new /datum/airalarm_threshold(-1, -1, 0.5, 1)
@@ -260,6 +265,7 @@
GAS_NITROGEN = new /datum/airalarm_threshold(-1, -1, 0.5, 1),
GAS_CARBON = new /datum/airalarm_threshold(-1, -1, 0.5, 1),
GAS_PLASMA = new /datum/airalarm_threshold(-1, -1, 0.5, 1),
+ GAS_RADON = new /datum/airalarm_threshold(-1, -1, 0.5, 1),
GAS_SLEEPING = new /datum/airalarm_threshold(-1, -1, 0.5, 1),
GAS_CRYOTHEUM = new /datum/airalarm_threshold(-1, -1, 0.5, 1) )
other_gas_threshold = new /datum/airalarm_threshold(-1, -1, 0.5, 1)
@@ -276,6 +282,7 @@
GAS_NITROGEN = new /datum/airalarm_threshold(16, 18, 135, 140),
GAS_CARBON = new /datum/airalarm_threshold(-1, -1, -1, -1),
GAS_PLASMA = new /datum/airalarm_threshold(-1, -1, 0.2, 0.5),
+ GAS_RADON = new /datum/airalarm_threshold(-1, -1, 0.05, 0.1),
GAS_SLEEPING = new /datum/airalarm_threshold(-1, -1, -1, -1),
GAS_CRYOTHEUM = new /datum/airalarm_threshold(-1, -1, -1, -1) )
other_gas_threshold = new /datum/airalarm_threshold(-1, -1, 0.5, 1)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 0521ac2fd671..3ba17fa6738b 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -80,6 +80,12 @@
canister_color = "grey"
can_label = 0
+/obj/machinery/portable_atmospherics/canister/radon //for testing (or admin shittery)
+ name = "Canister \[Rn\]"
+ icon_state = "green"
+ canister_color = "green"
+ can_label = 0
+
/obj/machinery/portable_atmospherics/canister/update_icon()
if(destroyed)
icon_state = "[canister_color]-1"
@@ -399,6 +405,7 @@
"\[CO2\]" = "black", \
"\[Air\]" = "grey", \
"\[CAUTION\]" = "yellow", \
+ "\[Rn\]" = "green", \
)
var/label = input("Choose canister label", "Gas canister") as null|anything in colors
if (label)
@@ -446,6 +453,12 @@
update_icon()
+
+/obj/machinery/portable_atmospherics/canister/radon/New(loc)
+ ..(loc)
+ air_contents.adjust_gas(GAS_RADON, (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature))
+ update_icon()
+
/obj/machinery/portable_atmospherics/canister/proc/weld(var/obj/item/tool/weldingtool/WT, var/mob/user)
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index a27c8be8828d..2e5ae382d871 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -355,6 +355,8 @@
build_path = /obj/machinery/computer/stacking_unit
origin_tech = Tc_PROGRAMMING + "=2;" + Tc_MATERIALS + "=2"
+
+
/obj/item/weapon/circuitboard/attackby(obj/item/I as obj, mob/user as mob)
if(issolder(I))
var/obj/item/tool/solder/S = I
@@ -391,6 +393,8 @@
to_chat(user, "You [contraband_enabled ? "" : "un"]connect the mysterious fuse.")
contraband_enabled = !contraband_enabled
+
+
/obj/structure/computerframe/attackby(obj/item/P as obj, mob/user as mob)
switch(state)
if(0)
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 65e5c3782247..48123724e8bd 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -15,6 +15,7 @@
var/list/components_in_use = null
var/build_state = 1
var/build_path = 0 //0 = Default path. 1 = Glass Frame
+ var/required_circuit_type = null
// For pods
var/list/connected_parts = list()
@@ -43,6 +44,9 @@
amt += req_components[path]
return amt
+/obj/machinery/constructable_frame/machine_frame
+ required_circuit_type=MACHINE
+
/obj/machinery/constructable_frame/machine_frame/attackby(obj/item/P as obj, mob/user as mob)
if(P.crit_fail)
to_chat(user, "This part is faulty, you cannot add this to the machine!")
@@ -125,7 +129,7 @@
if(!..())
if(istype(P, /obj/item/weapon/circuitboard))
var/obj/item/weapon/circuitboard/B = P
- if(B.board_type == MACHINE)
+ if(B.board_type == required_circuit_type)
if(!user.drop_item(B, src, failmsg = TRUE))
return
@@ -1729,3 +1733,4 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/weapon/stock_parts/matter_bin = 1,
)
+
diff --git a/code/game/objects/items/stacks/stack_recipes.dm b/code/game/objects/items/stacks/stack_recipes.dm
index bf1c04880983..83a923530fcf 100644
--- a/code/game/objects/items/stacks/stack_recipes.dm
+++ b/code/game/objects/items/stacks/stack_recipes.dm
@@ -446,6 +446,11 @@ var/list/datum/stack_recipe/plasteel_recipes = list (
new/datum/stack_recipe("shuttle bed", /obj/structure/bed/racecar/shuttle, 2, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe("fire truck bed", /obj/structure/bed/racecar/firetruck, 2, one_per_turf = 1, on_floor = 1),
)),
+ null,
+ new/datum/stack_recipe("Reinforced machine frame", /obj/machinery/constructable_frame/machine_frame/reinforced, 5, time = 60, one_per_turf = 1 ),
+ null,
+ new/datum/stack_recipe("Reactor casing frame", /obj/structure/girder/reactor, 4, time = 50, one_per_turf = 1 ),
+ new/datum/stack_recipe("Reactor fuel rod", /obj/item/weapon/fuelrod, 2, time = 25),
)
/* ====================================================================
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index d00beaa6ae1f..dac0eca59050 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -1293,3 +1293,442 @@ var/virology_encyclopedia = ""