diff --git a/code/datums/riding.dm b/code/datums/riding.dm
index c069e0cdeb..1d989cc653 100644
--- a/code/datums/riding.dm
+++ b/code/datums/riding.dm
@@ -1,6 +1,4 @@
/datum/riding
- var/generic_pixel_x = 0 //All dirs show this pixel_x for the driver
- var/generic_pixel_y = 0 //All dirs show this pixel_y for the driver, use these vars if the pixel shift is stable across all dir, override handle_vehicle_offsets otherwise.
var/next_vehicle_move = 0 //used for move delays
var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower
var/keytype = null
@@ -34,16 +32,29 @@
/datum/riding/proc/force_dismount(mob/living/M)
ridden.unbuckle_mob(M)
-//Override this to set your vehicle's various pixel offsets
-//if they differ between directions, otherwise use the
-//generic variables
/datum/riding/proc/handle_vehicle_offsets()
+ var/ridden_dir = "[ridden.dir]"
+ var/passindex = 0
if(ridden.has_buckled_mobs())
for(var/m in ridden.buckled_mobs)
+ passindex++
var/mob/living/buckled_mob = m
- buckled_mob.setDir(ridden.dir)
- buckled_mob.pixel_x = generic_pixel_x
- buckled_mob.pixel_y = generic_pixel_y
+ var/list/offsets = get_offsets(passindex)
+ dir_loop:
+ for(var/offsetdir in offsets)
+ if(offsetdir == ridden_dir)
+ var/list/diroffsets = offsets[offsetdir]
+ buckled_mob.pixel_x = diroffsets[1]
+ if(diroffsets.len == 2)
+ buckled_mob.pixel_y = diroffsets[2]
+ if(diroffsets.len == 3)
+ buckled_mob.layer = diroffsets[3]
+ break dir_loop
+
+
+//Override this to set your vehicle's various pixel offsets
+/datum/riding/proc/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 0), "[SOUTH]" = list(0, 0), "[EAST]" = list(0, 0), "[WEST]" = list(0, 0))
//KEYS
/datum/riding/proc/keycheck(mob/user)
@@ -100,10 +111,12 @@
//atv
/datum/riding/atv
keytype = /obj/item/key
- generic_pixel_x = 0
- generic_pixel_y = 4
vehicle_move_delay = 1
+/datum/riding/atv/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(0, 4), "[EAST]" = list(0, 4), "[WEST]" = list( 0, 4))
+
+
/datum/riding/atv/handle_vehicle_layer()
if(ridden.dir == SOUTH)
ridden.layer = ABOVE_MOB_LAYER
@@ -150,24 +163,9 @@
keytype = /obj/item/key/janitor
-/datum/riding/janicart/handle_vehicle_offsets()
- ..()
- if(ridden.has_buckled_mobs())
- for(var/m in ridden.buckled_mobs)
- var/mob/living/buckled_mob = m
- 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
+/datum/riding/janicart/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(-12, 7), "[EAST]" = list(0, 7), "[WEST]" = list( 12, 7))
+
//scooter
/datum/riding/scooter/handle_vehicle_layer()
if(ridden.dir == SOUTH)
@@ -175,20 +173,14 @@
else
ridden.layer = OBJ_LAYER
+/datum/riding/scooter/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0), "[SOUTH]" = list(-2), "[EAST]" = list(0), "[WEST]" = list( 2))
+
/datum/riding/scooter/handle_vehicle_offsets()
..()
if(ridden.has_buckled_mobs())
for(var/m in ridden.buckled_mobs)
var/mob/living/buckled_mob = m
- switch(buckled_mob.dir)
- if(NORTH)
- buckled_mob.pixel_x = 0
- if(EAST)
- buckled_mob.pixel_x = -2
- if(SOUTH)
- buckled_mob.pixel_x = 0
- if(WEST)
- buckled_mob.pixel_x = 2
if(buckled_mob.get_num_legs() > 0)
buckled_mob.pixel_y = 5
else
@@ -209,16 +201,18 @@
//secway
/datum/riding/secway
keytype = /obj/item/key/security
- generic_pixel_x = 0
- generic_pixel_y = 4
+
+/datum/riding/secway/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(0, 4), "[EAST]" = list(0, 4), "[WEST]" = list( 0, 4))
//i want to ride my
/datum/riding/bicycle
keytype = null
- generic_pixel_x = 0
- generic_pixel_y = 4
vehicle_move_delay = 0
+/datum/riding/bicycle/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(0, 4), "[EAST]" = list(0, 4), "[WEST]" = list( 0, 4))
+
//speedbike
/datum/riding/space/speedbike
keytype = null
@@ -233,54 +227,28 @@
ridden.pixel_x = -18
ridden.pixel_y = 0
-/datum/riding/space/speedbike/handle_vehicle_offsets()
- if(ridden.has_buckled_mobs())
- for(var/m in ridden.buckled_mobs)
- var/mob/living/buckled_mob = m
- buckled_mob.setDir(ridden.dir)
- switch(ridden.dir)
- if(NORTH)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = -8
- if(SOUTH)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 4
- if(EAST)
- buckled_mob.pixel_x = -10
- buckled_mob.pixel_y = 5
- if(WEST)
- buckled_mob.pixel_x = 10
- buckled_mob.pixel_y = 5
+/datum/riding/space/speedbike/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, -8), "[SOUTH]" = list(0, 4), "[EAST]" = list(-10, 5), "[WEST]" = list( 10, 5))
//SPEEDUWAGON
/datum/riding/space/speedwagon
vehicle_move_delay = 0
-/datum/riding/space/speedwagon/handle_vehicle_offsets()
- if(ridden.has_buckled_mobs())
- for(var/m in ridden.buckled_mobs)
- var/mob/living/buckled_mob = m
- buckled_mob.setDir(ridden.dir)
- ridden.pixel_x = -48
- ridden.pixel_y = -48
- switch(ridden.dir)
- if(NORTH)
- buckled_mob.pixel_x = -10
- buckled_mob.pixel_y = -3
- if(SOUTH)
- buckled_mob.pixel_x = 16
- buckled_mob.pixel_y = 3
- if(EAST)
- buckled_mob.pixel_x = -4
- buckled_mob.pixel_y = 30
- if(WEST)
- buckled_mob.pixel_x = 4
- buckled_mob.pixel_y = -1
-
/datum/riding/space/speedwagon/handle_vehicle_layer()
ridden.layer = BELOW_MOB_LAYER
+/datum/riding/space/speedwagon/get_offsets(pass_index) // list(dir = x, y, layer)
+ switch(pass_index)
+ if(1)
+ return list("[NORTH]" = list(-10, -4), "[SOUTH]" = list(16, 3), "[EAST]" = list(-4, 30), "[WEST]" = list(4, -3))
+ if(2)
+ return list("[NORTH]" = list(19, -5, 4), "[SOUTH]" = list(-13, 3, 4), "[EAST]" = list(-4, -3, 4.1), "[WEST]" = list(4, 28, 3.9))
+ if(3)
+ return list("[NORTH]" = list(-10, -18, 4.2), "[SOUTH]" = list(16, 25, 3.9), "[EAST]" = list(-22, 30), "[WEST]" = list(22, -3, 4.1))
+ if(4)
+ return list("[NORTH]" = list(19, -18, 4.2), "[SOUTH]" = list(-13, 25, 3.9), "[EAST]" = list(-22, 3, 3.9), "[WEST]" = list(22, 28))
+
///////////////BOATS////////////
/datum/riding/boat
keytype = /obj/item/weapon/oar
@@ -297,17 +265,15 @@
/datum/riding/boat/dragon
keytype = null
- generic_pixel_y = 2
- generic_pixel_x = 1
vehicle_move_delay = 1
+/datum/riding/boat/dragon/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(1, 2), "[SOUTH]" = list(1, 2), "[EAST]" = list(1, 2), "[WEST]" = list( 1, 2))
///////////////ANIMALS////////////
//general animals
/datum/riding/animal
keytype = null
- generic_pixel_x = 0
- generic_pixel_y = 4
/datum/riding/animal/handle_ride(mob/user, direction)
if(user.incapacitated())
@@ -335,7 +301,7 @@
/datum/riding/human/ride_check(mob/living/M)
var/mob/living/carbon/human/H = ridden //IF this runtimes I'm blaming the admins.
if(M.incapacitated(FALSE, TRUE) || H.incapacitated(FALSE, TRUE))
- M.visible_message("[M] falls off [ridden]!")
+ M.visible_message("[M] falls off of [ridden]!")
Unbuckle(M)
return FALSE
if(M.restrained(TRUE))
@@ -345,22 +311,8 @@
if(H.pulling == M)
H.stop_pulling()
-/datum/riding/human/handle_vehicle_offsets()
- for(var/mob/living/M in ridden.buckled_mobs)
- M.setDir(ridden.dir)
- switch(ridden.dir)
- if(NORTH)
- M.pixel_x = 0
- M.pixel_y = 6
- if(SOUTH)
- M.pixel_x = 0
- M.pixel_y = 6
- if(EAST)
- M.pixel_x = -6
- M.pixel_y = 4
- if(WEST)
- M.pixel_x = 6
- M.pixel_y = 4
+/datum/riding/human/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 6), "[SOUTH]" = list(0, 6), "[EAST]" = list(-6, 4), "[WEST]" = list( 6, 4))
/datum/riding/human/handle_vehicle_layer()
if(ridden.buckled_mobs && ridden.buckled_mobs.len)
@@ -375,7 +327,7 @@
ridden.unbuckle_mob(user)
user.Weaken(3)
user.Stun(3)
- user.visible_message("[ridden] pushes [user] off of them!")
+ user.visible_message("[ridden] pushes [user] off of them!")
/datum/riding/cyborg
keytype = null
@@ -407,6 +359,9 @@
else
ridden.layer = MOB_LAYER
+/datum/riding/cyborg/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(0, 4), "[EAST]" = list(-6, 3), "[WEST]" = list( 6, 3))
+
/datum/riding/cyborg/handle_vehicle_offsets()
if(ridden.has_buckled_mobs())
for(var/mob/living/M in ridden.buckled_mobs)
@@ -417,26 +372,14 @@
M.pixel_x = R.module.ride_offset_x[dir2text(ridden.dir)]
M.pixel_y = R.module.ride_offset_y[dir2text(ridden.dir)]
else
- switch(ridden.dir)
- if(NORTH)
- M.pixel_x = 0
- M.pixel_y = 4
- if(SOUTH)
- M.pixel_x = 0
- M.pixel_y = 4
- if(EAST)
- M.pixel_x = -6
- M.pixel_y = 3
- if(WEST)
- M.pixel_x = 6
- M.pixel_y = 3
+ ..()
/datum/riding/cyborg/force_dismount(mob/living/M)
ridden.unbuckle_mob(M)
var/turf/target = get_edge_target_turf(ridden, ridden.dir)
var/turf/targetm = get_step(get_turf(ridden), ridden.dir)
M.Move(targetm)
- M.visible_message("[M] is thrown clear of [ridden]!")
+ M.visible_message("[M] is thrown clear of [ridden]!")
M.throw_at(target, 14, 5, ridden)
M.Weaken(3)
diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm
index 7cd2839b4b..d67e769ea3 100644
--- a/code/modules/vehicles/speedbike.dm
+++ b/code/modules/vehicles/speedbike.dm
@@ -35,6 +35,7 @@
icon_state = "speedwagon"
layer = LYING_MOB_LAYER
overlay_state = "speedwagon_cover"
+ max_buckled_mobs = 4
var/crash_all = FALSE //CHAOS
pixel_y = -48 //to fix the offset when Initialized()
pixel_x = -48