diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 6324c5fb02d..f3d693f8385 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -358,7 +358,7 @@
"agT" = (/obj/machinery/door/airlock/glass_security{name = "Long-Term Cell 2"; req_access_txt = "2"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"agU" = (/obj/machinery/door/airlock/glass_security{name = "Long-Term Cell 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"agV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Insanity Ward"; req_access_txt = "2"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prison)
-"agW" = (/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
+"agW" = (/obj/vehicle/secway,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
"agX" = (/obj/machinery/alarm{pixel_y = 28},/obj/structure/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/clothing/suit/armor/laserproof,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
"agY" = (/obj/structure/closet/secure_closet{name = "contraband locker"; req_access_txt = "3"},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
"agZ" = (/obj/structure/table/woodentable,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/machinery/keycard_auth{pixel_x = -26; pixel_y = 23},/obj/machinery/door_control{id = "hosspace"; name = "Space Shutters Control"; pixel_x = -26; pixel_y = 34},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
@@ -558,7 +558,7 @@
"akL" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Armory APC"; pixel_x = 1; pixel_y = -24},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/light,/obj/machinery/camera/motion{c_tag = "Armory - Internal"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/warden)
"akM" = (/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/warden)
"akN" = (/turf/simulated/floor/plasteel{tag = "icon-vault (SOUTHWEST)"; icon_state = "vault"; dir = 10},/area/security/warden)
-"akO" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
+"akO" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/item/key/security,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
"akP" = (/obj/machinery/disposal,/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/obj/machinery/light_switch{pixel_x = -24; pixel_y = -20},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching certain areas."; dir = 1; name = "Head of Security's Monitor"; network = list("Prison","MiniSat","tcomm"); pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/hos)
"akQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/hos)
"akR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/carpet,/area/security/hos)
@@ -1050,7 +1050,7 @@
"auj" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"auk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aul" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aum" = (/obj/machinery/door/airlock/maintenance{icon = 'icons/obj/doors/doorint.dmi'; name = "Brig Emergency Storage"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/brig)
+"aum" = (/obj/machinery/door/airlock/maintenance{icon = 'icons/obj/doors/Doorint.dmi'; name = "Brig Emergency Storage"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/brig)
"aun" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel,/area/security/podbay)
"auo" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
"aup" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
@@ -2101,7 +2101,7 @@
"aOu" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"aOv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/quartermaster/storage)
"aOw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"; tag = "loading"},/area/quartermaster/storage)
-"aOx" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "QM #1"},/mob/living/simple_animal/bot/mulebot{home_destination = "QM #1"; suffix = "#1"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window/northleft,/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/storage)
+"aOx" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "QM #1"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window/northleft,/obj/machinery/light{dir = 4},/mob/living/simple_animal/bot/mulebot{home_destination = "QM #1"; suffix = "#1"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/storage)
"aOy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;63;48;50"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aOz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;63;48;50"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aOA" = (/turf/simulated/wall,/area/storage/primary)
@@ -3353,7 +3353,7 @@
"bmy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/junction{dir = 2; icon_state = "pipe-j1"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"bmz" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "browncorner"},/area/hallway/primary/port)
"bmA" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/hallway/primary/port)
-"bmB" = (/obj/machinery/power/apc{dir = 8; name = "Custodial Closet APC"; pixel_x = -24},/obj/structure/table,/obj/item/clothing/gloves/color/orange,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
+"bmB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/reagent_dispensers/spacecleanertank{pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/janitor)
"bmC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/lizard{name = "Wags-His-Tail"; real_name = "Wags-His-Tail"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
"bmD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/landmark/start{name = "Janitor"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
"bmE" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/mop,/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
@@ -3368,7 +3368,7 @@
"bmN" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/engine/chiefs_office)
"bmO" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"bmP" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/clipboard,/obj/item/weapon/paper/monitorkey,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/engine/chiefs_office)
-"bmQ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/reagent_dispensers/spacecleanertank{pixel_y = 30},/turf/simulated/floor/plasteel,/area/janitor)
+"bmQ" = (/obj/machinery/power/apc{dir = 8; name = "Custodial Closet APC"; pixel_x = -24},/obj/structure/table,/obj/item/clothing/gloves/color/orange,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/item/key/janitor,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
"bmR" = (/obj/structure/table/woodentable,/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 1},/obj/machinery/photocopier/faxmachine{department = "Captain's Office"},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bmS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bmT" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/bridge)
@@ -3452,7 +3452,7 @@
"bot" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/hallway/primary/port)
"bou" = (/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
"bov" = (/obj/structure/janitorialcart,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
-"bow" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/light/small,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plating,/area/janitor)
+"bow" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/light/small,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/obj/vehicle/janicart,/turf/simulated/floor/plating,/area/janitor)
"box" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
"boy" = (/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"boz" = (/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
@@ -5049,7 +5049,7 @@
"bTe" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "MiniSat Exterior Aft-Starboard"; dir = 4; network = list("MiniSat")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bTf" = (/obj/structure/table/reinforced,/obj/item/device/flashlight,/obj/item/device/radio,/obj/machinery/camera{c_tag = "Engineering Equipment East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"bTg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"bTh" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
+"bTh" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bTi" = (/obj/item/stack/sheet/cardboard,/obj/item/device/flashlight,/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
"bTj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"bTk" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
@@ -8106,7 +8106,7 @@
"cZT" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"cZU" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"cZV" = (/obj/item/weapon/cigbutt,/turf/simulated/shuttle/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"cZW" = (/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot"; pixel_x = -3; pixel_y = 2},/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4; pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3; pixel_y = 3},/obj/item/weapon/lazarus_injector,/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape)
+"cZW" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4; pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3; pixel_y = 3},/obj/item/weapon/lazarus_injector,/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot"; pixel_x = -3; pixel_y = 2},/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape)
"cZX" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #1"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio3"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZY" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #1"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8581,9 +8581,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccbdQbccaWDbccbdRbccbcdbcebdSbdTbccbdRbccbdUbdVbdWbdXapfapfapfapfakzakzakzapfapfapfaZtbdYbdZbdZbdZbdZbeaaRobebbecbedbeeaYnaYnaYnaYnbefapfapfbegapfapfbehbeibejbekbelbembenbekbelbeobepbembeqbekbekbekbelbekbekberbesbekbekbekbekbekbekbekbetbeubekbekbenbevbewbekbekbekbekbexbeybezbezbezbeAbezbezbezaoGbmMaoGaGWaoGaoGbeCbeCbeCbeCbeDbeEbeEbeFbeGbeHbambeIbeJbeKbmNbeMbeNbambeObePbeQbdEbeRbeSbeTbdEbeUaCgaCgaCgaCgaCgaCgaCgbeVaCgaCgaCgaCgaCgaLwaCgabqarBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabearBarBarBarBarBarBarBarBaWvaXIaXOaaaaXLbdIbdLbeWbeXbeYbeZbfabeXbfbbdLbdPaXLaaaaZhaXIaXObfcbfcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccabqaaaabqaaabccbfdbccbfebfebffbfgbccbfdbccbccaWDbfhbfibfjavTavUbfkavUbflavUbfmbfnavVbfobfpbfqbfqbfrbfsbftbfubfvbfwbfxbfybfwbfzbfAbfwbfBbfCbfDbfEbfFbfGbfHbfIbfJbfKbfKbfLbfMbfNbfObfPbfQbfRbfSbfSbfSbfSbfSbfSbfSbfTbfUbfVbfVbfVbfVbfVbfVbfVbfVbfWbfXbfYbfZbfVbgabfWbfVbfVbgbbgcbgdbezbgebgfbggbghbgibezbgjbmOaoGbglaoGaaabeCbgmbgnbeCbgobgpbgqbgrbgsbgtbambgubgvbgwbgxbmPbgzbambgAbgBbgCbdEbgDbgEbgFbdEbgGaOdaOdbgHaOdbgIaOdaOdaOdbgJaOdbgKbgLbgKbgLaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaUVbgMaXIaXOaaaaXLbdIbgNbgObdIbgPbgQbgRbdIbgSbgTbdPaXLaaaaZhaXIbgUaaabfcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqaaabccbdRbccbccbccbccbccbccbdRbccaaaaWDbgVbgWbgXbgXbgXbgXbgXbgXbgXbgXbgYbgZbfwbfwbhabhbbhabfwbfwbfwbhcbfwbhdbhebhfbhgbhhbhibhjbhkbhlbhmbhnbfGbhobfIbhpblhbhqbhrbhqbhsbhqbhtbhubhtbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhwbhwbhxbhwbhwbhwbhwbhwbrNbhybfIbhzbezbhAbhBbhCbhDbhEbezbhFbhGaoGaGWaoHaaabhHbhIbhJbhKbhLbhMbhNbhObhPbhQbambhRbhSbhTbhTbhUbhVbambhWbhXbhWbdEbhYbhZbiabdEbibaCgaCgaCgaCgaCgaCgaCgaCgaCgaHjaCgaCgbdFaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqarBbicbidbiebifaXLaXLaXLbdIbigbihbiibdIbdIbdIbijbikbilbdPaXLaXLaXLbimaWBaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobipbiobiqbiobiobiqbiobipbirbisaWDbgVbitbiubivbiwbixbiybizbiAbgXbiBbiCbiDbiEbiFbiGbiFbiGbiHbiGbiIbfwbiJbiKbiLbiMbiNbiObiPbiQbiRbiSbiTbiUbiVbiWbiXbhqbiYbiZbjabmQbhqbjcbjdbjeabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqbhwbjfbjgbjhbjibjjbjkbjlbhwbjmbjnbjobezbjpbjqbjrbjsbjtbezaoGaoGaoGbjuaoGaaabeCbjvbjwbeCbjxbjybjzbjAbjBbjCbambjDbjEbjFbjGbjHbjIbamaFRbjJaFRbdEbjKbjLbjMbdEdeWavPdfadfcdfbdfdasXdfeanqanqaaaaaaaCgbgLaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaUUaUUbjObjPaXIbjQbjRaaaaaaaXLbjSbjTbjUbdIbdIbjVbdIbdIbgSbjWbjXaXLaaaaaabjYaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobipbiobiqbiobiobiqbiobipbirbisaWDbgVbitbiubivbiwbixbiybizbiAbgXbiBbiCbiDbiEbiFbiGbiFbiGbiHbiGbiIbfwbiJbiKbiLbiMbiNbiObiPbiQbiRbiSbiTbiUbiVbiWbiXbhqbiYbiZbjabmBbhqbjcbjdbjeabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqbhwbjfbjgbjhbjibjjbjkbjlbhwbjmbjnbjobezbjpbjqbjrbjsbjtbezaoGaoGaoGbjuaoGaaabeCbjvbjwbeCbjxbjybjzbjAbjBbjCbambjDbjEbjFbjGbjHbjIbamaFRbjJaFRbdEbjKbjLbjMbdEdeWavPdfadfcdfbdfdasXdfeanqanqaaaaaaaCgbgLaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaUUaUUbjObjPaXIbjQbjRaaaaaaaXLbjSbjTbjUbdIbdIbjVbdIbdIbgSbjWbjXaXLaaaaaabjYaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobiobjZbkabkbbkcbkdbkebkfbkgbkhbkbbkibkjbccbgVbgWbkkbklbkmbknbkobkpbkqbkrbksbktbkubkvbkvbkwbkxbkybfwbfwbfwbfwbkzbkAbkBbkCbkDbhabkEbhkbhlbkFbkGbkHbkIbfIbkJbhqbkKbkLbkMbkNbkObkPbkQbkRabqabqbkSbkTbkUbkVbkWbkXbkTbkVbkWbkXbkUbkUbkYabqabqbhwbmRblablbblcblbbldblebhwblfbfIblgbwlbezblibljblkbezbezbllblmaoGblnaoGblobeCbeCbeCbeCbbHbbHbbHblpblqbbHbambambambambamblrblsbambltblubltbdEblvblwblxbdEdffdfhdfgdfgdfjdfkdfkdfkdflabqaaaaaaaaaaefaaaabqaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaabqabqaefblDblEblFblEblGaXOaaaaaaaaaaXLblHbdLblIblJblKblLblMblJblNbdLbdPaXLaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablOblPblQblRbkbblSblTblSblTblSblTblSbkbblUblVbccbgVblWbgXblXblYblZbmabmbbmcbgXbmdbmebmfbmgbmhbmibmjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbmxbmybmzbmAbiVbfIbmSbhqbmBbmCbmDbmEbhqbmFbmGbjeabqabqbmHboBbopbpVboHbqfbqdbqhbqgbqkbqjbqlbmTabqabqbhwbmUbmVbmWbmXbmYbmZbnabhwbhybnbbncbndbnebnfbnebngbnhbnibnebnebnebnjbnebnkbnlbnmbnnbnebnebnobnkbngbnjbnpbnqbnobnrbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnDdfpdfmdftdfqdfxdfudfydeZaoNdflabqaaaaaaaaaaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaefblDblEbnKblEbnLaXOaaaaaaaaaaXLbnMbnNbdJbnObnPbnQbnRbnSbnTbdIbrQaXLaXLaXLaXLbnUaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablOblPblQblRbkbblSblTblSblTblSblTblSbkbblUblVbccbgVblWbgXblXblYblZbmabmbbmcbgXbmdbmebmfbmgbmhbmibmjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbmxbmybmzbmAbiVbfIbmSbhqbmQbmCbmDbmEbhqbmFbmGbjeabqabqbmHboBbopbpVboHbqfbqdbqhbqgbqkbqjbqlbmTabqabqbhwbmUbmVbmWbmXbmYbmZbnabhwbhybnbbncbndbnebnfbnebngbnhbnibnebnebnebnjbnebnkbnlbnmbnnbnebnebnobnkbngbnjbnpbnqbnobnrbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnDdfpdfmdftdfqdfxdfudfydeZaoNdflabqaaaaaaaaaaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaefblDblEbnKblEbnLaXOaaaaaaaaaaXLbnMbnNbdJbnObnPbnQbnRbnSbnTbdIbrQaXLaXLaXLaXLbnUaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUblVbccbnWbnXbnYbnZboabobbocbobbiubiubodboebhcbfwbofbogbohboibojbokbolbfwbombonbojbkCboobfwbrXboqborbosbotbiUbkIbfIbkJbhqboubovbowboxbhqboybozbjebkWboAbkWbsbboCboDboEboDboFboDboEboDboGbscbkWboAbkWbhwboIboIboIboJboKboLboMbhwboNboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbphbpibpibpjbpkbpibpidfzdfBdfAdfGdfDdfIdfHdfKdfJdgddfLdgKazDabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbjRbjRbjObpsaXIaXOaaaaaaaaaaXLaXLblHbdIbdIbdIbptbdIbdIbdIbdIbsebsdbsfaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablObpwbpxblRbkbblSblTblSblTblSblTblSbkbblUblVbccbpybpzbpAbpBbpCbpDbpDbpEbpFbpBbpGbpHbpIbfwbpJbpKbpLbpMbpNbpObpPbfwbpQbpRbpSbpTbpUbfwbsibpWbpXbpYbpZbfGbqabjnbqbbqcbqcbqcbqcbqcbhtbtPbqebhtbkWbtSbtRbtTboEboEboEboEbqiboEboEboEboEbtZbtYbubbkWbqmbqnbqobqpbqqbqrbqrbqsbhwbqtbqubqvbqwbqxbqybqxbqzbqxbqAbqxbqxbqBbqxbqxbqCbqDbqxbqEbqBbqFbqGbqCbqHbqxbqIbqJbqKbqLbqMbqNbqObqPbqQbqRbpnbqSbqSbqTdgMdgLdgOdgNdgPanqanqanqanqanqanqanqanqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaabqYbqZbrabrbbrcbrdbrebrfaXIaXLaXLaXLaXLaXLbrgbrhbrgbrgbribrjbribrkbrkbrlbrmbrnbudaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibrubccbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGbhabrHbrIbfwbfwbfwbfwbfwbhabrJbrKbfwbfwbiUbrLbrMbiUbiUbzObehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVbrWburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbZibsnbsobsnbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbThaoGaoGaoGbstaoGbsubsvbswbsxbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaabqYbsMbsNaaaabqbsObsPbsQbsRbsSbsTbrgbsUbsVbsWbsXbsYbsZbrgbtabtbbtcbtdbtebtfbtfbtgaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 1ed7089ef1b..30c71a46a64 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -226,7 +226,7 @@
"aer" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Brig Prison Hallway"; dir = 4; network = list("Prison","SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
"aes" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior South"; dir = 8; network = list("SS13")},/turf/space,/area/security/permabrig)
"aet" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/gun/energy/advtaser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/advtaser{pixel_x = 0; pixel_y = 0},/obj/item/weapon/gun/energy/advtaser{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"aeu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/southeast,/obj/structure/stool/bed/chair/janicart/secway,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"aeu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/southeast,/obj/vehicle/secway,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
"aev" = (/obj/structure/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"aew" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
"aex" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
@@ -5238,7 +5238,7 @@
"bWL" = (/obj/structure/closet/jcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/janitor)
"bWM" = (/obj/structure/closet/l3closet/janitor,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/janitor)
"bWN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/newscaster{pixel_y = 30},/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel,/area/janitor)
-"bWO" = (/obj/machinery/camera{c_tag = "Custodial Closet"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/stool/bed/chair/janicart,/turf/simulated/floor/plasteel,/area/janitor)
+"bWO" = (/obj/vehicle/janicart,/turf/simulated/floor/plasteel,/area/janitor)
"bWP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/janitor)
"bWQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/reagent_dispensers/spacecleanertank{pixel_y = 30},/turf/simulated/floor/plasteel,/area/janitor)
"bWR" = (/obj/machinery/door/window/westleft{name = "Janitoral Delivery"; req_access_txt = "26"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/janitor)
@@ -5246,7 +5246,7 @@
"bWT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bWU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/paramedic)
"bWV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
-"bWW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/vehicle/train/ambulance/engine,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
+"bWW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/vehicle/ambulance,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
"bWX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door_control{id = "paramedic"; name = "Garage Door Control"; pixel_x = -1; pixel_y = 24; req_access_txt = "66"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
"bWY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/effect/landmark/start{name = "Paramedic"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
"bWZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
@@ -5333,7 +5333,7 @@
"bYC" = (/obj/item/weapon/mop,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/janitor)
"bYD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bYE" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
-"bYF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/vehicle/train/ambulance/trolley,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
+"bYF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/amb_trolley,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
"bYG" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
"bYH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
"bYI" = (/obj/structure/closet/secure_closet/paramedic,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 59a34b56436..2bcdfdd6894 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -525,8 +525,8 @@ var/list/turret_icons
for(var/obj/spacepod/SP in view(7,src))
assess_and_assign(SP.occupant, targets, secondarytargets)
- for(var/obj/vehicle/train/T in view(7,src))
- assess_and_assign(T.load, targets, secondarytargets)
+ for(var/obj/vehicle/T in view(7,src))
+ assess_and_assign(T.buckled_mob, targets, secondarytargets)
for(var/mob/living/C in view(7,src)) //loops through all living lifeforms in view
assess_and_assign(C, targets, secondarytargets)
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 9f8c92b6255..e51ea6eb3ac 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -1,219 +1,3 @@
-//old style PIMP-CART
-/obj/structure/stool/bed/chair/janicart
- name = "janicart"
- desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "pussywagon"
- anchored = 0
- density = 1
- var/obj/item/weapon/storage/bag/trash/mybag = null
- var/callme = "pimpin' ride" //how do people refer to it?
- var/move_delay = 0
- var/floorbuffer = 0
- var/keytype = /obj/item/key/janitor
-
-/obj/structure/stool/bed/chair/janicart/New()
- handle_rotation()
-
-/obj/structure/stool/bed/chair/janicart/Move(a, b, flag)
- ..()
- if(floorbuffer)
- var/turf/tile = loc
- if(isturf(tile))
- tile.clean_blood()
- if (istype(tile, /turf/simulated/floor))
- var/turf/simulated/floor/F = tile
- F.dirt = 0
- for(var/A in tile)
- if(istype(A, /obj/effect))
- if(is_cleanable(A))
- qdel(A)
-
-/obj/structure/stool/bed/chair/janicart/examine(mob/user)
- ..()
- if(floorbuffer)
- to_chat(user, "It has been upgraded with a floor buffer.")
-
-
-/obj/structure/stool/bed/chair/janicart/attackby(obj/item/I, mob/user, params)
- if(istype(I, keytype))
- to_chat(user, "Hold [I] in one of your hands while you drive this [callme].")
- else if(istype(I, /obj/item/weapon/storage/bag/trash))
- if(keytype == /obj/item/key/janitor)
- if(!user.drop_item())
- return
- to_chat(user, "You hook the trashbag onto the [callme].")
- I.loc = src
- mybag = I
- else if(istype(I, /obj/item/janiupgrade))
- if(keytype == /obj/item/key/janitor)
- floorbuffer = 1
- qdel(I)
- to_chat(user, "You upgrade the [callme] with the floor buffer.")
- update_icon()
-
-/obj/structure/stool/bed/chair/janicart/update_icon()
- overlays.Cut()
- if(mybag)
- overlays += "cart_garbage"
- if(floorbuffer)
- overlays += "cart_buffer"
-
-/obj/structure/stool/bed/chair/janicart/attack_hand(mob/user)
- if(mybag)
- mybag.loc = get_turf(user)
- user.put_in_hands(mybag)
- mybag = null
- update_icon()
- else
- ..()
-
-
-/obj/structure/stool/bed/chair/janicart/relaymove(mob/user, direction)
- if(user.stat || user.stunned || user.weakened || user.paralysis)
- unbuckle_mob()
- if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype))
- if(!Process_Spacemove(direction) || !has_gravity(src.loc) || move_delay || !isturf(loc))
- return
- step(src, direction)
- update_mob()
- handle_rotation()
- if(istype(src.loc, /turf/simulated))
- var/turf/simulated/T = src.loc
- if(T.wet == TURF_WET_LUBE) //Lube! Fall off!
- playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
- buckled_mob.Stun(7)
- buckled_mob.Weaken(7)
- unbuckle_mob()
- step(src, dir)
- move_delay = 1
- spawn(2)
- move_delay = 0
- else
- to_chat(user, "You'll need the keys in one of your hands to drive this [callme].")
-
-/obj/structure/stool/bed/chair/janicart/Bump(atom/A)
- if(buckled_mob && istype(A, /obj/machinery/door))
- A.Bumped(buckled_mob)
-
-/obj/structure/stool/bed/chair/janicart/user_buckle_mob(mob/living/M, mob/user)
- if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated
- return
- for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf.
- if(A.density)
- if(A != src && A != M)
- return
- M.loc = loc //we move the mob on the janicart's turf before checking if we can buckle.
- ..()
- update_mob()
-
-/obj/structure/stool/bed/chair/janicart/unbuckle_mob()
- if(buckled_mob)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 0
- ..()
-
-/obj/structure/stool/bed/chair/janicart/handle_rotation()
- if((dir == SOUTH) || (dir == WEST) || (dir == EAST))
- layer = FLY_LAYER
- else
- layer = OBJ_LAYER
-
- if(buckled_mob)
- if(buckled_mob.loc != loc)
- buckled_mob.buckled = null //Temporary, so Move() succeeds.
- buckled_mob.buckled = src //Restoring
-
- update_mob()
-
-
-/obj/structure/stool/bed/chair/janicart/proc/update_mob()
- if(buckled_mob)
- buckled_mob.dir = dir
- switch(dir)
- if(SOUTH)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 7
- if(WEST)
- buckled_mob.pixel_x = 12
- buckled_mob.pixel_y = 7
- if(NORTH)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 4
- if(EAST)
- buckled_mob.pixel_x = -12
- buckled_mob.pixel_y = 7
-
-/obj/structure/stool/bed/chair/janicart/bullet_act(obj/item/projectile/Proj)
- if(buckled_mob)
- buckled_mob.bullet_act(Proj)
-
-/obj/item/key
- name = "key"
- desc = "A small grey key."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "key"
- w_class = 1
-
-/obj/item/key/janitor
- desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"."
- icon_state = "keyjanitor"
-
-/obj/item/key/security
- desc = "A keyring with a small steel key, and a rubber stun baton accessory."
- icon_state = "keysec"
-
-/obj/item/key/ambulance
- name = "ambulance key"
- desc = "A keyring with a small steel key, and tag with a red cross on it."
- icon_state = "keydoc"
-
-/obj/item/key/snowmobile
- name = "snowmobile key"
- desc = "A keyring with a small steel key, and tag with a red cross on it; clearly it's not implying you're going to the hospital for this..."
- icon_state = "keydoc" //get a better icon, sometime.
-
-/obj/item/janiupgrade
- name = "floor buffer upgrade"
- desc = "An upgrade for mobile janicarts."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "upgrade"
-
-/obj/structure/stool/bed/chair/janicart/secway
- name = "secway"
- desc = "A brave security cyborg gave its life to help you look like a complete tool."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "secway"
- callme = "secway"
- keytype = /obj/item/key/security
-
-/obj/structure/stool/bed/chair/janicart/secway/update_mob()
- if(buckled_mob)
- buckled_mob.dir = dir
- buckled_mob.pixel_y = 4
-
-
-/obj/structure/stool/bed/chair/janicart/ambulance
- name = "ambulance"
- desc = "For getting to patients in a hurry--or running them over."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "docwagon"
- callme = "ambulance"
- keytype = /obj/item/key/ambulance
-
-/obj/structure/stool/bed/chair/janicart/secway/snowmobile
- name = "red snowmobile"
- desc = "Wheeeeeeeeeeee."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "snowmobile"
- callme = "snowmobile"
-
-/obj/structure/stool/bed/chair/janicart/secway/snowmobile/blue
- name = "blue snowmobile"
- icon_state = "bluesnowmobile"
-
-////////////////////////////////////////////////////////////////////////////////////////////////
-
//TG style Janicart
/obj/structure/janitorialcart
diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm
new file mode 100644
index 00000000000..526b1e2c0a9
--- /dev/null
+++ b/code/modules/vehicle/ambulance.dm
@@ -0,0 +1,55 @@
+/obj/vehicle/ambulance
+ name = "ambulance"
+ desc = "what the paramedic uses to run over people to take to medbay."
+ icon_state = "docwagon2"
+ keytype = /obj/item/key/ambulance
+ var/obj/structure/stool/bed/amb_trolley/bed = null
+
+
+/obj/item/key/ambulance
+ name = "ambulance key"
+ desc = "A keyring with a small steel key, and tag with a red cross on it."
+ icon_state = "keydoc"
+
+
+/obj/vehicle/ambulance/handle_vehicle_offsets()
+ ..()
+ if(buckled_mob)
+ switch(buckled_mob.dir)
+ if(SOUTH)
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 7
+ if(WEST)
+ buckled_mob.pixel_x = 13
+ buckled_mob.pixel_y = 7
+ if(NORTH)
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 4
+ if(EAST)
+ buckled_mob.pixel_x = -13
+ buckled_mob.pixel_y = 7
+
+/obj/vehicle/ambulance/Move(newloc, Dir)
+ var/oldloc = loc
+ . = ..()
+ if(bed && get_dist(oldloc, loc) <= 2)
+ bed.Move(oldloc)
+ bed.dir = Dir
+ bed.buckled_mob.dir = Dir
+
+/obj/structure/stool/bed/amb_trolley
+ name = "ambulance train trolley"
+ icon = 'icons/vehicles/CargoTrain.dmi'
+ icon_state = "ambulance"
+ anchored = 0
+
+/obj/structure/stool/bed/amb_trolley/MouseDrop(obj/over_object as obj)
+ ..()
+ if(istype(over_object, /obj/vehicle/ambulance))
+ var/obj/vehicle/ambulance/amb = over_object
+ if(amb.bed)
+ amb.bed = null
+ to_chat(usr, "You unhook the bed to the ambulance.")
+ else
+ amb.bed = src
+ to_chat(usr, "You hook the bed to the ambulance.")
\ No newline at end of file
diff --git a/code/modules/vehicle/atv.dm b/code/modules/vehicle/atv.dm
new file mode 100644
index 00000000000..d4a843b80bf
--- /dev/null
+++ b/code/modules/vehicle/atv.dm
@@ -0,0 +1,80 @@
+/obj/vehicle/atv
+ name = "all-terrain vehicle"
+ desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-earth technologies that are still relevant on most planet-bound outposts."
+ icon = 'icons/vehicles/4wheeler.dmi'
+ icon_state = "fourwheel"
+ keytype = /obj/item/key
+ generic_pixel_x = 0
+ generic_pixel_y = 4
+ vehicle_move_delay = 1
+ var/static/image/atvcover = null
+
+
+/obj/vehicle/atv/New()
+ ..()
+ if(!atvcover)
+ atvcover = image("icons/vehicles/4wheeler.dmi", "4wheeler_north")
+ atvcover.layer = MOB_LAYER + 0.1
+
+
+obj/vehicle/atv/post_buckle_mob(mob/living/M)
+ if(buckled_mob)
+ overlays += atvcover
+ else
+ overlays -= atvcover
+
+
+/obj/vehicle/atv/handle_vehicle_layer()
+ if(dir == SOUTH)
+ layer = MOB_LAYER+0.1
+ else
+ layer = OBJ_LAYER
+
+
+//TURRETS!
+/obj/vehicle/atv/turret
+ var/obj/machinery/gun_turret/vehicle_turret/turret = null
+
+
+/obj/machinery/gun_turret/vehicle_turret
+ name = "mounted turret"
+ scan_range = 7
+ density = 0
+
+
+/obj/vehicle/atv/turret/New()
+ ..()
+ turret = new(loc)
+ //turret.base = src
+
+
+/obj/vehicle/atv/turret/handle_vehicle_layer()
+ if(dir == SOUTH)
+ layer = MOB_LAYER+0.1
+ else
+ layer = OBJ_LAYER
+
+ if(turret)
+ if(dir == NORTH)
+ turret.layer = MOB_LAYER+0.1
+ else
+ turret.layer = OBJ_LAYER
+
+
+/obj/vehicle/atv/turret/handle_vehicle_offsets()
+ ..()
+ if(turret)
+ turret.loc = loc
+ switch(dir)
+ if(NORTH)
+ turret.pixel_x = 0
+ turret.pixel_y = 4
+ if(EAST)
+ turret.pixel_x = -12
+ turret.pixel_y = 4
+ if(SOUTH)
+ turret.pixel_x = 0
+ turret.pixel_y = 4
+ if(WEST)
+ turret.pixel_x = 12
+ turret.pixel_y = 4
\ No newline at end of file
diff --git a/code/modules/vehicle/janicart.dm b/code/modules/vehicle/janicart.dm
new file mode 100644
index 00000000000..dfdd0ffc03c
--- /dev/null
+++ b/code/modules/vehicle/janicart.dm
@@ -0,0 +1,95 @@
+//PIMP-CART
+/obj/vehicle/janicart
+ name = "janicart (pimpin' ride)"
+ desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility."
+ icon_state = "pussywagon"
+ keytype = /obj/item/key/janitor
+ var/obj/item/weapon/storage/bag/trash/mybag = null
+ var/floorbuffer = 0
+
+
+/obj/vehicle/janicart/handle_vehicle_offsets()
+ ..()
+ if(buckled_mob)
+ switch(buckled_mob.dir)
+ if(NORTH)
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 4
+ if(EAST)
+ buckled_mob.pixel_x = -12
+ buckled_mob.pixel_y = 7
+ if(SOUTH)
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 7
+ if(WEST)
+ buckled_mob.pixel_x = 12
+ buckled_mob.pixel_y = 7
+
+
+/obj/item/key/janitor
+ desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"."
+ icon_state = "keyjanitor"
+
+
+/obj/item/janiupgrade
+ name = "floor buffer upgrade"
+ desc = "An upgrade for mobile janicarts."
+ icon = 'icons/obj/vehicles.dmi'
+ icon_state = "upgrade"
+
+
+/obj/vehicle/janicart/Move(atom/OldLoc, Dir)
+ ..()
+ if(floorbuffer)
+ var/turf/tile = loc
+ if(isturf(tile))
+ tile.clean_blood()
+ if(istype(tile, /turf/simulated/floor))
+ var/turf/simulated/floor/F = tile
+ F.dirt = 0
+ for(var/A in tile)
+ if(is_cleanable(A))
+ qdel(A)
+
+
+
+/obj/vehicle/janicart/examine(mob/user)
+ ..()
+ if(floorbuffer)
+ to_chat(user, "It has been upgraded with a floor buffer.")
+
+
+/obj/vehicle/janicart/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/storage/bag/trash))
+ if(keytype == /obj/item/key/janitor)
+ if(!user.drop_item())
+ return
+ to_chat(user, "You hook the trashbag onto \the [name].")
+ I.loc = src
+ mybag = I
+ else if(istype(I, /obj/item/janiupgrade))
+ if(keytype == /obj/item/key/janitor)
+ floorbuffer = 1
+ qdel(I)
+ to_chat(user,"You upgrade \the [name] with the floor buffer.")
+ update_icon()
+
+ ..()
+
+
+/obj/vehicle/janicart/update_icon()
+ overlays.Cut()
+ if(mybag)
+ overlays += "cart_garbage"
+ if(floorbuffer)
+ overlays += "cart_buffer"
+
+
+/obj/vehicle/janicart/attack_hand(mob/user)
+ if(..())
+ return 1
+ else if(mybag)
+ mybag.loc = get_turf(user)
+ user.put_in_hands(mybag)
+ mybag = null
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/vehicle/motorcycle.dm b/code/modules/vehicle/motorcycle.dm
new file mode 100644
index 00000000000..3bcf98f2164
--- /dev/null
+++ b/code/modules/vehicle/motorcycle.dm
@@ -0,0 +1,30 @@
+/obj/vehicle/motorcycle
+ name = "motorcycle"
+ desc = "A fast and highly maneuverable vehicle."
+ icon = 'icons/vehicles/motorcycle.dmi'
+ icon_state = "motorcycle_4dir"
+ generic_pixel_x = 0
+ generic_pixel_y = 4
+ vehicle_move_delay = 1
+ var/static/image/bikecover = null
+
+
+/obj/vehicle/motorcycle/New()
+ ..()
+ if(!bikecover)
+ bikecover = image("icons/vehicles/motorcycle.dmi", "motorcycle_overlay_4d")
+ bikecover.layer = MOB_LAYER + 0.1
+
+
+obj/vehicle/motorcycle/post_buckle_mob(mob/living/M)
+ if(buckled_mob)
+ overlays += bikecover
+ else
+ overlays -= bikecover
+
+
+/obj/vehicle/motorcycle/handle_vehicle_layer()
+ if(dir == SOUTH)
+ layer = MOB_LAYER+0.1
+ else
+ layer = OBJ_LAYER
\ No newline at end of file
diff --git a/code/modules/vehicle/secway.dm b/code/modules/vehicle/secway.dm
new file mode 100644
index 00000000000..4f7c0bf9cb2
--- /dev/null
+++ b/code/modules/vehicle/secway.dm
@@ -0,0 +1,12 @@
+/obj/vehicle/secway
+ name = "secway"
+ desc = "A brave security cyborg gave its life to help you look like a complete tool."
+ icon_state = "secway"
+ keytype = /obj/item/key/security
+ generic_pixel_x = 0
+ generic_pixel_y = 4
+
+
+/obj/item/key/security
+ desc = "A keyring with a small steel key, and a rubber stun baton accessory."
+ icon_state = "keysec"
\ No newline at end of file
diff --git a/code/modules/vehicle/snowmobile.dm b/code/modules/vehicle/snowmobile.dm
new file mode 100644
index 00000000000..311eb48c699
--- /dev/null
+++ b/code/modules/vehicle/snowmobile.dm
@@ -0,0 +1,17 @@
+/obj/vehicle/snowmobile
+ name = "red snowmobile"
+ desc = "Wheeeeeeeeeeee."
+ icon = 'icons/obj/vehicles.dmi'
+ icon_state = "snowmobile"
+ keytype = /obj/item/key/snowmobile
+ generic_pixel_x = 0
+ generic_pixel_y = 4
+
+/obj/vehicle/snowmobile/blue
+ name = "blue snowmobile"
+ icon_state = "bluesnowmobile"
+
+/obj/item/key/snowmobile
+ name = "snowmobile key"
+ desc = "A keyring with a small steel key, and tag with a red cross on it; clearly it's not implying you're going to the hospital for this..."
+ icon_state = "keydoc" //get a better icon, sometime.
diff --git a/code/modules/vehicle/speedbike.dm b/code/modules/vehicle/speedbike.dm
new file mode 100644
index 00000000000..7d46114fb63
--- /dev/null
+++ b/code/modules/vehicle/speedbike.dm
@@ -0,0 +1,62 @@
+/obj/vehicle/space/speedbike
+ name = "Speedbike"
+ icon = 'icons/obj/bike.dmi'
+ icon_state = "speedbike_blue"
+ layer = MOB_LAYER - 0.1
+ keytype = null
+ vehicle_move_delay = 0
+ var/overlay_state = "cover_blue"
+ var/image/overlay = null
+
+/obj/vehicle/space/speedbike/New()
+ ..()
+ overlay = image("icons/obj/bike.dmi", overlay_state)
+ overlay.layer = MOB_LAYER + 0.1
+ overlays += overlay
+
+/obj/effect/overlay/temp/speedbike_trail
+ name = "speedbike trails"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "ion_fade"
+ duration = 10
+ randomdir = 0
+ layer = MOB_LAYER - 0.2
+
+/obj/effect/overlay/temp/speedbike_trail/New(loc,move_dir)
+ ..()
+ dir = move_dir
+
+/obj/vehicle/space/speedbike/Move(newloc,move_dir)
+ if(buckled_mob)
+ new /obj/effect/overlay/temp/speedbike_trail(loc)
+ . = ..()
+
+/obj/vehicle/space/speedbike/handle_vehicle_layer()
+ switch(dir)
+ if(NORTH,SOUTH)
+ pixel_x = -16
+ pixel_y = -16
+ if(EAST,WEST)
+ pixel_x = -18
+ pixel_y = 0
+
+/obj/vehicle/space/speedbike/handle_vehicle_offsets()
+ if(buckled_mob)
+ buckled_mob.dir = dir
+ switch(dir)
+ if(NORTH)
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = -8
+ if(SOUTH)
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 4
+ if(EAST)
+ buckled_mob.pixel_x = -10
+ buckled_mob.pixel_y = 5
+ if(WEST)
+ buckled_mob.pixel_x = 10
+ buckled_mob.pixel_y = 5
+
+/obj/vehicle/space/speedbike/red
+ icon_state = "speedbike_red"
+ overlay_state = "cover_red"
\ No newline at end of file
diff --git a/code/modules/vehicle/sportscar.dm b/code/modules/vehicle/sportscar.dm
new file mode 100644
index 00000000000..04ba5bdd2f5
--- /dev/null
+++ b/code/modules/vehicle/sportscar.dm
@@ -0,0 +1,47 @@
+/obj/vehicle/car
+ name = "sports car"
+ desc = "A very luxurious vehicle."
+ icon = 'icons/vehicles/sportscar.dmi'
+ icon_state = "sportscar"
+ generic_pixel_x = 0
+ generic_pixel_y = 4
+ vehicle_move_delay = 1
+ var/static/image/carcover = null
+
+
+/obj/vehicle/car/New()
+ ..()
+ if(!carcover)
+ carcover = image("icons/vehicles/sportscar.dmi", "sportscar_cover")
+ carcover.layer = MOB_LAYER + 0.1
+
+
+/obj/vehicle/car/post_buckle_mob(mob/living/M)
+ if(buckled_mob)
+ overlays += carcover
+ else
+ overlays -= carcover
+
+/obj/vehicle/car/handle_vehicle_offsets()
+ ..()
+ if(buckled_mob)
+ switch(buckled_mob.dir)
+ if(NORTH)
+ buckled_mob.pixel_x = 2
+ buckled_mob.pixel_y = 20
+ if(EAST)
+ buckled_mob.pixel_x = 20
+ buckled_mob.pixel_y = 23
+ if(SOUTH)
+ buckled_mob.pixel_x = 20
+ buckled_mob.pixel_y = 27
+ if(WEST)
+ buckled_mob.pixel_x = 34
+ buckled_mob.pixel_y = 10
+
+
+/obj/vehicle/car/handle_vehicle_layer()
+ if(dir == SOUTH)
+ layer = MOB_LAYER+0.1
+ else
+ layer = OBJ_LAYER
\ No newline at end of file
diff --git a/code/modules/vehicle/train/train.dm b/code/modules/vehicle/train/train.dm
deleted file mode 100644
index ea84d92c4ed..00000000000
--- a/code/modules/vehicle/train/train.dm
+++ /dev/null
@@ -1,240 +0,0 @@
-/obj/vehicle/train
- name = "train"
- dir = 4
-
- move_delay = 2
-
- health = 100
- maxhealth = 100
- fire_dam_coeff = 0.7
- brute_dam_coeff = 0.5
-
- var/passenger_allowed = 1
-
- var/active_engines = 0
- var/train_length = 0
-
- var/obj/vehicle/train/lead
- var/obj/vehicle/train/tow
-
-
-//-------------------------------------------
-// Standard procs
-//-------------------------------------------
-/obj/vehicle/train/initialize()
- for(var/obj/vehicle/train/T in orange(1, src))
- latch(T)
-
-/obj/vehicle/train/Move()
- var/old_loc = get_turf(src)
- if(..())
- if(tow)
- tow.Move(old_loc)
- return 1
- else
- if(lead)
- unattach()
- return 0
-
-/obj/vehicle/train/can_move()
- if(!is_train_head())
- return 1 //towed objects do not need power to Move()
-
- if(!..())
- return 0
- return 1
-
-
-/obj/vehicle/train/Bump(atom/Obstacle)
- if(!istype(Obstacle, /atom/movable))
- return
- var/atom/movable/A = Obstacle
-
- if(!A.anchored)
- var/turf/T = get_step(A, dir)
- if(isturf(T))
- A.Move(T) //bump things away when hit
-
- if(ismob(load) && istype(Obstacle, /obj/machinery/door))
- Obstacle.Bumped(load)
-
- if(emagged)
- if(istype(A, /mob/living))
- var/mob/living/M = A
- visible_message("\red [src] knocks over [M]!")
- M.apply_effects(5, 5) //knock people down if you hit them
- M.apply_damages(22 / move_delay) // and do damage according to how fast the train is going
- if(istype(load, /mob/living/carbon/human))
- var/mob/living/D = load
- to_chat(D, "\red You hit [M]!")
- msg_admin_attack("[key_name_admin(D)] hit [key_name_admin(M)] with [src].")
-
-
-//-------------------------------------------
-// Vehicle procs
-//-------------------------------------------
-/obj/vehicle/train/explode()
- if (tow)
- tow.unattach()
- unattach()
- ..()
-
-
-//-------------------------------------------
-// Interaction procs
-//-------------------------------------------
-/obj/vehicle/train/relaymove(mob/user, direction)
- var/turf/T = get_step_to(src, get_step(src, direction))
- if(!T)
- to_chat(user, "You can't find a clear area to step onto.")
- return 0
-
- if(user != load)
- if(user in src) //for handling players stuck in src - this shouldn't happen - but just in case it does
- user.forceMove(T)
- return 1
- return 0
-
- unload(user, direction)
-
- to_chat(user, "\blue You climb down from [src].")
-
- return 1
-
-/obj/vehicle/train/MouseDrop_T(var/atom/movable/C, mob/user as mob)
- if(user.buckled || user.stat || user.restrained() || !Adjacent(user) || !user.Adjacent(C) || !istype(C) || (user == C && !user.canmove))
- return
- if(istype(C,/obj/vehicle/train))
- latch(C, user)
- else
- if(!load(C))
- to_chat(user, "\red You were unable to load [C] on [src].")
-
-/obj/vehicle/train/attack_hand(mob/user as mob)
- if(user.stat || user.restrained() || !Adjacent(user))
- return 0
-
- if(user != load && (user in src))
- user.forceMove(loc) //for handling players stuck in src
- else if(load)
- unload(user) //unload if loaded
- else if(!load && !user.buckled)
- load(user) //else try climbing on board
- else
- return 0
-
-/obj/vehicle/train/verb/unlatch_v()
- set name = "Unlatch"
- set desc = "Unhitches this train from the one in front of it."
- set category = "Object"
- set src in view(1)
-
- if(!istype(usr, /mob/living/carbon/human))
- return
-
- if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr))
- return
-
- unattach(usr)
-
-
-//-------------------------------------------
-// Latching/unlatching procs
-//-------------------------------------------
-
-//attempts to attach src as a follower of the train T
-/obj/vehicle/train/proc/attach_to(obj/vehicle/train/T, mob/user)
- if (get_dist(src, T) > 1)
- to_chat(user, "\red [src] is too far away from [T] to hitch them together.")
- return
-
- if (lead)
- to_chat(user, "\red [src] is already hitched to something.")
- return
-
- if (T.tow)
- to_chat(user, "\red [T] is already towing something.")
- return
-
- //check for cycles.
- var/obj/vehicle/train/next_car = T
- while (next_car)
- if (next_car == src)
- to_chat(user, "\red That seems very silly.")
- return
- next_car = next_car.lead
-
- //latch with src as the follower
- lead = T
- T.tow = src
- dir = lead.dir
-
- if(user)
- to_chat(user, "\blue You hitch [src] to [T].")
-
- update_stats()
-
-
-//detaches the train from whatever is towing it
-/obj/vehicle/train/proc/unattach(mob/user)
- if (!lead)
- to_chat(user, "\red [src] is not hitched to anything.")
- return
-
- lead.tow = null
- lead.update_stats()
-
- lead = null
-
- update_stats()
-
-/obj/vehicle/train/proc/latch(obj/vehicle/train/T, mob/user)
- if(!istype(T) || !Adjacent(T))
- return 0
-
- var/T_dir = get_dir(src, T) //figure out where T is wrt src
-
- if(dir == T_dir) //if car is ahead
- src.attach_to(T, user)
- else if(reverse_direction(dir) == T_dir) //else if car is behind
- T.attach_to(src, user)
-
-//returns 1 if this is the lead car of the train
-/obj/vehicle/train/proc/is_train_head()
- if (lead)
- return 0
- return 1
-
-//-------------------------------------------------------
-// Stat update procs
-//
-// Used for updating the stats for how long the train is.
-// These are useful for calculating speed based on the
-// size of the train, to limit super long trains.
-//-------------------------------------------------------
-/obj/vehicle/train/update_stats()
- //first, seek to the end of the train
- var/obj/vehicle/train/T = src
- while(T.tow)
- //check for cyclic train.
- if (T.tow == src)
- lead.tow = null
- lead.update_stats()
-
- lead = null
- update_stats()
- return
- T = T.tow
-
- //now walk back to the front.
- var/active_engines = 0
- var/train_length = 0
- while(T)
- train_length++
- if (powered && on)
- active_engines++
- T.update_car(train_length, active_engines)
- T = T.lead
-
-/obj/vehicle/train/proc/update_car(var/train_length, var/active_engines)
- return
diff --git a/code/modules/vehicle/train/trains/ambulance.dm b/code/modules/vehicle/train/trains/ambulance.dm
deleted file mode 100644
index 6ef9e9822b2..00000000000
--- a/code/modules/vehicle/train/trains/ambulance.dm
+++ /dev/null
@@ -1,282 +0,0 @@
-/obj/vehicle/train/ambulance/engine
- name = "ambulance train tug"
- desc = "A ridable electric car designed for pulling ambulance trolleys."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "docwagon2" //mulebot icons until I get some proper icons
- on = 0
- powered = 1
- locked = 0
- layer = MOB_LAYER + 0.1
- load_item_visible = 1
- load_offset_x = 0
- load_offset_y = 7
-
- var/car_limit = 3 //how many cars an engine can pull before performance degrades
- active_engines = 1
- var/obj/item/key/ambulance/key
-
-/obj/vehicle/train/ambulance/trolley
- name = "ambulance train trolley"
- icon = 'icons/vehicles/CargoTrain.dmi'
- icon_state = "ambulance"
- anchored = 0
- passenger_allowed = 1
- locked = 0
-
- load_item_visible = 1
- load_offset_x = 1
- load_offset_y = 7
-
-//-------------------------------------------
-// Standard procs
-//-------------------------------------------
-/obj/vehicle/train/ambulance/engine/New()
- ..()
- cell = new /obj/item/weapon/stock_parts/cell/high
- key = new()
-
-/obj/vehicle/train/ambulance/engine/Move()
- . = ..()
- handle_rotation()
- update_mob()
-
-/obj/vehicle/train/ambulance/trolley/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(open && istype(W, /obj/item/weapon/wirecutters))
- passenger_allowed = !passenger_allowed
- user.visible_message("[user] [passenger_allowed ? "cuts" : "mends"] a cable in [src].","You [passenger_allowed ? "cut" : "mend"] the load limiter cable.")
- else
- ..()
-
-/obj/vehicle/train/ambulance/engine/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/key/ambulance))
- if(!key)
- user.drop_item()
- key = W
- W.loc = src
- verbs += /obj/vehicle/train/ambulance/engine/verb/remove_key
- return
- ..()
-
-/obj/vehicle/train/ambulance/update_icon()
- if(open)
- //icon_state = "mulebot-hatch"
- icon_state = initial(icon_state)
- else
- icon_state = initial(icon_state)
-
-/obj/vehicle/train/ambulance/engine/Emag(mob/user as mob)
- ..()
- flick("mulebot-emagged", src)
-
-/obj/vehicle/train/ambulance/trolley/insert_cell(var/obj/item/weapon/stock_parts/cell/C, var/mob/living/carbon/human/H)
- return
-
-/obj/vehicle/train/ambulance/engine/insert_cell(var/obj/item/weapon/stock_parts/cell/C, var/mob/living/carbon/human/H)
- ..()
- update_stats()
-
-/obj/vehicle/train/ambulance/engine/remove_cell(var/mob/living/carbon/human/H)
- ..()
- update_stats()
-
-/obj/vehicle/train/ambulance/engine/Bump(atom/Obstacle)
- var/obj/machinery/door/D = Obstacle
- var/mob/living/carbon/human/H = load
- if(istype(D) && istype(H))
- D.Bumped(H) //a little hacky, but hey, it works, and repects access rights
-
- ..()
-
-/obj/vehicle/train/ambulance/trolley/Bump(atom/Obstacle)
- if(!lead)
- return //so people can't knock others over by pushing a trolley around
- ..()
-
-/obj/vehicle/train/ambulance/engine/handle_rotation()
- if(dir == SOUTH)
- layer = FLY_LAYER
- else
- layer = OBJ_LAYER
-
-/obj/vehicle/train/ambulance/engine/proc/update_mob()
- if(load)
- load.dir = dir
- switch(dir)
- if(SOUTH)
- load.pixel_x = 0
- load.pixel_y = 7
- if(WEST)
- load.pixel_x = 13
- load.pixel_y = 7
- if(NORTH)
- load.pixel_x = 0
- load.pixel_y = 4
- if(EAST)
- load.pixel_x = -13
- load.pixel_y = 7
-
-
-//-------------------------------------------
-// Train procs
-//-------------------------------------------
-/obj/vehicle/train/ambulance/engine/turn_on()
- if(!key)
- return
- else
- ..()
- update_stats()
-
-/obj/vehicle/train/ambulance/RunOver(var/mob/living/carbon/human/H)
- var/list/parts = list("head", "chest", "l_leg", "r_leg", "l_arm", "r_arm")
-
- H.apply_effects(5, 5)
- for(var/i = 0, i < rand(1,3), i++)
- H.apply_damage(rand(1,5), BRUTE, pick(parts))
-
-/obj/vehicle/train/ambulance/trolley/RunOver(var/mob/living/carbon/human/H)
- ..()
- attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey])")
-
-/obj/vehicle/train/ambulance/engine/RunOver(var/mob/living/carbon/human/H)
- ..()
-
- if(is_train_head() && istype(load, /mob/living/carbon/human))
- var/mob/living/carbon/human/D = load
- to_chat(D, "\red \b You ran over [H]!")
- visible_message("\red \The [src] ran over [H]!")
- attack_log += text("\[[time_stamp()]\] ran over [key_name(H)], driven by [key_name(D)]")
- msg_admin_attack("[key_name_admin(D)] ran over [key_name_admin(H)]")
- else
- attack_log += text("\[[time_stamp()]\] ran over [key_name(H)]")
-
-
-//-------------------------------------------
-// Interaction procs
-//-------------------------------------------
-/obj/vehicle/train/ambulance/engine/relaymove(mob/user, direction)
- if(user != load)
- return 0
-
- if(is_train_head())
- if(direction == reverse_direction(dir) && tow) //can reverse with no tow
- return 0
- if(Move(get_step(src, direction)))
- return 1
- return 0
- else
- return ..()
-
-/obj/vehicle/train/ambulance/engine/examine(mob/user)
- if(..(user, 1))
- to_chat(user, "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition.")
-
-/obj/vehicle/train/ambulance/engine/verb/check_power()
- set name = "Check power level"
- set category = "Object"
- set src in view(1)
-
- if(!istype(usr, /mob/living/carbon/human))
- return
-
- if(!cell)
- to_chat(usr, "There is no power cell installed in [src].")
- return
-
- to_chat(usr, "The power meter reads [round(cell.percent(), 0.01)]%")
-
-/obj/vehicle/train/ambulance/engine/verb/start_engine()
- set name = "Start engine"
- set category = "Object"
- set src in view(1)
-
- if(!istype(usr, /mob/living/carbon/human))
- return
-
- if(on)
- to_chat(usr, "The engine is already running.")
- return
-
- turn_on()
- if (on)
- to_chat(usr, "You start [src]'s engine.")
- else
- if(cell.charge < charge_use)
- to_chat(usr, "[src] is out of power.")
- else
- to_chat(usr, "[src]'s engine won't start.")
-
-/obj/vehicle/train/ambulance/engine/verb/stop_engine()
- set name = "Stop engine"
- set category = "Object"
- set src in view(1)
-
- if(!istype(usr, /mob/living/carbon/human))
- return
-
- if(!on)
- to_chat(usr, "The engine is already stopped.")
- return
-
- turn_off()
- if (!on)
- to_chat(usr, "You stop [src]'s engine.")
-
-/obj/vehicle/train/ambulance/engine/verb/remove_key()
- set name = "Remove key"
- set category = "Object"
- set src in view(1)
-
- if(!istype(usr, /mob/living/carbon/human))
- return
-
- if(!key || (load && load != usr))
- return
-
- if(on)
- turn_off()
-
- key.loc = usr.loc
- if(!usr.get_active_hand())
- usr.put_in_hands(key)
- key = null
-
- verbs -= /obj/vehicle/train/ambulance/engine/verb/remove_key
-
-//-------------------------------------------
-// Loading/unloading procs
-//-------------------------------------------
-/obj/vehicle/train/ambulance/trolley/load(var/atom/movable/C)
- if(ismob(C) && !passenger_allowed)
- return 0
- if(!istype(C,/obj/machinery) && !istype(C,/obj/structure/closet) && !istype(C,/obj/structure/largecrate) && !istype(C,/obj/structure/reagent_dispensers) && !istype(C,/obj/structure/ore_box) && !ismob(C))
- return 0
-
- return ..()
-
-/obj/vehicle/train/ambulance/engine/load(var/atom/movable/C)
- if(!ismob(C))
- return 0
-
- return ..()
-
-
-//-------------------------------------------------------
-// Stat update procs
-//
-// Update the trains stats for speed calculations.
-// The longer the train, the slower it will go. car_limit
-// sets the max number of cars one engine can pull at
-// full speed. Adding more cars beyond this will slow the
-// train proportionate to the length of the train. Adding
-// more engines increases this limit by car_limit per
-// engine.
-//-------------------------------------------------------
-
-/obj/vehicle/train/ambulance/engine/proc/update_move_delay()
- if(!is_train_head() || !on)
- move_delay = initial(move_delay) //so that engines that have been turned off don't lag behind
- else
- move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains
- move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines)
- move_delay += 1+config.run_speed //base reference speed
- move_delay *= 1.05
diff --git a/code/modules/vehicle/train/trains/cargo/cargo_subtypes/fourwheeler.dm b/code/modules/vehicle/train/trains/cargo/cargo_subtypes/fourwheeler.dm
deleted file mode 100644
index 9033a1f5014..00000000000
--- a/code/modules/vehicle/train/trains/cargo/cargo_subtypes/fourwheeler.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/obj/vehicle/train/cargo/engine/fourwheeler //make this hold passengers
- name = "fourwheeler"
- desc = "A fast and highly maneuverable vehicle."
- icon = 'icons/vehicles/4wheeler.dmi'
- icon_state = "fourwheel"
- emagged = 0
- mob_offset_y = 6
- load_offset_x = 0
- health = 200
- charge_use = 0
-
-/obj/vehicle/train/cargo/engine/fourwheeler/proc/update_dir_fourwheel_overlays()
- overlays = null
- if(src.dir == NORTH||SOUTH)
- if(src.dir == NORTH)
- var/image/I = new(icon = 'icons/vehicles/4wheeler.dmi', icon_state = "4wheeler_north", layer = src.layer + 0.2) //over mobs
- overlays += I
- else if(src.dir == SOUTH)
- var/image/I = new(icon = 'icons/vehicles/4wheeler.dmi', icon_state = "4wheeler_south", layer = src.layer + 0.2) //over mobs
- overlays += I
-
-/obj/vehicle/train/cargo/engine/fourwheeler/New()
- ..()
- update_dir_fourwheel_overlays()
-
-/obj/vehicle/train/cargo/engine/fourwheeler/Move()
- ..()
- update_dir_fourwheel_overlays()
-
-/obj/vehicle/train/cargo/engine/fourwheeler/handle_rotation()
- update_dir_fourwheel_overlays()
- ..()
\ No newline at end of file
diff --git a/code/modules/vehicle/train/trains/cargo/cargo_subtypes/motorcycle.dm b/code/modules/vehicle/train/trains/cargo/cargo_subtypes/motorcycle.dm
deleted file mode 100644
index 1986b195a17..00000000000
--- a/code/modules/vehicle/train/trains/cargo/cargo_subtypes/motorcycle.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-/obj/vehicle/train/cargo/engine/motorcycle
- name = "motorcycle"
- desc = "A fast and highly maneuverable vehicle."
- icon = 'icons/vehicles/motorcycle.dmi'
- icon_state = "motorcycle_4dir"
- emagged = 0
- mob_offset_y = 6
- load_offset_x = 0
- health = 100
- charge_use = 0
-
-/obj/vehicle/train/cargo/engine/motorcycle/proc/update_dir_motorcycle_overlays()
- overlays = null
- if(src.dir == NORTH||SOUTH)
- if(src.dir == NORTH)
- var/image/I = new(icon = 'icons/vehicles/motorcycle.dmi', icon_state = "motorcycle_overlay_n", layer = src.layer + 0.2) //over mobs
- overlays += I
- else if(src.dir == SOUTH)
- var/image/I = new(icon = 'icons/vehicles/motorcycle.dmi', icon_state = "motorcycle_overlay_s", layer = src.layer + 0.2) //over mobs
- overlays += I
- else
- var/image/I = new(icon = 'icons/vehicles/motorcycle.dmi', icon_state = "motorcycle_overlay_side", layer = src.layer + 0.2) //over mobs
- overlays += I
-
-/obj/vehicle/train/cargo/engine/motorcycle/New()
- ..()
- update_dir_motorcycle_overlays()
-
-/obj/vehicle/train/cargo/engine/motorcycle/Move()
- ..()
- update_dir_motorcycle_overlays()
-
-/obj/vehicle/train/cargo/engine/motorcycle/handle_rotation()
- update_dir_motorcycle_overlays() //this goes first, because vehicle/handle_rotation() just returns
- ..()
diff --git a/code/modules/vehicle/train/trains/cargo/cargo_subtypes/sportscar.dm b/code/modules/vehicle/train/trains/cargo/cargo_subtypes/sportscar.dm
deleted file mode 100644
index 52505312945..00000000000
--- a/code/modules/vehicle/train/trains/cargo/cargo_subtypes/sportscar.dm
+++ /dev/null
@@ -1,52 +0,0 @@
-//rename to sportscar if you need
-//mostly, my changes just update the C.pixel_ y and x on every iteration of the overlay update proc, since default vehicle code //only does that upon entering. Watch the weird formatting pastebin introduces.
-
-/obj/vehicle/train/cargo/engine/sportscar
- name = "sports car"
- desc = "A very luxurious vehicle."
- icon = 'icons/vehicles/sportscar.dmi'
- icon_state = "sportscar"
- emagged = 0
- health = 100
- charge_use = 0
- bound_width = 64
- bound_height = 64
- movable = 0
-
-
-/obj/vehicle/train/cargo/engine/sportscar/proc/update_dir_sportscar_overlays()
- var/atom/movable/C = src.load
- src.overlays = null
- if(src.dir == NORTH||SOUTH||WEST)
- if(src.dir == NORTH)
- var/image/I = new(icon = 'icons/vehicles/sportscar.dmi', icon_state = "sportscar_north", layer = src.layer + 0.2) //over mobs
- src.overlays += I
- src.mob_offset_x = 2
- src.mob_offset_y = 20
- else if(src.dir == SOUTH)
- var/image/I = new(icon = 'icons/vehicles/sportscar.dmi', icon_state = "sportscar_south", layer = src.layer + 0.2) //over mobs
- overlays += I
- src.mob_offset_x = 20
- src.mob_offset_y = 27
- else if(src.dir == WEST)
- src.mob_offset_x = 34
- src.mob_offset_y = 10
- var/image/I = new(icon = 'icons/vehicles/sportscar.dmi', icon_state = "sportscar_west", layer = src.layer + 0.2) //over mobs
- src.overlays += I
- else if(src.dir == EAST)
- var/image/I = new(icon = 'icons/vehicles/sportscar.dmi', icon_state = "sportscar_east", layer = src.layer + 0.2) //over mobs
- src.mob_offset_x = 20
- src.mob_offset_y = 23
- src.overlays += I
- if(ismob(C))
- C.pixel_y = src.mob_offset_y
- C.pixel_x = src.mob_offset_x
-
-
-/obj/vehicle/train/cargo/engine/sportscar/New()
- ..()
- update_dir_sportscar_overlays()
-
-/obj/vehicle/train/cargo/engine/sportscar/Move()
- ..()
- update_dir_sportscar_overlays()
\ No newline at end of file
diff --git a/code/modules/vehicle/train/trains/cargo/cargo_train.dm b/code/modules/vehicle/train/trains/cargo/cargo_train.dm
deleted file mode 100644
index 8df907b1420..00000000000
--- a/code/modules/vehicle/train/trains/cargo/cargo_train.dm
+++ /dev/null
@@ -1,282 +0,0 @@
-/obj/vehicle/train/cargo/engine
- name = "cargo train tug"
- desc = "A ridable electric car designed for pulling cargo trolleys."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "cargo_engine"
- on = 0
- powered = 1
- locked = 0
-
- load_item_visible = 1
- load_offset_x = 0
- mob_offset_y = 7
-
- var/car_limit = 3 //how many cars an engine can pull before performance degrades
- active_engines = 1
- var/obj/item/weapon/key/cargo_train/key
-
-/obj/item/weapon/key/cargo_train
- name = "key"
- desc = "A keyring with a small steel key, and a yellow fob reading \"Choo Choo!\"."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "train_keys"
- w_class = 1
-
-/obj/vehicle/train/cargo/trolley
- name = "cargo train trolley"
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "cargo_trailer"
- anchored = 0
- passenger_allowed = 0
- locked = 0
-
- load_item_visible = 1
- load_offset_x = 0
- load_offset_y = 4
- mob_offset_y = 8
-
-//-------------------------------------------
-// Standard procs
-//-------------------------------------------
-/obj/vehicle/train/cargo/engine/New()
- ..()
- cell = new /obj/item/weapon/stock_parts/cell/high
- key = new()
- var/image/I = new(icon = 'icons/obj/vehicles.dmi', icon_state = "cargo_engine_overlay", layer = src.layer + 0.2) //over mobs
- overlays += I
- turn_off() //so engine verbs are correctly set
-
-/obj/vehicle/train/cargo/trolley/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(open && istype(W, /obj/item/weapon/wirecutters))
- passenger_allowed = !passenger_allowed
- user.visible_message("[user] [passenger_allowed ? "cuts" : "mends"] a cable in [src].","You [passenger_allowed ? "cut" : "mend"] the load limiter cable.")
- else
- ..()
-
-/obj/vehicle/train/cargo/engine/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/key/cargo_train))
- if(!key)
- user.drop_item()
- W.forceMove(src)
- key = W
- verbs += /obj/vehicle/train/cargo/engine/verb/remove_key
- return
- ..()
-
-/obj/vehicle/train/cargo/update_icon()
- if(open)
- icon_state = initial(icon_state) + "_open"
- else
- icon_state = initial(icon_state)
-
-/obj/vehicle/train/cargo/trolley/insert_cell(var/obj/item/weapon/stock_parts/cell/C, var/mob/living/carbon/human/H)
- return
-
-/obj/vehicle/train/cargo/engine/insert_cell(var/obj/item/weapon/stock_parts/cell/C, var/mob/living/carbon/human/H)
- ..()
- update_stats()
-
-/obj/vehicle/train/cargo/engine/remove_cell(var/mob/living/carbon/human/H)
- ..()
- update_stats()
-
-/obj/vehicle/train/cargo/engine/Bump(atom/Obstacle)
- var/obj/machinery/door/D = Obstacle
- var/mob/living/carbon/human/H = load
- if(istype(D) && istype(H))
- D.Bumped(H) //a little hacky, but hey, it works, and respects access rights
-
- ..()
-
-/obj/vehicle/train/cargo/trolley/Bump(atom/Obstacle)
- if(!lead)
- return //so people can't knock others over by pushing a trolley around
- ..()
-
-//-------------------------------------------
-// Train procs
-//-------------------------------------------
-/obj/vehicle/train/cargo/engine/turn_on()
- if(!key)
- return
- else
- ..()
- update_stats()
-
- verbs -= /obj/vehicle/train/cargo/engine/verb/stop_engine
- verbs -= /obj/vehicle/train/cargo/engine/verb/start_engine
-
- if(on)
- verbs += /obj/vehicle/train/cargo/engine/verb/stop_engine
- else
- verbs += /obj/vehicle/train/cargo/engine/verb/start_engine
-
-/obj/vehicle/train/cargo/engine/turn_off()
- ..()
-
- verbs -= /obj/vehicle/train/cargo/engine/verb/stop_engine
- verbs -= /obj/vehicle/train/cargo/engine/verb/start_engine
-
- if(!on)
- verbs += /obj/vehicle/train/cargo/engine/verb/start_engine
- else
- verbs += /obj/vehicle/train/cargo/engine/verb/stop_engine
-
-/obj/vehicle/train/cargo/RunOver(var/mob/living/carbon/human/H)
- var/list/parts = list("head", "chest", "l_leg", "r_leg", "l_arm", "r_arm")
-
- H.apply_effects(5, 5)
- for(var/i = 0, i < rand(1,3), i++)
- H.apply_damage(rand(1,5), BRUTE, pick(parts))
-
-/obj/vehicle/train/cargo/trolley/RunOver(var/mob/living/carbon/human/H)
- ..()
- attack_log += text("\[[time_stamp()]\] ran over [key_name(H)]")
-
-/obj/vehicle/train/cargo/engine/RunOver(var/mob/living/carbon/human/H)
- ..()
-
- if(is_train_head() && istype(load, /mob/living/carbon/human))
- var/mob/living/carbon/human/D = load
- to_chat(D, "\red \b You ran over [H]!")
- visible_message("\red \The [src] ran over [H]!")
- attack_log += text("\[[time_stamp()]\] ran over [key_name(H)], driven by [key_name(D)]")
- msg_admin_attack("[key_name_admin(D)] ran over [key_name_admin(H)]")
- else
- attack_log += text("\[[time_stamp()]\] ran over [key_name(H)]")
-
-
-//-------------------------------------------
-// Interaction procs
-//-------------------------------------------
-/obj/vehicle/train/cargo/engine/relaymove(mob/user, direction)
- if(user != load)
- return 0
-
- if(is_train_head())
- if(direction == reverse_direction(dir) && tow)
- return 0
- if(Move(get_step(src, direction)))
- return 1
- return 0
- else
- return ..()
-
-/obj/vehicle/train/cargo/engine/examine(mob/user)
- if(!..(user, 1))
- return
-
- to_chat(user, "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition.")
- to_chat(user, "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%")
-
-/obj/vehicle/train/cargo/engine/verb/start_engine()
- set name = "Start engine"
- set category = "Object"
- set src in view(1)
-
- if(!istype(usr, /mob/living/carbon/human))
- return
-
- if(on)
- to_chat(usr, "The engine is already running.")
- return
-
- turn_on()
- if (on)
- to_chat(usr, "You start [src]'s engine.")
- else
- if(cell.charge < charge_use)
- to_chat(usr, "[src] is out of power.")
- else
- to_chat(usr, "[src]'s engine won't start.")
-
-/obj/vehicle/train/cargo/engine/verb/stop_engine()
- set name = "Stop engine"
- set category = "Object"
- set src in view(1)
-
- if(!istype(usr, /mob/living/carbon/human))
- return
-
- if(!on)
- to_chat(usr, "The engine is already stopped.")
- return
-
- turn_off()
- if (!on)
- to_chat(usr, "You stop [src]'s engine.")
-
-/obj/vehicle/train/cargo/engine/verb/remove_key()
- set name = "Remove key"
- set category = "Object"
- set src in view(1)
-
- if(!istype(usr, /mob/living/carbon/human))
- return
-
- if(!key || (load && load != usr))
- return
-
- if(on)
- turn_off()
-
- key.loc = usr.loc
- if(!usr.get_active_hand())
- usr.put_in_hands(key)
- key = null
-
- verbs -= /obj/vehicle/train/cargo/engine/verb/remove_key
-
-//-------------------------------------------
-// Loading/unloading procs
-//-------------------------------------------
-/obj/vehicle/train/cargo/trolley/load(var/atom/movable/C)
- if(ismob(C) && !passenger_allowed)
- return 0
- if(!istype(C,/obj/machinery) && !istype(C,/obj/structure/closet) && !istype(C,/obj/structure/largecrate) && !istype(C,/obj/structure/reagent_dispensers) && !istype(C,/obj/structure/ore_box) && !istype(C, /mob/living/carbon/human))
- return 0
-
- ..()
-
- if(load)
- return 1
-
-/obj/vehicle/train/cargo/engine/load(var/atom/movable/C)
- if(!istype(C, /mob/living/carbon/human))
- return 0
-
- return ..()
-
-
-//-------------------------------------------------------
-// Stat update procs
-//
-// Update the trains stats for speed calculations.
-// The longer the train, the slower it will go. car_limit
-// sets the max number of cars one engine can pull at
-// full speed. Adding more cars beyond this will slow the
-// train proportionate to the length of the train. Adding
-// more engines increases this limit by car_limit per
-// engine.
-//-------------------------------------------------------
-/obj/vehicle/train/cargo/engine/update_car(var/train_length, var/active_engines)
- src.train_length = train_length
- src.active_engines = active_engines
-
- //Update move delay
- if(!is_train_head() || !on)
- move_delay = initial(move_delay) //so that engines that have been turned off don't lag behind
- else
- move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains
- move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines)
- move_delay += config.run_speed //base reference speed
- move_delay *= 1.1 //makes cargo trains 10% slower than running when not overweight
-
-/obj/vehicle/train/cargo/trolley/update_car(var/train_length, var/active_engines)
- src.train_length = train_length
- src.active_engines = active_engines
-
- if(!lead && !tow)
- anchored = 0
- else
- anchored = 1
\ No newline at end of file
diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm
index 105f02148b7..bb112440944 100644
--- a/code/modules/vehicle/vehicle.dm
+++ b/code/modules/vehicle/vehicle.dm
@@ -1,375 +1,159 @@
+
/obj/vehicle
name = "vehicle"
+ desc = "A basic vehicle, vroom"
icon = 'icons/obj/vehicles.dmi'
- layer = MOB_LAYER + 0.1 //so it sits above objects including mobs
+ icon_state = "fuckyou"
density = 1
- anchored = 1
- animate_movement=1
- light_range = 3
-
+ anchored = 0
+ can_buckle = 1
buckle_lying = 0
+ var/keytype = null //item typepath, if non-null an item of this type is needed in your hands to drive this vehicle
+ var/next_vehicle_move = 0 //used for move delays
+ var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower
+ var/auto_door_open = TRUE
+ var/needs_gravity = 0//To allow non-space vehicles to move in no gravity or not, mostly for adminbus
- var/attack_log = null
- var/on = 0
- var/health = 0 //do not forget to set health for your vehicle!
- var/maxhealth = 0
- var/fire_dam_coeff = 1.0
- var/brute_dam_coeff = 1.0
- var/open = 0 //Maint panel
- var/locked = 1
- var/stat = 0
- var/emagged = 0
- var/powered = 0 //set if vehicle is powered and should use fuel when moving
- var/move_delay = 1 //set this to limit the speed of the vehicle
- var/movable = 1
-
- var/obj/item/weapon/stock_parts/cell/cell
- var/charge_use = 5 //set this to adjust the amount of power the vehicle uses per move
-
- var/atom/movable/load //all vehicles can take a load, since they should all be a least drivable
- var/load_item_visible = 1 //set if the loaded item should be overlayed on the vehicle sprite
- var/load_offset_x = 0 //pixel_x offset for item overlay
- var/load_offset_y = 0 //pixel_y offset for item overlay
- var/mob_offset_x = 0 //pixel_x offset for mob overlay
- var/mob_offset_y = 0 //pixel_y offset for mob overlay
+ //Pixels
+ var/generic_pixel_x = 0 //All dirs show this pixel_x for the driver
+ var/generic_pixel_y = 0 //All dirs shwo this pixel_y for the driver
-//-------------------------------------------
-// Standard procs
-//-------------------------------------------
/obj/vehicle/New()
..()
- //spawn the cell you want in each vehicle
+ handle_vehicle_layer()
-/obj/vehicle/Move()
- if(can_move())
- var/init_anc = anchored
- anchored = 0
- if(!..())
- anchored = init_anc
- return 0
- anchored = init_anc
-
- if(on && powered)
- cell.use(charge_use)
-
- if(load)
- load.forceMove(loc)// = loc
- load.dir = dir
-
- return 1
+//APPEARANCE
+/obj/vehicle/proc/handle_vehicle_layer()
+ if(dir != NORTH)
+ layer = MOB_LAYER+0.1
else
- return 0
-
-/obj/vehicle/proc/can_move()
- if(world.time <= l_move_time + move_delay)
- return 0
-
- if(!on || !powered)
- return 0
-
- if(on && powered && cell.charge < charge_use)
- turn_off()
- return 0
-
- if(istype(loc, /turf/space))
- return 0
-
- return 1
+ layer = OBJ_LAYER
-/obj/vehicle/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/hand_labeler))
- return
- if(istype(W, /obj/item/weapon/screwdriver))
- if(!locked)
- open = !open
- update_icon()
- to_chat(user, "Maintenance panel is now [open ? "opened" : "closed"].")
- else if(istype(W, /obj/item/weapon/crowbar) && cell && open)
- remove_cell(user)
+//Override this to set your vehicle's various pixel offsets
+//if they differ between directions, otherwise use the
+//generic variables
+/obj/vehicle/proc/handle_vehicle_offsets()
+ if(buckled_mob)
+ buckled_mob.dir = dir
+ buckled_mob.pixel_x = generic_pixel_x
+ buckled_mob.pixel_y = generic_pixel_y
- else if(istype(W, /obj/item/weapon/stock_parts/cell) && !cell && open)
- insert_cell(W, user)
- else if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/T = W
- if(T.welding)
- if(health < maxhealth)
- if(open)
- health = min(maxhealth, health+10)
- user.visible_message("\red [user] repairs [src]!","\blue You repair [src]!")
- else
- to_chat(user, "Unable to repair with the maintenance panel closed.")
- else
- to_chat(user, "[src] does not need a repair.")
- else
- to_chat(user, "Unable to repair while [src] is off.")
- else if(hasvar(W,"force") && hasvar(W,"damtype"))
- switch(W.damtype)
- if("fire")
- health -= W.force * fire_dam_coeff
- if("brute")
- health -= W.force * brute_dam_coeff
- ..()
- healthcheck()
- else
- ..()
-/obj/vehicle/emag_act(user as mob)
- if(!emagged)
- Emag(user)
-
-/obj/vehicle/attack_animal(var/mob/living/simple_animal/M as mob)
- if(M.melee_damage_upper == 0) return
- health -= M.melee_damage_upper
- src.visible_message("\red [M] has [M.attacktext] [src]!")
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
- if(prob(10))
- new /obj/effect/decal/cleanable/blood/oil(src.loc)
- healthcheck()
-
-/obj/vehicle/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
- ..()
- healthcheck()
-
-/obj/vehicle/blob_act()
- src.health -= rand(20,40)*fire_dam_coeff
- healthcheck()
+/obj/vehicle/update_icon()
return
-/obj/vehicle/ex_act(severity)
- switch(severity)
- if(1.0)
- explode()
- return
- if(2.0)
- health -= rand(5,10)*fire_dam_coeff
- health -= rand(10,20)*brute_dam_coeff
- healthcheck()
- return
- if(3.0)
- if (prob(50))
- health -= rand(1,5)*fire_dam_coeff
- health -= rand(1,5)*brute_dam_coeff
- healthcheck()
+
+
+//KEYS
+/obj/vehicle/proc/keycheck(mob/user)
+ if(keytype)
+ if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype))
+ return 1
+ else
+ return 1
+ return 0
+
+/obj/item/key
+ name = "key"
+ desc = "A small grey key."
+ icon = 'icons/obj/vehicles.dmi'
+ icon_state = "key"
+ w_class = 1
+
+
+//BUCKLE HOOKS
+/obj/vehicle/unbuckle_mob(force = 0)
+ if(buckled_mob)
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 0
+ . = ..()
+
+
+/obj/vehicle/user_buckle_mob(mob/living/M, mob/user)
+ if(user.incapacitated())
+ return
+ for(var/atom/movable/A in get_turf(src))
+ if(A.density)
+ if(A != src && A != M)
return
- return
+ M.loc = get_turf(src)
+ ..()
+ handle_vehicle_offsets()
-/obj/vehicle/emp_act(severity)
- var/was_on = on
- stat |= EMPED
- var/obj/effect/overlay/pulse2 = new/obj/effect/overlay ( src.loc )
- pulse2.icon = 'icons/effects/effects.dmi'
- pulse2.icon_state = "empdisable"
- pulse2.name = "emp sparks"
- pulse2.anchored = 1
- pulse2.dir = pick(cardinal)
- spawn(10)
- pulse2.delete()
- if(on)
- turn_off()
- spawn(severity*300)
- stat &= ~EMPED
- if(was_on)
- turn_on()
+/obj/vehicle/bullet_act(obj/item/projectile/Proj)
+ if(buckled_mob)
+ buckled_mob.bullet_act(Proj)
-/obj/vehicle/attack_ai(mob/user as mob)
- return
+//MOVEMENT
+/obj/vehicle/relaymove(mob/user, direction)
+ if(user.incapacitated())
+ unbuckle_mob()
-/obj/vehicle/proc/handle_rotation()
- return
+ if(keycheck(user))
+ if(!Process_Spacemove(direction) || world.time < next_vehicle_move || !isturf(loc)) return
+ next_vehicle_move = world.time + vehicle_move_delay
-//-------------------------------------------
-// Vehicle procs
-//-------------------------------------------
-/obj/vehicle/proc/turn_on()
- if(stat)
- return 0
- if(powered && cell.charge < charge_use)
- return 0
- on = 1
- set_light(initial(light_range))
- update_icon()
- return 1
+ step(src, direction)
-/obj/vehicle/proc/turn_off()
- on = 0
- set_light(0)
- update_icon()
+ if(buckled_mob)
+ if(buckled_mob.loc != loc)
+ buckled_mob.buckled = null //Temporary, so Move() succeeds.
+ buckled_mob.buckled = src //Restoring
-/obj/vehicle/proc/Emag(mob/user as mob)
- emagged = 1
+ if(istype(src.loc, /turf/simulated))
+ var/turf/simulated/T = src.loc
+ if(T.wet == TURF_WET_LUBE) //Lube! Fall off!
+ playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
+ buckled_mob.Stun(7)
+ buckled_mob.Weaken(7)
+ unbuckle_mob()
+ step(src, dir)
- if(locked)
- locked = 0
- to_chat(user, "You bypass [src]'s controls.")
+ handle_vehicle_layer()
+ handle_vehicle_offsets()
+ else
+ to_chat(user, "You'll need the keys in one of your hands to drive \the [name].")
-/obj/vehicle/proc/explode()
- src.visible_message("\red [src] blows apart!", 1)
- var/turf/Tsec = get_turf(src)
- new /obj/item/stack/rods(Tsec)
- new /obj/item/stack/rods(Tsec)
- new /obj/item/stack/cable_coil/cut(Tsec)
+/obj/vehicle/Move(NewLoc,Dir=0,step_x=0,step_y=0)
+ ..()
+ handle_vehicle_layer()
+ handle_vehicle_offsets()
- if(cell)
- cell.forceMove(Tsec)
- cell.update_icon()
- cell = null
- //stuns people who are thrown off a train that has been blown up
- if(istype(load, /mob/living))
- var/mob/living/M = load
- M.apply_effects(5, 5)
+/obj/vehicle/attackby(obj/item/I, mob/user, params)
+ if(keytype && istype(I, keytype))
+ to_chat(user, "Hold [I] in one of your hands while you drive \the [name].")
- unload()
- new /obj/effect/gibspawner/robot(Tsec)
- new /obj/effect/decal/cleanable/blood/oil(src.loc)
-
- qdel(src)
-
-/obj/vehicle/proc/healthcheck()
- if(health <= 0)
- explode()
-
-/obj/vehicle/proc/powercheck()
- if(!cell && !powered)
- return 0
-
- if(!cell && powered)
- turn_off()
- return 0
-
- if(cell.charge < charge_use)
- turn_off()
- return 0
-
- if(cell && powered)
- turn_on()
- return 1
-
-/obj/vehicle/proc/insert_cell(var/obj/item/weapon/stock_parts/cell/C, var/mob/living/carbon/human/H)
- if(cell)
- return
- if(!istype(C))
- return
-
- H.unEquip(C)
- C.forceMove(src)
- cell = C
- powercheck()
- to_chat(usr, "You install [C] in [src].")
-
-/obj/vehicle/proc/remove_cell(var/mob/living/carbon/human/H)
- if(!cell)
- return
-
- to_chat(usr, "You remove [cell] from [src].")
- cell.forceMove(get_turf(H))
- H.put_in_hands(cell)
- cell = null
- powercheck()
+/obj/vehicle/Bump(atom/movable/M)
+ . = ..()
+ if(auto_door_open)
+ if(istype(M, /obj/machinery/door) && buckled_mob)
+ M.Bumped(buckled_mob)
/obj/vehicle/proc/RunOver(var/mob/living/carbon/human/H)
return //write specifics for different vehicles
-//-------------------------------------------
-// Loading/unloading procs
-//
-// Set specific item restriction checks in
-// the vehicle load() definition before
-// calling this parent proc.
-//-------------------------------------------
-/obj/vehicle/proc/load(var/atom/movable/C)
- //define allowed items for loading in specific vehicle definitions
- if(!isturf(C.loc)) //To prevent loading things from someone's inventory, which wouldn't get handled properly.
- return 0
- if(load || C.anchored)
- return 0
+/obj/vehicle/Process_Spacemove(direction)
+ if(has_gravity(src))
+ return 1
- // if a create/closet, close before loading
- var/obj/structure/closet/crate = C
- if(istype(crate))
- crate.close()
+ if(pulledby)
+ return 1
- C.forceMove(loc)
- C.dir = dir
- C.anchored = 1
+ if(needs_gravity)
+ return 1
- load = C
+ return 0
- if(load_item_visible)
- if(ismob(C) && mob_offset_x != 0 && mob_offset_y != 0) //if the offset is not set, use load offset
- C.pixel_x += mob_offset_x
- C.pixel_y += mob_offset_y
- else
- C.pixel_x += load_offset_x
- C.pixel_y += load_offset_y
- C.layer = layer + 0.1 //so it sits above the vehicle
+/obj/vehicle/space
+ pressure_resistance = INFINITY
- if(ismob(C))
- var/mob/M = C
- M.buckled = src
- M.update_canmove()
-
- return 1
-
-
-/obj/vehicle/proc/unload(var/mob/user, var/direction)
- if(!load)
- return
-
- var/turf/dest = null
-
- //find a turf to unload to
- if(direction) //if direction specified, unload in that direction
- dest = get_step(src, direction)
- else if(user) //if a user has unloaded the vehicle, unload at their feet
- dest = get_turf(user)
-
- if(!dest)
- dest = get_step_to(src, get_step(src, turn(dir, 90))) //try unloading to the side of the vehicle first if neither of the above are present
-
- //if these all result in the same turf as the vehicle or nullspace, pick a new turf with open space
- if(!dest || dest == get_turf(src))
- var/list/options = new()
- for(var/test_dir in alldirs)
- var/new_dir = get_step_to(src, get_step(src, test_dir))
- if(new_dir && load.Adjacent(new_dir))
- options += new_dir
- if(options.len)
- dest = pick(options)
- else
- dest = get_turf(src) //otherwise just dump it on the same turf as the vehicle
-
- if(!isturf(dest)) //if there still is nowhere to unload, cancel out since the vehicle is probably in nullspace
- return 0
-
- load.forceMove(dest)
- load.dir = get_dir(loc, dest)
- load.anchored = initial(load.anchored)
- load.pixel_x = initial(load.pixel_x)
- load.pixel_y = initial(load.pixel_y)
- load.layer = initial(load.layer)
-
- if(ismob(load))
- var/mob/M = load
- M.buckled = null
- M.anchored = initial(M.anchored)
- M.update_canmove()
-
- load = null
-
- return 1
-
-
-//-------------------------------------------------------
-// Stat update procs
-//-------------------------------------------------------
-/obj/vehicle/proc/update_stats()
- return
\ No newline at end of file
+/obj/vehicle/space/Process_Spacemove(direction)
+ return 1
\ No newline at end of file
diff --git a/icons/obj/bike.dmi b/icons/obj/bike.dmi
new file mode 100644
index 00000000000..db4cb6d1aa0
Binary files /dev/null and b/icons/obj/bike.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 9736e6d070c..ca1495b92b1 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1976,13 +1976,15 @@
#include "code\modules\tram\tram_floor.dm"
#include "code\modules\tram\tram_rail.dm"
#include "code\modules\tram\tram_wall.dm"
+#include "code\modules\vehicle\ambulance.dm"
+#include "code\modules\vehicle\atv.dm"
+#include "code\modules\vehicle\janicart.dm"
+#include "code\modules\vehicle\motorcycle.dm"
+#include "code\modules\vehicle\secway.dm"
+#include "code\modules\vehicle\snowmobile.dm"
+#include "code\modules\vehicle\speedbike.dm"
+#include "code\modules\vehicle\sportscar.dm"
#include "code\modules\vehicle\vehicle.dm"
-#include "code\modules\vehicle\train\train.dm"
-#include "code\modules\vehicle\train\trains\ambulance.dm"
-#include "code\modules\vehicle\train\trains\cargo\cargo_train.dm"
-#include "code\modules\vehicle\train\trains\cargo\cargo_subtypes\fourwheeler.dm"
-#include "code\modules\vehicle\train\trains\cargo\cargo_subtypes\motorcycle.dm"
-#include "code\modules\vehicle\train\trains\cargo\cargo_subtypes\sportscar.dm"
#include "interface\interface.dm"
#include "interface\stylesheet.dm"
#include "interface\skin.dmf"