From 3aa3c4166cb7b722c0b3ac22ce7530b44421662a Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Mon, 23 Jun 2014 19:53:58 +1200 Subject: [PATCH] Cargo train update - Cleans up some old code - Fixes some bugs - Adds keys to start the engine --- code/modules/vehicles/cargo_train.dm | 151 ++++++++++++++++----------- code/modules/vehicles/train.dm | 30 +++--- code/modules/vehicles/vehicle.dm | 8 +- icons/obj/vehicles.dmi | Bin 6970 -> 7183 bytes 4 files changed, 110 insertions(+), 79 deletions(-) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index f3d56b4867..ba6318588f 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -1,8 +1,9 @@ /obj/vehicle/train/cargo/engine name = "cargo train tug" + desc = "A ridable electric car designed for pulling cargo trolleys." icon = 'icons/obj/aibots.dmi' icon_state = "mulebot1" //mulebot icons until I get some proper icons - on = 1 + on = 0 powered = 1 locked = 0 @@ -13,6 +14,14 @@ var/car_limit = 3 //how many cars an engine can pull before performance degrades active_engines = 1 + var/obj/item/weapon/key/cargo_train/key + +/obj/item/weapon/key/cargo_train + name = "key" + desc = "A keyring with a small steel key, and a yellow fob reading \"Choo Choo!\"." + icon = 'icons/obj/vehicles.dmi' + icon_state = "train_keys" + w_class = 1 /obj/vehicle/train/cargo/trolley name = "cargo train trolley" @@ -34,16 +43,14 @@ ..() cell = new /obj/item/weapon/cell/high verbs -= /atom/movable/verb/pull - -/obj/vehicle/train/cargo/engine/initialize() - ..() + key = new() /obj/vehicle/train/cargo/engine/Move() if(on && cell.charge < power_use) turn_off() update_stats() if(load && is_train_head()) - load << "The drive motor briefly whines, then crawls to a stop." + load << "The drive motor briefly whines, then drones to a stop." if(is_train_head() && !on) return 0 @@ -57,6 +64,16 @@ else ..() +/obj/vehicle/train/cargo/engine/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/key/cargo_train)) + if(!key) + user.drop_item() + key = W + W.loc = src + verbs += /obj/vehicle/train/cargo/engine/verb/remove_key + return + ..() + /obj/vehicle/train/cargo/update_icon() if(open) icon_state = "mulebot-hatch" @@ -94,6 +111,13 @@ //------------------------------------------- // Train procs //------------------------------------------- +/obj/vehicle/train/cargo/engine/turn_on() + if(!key) + return + else + ..() + update_stats() + /obj/vehicle/train/cargo/RunOver(var/mob/living/carbon/human/H) var/list/parts = list("head", "chest", "l_leg", "r_leg", "l_arm", "r_arm") @@ -121,39 +145,6 @@ //------------------------------------------- // Interaction procs //------------------------------------------- -/obj/vehicle/train/cargo/trolley/verb/rotate() - set name = "Rotate" - set category = "Object" - set src in view(1) - - if(anchored) - usr << "You cannot turn the trolley while it is latched onto a train." - return - - var/cur_dir = null - switch(dir) - if(NORTH) - cur_dir = "North" - if(SOUTH) - cur_dir = "South" - if(EAST) - cur_dir = "East" - if(WEST) - cur_dir = "West" - - var/new_dir = input("Select a new direction:", "Rotate", cur_dir) in list("North", "South", "East", "West") - - switch(new_dir) - if("North") - dir = NORTH - if("South") - dir = SOUTH - if("East") - dir = EAST - if("West") - dir = WEST - - /obj/vehicle/train/cargo/engine/relaymove(mob/user, direction) if(user != load) return 0 @@ -167,24 +158,37 @@ else return ..() -/obj/vehicle/train/cargo/engine/verb/climb_down(mob/user as mob) - set name = "Exit vehicle" - set category = "Object" - set src in range(0) - - if(!load) - return - if(user != load) - return - - unload(user) +/obj/vehicle/train/cargo/engine/examine() + ..() + if(!istype(usr, /mob/living/carbon/human)) + return + + if(get_dist(usr,src) <= 1) + usr << "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition." + +/obj/vehicle/train/cargo/engine/verb/check_power() + set name = "Check power level" + set category = "Object" + set src in view(1) + + if(!istype(usr, /mob/living/carbon/human)) + return + + if(!cell) + usr << "There is no power cell installed in [src]." + return + + usr << "The power meter reads [round(cell.percent(), 0.01)]%" /obj/vehicle/train/cargo/engine/verb/start_engine() set name = "Start engine" set category = "Object" set src in view(1) + if(!istype(usr, /mob/living/carbon/human)) + return + if(on) usr << "The engine is already running." return @@ -203,6 +207,9 @@ set category = "Object" set src in view(1) + if(!istype(usr, /mob/living/carbon/human)) + return + if(!on) usr << "The engine is already stopped." return @@ -211,20 +218,26 @@ if (!on) usr << "You stop [src]'s engine." -//------------------------------------------- -// Latching/unlatching procs -//------------------------------------------- -/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/engine/verb/remove_key() + set name = "Remove key" + set category = "Object" + set src in view(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 + if(!istype(usr, /mob/living/carbon/human)) + return + + if(!key || (load && load != usr)) + return + + if(on) + turn_off() + + key.loc = usr.loc + if(!usr.get_active_hand()) + usr.put_in_hands(key) + key = null + + verbs -= /obj/vehicle/train/cargo/engine/verb/remove_key //------------------------------------------- // Loading/unloading procs @@ -260,9 +273,21 @@ update_move_delay() +/obj/vehicle/train/cargo/trolley/update_train_stats() + ..() + + if(!lead && !tow) + anchored = 0 + if(verbs.Find(/atom/movable/verb/pull)) + return + else + verbs += /atom/movable/verb/pull + else + anchored = 1 + verbs -= /atom/movable/verb/pull /obj/vehicle/train/cargo/engine/proc/update_move_delay() - if(!is_train_head()) + if(!is_train_head() || !on) 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 b1c725214f..faad42d1cc 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -67,8 +67,9 @@ return 0 if(user != load) - if(user in src) //for handling players stuck in src - unload(user, direction, 1) + if(user in src) //for handling players stuck in src - this shouldn't happen - but just in case it does + user.loc = T + contents -= user return 1 return 0 @@ -81,19 +82,19 @@ /obj/vehicle/train/MouseDrop_T(var/atom/movable/C, mob/user as mob) if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr) || !user.Adjacent(C)) return - if(istype(C,/obj/vehicle/train)) - latch(C) + latch(C, user) 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)) + if(user.stat || user.restrained() || !Adjacent(user)) return 0 if(user != load && (user in src)) - unload(user, null, 1) //for handling players stuck in src + user.loc = loc //for handling players stuck in src + contents -= user else if(load) unload(user) //unload if loaded else if(!load) @@ -106,6 +107,9 @@ set desc = "Unhitches this train from the one in front of it." set category = "Object" set src in view(1) + + if(!istype(usr, /mob/living/carbon/human)) + return if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr)) return @@ -130,12 +134,13 @@ if (T.tow) user << "\red [T] is already towing something." return - //latch with src as the follower lead = T T.tow = src + dir = lead.dir - user << "\blue You hitch [src] to [T]." + if(user) + user << "\blue You hitch [src] to [T]." update_stats() @@ -152,15 +157,12 @@ user << "\blue You unhitch [src] from [lead]." lead = null -/obj/vehicle/train/proc/latch(mob/user, obj/vehicle/train/T) + update_stats() + +/obj/vehicle/train/proc/latch(obj/vehicle/train/T, mob/user) if(!istype(T) || !Adjacent(T)) return 0 - /* --- commented out until we get directional sprites --- - if(dir != T.dir) //cars need to be inline to latch - return 0 - */ - var/T_dir = get_dir(src, T) //figure out where T is wrt src if(dir == T_dir) //if car is ahead diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 416cd159ce..27ce16d113 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -1,7 +1,7 @@ /obj/vehicle name = "vehicle" icon = 'icons/obj/vehicles.dmi' - layer = OBJ_LAYER - 0.1 //so it sits below objects + layer = MOB_LAYER + 0.1 //so it sits above objects including mobs density = 1 anchored = 1 animate_movement=1 @@ -275,6 +275,7 @@ if(load_item_visible) C.pixel_x += load_offset_x C.pixel_y += load_offset_y + C.layer = layer + 0.1 //so it sits above the vehicle if(ismob(C)) var/mob/M = C @@ -284,7 +285,10 @@ return 1 -/obj/vehicle/proc/unload(var/mob/user, var/direction, var/exception = 0) +/obj/vehicle/proc/unload(var/mob/user, var/direction) + if(!load) + return + var/turf/dest = null //find a turf to unload to diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index fd6daee8bd4b59531061149219c3ccd5e641631f..699a37298359c7275f214f65755bc33340922cd8 100644 GIT binary patch literal 7183 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