From 4e8d1c3cba2e2e88d7215f3f804dba304619a3db Mon Sep 17 00:00:00 2001 From: Belsima Date: Thu, 8 Jun 2017 09:23:25 -0400 Subject: [PATCH 1/7] Replaces lantern sprites. --- icons/obj/lighting.dmi | Bin 41526 -> 42859 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 736308440d23204a1f3eed1699680a47946d600f..cb4d4042c60c088428b2df0559a075e38f2a7689 100644 GIT binary patch delta 25689 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 delta 24345 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 Q-8po| Date: Fri, 9 Jun 2017 19:35:35 -0400 Subject: [PATCH 2/7] Eliminate init() proc from /datum/gas_mixture * Initializing a list in the type definition (of any type) incurs a hidden proc call ("init"). Simply by moving the init of the lists to /New() we speed up creation of /datum/gas_mixtures (which happens *often*) * The list variables still get initialized by the time the instance is created, so this has zero impact on other code, its just starightup faster with no downsides. --- code/modules/xgm/xgm_gas_mixture.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index cb600f254f7..ca2ed06c5f3 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -1,7 +1,7 @@ /datum/gas_mixture //Associative list of gas moles. //Gases with 0 moles are not tracked and are pruned by update_values() - var/list/gas = list() + var/list/gas //Temperature in Kelvin of this gas mix. var/temperature = 0 @@ -13,10 +13,12 @@ var/group_multiplier = 1 //List of active tile overlays for this gas_mixture. Updated by check_tile_graphic() - var/list/graphic = list() + var/list/graphic /datum/gas_mixture/New(vol = CELL_VOLUME) volume = vol + gas = list() + graphic = list() //Takes a gas string and the amount of moles to adjust by. Calls update_values() if update isn't 0. /datum/gas_mixture/proc/adjust_gas(gasid, moles, update = 1) From 1b8451bc9adc7e02e273a253ab77beb4c14b55af Mon Sep 17 00:00:00 2001 From: Leshana Date: Sat, 10 Jun 2017 10:13:55 -0400 Subject: [PATCH 3/7] Converts /datum/gas_mixture/var/graphic to a lazy list. * The vast majority of gas mixtures never use their `graphic` list. Prime candidate for making a lazy init list. * While we are here, add nullchecks to ZAS's use of the graphic list a bit. /turf/update_graphics was technically already null safe, but its even better to not bother calling it at all right? --- code/ZAS/Turf.dm | 4 ++-- code/ZAS/Zone.dm | 14 ++++++++++---- code/modules/xgm/xgm_gas_mixture.dm | 20 ++++++++------------ 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm index bb5eb5050eb..a309cd3a082 100644 --- a/code/ZAS/Turf.dm +++ b/code/ZAS/Turf.dm @@ -5,9 +5,9 @@ /turf/var/datum/gas_mixture/air /turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) - if(graphic_add && graphic_add.len) + if(LAZYLEN(graphic_add)) overlays += graphic_add - if(graphic_remove && graphic_remove.len) + if(LAZYLEN(graphic_remove)) overlays -= graphic_remove /turf/proc/update_air_properties() diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm index da39b868d3a..18c5ab28999 100644 --- a/code/ZAS/Zone.dm +++ b/code/ZAS/Zone.dm @@ -77,7 +77,8 @@ Class Procs: fire_tiles.Add(T) air_master.active_fire_zones |= src if(fuel) fuel_objs += fuel - T.update_graphic(air.graphic) + if(air.graphic) + T.update_graphic(air.graphic) /zone/proc/remove(turf/simulated/T) #ifdef ZASDBG @@ -92,7 +93,8 @@ Class Procs: var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T fuel_objs -= fuel T.zone = null - T.update_graphic(graphic_remove = air.graphic) + if(air.graphic) + T.update_graphic(graphic_remove = air.graphic) if(contents.len) air.group_multiplier = contents.len else @@ -106,9 +108,11 @@ Class Procs: ASSERT(!into.invalid) #endif c_invalidate() + var/list/air_graphic = air.graphic // Cache for sanic speed for(var/turf/simulated/T in contents) into.add(T) - T.update_graphic(graphic_remove = air.graphic) + if(air_graphic) + T.update_graphic(graphic_remove = air_graphic) #ifdef ZASDBG T.dbg(merged) #endif @@ -131,8 +135,10 @@ Class Procs: /zone/proc/rebuild() if(invalid) return //Short circuit for explosions where rebuild is called many times over. c_invalidate() + var/list/air_graphic = air.graphic // Cache for sanic speed for(var/turf/simulated/T in contents) - T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt + if(air_graphic) + T.update_graphic(graphic_remove = air_graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt //T.dbg(invalid_zone) T.needs_air_update = 0 //Reset the marker so that it will be added to the list. air_master.mark_for_update(T) diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index ca2ed06c5f3..7fe1a96d0d1 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -18,7 +18,6 @@ /datum/gas_mixture/New(vol = CELL_VOLUME) volume = vol gas = list() - graphic = list() //Takes a gas string and the amount of moles to adjust by. Calls update_values() if update isn't 0. /datum/gas_mixture/proc/adjust_gas(gasid, moles, update = 1) @@ -331,27 +330,24 @@ //Rechecks the gas_mixture and adjusts the graphic list if needed. //Two lists can be passed by reference if you need know specifically which graphics were added and removed. /datum/gas_mixture/proc/check_tile_graphic(list/graphic_add = null, list/graphic_remove = null) + var/list/cur_graphic = graphic // Cache for sanic speed for(var/g in gas_data.overlay_limit) - if(graphic.Find(gas_data.tile_overlay[g])) + if(cur_graphic && cur_graphic.Find(gas_data.tile_overlay[g])) //Overlay is already applied for this gas, check if it's still valid. if(gas[g] <= gas_data.overlay_limit[g]) - if(!graphic_remove) - graphic_remove = list() - graphic_remove += gas_data.tile_overlay[g] + LAZYADD(graphic_remove, gas_data.tile_overlay[g]) else //Overlay isn't applied for this gas, check if it's valid and needs to be added. if(gas[g] > gas_data.overlay_limit[g]) - if(!graphic_add) - graphic_add = list() - graphic_add += gas_data.tile_overlay[g] + LAZYADD(graphic_add, gas_data.tile_overlay[g]) . = 0 //Apply changes - if(graphic_add && graphic_add.len) - graphic += graphic_add + if(LAZYLEN(graphic_add)) + LAZYADD(graphic, graphic_add) . = 1 - if(graphic_remove && graphic_remove.len) - graphic -= graphic_remove + if(LAZYLEN(graphic_remove)) + LAZYREMOVE(graphic, graphic_remove) . = 1 From b7f74541b8874a4a5a22c1b14bb7876cc17f20b4 Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 11 Jun 2017 02:52:53 -0400 Subject: [PATCH 4/7] Makes Examine Panel slightly more useful. The examine panel can now display different interactions with a few items, using icons, mostly as a proof of concept. --- code/game/machinery/doors/airlock.dm | 5 +- code/game/turfs/simulated/wall_attacks.dm | 9 ++++ .../examine/descriptions/engineering.dm | 47 ++++++++++++++++++- code/modules/examine/descriptions/turfs.dm | 34 +++++++++++++- code/modules/examine/examine.dm | 18 ++++++- code/modules/examine/stat_icons.dm | 18 ++++++- 6 files changed, 123 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5d8d068d49d..5e43231ed66 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -753,6 +753,9 @@ About the new airlock wires panel: update_icon() return 1 +/obj/machinery/door/airlock/proc/can_remove_electronics() + return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) + /obj/machinery/door/airlock/attackby(C as obj, mob/user as mob) //world << text("airlock attackby src [] obj [] mob []", src, C, user) if(!istype(usr, /mob/living/silicon)) @@ -797,7 +800,7 @@ About the new airlock wires panel: var/obj/item/weapon/pai_cable/cable = C cable.plugin(src, user) else if(!repairing && istype(C, /obj/item/weapon/crowbar)) - if(src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) ) + if(can_remove_electronics()) playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") if(do_after(user,40)) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 890574d6641..25b49154080 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -190,6 +190,7 @@ else user << "You need more welding fuel to complete this task." return + user.update_examine_panel(src) return // Basic dismantling. @@ -243,6 +244,7 @@ if (istype(W, /obj/item/weapon/wirecutters)) playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) construction_stage = 5 + user.update_examine_panel(src) user << "You cut through the outer grille." update_icon() return @@ -253,11 +255,13 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 5) return construction_stage = 4 + user.update_examine_panel(src) update_icon() user << "You unscrew the support lines." return else if (istype(W, /obj/item/weapon/wirecutters)) construction_stage = 6 + user.update_examine_panel(src) user << "You mend the outer grille." update_icon() return @@ -280,6 +284,7 @@ if(!do_after(user, 60) || !istype(src, /turf/simulated/wall) || construction_stage != 4) return construction_stage = 3 + user.update_examine_panel(src) update_icon() user << "You press firmly on the cover, dislodging it." return @@ -289,6 +294,7 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 4) return construction_stage = 5 + user.update_examine_panel(src) update_icon() user << "You screw down the support lines." return @@ -299,6 +305,7 @@ if(!do_after(user,100) || !istype(src, /turf/simulated/wall) || construction_stage != 3) return construction_stage = 2 + user.update_examine_panel(src) update_icon() user << "You pry off the cover." return @@ -309,6 +316,7 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 2) return construction_stage = 1 + user.update_examine_panel(src) update_icon() user << "You remove the bolts anchoring the support rods." return @@ -329,6 +337,7 @@ if(!do_after(user,70) || !istype(src, /turf/simulated/wall) || construction_stage != 1) return construction_stage = 0 + user.update_examine_panel(src) update_icon() user << "The slice through the support rods." return diff --git a/code/modules/examine/descriptions/engineering.dm b/code/modules/examine/descriptions/engineering.dm index c3f9b9b21fa..37e69f16f90 100644 --- a/code/modules/examine/descriptions/engineering.dm +++ b/code/modules/examine/descriptions/engineering.dm @@ -25,11 +25,54 @@ Wires can be pulsed remotely with a signaler attached to it. A powersink will also drain any APCs connected to the same wire the powersink is on." /obj/item/inflatable - description_info = "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb." + description_info = "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb. \ + You can also inflate this on an adjacent tile by clicking the tile." /obj/structure/inflatable - description_info = "To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever." + description_info = "To remove these safely, use the 'deflate' verb, or alt-click on it. Hitting these with any objects will probably puncture and break it forever." /obj/structure/inflatable/door description_info = "Click the door to open or close it. It only stops air while closed.
\ To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever." + +/obj/machinery/door/get_description_interaction() + var/list/results = list() + if(!repairing && (health < maxhealth) && !(stat & BROKEN)) + results += "[desc_panel_image("metal sheet")]to start repairing damage (May require different material type)." + if(repairing && density) + results += "[desc_panel_image("welder")]to finish repairs." + results += "[desc_panel_image("crowbar")]to undo adding sheets for repairs." + + return results + +/obj/machinery/door/airlock/get_description_interaction() + var/list/results = list() + + if(can_remove_electronics()) + results += "[desc_panel_image("crowbar")]to remove the airlock electronics." + else + results += "[desc_panel_image("crowbar")]to open or close if unpowered/broken, and unbolted." + + if(welded) + results += "[desc_panel_image("welder")]to unweld, allowing it to open again." + else + results += "[desc_panel_image("welder")]to weld, preventing it from opening." + + if(p_open) + results += "[desc_panel_image("screwdriver")]to close the wire panel." + results += "[desc_panel_image("wirecutters")]to cut an internal wire while hacking." + results += "[desc_panel_image("multitool")]to pulse an internal wire while hacking." + else + results += "[desc_panel_image("screwdriver")]to open the wire panel, enabling the ability to hack." + + results += ..() + + return results + +/obj/machinery/portable_atmospherics/canister/get_description_interaction() + var/list/results = list() + + results += "[desc_panel_image("wrench")]to connect or disconnect from a connector port below." + results += "[desc_panel_image("air tank")]to fill the air tank from this canister." + + return results \ No newline at end of file diff --git a/code/modules/examine/descriptions/turfs.dm b/code/modules/examine/descriptions/turfs.dm index cccc43e0731..4319c23ffe6 100644 --- a/code/modules/examine/descriptions/turfs.dm +++ b/code/modules/examine/descriptions/turfs.dm @@ -1,3 +1,33 @@ /turf/simulated/wall - description_info = "You can deconstruct this by welding it, and then wrenching the girder.
\ - You can build a wall by using metal sheets and making a girder, then adding more metal or plasteel." \ No newline at end of file + description_info = "You can build a wall by using metal sheets and making a girder, then adding more metal or plasteel." + +/turf/simulated/wall/get_description_interaction() + var/list/results = list() + if(damage) + results += "[desc_panel_image("welder")]to repair." + + if(isnull(construction_stage) || !reinf_material) + results += "[desc_panel_image("welder")]to deconstruct if undamaged." + else + switch(construction_stage) + if(6) + results += "[desc_panel_image("wirecutters")]to begin deconstruction." + if(5) + results += list( + "[desc_panel_image("screwdriver")]to continue deconstruction.", + "[desc_panel_image("wirecutters")]to reverse deconstruction." + ) + if(4) + results += list( + "[desc_panel_image("welder")]to continue deconstruction.", + "[desc_panel_image("screwdriver")]to reverse deconstruction." + ) + if(3) + results += "[desc_panel_image("crowbar")]to continue deconstruction." + if(2) + results += "[desc_panel_image("wrench")]to continue deconstruction." + if(1) + results += "[desc_panel_image("welder")]to continue deconstruction." + if(0) + results += "[desc_panel_image("crowbar")]to finish deconstruction." + return results \ No newline at end of file diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm index ec64ffbe41f..6e2df0b1fa9 100644 --- a/code/modules/examine/examine.dm +++ b/code/modules/examine/examine.dm @@ -5,6 +5,7 @@ This means that this file can be unchecked, along with the other examine files, and can be removed entirely with no effort. */ +#define EXAMINE_PANEL_PADDING " " /atom/ var/description_info = null //Helpful blue text. @@ -27,6 +28,14 @@ return description_antag return +// This one is slightly different, in that it must return a list. +/atom/proc/get_description_interaction() + return list() + +// Quickly adds the boilerplate code to add an image and padding for the image. +/proc/desc_panel_image(var/icon_state) + return "\icon[description_icons[icon_state]][EXAMINE_PANEL_PADDING]" + /mob/living/get_description_fluff() if(flavor_text) //Get flavor text for the green text. return flavor_text @@ -44,6 +53,7 @@ description_holders["info"] = A.get_description_info() description_holders["fluff"] = A.get_description_fluff() description_holders["antag"] = (update_antag_info)? A.get_description_antag() : "" + description_holders["interactions"] = A.get_description_interaction() description_holders["name"] = "[A.name]" description_holders["icon"] = "\icon[A]" @@ -57,6 +67,9 @@ stat(null,"[description_holders["desc"]]") //the default examine text. if(description_holders["info"]) stat(null,"[description_holders["info"]]") //Blue, informative text. + if(description_holders["interactions"]) + for(var/line in description_holders["interactions"]) + stat(null, "[line]") if(description_holders["fluff"]) stat(null,"[description_holders["fluff"]]") //Yellow, fluff-related text. if(description_holders["antag"]) @@ -67,6 +80,9 @@ if(..()) return 1 - var/is_antag = ((mind && mind.special_role) || isobserver(src)) //ghosts don't have minds + update_examine_panel(A) + +/mob/proc/update_examine_panel(var/atom/A) if(client) + var/is_antag = ((mind && mind.special_role) || isobserver(src)) //ghosts don't have minds client.update_description_holders(A, is_antag) diff --git a/code/modules/examine/stat_icons.dm b/code/modules/examine/stat_icons.dm index 77d97fe0a17..ba09157d1c4 100644 --- a/code/modules/examine/stat_icons.dm +++ b/code/modules/examine/stat_icons.dm @@ -6,5 +6,19 @@ var/global/list/description_icons = list( "energy_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="energy_protection"), "bomb_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="bomb_protection"), "radiation_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="radiation_protection"), - "biohazard_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="biohazard_protection") - ) \ No newline at end of file + "biohazard_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="biohazard_protection"), + + "welder" = image(icon='icons/obj/items.dmi',icon_state="welder"), + "wirecutters" = image(icon='icons/obj/items.dmi',icon_state="cutters"), + "screwdriver" = image(icon='icons/obj/items.dmi',icon_state="screwdriver"), + "wrench" = image(icon='icons/obj/items.dmi',icon_state="wrench"), + "crowbar" = image(icon='icons/obj/items.dmi',icon_state="crowbar"), + "multitool" = image(icon='icons/obj/device.dmi',icon_state="multitool"), + + "metal sheet" = image(icon='icons/obj/items.dmi',icon_state="sheet-metal"), + "plasteel sheet" = image(icon='icons/obj/items.dmi',icon_state="sheet-plasteel"), + + "air tank" = image(icon='icons/obj/tank.dmi',icon_state="oxygen"), + + "connector" = image(icon='icons/obj/pipes.dmi',icon_state="connector") + ) From 18012fa1d16d61af16c7968c5d0c935e022411ed Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 11 Jun 2017 04:47:52 -0400 Subject: [PATCH 5/7] Port's Bay's Shuttle Cleanup Shuttles now set themselves up upon being instantiated instead of relying on a monolithic proc in the shuttle controller. Shuttles can now be defined more cleanly on a per-map basis, as well. Accidentally fixes a broken admin shuttle. --- .../emergency_shuttle_controller.dm | 4 + code/controllers/shuttle_controller.dm | 317 +----------------- code/modules/shuttles/_defines.dm | 4 + code/modules/shuttles/escape_pods.dm | 20 +- code/modules/shuttles/shuttle.dm | 23 ++ code/modules/shuttles/shuttle_emergency.dm | 8 +- code/modules/shuttles/shuttle_ferry.dm | 12 +- code/modules/shuttles/shuttle_specops.dm | 6 +- code/modules/shuttles/shuttle_supply.dm | 21 +- code/modules/shuttles/shuttles_multi.dm | 8 +- maps/northern_star/northern_star.dm | 1 + maps/northern_star/northern_star_shuttles.dm | 272 +++++++++++++++ polaris.dme | 1 + 13 files changed, 365 insertions(+), 332 deletions(-) create mode 100644 code/modules/shuttles/_defines.dm create mode 100644 maps/northern_star/northern_star_shuttles.dm diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 5b1b6a60d15..7fb3a56c61f 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -22,6 +22,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle var/datum/announcement/priority/emergency_shuttle_called = new(0, new_sound = sound('sound/AI/shuttlecalled.ogg')) var/datum/announcement/priority/emergency_shuttle_recalled = new(0, new_sound = sound('sound/AI/shuttlerecalled.ogg')) +/datum/emergency_shuttle_controller/New() + escape_pods = list() + ..() + /datum/emergency_shuttle_controller/proc/process() if (wait_for_launch) if (evac && auto_recall && world.time >= auto_recall_time) diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index c95e4f242f7..d881a65a4a2 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -15,8 +15,13 @@ var/global/datum/shuttle_controller/shuttle_controller //This is called by gameticker after all the machines and radio frequencies have been properly initialized /datum/shuttle_controller/proc/setup_shuttle_docks() - for(var/shuttle_tag in shuttles) - var/datum/shuttle/shuttle = shuttles[shuttle_tag] +// for(var/shuttle_tag in shuttles) +// var/datum/shuttle/shuttle = shuttles[shuttle_tag] + for(var/shuttle_type in subtypesof(/datum/shuttle)) + var/datum/shuttle/shuttle = shuttle_type + if(initial(shuttle.category) == shuttle_type) + continue + shuttle = new shuttle() shuttle.init_docking_controllers() shuttle.dock() //makes all shuttles docked to something at round start go into the docked state @@ -28,311 +33,3 @@ var/global/datum/shuttle_controller/shuttle_controller shuttles = list() process_shuttles = list() - var/datum/shuttle/ferry/shuttle - - // Escape shuttle and pods - shuttle = new/datum/shuttle/ferry/emergency() - shuttle.location = 1 - shuttle.warmup_time = 10 - 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.docking_controller_tag = "escape_shuttle" - shuttle.dock_target_station = "escape_dock" - shuttle.dock_target_offsite = "centcom_dock" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN - //shuttle.docking_controller_tag = "supply_shuttle" - //shuttle.dock_target_station = "cargo_bay" - shuttles["Escape"] = shuttle - process_shuttles += shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod1/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod1/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod1/transit) - shuttle.docking_controller_tag = "escape_pod_1" - shuttle.dock_target_station = "escape_pod_1_berth" - shuttle.dock_target_offsite = "escape_pod_1_recovery" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 1"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod2/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod2/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod2/transit) - shuttle.docking_controller_tag = "escape_pod_2" - shuttle.dock_target_station = "escape_pod_2_berth" - shuttle.dock_target_offsite = "escape_pod_2_recovery" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 2"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod3/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod3/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod3/transit) - shuttle.docking_controller_tag = "escape_pod_3" - shuttle.dock_target_station = "escape_pod_3_berth" - shuttle.dock_target_offsite = "escape_pod_3_recovery" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 3"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod4/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod4/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod4/transit) - shuttle.docking_controller_tag = "escape_pod_4" - shuttle.dock_target_station = "escape_pod_4_berth" - shuttle.dock_target_offsite = "escape_pod_4_recovery" - shuttle.transit_direction = NORTH //should this be SOUTH? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 4"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod5/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod5/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod5/transit) - shuttle.docking_controller_tag = "escape_pod_5" - shuttle.dock_target_station = "escape_pod_5_berth" - shuttle.dock_target_offsite = "escape_pod_5_recovery" - shuttle.transit_direction = NORTH //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 5"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod6/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod6/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod6/transit) - shuttle.docking_controller_tag = "escape_pod_6" - shuttle.dock_target_station = "escape_pod_6_berth" - shuttle.dock_target_offsite = "escape_pod_6_recovery" - shuttle.transit_direction = NORTH //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 6"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/cryo/station) - shuttle.area_offsite = locate(/area/shuttle/cryo/centcom) - shuttle.area_transition = locate(/area/shuttle/cryo/transit) - shuttle.docking_controller_tag = "cryostorage_shuttle" - shuttle.dock_target_station = "cryostorage_shuttle_berth" - shuttle.dock_target_offsite = "cryostorage_shuttle_recovery" - shuttle.transit_direction = NORTH //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Cryostorage Shuttle"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/large_escape_pod1/station) - shuttle.area_offsite = locate(/area/shuttle/large_escape_pod1/centcom) - shuttle.area_transition = locate(/area/shuttle/large_escape_pod1/transit) - shuttle.docking_controller_tag = "large_escape_pod_1" - shuttle.dock_target_station = "large_escape_pod_1_berth" - shuttle.dock_target_offsite = "large_escape_pod_1_recovery" - shuttle.transit_direction = EAST //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Large Escape Pod 1"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/large_escape_pod2/station) - shuttle.area_offsite = locate(/area/shuttle/large_escape_pod2/centcom) - shuttle.area_transition = locate(/area/shuttle/large_escape_pod2/transit) - shuttle.docking_controller_tag = "large_escape_pod_2" - shuttle.dock_target_station = "large_escape_pod_2_berth" - shuttle.dock_target_offsite = "large_escape_pod_2_recovery" - shuttle.transit_direction = EAST //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Large Escape Pod 2"] = shuttle - - //give the emergency shuttle controller it's shuttles - emergency_shuttle.shuttle = shuttles["Escape"] - emergency_shuttle.escape_pods = list( - shuttles["Escape Pod 1"], - shuttles["Escape Pod 2"], - shuttles["Escape Pod 3"], - shuttles["Escape Pod 4"], - shuttles["Escape Pod 5"], - shuttles["Escape Pod 6"], - shuttles["Cryostorage Shuttle"], - shuttles["Large Escape Pod 1"], - shuttles["Large Escape Pod 2"], - ) - - // Supply shuttle - shuttle = new/datum/shuttle/ferry/supply() - shuttle.location = 1 - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/supply/dock) - shuttle.area_station = locate(/area/supply/station) - shuttle.docking_controller_tag = "supply_shuttle" - shuttle.dock_target_station = "cargo_bay" - shuttles["Supply"] = shuttle - process_shuttles += shuttle - - supply_controller.shuttle = shuttle - - // Admin shuttles. - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/transport1/centcom) - shuttle.area_station = locate(/area/shuttle/transport1/station) - shuttle.docking_controller_tag = "centcom_shuttle" - shuttle.dock_target_station = "centcom_shuttle_dock_airlock" - shuttle.dock_target_offsite = "centcom_shuttle_bay" - shuttles["CentCom"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 //want some warmup time so people can cancel. - shuttle.area_offsite = locate(/area/shuttle/administration/centcom) - shuttle.area_station = locate(/area/shuttle/administration/station) - shuttle.docking_controller_tag = "admin_shuttle" - shuttle.dock_target_station = "admin_shuttle_dock_airlock" - shuttle.dock_target_offsite = "admin_shuttle_bay" - shuttles["Administration"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 //want some warmup time so people can cancel. - shuttle.area_offsite = locate(/area/shuttle/trade/centcom) - shuttle.area_station = locate(/area/shuttle/trade/station) - shuttle.docking_controller_tag = "trade_shuttle" - shuttle.dock_target_station = "trade_shuttle_dock_airlock" - shuttle.dock_target_offsite = "trade_shuttle_bay" - shuttles["Trade"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.area_offsite = locate(/area/shuttle/alien/base) - shuttle.area_station = locate(/area/shuttle/alien/mine) - shuttles["Alien"] = shuttle - //process_shuttles += shuttle //don't need to process this. It can only be moved using admin magic anyways. - - // Public shuttles - shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/constructionsite/site) - shuttle.area_station = locate(/area/shuttle/constructionsite/station) - shuttle.docking_controller_tag = "engineering_shuttle" - shuttle.dock_target_station = "engineering_dock_airlock" - shuttle.dock_target_offsite = "edock_airlock" - shuttles["Engineering"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/mining/outpost) - shuttle.area_station = locate(/area/shuttle/mining/station) - shuttle.docking_controller_tag = "mining_shuttle" - shuttle.dock_target_station = "mining_dock_airlock" - shuttle.dock_target_offsite = "mining_outpost_airlock" - shuttles["Mining"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/research/outpost) - shuttle.area_station = locate(/area/shuttle/research/station) - shuttle.docking_controller_tag = "research_shuttle" - shuttle.dock_target_station = "research_dock_airlock" - shuttle.dock_target_offsite = "research_outpost_dock" - shuttles["Research"] = shuttle - process_shuttles += shuttle - - // ERT Shuttle - var/datum/shuttle/ferry/multidock/specops/ERT = new() - ERT.location = 0 - ERT.warmup_time = 10 - ERT.area_offsite = locate(/area/shuttle/specops/station) //centcom is the home station, the player station is offsite - ERT.area_station = locate(/area/shuttle/specops/centcom) - ERT.docking_controller_tag = "specops_shuttle_port" - ERT.docking_controller_tag_station = "specops_shuttle_port" - ERT.docking_controller_tag_offsite = "specops_shuttle_fore" - ERT.dock_target_station = "specops_centcom_dock" - ERT.dock_target_offsite = "specops_dock_airlock" - shuttles["Special Operations"] = ERT - process_shuttles += ERT - - //Skipjack. - var/datum/shuttle/multi_shuttle/VS = new/datum/shuttle/multi_shuttle() - VS.origin = locate(/area/skipjack_station/start) - - VS.destinations = list( - "Fore Starboard Solars" = locate(/area/skipjack_station/northeast_solars), - "Fore Port Solars" = locate(/area/skipjack_station/northwest_solars), - "Aft Starboard Solars" = locate(/area/skipjack_station/southeast_solars), - "Aft Port Solars" = locate(/area/skipjack_station/southwest_solars), - "Mining Station" = locate(/area/skipjack_station/mining) - ) - - VS.announcer = "Colony Automated Radar Array" - VS.arrival_message = "Attention. Unidentified object approaching the colony." - VS.departure_message = "Attention. Unidentified object exiting local space. Unidentified object expected to escape Kara gravity well with current velocity." - VS.interim = locate(/area/skipjack_station/transit) - - VS.warmup_time = 0 - shuttles["Skipjack"] = VS - - //Nuke Ops shuttle. - var/datum/shuttle/multi_shuttle/MS = new/datum/shuttle/multi_shuttle() - MS.origin = locate(/area/syndicate_station/start) - MS.start_location = "Mercenary Base" - - MS.destinations = list( - "Northwest of the station" = locate(/area/syndicate_station/northwest), - "North of the station" = locate(/area/syndicate_station/north), - "Northeast of the station" = locate(/area/syndicate_station/northeast), - "Southwest of the station" = locate(/area/syndicate_station/southwest), - "South of the station" = locate(/area/syndicate_station/south), - "Southeast of the station" = locate(/area/syndicate_station/southeast), - "Telecomms Satellite" = locate(/area/syndicate_station/commssat), - "Mining Station" = locate(/area/syndicate_station/mining), - "Arrivals dock" = locate(/area/syndicate_station/arrivals_dock), - ) - - MS.docking_controller_tag = "merc_shuttle" - MS.destination_dock_targets = list( - "Mercenary Base" = "merc_base", - "Arrivals dock" = "nuke_shuttle_dock_airlock", - ) - - MS.announcer = "Automated Traffic Control" - MS.arrival_message = "Attention. A vessel is approaching the colony." - MS.departure_message = "Attention. A vessel is now leaving from the colony." - MS.interim = locate(/area/syndicate_station/transit) - - MS.warmup_time = 0 - shuttles["Mercenary"] = MS - diff --git a/code/modules/shuttles/_defines.dm b/code/modules/shuttles/_defines.dm new file mode 100644 index 00000000000..ad8c39466b4 --- /dev/null +++ b/code/modules/shuttles/_defines.dm @@ -0,0 +1,4 @@ +#define SHUTTLE_FLAGS_NONE 0 +#define SHUTTLE_FLAGS_PROCESS 1 +#define SHUTTLE_FLAGS_SUPPLY 2 +#define SHUTTLE_FLAGS_ALL (~SHUTTLE_FLAGS_NONE) \ No newline at end of file diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index fd6aabc4a23..b832e94dbd5 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -1,16 +1,24 @@ /datum/shuttle/ferry/escape_pod var/datum/computer/file/embedded_program/docking/simple/escape_pod/arming_controller + category = /datum/shuttle/ferry/escape_pod + +/datum/shuttle/ferry/escape_pod/New() + move_time = move_time + rand(-30, 60) + if(name in emergency_shuttle.escape_pods) + CRASH("An escape pod with the name '[name]' has already been defined.") + emergency_shuttle.escape_pods[name] = src + ..() /datum/shuttle/ferry/escape_pod/init_docking_controllers() ..() arming_controller = locate(dock_target_station) if(!istype(arming_controller)) - world << "warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!" - + warning("warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!") + if(docking_controller) var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/controller_master = docking_controller.master if(!istype(controller_master)) - world << "warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!" + warning("warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!") else controller_master.pod = src @@ -29,7 +37,7 @@ /datum/shuttle/ferry/escape_pod/can_cancel() return 0 - + //This controller goes on the escape pod itself /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod name = "escape pod controller" @@ -58,7 +66,7 @@ /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/Topic(href, href_list) if(..()) return 1 - + if("manual_arm") pod.arming_controller.arm() if("force_launch") @@ -87,7 +95,7 @@ if (istype(docking_program, /datum/computer/file/embedded_program/docking/simple/escape_pod)) var/datum/computer/file/embedded_program/docking/simple/escape_pod/P = docking_program armed = P.armed - + data = list( "docking_status" = docking_program.get_docking_status(), "override_enabled" = docking_program.override_enabled, diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 8c6e6118863..f7f655ba4d8 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -4,6 +4,7 @@ //shuttle moving state defines are in setup.dm /datum/shuttle + var/name = "" var/warmup_time = 0 var/moving_status = SHUTTLE_IDLE @@ -12,6 +13,28 @@ var/arrive_time = 0 //the time at which the shuttle arrives when long jumping + var/flags = SHUTTLE_FLAGS_PROCESS + var/category = /datum/shuttle + +/datum/shuttle/New() + ..() + if(src.name in shuttle_controller.shuttles) + CRASH("A shuttle with the name '[name]' is already defined.") + shuttle_controller.shuttles[src.name] = src + if(flags & SHUTTLE_FLAGS_PROCESS) + shuttle_controller.process_shuttles += src + if(flags & SHUTTLE_FLAGS_SUPPLY) + if(supply_controller.shuttle) + CRASH("A supply shuttle is already defined.") + supply_controller.shuttle = src + +/datum/shuttle/Destroy() + shuttle_controller.shuttles -= src.name + shuttle_controller.process_shuttles -= src + if(supply_controller.shuttle == src) + supply_controller.shuttle = null + . = ..() + /datum/shuttle/proc/init_docking_controllers() if(docking_controller_tag) docking_controller = locate(docking_controller_tag) diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index beea1781b43..347243ae5cf 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -1,5 +1,11 @@ /datum/shuttle/ferry/emergency - //pass + category = /datum/shuttle/ferry/emergency + +/datum/shuttle/ferry/emergency/New() + if(emergency_shuttle.shuttle) + CRASH("An emergency shuttle has already been defined.") + emergency_shuttle.shuttle = src + ..() /datum/shuttle/ferry/emergency/arrived() if (istype(in_use, /obj/machinery/computer/shuttle_control/emergency)) diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm index 0a288a1ba9a..d0763577357 100644 --- a/code/modules/shuttles/shuttle_ferry.dm +++ b/code/modules/shuttles/shuttle_ferry.dm @@ -11,13 +11,21 @@ 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 + var/area/area_station + var/area/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 var/last_dock_attempt_time = 0 + category = /datum/shuttle/ferry + +/datum/shuttle/ferry/New() + area_offsite = locate(area_offsite) + area_station = locate(area_station) + if(area_transition) + area_transition = locate(area_transition) + ..() /datum/shuttle/ferry/short_jump(var/area/origin,var/area/destination) if(isnull(location)) diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm index 434bb37f42b..d9cc121f790 100644 --- a/code/modules/shuttles/shuttle_specops.dm +++ b/code/modules/shuttles/shuttle_specops.dm @@ -13,16 +13,17 @@ var/docking_controller_tag_offsite var/datum/computer/file/embedded_program/docking/docking_controller_station var/datum/computer/file/embedded_program/docking/docking_controller_offsite + category = /datum/shuttle/ferry/multidock /datum/shuttle/ferry/multidock/init_docking_controllers() if(docking_controller_tag_station) docking_controller_station = locate(docking_controller_tag_station) if(!istype(docking_controller_station)) - world << "warning: shuttle with docking tag [docking_controller_station] could not find it's controller!" + warning("warning: shuttle with docking tag [docking_controller_station] could not find it's controller!") if(docking_controller_tag_offsite) docking_controller_offsite = locate(docking_controller_tag_offsite) if(!istype(docking_controller_offsite)) - world << "warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!" + warning("warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!") if (!location) docking_controller = docking_controller_station else @@ -43,6 +44,7 @@ var/reset_time = 0 //the world.time at which the shuttle will be ready to move again. var/launch_prep = 0 var/cancel_countdown = 0 + category = /datum/shuttle/ferry/multidock/specops /datum/shuttle/ferry/multidock/specops/New() ..() diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm index c4122434e76..9a6b7f33801 100644 --- a/code/modules/shuttles/shuttle_supply.dm +++ b/code/modules/shuttles/shuttle_supply.dm @@ -2,11 +2,12 @@ var/away_location = 1 //the location to hide at while pretending to be in-transit var/late_chance = 80 var/max_late_time = 300 + category = /datum/shuttle/ferry/supply /datum/shuttle/ferry/supply/short_jump(var/area/origin,var/area/destination) if(moving_status != SHUTTLE_IDLE) return - + if(isnull(location)) return @@ -18,21 +19,21 @@ //it would be cool to play a sound here moving_status = SHUTTLE_WARMUP spawn(warmup_time*10) - if (moving_status == SHUTTLE_IDLE) + if (moving_status == SHUTTLE_IDLE) return //someone cancelled the launch - + if (at_station() && forbidden_atoms_check()) //cancel the launch because of forbidden atoms. announce over supply channel? moving_status = SHUTTLE_IDLE return - + if (!at_station()) //at centcom supply_controller.buy() - + //We pretend it's a long_jump by making the shuttle stay at centcom for the "in-transit" period. var/area/away_area = get_location_area(away_location) moving_status = SHUTTLE_INTRANSIT - + //If we are at the away_area then we are just pretending to move, otherwise actually do the move if (origin != away_area) move(origin, away_area) @@ -46,11 +47,11 @@ //late if (prob(late_chance)) sleep(rand(0,max_late_time)) - + move(away_area, destination) - + moving_status = SHUTTLE_IDLE - + if (!at_station()) //at centcom supply_controller.sell() @@ -58,7 +59,7 @@ /datum/shuttle/ferry/supply/proc/forbidden_atoms_check() if (!at_station()) return 0 //if badmins want to send mobs or a nuke on the supply shuttle from centcom we don't care - + return supply_controller.forbidden_atoms_check(get_location_area()) /datum/shuttle/ferry/supply/proc/at_station() diff --git a/code/modules/shuttles/shuttles_multi.dm b/code/modules/shuttles/shuttles_multi.dm index 47b430329a7..9dc7e4312eb 100644 --- a/code/modules/shuttles/shuttles_multi.dm +++ b/code/modules/shuttles/shuttles_multi.dm @@ -1,6 +1,7 @@ //This is a holder for things like the Skipjack and Nuke shuttle. /datum/shuttle/multi_shuttle + flags = SHUTTLE_FLAGS_NONE var/cloaked = 1 var/at_origin = 1 var/returned_home = 0 @@ -22,8 +23,13 @@ var/list/destination_dock_targets = list() var/area/origin var/return_warning = 0 + category = /datum/shuttle/multi_shuttle /datum/shuttle/multi_shuttle/New() + origin = locate(origin) + interim = locate(interim) + for(var/destination in destinations) + destinations[destination] = locate(destinations[destination]) ..() /datum/shuttle/multi_shuttle/init_docking_controllers() @@ -36,7 +42,7 @@ var/datum/computer/file/embedded_program/docking/C = locate(controller_tag) if(!istype(C)) - world << "warning: shuttle with docking tag [controller_tag] could not find it's controller!" + warning("warning: shuttle with docking tag [controller_tag] could not find it's controller!") else destination_dock_controllers[destination] = C diff --git a/maps/northern_star/northern_star.dm b/maps/northern_star/northern_star.dm index 2212774657f..fe95bbaeb64 100644 --- a/maps/northern_star/northern_star.dm +++ b/maps/northern_star/northern_star.dm @@ -7,6 +7,7 @@ #include "polaris-5.dmm" #include "northern_star_defines.dm" + #include "northern_star_shuttles.dm" #define USING_MAP_DATUM /datum/map/northern_star diff --git a/maps/northern_star/northern_star_shuttles.dm b/maps/northern_star/northern_star_shuttles.dm new file mode 100644 index 00000000000..44a5e1a5bd3 --- /dev/null +++ b/maps/northern_star/northern_star_shuttles.dm @@ -0,0 +1,272 @@ +// Escape shuttle and pods +/datum/shuttle/ferry/emergency/centcom + name = "Escape" + location = 1 + warmup_time = 10 + area_offsite = /area/shuttle/escape/centcom + area_station = /area/shuttle/escape/station + area_transition = /area/shuttle/escape/transit + docking_controller_tag = "escape_shuttle" + dock_target_station = "escape_dock" + dock_target_offsite = "centcom_dock" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_one + name = "Escape Pod 1" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod1/station + area_offsite = /area/shuttle/escape_pod1/centcom + area_transition = /area/shuttle/escape_pod1/transit + docking_controller_tag = "escape_pod_1" + dock_target_station = "escape_pod_1_berth" + dock_target_offsite = "escape_pod_1_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_two + name = "Escape Pod 2" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod2/station + area_offsite = /area/shuttle/escape_pod2/centcom + area_transition = /area/shuttle/escape_pod2/transit + docking_controller_tag = "escape_pod_2" + dock_target_station = "escape_pod_2_berth" + dock_target_offsite = "escape_pod_2_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_three + name = "Escape Pod 3" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod3/station + area_offsite = /area/shuttle/escape_pod3/centcom + area_transition = /area/shuttle/escape_pod3/transit + docking_controller_tag = "escape_pod_3" + dock_target_station = "escape_pod_3_berth" + dock_target_offsite = "escape_pod_3_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_four + name = "Escape Pod 4" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod4/station + area_offsite = /area/shuttle/escape_pod4/centcom + area_transition = /area/shuttle/escape_pod4/transit + docking_controller_tag = "escape_pod_4" + dock_target_station = "escape_pod_4_berth" + dock_target_offsite = "escape_pod_4_recovery" + transit_direction = NORTH //should this be SOUTH? I have no idea. + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_five + name = "Escape Pod 5" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod5/station + area_offsite = /area/shuttle/escape_pod5/centcom + area_transition = /area/shuttle/escape_pod5/transit + docking_controller_tag = "escape_pod_5" + dock_target_station = "escape_pod_5_berth" + dock_target_offsite = "escape_pod_5_recovery" + transit_direction = NORTH //should this be WEST? I have no idea. + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_six + name = "Escape Pod 6" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod6/station + area_offsite = /area/shuttle/escape_pod6/centcom + area_transition = /area/shuttle/escape_pod6/transit + docking_controller_tag = "escape_pod_6" + dock_target_station = "escape_pod_6_berth" + dock_target_offsite = "escape_pod_6_recovery" + transit_direction = NORTH //should this be WEST? I have no idea. + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_cryo + name = "Cryostorage Shuttle" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/cryo/station + area_offsite = /area/shuttle/cryo/centcom + area_transition = /area/shuttle/cryo/transit + docking_controller_tag = "cryostorage_shuttle" + dock_target_station = "cryostorage_shuttle_berth" + dock_target_offsite = "cryostorage_shuttle_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/large_escape_pod1 + name = "Large Escape Pod 1" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/large_escape_pod1/station + area_offsite = /area/shuttle/large_escape_pod1/centcom + area_transition = /area/shuttle/large_escape_pod1/transit + docking_controller_tag = "large_escape_pod_1" + dock_target_station = "large_escape_pod_1_berth" + dock_target_offsite = "large_escape_pod_1_recovery" + transit_direction = EAST + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/large_escape_pod2 + name = "Large Escape Pod 2" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/large_escape_pod2/station + area_offsite = /area/shuttle/large_escape_pod2/centcom + area_transition = /area/shuttle/large_escape_pod2/transit + docking_controller_tag = "large_escape_pod_2" + dock_target_station = "large_escape_pod_2_berth" + dock_target_offsite = "large_escape_pod_2_recovery" + transit_direction = EAST + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +// Cargo shuttle. +/datum/shuttle/ferry/supply/cargo + name = "Supply" + location = 1 + warmup_time = 10 + area_offsite = /area/supply/dock + area_station = /area/supply/station + docking_controller_tag = "supply_shuttle" + dock_target_station = "cargo_bay" + flags = SHUTTLE_FLAGS_PROCESS|SHUTTLE_FLAGS_SUPPLY + +// The "Elevators" +/datum/shuttle/ferry/engineering + name = "Engineering" + warmup_time = 10 + area_offsite = /area/shuttle/constructionsite/site + area_station = /area/shuttle/constructionsite/station + docking_controller_tag = "engineering_shuttle" + dock_target_station = "engineering_dock_airlock" + dock_target_offsite = "edock_airlock" + +/datum/shuttle/ferry/mining + name = "Mining" + warmup_time = 10 + area_offsite = /area/shuttle/mining/outpost + area_station = /area/shuttle/mining/station + docking_controller_tag = "mining_shuttle" + dock_target_station = "mining_dock_airlock" + dock_target_offsite = "mining_outpost_airlock" + +/datum/shuttle/ferry/research + name = "Research" + warmup_time = 10 + area_offsite = /area/shuttle/research/outpost + area_station = /area/shuttle/research/station + docking_controller_tag = "research_shuttle" + dock_target_station = "research_dock_airlock" + dock_target_offsite = "research_outpost_dock" + +// Admin shuttles. +/datum/shuttle/ferry/centcom + name = "Centcom" + location = 1 + warmup_time = 10 + area_offsite = /area/shuttle/transport1/centcom + area_station = /area/shuttle/transport1/station + docking_controller_tag = "centcom_shuttle" + dock_target_station = "centcom_shuttle_dock_airlock" + dock_target_offsite = "centcom_shuttle_bay" + +/datum/shuttle/ferry/administration + name = "Administration" + location = 1 + warmup_time = 10 //want some warmup time so people can cancel. + area_offsite = /area/shuttle/administration/centcom + area_station = /area/shuttle/administration/station + docking_controller_tag = "admin_shuttle" + dock_target_station = "admin_shuttle_dock_airlock" + dock_target_offsite = "admin_shuttle_bay" + +// Traders +/datum/shuttle/ferry/trade + name = "Trade" + location = 1 + warmup_time = 10 //want some warmup time so people can cancel. + area_offsite = /area/shuttle/trade/centcom + area_station = /area/shuttle/trade/station + docking_controller_tag = "trade_shuttle" + dock_target_station = "trade_shuttle_dock_airlock" + dock_target_offsite = "trade_shuttle_bay" + +// Is this even used? +/datum/shuttle/ferry/alien + name = "Alien" + area_offsite = /area/shuttle/alien/base + area_station = /area/shuttle/alien/mine + flags = SHUTTLE_FLAGS_NONE + +// Mercenary +/datum/shuttle/multi_shuttle/mercenary + name = "Mercenary" + warmup_time = 0 + origin = /area/syndicate_station/start + interim = /area/syndicate_station/transit + start_location = "Mercenary Base" + destinations = list( + "Northwest of the station" = /area/syndicate_station/northwest, + "North of the station" = /area/syndicate_station/north, + "Northeast of the station" = /area/syndicate_station/northeast, + "Southwest of the station" = /area/syndicate_station/southwest, + "South of the station" = /area/syndicate_station/south, + "Southeast of the station" = /area/syndicate_station/southeast, + "Telecomms Satellite" = /area/syndicate_station/commssat, + "Mining Station" = /area/syndicate_station/mining, + "Arrivals dock" = /area/syndicate_station/arrivals_dock, + ) + docking_controller_tag = "merc_shuttle" + destination_dock_targets = list( + "Mercenary Base" = "merc_base", + "Arrivals dock" = "nuke_shuttle_dock_airlock", + ) + announcer = "Automated Traffic Control" + +/datum/shuttle/multi_shuttle/mercenary/New() + arrival_message = "Attention. A vessel is approaching the colony." + departure_message = "Attention. A vessel is now leaving from the colony." + ..() + +// Heist +/datum/shuttle/multi_shuttle/skipjack + name = "Skipjack" + warmup_time = 0 + origin = /area/skipjack_station/start + interim = /area/skipjack_station/transit + destinations = list( + "Fore Starboard Solars" = /area/skipjack_station/northeast_solars, + "Fore Port Solars" = /area/skipjack_station/northwest_solars, + "Aft Starboard Solars" = /area/skipjack_station/southeast_solars, + "Aft Port Solars" = /area/skipjack_station/southwest_solars, + "Mining Station" = /area/skipjack_station/mining + ) + announcer = "Automated Traffic Control" + +/datum/shuttle/multi_shuttle/skipjack/New() + arrival_message = "Attention. Unidentified object approaching the colony." + departure_message = "Attention. Unidentified object exiting local space. Unidentified object expected to escape Kara gravity well with current velocity." + ..() + +/datum/shuttle/ferry/multidock/specops/ert + name = "Special Operations" + location = 0 + warmup_time = 10 + area_offsite = /area/shuttle/specops/station //centcom is the home station, the Exodus is offsite + area_station = /area/shuttle/specops/centcom + docking_controller_tag = "specops_shuttle_port" + docking_controller_tag_station = "specops_shuttle_port" + docking_controller_tag_offsite = "specops_shuttle_fore" + dock_target_station = "specops_centcom_dock" + dock_target_offsite = "specops_dock_airlock" + + diff --git a/polaris.dme b/polaris.dme index 3b49b9566ba..c9e19358505 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2039,6 +2039,7 @@ #include "code\modules\shieldgen\shield_diffuser.dm" #include "code\modules\shieldgen\shield_gen.dm" #include "code\modules\shieldgen\shield_gen_external.dm" +#include "code\modules\shuttles\_defines.dm" #include "code\modules\shuttles\antagonist.dm" #include "code\modules\shuttles\departmental.dm" #include "code\modules\shuttles\escape_pods.dm" From c4c5dc098aa4cf6737352d2489e5a16c78513e22 Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 8 Jun 2017 17:51:15 -0400 Subject: [PATCH 6/7] Fix runtimes in radiation controller * Fixes Baystation12/Baystation12/issues/17443 - Runtime in radiation.dm,30: illegal: sqrt(-2.857143) * Updating radiation power to below zero should simply delete the source. * Fixes at least one cause of Runtime in radiation.dm,41: Cannot read null.z in an effort to fix Baystation12/Baystation12/issues/17411 --- code/datums/repositories/radiation.dm | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm index 00c35324580..4e3259a6de8 100644 --- a/code/datums/repositories/radiation.dm +++ b/code/datums/repositories/radiation.dm @@ -23,11 +23,14 @@ var/global/repository/radiation/radiation_repository = new() . = ..() /datum/radiation_source/proc/update_rad_power(var/new_power = null) - if(new_power != null && new_power != rad_power) + if(new_power == null || new_power == rad_power) + return // No change + else if(new_power <= 0) + qdel(src) // Decayed to nothing + else rad_power = new_power - . = 1 - if(. && !flat) - range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist + if(!flat) + range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist // Ray trace from all active radiation sources to T and return the strongest effect. /repository/radiation/proc/get_rads_at_turf(var/turf/T) @@ -65,6 +68,8 @@ var/global/repository/radiation/radiation_repository = new() // Add a radiation source instance to the repository. It will override any existing source on the same turf. /repository/radiation/proc/add_source(var/datum/radiation_source/S) + if(!isturf(S.source_turf)) + return var/datum/radiation_source/existing = sources_assoc[S.source_turf] if(existing) qdel(existing) From aa8723b724bf2afaa6af2bb46aff115e4e3b6ef7 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 14 Jun 2017 19:34:01 -0400 Subject: [PATCH 7/7] Switch tether shuttles over to self-initializing shuttle paradigm * Deleted shuttle_controller_vr.dm as it is no longer needed. Using standard shuttle_controller.dm again - It has no map-specific info! * Converted the former contents of shuttle_controller_vr.dm into proper shuttle datums that self-initialize for each of our shuttles! * Converted the tether_backup shuttle crashing mechanic to support self-initialization also. --- code/controllers/shuttle_controller_vr.dm | 210 ---------------------- code/modules/shuttles/crashes.dm | 6 + maps/tether/tether.dm | 1 + maps/tether/tether_shuttle_defs.dm | 159 ++++++++++++++++ maps/tether/tether_shuttles.dm | 13 ++ vorestation.dme | 2 +- 6 files changed, 180 insertions(+), 211 deletions(-) delete mode 100644 code/controllers/shuttle_controller_vr.dm create mode 100644 maps/tether/tether_shuttle_defs.dm diff --git a/code/controllers/shuttle_controller_vr.dm b/code/controllers/shuttle_controller_vr.dm deleted file mode 100644 index e3cca605141..00000000000 --- a/code/controllers/shuttle_controller_vr.dm +++ /dev/null @@ -1,210 +0,0 @@ - -var/global/datum/shuttle_controller/shuttle_controller - - -/datum/shuttle_controller - var/list/shuttles //maps shuttle tags to shuttle datums, so that they can be looked up. - var/list/process_shuttles //simple list of shuttles, for processing - -/datum/shuttle_controller/proc/process() - //process ferry shuttles - for (var/datum/shuttle/ferry/shuttle in process_shuttles) - if (shuttle.process_state) - shuttle.process() - - -//This is called by gameticker after all the machines and radio frequencies have been properly initialized -/datum/shuttle_controller/proc/setup_shuttle_docks() - for(var/shuttle_tag in shuttles) - var/datum/shuttle/shuttle = shuttles[shuttle_tag] - shuttle.init_docking_controllers() - shuttle.dock() //makes all shuttles docked to something at round start go into the docked state - - for(var/obj/machinery/embedded_controller/C in machines) - if(istype(C.program, /datum/computer/file/embedded_program/docking)) - C.program.tag = null //clear the tags, 'cause we don't need 'em anymore - -/datum/shuttle_controller/New() - shuttles = list() - process_shuttles = list() - - var/datum/shuttle/ferry/shuttle - - ////////////////////////////////////////////////////////////// - // Escape shuttle and pods - shuttle = new/datum/shuttle/ferry/emergency() - shuttle.location = 1 // At offsite - shuttle.warmup_time = 10 - 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.docking_controller_tag = "escape_shuttle" - shuttle.dock_target_station = "escape_dock" - shuttle.dock_target_offsite = "centcom_dock" - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN - shuttles["Escape"] = shuttle - process_shuttles += shuttle - - ////////////////////////////////////////////////////////////// - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 // At station - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/large_escape_pod1/station) - shuttle.area_offsite = locate(/area/shuttle/large_escape_pod1/centcom) - shuttle.area_transition = locate(/area/shuttle/large_escape_pod1/transit) - shuttle.docking_controller_tag = "large_escape_pod_1" - shuttle.dock_target_station = "large_escape_pod_1_berth" - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Large Escape Pod 1"] = shuttle - - ////////////////////////////////////////////////////////////// - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 // At station - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/large_escape_pod2/station) - shuttle.area_offsite = locate(/area/shuttle/large_escape_pod2/centcom) - shuttle.area_transition = locate(/area/shuttle/large_escape_pod2/transit) - shuttle.docking_controller_tag = "large_escape_pod_2" - shuttle.dock_target_station = "large_escape_pod_2_berth" - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Large Escape Pod 2"] = shuttle - - //give the emergency shuttle controller it's shuttles - emergency_shuttle.shuttle = shuttles["Escape"] - emergency_shuttle.escape_pods = list( - shuttles["Large Escape Pod 1"], - shuttles["Large Escape Pod 2"], - ) - - ////////////////////////////////////////////////////////////// - // Supply shuttle - shuttle = new/datum/shuttle/ferry/supply() - shuttle.location = 1 - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/supply/dock) - shuttle.area_station = locate(/area/supply/station) - shuttle.docking_controller_tag = "supply_shuttle" - shuttle.dock_target_station = "cargo_bay" - shuttles["Supply"] = shuttle - process_shuttles += shuttle - - supply_controller.shuttle = shuttle - - ////////////////////////////////////////////////////////////// - // Trade Ship - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 //want some warmup time so people can cancel. - shuttle.area_offsite = locate(/area/shuttle/trade/centcom) - shuttle.area_station = locate(/area/shuttle/trade/station) - shuttle.docking_controller_tag = "trade_shuttle" - shuttle.dock_target_station = "trade_shuttle_dock_airlock" - shuttle.dock_target_offsite = "trade_shuttle_bay" - shuttles["Trade"] = shuttle - process_shuttles += shuttle - - ////////////////////////////////////////////////////////////// - // Away Mission Shuttle - var/datum/shuttle/multi_shuttle/AM = new/datum/shuttle/multi_shuttle() - AM.legit = 1 - AM.origin = locate(/area/shuttle/awaymission/home) - AM.start_location = "NSS Adephagia (AM)" - - AM.destinations = list( - "Old Engineering Base (AM)" = locate(/area/shuttle/awaymission/oldengbase) - ) - - AM.docking_controller_tag = "awaymission_shuttle" - AM.destination_dock_targets = list( - "NSS Adephagia (AM)" = "d1a2_dock_airlock" - ) - - var/area/awaym_dest = locate(/area/shuttle/awaymission/away) - if(awaym_dest.contents.len) //Otherwise this is an empty imaginary area - AM.destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest - - AM.announcer = "Automated Traffic Control" - //These seem backwards because they are written from the perspective of the merc and vox ships - AM.departure_message = "Attention. The away mission vessel is approaching the colony." - AM.arrival_message = "Attention. The away mission vessel is now leaving from the colony." - AM.interim = locate(/area/shuttle/awaymission/warp) - - AM.move_time = 60 - AM.warmup_time = 8 - shuttles["AwayMission"] = AM - - - // TODO - Not implemented yet on new map - /////////////////////////////////////////////// - //VOREStation Add - Belter Shuttle - // shuttle = new/datum/shuttle/ferry() - // shuttle.location = 0 - // shuttle.warmup_time = 6 - // shuttle.area_station = locate(/area/shuttle/belter/station) - // shuttle.area_offsite = locate(/area/shuttle/belter/belt/zone1) - // shuttle.area_transition = locate(/area/shuttle/belter/transit) - // shuttle.docking_controller_tag = "belter_docking" - // shuttle.dock_target_station = "belter_nodocking" //Fake tags to prevent the shuttle from opening doors. - // shuttle.dock_target_offsite = "belter_nodocking" - // shuttle.transit_direction = EAST - // shuttle.move_time = 60 + rand(10,40) - // process_shuttles += shuttle - // shuttles["Belter"] = shuttle - //VOREStation Add End - Belter Shuttle - - ////////////////////////////////////////////////////////////// - // Tether Shuttle - var/datum/shuttle/ferry/tether_backup/TB = new() - TB.location = 1 // At offsite - TB.warmup_time = 5 - TB.move_time = 45 - TB.area_offsite = locate(/area/shuttle/tether/surface) - TB.area_station = locate(/area/shuttle/tether/station) - TB.area_transition = locate(/area/shuttle/tether/transit) - TB.crash_areas = list(locate(/area/shuttle/tether/crash1), locate(/area/shuttle/tether/crash2)) - TB.docking_controller_tag = "tether_shuttle" - TB.dock_target_station = "tether_dock_airlock" - TB.dock_target_offsite = "tether_pad_airlock" - shuttles["Tether Backup"] = TB - process_shuttles += TB - - for(var/obj/structure/shuttle/engine/propulsion/E in TB.area_offsite) - TB.engines += E - for(var/obj/machinery/computer/shuttle_control/tether_backup/comp in TB.area_offsite) - TB.computer = comp - break - - - ////////////////////////////////////////////////////////////// - // Antag Space "Proto Shuttle" Shuttle - AM = new/datum/shuttle/multi_shuttle() - AM.docking_controller_tag = "antag_space_shuttle" - AM.start_location = "Home Base" - AM.origin = locate(/area/shuttle/antag_space/base) - AM.interim = locate(/area/shuttle/antag_space/transit) - AM.destinations = list( - "Nearby" = locate(/area/shuttle/antag_space/north), - "Docks" = locate(/area/shuttle/antag_space/docks) - ) - AM.destination_dock_targets = list("Home Base" = "antag_space_dock") - AM.move_time = 60 - AM.warmup_time = 8 - shuttles["Proto"] = AM - - ////////////////////////////////////////////////////////////// - // Antag Surface "Land Crawler" Shuttle - AM = new/datum/shuttle/multi_shuttle() - AM.docking_controller_tag = "antag_ground_shuttle" - AM.start_location = "Home Base" - AM.origin = locate(/area/shuttle/antag_ground/base) - AM.interim = locate(/area/shuttle/antag_ground/transit) - AM.destinations = list( - "Solar Array" = locate(/area/shuttle/antag_ground/solars), - "Mining Outpost" = locate(/area/shuttle/antag_ground/mining) - ) - AM.destination_dock_targets = list("Home Base" = "antag_ground_dock") - AM.move_time = 60 - AM.warmup_time = 8 - shuttles["Land Crawler"] = AM diff --git a/code/modules/shuttles/crashes.dm b/code/modules/shuttles/crashes.dm index 0e190c53990..eaf7e06019e 100644 --- a/code/modules/shuttles/crashes.dm +++ b/code/modules/shuttles/crashes.dm @@ -6,6 +6,12 @@ var/list/crash_areas = null var/crash_message = "Oops. The shuttle blew up." // Announcement made when shuttle crashes +/datum/shuttle/New() + if(crash_areas) + for(var/i in 1 to crash_areas.len) + crash_areas[i] = locate(crash_areas[i]) + ..() + // Return 0 to let the jump continue, 1 to abort the jump. // Default implementation checks if the shuttle should crash and if so crashes it. /datum/shuttle/proc/process_longjump(var/area/origin, var/area/intended_destination, var/direction) diff --git a/maps/tether/tether.dm b/maps/tether/tether.dm index 6de1a83e9b1..7db16e4a4d9 100644 --- a/maps/tether/tether.dm +++ b/maps/tether/tether.dm @@ -6,6 +6,7 @@ #include "tether_phoronlock.dm" #include "tether_areas.dm" #include "tether_areas2.dm" + #include "tether_shuttle_defs.dm" #include "tether_shuttles.dm" #include "tether_telecomms.dm" #include "tether_virgo3b.dm" diff --git a/maps/tether/tether_shuttle_defs.dm b/maps/tether/tether_shuttle_defs.dm new file mode 100644 index 00000000000..b16eb49b857 --- /dev/null +++ b/maps/tether/tether_shuttle_defs.dm @@ -0,0 +1,159 @@ +////////////////////////////////////////////////////////////// +// Escape shuttle and pods +/datum/shuttle/ferry/emergency/escape + name = "Escape" + location = 1 // At offsite + warmup_time = 10 + area_offsite = /area/shuttle/escape/centcom + area_station = /area/shuttle/escape/station + area_transition = /area/shuttle/escape/transit + docking_controller_tag = "escape_shuttle" + dock_target_station = "escape_dock" + dock_target_offsite = "centcom_dock" + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +////////////////////////////////////////////////////////////// +/datum/shuttle/ferry/escape_pod/large_escape_pod1 + name = "Large Escape Pod 1" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/large_escape_pod1/station + area_offsite = /area/shuttle/large_escape_pod1/centcom + area_transition = /area/shuttle/large_escape_pod1/transit + docking_controller_tag = "large_escape_pod_1" + dock_target_station = "large_escape_pod_1_berth" + dock_target_offsite = "large_escape_pod_1_recovery" + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +////////////////////////////////////////////////////////////// +/datum/shuttle/ferry/escape_pod/large_escape_pod2 + name = "Large Escape Pod 2" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/large_escape_pod2/station + area_offsite = /area/shuttle/large_escape_pod2/centcom + area_transition = /area/shuttle/large_escape_pod2/transit + docking_controller_tag = "large_escape_pod_2" + dock_target_station = "large_escape_pod_2_berth" + dock_target_offsite = "large_escape_pod_2_recovery" + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +////////////////////////////////////////////////////////////// +// Supply shuttle +/datum/shuttle/ferry/supply/cargo + name = "Supply" + location = 1 + warmup_time = 10 + area_offsite = /area/supply/dock + area_station = /area/supply/station + docking_controller_tag = "supply_shuttle" + dock_target_station = "cargo_bay" + flags = SHUTTLE_FLAGS_PROCESS|SHUTTLE_FLAGS_SUPPLY + +////////////////////////////////////////////////////////////// +// Trade Ship +/datum/shuttle/ferry/trade + name = "Trade" + location = 1 + warmup_time = 10 //want some warmup time so people can cancel. + area_offsite = /area/shuttle/trade/centcom + area_station = /area/shuttle/trade/station + docking_controller_tag = "trade_shuttle" + dock_target_station = "trade_shuttle_dock_airlock" + dock_target_offsite = "trade_shuttle_bay" + +////////////////////////////////////////////////////////////// +// Away Mission Shuttle +/datum/shuttle/multi_shuttle/awaymission + name = "AwayMission" + legit = TRUE + warmup_time = 8 + move_time = 60 + origin = /area/shuttle/awaymission/home + interim = /area/shuttle/awaymission/warp + start_location = "NSS Adephagia (AM)" + destinations = list( + "Old Engineering Base (AM)" = /area/shuttle/awaymission/oldengbase + ) + docking_controller_tag = "awaymission_shuttle" + destination_dock_targets = list( + "NSS Adephagia (AM)" = "d1a2_dock_airlock" + ) + announcer = "Automated Traffic Control" + //These seem backwards because they are written from the perspective of the merc and vox ships + departure_message = "Attention. The away mission vessel is approaching the colony." + arrival_message = "Attention. The away mission vessel is now leaving from the colony." + +/datum/shuttle/multi_shuttle/awaymission/New() + ..() + var/area/awaym_dest = locate(/area/shuttle/awaymission/away) + if(awaym_dest && awaym_dest.contents.len) // Otherwise this is an empty imaginary area + destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest + +////////////////////////////////////////////////////////////// +// Tether Shuttle +/datum/shuttle/ferry/tether_backup/goodluckmcgee + name = "Tether Backup" + location = 1 // At offsite + warmup_time = 5 + move_time = 45 + area_offsite = /area/shuttle/tether/surface + area_station = /area/shuttle/tether/station + area_transition = /area/shuttle/tether/transit + crash_areas = list(/area/shuttle/tether/crash1, /area/shuttle/tether/crash2) + docking_controller_tag = "tether_shuttle" + dock_target_station = "tether_dock_airlock" + dock_target_offsite = "tether_pad_airlock" + +////////////////////////////////////////////////////////////// +// Antag Space "Proto Shuttle" Shuttle +/datum/shuttle/multi_shuttle/protoshuttle + name = "Proto" + warmup_time = 8 + move_time = 60 + origin = /area/shuttle/antag_space/base + interim = /area/shuttle/antag_space/transit + start_location = "Home Base" + destinations = list( + "Nearby" = /area/shuttle/antag_space/north, + "Docks" = /area/shuttle/antag_space/docks + ) + docking_controller_tag = "antag_space_shuttle" + destination_dock_targets = list("Home Base" = "antag_space_dock") + +////////////////////////////////////////////////////////////// +// Antag Surface "Land Crawler" Shuttle +/datum/shuttle/multi_shuttle/landcrawler + name = "Land Crawler" + warmup_time = 8 + move_time = 60 + origin = /area/shuttle/antag_ground/base + interim = /area/shuttle/antag_ground/transit + start_location = "Home Base" + destinations = list( + "Solar Array" = /area/shuttle/antag_ground/solars, + "Mining Outpost" = /area/shuttle/antag_ground/mining + ) + docking_controller_tag = "antag_ground_shuttle" + destination_dock_targets = list("Home Base" = "antag_ground_dock") + +////////////////////////////////////////////////////////////// +// RogueMiner "Belter: Shuttle +// TODO - Not implemented yet on new map +/* +/datum/shuttle/ferry/belter + name = "Belter" + location = 0 + warmup_time = 6 + move_time = 60 + area_station = /area/shuttle/belter/station + area_offsite = /area/shuttle/belter/belt/zone1 + area_transition = /area/shuttle/belter/transit + docking_controller_tag = "belter_docking" + dock_target_station = "belter_nodocking" //Fake tags to prevent the shuttle from opening doors. + dock_target_offsite = "belter_nodocking" + +/datum/shuttle/ferry/belter/New() + move_time = move_time + rand(10, 40) + ..() +*/ diff --git a/maps/tether/tether_shuttles.dm b/maps/tether/tether_shuttles.dm index 0328233a982..8bd433ab163 100644 --- a/maps/tether/tether_shuttles.dm +++ b/maps/tether/tether_shuttles.dm @@ -1,3 +1,7 @@ +//////////////////////////////////////// +// Tether custom shuttle implemnetations +//////////////////////////////////////// + /obj/machinery/computer/shuttle_control/tether_backup name = "tether backup shuttle control console" shuttle_tag = "Tether Backup" @@ -56,9 +60,18 @@ // /datum/shuttle/ferry/tether_backup crash_message = "Tether shuttle distress signal received. Shuttle location is approximately 200 meters from tether base." + category = /datum/shuttle/ferry/tether_backup // So shuttle_controller.dm doesn't try and instantiate this type as an acutal mapped in shuttle. var/list/engines = list() var/obj/machinery/computer/shuttle_control/tether_backup/computer +/datum/shuttle/ferry/tether_backup/New() + ..() + var/area/current_area = get_location_area(location) + for(var/obj/structure/shuttle/engine/propulsion/E in current_area) + engines += E + for(var/obj/machinery/computer/shuttle_control/tether_backup/comp in current_area) + computer = comp + /datum/shuttle/ferry/tether_backup/process_longjump(var/area/origin, var/area/intended_destination) var/failures = engines.len for(var/engine in engines) diff --git a/vorestation.dme b/vorestation.dme index 78dac03d8be..3b28d436bc3 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -159,7 +159,7 @@ #include "code\controllers\hooks.dm" #include "code\controllers\master.dm" #include "code\controllers\master_controller.dm" -#include "code\controllers\shuttle_controller_vr.dm" +#include "code\controllers\shuttle_controller.dm" #include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" #include "code\controllers\voting.dm"