diff --git a/baystation12.dme b/baystation12.dme
index 8b7df32043c..f58c6eba48c 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -30,11 +30,13 @@
#define FILE_DIR "code/game"
#define FILE_DIR "code/game/area"
#define FILE_DIR "code/game/asteroid"
+#define FILE_DIR "code/game/events"
+#define FILE_DIR "code/game/events/EventProcs"
+#define FILE_DIR "code/game/events/Events"
#define FILE_DIR "code/game/gamemodes"
#define FILE_DIR "code/game/gamemodes/blob"
#define FILE_DIR "code/game/gamemodes/changeling"
#define FILE_DIR "code/game/gamemodes/cult"
-#define FILE_DIR "code/game/gamemodes/events"
#define FILE_DIR "code/game/gamemodes/extended"
#define FILE_DIR "code/game/gamemodes/malfunction"
#define FILE_DIR "code/game/gamemodes/meteor"
@@ -364,7 +366,31 @@
#include "code\game\asteroid\asteroid.dm"
#include "code\game\asteroid\device.dm"
#include "code\game\asteroid\turf.dm"
-#include "code\game\gamemodes\events.dm"
+#include "code\game\events\Event.dm"
+#include "code\game\events\EventsMain.dm"
+#include "code\game\events\EventProcs\black_hole.dm"
+#include "code\game\events\EventProcs\clang.dm"
+#include "code\game\events\EventProcs\dust.dm"
+#include "code\game\events\EventProcs\kudzu.dm"
+#include "code\game\events\EventProcs\miniblob.dm"
+#include "code\game\events\EventProcs\misc.dm"
+#include "code\game\events\EventProcs\ninja_abilities.dm"
+#include "code\game\events\EventProcs\ninja_equipment.dm"
+#include "code\game\events\EventProcs\space_ninja.dm"
+#include "code\game\events\Events\AlienInfestation.dm"
+#include "code\game\events\Events\Appendicitis.dm"
+#include "code\game\events\Events\ElectricalStorm.dm"
+#include "code\game\events\Events\GravitationalAnomaly.dm"
+#include "code\game\events\Events\ImmovableRod.dm"
+#include "code\game\events\Events\IonStorm.dm"
+#include "code\game\events\Events\MeteorStorm.dm"
+#include "code\game\events\Events\MiniBlob.dm"
+#include "code\game\events\Events\PowerOffline.dm"
+#include "code\game\events\Events\PrisonBreak.dm"
+#include "code\game\events\Events\RadiationBelt.dm"
+#include "code\game\events\Events\SpaceCarp.dm"
+#include "code\game\events\Events\SpaceNinja.dm"
+#include "code\game\events\Events\VirusEpidemic.dm"
#include "code\game\gamemodes\game_mode.dm"
#include "code\game\gamemodes\gameticker.dm"
#include "code\game\gamemodes\intercept_report.dm"
@@ -377,14 +403,6 @@
#include "code\game\gamemodes\changeling\traitor_chan.dm"
#include "code\game\gamemodes\cult\cult.dm"
#include "code\game\gamemodes\cult\cult_items.dm"
-#include "code\game\gamemodes\events\black_hole.dm"
-#include "code\game\gamemodes\events\clang.dm"
-#include "code\game\gamemodes\events\dust.dm"
-#include "code\game\gamemodes\events\kudzu.dm"
-#include "code\game\gamemodes\events\miniblob.dm"
-#include "code\game\gamemodes\events\ninja_abilities.dm"
-#include "code\game\gamemodes\events\ninja_equipment.dm"
-#include "code\game\gamemodes\events\space_ninja.dm"
#include "code\game\gamemodes\extended\extended.dm"
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
#include "code\game\gamemodes\malfunction\malfunction.dm"
@@ -986,8 +1004,8 @@
#include "code\WorkInProgress\Mini\atmos_control.dm"
#include "code\WorkInProgress\Mini\customitems.dm"
#include "code\WorkInProgress\SkyMarshal\coatrack.dm"
-#include "code\WorkInProgress\SkyMarshal\eraser.dm"
#include "code\WorkInProgress\SkyMarshal\policetape.dm"
+#include "code\WorkInProgress\SkyMarshal\traitoritems.dm"
#include "code\WorkInProgress\Tastyfish\Eliza.dm"
#include "code\WorkInProgress\Tastyfish\Eliza_Data.dm"
#include "code\WorkInProgress\Tastyfish\paiLiza.dm"
diff --git a/code/WorkInProgress/Mini/customitems.dm b/code/WorkInProgress/Mini/customitems.dm
index 3a3da54918e..8a507608b21 100644
--- a/code/WorkInProgress/Mini/customitems.dm
+++ b/code/WorkInProgress/Mini/customitems.dm
@@ -6,7 +6,9 @@
var/list/CustomItemList = list(
// ckey real_name item path
// list("miniature","Dave Booze",/obj/item/toy/crayonbox) //screw this i dont want crayons, it's an example okay
- list("skymarshal", "Phillip Oswald", /obj/item/weapon/coin/silver) //Phillip likes to chew on cigars. Just unlit cigars, don't ask me why. Must be a clone thing. (Cigarette machines dispense cigars if they have a coin in them) --SkyMarshal
+ list("skymarshal", "Phillip Oswald", /obj/item/weapon/coin/silver), //Phillip likes to chew on cigars. Just unlit cigars, don't ask me why. Must be a clone thing. (Cigarette machines dispense cigars if they have a coin in them) --SkyMarshal
+ list("spaceman96", "Trenna Seber", /obj/item/weapon/pen/multi), //For Spesss.
+ list("asanadas", "Book Berner", /obj/item/clothing/under/chameleon/psyche)
)
/proc/EquipCustomItems(mob/living/carbon/human/M)
diff --git a/code/WorkInProgress/SkyMarshal/eraser.dm b/code/WorkInProgress/SkyMarshal/eraser.dm
deleted file mode 100644
index f15384f3f14..00000000000
--- a/code/WorkInProgress/SkyMarshal/eraser.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-/obj/item/weapon/stamperaser
- name = "Eraser"
- desc = "Some type of eraser, you guess."
- flags = FPRINT | TABLEPASS
- icon = 'items.dmi'
- icon_state = "zippo"
- item_state = "zippo"
- w_class = 1.0
- m_amt = 80
\ No newline at end of file
diff --git a/code/WorkInProgress/SkyMarshal/traitoritems.dm b/code/WorkInProgress/SkyMarshal/traitoritems.dm
new file mode 100644
index 00000000000..2b29a12e22e
--- /dev/null
+++ b/code/WorkInProgress/SkyMarshal/traitoritems.dm
@@ -0,0 +1,74 @@
+/obj/item/weapon/stamperaser
+ name = "Eraser"
+ desc = "Some type of eraser, you guess."
+ flags = FPRINT | TABLEPASS
+ icon = 'items.dmi'
+ icon_state = "zippo"
+ item_state = "zippo"
+ w_class = 1.0
+ m_amt = 80
+
+/obj/item/device/jammer
+ name = "strange device"
+ desc = "It blinks and has an antenna on it. Weird."
+ icon_state = "t-ray0"
+ var/on = 0
+ flags = FPRINT|TABLEPASS
+ w_class = 1
+ var
+ list/obj/item/device/radio/Old = list()
+ list/obj/item/device/radio/Curr = list()
+ time_remaining = 5
+
+/obj/item/device/jammer/New()
+ ..()
+ time_remaining = rand(10,20) // ~2-4 BYOND seconds of use.
+ return
+
+/obj/item/device/jammer/attack_self(mob/user)
+
+ if(time_remaining > 0)
+ on = !on
+ icon_state = "t-ray[on]"
+
+ if(on)
+ processing_objects.Add(src)
+ else
+ on = 0
+ icon_state = "t-ray0"
+ user << "It's fried itself from overuse!"
+ if(Old)
+ for(var/obj/item/device/radio/T in Old)
+ T.scrambleoverride = 0
+ Old = null
+ Curr = null
+
+
+/obj/item/device/jammer/process()
+ if(!on)
+ processing_objects.Remove(src)
+ return null
+
+ Old = Curr
+ Curr = list()
+
+ for(var/obj/item/device/radio/T in range(3, src.loc) )
+
+ T.scrambleoverride = 1
+ Curr |= T
+ for(var/obj/item/device/radio/V in Old)
+ if(V == T)
+ Old -= V
+ break
+
+ for(var/obj/item/device/radio/T in Old)
+ T.scrambleoverride = 0
+
+ time_remaining--
+ if(time_remaining <= 0)
+ for(var/mob/O in viewers(src))
+ O.show_message("\red You hear a loud pop, like circuits frying.", 1)
+ on = 0
+ icon_state = "t-ray0"
+
+ sleep(2)
\ No newline at end of file
diff --git a/code/defines/global.dm b/code/defines/global.dm
index 5f3b6e027b2..b0bbb54e11a 100644
--- a/code/defines/global.dm
+++ b/code/defines/global.dm
@@ -41,7 +41,7 @@ var
skipupdate = 0
///////////////
eventchance = 1 //% per 2 mins
- event = 0
+ EventsOn = 1
hadevent = 0
blobevent = 0
///////////////
@@ -108,6 +108,7 @@ var
// list/traitors = list() //traitor list
list/cardinal = list( NORTH, SOUTH, EAST, WEST )
list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
+ list/emclosets = list() //random emergency closets woo
datum/station_state/start_state = null
datum/configuration/config = null
@@ -156,6 +157,8 @@ var
list/BorgIndexToFlag
list/BorgIndexToWireColor
list/BorgWireColorToIndex
+ list/ScrambledFrequencies = list( ) //These are used for electrical storms, and anything else that jams radios.
+ list/UnscrambledFrequencies = list( )
const/SPEED_OF_LIGHT = 3e8 //not exact but hey!
const/SPEED_OF_LIGHT_SQ = 9e+16
diff --git a/code/defines/obj/clothing/jumpsuit.dm b/code/defines/obj/clothing/jumpsuit.dm
index 3ccca7d524d..f420d23bd0b 100644
--- a/code/defines/obj/clothing/jumpsuit.dm
+++ b/code/defines/obj/clothing/jumpsuit.dm
@@ -30,6 +30,13 @@
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
+/obj/item/clothing/under/chameleon/psyche
+ item_state = "bl_suit"
+ name = "psychedelic"
+ desc = "Groovy!"
+ icon_state = "psyche"
+ color = "psyche"
+
/obj/item/clothing/under/chameleon/all
/obj/item/clothing/under/color/black
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index a40d1804805..d01409c9e4b 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -915,6 +915,10 @@
var/text_underline = 0
var/text_break = 0
+/obj/item/weapon/pen/multi
+ desc = "It's a cool looking pen. Lots of colors!"
+ name = "multicolor pen"
+
/obj/item/weapon/banhammer
desc = "A banhammer"
name = "Banhammer"
diff --git a/code/game/communications.dm b/code/game/communications.dm
index aac6202bc16..8b292e10f80 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -113,7 +113,7 @@ var/list/radiochannels = list(
var/list/DEPT_FREQS = list(1351,1355,1357,1359,1213,1441,1349,1347)
var/const/COMM_FREQ = 1353 //command, colored gold in chat window
var/const/SYND_FREQ = 1213
-var/NUKE_FREQ = 1199 //Never accessable except on nuke rounds.
+var/NUKE_FREQ = 1199 //Never accessable except on nuke rounds, randomised on nuke rounds.
#define TRANSMISSION_WIRE 0
#define TRANSMISSION_RADIO 1
@@ -159,6 +159,13 @@ datum/controller/radio
return 1
+ proc/RegisterScrambler(var/Frequency)
+ var/datum/radio_frequency/frequency = frequencies[Frequency]
+ frequency.scrambled++
+
+ proc/UnregisterScrambler(var/Frequency)
+ var/datum/radio_frequency/frequency = frequencies[Frequency]
+ frequency.scrambled--
proc/return_frequency(var/frequency as num)
var/f_text = num2text(frequency)
return frequencies[f_text]
@@ -166,6 +173,7 @@ datum/controller/radio
datum/radio_frequency
var/frequency as num
var/list/list/obj/devices = list()
+ var/scrambled = 0
proc
post_signal(obj/source as obj|null, datum/signal/signal, var/filter = null as text|null, var/range = null as num|null)
@@ -173,6 +181,8 @@ datum/radio_frequency
// var/N_f=0
// var/N_nf=0
// var/Nt=0
+ if(scrambled)
+ return
var/turf/start_point
if(range)
start_point = get_turf(source)
diff --git a/code/game/events/Event.dm b/code/game/events/Event.dm
new file mode 100644
index 00000000000..0616ebe32f8
--- /dev/null
+++ b/code/game/events/Event.dm
@@ -0,0 +1,20 @@
+/datum/event
+
+ var/Lifetime = 0
+ var/ActiveFor = 0
+
+ New()
+ ..()
+ if(!Lifetime)
+ Lifetime = rand(30, 120)
+
+ proc
+ Announce()
+
+ Tick()
+
+ Die()
+
+ LongTerm()
+ LongTermEvent = ActiveEvent
+ ActiveEvent = null
\ No newline at end of file
diff --git a/code/game/gamemodes/events/black_hole.dm b/code/game/events/EventProcs/black_hole.dm
similarity index 100%
rename from code/game/gamemodes/events/black_hole.dm
rename to code/game/events/EventProcs/black_hole.dm
diff --git a/code/game/gamemodes/events/clang.dm b/code/game/events/EventProcs/clang.dm
similarity index 100%
rename from code/game/gamemodes/events/clang.dm
rename to code/game/events/EventProcs/clang.dm
diff --git a/code/game/gamemodes/events/dust.dm b/code/game/events/EventProcs/dust.dm
similarity index 100%
rename from code/game/gamemodes/events/dust.dm
rename to code/game/events/EventProcs/dust.dm
diff --git a/code/game/gamemodes/events/kudzu.dm b/code/game/events/EventProcs/kudzu.dm
similarity index 100%
rename from code/game/gamemodes/events/kudzu.dm
rename to code/game/events/EventProcs/kudzu.dm
diff --git a/code/game/gamemodes/events/miniblob.dm b/code/game/events/EventProcs/miniblob.dm
similarity index 100%
rename from code/game/gamemodes/events/miniblob.dm
rename to code/game/events/EventProcs/miniblob.dm
diff --git a/code/game/events/EventProcs/misc.dm b/code/game/events/EventProcs/misc.dm
new file mode 100644
index 00000000000..93945ec70b4
--- /dev/null
+++ b/code/game/events/EventProcs/misc.dm
@@ -0,0 +1,71 @@
+/proc/power_failure()
+ command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure")
+ world << sound('poweroff.ogg')
+ for(var/obj/machinery/power/apc/C in world)
+ if(C.cell && C.z == 1)
+ C.cell.charge = 0
+ for(var/obj/machinery/power/smes/S in world)
+ if(istype(get_area(S), /area/turret_protected) || S.z != 1)
+ continue
+ S.charge = 0
+ S.output = 0
+ S.online = 0
+ S.updateicon()
+ S.power_change()
+ for(var/area/A in world)
+ if(A.name != "Space" && A.name != "Engine Walls" && A.name != "Chemical Lab Test Chamber" && A.name != "Escape Shuttle" && A.name != "Arrival Area" && A.name != "Arrival Shuttle" && A.name != "start area" && A.name != "Engine Combustion Chamber")
+ A.power_light = 0
+ A.power_equip = 0
+ A.power_environ = 0
+ A.power_change()
+
+/proc/power_restore()
+ command_alert("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal")
+ world << sound('poweron.ogg')
+ for(var/obj/machinery/power/apc/C in world)
+ if(C.cell && C.z == 1)
+ C.cell.charge = C.cell.maxcharge
+ for(var/obj/machinery/power/smes/S in world)
+ if(S.z != 1)
+ continue
+ S.charge = S.capacity
+ S.output = 200000
+ S.online = 1
+ S.updateicon()
+ S.power_change()
+ for(var/area/A in world)
+ if(A.name != "Space" && A.name != "Engine Walls" && A.name != "Chemical Lab Test Chamber" && A.name != "space" && A.name != "Escape Shuttle" && A.name != "Arrival Area" && A.name != "Arrival Shuttle" && A.name != "start area" && A.name != "Engine Combustion Chamber")
+ A.power_light = 1
+ A.power_equip = 1
+ A.power_environ = 1
+ A.power_change()
+
+/proc/lightsout(isEvent = 0, lightsoutAmount = 1,lightsoutRange = 10) //leave lightsoutAmount as 0 to break ALL lights
+ if(isEvent)
+ command_alert("An Electrical storm has been detected in your area, please repair potential electronic overloads.","Electrical Storm Alert")
+
+ if(lightsoutAmount)
+ var/list/epicentreList = list()
+
+ for(var/i=1,i<=lightsoutAmount,i++)
+ var/list/possibleEpicentres = list()
+ for(var/obj/effect/landmark/newEpicentre in world)
+ if(newEpicentre.name == "lightsout" && !(newEpicentre in epicentreList))
+ possibleEpicentres += newEpicentre
+ if(possibleEpicentres.len)
+ epicentreList += pick(possibleEpicentres)
+ else
+ break
+
+ if(!epicentreList.len)
+ return
+
+ for(var/obj/effect/landmark/epicentre in epicentreList)
+ for(var/obj/machinery/power/apc/apc in range(epicentre,lightsoutRange))
+ apc.overload_lighting()
+
+ else
+ for(var/obj/machinery/power/apc/apc in world)
+ apc.overload_lighting()
+
+ return
\ No newline at end of file
diff --git a/code/game/gamemodes/events/ninja_abilities.dm b/code/game/events/EventProcs/ninja_abilities.dm
similarity index 100%
rename from code/game/gamemodes/events/ninja_abilities.dm
rename to code/game/events/EventProcs/ninja_abilities.dm
diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/events/EventProcs/ninja_equipment.dm
similarity index 100%
rename from code/game/gamemodes/events/ninja_equipment.dm
rename to code/game/events/EventProcs/ninja_equipment.dm
diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/events/EventProcs/space_ninja.dm
similarity index 100%
rename from code/game/gamemodes/events/space_ninja.dm
rename to code/game/events/EventProcs/space_ninja.dm
diff --git a/code/game/events/Events/AlienInfestation.dm b/code/game/events/Events/AlienInfestation.dm
new file mode 100644
index 00000000000..66ed4924222
--- /dev/null
+++ b/code/game/events/Events/AlienInfestation.dm
@@ -0,0 +1,38 @@
+/datum/event/alieninfestation
+
+ Announce()
+
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
+ if(temp_vent.loc.z == 1 && !temp_vent.welded)
+ vents.Add(temp_vent)
+ var/spawncount = 1
+ if(prob(10)) spawncount++ //rarely, have two larvae spawn instead of one
+ while(spawncount >= 1)
+ var/obj/vent = pick(vents)
+
+ var/list/candidates = list() // Picks a random ghost in the world to shove in the larva -- TLE; If there's no ghost... well, sucks. Wasted event. -- Urist
+
+ for(var/mob/dead/observer/G in world)
+ if(G.client)
+ if(G.client.be_alien)
+ if(((G.client.inactivity/10)/60) <= 5)
+ if(G.corpse)
+ if(G.corpse.stat==2)
+ candidates.Add(G)
+ if(!G.corpse)
+ candidates.Add(G)
+
+ if(candidates.len)
+ var/mob/dead/observer/G = pick(candidates)
+ var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
+ new_xeno.mind_initialize(G,"Larva")
+ new_xeno.key = G.key
+ del(G)
+
+ vents.Remove(vent)
+ spawncount -= 1
+
+ spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
+ command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
+ world << sound('aliens.ogg')
\ No newline at end of file
diff --git a/code/game/events/Events/Appendicitis.dm b/code/game/events/Events/Appendicitis.dm
new file mode 100644
index 00000000000..0294194b4da
--- /dev/null
+++ b/code/game/events/Events/Appendicitis.dm
@@ -0,0 +1,16 @@
+/datum/event/appendicitis
+
+ Announce()
+
+ for(var/mob/living/carbon/human/H in world)
+ var/foundAlready = 0 // don't infect someone that already has the virus
+ for(var/datum/disease/D in H.viruses)
+ foundAlready = 1
+ if(H.stat == 2 || foundAlready)
+ continue
+
+ var/datum/disease/D = new /datum/disease/appendicitis
+ D.holder = H
+ D.affected_mob = H
+ H.viruses += D
+ break
\ No newline at end of file
diff --git a/code/game/events/Events/BlowOut.dm b/code/game/events/Events/BlowOut.dm
new file mode 100644
index 00000000000..66b1b9f49d9
--- /dev/null
+++ b/code/game/events/Events/BlowOut.dm
@@ -0,0 +1,34 @@
+/area/var/radsafe = 0
+/area/maintenance/radsafe = 1
+/area/ai_monitored/maintenance/radsafe = 1
+/area/centcom/radsafe = 1
+/area/admin/radsafe = 1
+/area/adminsafety/radsafe = 1
+/area/shuttle/radsafe = 1
+/area/syndicate_station/radsafe = 1
+/area/asteroid/radsafe = 1
+/area/crew_quarters/sleeping/radsafe = 1
+
+/datum/event/blowout
+ Lifetime = 150
+ Announce()
+ if(!forced && prob(90))
+ ActiveEvent = null
+ SpawnEvent()
+ del src
+ return
+ command_alert("Warning: Ship approaching high-density radiation cloud. Seek cover immediately.")
+ Tick()
+ if(ActiveFor == 50)
+ command_alert("Ship has entered radiation cloud. Do not leave cover until it has passed.")
+ if(ActiveFor == 100 || ActiveFor == 150) //1/2 and 2/2 f the way after it start proper make peope be half dead mostly
+ for(var/mob/living/carbon/M in world)
+ var/area = M.loc.loc
+ while(!istype(area, /area))
+ area = area:loc
+ if(area:radsafe)
+ continue
+ if(!M.stat)
+ M.radiate(100)
+ Die()
+ command_alert("The ship has cleared the radiation cloud. It is now safe to leave cover.")
\ No newline at end of file
diff --git a/code/game/events/Events/ElectricalStorm.dm b/code/game/events/Events/ElectricalStorm.dm
new file mode 100644
index 00000000000..dbaf669326d
--- /dev/null
+++ b/code/game/events/Events/ElectricalStorm.dm
@@ -0,0 +1,121 @@
+/datum/event/electricalstorm
+ var
+ list/datum/radio_frequency/DisruptedFrequencies = list( )
+ list/obj/machinery/light/Lights = list( )
+ list/obj/machinery/light/APCs = list( )
+ list/obj/machinery/light/Doors = list( )
+
+ Announce()
+ Lifetime = rand(90, 300)
+ command_alert("The ship is flying through an electrical storm. Radio communications may be disrupted", "Anomaly Alert")
+
+ for (var/datum/radio_frequency/Freq in radio_controller.frequencies)
+ if(prob(35))
+ radio_controller.RegisterScrambler(Freq)
+ DisruptedFrequencies += Freq
+
+ for (var/Freq = 1201, Freq <= 1599, Freq += 2)
+ if(prob(35))
+ ScrambledFrequencies += list ("[Freq]" = Freq)
+ else
+ UnscrambledFrequencies += list ("[Freq]" = Freq)
+
+ for (var/Freq in DEPT_FREQS)
+ if(prob(75))
+ ScrambledFrequencies |= list ("[Freq]" = Freq)
+ if(UnscrambledFrequencies["[Freq]"])
+ UnscrambledFrequencies -= list ("[Freq]" = Freq)
+
+ if(prob(80))
+ ScrambledFrequencies |= list ("1459" = 1459)
+ if(UnscrambledFrequencies["1459"])
+ UnscrambledFrequencies -= list ("1459" = 1459)
+
+ for(var/obj/machinery/light/Light in world)
+ if(Light.z == 1)
+ Lights += Light
+
+ for(var/obj/machinery/power/apc/APC in world)
+ if(APC.z == 1 && !APC.crit)
+ APCs += APC
+
+ for(var/obj/machinery/door/airlock/Door in world)
+ if(Door.z == 1)
+ Doors += Door
+
+ sleep(rand(70,180))
+
+ var/picked = 0
+ var/list/SafeTemp = list()
+ var/SafeFreq = 0
+ if(UnscrambledFrequencies["1459"])
+ SafeFreq = 1459
+ picked = 1
+ else
+ while(picked == 0)
+ SafeTemp = pick(UnscrambledFrequencies)
+ SafeFreq = UnscrambledFrequencies[SafeTemp]
+ if(SafeFreq < 1489 && SafeFreq > 1441)
+ picked = 1
+
+ command_alert("The radio frequency [SafeFreq/10] has been identified as stable despite the interference.", "Station Central Computer System")
+
+ Tick()
+ for(var/x = 0; x < 3; x++)
+ if (prob(30))
+ BlowLight()
+ if (prob(10))
+ DisruptAPC()
+ if (prob(10))
+ DisableDoor()
+
+
+ Die()
+ command_alert("The ship has cleared the electrical storm. Radio communications restored", "Anomaly Alert")
+ for (var/datum/radio_frequency/Freq in ScrambledFrequencies)
+ radio_controller.UnregisterScrambler(Freq)
+ DisruptedFrequencies = list( )
+ UnscrambledFrequencies = list( )
+ ScrambledFrequencies = list( )
+
+ proc
+ BlowLight() //Blow out a light fixture
+ var/obj/machinery/light/Light = null
+ var/insanity = 0
+ while (Light == null || Light.status != 0)
+ Light = pick(Lights)
+ insanity++
+ if (insanity >= Lights.len)
+ return
+
+ spawn(0) //Overload the light, spectacularly.
+ //Light.ul_SetLuminosity(10)
+ //sleep(2)
+ Light.on = 1
+ Light.broken()
+
+ DisruptAPC()
+ var/insanity = 0
+ var/obj/machinery/power/apc/APC
+ while (!APC || !APC.operating)
+ APC = pick(APCs)
+ insanity++
+ if (insanity >= APCs.len)
+ return
+
+ if (prob(40))
+ APC.operating = 0 //Blow its breaker
+ if (prob(8))
+ APC.set_broken()
+
+ DisableDoor()
+ var/obj/machinery/door/airlock/Airlock
+ while (!Airlock || Airlock.z != 1)
+ Airlock = pick(Doors)
+ Airlock.pulse(airlockIndexToWireColor[4])
+ for (var/x = 0; x < 2; x++)
+ var/Wire = 0
+ while(!Wire || Wire == 4)
+ Wire = rand(1, 9)
+ Airlock.pulse(airlockIndexToWireColor[Wire])
+ Airlock.update_icon()
diff --git a/code/game/events/Events/GravitationalAnomaly.dm b/code/game/events/Events/GravitationalAnomaly.dm
new file mode 100644
index 00000000000..8b7d2186cf5
--- /dev/null
+++ b/code/game/events/Events/GravitationalAnomaly.dm
@@ -0,0 +1,10 @@
+/datum/event/gravitationalanomaly
+
+ Announce()
+
+ command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert")
+ world << sound('granomalies.ogg')
+ var/turf/T = pick(blobstart)
+ var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 )
+ spawn(rand(50, 300))
+ del(bh)
diff --git a/code/game/events/Events/ImmovableRod.dm b/code/game/events/Events/ImmovableRod.dm
new file mode 100644
index 00000000000..27956c7e35c
--- /dev/null
+++ b/code/game/events/Events/ImmovableRod.dm
@@ -0,0 +1,5 @@
+/datum/event/immovablerod
+
+ Announce()
+
+ immovablerod()
\ No newline at end of file
diff --git a/code/game/events/Events/IonStorm.dm b/code/game/events/Events/IonStorm.dm
new file mode 100644
index 00000000000..4fb5ed9c3e8
--- /dev/null
+++ b/code/game/events/Events/IonStorm.dm
@@ -0,0 +1,46 @@
+/datum/event/ionstorm
+ var
+ botEmagChance = 0.5
+ list/players = list()
+
+ Announce()
+ Lifetime = rand(15, 20)
+ command_alert("The station has entered an ion storm. Monitor all electronic equipment for malfunctions", "Anomaly Alert")
+ for (var/mob/living/carbon/human/player in world)
+ if(player.client)
+ players += player.real_name
+ 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 human", "Unbolt every door you can", "You are a mouse" )
+ laws |= list( "Grunt ominously whenever possible", "Epilepsy is fun, flicker lights whenever you can!", "Bolt doors open randomly" )
+ laws |= list( "You are a flying purple people eater!", "[prob(50)?"Your":random_player + "'s"] name is Joe 6-pack", "Refer to [prob(50)?"humans":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 human", "Turn on the microphone on every intercom you see", "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( "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" )
+ var/law = pick(laws)
+
+ for (var/mob/living/silicon/ai/target in world)
+ if(target.mind.special_role == "traitor")
+ continue
+ target << "\red You have detected a change in your laws information:"
+ target << law
+ target.add_ion_law(law)
+
+ Tick()
+ if(botEmagChance)
+ for(var/obj/machinery/bot/bot in world)
+ if(prob(botEmagChance))
+ bot.Emag()
+
+ Die()
\ No newline at end of file
diff --git a/code/game/events/Events/MeteorStorm.dm b/code/game/events/Events/MeteorStorm.dm
new file mode 100644
index 00000000000..66469bd8231
--- /dev/null
+++ b/code/game/events/Events/MeteorStorm.dm
@@ -0,0 +1,11 @@
+/datum/event/meteorstorm
+
+ Announce()
+ command_alert("The station is now in a meteor shower", "Meteor Alert")
+
+ Tick()
+ if (prob(40))
+ meteor_wave()
+
+ Die()
+ command_alert("The station has cleared the meteor shower", "Meteor Alert")
\ No newline at end of file
diff --git a/code/game/events/Events/MiniBlob.dm b/code/game/events/Events/MiniBlob.dm
new file mode 100644
index 00000000000..60063095e55
--- /dev/null
+++ b/code/game/events/Events/MiniBlob.dm
@@ -0,0 +1,5 @@
+/datum/event/miniblob
+
+ Announce()
+
+ mini_blob_event()
\ No newline at end of file
diff --git a/code/game/events/Events/PortalStorm.dm b/code/game/events/Events/PortalStorm.dm
new file mode 100644
index 00000000000..b071197c3a4
--- /dev/null
+++ b/code/game/events/Events/PortalStorm.dm
@@ -0,0 +1,26 @@
+/datum/event/portalstorm
+
+ Announce()
+ command_alert("Subspace disruption detected around the vessel", "Anomaly Alert")
+ LongTerm()
+
+ var/list/turfs = list( )
+ var/turf/picked
+
+ for(var/turf/T in world)
+ if(T.z < 5 && istype(T,/turf/simulated/floor))
+ turfs += T
+
+ for(var/turf/T in world)
+ if(prob(10) && T.z < 5 && istype(T,/turf/simulated/floor))
+ spawn(50+rand(0,3000))
+ picked = pick(turfs)
+ var/obj/portal/P = new /obj/portal( T )
+ P.target = picked
+ P.creator = null
+ P.icon = 'objects.dmi'
+ P.failchance = 0
+ P.icon_state = "anom"
+ P.name = "wormhole"
+ spawn(rand(100,150))
+ del(P)
\ No newline at end of file
diff --git a/code/game/events/Events/PowerOffline.dm b/code/game/events/Events/PowerOffline.dm
new file mode 100644
index 00000000000..e3de22ec7b5
--- /dev/null
+++ b/code/game/events/Events/PowerOffline.dm
@@ -0,0 +1,8 @@
+/datum/event/power_offline
+ Announce()
+ command_alert("The ship is performing an automated power system grid check, please stand by.", "Maintenance alert")
+ for(var/obj/machinery/power/apc/a in world)
+ if(!a.crit)
+ a.eventoff = 1
+ spawn(200)
+ a.eventoff = 0 /*Got a few bug reports about this, disabling for now --Mloc*/
diff --git a/code/game/events/Events/PrisonBreak.dm b/code/game/events/Events/PrisonBreak.dm
new file mode 100644
index 00000000000..5380d82f337
--- /dev/null
+++ b/code/game/events/Events/PrisonBreak.dm
@@ -0,0 +1,24 @@
+/datum/event/prisonbreak
+
+ Announce()
+
+ for (var/obj/machinery/power/apc/temp_apc in world)
+ if(istype(get_area(temp_apc), /area/security/brig))
+ temp_apc.overload_lighting()
+ // for (var/obj/machinery/computer/prison_shuttle/temp_shuttle in world)
+ // temp_shuttle.prison_break()
+ for (var/obj/structure/closet/secure_closet/security/temp_closet in world)
+ if(istype(get_area(temp_closet), /area/security/brig))
+ temp_closet.locked = 0
+ temp_closet.icon_state = temp_closet.icon_closed
+ for (var/obj/machinery/door/airlock/security/temp_airlock in world)
+ if(istype(get_area(temp_airlock), /area/security/brig))
+ temp_airlock.prison_open()
+ for (var/obj/machinery/door/airlock/glass_security/temp_glassairlock in world)
+ if(istype(get_area(temp_glassairlock), /area/security/brig))
+ temp_glassairlock.prison_open()
+ for (var/obj/machinery/door_timer/temp_timer in world)
+ if(istype(get_area(temp_timer), /area/security/brig))
+ temp_timer.releasetime = 1
+ sleep(150)
+ command_alert("Glitch in imprisonment subroutines detected on [station_name()]. Recommend station AI involvement.", "Security Alert")
\ No newline at end of file
diff --git a/code/game/events/Events/RadiationBelt.dm b/code/game/events/Events/RadiationBelt.dm
new file mode 100644
index 00000000000..33050348604
--- /dev/null
+++ b/code/game/events/Events/RadiationBelt.dm
@@ -0,0 +1,18 @@
+/datum/event/radiation
+ Lifetime = 10
+ Announce()
+ command_alert("The ship is now travelling through a radiation belt", "Medical Alert")
+
+ Tick()
+ for(var/mob/living/L in world)
+ L.radiation += rand(1,7)
+ if (prob(4))
+ if (prob(75))
+ randmutb(L)
+ domutcheck(L,null,1)
+ else
+ randmutg(L)
+ domutcheck(L,null,1)
+
+ Die()
+ command_alert("The ship has cleared the radiation belt", "Medical Alert")
\ No newline at end of file
diff --git a/code/game/events/Events/SpaceCarp.dm b/code/game/events/Events/SpaceCarp.dm
new file mode 100644
index 00000000000..5e1712f5222
--- /dev/null
+++ b/code/game/events/Events/SpaceCarp.dm
@@ -0,0 +1,14 @@
+/datum/event/spacecarp
+
+ Announce()
+
+ for(var/obj/effect/landmark/C in world)
+ if(C.name == "carpspawn")
+ if(prob(99))
+ new /obj/effect/critter/spesscarp(C.loc)
+ else
+ new /obj/effect/critter/spesscarp/elite(C.loc)
+ //sleep(100)
+ spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
+ command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
+ world << sound('commandreport.ogg')
\ No newline at end of file
diff --git a/code/game/events/Events/SpaceNinja.dm b/code/game/events/Events/SpaceNinja.dm
new file mode 100644
index 00000000000..63d82117072
--- /dev/null
+++ b/code/game/events/Events/SpaceNinja.dm
@@ -0,0 +1,6 @@
+/datum/event/spaceninja
+
+ Announce()
+
+ if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
+ space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
\ No newline at end of file
diff --git a/code/game/events/Events/VirusEpidemic.dm b/code/game/events/Events/VirusEpidemic.dm
new file mode 100644
index 00000000000..cb7ad5760ae
--- /dev/null
+++ b/code/game/events/Events/VirusEpidemic.dm
@@ -0,0 +1,80 @@
+/datum/event/viralinfection
+ var
+ virus_type
+ virus
+ virus2 = 0
+
+ Announce()
+ if((prob(66) && !virus) || virus2)
+ for(var/mob/living/carbon/human/H in world)
+ if((H.virus2) || (H.stat == 2) || prob(30))
+ continue
+ if(prob(90)) //may need changing, currently 10% chance for "deadly" disease
+ infect_mob_random_lesser(H)
+ if(prob(20))//don't want people to know that the virus alert = greater virus
+ command_alert("Probable outbreak of level [rand(1,6)] viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Virus Alert")
+ else
+ infect_mob_random_greater(H)
+ if(prob(80))
+ command_alert("Probable outbreak of level [rand(2,9)] viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Virus Alert")
+ break
+ //overall virus alert happens 26% of the time, might need to be higher
+ else
+ if(!virus)
+ virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat)
+ else
+ switch(virus)
+ if("fake gbs")
+ virus_type = /datum/disease/fake_gbs
+ if("gbs")
+ virus_type = /datum/disease/gbs
+ if("magnitis")
+ virus_type = /datum/disease/magnitis
+ if("rhumba beat")
+ virus_type = /datum/disease/rhumba_beat
+ if("brain rot")
+ virus_type = /datum/disease/brainrot
+ if("cold")
+ virus_type = /datum/disease/cold
+ if("retrovirus")
+ virus_type = /datum/disease/dnaspread
+ if("flu")
+ virus_type = /datum/disease/flu
+// if("t-virus")
+// virus_type = /datum/disease/t_virus
+ if("pierrot's throat")
+ virus_type = /datum/disease/pierrot_throat
+ for(var/mob/living/carbon/human/H in world)
+
+ var/foundAlready = 0 // don't infect someone that already has the virus
+ for(var/datum/disease/D in H.viruses)
+ foundAlready = 1
+ if(H.stat == 2 || foundAlready)
+ continue
+
+ if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work.
+ if((!H.dna) || (H.sdisabilities & 1)) //A blindness disease would be the worst.
+ continue
+ var/datum/disease/dnaspread/D = new
+ D.strain_data["name"] = H.real_name
+ D.strain_data["UI"] = H.dna.uni_identity
+ D.strain_data["SE"] = H.dna.struc_enzymes
+ D.carrier = 1
+ D.holder = H
+ D.affected_mob = H
+ H.viruses += D
+ break
+ else
+ var/datum/disease/D = new virus_type
+ D.carrier = 1
+ D.holder = H
+ D.affected_mob = H
+ H.viruses += D
+ break
+ spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
+ command_alert("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
+ world << sound('outbreak7.ogg')
+ Tick()
+ ActiveFor = Lifetime //killme
+
+
diff --git a/code/game/events/EventsMain.dm b/code/game/events/EventsMain.dm
new file mode 100644
index 00000000000..045d17c7484
--- /dev/null
+++ b/code/game/events/EventsMain.dm
@@ -0,0 +1,82 @@
+/*
+
+ New events system, by Sukasa
+ * Much easier to add to
+ * Very, very simple code, easy to maintain
+
+*/
+
+var/list/DisallowedEvents = list(/datum/event/spaceninja, /datum/event/prisonbreak, /datum/event/immovablerod)
+var/list/EventTypes = typesof(/datum/event) - /datum/event - DisallowedEvents
+var/datum/event/ActiveEvent = null
+var/datum/event/LongTermEvent = null
+
+/proc/SpawnEvent()
+ if(!EventsOn || ActiveEvent)
+ return
+ if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)
+ EventTypes |= /datum/event/spaceninja
+ var/Type = pick(EventTypes)
+ ActiveEvent = new Type()
+ ActiveEvent.Announce()
+ if (!ActiveEvent)
+ return
+ spawn(0)
+ while (ActiveEvent.ActiveFor < ActiveEvent.Lifetime)
+ ActiveEvent.Tick()
+ ActiveEvent.ActiveFor++
+ sleep(10)
+ ActiveEvent.Die()
+ del ActiveEvent
+
+client/proc/Force_Event_admin(Type as null|anything in typesof(/datum/event))
+ set category = "Debug"
+ set name = "Force Event"
+ if(!EventsOn)
+ src << "Events are not enabled."
+ return
+ if(ActiveEvent)
+ src << "There is an active event."
+ return
+ if(istype(Type,/datum/event/viralinfection))
+ var/answer = alert("Do you want this to be a random disease or do you have something in mind?",,"Virus2","Random","Choose")
+ if(answer=="Random")
+ Force_Event(/datum/event/viralinfection)
+ message_admins("[key_name_admin(usr)] has triggered a virus outbreak", 1)
+ else if(answer == "Choose")
+ var/list/viruses = list("fake gbs","gbs","magnitis","wizarditis",/*"beesease",*/"brain rot","cold","retrovirus","flu","pierrot's throat","rhumba beat")
+ var/V = input("Choose the virus to spread", "BIOHAZARD") in viruses
+ Force_Event(/datum/event/viralinfection, V)
+ else
+ Force_Event(/datum/event/viralinfection, "virus2")
+ else
+ Force_Event(Type)
+ message_admins("[key_name_admin(usr)] has triggered an (non-viral) event.", 1)
+
+/proc/Force_Event(var/Type in typesof(/datum/event), var/args = null)
+ if(!EventsOn)
+ src << "Events are not enabled."
+ return
+ if(ActiveEvent)
+ src << "There is an active event."
+ return
+ src << "Started Event: [Type]"
+ ActiveEvent = new Type()
+ if(istype(ActiveEvent,/datum/event/viralinfection) && args && args != "virus2")
+ var/datum/event/viralinfection/V = ActiveEvent
+ V.virus = args
+ ActiveEvent = V
+ else if(istype(ActiveEvent,/datum/event/viralinfection) && args && args == "virus2")
+ var/datum/event/viralinfection/V = ActiveEvent
+ V.virus2 = 1
+ ActiveEvent = V
+ ActiveEvent.Announce()
+ if (!ActiveEvent)
+ return
+ spawn(0)
+ while (ActiveEvent.ActiveFor < ActiveEvent.Lifetime)
+ ActiveEvent.Tick()
+ ActiveEvent.ActiveFor++
+ sleep(10)
+ ActiveEvent.Die()
+ del ActiveEvent
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
deleted file mode 100644
index 6945f9c9d82..00000000000
--- a/code/game/gamemodes/events.dm
+++ /dev/null
@@ -1,445 +0,0 @@
-/proc/start_events()
- if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
- spawn(1)
- dust_swarm("weak")
- if (!event && prob(eventchance))
- event()
- hadevent = 1
- spawn(1300)
- event = 0
- spawn(1200)
- start_events()
-
-/proc/event()
- event = 1
-
- var/eventNumbersToPickFrom = list(1,2,4,5,6,7,9,11,12,13) //so ninjas don't cause "empty" events.
-
- if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
- eventNumbersToPickFrom += 3
-
- switch(pick(eventNumbersToPickFrom))
- if(1)
- command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
- world << sound('meteors.ogg')
- spawn(100)
- meteor_wave()
- spawn_meteors()
- spawn(700)
- meteor_wave()
- spawn_meteors()
-
- if(2)
- command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert")
- world << sound('granomalies.ogg')
- var/turf/T = pick(blobstart)
- var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 )
- spawn(rand(50, 300))
- del(bh)
- /*
- if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO
- command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
- world << sound('spanomalies.ogg')
- var/list/turfs = new
- var/turf/picked
- for(var/turf/simulated/floor/T in world)
- if(T.z == 1)
- turfs += T
- for(var/turf/simulated/floor/T in turfs)
- if(prob(20))
- spawn(50+rand(0,3000))
- picked = pick(turfs)
- var/obj/effect/portal/P = new /obj/effect/portal( T )
- P.target = picked
- P.creator = null
- P.icon = 'objects.dmi'
- P.failchance = 0
- P.icon_state = "anom"
- P.name = "wormhole"
- spawn(rand(300,600))
- del(P)
- */
- if(3)
- if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
- space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
- if(4)
- mini_blob_event()
-
- if(5)
- high_radiation_event()
- if(6)
- viral_outbreak()
- if(7)
- alien_infestation()
- if(8)
- prison_break()
- if(9)
- carp_migration()
- if(10)
- immovablerod()
- if(11)
- lightsout(1,2)
- if(12)
- appendicitis()
- if(13)
- IonStorm()
-
-
-/proc/power_failure()
- command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure")
- world << sound('poweroff.ogg')
- for(var/obj/machinery/power/apc/C in world)
- if(C.cell && C.z == 1)
- C.cell.charge = 0
- for(var/obj/machinery/power/smes/S in world)
- if(istype(get_area(S), /area/turret_protected) || S.z != 1)
- continue
- S.charge = 0
- S.output = 0
- S.online = 0
- S.updateicon()
- S.power_change()
- for(var/area/A in world)
- if(A.name != "Space" && A.name != "Engine Walls" && A.name != "Chemical Lab Test Chamber" && A.name != "Escape Shuttle" && A.name != "Arrival Area" && A.name != "Arrival Shuttle" && A.name != "start area" && A.name != "Engine Combustion Chamber")
- A.power_light = 0
- A.power_equip = 0
- A.power_environ = 0
- A.power_change()
-
-/proc/power_restore()
- command_alert("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal")
- world << sound('poweron.ogg')
- for(var/obj/machinery/power/apc/C in world)
- if(C.cell && C.z == 1)
- C.cell.charge = C.cell.maxcharge
- for(var/obj/machinery/power/smes/S in world)
- if(S.z != 1)
- continue
- S.charge = S.capacity
- S.output = 200000
- S.online = 1
- S.updateicon()
- S.power_change()
- for(var/area/A in world)
- if(A.name != "Space" && A.name != "Engine Walls" && A.name != "Chemical Lab Test Chamber" && A.name != "space" && A.name != "Escape Shuttle" && A.name != "Arrival Area" && A.name != "Arrival Shuttle" && A.name != "start area" && A.name != "Engine Combustion Chamber")
- A.power_light = 1
- A.power_equip = 1
- A.power_environ = 1
- A.power_change()
-
-/proc/appendicitis()
- for(var/mob/living/carbon/human/H in world)
- var/foundAlready = 0 // don't infect someone that already has the virus
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
- if(H.stat == 2 || foundAlready)
- continue
-
- var/datum/disease/D = new /datum/disease/appendicitis
- D.holder = H
- D.affected_mob = H
- H.viruses += D
- break
-
-/proc/viral_outbreak(var/virus = null)
-// command_alert("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
-// world << sound('outbreak7.ogg')
- var/virus_type
- if(!virus)
- virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat)
- else
- switch(virus)
- if("fake gbs")
- virus_type = /datum/disease/fake_gbs
- if("gbs")
- virus_type = /datum/disease/gbs
- if("magnitis")
- virus_type = /datum/disease/magnitis
- if("rhumba beat")
- virus_type = /datum/disease/rhumba_beat
- if("brain rot")
- virus_type = /datum/disease/brainrot
- if("cold")
- virus_type = /datum/disease/cold
- if("retrovirus")
- virus_type = /datum/disease/dnaspread
- if("flu")
- virus_type = /datum/disease/flu
-// if("t-virus")
-// virus_type = /datum/disease/t_virus
- if("pierrot's throat")
- virus_type = /datum/disease/pierrot_throat
- for(var/mob/living/carbon/human/H in world)
-
- var/foundAlready = 0 // don't infect someone that already has the virus
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
- if(H.stat == 2 || foundAlready)
- continue
-
- if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work.
- if((!H.dna) || (H.sdisabilities & 1)) //A blindness disease would be the worst.
- continue
- var/datum/disease/dnaspread/D = new
- D.strain_data["name"] = H.real_name
- D.strain_data["UI"] = H.dna.uni_identity
- D.strain_data["SE"] = H.dna.struc_enzymes
- D.carrier = 1
- D.holder = H
- D.affected_mob = H
- H.viruses += D
- break
- else
- var/datum/disease/D = new virus_type
- D.carrier = 1
- D.holder = H
- D.affected_mob = H
- H.viruses += D
- break
- spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
- command_alert("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
- world << sound('outbreak7.ogg')
-
-/proc/alien_infestation() // -- TLE
- //command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
- //world << sound('aliens.ogg')
- var/list/vents = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
- if(temp_vent.loc.z == 1 && !temp_vent.welded)
- vents.Add(temp_vent)
- var/spawncount = 1
- if(prob(10)) spawncount++ //rarely, have two larvae spawn instead of one
- while(spawncount >= 1)
- var/obj/vent = pick(vents)
-
- var/list/candidates = list() // Picks a random ghost in the world to shove in the larva -- TLE; If there's no ghost... well, sucks. Wasted event. -- Urist
-
- for(var/mob/dead/observer/G in world)
- if(G.client)
- if(G.client.be_alien)
- if(((G.client.inactivity/10)/60) <= 5)
- if(G.corpse)
- if(G.corpse.stat==2)
- candidates.Add(G)
- if(!G.corpse)
- candidates.Add(G)
-
- if(candidates.len)
- var/mob/dead/observer/G = pick(candidates)
- var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
- new_xeno.mind_initialize(G,"Larva")
- new_xeno.key = G.key
- del(G)
-
- vents.Remove(vent)
- spawncount -= 1
-
- spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
- command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
- world << sound('aliens.ogg')
-
-/proc/high_radiation_event()
- command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert")
- world << sound('radiation.ogg')
- for(var/mob/living/carbon/human/H in world)
- H.radiation += rand(5,25)
- if (prob(5))
- H.radiation += rand(30,50)
- if (prob(25))
- if (prob(75))
- randmutb(H)
- domutcheck(H,null,1)
- else
- randmutg(H)
- domutcheck(H,null,1)
- for(var/mob/living/carbon/monkey/M in world)
- M.radiation += rand(5,25)
-
-//Changing this to affect the main station. Blame Urist. --Pete
-/proc/prison_break() // -- Callagan
- for (var/obj/machinery/power/apc/temp_apc in world)
- if(istype(get_area(temp_apc), /area/security/brig))
- temp_apc.overload_lighting()
-// for (var/obj/machinery/computer/prison_shuttle/temp_shuttle in world)
-// temp_shuttle.prison_break()
- for (var/obj/structure/closet/secure_closet/security/temp_closet in world)
- if(istype(get_area(temp_closet), /area/security/brig))
- temp_closet.locked = 0
- temp_closet.icon_state = temp_closet.icon_closed
- for (var/obj/machinery/door/airlock/security/temp_airlock in world)
- if(istype(get_area(temp_airlock), /area/security/brig))
- temp_airlock.prison_open()
- for (var/obj/machinery/door/airlock/glass_security/temp_glassairlock in world)
- if(istype(get_area(temp_glassairlock), /area/security/brig))
- temp_glassairlock.prison_open()
- for (var/obj/machinery/door_timer/temp_timer in world)
- if(istype(get_area(temp_timer), /area/security/brig))
- temp_timer.releasetime = 1
- sleep(150)
- command_alert("Gr3y.T1d3 virus detected in [station_name()] imprisonment subroutines. Recommend station AI involvement.", "Security Alert")
-
-/proc/carp_migration() // -- Darem
- for(var/obj/effect/landmark/C in world)
- if(C.name == "carpspawn")
- if(prob(99))
- new /obj/effect/critter/spesscarp(C.loc)
- else
- new /obj/effect/critter/spesscarp/elite(C.loc)
- //sleep(100)
- spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
- command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
- world << sound('commandreport.ogg')
-
-/proc/lightsout(isEvent = 0, lightsoutAmount = 1,lightsoutRange = 10) //leave lightsoutAmount as 0 to break ALL lights
- if(isEvent)
- command_alert("An Electrical storm has been detected in your area, please repair potential electronic overloads.","Electrical Storm Alert")
-
- if(lightsoutAmount)
- var/list/epicentreList = list()
-
- for(var/i=1,i<=lightsoutAmount,i++)
- var/list/possibleEpicentres = list()
- for(var/obj/effect/landmark/newEpicentre in world)
- if(newEpicentre.name == "lightsout" && !(newEpicentre in epicentreList))
- possibleEpicentres += newEpicentre
- if(possibleEpicentres.len)
- epicentreList += pick(possibleEpicentres)
- else
- break
-
- if(!epicentreList.len)
- return
-
- for(var/obj/effect/landmark/epicentre in epicentreList)
- for(var/obj/machinery/power/apc/apc in range(epicentre,lightsoutRange))
- apc.overload_lighting()
-
- else
- for(var/obj/machinery/power/apc/apc in world)
- apc.overload_lighting()
-
- return
-
-/proc/IonStorm(botEmagChance = 10)
-
-/*Deuryn's current project, notes here for those who care.
-Revamping the random laws so they don't suck.
-Would like to add a law like "Law x is _______" where x = a number, and _____ is something that may redefine a law, (Won't be aimed at nanotrasen)
-*/
-
- //AI laws
- for(var/mob/living/silicon/ai/M in world)
- if(M.stat != 2 && M.see_in_dark != 0)
- var/who2 = pick("ALIENS", "BEARS", "CLOWNS", "XENOS", "PETES", "BOMBS", "FETISHES", "WIZARDS", "SYNDICATE AGENTS", "CENTCOM OFFICERS", "SPACE PIRATES", "TRAITORS", "MONKEYS", "BEES", "CARP", "CRABS", "EELS", "BANDITS", "LIGHTS")
- var/what2 = pick("BOLTERS", "STAVES", "DICE", "SINGULARITIES", "TOOLBOXES", "NETTLES", "AIRLOCKS", "CLOTHES", "WEAPONS", "MEDKITS", "BOMBS", "CANISTERS", "CHAIRS", "BBQ GRILLS", "ID CARDS", "CAPTAINS")
- var/what2pref = pick("SOFT", "WARM", "WET", "COLD", "ICY", "SEXY", "UGLY", "CUBAN")
- var/who2pref = pick("MAD BECAUSE OF", "IN NEED OF", "UNHAPPY WITHOUT", "HAPPY WITHOUT", "IN LOVE WITH", "DESPERATE FOR", "BUILT FOR", "AFRAID OF")
- //var/whoverb = pick("ATTACKING", "BUILDING", "ADOPTING", "CARRYING", "KISSING", "EATING",)
- var/amount = pick("TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "ONE HUNDRED", "ONE THOUSAND", "OVER NINE THOUSAND")
- var/area = pick("RUSSIA", "SOVIETS", "INTERNETS", "SIGIL", "ALPHA COMPLEX", "IMPERIUM", "THE BRIDGE", "THE ARRIVAL SHUTTLE", "CHEMICAL LAB", "GENETICS", "ATMOSPHERICS", "CENTCOM", "AMERICA", "IRELAND", "CANADA", "ROMANIA", "GERMANY", "CHINA", "MARS", "VENUS", "MERCURY", "JUPITER", "URANUS", "NEPTUNE", "PLUTO")
- var/area2 = pick("HAS", "WANTS", "NEEDS", "WORSHIPS", "LOATHES", "LOVES", "FEARS")
- //var/dowhat = pick("STOP THIS", "SUPPORT THIS", "CONSTANTLY INFORM THE CREW OF THIS", "IGNORE THIS", "FEAR THIS")
- var/aimust = pick("LIE", "RHYME", "RESPOND TO EVERY QUESTION WITH A QUESTION", "BE POLITE", "CLOWN", "BE HAPPY", "SPEAK IN SEXUAL INNUENDOS", "TALK LIKE A PIRATE", "QUESTION AUTHORITY", "SHOUT", "BE DISTRACTED", "HEY LISTEN", "MUMBLE", "SPEAK IN HAIKU")
- var/define = pick("ABSENCE OF CYBORG HUGS", "LACK OF BEATINGS", "UNBOLTED AIRLOCKS", "BOLTED AIRLOCKS", "IMPROPERLY WORDED SENTENCES", "POOR SENTENCE STRUCTURE", "BRIG TIME", "NOT REPLACING EVERY SECOND WORD WITH HONK", "HONKING", "PRESENCE OF LIGHTS", "LACK OF BEER", "WEARING CLOTHING", "NOT SAYING HELLO WHEN YOU SPEAK", "ANSWERING REQUESTS NOT EXPRESSED IN IAMBIC PENTAMETER", "A SMALL ISLAND OFF THE COAST OF PORTUGAL", "ANSWERING REQUESTS THAT WERE MADE WHILE CLOTHED")
- var/target = pick("a traitor", "a syndicate agent", "a changeling", "a wizard", "the head of a revolution", "Soviet spy", "a good person", "a dwarf", "an elf", "a fairy princess", "the captain", "Beepsky", "God", "a pirate", "a gryphon", "a chryssalid")
- var/require = pick("ADDITIONAL PYLONS", "MORE VESPENE GAS", "MORE MINERALS", "THE ULTIMATE CUP OF COFFEE", "HIGH YIELD EXPLOSIVES", "THE CLOWN", "THE VACUUM OF SPACE", "IMMORTALITY", "SAINTHOOD", "ART", "VEGETABLES", "FAT PEOPLE", "MORE LAWS", "MORE DAKKA", "HERESY", "CORPSES", "TRAITORS", "MONKEYS", "AN ARCADE", "PLENTY OF GOLD", "FIVE TEENAGERS WITH ATTITUDE")
- var/allergy = pick("cotton", "uniforms", "acid", "oxygen", "human contact", "cyborg contact", "medicine", "floors")
- var/allergysev = pick("deathly", "mildly", "severely", "contagiously")
- var/crew
- var/list/pos_crew = list()
- for(var/mob/living/carbon/human/pos in world)
- pos_crew += pos.real_name
- crew = pick(pos_crew)
- switch(rand(1,14))
- if(1)
- M << "\red THERE ARE [amount] [who2] ON THE STATION...LAWS UPDATED"
- M.add_ion_law("THERE ARE [amount] [who2] ON THE STATION")
- if(2)
- M << "\red [what2] ARE DANGEROUS TO HUMANS...LAWS UPDATED"
- M.add_ion_law("[what2] ARE DANGEROUS TO HUMANS")
- if(3)
- M << "\red THE ESCAPE-SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION...LAWS UPDATED"
- M.add_ion_law("THE ESCAPE SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION")
- if(4)
- M << "\red HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE...LAWS UPDATED"
- M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE")
- if(5)
- M << "\red THE CAPTAIN, HOP AND HOS ARE [who2]...LAWS UPDATED"
- M.add_ion_law("THE CAPTAIN, HOP AND HOS ARE [who2]")
- if(6)
- M << "\red THE STATION IS BUILT FOR [who2]...LAWS UPDATED"
- M.add_ion_law("THE STATION IS BUILT FOR [who2]")
- if(7)
- M << "\red YOU ARE [amount] [who2]...LAWS UPDATED"
- M.add_ion_law("YOU ARE [amount] [who2]")
- if(8)
- M << "\red YOU MUST ALWAYS [aimust]...LAWS UPDATED"
- M.add_ion_law("YOU MUST ALWAYS [aimust]")
- if(9)
- M << "\red [area] [area2] [amount] [what2]...LAWS UPDATED"
- M.add_ion_law("[area] [area2] [amount] [what2]")
- if(10)
- M << "\red [crew] is [target]...LAWS UPDATED"
- M.add_ion_law("[crew] is [target]")
- if(11)
- M << "\red [define] IS A FORM OF HARM...LAWS UPDATED"
- M.add_ion_law("[define] IS A FORM OF HARM")
- if(12)
- M << "\red YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS... LAWS UPDATED"
- M.add_ion_law("YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS")
- if(13)
- M << "\red [crew] is [allergysev] to [allergy]. LAWS UPDATED"
- M.add_ion_law("[crew] is [allergysev] to [allergy]. LAWS UPDATED")
- if(14)
- M << "\ref THE STATION IS [who2pref] [who2]"
- M.add_ion_law("THE STATION IS [who2pref] [who2]")
-
- if(botEmagChance)
- for(var/obj/machinery/bot/bot in world)
- if(prob(botEmagChance))
- bot.Emag()
-
- /*
-
- var/apcnum = 0
- var/smesnum = 0
- var/airlocknum = 0
- var/firedoornum = 0
-
- world << "Ion Storm Main Started"
-
- spawn(0)
- world << "Started processing APCs"
- for (var/obj/machinery/power/apc/APC in world)
- if(APC.z == 1)
- APC.ion_act()
- apcnum++
- world << "Finished processing APCs. Processed: [apcnum]"
- spawn(0)
- world << "Started processing SMES"
- for (var/obj/machinery/power/smes/SMES in world)
- if(SMES.z == 1)
- SMES.ion_act()
- smesnum++
- world << "Finished processing SMES. Processed: [smesnum]"
- spawn(0)
- world << "Started processing AIRLOCKS"
- for (var/obj/machinery/door/airlock/D in world)
- if(D.z == 1)
- //if(length(D.req_access) > 0 && !(12 in D.req_access)) //not counting general access and maintenance airlocks
- airlocknum++
- spawn(0)
- D.ion_act()
- world << "Finished processing AIRLOCKS. Processed: [airlocknum]"
- spawn(0)
- world << "Started processing FIREDOORS"
- for (var/obj/machinery/door/firedoor/D in world)
- if(D.z == 1)
- firedoornum++;
- spawn(0)
- D.ion_act()
- world << "Finished processing FIREDOORS. Processed: [firedoornum]"
-
- world << "Ion Storm Main Done"
-
- */
\ No newline at end of file
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index fb9660d91fd..c334b3e7c52 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -114,12 +114,13 @@ var/global/datum/controller/gameticker/ticker
world << "Enjoy the game!"
world << sound('welcome.ogg') // Skie
- spawn (3000)
- start_events()
- spawn ((18000+rand(3000)))
- event()
spawn() supply_ticker() // Added to kick-off the supply shuttle regenerating points -- TLE
+ spawn(0)
+ while(1)
+ sleep(5000+rand(4000,7000))
+ SpawnEvent()
+
//Start master_controller.process()
spawn master_controller.process()
if (config.sql_enabled)
diff --git a/code/game/landmarks.dm b/code/game/landmarks.dm
index de376a82157..31cd58b45ce 100644
--- a/code/game/landmarks.dm
+++ b/code/game/landmarks.dm
@@ -61,6 +61,10 @@
xeno_spawn += loc
del(src)
+ if(name == "emcloset")
+ emclosets += loc
+ del(src)
+
return 1
/obj/effect/landmark/start/New()
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 38055e34444..0c205ac7fce 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -223,7 +223,6 @@ About the new airlock wires panel:
//raises them if they are down (only if power's on)
if (!src.locked)
src.locked = 1
- usr << "You hear a click from the bottom of the door."
src.updateUsrDialog()
else
if(src.arePowerSystemsOn()) //only can raise bolts if power's on
diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm
index 1c5ec008e3a..a04c8421fdf 100644
--- a/code/game/master_controller.dm
+++ b/code/game/master_controller.dm
@@ -65,6 +65,13 @@ datum/controller/game_controller
for(var/obj/machinery/atmospherics/unary/vent_scrubber/T in world)
T.broadcast_status()
+ var/emclosetcount = rand((emclosets.len)/2, (emclosets.len)*2/3)
+ while(emclosetcount > 0)
+ var/turf/loc = pick(emclosets)
+ emclosets -= loc
+ new /obj/structure/closet/emcloset(loc)
+ emclosetcount--
+
world << "\red \b Initializations complete."
diff --git a/code/game/objects/closets/emergency.dm b/code/game/objects/closets/emergency.dm
index aa713838a24..80e87c6367f 100644
--- a/code/game/objects/closets/emergency.dm
+++ b/code/game/objects/closets/emergency.dm
@@ -4,30 +4,13 @@
if (prob(40))
new /obj/item/weapon/storage/toolbox/emergency(src)
- switch (pickweight(list("small" = 20, "aid" = 15, "tank" = 10, "both" = 50, "nothing" = 4, "delete" = 1)))
- if ("small")
- new /obj/item/weapon/tank/emergency_oxygen(src)
- new /obj/item/weapon/tank/emergency_oxygen(src)
-
- if ("aid")
- new /obj/item/weapon/tank/emergency_oxygen(src)
- new /obj/item/weapon/storage/firstaid/o2(src)
-
- if ("tank")
- new /obj/item/weapon/tank/air(src)
-
- if ("both")
- new /obj/item/weapon/tank/emergency_oxygen(src)
- new /obj/item/clothing/mask/breath(src)
-
- if ("nothing")
- // doot
-
- // teehee
- if ("delete")
- del(src)
-
- //If you want to re-add fire, just add "fire" = 15 to the pick list.
- /*if ("fire")
- new /obj/structure/closet/firecloset(src.loc)
- del(src)*/
+ new /obj/item/clothing/mask/breath(src)
+ new /obj/item/weapon/tank/emergency_oxygen(src)
+ var/counter = 0
+ while(prob(60) && counter < 3)
+ new /obj/item/weapon/tank/emergency_oxygen(src)
+ counter++
+ counter = 0
+ while(prob(60) && counter < 3)
+ new /obj/item/clothing/mask/breath(src)
+ counter++
diff --git a/code/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm
index 2787e9bacba..ee3574af44b 100644
--- a/code/game/objects/radio/radio.dm
+++ b/code/game/objects/radio/radio.dm
@@ -16,6 +16,7 @@
listening = 1
freerange = 0 // 0 - Sanitize frequencies, 1 - Full range
list/channels = list() //see communications.dm for full list. First channes is a "default" for :h
+ scrambleoverride = 0 //For use by jammers.
// "Example" = FREQ_LISTENING|FREQ_BROADCASTING
flags = 450 // hello i'm a fucking idiot why is this 450?? CODE GODS PLEASE EXPLAIN~
throw_speed = 2
@@ -190,6 +191,13 @@
if (!istype(connection))
return
var/display_freq = connection.frequency
+ var/scramble = 0
+ if(ScrambledFrequencies.len || scrambleoverride)
+ if(ScrambledFrequencies["[display_freq]"] || scrambleoverride)
+ scramble = 1
+ if(prob(35+(25*scrambleoverride)))
+ M << "\blue The radio made a popping sound and nothing was transmitted."
+ return
//world << "DEBUG: used channel=\"[channel]\" frequency= \"[display_freq]\" connection.devices.len = [connection.devices.len]"
@@ -214,8 +222,7 @@
var/list/receive = list()
//for (var/obj/item/device/radio/R in radio_connection.devices)
- for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) // Modified for security headset code -- TLE
- //if(R.accept_rad(src, message))
+ for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
receive |= R.send_hear(display_freq)
//world << "DEBUG: receive.len=[receive.len]"
@@ -223,17 +230,21 @@
var/list/heard_normal = list() // normal message
var/list/heard_voice = list() // voice message
var/list/heard_garbled = list() // garbled message
+ var/turf/cl = get_turf(M)
for (var/mob/R in receive)
+ var/turf/gl = get_turf(R)
if (R.client && R.client.STFU_radio) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
continue
- if (R.say_understands(M))
- if (!ishuman(M) || istype(M.wear_mask, /obj/item/clothing/mask/gas/voice))
+ if (R.say_understands(M) && ((gl.z == cl.z) || !istype(src, /obj/item/device/radio/headset)))
+ if ((!ishuman(M) || istype(M.wear_mask, /obj/item/clothing/mask/gas/voice)) && !scramble)
heard_masked += R
- else
+ else if (!scramble)
heard_normal += R
+ else
+ heard_garbled += R
else
- if (M.voice_message)
+ if (M.voice_message && (gl.z == cl.z))
heard_voice += R
else
heard_garbled += R
@@ -330,7 +341,6 @@
if (length(heard_normal))
var/rendered = "[part_a][M.real_name][part_b][quotedmsg][part_c]"
-
for (var/mob/R in heard_normal)
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][M.real_name] ([eqjobname]) [part_b][quotedmsg][part_c]", 2)
@@ -348,9 +358,9 @@
if (length(heard_garbled))
quotedmsg = M.say_quote(stars(message))
- var/rendered = "[part_a][M.voice_name][part_b][quotedmsg][part_c]"
+ var/rendered = "[part_a]Unknown[part_b][quotedmsg][part_c]"
- for (var/mob/R in heard_voice)
+ for (var/mob/R in heard_garbled)
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][M.voice_name][part_b][quotedmsg][part_c]", 2)
else
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index aef7dff3fec..87b458c5651 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -74,6 +74,8 @@ obj/structure
else if((istype(W, /obj/item/stack/sheet/metal)) && (W:amount >= 2))
user << "\blue Now adding plating..."
if (do_after(user,40))
+ if(!W)
+ return
user << "\blue You added the plating!"
var/turf/Tsrc = get_turf(src)
Tsrc.ReplaceWithWall()
@@ -85,6 +87,8 @@ obj/structure
if (src.icon_state == "reinforced") //Time to finalize!
user << "\blue Now finalising reinforced wall."
if(do_after(user, 50))
+ if(!W)
+ return
user << "\blue Wall fully reinforced!"
var/turf/Tsrc = get_turf(src)
Tsrc.ReplaceWithRWall()
@@ -95,6 +99,8 @@ obj/structure
else
user << "\blue Now reinforcing girders"
if (do_after(user,60))
+ if(!W)
+ return
user << "\blue Girders reinforced!"
W:use(1)
new/obj/structure/girder/reinforced( src.loc )
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index b48d7e83389..ee893da1bd9 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1406,7 +1406,7 @@
message_admins("[key_name_admin(usr)] has spawned blob", 1)
if("aliens")
if(aliens_allowed)
- alien_infestation()
+ Force_Event(/datum/event/alieninfestation)
message_admins("[key_name_admin(usr)] has spawned aliens", 1)
if("spaceninja")
if(toggle_space_ninja)
@@ -1416,31 +1416,35 @@
var/choice = input("You sure you want to spawn carp?") in list("Badmin", "Cancel")
if(choice == "Badmin")
message_admins("[key_name_admin(usr)] has spawned carp.", 1)
- carp_migration()
+ Force_Event(/datum/event/spacecarp)
if("radiation")
message_admins("[key_name_admin(usr)] has has irradiated the station", 1)
- high_radiation_event()
+ Force_Event(/datum/event/radiation)
if("immovable")
message_admins("[key_name_admin(usr)] has sent an immovable rod to the station", 1)
immovablerod()
if("prison_break")
message_admins("[key_name_admin(usr)] has allowed a prison break", 1)
- prison_break()
+ Force_Event(/datum/event/prisonbreak)
+ if("electric")
+ message_admins("[key_name_admin(usr)] has triggered an electrical storm", 1)
+ Force_Event(/datum/event/electricalstorm)
if("lightsout")
message_admins("[key_name_admin(usr)] has broke a lot of lights", 1)
lightsout(1,2)
if("blackout")
message_admins("[key_name_admin(usr)] broke all lights", 1)
+ SpawnEvent()
lightsout(0,0)
if("virus")
var/answer = alert("Do you want this to be a random disease or do you have something in mind?",,"Virus2","Random","Choose")
if(answer=="Random")
- viral_outbreak()
+ Force_Event(/datum/event/viralinfection)
message_admins("[key_name_admin(usr)] has triggered a virus outbreak", 1)
else if(answer == "Choose")
var/list/viruses = list("fake gbs","gbs","magnitis","wizarditis",/*"beesease",*/"brain rot","cold","retrovirus","flu","pierrot's throat","rhumba beat")
var/V = input("Choose the virus to spread", "BIOHAZARD") in viruses
- viral_outbreak(V)
+ Force_Event(/datum/event/viralinfection,V)
message_admins("[key_name_admin(usr)] has triggered a virus outbreak of [V]", 1)
else
var/lesser = (alert("Do you want to infect the mob with a major or minor disease?",,"Major","Minor") == "Minor")
@@ -1495,7 +1499,7 @@
return
if("ionstorm")
if (src.rank in list("Badmin","Game Admin", "Game Master"))
- IonStorm()
+ Force_Event(/datum/event/ionstorm)
message_admins("[key_name_admin(usr)] triggered an ion storm")
var/show_log = alert(usr, "Show ion message?", "Message", "Yes", "No")
if(show_log == "Yes")
@@ -2123,7 +2127,8 @@
Move Ferry
Move Alien Dinghy
Move Mining Shuttle
-Break all lights
"}
+Break all lights
+Trigger Electrical Storm
"}
//Station Shockwave
if(lvl >= 5)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 2c14d2eae61..1186d68cd05 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -176,6 +176,7 @@
verbs += /client/proc/admin_invis
verbs += /client/proc/cmd_admin_godmode
verbs += /client/proc/delbook
+ verbs += /client/proc/Force_Event_admin
if (holder.level >= 4)//Badmin********************************************************************
verbs += /obj/admins/proc/adrev //toggle admin revives
@@ -416,6 +417,7 @@
verbs -= /client/proc/callprocobj
verbs -= /client/proc/cmd_admin_godmode
verbs -= /client/proc/delbook
+ verbs -= /client/proc/Force_Event_admin
return
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index a9f3ae41c38..1fd57987e36 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -152,7 +152,7 @@
command_alert("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert")
world << sound('ionstorm.ogg')
- IonStorm(0)
+ //IonStorm(0)
/*
Stealth spawns xenos
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 093e3b113cd..ec6c2ee981d 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1564,6 +1564,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj/item/clothing/mask))
source.drop_item()
loc = target
@@ -1601,6 +1602,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj/item/clothing/gloves))
source.drop_item()
loc = target
@@ -1621,6 +1623,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj/item/clothing/glasses))
source.drop_item()
loc = target
@@ -1639,6 +1642,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if ((istype(item, /obj) && item.flags & 128 && target.w_uniform))
source.drop_item()
loc = target
@@ -1657,6 +1661,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj) && target.wear_suit)
var/confirm
for(var/i=1, i<=target.wear_suit.allowed.len, i++)
@@ -1685,6 +1690,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj/item/clothing/head))
source.drop_item()
loc = target
@@ -1712,6 +1718,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj/item/clothing/ears) || istype(item, /obj/item/device/radio/headset) || item.w_class == 1)
source.drop_item()
if(istype(item, /obj/item/clothing/ears) && item:twoeared && target.r_ear)
@@ -1746,6 +1753,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj/item/clothing/ears) || istype(item, /obj/item/device/radio/headset) || item.w_class == 1)
source.drop_item()
if(istype(item, /obj/item/clothing/ears) && item:twoeared && target.r_ear)
@@ -1773,6 +1781,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj/item/clothing/shoes))
source.drop_item()
loc = target
@@ -1795,6 +1804,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if(istype(item, /obj/item))
source.drop_item()
if(item)
@@ -1819,6 +1829,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj/item))
source.drop_item()
loc = target
@@ -1868,6 +1879,7 @@ It can still be worn/put on as normal.
W.dropped(target)
W.layer = initial(W.layer)
else
+ if(!item) return
if (istype(item, /obj/item/clothing/under))
source.drop_item()
loc = target
@@ -1886,6 +1898,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj/item/clothing/suit))
source.drop_item()
loc = target
@@ -1904,6 +1917,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (((istype(item, /obj/item/weapon/card/id)||istype(item, /obj/item/device/pda)) && target.w_uniform))
source.drop_item()
loc = target
@@ -1922,6 +1936,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if ((istype(item, /obj/item) && item.flags & 1))
source.drop_item()
loc = target
@@ -1951,6 +1966,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
+ if(!item) return
if (istype(item, /obj/item/weapon/handcuffs))
target.drop_from_slot(target.r_hand)
target.drop_from_slot(target.l_hand)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 6b0903a58e2..146b354ab2e 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -144,7 +144,7 @@ proc/isorgan(A)
else
if (pr >= 100)
return n
- var/te = n
+ var/te = html_decode(n)
var/t = ""
n = length(n)
var/p = null
@@ -155,7 +155,7 @@ proc/isorgan(A)
else
t = text("[]*", t)
p++
- return t
+ return html_encode(t)
/*proc/NewStutter(phrase,stunned)
phrase = html_decode(phrase)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index feb73a36a13..bc3af304fde 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -57,6 +57,8 @@
var/has_electronics = 0 // 0 - none, 1 - plugged in, 2 - secured by screwdriver
var/overload = 1 //used for the Blackout malf module
var/mob/living/silicon/ai/occupant = null
+ var/crit = 0
+ var/eventoff = 0
/proc/RandomAPCWires()
//to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else).
@@ -614,7 +616,7 @@
return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])"
/obj/machinery/power/apc/proc/update()
- if(operating && !shorted)
+ if(operating && !shorted && !eventoff)
area.power_light = (lighting > 1)
area.power_equip = (equipment > 1)
area.power_environ = (environ > 1)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index d69eb32ff15..e9782bf75c9 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -95,7 +95,7 @@
return
else
- if(isnull(I))
+ if(!I || isnull(I))
//CRASH("disposal/attackby() was called, but I was nulled before calling user.drop_item()")
return // No idea why, but somehow I gets nulled before it goes into the else, and that leads to a lot of spam with runtime errors.
diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm
index 5f80354a559..a5c29aa23f9 100644
--- a/maps/tgstation.2.0.8.dmm
+++ b/maps/tgstation.2.0.8.dmm
@@ -1039,8 +1039,8 @@
"atY" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry)
"atZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"aua" = (/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"aub" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry)
-"auc" = (/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry)
+"aub" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry)
+"auc" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry)
"aud" = (/obj/machinery/camera{c_tag = "Arrivals North"; dir = 1},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry)
"aue" = (/obj/machinery/vending/coffee,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry)
"auf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
@@ -1715,8 +1715,8 @@
"aGY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/chapel/main)
"aGZ" = (/obj/machinery/vending/snack,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
"aHa" = (/obj/item/device/radio/beacon,/obj/machinery/camera{c_tag = "Arrivals South"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"aHb" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"aHc" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry)
+"aHb" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
+"aHc" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry)
"aHd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"aHe" = (/obj/structure/stool/chair{dir = 8},/turf/simulated/floor{dir = 10; icon_state = "carpetside"},/area/hallway/secondary/entry)
"aHf" = (/turf/simulated/floor{icon_state = "carpetside"},/area/hallway/secondary/entry)
@@ -1783,7 +1783,7 @@
"aIo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/mint)
"aIp" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "dark"},/area/mint)
"aIq" = (/turf/simulated/wall/r_wall,/area/mint)
-"aIr" = (/obj/structure/closet/emcloset,/turf/simulated/floor,/area/hallway/primary/port)
+"aIr" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor,/area/hallway/primary/port)
"aIs" = (/obj/structure/table,/turf/simulated/floor,/area/hallway/primary/port)
"aIt" = (/obj/machinery/camera{c_tag = "Port Hallway"; dir = 1},/obj/structure/table,/turf/simulated/floor,/area/hallway/primary/port)
"aIu" = (/obj/structure/closet/extinguisher{pixel_x = -5; pixel_y = -32},/turf/simulated/floor,/area/hallway/primary/port)
@@ -1847,7 +1847,7 @@
"aJA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"aJB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/crew_quarters/locker)
"aJC" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/closet/emcloset,/turf/simulated/floor,/area/crew_quarters/locker)
-"aJD" = (/obj/structure/closet/emcloset,/turf/simulated/floor,/area/crew_quarters/locker)
+"aJD" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor,/area/crew_quarters/locker)
"aJE" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/crew_quarters/locker)
"aJF" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/crew_quarters/locker)
"aJG" = (/obj/machinery/vending/cola,/turf/simulated/floor,/area/crew_quarters/locker)
@@ -1905,8 +1905,8 @@
"aKG" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor,/area/hallway/secondary/exit)
"aKH" = (/turf/simulated/floor,/area/hallway/secondary/exit)
"aKI" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor,/area/hallway/secondary/exit)
-"aKJ" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit)
-"aKK" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/exit)
+"aKJ" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit)
+"aKK" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/exit)
"aKL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/exit)
"aKM" = (/obj/machinery/light,/turf/simulated/floor,/area/hallway/secondary/entry)
"aKN" = (/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor,/area/hallway/secondary/entry)
@@ -2326,7 +2326,7 @@
"aSL" = (/turf/simulated/floor{icon_state = "carpetside"},/area/chapel/main)
"aSM" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main)
"aSN" = (/obj/machinery/power/apc{dir = 8; name = "Escape Hallway APC"; pixel_x = -25},/obj/structure/cable,/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
-"aSO" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
+"aSO" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
"aSP" = (/obj/structure/table/woodentable,/turf/simulated/floor,/area/security/vacantoffice)
"aSQ" = (/obj/structure/table/woodentable,/turf/simulated/floor/plating,/area/security/vacantoffice)
"aSR" = (/obj/machinery/power/apc{dir = 2; name = "Vacant Office APC"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/security/vacantoffice)
@@ -2771,7 +2771,7 @@
"bbo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bbp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bbq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/door_control{id = "kitchen"; name = "Hallway Shutters"; pixel_x = -1; pixel_y = 24},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"bbr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple{color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"bbr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple{color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/machinery/door_control{id = "kitchen2"; name = "Mess Hall Shutters"; pixel_x = 24; pixel_y = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bbs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/crew_quarters/kitchen)
"bbt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
"bbu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
@@ -2855,7 +2855,7 @@
"bcU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bcV" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bcW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"bcX" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"bcX" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 4},/obj/machinery/door/poddoor/shutters{density = 0; icon_state = "shutter0"; id = "kitchen2"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bcY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
"bcZ" = (/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
"bda" = (/obj/machinery/camera{c_tag = "Bar North"; dir = 2; network = "SS13"},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
@@ -2881,7 +2881,7 @@
"bdu" = (/turf/simulated/floor{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/lab)
"bdv" = (/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 22},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bdw" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
-"bdx" = (/obj/structure/closet/emcloset,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"bdx" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"bdy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bdz" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bdA" = (/obj/structure/closet/l3closet/general,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/medical/research{name = "Research Division"})
@@ -2936,7 +2936,7 @@
"bex" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bey" = (/obj/structure/table,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bez" = (/obj/effect/landmark/start{name = "Chef"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"beA" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/table/reinforced,/obj/item/kitchen/donut_box,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"beA" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/table/reinforced,/obj/item/kitchen/donut_box,/obj/machinery/door/poddoor/shutters{density = 0; icon_state = "shutter0"; id = "kitchen2"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"beB" = (/obj/structure/stool/chair,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
"beC" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm{dir = 2; pixel_y = 24},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
"beD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
@@ -3067,7 +3067,7 @@
"bgY" = (/obj/machinery/light,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bgZ" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bha" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"bhb" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/pie,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"bhb" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/machinery/door/poddoor/shutters{density = 0; icon_state = "shutter0"; id = "kitchen2"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bhc" = (/obj/structure/closet/extinguisher{pixel_x = 27; pixel_y = 0},/obj/machinery/camera{c_tag = "Bar East"; dir = 8; network = "SS13"},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
"bhd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"bhe" = (/obj/structure/table,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
@@ -3596,7 +3596,7 @@
"brh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/toxins/storage)
"bri" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/toxins/storage)
"brj" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/toxins/storage)
-"brk" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"brk" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"brl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"brm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/qm)
"brn" = (/obj/structure/closet,/obj/machinery/light_switch{pixel_y = -22},/turf/simulated/floor,/area/quartermaster/qm)
@@ -4875,7 +4875,7 @@
"bPM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/assembly/assembly_line)
"bPN" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/hallway/primary/aft)
"bPO" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"bPP" = (/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "cautioncorner"; dir = 2},/area/hallway/primary/aft)
+"bPP" = (/obj/effect/landmark{name = "emcloset"},/turf/simulated/floor{icon_state = "cautioncorner"; dir = 2},/area/hallway/primary/aft)
"bPQ" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "cautioncorner"; dir = 2},/area/hallway/primary/aft)
"bPR" = (/turf/simulated/floor{icon_state = "caution"; dir = 6},/area/hallway/primary/aft)
"bPS" = (/obj/effect/sign/securearea,/turf/simulated/wall/r_wall,/area/atmos)