diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm index aaccf2f00f1..387be2c678c 100644 --- a/code/controllers/Processes/scheduler.dm +++ b/code/controllers/Processes/scheduler.dm @@ -18,7 +18,9 @@ try if(world.time > scheduled_task.trigger_time) unschedule(scheduled_task) + scheduled_task.pre_process() scheduled_task.process() + scheduled_task.post_process() catch(var/exception/e) catchException(e, last_object) SCHECK @@ -40,26 +42,30 @@ * Helpers * **********/ /proc/schedule_task_in(var/in_time, var/procedure, var/list/arguments = list()) - schedule_task(world.time + in_time, procedure, arguments) + return schedule_task(world.time + in_time, procedure, arguments) /proc/schedule_task_with_source_in(var/in_time, var/source, var/procedure, var/list/arguments = list()) - schedule_task_with_source(world.time + in_time, source, procedure, arguments) + return schedule_task_with_source(world.time + in_time, source, procedure, arguments) /proc/schedule_task(var/trigger_time, 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) + return st /proc/schedule_task_with_source(var/trigger_time, 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) + return 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) + return 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) + return st /************* * Task Datum * @@ -70,6 +76,7 @@ var/list/arguments var/task_after_process var/list/task_after_process_args + var/datum/observ/triggered /datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) ..() @@ -87,13 +94,31 @@ task_after_process_args.Cut() return ..() -/datum/scheduled_task/proc/process() - call(procedure)(arglist(arguments)) - after_process() +/datum/scheduled_task/init_observers() + . = ..() + if(.) + triggered = new() -/datum/scheduled_task/proc/after_process() +/datum/scheduled_task/destroy_observers() + . = ..() + if(.) + qdel(triggered) + triggered = null + +/datum/scheduled_task/proc/pre_process() + triggered.raise_event(list(src)) + +/datum/scheduled_task/proc/process() + if(procedure) + call(procedure)(arglist(arguments)) + +/datum/scheduled_task/proc/post_process() call(task_after_process)(arglist(task_after_process_args)) +// Resets the trigger time, has no effect if the task has already triggered +/datum/scheduled_task/proc/trigger_task_in(var/trigger_in) + src.trigger_time = world.time + trigger_in + /datum/scheduled_task/source var/datum/source @@ -108,7 +133,6 @@ /datum/scheduled_task/source/process() call(source, procedure)(arglist(arguments)) - after_process() /datum/scheduled_task/source/proc/source_destroyed() qdel(src) diff --git a/code/datums/observation/observation.dm b/code/datums/observation/observation.dm index 267afcd6707..eefbcb1fc22 100644 --- a/code/datums/observation/observation.dm +++ b/code/datums/observation/observation.dm @@ -44,6 +44,7 @@ /datum/proc/init_observers() destruction = new() + return TRUE /datum/proc/destroy_observers() if(!destruction) @@ -56,8 +57,8 @@ // This ensures that observer handlers don't create their own observer handlers, which create their own handlers, which create... /datum/observ/init_observers() - return + return FALSE // And this ensures that observer handlers don't attempt to notify others about their own death while being unable to. /datum/observ/destroy_observers() - return + return FALSE diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 36a76ed7e5a..bb1b5ba22ac 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -14,24 +14,37 @@ var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to var/dirt = 0 + var/datum/scheduled_task/unwet_task + // This is not great. /turf/simulated/proc/wet_floor(var/wet_val = 1) - spawn(0) - if(wet_val <= wet) - return + if(wet_val < wet) + return + + if(!wet) wet = wet_val - if(wet_overlay) - overlays -= wet_overlay - wet_overlay = null wet_overlay = image('icons/effects/water.dmi',src,"wet_floor") overlays += wet_overlay - sleep(800) - if(wet >= 2) - return - wet = 0 - if(wet_overlay) - overlays -= wet_overlay - wet_overlay = null + + if(unwet_task) + unwet_task.trigger_task_in(8 SECONDS) + else + unwet_task = schedule_task_in(8 SECONDS) + unwet_task.triggered.register(src, /turf/simulated/proc/task_unwet_floor) + +/turf/simulated/proc/task_unwet_floor(var/triggered_task) + if(triggered_task == unwet_task) + unwet_task = null + unwet_floor(TRUE) + +/turf/simulated/proc/unwet_floor(var/check_very_wet) + if(check_very_wet && wet >= 2) + return + + wet = 0 + if(wet_overlay) + overlays -= wet_overlay + wet_overlay = null /turf/simulated/clean_blood() for(var/obj/effect/decal/cleanable/blood/B in contents) @@ -44,6 +57,11 @@ holy = 1 levelupdate() +/turf/simulated/Destroy() + qdel(unwet_task) + unwet_task = null + return ..() + /turf/simulated/proc/initialize() return diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index 54a9866ea4d..1df0ee5ff9f 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -69,7 +69,7 @@ obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob) /obj/item/weapon/board/interact(mob/user as mob) - if(user.incapacitated(INCAPACITATION_DISABLED) || (!isAI(user) && !user.Adjacent(src))) //can't see if you arent conscious. If you are not an AI you can't see it unless you are next to it, either. + if(user.is_physically_disabled() || (!isAI(user) && !user.Adjacent(src))) //can't see if you arent conscious. If you are not an AI you can't see it unless you are next to it, either. user << browse(null, "window=boardgame") user.unset_machine() return diff --git a/code/world.dm b/code/world.dm index d2edb5672ae..57006ec5b4c 100644 --- a/code/world.dm +++ b/code/world.dm @@ -25,10 +25,10 @@ var/global/datum/global_init/init = new () qdel(src) //we're done /datum/global_init/init_observers() - return + return FALSE /datum/global_init/destroy_observers() - return + return FALSE /world mob = /mob/new_player diff --git a/html/changelog.html b/html/changelog.html index a0dea4fdb91..dafb342cc85 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,16 @@ -->