diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm
index b4a0cd9ba7b..43082c38ded 100644
--- a/code/ATMOSPHERICS/datum_pipeline.dm
+++ b/code/ATMOSPHERICS/datum_pipeline.dm
@@ -22,7 +22,7 @@
A.nullifyPipenet(src)
return ..()
-/datum/pipeline/proc/process()//This use to be called called from the pipe networks
+/datum/pipeline/process()//This use to be called called from the pipe networks
if(update)
update = 0
reconcile_air()
diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm
index 1c4c12c243d..cbcf2c1dd90 100644
--- a/code/__DEFINES/MC.dm
+++ b/code/__DEFINES/MC.dm
@@ -21,7 +21,6 @@
#define START_PROCESSING(Processor, Datum) if (!Datum.isprocessing) {Datum.isprocessing = TRUE;Processor.processing += Datum}
#define STOP_PROCESSING(Processor, Datum) Datum.isprocessing = FALSE;Processor.processing -= Datum
-#define START_DEFERRED_PROCESSING(Processor, Datum) if (!Datum.isprocessing) {Datum.isprocessing = TRUE;Processor.processing.Insert(1,Datum)}
//SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier)
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 5ee80535780..ba0d1858616 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -13,6 +13,8 @@
//Objects
#define isitem(A) (istype(A, /obj/item))
+#define ismachinery(A) (istype(A, /obj/machinery))
+
#define ismecha(A) (istype(A, /obj/mecha))
#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 5ade3b0baef..29a93ae94f9 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -61,6 +61,8 @@
#define INIT_ORDER_LANGUAGE 6
#define INIT_ORDER_MACHINES 5
#define INIT_ORDER_CIRCUIT 4
+#define INIT_ORDER_HOLIDAY 3
+#define INIT_ORDER_ALARMS 2
#define INIT_ORDER_TIMER 1
#define INIT_ORDER_DEFAULT 0
#define INIT_ORDER_AIR -1
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index 930a8ee9de5..5b90cda376e 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -49,10 +49,10 @@ var/religion_name = null
name = ""
// Prefix
- for(var/holiday_name in holiday_master.holidays)
+ for(var/holiday_name in SSholiday.holidays)
if(holiday_name == "Friday the 13th")
random = 13
- var/datum/holiday/holiday = holiday_master.holidays[holiday_name]
+ var/datum/holiday/holiday = SSholiday.holidays[holiday_name]
name = holiday.getStationPrefix()
//get normal name
if(!name)
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index 436970567a0..968a2f4d577 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -27,7 +27,5 @@ Due to BYOND features used in this codebase, you must update to version 510 or l
This may require updating to a beta release.
#endif
-var/global/list/processing_objects = list() //This has to be initialized BEFORE world
-
// Macros that must exist before world.dm
-#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat
+#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat
\ No newline at end of file
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index c7217221585..906bacf0e54 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -19,7 +19,6 @@ GLOBAL_LIST_INIT(navigation_computers, list())
GLOBAL_LIST_INIT(all_areas, list())
GLOBAL_LIST_INIT(machines, list())
-GLOBAL_LIST_INIT(fast_processing, list())
GLOBAL_LIST_INIT(processing_power_items, list()) //items that ask to be called every cycle
GLOBAL_LIST_INIT(rcd_list, list()) //list of Rapid Construction Devices.
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index f0bb813a336..0b8c8d58a95 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -1,8 +1,6 @@
var/global/obj/effect/overlay/plmaster = null
var/global/obj/effect/overlay/slmaster = null
-// Event Manager, the manager for events.
-var/datum/event_manager/event_manager = new()
// Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it.
var/global/obj/item/radio/intercom/global_announcer = create_global_announcer()
var/global/obj/item/radio/intercom/command/command_announcer = create_command_announcer()
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 24a2442faeb..e3d423130e5 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -154,6 +154,12 @@
#define ui_bot_radio "EAST-1:28,SOUTH:7"
#define ui_bot_pull "EAST-2:26,SOUTH:7"
+//Ghosts
+#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:24"
+#define ui_ghost_orbit "SOUTH:6,CENTER-1:24"
+#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24"
+#define ui_ghost_teleport "SOUTH:6,CENTER+1:24"
+
//HUD styles. Please ensure HUD_VERSIONS is the same as the maximum index. Index order defines how they are cycled in F12.
#define HUD_STYLE_STANDARD 1
#define HUD_STYLE_REDUCED 2
diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm
new file mode 100644
index 00000000000..4e92395f4cc
--- /dev/null
+++ b/code/_onclick/hud/ghost.dm
@@ -0,0 +1,61 @@
+/mob/dead/observer/create_mob_hud()
+ if(client && !hud_used)
+ hud_used = new /datum/hud/ghost(src)
+
+/obj/screen/ghost
+ icon = 'icons/mob/screen_ghost.dmi'
+
+/obj/screen/ghost/MouseEntered()
+ flick(icon_state + "_anim", src)
+
+/obj/screen/ghost/jumptomob
+ name = "Jump to mob"
+ icon_state = "jumptomob"
+
+/obj/screen/ghost/jumptomob/Click()
+ var/mob/dead/observer/G = usr
+ G.jumptomob()
+
+/obj/screen/ghost/orbit
+ name = "Orbit"
+ icon_state = "orbit"
+
+/obj/screen/ghost/orbit/Click()
+ var/mob/dead/observer/G = usr
+ G.follow()
+
+/obj/screen/ghost/reenter_corpse
+ name = "Re-enter corpse"
+ icon_state = "reenter_corpse"
+
+/obj/screen/ghost/reenter_corpse/Click()
+ var/mob/dead/observer/G = usr
+ G.reenter_corpse()
+
+/obj/screen/ghost/teleport
+ name = "Teleport"
+ icon_state = "teleport"
+
+/obj/screen/ghost/teleport/Click()
+ var/mob/dead/observer/G = usr
+ G.dead_tele()
+
+/datum/hud/ghost/New(mob/owner)
+ ..()
+ var/obj/screen/using
+
+ using = new /obj/screen/ghost/jumptomob()
+ using.screen_loc = ui_ghost_jumptomob
+ static_inventory += using
+
+ using = new /obj/screen/ghost/orbit()
+ using.screen_loc = ui_ghost_orbit
+ static_inventory += using
+
+ using = new /obj/screen/ghost/reenter_corpse()
+ using.screen_loc = ui_ghost_reenter_corpse
+ static_inventory += using
+
+ using = new /obj/screen/ghost/teleport()
+ using.screen_loc = ui_ghost_teleport
+ static_inventory += using
diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm
index 134eaec96a6..f997109f90b 100644
--- a/code/controllers/ProcessScheduler/core/process.dm
+++ b/code/controllers/ProcessScheduler/core/process.dm
@@ -158,7 +158,7 @@
/datum/controller/process/proc/setup()
-/datum/controller/process/proc/process()
+/datum/controller/process/proc/process_decrepit()
started()
doWork()
finished()
diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm
index 9fcf6d13759..66d101d178e 100644
--- a/code/controllers/ProcessScheduler/core/processScheduler.dm
+++ b/code/controllers/ProcessScheduler/core/processScheduler.dm
@@ -72,9 +72,9 @@ var/global/datum/controller/processScheduler/processScheduler
scheduler_sleep_interval = world.tick_lag
updateStartDelays()
spawn(0)
- process()
+ process_decrepit()
-/datum/controller/processScheduler/proc/process()
+/datum/controller/processScheduler/proc/process_decrepit()
while(isRunning)
checkRunningProcesses()
queueProcesses()
@@ -154,7 +154,7 @@ var/global/datum/controller/processScheduler/processScheduler
/datum/controller/processScheduler/proc/runProcess(var/datum/controller/process/process)
spawn(0)
- process.process()
+ process.process_decrepit()
/datum/controller/processScheduler/proc/processStarted(var/datum/controller/process/process)
setRunningProcessState(process)
diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm
deleted file mode 100644
index 068ef0c1213..00000000000
--- a/code/controllers/Processes/alarm.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-// We manually initialize the alarm handlers instead of looping over all existing types
-// to make it possible to write: camera.triggerAlarm() rather than alarm_manager.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof.
-/var/global/datum/alarm_handler/atmosphere/atmosphere_alarm = new()
-/var/global/datum/alarm_handler/burglar/burglar_alarm = new()
-/var/global/datum/alarm_handler/camera/camera_alarm = new()
-/var/global/datum/alarm_handler/fire/fire_alarm = new()
-/var/global/datum/alarm_handler/motion/motion_alarm = new()
-/var/global/datum/alarm_handler/power/power_alarm = new()
-
-// Alarm Manager, the manager for alarms.
-var/datum/controller/process/alarm/alarm_manager
-
-/datum/controller/process/alarm
- var/list/datum/alarm/all_handlers
-
-/datum/controller/process/alarm/setup()
- name = "alarm"
- schedule_interval = 20 // every 2 seconds
- all_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
-
-/datum/controller/process/alarm/doWork()
- for(var/datum/alarm_handler/AH in all_handlers)
- AH.process()
-
-DECLARE_GLOBAL_CONTROLLER(alarm, alarm_manager)
-
-/datum/controller/process/alarm/proc/active_alarms()
- var/list/all_alarms = new
- for(var/datum/alarm_handler/AH in all_handlers)
- var/list/alarms = AH.alarms
- all_alarms += alarms
-
- return all_alarms
-
-/datum/controller/process/alarm/proc/number_of_active_alarms()
- var/list/alarms = active_alarms()
- return alarms.len
diff --git a/code/controllers/Processes/event.dm b/code/controllers/Processes/event.dm
deleted file mode 100644
index 42e8c4bcc1d..00000000000
--- a/code/controllers/Processes/event.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-/datum/controller/process/event/setup()
- name = "event"
- schedule_interval = 20 // every 2 seconds
- if(!holiday_master)
- holiday_master = new
- holiday_master.Setup()
-
-/datum/controller/process/event/doWork()
- event_manager.process()
- holiday_master.process()
-
-/////////
-//Holiday controller
-/////////
-
-var/global/datum/controller/holiday/holiday_master //This has to be defined before world.
-
-/datum/controller/holiday
- var/list/holidays
-
-/datum/controller/holiday/proc/Setup()
- getHoliday()
-
-/datum/controller/holiday/proc/process()
- if(holiday_master.holidays)
- for(var/datum/holiday/H in holiday_master.holidays)
- if(H.eventChance)
- if(prob(H.eventChance))
- H.handle_event()
-
-/datum/controller/holiday/proc/getHoliday()
- if(!config.allow_holidays) return //Holiday stuff was not enabled in the config!
-
- var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year
- var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month
- var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day
-
- for(var/H in subtypesof(/datum/holiday))
- var/datum/holiday/holiday = new H()
- if(holiday.shouldCelebrate(DD, MM, YY))
- holiday.celebrate()
- if(!holidays)
- holidays = list()
- holidays[holiday.name] = holiday
-
- if(holidays)
- holidays = shuffle(holidays)
- world.update_status()
diff --git a/code/controllers/Processes/fast_process.dm b/code/controllers/Processes/fast_process.dm
deleted file mode 100644
index c27a749f526..00000000000
--- a/code/controllers/Processes/fast_process.dm
+++ /dev/null
@@ -1,17 +0,0 @@
-/datum/controller/process/fast_process/setup()
- name = "fast processing"
- schedule_interval = 2 //every 0.2 seconds
- start_delay = 9
- log_startup_progress("Fast Processing starting up.")
-
-/datum/controller/process/fast_process/statProcess()
- ..()
- stat(null, "[GLOB.fast_processing.len] fast processes")
-
-/datum/controller/process/fast_process/doWork()
- for(last_object in GLOB.fast_processing)
- var/obj/O = last_object
- try
- O.process()
- catch(var/exception/e)
- catchException(e, O)
\ No newline at end of file
diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm
deleted file mode 100644
index 454709b6194..00000000000
--- a/code/controllers/Processes/obj.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-/datum/controller/process/obj/setup()
- name = "obj"
- schedule_interval = 20 // every 2 seconds
- start_delay = 8
-
-/datum/controller/process/obj/started()
- ..()
- if(!processing_objects)
- processing_objects = list()
-
-/datum/controller/process/obj/statProcess()
- ..()
- stat(null, "[processing_objects.len] objects")
-
-/datum/controller/process/obj/doWork()
- for(last_object in processing_objects)
- var/datum/O = last_object
- if(istype(O) && !QDELETED(O))
- try
- // Reagent datums get shoved in here, but the process proc isn't on the
- // base datum type, so we just call it blindly.
- O:process()
- catch(var/exception/e)
- catchException(e, O)
- SCHECK
- else
- catchBadType(O)
- processing_objects -= O
diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm
index 8fc476116e5..578c2725710 100644
--- a/code/controllers/Processes/ticker.dm
+++ b/code/controllers/Processes/ticker.dm
@@ -30,7 +30,7 @@ DECLARE_GLOBAL_CONTROLLER(ticker, tickerProcess)
lastTickerTime = currentTime
- ticker.process()
+ ticker.process_decrepit()
/datum/controller/process/ticker/proc/getLastTickerTimeDuration()
return lastTickerTimeDuration
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 8fbed1f0b0f..79de45c3248 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -67,7 +67,7 @@ SUBSYSTEM_DEF(air)
setup_allturfs()
setup_atmos_machinery(GLOB.machines)
setup_pipenets(GLOB.machines)
- ..()
+ return ..()
/datum/controller/subsystem/air/fire(resumed = 0)
diff --git a/code/controllers/subsystem/alarm.dm b/code/controllers/subsystem/alarm.dm
new file mode 100644
index 00000000000..90e3ff960f1
--- /dev/null
+++ b/code/controllers/subsystem/alarm.dm
@@ -0,0 +1,30 @@
+SUBSYSTEM_DEF(alarms)
+ name = "Alarms"
+ init_order = INIT_ORDER_ALARMS // 2
+ var/datum/alarm_handler/atmosphere/atmosphere_alarm = new()
+ var/datum/alarm_handler/burglar/burglar_alarm = new()
+ var/datum/alarm_handler/camera/camera_alarm = new()
+ var/datum/alarm_handler/fire/fire_alarm = new()
+ var/datum/alarm_handler/motion/motion_alarm = new()
+ var/datum/alarm_handler/power/power_alarm = new()
+ var/list/datum/alarm/all_handlers
+
+/datum/controller/subsystem/alarms/Initialize(start_timeofday)
+ all_handlers = list(SSalarms.atmosphere_alarm, SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.fire_alarm, SSalarms.motion_alarm, SSalarms.power_alarm)
+ return ..()
+
+/datum/controller/subsystem/alarms/fire()
+ for(var/datum/alarm_handler/AH in all_handlers)
+ AH.process()
+
+/datum/controller/subsystem/alarms/proc/active_alarms()
+ var/list/all_alarms = new ()
+ for(var/datum/alarm_handler/AH in all_handlers)
+ var/list/alarms = AH.alarms
+ all_alarms += alarms
+
+ return all_alarms
+
+/datum/controller/subsystem/alarms/proc/number_of_active_alarms()
+ var/list/alarms = active_alarms()
+ return alarms.len
diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm
index 1423c6cf9bd..cd531db614a 100644
--- a/code/controllers/subsystem/assets.dm
+++ b/code/controllers/subsystem/assets.dm
@@ -14,4 +14,4 @@ SUBSYSTEM_DEF(assets)
for(var/client/C in GLOB.clients)
addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, preload, FALSE), 10)
- ..()
\ No newline at end of file
+ return ..()
\ No newline at end of file
diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm
index a0b2d49d958..cbe8806fc15 100644
--- a/code/controllers/subsystem/atoms.dm
+++ b/code/controllers/subsystem/atoms.dm
@@ -19,6 +19,7 @@ SUBSYSTEM_DEF(atoms)
setupgenetics()
initialized = INITIALIZATION_INNEW_MAPLOAD
InitializeAtoms()
+ return ..()
diff --git a/code/modules/events/event_manager.dm b/code/controllers/subsystem/events.dm
similarity index 73%
rename from code/modules/events/event_manager.dm
rename to code/controllers/subsystem/events.dm
index 1545ddbbdf0..95553ab0d7e 100644
--- a/code/modules/events/event_manager.dm
+++ b/code/controllers/subsystem/events.dm
@@ -1,19 +1,25 @@
-/datum/event_manager
+SUBSYSTEM_DEF(events)
+ name = "Events"
+ init_order = INIT_ORDER_EVENTS
+ runlevels = RUNLEVEL_GAME
+ // Report events at the end of the rouund
+ var/report_at_round_end = 0
+
+ // UI vars
var/window_x = 700
var/window_y = 600
- var/report_at_round_end = 0
var/table_options = " align='center'"
var/head_options = " style='font-weight:bold;'"
var/row_options1 = " width='85px'"
var/row_options2 = " width='260px'"
var/row_options3 = " width='150px'"
+
+ // Event vars
var/datum/event_container/selected_event_container = null
-
- var/list/datum/event/active_events = list()
- var/list/datum/event/finished_events = list()
-
- var/list/datum/event/allEvents
- var/list/datum/event_container/event_containers = list(
+ var/list/active_events = list()
+ var/list/finished_events = list()
+ var/list/allEvents
+ var/list/event_containers = list(
EVENT_LEVEL_MUNDANE = new/datum/event_container/mundane,
EVENT_LEVEL_MODERATE = new/datum/event_container/moderate,
EVENT_LEVEL_MAJOR = new/datum/event_container/major
@@ -21,18 +27,19 @@
var/datum/event_meta/new_event = new
-/datum/event_manager/New()
+/datum/controller/subsystem/events/Initialize()
allEvents = subtypesof(/datum/event)
+ return ..()
-/datum/event_manager/proc/process()
- for(var/datum/event/E in event_manager.active_events)
+/datum/controller/subsystem/events/fire()
+ for(var/datum/event/E in active_events)
E.process()
for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR)
var/list/datum/event_container/EC = event_containers[i]
EC.process()
-/datum/event_manager/proc/event_complete(var/datum/event/E)
+/datum/controller/subsystem/events/proc/event_complete(var/datum/event/E)
if(!E.event_meta) // datum/event is used here and there for random reasons, maintaining "backwards compatibility"
log_debug("Event of '[E.type]' with missing meta-data has completed.")
return
@@ -57,11 +64,11 @@
log_debug("Event '[EM.name]' has completed at [station_time_timestamp()].")
-/datum/event_manager/proc/delay_events(var/severity, var/delay)
+/datum/controller/subsystem/events/proc/delay_events(var/severity, var/delay)
var/list/datum/event_container/EC = event_containers[severity]
EC.next_event_time += delay
-/datum/event_manager/proc/Interact(var/mob/living/user)
+/datum/controller/subsystem/events/proc/Interact(var/mob/living/user)
var/html = GetInteractWindow()
@@ -69,7 +76,7 @@
popup.set_content(html)
popup.open()
-/datum/event_manager/proc/RoundEnd()
+/datum/controller/subsystem/events/proc/RoundEnd()
if(!report_at_round_end)
return
@@ -89,7 +96,7 @@
to_chat(world, message)
-/datum/event_manager/proc/GetInteractWindow()
+/datum/controller/subsystem/events/proc/GetInteractWindow()
var/html = "Refresh"
if(selected_event_container)
@@ -197,7 +204,7 @@
return html
-/datum/event_manager/Topic(href, href_list)
+/datum/controller/subsystem/events/Topic(href, href_list)
if(..())
return
@@ -290,123 +297,3 @@
EC.next_event = null
Interact(usr)
-
-/client/proc/forceEvent(var/type in event_manager.allEvents)
- set name = "Trigger Event (Debug Only)"
- set category = "Debug"
-
- if(!holder)
- return
-
- if(ispath(type))
- new type(new /datum/event_meta(EVENT_LEVEL_MAJOR))
- message_admins("[key_name_admin(usr)] has triggered an event. ([type])", 1)
-
-/client/proc/event_manager_panel()
- set name = "Event Manager Panel"
- set category = "Event"
- if(event_manager)
- event_manager.Interact(usr)
- feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- return
-
-/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in!
- var/area/candidate = null
-
- var/list/safe_areas = list(
- /area/turret_protected/ai,
- /area/turret_protected/ai_upload,
- /area/engine,
- /area/solar,
- /area/holodeck,
- /area/shuttle/arrival,
- /area/shuttle/escape,
- /area/shuttle/escape_pod1/station,
- /area/shuttle/escape_pod2/station,
- /area/shuttle/escape_pod3/station,
- /area/shuttle/escape_pod5/station,
- /area/shuttle/specops/station,
- /area/shuttle/prison/station,
- /area/shuttle/administration/station
- )
-
- //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up.
- var/list/danger_areas = list(
- /area/engine/break_room,
- /area/engine/chiefs_office)
-
- var/list/event_areas = list()
-
- for(var/areapath in the_station_areas)
- event_areas += typesof(areapath)
- for(var/areapath in safe_areas)
- event_areas -= typesof(areapath)
- for(var/areapath in danger_areas)
- event_areas += typesof(areapath)
-
- while(event_areas.len > 0)
- var/list/event_turfs = null
- candidate = locate(pick_n_take(event_areas))
- event_turfs = get_area_turfs(candidate)
- if(event_turfs.len > 0)
- break
-
- return candidate
-
-/datum/event/proc/num_players()
- var/players = 0
- for(var/mob/living/carbon/human/P in GLOB.player_list)
- if(P.client)
- players++
- return players
-
-// Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes)
-// with a specific role.
-// Note that this isn't sorted by department, because e.g. having a roboticist shouldn't make meteors spawn.
-/proc/number_active_with_role()
- var/list/active_with_role = list()
- active_with_role["Engineer"] = 0
- active_with_role["Medical"] = 0
- active_with_role["Security"] = 0
- active_with_role["Scientist"] = 0
- active_with_role["AI"] = 0
- active_with_role["Cyborg"] = 0
- active_with_role["Janitor"] = 0
- active_with_role["Botanist"] = 0
- active_with_role["Any"] = GLOB.player_list.len
-
- for(var/mob/M in GLOB.player_list)
- if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive
- continue
-
- if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module")
- active_with_role["Engineer"]++
- if(M.mind.assigned_role in list("Chief Engineer", "Station Engineer"))
- active_with_role["Engineer"]++
-
- if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "medical robot module")
- active_with_role["Medical"]++
- if(M.mind.assigned_role in list("Chief Medical Officer", "Medical Doctor"))
- active_with_role["Medical"]++
-
- if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "security robot module")
- active_with_role["Security"]++
- if(M.mind.assigned_role in security_positions)
- active_with_role["Security"]++
-
- if(M.mind.assigned_role in list("Research Director", "Scientist"))
- active_with_role["Scientist"]++
-
- if(M.mind.assigned_role == "AI")
- active_with_role["AI"]++
-
- if(M.mind.assigned_role == "Cyborg")
- active_with_role["Cyborg"]++
-
- if(M.mind.assigned_role == "Janitor")
- active_with_role["Janitor"]++
-
- if(M.mind.assigned_role == "Botanist")
- active_with_role["Botanist"]++
-
- return active_with_role
diff --git a/code/controllers/subsystem/holiday.dm b/code/controllers/subsystem/holiday.dm
new file mode 100644
index 00000000000..be9d6d4fc7d
--- /dev/null
+++ b/code/controllers/subsystem/holiday.dm
@@ -0,0 +1,31 @@
+SUBSYSTEM_DEF(holiday)
+ name = "Holiday"
+ init_order = INIT_ORDER_HOLIDAY // 3
+ flags = SS_NO_FIRE
+ var/list/holidays
+
+/datum/controller/subsystem/holiday/Initialize(start_timeofday)
+ if(!config.allow_holidays)
+ return ..() //Holiday stuff was not enabled in the config!
+
+ var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year
+ var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month
+ var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day
+
+ for(var/H in subtypesof(/datum/holiday))
+ var/datum/holiday/holiday = new H()
+ if(holiday.shouldCelebrate(DD, MM, YY))
+ holiday.celebrate()
+ if(!holidays)
+ holidays = list()
+ holidays[holiday.name] = holiday
+
+ if(holidays)
+ holidays = shuffle(holidays)
+ world.update_status()
+ for(var/datum/holiday/H in holidays)
+ if(H.eventChance)
+ if(prob(H.eventChance))
+ H.handle_event()
+
+ return ..()
\ No newline at end of file
diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm
index 65260e5af55..531b6af2e78 100644
--- a/code/controllers/subsystem/icon_smooth.dm
+++ b/code/controllers/subsystem/icon_smooth.dm
@@ -29,4 +29,4 @@ SUBSYSTEM_DEF(icon_smooth)
smooth_icon(A)
CHECK_TICK
- ..()
+ return ..()
diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm
index 3639db6bbd2..ccd83640aa6 100644
--- a/code/controllers/subsystem/jobs.dm
+++ b/code/controllers/subsystem/jobs.dm
@@ -17,7 +17,7 @@ SUBSYSTEM_DEF(jobs)
if(!occupations.len)
SetupOccupations()
LoadJobs("config/jobs.txt")
- ..()
+ return ..()
/datum/controller/subsystem/jobs/proc/SetupOccupations(var/list/faction = list("Station"))
occupations = list()
diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm
index af6898c39bd..7038ad4db4f 100644
--- a/code/controllers/subsystem/machinery.dm
+++ b/code/controllers/subsystem/machinery.dm
@@ -17,7 +17,7 @@ SUBSYSTEM_DEF(machines)
/datum/controller/subsystem/machines/Initialize()
makepowernets()
fire()
- ..()
+ return ..()
/datum/controller/subsystem/machines/proc/makepowernets()
for(var/datum/powernet/PN in powernets)
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index 43c2f406365..d08fba5ff4f 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -28,7 +28,7 @@ SUBSYSTEM_DEF(mapping)
// Populate mining Z-level hidden rooms
for(var/i=0, i[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!")
- processing_objects += src
+ START_PROCESSING(SSobj, src)
/obj/item/clothing/suit/space/changeling/process()
if(ishuman(loc))
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index 2fbbcdc413d..e93556ca843 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -39,7 +39,7 @@
my_message = "Harbringer of the Slaughter: [message]"
else
my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]"
- for(var/mob/M in GLOB.mob_list)
+ for(var/mob/M in GLOB.player_list)
if(iscultist(M))
to_chat(M, my_message)
else if(M in GLOB.dead_mob_list)
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 63e0626f481..60f878257db 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -193,11 +193,11 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
return
/obj/structure/cult/functional/pylon/New()
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
..()
/obj/structure/cult/functional/pylon/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/structure/cult/functional/pylon/process()
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 535823ebfee..5f3ed489107 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -88,7 +88,7 @@
///process()
///Called by the gameticker
-/datum/game_mode/proc/process()
+/datum/game_mode/process()
return 0
//Called by the gameticker
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index c2268063822..6ae995a1e77 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -172,10 +172,10 @@ var/round_start_time = 0
to_chat(world, "Enjoy the game!")
world << sound('sound/AI/welcome.ogg')// Skie
- if(holiday_master.holidays)
+ if(SSholiday.holidays)
to_chat(world, "and...")
- for(var/holidayname in holiday_master.holidays)
- var/datum/holiday/holiday = holiday_master.holidays[holidayname]
+ for(var/holidayname in SSholiday.holidays)
+ var/datum/holiday/holiday = SSholiday.holidays[holidayname]
to_chat(world, "[holiday.greet()]
")
spawn(0) // Forking dynamic room selection
@@ -400,7 +400,7 @@ var/round_start_time = 0
if(m)
to_chat(world, "Tip of the round: [html_encode(m)]")
-/datum/controller/gameticker/proc/process()
+/datum/controller/gameticker/proc/process_decrepit()
if(current_state != GAME_STATE_PLAYING)
return 0
@@ -506,7 +506,7 @@ var/round_start_time = 0
mode.declare_station_goal_completion()
//Ask the event manager to print round end information
- event_manager.RoundEnd()
+ SSevents.RoundEnd()
return 1
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 830ae26f3c1..bfde102ca35 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -56,7 +56,7 @@
var/announced = 0
/obj/machinery/doomsday_device/Destroy()
- GLOB.fast_processing -= src
+ STOP_PROCESSING(SSfastprocess, src)
SSshuttle.emergencyNoEscape = 0
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
@@ -67,7 +67,7 @@
/obj/machinery/doomsday_device/proc/start()
detonation_timer = world.time + default_timer
timing = 1
- GLOB.fast_processing += src
+ START_PROCESSING(SSfastprocess, src)
SSshuttle.emergencyNoEscape = 1
/obj/machinery/doomsday_device/proc/seconds_remaining()
@@ -84,7 +84,7 @@
priority_announcement.Announce("Hostile environment resolved. You have 3 minutes to board the Emergency Shuttle.", "Priority Announcement", 'sound/AI/shuttledock.ogg')
qdel(src)
if(!timing)
- GLOB.fast_processing -= src
+ STOP_PROCESSING(SSfastprocess, src)
return
var/sec_left = seconds_remaining()
if(sec_left <= 0)
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 92ac300cc00..827eefb569d 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -110,15 +110,15 @@
M.SetStunned(0)
M.SetWeakened(0)
combat_cooldown = 0
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/clothing/suit/armor/abductor/vest/process()
combat_cooldown++
if(combat_cooldown==initial(combat_cooldown))
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
/obj/item/clothing/suit/armor/abductor/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
for(var/obj/machinery/abductor/console/C in GLOB.machines)
if(C.vest == src)
C.vest = null
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index 8f058a872e6..fbe1774525f 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -373,11 +373,11 @@
/obj/effect/cocoon/abductor/proc/Start()
hatch_time = world.time + 600
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/effect/cocoon/abductor/process()
if(world.time > hatch_time)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
for(var/mob/M in contents)
src.visible_message("[src] hatches!")
M.forceMove(get_turf(src))
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index 34d1f64f0d0..fa797ac929b 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -32,7 +32,7 @@
return FALSE
return B.host.say_understands(other, speaking)
-/mob/living/captive_brain/emote(var/message)
+/mob/living/captive_brain/emote(act, m_type = 1, message = null, force)
return
/mob/living/captive_brain/resist()
@@ -157,7 +157,7 @@
if(!istype(S.speaking, /datum/language/corticalborer) && loc == host && !talk_inside_host)
to_chat(src, "You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications.")
return
-
+
. = ..()
/mob/living/simple_animal/borer/verb/Communicate()
@@ -475,7 +475,7 @@
set category = "Borer"
set name = "Dominate Victim"
set desc = "Freeze the limbs of a potential host with supernatural fear."
-
+
if(world.time - used_dominate < 150)
to_chat(src, "You cannot use that ability again so soon.")
return
@@ -487,22 +487,22 @@
if(stat)
to_chat(src, "You cannot do that in your current state.")
return
-
+
if(attempting_to_dominate)
to_chat(src, "You're already targeting someone!")
return
-
+
var/list/choices = list()
for(var/mob/living/carbon/C in view(3,src))
if(C.stat != DEAD)
choices += C
-
+
if(world.time - used_dominate < 300)
to_chat(src, "You cannot use that ability again so soon.")
return
-
+
attempting_to_dominate = TRUE
-
+
var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices
if(!M)
@@ -519,8 +519,8 @@
if(incapacitated())
attempting_to_dominate = FALSE
- return
-
+ return
+
if(get_dist(src, M) > 7) //to avoid people remotely doing from across the map etc, 7 is the default view range
to_chat(src, "You're too far away!")
attempting_to_dominate = FALSE
@@ -760,10 +760,9 @@
to_chat(src, "Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.")
visible_message("[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!")
B.chemicals -= 100
-
- new /obj/effect/decal/cleanable/vomit(get_turf(src))
- playsound(loc, 'sound/effects/splat.ogg', 50, 1)
- new /mob/living/simple_animal/borer(get_turf(src),B.generation + 1)
+ var/turf/T = get_turf(src)
+ T.add_vomit_floor()
+ new /mob/living/simple_animal/borer(T, B.generation + 1)
else
to_chat(src, "You need 100 chemicals to reproduce!")
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 94190149848..2e36488cc8a 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -407,7 +407,7 @@ var/bomb_set
/obj/item/disk/nuclear/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
GLOB.poi_list |= src
/obj/item/disk/nuclear/process()
@@ -437,7 +437,7 @@ var/bomb_set
message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]).")
log_game("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]).")
GLOB.poi_list.Remove(src)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
if(blobstart.len > 0)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 30c79798b2f..ea95f62af57 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -335,7 +335,7 @@
include_user = 1
var/blind_smoke_acquired
var/screech_acquired
- var/drainLifeAcquired
+ var/nullChargeAcquired
var/reviveThrallAcquired
action_icon_state = "collective_mind"
@@ -370,10 +370,11 @@
It will create a choking cloud that will blind any non-thralls who enter.")
target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null))
- if(thralls >= CEILING(7 * ticker.mode.thrall_ratio, 1) && !drainLifeAcquired)
- drainLifeAcquired = 1
- to_chat(target, "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself.")
- target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife(null))
+ if(thralls >= CEILING(7 * ticker.mode.thrall_ratio, 1) && !nullChargeAcquired)
+ nullChargeAcquired = 1
+ to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \
+ or sending power until repaired.")
+ target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/null_charge(null))
if(thralls >= CEILING(9 * ticker.mode.thrall_ratio, 1) && !reviveThrallAcquired)
reviveThrallAcquired = 1
@@ -491,45 +492,57 @@
for(var/obj/structure/window/W in T.contents)
W.take_damage(rand(80, 100))
-/obj/effect/proc_holder/spell/aoe_turf/drainLife
- name = "Drain Life"
- desc = "Damages nearby humans, draining their life and healing your own wounds."
+/obj/effect/proc_holder/spell/aoe_turf/null_charge
+ name = "Null Charge"
+ desc = "Empties an APC, preventing it from recharging until fixed."
panel = "Shadowling Abilities"
- range = 3
- charge_max = 100
- clothes_req = 0
- var/targetsDrained
- var/list/nearbyTargets
- action_icon_state = "drain_life"
+ charge_max = 600
+ clothes_req = FALSE
+ action_icon_state = "null_charge"
-/obj/effect/proc_holder/spell/aoe_turf/drainLife/cast(list/targets, mob/user = usr)
+/obj/effect/proc_holder/spell/aoe_turf/null_charge/cast(mob/user = usr)
if(!shadowling_check(user))
charge_counter = charge_max
return
- var/mob/living/carbon/human/U = usr
- targetsDrained = 0
- nearbyTargets = list()
- for(var/turf/T in targets)
- for(var/mob/living/carbon/M in T.contents)
- if(M == src)
- continue
- targetsDrained++
- nearbyTargets.Add(M)
- if(!targetsDrained)
+
+ var/list/local_objs = view(1, user)
+ var/obj/machinery/power/apc/target_apc
+ for(var/object in local_objs)
+ if(istype(object, /obj/machinery/power/apc))
+ target_apc = object
+ break
+
+ if(!target_apc)
+ to_chat(user, "You must stand next to an APC to drain it!")
charge_counter = charge_max
- to_chat(U, "There were no nearby humans for you to drain.")
return
- for(var/mob/living/carbon/M in nearbyTargets)
- U.heal_organ_damage(10, 10)
- U.adjustToxLoss(-10)
- U.adjustOxyLoss(-10)
- U.adjustStaminaLoss(-20)
- U.AdjustWeakened(-1)
- U.AdjustStunned(-1)
- M.adjustOxyLoss(20)
- M.adjustStaminaLoss(20)
- to_chat(M, "You feel a wave of exhaustion and a curious draining sensation directed towards [U]!")
- to_chat(U, "You draw life from those around you to heal your wounds.")
+
+ if(target_apc.cell?.charge == 0)
+ to_chat(user, "APC must have a power to drain!")
+ charge_counter = charge_max
+ return
+
+ target_apc.operating = 0
+ target_apc.update()
+ target_apc.update_icon()
+ target_apc.visible_message("The [target_apc] flickers and begins to grow dark.")
+
+ to_chat(user, "You dim the APC's screen and carefully begin siphoning its power into the void.")
+ if(!do_after(user, 200, target=target_apc))
+ //Whoops! The APC's powers back on
+ to_chat(user, "Your concentration breaks and the APC suddenly repowers!")
+ target_apc.operating = 1
+ target_apc.update()
+ target_apc.update_icon()
+ target_apc.visible_message("The [target_apc] begins glowing brightly!")
+ else
+ //We did it!
+ to_chat(user, "You sent the APC's power to the void while overloading all it's lights!")
+ target_apc.cell?.charge = 0 //Sent to the shadow realm
+ target_apc.chargemode = 0 //Won't recharge either until an someone hits the button
+ target_apc.charging = 0
+ target_apc.null_charge()
+ target_apc.update_icon()
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index f78520ac7eb..5e7b8f9a237 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -226,6 +226,7 @@
target.Weaken(5)
target.stuttering = 20
to_chat(target, "You are blinded by [user]'s glare.")
+ add_attack_logs(user, target, "(Vampire) Glared at")
/obj/effect/proc_holder/spell/vampire/self/shapeshift
name = "Shapeshift (50)"
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index dbe3146dd7f..243f4e3a3fa 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -153,9 +153,13 @@
src.spawn_amt_left = spawn_amt
src.desc = desc
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
//return
+/obj/effect/rend/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
/obj/effect/rend/process()
for(var/mob/M in loc)
return
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 66cdff69b3f..0a1340d885b 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -469,6 +469,24 @@
dat += "Already cast!
"
return dat
+/datum/spellbook_entry/summon/ghosts
+ name = "Summon Ghosts"
+ desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilities to frustrate you."
+ cost = 0
+
+/datum/spellbook_entry/summon/ghosts/IsAvailible()
+ if(!ticker.mode)
+ return FALSE
+ else
+ return TRUE
+
+/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
+ new /datum/event/wizard/ghost()
+ active = TRUE
+ to_chat(user, "You have cast summon ghosts!")
+ playsound(get_turf(user), 'sound/effects/ghost2.ogg', 50, 1)
+ return TRUE
+
/datum/spellbook_entry/summon/guns
name = "Summon Guns"
category = "Rituals"
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 7535381197a..0eb627d1e62 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -295,10 +295,10 @@
to_chat(O, "The screen bursts into static.")
/obj/machinery/camera/proc/triggerCameraAlarm()
- camera_alarm.triggerAlarm(loc, src)
+ SSalarms.camera_alarm.triggerAlarm(loc, src)
/obj/machinery/camera/proc/cancelCameraAlarm()
- camera_alarm.clearAlarm(loc, src)
+ SSalarms.camera_alarm.clearAlarm(loc, src)
/obj/machinery/camera/proc/can_use()
if(!status)
diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm
index eeb9eeb60d3..17f64c07cb8 100644
--- a/code/game/machinery/camera/motion.dm
+++ b/code/game/machinery/camera/motion.dm
@@ -45,7 +45,7 @@
if(!status || (stat & NOPOWER))
return 0
if(detectTime == -1)
- motion_alarm.clearAlarm(loc, src)
+ SSalarms.motion_alarm.clearAlarm(loc, src)
detectTime = 0
return 1
@@ -53,7 +53,7 @@
if(!status || (stat & NOPOWER))
return 0
if(!detectTime) return 0
- motion_alarm.triggerAlarm(loc, src)
+ SSalarms.motion_alarm.triggerAlarm(loc, src)
detectTime = -1
return 1
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 6d360a2ddb3..54841a78a08 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -470,7 +470,7 @@
M.nutrition -= 50 //lose a lot of food
var/turf/location = usr.loc
if(istype(location, /turf/simulated))
- location.add_vomit_floor(src, 1)
+ location.add_vomit_floor(TRUE)
if(ORION_TRAIL_FLUX)
if(prob(75))
M.Weaken(3)
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index f2137d2ee8f..f8c2979e043 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -12,10 +12,10 @@ var/global/list/minor_air_alarms = list()
/obj/machinery/computer/atmos_alert/New()
..()
- atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon)
+ SSalarms.atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon)
/obj/machinery/computer/atmos_alert/Destroy()
- atmosphere_alarm.unregister(src)
+ SSalarms.atmosphere_alarm.unregister(src)
return ..()
/obj/machinery/computer/atmos_alert/attack_hand(mob/user)
@@ -33,10 +33,10 @@ var/global/list/minor_air_alarms = list()
var/major_alarms[0]
var/minor_alarms[0]
- for(var/datum/alarm/alarm in atmosphere_alarm.major_alarms())
+ for(var/datum/alarm/alarm in SSalarms.atmosphere_alarm.major_alarms())
major_alarms[++major_alarms.len] = list("name" = sanitize(alarm.alarm_name()), "ref" = "\ref[alarm]")
- for(var/datum/alarm/alarm in atmosphere_alarm.minor_alarms())
+ for(var/datum/alarm/alarm in SSalarms.atmosphere_alarm.minor_alarms())
minor_alarms[++minor_alarms.len] = list("name" = sanitize(alarm.alarm_name()), "ref" = "\ref[alarm]")
data["priority_alarms"] = major_alarms
@@ -45,11 +45,11 @@ var/global/list/minor_air_alarms = list()
return data
/obj/machinery/computer/atmos_alert/update_icon()
- var/list/alarms = atmosphere_alarm.major_alarms()
+ var/list/alarms = SSalarms.atmosphere_alarm.major_alarms()
if(alarms.len)
icon_screen = "alert:2"
else
- alarms = atmosphere_alarm.minor_alarms()
+ alarms = SSalarms.atmosphere_alarm.minor_alarms()
if(alarms.len)
icon_screen = "alert:1"
else
@@ -61,7 +61,7 @@ var/global/list/minor_air_alarms = list()
return 1
if(href_list["clear_alarm"])
- var/datum/alarm/alarm = locate(href_list["clear_alarm"]) in atmosphere_alarm.alarms
+ var/datum/alarm/alarm = locate(href_list["clear_alarm"]) in SSalarms.atmosphere_alarm.alarms
if(alarm)
for(var/datum/alarm_source/alarm_source in alarm.sources)
var/obj/machinery/alarm/air_alarm = alarm_source.source
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 8fefabbf877..75c4e466a79 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -54,6 +54,7 @@
/obj/machinery/disco/Destroy()
dance_over()
selection = null
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/machinery/disco/attackby(obj/item/O, mob/user, params)
@@ -128,7 +129,7 @@
active = TRUE
update_icon()
dance_setup()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
lights_spin()
updateUsrDialog()
else if(active)
@@ -472,7 +473,7 @@
L.stop_sound_channel(CHANNEL_JUKEBOX)
else if(active)
active = FALSE
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
dance_over()
playsound(src,'sound/machines/terminal_off.ogg',50,1)
icon_state = "disco0"
diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm
index 496d8942bcc..5a53381ef07 100644
--- a/code/game/machinery/doors/airlock_control.dm
+++ b/code/game/machinery/doors/airlock_control.dm
@@ -39,8 +39,7 @@
if(command_completed(cur_command))
cur_command = null
else
- if(!isprocessing)
- START_PROCESSING(SSmachines, src)
+ START_PROCESSING(SSmachines, src)
/obj/machinery/door/airlock/proc/do_command(command)
switch(command)
diff --git a/code/game/machinery/embedded_controller/embedded_program_base.dm b/code/game/machinery/embedded_controller/embedded_program_base.dm
index 1fe527df13b..5bd46b2f3e0 100644
--- a/code/game/machinery/embedded_controller/embedded_program_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_program_base.dm
@@ -17,8 +17,8 @@
/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
return
-/datum/computer/file/embedded_program/proc/process()
- return
+/datum/computer/file/embedded_program/process()
+ return FALSE
/datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line)
if(master)
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index f1651d5bb99..835b0264229 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -143,7 +143,7 @@ FIRE ALARM
alarm()
time = 0
timing = 0
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
updateDialog()
last_process = world.timeofday
@@ -206,9 +206,9 @@ FIRE ALARM
last_process = world.timeofday
if(oldTiming != timing)
if(timing)
- processing_objects += src
+ START_PROCESSING(SSobj, src)
else
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
else if(href_list["tp"])
var/tp = text2num(href_list["tp"])
time += tp
@@ -220,7 +220,7 @@ FIRE ALARM
var/area/A = get_area(src)
A.fire_reset()
for(var/obj/machinery/firealarm/FA in A)
- fire_alarm.clearAlarm(loc, FA)
+ SSalarms.fire_alarm.clearAlarm(loc, FA)
return
/obj/machinery/firealarm/proc/alarm(var/duration = 0)
@@ -228,7 +228,7 @@ FIRE ALARM
return
var/area/A = get_area(src)
for(var/obj/machinery/firealarm/FA in A)
- fire_alarm.triggerAlarm(loc, FA, duration)
+ SSalarms.fire_alarm.triggerAlarm(loc, FA, duration)
update_icon()
//playsound(loc, 'sound/ambience/signal.ogg', 75, 0)
return
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index c74ee23d25c..91dcb43ab57 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -118,25 +118,22 @@ Class Procs:
var/use_log = list()
var/list/settagwhitelist = list()//WHITELIST OF VARIABLES THAT THE set_tag HREF CAN MODIFY, DON'T PUT SHIT YOU DON'T NEED ON HERE, AND IF YOU'RE GONNA USE set_tag (format_tag() proc), ADD TO THIS LIST.
atom_say_verb = "beeps"
- var/defer_process = 0
var/siemens_strength = 0.7 // how badly will it shock you?
-/obj/machinery/Initialize()
- addAtProcessing()
+/obj/machinery/Initialize(mapload)
+ if(!armor)
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
. = ..()
- power_change()
+ GLOB.machines += src
-/obj/machinery/proc/addAtProcessing()
if(use_power)
myArea = get_area(src)
if(!speed_process)
- if(!defer_process)
- START_PROCESSING(SSmachines, src)
- else
- START_DEFERRED_PROCESSING(SSmachines, src)
+ START_PROCESSING(SSmachines, src)
else
- GLOB.fast_processing += src
- isprocessing = TRUE // all of these isprocessing = TRUE can be removed when the PS is dead
+ START_PROCESSING(SSfastprocess, src)
+
+ power_change()
// gotta go fast
/obj/machinery/makeSpeedProcess()
@@ -144,7 +141,7 @@ Class Procs:
return
speed_process = TRUE
STOP_PROCESSING(SSmachines, src)
- GLOB.fast_processing += src
+ START_PROCESSING(SSfastprocess, src)
// gotta go slow
/obj/machinery/makeNormalProcess()
@@ -152,20 +149,16 @@ Class Procs:
return
speed_process = FALSE
START_PROCESSING(SSmachines, src)
- GLOB.fast_processing -= src
-
-/obj/machinery/New() //new
- if(!armor)
- armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
- GLOB.machines += src
- ..()
+ STOP_PROCESSING(SSfastprocess, src)
/obj/machinery/Destroy()
if(myArea)
myArea = null
- GLOB.fast_processing -= src
- STOP_PROCESSING(SSmachines, src)
- GLOB.machines -= src
+ GLOB.machines.Remove(src)
+ if(!speed_process)
+ STOP_PROCESSING(SSmachines, src)
+ else
+ STOP_PROCESSING(SSfastprocess, src)
return ..()
/obj/machinery/proc/locate_machinery()
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index f02b8411e38..9f664eaad76 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -39,7 +39,7 @@
/obj/machinery/syndicatebomb/process()
if(!active)
- GLOB.fast_processing -= src
+ STOP_PROCESSING(SSfastprocess, src)
detonation_timer = null
next_beep = null
countdown.stop()
@@ -73,7 +73,7 @@
if(defused && payload in src)
payload.defuse()
countdown.stop()
- GLOB.fast_processing -= src
+ STOP_PROCESSING(SSfastprocess, src)
/obj/machinery/syndicatebomb/New()
wires = new(src)
@@ -86,7 +86,7 @@
/obj/machinery/syndicatebomb/Destroy()
QDEL_NULL(wires)
QDEL_NULL(countdown)
- GLOB.fast_processing -= src
+ STOP_PROCESSING(SSfastprocess, src)
return ..()
/obj/machinery/syndicatebomb/examine(mob/user)
@@ -205,7 +205,7 @@
/obj/machinery/syndicatebomb/proc/activate()
active = TRUE
- GLOB.fast_processing += src
+ START_PROCESSING(SSfastprocess, src)
countdown.start()
next_beep = world.time + 10
detonation_timer = world.time + (timer_set * 10)
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index 8014a149cf4..54bd17920bd 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -166,10 +166,10 @@
name = "Automatic X-Ray 5000"
desc = "A large metalic machine with an entrance and an exit. A sign on the side reads, 'backpack go in, backpack come out', 'human go in, irradiated human come out'."
-/obj/machinery/transformer/xray/New()
+/obj/machinery/transformer/xray/Initialize(mapload)
+ . = ..()
// On us
new /obj/machinery/conveyor/auto(loc, EAST)
- addAtProcessing()
/obj/machinery/transformer/xray/conveyor/New()
..()
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index f1ad010ea93..8a910670201 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -4,7 +4,7 @@
/obj/item/mecha_parts/mecha_equipment/medical/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/mecha_parts/mecha_equipment/medical/can_attach(obj/mecha/medical/M)
@@ -13,19 +13,19 @@
/obj/item/mecha_parts/mecha_equipment/medical/attach(obj/mecha/M)
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/mecha_parts/mecha_equipment/medical/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/mecha_parts/mecha_equipment/medical/process()
if(!chassis)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return 1
/obj/item/mecha_parts/mecha_equipment/medical/detach()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/mecha_parts/mecha_equipment/medical/sleeper
@@ -66,7 +66,7 @@
return
target.forceMove(src)
patient = target
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
update_equip_info()
occupant_message("[target] successfully loaded into [src]. Life support functions engaged.")
chassis.visible_message("[chassis] loads [target] into [src].")
@@ -90,7 +90,7 @@
patient.forceMove(get_turf(src))
occupant_message("[patient] ejected. Life support functions disabled.")
log_message("[patient] ejected. Life support functions disabled.")
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
patient = null
update_equip_info()
@@ -98,7 +98,7 @@
if(patient)
occupant_message("Unable to detach [src] - equipment occupied!")
return
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/mecha_parts/mecha_equipment/medical/sleeper/get_equip_info()
@@ -221,7 +221,7 @@
set_ready_state(1)
log_message("Deactivated.")
occupant_message("[src] deactivated - no power.")
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
var/mob/living/carbon/M = patient
if(!M)
@@ -263,11 +263,11 @@
processed_reagents = new
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail()
@@ -374,7 +374,7 @@
m++
if(processed_reagents.len)
message += " added to production"
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
occupant_message(message)
occupant_message("Reagent processing started.")
log_message("Reagent processing started.")
@@ -513,7 +513,7 @@
if(!processed_reagents.len || reagents.total_volume >= reagents.maximum_volume || !chassis.has_charge(energy_drain))
occupant_message("Reagent processing stopped.")
log_message("Reagent processing stopped.")
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
var/amount = synth_speed / processed_reagents.len
for(var/reagent in processed_reagents)
diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm
index b1a110813e8..edeb2424711 100644
--- a/code/game/mecha/equipment/tools/mining_tools.dm
+++ b/code/game/mecha/equipment/tools/mining_tools.dm
@@ -116,14 +116,14 @@
/obj/item/mecha_parts/mecha_equipment/mining_scanner/attach(obj/mecha/M)
. = ..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
M.occupant_sight_flags |= SEE_TURFS
if(M.occupant)
M.occupant.update_sight()
/obj/item/mecha_parts/mecha_equipment/mining_scanner/detach()
chassis.occupant_sight_flags &= ~SEE_TURFS
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
if(chassis.occupant)
chassis.occupant.update_sight()
return ..()
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index a42e76015c1..4cfbc5c8143 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -193,7 +193,7 @@
selectable = 0
/obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
if(chassis)
chassis.overlays -= droid_overlay
return ..()
@@ -205,7 +205,7 @@
/obj/item/mecha_parts/mecha_equipment/repair_droid/detach()
chassis.overlays -= droid_overlay
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
/obj/item/mecha_parts/mecha_equipment/repair_droid/get_equip_info()
if(!chassis) return
@@ -217,12 +217,12 @@
if(href_list["toggle_repairs"])
chassis.overlays -= droid_overlay
if(equip_ready)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
droid_overlay = new(icon, icon_state = "repair_droid_a")
log_message("Activated.")
set_ready_state(0)
else
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
droid_overlay = new(icon, icon_state = "repair_droid")
log_message("Deactivated.")
set_ready_state(1)
@@ -232,7 +232,7 @@
/obj/item/mecha_parts/mecha_equipment/repair_droid/process()
if(!chassis)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
set_ready_state(1)
return
var/h_boost = health_boost
@@ -250,10 +250,10 @@
repaired = 1
if(repaired)
if(!chassis.use_power(energy_drain))
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
set_ready_state(1)
else //no repair needed, we turn off
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
set_ready_state(1)
chassis.overlays -= droid_overlay
droid_overlay = new(icon, icon_state = "repair_droid")
@@ -273,11 +273,11 @@
selectable = 0
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/detach()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
..()
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_charge()
@@ -302,11 +302,11 @@
..()
if(href_list["toggle_relay"])
if(equip_ready) //inactive
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
set_ready_state(0)
log_message("Activated.")
else
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
set_ready_state(1)
log_message("Deactivated.")
@@ -317,12 +317,12 @@
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/process()
if(!chassis || chassis.internal_damage & MECHA_INT_SHORT_CIRCUIT)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
set_ready_state(1)
return
var/cur_charge = chassis.get_charge()
if(isnull(cur_charge) || !chassis.cell)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
set_ready_state(1)
occupant_message("No powercell detected.")
return
@@ -358,11 +358,11 @@
/obj/item/mecha_parts/mecha_equipment/generator/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/mecha_parts/mecha_equipment/generator/detach()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
..()
/obj/item/mecha_parts/mecha_equipment/generator/Topic(href, href_list)
@@ -370,11 +370,11 @@
if(href_list["toggle"])
if(equip_ready) //inactive
set_ready_state(0)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
log_message("Activated.")
else
set_ready_state(1)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
log_message("Deactivated.")
/obj/item/mecha_parts/mecha_equipment/generator/get_equip_info()
@@ -447,11 +447,11 @@
/obj/item/mecha_parts/mecha_equipment/generator/process()
if(!chassis)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
set_ready_state(1)
return
if(fuel_amount<=0)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
log_message("Deactivated - no fuel.")
set_ready_state(1)
return
@@ -460,7 +460,7 @@
set_ready_state(1)
occupant_message("No powercell detected.")
log_message("Deactivated.")
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
var/use_fuel = fuel_per_cycle_idle
if(cur_charge < chassis.cell.maxcharge)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 6cfd1d63942..35b94e2eed2 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -118,7 +118,7 @@
smoke_system.attach(src)
add_cell()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
GLOB.poi_list |= src
log_message("[src] created.")
GLOB.mechas_list += src //global mech list
@@ -670,7 +670,7 @@
QDEL_NULL(cell)
QDEL_NULL(internal_tank)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
GLOB.poi_list.Remove(src)
equipment.Cut()
cell = null
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index 59533b338a4..b44c4e3dd1b 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -24,7 +24,7 @@
spawn(3 + metal*3)
process()
spawn(120)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
sleep(30)
if(metal)
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index 405a0ec46f7..ddce32f68fa 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -30,15 +30,15 @@
/obj/effect/particle_effect/smoke/New()
..()
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
lifetime += rand(-1,1)
/obj/effect/particle_effect/smoke/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/particle_effect/smoke/proc/kill_smoke()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
INVOKE_ASYNC(src, .proc/fade_out)
QDEL_IN(src, 10)
diff --git a/code/game/objects/effects/snowcloud.dm b/code/game/objects/effects/snowcloud.dm
index 08a64d62f17..5723b66bc04 100644
--- a/code/game/objects/effects/snowcloud.dm
+++ b/code/game/objects/effects/snowcloud.dm
@@ -9,12 +9,12 @@
/obj/effect/snowcloud/New(turf, obj/machinery/snow_machine/SM)
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
if(SM && istype(SM))
parent_machine = SM
/obj/effect/snowcloud/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/snowcloud/process()
@@ -73,12 +73,12 @@
anchored = TRUE
/obj/effect/snow/New()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
icon_state = "snow[rand(1,6)]"
..()
/obj/effect/snow/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/snow/process()
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index f0233bb0f9e..d4336aa6cf3 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -107,7 +107,7 @@
..()
pixel_x = rand(3,-3)
pixel_y = rand(3,-3)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/structure/spider/eggcluster/process()
amount_grown += rand(0,2)
@@ -140,10 +140,10 @@
..()
pixel_x = rand(6,-6)
pixel_y = rand(6,-6)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/structure/spider/spiderling/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
entry_vent = null
return ..()
diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm
index b32176cb155..8e85709ef97 100644
--- a/code/game/objects/items/ashtray.dm
+++ b/code/game/objects/items/ashtray.dm
@@ -28,7 +28,6 @@
var/obj/item/clothing/mask/cigarette/cig = W
if(cig.lit == 1)
src.visible_message("[user] crushes [cig] in [src], putting it out.")
- processing_objects.Remove(cig)
var/obj/item/butt = new cig.type_butt(src)
cig.transfer_fingerprints_to(butt)
qdel(cig)
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index 85780484264..5ea13308de5 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -18,7 +18,7 @@
light(show_message = 0)
/obj/item/candle/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/candle/update_icon()
@@ -62,7 +62,7 @@
if(show_message)
usr.visible_message(show_message)
set_light(CANDLE_LUM)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
update_icon()
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index 575ce0cb6d6..7bf80244072 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -32,7 +32,7 @@
/obj/item/camera_bug/New()
..()
- processing_objects += src
+ START_PROCESSING(SSobj, src)
/obj/item/camera_bug/Destroy()
get_cameras()
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 27132b75346..5fa2bd692e0 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -227,7 +227,7 @@
return PROCESS_KILL
/obj/item/borg_chameleon/proc/activate(mob/living/silicon/robot/syndicate/saboteur/user)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
S = user
user.base_icon = disguise
user.icon_state = disguise
@@ -236,7 +236,7 @@
user.update_icons()
/obj/item/borg_chameleon/proc/deactivate(mob/living/silicon/robot/syndicate/saboteur/user)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
S = user
user.base_icon = initial(user.base_icon)
user.icon_state = initial(user.icon_state)
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index d0b8637b280..2fb1aae8ff0 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -207,10 +207,10 @@
/obj/item/flash/cameraflash/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/flash/cameraflash/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/flash/cameraflash/process() //this and the two parts above are part of the charge system.
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 24c8cbcd3b7..316b937f749 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -183,10 +183,10 @@
turn_off()
if(!fuel)
src.icon_state = "[initial(icon_state)]-empty"
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
/obj/item/flashlight/flare/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/flashlight/flare/proc/turn_off()
@@ -222,7 +222,7 @@
user.visible_message("[user] activates [src].", "You activate [src].")
src.force = on_damage
src.damtype = "fire"
- processing_objects += src
+ START_PROCESSING(SSobj, src)
// GLOWSTICKS
@@ -344,10 +344,10 @@
/obj/item/flashlight/emp/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/flashlight/emp/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/flashlight/emp/process()
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index 32b548c38aa..43b22eb4979 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -167,7 +167,7 @@
if(energy <= max_energy)
if(!recharging)
recharging = 1
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
if(energy <= 0)
to_chat(user, "You've overused the battery of [src], now it needs time to recharge!")
recharge_locked = 1
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index d142136ed23..62fc36863fc 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -47,10 +47,10 @@
/obj/item/multitool/ai_detect/New()
..()
- processing_objects += src
+ START_PROCESSING(SSobj, src)
/obj/item/multitool/ai_detect/Destroy()
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/multitool/ai_detect/process()
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 0d0475df8ee..463223f4268 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -26,7 +26,7 @@
var/obj/structure/cable/attached // the attached cable
/obj/item/powersink/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
GLOB.processing_power_items.Remove(src)
PN = null
attached = null
@@ -53,7 +53,7 @@
return
else
if(mode == 2)
- processing_objects.Remove(src) // Now the power sink actually stops draining the station's power if you unhook it. --NeoFite
+ STOP_PROCESSING(SSobj, src) // Now the power sink actually stops draining the station's power if you unhook it. --NeoFite
GLOB.processing_power_items.Remove(src)
anchored = 0
mode = 0
@@ -76,14 +76,14 @@
src.visible_message("[user] activates [src]!")
mode = 2
icon_state = "powersink1"
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
GLOB.processing_power_items.Add(src)
if(2) //This switch option wasn't originally included. It exists now. --NeoFite
src.visible_message("[user] deactivates [src]!")
mode = 1
set_light(0)
icon_state = "powersink0"
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
GLOB.processing_power_items.Remove(src)
/obj/item/powersink/pwr_drain()
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 62057880b9b..3064b0ae3c8 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -49,7 +49,7 @@
..()
buildstage = building
if(buildstage)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
if(ndir)
pixel_x = (ndir & EAST|WEST) ? (ndir == EAST ? 28 : -28) : 0
@@ -105,7 +105,7 @@
)
/obj/item/radio/intercom/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
GLOB.global_intercoms.Remove(src)
return ..()
@@ -150,7 +150,7 @@
b_stat = 1
buildstage = 1
update_icon()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return 1
else return ..()
if(2)
@@ -163,7 +163,7 @@
buildstage = 3
to_chat(user, "You secure the electronics!")
update_icon()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
for(var/i, i<= 5, i++)
wires.UpdateCut(i,1)
return 1
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 4a20a52fa04..9bb036c4d05 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -34,7 +34,7 @@ REAGENT SCANNER
/obj/item/t_scanner/Destroy()
if(on)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/t_scanner/attack_self(mob/user)
@@ -43,12 +43,12 @@ REAGENT SCANNER
icon_state = copytext(icon_state, 1, length(icon_state))+"[on]"
if(on)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/t_scanner/process()
if(!on)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return null
scan()
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 064b66b78f4..0b9f6c3aca9 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -256,7 +256,7 @@
/obj/item/borg/upgrade/selfrepair/Destroy()
cyborg = null
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
on = 0
return ..()
@@ -264,10 +264,10 @@
on = !on
if(on)
to_chat(cyborg, "You activate the self-repair module.")
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
else
to_chat(cyborg, "You deactivate the self-repair module.")
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
update_icon()
/obj/item/borg/upgrade/selfrepair/update_icon()
@@ -280,7 +280,7 @@
icon_state = "cyborg_upgrade5"
/obj/item/borg/upgrade/selfrepair/proc/deactivate()
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
on = 0
update_icon()
diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm
index a4599a2e79f..b1b573f77ad 100644
--- a/code/game/objects/items/weapons/caution.dm
+++ b/code/game/objects/items/weapons/caution.dm
@@ -26,7 +26,7 @@
return
timing = !timing
if(timing)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
armed = 0
timepassed = 0
@@ -34,7 +34,7 @@
/obj/item/caution/proximity_sign/process()
if(!timing)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
timepassed++
if(timepassed >= 15 && !armed)
armed = 1
diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm
index 58c2dd2594f..7e7f1642e3a 100644
--- a/code/game/objects/items/weapons/chrono_eraser.dm
+++ b/code/game/objects/items/weapons/chrono_eraser.dm
@@ -177,7 +177,7 @@
update_icon()
desc = initial(desc) + "
It appears to contain [target.name]."
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/effect/chrono_field/Destroy()
if(gun && gun.field_check(src))
diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm
index 1378b5c004d..ce9f5d916a2 100644
--- a/code/game/objects/items/weapons/cigs.dm
+++ b/code/game/objects/items/weapons/cigs.dm
@@ -48,7 +48,7 @@ LIGHTERS ARE IN LIGHTERS.DM
/obj/item/clothing/mask/cigarette/Destroy()
QDEL_NULL(reagents)
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/mask/cigarette/attack(mob/living/M, mob/living/user, def_zone)
@@ -161,7 +161,7 @@ LIGHTERS ARE IN LIGHTERS.DM
var/turf/T = get_turf(src)
T.visible_message(flavor_text)
set_light(2, 0.25, "#E38F46")
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/clothing/mask/cigarette/process()
@@ -213,7 +213,7 @@ LIGHTERS ARE IN LIGHTERS.DM
var/mob/living/M = loc
to_chat(M, "Your [name] goes out.")
M.unEquip(src, 1) //Force the un-equip so the overlays update
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
qdel(src)
@@ -341,7 +341,7 @@ LIGHTERS ARE IN LIGHTERS.DM
if(flavor_text)
var/turf/T = get_turf(src)
T.visible_message(flavor_text)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/clothing/mask/cigarette/pipe/process()
var/turf/location = get_turf(src)
@@ -355,7 +355,7 @@ LIGHTERS ARE IN LIGHTERS.DM
icon_state = icon_off
item_state = icon_off
M.update_inv_wear_mask(0)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
smoke()
return
@@ -366,7 +366,7 @@ LIGHTERS ARE IN LIGHTERS.DM
lit = 0
icon_state = icon_off
item_state = icon_off
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
if(smoketime <= 0)
to_chat(user, "You refill the pipe with tobacco.")
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 75d29c7c6be..dd67d7c67a4 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -33,7 +33,7 @@
/obj/item/flamethrower/process()
if(!lit)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return null
var/turf/location = loc
if(istype(location, /mob/))
@@ -141,7 +141,7 @@
if(!status) return
lit = !lit
if(lit)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
if(href_list["remove"])
if(!ptank) return
usr.put_in_hands(ptank)
diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm
index dd65df1ea3f..4bddaf551ea 100644
--- a/code/game/objects/items/weapons/garrote.dm
+++ b/code/game/objects/items/weapons/garrote.dm
@@ -44,7 +44,7 @@
strangling = null
update_icon()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
else
..()
@@ -97,7 +97,7 @@
M.AdjustSilence(1)
garrote_time = world.time + 10
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
strangling = M
update_icon()
@@ -113,14 +113,14 @@
if(!strangling)
// Our mark got gibbed or similar
update_icon()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
if(!istype(loc, /mob/living/carbon/human))
strangling = null
update_icon()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
var/mob/living/carbon/human/user = loc
@@ -138,7 +138,7 @@
strangling = null
update_icon()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
@@ -148,7 +148,7 @@
strangling = null
update_icon()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index 9e471583d3b..a20dd86c897 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -402,10 +402,10 @@
/obj/item/nullrod/tribal_knife/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/nullrod/tribal_knife/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/nullrod/tribal_knife/process()
@@ -432,10 +432,10 @@
/obj/item/nullrod/rosary/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/nullrod/rosary/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/nullrod/rosary/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 9a7c3f0e27c..88dc4ed6542 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -14,7 +14,7 @@
flags = DROPDEL
-/obj/item/implant/proc/trigger(emote, mob/source)
+/obj/item/implant/proc/trigger(emote, mob/source, force)
return
/obj/item/implant/proc/activate()
diff --git a/code/game/objects/items/weapons/implants/implant_abductor.dm b/code/game/objects/items/weapons/implants/implant_abductor.dm
index a86545f8722..64bb7345f7a 100644
--- a/code/game/objects/items/weapons/implants/implant_abductor.dm
+++ b/code/game/objects/items/weapons/implants/implant_abductor.dm
@@ -13,7 +13,7 @@
if(cooldown == total_cooldown)
home.Retrieve(imp_in,1)
cooldown = 0
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
to_chat(imp_in, "You must wait [(total_cooldown - cooldown)*2] seconds to use [src] again!")
@@ -21,7 +21,7 @@
if(cooldown < total_cooldown)
cooldown++
if(cooldown == total_cooldown)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
/obj/item/implant/abductor/implant(mob/source, mob/user)
if(..())
diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm
index 5f0fea79da9..f1c4dd4126b 100644
--- a/code/game/objects/items/weapons/implants/implant_chem.dm
+++ b/code/game/objects/items/weapons/implants/implant_chem.dm
@@ -33,8 +33,8 @@
-/obj/item/implant/chem/trigger(emote, mob/source)
- if(emote == "deathgasp")
+/obj/item/implant/chem/trigger(emote, mob/source, force)
+ if(force && emote == "deathgasp")
activate(reagents.total_volume)
/obj/item/implant/chem/activate(cause)
diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm
index dea34b2ba91..68c8e111520 100644
--- a/code/game/objects/items/weapons/implants/implant_death_alarm.dm
+++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm
@@ -18,7 +18,7 @@
return dat
/obj/item/implant/death_alarm/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/implant/death_alarm/process()
@@ -61,12 +61,12 @@
/obj/item/implant/death_alarm/implant(mob/target)
if(..())
mobname = target.real_name
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
return 1
return 0
/obj/item/implant/death_alarm/removed(mob/target)
if(..())
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return 1
return 0
diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm
index 30113ea4e96..f37e148bee6 100644
--- a/code/game/objects/items/weapons/implants/implant_explosive.dm
+++ b/code/game/objects/items/weapons/implants/implant_explosive.dm
@@ -20,8 +20,8 @@
"}
return dat
-/obj/item/implant/explosive/trigger(emote, mob/source)
- if(emote == "deathgasp")
+/obj/item/implant/explosive/trigger(emote, mob/source, force)
+ if(force && emote == "deathgasp")
activate("death")
/obj/item/implant/explosive/activate(cause)
@@ -148,8 +148,8 @@
"}
return dat
-/obj/item/implant/dust/trigger(emote, mob/source)
- if(emote == "deathgasp")
+/obj/item/implant/dust/trigger(emote, mob/source, force)
+ if(force && emote == "deathgasp")
activate("death")
/obj/item/implant/dust/activate(cause)
diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm
index a2d8b03da84..ab946de5f0f 100644
--- a/code/game/objects/items/weapons/lighters.dm
+++ b/code/game/objects/items/weapons/lighters.dm
@@ -58,7 +58,7 @@
user.visible_message("After a few attempts, [user] manages to light the [src], [user.p_they()] however burn[user.p_s()] [user.p_their()] finger in the process.")
set_light(2)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
lit = 0
w_class = WEIGHT_CLASS_TINY
@@ -74,7 +74,7 @@
user.visible_message("[user] quietly shuts off the [src].")
set_light(0)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
else
return ..()
return
@@ -181,7 +181,7 @@
name = "lit match"
desc = "A match. This one is lit."
attack_verb = list("burnt","singed")
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
update_icon()
return TRUE
@@ -196,7 +196,7 @@
name = "burnt match"
desc = "A match. This one has seen better days."
attack_verb = list("flicked")
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return TRUE
/obj/item/match/dropped(mob/user)
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index e642e3b994a..7c5c6f9421f 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -89,14 +89,14 @@
/obj/item/mop/advanced/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/mop/advanced/attack_self(mob/user)
refill_enabled = !refill_enabled
if(refill_enabled)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
to_chat(user, "You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.")
playsound(user, 'sound/machines/click.ogg', 30, 1)
@@ -111,7 +111,7 @@
/obj/item/mop/advanced/Destroy()
if(refill_enabled)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 03cf28b25ed..e8a181a197b 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -107,7 +107,7 @@
/obj/item/storage/bag/plasticbag/equipped(var/mob/user, var/slot)
if(slot==slot_head)
storage_slots = 0
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
return
/obj/item/storage/bag/plasticbag/process()
@@ -120,7 +120,7 @@
H.AdjustLoseBreath(1)
else
storage_slots = 7
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
// -----------------------------
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index abf68deb765..e406b097bee 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -642,9 +642,13 @@
new /obj/item/grenade/smokebomb(src)
new /obj/item/restraints/legcuffs/bola(src)
new /obj/item/restraints/legcuffs/bola(src)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
cooldown = world.time
+/obj/item/storage/belt/bluespace/owlman/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
/obj/item/storage/belt/bluespace/owlman/process()
if(cooldown < world.time - 600)
smokecount = 0
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index d533a7e595b..c44264c6529 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -27,13 +27,13 @@
air_contents.volume = volume //liters
air_contents.temperature = T20C
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
return
/obj/item/tank/Destroy()
QDEL_NULL(air_contents)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 98f97b66f53..7afb1885ea2 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -377,7 +377,7 @@
damtype = "brute"
update_icon()
if(!can_off_process)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
//Welders left on now use up fuel, but lets not have them run out quite that fast
if(1)
@@ -539,7 +539,7 @@
damtype = "fire"
hitsound = 'sound/items/welder.ogg'
update_icon()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
to_chat(user, "You need more fuel!")
switched_off(user)
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 29f2c2dd488..4053f747af5 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -557,10 +557,10 @@
/obj/item/twohanded/singularityhammer/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/twohanded/singularityhammer/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/twohanded/singularityhammer/process()
@@ -664,10 +664,10 @@
/obj/item/twohanded/knighthammer/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/twohanded/knighthammer/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/twohanded/knighthammer/process()
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 6506a5fdf2e..c2428dd8d97 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -66,17 +66,14 @@
// Nada
/obj/Destroy()
- GLOB.machines -= src
- processing_objects -= src
- GLOB.fast_processing -= src
+ if(!ismachinery(src))
+ if(!speed_process)
+ STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists
+ else
+ STOP_PROCESSING(SSfastprocess, src)
SSnanoui.close_uis(src)
return ..()
-/obj/proc/process()
- set waitfor = 0
- processing_objects.Remove(src)
- return 0
-
//user: The mob that is suiciding
//damagetype: The type of damage the item will inflict on the user
//BRUTELOSS = 1
@@ -300,15 +297,15 @@ a {
if(speed_process)
return
speed_process = TRUE
- processing_objects.Remove(src)
- GLOB.fast_processing.Add(src)
+ STOP_PROCESSING(SSobj, src)
+ START_PROCESSING(SSfastprocess, src)
/obj/proc/makeNormalProcess()
if(!speed_process)
return
speed_process = FALSE
- processing_objects.Add(src)
- GLOB.fast_processing.Remove(src)
+ START_PROCESSING(SSobj, src)
+ STOP_PROCESSING(SSfastprocess, src)
/obj/vv_get_dropdown()
. = ..()
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index 0692c90ec6d..909ee79e1ab 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -41,7 +41,7 @@
qdel(src)
return
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
..()
/obj/structure/closet/statue/process()
@@ -53,7 +53,7 @@
M.setOxyLoss(intialOxy)
if(timer <= 0)
dump_contents()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
qdel(src)
/obj/structure/closet/statue/dump_contents()
diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm
index b286749f908..a3dc4ac7007 100644
--- a/code/game/objects/structures/depot.dm
+++ b/code/game/objects/structures/depot.dm
@@ -87,7 +87,7 @@
/obj/effect/overload/New()
. = ..()
// Do not attempt to put the code below into Initialize() or even LateInitialize() with a "return INITIALIZE_HINT_LATELOAD". It won't work!
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
depotarea = areaMaster
if(istype(depotarea))
if(!depotarea.used_self_destruct)
@@ -122,6 +122,6 @@
for(var/obj/mecha/E in range(30, T))
E.Destroy()
explosion(get_turf(src), 25, 35, 45, 55, 1, 1, 60, 0, 0)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
qdel(src)
diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm
index 6be7bf072d8..01fab63dd57 100644
--- a/code/game/objects/structures/misc.dm
+++ b/code/game/objects/structures/misc.dm
@@ -92,11 +92,11 @@
last_ghost_alert = world.time
attack_atom = src
if(active)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/structure/ghost_beacon/Destroy()
if(active)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
attack_atom = null
return ..()
@@ -111,9 +111,9 @@
return
to_chat(user, "You [active ? "disable" : "enable"] \the [src].")
if(active)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
else
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
active = !active
/obj/structure/ghost_beacon/process()
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index f0a0c89880f..1bb19a81bd2 100644
--- a/code/game/objects/structures/safe.dm
+++ b/code/game/objects/structures/safe.dm
@@ -14,7 +14,7 @@ GLOBAL_LIST_EMPTY(safes)
desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
icon = 'icons/obj/structures.dmi'
icon_state = "safe"
-
+
anchored = TRUE
density = TRUE
resistance_flags = LAVA_PROOF | FIRE_PROOF
@@ -159,14 +159,14 @@ GLOBAL_LIST_EMPTY(safes)
drill_start_time = world.time
drill.soundloop.start()
update_icon()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
if("Turn Off")
if(do_after(user, 2 SECONDS, target = src))
deltimer(drill_timer)
drill_timer = null
drill.soundloop.stop()
update_icon()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
if("Remove Drill")
if(drill_timer)
to_chat(user, "You cant remove the drill while it's running!")
@@ -208,7 +208,7 @@ GLOBAL_LIST_EMPTY(safes)
if(current_tick == 2)
to_chat(user, "The sounds from [src] are too fast and blend together.")
-
+
if(total_ticks == 1 || prob(10))
to_chat(user, "You hear a [pick(sounds)] from [src].")
@@ -252,7 +252,7 @@ GLOBAL_LIST_EMPTY(safes)
var/invalid_turn = current_tumbler_index % 2 == 0 || current_tumbler_index > number_of_tumblers
if(invalid_turn) // The moment you turn the wrong way or go too far, the tumblers reset
current_tumbler_index = 1
-
+
if(!invalid_turn && dial == tumblers[current_tumbler_index])
notify_user(user, canhear, list("tink", "krink", "plink"), ticks, i)
current_tumbler_index++
@@ -308,7 +308,7 @@ GLOBAL_LIST_EMPTY(safes)
drill_timer = null
drill.soundloop.stop()
update_icon()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
/obj/structure/safe/attackby(obj/item/I, mob/user, params)
if(open)
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index 810659d81bb..04271015f4c 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -19,10 +19,10 @@
/obj/structure/transit_tube/station/New()
..()
- processing_objects += src
+ START_PROCESSING(SSobj, src)
/obj/structure/transit_tube/station/Destroy()
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
return ..()
// Stations which will send the tube in the opposite direction after their stop.
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index e7078cb6877..6b4072a800b 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -224,6 +224,8 @@ var/list/admin_verbs_snpc = list(
var/list/admin_verbs_ticket = list(
/client/proc/openAdminTicketUI,
/client/proc/toggleticketlogs,
+ /client/proc/openMentorTicketUI,
+ /client/proc/toggleMentorTicketLogs,
/client/proc/resolveAllAdminTickets,
/client/proc/resolveAllMentorTickets
)
@@ -926,10 +928,10 @@ var/list/admin_verbs_ticket = list(
to_chat(usr, "You now will get admin log messages.")
/client/proc/toggleMentorTicketLogs()
- set name = "Toggle Mentor Ticket Messgaes"
+ set name = "Toggle Mentor Ticket Messages"
set category = "Preferences"
- if(!check_rights(R_MENTOR))
+ if(!check_rights(R_MENTOR|R_ADMIN))
return
prefs.toggles ^= CHAT_NO_MENTORTICKETLOGS
diff --git a/code/modules/admin/tickets/mentorticketsverbs.dm b/code/modules/admin/tickets/mentorticketsverbs.dm
index 765a1afb9da..1122b770107 100644
--- a/code/modules/admin/tickets/mentorticketsverbs.dm
+++ b/code/modules/admin/tickets/mentorticketsverbs.dm
@@ -5,7 +5,7 @@
set name = "Open Mentor Ticket Interface"
set category = "Admin"
- if(!holder || !check_rights(R_MENTOR))
+ if(!holder || !check_rights(R_MENTOR|R_ADMIN))
return
SSmentor_tickets.showUI(usr)
diff --git a/code/modules/alarm/alarm.dm b/code/modules/alarm/alarm.dm
index 1d4a570999a..798c5176770 100644
--- a/code/modules/alarm/alarm.dm
+++ b/code/modules/alarm/alarm.dm
@@ -29,7 +29,7 @@
cameras() // Sets up both cameras and last alarm area.
set_source_data(source, duration, severity)
-/datum/alarm/proc/process()
+/datum/alarm/process()
// Has origin gone missing?
if(!origin && !end_time)
end_time = world.time + ALARM_RESET_DELAY
diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm
index cd09ebe4427..56a673bb5b4 100644
--- a/code/modules/alarm/alarm_handler.dm
+++ b/code/modules/alarm/alarm_handler.dm
@@ -7,7 +7,7 @@
var/list/datum/alarm/alarms_assoc = new // Associative list of alarms, to efficiently acquire them based on origin.
var/list/listeners = new // A list of all objects interested in alarm changes.
-/datum/alarm_handler/proc/process()
+/datum/alarm_handler/process()
for(var/datum/alarm/A in alarms)
A.process()
check_alarm_cleared(A)
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index a5dfb44aae2..5e0b463af30 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -125,7 +125,7 @@
..()
/obj/item/assembly/process()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
/obj/item/assembly/examine(mob/user)
..()
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
index 853733784fa..3a543e38f72 100644
--- a/code/modules/assembly/health.dm
+++ b/code/modules/assembly/health.dm
@@ -21,10 +21,10 @@
/obj/item/assembly/health/toggle_secure()
secured = !secured
if(secured && scanning)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
scanning = FALSE
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
update_icon()
return secured
@@ -66,9 +66,9 @@
return FALSE
scanning = !scanning
if(scanning)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
/obj/item/assembly/health/interact(mob/user)//TODO: Change this to the wires thingy
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index d47e89a128a..98e59a7cbb5 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -42,12 +42,12 @@
/obj/item/assembly/infra/toggle_secure()
secured = !secured
if(secured)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
on = FALSE
if(first)
qdel(first)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
update_icon()
return secured
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index 80e486170c2..e6ae3ec7bc4 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -28,11 +28,11 @@
/obj/item/assembly/prox_sensor/toggle_secure()
secured = !secured
if(secured)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
scanning = 0
timing = 0
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
update_icon()
return secured
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 5b7eb6ca50a..2c2216fa9d0 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -29,10 +29,10 @@
/obj/item/assembly/timer/toggle_secure()
secured = !secured
if(secured)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
timing = FALSE
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
update_icon()
return secured
diff --git a/code/modules/atmos_automation/statements.dm b/code/modules/atmos_automation/statements.dm
index 31ee71b7a7d..72937e18eae 100644
--- a/code/modules/atmos_automation/statements.dm
+++ b/code/modules/atmos_automation/statements.dm
@@ -29,7 +29,7 @@ var/global/automation_types = subtypesof(/datum/automation)
/datum/automation/proc/OnRemove()
return
-/datum/automation/proc/process()
+/datum/automation/process()
return
/datum/automation/proc/Evaluate()
diff --git a/code/modules/awaymissions/snpc.dm b/code/modules/awaymissions/snpc.dm
index 04e3bf19b8e..8d65aa44a92 100644
--- a/code/modules/awaymissions/snpc.dm
+++ b/code/modules/awaymissions/snpc.dm
@@ -47,7 +47,7 @@
var/list/squad
/obj/effect/spawner/snpc_squad/New()
- processing_objects += src
+ START_PROCESSING(SSobj, src)
squad = squads[squad_type]
if(!squad)
@@ -57,7 +57,7 @@
/obj/effect/spawner/snpc_squad/Destroy()
squad = null
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/spawner/snpc_squad/process()
diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm
index 03adaeda629..3697a4678df 100644
--- a/code/modules/awaymissions/zvis.dm
+++ b/code/modules/awaymissions/zvis.dm
@@ -58,11 +58,11 @@
owner = o
if(args.len >= 3)
params = args.Copy(3)
- processing_objects += src
+ START_PROCESSING(SSobj, src)
trigger()
/obj/effect/portal_sensor/Destroy()
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/portal_sensor/Crossed(A)
diff --git a/code/modules/busy_space/air_traffic.dm b/code/modules/busy_space/air_traffic.dm
index de0b37ed3c3..b5cbf8e6fda 100644
--- a/code/modules/busy_space/air_traffic.dm
+++ b/code/modules/busy_space/air_traffic.dm
@@ -17,7 +17,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
next_message = world.time + rand(delay_min, delay_max)
process()
-/datum/lore/atc_controller/proc/process()
+/datum/lore/atc_controller/process()
if(world.time >= next_message)
if(squelched)
next_message = world.time + backoff_delay
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index ba1b74aad66..ab0dffee5dc 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -94,7 +94,7 @@
/obj/item/clothing/head/cakehat/process()
if(!onfire)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return
var/turf/location = src.loc
@@ -113,7 +113,7 @@
src.force = 3
src.damtype = "fire"
src.icon_state = "cake1"
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
src.force = null
src.damtype = "brute"
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 88f94e5b50a..fdd871a3448 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -122,7 +122,7 @@
else
new_camera(user)
else
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
/obj/item/clothing/suit/space/chronos/proc/activate()
if(!activating && !activated && !teleporting)
@@ -143,7 +143,7 @@
to_chat(user, "\[ ok \] Starting ui display driver")
to_chat(user, "\[ ok \] Initializing chronowalk4-view")
new_camera(user)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
activated = 1
else
to_chat(user, "\[ fail \] Mounting /dev/helmet")
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 382ff910277..9a0354b6b0f 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -633,7 +633,7 @@
owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!")
current_charges--
recharge_cooldown = world.time + recharge_delay
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
if(current_charges <= 0)
owner.visible_message("[owner]'s shield overloads!")
shield_state = "broken"
@@ -643,7 +643,7 @@
/obj/item/clothing/suit/space/hardsuit/shielded/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/suit/space/hardsuit/shielded/process()
@@ -652,7 +652,7 @@
playsound(loc, 'sound/magic/charge.ogg', 50, 1)
if(current_charges == max_charges)
playsound(loc, 'sound/machines/ding.ogg', 50, 1)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
shield_state = "[shield_on]"
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/C = loc
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index c65ea335c4d..913e65af734 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -110,7 +110,7 @@
spark_system.set_up(5, 0, src)
spark_system.attach(src)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
if(initial_modules && initial_modules.len)
for(var/path in initial_modules)
@@ -166,7 +166,7 @@
if(istype(M))
M.unEquip(piece)
qdel(piece)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
QDEL_NULL(wires)
QDEL_NULL(spark_system)
return ..()
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 3499bce8e49..13ef3e074da 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -186,10 +186,10 @@
/obj/item/clothing/suit/corgisuit/super_hero/en/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/clothing/suit/corgisuit/super_hero/en/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/suit/corgisuit/super_hero/en/process()
@@ -883,7 +883,7 @@
/obj/item/clothing/suit/advanced_protective_suit/Destroy()
if(on)
on = 0
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/suit/advanced_protective_suit/ui_action_click()
@@ -893,7 +893,7 @@
else
on = 1
to_chat(usr, "You turn the suit's special processes on.")
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/clothing/suit/advanced_protective_suit/IsReflect()
@@ -912,7 +912,7 @@
if(user.reagents.get_reagent_amount("syndicate_nanites") < 15)
user.reagents.add_reagent("syndicate_nanites", 15)
else
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
//Syndicate Chaplain Robe (WOLOLO!)
/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe
@@ -924,22 +924,22 @@
if(linked_staff) //delink on destruction
linked_staff.robes = null
linked_staff = null
- processing_objects -= src //probably is cleared in a parent call already, but just in case we're gonna do it here
+ STOP_PROCESSING(SSobj, src) //probably is cleared in a parent call already, but just in case we're gonna do it here
return ..()
/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/equipped(mob/living/carbon/human/H, slot)
if(!istype(H) || slot != slot_wear_suit)
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
return
else
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/process()
if(!linked_staff) //if we don't have a linked staff, the rest of this is useless
return
if(!ishuman(loc)) //if we somehow try to process while not on a human, remove ourselves from processing and return
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
return
var/mob/living/carbon/human/H = loc
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 6b08e2e4e49..b1da17677de 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -574,7 +574,7 @@
/obj/item/clothing/accessory/petcollar/Destroy()
QDEL_NULL(access_id)
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/accessory/petcollar/attack_self(mob/user as mob)
@@ -617,10 +617,10 @@
/obj/item/clothing/accessory/petcollar/equipped(mob/living/simple_animal/user)
if(istype(user))
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
/obj/item/clothing/accessory/petcollar/dropped(mob/living/simple_animal/user)
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
/obj/item/clothing/accessory/petcollar/process()
var/mob/living/simple_animal/M = loc
@@ -636,7 +636,7 @@
else
a.autosay("[M] has been vandalized in [t.name]!", "[M]'s Death Alarm")
qdel(a)
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
/proc/english_accessory_list(obj/item/clothing/under/U)
if(!istype(U) || !U.accessories.len)
diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm
index d860ba9c4cd..8769e5e321a 100644
--- a/code/modules/countdown/countdown.dm
+++ b/code/modules/countdown/countdown.dm
@@ -28,13 +28,13 @@
/obj/effect/countdown/proc/start()
if(!started)
- GLOB.fast_processing += src
+ START_PROCESSING(SSfastprocess, src)
started = TRUE
/obj/effect/countdown/proc/stop()
if(started)
maptext = null
- GLOB.fast_processing -= src
+ STOP_PROCESSING(SSfastprocess, src)
started = FALSE
/obj/effect/countdown/proc/get_value()
@@ -57,7 +57,7 @@
/obj/effect/countdown/Destroy()
attached_to = null
- GLOB.fast_processing -= src
+ STOP_PROCESSING(SSfastprocess, src)
return ..()
/obj/effect/countdown/ex_act(severity) //immune to explosions
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 23206e8b9b3..fc27234648d 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -760,10 +760,10 @@
/obj/item/clothing/head/pirate/fluff/stumpy/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/clothing/head/pirate/fluff/stumpy/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/head/pirate/fluff/stumpy/process()
diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm
index 0f5c43059e8..1186da902f0 100644
--- a/code/modules/events/event.dm
+++ b/code/modules/events/event.dm
@@ -105,7 +105,7 @@
//Do not override this proc, instead use the appropiate procs.
//This proc will handle the calls to the appropiate procs.
-/datum/event/proc/process()
+/datum/event/process()
if(!processing)
return
@@ -137,12 +137,12 @@
end()
endedAt = world.time
- event_manager.active_events -= src
- event_manager.event_complete(src)
+ SSevents.active_events -= src
+ SSevents.event_complete(src)
/datum/event/New(var/datum/event_meta/EM)
// event needs to be responsible for this, as stuff like APLUs currently make their own events for curious reasons
- event_manager.active_events += src
+ SSevents.active_events += src
if(!EM)
EM = new /datum/event_meta(EVENT_LEVEL_MAJOR, "Unknown, Most likely admin called", src.type)
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index 6cc12faf1b4..3f86b88924c 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -22,7 +22,7 @@ var/list/event_last_fired = list()
var/last_world_time = 0
-/datum/event_container/proc/process()
+/datum/event_container/process()
if(!next_event_time)
set_event_delay()
diff --git a/code/modules/events/event_procs.dm b/code/modules/events/event_procs.dm
new file mode 100644
index 00000000000..02ae1454597
--- /dev/null
+++ b/code/modules/events/event_procs.dm
@@ -0,0 +1,120 @@
+
+/client/proc/forceEvent(var/type in SSevents.allEvents)
+ set name = "Trigger Event (Debug Only)"
+ set category = "Debug"
+
+ if(!holder)
+ return
+
+ if(ispath(type))
+ new type(new /datum/event_meta(EVENT_LEVEL_MAJOR))
+ message_admins("[key_name_admin(usr)] has triggered an event. ([type])", 1)
+
+/client/proc/event_manager_panel()
+ set name = "Event Manager Panel"
+ set category = "Event"
+ if(SSevents)
+ SSevents.Interact(usr)
+ feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ return
+
+/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in!
+ var/area/candidate = null
+
+ var/list/safe_areas = list(
+ /area/turret_protected/ai,
+ /area/turret_protected/ai_upload,
+ /area/engine,
+ /area/solar,
+ /area/holodeck,
+ /area/shuttle/arrival,
+ /area/shuttle/escape,
+ /area/shuttle/escape_pod1/station,
+ /area/shuttle/escape_pod2/station,
+ /area/shuttle/escape_pod3/station,
+ /area/shuttle/escape_pod5/station,
+ /area/shuttle/specops/station,
+ /area/shuttle/prison/station,
+ /area/shuttle/administration/station
+ )
+
+ //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up.
+ var/list/danger_areas = list(
+ /area/engine/break_room,
+ /area/engine/chiefs_office)
+
+ var/list/event_areas = list()
+
+ for(var/areapath in the_station_areas)
+ event_areas += typesof(areapath)
+ for(var/areapath in safe_areas)
+ event_areas -= typesof(areapath)
+ for(var/areapath in danger_areas)
+ event_areas += typesof(areapath)
+
+ while(event_areas.len > 0)
+ var/list/event_turfs = null
+ candidate = locate(pick_n_take(event_areas))
+ event_turfs = get_area_turfs(candidate)
+ if(event_turfs.len > 0)
+ break
+
+ return candidate
+
+// Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes)
+// with a specific role.
+// Note that this isn't sorted by department, because e.g. having a roboticist shouldn't make meteors spawn.
+/proc/number_active_with_role()
+ var/list/active_with_role = list()
+ active_with_role["Engineer"] = 0
+ active_with_role["Medical"] = 0
+ active_with_role["Security"] = 0
+ active_with_role["Scientist"] = 0
+ active_with_role["AI"] = 0
+ active_with_role["Cyborg"] = 0
+ active_with_role["Janitor"] = 0
+ active_with_role["Botanist"] = 0
+ active_with_role["Any"] = GLOB.player_list.len
+
+ for(var/mob/M in GLOB.player_list)
+ if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive
+ continue
+
+ if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module")
+ active_with_role["Engineer"]++
+ if(M.mind.assigned_role in list("Chief Engineer", "Station Engineer"))
+ active_with_role["Engineer"]++
+
+ if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "medical robot module")
+ active_with_role["Medical"]++
+ if(M.mind.assigned_role in list("Chief Medical Officer", "Medical Doctor"))
+ active_with_role["Medical"]++
+
+ if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "security robot module")
+ active_with_role["Security"]++
+ if(M.mind.assigned_role in security_positions)
+ active_with_role["Security"]++
+
+ if(M.mind.assigned_role in list("Research Director", "Scientist"))
+ active_with_role["Scientist"]++
+
+ if(M.mind.assigned_role == "AI")
+ active_with_role["AI"]++
+
+ if(M.mind.assigned_role == "Cyborg")
+ active_with_role["Cyborg"]++
+
+ if(M.mind.assigned_role == "Janitor")
+ active_with_role["Janitor"]++
+
+ if(M.mind.assigned_role == "Botanist")
+ active_with_role["Botanist"]++
+
+ return active_with_role
+
+/datum/event/proc/num_players()
+ var/players = 0
+ for(var/mob/living/carbon/human/P in GLOB.player_list)
+ if(P.client)
+ players++
+ return players
diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm
index e63805d6a1d..a0aa17596fd 100644
--- a/code/modules/events/false_alarm.dm
+++ b/code/modules/events/false_alarm.dm
@@ -4,7 +4,7 @@
/datum/event/falsealarm/announce()
var/weight = pickweight(list(EVENT_LEVEL_MUNDANE = 60, EVENT_LEVEL_MODERATE = 30, EVENT_LEVEL_MAJOR = 10))
- var/datum/event_container/container = event_manager.event_containers[weight]
+ var/datum/event_container/container = SSevents.event_containers[weight]
var/datum/event/E = container.acquire_event()
var/datum/event/Event = new E
message_admins("False Alarm: [Event]")
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 7d52d7cd969..ced084f05a3 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -539,7 +539,7 @@
/obj/structure/spacevine_controller/New(loc, list/muts, potency, production)
color = "#ffffff"
spawn_spacevine_piece(loc, , muts)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
init_subtypes(/datum/spacevine_mutation/, mutations_list)
if(potency != null && potency > 0)
// 1 mutativeness at 10 potency
@@ -567,7 +567,7 @@
return
/obj/structure/spacevine_controller/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/structure/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts)
diff --git a/code/modules/events/wizard/ghost.dm b/code/modules/events/wizard/ghost.dm
new file mode 100644
index 00000000000..11529e3080d
--- /dev/null
+++ b/code/modules/events/wizard/ghost.dm
@@ -0,0 +1,5 @@
+/datum/event/wizard/ghost //The spook is real
+
+/datum/event/wizard/ghost/start()
+ var/msg = "You suddenly feel extremely obvious..."
+ set_observer_default_invisibility(0, msg)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 855ac60666b..e937ec25ef9 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -138,7 +138,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(target.client)
target.client.images |= flood_images
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
- processing_objects += src
+ START_PROCESSING(SSobj, src)
/obj/effect/hallucination/fake_flood/process()
if(next_expand <= world.time)
@@ -162,7 +162,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
target.client.images |= flood_images
/obj/effect/hallucination/fake_flood/Destroy()
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
flood_turfs.Cut()
if(target.client)
target.client.images.Remove(flood_images)
diff --git a/code/modules/holiday/holiday.dm b/code/modules/holiday/holiday.dm
index 414df7f7589..f87422e2ad1 100644
--- a/code/modules/holiday/holiday.dm
+++ b/code/modules/holiday/holiday.dm
@@ -345,9 +345,9 @@
if(!istype(H)) return
H.celebrate()
- if(!holiday_master.holidays)
- holiday_master.holidays = list()
- holiday_master.holidays[H.name] = H
+ if(!SSholiday.holidays)
+ SSholiday.holidays = list()
+ SSholiday.holidays[H.name] = H
//update our hub status
world.update_status()
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 371822643a1..21ba7cb89e2 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -47,11 +47,11 @@
/obj/structure/beebox/Initialize(mapload)
. = ..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/structure/beebox/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
for(var/mob/living/simple_animal/hostile/poison/bees/B in bees)
B.beehome = null
bees.Cut()
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 4ed9d963274..90725f8e46e 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -151,7 +151,7 @@
burning = 1
set_light(6, l_color = "#ED9200")
Burn()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/structure/bonfire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
@@ -186,7 +186,7 @@
icon_state = "bonfire"
burning = 0
set_light(0)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
/obj/structure/bonfire/buckle_mob(mob/living/M, force = 0)
if(..())
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index b0eafcbc8bb..38d5436ecfb 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -701,8 +701,7 @@
H.nutrition -= 20
H.adjustToxLoss(-3)
var/turf/T = get_turf(H)
- T.add_vomit_floor(H)
- playsound(H, 'sound/effects/splat.ogg', 50, 1)
+ T.add_vomit_floor()
else
visible_message("[src] flickers and fails, due to bluespace interference!")
qdel(src)
diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
index f657fa6ec5f..fd8b8dfa4ef 100644
--- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm
+++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
@@ -35,14 +35,14 @@
/obj/item/melee/ghost_sword/New()
..()
spirits = list()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
GLOB.poi_list |= src
/obj/item/melee/ghost_sword/Destroy()
for(var/mob/dead/observer/G in spirits)
G.invisibility = initial(G.invisibility)
spirits.Cut()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
GLOB.poi_list -= src
. = ..()
diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm
index c3887fe4660..d7c6232121f 100644
--- a/code/modules/mining/lavaland/loot/colossus_loot.dm
+++ b/code/modules/mining/lavaland/loot/colossus_loot.dm
@@ -436,7 +436,7 @@
..()
if(isanimal(loc))
holder_animal = loc
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/structure/closet/stasis/Entered(atom/A)
if(isliving(A) && holder_animal)
@@ -450,7 +450,7 @@
holder_animal.verbs -= /mob/living/verb/pulled
/obj/structure/closet/stasis/dump_contents(var/kill = 1)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
for(var/mob/living/L in src)
L.disabilities &= ~MUTE
L.status_flags &= ~GODMODE
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index dfd4e1e3332..db59a79ec21 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -3,6 +3,8 @@
var/list/image/ghost_darkness_images = list() //this is a list of images for things ghosts should still be able to see when they toggle darkness
+GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
+
/mob/dead/observer
name = "ghost"
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
@@ -29,6 +31,8 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
var/ghost_orbit = GHOST_ORBIT_CIRCLE
/mob/dead/observer/New(var/mob/body=null, var/flags=1)
+ set_invisibility(GLOB.observer_default_invisibility)
+
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
see_invisible = SEE_INVISIBLE_OBSERVER_AI_EYE
see_in_dark = 100
@@ -384,7 +388,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(usr, "AntagHud Toggled OFF")
M.antagHUD = 0
-/mob/dead/observer/proc/dead_tele(A in ghostteleportlocs)
+/mob/dead/observer/proc/dead_tele()
set category = "Ghost"
set name = "Teleport"
set desc= "Teleport to a location"
@@ -397,6 +401,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
spawn(30)
usr.verbs += /mob/dead/observer/proc/dead_tele
+ var/area/A = input("Area to jump to", "BOOYEA") as null|anything in ghostteleportlocs
var/area/thearea = ghostteleportlocs[A]
if(!thearea) return
@@ -410,13 +415,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
usr.forceMove(pick(L))
following = null
-/mob/dead/observer/verb/follow(input in getmobs())
+/mob/dead/observer/verb/follow()
set category = "Ghost"
set name = "Orbit" // "Haunt"
set desc = "Follow and orbit a mob."
- var/target = getmobs()[input]
- if(!target) return
+ var/list/mobs = getpois(skip_mindless=1)
+ var/input = input("Please, select a mob!", "Haunt", null, null) as null|anything in mobs
+ var/mob/target = mobs[input]
ManualFollow(target)
// This is the ghost's follow verb with an argument
@@ -484,24 +490,29 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
update_following()
return ..()
-/mob/dead/observer/verb/jumptomob(target in getmobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak
+/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
set category = "Ghost"
set name = "Jump to Mob"
set desc = "Teleport to a mob"
- if(istype(usr, /mob/dead/observer)) //Make sure they're an observer!
+ if(isobserver(usr)) //Make sure they're an observer!
+ var/list/dest = list() //List of possible destinations (mobs)
+ var/target = null //Chosen target.
- if(!target)//Make sure we actually have a target
+ dest += getpois(mobs_only=1) //Fill list, prompt user with list
+ target = input("Please, select a mob!", "Jump to Mob", null, null) as null|anything in dest
+
+ if(!target) //Make sure we actually have a target
return
else
- var/mob/M = getmobs()[target] //Destination mob
+ var/mob/M = dest[target] //Destination mob
+ var/mob/A = src //Source mob
var/turf/T = get_turf(M) //Turf of the destination mob
if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
- forceMove(T)
- following = null
+ A.forceMove(T)
else
- to_chat(src, "This mob is not located in the game world.")
+ to_chat(A, "This mob is not located in the game world.")
/* Now a spell. See spells.dm
@@ -742,6 +753,26 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/is_literate()
return TRUE
+
+/mob/dead/observer/proc/set_invisibility(value)
+ invisibility = value
+ if(!value)
+ set_light(1, 2)
+ else
+ set_light(0, 0)
+
+/mob/dead/observer/vv_edit_var(var_name, var_value)
+ . = ..()
+ if(var_name == "invisibility")
+ set_invisibility(invisibility) // updates light
+
+/proc/set_observer_default_invisibility(amount, message=null)
+ for(var/mob/dead/observer/G in GLOB.player_list)
+ G.set_invisibility(amount)
+ if(message)
+ to_chat(G, message)
+ GLOB.observer_default_invisibility = amount
+
/mob/dead/observer/proc/open_spawners_menu()
set name = "Mob spawners menu"
set desc = "See all currently available ghost spawners"
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index ab47a84ee76..41c1d89f603 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -17,7 +17,7 @@
. = src.say_dead(message)
-/mob/dead/observer/emote(var/act, var/type, var/message)
+/mob/dead/observer/emote(act, type, message, force)
message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN))
if(!message)
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 0ec193c69e8..989decdb395 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -2,15 +2,20 @@
//Emote Cooldown System (it's so simple!)
/mob/proc/handle_emote_CD(cooldown = EMOTE_COOLDOWN)
- if(emote_cd == 2) return 1 // Cooldown emotes were disabled by an admin, prevent use
- if(src.emote_cd == 1) return 1 // Already on CD, prevent use
+ if(emote_cd == 3) //Spam those emotes
+ return FALSE
+ if(emote_cd == 2) // Cooldown emotes were disabled by an admin, prevent use
+ return TRUE
+ if(emote_cd == 1) // Already on CD, prevent use
+ return TRUE
- src.emote_cd = 1 // Starting cooldown
+ emote_cd = TRUE // Starting cooldown
spawn(cooldown)
- if(emote_cd == 2) return 1 // Don't reset if cooldown emotes were disabled by an admin during the cooldown
- src.emote_cd = 0 // Cooldown complete, ready for more!
+ if(emote_cd == 2)
+ return TRUE // Don't reset if cooldown emotes were disabled by an admin during the cooldown
+ emote_cd = FALSE // Cooldown complete, ready for more!
+ return FALSE // Proceed with emote
- return 0 // Proceed with emote
//--FalseIncarnate
/mob/proc/handle_emote_param(var/target, var/not_self, var/vicinity, var/return_mob) //Only returns not null if the target param is valid.
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 3a6c4d22a67..ee9a3c3cca2 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -7,10 +7,10 @@
/obj/item/holder/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/holder/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/holder/process()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
index f159abebbe4..7412120cff0 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/alien/humanoid/emote(var/act,var/m_type=1,var/message = null)
+/mob/living/carbon/alien/humanoid/emote(act, m_type = 1, message = null, force)
var/param = null
if(findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
@@ -25,7 +25,7 @@
if("flip")
on_CD = handle_emote_CD()
- if(on_CD)
+ if(!force && on_CD == 1)
return
switch(act)
@@ -138,4 +138,4 @@
playsound(src.loc, 'sound/voice/hiss1.ogg', 30, 1, 1)
if(act == "gnarl")
playsound(src.loc, 'sound/voice/hiss4.ogg', 30, 1, 1)
- ..(act, m_type, message)
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm
index 82ebcf943f6..3b18889176b 100644
--- a/code/modules/mob/living/carbon/alien/larva/emote.dm
+++ b/code/modules/mob/living/carbon/alien/larva/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/alien/larva/emote(var/act,var/m_type=1,var/message = null)
+/mob/living/carbon/alien/larva/emote(act, m_type = 1, message = null, force)
var/param = null
if(findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 087ca959902..04f5cd53d00 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -107,7 +107,7 @@
/obj/item/organ/internal/brain/necrotize(update_sprite = TRUE) //Brain also has special handling for when it necrotizes
damage = max_damage
status |= ORGAN_DEAD
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
if(dead_icon && !is_robotic())
icon_state = dead_icon
if(owner && vital)
diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm
index bf7962464da..dd1876e223f 100644
--- a/code/modules/mob/living/carbon/brain/emote.dm
+++ b/code/modules/mob/living/carbon/brain/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/brain/emote(var/act,var/m_type=1,var/message = null)
+/mob/living/carbon/brain/emote(act,m_type = 1, message = null, force)
if(!(container && istype(container, /obj/item/mmi)))//No MMI, no emotes
return
@@ -48,4 +48,4 @@
to_chat(src, "alarm, alert, notice, flash,blink, whistle, beep, boop")
if(message && !stat)
- ..(act, m_type, message)
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 277bbbd8789..77373021727 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -109,7 +109,7 @@
adjustBruteLoss(3)
else
if(T)
- T.add_vomit_floor(src)
+ T.add_vomit_floor()
nutrition -= lost_nutrition
if(stun)
adjustToxLoss(-3)
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 7259a455154..6d245674fd1 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -93,7 +93,7 @@
/mob/living/carbon/human/death(gibbed)
if(can_die() && !gibbed && deathgasp_on_death)
- emote("deathgasp") //let the world KNOW WE ARE DEAD
+ emote("deathgasp", force = TRUE) //let the world KNOW WE ARE DEAD
// Only execute the below if we successfully died
. = ..(gibbed)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 442d7aaf044..416fd911777 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null,var/force)
+/mob/living/carbon/human/emote(act, m_type = 1, message = null, force)
if((stat == DEAD) || (status_flags & FAKEDEATH))
return // No screaming bodies
@@ -13,22 +13,22 @@
if(muzzled)
var/obj/item/clothing/mask/muzzle/M = wear_mask
if(M.mute == MUZZLE_MUTE_NONE)
- muzzled = 0 //Not all muzzles block sound
+ muzzled = FALSE //Not all muzzles block sound
if(!can_speak())
- muzzled = 1
+ muzzled = TRUE
//var/m_type = 1
for(var/obj/item/implant/I in src)
if(I.implanted)
- I.trigger(act, src)
+ I.trigger(act, src, force)
- var/miming = 0
+ var/miming = FALSE
if(mind)
miming = mind.miming
//Emote Cooldown System (it's so simple!)
- // proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
- var/on_CD = 0
+ //handle_emote_CD() located in [code\modules\mob\emote.dm]
+ var/on_CD = FALSE
act = lowertext(act)
switch(act)
//Cooldown-inducing emotes
@@ -61,16 +61,16 @@
else
return
if("squish", "squishes")
- var/found_slime_bodypart = 0
+ var/found_slime_bodypart = FALSE
if(isslimeperson(src)) //Only Slime People can squish
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
- found_slime_bodypart = 1
+ found_slime_bodypart = TRUE
else
for(var/obj/item/organ/external/L in bodyparts) // if your limbs are squishy you can squish too!
if(istype(L.dna.species, /datum/species/slime))
on_CD = handle_emote_CD()
- found_slime_bodypart = 1
+ found_slime_bodypart = TRUE
break
if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt
@@ -118,9 +118,9 @@
on_CD = handle_emote_CD()
//Everything else, including typos of the above emotes
else
- on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
+ on_CD = FALSE //If it doesn't induce the cooldown, we won't check for the cooldown
- if(on_CD == 1) // Check if we need to suppress the emote attempt.
+ if(!force && on_CD == 1) // Check if we need to suppress the emote attempt.
return // Suppress emote, you're still cooling off.
switch(act)
diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm
index a07f1ba3b2e..c938ac17214 100644
--- a/code/modules/mob/living/carbon/slime/emote.dm
+++ b/code/modules/mob/living/carbon/slime/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/slime/emote(act, m_type = 1, message = null)
+/mob/living/carbon/slime/emote(act, m_type = 1, message = null, force)
if(findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
//param = copytext(act, t1 + 1, length(act) + 1)
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 003b5c3d4fe..37077881350 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -57,7 +57,7 @@
SetLoseBreath(0)
if(!gibbed && deathgasp_on_death)
- emote("deathgasp")
+ emote("deathgasp", force = TRUE)
if(mind && suiciding)
mind.suicided = TRUE
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index cf5fff66caa..95b44b15862 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -275,7 +275,7 @@ proc/get_radio_key_from_channel(var/channel)
/mob/living/proc/GetVoice()
return name
-/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't already snowflaked to shit can call the parent and handle emoting sanely
+/mob/living/emote(act, type, message, force) //emote code is terrible, this is so that anything that isn't already snowflaked to shit can call the parent and handle emoting sanely
if(client)
if(client.prefs.muted & MUTE_IC)
to_chat(src, "You cannot speak in IC (Muted).")
@@ -284,7 +284,7 @@ proc/get_radio_key_from_channel(var/channel)
if(stat)
return 0
- if(..(act, type, message))
+ if(..())
return 1
if(act && type && message) //parent call
@@ -306,7 +306,8 @@ proc/get_radio_key_from_channel(var/channel)
return 1
else //everything else failed, emote is probably invalid
- if(act == "help") return //except help, because help is handled individually
+ if(act == "help")
+ return //except help, because help is handled individually
to_chat(src, "Unusable emote '[act]'. Say *help for a list.")
/mob/living/whisper(message as text)
diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm
index 3385c4ce622..1b1ee4f7f48 100644
--- a/code/modules/mob/living/silicon/emote.dm
+++ b/code/modules/mob/living/silicon/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/silicon/emote(var/act, var/m_type=1, var/message = null)
+/mob/living/silicon/emote(act, m_type=1, message = null, force)
var/param = null
if(findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
@@ -6,7 +6,7 @@
act = copytext(act, 1, t1)
//Emote Cooldown System (it's so simple!)
- // proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
+ //handle_emote_CD() located in [code\modules\mob\emote.dm]
var/on_CD = 0
act = lowertext(act)
switch(act)
@@ -20,7 +20,7 @@
else
on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
- if(on_CD == 1) // Check if we need to suppress the emote attempt.
+ if(!force && on_CD == 1) // Check if we need to suppress the emote attempt.
return // Suppress emote, you're still cooling off.
//--FalseIncarnate
@@ -78,4 +78,4 @@
if("help")
to_chat(src, "yes, no, beep, ping, buzz, scream, buzz2")
- ..(act, m_type, message)
+ ..()
diff --git a/code/modules/mob/living/silicon/pai/emote.dm b/code/modules/mob/living/silicon/pai/emote.dm
deleted file mode 100644
index a418c0972d5..00000000000
--- a/code/modules/mob/living/silicon/pai/emote.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/mob/living/silicon/pai/emote(var/act, var/m_type=1, var/message = null)
- ..(act, m_type, message)
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index fec27db5df8..989dcba3783 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -57,12 +57,6 @@ var/datum/paiController/paiController // Global handler for pAI candidates
usr << browse(null, "window=findPai")
- if(candidate)
- if(candidate.key && usr.key && candidate.key != usr.key)
- message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)")
- log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)")
- return
-
if("signup" in href_list)
var/mob/dead/observer/O = locate(href_list["signup"])
if(!O)
@@ -75,6 +69,11 @@ var/datum/paiController/paiController // Global handler for pAI candidates
recruitWindow(O)
return
+ if(candidate)
+ if(candidate.key && usr.key && candidate.key != usr.key)
+ message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)")
+ log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)")
+ return
if(href_list["new"])
var/option = href_list["option"]
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 21a09eed8a8..7402c4a65c9 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -50,7 +50,7 @@
/mob/living/silicon/robot/death(gibbed)
if(can_die())
if(!gibbed && deathgasp_on_death)
- emote("deathgasp")
+ emote("deathgasp", force = TRUE)
if(module)
module.handle_death(gibbed)
diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
index 9c130780d81..bec1e1ae668 100644
--- a/code/modules/mob/living/silicon/robot/emote.dm
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/silicon/robot/emote(var/act, var/m_type=1, var/message = null)
+/mob/living/silicon/robot/emote(act, m_type=1, message = null, force)
var/param = null
if(findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
@@ -6,7 +6,7 @@
act = copytext(act, 1, t1)
//Emote Cooldown System (it's so simple!)
- //proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
+ //handle_emote_CD() located in [code\modules\mob\emote.dm]
var/on_CD = 0
act = lowertext(act)
switch(act)
@@ -17,7 +17,7 @@
else
on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
- if(on_CD == 1) // Check if we need to suppress the emote attempt.
+ if(!force && on_CD == 1) // Check if we need to suppress the emote attempt.
return // Suppress emote, you're still cooling off.
//--FalseIncarnate
@@ -160,7 +160,7 @@
if("help")
to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitches, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look,\n law, halt")
- ..(act, m_type, message)
+ ..()
/mob/living/silicon/robot/verb/powerwarn()
set category = "Robot Commands"
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 17a7e67adf7..8092947919f 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -103,7 +103,7 @@
return
return 1
-/mob/living/silicon/ai/emote(var/act, var/type, var/message)
+/mob/living/silicon/ai/emote(act, type, message, force)
var/obj/machinery/hologram/holopad/T = current
if(istype(T) && T.masters[src])//Is the AI using a holopad?
src.holopad_emote(message)
diff --git a/code/modules/mob/living/silicon/subsystems.dm b/code/modules/mob/living/silicon/subsystems.dm
index fa3dcfd2cfa..8f7c2316768 100644
--- a/code/modules/mob/living/silicon/subsystems.dm
+++ b/code/modules/mob/living/silicon/subsystems.dm
@@ -41,7 +41,7 @@
if(!register_alarms)
return
- var/list/register_to = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
+ var/list/register_to = list(SSalarms.atmosphere_alarm, SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.fire_alarm, SSalarms.motion_alarm, SSalarms.power_alarm)
for(var/datum/alarm_handler/AH in register_to)
AH.register(src, /mob/living/silicon/proc/receive_alarm)
queued_alarms[AH] = list() // Makes sure alarms remain listed in consistent order
diff --git a/code/modules/mob/living/simple_animal/bot/emote.dm b/code/modules/mob/living/simple_animal/bot/emote.dm
index eb6a18e8657..c59e044cc67 100644
--- a/code/modules/mob/living/simple_animal/bot/emote.dm
+++ b/code/modules/mob/living/simple_animal/bot/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/bot/emote(act, m_type=1, message = null)
+/mob/living/simple_animal/bot/emote(act, m_type = 1, message = null, force)
var/param = null
if(findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
@@ -9,7 +9,7 @@
act = copytext(act,1,length(act))
//Emote Cooldown System (it's so simple!)
- //proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
+ //handle_emote_CD() located in [code\modules\mob\emote.dm]
var/on_CD = 0
act = lowertext(act)
switch(act)
@@ -22,7 +22,7 @@
else
on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
- if(on_CD == 1) // Check if we need to suppress the emote attempt.
+ if(!force && on_CD == 1) // Check if we need to suppress the emote attempt.
return // Suppress emote, you're still cooling off.
//--FalseIncarnate
@@ -71,4 +71,4 @@
if("help")
to_chat(src, "scream(s), yes, no, beep, buzz, ping")
- ..(act, m_type, message)
+ ..()
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 9532daabab8..38787198a5f 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -147,7 +147,7 @@
stop_automated_movement = 1
walk_to(src,movement_target,0,3)
-/mob/living/simple_animal/pet/cat/emote(act, m_type=1, message = null)
+/mob/living/simple_animal/pet/cat/emote(act, m_type = 1, message = null, force)
if(stat != CONSCIOUS)
return
@@ -163,9 +163,9 @@
else
on_CD = 0
- if(on_CD == 1)
+ if(!force && on_CD == 1)
return
-
+
switch(act)
if("meow")
message = "[src] [pick(emote_hear)]!"
@@ -225,9 +225,9 @@
maxHealth = 50
harm_intent_damage = 10
butcher_results = list(
- /obj/item/organ/internal/brain = 1,
- /obj/item/organ/internal/heart = 1,
- /obj/item/reagent_containers/food/snacks/birthdaycakeslice = 3,
+ /obj/item/organ/internal/brain = 1,
+ /obj/item/organ/internal/heart = 1,
+ /obj/item/reagent_containers/food/snacks/birthdaycakeslice = 3,
/obj/item/reagent_containers/food/snacks/meat/slab = 2
)
response_harm = "takes a bite out of"
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 832d92c9d8f..3ff26f7850c 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -368,7 +368,7 @@
name = "Definitely Not [real_name]"
desc = "That's Definitely Not [real_name]"
valid = 1
-
+
if(/obj/item/clothing/head/beret/centcom/officer, /obj/item/clothing/head/beret/centcom/officer/navy)
name = "Blueshield [real_name]"
desc = "Will stand by you until the bitter end."
@@ -407,7 +407,7 @@
playsound(src, yelp_sound, 75, 1)
..()
-/mob/living/simple_animal/pet/corgi/emote(act, m_type=1, message = null)
+/mob/living/simple_animal/pet/corgi/emote(act, m_type = 1, message = null, force)
if(stat != CONSCIOUS)
return
@@ -421,9 +421,9 @@
else
on_CD = 0
- if(on_CD == 1)
+ if(!force && on_CD == 1)
return
-
+
switch(act)
if("bark")
message = "[src] [pick(src.speak_emote)]!"
diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm
index 07a5fcf0131..355d756288b 100644
--- a/code/modules/mob/living/simple_animal/friendly/diona.dm
+++ b/code/modules/mob/living/simple_animal/friendly/diona.dm
@@ -60,7 +60,7 @@
/datum/action/innate/diona/merge/Activate()
var/mob/living/simple_animal/diona/user = owner
user.merge()
-
+
/datum/action/innate/diona/evolve
name = "Evolve"
icon_icon = 'icons/obj/cloning.dmi'
@@ -109,7 +109,7 @@
forceMove(M)
else
get_scooped(M)
- else
+ else
..()
/mob/living/simple_animal/diona/proc/merge()
@@ -151,7 +151,7 @@
to_chat(loc, "You feel a pang of loss as [src] splits away from your biomass.")
to_chat(src, "You wiggle out of the depths of [loc]'s biomass and plop to the ground.")
forceMove(T)
-
+
var/hasMobs = FALSE
for(var/atom/A in D.contents)
if(istype(A, /mob/) || istype(A, /obj/item/holder))
@@ -163,9 +163,9 @@
return TRUE
/mob/living/simple_animal/diona/proc/evolve()
- if(stat != CONSCIOUS)
+ if(stat != CONSCIOUS)
return FALSE
-
+
if(donors.len < evolve_donors)
to_chat(src, "You need more blood in order to ascend to a new state of consciousness...")
return FALSE
@@ -176,7 +176,7 @@
if(isdiona(loc) && !split()) //if it's merged with diona, needs to able to split before evolving
return FALSE
-
+
visible_message("[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.")
var/mob/living/carbon/human/diona/adult = new(get_turf(loc))
@@ -202,14 +202,14 @@
qdel(src)
return TRUE
-/mob/living/simple_animal/diona/proc/steal_blood()
- if(stat != CONSCIOUS)
+/mob/living/simple_animal/diona/proc/steal_blood()
+ if(stat != CONSCIOUS)
return FALSE
-
+
var/list/choices = list()
for(var/mob/living/carbon/human/H in oview(1,src))
if(Adjacent(H) && H.dna && !(NO_BLOOD in H.dna.species.species_traits))
- choices += H
+ choices += H
if(!choices.len)
to_chat(src, "No suitable blood donors nearby.")
@@ -260,7 +260,7 @@
to_chat(src, "You don't have any hands!")
return
-/mob/living/simple_animal/diona/emote(act, m_type=1, message = null)
+/mob/living/simple_animal/diona/emote(act, m_type = 1, message = null, force)
if(stat != CONSCIOUS)
return
@@ -272,7 +272,7 @@
else
on_CD = 0
- if(on_CD == 1)
+ if(!force && on_CD == 1)
return
switch(act) //IMPORTANT: Emotes MUST NOT CONFLICT anywhere along the chain.
@@ -283,4 +283,4 @@
if("help")
to_chat(src, "scream, chirp")
- ..(act, m_type, message)
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index dd0c5b9f72a..85e48c9a4d3 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -299,7 +299,7 @@ var/global/chicken_count = 0
E.pixel_y = rand(-6,6)
if(eggsFertile)
if(chicken_count < MAX_CHICKENS && prob(25))
- processing_objects.Add(E)
+ START_PROCESSING(SSobj, E)
/obj/item/reagent_containers/food/snacks/egg/var/amount_grown = 0
/obj/item/reagent_containers/food/snacks/egg/process()
@@ -308,10 +308,10 @@ var/global/chicken_count = 0
if(amount_grown >= 100)
visible_message("[src] hatches with a quiet cracking sound.")
new /mob/living/simple_animal/chick(get_turf(src))
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
qdel(src)
else
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
/mob/living/simple_animal/pig
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index c84947c7363..ae19106e1af 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -109,7 +109,7 @@
if(client)
client.time_died_as_mouse = world.time
-/mob/living/simple_animal/mouse/emote(act, m_type=1, message = null)
+/mob/living/simple_animal/mouse/emote(act, m_type = 1, message = null, force)
if(stat != CONSCIOUS)
return
@@ -121,7 +121,7 @@
else
on_CD = 0
- if(on_CD == 1)
+ if(!force && on_CD == 1)
return
switch(act)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 02f15a59709..b4019cff988 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -258,7 +258,7 @@
adjustBruteLoss(20)
return
-/mob/living/simple_animal/emote(var/act, var/m_type=1, var/message = null)
+/mob/living/simple_animal/emote(act, m_type = 1, message = null, force)
if(stat)
return
act = lowertext(act)
@@ -269,7 +269,7 @@
if("help")
to_chat(src, "scream")
- ..(act, m_type, message)
+ ..()
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index bb7cbde6e91..c2281a1b9a9 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1178,12 +1178,11 @@ var/list/slot_equipment_priority = list( \
if(green)
if(!no_text)
visible_message("[src] vomits up some green goo!","You vomit up some green goo!")
- new /obj/effect/decal/cleanable/vomit/green(location)
+ location.add_vomit_floor(FALSE, TRUE)
else
if(!no_text)
visible_message("[src] pukes all over [p_them()]self!","You puke all over yourself!")
- location.add_vomit_floor(src, 1)
- playsound(location, 'sound/effects/splat.ogg', 50, 1)
+ location.add_vomit_floor(TRUE)
/mob/proc/AddSpell(obj/effect/proc_holder/spell/S)
mob_spell_list += S
@@ -1301,6 +1300,7 @@ var/list/slot_equipment_priority = list( \
.["Show player panel"] = "?_src_=vars;mob_player_panel=[UID()]"
.["Give Spell"] = "?_src_=vars;give_spell=[UID()]"
+ .["Give Martial Art"] = "?_src_=vars;givemartialart=[UID()]"
.["Give Disease"] = "?_src_=vars;give_disease=[UID()]"
.["Toggle Godmode"] = "?_src_=vars;godmode=[UID()]"
.["Toggle Build Mode"] = "?_src_=vars;build_mode=[UID()]"
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index aeb6d8f14bf..93eb035b187 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -98,7 +98,7 @@
return verb
-/mob/proc/emote(var/act, var/type, var/message)
+/mob/proc/emote(act, type, message, force)
if(act == "me")
return custom_emote(type, message)
@@ -184,7 +184,7 @@
var/current = prefix_locations[i] // ["Common", keypos]
// There are a few things that will make us want to ignore all other languages in - namely, HIVEMIND languages.
- var/datum/language/L = current[1]
+ var/datum/language/L = current[1]
if(L && L.flags & HIVEMIND)
. = new /datum/multilingual_say_piece(L, trim(strip_prefixes(message)))
break
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index e978a2b4798..75aa563dd86 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -50,7 +50,7 @@
if(!physical)
physical = src
..()
- processing_objects += src
+ START_PROCESSING(SSobj, src)
all_components = list()
idle_threads = list()
@@ -64,7 +64,7 @@
all_components.Remove(CH.device_type)
qdel(CH)
physical = null
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
return ..()
diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
index 5fcaf9b03fd..226511e2c09 100644
--- a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
+++ b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
@@ -11,7 +11,7 @@
/datum/computer_file/program/alarm_monitor/New()
..()
- alarm_handlers = list(atmosphere_alarm, fire_alarm, power_alarm)
+ alarm_handlers = list(SSalarms.atmosphere_alarm, SSalarms.fire_alarm, SSalarms.power_alarm)
for(var/datum/alarm_handler/AH in alarm_handlers)
AH.register(src, /datum/computer_file/program/alarm_monitor/proc/update_icon)
diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm
index e4dd848dac6..dc52841a367 100644
--- a/code/modules/nano/modules/alarm_monitor.dm
+++ b/code/modules/nano/modules/alarm_monitor.dm
@@ -5,15 +5,15 @@
/datum/nano_module/alarm_monitor/all/New()
..()
- alarm_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
+ alarm_handlers = list(SSalarms.atmosphere_alarm, SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.fire_alarm, SSalarms.motion_alarm, SSalarms.power_alarm)
/datum/nano_module/alarm_monitor/engineering/New()
..()
- alarm_handlers = list(atmosphere_alarm, fire_alarm, power_alarm)
+ alarm_handlers = list(SSalarms.atmosphere_alarm, SSalarms.fire_alarm, SSalarms.power_alarm)
/datum/nano_module/alarm_monitor/security/New()
..()
- alarm_handlers = list(burglar_alarm, camera_alarm, motion_alarm)
+ alarm_handlers = list(SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.motion_alarm)
/datum/nano_module/alarm_monitor/proc/register(var/object, var/procName)
for(var/datum/alarm_handler/AH in alarm_handlers)
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index 87649f97512..1dbdcc05b92 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -506,7 +506,7 @@ nanoui is used to open and update nano browser uis
*
* @return nothing
*/
-/datum/nanoui/proc/process(update = 0)
+/datum/nanoui/process(update = 0)
if(!src_object || !user)
close()
return
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index d5ca6b0b0f8..c40cb1667ad 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -108,7 +108,7 @@
/obj/item/paper/attack_self(mob/living/user as mob)
user.examinate(src)
- if(rigged && (holiday_master.holidays && holiday_master.holidays[APRIL_FOOLS]))
+ if(rigged && (SSholiday.holidays && SSholiday.holidays[APRIL_FOOLS]))
if(spam_flag == 0)
spam_flag = 1
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
@@ -621,11 +621,11 @@
/obj/item/paper/evilfax/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/paper/evilfax/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
if(mytarget && !used)
var/mob/living/carbon/target = mytarget
target.ForceContractDisease(new /datum/disease/transformation/corgi(0))
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index e8643c97cff..c9169a09757 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -72,7 +72,7 @@
papers.Remove(P)
else
P = new /obj/item/paper
- if(holiday_master.holidays && holiday_master.holidays[APRIL_FOOLS])
+ if(SSholiday.holidays && SSholiday.holidays[APRIL_FOOLS])
if(prob(30))
P.info = "HONK HONK HONK HONK HONK HONK HONK
HOOOOOOOOOOOOOOOOOOOOOONK
APRIL FOOLS"
P.rigged = 1
diff --git a/code/modules/pda/mob_hunt_game_app.dm b/code/modules/pda/mob_hunt_game_app.dm
index c08e64b7ae3..2bb28ba0264 100644
--- a/code/modules/pda/mob_hunt_game_app.dm
+++ b/code/modules/pda/mob_hunt_game_app.dm
@@ -21,12 +21,12 @@
/datum/data/pda/app/mob_hunter_game/start()
..()
- processing_objects.Add(pda)
+ START_PROCESSING(SSobj, pda)
/datum/data/pda/app/mob_hunter_game/stop()
..()
disconnect("Program Terminated")
- processing_objects.Remove(pda)
+ STOP_PROCESSING(SSobj, pda)
/datum/data/pda/app/mob_hunter_game/proc/scan_nearby()
if(!SSmob_hunt || !connected)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index e8aab46dbbe..c7adce7f533 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -1173,14 +1173,14 @@
environ = autoset(environ, 1)
autoflag = 3
if(report_power_alarm)
- power_alarm.clearAlarm(loc, src)
+ SSalarms.power_alarm.clearAlarm(loc, src)
else if(cell.charge < 1250 && cell.charge > 750 && longtermpower < 0) // <30%, turn off equipment
if(autoflag != 2)
equipment = autoset(equipment, 2)
lighting = autoset(lighting, 1)
environ = autoset(environ, 1)
if(report_power_alarm)
- power_alarm.triggerAlarm(loc, src)
+ SSalarms.power_alarm.triggerAlarm(loc, src)
autoflag = 2
else if(cell.charge < 750 && cell.charge > 10) // <15%, turn off lighting & equipment
if((autoflag > 1 && longtermpower < 0) || (autoflag > 1 && longtermpower >= 0))
@@ -1188,7 +1188,7 @@
lighting = autoset(lighting, 2)
environ = autoset(environ, 1)
if(report_power_alarm)
- power_alarm.triggerAlarm(loc, src)
+ SSalarms.power_alarm.triggerAlarm(loc, src)
autoflag = 1
else if(cell.charge <= 0) // zero charge, turn all off
if(autoflag != 0)
@@ -1196,7 +1196,7 @@
lighting = autoset(lighting, 0)
environ = autoset(environ, 0)
if(report_power_alarm)
- power_alarm.triggerAlarm(loc, src)
+ SSalarms.power_alarm.triggerAlarm(loc, src)
autoflag = 0
// now trickle-charge the cell
@@ -1254,7 +1254,7 @@
lighting = autoset(lighting, 0)
environ = autoset(environ, 0)
if(report_power_alarm)
- power_alarm.triggerAlarm(loc, src)
+ SSalarms.power_alarm.triggerAlarm(loc, src)
autoflag = 0
// update icon & area power if anything changed
@@ -1353,6 +1353,11 @@
L.broken(0, 1)
stoplag()
+/obj/machinery/power/apc/proc/null_charge()
+ for(var/obj/machinery/light/L in area)
+ L.broken(0, 1)
+ stoplag()
+
/obj/machinery/power/apc/proc/setsubsystem(val)
if(cell && cell.charge > 0)
return (val==1) ? 0 : val
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index dfe10113f12..4719ff75261 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -21,23 +21,23 @@
/obj/item/stock_parts/cell/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
charge = maxcharge
if(ratingdesc)
desc += " This one has a power rating of [DisplayPower(maxcharge)], and you should not swallow it."
update_icon()
/obj/item/stock_parts/cell/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/stock_parts/cell/vv_edit_var(var_name, var_value)
switch(var_name)
if("self_recharge")
if(var_value)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/stock_parts/cell/process()
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 632fb7726ee..12d6c8b831a 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -35,7 +35,7 @@
src.energy = starting_energy
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
GLOB.poi_list |= src
GLOB.singularities += src
for(var/obj/machinery/power/singularity_beacon/singubeacon in GLOB.machines)
@@ -44,7 +44,7 @@
break
/obj/singularity/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
GLOB.poi_list.Remove(src)
GLOB.singularities -= src
target = null
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 2884fc18b4c..f95f5ce2864 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -13,7 +13,6 @@
icon_state = "smes"
density = 1
anchored = 1
- defer_process = 1
var/capacity = 5e6 // maximum charge
var/charge = 0 // actual charge
diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm
index 95e1a586469..2a20e7e6c81 100644
--- a/code/modules/projectiles/guns/alien.dm
+++ b/code/modules/projectiles/guns/alien.dm
@@ -15,10 +15,10 @@
/obj/item/gun/projectile/automatic/spikethrower/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/gun/projectile/automatic/spikethrower/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/gun/projectile/automatic/spikethrower/update_icon()
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 8c9b0cf66f8..b25420b5491 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -32,7 +32,7 @@
power_supply.give(power_supply.maxcharge)
update_ammo_types()
if(selfcharge)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
update_icon()
/obj/item/gun/energy/proc/update_ammo_types()
@@ -47,7 +47,7 @@
/obj/item/gun/energy/Destroy()
if(selfcharge)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/gun/energy/process()
@@ -167,9 +167,9 @@
switch(var_name)
if("selfcharge")
if(var_value)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
else
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/gun/energy/proc/robocharge()
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 623986f5837..fa34753c6a9 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -340,11 +340,11 @@
/obj/item/gun/energy/temperature/New()
..()
update_icon()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/gun/energy/temperature/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/gun/energy/temperature/newshot()
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index f6d84635c08..75f94dd83d0 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -51,12 +51,12 @@
charges = max_charges
chambered = new ammo_type(src)
if(can_charge)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/gun/magic/Destroy()
if(can_charge)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm
index face61e79c3..a1677b764e0 100644
--- a/code/modules/projectiles/guns/medbeam.dm
+++ b/code/modules/projectiles/guns/medbeam.dm
@@ -17,10 +17,10 @@
/obj/item/gun/medbeam/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/gun/medbeam/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/gun/medbeam/handle_suicide()
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 8d7201d0645..69023a3e6e8 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -16,7 +16,7 @@ var/const/INGEST = 2
/datum/reagents/New(maximum = 100)
maximum_volume = maximum
if(!(flags & REAGENT_NOREACT))
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
if(!GLOB.chemical_reagents_list)
//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
@@ -333,9 +333,9 @@ var/const/INGEST = 2
od_chems.Add(R.id)
return od_chems
-/datum/reagents/proc/process()
+/datum/reagents/process()
if(flags & REAGENT_NOREACT)
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
return
for(var/datum/reagent/R in reagent_list)
@@ -346,9 +346,9 @@ var/const/INGEST = 2
// Order is important, process() can remove from processing if
// the flag is present
flags &= ~(REAGENT_NOREACT)
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
else
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
flags |= REAGENT_NOREACT
/*
@@ -819,7 +819,7 @@ var/const/INGEST = 2
/datum/reagents/Destroy()
. = ..()
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
QDEL_LIST(reagent_list)
reagent_list = null
QDEL_LIST(addiction_list)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index a2ecc811e6a..d4199c3dcec 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -169,7 +169,7 @@
return
if(M.mind && M.mind.changeling && M.mind.changeling.regenerating) //no messing with changeling's fake death
return
- M.visible_message("[M] seizes up and falls limp, [M.p_their()] eyes dead and lifeless...") //so you can't trigger deathgasp emote on people. Edge case, but necessary.
+ M.emote("deathgasp")
M.status_flags |= FAKEDEATH
M.update_stat("fakedeath reagent")
M.med_hud_set_health()
diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm
index 52ae0f0c93b..b50ed09a27c 100644
--- a/code/modules/reagents/chemistry/reagents/drinks.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks.dm
@@ -8,7 +8,7 @@
drink_desc = "Vitamins! Yay!"
taste_message = "orange juice"
-/datum/reagent/consumable/drink/orangejuicde/on_mob_life(mob/living/M)
+/datum/reagent/consumable/drink/orangejuice/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
if(prob(30))
update_flags |= M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
@@ -89,7 +89,7 @@
drink_desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place."
taste_message = "healthy dietary choices"
-/datum/reagent/consumable/drink/doctors_delight/on_mob_life(mob/living/M)
+/datum/reagent/consumable/drink/doctor_delight/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
if(prob(20))
update_flags |= M.adjustToxLoss(-1, FALSE)
diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm
index 9b1aca91f8d..bf2417a192e 100644
--- a/code/modules/reagents/chemistry/reagents/food.dm
+++ b/code/modules/reagents/chemistry/reagents/food.dm
@@ -905,8 +905,7 @@
/datum/reagent/vomit/reaction_turf(turf/T, volume)
if(volume >= 5 && !isspaceturf(T))
- new /obj/effect/decal/cleanable/vomit(T)
- playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
+ T.add_vomit_floor()
/datum/reagent/greenvomit
name = "Green vomit"
@@ -918,8 +917,7 @@
/datum/reagent/greenvomit/reaction_turf(turf/T, volume)
if(volume >= 5 && !isspaceturf(T))
- new /obj/effect/decal/cleanable/vomit/green(T)
- playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
+ T.add_vomit_floor(FALSE, TRUE)
////Lavaland Flora Reagents////
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 4f92f21aee7..6e15090ea88 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -38,10 +38,10 @@
for(var/R in reagent_ids)
add_reagent(R)
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/reagent_containers/borghypo/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg
diff --git a/code/modules/reagents/reagent_containers/iv_bag.dm b/code/modules/reagents/reagent_containers/iv_bag.dm
index 709b20f070f..825aa69632b 100644
--- a/code/modules/reagents/reagent_containers/iv_bag.dm
+++ b/code/modules/reagents/reagent_containers/iv_bag.dm
@@ -42,11 +42,11 @@
/obj/item/reagent_containers/iv_bag/proc/begin_processing(mob/target)
injection_target = target
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/reagent_containers/iv_bag/proc/end_processing()
injection_target = null
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
/obj/item/reagent_containers/iv_bag/process()
if(!injection_target)
diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm
index 8cb29ecf3b4..0bac5824780 100644
--- a/code/modules/response_team/ert.dm
+++ b/code/modules/response_team/ert.dm
@@ -90,22 +90,13 @@ var/ert_request_answered = FALSE
return 0
var/index = 1
- var/ert_spawn_seconds = 120
- spawn(ert_spawn_seconds * 10) // to account for spawn() using deciseconds
- var/list/unspawnable_ert = list()
- for(var/mob/M in response_team_members)
- if(M)
- unspawnable_ert |= M
- if(unspawnable_ert.len)
- message_admins("ERT SPAWN: The following ERT members could not be spawned within [ert_spawn_seconds] seconds:")
- for(var/mob/M in unspawnable_ert)
- message_admins("- Unspawned ERT: [ADMIN_FULLMONTY(M)]")
for(var/mob/M in response_team_members)
if(index > emergencyresponseteamspawn.len)
index = 1
if(!M || !M.client)
continue
+ log_debug("Spawning as ERT: [M.ckey] ([M])")
var/client/C = M.client
var/mob/living/new_commando = C.create_response_team(emergencyresponseteamspawn[index])
if(!M || !new_commando)
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index 715adb668ab..273ea75e832 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -152,7 +152,7 @@
if(src.empcounter > 0)
src.empcounter--
else
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
/obj/spacepod/proc/update_icons()
if(!pod_overlays)
@@ -286,7 +286,7 @@
deal_damage(80 / severity)
if(empcounter < (40 / severity))
empcounter = 40 / severity
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
switch(severity)
if(1)
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index a4444938d96..09ccb3ce36b 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -175,7 +175,7 @@
change_meteor_chance(0.5)
/obj/machinery/satellite/meteor_shield/proc/change_meteor_chance(mod)
- for(var/datum/event_container/container in event_manager.event_containers)
+ for(var/datum/event_container/container in SSevents.event_containers)
for(var/datum/event_meta/M in container.available_events)
if(M.event_type == /datum/event/meteor_wave)
M.weight *= mod
diff --git a/code/modules/surgery/organs/body_egg.dm b/code/modules/surgery/organs/body_egg.dm
index 335d4e5b751..a8ba9192ae4 100644
--- a/code/modules/surgery/organs/body_egg.dm
+++ b/code/modules/surgery/organs/body_egg.dm
@@ -13,13 +13,13 @@
/obj/item/organ/internal/body_egg/insert(var/mob/living/carbon/M, special = 0)
..()
owner.status_flags |= XENO_HOST
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
owner.med_hud_set_status()
spawn(0)
AddInfectionImages(owner)
/obj/item/organ/internal/body_egg/remove(var/mob/living/carbon/M, special = 0)
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
if(owner)
owner.status_flags &= ~(XENO_HOST)
owner.med_hud_set_status()
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index a5e85bf572c..67ea1be1d05 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -33,7 +33,7 @@
/obj/item/organ/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
if(owner)
remove(owner, 1)
QDEL_LIST_ASSOC_VAL(autopsy_data)
@@ -84,7 +84,7 @@
/obj/item/organ/proc/necrotize(update_sprite = TRUE)
damage = max_damage
status |= ORGAN_DEAD
- processing_objects -= src
+ STOP_PROCESSING(SSobj, src)
if(dead_icon && !is_robotic())
icon_state = dead_icon
if(owner && vital)
@@ -189,7 +189,7 @@
else
status = 0
if(!owner)
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
/obj/item/organ/proc/is_damaged()
return damage > 0
@@ -295,7 +295,7 @@
if(affected) affected.internal_organs -= src
loc = get_turf(owner)
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead
add_attack_logs(user, owner, "Removed vital organ ([src])", !!user ? ATKLOG_FEW : ATKLOG_ALL)
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index f8534ffe078..4462e4ea470 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -286,7 +286,7 @@ This function completely restores a damaged organ to perfect condition.
owner.updatehealth("limb rejuvenate")
update_icon()
if(!owner)
- processing_objects |= src
+ START_PROCESSING(SSobj, src)
/****************************************************
PROCESSING & UPDATING
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 063a4d6880a..2c42f421774 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -193,10 +193,10 @@
/obj/item/organ/internal/shadowtumor/New()
..()
- processing_objects.Add(src)
+ START_PROCESSING(SSobj, src)
/obj/item/organ/internal/shadowtumor/Destroy()
- processing_objects.Remove(src)
+ STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/organ/internal/shadowtumor/process()
diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm
index 3672070e8f0..ca22fb5cb0e 100644
--- a/code/modules/telesci/gps.dm
+++ b/code/modules/telesci/gps.dm
@@ -137,10 +137,10 @@ var/list/GPS_list = list()
for marking the area around the transition edges."
var/list/turf/tagged
-/obj/item/gps/visible_debug/New()
+/obj/item/gps/visible_debug/Initialize(mapload)
. = ..()
tagged = list()
- GLOB.fast_processing.Add(src)
+ START_PROCESSING(SSfastprocess, src)
/obj/item/gps/visible_debug/process()
var/turf/T = get_turf(src)
@@ -161,5 +161,5 @@ var/list/GPS_list = list()
if(tagged)
clear()
tagged = null
- GLOB.fast_processing.Remove(src)
+ STOP_PROCESSING(SSfastprocess, src)
. = ..()
diff --git a/html/changelogs/AutoChangeLog-pr-11278.yml b/html/changelogs/AutoChangeLog-pr-11278.yml
new file mode 100644
index 00000000000..24f9c3ab4cc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11278.yml
@@ -0,0 +1,4 @@
+author: "Arkatos"
+delete-after: True
+changes:
+ - rscadd: "Added new Wizard Spell - Summon Ghosts! This nefarious spell will make all ghosts visible to the living. Be careful though, as while they cannot harm you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's spellbook."
diff --git a/html/changelogs/AutoChangeLog-pr-11283.yml b/html/changelogs/AutoChangeLog-pr-11283.yml
new file mode 100644
index 00000000000..9056578d68b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11283.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Fixes a few potential exploits with forcing chem, dust, and explosive implants activating with the deathgasp emote, prior to death"
diff --git a/html/changelogs/AutoChangeLog-pr-11284.yml b/html/changelogs/AutoChangeLog-pr-11284.yml
new file mode 100644
index 00000000000..433a7fb3f68
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11284.yml
@@ -0,0 +1,6 @@
+author: "Arkatos"
+delete-after: True
+changes:
+ - rscadd: "Added new Shadowling Ability - Null Charge! This new ability allows Shadowling to completely drain an APC of it's power after a moderate delay. Shadowling must not be interrupted, or the whole process will fail."
+ - imageadd: "Added custom icon for the Null Charge ability"
+ - rscdel: "Shadowling Drain Life ability removed"
diff --git a/html/changelogs/AutoChangeLog-pr-11292.yml b/html/changelogs/AutoChangeLog-pr-11292.yml
new file mode 100644
index 00000000000..814c8530858
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11292.yml
@@ -0,0 +1,5 @@
+author: "farie82"
+delete-after: True
+changes:
+ - tweak: "Makes puke less lag inducing"
+ - tweak: "Puke can now appear on all kinds of turfs except spess"
diff --git a/html/changelogs/AutoChangeLog-pr-11300.yml b/html/changelogs/AutoChangeLog-pr-11300.yml
new file mode 100644
index 00000000000..b949b7f91f5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11300.yml
@@ -0,0 +1,5 @@
+author: "Arkatos"
+delete-after: True
+changes:
+ - rscadd: "Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and Teleport"
+ - imageadd: "Added custom icons for Observer HUD buttons"
diff --git a/html/changelogs/AutoChangeLog-pr-11328.yml b/html/changelogs/AutoChangeLog-pr-11328.yml
new file mode 100644
index 00000000000..e91103f07cd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11328.yml
@@ -0,0 +1,5 @@
+author: "farie82"
+delete-after: True
+changes:
+ - bugfix: "Admins can now use all mhelp related things again"
+ - spellcheck: "Fixed the toggle mentor ticket messages text"
diff --git a/html/changelogs/AutoChangeLog-pr-11329.yml b/html/changelogs/AutoChangeLog-pr-11329.yml
new file mode 100644
index 00000000000..e25e56b8828
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11329.yml
@@ -0,0 +1,4 @@
+author: "farie82"
+delete-after: True
+changes:
+ - bugfix: "Vampiric glaring is logged now"
diff --git a/html/changelogs/AutoChangeLog-pr-11332.yml b/html/changelogs/AutoChangeLog-pr-11332.yml
new file mode 100644
index 00000000000..f76e2e2b48b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11332.yml
@@ -0,0 +1,4 @@
+author: "Arkatos"
+delete-after: True
+changes:
+ - rscadd: "Added an option to grant Martial Arts via administrative Var menu"
diff --git a/html/changelogs/AutoChangeLog-pr-11355.yml b/html/changelogs/AutoChangeLog-pr-11355.yml
new file mode 100644
index 00000000000..934e85808ba
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11355.yml
@@ -0,0 +1,4 @@
+author: "Kyep"
+delete-after: True
+changes:
+ - bugfix: "Fixed an error message being inappropriately generated for admins when someone signs up as a pAI."
diff --git a/html/changelogs/AutoChangeLog-pr-11360.yml b/html/changelogs/AutoChangeLog-pr-11360.yml
new file mode 100644
index 00000000000..3fb01b5b8f9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11360.yml
@@ -0,0 +1,6 @@
+author: "AffectedArc07"
+delete-after: True
+changes:
+ - rscadd: "SSevents"
+ - rscadd: "SSholiday"
+ - tweak: "We no longer check if its Christmas every tick. Dont ask."
diff --git a/html/changelogs/AutoChangeLog-pr-11361.yml b/html/changelogs/AutoChangeLog-pr-11361.yml
new file mode 100644
index 00000000000..7207d6d5daf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11361.yml
@@ -0,0 +1,4 @@
+author: "AffectedArc07"
+delete-after: True
+changes:
+ - rscadd: "SSalarms"
diff --git a/html/changelogs/AutoChangeLog-pr-11362.yml b/html/changelogs/AutoChangeLog-pr-11362.yml
new file mode 100644
index 00000000000..72282104dc1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11362.yml
@@ -0,0 +1,4 @@
+author: "uc_guy"
+delete-after: True
+changes:
+ - bugfix: "Players in the lobby no longer see cult speak."
diff --git a/html/changelogs/AutoChangeLog-pr-11364.yml b/html/changelogs/AutoChangeLog-pr-11364.yml
new file mode 100644
index 00000000000..b331b4d009d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11364.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - tweak: "object and fast processing are now proper subsystems"
diff --git a/html/changelogs/AutoChangeLog-pr-11367.yml b/html/changelogs/AutoChangeLog-pr-11367.yml
new file mode 100644
index 00000000000..5d90a0b3f30
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11367.yml
@@ -0,0 +1,4 @@
+author: "farie82"
+delete-after: True
+changes:
+ - bugfix: "Doctor delight and orange juice now heal again"
diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi
index d21323c80b1..b4d8a34a6e0 100644
Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ
diff --git a/icons/mob/screen_ghost.dmi b/icons/mob/screen_ghost.dmi
new file mode 100644
index 00000000000..6519d00aa97
Binary files /dev/null and b/icons/mob/screen_ghost.dmi differ
diff --git a/paradise.dme b/paradise.dme
index e4e291875b0..64b874db891 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -138,6 +138,7 @@
#include "code\_onclick\hud\constructs.dm"
#include "code\_onclick\hud\devil.dm"
#include "code\_onclick\hud\fullscreen.dm"
+#include "code\_onclick\hud\ghost.dm"
#include "code\_onclick\hud\guardian.dm"
#include "code\_onclick\hud\hud.dm"
#include "code\_onclick\hud\human.dm"
@@ -198,20 +199,19 @@
#include "code\controllers\master.dm"
#include "code\controllers\subsystem.dm"
#include "code\controllers\verbs.dm"
-#include "code\controllers\Processes\alarm.dm"
-#include "code\controllers\Processes\event.dm"
-#include "code\controllers\Processes\fast_process.dm"
#include "code\controllers\Processes\lighting.dm"
#include "code\controllers\Processes\npcai.dm"
-#include "code\controllers\Processes\obj.dm"
#include "code\controllers\Processes\ticker.dm"
#include "code\controllers\ProcessScheduler\core\process.dm"
#include "code\controllers\ProcessScheduler\core\processScheduler.dm"
#include "code\controllers\subsystem\air.dm"
+#include "code\controllers\subsystem\alarm.dm"
#include "code\controllers\subsystem\assets.dm"
#include "code\controllers\subsystem\atoms.dm"
+#include "code\controllers\subsystem\events.dm"
#include "code\controllers\subsystem\fires.dm"
#include "code\controllers\subsystem\garbage.dm"
+#include "code\controllers\subsystem\holiday.dm"
#include "code\controllers\subsystem\icon_smooth.dm"
#include "code\controllers\subsystem\input.dm"
#include "code\controllers\subsystem\jobs.dm"
@@ -232,6 +232,8 @@
#include "code\controllers\subsystem\timer.dm"
#include "code\controllers\subsystem\vote.dm"
#include "code\controllers\subsystem\weather.dm"
+#include "code\controllers\subsystem\processing\fastprocess.dm"
+#include "code\controllers\subsystem\processing\obj.dm"
#include "code\controllers\subsystem\processing\processing.dm"
#include "code\controllers\subsystem\tickets\mentor_tickets.dm"
#include "code\controllers\subsystem\tickets\tickets.dm"
@@ -1420,7 +1422,7 @@
#include "code\modules\events\electrical_storm.dm"
#include "code\modules\events\event.dm"
#include "code\modules\events\event_container.dm"
-#include "code\modules\events\event_manager.dm"
+#include "code\modules\events\event_procs.dm"
#include "code\modules\events\false_alarm.dm"
#include "code\modules\events\floorcluwne.dm"
#include "code\modules\events\grid_check.dm"
@@ -1452,6 +1454,7 @@
#include "code\modules\events\vent_clog.dm"
#include "code\modules\events\wallrot.dm"
#include "code\modules\events\wormholes.dm"
+#include "code\modules\events\wizard\ghost.dm"
#include "code\modules\examine\examine.dm"
#include "code\modules\examine\descriptions\atmospherics.dm"
#include "code\modules\examine\descriptions\engineering.dm"
@@ -1817,7 +1820,6 @@
#include "code\modules\mob\living\silicon\decoy\decoy.dm"
#include "code\modules\mob\living\silicon\decoy\life.dm"
#include "code\modules\mob\living\silicon\pai\death.dm"
-#include "code\modules\mob\living\silicon\pai\emote.dm"
#include "code\modules\mob\living\silicon\pai\life.dm"
#include "code\modules\mob\living\silicon\pai\pai.dm"
#include "code\modules\mob\living\silicon\pai\personality.dm"