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
+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