This commit is contained in:
Kearel
2015-12-05 12:47:03 -06:00
180 changed files with 1884 additions and 1412 deletions

View File

@@ -19,7 +19,8 @@ var/datum/controller/process/alarm/alarm_manager
alarm_manager = src
/datum/controller/process/alarm/doWork()
for(var/datum/alarm_handler/AH in all_handlers)
for(last_object in all_handlers)
var/datum/alarm_handler/AH = last_object
AH.process()
SCHECK

View File

@@ -18,7 +18,8 @@ var/datum/controller/process/chemistry/chemistryProcess
stat(null, "[active_holders.len] reagent holder\s")
/datum/controller/process/chemistry/doWork()
for(var/datum/reagents/holder in active_holders)
for(last_object in active_holders)
var/datum/reagents/holder = last_object
if(!holder.process_reactions())
active_holders -= holder
SCHECK

View File

@@ -6,8 +6,8 @@
schedule_interval = 20 // every 2 seconds
/datum/controller/process/disease/doWork()
for(var/disease in active_diseases)
var/datum/disease/D = disease
for(last_object in active_diseases)
var/datum/disease/D = last_object
D.process()
SCHECK

View File

@@ -1,7 +1,7 @@
// The time a datum was destroyed by the GC, or null if it hasn't been
/datum/var/gcDestroyed
#define GC_COLLECTIONS_PER_RUN 150
#define GC_COLLECTIONS_PER_RUN 300
#define GC_COLLECTION_TIMEOUT (30 SECONDS)
#define GC_FORCE_DEL_PER_RUN 30
@@ -23,7 +23,7 @@ var/list/delayed_garbage = list()
/datum/controller/process/garbage_collector/setup()
name = "garbage"
schedule_interval = 10 SECONDS
schedule_interval = 5 SECONDS
start_delay = 3
if(!garbage_collector)
@@ -47,31 +47,6 @@ world/loop_checks = 0
var/checkRemain = GC_COLLECTIONS_PER_RUN
var/remaining_force_dels = GC_FORCE_DEL_PER_RUN
#ifdef GC_FINDREF
var/list/searching = list()
for(var/refID in destroyed) // Reference search - before all deletions and for all at once
var/GCd_at_time = destroyed[refID]
if(GCd_at_time > time_to_kill)
break
var/atom/A = locate(refID)
if(A && A.gcDestroyed == GCd_at_time)
searching += A
if(searching.len >= checkRemain)
break
for(var/atom/A in searching)
testing("GC: Searching references for [A] | [A.type]")
if(A.loc != null)
testing("GC: [A] | [A.type] is located in [A.loc] instead of null")
if(A.contents.len)
testing("GC: [A] | [A.type] has contents: [list2text(A.contents)]")
if(searching.len)
for(var/atom/D in world)
LookForRefs(D, searching)
for(var/datum/D)
LookForRefs(D, searching)
#endif
while(destroyed.len && --checkRemain >= 0)
if(remaining_force_dels <= 0)
#ifdef GC_DEBUG

View File

@@ -4,7 +4,8 @@
/datum/controller/process/inactivity/doWork()
if(config.kick_inactive)
for(var/client/C in clients)
for(last_object in clients)
var/client/C = last_object
if(!C.holder && C.is_afk(config.kick_inactive MINUTES))
if(!istype(C.mob, /mob/dead))
log_access("AFK: [key_name(C)]")

View File

@@ -1,31 +0,0 @@
var/list/pending_init_objects
/datum/controller/process/initialize
var/list/objects_to_initialize
/datum/controller/process/initialize/setup()
name = "init"
schedule_interval = 1 // Every tick, scary
objects_to_initialize = pending_init_objects
/datum/controller/process/initialize/doWork()
for(var/atom/movable/A in objects_to_initialize)
A.initialize()
scheck()
objects_to_initialize.Remove(A)
if(!objects_to_initialize.len)
disable()
/proc/initialize_object(var/atom/movable/obj_to_init)
if(processScheduler.hasProcess("init"))
var/datum/controller/process/initialize/init = processScheduler.getProcess("init")
init.objects_to_initialize += obj_to_init
init.enable()
else
world.log << "Not yet"
if(!pending_init_objects) pending_init_objects = list()
pending_init_objects += obj_to_init
/datum/controller/process/initialize/getStatName()
return ..()+"([objects_to_initialize.len])"

View File

