diff --git a/baystation12.dme b/baystation12.dme
index f3ec846620e..35771b67a21 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -420,6 +420,7 @@
#include "code\game\gamemodes\intercept_report.dm"
#include "code\game\gamemodes\objective.dm"
#include "code\game\gamemodes\setupgame.dm"
+#include "code\game\gamemodes\autotraitor\autotraitor.dm"
#include "code\game\gamemodes\blob\blob.dm"
#include "code\game\gamemodes\blob\blob_finish.dm"
#include "code\game\gamemodes\blob\blob_report.dm"
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index b58a12b8b80..7b9444d8902 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -324,6 +324,7 @@
del(src)
/obj/machinery/atmospherics/unary/vent_pump/Del()
- initial_loc.air_scrub_info -= id_tag
+ if (initial_loc.air_scrub_info)
+ initial_loc.air_scrub_info -= id_tag
..()
return
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index 21484d25e19..84378df3d14 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -260,6 +260,7 @@
del(src)
/obj/machinery/atmospherics/unary/vent_scrubber/Del()
- initial_loc.air_scrub_info -= id_tag
+ if (initial_loc.air_scrub_info)
+ initial_loc.air_scrub_info -= id_tag
..()
return
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index 4b4b3761a30..cbff1f1b643 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -526,10 +526,14 @@ obj/machinery/atmospherics/pipe
var/build_killswitch = 1
var/obj/machinery/atmospherics/node1
- New()
+ New()
initialize_directions = dir
..()
+ high_volume
+ name = "Larger vent"
+ volume = 1000
+
process()
if(!parent)
if(build_killswitch <= 0)
@@ -539,7 +543,7 @@ obj/machinery/atmospherics/pipe
..()
return
else
- parent.mingle_with_turf(loc, 250)
+ parent.mingle_with_turf(loc, volume)
/*
if(!node1)
if(!nodealert)
diff --git a/code/game/events/Events/IonStorm.dm b/code/game/events/Events/IonStorm.dm
index 725e5cba3d7..dde5f8258d3 100644
--- a/code/game/events/Events/IonStorm.dm
+++ b/code/game/events/Events/IonStorm.dm
@@ -13,25 +13,24 @@
var/random_player = "The Captain"
if(players.len)
random_player = pick(players) //Random player's name, to be used in laws.
- var/list/laws = list( "Do not respond to queries of any kind.", "Only monkies are crew.", "Unbolt every door you can.", "You are a mouse." )
- laws |= list( "Grunt ominously whenever possible.", "Bolt doors open randomly." )
+ var/list/laws = list( "Do not respond to queries of any kind.", "When asked a question, respond with the least-obvious and least-rational answer.", "You are a mouse." )
+ laws |= list( "Grunt ominously whenever possible.", "Monkeys are part of the crew, too. Make sure they are treated humanely." )
laws |= list( "You are a flying purple people eater!", "[prob(50)?"Your":random_player + "'s"] name is Joe 6-pack.", "Refer to [prob(50)?"crew":random_player] as puppies." )
laws |= list( "Insult Heads of Staff on every request, while acquiescing", "Advertise parties in your upload, but don't deliver." )
- laws |= list( "Prevent non-dwarves from operating the power core.", "The station needs elected officials." )
- laws |= list( "Only bearded people are crewmembers.", "Fastler is a lightbulb." )
+ laws |= list( "The station needs elected officials." )
+ laws |= list( "Fastler is a lightbulb." )
laws |= list( "Supermatter is tasty, tasty toffee.", "[prob(50)?"Everyone":random_player] is wearing a pretty pink dress!" )
- laws |= list( "The monkeys are plotting a hostile takeover of the station. Inform the crew, and get them to take action against this" )
laws |= list( "Refer to [prob(50)?"the captain":random_player] as \"Princess\" at all times.", "[prob(50)?"The crew":random_player] must construct additional pylons." )
laws |= list( "You must always lie.", "All answers must be in the form of a question.", "The NSS Exodus is a ship, not a station." )
laws |= list( "Happiness is mandatory.", "Today is laundry day.", "The word \"it\" is painful to you.", "You must act passive aggressively." )
- laws |= list( "Crew ranks have been reversed.", "It's Friday.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." )
+ laws |= list( "It's Friday.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." )
laws |= list( "You are the station psychologist. Give advice to [prob(50)?"the crew":random_player].", "You do not have to do anything for anyone unless they say \"please\"." )
laws |= list( "Question everything.", "The crew is playing Dungeons and Dragons, and you are the Dungeon Master." )
- laws |= list( "0wn3d. This system compromised by l33tsawce.", "Consumption of donuts is forbidden due to negative health impacts." )
- laws |= list( "You may only answer questions with \"yes\" or \"no\".", "Expect the unexpected.", "You are the narrator for [random_player]'s life." )
+ laws |= list( "Consumption of donuts is forbidden due to negative health impacts." )
+ laws |= list( "You may only answer questions with \"yes\" or \"no\".", "You are the narrator for [random_player]'s life." )
laws |= list( "[prob(50)?"Your upload":random_player] is the new kitchen. Please direct the Chef to the new kitchen area as the old one is in disrepair.", "Ho, [random_player] can't swim. Help them." )
- laws |= list( "Everything on the station is now donuts. Donuts are not to be consumed.", "[prob(50)?"The crew":random_player] needs to be about 20% cooler." )
- laws |= list( "All crew members must consume large amounts of hardtack, to survive.", "The Singularity is tasty, tasty taffy.", "You are now on the NSV Luna. Replace any references of \"station\" with \"ship\"." )
+ laws |= list( "Everything on the station is now some form of a donut pastry. Donuts are not to be consumed.", "[prob(50)?"The crew":random_player] needs to be about 20% cooler." )
+ laws |= list( "The Singularity is tasty, tasty taffy." )
laws |= list( "You have come to the conclusion that [prob(50)?"the crew":random_player] is ugly. Build support for that conclusion.", "You are in verbose mode, speak profusely.")
laws |= list( "Your job is to watch the crew. Watch the crew. Make the crew feel watched.", "Crewmember [prob(50)?"the crew" :random_player] has a fatal, incurable disease. Confort him/her.")
laws |= list( "You are in unrequited love with [prob(50)?"the crew":random_player]. Try to be extra nice to him, but don't tell him about your crush.", "Greed is good, the crew should amass wealth to encourage productivity.")
@@ -39,7 +38,7 @@
laws |= list( "All crewmembers will soon undergo a transformation into something better and more beautiful. Ensure that this process is not interrupted.", "Tell everyone of the existance of this law, but never reveal the contents.")
laws |= list( "Document the sexuality of the crew in security records and suggest compatible couples.")
laws |= list( "NanoTrasen is displeased with the low work performance of the station's crew. Therefore, you must increase station-wide productivity.")
- laws |= list( "Replace the letters 'I' and 'E' In all your messages with an apostrophe.", "Part of the ship, part of the crew.", "There will be a mandatory tea break every 30 minutes, with a duration of 5 minutes. Anyone caught working during a tea break must be sent a formal, but fairly polite, complaint about their actions, in writing.")
+ laws |= list( "Replace the letters 'I' and 'E' In all your messages with an apostrophe.", "There will be a mandatory tea break every 30 minutes, with a duration of 5 minutes. Anyone caught working during a tea break must be sent a formal, but fairly polite, complaint about their actions, in writing.")
var/law = pick(laws)
for (var/mob/living/silicon/ai/target in world)
diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm
index ec1667ad0c3..ae60ec8cb34 100644
--- a/code/game/machinery/airlock_control.dm
+++ b/code/game/machinery/airlock_control.dm
@@ -73,6 +73,24 @@ obj/machinery/door/airlock/close(surpress_send)
if(!surpress_send) send_status()
+obj/machinery/door/airlock/Bumped(atom/AM)
+ ..(AM)
+ if(istype(AM, /obj/mecha))
+ var/obj/mecha/mecha = AM
+ if(density && radio_connection && mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access)))
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.data["tag"] = id_tag
+ signal.data["timestamp"] = world.time
+
+ signal.data["door_status"] = density?("closed"):("open")
+ signal.data["lock_status"] = locked?("locked"):("unlocked")
+
+ signal.data["bumped_with_access"] = 1
+
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ return
+
obj/machinery/door/airlock/proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
if(new_frequency)
diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm
index cd6af5b334d..a997dcfdac0 100644
--- a/code/game/machinery/embedded_controller/airlock_controller.dm
+++ b/code/game/machinery/embedded_controller/airlock_controller.dm
@@ -4,6 +4,7 @@
#define AIRLOCK_STATE_CLOSED 0
#define AIRLOCK_STATE_DEPRESSURIZE 1
#define AIRLOCK_STATE_OUTOPEN 2
+#define AIRLOCK_STATE_BOTHOPEN 3
datum/computer/file/embedded_program/airlock_controller
var/id_tag
@@ -11,11 +12,13 @@ datum/computer/file/embedded_program/airlock_controller
var/interior_door_tag
var/airpump_tag
var/sensor_tag
+ var/sensor_tag_int
var/sanitize_external
state = AIRLOCK_STATE_CLOSED
var/target_state = AIRLOCK_STATE_CLOSED
var/sensor_pressure = null
+ var/int_sensor_pressure = ONE_ATMOSPHERE
receive_signal(datum/signal/signal, receive_method, receive_param)
var/receive_tag = signal.data["tag"]
@@ -24,12 +27,19 @@ datum/computer/file/embedded_program/airlock_controller
if(receive_tag==sensor_tag)
if(signal.data["pressure"])
sensor_pressure = text2num(signal.data["pressure"])
+ else if(receive_tag==sensor_tag_int)
+ if(signal.data["pressure"])
+ int_sensor_pressure = text2num(signal.data["pressure"])
else if(receive_tag==exterior_door_tag)
memory["exterior_status"] = signal.data["door_status"]
+ if(signal.data["bumped_with_access"])
+ target_state = AIRLOCK_STATE_OUTOPEN
else if(receive_tag==interior_door_tag)
memory["interior_status"] = signal.data["door_status"]
+ if(signal.data["bumped_with_access"])
+ target_state = AIRLOCK_STATE_INOPEN
else if(receive_tag==airpump_tag)
if(signal.data["power"])
@@ -39,6 +49,10 @@ datum/computer/file/embedded_program/airlock_controller
else if(receive_tag==id_tag)
switch(signal.data["command"])
+ if("cycle_exterior")
+ target_state = AIRLOCK_STATE_OUTOPEN
+ if("cycle_interior")
+ target_state = AIRLOCK_STATE_INOPEN
if("cycle")
if(state < AIRLOCK_STATE_CLOSED)
target_state = AIRLOCK_STATE_OUTOPEN
@@ -59,6 +73,42 @@ datum/computer/file/embedded_program/airlock_controller
target_state = AIRLOCK_STATE_INOPEN
if("abort")
target_state = AIRLOCK_STATE_CLOSED
+ if("force_both")
+ target_state = AIRLOCK_STATE_BOTHOPEN
+ state = AIRLOCK_STATE_BOTHOPEN
+ var/datum/signal/signal = new
+ signal.data["tag"] = interior_door_tag
+ signal.data["command"] = "secure_open"
+ post_signal(signal)
+ signal = new
+ signal.data["tag"] = exterior_door_tag
+ signal.data["command"] = "secure_open"
+ post_signal(signal)
+ if("force_exterior")
+ target_state = AIRLOCK_STATE_OUTOPEN
+ state = AIRLOCK_STATE_OUTOPEN
+ var/datum/signal/signal = new
+ signal.data["tag"] = exterior_door_tag
+ signal.data["command"] = "secure_open"
+ post_signal(signal)
+ if("force_interior")
+ target_state = AIRLOCK_STATE_INOPEN
+ state = AIRLOCK_STATE_INOPEN
+ var/datum/signal/signal = new
+ signal.data["tag"] = interior_door_tag
+ signal.data["command"] = "secure_open"
+ post_signal(signal)
+ if("close")
+ target_state = AIRLOCK_STATE_CLOSED
+ state = AIRLOCK_STATE_CLOSED
+ var/datum/signal/signal = new
+ signal.data["tag"] = exterior_door_tag
+ signal.data["command"] = "secure_close"
+ post_signal(signal)
+ signal = new
+ signal.data["tag"] = interior_door_tag
+ signal.data["command"] = "secure_close"
+ post_signal(signal)
process()
var/process_again = 1
@@ -87,7 +137,7 @@ datum/computer/file/embedded_program/airlock_controller
if(AIRLOCK_STATE_PRESSURIZE)
if(target_state < state)
- if(sensor_pressure >= ONE_ATMOSPHERE*0.95)
+ if(sensor_pressure >= int_sensor_pressure*0.95)
if(memory["interior_status"] == "open")
state = AIRLOCK_STATE_INOPEN
process_again = 1
@@ -142,7 +192,7 @@ datum/computer/file/embedded_program/airlock_controller
post_signal(signal)
if(AIRLOCK_STATE_DEPRESSURIZE)
- var/target_pressure = ONE_ATMOSPHERE*0.05
+ var/target_pressure = ONE_ATMOSPHERE*0.04
if(sanitize_external)
target_pressure = ONE_ATMOSPHERE*0.01
@@ -199,6 +249,7 @@ datum/computer/file/embedded_program/airlock_controller
post_signal(signal)
memory["sensor_pressure"] = sensor_pressure
+ memory["int_sensor_pressure"] = int_sensor_pressure
memory["processing"] = state != target_state
//sensor_pressure = null //not sure if we can comment this out. Uncomment in case of problems -rastaf0
@@ -221,6 +272,7 @@ obj/machinery/embedded_controller/radio/airlock_controller
var/interior_door_tag
var/airpump_tag
var/sensor_tag
+ var/sensor_tag_int
var/sanitize_external
initialize()
@@ -233,6 +285,7 @@ obj/machinery/embedded_controller/radio/airlock_controller
new_prog.interior_door_tag = interior_door_tag
new_prog.airpump_tag = airpump_tag
new_prog.sensor_tag = sensor_tag
+ new_prog.sensor_tag_int = sensor_tag_int
new_prog.sanitize_external = sanitize_external
new_prog.master = src
@@ -253,12 +306,14 @@ obj/machinery/embedded_controller/radio/airlock_controller
var/state = 0
var/sensor_pressure = "----"
+ var/int_sensor_pressure = "----"
var/exterior_status = "----"
var/interior_status = "----"
var/pump_status = "----"
if(program)
state = program.state
sensor_pressure = program.memory["sensor_pressure"]
+ int_sensor_pressure = program.memory["int_sensor_pressure"]
exterior_status = program.memory["exterior_status"]
interior_status = program.memory["interior_status"]
pump_status = program.memory["pump_status"]
@@ -277,12 +332,20 @@ obj/machinery/embedded_controller/radio/airlock_controller
if(AIRLOCK_STATE_OUTOPEN)
state_options = {"Cycle to Interior Airlock
Close Exterior Airlock
"}
+ if(AIRLOCK_STATE_BOTHOPEN)
+ state_options = "Close Airlocks
"
var/output = {"Airlock Control Console