Tramstation: choo choo MORE MAP COMIN' THROUH (#56509)
* cool map bro! * security * perma * secfull * secman * medstart * engine2 * atmos start * barrrr * bar2 * bar3 * civil * lower * barrrr * barrrrrr * start * cargo * sci * j * servicedecal * civildecal2 * service decal2 * service decal 3 * service decal 4 * pip * decal4 * decal8 * arse! * arrivals * arrivals 2 * ai * aifix * vault+techstorage * medbay * bridge 1 * sec 3 * sectest * squish squish * securitywork * secmore * config setup * tram * cargo work * escape * disposalfuck * i hate pipes * disposalsfull * SEC * grav * bads * researchwip * caw * hguhwhuh?? * apc+air_alarm * engie * sm * stttt * aisat * areas * camera wip * camera 2 * secam * shuttle shit or something idk * aaaa * path nodes + waypoint navs * almost there * pull * unnecessary file * standardize * tram choo choo!!! * tgm * testmerge feedback fixes * map work * test * test2 * i hate * THERE * trams without pulling upstream like an idiot (#3) TRAM * fast tram fast TRAM * fuck turfs * tram collisions, tram cooldowns (#4) lol * ass * tram but real * forgot the , * code improvements, fixes, and tram call buttons (#5) * unnecessary check gone, nulls now scrubbed (#6) * fancy tram * feedback changes * AT fix * feedback changes * incin+engine atmos wooo! * missing grav gen cable * more feedback changes + diagonal shuttle wall * bottom floor explodes into airless asteroid instead of space now * even more feedback changes * area change * update to iron sheets * ore smelter wrong dirs * path changes agagagagaga * no more fabs * atmos fixes + more general fixes * Creates SStramprocess and Makes Movement Use That Instead of Timers (#7) * makes SStramprocess a child of SSprocess and makes tram obj use it * gets rid of continue_movement() in favor of SStramprocess * remove fake tram * tgm baby * maintenance update + chode tram * hopefully makes the tram choke the server out less (#9) tries to put brakes on the tram * bad id console * more maint stuff * Big bundle of fixes and additions for trams (#10) * BANG TING OW * fixes docs, makes everyone always take damage, fixes bump text and span * control prevention... maybe? * combat mode no longer triggers trams * tram conflicts + tram console * medical changes + tram lift console * bot pathing in tunnels * tram whiteship + bad area string fix * -station fixes -tram monorail -tram monorail grinding + achievement * trail these noots * rail * yee * diner bots + xeno changes * Tram TGUI FINALLY (#11) * bflehgfwblilbrga * Update TramControl.js * --fix, --lint * more ui * brokendimmer now doesn't try to load content, static data updates, MORE sanity. * finishing off tram sprites * cleaning up dmis * Portal Improv * re-removes icons * relay moved, map fix * fixed? (#12) * rd machines * relay moved, upload moved to sci, service lathe access, typo * maint stuff * tgm * medical overhaul, more maint junk * comments out achievements for testing * space hole + spare * actual tram blender fix according to known blender method * tgm * trail these * removes depreciated tram content + accidental changes during pulling Co-authored-by: tralezab <40974010+tralezab@users.noreply.github.com> Co-authored-by: Kylerace <kylerlumpkin1@gmail.com>
@@ -11,6 +11,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"
|
||||
|
||||
@@ -341,6 +341,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\""
|
||||
@@ -497,6 +503,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
|
||||
|
||||
|
||||
|
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: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
@@ -363,6 +363,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"
|
||||
@@ -955,6 +956,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>
|
||||
);
|
||||
};
|
||||