@@ -1,27 +0,0 @@
/datum/controller/process/lighting/setup()
name = "lighting"
start_delay = 1
schedule_interval = 5 // every .5 second
lighting_controller.initializeLighting()
/datum/controller/process/lighting/doWork()
lighting_controller.lights_workload_max = \
max(lighting_controller.lights_workload_max, lighting_controller.lights.len)
for(var/datum/light_source/L in lighting_controller.lights)
if(L && L.check())
lighting_controller.lights.Remove(L)
scheck()
lighting_controller.changed_turfs_workload_max = \
max(lighting_controller.changed_turfs_workload_max, lighting_controller.changed_turfs.len)
for(var/turf/T in lighting_controller.changed_turfs)
if(T && T.lighting_changed)
T.shift_to_subarea()
scheck()
if(lighting_controller.changed_turfs && lighting_controller.changed_turfs.len)
lighting_controller.changed_turfs.len = 0 // reset the changed list

View File

@@ -18,7 +18,8 @@
machines = dd_sortedObjectList(machines)
/datum/controller/process/machinery/proc/internal_process_machinery()
for(var/obj/machinery/M in machines)
for(last_object in machines)
var/obj/machinery/M = last_object
if(M && !M.gcDestroyed)
if(M.process() == PROCESS_KILL)
//M.inMachineList = 0 We don't use this debugging function
@@ -31,7 +32,8 @@
SCHECK
/datum/controller/process/machinery/proc/internal_process_power()
for(var/datum/powernet/powerNetwork in powernets)
for(last_object in powernets)
var/datum/powernet/powerNetwork = last_object
if(istype(powerNetwork) && isnull(powerNetwork.gcDestroyed))
powerNetwork.reset()
SCHECK
@@ -41,13 +43,15 @@
/datum/controller/process/machinery/proc/internal_process_power_drain()
// Currently only used by powersinks. These items get priority processed before machinery
for(var/obj/item/I in processing_power_items)
for(last_object in processing_power_items)
var/obj/item/I = last_object
if(!I.pwr_drain()) // 0 = Process Kill, remove from processing list.
processing_power_items.Remove(I)
SCHECK
/datum/controller/process/machinery/proc/internal_process_pipenets()
for(var/datum/pipe_network/pipeNetwork in pipe_networks)
for(last_object in pipe_networks)
var/datum/pipe_network/pipeNetwork = last_object
if(istype(pipeNetwork) && isnull(pipeNetwork.gcDestroyed))
pipeNetwork.process()
SCHECK

View File

@@ -0,0 +1,117 @@
/var/global/datum/controller/process/scheduler/scheduler
/************
* Scheduler *
************/
/datum/controller/process/scheduler
var/list/scheduled_tasks
/datum/controller/process/scheduler/setup()
name = "scheduler"
schedule_interval = 7 SECONDS
scheduled_tasks = list()
scheduler = src
/datum/controller/process/scheduler/doWork()
for(last_object in scheduled_tasks)
var/datum/scheduled_task/scheduled_task = last_object
try
if(world.time > scheduled_task.trigger_time)
unschedule(scheduled_task)
scheduled_task.process()
catch(var/exception/e)
catchException(e, last_object)
SCHECK
/datum/controller/process/scheduler/statProcess()
..()
stat(null, "[scheduled_tasks.len] task\s")
/datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st)
if(world.time < st.trigger_time)
scheduled_tasks += st
st.register(OBSERVER_EVENT_DESTROY, src, /datum/controller/process/scheduler/proc/unschedule)
else
st.process()
/datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st)
if(st in scheduled_tasks)
scheduled_tasks -= st
st.unregister(OBSERVER_EVENT_DESTROY, src)
/**********
* Helpers *
**********/
/proc/schedule_task(var/trigger_time, var/repeat_interval, var/procedure, var/list/arguments)
var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/destroy_scheduled_task, list())
scheduler.schedule(st)
/proc/schedule_task_with_source(var/trigger_time, var/repeat_interval, var/source, var/procedure, var/list/arguments)
var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/destroy_scheduled_task, list())
scheduler.schedule(st)
/proc/schedule_repeating_task(var/trigger_time, var/repeat_interval, var/procedure, var/list/arguments)
var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval))
scheduler.schedule(st)
/proc/schedule_repeating_task_with_source(var/trigger_time, var/repeat_interval, var/source, var/procedure, var/list/arguments)
var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval))
scheduler.schedule(st)
/*************
* Task Datum *
*************/
/datum/scheduled_task
var/trigger_time
var/procedure
var/list/arguments
var/task_after_process
var/list/task_after_process_args
/datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
src.trigger_time = trigger_time
src.procedure = procedure
src.arguments = arguments ? arguments : list()
src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task
src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list()
task_after_process_args += src
/datum/scheduled_task/Destroy()
procedure = null
arguments.Cut()
task_after_process = null
task_after_process_args.Cut()
return ..()
/datum/scheduled_task/proc/process()
call(procedure)(arglist(arguments))
after_process()
/datum/scheduled_task/proc/after_process()
call(task_after_process)(arglist(task_after_process_args))
/datum/scheduled_task/source
var/datum/source
/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
src.source = source
src.source.register(OBSERVER_EVENT_DESTROY, src, /datum/scheduled_task/source/proc/source_destroyed)
..(trigger_time, procedure, arguments, task_after_process, task_after_process_args)
/datum/scheduled_task/source/Destroy()
source = null
return ..()
/datum/scheduled_task/source/process()
call(source, procedure)(arglist(arguments))
after_process()
/datum/scheduled_task/source/proc/source_destroyed()
qdel(src)
/proc/destroy_scheduled_task(var/datum/scheduled_task/st)
qdel(st)
/proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st)
st.trigger_time = world.time + trigger_delay
scheduler.schedule(st)

