From 43fc65d529efe1cae642c7c264b64eb3762f4568 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 25 Mar 2020 13:49:26 -0400 Subject: [PATCH] Remove turbolift_controller proccess, just use SSprocessing instead. - Design based on BayStation: Refactor turbolift.do_move() to remove all sleep()'s, instead have wait_state to keep track of where it was. - Add in process() proc to do appropriate action based on wait_state. - Register/deregister with SSprocessing instead of turbolift_controller --- code/modules/turbolift/turbolift.dm | 57 ++++++++++++++++++--- code/modules/turbolift/turbolift_process.dm | 36 ------------- polaris.dme | 1 - 3 files changed, 49 insertions(+), 45 deletions(-) delete mode 100644 code/modules/turbolift/turbolift_process.dm diff --git a/code/modules/turbolift/turbolift.dm b/code/modules/turbolift/turbolift.dm index 6b657f4d4b..46f201ab4f 100644 --- a/code/modules/turbolift/turbolift.dm +++ b/code/modules/turbolift/turbolift.dm @@ -11,7 +11,8 @@ var/doors_closing = 0 // Whether doors are in the process of closing var/tmp/moving_upwards - var/tmp/busy + var/tmp/busy_state // Used for controller processing. + var/tmp/next_process // world.time process() should next do something /datum/turbolift/proc/emergency_stop() queued_floors.Cut() @@ -38,7 +39,42 @@ door.close() return +#define LIFT_MOVING 1 // Lift will try moving. +#define LIFT_WAITING_A 2 // Waiting 15ds after arrival to announce, then goto LIFT_WAITING_B +#define LIFT_WAITING_B 3 // Waiting floor_wait_delay after announcement before potentially moving again. + +/datum/turbolift/process() + if(world.time < next_process) + return + switch(busy_state) + if(LIFT_MOVING) + if(!do_move()) + if(target_floor) + // TODO - This logic copied from old processor. Would be better to have error states. + target_floor.ext_panel.reset() + target_floor = null + return PROCESS_KILL + else if(!next_process) + log_debug("Turbolift [src] do_move() returned 1 but next_process = null; busy_state=[busy_state]") + return PROCESS_KILL + if(LIFT_WAITING_A) + var/area/turbolift/origin = locate(current_floor.area_ref) + control_panel_interior.visible_message("The elevator announces, \"[origin.lift_announce_str]\"") + next_process = world.time + floor_wait_delay + busy_state = LIFT_WAITING_B + if(LIFT_WAITING_B) + if(queued_floors.len) + busy_state = LIFT_MOVING + else + busy_state = null + return PROCESS_KILL + else + log_debug("Turbolift [src] process() called with unknown busy_state='[busy_state]'") + return PROCESS_KILL + +// Called by process when in LIFT_MOVING /datum/turbolift/proc/do_move() + next_process = null var/current_floor_index = floors.Find(current_floor) @@ -56,6 +92,7 @@ if(!doors_closing) close_doors() doors_closing = 1 + next_process = world.time + 1 SECOND // Wait for doors to close return 1 else // We failed to close the doors - probably, someone is blocking them; stop trying to move doors_closing = 0 @@ -74,10 +111,8 @@ target_floor.arrived(src) target_floor = null - sleep(15) - control_panel_interior.visible_message("The elevator announces, \"[origin.lift_announce_str]\"") - sleep(floor_wait_delay) - + next_process = world.time + 15 + busy_state = LIFT_WAITING_A return 1 // Work out where we're headed. @@ -110,15 +145,21 @@ current_floor = next_floor control_panel_interior.visible_message("The elevator [moving_upwards ? "rises" : "descends"] smoothly.") - return (next_floor.delay_time || move_delay || 30) + next_process = world.time + (next_floor.delay_time || move_delay) + return 1 /datum/turbolift/proc/queue_move_to(var/datum/turbolift_floor/floor) if(!floor || !(floor in floors) || (floor in queued_floors)) return // STOP PRESSING THE BUTTON. floor.pending_move(src) queued_floors |= floor - turbolift_controller.lift_is_moving(src) + busy_state = LIFT_MOVING + START_PROCESSING(SSprocessing, src) // TODO: dummy machine ('lift mechanism') in powered area for functionality/blackout checks. /datum/turbolift/proc/is_functional() - return 1 \ No newline at end of file + return 1 + +#undef LIFT_MOVING +#undef LIFT_WAITING_A +#undef LIFT_WAITING_B diff --git a/code/modules/turbolift/turbolift_process.dm b/code/modules/turbolift/turbolift_process.dm deleted file mode 100644 index 124049d42e..0000000000 --- a/code/modules/turbolift/turbolift_process.dm +++ /dev/null @@ -1,36 +0,0 @@ -var/datum/controller/process/turbolift/turbolift_controller - -/datum/controller/process/turbolift - var/list/moving_lifts = list() - -/datum/controller/process/turbolift/New() - ..() - turbolift_controller = src - -/datum/controller/process/turbolift/setup() - name = "turbolift controller" - schedule_interval = 10 - -/datum/controller/process/turbolift/doWork() - for(var/liftref in moving_lifts) - if(world.time < moving_lifts[liftref]) - continue - var/datum/turbolift/lift = locate(liftref) - if(lift.busy) - continue - spawn(0) - lift.busy = 1 - var/floor_delay - if(!(floor_delay = lift.do_move())) - moving_lifts[liftref] = null - moving_lifts -= liftref - if(lift.target_floor) - lift.target_floor.ext_panel.reset() - lift.target_floor = null - else - lift_is_moving(lift,floor_delay) - lift.busy = 0 - SCHECK - -/datum/controller/process/turbolift/proc/lift_is_moving(var/datum/turbolift/lift,var/floor_delay) - moving_lifts["\ref[lift]"] = world.time + floor_delay diff --git a/polaris.dme b/polaris.dme index 8b4969978a..be833e5b1c 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2755,7 +2755,6 @@ #include "code\modules\turbolift\turbolift_door.dm" #include "code\modules\turbolift\turbolift_floor.dm" #include "code\modules\turbolift\turbolift_map.dm" -#include "code\modules\turbolift\turbolift_process.dm" #include "code\modules\turbolift\turbolift_turfs.dm" #include "code\modules\vehicles\bike.dm" #include "code\modules\vehicles\boat.dm"