mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-22 04:30:44 +01:00
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:
co-authored by
tralezab
Kylerace
parent
95fb15d2ff
commit
5f3e12178e
@@ -273,3 +273,24 @@
|
||||
|
||||
/obj/structure/fluff/hedge/opaque //useful for mazes and such
|
||||
opacity = TRUE
|
||||
|
||||
/obj/structure/fluff/tram_rail
|
||||
name = "tram railing"
|
||||
desc = "Great for trams, not so great for skating."
|
||||
icon = 'icons/obj/tram_railing.dmi'
|
||||
icon_state = "rail"
|
||||
layer = MID_TURF_LAYER
|
||||
plane = FLOOR_PLANE
|
||||
deconstructible = TRUE
|
||||
|
||||
/obj/structure/fluff/tram_rail/floor
|
||||
icon_state = "rail_floor"
|
||||
|
||||
|
||||
/obj/structure/fluff/tram_rail/end
|
||||
icon_state = "railend"
|
||||
|
||||
/obj/structure/fluff/tram_rail/anchor
|
||||
name = "tram railing anchor"
|
||||
icon_state = "anchor"
|
||||
|
||||
|
||||
@@ -100,6 +100,10 @@
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
rad_insulation = RAD_LIGHT_INSULATION
|
||||
|
||||
/obj/structure/holosign/barrier/atmos/sturdy
|
||||
name = "sturdy holofirelock"
|
||||
max_integrity = 150
|
||||
|
||||
/obj/structure/holosign/barrier/atmos/Initialize()
|
||||
. = ..()
|
||||
air_update_turf(TRUE, TRUE)
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
var/min_x = world.maxx
|
||||
var/min_y = world.maxy
|
||||
|
||||
|
||||
set_controls(LOCKED)
|
||||
for(var/p in lift_platforms)
|
||||
var/obj/structure/industrial_lift/lift_platform = p
|
||||
@@ -90,12 +91,12 @@
|
||||
//Go along the Y axis from max to min, from up to down
|
||||
for(var/y in max_y to min_y step -1)
|
||||
var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z))
|
||||
lift_platform.travel(going)
|
||||
lift_platform?.travel(going)
|
||||
else
|
||||
//Go along the Y axis from min to max, from down to up
|
||||
for(var/y in min_y to max_y)
|
||||
var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z))
|
||||
lift_platform.travel(going)
|
||||
lift_platform?.travel(going)
|
||||
else
|
||||
//Go along the X axis from max to min, from right to left
|
||||
for(var/x in max_x to min_x step -1)
|
||||
@@ -103,12 +104,12 @@
|
||||
//Go along the Y axis from max to min, from up to down
|
||||
for(var/y in max_y to min_y step -1)
|
||||
var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z))
|
||||
lift_platform.travel(going)
|
||||
lift_platform?.travel(going)
|
||||
else
|
||||
//Go along the Y axis from min to max, from down to up
|
||||
for(var/y in min_y to max_y)
|
||||
var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z))
|
||||
lift_platform.travel(going)
|
||||
lift_platform?.travel(going)
|
||||
set_controls(UNLOCKED)
|
||||
|
||||
///Check destination turfs
|
||||
@@ -163,6 +164,7 @@ GLOBAL_LIST_EMPTY(lifts)
|
||||
RegisterSignal(src, COMSIG_MOVABLE_CROSSED, .proc/AddItemOnLift)
|
||||
RegisterSignal(loc, COMSIG_ATOM_CREATED, .proc/AddItemOnLift)//For atoms created on platform
|
||||
RegisterSignal(src, COMSIG_MOVABLE_UNCROSSED, .proc/RemoveItemFromLift)
|
||||
RegisterSignal(src, COMSIG_MOVABLE_BUMP, .proc/GracefullyBreak)
|
||||
|
||||
if(!lift_master_datum)
|
||||
lift_master_datum = new(src)
|
||||
@@ -179,11 +181,33 @@ GLOBAL_LIST_EMPTY(lifts)
|
||||
UnregisterSignal(AM, COMSIG_PARENT_QDELETING)
|
||||
|
||||
/obj/structure/industrial_lift/proc/AddItemOnLift(datum/source, atom/movable/AM)
|
||||
if(istype(AM, /obj/structure/fluff/tram_rail))
|
||||
return
|
||||
if(AM in lift_load)
|
||||
return
|
||||
LAZYADD(lift_load, AM)
|
||||
RegisterSignal(AM, COMSIG_PARENT_QDELETING, .proc/RemoveItemFromLift)
|
||||
|
||||
/**
|
||||
* Signal for when the tram runs into a field of which it cannot go through.
|
||||
* Stops the train's travel fully, sends a message, and destroys the train.
|
||||
* Arguments:
|
||||
* bumped_atom - The atom this tram bumped into
|
||||
*/
|
||||
/obj/structure/industrial_lift/proc/GracefullyBreak(atom/bumped_atom)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(istype(bumped_atom, /obj/machinery/field))
|
||||
return
|
||||
|
||||
bumped_atom.visible_message("<span class='userdanger'>[src] crashes into the field violently!</span>")
|
||||
for(var/obj/structure/industrial_lift/tram/tram_part as anything in lift_master_datum.lift_platforms)
|
||||
tram_part.travel_distance = 0
|
||||
tram_part.travelling = FALSE
|
||||
if(prob(15) || locate(/mob/living) in tram_part.lift_load) //always go boom on people on the track
|
||||
explosion(get_turf(tram_part),rand(0,1),2,3) //50% chance of gib
|
||||
qdel(tram_part)
|
||||
|
||||
/obj/structure/industrial_lift/proc/lift_platform_expansion(datum/lift_master/lift_master_datum)
|
||||
. = list()
|
||||
for(var/direction in GLOB.cardinals)
|
||||
@@ -199,17 +223,46 @@ GLOBAL_LIST_EMPTY(lifts)
|
||||
destination = get_step_multiz(src, going)
|
||||
else
|
||||
destination = going
|
||||
if(going == DOWN)//make sure this stays pre-item moving, or you'll crush anything on the lift under the lift.
|
||||
if(going == DOWN)
|
||||
for(var/mob/living/crushed in destination.contents)
|
||||
to_chat(crushed, "<span class='userdanger'>You are crushed by [src]!</span>")
|
||||
crushed.gib(FALSE,FALSE,FALSE)//the nicest kind of gibbing, keeping everything intact.
|
||||
else if(going != UP) //can't really crush something upwards
|
||||
for(var/obj/structure/anchortrouble in destination.contents)
|
||||
if(!QDELETED(anchortrouble) && anchortrouble.anchored && (!istype(anchortrouble, /obj/structure/holosign)) && anchortrouble.layer >= GAS_PUMP_LAYER) //to avoid pipes, wires, etc
|
||||
playsound(src, 'sound/effects/bang.ogg', 50, TRUE)
|
||||
visible_message("<span class='notice'>[src] smashes through [anchortrouble]!</span>")
|
||||
anchortrouble.deconstruct(FALSE)
|
||||
for(var/mob/living/collided in destination.contents)
|
||||
to_chat(collided, "<span class='userdanger'>[src] collides into you!</span>")
|
||||
playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
var/damage = rand(5,10)
|
||||
collided.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD)
|
||||
collided.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST)
|
||||
collided.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG)
|
||||
collided.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG)
|
||||
collided.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM)
|
||||
collided.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM)
|
||||
|
||||
if(QDELETED(collided)) //in case it was a mob that dels on death
|
||||
continue
|
||||
var/turf/T = get_turf(src)
|
||||
T.add_mob_blood(collided)
|
||||
|
||||
collided.throw_at()
|
||||
//if going EAST, will turn to the NORTHEAST or SOUTHEAST and throw the ran over guy away
|
||||
var/atom/throw_target = get_edge_target_turf(collided, turn(going, pick(45, -45)))
|
||||
collided.throw_at(throw_target, 200, 4)
|
||||
forceMove(destination)
|
||||
for(var/am in things2move)
|
||||
if(isnull(am))
|
||||
LAZYREMOVE(lift_load, am)//after enough use, one of these always ends up inside despite signals. when they show, we need to scrub them out.
|
||||
continue
|
||||
var/atom/movable/thing = am
|
||||
thing.forceMove(destination)
|
||||
|
||||
/obj/structure/industrial_lift/proc/use(mob/user, is_ghost=FALSE)
|
||||
if(is_ghost && !in_range(src, user))
|
||||
/obj/structure/industrial_lift/proc/use(mob/living/user)
|
||||
if(!isliving(user) || !in_range(src, user) || user.combat_mode)
|
||||
return
|
||||
|
||||
var/list/tool_list = list()
|
||||
@@ -226,8 +279,8 @@ GLOBAL_LIST_EMPTY(lifts)
|
||||
add_fingerprint(user)
|
||||
return
|
||||
var/result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
if(!is_ghost && !in_range(src, user))
|
||||
return // nice try
|
||||
if(!isliving(user) || !in_range(src, user) || user.combat_mode)
|
||||
return //nice try
|
||||
switch(result)
|
||||
if("Up")
|
||||
lift_master_datum.MoveLift(UP, user)
|
||||
@@ -338,3 +391,103 @@ GLOBAL_LIST_EMPTY(lifts)
|
||||
return
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/structure/industrial_lift/tram
|
||||
name = "tram"
|
||||
desc = "A tram for traversing the station."
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "titanium_yellow"
|
||||
base_icon_state = null
|
||||
smoothing_flags = NONE
|
||||
smoothing_groups = null
|
||||
canSmoothWith = null
|
||||
//kind of a centerpiece of the station, so pretty tough to destroy
|
||||
armor = list(MELEE = 80, BULLET = 80, LASER = 80, ENERGY = 80, BOMB = 100, BIO = 80, RAD = 80, FIRE = 100, ACID = 100)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
var/travelling = FALSE
|
||||
var/travel_distance = 0
|
||||
///for finding the landmark initially - should be the exact same as the landmark's destination id.
|
||||
var/initial_id = "middle_part"
|
||||
var/obj/effect/landmark/tram/from_where
|
||||
var/travel_direction
|
||||
var/time_inbetween_moves = 1
|
||||
|
||||
/obj/structure/industrial_lift/tram/central//that's a surprise tool that can help us later
|
||||
|
||||
/obj/structure/industrial_lift/tram/LateInitialize()
|
||||
. = ..()
|
||||
find_our_location()
|
||||
|
||||
/obj/structure/industrial_lift/tram/proc/find_our_location()
|
||||
if(!from_where)
|
||||
for(var/obj/effect/landmark/tram/our_location in GLOB.landmarks_list)
|
||||
if(our_location.destination_id == initial_id)
|
||||
from_where = our_location
|
||||
break
|
||||
|
||||
/obj/structure/industrial_lift/tram/central/find_our_location() //the tram knows where it is by knowing where it isn't
|
||||
..()
|
||||
for(var/location in lift_master_datum.lift_platforms)
|
||||
var/obj/structure/industrial_lift/tram/tram_location = location
|
||||
var/turf/turf = get_turf(src)
|
||||
var/where_we_are = locate(/obj/effect/landmark/tram) in turf.contents
|
||||
if(where_we_are)
|
||||
tram_location.from_where = where_we_are //this gets set by the tram movement too but this actually makes sure we're at the dock we were moved to to prevent blender mode
|
||||
|
||||
/obj/structure/industrial_lift/tram/use(mob/user) //dont click the floor dingus we use computers now
|
||||
return
|
||||
|
||||
/obj/structure/industrial_lift/tram/process(delta_time)
|
||||
if(!travel_distance)
|
||||
addtimer(CALLBACK(src, .proc/unlock_controls), 3 SECONDS)
|
||||
return PROCESS_KILL
|
||||
else
|
||||
travel_distance--
|
||||
lift_master_datum.MoveLiftHorizontal(travel_direction, z)
|
||||
|
||||
/obj/structure/industrial_lift/tram/proc/tram_travel(obj/effect/landmark/tram/from_where, obj/effect/landmark/tram/to_where)
|
||||
visible_message("<span class='notice'>[src] has been called to the [to_where]!</span")
|
||||
|
||||
lift_master_datum.set_controls(LOCKED)
|
||||
for(var/obj/structure/industrial_lift/tram/other_tram_part as anything in lift_master_datum.lift_platforms) //only thing everyone needs to know is the new location.
|
||||
if(other_tram_part.travelling) //wee woo wee woo there was a double action queued. damn multi tile structs
|
||||
return //we don't care to undo locked controls, though, as that will resolve itself
|
||||
other_tram_part.travelling = TRUE
|
||||
other_tram_part.from_where = to_where
|
||||
travel_direction = get_dir(from_where, to_where)
|
||||
travel_distance = get_dist(from_where, to_where)
|
||||
//first movement is immediate
|
||||
lift_master_datum.MoveLiftHorizontal(travel_direction, z)
|
||||
travel_distance--
|
||||
|
||||
START_PROCESSING(SStramprocess, src)
|
||||
|
||||
/obj/structure/industrial_lift/tram/proc/unlock_controls()
|
||||
visible_message("<span class='notice'>[src]'s controls are now unlocked.</span")
|
||||
for(var/lift in lift_master_datum.lift_platforms) //only thing everyone needs to know is the new location.
|
||||
var/obj/structure/industrial_lift/tram/other_tram_part = lift
|
||||
other_tram_part.travelling = FALSE
|
||||
other_tram_part.find_our_location()
|
||||
lift_master_datum.set_controls(UNLOCKED)
|
||||
|
||||
/obj/effect/landmark/tram
|
||||
name = "tram destination" //the tram buttons will mention this.
|
||||
icon_state = "tram"
|
||||
var/destination_id
|
||||
///icons for the tgui console to list out for what is at this location
|
||||
var/list/tgui_icons = list()
|
||||
|
||||
/obj/effect/landmark/tram/left_part
|
||||
name = "West Wing"
|
||||
destination_id = "left_part"
|
||||
tgui_icons = list("Arrivals" = "plane-arrival", "Service" = "cocktail")
|
||||
|
||||
/obj/effect/landmark/tram/middle_part
|
||||
name = "Central Wing"
|
||||
destination_id = "middle_part"
|
||||
tgui_icons = list("Command" = "bullhorn", "Security" = "gavel", "Medical" = "plus", "Engineering" = "wrench")
|
||||
|
||||
/obj/effect/landmark/tram/right_part
|
||||
name = "East Wing"
|
||||
destination_id = "right_part"
|
||||
tgui_icons = list("Departures" = "plane-departure", "Cargo" = "box")
|
||||
|
||||
@@ -179,3 +179,11 @@
|
||||
desc = "A warning sign which reads 'ESCAPE PODS'."
|
||||
icon_state = "pods"
|
||||
is_editable = TRUE
|
||||
|
||||
/obj/structure/sign/warning/radshelter
|
||||
name = "\improper RADSTORM SHELTER sign"
|
||||
sign_change_name = "Location - Radstorm Shelter"
|
||||
desc = "A warning sign which reads 'RADSTORM SHELTER'."
|
||||
icon_state = "radshelter"
|
||||
is_editable = TRUE
|
||||
|
||||
|
||||
Reference in New Issue
Block a user