diff --git a/baystation12.dme b/baystation12.dme
index d07a049e0f6eb..817d5507d961b 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -2646,7 +2646,6 @@
#include "code\modules\overmap\overmap_shuttle.dm"
#include "code\modules\overmap\sectors.dm"
#include "code\modules\overmap\spacetravel.dm"
-#include "code\modules\overmap\trading_locations.dm"
#include "code\modules\overmap\contacts\_contacts.dm"
#include "code\modules\overmap\contacts\contact_sensors.dm"
#include "code\modules\overmap\contacts\tracker.dm"
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index b8b2865cef793..6fe6f1edbe092 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -235,11 +235,10 @@
to_chat(usr, SPAN_WARNING("The round is either not ready, or has already finished..."))
return 0
// [FD-EDIT]
- if(!check_rights(R_ADMIN))
- if(!usr.client.enter_lock_bypass)
- if(!config.enter_allowed)
- to_chat(usr, SPAN_NOTICE("There is an administrative lock on entering the game!"))
- return 0
+ if(!config.enter_allowed)
+ if(!check_rights(, show_msg = FALSE) && !usr.client.enter_lock_bypass)
+ to_chat(usr, SPAN_NOTICE("There is an administrative lock on entering the game!"))
+ return 0
/*
if(!config.enter_allowed)
to_chat(usr, SPAN_NOTICE("There is an administrative lock on entering the game!"))
diff --git a/code/modules/overmap/trading_locations.dm b/code/modules/overmap/trading_locations.dm
deleted file mode 100644
index 86dcc6f8449c4..0000000000000
--- a/code/modules/overmap/trading_locations.dm
+++ /dev/null
@@ -1,20 +0,0 @@
-/obj/overmap/trading
- name = "station"
- desc = "A trading station."
- icon_state = "sector"
- scannable = TRUE
- requires_contact = FALSE // Whether or not the effect must be identified by ship sensors before being seen.
- instant_contact = TRUE // Do we instantly identify ourselves to any ship in sensors range?
- plane = 4
-
- var/datum/trader/trader_merchant_datum
-
-/obj/overmap/trading/on_update_icon()
- return
-
-/obj/overmap/trading/ship
- name = "ship"
- desc = "A trading ship."
- icon_state = "ship"
- requires_contact = FALSE // Whether or not the effect must be identified by ship sensors before being seen.
- instant_contact = TRUE // Do we instantly identify ourselves to any ship in sensors range?
diff --git a/maps/torch_fd/fd_torch.dm b/maps/torch_fd/fd_torch.dm
index 3bec82acae481..7189a3ce15099 100644
--- a/maps/torch_fd/fd_torch.dm
+++ b/maps/torch_fd/fd_torch.dm
@@ -27,7 +27,7 @@
#include "torch_ranks.dm"
#include "../torch/torch_security_state.dm"
#include "../torch/torch_setup.dm"
- #include "../torch/torch_shuttles.dm"
+ #include "torch_shuttles.dm"
#include "../torch/torch_submaps.dm"
#include "../torch/torch_turfs.dm"
#include "../torch/torch_unit_testing.dm"
diff --git a/maps/torch_fd/job/addition/research_jobs.dm b/maps/torch_fd/job/addition/research_jobs.dm
index 05a3e7c3676b8..283586154c6ca 100644
--- a/maps/torch_fd/job/addition/research_jobs.dm
+++ b/maps/torch_fd/job/addition/research_jobs.dm
@@ -1,5 +1,5 @@
/// Access
-var/const/access_research_security = "ACCESS_RESEARCH_SECURITY" //97
+var/global/const/access_research_security = "ACCESS_RESEARCH_SECURITY" //97
/datum/access/rnd_guard
id = access_research_security
desc = "Research Checkpoint"
diff --git a/maps/torch_fd/torch2_deck4.dmm b/maps/torch_fd/torch2_deck4.dmm
index ab9248c1fb139..1168151fa5e65 100644
--- a/maps/torch_fd/torch2_deck4.dmm
+++ b/maps/torch_fd/torch2_deck4.dmm
@@ -120,7 +120,7 @@
"ct" = (/obj/floor_decal/industrial/warning{dir = 1; icon_state = "warning"},/obj/machinery/door/blast/regular/escape_pod,/turf/simulated/floor/reinforced,/area/maintenance/fourthdeck/aft)
"cu" = (/turf/simulated/wall/r_wall/prepainted,/area/maintenance/fourthdeck/aft)
"cv" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/fourthdeck/aft)
-"cw" = (/obj/shuttle_landmark/merchant/out,/turf/space,/area/space)
+"cw" = (/turf/space,/area/space)
"cx" = (/obj/structure/railing/mapped,/turf/simulated/floor/reinforced{map_airless = 1; name = "vacuum reinforced floor"},/area/space)
"cy" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled/monotile,/area/maintenance/fourthdeck/forestarboard)
"cz" = (/obj/catwalk_plated,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fourthdeck/forestarboard)
@@ -783,7 +783,7 @@
"ph" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{id_tag = "eva_airlock_pump"},/obj/machinery/light{dir = 1},/obj/machinery/oxygen_pump{pixel_y = 32},/obj/floor_decal/techfloor{dir = 1},/turf/simulated/floor/tiled/techfloor/grid,/area/eva)
"pi" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{id_tag = "eva_airlock_pump"},/obj/floor_decal/techfloor{dir = 1},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1380; id_tag = "eva_airlock"; pixel_y = 20; tag_airpump = "eva_airlock_pump"; tag_chamber_sensor = "eva_airlock_sensor"; tag_exterior_door = "eva_airlock_outer"; tag_interior_door = "eva_airlock_inner"},/turf/simulated/floor/tiled/techfloor/grid,/area/eva)
"pj" = (/obj/machinery/light{dir = 1},/obj/machinery/oxygen_pump{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{id_tag = "eva_airlock_pump"},/obj/floor_decal/techfloor{dir = 1},/turf/simulated/floor/tiled/techfloor/grid,/area/eva)
-"pk" = (/obj/structure/table/rack{dir = 8},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/machinery/camera/network/fourth_deck{c_tag = "EVA - Center"; dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 6},/obj/floor_decal/corner/blue/half{dir = 8},/turf/simulated/floor/tiled/monotile,/area/eva)
+"pk" = (/obj/structure/table/rack{dir = 8},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 6},/obj/floor_decal/corner/blue/half{dir = 8},/turf/simulated/floor/tiled/monotile,/area/eva)
"pl" = (/turf/simulated/floor/tiled,/area/eva)
"pm" = (/obj/structure/table/steel_reinforced,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/floor_decal/corner/blue/half{dir = 4},/turf/simulated/floor/tiled/monotile,/area/eva)
"pn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/newscaster{pixel_x = 32},/obj/floor_decal/industrial/warning/corner{dir = 4; icon_state = "warningcorner"},/turf/simulated/floor/tiled,/area/hallway/primary/fourthdeck/fore)
@@ -907,7 +907,7 @@
"rB" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{dir = 1; id_tag = "eva_airlock_pump"},/obj/floor_decal/techfloor,/turf/simulated/floor/tiled/techfloor/grid,/area/eva)
"rC" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{dir = 1; id_tag = "eva_airlock_pump"},/obj/floor_decal/techfloor,/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "eva_airlock_sensor"; pixel_y = -25},/turf/simulated/floor/tiled/techfloor/grid,/area/eva)
"rD" = (/obj/item/device/radio/intercom{dir = 1; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{dir = 1; id_tag = "eva_airlock_pump"},/obj/floor_decal/techfloor,/turf/simulated/floor/tiled/techfloor/grid,/area/eva)
-"rE" = (/obj/structure/table/rack{dir = 8},/obj/item/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/storage/briefcase/inflatable{pixel_y = 3},/obj/item/storage/briefcase/inflatable{pixel_x = -3},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/floor_decal/corner/blue/half{dir = 8},/turf/simulated/floor/tiled/monotile,/area/eva)
+"rE" = (/obj/structure/table/rack{dir = 8},/obj/item/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/storage/briefcase/inflatable{pixel_y = 3},/obj/item/storage/briefcase/inflatable{pixel_x = -3},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/floor_decal/corner/blue/half{dir = 8},/obj/machinery/camera/network/fourth_deck{c_tag = "EVA - Center"; dir = 4},/turf/simulated/floor/tiled/monotile,/area/eva)
"rF" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/eva)
"rG" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/eva)
"rH" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/eva)
diff --git a/maps/torch_fd/torch3_deck3.dmm b/maps/torch_fd/torch3_deck3.dmm
index 2ce9f2b308fed..2cb69b76bdafd 100644
--- a/maps/torch_fd/torch3_deck3.dmm
+++ b/maps/torch_fd/torch3_deck3.dmm
@@ -630,7 +630,7 @@
"mk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/hatch/maintenance,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled/steel_ridged,/area/hallway/primary/thirddeck/fore)
"ml" = (/obj/structure/flora/ausbushes/fernybush,/turf/simulated/floor/grass,/area/crew_quarters/observation)
"mm" = (/obj/floor_decal/spline/fancy/wood,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/lino,/area/crew_quarters/galley)
-"mn" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_coffee/full{dir = 8; layer = 2.23; pixel_y = 27},/obj/item/sticky_pad/random{pixel_x = 7; pixel_y = 10},/obj/machinery/fabricator/micro{pixel_x = -3},/turf/simulated/floor/carpet/blue,/area/crew_quarters/galley)
+"mn" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_coffee/full{dir = 8; layer = 2.23; pixel_y = 27},/obj/item/sticky_pad/random{pixel_x = 7; pixel_y = 10},/obj/machinery/fabricator/micro/bartender{show_category = "All"; pixel_x = -3},/turf/simulated/floor/carpet/blue,/area/crew_quarters/galley)
"mo" = (/obj/floor_decal/spline/fancy/wood{dir = 4},/turf/simulated/floor/lino,/area/crew_quarters/galley)
"mp" = (/obj/floor_decal/corner/blue/border{dir = 8},/obj/floor_decal/corner/blue/border{dir = 4},/turf/simulated/floor/tiled/dark/monotile,/area/crew_quarters/mess)
"mq" = (/obj/structure/bed/sofa/r/black{dir = 8},/obj/floor_decal/corner/blue/border{dir = 8},/obj/floor_decal/corner/blue/border{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/tiled/dark/monotile,/area/crew_quarters/mess)
diff --git a/maps/torch_fd/torch_cameras.dm b/maps/torch_fd/torch_cameras.dm
index 3ca78fd83979f..6b59c12a2b61e 100644
--- a/maps/torch_fd/torch_cameras.dm
+++ b/maps/torch_fd/torch_cameras.dm
@@ -1,8 +1,8 @@
-var/const/NETWORK_EXPLO = "Exploration"
-var/const/NETWORK_PETROV = "Petrov"
-var/const/NETWORK_GUPS = "General Utility Pods" // 2 for the price of 1! :p
-var/const/NETWORK_SUPPLY = "Supply"
-var/const/NETWORK_YACHT = "Private Catamaran"
+var/global/const/NETWORK_EXPLO = "Exploration"
+var/global/const/NETWORK_PETROV = "Petrov"
+var/global/const/NETWORK_GUPS = "General Utility Pods" // 2 for the price of 1! :p
+var/global/const/NETWORK_SUPPLY = "Supply"
+var/global/const/NETWORK_YACHT = "Private Catamaran"
/datum/map/torch/get_network_access(network)
switch(network)
diff --git a/maps/torch_fd/torch_shuttles.dm b/maps/torch_fd/torch_shuttles.dm
new file mode 100644
index 0000000000000..11096913625bc
--- /dev/null
+++ b/maps/torch_fd/torch_shuttles.dm
@@ -0,0 +1,482 @@
+//Some helpers because so much copypasta for pods
+/datum/shuttle/autodock/ferry/escape_pod/torchpod
+ category = /datum/shuttle/autodock/ferry/escape_pod/torchpod
+ sound_takeoff = 'sound/effects/rocket.ogg'
+ sound_landing = 'sound/effects/rocket_backwards.ogg'
+ warmup_time = 10
+
+/obj/shuttle_landmark/escape_pod/start
+ name = "Docked"
+ base_turf = /turf/simulated/floor/reinforced
+
+/obj/shuttle_landmark/escape_pod/transit
+ name = "In transit"
+
+/obj/shuttle_landmark/escape_pod/out
+ name = "Escaped"
+
+//Pods
+#define TORCH_ESCAPE_POD(NUMBER) \
+/datum/shuttle/autodock/ferry/escape_pod/torchpod/escape_pod##NUMBER { \
+ shuttle_area = /area/shuttle/escape_pod##NUMBER/station; \
+ name = "Escape Pod " + #NUMBER; \
+ dock_target = "escape_pod_" + #NUMBER; \
+ arming_controller = "escape_pod_"+ #NUMBER +"_berth"; \
+ waypoint_station = "escape_pod_"+ #NUMBER +"_start"; \
+ landmark_transition = "escape_pod_"+ #NUMBER +"_internim"; \
+ waypoint_offsite = "escape_pod_"+ #NUMBER +"_out"; \
+} \
+/obj/shuttle_landmark/escape_pod/start/pod##NUMBER { \
+ landmark_tag = "escape_pod_"+ #NUMBER +"_start"; \
+ docking_controller = "escape_pod_"+ #NUMBER +"_berth"; \
+} \
+/obj/shuttle_landmark/escape_pod/out/pod##NUMBER { \
+ landmark_tag = "escape_pod_"+ #NUMBER +"_internim"; \
+} \
+/obj/shuttle_landmark/escape_pod/transit/pod##NUMBER { \
+ landmark_tag = "escape_pod_"+ #NUMBER +"_out"; \
+}
+
+TORCH_ESCAPE_POD(6)
+TORCH_ESCAPE_POD(7)
+// TORCH_ESCAPE_POD(8)
+TORCH_ESCAPE_POD(9)
+TORCH_ESCAPE_POD(10)
+TORCH_ESCAPE_POD(11)
+TORCH_ESCAPE_POD(12)
+TORCH_ESCAPE_POD(13)
+TORCH_ESCAPE_POD(15)
+TORCH_ESCAPE_POD(16)
+TORCH_ESCAPE_POD(17)
+
+//Petrov
+
+/datum/shuttle/autodock/ferry/petrov
+ name = "Petrov"
+ warmup_time = 10
+ dock_target = "petrov_shuttle_airlock"
+ waypoint_station = "nav_petrov_start"
+ waypoint_offsite = "nav_petrov_out"
+ logging_home_tag = "nav_petrov_start"
+ logging_access = access_petrov_helm
+ ceiling_type = /turf/simulated/floor/shuttle_ceiling
+
+/datum/shuttle/autodock/ferry/petrov/New(_name, obj/shuttle_landmark/initial_location)
+ shuttle_area = subtypesof(/area/shuttle/petrov)
+ ..()
+
+/obj/shuttle_landmark/petrov/start
+ name = "First Deck"
+ landmark_tag = "nav_petrov_start"
+ docking_controller = "petrov_shuttle_dock_airlock"
+
+/obj/shuttle_landmark/petrov/out
+ name = "Space near the ship"
+ landmark_tag = "nav_petrov_out"
+
+//Ninja Shuttle.
+/datum/shuttle/autodock/multi/antag/ninja
+ destination_tags = list(
+ "nav_ninja_deck1",
+ "nav_ninja_deck2",
+ "nav_ninja_deck3",
+ "nav_ninja_deck4",
+ "nav_ninja_deck5",
+ "nav_ninja_hanger",
+ "nav_away_6",
+ "nav_derelict_5",
+ "nav_cluster_6",
+ "nav_ninja_start",
+ "nav_lost_supply_base_antag",
+ "nav_marooned_antag",
+ "nav_smugglers_antag",
+ "nav_magshield_antag",
+ "nav_casino_antag",
+ "nav_yacht_antag",
+ "nav_slavers_base_antag"
+ )
+
+/obj/shuttle_landmark/ninja/hanger
+ name = "West of Hanger Deck"
+ landmark_tag = "nav_ninja_hanger"
+
+/obj/shuttle_landmark/ninja/deck1
+ name = "South of First Deck"
+ landmark_tag = "nav_ninja_deck1"
+
+/obj/shuttle_landmark/ninja/deck2
+ name = "Northeast of Second Deck"
+ landmark_tag = "nav_ninja_deck2"
+
+/obj/shuttle_landmark/ninja/deck3
+ name = "East of Third Deck"
+ landmark_tag = "nav_ninja_deck3"
+
+/obj/shuttle_landmark/ninja/deck4
+ name = "West of Fourth Deck"
+ landmark_tag = "nav_ninja_deck4"
+
+/obj/shuttle_landmark/ninja/deck5
+ name = "Southeast of Bridge"
+ landmark_tag = "nav_ninja_deck5"
+
+//Merchant
+/*
+/datum/shuttle/autodock/ferry/merchant
+ name = "Merchant"
+ warmup_time = 10
+ shuttle_area = /area/shuttle/merchant/home
+ waypoint_station = "nav_merchant_start"
+ waypoint_offsite = "nav_merchant_out"
+ dock_target = "merchant_ship_dock"
+
+/obj/shuttle_landmark/merchant/start
+ name = "Merchant Base"
+ landmark_tag = "nav_merchant_start"
+ docking_controller = "merchant_station_dock"
+
+/obj/shuttle_landmark/merchant/out
+ name = "Docking Bay"
+ landmark_tag = "nav_merchant_out"
+ docking_controller = "merchant_shuttle_station_dock"
+*/
+//Admin
+
+/datum/shuttle/autodock/ferry/administration
+ name = "Administration"
+ warmup_time = 10 //want some warmup time so people can cancel.
+ shuttle_area = /area/shuttle/administration/centcom
+ dock_target = "admin_shuttle"
+ waypoint_station = "nav_admin_start"
+ waypoint_offsite = "nav_admin_out"
+
+/obj/shuttle_landmark/admin/start
+ name = "Centcom"
+ landmark_tag = "nav_admin_start"
+ docking_controller = "admin_shuttle"
+ base_area = /area/centcom
+ base_turf = /turf/simulated/floor/plating
+
+/obj/shuttle_landmark/admin/out
+ name = "Docking Bay"
+ landmark_tag = "nav_admin_out"
+ docking_controller = "admin_shuttle_dock_airlock"
+
+//Transport
+/*
+/datum/shuttle/autodock/ferry/centcom
+ name = "Centcom"
+ location = 1
+ warmup_time = 10
+ shuttle_area = /area/shuttle/transport1/centcom
+ dock_target = "centcom_shuttle"
+ waypoint_offsite = "nav_ferry_start"
+ waypoint_station = "nav_ferry_out"
+
+/obj/shuttle_landmark/ferry/start
+ name = "Centcom"
+ landmark_tag = "nav_ferry_start"
+ docking_controller = "centcom_shuttle_bay"
+
+/obj/shuttle_landmark/ferry/out
+ name = "Docking Bay"
+ landmark_tag = "nav_ferry_out"
+ docking_controller = "centcom_shuttle_dock_airlock"
+*/
+/obj/shuttle_landmark/merc/hanger
+ name = "Northeast of Hanger Deck"
+ landmark_tag = "nav_merc_hanger"
+
+/obj/shuttle_landmark/merc/deck1
+ name = "Northeast of First Deck"
+ landmark_tag = "nav_merc_deck1"
+
+/obj/shuttle_landmark/merc/deck2
+ name = "Southeast of the Second deck"
+ landmark_tag = "nav_merc_deck2"
+
+/obj/shuttle_landmark/merc/deck3
+ name = "South of Third deck"
+ landmark_tag = "nav_merc_deck3"
+
+/obj/shuttle_landmark/merc/deck4
+ name = "Northwest of Fourth Deck"
+ landmark_tag = "nav_merc_deck4"
+
+/obj/shuttle_landmark/merc/deck5
+ name = "East of Bridge"
+ landmark_tag = "nav_merc_deck5"
+
+/obj/shuttle_landmark/vox_raider/dock
+ name = "4th Deck, Aft Starboard Airlock"
+ landmark_tag = "nav_vox_raider_dock"
+
+//Skipjack
+/datum/shuttle/autodock/multi/antag/skipjack
+ destination_tags = list(
+ "nav_skipjack_deck1",
+ "nav_skipjack_deck2",
+ "nav_skipjack_deck3",
+ "nav_skipjack_deck4",
+ "nav_skipjack_deck5",
+ "nav_skipjack_hanger",
+ "nav_away_7",
+ "nav_derelict_7",
+ "nav_cluster_7",
+ "nav_skipjack_dock",
+ "nav_skipjack_start",
+ "nav_lost_supply_base_antag",
+ "nav_marooned_antag",
+ "nav_smugglers_antag",
+ "nav_magshield_antag",
+ "nav_casino_antag",
+ "nav_yacht_antag",
+ "nav_slavers_base_antag",
+ )
+
+/obj/shuttle_landmark/skipjack/hanger
+ name = "North of Hanger Deck"
+ landmark_tag = "nav_skipjack_hanger"
+
+/obj/shuttle_landmark/skipjack/deck1
+ name = "Northwest of First Deck"
+ landmark_tag = "nav_skipjack_deck1"
+
+/obj/shuttle_landmark/skipjack/deck2
+ name = "Southwest of the Second deck"
+ landmark_tag = "nav_skipjack_deck2"
+
+/obj/shuttle_landmark/skipjack/deck3
+ name = "Southeast of Third deck"
+ landmark_tag = "nav_skipjack_deck3"
+
+/obj/shuttle_landmark/skipjack/deck4
+ name = "Northwest of Fourth Deck"
+ landmark_tag = "nav_skipjack_deck4"
+
+/obj/shuttle_landmark/skipjack/deck5
+ name = "South of Bridge"
+ landmark_tag = "nav_skipjack_deck5"
+
+//NT Rescue Shuttle
+
+/datum/shuttle/autodock/multi/antag/rescue
+ destination_tags = list(
+ "nav_ert_deck1",
+ "nav_ert_deck2",
+ "nav_ert_deck3",
+ "nav_ert_deck4",
+ "nav_ert_deck5",
+ "nav_ert_hanger",
+ "nav_away_4",
+ "nav_derelict_4",
+ "nav_cluster_4",
+ "nav_ert_dock",
+ "nav_ert_start",
+ "nav_lost_supply_base_antag",
+ "nav_marooned_antag",
+ "nav_smugglers_antag",
+ "nav_magshield_antag",
+ "nav_casino_antag",
+ "nav_yacht_antag",
+ "nav_slavers_base_antag",
+ )
+
+/obj/shuttle_landmark/ert/hanger
+ name = "Southeast of Hanger deck"
+ landmark_tag = "nav_ert_hanger"
+
+/obj/shuttle_landmark/ert/deck1
+ name = "Southwest of Fourth deck"
+ landmark_tag = "nav_ert_deck1"
+
+/obj/shuttle_landmark/ert/deck2
+ name = "Northwest of Third deck"
+ landmark_tag = "nav_ert_deck2"
+
+/obj/shuttle_landmark/ert/deck3
+ name = "Northwest of Second deck"
+ landmark_tag = "nav_ert_deck3"
+
+/obj/shuttle_landmark/ert/deck4
+ name = "Southwest of First Deck"
+ landmark_tag = "nav_ert_deck4"
+
+/obj/shuttle_landmark/ert/deck5
+ name = "West of Bridge"
+ landmark_tag = "nav_ert_deck5"
+
+//SCGMC Assault Pod
+/*
+/datum/shuttle/autodock/ferry/specops/ert
+ name = "Special Operations"
+ warmup_time = 10
+ shuttle_area = /area/shuttle/specops/centcom
+ dock_target = "specops_shuttle_fore"
+ waypoint_station = "nav_specops_start"
+ waypoint_offsite = "nav_specops_out"
+
+/obj/shuttle_landmark/specops/start
+ name = "Centcom"
+ landmark_tag = "nav_specops_start"
+ docking_controller = "specops_shuttle_port"
+
+/obj/shuttle_landmark/specops/out
+ name = "Docking Bay"
+ landmark_tag = "nav_specops_out"
+ docking_controller = "specops_dock_airlock"
+*/
+//Cargo drone
+
+/datum/shuttle/autodock/ferry/supply/drone
+ name = "Supply Drone"
+ location = 1
+ warmup_time = 10
+ shuttle_area = /area/supply/dock
+ waypoint_offsite = "nav_cargo_start"
+ waypoint_station = "nav_cargo_station"
+
+/obj/shuttle_landmark/supply/centcom
+ name = "Offsite"
+ landmark_tag = "nav_cargo_start"
+
+/obj/shuttle_landmark/supply/station
+ name = "Hangar"
+ landmark_tag = "nav_cargo_station"
+ base_area = /area/quartermaster/hangar
+ base_turf = /turf/simulated/floor/plating
+
+/datum/shuttle/autodock/overmap/exploration_shuttle
+ name = "Charon"
+ move_time = 60
+ shuttle_area = list(/area/exploration_shuttle/cockpit, /area/exploration_shuttle/atmos, /area/exploration_shuttle/power, /area/exploration_shuttle/crew, /area/exploration_shuttle/cargo, /area/exploration_shuttle/airlock, /area/exploration_shuttle/medical, /area/exploration_shuttle/fuel)
+ dock_target = "charon_shuttle"
+ current_location = "nav_hangar_charon"
+ landmark_transition = "nav_transit_charon"
+ range = 1
+ fuel_consumption = 4
+ logging_home_tag = "nav_hangar_charon"
+ logging_access = access_expedition_shuttle_helm
+ ceiling_type = /turf/simulated/floor/shuttle_ceiling/torch
+
+/obj/shuttle_landmark/torch/hangar/exploration_shuttle
+ name = "Charon Hangar"
+ landmark_tag = "nav_hangar_charon"
+ base_area = /area/quartermaster/hangar
+ base_turf = /turf/simulated/floor/plating
+
+/obj/shuttle_landmark/torch/deck1/exploration_shuttle
+ name = "Space near Forth Deck"
+ landmark_tag = "nav_deck1_charon"
+
+/obj/shuttle_landmark/torch/deck2/exploration_shuttle
+ name = "Space near Third Deck"
+ landmark_tag = "nav_deck2_charon"
+
+/obj/shuttle_landmark/torch/deck3/exploration_shuttle
+ name = "Space near Second Deck"
+ landmark_tag = "nav_deck3_charon"
+
+/obj/shuttle_landmark/torch/deck4/exploration_shuttle
+ name = "Space near First Deck"
+ landmark_tag = "nav_deck4_charon"
+
+/obj/shuttle_landmark/torch/deck5/exploration_shuttle
+ name = "Space near Bridge"
+ landmark_tag = "nav_bridge_charon"
+
+/obj/shuttle_landmark/transit/torch/exploration_shuttle
+ name = "In transit"
+ landmark_tag = "nav_transit_charon"
+
+/datum/shuttle/autodock/overmap/guppy
+ name = "Guppy"
+ warmup_time = 5
+ move_time = 20
+ shuttle_area = /area/guppy_hangar/start
+ dock_target ="guppy_shuttle"
+ current_location = "nav_hangar_guppy"
+ landmark_transition = "nav_transit_guppy"
+ sound_takeoff = 'sound/effects/rocket.ogg'
+ sound_landing = 'sound/effects/rocket_backwards.ogg'
+ fuel_consumption = 2
+ logging_home_tag = "nav_hangar_guppy"
+ logging_access = access_guppy_helm
+ skill_needed = SKILL_UNSKILLED
+ ceiling_type = /turf/simulated/floor/shuttle_ceiling/torch
+
+/obj/shuttle_landmark/torch/hangar/guppy
+ name = "Guppy Hangar"
+ landmark_tag = "nav_hangar_guppy"
+ base_area = /area/quartermaster/hangar
+ base_turf = /turf/simulated/floor/plating
+
+/obj/shuttle_landmark/torch/deck1/guppy
+ name = "Space near Forth Deck"
+ landmark_tag = "nav_deck1_guppy"
+
+/obj/shuttle_landmark/torch/deck2/guppy
+ name = "Space near Third Deck"
+ landmark_tag = "nav_deck2_guppy"
+
+/obj/shuttle_landmark/torch/deck3/guppy
+ name = "Space near Second Deck"
+ landmark_tag = "nav_deck3_guppy"
+
+/obj/shuttle_landmark/torch/deck4/guppy
+ name = "Space near First Deck"
+ landmark_tag = "nav_deck4_guppy"
+
+/obj/shuttle_landmark/torch/deck5/guppy
+ name = "Space near Bridge"
+ landmark_tag = "nav_bridge_guppy"
+
+/obj/shuttle_landmark/transit/torch/guppy
+ name = "In transit"
+ landmark_tag = "nav_transit_guppy"
+
+/datum/shuttle/autodock/overmap/aquila
+ name = "Aquila"
+ move_time = 50
+ shuttle_area = list(/area/aquila/cockpit, /area/aquila/power, /area/aquila/storage, /area/aquila/suits, /area/aquila/air, /area/aquila/crew, /area/aquila/medical, /area/aquila/airlock)
+ current_location = "nav_hangar_aquila"
+ landmark_transition = "nav_transit_aquila"
+ dock_target = "aquila_shuttle"
+ range = 2
+ logging_home_tag = "nav_hangar_aquila"
+ logging_access = access_aquila_helm
+ ceiling_type = /turf/simulated/floor/shuttle_ceiling/torch
+
+/obj/shuttle_landmark/torch/hangar/aquila
+ name = "Aquila Hangar"
+ landmark_tag = "nav_hangar_aquila"
+ docking_controller = "aquila_shuttle_dock_airlock"
+ base_turf = /turf/simulated/floor/reinforced
+
+/obj/shuttle_landmark/torch/deck1/aquila
+ name = "Space near Forth Deck"
+ landmark_tag = "nav_deck1_aquila"
+
+/obj/shuttle_landmark/torch/deck2/aquila
+ name = "Space near Third Deck"
+ landmark_tag = "nav_deck2_aquila"
+
+/obj/shuttle_landmark/torch/deck3/aquila
+ name = "Space near Second Deck"
+ landmark_tag = "nav_deck3_aquila"
+
+/obj/shuttle_landmark/torch/deck4/aquila
+ name = "Space near First Deck"
+ landmark_tag = "nav_deck4_aquila"
+
+/obj/shuttle_landmark/torch/deck5/aquila
+ name = "Space near Bridge"
+ landmark_tag = "nav_bridge_aquila"
+
+/obj/shuttle_landmark/transit/torch/aquila
+ name = "In transit"
+ landmark_tag = "nav_transit_aquila"
+
+//Makes the deck management program use hangar access
+/datum/nano_module/deck_management
+ default_access = list(access_hangar, access_cargo, access_heads)
diff --git a/maps/torch_fd/z7_admin.dmm b/maps/torch_fd/z7_admin.dmm
index 6c4d497801f10..3e81be3a1a65e 100644
--- a/maps/torch_fd/z7_admin.dmm
+++ b/maps/torch_fd/z7_admin.dmm
@@ -628,7 +628,7 @@
"avn" = (/obj/structure/bed/chair/shuttle,/obj/structure/sign/warning/nosmoking_1{pixel_y = 24},/obj/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled/dark,/area/centcom/ferry)
"avp" = (/obj/structure/table/reinforced,/obj/item/storage/firstaid/surgery,/obj/item/reagent_containers/glass/bottle/stoxin,/obj/item/reagent_containers/syringe,/obj/item/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/reagent_containers/syringe/antiviral,/obj/item/reagent_containers/syringe/antiviral,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/reagent_containers/spray/sterilizine,/obj/item/reagent_containers/spray/cleaner,/obj/structure/closet/medical_wall{pixel_x = -32},/obj/item/storage/bag/cash/infinite,/turf/simulated/floor/shuttle/white,/area/shuttle/administration/centcom)
"avq" = (/obj/machinery/vending/cola{dir = 4},/turf/simulated/floor/tiled/monotile,/area/centcom/hallway)
-"avs" = (/obj/machinery/door/airlock/centcom{name = "General Access"},/turf/unsimulated/floor/plating,/area/shuttle/administration/centcom)
+"avs" = (/obj/machinery/door/airlock/centcom{name = "General Access"; id_tag = "admin_shuttle_inner"},/turf/unsimulated/floor/plating,/area/shuttle/administration/centcom)
"avt" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor/shuttle/red,/area/shuttle/administration/centcom)
"avu" = (/obj/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/centcom/hallway)
"avv" = (/turf/unsimulated/wall{color = "black"; name = "void"},/area/fd/end)
@@ -648,7 +648,7 @@
"avO" = (/obj/floor_decal/borderfloorblack{dir = 8},/obj/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled/steel_grid,/area/centcom/hallway/adherent)
"avP" = (/obj/structure/table/reinforced,/turf/simulated/floor/shuttle/black,/area/shuttle/administration/centcom)
"avQ" = (/obj/structure/table/reinforced,/obj/item/deck/cards,/turf/simulated/floor/wood/walnut,/area/shuttle/administration/centcom)
-"avS" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "closed"; id_tag = "admin_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"},/obj/shuttle_landmark/admin/start,/turf/unsimulated/floor/plating,/area/shuttle/administration/centcom)
+"avS" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "closed"; id_tag = "admin_shuttle_outer"; locked = 1; name = "Shuttle Hatch"},/obj/shuttle_landmark/admin/start,/turf/unsimulated/floor/plating,/area/shuttle/administration/centcom)
"avT" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"avU" = (/obj/machinery/light/small{dir = 8},/obj/floor_decal/corner/blue{dir = 9},/turf/simulated/floor/tiled,/area/centcom/arrivals/docks)
"avV" = (/turf/simulated/wall/invincible/prepainted,/area/centcom/control)
@@ -1926,7 +1926,7 @@
"gZJ" = (/obj/floor_decal/industrial/warning/fulltile,/turf/simulated/floor/tiled/techfloor,/area/centcom/engineering/reactor)
"haT" = (/obj/floor_decal/spline/plain/black{dir = 9},/turf/simulated/floor/shuttle/black,/area/space)
"hbm" = (/obj/structure/table/woodentable/walnut,/obj/floor_decal/spline/fancy/wood,/turf/simulated/floor/wood/walnut,/area/centcom/control/command)
-"hbJ" = (/obj/shuttle_landmark/ferry/start,/turf/space,/area/space)
+"hbJ" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{cycle_to_external_air = 1; dir = 8; frequency = 1331; id_tag = "admin_shuttle"; pixel_x = 26; req_access = list("ACCESS_CENT_GENERAL")},/turf/simulated/floor/shuttle/red,/area/shuttle/administration/centcom)
"hcj" = (/obj/structure/hygiene/sink{dir = 4; pixel_x = 11; pixel_y = 5},/obj/item/storage/mirror{pixel_x = 25},/obj/floor_decal/borderfloorwhite{dir = 6},/obj/floor_decal/corner/green{dir = 1},/turf/simulated/floor/tiled/old_tile,/area/fd/end)
"hel" = (/obj/floor_decal/corner/black/border{dir = 4},/turf/simulated/floor/tiled,/area/centcom/beauro)
"hep" = (/obj/structure/table/steel_reinforced,/obj/machinery/photocopier/faxmachine{department = "Observatory - Command"},/obj/machinery/light/spot{dir = 8},/turf/simulated/floor/tiled/dark/monotile,/area/centcom/control)
@@ -3051,7 +3051,6 @@
"uQe" = (/obj/floor_decal/corner/paleblue/three_quarters{dir = 8},/turf/simulated/floor/tiled/white,/area/centcom/hallway)
"uRe" = (/obj/floor_decal/corner/red/three_quarters,/obj/machinery/light/small,/turf/simulated/floor/tiled/techfloor,/area/space)
"uRT" = (/obj/structure/window/boron_reinforced{dir = 8},/obj/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/blackgrid,/area/space)
-"uSb" = (/obj/shuttle_landmark/specops/start,/turf/space,/area/space)
"uSI" = (/obj/floor_decal/scglogo{dir = 8; icon_state = "top-left"},/turf/simulated/floor/tiled/dark,/area/centcom/control/conference)
"uTQ" = (/obj/structure/sign/warning/radioactive{pixel_y = 32},/obj/structure/table/steel_reinforced,/obj/item/paper_bin,/obj/item/pen/multi,/turf/simulated/floor/tiled/techfloor/grid,/area/centcom/engineering/control)
"uUD" = (/obj/machinery/light/small,/turf/unsimulated/floor{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "steel_monotile"},/area/centcom/arrivals/docks)
@@ -3383,7 +3382,7 @@ aabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaa
aabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaatOvbwpgYatObTsmFNeGaatOtxwpgYatOlaktBmbTsatOxoaatOaiyaiyaiyaiyaiyaiyaiyatOqfjaLFatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
aabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaatOvbwpgYatOarxaiypgYlIVtxwpgYlIVtxwaiyxqXatOxoaatOaiyaiyaiyaiyaiyaiyaiyaLLqfjaLFaLLaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
aabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaatOvbwpgYatObTsezzeGaatOtxwpgYatOlakftabTsatOxoaatOaiyaiyaiyaiyaiyaiyaiyatOqfjaLFatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
-aabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabhbJaabuSbaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaatOatOhpYatOatOatOatOatOatOatOatOatOatOatOatOxoaatOaiyaiyaiyaiyaiyaiyaiyatOqfjaLFatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
+aabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaatOatOhpYatOatOatOatOatOatOatOatOatOatOatOatOxoaatOaiyaiyaiyaiyaiyaiyaiyatOqfjaLFatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
aabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaatOaiyaiyaiyaiyaiyaiyaiyatOqfjaLFatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
aabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaatOaiyaiyaiyaiyaiyaiyaiyatOqfjaLFatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOaiyaiyaiyaiyaiyaiyaiyatOxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
aabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabxoaxoaatOaiyaiyaiyaiyaiyaiyaiyatOqfjaLFatOaiyaiyaiyaiyaiyaiyaiyatOatOatOatOatOatOatOatOatOatOatOatOatOatOatOatOatOxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
@@ -3454,7 +3453,7 @@ aabaabaabaabaabaabaabaabaabaabaabaabaabaabaYepTGpTGpTGpTGaabaabaabaabaabaabaabaa
aabaabaabaabaabaabaabaabaabaabaabaabaabaabaYepTGpTGpTGpTGaabaabaabaabaabaabaabaabaabavEavEaulaulaulaulaulaulaulaulatdatdaulaulaulaulaulayratfrUfaDDaHkaabaabaabaCzaHochSaxyatOatOatOatOatOxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaavxlcQaIbaHuatRauwauzjlAauzauzauwavxxoaxoaxoapKupKupKupKupKupKuxoaxoaaxwqgLiKxuAyaxwaGolKZkZLvMJrtortorFxaxwaxwvPdaxwaxwoLSnOiwJGnOioLSnOiwJGnOioLSbNYgYdgpOwenaEeaEeaEeaEeaEeaEeaEeaEeaEeaEewenxoaxoaxoanaolaElaEqVpnaonaoaxFqYDnaowyCpbzsYRqlznaoxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
aabaabaabaabaabaabaabaabaabaabaabaabaabaabaYepTGpTGpTGpTGaabaabaabaabaabaabaabaabaabaabatBatCavaavbavcavdaveavfaulatqatdaulasZasZasZaulaulaulaulaulasSaabaabaabaCzwMMaDmaxyxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaavxatYaIbaHuatRauoauoauoavBauoauoavxxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaxwaxwaxwaxwaxwayqlKZeyThQRnyWhQRpqTaxwuAypzGmMhaxwoLSoLSrQroLSoLSoLSrQroLSoLSuGSjyKnTTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTkWZowLqAvaGTaGTnaonaonaonaoxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
aabaabaabaabaabaabaabaabaabaabaabaabaabpTGaYepTGpTGpTGpTGaabaabaabaabaabaabaabaabaabaabatUatCatdatdatdatdatdatdaDlatdatdaDlatdatdatdaulaHXoDsaGEaGEaHkaabaabaabaCzaHochSaxyxoaxoaxoabRHbRHbRHbRHbRHbRHbRHxoaxoaxoaxoaxoaxoaavxlcQaIbikkavxatRauoauoauoauoatRavxxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaxwfNAdAcxgEaxwaGolKZeyTxGzxGzhQRekjaxwuFsuFshbmaxwuXMugKcCZcCZcCZcCZcCZugKcCZehOvVSfqpcCZugKcCZcCZcCZajycCZcCZcCZugKcCZcCZcCZugKcCZcCZehOvVSnKHvVSvVSvVSvVSvVSnKHaGTxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
-aabaabaabaabaabaabaabaabaabaabaabaabaabpTGaYepTGpTGpTGpTGpTGaabaabaabaabaabaabaabaabavEavEavEavEaulaulatdatdatdaulatdatdaulatqatdatdaGsaHXaHXdSbbhgaHkaabaabaabaxypUCbhbaxybRHbRHbRHbRHjsEazWtwoqQUwjtbRHbRHbRHaGTaGTaGTaGTavxavxaHYavxavxavxavxavxavxavxavxavxaGTaGTaGTaGTaGTaGTaGTaGTaGTxoaxoaaxwjwaiKxpzGvPdaGolKZeyTxGzaFbxGzxGzaxwfBKawmdEDaxwvftmvSgeCgeCgeCgeCgeCgeCgeCozZvVSmvSgeCgeCgeCgeCgeCpEcgeCgeCgeCgeCgeCgeCgeCgeCgeCgeCozZvVSatPatPatPwqHaLXaLXaLXaGTxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
+aabaabaabaabaabaabaabaabaabaabaabaabaabpTGaYepTGpTGpTGpTGpTGaabaabaabaabaabaabaabaabavEavEavEavEaulaulatdatdatdaulatdhbJaulatqatdatdaGsaHXaHXdSbbhgaHkaabaabaabaxypUCbhbaxybRHbRHbRHbRHjsEazWtwoqQUwjtbRHbRHbRHaGTaGTaGTaGTavxavxaHYavxavxavxavxavxavxavxavxavxaGTaGTaGTaGTaGTaGTaGTaGTaGTxoaxoaaxwjwaiKxpzGvPdaGolKZeyTxGzaFbxGzxGzaxwfBKawmdEDaxwvftmvSgeCgeCgeCgeCgeCgeCgeCozZvVSmvSgeCgeCgeCgeCgeCpEcgeCgeCgeCgeCgeCgeCgeCgeCgeCgeCozZvVSatPatPatPwqHaLXaLXaLXaGTxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
aabaabaabaabaabaabaabaabaabaabaabaabaabpTGaYepTGpTGpTGpTGpTGaabaabaabaabaabaabaabaabaabaabaabatBatCatdatdatdatdaulaIhavsaulatdatdatdaulaHyaHXaHXauIaHkaabaabaabaCzaHochSaxybRHbpbbxbbRHazCaHraHraHrautbRHavHjTcaPFaPFaPFaPFaJAaPFaPFaPFaPFaPFaJAaPFaPFaPFmBhaGTxcuxcuxcukvUwhomCQaHwaILaGTxoaxoaaxwpSfiKxuAyaxwaGolKZaxwaxwaxwaxwaxwaxwaxwaxwaxwaxwvftkiAavVavVavVavVavVibneCKvftvVSkiAeCKewqavVavVavVavVavVavVavVavVavVavVavVavVavVavVvftatPaGTaGTeacaGTeacjSHjSHaGTaGTaGTaGTaGTaGTaGTaGTaGTaGTxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
aabaabaabaabaabaabaabaabaabaabaabaabpTGpTGaYepTGpTGpTGpTGpTGpTGaabaabaabaabaabaabaabaabaabaabatUatCavtaunavKavLaulcESerPaulauiaxzauiasSasSasSaHkaHkaHkaabaabaabaCzwMMaDmaxybRHkBtaBObRHaIXaHraxfateayXbRHavHjTcavlavlavlatPatPatPavlavlavlatPatPatPavlavlauVaGTxcuxcuxcuxcuxcuxcuxcuxcuaGTxoaxoaaxwaxwaxwaxwaxwaGolKZaxwmMhniBwOmaxwuFvhgoshdgjeaGTnqtxFXavVavVvLnmNcavVavVavVbEbawbbEbavVavVavVmNcvLnavVavVawyawzawAawBaaeavVatvatvavVvftatPaGTlfCfbfehhwdbiFubPYlOIakUcBHlCQcBHrbbhQOsJFiJTaGTxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
aabaabaabaabaabaabaabaabaabpTGpTGpTGpTGpTGaYepTGpTGpTGpTGpTGpTGpTGaabaabaabaabaabaabaabaabavEavEasSasSasSasSasSasShIzavSxDjasSasSasSdQQmvtaabaabaabaabaabaabaabaCzaHochSaxybRHaBhaHrbRHaGDaHJaHBaEHqWGbRHavHjTcgYdgYdgYdgYdgYdgYdgYdgYdgYdgYdgYdgYdawvavlauVaGTxcuxcuxcuxcuxcuxcuxcuxcuaGTaGTaGTaGTaGTaGThZQmVYprflKZvPdpzGvwsvrSaxwuXMcCZcCZcCZcCZehOkiAavVeXWusKvbMhSvaGcuvpayvayvayvayvaGcubacMGpIEhNAavVernmpGawGawGawGavVatvatvavVvftatPeacjYsuQehGQhGQgrfnaIhGQhGQgpxpZlejfpZlveFveFprWaGTxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaxoaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaab
diff --git a/mods/_fd/_maps/sfv_dropship/delman.dm b/mods/_fd/_maps/sfv_dropship/delman.dm
index 551bece033b42..9ecf3036c29aa 100644
--- a/mods/_fd/_maps/sfv_dropship/delman.dm
+++ b/mods/_fd/_maps/sfv_dropship/delman.dm
@@ -5,15 +5,8 @@
name = "PM-23 \"Delman\" Dropship"
id = "awaysite_delman"
description = "Army dropship that can bring to planet up to Platoon(42) and 4 Vehicle."
- mappaths = list("mods/_fd/_maps/sfv_dropship/delman.dm")
- area_usage_test_exempted_areas = list(
- /area/ship/delman,
- /area/ship/delman/central,
- /area/ship/delman/rightwing,
- /area/ship/delman/leftwing,
- /area/ship/delman/cockpit,
- /area/ship/delman/engibay
- )
+ mappaths = list("mods/_fd/_maps/sfv_dropship/delman.dmm")
+ area_usage_test_exempted_areas = list(/area/ship/delman)
spawn_cost = 1000
player_cost = 4
shuttles_to_initialise = list(/datum/shuttle/autodock/overmap/delman)
diff --git a/mods/_fd/_maps/snow_cage/code/snow_cage.dm b/mods/_fd/_maps/snow_cage/code/snow_cage.dm
index bc0c4c70acb1f..d9dd293322d7c 100644
--- a/mods/_fd/_maps/snow_cage/code/snow_cage.dm
+++ b/mods/_fd/_maps/snow_cage/code/snow_cage.dm
@@ -32,7 +32,7 @@
description = "An arctic planet with a small number of signatures on the surface. Scans indicate artificial structures under the planet's surface."
prefix = "mods/_fd/_maps/snow_cage/maps/"
suffixes = list("snow_cage-1.dmm","snow_cage-2.dmm","snow_cage-3.dmm","snow_cage-4.dmm")
- area_usage_test_exempted_root_areas = list(/area/splanet/)
+ area_usage_test_exempted_root_areas = list(/area/splanet)
apc_test_exempt_areas = list(
/area/splanet/outdoors = NO_SCRUBBER|NO_VENT|NO_APC,
/area/splanet/underground = NO_SCRUBBER|NO_VENT|NO_APC
diff --git a/mods/_fd/combat_stances/code/item.dm b/mods/_fd/combat_stances/code/item.dm
index 02955f819d673..e988f2ec68d82 100644
--- a/mods/_fd/combat_stances/code/item.dm
+++ b/mods/_fd/combat_stances/code/item.dm
@@ -21,7 +21,7 @@
var/obj/item/melee/I
- if(melee_strikes && !istype(I, /obj/item/melee/energy/))
+ if(melee_strikes && !istype(I, /obj/item/melee/energy))
swap_stances(user)
/obj/item/proc/swap_stances(mob/user)
diff --git a/mods/_fd/expanded_traders/_expanded_traders.dme b/mods/_fd/expanded_traders/_expanded_traders.dme
index 8433bd2cc38be..9f0ef67e2b300 100644
--- a/mods/_fd/expanded_traders/_expanded_traders.dme
+++ b/mods/_fd/expanded_traders/_expanded_traders.dme
@@ -4,6 +4,7 @@
#include "_expanded_traders.dm"
#include "code/ai.dm"
+#include "code/trading_locations.dm"
#include "code/preset_console.dm"
diff --git a/mods/_fd/expanded_traders/code/trading_locations.dm b/mods/_fd/expanded_traders/code/trading_locations.dm
new file mode 100644
index 0000000000000..f9aafa5714cbf
--- /dev/null
+++ b/mods/_fd/expanded_traders/code/trading_locations.dm
@@ -0,0 +1,19 @@
+/obj/overmap/trading
+ name = "station"
+ desc = "A trading station."
+ icon = 'mods/_fd/fd_assets/icons/overmap.dmi'
+ icon_state = "trading_sector"
+ scannable = TRUE
+ requires_contact = TRUE // Whether or not the effect must be identified by ship sensors before being seen.
+ instant_contact = TRUE // Do we instantly identify ourselves to any ship in sensors range?
+ plane = 4
+
+ var/datum/trader/trader_merchant_datum
+
+/obj/overmap/trading/on_update_icon()
+ return
+
+/obj/overmap/trading/ship
+ name = "ship"
+ desc = "A trading ship."
+ icon_state = "trading_ship"
diff --git a/mods/_fd/fd_assets/_fd_assets.dme b/mods/_fd/fd_assets/_fd_assets.dme
index b57c50f53899d..1ddcbb42c55be 100644
--- a/mods/_fd/fd_assets/_fd_assets.dme
+++ b/mods/_fd/fd_assets/_fd_assets.dme
@@ -18,6 +18,7 @@
#include "code/machinery/turret.dm"
#include "code/mobs/mobs.dm"
+#include "code/mobs/pureevil.dm"
#include "code/obj/items/encryption_key_boxes.dm"
#include "code/obj/items/firstaid_indiv.dm"
diff --git a/mods/_fd/fd_assets/code/mobs/pureevil.dm b/mods/_fd/fd_assets/code/mobs/pureevil.dm
new file mode 100644
index 0000000000000..1f3fa4ce2d510
--- /dev/null
+++ b/mods/_fd/fd_assets/code/mobs/pureevil.dm
@@ -0,0 +1,401 @@
+/mob/living/simple_animal/hostile/boss/prime_soul
+ name = "Andrey Surov"
+ desc = "run"
+ icon = 'mods/_fd/fd_assets/icons/animals/prime_soul.dmi'
+ icon_state = "body"
+ icon_living = "body"
+ icon_dead = "body"
+ response_help = "tries to poke"
+ response_disarm = "shoves"
+ response_harm = "hits"
+ speed = 4
+ movement_cooldown = 0
+ maxHealth = 1000
+ health = 1000
+ harm_intent_damage = 5
+ can_escape = TRUE
+ a_intent = I_HURT
+ natural_weapon = /obj/item/natural_weapon/punch/minos
+ pry_time = 4 SECONDS
+ taser_kill = 0
+ melee_attack_delay = 2.5
+ unsuitable_atmos_damage = 0
+ faction = "boss"
+ status_flags = CANPUSH
+ does_spin = FALSE
+
+ ai_holder = /datum/ai_holder/simple_animal/prime_soul
+
+ var/seen = FALSE
+ var/attacking = TRUE
+
+ var/stamina = 6
+ var/max_stamina = 6
+
+ var/phase_two = FALSE
+ var/attack_cooldown = 0
+ var/stamina_recharge = 0
+
+ var/datum/sound_token/boss_theme
+ var/sound_id = "minos"
+
+/mob/living/simple_animal/hostile/boss/prime_soul/proc/meet_player(mob/player)
+ face_atom(player)
+ anchored = TRUE
+ playsound(src, 'mods/_fd/fd_assets/sounds/prime_soul/Mp_intro2.ogg', 60, 0, extrarange = 13, falloff = 4)
+ playsound(src, 'mods/_fd/fd_assets/sounds/prime_soul/intro_music.ogg', 60, 0, extrarange = 13, falloff = 4)
+ ISay("Ah... Free... At last.")
+ sleep(52)
+ dir = turn(dir,90)
+ sleep(15)
+ ISay("O Gabriel... Now dawns thy reckoning")
+ sleep(50)
+ dir = turn(dir,-180)
+ sleep(17)
+ ISay("And thy gore shall GLISTEN before the temples of MAN!")
+ sleep(70)
+ face_atom(player)
+ sleep(14)
+ ISay("Creature of steel? My gratitude upon thee for my freedom.")
+ sleep(86)
+ face_atom(player)
+ ISay("But the crimes thy kind have committed against humanity are NOT forgotten!")
+ sleep(100)
+ face_atom(player)
+ ISay("And thy punishment... IS DEATH!")
+ sleep(54)
+ anchored = FALSE
+ face_atom(player)
+ boss_theme = GLOB.sound_player.PlayLoopingSound(src, sound_id, 'mods/_fd/fd_assets/sounds/prime_soul/Heaven_Pierce_Her-ORDER.ogg', volume = 60, range = 20, falloff = 4, prefer_mute = TRUE)
+ ai_holder.hostile = TRUE
+ attacking = FALSE
+
+///////////////////////* ATTACK TYPES START *///////////////////////
+
+/mob/living/simple_animal/hostile/boss/prime_soul/proc/PREPARE_THYSELF(atom/movable/target)
+ playsound(src, pick('mods/_fd/fd_assets/sounds/prime_soul/Mp_prepare.ogg', 'mods/_fd/fd_assets/sounds/prime_soul/Mp_prepare2.ogg'), 80, 0, extrarange = 13, falloff = 4)
+ ai_holder.set_busy(TRUE)
+ natural_weapon = /obj/item/natural_weapon/kick
+ do_windup_animation(target,10)
+ sleep(10)
+ forceMove(get_step(target,get_dir(target,src)))
+ IAttack(target)
+ do_windup_animation(target,8)
+ sleep(8)
+ forceMove(get_step(target,get_dir(target,src)))
+ IAttack(target)
+ do_windup_animation(target,8)
+ sleep(8)
+ switch(rand(1,2))
+ if(1)
+ natural_weapon = /obj/item/natural_weapon/punch/minos/uppercut
+ forceMove(get_step(target,get_dir(target,src)))
+ if(IAttack(target))
+ sleep(4)
+ if(get_dist(src,target) < 2)
+ target.throw_at(get_step(target,get_dir(src,target)), 3, 1)
+ if(2)
+ if(get_dist(src,target) > 2)
+ DIE(target)
+ else
+ CRUSH(target)
+ natural_weapon = initial(natural_weapon)
+ ai_holder.forget_path()
+ ai_holder.set_busy(FALSE)
+ attacking = FALSE
+
+/mob/living/simple_animal/hostile/boss/prime_soul/proc/THY_END_IS_NOW(atom/movable/target)
+ playsound(src, pick('mods/_fd/fd_assets/sounds/prime_soul/Mp_thyend.ogg', 'mods/_fd/fd_assets/sounds/prime_soul/Mp_thyend2.ogg'), 80, 0, extrarange = 13, falloff = 4)
+ ai_holder.set_busy(TRUE)
+ natural_weapon = /obj/item/natural_weapon/punch/minos/snake
+ do_windup_animation(target,7)
+ sleep(7)
+ forceMove(get_step(target,get_dir(target,src)))
+ IAttack(target)
+ do_windup_animation(target,7)
+ sleep(7)
+ forceMove(get_step(target,get_dir(target,src)))
+ IAttack(target)
+ do_windup_animation(target,7)
+ sleep(7)
+ forceMove(get_step(target,get_dir(target,src)))
+ IAttack(target)
+ do_windup_animation(target,7)
+ sleep(7)
+ forceMove(get_step(target,get_dir(target,src)))
+ IAttack(target)
+ natural_weapon = initial(natural_weapon)
+ sleep(10)
+ ai_holder.forget_path()
+ ai_holder.set_busy(FALSE)
+ attacking = FALSE
+
+/mob/living/simple_animal/hostile/boss/prime_soul/proc/DIE(atom/movable/target)
+ ai_holder.set_busy(TRUE)
+ sleep(5)
+ density = FALSE
+ forceMove(get_step(target,get_dir(target,src)))
+ do_crush_animation(10, 160)
+ sleep(6)
+ playsound(src, pick('mods/_fd/fd_assets/sounds/prime_soul/Mp_die.ogg', 'mods/_fd/fd_assets/sounds/prime_soul/Mp_die2.ogg'), 80, 0, extrarange = 13, falloff = 4)
+ ISay("DIE!")
+ sleep(4)
+ explosion(get_turf(src), 3, EX_ACT_LIGHT)
+ density = TRUE
+ sleep(10)
+ ai_holder.forget_path()
+ ai_holder.set_busy(FALSE)
+ attacking = FALSE
+
+/mob/living/simple_animal/hostile/boss/prime_soul/proc/CRUSH(atom/movable/target)
+ ai_holder.set_busy(TRUE)
+ density = FALSE
+ do_crush_animation(10, 160)
+ sleep(6)
+ playsound(src, 'mods/_fd/fd_assets/sounds/prime_soul/Mp_crush.ogg', 80, 0, extrarange = 17, falloff = 4)
+ ISay("CRUSH!")
+ sleep(4)
+ explosion(get_turf(src), 3, EX_ACT_LIGHT)
+ density = TRUE
+ sleep(10)
+ ai_holder.forget_path()
+ ai_holder.set_busy(FALSE)
+ attacking = FALSE
+
+/mob/living/simple_animal/hostile/boss/prime_soul/proc/JUDGEMENT(atom/movable/target)
+ playsound(src, pick('mods/_fd/fd_assets/sounds/prime_soul/Mp_judgement.ogg', 'mods/_fd/fd_assets/sounds/prime_soul/Mp_judgement2.ogg'), 80, 0, extrarange = 13, falloff = 4)
+ ai_holder.set_busy(TRUE)
+ do_windup_animation(target,10)
+ sleep(10)
+ var/rotation_angle
+ switch(get_dir(src, target))
+ if(WEST)
+ rotation_angle = 90
+ if(NORTHWEST)
+ rotation_angle = 90
+ if(SOUTHWEST)
+ rotation_angle = 90
+ if(EAST)
+ rotation_angle = -90
+ if(NORTHEAST)
+ rotation_angle = -90
+ if(SOUTHEAST)
+ rotation_angle = -90
+ if(NORTH)
+ rotation_angle = 180
+ else
+ rotation_angle = 0
+ var/matrix/dropckick = matrix(transform).Update(rotation = rotation_angle)
+ animate(src, transform = dropckick, time = 2)
+ throw_at(target, get_dist(src,target), get_dist(src,target) / 6)
+ face_atom(target)
+ sleep(6)
+ anchored = TRUE
+ explosion(get_step(src,dir), 3, EX_ACT_LIGHT)
+ anchored = FALSE
+ sleep(2)
+ dropckick = matrix(transform).Update(rotation = -rotation_angle)
+ animate(src, transform = dropckick, time = 2)
+ sleep(8)
+ ai_holder.forget_path()
+ ai_holder.set_busy(FALSE)
+ attacking = FALSE
+
+///////////////////////* ATTACK TYPES END *///////////////////////
+
+/mob/living/simple_animal/hostile/boss/prime_soul/Life()
+ ..()
+// var/datum/ai_holder/simple_animal/prime_soul/minos_holder = ai_holder
+ var/target = ai_holder.target
+
+ if(!seen)
+ for(var/mob/living/L in orange(5,src))
+ if(L.key && L.client)
+ seen = TRUE
+ meet_player(L)
+ break
+
+ if(!attacking)
+// if(attack_cooldown >= 1)
+ var/i = 0
+ while(i < 20)
+ if(stamina <= 0 || !target || i >= 19)
+ attacking = FALSE
+ break
+ i++
+ attack_cooldown = 0
+ attacking = TRUE
+ var/pick_attack = pick("PREPARE THYSELF!", "THY END IS NOW!", "DIE!", "JUDGEMENT!")
+ switch(pick_attack)
+ if("PREPARE THYSELF!")
+ if(stamina - 3 < 0)
+ continue
+ stamina-=3
+ ISay(pick_attack)
+ PREPARE_THYSELF(target)
+ break
+ if("THY END IS NOW!")
+ if(stamina - 2 < 0)
+ continue
+ stamina-=2
+ ISay(pick_attack)
+ THY_END_IS_NOW(target)
+ break
+ if("DIE!")
+ if(stamina - 1 < 0)
+ continue
+ stamina-=1
+ if(get_dist(src, target) > 2)
+ DIE(target)
+ else
+ CRUSH(target)
+ break
+ if("JUDGEMENT!")
+ if(stamina - 2 < 0)
+ continue
+ stamina-=2
+ ISay(pick_attack)
+ JUDGEMENT(target)
+ break
+ else
+ ISay("Huh?..")
+ continue // huh???
+// else
+// attack_cooldown++
+
+ if(stamina <= 0)
+ if(health < maxHealth / 2 && !phase_two)
+ playsound(src, 'mods/_fd/fd_assets/sounds/prime_soul/Mp_weak.ogg', 90, 0, extrarange = 13, falloff = 4)
+ ISay("WEAK!")
+ max_stamina = 12
+ phase_two = TRUE
+
+ if(stamina_recharge >= 3)
+ stamina = max_stamina
+ stamina_recharge = 0
+
+ else
+ stamina_recharge++
+
+/mob/living/simple_animal/hostile/boss/prime_soul/New()
+ ..()
+
+/mob/living/simple_animal/hostile/boss/prime_soul/death(gibbed, deathmessage, show_dead_message)
+ if(gibbed)
+ return
+ anchored = TRUE
+ deathscene()
+ ..(gibbed, deathmessage, show_dead_message)
+ set_light(0)
+ qdel(src)
+
+/mob/living/simple_animal/hostile/boss/prime_soul/proc/deathscene()
+ ai_holder.set_busy(TRUE)
+ attacking = TRUE
+ QDEL_NULL(boss_theme)
+ visible_emote("screams")
+ playsound(src, 'mods/_fd/fd_assets/sounds/prime_soul/Mp_outro.ogg', 75, 0, extrarange = 13, falloff = 4)
+ sleep(40)
+ ISay("Forgive me, my children, for I have failed to bring you salvation")
+ sleep(70)
+ ISay("From this cold, dark world...")
+ sleep(50)
+ visible_emote("screams even louder")
+ do_crush_animation(80, 60)
+ playsound(src, 'mods/_fd/fd_assets/sounds/prime_soul/Pinos_death_scream.ogg', 100, 0, extrarange = 13, falloff = 4)
+ set_light(1, 20, 25, 2, l_color = "#f2feff")
+ sleep(55)
+ explosion(get_turf(src), 8, EX_ACT_HEAVY)
+
+// Это - костыль который спасает от кучи жалоб и, технически(?) проблем с смертью
+// С чем связано? DEATH имеет should_not_sleep из-за очереди в удалении.
+// В случае если не сработает и это вызовет кучу багов - вы знаете что резать :3
+
+/mob/living/simple_animal/hostile/boss/prime_soul/Destroy()
+ QDEL_NULL(boss_theme)
+ . = ..()
+
+/mob/living/simple_animal/hostile/boss/prime_soul/Process_Spacemove()
+ return 1
+
+
+/mob/living/simple_animal/hostile/boss/prime_soul/do_attack(atom/A, turf/T)
+ face_atom(A)
+ var/missed = FALSE
+ if (get_dist(src, A) > 1 || (get_dir(src,A) != 0 && get_dir(src,A) != src.dir && get_dir(src,A) != turn(src.dir,45) && get_dir(src,A) != turn(src.dir,-45)))
+ missed = TRUE
+
+ if(missed) // Most likely we have a slow attack and they dodged it or we somehow got moved.
+ playsound(src, 'sound/weapons/punchmiss.ogg', 75, 1)
+ visible_message(SPAN_WARNING("\The [src] misses their attack."))
+ return FALSE
+
+ var/obj/item/natural_weapon/weapon = get_natural_weapon()
+
+ if (weapon.resolve_attackby(A, src))
+ apply_melee_effects(A)
+ else if(istype(A,/mob/living/simple_animal)) //костыль куз я так и не смог разобраться почему оно не хочет резолвить атаку на симплмобов :P
+ apply_melee_effects(A)
+
+ return TRUE
+
+/mob/living/simple_animal/hostile/boss/prime_soul/melee_pre_animation(atom/A)
+ if(attacking)
+ return
+ ..()
+
+/mob/living/simple_animal/hostile/boss/prime_soul/ex_act()
+ return
+
+/datum/ai_holder/simple_animal/prime_soul
+ intelligence_level = AI_SMART
+ retaliate = TRUE // The majority of smart mobs will fight back.
+ hostile = FALSE
+ use_astar = TRUE
+ returns_home = TRUE
+ home_low_priority = TRUE
+ wander = FALSE
+ vision_range = 20
+ destructive = FALSE
+ mauling = TRUE
+ can_breakthrough = TRUE
+ violent_breakthrough = TRUE
+
+/datum/ai_holder/simple_animal/prime_soul/lose_target_position()
+ playsound(holder, 'mods/_fd/fd_assets/sounds/prime_soul/Mp_useless.ogg', 100, 0, extrarange = 13, falloff = 4)
+ ..()
+
+// ANIM
+
+/atom/movable/proc/do_crush_animation(windup_time, fly_alpha)
+ var/default_pixel_x = initial(pixel_x)
+ var/default_pixel_y = initial(pixel_y)
+ var/mob/mob = src
+ if(istype(mob))
+ default_pixel_x = mob.default_pixel_x
+ default_pixel_y = mob.default_pixel_y
+
+ animate(src, pixel_x = pixel_x, pixel_y = pixel_y + 20, alpha = fly_alpha, time = windup_time - windup_time/5)
+ animate(pixel_x = default_pixel_x, pixel_y = default_pixel_y, alpha = 255, time = windup_time/5)
+
+
+// KICK
+
+
+/obj/item/natural_weapon/punch/minos
+ attack_cooldown = 20
+ force = 20
+
+/obj/item/natural_weapon/punch/minos/snake
+ attack_cooldown = 5
+ force = 30
+
+/obj/item/natural_weapon/punch/minos/uppercut
+ attack_cooldown = 5
+ attack_verb = list("uppercutted")
+ force = 45
+
+/obj/item/natural_weapon/kick
+ attack_cooldown = 5
+ attack_verb = list("kicked", "kicked", "kicked", "kneed")
+ force = 30
diff --git a/mods/_fd/fd_assets/eventstuff/admintools.dm b/mods/_fd/fd_assets/eventstuff/admintools.dm
index c76a68324aa81..57726ce29678f 100644
--- a/mods/_fd/fd_assets/eventstuff/admintools.dm
+++ b/mods/_fd/fd_assets/eventstuff/admintools.dm
@@ -1,6 +1,7 @@
+
/datum/controller/subsystem/jobs/check_general_join_blockers(mob/new_player/joining, datum/job/job)
- ..()
- if(check_rights(R_ADMIN) || joining.client.enter_lock_bypass)
+ . = ..()
+ if(check_rights(, show_msg = FALSE) || joining.client.enter_lock_bypass)
return TRUE
/client
@@ -15,13 +16,13 @@
var/client/player = input("Select mob.", "Allow Bypass Entering Lock") as null|anything in GLOB.clients
if(!player.enter_lock_bypass)
player.enter_lock_bypass = 1
- to_chat(player, SPAN_MFAUNA("Высшие силы даровали возможность тебе зайти!"))
+ to_chat(player, FONT_LARGE(SPAN_NOTICE("Высшие силы даровали возможность тебе зайти!")))
if(player.get_preference_value(/datum/client_preference/staff/play_adminhelp_ping) == GLOB.PREF_HEAR)
sound_to(player, sound('sound/ui/pm-notify.ogg', volume = 70))
log_and_message_admins("Игроку [player.ckey] дали возможность зайти в игру.")
else
player.enter_lock_bypass = 0
- to_chat(player, FONT_LARGE(SPAN_MFAUNA("Высшие силы изъяли у тебя возможность зайти!")))
+ to_chat(player, FONT_LARGE(SPAN_NOTICE("Высшие силы изъяли у тебя возможность зайти!")))
log_and_message_admins("У игрока [player.ckey] забрали возможность зайти в игру.")
/client/proc/remove_slot_crew_full() // fully close job slot
diff --git a/mods/_fd/fd_assets/icons/animals/prime_soul.dmi b/mods/_fd/fd_assets/icons/animals/prime_soul.dmi
new file mode 100644
index 0000000000000..6edf1b0879eea
Binary files /dev/null and b/mods/_fd/fd_assets/icons/animals/prime_soul.dmi differ
diff --git a/mods/_fd/fd_assets/icons/overmap.dmi b/mods/_fd/fd_assets/icons/overmap.dmi
new file mode 100644
index 0000000000000..c802d623cd5a2
Binary files /dev/null and b/mods/_fd/fd_assets/icons/overmap.dmi differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Heaven_Pierce_Her-ORDER.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Heaven_Pierce_Her-ORDER.ogg
new file mode 100644
index 0000000000000..b4b6b3c7e59aa
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Heaven_Pierce_Her-ORDER.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_crush.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_crush.ogg
new file mode 100644
index 0000000000000..992be9a84e6e3
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_crush.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_die.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_die.ogg
new file mode 100644
index 0000000000000..6c9635faf8294
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_die.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_die2.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_die2.ogg
new file mode 100644
index 0000000000000..b190db8d39ab1
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_die2.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_intro2.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_intro2.ogg
new file mode 100644
index 0000000000000..0a6f862140224
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_intro2.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_judgement.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_judgement.ogg
new file mode 100644
index 0000000000000..b78e1d96231ef
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_judgement.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_judgement2.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_judgement2.ogg
new file mode 100644
index 0000000000000..309b79a26f015
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_judgement2.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_outro.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_outro.ogg
new file mode 100644
index 0000000000000..1425915cd18f5
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_outro.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_prepare.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_prepare.ogg
new file mode 100644
index 0000000000000..f3191bd3cd932
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_prepare.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_prepare2.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_prepare2.ogg
new file mode 100644
index 0000000000000..a2d704524ab7f
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_prepare2.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_thyend.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_thyend.ogg
new file mode 100644
index 0000000000000..62050e92b361f
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_thyend.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_thyend2.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_thyend2.ogg
new file mode 100644
index 0000000000000..bd797bdc5f580
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_thyend2.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_useless.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_useless.ogg
new file mode 100644
index 0000000000000..e6f5c11eeaa2a
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_useless.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Mp_weak.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Mp_weak.ogg
new file mode 100644
index 0000000000000..58eb0059e23ac
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Mp_weak.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/Pinos_death_scream.ogg b/mods/_fd/fd_assets/sounds/prime_soul/Pinos_death_scream.ogg
new file mode 100644
index 0000000000000..527e1d8ffbbbb
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/Pinos_death_scream.ogg differ
diff --git a/mods/_fd/fd_assets/sounds/prime_soul/intro_music.ogg b/mods/_fd/fd_assets/sounds/prime_soul/intro_music.ogg
new file mode 100644
index 0000000000000..bf908f2aaffca
Binary files /dev/null and b/mods/_fd/fd_assets/sounds/prime_soul/intro_music.ogg differ
diff --git a/mods/_fd/junk_heaven/code/intel_gathering/old_terminal.dm b/mods/_fd/junk_heaven/code/intel_gathering/old_terminal.dm
index c07c5a2e9db1f..ae28fd7810dbe 100644
--- a/mods/_fd/junk_heaven/code/intel_gathering/old_terminal.dm
+++ b/mods/_fd/junk_heaven/code/intel_gathering/old_terminal.dm
@@ -60,7 +60,7 @@
/obj/structure/intel_console/use_tool(obj/item/I, mob/living/user)
SHOULD_CALL_PARENT(FALSE)
- if(state == 3 && istype(I, /obj/item/stack/material/glass/))
+ if(state == 3 && istype(I, /obj/item/stack/material/glass))
var/obj/item/stack/material/glass/guass = I
if(guass.amount <= 5)
to_chat(user, "У вас недостаточно материалов! Для починки экрана понадобится минимум 5 единиц стекла!")
@@ -82,7 +82,7 @@
state = 1
update_icon()
if(state == 1)
- if(powerless == TRUE && istype(I, /obj/item/cell/))
+ if(powerless == TRUE && istype(I, /obj/item/cell))
if(do_after(user, 30))
powerless = FALSE
to_chat(user, "Вы аккуратно вставляете внутрь батарею...")
diff --git a/mods/_fd/old_space_cannons/code/overmap_projectile.dm b/mods/_fd/old_space_cannons/code/overmap_projectile.dm
index 0b44fbefab27f..005e1b4f020f6 100644
--- a/mods/_fd/old_space_cannons/code/overmap_projectile.dm
+++ b/mods/_fd/old_space_cannons/code/overmap_projectile.dm
@@ -1,5 +1,6 @@
/obj/overmap/projectile
name = "projectile"
+ icon = 'mods/_fd/fd_assets/icons/overmap.dmi'
icon_state = "projectile_danger"
scannable = FALSE