View File

@@ -5,7 +5,8 @@ var/global/list/turf/processing_turfs = list()
schedule_interval = 20 // every 2 seconds
/datum/controller/process/turf/doWork()
for(var/turf/T in processing_turfs)
for(last_object in processing_turfs)
var/turf/T = last_object
if(T.process() == PROCESS_KILL)
processing_turfs.Remove(T)
SCHECK

View File

@@ -3,7 +3,7 @@
Wireless controller
Used for connecting devices to each other (i.e. machinery, doors, emitters, etc.)
Unlike the radio controller, the wireless controller does not pass communications between devices. Once the devices
Unlike the radio controller, the wireless controller does not pass communications between devices. Once the devices
have been connected they call each others procs directly, they do not use the wireless controller to communicate.
See code\modules\wireless\interfaces.dm for details of how to connect devices.
@@ -57,7 +57,8 @@ var/datum/controller/process/wireless/wirelessProcess
process_queue(pending_connections, retry_connections)
/datum/controller/process/wireless/proc/process_queue(var/list/process_conections, var/list/unsuccesful_connections)
for(var/datum/connection_request/C in process_conections)
for(last_object in process_conections)
var/datum/connection_request/C = last_object
var/target_found = 0
for(var/datum/wifi/receiver/R in receiver_list)
if(R.id == C.id)

View File

@@ -6,6 +6,8 @@ var/list/gamemode_cache = list()
var/nudge_script_path = "nudge.py" // where the nudge.py script is located
var/list/lobby_screens = list("title") // Which lobby screens are available
var/log_ooc = 0 // log OOC channel
var/log_access = 0 // log login/logout
var/log_say = 0 // log client say
@@ -214,6 +216,8 @@ var/list/gamemode_cache = list()
var/list/language_prefixes = list(",","#","-")//Default language prefixes
var/ghosts_can_possess_animals = 0
/datum/configuration/New()
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
for (var/T in L)
@@ -420,6 +424,9 @@ var/list/gamemode_cache = list()
if ("githuburl")
config.githuburl = value
if ("ghosts_can_possess_animals")
config.ghosts_can_possess_animals = value
if ("guest_jobban")
config.guest_jobban = 1
@@ -694,6 +701,9 @@ var/list/gamemode_cache = list()
if(values.len > 0)
language_prefixes = values
if ("lobby_screens")
config.lobby_screens = text2list(value, ";")
else
log_misc("Unknown setting in configuration: '[name]'")

View File

@@ -1,31 +0,0 @@
#define OBSERVER_EVENT_DESTROY "OnDestroy"
/atom
var/list/observer_events
/atom/Destroy()
var/list/destroy_listeners = get_listener_list_from_event(OBSERVER_EVENT_DESTROY)
if(destroy_listeners)
for(var/destroy_listener in destroy_listeners)
call(destroy_listener, destroy_listeners[destroy_listener])(src)
for(var/list/listeners in observer_events)
listeners.Cut()
return ..()
/atom/proc/register(var/event, var/procOwner, var/proc_call)
var/list/listeners = get_listener_list_from_event(event)
listeners[procOwner] = proc_call
/atom/proc/unregister(var/event, var/procOwner)
var/list/listeners = get_listener_list_from_event(event)
listeners -= procOwner
/atom/proc/get_listener_list_from_event(var/observer_event)
if(!observer_events) observer_events = list()
var/list/listeners = observer_events[observer_event]
if(!listeners)
listeners = list()
observer_events[observer_event] = listeners
return listeners

View File

@@ -1,10 +1,14 @@
/*
#define OBSERVER_EVENT_DESTROY "OnDestroy"
/datum
var/list/observer_events
/datum/Destroy()
var/list/destroy_listeners = get_listener_list_from_event(OBSERVER_EVENT_DESTROY)
if(destroy_listeners)
for(var/destroy_listener in destroy_listeners)
call(destroy_listener, destroy_listeners[destroy_listener])(src)
for(var/list/listeners in observer_events)
listeners.Cut()
@@ -25,4 +29,3 @@
listeners = list()
observer_events[observer_event] = listeners
return listeners
*/