Pixel adjustments to mobs are now sourced / Refactors riding (#89320)

Fixes #85980

- Pixel adjustments are now sourced

When tweaking a mob's pixel w, x, y, z, is is now done via `add_offsets`
and must have a source string associated

- Refactors riding

Refactors how riding component selects the offsets to use. It's now all
done via the getter rather than a weird mix of a var, a cache, and a
getter.

- Moves a bunch of animations to use `pixel_w` / `pixel_z`

Largely to prevent conflicts with adjustments to a mob's pixel position,
but also as many animations are not actual movements, but visual
movements. Floating is one such example.

It just works

🆑 Melbert
fix: Fixed grab offsets not showing for anything but passive grab
fix: Fix jank with mob offsets when riding things
refactor: Refactored riding component, particularly how it selects layer
and offsets. Report any oddities
refactor: Refactored pixel offsets of mobs. Report any oddities
/🆑
This commit is contained in:
MrMelbert
2025-03-12 16:00:01 -04:00
committed by Roxy
parent 483888e64d
commit 5a16f74fb3
50 changed files with 997 additions and 727 deletions
+104 -104
View File
@@ -1,3 +1,8 @@
/// Offsets applied for people riding something
#define RIDING_SOURCE "riding"
/// Offsets applied for something being ridden
#define BEING_RIDDEN_SOURCE "being_ridden"
/**
* This is the riding component, which is applied to a movable atom by the [ridable element][/datum/element/ridable] when a mob is successfully buckled to said movable.
*
@@ -9,22 +14,14 @@
/datum/component/riding
dupe_mode = COMPONENT_DUPE_UNIQUE
///tick delay between movements, lower = faster, higher = slower
/// Tick delay between movements, lower = faster, higher = slower
var/vehicle_move_delay = 2
/**
* If the driver needs a certain item in hand (or inserted, for vehicles) to drive this. For vehicles, this must be duplicated on the actual vehicle object in their
* [/obj/vehicle/var/key_type] variable because the vehicle objects still have a few special checks/functions of their own I'm not porting over to the riding component
* quite yet. Make sure if you define it on the vehicle, you define it here too.
*/
var/keytype
/// position_of_user = list(dir = list(px, py)), or RIDING_OFFSET_ALL for a generic one.
var/list/riding_offsets = list()
/// ["[DIRECTION]"] = layer. Don't set it for a direction for default, set a direction to null for no change.
var/list/directional_vehicle_layers = list()
/// same as above but instead of layer you have a list(px, py)
var/list/directional_vehicle_offsets = list()
/// allow typecache for only certain turfs, forbid to allow all but those. allow only certain turfs will take precedence.
var/list/allowed_turf_typecache
/// allow typecache for only certain turfs, forbid to allow all but those. allow only certain turfs will take precedence.
@@ -47,11 +44,10 @@
COOLDOWN_DECLARE(vehicle_move_cooldown)
/datum/component/riding/Initialize(mob/living/riding_mob, force = FALSE, buckle_mob_flags= NONE)
/datum/component/riding/Initialize(mob/living/riding_mob, force = FALSE, buckle_mob_flags = NONE)
if(!ismovable(parent))
return COMPONENT_INCOMPATIBLE
handle_specials(riding_mob)
riding_mob.updating_glide_size = FALSE
ride_check_flags |= buckle_mob_flags
@@ -72,25 +68,21 @@
if(!can_force_unbuckle)
RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(force_unbuckle))
/**
* This proc handles all of the proc calls to things like set_vehicle_dir_layer() that a type of riding datum needs to call on creation
*
* The original riding component had these procs all called from the ridden object itself through the use of GetComponent() and LoadComponent()
* This was obviously problematic for componentization, but while lots of the variables being set were able to be moved to component variables,
* the proc calls couldn't be. Thus, anything that has to do an initial proc call should be handled here.
*/
/datum/component/riding/proc/handle_specials()
return
/// This proc is called when a rider unbuckles, whether they chose to or not. If there's no more riders, this will be the riding component's death knell.
/datum/component/riding/proc/vehicle_mob_unbuckle(datum/source, mob/living/rider, force = FALSE)
SIGNAL_HANDLER
restore_rider_layer_and_offsets(rider)
handle_unbuckle(rider)
/datum/component/riding/proc/handle_unbuckle(mob/living/rider)
var/atom/movable/movable_parent = parent
restore_position(rider)
if(movable_parent.has_buckled_mobs())
update_parent_layer_and_offsets(movable_parent.dir, animate = TRUE)
else
restore_parent_layer_and_offsets()
qdel(src)
/datum/component/riding/proc/handle_unbuckle(mob/living/rider)
unequip_buckle_inhands(rider)
rider.updating_glide_size = TRUE
UnregisterSignal(rider, COMSIG_LIVING_TRY_PULL)
@@ -98,18 +90,17 @@
if (HAS_TRAIT(parent, trait))
REMOVE_TRAIT(rider, trait, REF(src))
rider.remove_traits(rider_traits, REF(src))
if(!movable_parent.has_buckled_mobs())
qdel(src)
/// This proc is called when a rider buckles, allowing for offsets to be set properly
/datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/rider, force = FALSE)
SIGNAL_HANDLER
var/atom/movable/movable_parent = parent
handle_vehicle_layer(movable_parent.dir)
handle_vehicle_offsets(movable_parent.dir)
update_parent_layer_and_offsets(movable_parent.dir, animate = TRUE)
handle_buckle(rider)
if(rider.pulling == source)
/datum/component/riding/proc/handle_buckle(mob/living/rider)
if(rider.pulling == parent)
rider.stop_pulling()
RegisterSignal(rider, COMSIG_LIVING_TRY_PULL, PROC_REF(on_rider_try_pull))
@@ -117,7 +108,6 @@
if (HAS_TRAIT(parent, trait))
ADD_TRAIT(rider, trait, REF(src))
rider.add_traits(rider_traits, REF(src))
post_vehicle_mob_buckle(movable_parent, rider)
/// This proc is called when the rider attempts to grab the thing they're riding, preventing them from doing so.
/datum/component/riding/proc/on_rider_try_pull(mob/living/rider_pulling, atom/movable/target, force)
@@ -127,24 +117,6 @@
ridden.balloon_alert(rider_pulling, "not while riding it!")
return COMSIG_LIVING_CANCEL_PULL
///any behavior we want to happen after buckling the mob
/datum/component/riding/proc/post_vehicle_mob_buckle(atom/movable/ridden, atom/movable/rider)
return TRUE
/// Some ridable atoms may want to only show on top of the rider in certain directions, like wheelchairs
/datum/component/riding/proc/handle_vehicle_layer(dir)
var/atom/movable/AM = parent
var/static/list/defaults = list(TEXT_NORTH = OBJ_LAYER, TEXT_SOUTH = ABOVE_MOB_LAYER, TEXT_EAST = ABOVE_MOB_LAYER, TEXT_WEST = ABOVE_MOB_LAYER)
. = defaults["[dir]"]
if(directional_vehicle_layers["[dir]"])
. = directional_vehicle_layers["[dir]"]
if(isnull(.)) //you can set it to null to not change it.
. = AM.layer
AM.layer = .
/datum/component/riding/proc/set_vehicle_dir_layer(dir, layer)
directional_vehicle_layers["[dir]"] = layer
/// This is called after the ridden atom is successfully moved and is used to handle icon stuff
/datum/component/riding/proc/vehicle_moved(datum/source, oldloc, dir, forced)
SIGNAL_HANDLER
@@ -157,8 +129,7 @@
ride_check(buckled_mob)
if(QDELETED(src))
return // runtimed with piggy's without this, look into this more
handle_vehicle_offsets(dir)
handle_vehicle_layer(dir)
update_parent_layer_and_offsets(dir)
/// Turning is like moving
/datum/component/riding/proc/vehicle_turned(datum/source, _old_dir, new_dir)
@@ -173,61 +144,80 @@
/datum/component/riding/proc/ride_check(mob/living/rider, consequences = TRUE)
return TRUE
/datum/component/riding/proc/handle_vehicle_offsets(dir)
var/atom/movable/AM = parent
var/AM_dir = "[dir]"
var/passindex = 0
if(!AM.has_buckled_mobs())
#define GET_X_OFFSET(offsets) (length(offsets) >= 1 ? offsets[1] : 0)
#define GET_Y_OFFSET(offsets) (length(offsets) >= 2 ? offsets[2] : 0)
#define GET_LAYER(offsets, default) (length(offsets) >= 3 ? offsets[3] : default)
/datum/component/riding/proc/update_parent_layer_and_offsets(dir, animate = FALSE)
var/atom/movable/seat = parent
if(!seat.has_buckled_mobs())
return
for(var/m in AM.buckled_mobs)
var/passindex = 0
for(var/mob/living/buckled_mob as anything in seat.buckled_mobs)
passindex++
var/mob/living/buckled_mob = m
var/list/offsets = get_offsets(passindex)
buckled_mob.setDir(dir)
dir_loop:
for(var/offsetdir in offsets)
if(offsetdir == AM_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
var/static/list/default_vehicle_pixel_offsets = list(TEXT_NORTH = list(0, 0), TEXT_SOUTH = list(0, 0), TEXT_EAST = list(0, 0), TEXT_WEST = list(0, 0))
var/px = default_vehicle_pixel_offsets[AM_dir]
var/py = default_vehicle_pixel_offsets[AM_dir]
if(directional_vehicle_offsets[AM_dir])
if(isnull(directional_vehicle_offsets[AM_dir]))
px = AM.pixel_x
py = AM.pixel_y
else
px = directional_vehicle_offsets[AM_dir][1]
py = directional_vehicle_offsets[AM_dir][2]
AM.pixel_x = px
AM.pixel_y = py
update_rider_layer_and_offsets(dir, passindex, buckled_mob)
/datum/component/riding/proc/set_vehicle_dir_offsets(dir, x, y)
directional_vehicle_offsets["[dir]"] = list(x, y)
var/list/offsets = get_parent_offsets_and_layers()?["[dir]"]
var/px = GET_X_OFFSET(offsets)
var/py = GET_Y_OFFSET(offsets)
var/layer = GET_LAYER(offsets, seat.layer)
//Override this to set your vehicle's various pixel offsets
/datum/component/riding/proc/get_offsets(pass_index) // list(dir = x, y, layer)
. = list(TEXT_NORTH = list(0, 0), TEXT_SOUTH = list(0, 0), TEXT_EAST = list(0, 0), TEXT_WEST = list(0, 0))
if(riding_offsets["[pass_index]"])
. = riding_offsets["[pass_index]"]
else if(riding_offsets["[RIDING_OFFSET_ALL]"])
. = riding_offsets["[RIDING_OFFSET_ALL]"]
if(isliving(seat))
var/mob/living/living_seat = seat
living_seat.add_offsets(BEING_RIDDEN_SOURCE, x_add = px, y_add = py, animate = animate)
else
seat.pixel_x = px + seat.base_pixel_x
seat.pixel_y = py + seat.base_pixel_y
seat.layer = layer
/datum/component/riding/proc/set_riding_offsets(index, list/offsets)
if(!islist(offsets))
return FALSE
riding_offsets["[index]"] = offsets
/datum/component/riding/proc/update_rider_layer_and_offsets(dir, passindex, mob/living/rider, animate = FALSE)
if(rider.dir != dir)
rider.setDir(dir)
/datum/component/riding/proc/set_vehicle_offsets(list/offsets)
if(!islist(offsets))
return FALSE
directional_vehicle_offsets = offsets
var/list/diroffsets = get_rider_offsets_and_layers(passindex, rider)?["[dir]"]
var/x_offset = GET_X_OFFSET(diroffsets)
var/y_offset = GET_Y_OFFSET(diroffsets)
var/layer = GET_LAYER(diroffsets, rider.layer)
// if they are intended to be buckled, offset their existing offset
var/atom/movable/seat = parent
if(seat.buckle_lying && rider.body_position == LYING_DOWN)
y_offset += (-1 * PIXEL_Y_OFFSET_LYING)
rider.add_offsets(RIDING_SOURCE, x_add = x_offset, y_add = y_offset, animate = animate)
rider.layer = layer
#undef GET_X_OFFSET
#undef GET_Y_OFFSET
#undef GET_LAYER
/**
* Determines where riders get offset while riding
*
* * pass_index: The index of the rider in the list of buckled mobs
* * mob/offsetter: The mob that is being offset
*/
/datum/component/riding/proc/get_rider_offsets_and_layers(pass_index, mob/offsetter) as /list // list(dir = x, y, layer)
RETURN_TYPE(/list)
return list(
TEXT_NORTH = list(0, 0),
TEXT_SOUTH = list(0, 0),
TEXT_EAST = list(0, 0),
TEXT_WEST = list(0, 0),
)
/**
* Determines where the parent gets offset while riders are riding
*/
/datum/component/riding/proc/get_parent_offsets_and_layers() as /list // list(dir = x, y, layer)
RETURN_TYPE(/list)
return list(
TEXT_NORTH = list(0, 0, OBJ_LAYER),
TEXT_SOUTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_EAST = list(0, 0, ABOVE_MOB_LAYER),
TEXT_WEST = list(0, 0, ABOVE_MOB_LAYER),
)
/**
* This proc is used to see if we have the appropriate key to drive this atom, if such a key is needed. Returns FALSE if we don't have what we need to drive.
@@ -245,15 +235,22 @@
return user.is_holding_item_of_type(keytype)
//BUCKLE HOOKS
/datum/component/riding/proc/restore_position(mob/living/buckled_mob)
if(isnull(buckled_mob))
return
buckled_mob.pixel_x = buckled_mob.base_pixel_x
buckled_mob.pixel_y = buckled_mob.base_pixel_y
/datum/component/riding/proc/restore_rider_layer_and_offsets(mob/living/buckled_mob)
buckled_mob.remove_offsets(RIDING_SOURCE)
buckled_mob.layer = initial(buckled_mob.layer)
var/atom/source = parent
SET_PLANE_EXPLICIT(buckled_mob, initial(buckled_mob.plane), source)
if(buckled_mob.client)
buckled_mob.client.view_size.resetToDefault()
buckled_mob.client?.view_size.resetToDefault()
/datum/component/riding/proc/restore_parent_layer_and_offsets()
var/atom/movable/seat = parent
if(isliving(seat))
var/mob/living/living_seat = seat
living_seat.remove_offsets(BEING_RIDDEN_SOURCE)
else
seat.pixel_x = seat.base_pixel_x
seat.pixel_y = seat.base_pixel_y
seat.layer = initial(seat.layer)
//MOVEMENT
/datum/component/riding/proc/turf_check(turf/next, turf/current)
@@ -327,3 +324,6 @@
SIGNAL_HANDLER
for (var/mob/passenger as anything in ridden.buckled_mobs)
passenger.Bump(supermatter)
#undef RIDING_SOURCE
#undef BEING_RIDDEN_SOURCE
+268 -204
View File
@@ -21,7 +21,7 @@
living_parent.stop_pulling() // was only used on humans previously, may change some other behavior
log_riding(living_parent, riding_mob)
riding_mob.set_glide_size(living_parent.glide_size)
handle_vehicle_offsets(living_parent.dir)
update_parent_layer_and_offsets(living_parent.dir)
if(can_use_abilities)
setup_abilities(riding_mob)
@@ -109,14 +109,8 @@
var/mob/living/living_parent = parent
step(living_parent, direction)
var/modified_move_delay = vehicle_move_delay
if(ishuman(user) && HAS_TRAIT(user, TRAIT_ROUGHRIDER)) // YEEHAW!
var/mob/living/carbon/human/rough_rider = user
var/ride_benefit = null
if(HAS_TRAIT(rough_rider, TRAIT_PRIMITIVE)) // closer to a beast than a man; you don't need to think to ride!
ride_benefit = SANITY_LEVEL_GREAT
else
ride_benefit = rough_rider.mob_mood.sanity_level
switch(ride_benefit)
if(HAS_TRAIT(user, TRAIT_ROUGHRIDER)) // YEEHAW!
switch(HAS_TRAIT(user, TRAIT_PRIMITIVE) ? SANITY_LEVEL_GREAT : user.mob_mood?.sanity_level)
if(SANITY_LEVEL_GREAT)
modified_move_delay *= 0.8
if(SANITY_LEVEL_NEUTRAL)
@@ -216,7 +210,8 @@
else if(ride_check_flags & CARRIER_NEEDS_ARM) // fireman
human_parent.buckle_lying = 90
/datum/component/riding/creature/post_vehicle_mob_buckle(mob/living/ridden, mob/living/rider)
/datum/component/riding/creature/handle_buckle(mob/living/rider)
var/mob/living/ridden = parent
if(!require_minigame || ridden.faction.Find(REF(rider)))
return
ridden.Shake(duration = 2 SECONDS)
@@ -260,81 +255,55 @@
/datum/component/riding/creature/human/proc/check_carrier_fall_over(mob/living/carbon/human/human_parent)
SIGNAL_HANDLER
for(var/i in human_parent.buckled_mobs)
var/mob/living/rider = i
for(var/mob/living/rider as anything in human_parent.buckled_mobs)
human_parent.unbuckle_mob(rider)
rider.Paralyze(1 SECONDS)
rider.Knockdown(4 SECONDS)
human_parent.visible_message(span_danger("[rider] topples off of [human_parent] as they both fall to the ground!"), \
span_warning("You fall to the ground, bringing [rider] with you!"), span_hear("You hear two consecutive thuds."), COMBAT_MESSAGE_RANGE, ignored_mobs=rider)
human_parent.visible_message(
span_danger("[rider] topples off of [human_parent] as they both fall to the ground!"),
span_warning("You fall to the ground, bringing [rider] with you!"),
span_hear("You hear two consecutive thuds."),
COMBAT_MESSAGE_RANGE,
ignored_mobs = rider,
visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE,
)
to_chat(rider, span_danger("[human_parent] falls to the ground, bringing you with [human_parent.p_them()]!"))
/datum/component/riding/creature/human/handle_vehicle_layer(dir)
var/atom/movable/AM = parent
if(!AM.buckled_mobs || !AM.buckled_mobs.len)
AM.layer = MOB_LAYER
return
/datum/component/riding/creature/human/get_rider_offsets_and_layers(pass_index, mob/offsetter)
var/mob/living/carbon/human/seat = parent
// fireman carry
if(seat.buckle_lying)
return list(
TEXT_NORTH = list(0, 6, MOB_ABOVE_PIGGYBACK_LAYER),
TEXT_SOUTH = list(0, 6, MOB_BELOW_PIGGYBACK_LAYER),
TEXT_EAST = list(0, 6, MOB_BELOW_PIGGYBACK_LAYER),
TEXT_WEST = list(0, 6, MOB_BELOW_PIGGYBACK_LAYER),
)
// piggyback
return list(
TEXT_NORTH = list( 0, 8, MOB_ABOVE_PIGGYBACK_LAYER),
TEXT_SOUTH = list( 0, 8, MOB_BELOW_PIGGYBACK_LAYER),
TEXT_EAST = list(-6, 8, MOB_BELOW_PIGGYBACK_LAYER),
TEXT_WEST = list( 6, 8, MOB_BELOW_PIGGYBACK_LAYER),
)
for(var/mob/M in AM.buckled_mobs) //ensure proper layering of piggyback and carry, sometimes weird offsets get applied
M.layer = MOB_LAYER
/datum/component/riding/creature/human/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0),
TEXT_SOUTH = list(0, 0),
TEXT_EAST = list(0, 0),
TEXT_WEST = list(0, 0),
)
if(!AM.buckle_lying) // rider is vertical, must be piggybacking
if(dir == SOUTH)
AM.layer = MOB_ABOVE_PIGGYBACK_LAYER
else
AM.layer = MOB_BELOW_PIGGYBACK_LAYER
else // laying flat, we must be firemanning the rider
if(dir == NORTH)
AM.layer = MOB_BELOW_PIGGYBACK_LAYER
else
AM.layer = MOB_ABOVE_PIGGYBACK_LAYER
/datum/component/riding/creature/human/get_offsets(pass_index)
var/mob/living/carbon/human/H = parent
/* BUBBER EDIT REMOVAL START
if(H.buckle_lying)
return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(0, 6), TEXT_WEST = list(0, 6))
else
return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(-6, 4), TEXT_WEST = list( 6, 4))
*/ // BUBBER EDIT REMOVAL END
// BUBBER EDIT ADDITION BEGIN - Oversized Overhaul, Taur riding
if(H.buckle_lying)
return HAS_TRAIT(H, TRAIT_OVERSIZED) ? list(
TEXT_NORTH = list(0, OVERSIZED_OFFSET),
TEXT_SOUTH = list(0, OVERSIZED_OFFSET),
TEXT_EAST = list(0, OVERSIZED_OFFSET),
TEXT_WEST = list(0, OVERSIZED_OFFSET),
) : list(
TEXT_NORTH = list(0, REGULAR_OFFSET),
TEXT_SOUTH = list(0, REGULAR_OFFSET),
TEXT_EAST = list(0, REGULAR_OFFSET),
TEXT_WEST = list(0, REGULAR_OFFSET),
)
else if (!(ride_check_flags & RIDING_TAUR)) // BUBBER EDIT CHANGE - ORIGINAL: else
return HAS_TRAIT(H, TRAIT_OVERSIZED) ? list(
TEXT_NORTH = list(0, OVERSIZED_OFFSET),
TEXT_SOUTH = list(0, OVERSIZED_OFFSET),
TEXT_EAST = list(-OVERSIZED_SIDE_OFFSET, OVERSIZED_OFFSET),
TEXT_WEST = list(OVERSIZED_SIDE_OFFSET, OVERSIZED_OFFSET),
) : list(
TEXT_NORTH = list(0, REGULAR_OFFSET),
TEXT_SOUTH = list(0, REGULAR_OFFSET),
TEXT_EAST = list(-REGULAR_OFFSET, REGULAR_SIDE_OFFSET),
TEXT_WEST = list(REGULAR_OFFSET, REGULAR_SIDE_OFFSET)
)
if (ride_check_flags & RIDING_TAUR)
var/obj/item/organ/taur_body/taur_body = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAUR)
return taur_body.get_riding_offset(oversized = HAS_TRAIT(H, TRAIT_OVERSIZED))
//BUBBER EDIT END
/datum/component/riding/creature/human/force_dismount(mob/living/dismounted_rider, throw_range = 8, throw_speed = 3, gentle = FALSE)
var/atom/movable/AM = parent
AM.unbuckle_mob(dismounted_rider)
dismounted_rider.Paralyze(1 SECONDS)
dismounted_rider.Knockdown(4 SECONDS)
dismounted_rider.visible_message(span_warning("[AM] pushes [dismounted_rider] off of [AM.p_them()]!"), \
span_warning("[AM] pushes you off of [AM.p_them()]!"))
/datum/component/riding/creature/human/force_dismount(mob/living/rider, throw_range = 8, throw_speed = 3, gentle = FALSE)
var/atom/movable/seat = parent
seat.unbuckle_mob(rider)
rider.Paralyze(1 SECONDS)
rider.Knockdown(4 SECONDS)
rider.visible_message(
span_warning("[seat] pushes [rider] off of [seat.p_them()]!"),
span_warning("[seat] pushes you off of [seat.p_them()]!"),
)
//Now onto cyborg riding//
@@ -350,65 +319,88 @@
Unbuckle(user)
to_chat(user, span_warning("You can't grab onto [robot_parent] with no hands!"))
/datum/component/riding/creature/cyborg/handle_vehicle_layer(dir)
var/atom/movable/robot_parent = parent
if(dir == SOUTH)
robot_parent.layer = MOB_ABOVE_PIGGYBACK_LAYER
else
robot_parent.layer = MOB_BELOW_PIGGYBACK_LAYER
/datum/component/riding/creature/cyborg/get_offsets(pass_index) // list(dir = x, y, layer)
return list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(-6, 3), TEXT_WEST = list( 6, 3))
/datum/component/riding/creature/cyborg/handle_vehicle_offsets(dir)
/datum/component/riding/creature/cyborg/get_rider_offsets_and_layers(pass_index, mob/offsetter)
var/mob/living/silicon/robot/robot_parent = parent
return robot_parent.model?.ride_offsets || DEFAULT_ROBOT_RIDING_OFFSETS
for(var/mob/living/rider in robot_parent.buckled_mobs)
rider.setDir(dir)
if(istype(robot_parent.model))
rider.pixel_x = robot_parent.model.ride_offset_x[dir2text(dir)]
rider.pixel_y = robot_parent.model.ride_offset_y[dir2text(dir)]
/datum/component/riding/creature/cyborg/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, MOB_BELOW_PIGGYBACK_LAYER),
TEXT_SOUTH = list(0, 0, MOB_ABOVE_PIGGYBACK_LAYER),
TEXT_EAST = list(0, 0, MOB_ABOVE_PIGGYBACK_LAYER),
TEXT_WEST = list(0, 0, MOB_ABOVE_PIGGYBACK_LAYER),
)
//now onto every other ridable mob//
/datum/component/riding/creature/mulebot
/datum/component/riding/creature/mulebot/handle_specials()
. = ..()
var/atom/movable/movable_parent = parent
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 12), TEXT_SOUTH = list(0, 12), TEXT_EAST = list(0, 12), TEXT_WEST = list(0, 12)))
set_vehicle_dir_layer(SOUTH, movable_parent.layer) //vehicles default to ABOVE_MOB_LAYER while moving, let's make sure that doesn't happen while a mob is riding us.
set_vehicle_dir_layer(NORTH, movable_parent.layer)
set_vehicle_dir_layer(EAST, movable_parent.layer)
set_vehicle_dir_layer(WEST, movable_parent.layer)
/datum/component/riding/creature/mulebot/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(0, 12),
TEXT_SOUTH = list(0, 12),
TEXT_EAST = list(0, 12),
TEXT_WEST = list(0, 12),
)
/datum/component/riding/creature/mulebot/get_parent_offsets_and_layers()
return null
/datum/component/riding/creature/cow/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 8), TEXT_SOUTH = list(0, 8), TEXT_EAST = list(-2, 8), TEXT_WEST = list(2, 8)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/creature/cow
/datum/component/riding/creature/pig/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 8), TEXT_SOUTH = list(0, 8), TEXT_EAST = list(-2, 8), TEXT_WEST = list(2, 8)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/creature/cow/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list( 0, 8),
TEXT_SOUTH = list( 0, 8),
TEXT_EAST = list(-2, 8),
TEXT_WEST = list( 2, 8),
)
/datum/component/riding/creature/pony/handle_specials()
. = ..()
vehicle_move_delay = 1.5
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 9), TEXT_SOUTH = list(0, 9), TEXT_EAST = list(-2, 9), TEXT_WEST = list(2, 9)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/creature/cow/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, OBJ_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/creature/pig
/datum/component/riding/creature/pig/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list( 0, 8),
TEXT_SOUTH = list( 0, 8),
TEXT_EAST = list(-2, 8),
TEXT_WEST = list( 2, 8),
)
/datum/component/riding/creature/pig/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, OBJ_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/creature/pony
vehicle_move_delay = 1.5
COOLDOWN_DECLARE(pony_trot_cooldown)
/datum/component/riding/creature/pony/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list( 0, 9),
TEXT_SOUTH = list( 0, 9),
TEXT_EAST = list(-2, 9),
TEXT_WEST = list( 2, 9),
)
/datum/component/riding/creature/pony/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, OBJ_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/creature/pony/driver_move(atom/movable/movable_parent, mob/living/user, direction)
. = ..()
@@ -422,51 +414,80 @@
playsound(movable_parent, 'sound/mobs/non-humanoids/pony/clown_gallup.ogg', 50)
COOLDOWN_START(src, pony_trot_cooldown, 500 MILLISECONDS)
/datum/component/riding/creature/bear/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(1, 8), TEXT_SOUTH = list(1, 8), TEXT_EAST = list(-3, 6), TEXT_WEST = list(3, 6)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(WEST, ABOVE_MOB_LAYER)
/datum/component/riding/creature/bear
/datum/component/riding/creature/bear/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list( 1, 8),
TEXT_SOUTH = list( 1, 8),
TEXT_EAST = list(-3, 6),
TEXT_WEST = list( 3, 6),
)
/datum/component/riding/creature/bear/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, OBJ_LAYER),
TEXT_EAST = list(0, 0, ABOVE_MOB_LAYER),
TEXT_WEST = list(0, 0, ABOVE_MOB_LAYER),
)
/datum/component/riding/creature/carp
override_allow_spacemove = TRUE
/datum/component/riding/creature/carp/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 13), TEXT_SOUTH = list(0, 15), TEXT_EAST = list(-2, 12), TEXT_WEST = list(2, 12)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/creature/carp/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(0, 13),
TEXT_SOUTH = list(0, 15),
TEXT_EAST = list(-2, 12),
TEXT_WEST = list( 2, 12),
)
/datum/component/riding/creature/carp/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, OBJ_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/creature/megacarp/handle_specials()
. = ..()
var/atom/movable/movable_parent = parent
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(1, 8), TEXT_SOUTH = list(1, 8), TEXT_EAST = list(-3, 6), TEXT_WEST = list(3, 6)))
set_vehicle_dir_offsets(SOUTH, movable_parent.pixel_x, 0)
set_vehicle_dir_offsets(NORTH, movable_parent.pixel_x, 0)
set_vehicle_dir_offsets(EAST, movable_parent.pixel_x, 0)
set_vehicle_dir_offsets(WEST, movable_parent.pixel_x, 0)
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/creature/megacarp
/datum/component/riding/creature/megacarp/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(1, 8),
TEXT_SOUTH = list(1, 8),
TEXT_EAST = list(-3, 6),
TEXT_WEST = list(3, 6),
)
/datum/component/riding/creature/megacarp/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, OBJ_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/creature/vatbeast
override_allow_spacemove = TRUE
can_use_abilities = TRUE
/datum/component/riding/creature/vatbeast/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 15), TEXT_SOUTH = list(0, 15), TEXT_EAST = list(-10, 15), TEXT_WEST = list(10, 15)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/creature/vatbeast/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(0, 15),
TEXT_SOUTH = list(0, 15),
TEXT_EAST = list(-10, 15),
TEXT_WEST = list(10, 15),
)
/datum/component/riding/creature/vatbeast/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, OBJ_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/creature/goliath
keytype = /obj/item/key/lasso
@@ -486,38 +507,58 @@
goliath.remove_movespeed_modifier(/datum/movespeed_modifier/goliath_mount)
return ..()
/datum/component/riding/creature/goliath/handle_specials()
. = ..()
set_vehicle_offsets(list(TEXT_NORTH = list(-12, 0), TEXT_SOUTH = list(-12, 0), TEXT_EAST = list(-12, 0), TEXT_WEST = list(-12, 0)))
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 12), TEXT_SOUTH = list(0, 12), TEXT_EAST = list(-4, 12), TEXT_WEST = list(3, 12)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/creature/goliath/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list( 0, 12),
TEXT_SOUTH = list( 0, 12),
TEXT_EAST = list(-4, 12),
TEXT_WEST = list( 3, 12),
)
/datum/component/riding/creature/glutton/handle_specials()
. = ..()
var/atom/movable/movable_parent = parent
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 24), TEXT_SOUTH = list(0, 24), TEXT_EAST = list(-16, 24), TEXT_WEST = list(16, 24)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(WEST, ABOVE_MOB_LAYER)
set_vehicle_dir_offsets(SOUTH, movable_parent.pixel_x, 0)
set_vehicle_dir_offsets(NORTH, movable_parent.pixel_x, 0)
set_vehicle_dir_offsets(EAST, movable_parent.pixel_x, 0)
set_vehicle_dir_offsets(WEST, movable_parent.pixel_x, 0)
/datum/component/riding/creature/goliath/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(-12, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(-12, 0, ABOVE_MOB_LAYER),
TEXT_EAST = list(-12, 0, OBJ_LAYER),
TEXT_WEST = list(-12, 0, OBJ_LAYER),
)
/datum/component/riding/creature/glutton
/datum/component/riding/creature/glutton/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list( 0, 24),
TEXT_SOUTH = list( 0, 24),
TEXT_EAST = list(-16, 24),
TEXT_WEST = list( 16, 24),
)
/datum/component/riding/creature/glutton/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, OBJ_LAYER),
TEXT_EAST = list(0, 0, ABOVE_MOB_LAYER),
TEXT_WEST = list(0, 0, ABOVE_MOB_LAYER),
)
/datum/component/riding/creature/guardian
can_be_driven = FALSE
/datum/component/riding/creature/guardian/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(-6, 3), TEXT_WEST = list(6, 3)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(WEST, ABOVE_MOB_LAYER)
/datum/component/riding/creature/guardian/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list( 0, 4),
TEXT_SOUTH = list( 0, 4),
TEXT_EAST = list(-6, 3),
TEXT_WEST = list( 6, 3),
)
/datum/component/riding/creature/guardian/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, OBJ_LAYER),
TEXT_EAST = list(0, 0, ABOVE_MOB_LAYER),
TEXT_WEST = list(0, 0, ABOVE_MOB_LAYER),
)
/datum/component/riding/creature/guardian/ride_check(mob/living/user, consequences = TRUE)
var/mob/living/basic/guardian/charger = parent
@@ -527,22 +568,34 @@
/datum/component/riding/creature/goldgrub
/datum/component/riding/creature/goldgrub/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(11, 3), TEXT_SOUTH = list(11, 3), TEXT_EAST = list(9, 3), TEXT_WEST = list(14, 3)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/creature/goldgrub/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(11, 3),
TEXT_SOUTH = list(11, 3),
TEXT_EAST = list( 9, 3),
TEXT_WEST = list(14, 3),
)
/datum/component/riding/creature/goldgrub/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, OBJ_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/creature/leaper
can_force_unbuckle = FALSE
can_use_abilities = TRUE
ride_check_flags = JUST_FRIEND_RIDERS
/datum/component/riding/creature/leaper/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(17, 46), TEXT_SOUTH = list(17,51), TEXT_EAST = list(27, 46), TEXT_WEST = list(6, 46)))
/datum/component/riding/creature/leaper/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(17, 46),
TEXT_SOUTH = list(17, 51),
TEXT_EAST = list(27, 46),
TEXT_WEST = list( 6, 46),
)
/datum/component/riding/creature/leaper/Initialize(mob/living/riding_mob, force = FALSE, ride_check_flags = NONE)
. = ..()
@@ -557,7 +610,6 @@
return
basic_parent.melee_attack(pointed)
/datum/component/riding/leaper/handle_unbuckle(mob/living/rider)
. = ..()
UnregisterSignal(rider, COMSIG_MOVABLE_POINTED)
@@ -592,16 +644,28 @@
for(var/mob/living/buckled_mob in living_parent.buckled_mobs)
force_dismount(buckled_mob, throw_range = 2, gentle = TRUE)
/datum/component/riding/creature/raptor/handle_specials()
. = ..()
/datum/component/riding/creature/raptor/get_rider_offsets_and_layers(pass_index, mob/offsetter)
if(!SSmapping.is_planetary())
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(7, 7), TEXT_SOUTH = list(2, 10), TEXT_EAST = list(12, 7), TEXT_WEST = list(10, 7)))
else
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 7), TEXT_SOUTH = list(0, 10), TEXT_EAST = list(-3, 9), TEXT_WEST = list(3, 9)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
return list(
TEXT_NORTH = list( 7, 7),
TEXT_SOUTH = list( 2, 10),
TEXT_EAST = list(12, 7),
TEXT_WEST = list(10, 7),
)
return list(
TEXT_NORTH = list( 0, 7),
TEXT_SOUTH = list( 0, 10),
TEXT_EAST = list(-3, 9),
TEXT_WEST = list( 3, 9),
)
/datum/component/riding/creature/raptor/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, OBJ_LAYER),
TEXT_SOUTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/creature/raptor/fast
vehicle_move_delay = 1.5
+142 -68
View File
@@ -101,8 +101,7 @@
if(QDELETED(src))
return
handle_vehicle_layer(movable_parent.dir)
handle_vehicle_offsets(movable_parent.dir)
update_parent_layer_and_offsets(movable_parent.dir)
return TRUE
/datum/component/riding/vehicle/atv
@@ -110,38 +109,54 @@
ride_check_flags = RIDER_NEEDS_LEGS | RIDER_NEEDS_ARMS | UNBUCKLE_DISABLED_RIDER
vehicle_move_delay = 1.5
/datum/component/riding/vehicle/atv/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(0, 4), TEXT_WEST = list( 0, 4)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/vehicle/atv/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(0, 4),
TEXT_SOUTH = list(0, 4),
TEXT_EAST = list(0, 4),
TEXT_WEST = list(0, 4),
)
/datum/component/riding/vehicle/atv/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, OBJ_LAYER),
TEXT_SOUTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/vehicle/bicycle
ride_check_flags = RIDER_NEEDS_LEGS | RIDER_NEEDS_ARMS | UNBUCKLE_DISABLED_RIDER
vehicle_move_delay = 0
/datum/component/riding/vehicle/bicycle/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(0, 4), TEXT_WEST = list( 0, 4)))
/datum/component/riding/vehicle/bicycle/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(0, 4),
TEXT_SOUTH = list(0, 4),
TEXT_EAST = list(0, 4),
TEXT_WEST = list(0, 4),
)
/datum/component/riding/vehicle/lavaboat
ride_check_flags = NONE // not sure
keytype = /obj/item/oar
/// The one turf we can move on.
var/allowed_turf = /turf/open/lava
/datum/component/riding/vehicle/lavaboat/handle_specials()
/datum/component/riding/vehicle/lavaboat/Initialize(mob/living/riding_mob, force, ride_check_flags, potion_boost)
. = ..()
allowed_turf_typecache = typecacheof(allowed_turf)
/datum/component/riding/vehicle/lavaboat/dragonboat
vehicle_move_delay = 1
/datum/component/riding/vehicle/lavaboat/dragonboat/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(1, 2), TEXT_SOUTH = list(1, 2), TEXT_EAST = list(1, 2), TEXT_WEST = list( 1, 2)))
/datum/component/riding/vehicle/lavaboat/dragonboat/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(1, 2),
TEXT_SOUTH = list(1, 2),
TEXT_EAST = list(1, 2),
TEXT_WEST = list(1, 2),
)
/datum/component/riding/vehicle/lavaboat/dragonboat
vehicle_move_delay = 1
@@ -151,19 +166,31 @@
/datum/component/riding/vehicle/janicart
keytype = /obj/item/key/janitor
/datum/component/riding/vehicle/janicart/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 7), TEXT_EAST = list(-12, 7), TEXT_WEST = list( 12, 7)))
/datum/component/riding/vehicle/janicart/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list( 0, 4),
TEXT_SOUTH = list( 0, 7),
TEXT_EAST = list(-12, 7),
TEXT_WEST = list( 12, 7),
)
/datum/component/riding/vehicle/scooter
ride_check_flags = RIDER_NEEDS_LEGS | RIDER_NEEDS_ARMS | UNBUCKLE_DISABLED_RIDER
/datum/component/riding/vehicle/scooter/handle_specials(mob/living/riding_mob)
. = ..()
if(iscyborg(riding_mob))
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0), TEXT_SOUTH = list(0), TEXT_EAST = list(0), TEXT_WEST = list(2)))
else
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(2), TEXT_SOUTH = list(-2), TEXT_EAST = list(0), TEXT_WEST = list(2)))
/datum/component/riding/vehicle/scooter/get_rider_offsets_and_layers(pass_index, mob/offsetter)
if(iscyborg(offsetter))
return list(
TEXT_NORTH = list(0, 2),
TEXT_SOUTH = list(0, 2),
TEXT_EAST = list(0, 2),
TEXT_WEST = list(2, 2),
)
return list(
TEXT_NORTH = list( 2, 2),
TEXT_SOUTH = list(-2, 2),
TEXT_EAST = list( 0, 2),
TEXT_WEST = list( 2, 2),
)
/datum/component/riding/vehicle/scooter/skateboard
vehicle_move_delay = 1.5
@@ -171,12 +198,21 @@
///If TRUE, the vehicle will be slower (but safer) to ride on walk intent.
var/can_slow_down = TRUE
/datum/component/riding/vehicle/scooter/skateboard/handle_specials()
. = ..()
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(NORTH, OBJ_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/vehicle/scooter/skateboard/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(0, 5),
TEXT_SOUTH = list(0, 5),
TEXT_EAST = list(0, 5),
TEXT_WEST = list(2, 5),
)
/datum/component/riding/vehicle/scooter/skateboard/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/vehicle/scooter/skateboard/RegisterWithParent()
. = ..()
@@ -294,17 +330,13 @@
vehicle_move_delay = 1.75 // SKYRAT EDIT - ORIGINAL: 0
can_slow_down = FALSE
/datum/component/riding/vehicle/scooter/skateboard/wheelys/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0), TEXT_SOUTH = list(0), TEXT_EAST = list(0), TEXT_WEST = list(0)))
/datum/component/riding/vehicle/scooter/skateboard/wheelys/rollerskates
vehicle_move_delay = 1.5
/datum/component/riding/vehicle/scooter/skateboard/wheelys/skishoes
vehicle_move_delay = 1
/datum/component/riding/vehicle/scooter/skateboard/wheelys/skishoes/handle_specials()
/datum/component/riding/vehicle/scooter/skateboard/wheelys/skishoes/Initialize(mob/living/riding_mob, force, ride_check_flags, potion_boost)
. = ..()
allowed_turf_typecache = typecacheof(list(/turf/open/misc/asteroid/snow, /turf/open/misc/snow, /turf/open/floor/holofloor/snow, /turf/open/misc/ice, /turf/open/floor/fake_snow))
@@ -313,10 +345,13 @@
vehicle_move_delay = 1.75
ride_check_flags = RIDER_NEEDS_LEGS | RIDER_NEEDS_ARMS | UNBUCKLE_DISABLED_RIDER
/datum/component/riding/vehicle/secway/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(0, 4), TEXT_WEST = list( 0, 4)))
set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
/datum/component/riding/vehicle/secway/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(0, 4),
TEXT_SOUTH = list(0, 4),
TEXT_EAST = list(0, 4),
TEXT_WEST = list(0, 4),
)
/datum/component/riding/vehicle/secway/driver_move(mob/living/user, direction)
var/obj/vehicle/ridden/secway/the_secway = parent
@@ -334,48 +369,87 @@
override_allow_spacemove = TRUE
ride_check_flags = RIDER_NEEDS_LEGS | RIDER_NEEDS_ARMS | UNBUCKLE_DISABLED_RIDER
/datum/component/riding/vehicle/speedbike/handle_specials()
. = ..()
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, -8), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(-10, 5), TEXT_WEST = list( 10, 5)))
set_vehicle_dir_offsets(NORTH, -16, -16)
set_vehicle_dir_offsets(SOUTH, -16, -16)
set_vehicle_dir_offsets(EAST, -18, 0)
set_vehicle_dir_offsets(WEST, -18, 0)
/datum/component/riding/vehicle/speedbike/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list( 0, -8),
TEXT_SOUTH = list( 0, 4),
TEXT_EAST = list(-10, 5),
TEXT_WEST = list( 10, 5),
)
/datum/component/riding/vehicle/speedbike/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(-16, -16, OBJ_LAYER),
TEXT_SOUTH = list(-16, -16, ABOVE_MOB_LAYER),
TEXT_EAST = list(-18, 0, ABOVE_MOB_LAYER),
TEXT_WEST = list(-18, 0, ABOVE_MOB_LAYER),
)
/datum/component/riding/vehicle/speedwagon
vehicle_move_delay = 0
/datum/component/riding/vehicle/speedwagon/handle_specials()
. = ..()
set_riding_offsets(1, list(TEXT_NORTH = list(-10, -4), TEXT_SOUTH = list(16, 3), TEXT_EAST = list(-4, 30), TEXT_WEST = list(4, -3)))
set_riding_offsets(2, list(TEXT_NORTH = list(19, -5, 4), TEXT_SOUTH = list(-13, 3, 4), TEXT_EAST = list(-4, -3, 4.1), TEXT_WEST = list(4, 28, 3.9)))
set_riding_offsets(3, list(TEXT_NORTH = list(-10, -18, 4.2), TEXT_SOUTH = list(16, 25, 3.9), TEXT_EAST = list(-22, 30), TEXT_WEST = list(22, -3, 4.1)))
set_riding_offsets(4, list(TEXT_NORTH = list(19, -18, 4.2), TEXT_SOUTH = list(-13, 25, 3.9), TEXT_EAST = list(-22, 3, 3.9), TEXT_WEST = list(22, 28)))
set_vehicle_dir_offsets(NORTH, -48, -48)
set_vehicle_dir_offsets(SOUTH, -48, -48)
set_vehicle_dir_offsets(EAST, -48, -48)
set_vehicle_dir_offsets(WEST, -48, -48)
for(var/i in GLOB.cardinals)
set_vehicle_dir_layer(i, BELOW_MOB_LAYER)
/datum/component/riding/vehicle/speedwagon/get_rider_offsets_and_layers(pass_index, mob/offsetter)
switch(pass_index)
if(1)
return list(
TEXT_NORTH = list(-10, -4, LYING_MOB_LAYER),
TEXT_SOUTH = list( 16, -4, LYING_MOB_LAYER),
TEXT_EAST = list( -4, 30, LYING_MOB_LAYER),
TEXT_WEST = list( 4, -3, LYING_MOB_LAYER),
)
if(2)
return list(
TEXT_NORTH = list( 19, -5, MOB_LAYER),
TEXT_SOUTH = list(-13, 3, MOB_LAYER),
TEXT_EAST = list( -4, -3, ABOVE_MOB_LAYER),
TEXT_WEST = list( 4, 28, VEHICLE_LAYER),
)
if(3)
return list(
TEXT_NORTH = list(-10, -18, ABOVE_MOB_LAYER + 0.1),
TEXT_SOUTH = list( 16, 25, VEHICLE_LAYER),
TEXT_EAST = list(-22, 30, LYING_MOB_LAYER),
TEXT_WEST = list( 22, -3, ABOVE_MOB_LAYER),
)
if(4)
return list(
TEXT_NORTH = list( 19, -18, ABOVE_MOB_LAYER + 0.1),
TEXT_SOUTH = list(-13, 25, VEHICLE_LAYER),
TEXT_EAST = list(-22, 3, VEHICLE_LAYER),
TEXT_WEST = list( 22, 28, LYING_MOB_LAYER),
)
/datum/component/riding/vehicle/speedwagon/get_parent_offsets_and_layers()
. = ..()
return list(
TEXT_NORTH = list(-48, -48, BELOW_MOB_LAYER),
TEXT_SOUTH = list(-48, -48, BELOW_MOB_LAYER),
TEXT_EAST = list(-48, -48, BELOW_MOB_LAYER),
TEXT_WEST = list(-48, -48, BELOW_MOB_LAYER),
)
/datum/component/riding/vehicle/wheelchair
vehicle_move_delay = 0
ride_check_flags = RIDER_NEEDS_ARMS
/datum/component/riding/vehicle/wheelchair/handle_specials()
. = ..()
set_vehicle_dir_layer(SOUTH, OBJ_LAYER)
set_vehicle_dir_layer(NORTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
/datum/component/riding/vehicle/wheelchair/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, OBJ_LAYER),
TEXT_SOUTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_EAST = list(0, 0, OBJ_LAYER),
TEXT_WEST = list(0, 0, OBJ_LAYER),
)
/datum/component/riding/vehicle/wheelchair/hand
/// Magic number used in calculating the speed of the wheelchair
var/delay_multiplier = 6.7
// special messaging for those without arms
/datum/component/riding/vehicle/wheelchair/hand/driver_move(obj/vehicle/vehicle_parent, mob/living/user, direction)
var/delay_multiplier = 6.7 // magic number from wheelchair code
vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * delay_multiplier) / clamp(user.usable_hands, 1, 2)
return ..()
/datum/component/riding/vehicle/wheelchair/motorized
/datum/component/riding/vehicle/wheelchair/motorized/driver_move(obj/vehicle/vehicle_parent, mob/living/user, direction)
var/obj/vehicle/ridden/wheelchair/motorized/our_chair = parent
var/speed = our_chair.speed