diff --git a/.travis.yml b/.travis.yml
index b353761b2d..3095262290 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,15 +21,12 @@ cache:
addons:
apt:
- sources:
- - sourceline: 'ppa:ondrej/php'
packages:
- libc6-i386
- libgcc1:i386
- libstdc++6:i386
- python
- python-pip
- - php5.6
install:
- tools/travis/install_build_tools.sh
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 1dfc193284..988afb163f 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -39983,7 +39983,9 @@
/turf/open/floor/engine,
/area/science/misc_lab)
"bTm" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
+/obj/machinery/atmospherics/components/trinary/mixer/flipped{
+ dir = 1
+ },
/turf/open/floor/engine,
/area/science/misc_lab)
"bTn" = (
@@ -48489,12 +48491,8 @@
},
/area/ai_monitored/security/armory)
"coT" = (
-/obj/item/pipe{
- dir = 4;
- icon_state = "mixer";
- name = "gas mixer fitting";
- pipe_type = 14
- },
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/obj/machinery/meter,
/turf/open/floor/engine,
/area/science/misc_lab)
"coZ" = (
@@ -53801,7 +53799,7 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cCW" = (
-/obj/machinery/portable_atmospherics/canister/freon,
+/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
/turf/open/floor/plating,
/area/engine/engineering)
"cCY" = (
@@ -86228,7 +86226,7 @@ bVI
cay
ccw
chY
-cCW
+ciZ
ciW
ckB
ckB
@@ -108055,7 +108053,7 @@ cBE
bOE
bEC
bQV
-bSi
+coT
bTm
bUn
bXr
@@ -108312,8 +108310,8 @@ bNu
bMv
bEC
bQT
-bSh
-coT
+bSi
+bUn
bTl
bXr
bNZ
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 885a0926e8..1308cf7c87 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -57403,7 +57403,6 @@
dir = 8
},
/obj/effect/turf_decal/bot,
-/obj/machinery/portable_atmospherics/canister/freon,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cqt" = (
@@ -81845,7 +81844,7 @@
},
/area/science/mixing)
"dqG" = (
-/obj/machinery/atmospherics/components/unary/vent_pump,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel/neutral,
/area/science/mixing)
"dqH" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index aa5a62d079..1b1913ef26 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -77655,7 +77655,7 @@
/turf/open/floor/plating,
/area/engine/engineering)
"deZ" = (
-/obj/machinery/portable_atmospherics/canister/freon,
+/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
/turf/open/floor/plating,
/area/engine/engineering)
"dfa" = (
@@ -120449,7 +120449,7 @@ aGS
axY
aJl
aKx
-deZ
+aJu
aNo
axY
aPW
diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm
index cffad6bf58..a9aea3c632 100644
--- a/_maps/shuttles/emergency_luxury.dmm
+++ b/_maps/shuttles/emergency_luxury.dmm
@@ -4,20 +4,20 @@
/area/space)
"ab" = (
/turf/closed/indestructible/riveted/uranium,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ac" = (
/obj/machinery/door/airlock/external,
/turf/open/floor/plating{
icon_state = "wood-broken2"
},
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ad" = (
/obj/machinery/door/airlock/gold,
/obj/effect/forcefield/luxury_shuttle{
name = "Ticket Booth"
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ae" = (
/obj/docking_port/mobile/emergency{
dir = 2;
@@ -32,75 +32,75 @@
name = "Ticket Booth"
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"af" = (
/turf/open/floor/plating{
icon_state = "wood-broken3"
},
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ag" = (
/turf/open/floor/plating{
icon_state = "wood"
},
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ah" = (
/turf/open/floor/plating{
icon_state = "wood-broken"
},
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ai" = (
/turf/open/floor/plating{
icon_state = "wood-broken5"
},
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aj" = (
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ak" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"al" = (
/obj/structure/mirror{
pixel_y = 32
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"am" = (
/turf/open/floor/plating{
icon_state = "wood-broken7"
},
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"an" = (
/obj/machinery/light/small,
/turf/open/floor/plating{
icon_state = "wood-broken2"
},
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ao" = (
/obj/machinery/light/small,
/turf/open/floor/plating{
icon_state = "wood-broken6"
},
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ap" = (
/obj/structure/toilet{
dir = 4
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aq" = (
/obj/machinery/door/airlock/gold,
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ar" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8
},
/turf/open/floor/plating/airless,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"as" = (
/obj/structure/shuttle/engine/heater{
dir = 8
@@ -109,198 +109,198 @@
dir = 4
},
/turf/open/floor/plating/airless,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"at" = (
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"au" = (
/obj/structure/chair/comfy,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"av" = (
/obj/structure/chair/comfy{
dir = 4
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aw" = (
/obj/machinery/computer/communications,
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ax" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/meatballspaghetti,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ay" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/notasandwich,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"az" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/pastatomato,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aA" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/kebab/tofu,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aB" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/honkdae,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aC" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/enchiladas,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aD" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/candiedapple,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aE" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/burger/baconburger,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aF" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/benedict,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aG" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/cakeslice/chocolate,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aH" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/chowmein,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aI" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/dulcedebatataslice,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aJ" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/salad/validsalad,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aK" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/carneburrito,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aL" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/chawanmushi,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aM" = (
/obj/machinery/computer/emergency_shuttle,
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aN" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/melonfruitbowl,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aO" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/khachapuri,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aP" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/grilledcheese,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aQ" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aR" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/honeybun,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aS" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/eggplantparm,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aT" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/copypasta,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aU" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/bearsteak,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aV" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/boiledspaghetti,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aW" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/cherrycupcake,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aX" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/customizable/pizza,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aY" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/hotdog,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"aZ" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/pie/grapetart,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"ba" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/burger/superbite,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bb" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/snacks/cakeslice/slimecake,
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bc" = (
/obj/machinery/computer/station_alert,
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bd" = (
/obj/structure/chair/comfy{
dir = 1
},
/turf/open/floor/carpet,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"be" = (
/obj/machinery/computer/crew,
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bf" = (
/obj/machinery/sleeper{
dir = 4
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bg" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-21";
@@ -308,26 +308,26 @@
pixel_y = 3
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bh" = (
/turf/open/floor/plating/beach/coastline_b,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bi" = (
/obj/machinery/light,
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bj" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bk" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bl" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-10"
@@ -336,25 +336,25 @@
dir = 8
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bm" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bn" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bo" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bp" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-21";
@@ -363,7 +363,7 @@
},
/obj/machinery/light,
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
"bq" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-21";
@@ -372,7 +372,7 @@
},
/obj/machinery/light,
/turf/open/floor/mineral/gold,
-/area/shuttle/escape)
+/area/shuttle/escape/luxury)
(1,1,1) = {"
aa
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 1273b5e3de..87f16da081 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -56,28 +56,16 @@
#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD 150+T0C
#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C
#define FIRE_SPREAD_RADIOSITY_SCALE 0.85
-#define FIRE_CARBON_ENERGY_RELEASED 500000 //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
#define FIRE_GROWTH_RATE 40000 //For small fires
#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage
#define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage
- //Plasma fire properties
-#define OXYGEN_BURN_RATE_BASE 1.4
-#define PLASMA_BURN_RATE_DELTA 9
-#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C
-#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 MIN_TOXIC_GAS_DAMAGE 1
#define MAX_TOXIC_GAS_DAMAGE 10
-#define MOLES_PLASMA_VISIBLE 0.5 //Moles in a standard cell after which plasma is visible
- //Plasma fusion properties
-#define PLASMA_BINDING_ENERGY 3000000
-#define MAX_CARBON_EFFICENCY 9
-#define PLASMA_FUSED_COEFFICENT 0.08
-#define CARBON_CATALYST_COEFFICENT 0.01
-#define FUSION_PURITY_THRESHOLD 0.9
+#define MOLES_GAS_VISIBLE 0.5 //Moles in a standard cell after which gases are visible
+#define STOP_REACTIONS 2
+#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C
+#define GAS_STIM_MINIMUM 0.002
+
// Pressure limits.
#define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant)
#define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE)
@@ -193,8 +181,7 @@
#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity())
#define ADD_GAS(gas_id, out_list)\
- var/list/tmp_gaslist = GLOB.gaslist_cache[gas_id];\
- out_list[gas_id] = tmp_gaslist.Copy();
+ var/list/tmp_gaslist = GLOB.gaslist_cache[gas_id]; out_list[gas_id] = tmp_gaslist.Copy();
//ASSERT_GAS(gas_id, gas_mixture) - used to guarantee that the gas list for this id exists in gas_mixture.gases.
//Must be used before adding to a gas. May be used before reading from a gas.
diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm
index d4b2dfb2db..3c3350d6ab 100644
--- a/code/__DEFINES/atom_hud.dm
+++ b/code/__DEFINES/atom_hud.dm
@@ -40,8 +40,7 @@
#define ANTAG_HUD_SINTOUCHED 16
#define ANTAG_HUD_SOULLESS 17
#define ANTAG_HUD_CLOCKWORK 18
-#define ANTAG_HUD_BORER 19
-#define ANTAG_HUD_BROTHER 20
+#define ANTAG_HUD_BROTHER 19
// Notification action types
#define NOTIFY_JUMP "jump"
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index faf8238b6f..804ec2dc78 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -2,6 +2,8 @@
#define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path)
#define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src)
+#define COMPONENT_INCOMPATIBLE 1
+
// How multiple components of the exact same type are handled in the same datum
#define COMPONENT_DUPE_HIGHLANDER 0 //old component is deleted (default)
diff --git a/code/__DEFINES/pipe_construction.dm b/code/__DEFINES/pipe_construction.dm
index f5b513312d..a671b548ba 100644
--- a/code/__DEFINES/pipe_construction.dm
+++ b/code/__DEFINES/pipe_construction.dm
@@ -1,33 +1,10 @@
-/*
-PIPE CONSTRUCTION DEFINES
-Update these any time a path is changed
-Construction breaks otherwise
-*/
-
-//Pipes
-#define PIPE_SIMPLE /obj/machinery/atmospherics/pipe/simple
-#define PIPE_MANIFOLD /obj/machinery/atmospherics/pipe/manifold
-#define PIPE_4WAYMANIFOLD /obj/machinery/atmospherics/pipe/manifold4w
-#define PIPE_HE /obj/machinery/atmospherics/pipe/heat_exchanging/simple
-#define PIPE_HE_MANIFOLD /obj/machinery/atmospherics/pipe/heat_exchanging/manifold
-#define PIPE_HE_4WAYMANIFOLD /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w
-#define PIPE_JUNCTION /obj/machinery/atmospherics/pipe/heat_exchanging/junction
-#define PIPE_LAYER_MANIFOLD /obj/machinery/atmospherics/pipe/layer_manifold
-//Unary
-#define PIPE_CONNECTOR /obj/machinery/atmospherics/components/unary/portables_connector
-#define PIPE_UVENT /obj/machinery/atmospherics/components/unary/vent_pump
-#define PIPE_SCRUBBER /obj/machinery/atmospherics/components/unary/vent_scrubber
-#define PIPE_INJECTOR /obj/machinery/atmospherics/components/unary/outlet_injector
-#define PIPE_HEAT_EXCHANGE /obj/machinery/atmospherics/components/unary/heat_exchanger
-//Binary
-#define PIPE_PUMP /obj/machinery/atmospherics/components/binary/pump
-#define PIPE_PASSIVE_GATE /obj/machinery/atmospherics/components/binary/passive_gate
-#define PIPE_VOLUME_PUMP /obj/machinery/atmospherics/components/binary/volume_pump
-#define PIPE_MVALVE /obj/machinery/atmospherics/components/binary/valve
-#define PIPE_DVALVE /obj/machinery/atmospherics/components/binary/valve/digital
-//Trinary
-#define PIPE_GAS_FILTER /obj/machinery/atmospherics/components/trinary/filter
-#define PIPE_GAS_MIXER /obj/machinery/atmospherics/components/trinary/mixer
+//Construction Categories
+#define PIPE_BINARY 0 //2 directions: N/S, E/W
+#define PIPE_BENDABLE 1 //6 directions: N/S, E/W, N/E, N/W, S/E, S/W
+#define PIPE_TRINARY 2 //4 directions: N/E/S, E/S/W, S/W/N, W/N/E
+#define PIPE_TRIN_M 3 //8 directions: N->S+E, S->N+E, N->S+W, S->N+W, E->W+S, W->E+S, E->W+N, W->E+N
+#define PIPE_UNARY 4 //4 directions: N, S, E, W
+#define PIPE_QUAD 5 //1 directions: N/S/E/W
//Disposal piping numbers - do NOT hardcode these, use the defines
#define DISP_PIPE_STRAIGHT 0
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index d94bfb4c5b..4a9588a685 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -504,21 +504,19 @@ Turf and target are separate in case you want to teleport some distance from a t
return y
/*
-Recursively gets all contents of contents and returns them all in a list.
-
-recursive_depth is useful if you only want a turf and everything on it (recursive_depth=1)
-Do not set recursive depth higher than MAX_PROC_DEPTH as byond breaks when that limit is reached.
+ Gets all contents of contents and returns them all in a list.
*/
-/atom/proc/GetAllContents(list/output=list(), recursive_depth=MAX_PROC_DEPTH, _current_depth=0)
- . = output
- output += src
- if(_current_depth == recursive_depth)
- if(_current_depth == MAX_PROC_DEPTH)
- WARNING("Get all contents reached the max recursive depth of [MAX_PROC_DEPTH]. More and we would break shit. Offending atom: [src]")
- return
- for(var/i in 1 to contents.len)
- var/atom/thing = contents[i]
- thing.GetAllContents(output, recursive_depth, ++_current_depth)
+/atom/proc/GetAllContents()
+ var/list/processing_list = list(src)
+ var/list/assembled = list()
+ while(processing_list.len)
+ var/atom/A = processing_list[1]
+ processing_list.Cut(1, 2)
+ //Byond does not allow things to be in multiple contents, or double parent-child hierarchies, so only += is needed
+ //This is also why we don't need to check against assembled as we go along
+ processing_list += A.contents
+ assembled += A
+ return assembled
//Step-towards method of determining whether one atom can see another. Similar to viewers()
/proc/can_see(atom/source, atom/target, length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate.
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 7cddaf9a6f..79271d1d6d 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -251,7 +251,7 @@
to_chat(C, "You are no longer running on internals.")
icon_state = "internal0"
else
- if(!C.getorganslot("breathing_tube"))
+ if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
if(!istype(C.wear_mask, /obj/item/clothing/mask))
to_chat(C, "You are not wearing an internals mask!")
return 1
diff --git a/code/citadel/cit_miscreants.dm b/code/citadel/cit_miscreants.dm
index ec5ff0156f..7238283dc6 100644
--- a/code/citadel/cit_miscreants.dm
+++ b/code/citadel/cit_miscreants.dm
@@ -7,7 +7,7 @@
return
if(!crewMind.assigned_role)
return
- if(ROLE_MISCREANT in crewMind.current.client.prefs.be_special)
+ if(!(ROLE_MISCREANT in crewMind.current.client.prefs.be_special))
return
if(jobban_isbanned(crewMind, "Syndicate"))
return
diff --git a/code/citadel/custom_loadout/custom_items.dm b/code/citadel/custom_loadout/custom_items.dm
index 2c83912d0a..44f672e653 100644
--- a/code/citadel/custom_loadout/custom_items.dm
+++ b/code/citadel/custom_loadout/custom_items.dm
@@ -192,4 +192,9 @@
can_adjust = 0
+/obj/item/clothing/shoes/sneakers/pink
+ icon_state = "pink"
+ item_state = "pink"
+
+
diff --git a/code/controllers/subsystem/processing/overlays.dm b/code/controllers/subsystem/processing/overlays.dm
index fba4ebcaf0..c03b1eafb7 100644
--- a/code/controllers/subsystem/processing/overlays.dm
+++ b/code/controllers/subsystem/processing/overlays.dm
@@ -26,13 +26,32 @@ PROCESSING_SUBSYSTEM_DEF(overlays)
overlay_icon_cache = SSoverlays.overlay_icon_cache
processing = SSoverlays.processing
+#define COMPILE_OVERLAYS(A)\
+ var/list/oo = A.our_overlays;\
+ var/list/po = A.priority_overlays;\
+ if(LAZYLEN(po)){\
+ if(LAZYLEN(oo)){\
+ A.overlays = oo + po;\
+ }\
+ else{\
+ A.overlays = po;\
+ }\
+ }\
+ else if(LAZYLEN(oo)){\
+ A.overlays = oo;\
+ }\
+ else{\
+ A.overlays.Cut();\
+ }\
+ A.flags_1 &= ~OVERLAY_QUEUED_1
+
/datum/controller/subsystem/processing/overlays/fire(resumed = FALSE, mc_check = TRUE)
var/list/processing = src.processing
while(processing.len)
var/atom/thing = processing[processing.len]
processing.len--
if(thing)
- thing.compile_overlays()
+ COMPILE_OVERLAYS(thing)
if(mc_check)
if(MC_TICK_CHECK)
break
@@ -44,19 +63,6 @@ PROCESSING_SUBSYSTEM_DEF(overlays)
testing("Flushing [processing.len] overlays")
fire(mc_check = FALSE) //pair this thread up with the MC to get extra compile time
-/atom/proc/compile_overlays()
- var/list/oo = our_overlays
- var/list/po = priority_overlays
- if(LAZYLEN(po) && LAZYLEN(oo))
- overlays = oo + po
- else if(LAZYLEN(oo))
- overlays = oo
- else if(LAZYLEN(po))
- overlays = po
- else
- overlays.Cut()
- flags_1 &= ~OVERLAY_QUEUED_1
-
/proc/iconstate2appearance(icon, iconstate)
var/static/image/stringbro = new()
var/list/icon_states_cache = SSoverlays.overlay_icon_state_caches
diff --git a/code/datums/components/README.md b/code/datums/components/README.md
index 81218700c1..8d37e15de3 100644
--- a/code/datums/components/README.md
+++ b/code/datums/components/README.md
@@ -24,6 +24,10 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
## API
+### Defines
+
+1. `COMPONENT_INCOMPATIBLE` Return this from `/datum/component/Initialize` to have the component be deleted if it's applied to an incorrect type. `parent` must not be modified if this is to be returned.
+
### Vars
1. `/datum/var/list/datum_components` (private)
@@ -60,6 +64,7 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
* Sends the `COMSIG_COMPONENT_ADDED` signal to the datum
* All components a datum owns are deleted with the datum
* Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set
+ * If this tries to add an component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it
1. `/datum/proc/LoadComponent(component_type(type), ...) -> datum/component` (public, final)
* Equivalent to calling `GetComponent(component_type)` where, if the result would be `null`, returns `AddComponent(component_type, ...)` instead
1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract, async)
@@ -80,6 +85,7 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
* Component does not exist in `parent`'s `datum_components` list yet, although `parent` is set and may be used
* Signals will not be recieved while this function is running
* Component may be deleted after this function completes without being attached
+ * Do not call `qdel(src)` from this function
1. `/datum/component/Destroy()` (virtual, no-sleep)
* Sends the `COMSIG_COMPONENT_REMOVING` signal to the parent datum if the `parent` isn't being qdeleted
* Properly removes the component from `parent` and cleans up references
diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm
index a4c85f7816..2f70713c32 100644
--- a/code/datums/components/_component.dm
+++ b/code/datums/components/_component.dm
@@ -9,7 +9,10 @@
parent = P
var/list/arguments = args.Copy()
arguments.Cut(1, 2)
- Initialize(arglist(arguments))
+ if(Initialize(arglist(arguments)) == COMPONENT_INCOMPATIBLE)
+ parent = null
+ qdel(src)
+ return
var/dm = dupe_mode
if(dm != COMPONENT_DUPE_ALLOWED)
diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm
index c2afb34a9e..cc388f0b59 100644
--- a/code/datums/diseases/advance/symptoms/deafness.dm
+++ b/code/datums/diseases/advance/symptoms/deafness.dm
@@ -49,7 +49,7 @@ Bonus
to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]")
if(5)
if(power > 2)
- var/obj/item/organ/ears/ears = M.getorganslot("ears")
+ var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS)
if(istype(ears) && ears.ear_damage < UNHEALING_EAR_DAMAGE)
to_chat(M, "Your ears pop painfully and start bleeding!")
ears.ear_damage = max(ears.ear_damage, UNHEALING_EAR_DAMAGE)
diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm
index 84f9ef49cc..728dfa01d0 100644
--- a/code/datums/diseases/advance/symptoms/vision.dm
+++ b/code/datums/diseases/advance/symptoms/vision.dm
@@ -44,7 +44,7 @@ Bonus
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
- var/obj/item/organ/eyes/eyes = M.getorganslot("eye_sight")
+ var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if(istype(eyes))
switch(A.stage)
if(1, 2)
@@ -106,7 +106,7 @@ Bonus
if(!..())
return
var/mob/living/M = A.affected_mob
- var/obj/item/organ/eyes/eyes = M.getorganslot("eye_sight")
+ var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if (!eyes)
return
switch(A.stage)
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index 60a53967ae..98d2c9258a 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -20,7 +20,6 @@ GLOBAL_LIST_INIT(huds, list(
ANTAG_HUD_SINTOUCHED = new/datum/atom_hud/antag/hidden(),
ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(),
ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(),
- ANTAG_HUD_BORER = new/datum/atom_hud/antag(),
ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(),
))
diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
index 88b2b06878..e8c2f4f05e 100644
--- a/code/datums/looping_sounds/machinery_sounds.dm
+++ b/code/datums/looping_sounds/machinery_sounds.dm
@@ -6,4 +6,19 @@
end_sound = 'sound/machines/shower/shower_end.ogg'
volume = 25
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
\ No newline at end of file
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/supermatter
+ mid_sounds = list('sound/machines/sm/supermatter1.ogg'=1,'sound/machines/sm/supermatter2.ogg'=1,'sound/machines/sm/supermatter3.ogg'=1)
+ mid_length = 6
+ volume = 1
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/generator
+ start_sound = 'sound/machines/generator/generator_start.ogg'
+ start_length = 4
+ mid_sounds = list('sound/machines/generator/generator_mid1.ogg'=1, 'sound/machines/generator/generator_mid2.ogg'=1, 'sound/machines/generator/generator_mid3.ogg'=1)
+ mid_length = 4
+ end_sound = 'sound/machines/generator/generator_end.ogg'
+ volume = 40
\ No newline at end of file
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index dd389d46d4..3690de2c04 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -233,8 +233,9 @@
/datum/mind/proc/remove_rev()
var/datum/antagonist/rev/rev = has_antag_datum(/datum/antagonist/rev)
- remove_antag_datum(rev.type)
- special_role = null
+ if(rev)
+ remove_antag_datum(rev.type)
+ special_role = null
/datum/mind/proc/remove_antag_equip()
var/list/Mob_Contents = current.get_contents()
diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm
index cc031d70bb..a9fd77d1e2 100644
--- a/code/datums/spawners_menu.dm
+++ b/code/datums/spawners_menu.dm
@@ -23,8 +23,12 @@
for(var/spawner_obj in GLOB.mob_spawners[spawner])
this["refs"] += "\ref[spawner_obj]"
if(!this["desc"])
- var/obj/effect/mob_spawn/MS = spawner_obj
- this["desc"] = MS.flavour_text
+ if(istype(spawner_obj, /obj/effect/mob_spawn))
+ var/obj/effect/mob_spawn/MS = spawner_obj
+ this["desc"] = MS.flavour_text
+ else
+ var/obj/O = spawner_obj
+ this["desc"] = O.desc
this["amount_left"] = LAZYLEN(GLOB.mob_spawners[spawner])
data["spawners"] += list(this)
diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm
index 68ab30478d..21f74972c9 100644
--- a/code/game/area/areas/shuttles.dm
+++ b/code/game/area/areas/shuttles.dm
@@ -72,6 +72,10 @@
/area/shuttle/escape
name = "Emergency Shuttle"
+/area/shuttle/escape/luxury
+ name = "Luxurious Emergency Shuttle"
+ noteleport = TRUE
+
/area/shuttle/transport
name = "Transport Shuttle"
blob_allowed = FALSE
diff --git a/code/game/gamemodes/antag_spawner_cit.dm b/code/game/gamemodes/antag_spawner_cit.dm
index 34e72d9004..4cdc096072 100644
--- a/code/game/gamemodes/antag_spawner_cit.dm
+++ b/code/game/gamemodes/antag_spawner_cit.dm
@@ -26,7 +26,7 @@ obj/item/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner)
to_chat(B, "You are awake at last! Seek out whoever released you and aid them as best you can!")
if(new_objective)
to_chat(B, "Objective #[1]: [new_objective.explanation_text]")
- SSticker.mode.update_borer_icons_added(B)
+
/obj/item/antag_spawner/syndi_borer/proc/check_usability(mob/user)
if(used)
to_chat(user, "[src] appears to be empty!")
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index 59ed4ab2e8..76a37f9bb1 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -75,7 +75,7 @@
var/datum/changelingprofile/prof = mind.changeling.add_new_profile(C, src)
mind.changeling.first_prof = prof
- var/obj/item/organ/brain/B = C.getorganslot("brain")
+ var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN)
if(B)
B.vital = FALSE
B.decoy_override = TRUE
diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
index b2ddd022a4..f48464700f 100644
--- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
+++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
@@ -10,7 +10,7 @@
active = FALSE
/obj/effect/proc_holder/changeling/augmented_eyesight/on_purchase(mob/user) //The ability starts inactive, so we should be protected from flashes.
- var/obj/item/organ/eyes/E = user.getorganslot("eye_sight")
+ var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES)
if (E)
E.flash_protect = 2 //Adjust the user's eyes' flash protection
to_chat(user, "We adjust our eyes to protect them from bright lights.")
@@ -20,7 +20,7 @@
/obj/effect/proc_holder/changeling/augmented_eyesight/sting_action(mob/living/carbon/human/user)
if(!istype(user))
return
- var/obj/item/organ/eyes/E = user.getorganslot("eye_sight")
+ var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES)
if(E)
if(!active)
E.sight_flags |= SEE_MOBS | SEE_OBJS | SEE_TURFS //Add sight flags to the user's eyes
@@ -42,7 +42,7 @@
/obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) //Get rid of x-ray vision and flash protection when the user refunds this ability
- var/obj/item/organ/eyes/E = user.getorganslot("eye_sight")
+ var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES)
if(E)
if (active)
E.sight_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS
diff --git a/code/game/gamemodes/changeling/powers/regenerate.dm b/code/game/gamemodes/changeling/powers/regenerate.dm
index a74b966bd8..f2b13a5d09 100644
--- a/code/game/gamemodes/changeling/powers/regenerate.dm
+++ b/code/game/gamemodes/changeling/powers/regenerate.dm
@@ -27,7 +27,7 @@
C.emote("scream")
C.regenerate_limbs(1)
C.regenerate_organs()
- if(!user.getorganslot("brain"))
+ if(!user.getorganslot(ORGAN_SLOT_BRAIN))
var/obj/item/organ/brain/changeling_brain/B = new()
B.Insert(C)
if(ishuman(user))
diff --git a/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm b/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm
index 0b7738961a..ee782b1127 100644
--- a/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm
@@ -15,11 +15,14 @@
. = ..()
var/area/A = get_area(src)
if(A && construct_type)
- notify_ghosts("A [construct_name] chassis has been created in [A.name]!", 'sound/magic/clockwork/fellowship_armory.ogg', source = src, action = NOTIFY_ORBIT, flashwindow = FALSE)
+ notify_ghosts("A [construct_name] chassis has been created in [A.name]!", 'sound/magic/clockwork/fellowship_armory.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
GLOB.poi_list += src
+ LAZYADD(GLOB.mob_spawners[name], src)
/obj/item/clockwork/construct_chassis/Destroy()
GLOB.poi_list -= src
+ var/list/spawners = GLOB.mob_spawners[name]
+ LAZYREMOVE(spawners, src)
. = ..()
/obj/item/clockwork/construct_chassis/examine(mob/user)
@@ -37,6 +40,7 @@
if(!SSticker.mode)
to_chat(user, "You cannot use that before the game has started.")
return
+ user.forceMove(get_turf(src)) //If we attack through the alert, jump to the chassis so we know what we're getting into
if(alert(user, "Become a [construct_name]? You can no longer be cloned!", construct_name, "Yes", "Cancel") == "Cancel")
return
if(QDELETED(src))
diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm
index 37933514f8..bd9c52b19f 100644
--- a/code/game/gamemodes/clock_cult/clock_mobs.dm
+++ b/code/game/gamemodes/clock_cult/clock_mobs.dm
@@ -54,8 +54,14 @@
else
msg += "[t_He] look[t_s] severely dented!\n"
msg += ""
+ var/addendum = examine_info()
+ if(addendum)
+ msg += "[addendum]\n"
msg += "*---------*"
to_chat(user, msg)
+/mob/living/simple_animal/hostile/clockwork/proc/examine_info() //Override this on a by-mob basis to have unique examine info
+ return
+
/mob/living/simple_animal/hostile/clockwork/proc/update_values() //This is called by certain things to check GLOB.ratvar_awakens and GLOB.ratvar_approaches
diff --git a/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm b/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm
index a0396fdec2..1fabeeba3f 100644
--- a/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm
+++ b/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm
@@ -1,3 +1,6 @@
+#define MARAUDER_SLOWDOWN_PERCENTAGE 0.40 //Below this percentage of health, marauders will become slower
+#define MARAUDER_SHIELD_REGEN_TIME 100 //In deciseconds, how long it takes for shields to regenerate after breaking
+
//Clockwork marauder: A well-rounded frontline construct. Only one can exist for every two human servants.
/mob/living/simple_animal/hostile/clockwork/marauder
name = "clockwork marauder"
@@ -20,9 +23,26 @@
playstyle_string = "You are a clockwork marauder, a well-rounded frontline construct of Ratvar. Although you have no \
unique abilities, you're a fearsome fighter in one-on-one combat, and your shield protects from projectiles!
Obey the Servants and do as they \
tell you. Your primary goal is to defend the Ark from destruction; they are your allies in this, and should be protected from harm."
- empower_string = "The Anima Bulwark's power flows through you! Your weapon will strike harder, your armor is sturdier, and your shield is considerably more \
- likely to deflect shots."
+ empower_string = "The Anima Bulwark's power flows through you! Your weapon will strike harder, your armor is sturdier, and your shield is more durable."
var/deflect_chance = 40 //Chance to deflect any given projectile (non-damaging energy projectiles are always deflected)
+ var/max_shield_health = 3
+ var/shield_health = 3 //Amount of projectiles that can be deflected within
+ var/shield_health_regen = 0 //When world.time equals this, shield health will regenerate
+
+/mob/living/simple_animal/hostile/clockwork/marauder/examine_info()
+ if(!shield_health)
+ return "Its shield has been destroyed!"
+
+/mob/living/simple_animal/hostile/clockwork/marauder/Life()
+ ..()
+ if(!GLOB.ratvar_awakens && health / maxHealth <= MARAUDER_SLOWDOWN_PERCENTAGE)
+ speed = initial(speed) + 1 //Yes, this slows them down
+ else
+ speed = initial(speed)
+ if(shield_health != max_shield_health && world.time >= shield_health_regen)
+ to_chat(src, "Your shield has recovered. [max_shield_health] blocks remaining!")
+ playsound_local(src, "shatter", 75, TRUE, frequency = -1)
+ shield_health = max_shield_health
/mob/living/simple_animal/hostile/clockwork/marauder/update_values()
if(GLOB.ratvar_awakens) //Massive attack damage bonuses and health increase, because Ratvar
@@ -33,6 +53,7 @@
attacktext = "devastates"
speed = -1
obj_damage = 100
+ max_shield_health = INFINITY
else if(GLOB.ratvar_approaches) //Hefty health bonus and slight attack damage increase
health = 200
maxHealth = 200
@@ -40,6 +61,7 @@
melee_damage_lower = 15
attacktext = "carves"
obj_damage = 50
+ max_shield_health = 4
/mob/living/simple_animal/hostile/clockwork/marauder/death(gibbed)
visible_message("[src]'s equipment clatters lifelessly to the ground as the red flames within dissipate.", \
@@ -64,21 +86,21 @@
return ..()
/mob/living/simple_animal/hostile/clockwork/marauder/proc/deflect_projectile(obj/item/projectile/P)
- var/final_deflection_chance = deflect_chance
+ if(!shield_health)
+ return
var/energy_projectile = istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)
- if(P.nodamage || P.damage_type == STAMINA)
- final_deflection_chance = 100
- else if(!energy_projectile) //Flat 40% chance against energy projectiles; ballistic projectiles are 40% - (damage of projectile)%, min. 10%
- final_deflection_chance = max(10, deflect_chance - P.damage)
- if(GLOB.ratvar_awakens)
- final_deflection_chance = 100
- else if(GLOB.ratvar_approaches)
- final_deflection_chance = min(100, final_deflection_chance + 20) //20% bonus to deflection if the servants heralded Ratvar
- if(prob(final_deflection_chance))
- visible_message("[src] deflects [P] with their shield!", \
- "You block [P] with your shield!")
- if(energy_projectile)
- playsound(src, 'sound/weapons/effects/searwall.ogg', 50, TRUE)
- else
- playsound(src, "ricochet", 50, TRUE)
- . = TRUE
+ visible_message("[src] deflects [P] with their shield!", \
+ "You block [P] with your shield! Blocks left: [shield_health - 1]")
+ if(energy_projectile)
+ playsound(src, 'sound/weapons/effects/searwall.ogg', 50, TRUE)
+ else
+ playsound(src, "ricochet", 50, TRUE)
+ shield_health--
+ if(!shield_health)
+ visible_message("[src]'s shield breaks from deflecting the attack!", "Your shield breaks! Give it some time to recover...")
+ playsound(src, "shatter", 100, TRUE)
+ shield_health_regen = world.time + MARAUDER_SHIELD_REGEN_TIME
+ return TRUE
+
+#undef MARAUDER_SLOWDOWN_PERCENTAGE
+#undef MARAUDER_SHIELD_REGEN_TIME
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
index a219d64666..a282ac3067 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
@@ -236,7 +236,7 @@
if(A.outdoors || A.map_name == "Space" || !A.blob_allowed)
to_chat(invoker, "Stargazers can't be built off-station.")
return
- return TRUE
+ return ..()
//Integration Cog: Creates an integration cog that can be inserted into APCs to passively siphon power.
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 3a7f99bc8a..8fead855b2 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -491,7 +491,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/restraints/handcuffs/energy
name = "hard-light energy field"
desc = "A hard-light field restraining the hands."
- icon_state = "cuff_white" // Needs sprite
+ icon_state = "cuff" // Needs sprite
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
breakouttime = 450
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index aaeee27985..f80a5e3402 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -415,7 +415,6 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
victim = C
forceMove(victim)
- SSticker.mode.update_borer_icons_added_host(victim.mind)
RemoveBorerActions()
GrantInfestActions()
@@ -591,7 +590,6 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
var/mob/living/V = victim
V.verbs -= /mob/living/proc/borer_comm
talk_to_borer_action.Remove(victim)
- SSticker.mode.update_borer_icons_removed_host(victim.mind)
victim = null
return
@@ -1099,27 +1097,3 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
/datum/action/innate/borer/jumpstart_host/Activate()
var/mob/living/simple_animal/borer/B = owner
B.jumpstart()
-
-
-//HUD STUFF
-/datum/game_mode/proc/update_borer_icons_added(datum/mind/borer_mind)
- var/datum/atom_hud/antag/borerhud = GLOB.huds[ANTAG_HUD_BORER]
- borerhud.join_hud(borer_mind.current)
- set_antag_hud(borer_mind.current, "hudbrainworm")
-
-/datum/game_mode/proc/update_borer_icons_removed(datum/mind/borer_mind)
- var/datum/atom_hud/antag/borerhud = GLOB.huds[ANTAG_HUD_BORER]
- borerhud.leave_hud(borer_mind.current)
- set_antag_hud(borer_mind.current, null)
-
-/datum/game_mode/proc/update_borer_icons_added_host(datum/mind/host_mind)
- var/datum/atom_hud/antag/hosthud = GLOB.huds[ANTAG_HUD_BORER] //Invisible to self
- hosthud.self_visible = FALSE
- hosthud.join_hud(host_mind.current)
- set_antag_hud(host_mind.current, "hudbrainworm")
-
-/datum/game_mode/proc/update_borer_icons_removed_host(datum/mind/host_mind)
- var/datum/atom_hud/antag/hosthud = GLOB.huds[ANTAG_HUD_BORER] //Invisible to self
- hosthud.self_visible = FALSE //Probably not needed as we're deleting?
- hosthud.leave_hud(host_mind.current)
- set_antag_hud(host_mind.current, null)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 86e69b8973..cb5ea9df76 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -163,7 +163,7 @@
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
if(clonemind.changeling)
- var/obj/item/organ/brain/B = H.getorganslot("brain")
+ var/obj/item/organ/brain/B = H.getorganslot(ORGAN_SLOT_BRAIN)
B.vital = FALSE
B.decoy_override = TRUE
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 9207d39f1b..5d529defea 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -10,7 +10,7 @@ Buildable meters
/obj/item/pipe
name = "pipe"
desc = "A pipe."
- var/pipe_type = 0
+ var/pipe_type
var/pipename
force = 7
throwforce = 7
@@ -19,35 +19,22 @@ Buildable meters
item_state = "buildpipe"
w_class = WEIGHT_CLASS_NORMAL
level = 2
- var/flipped = FALSE
- var/is_bent = FALSE
var/piping_layer = PIPING_LAYER_DEFAULT
+ var/RPD_type //TEMP: kill this once RPDs get a rewrite pls
- var/static/list/pipe_types = list(
- PIPE_SIMPLE, \
- PIPE_LAYER_MANIFOLD, \
- PIPE_MANIFOLD, \
- PIPE_4WAYMANIFOLD, \
- PIPE_HE, \
- PIPE_HE_MANIFOLD, \
- PIPE_HE_4WAYMANIFOLD, \
- PIPE_JUNCTION, \
- \
- PIPE_CONNECTOR, \
- PIPE_UVENT, \
- PIPE_SCRUBBER, \
- PIPE_INJECTOR, \
- PIPE_HEAT_EXCHANGE, \
- \
- PIPE_PUMP, \
- PIPE_PASSIVE_GATE, \
- PIPE_VOLUME_PUMP, \
- PIPE_MVALVE, \
- PIPE_DVALVE, \
- \
- PIPE_GAS_FILTER, \
- PIPE_GAS_MIXER, \
- )
+/obj/item/pipe/directional
+ RPD_type = PIPE_UNARY
+/obj/item/pipe/binary
+ RPD_type = PIPE_BINARY
+/obj/item/pipe/binary/bendable
+ RPD_type = PIPE_BENDABLE
+/obj/item/pipe/trinary
+ RPD_type = PIPE_TRINARY
+/obj/item/pipe/trinary/flippable
+ RPD_type = PIPE_TRIN_M
+ var/flipped = FALSE
+/obj/item/pipe/quaternary
+ RPD_type = PIPE_QUAD
/obj/item/pipe/examine(mob/user)
..()
@@ -55,35 +42,27 @@ Buildable meters
/obj/item/pipe/Initialize(mapload, _pipe_type, _dir, obj/machinery/atmospherics/make_from)
if(make_from)
- setDir(make_from.dir)
- pipename = make_from.name
- add_atom_colour(make_from.color, FIXED_COLOUR_PRIORITY)
-
- if(make_from.type in pipe_types)
- pipe_type = make_from.type
- setPipingLayer(make_from.piping_layer)
- else //make pipe_type a value we can work with
- for(var/P in pipe_types)
- if(istype(make_from, P))
- pipe_type = P
- break
-
- var/obj/machinery/atmospherics/components/trinary/triP = make_from
- if(istype(triP) && triP.flipped)
- flipped = TRUE
- setDir(turn(dir, -45))
+ make_from_existing(make_from)
else
pipe_type = _pipe_type
setDir(_dir)
- if(_dir in GLOB.diagonals)
- is_bent = TRUE
-
update()
- pixel_x = rand(-5, 5)
- pixel_y = rand(-5, 5)
+ pixel_x += rand(-5, 5)
+ pixel_y += rand(-5, 5)
return ..()
+/obj/item/pipe/proc/make_from_existing(obj/machinery/atmospherics/make_from)
+ setDir(make_from.dir)
+ pipename = make_from.name
+ add_atom_colour(make_from.color, FIXED_COLOUR_PRIORITY)
+ pipe_type = make_from.type
+
+/obj/item/pipe/trinary/flippable/make_from_existing(obj/machinery/atmospherics/components/trinary/make_from)
+ ..()
+ if(make_from.flipped)
+ do_a_flip()
+
/obj/item/pipe/dropped()
if(loc)
setPipingLayer(piping_layer)
@@ -91,73 +70,19 @@ Buildable meters
/obj/item/pipe/proc/setPipingLayer(new_layer = PIPING_LAYER_DEFAULT)
var/obj/machinery/atmospherics/fakeA = get_pipe_cache(pipe_type)
- var/nolayer = (fakeA.pipe_flags & PIPING_ALL_LAYER)
- if(nolayer)
+
+ if(fakeA.pipe_flags & PIPING_ALL_LAYER)
new_layer = PIPING_LAYER_DEFAULT
piping_layer = new_layer
- if(pipe_type != PIPE_LAYER_MANIFOLD)
- pixel_x = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X
- pixel_y = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y
- layer = initial(layer) + ((piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE)
-//update the name and icon of the pipe item depending on the type
-GLOBAL_LIST_INIT(pipeID2State, list(
- "[PIPE_SIMPLE]" = "simple", \
- "[PIPE_MANIFOLD]" = "manifold", \
- "[PIPE_LAYER_MANIFOLD]" = "layer_manifold", \
- "[PIPE_4WAYMANIFOLD]" = "manifold4w", \
- "[PIPE_HE]" = "he", \
- "[PIPE_HE_MANIFOLD]" = "he_manifold", \
- "[PIPE_HE_4WAYMANIFOLD]" = "he_manifold4w", \
- "[PIPE_JUNCTION]" = "junction", \
- \
- "[PIPE_CONNECTOR]" = "connector", \
- "[PIPE_UVENT]" = "uvent", \
- "[PIPE_SCRUBBER]" = "scrubber", \
- "[PIPE_INJECTOR]" = "injector", \
- "[PIPE_HEAT_EXCHANGE]" = "heunary", \
- \
- "[PIPE_PUMP]" = "pump", \
- "[PIPE_PASSIVE_GATE]" = "passivegate", \
- "[PIPE_VOLUME_PUMP]" = "volumepump", \
- "[PIPE_MVALVE]" = "mvalve", \
- "[PIPE_DVALVE]" = "dvalve", \
- \
- "[PIPE_GAS_FILTER]" = "filter", \
- "[PIPE_GAS_MIXER]" = "mixer", \
-))
+ pixel_x += (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X
+ pixel_y += (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y
+ layer = initial(layer) + ((piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE)
/obj/item/pipe/proc/update()
- var/list/nlist = list(\
- "[PIPE_SIMPLE]" = "pipe", \
- "[PIPE_SIMPLE]_b" = "bent pipe", \
- "[PIPE_MANIFOLD]" = "manifold", \
- "[PIPE_LAYER_MANIFOLD]" = "layer manifold", \
- "[PIPE_4WAYMANIFOLD]" = "4-way manifold", \
- "[PIPE_HE]" = "h/e pipe", \
- "[PIPE_HE]_b" = "bent h/e pipe", \
- "[PIPE_HE_MANIFOLD]" = "h/e manifold", \
- "[PIPE_HE_4WAYMANIFOLD]"= "h/e 4-way manifold", \
- "[PIPE_JUNCTION]" = "junction", \
- \
- "[PIPE_CONNECTOR]" = "connector", \
- "[PIPE_UVENT]" = "vent", \
- "[PIPE_SCRUBBER]" = "scrubber", \
- "[PIPE_INJECTOR]" = "injector", \
- "[PIPE_HEAT_EXCHANGE]" = "heat exchanger", \
- \
- "[PIPE_PUMP]" = "pump", \
- "[PIPE_PASSIVE_GATE]" = "passive gate", \
- "[PIPE_VOLUME_PUMP]" = "volume pump", \
- "[PIPE_MVALVE]" = "manual valve", \
- "[PIPE_DVALVE]" = "digital valve", \
- \
- "[PIPE_GAS_FILTER]" = "gas filter", \
- "[PIPE_GAS_MIXER]" = "gas mixer", \
- )
- //fix_pipe_type()
- name = nlist["[pipe_type][is_bent ? "_b" : ""]"] + " fitting"
- icon_state = GLOB.pipeID2State["[pipe_type]"]
+ var/obj/machinery/atmospherics/A = get_pipe_cache(pipe_type)
+ name = "[A.name] fitting"
+ icon_state = A.pipe_state
// rotate the pipe item clockwise
@@ -170,11 +95,8 @@ GLOBAL_LIST_INIT(pipeID2State, list(
return
setDir(turn(dir, -90))
-
fixdir()
- return
-
/obj/item/pipe/verb/flip()
set category = "Object"
set name = "Flip Pipe"
@@ -183,16 +105,15 @@ GLOBAL_LIST_INIT(pipeID2State, list(
if ( usr.stat || usr.restrained() || !usr.canmove )
return
- if (pipe_type in list(PIPE_GAS_FILTER, PIPE_GAS_MIXER))
- setDir(turn(dir, flipped )? 45 : -45)
- flipped = !flipped
- return
+ do_a_flip()
+/obj/item/pipe/proc/do_a_flip()
setDir(turn(dir, -180))
-
fixdir()
- return
+/obj/item/pipe/trinary/flippable/do_a_flip()
+ setDir(turn(dir, flipped ? 45 : -45))
+ flipped = !flipped
/obj/item/pipe/AltClick(mob/user)
..()
@@ -207,21 +128,21 @@ GLOBAL_LIST_INIT(pipeID2State, list(
/obj/item/pipe/Move()
var/old_dir = dir
..()
- setDir(old_dir )//pipes changing direction when moved is just annoying and buggy
-
-/obj/item/pipe/proc/unflip(direction)
- if(direction in GLOB.diagonals)
- return turn(direction, 45)
-
- return direction
+ setDir(old_dir) //pipes changing direction when moved is just annoying and buggy
//Helper to clean up dir
/obj/item/pipe/proc/fixdir()
- if((pipe_type in list (PIPE_SIMPLE, PIPE_HE, PIPE_MVALVE, PIPE_DVALVE, PIPE_LAYER_MANIFOLD)) && !is_bent)
- if(dir==SOUTH)
- setDir(NORTH)
- else if(dir==WEST)
- setDir(EAST)
+ return
+
+/obj/item/pipe/binary/fixdir()
+ if(dir == SOUTH)
+ setDir(NORTH)
+ else if(dir == WEST)
+ setDir(EAST)
+
+/obj/item/pipe/trinary/flippable/fixdir()
+ if(dir in GLOB.diagonals)
+ setDir(turn(dir, 45))
/obj/item/pipe/attack_self(mob/user)
return rotate()
@@ -245,16 +166,14 @@ GLOBAL_LIST_INIT(pipeID2State, list(
add_fingerprint(user)
fixdir()
- if(pipe_type in list(PIPE_GAS_MIXER, PIPE_GAS_FILTER))
- setDir(unflip(dir))
var/obj/machinery/atmospherics/fakeA = get_pipe_cache(pipe_type, dir)
for(var/obj/machinery/atmospherics/M in loc)
- if((M.pipe_flags & PIPING_ONE_PER_TURF) && (fakeA.pipe_flags & PIPING_ONE_PER_TURF)) //Only one dense/requires density object per tile, eg connectors/cryo/heater/coolers.
+ if((M.pipe_flags & fakeA.pipe_flags & PIPING_ONE_PER_TURF)) //Only one dense/requires density object per tile, eg connectors/cryo/heater/coolers.
to_chat(user, "Something is hogging the tile!")
return TRUE
- if((M.piping_layer != piping_layer) && !((M.pipe_flags & PIPING_ALL_LAYER) || (pipe_type == PIPE_LAYER_MANIFOLD)))
+ if((M.piping_layer != piping_layer) && !((M.pipe_flags | fakeA.pipe_flags) & PIPING_ALL_LAYER)) //don't continue if either pipe goes across all layers
continue
if(M.GetInitDirections() & fakeA.GetInitDirections()) // matches at least one direction on either type of pipe
to_chat(user, "There is already a pipe at that location!")
@@ -262,16 +181,8 @@ GLOBAL_LIST_INIT(pipeID2State, list(
// no conflicts found
var/obj/machinery/atmospherics/A = new pipe_type(loc)
- A.setDir(dir)
- A.SetInitDirections()
-
- if(pipename)
- A.name = pipename
-
- var/obj/machinery/atmospherics/components/trinary/T = A
- if(istype(T))
- T.flipped = flipped
- A.on_construction(pipe_type, color, piping_layer)
+ build_pipe(A)
+ A.on_construction(color, piping_layer)
playsound(src, W.usesound, 50, 1)
user.visible_message( \
@@ -281,20 +192,28 @@ GLOBAL_LIST_INIT(pipeID2State, list(
qdel(src)
-/obj/item/pipe/suicide_act(mob/user)
- if(pipe_type in list(PIPE_PUMP, PIPE_PASSIVE_GATE, PIPE_VOLUME_PUMP))
- user.visible_message("[user] shoves [src] in [user.p_their()] mouth and turns it on! It looks like [user.p_theyre()] trying to commit suicide!")
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- for(var/i=1 to 20)
- C.vomit(0, TRUE, FALSE, 4, FALSE)
- if(prob(20))
- C.spew_organ()
- sleep(5)
- C.blood_volume = 0
- return(OXYLOSS|BRUTELOSS)
- else
- return ..()
+/obj/item/pipe/proc/build_pipe(obj/machinery/atmospherics/A)
+ A.setDir(dir)
+ A.SetInitDirections()
+
+ if(pipename)
+ A.name = pipename
+
+/obj/item/pipe/trinary/flippable/build_pipe(obj/machinery/atmospherics/components/trinary/T)
+ ..()
+ T.flipped = flipped
+
+/obj/item/pipe/directional/suicide_act(mob/user)
+ user.visible_message("[user] shoves [src] in [user.p_their()] mouth and turns it on! It looks like [user.p_theyre()] trying to commit suicide!")
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ for(var/i=1 to 20)
+ C.vomit(0, TRUE, FALSE, 4, FALSE)
+ if(prob(20))
+ C.spew_organ()
+ sleep(5)
+ C.blood_volume = 0
+ return(OXYLOSS|BRUTELOSS)
/obj/item/pipe_meter
name = "meter"
@@ -332,4 +251,3 @@ GLOBAL_LIST_INIT(pipeID2State, list(
piping_layer = new_layer
pixel_x = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X
pixel_y = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y
-
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index c224097b36..fda66624b7 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -17,30 +17,30 @@
var/dat = {"
PIPING LAYER: --[piping_layer]++
Pipes:
-Pipe
-Bent Pipe
-Manifold
-Layer Manifold
-4-Way Manifold
-Manual Valve
-Digital Valve
+Pipe
+Bent Pipe
+Manifold
+Layer Manifold
+4-Way Manifold
+Manual Valve
+Digital Valve
Devices:
-Connector
-Vent
-Gas Pump
-Passive Gate
-Volume Pump
-Scrubber
+Connector
+Vent
+Gas Pump
+Passive Gate
+Volume Pump
+Scrubber
Meter
-Gas Filter
-Gas Mixer
+Gas Filter
+Gas Mixer
Heat exchange:
-Pipe
-Bent Pipe
-Manifold
-4-Way Manifold
-Junction
-Heat Exchanger
+Pipe
+Bent Pipe
+Manifold
+4-Way Manifold
+Junction
+Heat Exchanger
"}
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index d8de939514..2bc3d3eaff 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -408,8 +408,7 @@
return reset()
if(!use_cable(1))
return reset()
- var/obj/structure/cable/NC = new(new_turf)
- NC.cableColor("red")
+ var/obj/structure/cable/NC = new(new_turf, "red")
NC.d1 = 0
NC.d2 = fdirn
NC.update_icon()
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 8861376e07..42aec1582e 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -135,9 +135,10 @@
var/obj/item/clothing/shoes/S = H.shoes
if(S && S.bloody_shoes[blood_state])
S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
- entered_dirs|= H.dir
- shoe_types |= H.shoes.type
- update_icon()
+ shoe_types |= S.type
+ if (!(entered_dirs & H.dir))
+ entered_dirs |= H.dir
+ update_icon()
/obj/effect/decal/cleanable/blood/footprints/Uncrossed(atom/movable/O)
..()
@@ -146,9 +147,11 @@
var/obj/item/clothing/shoes/S = H.shoes
if(S && S.bloody_shoes[blood_state])
S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
- exited_dirs|= H.dir
- shoe_types |= H.shoes.type
- update_icon()
+ shoe_types |= S.type
+ if (!(exited_dirs & H.dir))
+ exited_dirs |= H.dir
+ update_icon()
+
/obj/effect/decal/cleanable/blood/footprints/update_icon()
cut_overlays()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 2ad2a74a2d..12e7cda9fa 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -519,7 +519,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
M.adjust_blurriness(3)
M.adjust_eye_damage(rand(2,4))
- var/obj/item/organ/eyes/eyes = M.getorganslot("eye_sight")
+ var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if (!eyes)
return
if(eyes.eye_damage >= 10)
diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm
index e0890ee094..585f632f80 100644
--- a/code/game/objects/items/RPD.dm
+++ b/code/game/objects/items/RPD.dm
@@ -4,12 +4,6 @@
CONTAINS:
RPD
*/
-#define PIPE_BINARY 0
-#define PIPE_BENDABLE 1
-#define PIPE_TRINARY 2
-#define PIPE_TRIN_M 3
-#define PIPE_UNARY 4
-#define PIPE_QUAD 5
#define PAINT_MODE -2
#define EATING_MODE -1
@@ -22,23 +16,29 @@ RPD
/datum/pipe_info
var/id=-1
- var/categoryId = CATEGORY_ATMOS
+ var/categoryId
var/dir=SOUTH
var/dirtype = PIPE_BENDABLE
- var/icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi'
- var/icon_state=""
+ var/icon
+ var/icon_state
var/selected=0
-/datum/pipe_info/New(pid,direction,dt)
- id=pid
- icon_state=GLOB.pipeID2State["[pid]"]
- dir = direction
- dirtype=dt
+/datum/pipe_info/pipe
+ categoryId = CATEGORY_ATMOS
+ icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi'
+
+/datum/pipe_info/pipe/New(obj/machinery/atmospherics/path)
+ id = path
+ icon_state = initial(path.pipe_state)
+ dirtype = initial(path.construction_type)
/datum/pipe_info/proc/Render(dispenser,label)
+
+/datum/pipe_info/pipe/Render(dispenser,label,dir=NORTH)
return "
[label]"
/datum/pipe_info/meter
+ categoryId = CATEGORY_ATMOS
icon = 'icons/obj/atmospherics/pipes/simple.dmi'
icon_state = "meterX"
@@ -64,7 +64,6 @@ GLOBAL_LIST_INIT(disposalpipeID2State, list(
/datum/pipe_info/disposal
categoryId = CATEGORY_DISPOSALS
icon = 'icons/obj/atmospherics/pipes/disposal.dmi'
- icon_state = "meterX"
/datum/pipe_info/disposal/New(var/pid,var/dt)
id=pid
@@ -80,33 +79,31 @@ GLOBAL_LIST_INIT(disposalpipeID2State, list(
//find these defines in code\game\machinery\pipe\consruction.dm
GLOBAL_LIST_INIT(RPD_recipes, list(
"Pipes" = list(
- "Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 1, PIPE_BENDABLE),
- //"Bent Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 5, PIPE_BENT),
- "Manifold" = new /datum/pipe_info(PIPE_MANIFOLD, 1, PIPE_TRINARY),
- "Manual Valve" = new /datum/pipe_info(PIPE_MVALVE, 1, PIPE_BINARY),
- "Digital Valve" = new /datum/pipe_info(PIPE_DVALVE, 1, PIPE_BINARY),
- "4-Way Manifold" = new /datum/pipe_info(PIPE_4WAYMANIFOLD, 1, PIPE_QUAD),
- "Layer Manifold" = new /datum/pipe_info(PIPE_LAYER_MANIFOLD, 1, PIPE_BINARY),
+ "Pipe" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/pipe/simple),
+ "Manifold" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/pipe/manifold),
+ "Manual Valve" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/binary/valve),
+ "Digital Valve" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/binary/valve/digital),
+ "4-Way Manifold" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/pipe/manifold4w),
+ "Layer Manifold" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/pipe/layer_manifold),
),
- "Devices"=list(
- "Connector" = new /datum/pipe_info(PIPE_CONNECTOR, 1, PIPE_UNARY),
- "Unary Vent" = new /datum/pipe_info(PIPE_UVENT, 1, PIPE_UNARY),
- "Gas Pump" = new /datum/pipe_info(PIPE_PUMP, 1, PIPE_UNARY),
- "Passive Gate" = new /datum/pipe_info(PIPE_PASSIVE_GATE, 1, PIPE_UNARY),
- "Volume Pump" = new /datum/pipe_info(PIPE_VOLUME_PUMP, 1, PIPE_UNARY),
- "Scrubber" = new /datum/pipe_info(PIPE_SCRUBBER, 1, PIPE_UNARY),
- "Injector" = new /datum/pipe_info(PIPE_INJECTOR, 1, PIPE_UNARY),
+ "Devices" = list(
+ "Connector" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/unary/portables_connector),
+ "Unary Vent" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/unary/vent_pump),
+ "Gas Pump" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/binary/pump),
+ "Passive Gate" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/binary/passive_gate),
+ "Volume Pump" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/binary/volume_pump),
+ "Scrubber" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/unary/vent_scrubber),
+ "Injector" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/unary/outlet_injector),
"Meter" = new /datum/pipe_info/meter(),
- "Gas Filter" = new /datum/pipe_info(PIPE_GAS_FILTER, 1, PIPE_TRIN_M),
- "Gas Mixer" = new /datum/pipe_info(PIPE_GAS_MIXER, 1, PIPE_TRIN_M),
+ "Gas Filter" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/trinary/filter),
+ "Gas Mixer" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/trinary/mixer),
),
"Heat Exchange" = list(
- "Pipe" = new /datum/pipe_info(PIPE_HE, 1, PIPE_BENDABLE),
- //"Bent Pipe" = new /datum/pipe_info(PIPE_HE, 5, PIPE_BENT),
- "Manifold" = new /datum/pipe_info(PIPE_HE_MANIFOLD, 1, PIPE_TRINARY),
- "4-Way Manifold" = new /datum/pipe_info(PIPE_HE_4WAYMANIFOLD, 1, PIPE_QUAD),
- "Junction" = new /datum/pipe_info(PIPE_JUNCTION, 1, PIPE_UNARY),
- "Heat Exchanger" = new /datum/pipe_info(PIPE_HEAT_EXCHANGE, 1, PIPE_UNARY),
+ "Pipe" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/pipe/heat_exchanging/simple),
+ "Manifold" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/pipe/heat_exchanging/manifold),
+ "4-Way Manifold" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w),
+ "Junction" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/pipe/heat_exchanging/junction),
+ "Heat Exchanger" = new /datum/pipe_info/pipe(/obj/machinery/atmospherics/components/unary/heat_exchanger),
),
"Disposal Pipes" = list(
"Pipe" = new /datum/pipe_info/disposal(DISP_PIPE_STRAIGHT, PIPE_BINARY),
@@ -120,6 +117,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list(
"Sort Junction" = new /datum/pipe_info/disposal(DISP_SORTJUNCTION, PIPE_TRINARY),
)
))
+
/obj/item/pipe_dispenser
name = "Rapid Piping Device (RPD)"
desc = "A device used to rapidly pipe things."
@@ -137,7 +135,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list(
resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/working = 0
- var/p_type = PIPE_SIMPLE
+ var/p_type = /obj/machinery/atmospherics/pipe/simple
var/p_conntype = PIPE_BENDABLE
var/p_dir = 1
var/p_flipped = 0
@@ -201,7 +199,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list(
if(screen == CATEGORY_ATMOS)
dat += "Atmospherics Disposals
"
else if(screen == CATEGORY_DISPOSALS)
- dat += "Atmospherics Disposals
"
+ dat += "Atmospherics Disposals
"
var/generated_layer_list = ""
var/layers_total = PIPING_LAYER_MAX - PIPING_LAYER_MIN + 1
for(var/iter = PIPING_LAYER_MIN, iter <= layers_total, iter++)
@@ -220,9 +218,9 @@ GLOBAL_LIST_INIT(RPD_recipes, list(
var/datum/pipe_info/I = cat[label]
var/found=0
if(I.id == p_type)
- if((p_class == ATMOS_MODE || p_class == METER_MODE) && (I.type == /datum/pipe_info || I.type == /datum/pipe_info/meter))
+ if((p_class == ATMOS_MODE || p_class == METER_MODE) && (istype(I, /datum/pipe_info/pipe) || istype(I, /datum/pipe_info/meter)))
found=1
- else if(p_class == DISPOSALS_MODE && I.type==/datum/pipe_info/disposal)
+ else if(p_class == DISPOSALS_MODE && istype(I, /datum/pipe_info/disposal))
found=1
if(found)
preview=new /icon(I.icon,I.icon_state)
@@ -510,7 +508,8 @@ GLOBAL_LIST_INIT(RPD_recipes, list(
if(href_list["makepipe"])
p_type = text2path(href_list["makepipe"])
p_dir = text2num(href_list["dir"])
- p_conntype = text2num(href_list["type"])
+ var/obj/item/pipe/path = text2path(href_list["type"])
+ p_conntype = initial(path.RPD_type)
p_class = ATMOS_MODE
spark_system.start()
playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0)
@@ -581,7 +580,9 @@ GLOBAL_LIST_INIT(RPD_recipes, list(
if(do_after(user, 2, target = A))
activate()
var/obj/item/pipe/P = new(A, queued_p_type, queued_p_dir)
- P.flipped = queued_p_flipped
+ if(queued_p_flipped)
+ var/obj/item/pipe/trinary/flippable/F = P
+ F.flipped = queued_p_flipped
P.update()
P.add_fingerprint(usr)
if(!isnull(temp_piping_layer))
@@ -627,12 +628,6 @@ GLOBAL_LIST_INIT(RPD_recipes, list(
/obj/item/pipe_dispenser/proc/activate()
playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1)
-#undef PIPE_BINARY
-#undef PIPE_BENT
-#undef PIPE_TRINARY
-#undef PIPE_TRIN_M
-#undef PIPE_UNARY
-#undef PIPE_QUAD
#undef PAINT_MODE
#undef EATING_MODE
#undef ATMOS_MODE
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index 378d6ebabd..c961d77bf1 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -1,126 +1,126 @@
-/obj/item/airlock_painter
- name = "airlock painter"
- desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on an airlock during or after construction to change the paintjob."
- icon = 'icons/obj/objects.dmi'
- icon_state = "paint sprayer"
- item_state = "paint sprayer"
-
- w_class = WEIGHT_CLASS_SMALL
-
- materials = list(MAT_METAL=50, MAT_GLASS=50)
- origin_tech = "engineering=2"
-
- flags_1 = CONDUCT_1 | NOBLUDGEON_1
- slot_flags = SLOT_BELT
-
- var/obj/item/device/toner/ink = null
-
-/obj/item/airlock_painter/New()
- ..()
- ink = new /obj/item/device/toner(src)
-
-//This proc doesn't just check if the painter can be used, but also uses it.
-//Only call this if you are certain that the painter will be used right after this check!
-/obj/item/airlock_painter/proc/use(mob/user)
- if(can_use(user))
- ink.charges--
- playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1)
- return 1
- else
- return 0
-
-//This proc only checks if the painter can be used.
-//Call this if you don't want the painter to be used right after this check, for example
-//because you're expecting user input.
-/obj/item/airlock_painter/proc/can_use(mob/user)
- if(!ink)
- to_chat(user, "There is no toner cartridge installed in [src]!")
- return 0
- else if(ink.charges < 1)
- to_chat(user, "[src] is out of ink!")
- return 0
- else
- return 1
-
-/obj/item/airlock_painter/suicide_act(mob/user)
- var/obj/item/organ/lungs/L = user.getorganslot("lungs")
-
- if(can_use(user) && L)
- user.visible_message("[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!")
- use(user)
-
- // Once you've inhaled the toner, you throw up your lungs
- // and then die.
-
- // Find out if there is an open turf in front of us,
- // and if not, pick the turf we are standing on.
- var/turf/T = get_step(get_turf(src), user.dir)
- if(!isopenturf(T))
- T = get_turf(src)
-
- // they managed to lose their lungs between then and
- // now. Good job.
- if(!L)
- return OXYLOSS
-
- L.Remove(user)
-
- // make some colorful reagent, and apply it to the lungs
- L.create_reagents(10)
- L.reagents.add_reagent("colorful_reagent", 10)
- L.reagents.reaction(L, TOUCH, 1)
-
- // TODO maybe add some colorful vomit?
-
- user.visible_message("[user] vomits out their [L]!")
- playsound(user.loc, 'sound/effects/splat.ogg', 50, 1)
-
- L.forceMove(T)
-
- return (TOXLOSS|OXYLOSS)
- else if(can_use(user) && !L)
- user.visible_message("[user] is spraying toner on [user.p_them()]self from [src]! It looks like [user.p_theyre()] trying to commit suicide.")
- user.reagents.add_reagent("colorful_reagent", 1)
- user.reagents.reaction(user, TOUCH, 1)
- return TOXLOSS
-
- else
- user.visible_message("[user] is trying to inhale toner from [src]! It might be a suicide attempt if [src] had any toner.")
- return SHAME
-
-
-/obj/item/airlock_painter/examine(mob/user)
- ..()
- if(!ink)
- to_chat(user, "It doesn't have a toner cartridge installed.")
- return
- var/ink_level = "high"
- if(ink.charges < 1)
- ink_level = "empty"
- else if((ink.charges/ink.max_charges) <= 0.25) //25%
- ink_level = "low"
- else if((ink.charges/ink.max_charges) > 1) //Over 100% (admin var edit)
- ink_level = "dangerously high"
- to_chat(user, "Its ink levels look [ink_level].")
-
-
-/obj/item/airlock_painter/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/device/toner))
- if(ink)
- to_chat(user, "[src] already contains \a [ink].")
- return
- if(!user.transferItemToLoc(W, src))
- return
- to_chat(user, "You install [W] into [src].")
- ink = W
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
- else
- return ..()
-
-/obj/item/airlock_painter/attack_self(mob/user)
- if(ink)
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
- ink.loc = user.loc
- user.put_in_hands(ink)
- to_chat(user, "You remove [ink] from [src].")
- ink = null
+/obj/item/airlock_painter
+ name = "airlock painter"
+ desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on an airlock during or after construction to change the paintjob."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "paint sprayer"
+ item_state = "paint sprayer"
+
+ w_class = WEIGHT_CLASS_SMALL
+
+ materials = list(MAT_METAL=50, MAT_GLASS=50)
+ origin_tech = "engineering=2"
+
+ flags_1 = CONDUCT_1 | NOBLUDGEON_1
+ slot_flags = SLOT_BELT
+
+ var/obj/item/device/toner/ink = null
+
+/obj/item/airlock_painter/New()
+ ..()
+ ink = new /obj/item/device/toner(src)
+
+//This proc doesn't just check if the painter can be used, but also uses it.
+//Only call this if you are certain that the painter will be used right after this check!
+/obj/item/airlock_painter/proc/use(mob/user)
+ if(can_use(user))
+ ink.charges--
+ playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1)
+ return 1
+ else
+ return 0
+
+//This proc only checks if the painter can be used.
+//Call this if you don't want the painter to be used right after this check, for example
+//because you're expecting user input.
+/obj/item/airlock_painter/proc/can_use(mob/user)
+ if(!ink)
+ to_chat(user, "There is no toner cartridge installed in [src]!")
+ return 0
+ else if(ink.charges < 1)
+ to_chat(user, "[src] is out of ink!")
+ return 0
+ else
+ return 1
+
+/obj/item/airlock_painter/suicide_act(mob/user)
+ var/obj/item/organ/lungs/L = user.getorganslot(ORGAN_SLOT_LUNGS)
+
+ if(can_use(user) && L)
+ user.visible_message("[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ use(user)
+
+ // Once you've inhaled the toner, you throw up your lungs
+ // and then die.
+
+ // Find out if there is an open turf in front of us,
+ // and if not, pick the turf we are standing on.
+ var/turf/T = get_step(get_turf(src), user.dir)
+ if(!isopenturf(T))
+ T = get_turf(src)
+
+ // they managed to lose their lungs between then and
+ // now. Good job.
+ if(!L)
+ return OXYLOSS
+
+ L.Remove(user)
+
+ // make some colorful reagent, and apply it to the lungs
+ L.create_reagents(10)
+ L.reagents.add_reagent("colorful_reagent", 10)
+ L.reagents.reaction(L, TOUCH, 1)
+
+ // TODO maybe add some colorful vomit?
+
+ user.visible_message("[user] vomits out their [L]!")
+ playsound(user.loc, 'sound/effects/splat.ogg', 50, 1)
+
+ L.forceMove(T)
+
+ return (TOXLOSS|OXYLOSS)
+ else if(can_use(user) && !L)
+ user.visible_message("[user] is spraying toner on [user.p_them()]self from [src]! It looks like [user.p_theyre()] trying to commit suicide.")
+ user.reagents.add_reagent("colorful_reagent", 1)
+ user.reagents.reaction(user, TOUCH, 1)
+ return TOXLOSS
+
+ else
+ user.visible_message("[user] is trying to inhale toner from [src]! It might be a suicide attempt if [src] had any toner.")
+ return SHAME
+
+
+/obj/item/airlock_painter/examine(mob/user)
+ ..()
+ if(!ink)
+ to_chat(user, "It doesn't have a toner cartridge installed.")
+ return
+ var/ink_level = "high"
+ if(ink.charges < 1)
+ ink_level = "empty"
+ else if((ink.charges/ink.max_charges) <= 0.25) //25%
+ ink_level = "low"
+ else if((ink.charges/ink.max_charges) > 1) //Over 100% (admin var edit)
+ ink_level = "dangerously high"
+ to_chat(user, "Its ink levels look [ink_level].")
+
+
+/obj/item/airlock_painter/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/device/toner))
+ if(ink)
+ to_chat(user, "[src] already contains \a [ink].")
+ return
+ if(!user.transferItemToLoc(W, src))
+ return
+ to_chat(user, "You install [W] into [src].")
+ ink = W
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ else
+ return ..()
+
+/obj/item/airlock_painter/attack_self(mob/user)
+ if(ink)
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ ink.loc = user.loc
+ user.put_in_hands(ink)
+ to_chat(user, "You remove [ink] from [src].")
+ ink = null
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index aa54f9ca36..c3ccd1a144 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -286,6 +286,7 @@
var/req_defib = 1
var/combat = 0 //If it penetrates armor and gives additional functionality
var/grab_ghost = FALSE
+ var/tlimit = DEFIB_TIME_LIMIT * 10
/obj/item/twohanded/shockpaddles/proc/recharge(var/time)
if(req_defib || !time)
@@ -387,11 +388,14 @@
if((!req_defib && grab_ghost) || (req_defib && defib.grab_ghost))
H.notify_ghost_cloning("Your heart is being defibrillated!")
H.grab_ghost() // Shove them back in their body.
- else if(!H.suiciding && !(H.disabilities & NOCLONE)&& !H.hellbound)
+ else if(can_defib(H))
H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src)
do_help(H, user)
+/obj/item/twohanded/shockpaddles/proc/can_defib(mob/living/carbon/human/H)
+ var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain)
+ return (!H.suiciding && !(H.disabilities & NOCLONE) && !H.hellbound && ((world.time - H.timeofdeath) < tlimit) && (H.getBruteLoss() < 180) && (H.getFireLoss() < 180) && H.getorgan(/obj/item/organ/heart) && BR && !BR.damaged_brain)
/obj/item/twohanded/shockpaddles/proc/do_disarm(mob/living/M, mob/living/user)
if(req_defib && defib.safety)
@@ -481,7 +485,6 @@
var/tplus = world.time - H.timeofdeath
// past this much time the patient is unrecoverable
// (in deciseconds)
- var/tlimit = DEFIB_TIME_LIMIT * 10
// brain damage starts setting in on the patient after
// some time left rotting
var/tloss = DEFIB_TIME_LOSS * 10
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index eab0f030cc..5f4d02fd8e 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -69,7 +69,7 @@
to_chat(user, "You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask": "glasses"] first.")
return
- var/obj/item/organ/eyes/E = M.getorganslot("eye_sight")
+ var/obj/item/organ/eyes/E = M.getorganslot(ORGAN_SLOT_EYES)
if(!E)
to_chat(user, "[M] doesn't have any eyes!")
return
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index bb2adda377..caf42fc68b 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -171,7 +171,7 @@ MASS SPECTROMETER
if(advanced)
if(iscarbon(M))
var/mob/living/carbon/C = M
- var/obj/item/organ/ears/ears = C.getorganslot("ears")
+ var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS)
to_chat(user, "\t==EAR STATUS==")
if(istype(ears))
var/healthy = TRUE
@@ -189,7 +189,7 @@ MASS SPECTROMETER
to_chat(user, "\tHealthy.")
else
to_chat(user, "\tSubject does not have ears.")
- var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight")
+ var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES)
to_chat(user, "\t==EYE STATUS==")
if(istype(eyes))
var/healthy = TRUE
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 6fb85e5ad5..93ea89445b 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -88,8 +88,9 @@
/obj/item/restraints/handcuffs/cable
name = "cable restraints"
desc = "Looks like some cables tied together. Could be used to tie something up."
- icon_state = "cuff_red"
- item_state = "coil_red"
+ icon_state = "cuff"
+ item_state = "coil"
+ item_color = "red"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
materials = list(MAT_METAL=150, MAT_GLASS=75)
@@ -98,6 +99,18 @@
cuffsound = 'sound/weapons/cablecuff.ogg'
var/datum/robot_energy_storage/wirestorage = null
+/obj/item/restraints/handcuffs/cable/Initialize(mapload, 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]
+ update_icon()
+
+/obj/item/restraints/handcuffs/cable/update_icon()
+ add_atom_colour(item_color, FIXED_COLOUR_PRIORITY)
+
/obj/item/restraints/handcuffs/cable/attack(mob/living/carbon/C, mob/living/carbon/human/user)
if(!istype(C))
return
@@ -116,36 +129,28 @@
return ..()
/obj/item/restraints/handcuffs/cable/red
- icon_state = "cuff_red"
- item_state = "coil_red"
+ item_color = "red"
/obj/item/restraints/handcuffs/cable/yellow
- icon_state = "cuff_yellow"
- item_state = "coil_yellow"
+ item_color = "yellow"
/obj/item/restraints/handcuffs/cable/blue
- icon_state = "cuff_blue"
- item_state = "coil_blue"
+ item_color = "blue"
/obj/item/restraints/handcuffs/cable/green
- icon_state = "cuff_green"
- item_state = "coil_green"
+ item_color = "green"
/obj/item/restraints/handcuffs/cable/pink
- icon_state = "cuff_pink"
- item_state = "coil_pink"
+ item_color = "pink"
/obj/item/restraints/handcuffs/cable/orange
- icon_state = "cuff_orange"
- item_state = "coil_orange"
+ item_color = "orange"
/obj/item/restraints/handcuffs/cable/cyan
- icon_state = "cuff_cyan"
- item_state = "coil_cyan"
+ item_color = "cyan"
/obj/item/restraints/handcuffs/cable/white
- icon_state = "cuff_white"
- item_state = "coil_white"
+ item_color = "white"
/obj/item/restraints/handcuffs/alien
icon_state = "handcuffAlien"
@@ -209,17 +214,18 @@
/obj/item/restraints/handcuffs/cable/zipties
name = "zipties"
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
- icon_state = "cuff_white"
+ icon_state = "cuff"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
materials = list()
breakouttime = 450 //Deciseconds = 45s
trashtype = /obj/item/restraints/handcuffs/cable/zipties/used
+ item_color = "white"
/obj/item/restraints/handcuffs/cable/zipties/used
desc = "A pair of broken zipties."
- icon_state = "cuff_white_used"
- item_state = "cuff_white"
+ icon_state = "cuff_used"
+ item_state = "cuff"
/obj/item/restraints/handcuffs/cable/zipties/used/attack()
return
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/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/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..01c3e6d630 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -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/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 8704abee83..c39879c952 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -123,15 +123,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)
@@ -1205,7 +1205,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
@@ -1261,7 +1261,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/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 016a3635ef..53a8a5b8bb 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -52,7 +52,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 634e98fb2d..c93ca30841 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -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/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-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/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/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;