From 360c29008e866bbdb6f278b0e6bd2479c1ce61a7 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Fri, 27 Sep 2019 19:59:38 -0400 Subject: [PATCH] Minor Vehicle Refactor and Balance --- .../game/objects/effects/spawners/lootdrop.dm | 4 +- .../mining/lavaland/loot/tendril_loot.dm | 6 +- code/modules/vehicle/ambulance.dm | 2 +- code/modules/vehicle/atv.dm | 4 +- code/modules/vehicle/janicart.dm | 35 ++++--- code/modules/vehicle/secway.dm | 3 +- code/modules/vehicle/snowmobile.dm | 2 +- code/modules/vehicle/speedbike.dm | 1 - code/modules/vehicle/vehicle.dm | 99 +++++++++++++------ 9 files changed, 98 insertions(+), 58 deletions(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 4dcd2cbdd32..f8abaa7a17e 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -348,8 +348,8 @@ return var/lootspawn = pickweight(loot) var/obj/vehicle/V = new lootspawn(get_turf(src)) - if(V.keytype) - new V.keytype(get_turf(src)) + if(V.key_type) + new V.key_type(get_turf(src)) qdel(src) diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index e5a2c94fa7d..ad936c35bf3 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -163,7 +163,7 @@ desc = "A boat used for traversing lava." icon_state = "goliath_boat" icon = 'icons/obj/lavaland/dragonboat.dmi' - keytype = /obj/item/oar + held_key_type = /obj/item/oar burn_state = LAVA_PROOF /obj/vehicle/lavaboat/relaymove(mob/user, direction) @@ -174,7 +174,7 @@ ..() else to_chat(user, "Boats don't go on land!") - return 0 + return FALSE /obj/item/oar name = "oar" @@ -218,7 +218,7 @@ /obj/vehicle/lavaboat/dragon name = "mysterious boat" desc = "This boat moves where you will it, without the need for an oar." - keytype = null + held_key_type = null icon_state = "dragon_boat" generic_pixel_y = 2 generic_pixel_x = 1 diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm index 29fb4e0108f..91f333387fd 100644 --- a/code/modules/vehicle/ambulance.dm +++ b/code/modules/vehicle/ambulance.dm @@ -2,7 +2,7 @@ name = "ambulance" desc = "This is what the paramedic uses to run over people they need to take to medbay." icon_state = "docwagon2" - keytype = /obj/item/key/ambulance + key_type = /obj/item/key/ambulance var/obj/structure/bed/amb_trolley/bed = null var/datum/action/ambulance_alarm/AA var/datum/looping_sound/ambulance_alarm/soundloop diff --git a/code/modules/vehicle/atv.dm b/code/modules/vehicle/atv.dm index a78791fddea..1cfc47e53d8 100644 --- a/code/modules/vehicle/atv.dm +++ b/code/modules/vehicle/atv.dm @@ -3,10 +3,10 @@ desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-earth technologies that are still relevant on most planet-bound outposts." icon = 'icons/vehicles/4wheeler.dmi' icon_state = "fourwheel" - keytype = /obj/item/key + key_type = /obj/item/key generic_pixel_x = 0 generic_pixel_y = 4 - vehicle_move_delay = 1 + vehicle_move_delay = 1.5 var/static/image/atvcover = null /obj/vehicle/atv/New() diff --git a/code/modules/vehicle/janicart.dm b/code/modules/vehicle/janicart.dm index 2445e983fd3..1a1855ba39d 100644 --- a/code/modules/vehicle/janicart.dm +++ b/code/modules/vehicle/janicart.dm @@ -3,9 +3,9 @@ name = "janicart (pimpin' ride)" desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility." icon_state = "pussywagon" - keytype = /obj/item/key/janitor - var/obj/item/storage/bag/trash/mybag = null - var/floorbuffer = 0 + key_type = /obj/item/key/janitor + var/obj/item/storage/bag/trash/mybag + var/floorbuffer = FALSE /obj/vehicle/janicart/handle_vehicle_offsets() @@ -63,21 +63,20 @@ /obj/vehicle/janicart/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/bag/trash)) - if(keytype == /obj/item/key/janitor) - if(!user.drop_item()) - return - to_chat(user, "You hook the trashbag onto \the [name].") - I.loc = src - mybag = I - else if(istype(I, /obj/item/janiupgrade)) - if(keytype == /obj/item/key/janitor) - floorbuffer = 1 - qdel(I) - to_chat(user,"You upgrade \the [name] with the floor buffer.") - update_icon() - - ..() - + if(!user.drop_item()) + return + to_chat(user, "You hook the trashbag onto \the [name].") + I.forceMove(src) + mybag = I + update_icon() + return + if(istype(I, /obj/item/janiupgrade)) + floorbuffer = TRUE + qdel(I) + to_chat(user,"You upgrade [src] with the floor buffer.") + update_icon() + return + return ..() /obj/vehicle/janicart/update_icon() overlays.Cut() diff --git a/code/modules/vehicle/secway.dm b/code/modules/vehicle/secway.dm index 4f7c0bf9cb2..2b7ae6ebd85 100644 --- a/code/modules/vehicle/secway.dm +++ b/code/modules/vehicle/secway.dm @@ -2,9 +2,10 @@ name = "secway" desc = "A brave security cyborg gave its life to help you look like a complete tool." icon_state = "secway" - keytype = /obj/item/key/security + key_type = /obj/item/key/security generic_pixel_x = 0 generic_pixel_y = 4 + vehicle_move_delay = 1.5 /obj/item/key/security diff --git a/code/modules/vehicle/snowmobile.dm b/code/modules/vehicle/snowmobile.dm index 311eb48c699..c4b8d7aefba 100644 --- a/code/modules/vehicle/snowmobile.dm +++ b/code/modules/vehicle/snowmobile.dm @@ -3,7 +3,7 @@ desc = "Wheeeeeeeeeeee." icon = 'icons/obj/vehicles.dmi' icon_state = "snowmobile" - keytype = /obj/item/key/snowmobile + key_type = /obj/item/key/snowmobile generic_pixel_x = 0 generic_pixel_y = 4 diff --git a/code/modules/vehicle/speedbike.dm b/code/modules/vehicle/speedbike.dm index e1efe63bcbd..0d3018c5452 100644 --- a/code/modules/vehicle/speedbike.dm +++ b/code/modules/vehicle/speedbike.dm @@ -3,7 +3,6 @@ icon = 'icons/obj/bike.dmi' icon_state = "speedbike_blue" layer = MOB_LAYER - 0.1 - keytype = null vehicle_move_delay = 0 var/overlay_state = "cover_blue" var/image/overlay = null diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index 9b3a747b7ff..edc6dc63a2e 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -9,8 +9,12 @@ can_buckle = TRUE buckle_lying = FALSE armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0) - var/keytype = null //item typepath, if non-null an item of this type is needed in your hands to drive this vehicle - var/next_vehicle_move = 0 //used for move delays + var/key_type + var/held_key_type //Similar to above, but the vehicle needs the key in hands as opposed to inserted into the ignition + var/obj/item/key/inserted_key + var/key_type_exact = TRUE //can subtypes work + var/last_vehicle_move = 0 //used for move delays + var/last_move_diagonal = FALSE var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower var/auto_door_open = TRUE var/needs_gravity = 0 //To allow non-space vehicles to move in no gravity or not, mostly for adminbus @@ -20,10 +24,56 @@ var/spaceworthy = FALSE -/obj/vehicle/New() - ..() +/obj/vehicle/Initialize(mapload) + . = ..() handle_vehicle_layer() +/obj/vehicle/Destroy() + QDEL_NULL(inserted_key) + return ..() + +/obj/vehicle/examine(mob/user) + . = ..() + if(key_type) + if(!inserted_key) + . += "Put a key inside it by clicking it with the key." + else + . += "Alt-click [src] to remove the key." + +/obj/vehicle/attackby(obj/item/I, mob/user, params) + if(key_type && !is_key(inserted_key) && is_key(I)) + if(user.drop_item()) + I.forceMove(src) + to_chat(user, "You insert [I] into [src].") + if(inserted_key) //just in case there's an invalid key + inserted_key.forceMove(drop_location()) + inserted_key = I + else + to_chat(user, "[I] seems to be stuck to your hand!") + return + return ..() + +/obj/vehicle/AltClick(mob/user) + if(inserted_key && user.Adjacent(user)) + if(!(user in buckled_mobs)) + to_chat(user, "You must be riding [src] to remove [src]'s key!") + return + to_chat(user, "You remove [inserted_key] from [src].") + inserted_key.forceMove(drop_location()) + user.put_in_hands(inserted_key) + inserted_key = null + return ..() + +/obj/vehicle/proc/is_key(obj/item/I) + return I ? (key_type_exact ? (I.type == key_type) : istype(I, key_type)) : FALSE + +/obj/vehicle/proc/held_keycheck(mob/user) + if(held_key_type) + if(istype(user.l_hand, held_key_type) || istype(user.r_hand, held_key_type)) + return TRUE + else + return TRUE + return FALSE //APPEARANCE /obj/vehicle/proc/handle_vehicle_layer() @@ -49,15 +99,6 @@ return -//KEYS -/obj/vehicle/proc/keycheck(mob/user) - if(keytype) - if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype)) - return TRUE - else - return TRUE - return FALSE - /obj/item/key name = "key" desc = "A small grey key." @@ -93,25 +134,30 @@ //MOVEMENT /obj/vehicle/relaymove(mob/user, direction) + if(key_type && !is_key(inserted_key)) + to_chat(user, "[src] has no key inserted!") + return + if(user.incapacitated()) unbuckle_mob(user) return - if(world.time < next_vehicle_move) + if(world.time < last_vehicle_move + ((last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay))) return - next_vehicle_move = world.time + vehicle_move_delay - if(keycheck(user)) + last_vehicle_move = world.time + + if(held_keycheck(user)) + var/turf/next = get_step(src, direction) if(!Process_Spacemove(direction) || !isturf(loc)) return step(src, direction) - if(has_buckled_mobs()) - for(var/m in buckled_mobs) - var/mob/living/buckled_mob = m - if(buckled_mob.loc != loc) - buckled_mob.buckled = null //Temporary, so Move() succeeds. - buckled_mob.buckled = src //Restoring + if((direction & (direction - 1)) && (loc == next)) //moved diagonally + last_move_diagonal = TRUE + else + last_move_diagonal = FALSE + if(has_buckled_mobs()) if(issimulatedturf(loc)) var/turf/simulated/T = loc if(T.wet == TURF_WET_LUBE) //Lube! Fall off! @@ -125,20 +171,15 @@ handle_vehicle_layer() handle_vehicle_offsets() else - to_chat(user, "You'll need the keys in one of your hands to drive \the [name].") + to_chat(user, "You'll need the keys in one of your hands to drive [src].") -/obj/vehicle/Move(NewLoc,Dir=0,step_x=0,step_y=0) +/obj/vehicle/Move(NewLoc, Dir = 0, step_x = 0, step_y = 0) . = ..() handle_vehicle_layer() handle_vehicle_offsets() -/obj/vehicle/attackby(obj/item/I, mob/user, params) - if(keytype && istype(I, keytype)) - to_chat(user, "Hold [I] in one of your hands while you drive \the [name].") - - /obj/vehicle/Bump(atom/movable/M) if(!spaceworthy && isspaceturf(get_turf(src))) return FALSE