/datum/puzzlewizard/delay name = "AB CREATE: Delay" var/time_delay = 10 var/periodic = 0 var/list/selected_triggerable = list() var/selection initialize() selection = unpool(/obj/adventurepuzzle/marker) time_delay = input("Timing amount (in 1/10 seconds)", "Timing amount", 5) as num var/per = input("Is this periodic? (Repeatedly triggers until aborted if started.)", "Periodic", "yes") in list("yes", "no") periodic = (per == "yes") ? 1 : 0 boutput(usr, "Left click to place timers, right click triggerables to (de)select them for automatic assignment to the timers. Ctrl+click anywhere to finish.") boutput(usr, "Right click delays to launch them immediately. (Useful for triggering periodic delays)") boutput(usr, "NOTE: Select stuff first, then make buttons for extra comfort!") proc/clear_selections() for (var/obj/O in selected_triggerable) O.overlays -= selection selected_triggerable.len = 0 disposing() clear_selections() pool(selection) build_click(var/mob/user, var/datum/buildmode_holder/holder, var/list/pa, var/atom/object) if (pa.Find("left")) var/turf/T = get_turf(object) if (pa.Find("ctrl")) finished = 1 clear_selections() return if (T) var/obj/adventurepuzzle/triggerable/triggerer/delay/timer = new /obj/adventurepuzzle/triggerable/triggerer/delay(T) timer.time_delay = time_delay timer.periodic = periodic timer.triggered = selected_triggerable.Copy() else if (pa.Find("right")) if (istype(object, /obj/adventurepuzzle/triggerable/triggerer/delay)) var/obj/adventurepuzzle/triggerable/triggerer/delay/timer = object timer.trigger("start") if (istype(object, /obj/adventurepuzzle/triggerable)) if (object in selected_triggerable) object.overlays -= selection selected_triggerable -= object else var/list/actions = object:trigger_actions() if (islist(actions) && actions.len) var/act_name = input("Do what?", "Do what?", actions[1]) in actions var/act = actions[act_name] object.overlays += selection selected_triggerable += object selected_triggerable[object] = act else boutput(usr, "ERROR: Missing actions definition for triggerable [object].") /obj/adventurepuzzle/triggerable/triggerer/delay name = "delay" invisibility = 20 icon = 'icons/obj/device.dmi' icon_state = "timer0" density = 0 opacity = 0 anchored = 1 var/time_delay = 10 var/curr_time var/aborted = 1 var/periodic = 0 var/static/list/triggeracts = list("Abort timing" = "abort", "Do nothing" = "nop", "Start timing" = "start") trigger_actions() return triggeracts trigger(var/act) switch (act) if ("abort") aborted = 1 if ("start") if (!aborted) return aborted = 0 curr_time = time_delay SPAWN_DBG(0) while (1) if (aborted) return curr_time-- if (curr_time <= 0) post_trigger() if (periodic) curr_time = time_delay else aborted = 1 return sleep(1) serialize(var/savefile/F, var/path, var/datum/sandbox/sandbox) ..() F["[path].time_delay"] << time_delay F["[path].periodic"] << periodic deserialize(var/savefile/F, var/path, var/datum/sandbox/sandbox) . = ..() F["[path].time_delay"] >> time_delay F["[path].periodic"] >> periodic