[MIRROR] Tramstation: choo choo MORE MAP COMIN' THROUH (#4083)
* Tramstation: choo choo MORE MAP COMIN' THROUH * Tramstation: Skyrat Edition (#4104) * Decals Fixed * Modularity? Whatever * Fuck me if I need to make a second PR for this * Blueshield + Cryo + Ian Fursuit * Automatic changelog generation for PR #4104 [ci skip] Co-authored-by: MMMiracles <lolaccount1@hotmail.com> Co-authored-by: Cheshify <73589390+Cheshify@users.noreply.github.com>
@@ -13,6 +13,7 @@
|
||||
#include "map_files\KiloStation\KiloStation.dmm"
|
||||
#include "map_files\MetaStation\MetaStation.dmm"
|
||||
#include "map_files\IceBoxStation\IceBoxStation.dmm"
|
||||
#include "map_files\tramstation\tramstation.dmm"
|
||||
|
||||
#ifdef CIBUILDING
|
||||
#include "templates.dm"
|
||||
|
||||
@@ -0,0 +1,754 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"aa" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"ab" = (
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/escape)
|
||||
"ac" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/restraints/handcuffs{
|
||||
pixel_y = 3
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"ad" = (
|
||||
/obj/machinery/computer/emergency_shuttle,
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"ae" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/crowbar,
|
||||
/obj/item/storage/firstaid/fire,
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"af" = (
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"ag" = (
|
||||
/obj/structure/table,
|
||||
/obj/machinery/recharger,
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"ah" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"ai" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/phone{
|
||||
pixel_x = -3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"aj" = (
|
||||
/turf/closed/wall/mineral/titanium/overspace,
|
||||
/area/shuttle/escape)
|
||||
"ak" = (
|
||||
/turf/closed/wall/mineral/titanium/nodiagonal,
|
||||
/area/shuttle/escape)
|
||||
"al" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"am" = (
|
||||
/turf/open/floor/mineral/titanium/tiled,
|
||||
/area/shuttle/escape)
|
||||
"an" = (
|
||||
/turf/open/floor/mineral/titanium/tiled/blue,
|
||||
/area/shuttle/escape)
|
||||
"ao" = (
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"ap" = (
|
||||
/obj/machinery/computer/crew{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"aq" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"ar" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"as" = (
|
||||
/obj/machinery/computer/security{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"at" = (
|
||||
/obj/machinery/computer/crew{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/radio/intercom{
|
||||
name = "Station Intercom (General)";
|
||||
pixel_y = -31
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"au" = (
|
||||
/obj/machinery/computer/security{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
dir = 4;
|
||||
pixel_y = -27
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/white,
|
||||
/area/shuttle/escape)
|
||||
"av" = (
|
||||
/obj/machinery/status_display/evac,
|
||||
/turf/closed/wall/mineral/titanium/nodiagonal,
|
||||
/area/shuttle/escape)
|
||||
"aw" = (
|
||||
/obj/machinery/door/airlock/public/glass{
|
||||
name = "Emergency Shuttle Cockpit";
|
||||
req_access_txt = "19"
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/yellow,
|
||||
/area/shuttle/escape)
|
||||
"ax" = (
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/glass/reinforced,
|
||||
/area/shuttle/escape)
|
||||
"ay" = (
|
||||
/obj/machinery/button/flasher{
|
||||
id = "cockpit_flasher";
|
||||
pixel_x = 6;
|
||||
pixel_y = -24
|
||||
},
|
||||
/turf/open/floor/glass/reinforced,
|
||||
/area/shuttle/escape)
|
||||
"az" = (
|
||||
/turf/open/floor/glass/reinforced,
|
||||
/area/shuttle/escape)
|
||||
"aA" = (
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/closet/emcloset,
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/glass/reinforced,
|
||||
/area/shuttle/escape)
|
||||
"aB" = (
|
||||
/obj/structure/chair/comfy/shuttle,
|
||||
/obj/structure/reagent_dispensers/peppertank{
|
||||
pixel_y = 32
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red/brig,
|
||||
/area/shuttle/escape)
|
||||
"aC" = (
|
||||
/obj/structure/chair/comfy/shuttle,
|
||||
/turf/open/floor/mineral/plastitanium/red/brig,
|
||||
/area/shuttle/escape)
|
||||
"aD" = (
|
||||
/obj/machinery/flasher{
|
||||
id = "cockpit_flasher";
|
||||
pixel_x = -24;
|
||||
pixel_y = 24
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/escape)
|
||||
"aE" = (
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/escape)
|
||||
"aF" = (
|
||||
/obj/machinery/vending/wallmed{
|
||||
name = "Emergency NanoMed";
|
||||
pixel_y = 32;
|
||||
use_power = 0
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/escape)
|
||||
"aG" = (
|
||||
/obj/item/radio/intercom{
|
||||
pixel_y = 25
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/escape)
|
||||
"aH" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/button/flasher{
|
||||
id = "shuttle_flasher";
|
||||
pixel_x = -24;
|
||||
pixel_y = -6
|
||||
},
|
||||
/obj/machinery/flasher{
|
||||
id = "shuttle_flasher";
|
||||
pixel_x = -24;
|
||||
pixel_y = 6
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red/brig,
|
||||
/area/shuttle/escape)
|
||||
"aI" = (
|
||||
/turf/open/floor/mineral/plastitanium/red/brig,
|
||||
/area/shuttle/escape)
|
||||
"aJ" = (
|
||||
/obj/machinery/door/airlock/public/glass{
|
||||
name = "Emergency Shuttle Brig";
|
||||
req_access_txt = "2"
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red/brig,
|
||||
/area/shuttle/escape)
|
||||
"aK" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/blue,
|
||||
/area/shuttle/escape)
|
||||
"aL" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/blue,
|
||||
/area/shuttle/escape)
|
||||
"aM" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Emergency Shuttle Airlock";
|
||||
req_access_txt = "2"
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red/brig,
|
||||
/area/shuttle/escape)
|
||||
"aN" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red/brig,
|
||||
/area/shuttle/escape)
|
||||
"aO" = (
|
||||
/turf/closed/wall/mineral/titanium/interior,
|
||||
/area/shuttle/escape)
|
||||
"aP" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/escape)
|
||||
"aQ" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Emergency Shuttle Airlock"
|
||||
},
|
||||
/obj/docking_port/mobile/emergency{
|
||||
height = 9;
|
||||
name = "Tram emergency shuttle";
|
||||
width = 32
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/escape)
|
||||
"aR" = (
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
pixel_x = -5;
|
||||
pixel_y = 30
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/escape)
|
||||
"aS" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/tiled/blue,
|
||||
/area/shuttle/escape)
|
||||
"aT" = (
|
||||
/obj/machinery/door/airlock/public/glass{
|
||||
name = "Emergency Shuttle Infirmary"
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/yellow,
|
||||
/area/shuttle/escape)
|
||||
"aU" = (
|
||||
/turf/open/openspace/airless,
|
||||
/area/template_noop)
|
||||
"aV" = (
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/radio/intercom{
|
||||
pixel_y = 25
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/escape)
|
||||
"aW" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Emergency Shuttle Airlock"
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/escape)
|
||||
"aX" = (
|
||||
/obj/structure/table/optable,
|
||||
/obj/item/storage/backpack/duffelbag/med/surgery,
|
||||
/obj/item/clothing/mask/surgical,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/escape)
|
||||
"aY" = (
|
||||
/obj/structure/sink{
|
||||
pixel_y = 18
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/white,
|
||||
/area/shuttle/escape)
|
||||
"aZ" = (
|
||||
/turf/open/floor/mineral/titanium/white,
|
||||
/area/shuttle/escape)
|
||||
"ba" = (
|
||||
/obj/machinery/shower{
|
||||
pixel_y = 18
|
||||
},
|
||||
/obj/machinery/vending/wallmed{
|
||||
name = "Emergency NanoMed";
|
||||
pixel_y = 32;
|
||||
use_power = 0
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/white,
|
||||
/area/shuttle/escape)
|
||||
"bb" = (
|
||||
/obj/machinery/stasis,
|
||||
/obj/item/radio/intercom{
|
||||
pixel_y = 25
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/escape)
|
||||
"bc" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/reagent_containers/glass/bottle/epinephrine{
|
||||
pixel_x = 6
|
||||
},
|
||||
/obj/item/reagent_containers/glass/bottle/multiver{
|
||||
pixel_x = -3
|
||||
},
|
||||
/obj/item/reagent_containers/glass/bottle/epinephrine{
|
||||
pixel_x = -3;
|
||||
pixel_y = 8
|
||||
},
|
||||
/obj/item/reagent_containers/glass/bottle/multiver{
|
||||
pixel_x = 6;
|
||||
pixel_y = 8
|
||||
},
|
||||
/obj/item/reagent_containers/syringe/epinephrine{
|
||||
pixel_x = 3;
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/item/reagent_containers/syringe/epinephrine{
|
||||
pixel_x = 4;
|
||||
pixel_y = 1
|
||||
},
|
||||
/obj/item/reagent_containers/syringe/epinephrine{
|
||||
pixel_x = -2;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/reagent_containers/syringe/epinephrine{
|
||||
pixel_x = 2;
|
||||
pixel_y = 8
|
||||
},
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/white,
|
||||
/area/shuttle/escape)
|
||||
"bd" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/storage/firstaid/o2{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/storage/firstaid/toxin,
|
||||
/obj/machinery/light{
|
||||
dir = 4;
|
||||
light_color = "#e8eaff"
|
||||
},
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
pixel_x = 27
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/white,
|
||||
/area/shuttle/escape)
|
||||
"be" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/defibrillator/loaded,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/escape)
|
||||
"bf" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/storage/firstaid/fire,
|
||||
/obj/item/storage/firstaid/regular{
|
||||
pixel_x = 2;
|
||||
pixel_y = 3
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/escape)
|
||||
"bg" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Emergency Shuttle Airlock"
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/white,
|
||||
/area/shuttle/escape)
|
||||
"bh" = (
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/shuttle/engine/heater,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/escape)
|
||||
"bi" = (
|
||||
/obj/structure/shuttle/engine/propulsion,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/escape)
|
||||
"bj" = (
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/glass/reinforced,
|
||||
/area/shuttle/escape)
|
||||
"bk" = (
|
||||
/obj/structure/window/reinforced,
|
||||
/turf/open/floor/glass/reinforced,
|
||||
/area/shuttle/escape)
|
||||
"bl" = (
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/glass/reinforced,
|
||||
/area/shuttle/escape)
|
||||
|
||||
(1,1,1) = {"
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aj
|
||||
ak
|
||||
ak
|
||||
aj
|
||||
aa
|
||||
aj
|
||||
ak
|
||||
ak
|
||||
aM
|
||||
ak
|
||||
aQ
|
||||
ak
|
||||
aj
|
||||
aU
|
||||
aj
|
||||
ak
|
||||
aW
|
||||
ab
|
||||
aW
|
||||
ak
|
||||
ak
|
||||
aj
|
||||
aU
|
||||
aj
|
||||
ak
|
||||
ak
|
||||
ak
|
||||
bh
|
||||
bi
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ab
|
||||
ak
|
||||
ap
|
||||
at
|
||||
ak
|
||||
aa
|
||||
ak
|
||||
aB
|
||||
aH
|
||||
aI
|
||||
aO
|
||||
aE
|
||||
aS
|
||||
ak
|
||||
aU
|
||||
ak
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aP
|
||||
ak
|
||||
aU
|
||||
ak
|
||||
aX
|
||||
bc
|
||||
be
|
||||
bh
|
||||
bi
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
af
|
||||
al
|
||||
aq
|
||||
aq
|
||||
av
|
||||
ax
|
||||
ak
|
||||
aC
|
||||
aI
|
||||
aN
|
||||
aO
|
||||
aR
|
||||
aS
|
||||
av
|
||||
ax
|
||||
ak
|
||||
aF
|
||||
aK
|
||||
aK
|
||||
aK
|
||||
aK
|
||||
aE
|
||||
av
|
||||
ax
|
||||
ak
|
||||
aY
|
||||
aZ
|
||||
aZ
|
||||
ak
|
||||
bj
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
ab
|
||||
ac
|
||||
ag
|
||||
am
|
||||
an
|
||||
am
|
||||
ab
|
||||
ay
|
||||
ak
|
||||
ab
|
||||
aJ
|
||||
ab
|
||||
ak
|
||||
aE
|
||||
aS
|
||||
ab
|
||||
az
|
||||
ab
|
||||
aE
|
||||
aL
|
||||
aL
|
||||
aL
|
||||
aL
|
||||
aE
|
||||
ab
|
||||
az
|
||||
ab
|
||||
aZ
|
||||
aZ
|
||||
aZ
|
||||
ab
|
||||
bk
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
ab
|
||||
ad
|
||||
ah
|
||||
an
|
||||
an
|
||||
an
|
||||
aw
|
||||
az
|
||||
aw
|
||||
aD
|
||||
aE
|
||||
aE
|
||||
aP
|
||||
aE
|
||||
aE
|
||||
aT
|
||||
az
|
||||
aT
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aT
|
||||
az
|
||||
aT
|
||||
aZ
|
||||
aZ
|
||||
aZ
|
||||
bg
|
||||
bk
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
ab
|
||||
ae
|
||||
ai
|
||||
am
|
||||
an
|
||||
am
|
||||
ab
|
||||
az
|
||||
ab
|
||||
aE
|
||||
aK
|
||||
aK
|
||||
aK
|
||||
aK
|
||||
aE
|
||||
ab
|
||||
az
|
||||
ab
|
||||
aE
|
||||
aK
|
||||
aK
|
||||
aK
|
||||
aK
|
||||
aE
|
||||
ab
|
||||
az
|
||||
ab
|
||||
aZ
|
||||
aZ
|
||||
aZ
|
||||
ab
|
||||
bk
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
af
|
||||
ao
|
||||
ar
|
||||
ar
|
||||
av
|
||||
aA
|
||||
ak
|
||||
aF
|
||||
aL
|
||||
aL
|
||||
aL
|
||||
aL
|
||||
aE
|
||||
av
|
||||
aA
|
||||
ak
|
||||
aR
|
||||
aL
|
||||
aL
|
||||
aL
|
||||
aL
|
||||
aE
|
||||
av
|
||||
aA
|
||||
ak
|
||||
ba
|
||||
aZ
|
||||
aZ
|
||||
ak
|
||||
bl
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ab
|
||||
ak
|
||||
as
|
||||
au
|
||||
ak
|
||||
aa
|
||||
ak
|
||||
aG
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
ak
|
||||
aU
|
||||
ak
|
||||
aV
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
aE
|
||||
ak
|
||||
aU
|
||||
ak
|
||||
bb
|
||||
bd
|
||||
bf
|
||||
bh
|
||||
bi
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aj
|
||||
ak
|
||||
ak
|
||||
aj
|
||||
aa
|
||||
aj
|
||||
ak
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ak
|
||||
aj
|
||||
aU
|
||||
aj
|
||||
ak
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ak
|
||||
aj
|
||||
aU
|
||||
aj
|
||||
ak
|
||||
ak
|
||||
ak
|
||||
bh
|
||||
bi
|
||||
"}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"version": 1,
|
||||
"map_name": "Tramstation",
|
||||
"map_path": "map_files/tramstation",
|
||||
"map_file": "tramstation.dmm",
|
||||
"shuttles": {
|
||||
"cargo": "cargo_box",
|
||||
"ferry": "ferry_fancy",
|
||||
"whiteship": "whiteship_tram",
|
||||
"emergency": "emergency_tram"
|
||||
},
|
||||
"traits": [
|
||||
{
|
||||
"Up": 1,
|
||||
"Baseturf": "/turf/open/floor/plating/asteroid/airless",
|
||||
"Linkage": "Cross"
|
||||
},
|
||||
{
|
||||
"Down": -1,
|
||||
"Baseturf": "/turf/open/openspace",
|
||||
"Linkage": "Cross"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -34,6 +34,7 @@
|
||||
#define MEDAL_CHEM_TUT "Beginner Chemist"
|
||||
#define MEDAL_HOT_DAMN "Hot Damn!"
|
||||
#define MEDAL_CAYENNE_DISK "Very Important Piscis"
|
||||
#define MEDAL_TRAM_SURFER "Tram Surfer"
|
||||
|
||||
//Skill medal hub IDs
|
||||
#define MEDAL_LEGENDARY_MINER "Legendary Miner"
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
PROCESSING_SUBSYSTEM_DEF(tramprocess)
|
||||
name = "Tram Process"
|
||||
wait = 1
|
||||
@@ -165,3 +165,9 @@
|
||||
desc = "You can rest well now."
|
||||
database_id = MEDAL_CAYENNE_DISK
|
||||
icon = "cayenne_disk"
|
||||
|
||||
/datum/award/achievement/misc/tram_surfer
|
||||
name = "Tram Surfer"
|
||||
desc = "Lights out, guerilla radio!"
|
||||
database_id = MEDAL_TRAM_SURFER
|
||||
icon = "tram_surfer"
|
||||
|
||||
@@ -342,6 +342,12 @@
|
||||
credit_cost = CARGO_CRATE_VALUE * 2
|
||||
description = "Despite its namesake, this shuttle is actually only slightly smaller than standard, and still complete with a brig and medbay."
|
||||
|
||||
/datum/map_template/shuttle/emergency/tram
|
||||
suffix = "tram"
|
||||
name = "Tram Station Emergency Shuttle"
|
||||
credit_cost = CARGO_CRATE_VALUE * 4
|
||||
description = "A train but in space, choo choo!"
|
||||
|
||||
/datum/map_template/shuttle/emergency/scrapheap
|
||||
suffix = "scrapheap"
|
||||
name = "Standby Evacuation Vessel \"Scrapheap Challenge\""
|
||||
@@ -498,6 +504,10 @@
|
||||
suffix = "donut"
|
||||
name = "NT Long-Distance Bluespace Jumper"
|
||||
|
||||
/datum/map_template/shuttle/whiteship/tram
|
||||
suffix = "tram"
|
||||
name = "NT Long-Distance Bluespace Freighter"
|
||||
|
||||
/datum/map_template/shuttle/whiteship/delta
|
||||
suffix = "delta"
|
||||
name = "NT Frigate"
|
||||
|
||||
@@ -332,6 +332,45 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/maintenance/space_hut/observatory
|
||||
name = "Space Observatory"
|
||||
|
||||
/area/maintenance/tram
|
||||
name = "Primary Tram Maintenance"
|
||||
|
||||
/area/maintenance/tram/left
|
||||
name = "Port Tram Underpass"
|
||||
icon_state = "mainttramL"
|
||||
|
||||
/area/maintenance/tram/mid
|
||||
name = "Central Tram Underpass"
|
||||
icon_state = "mainttramM"
|
||||
|
||||
/area/maintenance/tram/right
|
||||
name = "Starboard Tram Underpass"
|
||||
icon_state = "mainttramR"
|
||||
|
||||
//Radation storm shelter
|
||||
/area/maintenance/radshelter
|
||||
name = "Radstorm Shelter"
|
||||
icon_state = "green"
|
||||
|
||||
/area/maintenance/radshelter/medical
|
||||
name = "Medical Radstorm Shelter"
|
||||
|
||||
/area/maintenance/radshelter/sec
|
||||
name = "Security Radstorm Shelter"
|
||||
|
||||
/area/maintenance/radshelter/service
|
||||
name = "Service Radstorm Shelter"
|
||||
|
||||
/area/maintenance/radshelter/civil
|
||||
name = "Civilian Radstorm Shelter"
|
||||
|
||||
/area/maintenance/radshelter/sci
|
||||
name = "Science Radstorm Shelter"
|
||||
|
||||
/area/maintenance/radshelter/cargo
|
||||
name = "Cargo Radstorm Shelter"
|
||||
|
||||
|
||||
//Hallway
|
||||
|
||||
/area/hallway
|
||||
@@ -364,6 +403,21 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Upper Central Primary Hallway"
|
||||
icon_state = "hallC"
|
||||
|
||||
/area/hallway/primary/tram
|
||||
name = "Primary Tram"
|
||||
|
||||
/area/hallway/primary/tram/left
|
||||
name = "Port Tram Dock"
|
||||
icon_state = "halltramL"
|
||||
|
||||
/area/hallway/primary/tram/center
|
||||
name = "Central Tram Dock"
|
||||
icon_state = "halltramM"
|
||||
|
||||
/area/hallway/primary/tram/right
|
||||
name = "Starboard Tram Dock"
|
||||
icon_state = "halltramR"
|
||||
|
||||
/area/hallway/secondary/command
|
||||
name = "Command Hallway"
|
||||
icon_state = "bridge_hallway"
|
||||
@@ -372,6 +426,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Construction Area"
|
||||
icon_state = "construction"
|
||||
|
||||
/area/hallway/secondary/construction/engineering
|
||||
name = "Engineering Hallway"
|
||||
|
||||
/area/hallway/secondary/exit
|
||||
name = "Escape Shuttle Hallway"
|
||||
icon_state = "escape"
|
||||
@@ -1239,6 +1296,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
airlock_wires = /datum/wires/airlock/science
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/science/breakroom
|
||||
name = "Science Break Room"
|
||||
|
||||
/area/science/lab
|
||||
name = "Research and Development"
|
||||
icon_state = "research"
|
||||
|
||||
@@ -321,3 +321,22 @@
|
||||
. = ..()
|
||||
. += "<span class='notice'>There's a small inscription on the button...</span>"
|
||||
. += "<span class='notice'>THIS CALLS THE ELEVATOR! IT DOES NOT OPERATE IT! Interact with the elevator itself to use it!</span>"
|
||||
|
||||
/obj/machinery/button/tram
|
||||
name = "tram caller"
|
||||
desc = "A button for calling the tram. It has a speakerbox in it with some internals."
|
||||
icon_state = "launcher"
|
||||
skin = "launcher"
|
||||
device_type = /obj/item/assembly/control/tram
|
||||
req_access = list()
|
||||
id = 1
|
||||
|
||||
/obj/machinery/button/tram/setup_device()
|
||||
var/obj/item/assembly/control/tram/tram_device = device
|
||||
tram_device.initial_id = id
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/button/tram/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>There's a small inscription on the button...</span>"
|
||||
. += "<span class='notice'>THIS CALLS THE TRAM! IT DOES NOT OPERATE IT! The console on the tram tells it where to go!</span>"
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
|
||||
|
||||
/obj/machinery/computer/tram_controls
|
||||
name = "tram controls"
|
||||
desc = "An interface for the tram that lets you tell the tram where to go and hopefully it makes it there. I'm here to describe the controls to you, not to inspire confidence."
|
||||
icon_screen = "tram"
|
||||
icon_keyboard = "atmos_key"
|
||||
circuit = /obj/item/circuitboard/computer/tram_controls
|
||||
|
||||
var/obj/structure/industrial_lift/tram/tram_part
|
||||
light_color = LIGHT_COLOR_GREEN
|
||||
|
||||
/obj/machinery/computer/tram_controls/LateInitialize()
|
||||
. = ..()
|
||||
//find the tram, late so the tram is all... set up so when this is called? i'm seriously stupid and 90% of what i do consists of barely educated guessing :)
|
||||
find_tram()
|
||||
|
||||
/obj/machinery/computer/tram_controls/proc/find_tram()
|
||||
var/obj/structure/industrial_lift/tram/tram_struct = locate(/obj/structure/industrial_lift/tram) in GLOB.lifts
|
||||
tram_part = tram_struct //possibly setting to something null, that's fine, but
|
||||
tram_part.find_our_location()
|
||||
|
||||
/obj/machinery/computer/tram_controls/ui_state(mob/user)
|
||||
return GLOB.not_incapacitated_state
|
||||
|
||||
/obj/machinery/computer/tram_controls/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "TramControl", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/computer/tram_controls/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["moving"] = tram_part.travelling
|
||||
data["broken"] = tram_part ? FALSE : TRUE
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/tram_controls/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["destinations"] = get_destinations()
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/tram_controls/proc/get_destinations()
|
||||
. = list()
|
||||
for(var/obj/effect/landmark/tram/destination in GLOB.landmarks_list)
|
||||
var/list/this_destination = list()
|
||||
this_destination["here"] = destination == tram_part.from_where
|
||||
this_destination["name"] = destination.name
|
||||
this_destination["dest_icons"] = destination.tgui_icons
|
||||
this_destination["id"] = destination.destination_id
|
||||
. += list(this_destination)
|
||||
|
||||
/obj/machinery/computer/tram_controls/ui_act(action, params)
|
||||
. = ..()
|
||||
if(. || tram_part.travelling)
|
||||
return
|
||||
var/destination_name = params["destination"]
|
||||
var/obj/effect/landmark/tram/to_where
|
||||
for(var/obj/effect/landmark/tram/destination in GLOB.landmarks_list)
|
||||
if(destination.name == destination_name)
|
||||
to_where = destination
|
||||
if(!to_where)
|
||||
CRASH("Controls couldn't find the destination \"[destination_name]\"!")
|
||||
if(tram_part.controls_locked || tram_part.travelling) // someone else started
|
||||
return
|
||||
tram_part.tram_travel(tram_part.from_where, to_where)
|
||||
update_static_data(usr) //show new location of tram
|
||||
@@ -321,6 +321,10 @@
|
||||
name = "Bounty Pad (Computer Board)"
|
||||
build_path = /obj/machinery/computer/piratepad_control/civilian
|
||||
|
||||
/obj/item/circuitboard/computer/tram_controls
|
||||
name = "Tram Controls (Computer Board)"
|
||||
build_path = /obj/machinery/computer/tram_controls
|
||||
|
||||
//Medical
|
||||
|
||||
/obj/item/circuitboard/computer/crew
|
||||
|
||||
@@ -273,3 +273,24 @@
|
||||
|
||||
/obj/structure/fluff/hedge/opaque //useful for mazes and such
|
||||
opacity = TRUE
|
||||
|
||||
/obj/structure/fluff/tram_rail
|
||||
name = "tram railing"
|
||||
desc = "Great for trams, not so great for skating."
|
||||
icon = 'icons/obj/tram_railing.dmi'
|
||||
icon_state = "rail"
|
||||
layer = MID_TURF_LAYER
|
||||
plane = FLOOR_PLANE
|
||||
deconstructible = TRUE
|
||||
|
||||
/obj/structure/fluff/tram_rail/floor
|
||||
icon_state = "rail_floor"
|
||||
|
||||
|
||||
/obj/structure/fluff/tram_rail/end
|
||||
icon_state = "railend"
|
||||
|
||||
/obj/structure/fluff/tram_rail/anchor
|
||||
name = "tram railing anchor"
|
||||
icon_state = "anchor"
|
||||
|
||||
|
||||
@@ -100,6 +100,10 @@
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
rad_insulation = RAD_LIGHT_INSULATION
|
||||
|
||||
/obj/structure/holosign/barrier/atmos/sturdy
|
||||
name = "sturdy holofirelock"
|
||||
max_integrity = 150
|
||||
|
||||
/obj/structure/holosign/barrier/atmos/Initialize()
|
||||
. = ..()
|
||||
air_update_turf(TRUE, TRUE)
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
var/min_x = world.maxx
|
||||
var/min_y = world.maxy
|
||||
|
||||
|
||||
set_controls(LOCKED)
|
||||
for(var/p in lift_platforms)
|
||||
var/obj/structure/industrial_lift/lift_platform = p
|
||||
@@ -90,12 +91,12 @@
|
||||
//Go along the Y axis from max to min, from up to down
|
||||
for(var/y in max_y to min_y step -1)
|
||||
var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z))
|
||||
lift_platform.travel(going)
|
||||
lift_platform?.travel(going)
|
||||
else
|
||||
//Go along the Y axis from min to max, from down to up
|
||||
for(var/y in min_y to max_y)
|
||||
var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z))
|
||||
lift_platform.travel(going)
|
||||
lift_platform?.travel(going)
|
||||
else
|
||||
//Go along the X axis from max to min, from right to left
|
||||
for(var/x in max_x to min_x step -1)
|
||||
@@ -103,12 +104,12 @@
|
||||
//Go along the Y axis from max to min, from up to down
|
||||
for(var/y in max_y to min_y step -1)
|
||||
var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z))
|
||||
lift_platform.travel(going)
|
||||
lift_platform?.travel(going)
|
||||
else
|
||||
//Go along the Y axis from min to max, from down to up
|
||||
for(var/y in min_y to max_y)
|
||||
var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z))
|
||||
lift_platform.travel(going)
|
||||
lift_platform?.travel(going)
|
||||
set_controls(UNLOCKED)
|
||||
|
||||
///Check destination turfs
|
||||
@@ -163,6 +164,7 @@ GLOBAL_LIST_EMPTY(lifts)
|
||||
RegisterSignal(src, COMSIG_MOVABLE_CROSSED, .proc/AddItemOnLift)
|
||||
RegisterSignal(loc, COMSIG_ATOM_CREATED, .proc/AddItemOnLift)//For atoms created on platform
|
||||
RegisterSignal(src, COMSIG_MOVABLE_UNCROSSED, .proc/RemoveItemFromLift)
|
||||
RegisterSignal(src, COMSIG_MOVABLE_BUMP, .proc/GracefullyBreak)
|
||||
|
||||
if(!lift_master_datum)
|
||||
lift_master_datum = new(src)
|
||||
@@ -179,11 +181,33 @@ GLOBAL_LIST_EMPTY(lifts)
|
||||
UnregisterSignal(AM, COMSIG_PARENT_QDELETING)
|
||||
|
||||
/obj/structure/industrial_lift/proc/AddItemOnLift(datum/source, atom/movable/AM)
|
||||
if(istype(AM, /obj/structure/fluff/tram_rail))
|
||||
return
|
||||
if(AM in lift_load)
|
||||
return
|
||||
LAZYADD(lift_load, AM)
|
||||
RegisterSignal(AM, COMSIG_PARENT_QDELETING, .proc/RemoveItemFromLift)
|
||||
|
||||
/**
|
||||
* Signal for when the tram runs into a field of which it cannot go through.
|
||||
* Stops the train's travel fully, sends a message, and destroys the train.
|
||||
* Arguments:
|
||||
* bumped_atom - The atom this tram bumped into
|
||||
*/
|
||||
/obj/structure/industrial_lift/proc/GracefullyBreak(atom/bumped_atom)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(istype(bumped_atom, /obj/machinery/field))
|
||||
return
|
||||
|
||||
bumped_atom.visible_message("<span class='userdanger'>[src] crashes into the field violently!</span>")
|
||||
for(var/obj/structure/industrial_lift/tram/tram_part as anything in lift_master_datum.lift_platforms)
|
||||
tram_part.travel_distance = 0
|
||||
tram_part.travelling = FALSE
|
||||
if(prob(15) || locate(/mob/living) in tram_part.lift_load) //always go boom on people on the track
|
||||
explosion(get_turf(tram_part),rand(0,1),2,3) //50% chance of gib
|
||||
qdel(tram_part)
|
||||
|
||||
/obj/structure/industrial_lift/proc/lift_platform_expansion(datum/lift_master/lift_master_datum)
|
||||
. = list()
|
||||
for(var/direction in GLOB.cardinals)
|
||||
@@ -199,17 +223,46 @@ GLOBAL_LIST_EMPTY(lifts)
|
||||
destination = get_step_multiz(src, going)
|
||||
else
|
||||
destination = going
|
||||
if(going == DOWN)//make sure this stays pre-item moving, or you'll crush anything on the lift under the lift.
|
||||
if(going == DOWN)
|
||||
for(var/mob/living/crushed in destination.contents)
|
||||
to_chat(crushed, "<span class='userdanger'>You are crushed by [src]!</span>")
|
||||
crushed.gib(FALSE,FALSE,FALSE)//the nicest kind of gibbing, keeping everything intact.
|
||||
else if(going != UP) //can't really crush something upwards
|
||||
for(var/obj/structure/anchortrouble in destination.contents)
|
||||
if(!QDELETED(anchortrouble) && anchortrouble.anchored && (!istype(anchortrouble, /obj/structure/holosign)) && anchortrouble.layer >= GAS_PUMP_LAYER) //to avoid pipes, wires, etc
|
||||
playsound(src, 'sound/effects/bang.ogg', 50, TRUE)
|
||||
visible_message("<span class='notice'>[src] smashes through [anchortrouble]!</span>")
|
||||
anchortrouble.deconstruct(FALSE)
|
||||
for(var/mob/living/collided in destination.contents)
|
||||
to_chat(collided, "<span class='userdanger'>[src] collides into you!</span>")
|
||||
playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
var/damage = rand(5,10)
|
||||
collided.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD)
|
||||
collided.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST)
|
||||
collided.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG)
|
||||
collided.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG)
|
||||
collided.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM)
|
||||
collided.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM)
|
||||
|
||||
if(QDELETED(collided)) //in case it was a mob that dels on death
|
||||
continue
|
||||
var/turf/T = get_turf(src)
|
||||
T.add_mob_blood(collided)
|
||||
|
||||
collided.throw_at()
|
||||
//if going EAST, will turn to the NORTHEAST or SOUTHEAST and throw the ran over guy away
|
||||
var/atom/throw_target = get_edge_target_turf(collided, turn(going, pick(45, -45)))
|
||||
collided.throw_at(throw_target, 200, 4)
|
||||
forceMove(destination)
|
||||
for(var/am in things2move)
|
||||
if(isnull(am))
|
||||
LAZYREMOVE(lift_load, am)//after enough use, one of these always ends up inside despite signals. when they show, we need to scrub them out.
|
||||
continue
|
||||
var/atom/movable/thing = am
|
||||
thing.forceMove(destination)
|
||||
|
||||
/obj/structure/industrial_lift/proc/use(mob/user, is_ghost=FALSE)
|
||||
if(is_ghost && !in_range(src, user))
|
||||
/obj/structure/industrial_lift/proc/use(mob/living/user)
|
||||
if(!isliving(user) || !in_range(src, user) || user.combat_mode)
|
||||
return
|
||||
|
||||
var/list/tool_list = list()
|
||||
@@ -226,8 +279,8 @@ GLOBAL_LIST_EMPTY(lifts)
|
||||
add_fingerprint(user)
|
||||
return
|
||||
var/result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
if(!is_ghost && !in_range(src, user))
|
||||
return // nice try
|
||||
if(!isliving(user) || !in_range(src, user) || user.combat_mode)
|
||||
return //nice try
|
||||
switch(result)
|
||||
if("Up")
|
||||
lift_master_datum.MoveLift(UP, user)
|
||||
@@ -338,3 +391,103 @@ GLOBAL_LIST_EMPTY(lifts)
|
||||
return
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/structure/industrial_lift/tram
|
||||
name = "tram"
|
||||
desc = "A tram for traversing the station."
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "titanium_yellow"
|
||||
base_icon_state = null
|
||||
smoothing_flags = NONE
|
||||
smoothing_groups = null
|
||||
canSmoothWith = null
|
||||
//kind of a centerpiece of the station, so pretty tough to destroy
|
||||
armor = list(MELEE = 80, BULLET = 80, LASER = 80, ENERGY = 80, BOMB = 100, BIO = 80, RAD = 80, FIRE = 100, ACID = 100)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
var/travelling = FALSE
|
||||
var/travel_distance = 0
|
||||
///for finding the landmark initially - should be the exact same as the landmark's destination id.
|
||||
var/initial_id = "middle_part"
|
||||
var/obj/effect/landmark/tram/from_where
|
||||
var/travel_direction
|
||||
var/time_inbetween_moves = 1
|
||||
|
||||
/obj/structure/industrial_lift/tram/central//that's a surprise tool that can help us later
|
||||
|
||||
/obj/structure/industrial_lift/tram/LateInitialize()
|
||||
. = ..()
|
||||
find_our_location()
|
||||
|
||||
/obj/structure/industrial_lift/tram/proc/find_our_location()
|
||||
if(!from_where)
|
||||
for(var/obj/effect/landmark/tram/our_location in GLOB.landmarks_list)
|
||||
if(our_location.destination_id == initial_id)
|
||||
from_where = our_location
|
||||
break
|
||||
|
||||
/obj/structure/industrial_lift/tram/central/find_our_location() //the tram knows where it is by knowing where it isn't
|
||||
..()
|
||||
for(var/location in lift_master_datum.lift_platforms)
|
||||
var/obj/structure/industrial_lift/tram/tram_location = location
|
||||
var/turf/turf = get_turf(src)
|
||||
var/where_we_are = locate(/obj/effect/landmark/tram) in turf.contents
|
||||
if(where_we_are)
|
||||
tram_location.from_where = where_we_are //this gets set by the tram movement too but this actually makes sure we're at the dock we were moved to to prevent blender mode
|
||||
|
||||
/obj/structure/industrial_lift/tram/use(mob/user) //dont click the floor dingus we use computers now
|
||||
return
|
||||
|
||||
/obj/structure/industrial_lift/tram/process(delta_time)
|
||||
if(!travel_distance)
|
||||
addtimer(CALLBACK(src, .proc/unlock_controls), 3 SECONDS)
|
||||
return PROCESS_KILL
|
||||
else
|
||||
travel_distance--
|
||||
lift_master_datum.MoveLiftHorizontal(travel_direction, z)
|
||||
|
||||
/obj/structure/industrial_lift/tram/proc/tram_travel(obj/effect/landmark/tram/from_where, obj/effect/landmark/tram/to_where)
|
||||
visible_message("<span class='notice'>[src] has been called to the [to_where]!</span")
|
||||
|
||||
lift_master_datum.set_controls(LOCKED)
|
||||
for(var/obj/structure/industrial_lift/tram/other_tram_part as anything in lift_master_datum.lift_platforms) //only thing everyone needs to know is the new location.
|
||||
if(other_tram_part.travelling) //wee woo wee woo there was a double action queued. damn multi tile structs
|
||||
return //we don't care to undo locked controls, though, as that will resolve itself
|
||||
other_tram_part.travelling = TRUE
|
||||
other_tram_part.from_where = to_where
|
||||
travel_direction = get_dir(from_where, to_where)
|
||||
travel_distance = get_dist(from_where, to_where)
|
||||
//first movement is immediate
|
||||
lift_master_datum.MoveLiftHorizontal(travel_direction, z)
|
||||
travel_distance--
|
||||
|
||||
START_PROCESSING(SStramprocess, src)
|
||||
|
||||
/obj/structure/industrial_lift/tram/proc/unlock_controls()
|
||||
visible_message("<span class='notice'>[src]'s controls are now unlocked.</span")
|
||||
for(var/lift in lift_master_datum.lift_platforms) //only thing everyone needs to know is the new location.
|
||||
var/obj/structure/industrial_lift/tram/other_tram_part = lift
|
||||
other_tram_part.travelling = FALSE
|
||||
other_tram_part.find_our_location()
|
||||
lift_master_datum.set_controls(UNLOCKED)
|
||||
|
||||
/obj/effect/landmark/tram
|
||||
name = "tram destination" //the tram buttons will mention this.
|
||||
icon_state = "tram"
|
||||
var/destination_id
|
||||
///icons for the tgui console to list out for what is at this location
|
||||
var/list/tgui_icons = list()
|
||||
|
||||
/obj/effect/landmark/tram/left_part
|
||||
name = "West Wing"
|
||||
destination_id = "left_part"
|
||||
tgui_icons = list("Arrivals" = "plane-arrival", "Service" = "cocktail")
|
||||
|
||||
/obj/effect/landmark/tram/middle_part
|
||||
name = "Central Wing"
|
||||
destination_id = "middle_part"
|
||||
tgui_icons = list("Command" = "bullhorn", "Security" = "gavel", "Medical" = "plus", "Engineering" = "wrench")
|
||||
|
||||
/obj/effect/landmark/tram/right_part
|
||||
name = "East Wing"
|
||||
destination_id = "right_part"
|
||||
tgui_icons = list("Departures" = "plane-departure", "Cargo" = "box")
|
||||
|
||||
@@ -179,3 +179,11 @@
|
||||
desc = "A warning sign which reads 'ESCAPE PODS'."
|
||||
icon_state = "pods"
|
||||
is_editable = TRUE
|
||||
|
||||
/obj/structure/sign/warning/radshelter
|
||||
name = "\improper RADSTORM SHELTER sign"
|
||||
sign_change_name = "Location - Radstorm Shelter"
|
||||
desc = "A warning sign which reads 'RADSTORM SHELTER'."
|
||||
icon_state = "radshelter"
|
||||
is_editable = TRUE
|
||||
|
||||
|
||||
@@ -236,6 +236,14 @@
|
||||
/obj/item/stack/ore/silver = 6, /obj/item/stack/ore/plasma = 15, /obj/item/stack/ore/iron = 40,
|
||||
/turf/closed/mineral/gibtonite = 2, /obj/item/stack/ore/bluespace_crystal = 1)
|
||||
|
||||
//extremely low chance of rare ores, meant mostly for populating stations with large amounts of asteroid
|
||||
/turf/closed/mineral/random/stationside
|
||||
icon_state = "rock_nochance"
|
||||
mineralChance = 4
|
||||
mineralSpawnChanceList = list(
|
||||
/obj/item/stack/ore/uranium = 1, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 3, /obj/item/stack/ore/titanium = 5,
|
||||
/obj/item/stack/ore/silver = 4, /obj/item/stack/ore/plasma = 3, /obj/item/stack/ore/iron = 50)
|
||||
|
||||
/turf/closed/mineral/random/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
@@ -491,6 +499,21 @@
|
||||
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
|
||||
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
|
||||
|
||||
//yoo RED ROCK RED ROCK
|
||||
|
||||
/turf/closed/mineral/asteroid
|
||||
name = "iron rock"
|
||||
icon = 'icons/turf/mining.dmi'
|
||||
icon_state = "redrock"
|
||||
smooth_icon = 'icons/turf/walls/red_wall.dmi'
|
||||
base_icon_state = "red_wall"
|
||||
|
||||
/turf/closed/mineral/random/stationside/asteroid
|
||||
name = "iron rock"
|
||||
icon = 'icons/turf/mining.dmi'
|
||||
smooth_icon = 'icons/turf/walls/red_wall.dmi'
|
||||
base_icon_state = "red_wall"
|
||||
|
||||
//GIBTONITE
|
||||
|
||||
/turf/closed/mineral/gibtonite
|
||||
|
||||
@@ -28,6 +28,9 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
|
||||
/turf/open/openspace/airless
|
||||
initial_gas_mix = AIRLESS_ATMOS
|
||||
|
||||
/turf/open/openspace/airless/planetary
|
||||
planetary_atmos = TRUE
|
||||
|
||||
/turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker
|
||||
. = ..()
|
||||
vis_contents += GLOB.openspace_backdrop_one_for_all //Special grey square for projecting backdrop darkness filter on it.
|
||||
|
||||
@@ -214,3 +214,46 @@
|
||||
lift.lift_master_datum.set_controls(UNLOCKED)
|
||||
|
||||
#undef FLOOR_TRAVEL_TIME
|
||||
|
||||
/obj/item/assembly/control/tram
|
||||
name = "tram call button"
|
||||
desc = "A small device used to bring trams to you."
|
||||
///for finding the landmark initially - should be the exact same as the landmark's destination id.
|
||||
var/initial_id
|
||||
///this is our destination's landmark, so we only have to find it the first time.
|
||||
var/obj/effect/landmark/tram/to_where
|
||||
|
||||
/obj/item/assembly/control/tram/activate()
|
||||
if(cooldown)
|
||||
return
|
||||
cooldown = TRUE
|
||||
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 2 SECONDS)
|
||||
var/obj/structure/industrial_lift/tram/tram_part
|
||||
|
||||
var/obj/machinery/computer/tram_controls/computer = locate(/obj/machinery/computer/tram_controls) in GLOB.machines
|
||||
tram_part = computer?.tram_part
|
||||
if(!tram_part)
|
||||
say("The tram is not responding to call signals. Please send a technician to repair the internals of the tram.")
|
||||
return
|
||||
if(!tram_part.from_where) //edge case where the tram has not moved yet and set up it's landmarks but has been called
|
||||
for(var/obj/effect/landmark/tram/tram_landmark in GLOB.landmarks_list)
|
||||
if(tram_landmark.destination_id == tram_part.initial_id)
|
||||
tram_part.from_where = tram_landmark
|
||||
break
|
||||
//find where the tram is going to/is
|
||||
var/obj/effect/landmark/tram/from_where = tram_part.from_where
|
||||
if(tram_part.travelling) //in use
|
||||
say("The tram is already travelling to [from_where].")
|
||||
return
|
||||
if(!to_where)
|
||||
//find where the tram needs to go to (our destination). only needs to happen the first time
|
||||
for(var/obj/effect/landmark/tram/our_destination in GLOB.landmarks_list)
|
||||
if(our_destination.destination_id == initial_id)
|
||||
to_where = our_destination
|
||||
break
|
||||
if(from_where == to_where) //already here
|
||||
say("The tram is already here. Please board the tram and select a destination.")
|
||||
return
|
||||
|
||||
say("The tram has been called to [to_where]. Please wait for its arrival.")
|
||||
tram_part.tram_travel(from_where, to_where)
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
icon_state = "pamphlet"
|
||||
show_written_words = FALSE
|
||||
|
||||
/obj/item/paper/pamphlet/radstorm
|
||||
name = "pamphlet - \'Radstorm Safety Measures and How to Not Become Monkey\'"
|
||||
info = "Has your station's preemptive radstorm safety alarm gone off and you don't see a nearby maintenance hatch to escape to? Never fear, for NT truly thinks of everything! \
|
||||
Several public-access shelters have been installed around the upper station with express purpose of protecting your fragile meaty bits from becoming the next medical disaster! \
|
||||
Please see subsection 4.3 V2-3 in your employee handbook for appropriate procedures to deal with excessive radiation damage if you do not make it to a shelter in time."
|
||||
|
||||
|
||||
/obj/item/paper/pamphlet/violent_video_games
|
||||
name = "pamphlet - \'Violent Video Games and You\'"
|
||||
|
||||
@@ -92,7 +92,6 @@
|
||||
shuttleId = "mining_common"
|
||||
possible_destinations = "commonmining_home;lavaland_common_away;landing_zone_dock;mining_public"
|
||||
|
||||
|
||||
/**********************Mining car (Crate like thing, not the rail car)**************************/
|
||||
|
||||
/obj/structure/closet/crate/miningcar
|
||||
|
||||
@@ -113,7 +113,8 @@
|
||||
///Moves the vehicle forward and if it lands on a table, repeats
|
||||
/obj/vehicle/ridden/scooter/skateboard/proc/grind()
|
||||
step(src, dir)
|
||||
if(!has_buckled_mobs() || !(locate(/obj/structure/table) in loc.contents))
|
||||
if(!has_buckled_mobs() || !(locate(/obj/structure/table) in loc.contents) && !(locate(/obj/structure/fluff/tram_rail) in loc.contents))
|
||||
obj_flags = CAN_BE_HIT
|
||||
grinding = FALSE
|
||||
icon_state = "[initial(icon_state)]"
|
||||
return
|
||||
@@ -121,6 +122,7 @@
|
||||
var/mob/living/L = buckled_mobs[1]
|
||||
L.adjustStaminaLoss(instability*0.5)
|
||||
if (L.getStaminaLoss() >= 100)
|
||||
obj_flags = CAN_BE_HIT
|
||||
playsound(src, 'sound/effects/bang.ogg', 20, TRUE)
|
||||
unbuckle_mob(L)
|
||||
var/atom/throw_target = get_edge_target_turf(src, pick(GLOB.cardinals))
|
||||
|
||||
@@ -211,12 +211,14 @@
|
||||
/datum/action/vehicle/ridden/scooter/skateboard/ollie/Trigger()
|
||||
if(world.time > next_ollie)
|
||||
var/obj/vehicle/ridden/scooter/skateboard/vehicle = vehicle_target
|
||||
vehicle.obj_flags |= BLOCK_Z_OUT_DOWN
|
||||
if (vehicle.grinding)
|
||||
return
|
||||
var/mob/living/rider = owner
|
||||
var/turf/landing_turf = get_step(vehicle.loc, vehicle.dir)
|
||||
rider.adjustStaminaLoss(vehicle.instability*2)
|
||||
if (rider.getStaminaLoss() >= 100)
|
||||
vehicle.obj_flags &= ~CAN_BE_HIT
|
||||
playsound(src, 'sound/effects/bang.ogg', 20, TRUE)
|
||||
vehicle.unbuckle_mob(rider)
|
||||
rider.throw_at(landing_turf, 2, 2)
|
||||
@@ -232,8 +234,9 @@
|
||||
rider.Move(landing_turf, vehicle_target.dir)
|
||||
passtable_off(rider, VEHICLE_TRAIT)
|
||||
vehicle.pass_flags &= ~PASSTABLE
|
||||
if(locate(/obj/structure/table) in vehicle.loc.contents)
|
||||
if((locate(/obj/structure/table) in vehicle.loc.contents) || (locate(/obj/structure/fluff/tram_rail) in vehicle.loc.contents))
|
||||
/*if(locate(/obj/structure/fluff/tram_rail) in vehicle.loc.contents)
|
||||
rider.client.give_award(/datum/award/achievement/misc/tram_surfer, rider)*/
|
||||
vehicle.grinding = TRUE
|
||||
vehicle.icon_state = "[initial(vehicle.icon_state)]-grind"
|
||||
addtimer(CALLBACK(vehicle, /obj/vehicle/ridden/scooter/skateboard/.proc/grind), 2)
|
||||
next_ollie = world.time + 5
|
||||
|
||||
@@ -34,6 +34,11 @@ map icebox
|
||||
votable
|
||||
endmap
|
||||
|
||||
map tramstation
|
||||
minplayers 35
|
||||
votable
|
||||
endmap
|
||||
|
||||
map runtimestation
|
||||
endmap
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
author: "Cheshify"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Partially modularizes & updates Tramstation for use on Skyrat"
|
||||
- bugfix: "Finds and adds the missing 35th file change or whatever"
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 799 B |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
@@ -388,6 +388,7 @@
|
||||
#include "code\controllers\subsystem\processing\quirks.dm"
|
||||
#include "code\controllers\subsystem\processing\reagents.dm"
|
||||
#include "code\controllers\subsystem\processing\station.dm"
|
||||
#include "code\controllers\subsystem\processing\tramprocess.dm"
|
||||
#include "code\controllers\subsystem\processing\wet_floors.dm"
|
||||
#include "code\datums\action.dm"
|
||||
#include "code\datums\ai_laws.dm"
|
||||
@@ -980,6 +981,7 @@
|
||||
#include "code\game\machinery\computer\security.dm"
|
||||
#include "code\game\machinery\computer\station_alert.dm"
|
||||
#include "code\game\machinery\computer\teleporter.dm"
|
||||
#include "code\game\machinery\computer\tram_controls.dm"
|
||||
#include "code\game\machinery\computer\warrant.dm"
|
||||
#include "code\game\machinery\computer\chef_orders\chef_order.dm"
|
||||
#include "code\game\machinery\computer\chef_orders\order_datum.dm"
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
import { classes } from 'common/react';
|
||||
import { useBackend, useLocalState } from '../backend';
|
||||
import { Box, Button, Dimmer, Icon, Section, Stack } from '../components';
|
||||
import { Window } from '../layouts';
|
||||
|
||||
const DEPARTMENT2COLOR = {
|
||||
Arrivals: "black",
|
||||
Service: "olive",
|
||||
Command: "blue",
|
||||
Security: "red",
|
||||
Medical: "teal",
|
||||
Engineering: "yellow",
|
||||
Cargo: "brown",
|
||||
Departures: "white",
|
||||
};
|
||||
|
||||
const COLOR2BLURB = {
|
||||
blue: "This is the tram's current location.",
|
||||
green: "This is the selected destination.",
|
||||
transparent: "Click to set destination.",
|
||||
};
|
||||
|
||||
const marginNormal = 1;
|
||||
const marginDipped = 3;
|
||||
|
||||
const dipUnderCircle = (dest, dep) => {
|
||||
const index = Object.keys(dest.dest_icons).indexOf(dep);
|
||||
const dipped = index >= 1 && index <= 2;
|
||||
return dipped ? marginDipped : marginNormal;
|
||||
};
|
||||
|
||||
const BrokenTramDimmer = () => {
|
||||
return (
|
||||
<Dimmer>
|
||||
<Stack vertical>
|
||||
<Stack.Item>
|
||||
<Icon
|
||||
ml={7}
|
||||
color="red"
|
||||
name="exclamation"
|
||||
size={10}
|
||||
/>
|
||||
</Stack.Item>
|
||||
<Stack.Item fontSize="14px" color="red">
|
||||
No Tram Detected!
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
</Dimmer>
|
||||
);
|
||||
};
|
||||
|
||||
const MovingTramDimmer = () => {
|
||||
return (
|
||||
<Dimmer>
|
||||
<Stack vertical>
|
||||
<Stack.Item>
|
||||
<Icon
|
||||
ml={10}
|
||||
name="sync-alt"
|
||||
color="green"
|
||||
size={11}
|
||||
/>
|
||||
</Stack.Item>
|
||||
<Stack.Item mt={5} fontSize="14px" color="green">
|
||||
The tram is travelling to {current_loc[0].name}!
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
</Dimmer>
|
||||
);
|
||||
};
|
||||
|
||||
export const TramControl = (props, context) => {
|
||||
const { act, data } = useBackend(context);
|
||||
const {
|
||||
broken,
|
||||
moving,
|
||||
destinations,
|
||||
} = data;
|
||||
|
||||
const current_loc = (destinations ? destinations.filter(
|
||||
dest => dest.here === 1) : null);
|
||||
const [
|
||||
transitIndex,
|
||||
setTransitIndex,
|
||||
] = useLocalState(context, 'transit-index', 1);
|
||||
const MovingTramDimmer = () => {
|
||||
return (
|
||||
<Dimmer>
|
||||
<Stack vertical>
|
||||
<Stack.Item>
|
||||
<Icon
|
||||
ml={10}
|
||||
name="sync-alt"
|
||||
color="green"
|
||||
size={11}
|
||||
/>
|
||||
</Stack.Item>
|
||||
<Stack.Item mt={5} fontSize="14px" color="green">
|
||||
The tram is travelling to {current_loc[0].name}!
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
</Dimmer>
|
||||
);
|
||||
};
|
||||
const Destination = props => {
|
||||
const { dest } = props;
|
||||
const getDestColor = dest => {
|
||||
const here = dest.name === current_loc[0].name;
|
||||
const selected = transitIndex === destinations.indexOf(dest);
|
||||
return !current_loc ? "bad" : here ? "blue" : selected ? "green" : "transparent";
|
||||
};
|
||||
return (
|
||||
<Stack vertical>
|
||||
<Stack.Item ml={5}>
|
||||
<Button
|
||||
mr={4.38}
|
||||
color={getDestColor(dest)}
|
||||
circular
|
||||
compact
|
||||
height={5}
|
||||
width={5}
|
||||
tooltipPosition="top"
|
||||
tooltip={COLOR2BLURB[getDestColor(dest)]}
|
||||
onClick={() => setTransitIndex(destinations.indexOf(dest))} >
|
||||
<Icon ml={-2.1} mt={0.55} fontSize="60px" name="circle-o" />
|
||||
</Button>
|
||||
{destinations.length-1 !== destinations.indexOf(dest) && (
|
||||
<Section title=" " mt={-7.3} ml={10} mr={-6.1} />
|
||||
) || (
|
||||
<Box mt={-2.3} />
|
||||
)}
|
||||
</Stack.Item>
|
||||
{dest.dest_icons && (
|
||||
<Stack.Item >
|
||||
<Stack>
|
||||
{Object.keys(dest.dest_icons).map(dep => (
|
||||
<Stack.Item key={dep}
|
||||
mt={dipUnderCircle(dest, dep)}>
|
||||
<Button
|
||||
color={DEPARTMENT2COLOR[dep]}
|
||||
icon={dest.dest_icons[dep]}
|
||||
tooltipPosition="bottom"
|
||||
tooltip={dep}
|
||||
style={{
|
||||
'border-radius': '5em',
|
||||
'border': '2px solid white',
|
||||
}}
|
||||
/>
|
||||
</Stack.Item>
|
||||
))}
|
||||
</Stack>
|
||||
</Stack.Item>
|
||||
)}
|
||||
</Stack>
|
||||
);
|
||||
};
|
||||
return (
|
||||
<Window
|
||||
title="Tram Controls"
|
||||
width={600}
|
||||
height={300}>
|
||||
<Window.Content>
|
||||
{!!broken && (
|
||||
<BrokenTramDimmer />
|
||||
) || (
|
||||
<Section fill>
|
||||
{!!moving && (
|
||||
<MovingTramDimmer />
|
||||
)}
|
||||
<Stack ml="-6px" vertical fill>
|
||||
<Stack.Item grow fontSize="16px" mt={1} mb={9} textAlign="center">
|
||||
Nanotrasen Transit System
|
||||
</Stack.Item>
|
||||
<Stack.Item mb={4}>
|
||||
<Stack fill>
|
||||
<Stack.Item grow={2} />
|
||||
{destinations.map(dest => (
|
||||
<Stack.Item key={dest.name} grow={1} >
|
||||
<Destination dest={dest} />
|
||||
</Stack.Item>
|
||||
))}
|
||||
<Stack.Item grow={1} />
|
||||
</Stack>
|
||||
</Stack.Item>
|
||||
<Stack.Item fontSize="16px" mt={1} mb={9} textAlign="center" grow>
|
||||
<Button
|
||||
disabled={
|
||||
current_loc[0].name === destinations[transitIndex].name
|
||||
}
|
||||
content="Send Tram"
|
||||
onClick={() => act('send', {
|
||||
destination: destinations[transitIndex].name,
|
||||
})} />
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
</Section>
|
||||
)}
|
||||
</Window.Content>
|
||||
</Window>
|
||||
);
|
||||
};
|
||||