From 7f425ecf9bb4a9cfcc0f9956af7fa83315eb513a Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 21 Jun 2014 01:30:40 -0400 Subject: [PATCH] Cleans up train latching/unlatching Also adds a verb for turning off train engines. Conflicts: code/modules/vehicles/cargo_train.dm code/modules/vehicles/train.dm --- code/modules/vehicles/cargo_train.dm | 97 ++++++++--------------- code/modules/vehicles/train.dm | 113 +++++++++++++-------------- 2 files changed, 87 insertions(+), 123 deletions(-) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 65a0eb10d8e..ef45307420f 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -12,7 +12,6 @@ load_offset_y = 5 var/car_limit = 3 //how many cars an engine can pull before performance degrades - var/lead_engine = 1 //if the engine is the lead engine - set automatically active_engines = 1 /obj/vehicle/train/cargo/trolley @@ -43,9 +42,10 @@ if(on && cell.charge < power_use) turn_off() update_stats() - if(load && lead_engine) + if(load && is_train_head()) load << "The drive motor briefly whines, then crawls to a stop." - if(lead_engine && !on) + + if(is_train_head() && !on) return 0 return ..() @@ -108,7 +108,7 @@ /obj/vehicle/train/cargo/engine/RunOver(var/mob/living/carbon/human/H) ..() - if(lead_engine && istype(load, /mob/living/carbon/human)) + if(is_train_head() && istype(load, /mob/living/carbon/human)) var/mob/living/carbon/human/D = load D << "\red \b You ran over [H]!" visible_message("\red \The [src] ran over [H]!") @@ -158,7 +158,7 @@ if(user != load) return 0 - if(lead_engine) + if(is_train_head()) if(direction == reverse_direction(dir)) return 0 if(Move(get_step(src, direction))) @@ -177,73 +177,42 @@ usr << "The engine is already running." return - if(turn_on()) - usr << "You start [src]." + turn_on() + if (on) + usr << "You start [src]'s engine." else if(cell.charge < power_use) usr << "[src] is out of power." else - usr << "[src] won't start." + usr << "[src]'s engine won't start." -/obj/vehicle/train/cargo/engine/verb/climb_down(mob/user as mob) - set name = "Exit vehicle" +/obj/vehicle/train/cargo/engine/verb/stop_engine() + set name = "Stop engine" set category = "Object" - set src in range(0) - - if(!load) + set src in view(1) + + if(!on) + usr << "The engine is already stopped." return - if(user != load) - return - - unload(user) - + + turn_off() + if (!on) + usr << "You stop [src]'s engine." //------------------------------------------- // Latching/unlatching procs //------------------------------------------- -/obj/vehicle/train/cargo/trolley/latch(var/obj/vehicle/train/T) - if(..()) - //if this is a trolley, and is now part of a train, anchor it so it cant be pushed around - if(lead) - anchored = 1 - lead.anchored = 1 - if(tow) - anchored = 1 - tow.anchored = 1 - return 1 - else - return 0 - -/obj/vehicle/train/cargo/trolley/unlatch() - if(..()) - //if this carraige isn't part of a train anymore; unanchor it so it can be pushed around - if(!tow && !lead) - anchored = 0 - return 1 - else - return 0 - - -/obj/vehicle/train/cargo/engine/latch(var/obj/vehicle/train/T) - if(..()) - //check if this is not the lead engine - if(lead) - lead_engine = 0 - if(tow) - tow.anchored = 1 - return 1 - else - return 0 - -/obj/vehicle/train/cargo/engine/unlatch() - if(..()) - //check if this is now the lead engine - if(!lead) - lead_engine = 1 - return 1 - else - return 0 +/obj/vehicle/train/cargo/trolley/attach_to(obj/vehicle/train/T, mob/user) + ..() + if (lead) + //This is now part of a train, anchor it so it cant be pushed around + anchored = 1 +/obj/vehicle/train/cargo/trolley/unattach(mob/user) + ..() + if (!lead && !tow) + //if this carriage isn't part of a train anymore; unanchor it so it can be pushed around + anchored = 0 //------------------------------------------- // Loading/unloading procs @@ -277,13 +246,11 @@ /obj/vehicle/train/cargo/engine/update_train_stats() ..() - speed_calc() + update_move_delay() - if(!lead) //check if this is the lead engine - lead_engine = 1 -/obj/vehicle/train/cargo/engine/proc/speed_calc() - if(!lead_engine) +/obj/vehicle/train/cargo/engine/proc/update_move_delay() + if(!is_train_head()) move_delay = initial(move_delay) //so that engines that have been turned off don't lag behind else move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index 0f1e52a8825..530b3124ab1 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -56,6 +56,7 @@ msg_admin_attack("[D.name] ([D.ckey]) hit [M.name] ([M.ckey]) with [src]. (JMP)") + //------------------------------------------- // Interaction procs //------------------------------------------- @@ -82,14 +83,10 @@ return if(istype(C,/obj/vehicle/train)) - if(latch(C)) - user << "\blue You successfully connect the [C] to [src]." - else - user << "\red You were unable to connect the [C] to [src]." - return - - if(!load(C)) - user << "\red You were unable to load [C] on [src]." + latch(C) + else + if(!load(C)) + user << "\red You were unable to load [C] on [src]." /obj/vehicle/train/attack_hand(mob/user as mob) if(!user.canmove || user.stat || user.restrained() || !Adjacent(user)) @@ -106,22 +103,53 @@ /obj/vehicle/train/verb/unlatch_v() set name = "Unlatch" + set desc = "Unhitches this train from the one in front of it." set category = "Object" set src in view(1) if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr)) return - if(unlatch()) - usr << "\blue You unlatch [src]." - else - usr << "\red [src] is already unlatched." + unattach(usr) //------------------------------------------- // Latching/unlatching procs //------------------------------------------- -/obj/vehicle/train/proc/latch(var/obj/vehicle/train/T) + +//attempts to attach src as a follower of the train T +/obj/vehicle/train/proc/attach_to(obj/vehicle/train/T, mob/user) + if (get_dist(src, T) > 1) + user << "\red [src] is too far away from [T] to hitch them together." + return + + if (lead) + user << "\red [src] is already hitched to something." + return + + if (T.tow) + user << "\red [T] is already towing something." + return + + //latch with src as the follower + lead = T + T.tow = src + + update_stats() + + +//detaches the train from whatever is towing it +/obj/vehicle/train/proc/unattach(mob/user) + if (!lead) + user << "\red [src] is not hitched to anything." + return + + lead.tow = null + lead.update_stats() + + lead = null + +/obj/vehicle/train/proc/latch(mob/user, obj/vehicle/train/T) if(!istype(T) || !Adjacent(T)) return 0 @@ -130,50 +158,19 @@ return 0 */ - var/T_dir = get_dir(src, T) + var/T_dir = get_dir(src, T) //figure out where T is wrt src - if(dir & T_dir) //if car is ahead - if(!lead && !T.tow) - lead = T - T.tow = src - else - return 0 - else if(reverse_direction(dir) & T_dir) //else if car is behind - if(!tow && !T.lead) - tow = T - T.lead = src - else - return 0 - else + if(dir == T_dir) //if car is ahead + src.attach_to(T, user) + else if(reverse_direction(dir) == T_dir) //else if car is behind + T.attach_to(src, user) + +//returns 1 if this is the lead car of the train +/obj/vehicle/train/proc/is_train_head() + if (lead) return 0 - - update_stats() - return 1 -/obj/vehicle/train/proc/unlatch(var/obj/vehicle/train/T) - if(!lead && !tow) - return 0 - - if(T) - if(T == tow) - tow = null - else if(T == lead) - lead = null - else - if(tow) - tow.unlatch(src) - tow = null - if(lead) - lead.unlatch(src) - lead = null - - update_stats() - - return 1 - - - //------------------------------------------------------- // Stat update procs // @@ -182,10 +179,10 @@ // size of the train, to limit super long trains. //------------------------------------------------------- /obj/vehicle/train/update_stats() - if(!tow) - update_train_stats() + if(tow) + return tow.update_stats() //take us to the very end else - return tow.update_stats() + update_train_stats() //we're at the end /obj/vehicle/train/proc/update_train_stats() if(powered && on) @@ -195,10 +192,10 @@ train_length = 1 - if(tow) + if(istype(tow)) active_engines += tow.active_engines train_length += tow.train_length //update the next section of train ahead of us - if(lead) + if(istype(lead)) lead.update_train_stats() \ No newline at end of file