diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 147d790919..b061f912a5 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -295,14 +295,19 @@
// Simple helper to face what you clicked on, in case it should be needed in more than one place
/mob/proc/face_atom(var/atom/A)
- if( stat || buckled || !A || !x || !y || !A.x || !A.y ) return
+ if( stat || (buckled && !buckled.movable) || !A || !x || !y || !A.x || !A.y ) return
var/dx = A.x - x
var/dy = A.y - y
if(!dx && !dy) return
+ var/direction
if(abs(dx) < abs(dy))
- if(dy > 0) usr.dir = NORTH
- else usr.dir = SOUTH
+ if(dy > 0) direction = NORTH
+ else direction = SOUTH
else
- if(dx > 0) usr.dir = EAST
- else usr.dir = WEST
\ No newline at end of file
+ if(dx > 0) direction = EAST
+ else direction = WEST
+ usr.dir = direction
+ if(buckled && buckled.movable)
+ buckled.dir = direction
+ buckled.handle_rotation()
\ No newline at end of file
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index cb67c3f5f1..0d817b7c8d 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -108,12 +108,19 @@
playSpecials(curturf,effectin,soundin)
+ var/obj/structure/stool/bed/chair/C = null
+ if(isliving(teleatom))
+ var/mob/living/L = teleatom
+ if(L.buckled)
+ C = L.buckled
if(force_teleport)
teleatom.forceMove(destturf)
playSpecials(destturf,effectout,soundout)
else
if(teleatom.Move(destturf))
playSpecials(destturf,effectout,soundout)
+ if(C)
+ C.forceMove(destturf)
destarea.Entered(teleatom)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index d8272453c9..f9bc8d879b 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -198,6 +198,8 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
+ accurate = 1
+ spawn(3000) accurate = 0 //Accurate teleporting for 5 minutes
for(var/mob/B in hearers(src, null))
B.show_message("\blue Test fire completed.")
return
@@ -339,6 +341,7 @@
if (com)
com.icon_state = "tele0"
+ com.accurate = 0
for(var/mob/O in hearers(src, null))
O.show_message("\blue Teleporter disengaged!", 2)
src.add_fingerprint(usr)
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index cff202f2ea..17bcaba428 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -51,7 +51,12 @@ var/global/list/image/splatter_cache=list()
if(amount < 1)
return
- if(perp.shoes)//Adding blood to shoes
+ var/datum/organ/external/l_foot = perp.get_organ("l_foot")
+ var/datum/organ/external/r_foot = perp.get_organ("r_foot")
+ var/hasfeet = 1
+ if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
+ hasfeet = 0
+ if(perp.shoes && !perp.buckled)//Adding blood to shoes
perp.shoes.blood_color = basecolor
perp.shoes:track_blood = max(amount,perp.shoes:track_blood)
if(!perp.shoes.blood_overlay)
@@ -62,12 +67,15 @@ var/global/list/image/splatter_cache=list()
perp.shoes.overlays += perp.shoes.blood_overlay
perp.shoes.blood_DNA |= blood_DNA.Copy()
- else//Or feet
+ else if (hasfeet)//Or feet
perp.feet_blood_color = basecolor
perp.track_blood = max(amount,perp.track_blood)
if(!perp.feet_blood_DNA)
perp.feet_blood_DNA = list()
perp.feet_blood_DNA |= blood_DNA.Copy()
+ else if (perp.buckled && istype(perp.buckled, /obj/structure/stool/bed/chair/wheelchair))
+ var/obj/structure/stool/bed/chair/wheelchair/W = perp.buckled
+ W.bloodiness = 4
perp.update_inv_shoes(1)
amount--
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index dd5ee1f8b3..59e516a714 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -555,7 +555,7 @@ steam.start() -- spawns the effect
if (istype(AM, /mob/living/carbon))
var/mob/M = AM
- if (istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP))
+ if (istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP) || M.buckled)
return
M.stop_pulling()
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index 49f0b2e45f..e526cf1c35 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -11,7 +11,7 @@
/obj/item/weapon/bananapeel/HasEntered(AM as mob|obj)
if (istype(AM, /mob/living/carbon))
var/mob/M = AM
- if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP))
+ if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP) || M.buckled)
return
M.stop_pulling()
@@ -26,7 +26,7 @@
/obj/item/weapon/soap/HasEntered(AM as mob|obj) //EXACTLY the same as bananapeel for now, so it makes sense to put it in the same dm -- Urist
if (istype(AM, /mob/living/carbon))
var/mob/M = AM
- if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP))
+ if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP) || M.buckled)
return
M.stop_pulling()
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 5b9a86c8ed..01f06f14a4 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -12,6 +12,7 @@
desc = "This is used to lie in, sleep in or strap on."
icon_state = "bed"
var/mob/living/buckled_mob
+ var/movable = 0 // For mobility checks
/obj/structure/stool/bed/psych
name = "psychiatrists couch"
@@ -35,6 +36,9 @@
manual_unbuckle(user)
return
+/obj/structure/stool/bed/proc/handle_rotation()
+ return
+
/obj/structure/stool/bed/MouseDrop(atom/over_object)
return
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 63fe705be7..9982017c6b 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -39,7 +39,7 @@
rotate()
return
-/obj/structure/stool/bed/chair/proc/handle_rotation() //making this into a seperate proc so office chairs can call it on Move()
+/obj/structure/stool/bed/chair/handle_rotation() //making this into a seperate proc so office chairs can call it on Move()
if(src.dir == NORTH)
src.layer = FLY_LAYER
else
@@ -107,6 +107,7 @@
/obj/structure/stool/bed/chair/office
anchored = 0
+ movable = 1
/obj/structure/stool/bed/chair/comfy/black
icon_state = "comfychair_black"
@@ -148,7 +149,7 @@
victim.apply_effect(6, WEAKEN, 0)
victim.apply_effect(6, STUTTER, 0)
victim.take_organ_damage(10)
- occupant.visible_message("[occupant] clashed into \the [A]!")
+ occupant.visible_message("[occupant] crashed into \the [A]!")
/obj/structure/stool/bed/chair/office/light
icon_state = "officechair_white"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
index c3ad95b832..adec836a78 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
@@ -3,9 +3,11 @@
desc = "You sit in this. Either by will or force."
icon_state = "wheelchair"
anchored = 0
+ movable = 1
var/driving = 0
var/mob/living/pulling = null
+ var/bloodiness
/obj/structure/stool/bed/chair/wheelchair/handle_rotation()
@@ -22,7 +24,7 @@
user.pulledby = null
user << "\red You lost your grip!"
return
- if(user.pulling)
+ if(user.pulling && (user == pulling))
pulling = null
user.pulledby = null
return
@@ -31,7 +33,8 @@
if(pulling && (get_dist(src, pulling) > 1))
pulling = null
user.pulledby = null
- return
+ if(user==pulling)
+ return
if(pulling && (get_dir(src.loc, pulling.loc) == direction))
user << "\red You cannot go there."
return
@@ -67,26 +70,36 @@
pulling = null
user.pulledby = null
pulling.dir = get_dir(pulling, src) // When everything is right, face the wheelchair
+ if(bloodiness)
+ create_track()
driving = 0
/obj/structure/stool/bed/chair/wheelchair/Move()
..()
- if(!driving && buckled_mob)
+ if(buckled_mob)
var/mob/living/occupant = buckled_mob
- occupant.buckled = null
- occupant.Move(src.loc)
- occupant.buckled = src
- if (occupant && (src.loc != occupant.loc))
- if (propelled)
- for (var/mob/O in src.loc)
- if (O != occupant)
- Bump(O)
- else
- unbuckle()
+ if(!driving)
+ occupant.buckled = null
+ occupant.Move(src.loc)
+ occupant.buckled = src
+ if (occupant && (src.loc != occupant.loc))
+ if (propelled)
+ for (var/mob/O in src.loc)
+ if (O != occupant)
+ Bump(O)
+ else
+ unbuckle()
+ if (pulling && (get_dist(src, pulling) > 1))
+ pulling.pulledby = null
+ pulling << "\red You lost your grip!"
+ pulling = null
+ else
+ if (occupant && (src.loc != occupant.loc))
+ src.loc = occupant.loc // Failsafe to make sure the wheelchair stays beneath the occupant after driving
handle_rotation()
/obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/user as mob)
- if (pulling && (pulling == usr))
+ if (pulling)
MouseDrop(usr)
else
manual_unbuckle(user)
@@ -137,11 +150,25 @@
if(pulling)
occupant.visible_message("[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!")
- pulling.attack_log += "\[[time_stamp()]\] Clashed [occupant.name]'s ([occupant.ckey]) [name] into \a [A]"
+ pulling.attack_log += "\[[time_stamp()]\] Crashed [occupant.name]'s ([occupant.ckey]) [name] into \a [A]"
occupant.attack_log += "\[[time_stamp()]\] Thrusted into \a [A] by [pulling.name] ([pulling.ckey]) with \the [name]"
msg_admin_attack("[pulling.name] ([pulling.ckey]) has thrusted [occupant.name]'s ([occupant.ckey]) [name] into \a [A] (JMP)")
else
- occupant.visible_message("[occupant] clashed into \the [A]!")
+ occupant.visible_message("[occupant] crashed into \the [A]!")
+
+/obj/structure/stool/bed/chair/wheelchair/proc/create_track()
+ var/obj/effect/decal/cleanable/blood/tracks/B = new(loc)
+ var/newdir = get_dir(get_step(loc, dir), loc)
+ if(newdir == dir)
+ B.dir = newdir
+ else
+ newdir = newdir | dir
+ if(newdir == 3)
+ newdir = 1
+ else if(newdir == 12)
+ newdir = 4
+ B.dir = newdir
+ bloodiness--
/obj/structure/stool/bed/chair/wheelchair/buckle_mob(mob/M as mob, mob/user as mob)
if(M == pulling)
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index b62c32b81a..19223c48f1 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -73,6 +73,12 @@
bloodDNA = null
+ var/noslip = 0
+ for (var/obj/structure/stool/bed/chair/C in loc)
+ if (C.buckled_mob == M)
+ noslip = 1
+ if (noslip)
+ return // no slipping while sitting in a chair, plz
switch (src.wet)
if(1)
if(istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes
@@ -99,7 +105,7 @@
return
if(2) //lube //can cause infinite loops - needs work
- if(!istype(M, /mob/living/carbon/slime))
+ if(!istype(M, /mob/living/carbon/slime) && !M.buckled)
M.stop_pulling()
step(M, M.dir)
spawn(1) step(M, M.dir)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 000600781b..f4edb30e24 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -112,7 +112,7 @@
return
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
- if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && canmove) // mutual brohugs all around!
+ if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && !tmob.buckled && canmove) // mutual brohugs all around!
var/turf/oldloc = loc
loc = tmob.loc
tmob.loc = oldloc
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 2b1299b636..7f468f5ebb 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -35,7 +35,7 @@
else if(E.status & ORGAN_BROKEN)
tally += 1.5
- if(pulledby && istype(pulledby, /obj/structure/stool/bed/chair/wheelchair))
+ if(buckled && istype(buckled, /obj/structure/stool/bed/chair/wheelchair))
for(var/organ_name in list("l_hand","r_hand","l_arm","r_arm"))
var/datum/organ/external/E = get_organ(organ_name)
if(!E || (E.status & ORGAN_DESTROYED))
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 18d415fd39..2b0d1b2c01 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -755,7 +755,7 @@ note dizziness decrements automatically in the mob's Life() proc.
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
/mob/proc/update_canmove()
- if(buckled)
+ if(buckled && (!buckled.movable))
anchored = 1
canmove = 0
if( istype(buckled,/obj/structure/stool/bed/chair) )
@@ -778,9 +778,9 @@ note dizziness decrements automatically in the mob's Life() proc.
anchored = 1
canmove = 0
lying = 0
- else
+ else if (!buckled)
lying = !can_stand
- canmove = has_limbs
+ //canmove = has_limbs
if(lying)
density = 0
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index fbc48841f4..ce5e8824de 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -199,8 +199,7 @@
if(!mob.canmove)
- if (mob.buckled && (istype(mob.buckled, /obj/structure/stool/bed/chair/wheelchair) || istype(mob.buckled, /obj/vehicle))) // Exception for wheelchairs
- else return
+ return
//if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV))
// if(!mob.Process_Spacemove(0)) return 0
@@ -246,7 +245,7 @@
move_delay -= 1.3
var/tickcomp = ((1/(world.tick_lag))*1.3)
move_delay = move_delay + tickcomp
-
+
if(istype(mob.buckled, /obj/vehicle))
return mob.buckled.relaymove(mob,direct)
@@ -260,7 +259,7 @@
var/mob/living/carbon/human/driver = mob.buckled
var/datum/organ/external/l_hand = driver.get_organ("l_hand")
var/datum/organ/external/r_hand = driver.get_organ("r_hand")
- if((!l_hand || l_hand.status & ORGAN_DESTROYED) && (!r_hand || r_hand.status & ORGAN_DESTROYED))
+ if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED)))
return // No hands to drive your chair? Tough luck!
move_delay += 2
return mob.buckled.relaymove(mob,direct)
diff --git a/code/modules/reagents/reagent_containers/food/snacks/grown.dm b/code/modules/reagents/reagent_containers/food/snacks/grown.dm
index 86b212f2b5..9fb7fc2d97 100644
--- a/code/modules/reagents/reagent_containers/food/snacks/grown.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks/grown.dm
@@ -731,7 +731,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato/HasEntered(AM as mob|obj)
if (istype(AM, /mob/living/carbon))
var/mob/M = AM
- if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP))
+ if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP) || M.buckled)
return
M.stop_pulling()
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 27ce16d113..ef2ea18a5e 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -19,6 +19,7 @@
var/emagged = 0
var/powered = 0 //set if vehicle is powered and should use fuel when moving
var/move_delay = 1 //set this to limit the speed of the vehicle
+ var/movable = 1
var/obj/item/weapon/cell/cell
var/power_use = 5 //set this to adjust the amount of power the vehicle uses per move
@@ -47,7 +48,7 @@
if(on && powered)
cell.use(power_use)
anchored = init_anc
-
+
if(load)
load.loc = loc
load.dir = dir
@@ -288,7 +289,7 @@
/obj/vehicle/proc/unload(var/mob/user, var/direction)
if(!load)
return
-
+
var/turf/dest = null
//find a turf to unload to