mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-24 21:48:39 +01:00
Merge pull request #14076 from RemieRichards/VehicleFramework
Simple Vehicle Framework
This commit is contained in:
@@ -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
|
||||
@@ -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 << "<span class='notice'>You hook the trashbag onto the [callme].</span>"
|
||||
I.loc = src
|
||||
mybag = I
|
||||
else if(istype(I, /obj/item/janiupgrade))
|
||||
if(keytype == /obj/item/key/janitor)
|
||||
floorbuffer = 1
|
||||
qdel(I)
|
||||
user << "<span class='notice'>You upgrade the [callme] with the floor buffer.</span>"
|
||||
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 << "<span class='notice'>You'll need the keys in one of your hands to drive this [callme].</span>"
|
||||
|
||||
/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()
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
|
||||
/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
|
||||
vehicle_move_delay = 1
|
||||
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
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
|
||||
|
||||
//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/Moved(atom/OldLoc, Dir)
|
||||
if(floorbuffer)
|
||||
var/turf/tile = loc
|
||||
if(isturf(tile))
|
||||
tile.clean_blood()
|
||||
for(var/A in tile)
|
||||
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 << "<span class='notice'>You hook the trashbag onto \the [name].</span>"
|
||||
I.loc = src
|
||||
mybag = I
|
||||
else if(istype(I, /obj/item/janiupgrade))
|
||||
if(keytype == /obj/item/key/janitor)
|
||||
floorbuffer = 1
|
||||
qdel(I)
|
||||
user << "<span class='notice'>You upgrade \the [name] with the floor buffer.</span>"
|
||||
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()
|
||||
|
||||
@@ -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"
|
||||
@@ -0,0 +1,125 @@
|
||||
|
||||
/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 << "<span class='notice'>You'll need the keys in one of your hands to drive \the [name].</span>"
|
||||
|
||||
|
||||
/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)
|
||||
|
||||
@@ -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"
|
||||
@@ -1598,6 +1599,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"
|
||||
|
||||
Reference in New Issue
Block a user