[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>
This commit is contained in:
SkyratBot
2021-03-12 23:19:38 +00:00
committed by GitHub
co-authored by MMMiracles Cheshify
parent 565ba9a717
commit 84f6558402
37 changed files with 409257 additions and 13 deletions
+1
View File
@@ -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"
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+754
View File
@@ -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
"}
File diff suppressed because it is too large Load Diff
+24
View File
@@ -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"
}
]
}
+1
View File
@@ -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"
+10
View File
@@ -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"
+60
View File
@@ -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"
+19
View File
@@ -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
+21
View File
@@ -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"
+4
View File
@@ -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)
+162 -9
View File
@@ -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
+23
View File
@@ -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
+3
View File
@@ -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.
+43
View File
@@ -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)
+6
View File
@@ -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\'"
-1
View File
@@ -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
+3 -1
View File
@@ -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))
+5 -2
View File
@@ -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
+5
View File
@@ -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"
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 799 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

+2
View File
@@ -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>
);
};