From bd22fc8c6d870fd59b1987c39a3022e9e90b0ed8 Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Sat, 26 Dec 2015 22:54:15 +0000 Subject: [PATCH 1/3] Converted janicarts into a simple to use vehicle framework with customisable speed, converted all existing vehicles to the new framework, added a atv type with a turret on it. --- code/game/objects/structures/janicart.dm | 214 ----------------------- code/modules/vehicles/atv.dm | 81 +++++++++ code/modules/vehicles/pimpin_ride.dm | 95 ++++++++++ code/modules/vehicles/secway.dm | 13 ++ code/modules/vehicles/vehicle.dm | 138 +++++++++++++++ tgstation.dme | 4 + 6 files changed, 331 insertions(+), 214 deletions(-) create mode 100644 code/modules/vehicles/atv.dm create mode 100644 code/modules/vehicles/pimpin_ride.dm create mode 100644 code/modules/vehicles/secway.dm create mode 100644 code/modules/vehicles/vehicle.dm diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index d9333d6e123..521d01bfbec 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -157,217 +157,3 @@ if(signs) overlays += "cart_sign[signs]" - -//old style PIMP-CART -/obj/structure/bed/chair/janicart - name = "janicart" - desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility." - icon = 'icons/obj/vehicles.dmi' - icon_state = "pussywagon" - anchored = 0 - density = 1 - var/obj/item/weapon/storage/bag/trash/mybag = null - var/callme = "pimpin' ride" //how do people refer to it? - var/move_delay = 0 - var/floorbuffer = 0 - var/keytype = /obj/item/key/janitor - -/obj/structure/bed/chair/janicart/New() - handle_rotation() - -/obj/structure/bed/chair/janicart/Move(a, b, flag) - ..() - if(floorbuffer) - var/turf/tile = loc - if(isturf(tile)) - tile.clean_blood() - for(var/A in tile) - if(istype(A, /obj/effect)) - if(is_cleanable(A)) - qdel(A) - -/obj/structure/bed/chair/janicart/examine(mob/user) - ..() - if(floorbuffer) - user << "It has been upgraded with a floor buffer." - - -/obj/structure/bed/chair/janicart/attackby(obj/item/I, mob/user, params) - if(istype(I, keytype)) - user << "Hold [I] in one of your hands while you drive this [callme]." - else if(istype(I, /obj/item/weapon/storage/bag/trash)) - if(keytype == /obj/item/key/janitor) - if(!user.drop_item()) - return - user << "You hook the trashbag onto the [callme]." - I.loc = src - mybag = I - else if(istype(I, /obj/item/janiupgrade)) - if(keytype == /obj/item/key/janitor) - floorbuffer = 1 - qdel(I) - user << "You upgrade the [callme] with the floor buffer." - update_icon() - -/obj/structure/bed/chair/janicart/update_icon() - overlays.Cut() - if(mybag) - overlays += "cart_garbage" - if(floorbuffer) - overlays += "cart_buffer" - -/obj/structure/bed/chair/janicart/attack_hand(mob/user) - if(..()) - return 1 - else if(mybag) - mybag.loc = get_turf(user) - user.put_in_hands(mybag) - mybag = null - update_icon() - - -/obj/structure/bed/chair/janicart/relaymove(mob/user, direction) - if(user.stat || user.stunned || user.weakened || user.paralysis) - unbuckle_mob() - if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype)) - if(!Process_Spacemove(direction) || !has_gravity(src.loc) || move_delay || !isturf(loc)) - return - step(src, direction) - update_mob() - handle_rotation() - move_delay = 1 - spawn(2) - move_delay = 0 - else - user << "You'll need the keys in one of your hands to drive this [callme]." - -/obj/structure/bed/chair/janicart/user_buckle_mob(mob/living/M, mob/user) - if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated - return - for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf. - if(A.density) - if(A != src && A != M) - return - M.loc = loc //we move the mob on the janicart's turf before checking if we can buckle. - ..() - update_mob() - -/obj/structure/bed/chair/janicart/unbuckle_mob(force = 0) - if(buckled_mob) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 0 - . = ..() - -/obj/structure/bed/chair/janicart/handle_rotation() - if((dir == SOUTH) || (dir == WEST) || (dir == EAST)) - layer = FLY_LAYER - else - layer = OBJ_LAYER - - if(buckled_mob) - if(buckled_mob.loc != loc) - buckled_mob.buckled = null //Temporary, so Move() succeeds. - buckled_mob.buckled = src //Restoring - - update_mob() - -/obj/structure/bed/chair/janicart/Bump(atom/movable/M) - . = ..() - if(istype(M, /obj/machinery/door) && buckled_mob) - M.Bumped(buckled_mob) - -/obj/structure/bed/chair/janicart/proc/update_mob() - if(buckled_mob) - buckled_mob.dir = dir - switch(dir) - if(SOUTH) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 7 - if(WEST) - buckled_mob.pixel_x = 12 - buckled_mob.pixel_y = 7 - if(NORTH) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 4 - if(EAST) - buckled_mob.pixel_x = -12 - buckled_mob.pixel_y = 7 - -//keys+attachables// - -/obj/item/key - name = "key" - desc = "A small grey key." - icon = 'icons/obj/vehicles.dmi' - icon_state = "key" - w_class = 1 - -/obj/item/key/janitor - desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"." - icon_state = "keyjanitor" - -/obj/item/key/security - desc = "A keyring with a small steel key, and a rubber stun baton accessory." - icon_state = "keysec" - -/obj/item/janiupgrade - name = "floor buffer upgrade" - desc = "An upgrade for mobile janicarts." - icon = 'icons/obj/vehicles.dmi' - icon_state = "upgrade" - -//secway// - -/obj/structure/bed/chair/janicart/secway - name = "secway" - desc = "A brave security cyborg gave its life to help you look like a complete tool." - icon = 'icons/obj/vehicles.dmi' - icon_state = "secway" - callme = "secway" - keytype = /obj/item/key/security - -/obj/structure/bed/chair/janicart/secway/update_mob() - if(buckled_mob) - buckled_mob.dir = dir - buckled_mob.pixel_y = 4 - -//atv// - -/obj/structure/bed/chair/janicart/atv - name = "atv" - 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/obj/vehicles.dmi' - icon_state = "atv" - callme = "All-terrain vehicle" - keytype = /obj/item/key - var/image/atvcover = null - -/obj/structure/bed/chair/janicart/atv/New() - atvcover = image("icons/obj/vehicles.dmi", "atvcover") - atvcover.layer = MOB_LAYER + 0.1 - return ..() - -obj/structure/bed/chair/janicart/atv/post_buckle_mob(mob/living/M) - if(buckled_mob) - overlays += atvcover - else - overlays -= atvcover - -/obj/structure/bed/chair/janicart/atv/update_mob() - if(buckled_mob) - buckled_mob.dir = dir - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 4 - -/obj/structure/bed/chair/janicart/atv/handle_rotation() - if(dir == SOUTH) - layer = FLY_LAYER - else - layer = OBJ_LAYER - - if(buckled_mob) - if(buckled_mob.loc != loc) - buckled_mob.buckled = null //Temporary, so Move() succeeds. - buckled_mob.buckled = src //Restoring - - update_mob() diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm new file mode 100644 index 00000000000..93fa9823417 --- /dev/null +++ b/code/modules/vehicles/atv.dm @@ -0,0 +1,81 @@ + +/obj/vehicle/atv + name = "All-terrain vehicle" + 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_state = "atv" + keytype = /obj/item/key + generic_pixel_x = 0 + generic_pixel_y = 4 + var/static/image/atvcover = null + + +/obj/vehicle/atv/New() + ..() + if(!atvcover) + atvcover = image("icons/obj/vehicles.dmi", "atvcover") + atvcover.layer = MOB_LAYER + 0.1 + + +obj/vehicle/atv/post_buckle_mob(mob/living/M) + if(buckled_mob) + overlays += atvcover + else + overlays -= atvcover + + +/obj/vehicle/atv/handle_vehicle_layer() + if(dir == SOUTH) + layer = MOB_LAYER+0.1 + else + layer = OBJ_LAYER + + +//TURRETS! +/obj/vehicle/atv/turret + var/obj/machinery/porta_turret/syndicate/vehicle_turret/turret = null + + +/obj/machinery/porta_turret/syndicate/vehicle_turret + name = "mounted turret" + scan_range = 7 + emp_vunerable = 1 + density = 0 + + +/obj/vehicle/atv/turret/New() + ..() + turret = new(loc) + turret.base = src + + +/obj/vehicle/atv/turret/handle_vehicle_layer() + if(dir == SOUTH) + layer = MOB_LAYER+0.1 + else + layer = OBJ_LAYER + + if(turret) + if(dir == NORTH) + turret.layer = MOB_LAYER+0.1 + else + turret.layer = OBJ_LAYER + + +/obj/vehicle/atv/turret/handle_vehicle_offsets() + ..() + if(turret) + turret.loc = loc + switch(dir) + if(NORTH) + turret.pixel_x = 0 + turret.pixel_y = 4 + if(EAST) + turret.pixel_x = -12 + turret.pixel_y = 4 + if(SOUTH) + turret.pixel_x = 0 + turret.pixel_y = 4 + if(WEST) + turret.pixel_x = 12 + turret.pixel_y = 4 + diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm new file mode 100644 index 00000000000..9330f2ca7bd --- /dev/null +++ b/code/modules/vehicles/pimpin_ride.dm @@ -0,0 +1,95 @@ + + +//PIMP-CART +/obj/vehicle/janicart + 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/weapon/storage/bag/trash/mybag = null + var/floorbuffer = 0 + + +/obj/vehicle/janicart/handle_vehicle_offsets() + ..() + if(buckled_mob) + switch(buckled_mob.dir) + if(NORTH) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 4 + if(EAST) + buckled_mob.pixel_x = -12 + buckled_mob.pixel_y = 7 + if(SOUTH) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 7 + if(WEST) + buckled_mob.pixel_x = 12 + buckled_mob.pixel_y = 7 + + +/obj/item/key/janitor + desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"." + icon_state = "keyjanitor" + + +/obj/item/janiupgrade + name = "floor buffer upgrade" + desc = "An upgrade for mobile janicarts." + icon = 'icons/obj/vehicles.dmi' + icon_state = "upgrade" + + +/obj/vehicle/janicart/Move(a, b, flag) + ..() + if(floorbuffer) + var/turf/tile = loc + if(isturf(tile)) + tile.clean_blood() + for(var/A in tile) + if(istype(A, /obj/effect)) + if(is_cleanable(A)) + qdel(A) + + +/obj/vehicle/janicart/examine(mob/user) + ..() + if(floorbuffer) + user << "It has been upgraded with a floor buffer." + + +/obj/vehicle/janicart/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/storage/bag/trash)) + if(keytype == /obj/item/key/janitor) + if(!user.drop_item()) + return + 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) + user << "You upgrade \the [name] with the floor buffer." + update_icon() + + ..() + + +/obj/vehicle/janicart/update_icon() + overlays.Cut() + if(mybag) + overlays += "cart_garbage" + if(floorbuffer) + overlays += "cart_buffer" + + +/obj/vehicle/janicart/attack_hand(mob/user) + if(..()) + return 1 + else if(mybag) + mybag.loc = get_turf(user) + user.put_in_hands(mybag) + mybag = null + update_icon() + diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm new file mode 100644 index 00000000000..0a440eb370c --- /dev/null +++ b/code/modules/vehicles/secway.dm @@ -0,0 +1,13 @@ + +/obj/vehicle/secway + 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 + generic_pixel_x = 0 + generic_pixel_y = 4 + + +/obj/item/key/security + desc = "A keyring with a small steel key, and a rubber stun baton accessory." + icon_state = "keysec" \ No newline at end of file diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm new file mode 100644 index 00000000000..a3b30584815 --- /dev/null +++ b/code/modules/vehicles/vehicle.dm @@ -0,0 +1,138 @@ + +/obj/vehicle + name = "vehicle" + desc = "A basic vehicle, vroom" + icon = 'icons/obj/vehicles.dmi' + icon_state = "fuckyou" + density = 1 + anchored = 0 + can_buckle = 1 + buckle_lying = 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/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower + var/auto_door_open = TRUE + + //Pixels + var/generic_pixel_x = 0 //All dirs show this pixel_x for the driver + var/generic_pixel_y = 0 //All dirs shwo this pixel_y for the driver + + +/obj/vehicle/New() + ..() + handle_vehicle_layer() + + +//APPEARANCE +/obj/vehicle/proc/handle_vehicle_layer() + if(dir != NORTH) + layer = MOB_LAYER+0.1 + else + layer = OBJ_LAYER + + +//Override this to set your vehicle's various pixel offsets +//if they differ between directions, otherwise use the +//generic variables +/obj/vehicle/proc/handle_vehicle_offsets() + if(buckled_mob) + buckled_mob.dir = dir + buckled_mob.pixel_x = generic_pixel_x + buckled_mob.pixel_y = generic_pixel_y + + +/obj/vehicle/update_icon() + return + + + +//KEYS +/obj/vehicle/proc/keycheck(mob/user) + if(keytype) + if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype)) + return 1 + else + return 1 + return 0 + +/obj/item/key + name = "key" + desc = "A small grey key." + icon = 'icons/obj/vehicles.dmi' + icon_state = "key" + w_class = 1 + + +//BUCKLE HOOKS +/obj/vehicle/unbuckle_mob(force = 0) + if(buckled_mob) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 0 + . = ..() + + +/obj/vehicle/user_buckle_mob(mob/living/M, mob/user) + if(user.incapacitated()) + return + for(var/atom/movable/A in get_turf(src)) + if(A.density) + if(A != src && A != M) + return + M.loc = get_turf(src) + ..() + handle_vehicle_offsets() + + +//MOVEMENT +/obj/vehicle/relaymove(mob/user, direction) + if(user.incapacitated()) + unbuckle_mob() + + if(keycheck(user)) + if(!Process_Spacemove(direction) || !has_gravity(src.loc) || world.time < next_vehicle_move || !isturf(loc)) + return + next_vehicle_move = world.time + vehicle_move_delay + + step(src, direction) + + if(buckled_mob) + if(buckled_mob.loc != loc) + buckled_mob.buckled = null //Temporary, so Move() succeeds. + buckled_mob.buckled = src //Restoring + + handle_vehicle_layer() + handle_vehicle_offsets() + else + user << "You'll need the keys in one of your hands to drive \the [name]." + + +/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)) + user << "Hold [I] in one of your hands while you drive \the [name]." + + +/obj/vehicle/Bump(atom/movable/M) + . = ..() + if(auto_door_open) + if(istype(M, /obj/machinery/door) && buckled_mob) + M.Bumped(buckled_mob) + + +//TYPEFUCKERY +//Because fuck updating all these maps + + +/obj/structure/bed/chair/janicart/secway + parent_type = /obj/vehicle/secway + +/obj/structure/bed/chair/janicart + parent_type = /obj/vehicle/janicart + +/obj/structure/bed/chair/janicart/atv + parent_type = /obj/vehicle/atv \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 3822e2fec1f..bd81b818f53 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1593,6 +1593,10 @@ #include "code\modules\telesci\telepad.dm" #include "code\modules\telesci\telesci_computer.dm" #include "code\modules\tooltip\tooltip.dm" +#include "code\modules\vehicles\atv.dm" +#include "code\modules\vehicles\pimpin_ride.dm" +#include "code\modules\vehicles\secway.dm" +#include "code\modules\vehicles\vehicle.dm" #include "code\orphaned procs\AStar.dm" #include "code\orphaned procs\dbcore.dm" #include "code\orphaned procs\priority_announce.dm" From 3c9c6e5c198adc4770e9e9d58f33830ee2605266 Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Sat, 26 Dec 2015 23:16:39 +0000 Subject: [PATCH 2/3] Fixes ATV speed and name, improves janicart cleaning code by using Moved() vs a Move() override. --- code/modules/vehicles/atv.dm | 3 ++- code/modules/vehicles/pimpin_ride.dm | 8 +++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 93fa9823417..6d9d94747dd 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -1,11 +1,12 @@ /obj/vehicle/atv - name = "All-terrain vehicle" + name = "all-terrain vehicle" 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_state = "atv" keytype = /obj/item/key generic_pixel_x = 0 generic_pixel_y = 4 + vehicle_move_delay = 1 var/static/image/atvcover = null diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index 9330f2ca7bd..c74b66caee1 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -40,16 +40,14 @@ icon_state = "upgrade" -/obj/vehicle/janicart/Move(a, b, flag) - ..() +/obj/vehicle/janicart/Moved(atom/OldLoc, Dir) if(floorbuffer) var/turf/tile = loc if(isturf(tile)) tile.clean_blood() for(var/A in tile) - if(istype(A, /obj/effect)) - if(is_cleanable(A)) - qdel(A) + if(is_cleanable(A)) + qdel(A) /obj/vehicle/janicart/examine(mob/user) From db6f01bf5e592bf491d544da7d2cc2ce59c7a944 Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Mon, 28 Dec 2015 22:20:33 +0000 Subject: [PATCH 3/3] Formalises Path Compatibility --- .../path_compatibility.dm | 28 +++++++++++++++++++ code/modules/vehicles/vehicle.dm | 13 --------- tgstation.dme | 1 + 3 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 code/__PATH_COMPATIBILITY/path_compatibility.dm diff --git a/code/__PATH_COMPATIBILITY/path_compatibility.dm b/code/__PATH_COMPATIBILITY/path_compatibility.dm new file mode 100644 index 00000000000..f3ff37e2bbc --- /dev/null +++ b/code/__PATH_COMPATIBILITY/path_compatibility.dm @@ -0,0 +1,28 @@ +/* + + This is a smart+stupid method of maintaining paths during refactors. + At this point in time we have more maps than ever, and our tools just aren't that great. + So instead of repathing all the maps... + + Keep the old path defined, just as an empty type with that path, and then define it's + parent_type as the new path, effectively maintaining the object/mob w/e without having + to touch all the maps, avoiding all those nasty conflicts! + + Ideally the old paths would be cleaned out as mappers go about their usual routine of + updating old maps. + + tl;dr TYPEFUCKERY, because fuck updating all these maps + +*/ + + + +//Vehicle Refactor - 2015 +/obj/structure/bed/chair/janicart/secway + parent_type = /obj/vehicle/secway + +/obj/structure/bed/chair/janicart + parent_type = /obj/vehicle/janicart + +/obj/structure/bed/chair/janicart/atv + parent_type = /obj/vehicle/atv \ No newline at end of file diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index a3b30584815..6c6c8dbf6a1 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -123,16 +123,3 @@ if(istype(M, /obj/machinery/door) && buckled_mob) M.Bumped(buckled_mob) - -//TYPEFUCKERY -//Because fuck updating all these maps - - -/obj/structure/bed/chair/janicart/secway - parent_type = /obj/vehicle/secway - -/obj/structure/bed/chair/janicart - parent_type = /obj/vehicle/janicart - -/obj/structure/bed/chair/janicart/atv - parent_type = /obj/vehicle/atv \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index bd81b818f53..968ca97ed64 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -67,6 +67,7 @@ #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" #include "code\__HELPERS\sorts\TimSort.dm" +#include "code\__PATH_COMPATIBILITY\path_compatibility.dm" #include "code\_globalvars\configuration.dm" #include "code\_globalvars\database.dm" #include "code\_globalvars\game_modes.dm"