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>
This commit is contained in:
MMMiracles
2021-03-11 18:43:57 +01:00
committed by GitHub
co-authored by tralezab Kylerace
parent 95fb15d2ff
commit 5f3e12178e
35 changed files with 206224 additions and 13 deletions
+1
View File
@@ -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"
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
@@ -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"
+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
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: 41 KiB

After

Width:  |  Height:  |  Size: 41 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
@@ -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>
);
};