From d892099ea3fd7ecd4cf0f12aa2795ce970ac853c Mon Sep 17 00:00:00 2001 From: mwerezak Date: Mon, 23 Jun 2014 23:48:28 -0400 Subject: [PATCH] Adds direction arg for area/move_contents_to() Attempts to fix shuttle corner transition effect Fixes bad ETAs appearing on status displays --- baystation12.dme | 1 + .../emergency_shuttle_controller.dm | 24 ++- code/controllers/shuttle_controller.dm | 3 +- code/modules/shuttles/shuttle.dm | 11 +- code/modules/shuttles/shuttle_console.dm | 160 ----------------- code/modules/shuttles/shuttle_emergency.dm | 38 ++--- code/modules/shuttles/shuttle_ferry.dm | 161 ++++++++++++++++++ code/modules/shuttles/shuttle_supply.dm | 3 - code/modules/shuttles/shuttles_multi.dm | 5 +- code/setup.dm | 21 ++- 10 files changed, 219 insertions(+), 208 deletions(-) create mode 100644 code/modules/shuttles/shuttle_ferry.dm diff --git a/baystation12.dme b/baystation12.dme index 1fa1d56c23..d14983d796 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1294,6 +1294,7 @@ #include "code\modules\shuttles\shuttle.dm" #include "code\modules\shuttles\shuttle_console.dm" #include "code\modules\shuttles\shuttle_emergency.dm" +#include "code\modules\shuttles\shuttle_ferry.dm" #include "code\modules\shuttles\shuttle_specops.dm" #include "code\modules\shuttles\shuttle_supply.dm" #include "code\modules\shuttles\shuttles_multi.dm" diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 71d0cea0b9..f888932cdc 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -2,14 +2,6 @@ // Controls the emergency shuttle - -// these define the time taken for the shuttle to get to SS13 -// and the time before it leaves again -#define SHUTTLE_PREPTIME 300 // 5 minutes = 300 seconds - after this time, the shuttle cannot be recalled -#define SHUTTLE_LEAVETIME 180 // 3 minutes = 180 seconds - the duration for which the shuttle will wait at the station -#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station -#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure. - var/global/datum/emergency_shuttle_controller/emergency_shuttle /datum/emergency_shuttle_controller @@ -37,7 +29,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle pod.area_station = locate(/area/shuttle/escape_pod1/station) pod.area_offsite = locate(/area/shuttle/escape_pod1/centcom) pod.area_transition = locate(/area/shuttle/escape_pod1/transit) - pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN + pod.transit_direction = NORTH + pod.move_time = SHUTTLE_TRANSIT_DURATION_RETURN escape_pods += pod pod = new() @@ -46,7 +39,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle pod.area_station = locate(/area/shuttle/escape_pod2/station) pod.area_offsite = locate(/area/shuttle/escape_pod2/centcom) pod.area_transition = locate(/area/shuttle/escape_pod2/transit) - pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN + pod.transit_direction = NORTH + pod.move_time = SHUTTLE_TRANSIT_DURATION_RETURN escape_pods += pod pod = new() @@ -55,7 +49,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle pod.area_station = locate(/area/shuttle/escape_pod3/station) pod.area_offsite = locate(/area/shuttle/escape_pod3/centcom) pod.area_transition = locate(/area/shuttle/escape_pod3/transit) - pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN + pod.transit_direction = EAST + pod.move_time = SHUTTLE_TRANSIT_DURATION_RETURN escape_pods += pod //There is no pod 4, apparently. @@ -66,7 +61,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle pod.area_station = locate(/area/shuttle/escape_pod5/station) pod.area_offsite = locate(/area/shuttle/escape_pod5/centcom) pod.area_transition = locate(/area/shuttle/escape_pod5/transit) - pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN + pod.transit_direction = EAST //should this be WEST? I have no idea. + pod.move_time = SHUTTLE_TRANSIT_DURATION_RETURN escape_pods += pod @@ -187,9 +183,9 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle /datum/emergency_shuttle_controller/proc/estimate_arrival_time() var/eta if (isnull(shuttle.last_move_time)) - eta = launch_time + shuttle.travel_time*10 + eta = launch_time + shuttle.move_time*10 else - eta = shuttle.last_move_time + shuttle.travel_time*10 + eta = shuttle.last_move_time + shuttle.move_time*10 return (eta - world.time)/10 //returns the time left until the shuttle launches, in seconds diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index b0d05ea202..889f1a72e4 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -26,7 +26,8 @@ var/global/datum/shuttle_controller/shuttle_controller shuttle.area_offsite = locate(/area/shuttle/escape/centcom) shuttle.area_station = locate(/area/shuttle/escape/station) shuttle.area_transition = locate(/area/shuttle/escape/transit) - shuttle.travel_time = 300 + shuttle.transit_direction = NORTH + shuttle.move_time = 300 //shuttle.docking_controller_tag = "supply_shuttle" //shuttle.dock_target_station = "cargo_bay" shuttles["Escape"] = shuttle diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 6ad36cd8a2..ebc9fe1c9d 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -22,7 +22,8 @@ move(origin, destination) moving_status = SHUTTLE_IDLE -/datum/shuttle/proc/long_jump(var/area/departing,var/area/destination,var/area/interim,var/travel_time) +/datum/shuttle/proc/long_jump(var/area/departing, var/area/destination, var/area/interim, var/travel_time, var/direction) + //world << "shuttle/long_jump: departing=[departing], destination=[destination], interim=[interim], travel_time=[travel_time]" if(moving_status != SHUTTLE_IDLE) return //it would be cool to play a sound here @@ -31,11 +32,11 @@ if (moving_status == SHUTTLE_IDLE) return //someone cancelled the launch - move(departing, interim) + move(departing, interim, direction) sleep(travel_time*10) - move(interim, destination) + move(interim, destination, direction) moving_status = SHUTTLE_IDLE @@ -65,7 +66,7 @@ return 0 //just moves the shuttle from A to B, if it can be moved -/datum/shuttle/proc/move(var/area/origin,var/area/destination) +/datum/shuttle/proc/move(var/area/origin, var/area/destination, var/direction=null) //world << "move_shuttle() called for [shuttle_tag] leaving [origin] en route to [destination]." @@ -99,7 +100,7 @@ for(var/mob/living/simple_animal/pest in destination) pest.gib() - origin.move_contents_to(destination) //might need to use the "direction" argument here, I dunno. + origin.move_contents_to(destination, direction=direction) for(var/mob/M in destination) if(M.client) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 18f242bd5c..d45b66fce5 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -1,162 +1,3 @@ -#define IDLE_STATE 0 -#define WAIT_LAUNCH 1 -#define WAIT_ARRIVE 2 -#define WAIT_FINISH 3 - - -/datum/shuttle/ferry - var/location = 0 //0 = at area_station, 1 = at area_offsite - var/direction = 0 //0 = going to station, 1 = going to offsite. - var/process_state = IDLE_STATE - - var/in_use = null //tells the controller whether this shuttle needs processing - - var/area_transition - var/travel_time = 0 - - var/area_station - var/area_offsite - //TODO: change location to a string and use a mapping for area and dock targets. - var/dock_target_station - var/dock_target_offsite - -/datum/shuttle/ferry/short_jump(var/area/origin,var/area/destination) - if(isnull(location)) - return - - if(!destination) - destination = get_location_area(!location) - if(!origin) - origin = get_location_area(location) - - direction = !location - ..(origin, destination) - -/datum/shuttle/ferry/long_jump(var/area/departing,var/area/destination,var/area/interim,var/travel_time) - if(isnull(location)) - return - - if(!destination) - destination = get_location_area(!location) - if(!departing) - departing = get_location_area(location) - - direction = !location - ..(departing, destination, interim, travel_time) - -/datum/shuttle/ferry/move(var/area/origin,var/area/destination) - if(!destination) - destination = get_location_area(!location) - if(!origin) - origin = get_location_area(location) - - if (docking_controller && !docking_controller.undocked()) - docking_controller.force_undock() - ..(origin, destination) - - - if (destination == area_station) location = 0 - if (destination == area_offsite) location = 1 - //if this is a long_jump retain the location we were last at until we get to the new one - -/datum/shuttle/ferry/proc/get_location_area(location_id = null) - if (isnull(location_id)) - location_id = location - - if (!location_id) - return area_station - return area_offsite - -/datum/shuttle/ferry/proc/process() - switch(process_state) - if (WAIT_LAUNCH) - if (skip_docking_checks() || docking_controller.can_launch()) - - if (travel_time && area_transition) - long_jump(interim=area_transition, travel_time=travel_time) - else - short_jump() - - process_state = WAIT_ARRIVE - if (WAIT_ARRIVE) - if (moving_status == SHUTTLE_IDLE) - dock() - process_state = WAIT_FINISH - if (WAIT_FINISH) - if (skip_docking_checks() || docking_controller.docked()) - process_state = IDLE_STATE - in_use = null //release lock - arrived() - -/datum/shuttle/ferry/current_dock_target() - var/dock_target - if (!location) //station - dock_target = dock_target_station - else - dock_target = dock_target_offsite - return dock_target - - -/datum/shuttle/ferry/proc/launch(var/user) - if (!can_launch()) return - - in_use = user //obtain an exclusive lock on the shuttle - - process_state = WAIT_LAUNCH - undock() - -/datum/shuttle/ferry/proc/force_launch(var/user) - if (!can_force()) return - - in_use = user //obtain an exclusive lock on the shuttle - - if (travel_time && area_transition) - long_jump(null, null, area_transition, travel_time) - else - short_jump() - - - process_state = WAIT_ARRIVE - -/datum/shuttle/ferry/proc/cancel_launch(var/user) - if (!can_cancel()) return - - moving_status = SHUTTLE_IDLE - process_state = WAIT_FINISH - - if (docking_controller && !docking_controller.undocked()) - docking_controller.force_undock() - - spawn(10) - dock() - - return - -/datum/shuttle/ferry/proc/can_launch() - if (moving_status != SHUTTLE_IDLE) - return 0 - - if (in_use) - return 0 - - return 1 - -/datum/shuttle/ferry/proc/can_force() - if (moving_status == SHUTTLE_IDLE && process_state == WAIT_LAUNCH) - return 1 - return 0 - -/datum/shuttle/ferry/proc/can_cancel() - if (moving_status == SHUTTLE_WARMUP || process_state == WAIT_LAUNCH) - return 1 - return 0 - -//This gets called when the shuttle finishes arriving at it's destination -//This can be used by subtypes to do things when the shuttle arrives. -/datum/shuttle/ferry/proc/arrived() - return //do nothing for now - - /obj/machinery/computer/shuttle_control name = "shuttle control console" icon = 'icons/obj/computer.dmi' @@ -252,4 +93,3 @@ /obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj) visible_message("[Proj] ricochets off [src]!") - diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index 93854c94e1..8ad5a21844 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -5,34 +5,25 @@ /datum/shuttle/ferry/emergency/arrived() emergency_shuttle.shuttle_arrived() -/datum/shuttle/ferry/emergency/long_jump(var/area/departing,var/area/destination,var/area/interim,var/travel_time) +/datum/shuttle/ferry/emergency/long_jump(var/area/departing, var/area/destination, var/area/interim, var/travel_time, var/direction) + //world << "shuttle/ferry/emergency/long_jump: departing=[departing], destination=[destination], interim=[interim], travel_time=[travel_time]" if (!location) travel_time = SHUTTLE_TRANSIT_DURATION_RETURN else travel_time = SHUTTLE_TRANSIT_DURATION + + //update move_time so we get correct ETAs + move_time = travel_time + ..() -/* -/area/shuttle/escape/centcom/verb/shuttle_long_jump(var/area/A as area, var/area/B as area, var/area/I as area, var/travel_time as num) - set category = "Debug" - //set src in world - var/datum/shuttle/ferry/emergency/E = shuttle_controller.shuttles["Escape"] - E.long_jump(A, B, I, travel_time) - -/area/shuttle/escape/centcom/verb/shuttle_move(var/area/A as area, var/area/B as area) - set category = "Debug" - //set src in world - var/datum/shuttle/ferry/emergency/E = shuttle_controller.shuttles["Escape"] - E.long_jump(A, B) -*/ - /datum/shuttle/ferry/emergency/move(var/area/origin,var/area/destination) if (destination == area_transition) last_move_time = world.time else last_move_time = null - if (!location) //leaving the station + if (origin == area_station) //leaving the station emergency_shuttle.departed = 1 captain_announce("The Emergency Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at Central Command.") ..(origin, destination) @@ -174,11 +165,11 @@ for (var/dna_hash in authorized) auth_list[i++] = list("auth_name"=authorized[dna_hash], "auth_hash"=dna_hash) - while (i <= req_authorizations) //for some reason dream maker gives warnings if you use for(; i <= req_authorizations; i++) here. - auth_list[i++] = list("auth_name"="", "auth_hash"=-1) + while (i <= req_authorizations) //fill up the rest of the list with blank entries + auth_list[i++] = list("auth_name"="", "auth_hash"=null) else for (var/i = 1; i <= req_authorizations; i++) - auth_list[i] = list("auth_name"="ERROR", "auth_hash"=-1) + auth_list[i] = list("auth_name"="ERROR", "auth_hash"=null) var/has_auth = has_authorization() @@ -209,6 +200,8 @@ return if(href_list["auth"]) + /* + //This doesn't work at all. if (!emagged && href_list["auth"] == -1) //They selected an empty entry. Try to scan their id. if (ishuman(usr)) @@ -216,9 +209,10 @@ if (!read_authorization(H.get_active_hand())) //try to read what's in their hand first read_authorization(H.wear_id) else - //remove the authorization - var/dna_hash = href_list["auth"] - authorized -= dna_hash + */ + //remove the authorization + var/dna_hash = href_list["auth"] + authorized -= dna_hash diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm new file mode 100644 index 0000000000..3d1c2f4ba8 --- /dev/null +++ b/code/modules/shuttles/shuttle_ferry.dm @@ -0,0 +1,161 @@ +#define IDLE_STATE 0 +#define WAIT_LAUNCH 1 +#define WAIT_ARRIVE 2 +#define WAIT_FINISH 3 + + +/datum/shuttle/ferry + var/location = 0 //0 = at area_station, 1 = at area_offsite + var/direction = 0 //0 = going to station, 1 = going to offsite. + var/process_state = IDLE_STATE + + var/in_use = null //tells the controller whether this shuttle needs processing + + var/area_transition + var/move_time = 0 //the time spent in the transition area + var/transit_direction = null //needed for area/move_contents_to() to properly handle shuttle corners - not exactly sure how it works. + + var/area_station + var/area_offsite + //TODO: change location to a string and use a mapping for area and dock targets. + var/dock_target_station + var/dock_target_offsite + +/datum/shuttle/ferry/short_jump(var/area/origin,var/area/destination) + if(isnull(location)) + return + + if(!destination) + destination = get_location_area(!location) + if(!origin) + origin = get_location_area(location) + + direction = !location + ..(origin, destination) + +/datum/shuttle/ferry/long_jump(var/area/departing, var/area/destination, var/area/interim, var/travel_time, var/direction) + //world << "shuttle/ferry/long_jump: departing=[departing], destination=[destination], interim=[interim], travel_time=[travel_time]" + if(isnull(location)) + return + + if(!destination) + destination = get_location_area(!location) + if(!departing) + departing = get_location_area(location) + + direction = !location + ..(departing, destination, interim, travel_time, direction) + +/datum/shuttle/ferry/move(var/area/origin,var/area/destination) + if(!destination) + destination = get_location_area(!location) + if(!origin) + origin = get_location_area(location) + + if (docking_controller && !docking_controller.undocked()) + docking_controller.force_undock() + ..(origin, destination) + + + if (destination == area_station) location = 0 + if (destination == area_offsite) location = 1 + //if this is a long_jump retain the location we were last at until we get to the new one + +/datum/shuttle/ferry/proc/get_location_area(location_id = null) + if (isnull(location_id)) + location_id = location + + if (!location_id) + return area_station + return area_offsite + +/datum/shuttle/ferry/proc/process() + switch(process_state) + if (WAIT_LAUNCH) + if (skip_docking_checks() || docking_controller.can_launch()) + + //world << "shuttle/ferry/process: area_transition=[area_transition], travel_time=[travel_time]" + if (move_time && area_transition) + long_jump(interim=area_transition, travel_time=move_time, direction=transit_direction) + else + short_jump() + + process_state = WAIT_ARRIVE + if (WAIT_ARRIVE) + if (moving_status == SHUTTLE_IDLE) + dock() + process_state = WAIT_FINISH + if (WAIT_FINISH) + if (skip_docking_checks() || docking_controller.docked()) + process_state = IDLE_STATE + in_use = null //release lock + arrived() + +/datum/shuttle/ferry/current_dock_target() + var/dock_target + if (!location) //station + dock_target = dock_target_station + else + dock_target = dock_target_offsite + return dock_target + + +/datum/shuttle/ferry/proc/launch(var/user) + if (!can_launch()) return + + in_use = user //obtain an exclusive lock on the shuttle + + process_state = WAIT_LAUNCH + undock() + +/datum/shuttle/ferry/proc/force_launch(var/user) + if (!can_force()) return + + in_use = user //obtain an exclusive lock on the shuttle + + if (move_time && area_transition) + long_jump(interim=area_transition, travel_time=move_time, direction=transit_direction) + else + short_jump() + + + process_state = WAIT_ARRIVE + +/datum/shuttle/ferry/proc/cancel_launch(var/user) + if (!can_cancel()) return + + moving_status = SHUTTLE_IDLE + process_state = WAIT_FINISH + + if (docking_controller && !docking_controller.undocked()) + docking_controller.force_undock() + + spawn(10) + dock() + + return + +/datum/shuttle/ferry/proc/can_launch() + if (moving_status != SHUTTLE_IDLE) + return 0 + + if (in_use) + return 0 + + return 1 + +/datum/shuttle/ferry/proc/can_force() + if (moving_status == SHUTTLE_IDLE && process_state == WAIT_LAUNCH) + return 1 + return 0 + +/datum/shuttle/ferry/proc/can_cancel() + if (moving_status == SHUTTLE_WARMUP || process_state == WAIT_LAUNCH) + return 1 + return 0 + +//This gets called when the shuttle finishes arriving at it's destination +//This can be used by subtypes to do things when the shuttle arrives. +/datum/shuttle/ferry/proc/arrived() + return //do nothing for now + diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm index 1610a5deee..f75193ea03 100644 --- a/code/modules/shuttles/shuttle_supply.dm +++ b/code/modules/shuttles/shuttle_supply.dm @@ -58,9 +58,6 @@ if (!at_station()) //at centcom supply_controller.sell() -/datum/shuttle/ferry/supply/long_jump(var/area/departing,var/area/destination,var/area/interim,var/travel_time) - short_jump(departing, destination) //long jumps are disabled - // returns 1 if the supply shuttle should be prevented from moving because it contains forbidden atoms /datum/shuttle/ferry/supply/proc/forbidden_atoms_check() if (!at_station()) diff --git a/code/modules/shuttles/shuttles_multi.dm b/code/modules/shuttles/shuttles_multi.dm index 11974c7034..037e5ac3d4 100644 --- a/code/modules/shuttles/shuttles_multi.dm +++ b/code/modules/shuttles/shuttles_multi.dm @@ -73,7 +73,6 @@ user << browse("[dat]", "window=[shuttle_tag]shuttlecontrol;size=300x600") /obj/machinery/computer/shuttle_control/multi/Topic(href, href_list) - if(..()) return @@ -82,6 +81,8 @@ var/datum/shuttle/multi_shuttle/MS = shuttle_controller.shuttles[shuttle_tag] if(!istype(MS)) return + + //world << "multi_shuttle: last_departed=[MS.last_departed], origin=[MS.origin], interim=[MS.interim], travel_time=[MS.move_time]" if (MS.moving_status != SHUTTLE_IDLE) usr << "\blue [shuttle_tag] vessel is moving." @@ -98,7 +99,7 @@ //TODO: Actually end the mission. MS.return_warning = 1 return - + MS.long_jump(MS.last_departed,MS.origin,MS.interim,MS.move_time) MS.last_departed = MS.origin MS.at_origin = 1 diff --git a/code/setup.dm b/code/setup.dm index 3c190f1e2a..b40cd05fa7 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -762,7 +762,26 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse #define COLOR_ORANGE "#FF9900" #define COLOR_WHITE "#FFFFFF" + + +/* + Shuttles +*/ + +// these define the time taken for the shuttle to get to SS13 +// and the time before it leaves again +#define SHUTTLE_PREPTIME 300 // 5 minutes = 300 seconds - after this time, the shuttle departs centcom and cannot be recalled +#define SHUTTLE_LEAVETIME 180 // 3 minutes = 180 seconds - the duration for which the shuttle will wait at the station after arriving +#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station +#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure. + //Shuttle moving status #define SHUTTLE_IDLE 0 #define SHUTTLE_WARMUP 1 -#define SHUTTLE_INTRANSIT 2 \ No newline at end of file +#define SHUTTLE_INTRANSIT 2 + +//Ferry shuttle processing status +#define IDLE_STATE 0 +#define WAIT_LAUNCH 1 +#define WAIT_ARRIVE 2 +#define WAIT_FINISH 3