Merge pull request #14076 from RemieRichards/VehicleFramework

Simple Vehicle Framework
This commit is contained in:
tkdrg
2015-12-28 19:41:59 -03:00
7 changed files with 346 additions and 214 deletions
@@ -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
-214
View File
@@ -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()
+82
View File
@@ -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
+93
View File
@@ -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()
+13
View File
@@ -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"
+125
View File
@@ -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)
+5
View File
@@ -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"