From 44d13818f061760a01cbcacaec16d1e0fffbbf93 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 16:52:58 +0100 Subject: [PATCH 01/12] Inital paralysis. (https://github.com/tgstation/tgstation/pull/41140) --- code/__DEFINES/mobs.dm | 4 + code/__DEFINES/traits.dm | 6 + code/datums/brain_damage/severe.dm | 59 ++++++++-- code/datums/traits/negative.dm | 34 ++++++ code/modules/mob/living/carbon/carbon.dm | 5 + code/modules/surgery/bodyparts/bodyparts.dm | 124 +++++++++++++++----- 6 files changed, 194 insertions(+), 38 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 4b42595b48..1d1dda6d99 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -54,6 +54,10 @@ #define BODYPART_ORGANIC 1 #define BODYPART_ROBOTIC 2 +#define BODYPART_NOT_DISABLED 0 +#define BODYPART_DISABLED_DAMAGE 1 +#define BODYPART_DISABLED_PARALYSIS 2 + #define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi' #define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi' diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index b2caf614b3..c0e3e141c7 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -50,7 +50,13 @@ #define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_MINDSHIELD "mindshield" +#define TRAIT_PARALYSIS_L_ARM "para-l-arm" //These are used for brain-based paralysis, where replacing the limb won't fix it +#define TRAIT_PARALYSIS_R_ARM "para-r-arm" +#define TRAIT_PARALYSIS_L_LEG "para-l-leg" +#define TRAIT_PARALYSIS_R_LEG "para-r-leg" + //non-mob traits +#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" #define TRAIT_AGEUSIA "ageusia" diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index a8adbfbce8..8e13522a02 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -60,18 +60,63 @@ /datum/brain_trauma/severe/paralysis name = "Paralysis" - desc = "Patient's brain can no longer control its motor functions." + desc = "Patient's brain can no longer control part of its motor functions." scan_desc = "cerebral paralysis" - gain_text = "You can't feel your body anymore!" - lose_text = "You can feel your limbs again!" + gain_text = "" + lose_text = "" + var/paralysis_type + var/list/paralysis_traits = list() + //for descriptions -/datum/brain_trauma/severe/paralysis/on_life() - owner.Knockdown(200, ignore_canknockdown = TRUE) +/datum/brain_trauma/severe/paralysis/New(specific_type) + paralysis_type = specific_type + if(!paralysis_type) + paralysis_type = pick("full","left","right","arms","legs","r_arm","l_arm","r_leg","l_leg") + var/subject + switch(paralysis_type) + if("full") + subject = "your body" + paralysis_traits = list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG) + if("left") + subject = "the left side of your body" + paralysis_traits = list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_L_LEG) + if("right") + subject = "the right side of your body" + paralysis_traits = list(TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_R_LEG) + if("arms") + subject = "your arms" + paralysis_traits = list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM) + if("legs") + subject = "your legs" + paralysis_traits = list(TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG) + if("r_arm") + subject = "your right arm" + paralysis_traits = list(TRAIT_PARALYSIS_R_ARM) + if("l_arm") + subject = "your left arm" + paralysis_traits = list(TRAIT_PARALYSIS_L_ARM) + if("r_leg") + subject = "your right leg" + paralysis_traits = list(TRAIT_PARALYSIS_R_LEG) + if("l_leg") + subject = "your left leg" + paralysis_traits = list(TRAIT_PARALYSIS_L_LEG) + + gain_text = "You can't feel [subject] anymore!" + lose_text = "You can feel [subject] again!" + +/datum/brain_trauma/severe/paralysis/on_gain() ..() + for(var/X in paralysis_traits) + owner.add_trait(X, "trauma_paralysis") + owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/on_lose() - owner.SetKnockdown(0) ..() + for(var/X in paralysis_traits) + owner.remove_trait(X, "trauma_paralysis") + owner.update_disabled_bodyparts() + /datum/brain_trauma/severe/narcolepsy name = "Narcolepsy" @@ -203,4 +248,4 @@ /datum/brain_trauma/severe/pacifism/on_lose() owner.remove_trait(TRAIT_PACIFISM, TRAUMA_TRAIT) - ..() \ No newline at end of file + ..() diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 614cc65cbb..ed5ac0b49b 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -187,6 +187,40 @@ to_chat(quirk_holder, "Your antagonistic nature has caused you to renounce your pacifism.") qdel(src) +/datum/quirk/paraplegic + name = "Paraplegic" + desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!" + value = -3 + human_only = TRUE + gain_text = null // Handled by trauma. + lose_text = null + medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities." + + /datum/quirk/paraplegic/add() + var/datum/brain_trauma/severe/paralysis/paraplegic/T = new() + var/mob/living/carbon/human/H = quirk_holder + H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE) + + /datum/quirk/paraplegic/on_spawn() + if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. + quirk_holder.buckled.unbuckle_mob(quirk_holder) + + var/turf/T = get_turf(quirk_holder) + var/obj/structure/chair/spawn_chair = locate() in T + + var/obj/vehicle/ridden/wheelchair/wheels = new(T) + if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking + wheels.setDir(spawn_chair.dir) + + wheels.buckle_mob(quirk_holder) + + // During the spawning process, they may have dropped what they were holding, due to the paralysis + // So put the things back in their hands. + + for(var/obj/item/I in T) + if(I.fingerprintslast == quirk_holder.ckey) + quirk_holder.put_in_hands(I) + /datum/quirk/poor_aim name = "Poor Aim" desc = "You're terrible with guns and can't line up a straight shot to save your life. Dual-wielding is right out." diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index ea13255dfe..23267b88c6 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -895,6 +895,11 @@ var/obj/item/organ/I = X I.Insert(src) +/mob/living/carbon/proc/update_disabled_bodyparts() + for(var/B in bodyparts) + var/obj/item/bodypart/BP = B + BP.update_disabled() + /mob/living/carbon/vv_get_dropdown() . = ..() . += "---" diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 71b659b73f..db032aaa4a 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -21,7 +21,7 @@ var/held_index = 0 //are we a hand? if so, which one! var/is_pseudopart = FALSE //For limbs that don't really exist, eg chainsaws - var/disabled = FALSE //If TRUE, limb is as good as missing + var/disabled = BODYPART_NOT_DISABLED //If disabled, limb is as good as missing var/body_damage_coeff = 1 //Multiplier of the limb's damage that gets applied to the mob var/stam_damage_coeff = 0.5 var/brutestate = 0 @@ -189,7 +189,7 @@ if(stamina > DAMAGE_PRECISION) owner.update_stamina() consider_processing() - check_disabled() + update_disabled() return update_bodypart_damage_state() //Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. @@ -209,7 +209,7 @@ if(owner && updating_health) owner.updatehealth() consider_processing() - check_disabled() + update_disabled() return update_bodypart_damage_state() //Returns total damage. @@ -220,15 +220,23 @@ return total //Checks disabled status thresholds -/obj/item/bodypart/proc/check_disabled() - if(!can_dismember() || owner.has_trait(TRAIT_NODISMEMBER)) - return - if(!disabled && (get_damage(TRUE) >= max_damage)) - set_disabled(TRUE) - else if(disabled && (get_damage(TRUE) <= (max_damage * 0.5))) - set_disabled(FALSE) +//Checks disabled status thresholds +/obj/item/bodypart/proc/update_disabled() + set_disabled(is_disabled()) -/obj/item/bodypart/proc/set_disabled(new_disabled = TRUE) +/obj/item/bodypart/proc/is_disabled() + if(has_trait(TRAIT_PARALYSIS)) + return BODYPART_DISABLED_PARALYSIS + if(can_dismember() && !owner.has_trait(TRAIT_NODISMEMBER)) + . = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled + if((get_damage(TRUE) >= max_damage)) + return BODYPART_DISABLED_DAMAGE + if(disabled && (get_damage(TRUE) <= (max_damage * 0.5))) + return BODYPART_NOT_DISABLED + else + return BODYPART_NOT_DISABLED + +/obj/item/bodypart/proc/set_disabled(new_disabled) if(disabled == new_disabled) return disabled = new_disabled @@ -598,13 +606,27 @@ px_y = 0 stam_heal_tick = 2 -/obj/item/bodypart/l_arm/set_disabled(new_disabled = TRUE) - ..() - if(disabled) - to_chat(owner, "Your [name] is too damaged to function!") - owner.emote("scream") +/obj/item/bodypart/l_arm/is_disabled() + if(owner.has_trait(TRAIT_PARALYSIS_L_ARM)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/l_arm/set_disabled(new_disabled) + . = ..() + if(disabled == new_disabled) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat > UNCONSCIOUS) + owner.emote("scream") + if(. && (owner.stat > DEAD)) + to_chat(owner, "Your [name] is too damaged to function!") if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(. && (owner.stat > DEAD)) + to_chat(owner, "You can't feel your [name]!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] if(L) @@ -649,18 +671,33 @@ stam_heal_tick = 2 max_stamina_damage = 50 -/obj/item/bodypart/r_arm/set_disabled(new_disabled = TRUE) - ..() - if(disabled) - to_chat(owner, "Your [name] is too damaged to function!") - owner.emote("scream") +/obj/item/bodypart/r_arm/is_disabled() + if(owner.has_trait(TRAIT_PARALYSIS_R_ARM)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/r_arm/set_disabled(new_disabled) + . = ..() + if(disabled == new_disabled) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat > UNCONSCIOUS) + owner.emote("scream") + if(. && (owner.stat > DEAD)) + to_chat(owner, "Your [name] is too damaged to function!") if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(. && (owner.stat > DEAD)) + to_chat(owner, "You can't feel your [name]!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] if(R) R.update_icon() + /obj/item/bodypart/r_arm/monkey icon = 'icons/mob/animal_parts.dmi' icon_state = "default_monkey_r_arm" @@ -697,11 +734,24 @@ stam_heal_tick = 2 max_stamina_damage = 50 -/obj/item/bodypart/l_leg/set_disabled(new_disabled = TRUE) - ..() - if(disabled) - to_chat(owner, "Your [name] is too damaged to function!") - owner.emote("scream") +/obj/item/bodypart/l_leg/is_disabled() + if(owner.has_trait(TRAIT_PARALYSIS_L_LEG)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/l_leg/set_disabled(new_disabled) + . = ..() + if(disabled == new_disabled) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat > UNCONSCIOUS) + owner.emote("scream") + if(. && (owner.stat > DEAD)) + to_chat(owner, "Your [name] is too damaged to function!") + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(. && (owner.stat > DEAD)) + to_chat(owner, "You can't feel your [name]!") + /obj/item/bodypart/l_leg/digitigrade name = "left digitigrade leg" @@ -744,11 +794,23 @@ max_stamina_damage = 50 stam_heal_tick = 2 -/obj/item/bodypart/r_leg/set_disabled(new_disabled = TRUE) - ..() - if(disabled) - to_chat(owner, "Your [name] is too damaged to function!") - owner.emote("scream") +/obj/item/bodypart/r_leg/is_disabled() + if(owner.has_trait(TRAIT_PARALYSIS_R_LEG)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/r_leg/set_disabled(new_disabled) + . = ..() + if(disabled == new_disabled) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat > UNCONSCIOUS) + owner.emote("scream") + if(. && (owner.stat > DEAD)) + to_chat(owner, "Your [name] is too damaged to function!") + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(. && (owner.stat > DEAD)) + to_chat(owner, "You can't feel your [name]!") /obj/item/bodypart/r_leg/digitigrade name = "right digitigrade leg" From 7fe18b5a373accc9e8369089976533f728367ba9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 16:55:31 +0100 Subject: [PATCH 02/12] Parapalegic trait. --- code/datums/brain_damage/severe.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 8e13522a02..d13e6cce7a 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -69,7 +69,8 @@ //for descriptions /datum/brain_trauma/severe/paralysis/New(specific_type) - paralysis_type = specific_type + if(specific_type) + paralysis_type = specific_type if(!paralysis_type) paralysis_type = pick("full","left","right","arms","legs","r_arm","l_arm","r_leg","l_leg") var/subject @@ -117,6 +118,10 @@ owner.remove_trait(X, "trauma_paralysis") owner.update_disabled_bodyparts() +/datum/brain_trauma/severe/paralysis/paraplegic + random_gain = FALSE + paralysis_type = "legs" + resilience = TRAUMA_RESILIENCE_ABSOLUTE /datum/brain_trauma/severe/narcolepsy name = "Narcolepsy" From 7990a20ea6a2e0fe14c018ec1eaf1895dc52177b Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 17:20:04 +0100 Subject: [PATCH 03/12] We don't have wheelchairs? Heresy. Plus fixes to work on citcode. Csafe --- code/datums/brain_damage/severe.dm | 2 +- code/datums/traits/negative.dm | 14 +-- code/modules/surgery/bodyparts/bodyparts.dm | 2 +- code/modules/vehicles/ridden.dm | 2 +- code/modules/vehicles/wheelchair.dm | 110 ++++++++++++++++++++ tgstation.dme | 25 ++--- 6 files changed, 133 insertions(+), 22 deletions(-) create mode 100644 code/modules/vehicles/wheelchair.dm diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index d13e6cce7a..6ab1d1859e 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -119,7 +119,7 @@ owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/paraplegic - random_gain = FALSE + can_gain = FALSE paralysis_type = "legs" resilience = TRAUMA_RESILIENCE_ABSOLUTE diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index ed5ac0b49b..b7307b10e4 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -196,28 +196,28 @@ lose_text = null medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities." - /datum/quirk/paraplegic/add() +/datum/quirk/paraplegic/add() var/datum/brain_trauma/severe/paralysis/paraplegic/T = new() var/mob/living/carbon/human/H = quirk_holder H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE) - /datum/quirk/paraplegic/on_spawn() +/datum/quirk/paraplegic/on_spawn() if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. quirk_holder.buckled.unbuckle_mob(quirk_holder) - var/turf/T = get_turf(quirk_holder) + var/turf/T = get_turf(quirk_holder) var/obj/structure/chair/spawn_chair = locate() in T - var/obj/vehicle/ridden/wheelchair/wheels = new(T) + var/obj/vehicle/ridden/wheelchair/wheels = new(T) if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking wheels.setDir(spawn_chair.dir) - wheels.buckle_mob(quirk_holder) + wheels.buckle_mob(quirk_holder) - // During the spawning process, they may have dropped what they were holding, due to the paralysis + // During the spawning process, they may have dropped what they were holding, due to the paralysis // So put the things back in their hands. - for(var/obj/item/I in T) + for(var/obj/item/I in T) if(I.fingerprintslast == quirk_holder.ckey) quirk_holder.put_in_hands(I) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index db032aaa4a..b8f4dbd4cc 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -225,7 +225,7 @@ set_disabled(is_disabled()) /obj/item/bodypart/proc/is_disabled() - if(has_trait(TRAIT_PARALYSIS)) + if(owner.has_trait(TRAIT_PARALYSIS)) return BODYPART_DISABLED_PARALYSIS if(can_dismember() && !owner.has_trait(TRAIT_NODISMEMBER)) . = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 25a337bc22..ba37f39bb3 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -5,7 +5,7 @@ buckle_lying = FALSE default_driver_move = FALSE var/legs_required = 2 - var/arms_requires = 0 //why not? + var/arms_required = 0 //why not? /obj/vehicle/ridden/Initialize() . = ..() diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm new file mode 100644 index 0000000000..a5ba06e6fb --- /dev/null +++ b/code/modules/vehicles/wheelchair.dm @@ -0,0 +1,110 @@ +/obj/vehicle/ridden/wheelchair //ported from Hippiestation (by Jujumatic) Then ported by Fermis from tg! + name = "wheelchair" + desc = "A chair with big wheels. It looks like you can move in this on your own." + icon = 'icons/obj/vehicles.dmi' + icon_state = "wheelchair" + layer = OBJ_LAYER + max_integrity = 100 + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 30) //Wheelchairs aren't super tough yo + legs_required = 0 //You'll probably be using this if you don't have legs + canmove = TRUE + density = FALSE //Thought I couldn't fix this one easily, phew + arms_required = 1 + +/obj/vehicle/ridden/wheelchair/Initialize() + . = ..() + var/datum/component/riding/D = LoadComponent(/datum/component/riding) + D.vehicle_move_delay = 0 + D.set_vehicle_dir_layer(SOUTH, OBJ_LAYER) + D.set_vehicle_dir_layer(NORTH, ABOVE_MOB_LAYER) + D.set_vehicle_dir_layer(EAST, OBJ_LAYER) + D.set_vehicle_dir_layer(WEST, OBJ_LAYER) + +/obj/vehicle/ridden/wheelchair/ComponentInitialize() //Since it's technically a chair I want it to have chair properties + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE, CALLBACK(src, .proc/can_user_rotate),CALLBACK(src, .proc/can_be_rotated),null) + +/obj/vehicle/ridden/wheelchair/obj_destruction(damage_flag) + new /obj/item/stack/rods(drop_location(), 1) + new /obj/item/stack/sheet/metal(drop_location(), 1) + ..() + +/obj/vehicle/ridden/wheelchair/Destroy() + if(has_buckled_mobs()) + var/mob/living/carbon/H = buckled_mobs[1] + unbuckle_mob(H) + return ..() + +/obj/vehicle/ridden/wheelchair/driver_move(mob/living/user, direction) + if(istype(user)) + if(canmove && (user.get_num_arms() < arms_required)) + to_chat(user, "You don't have enough arms to operate the wheels!") + canmove = FALSE + addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) + return FALSE + var/datum/component/riding/D = GetComponent(/datum/component/riding) + //1.5 (movespeed as of this change) multiplied by 6.7 gets ABOUT 10 (rounded), the old constant for the wheelchair that gets divided by how many arms they have + //if that made no sense this simply makes the wheelchair speed change along with movement speed delay + D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / min(user.get_num_arms(), 2) + return ..() + +/obj/vehicle/ridden/wheelchair/Moved() + . = ..() + cut_overlays() + playsound(src, 'sound/effects/roll.ogg', 75, 1) + if(has_buckled_mobs()) + handle_rotation_overlayed() + + +/obj/vehicle/ridden/wheelchair/post_buckle_mob(mob/living/user) + . = ..() + handle_rotation_overlayed() + +/obj/vehicle/ridden/wheelchair/post_unbuckle_mob() + . = ..() + cut_overlays() + +/obj/vehicle/ridden/wheelchair/setDir(newdir) + ..() + handle_rotation(newdir) + +/obj/vehicle/ridden/wheelchair/wrench_act(mob/living/user, obj/item/I) //Attackby should stop it attacking the wheelchair after moving away during decon + to_chat(user, "You begin to detach the wheels...") + if(I.use_tool(src, user, 40, volume=50)) + to_chat(user, "You detach the wheels and deconstruct the chair.") + new /obj/item/stack/rods(drop_location(), 6) + new /obj/item/stack/sheet/metal(drop_location(), 4) + qdel(src) + return TRUE + +/obj/vehicle/ridden/wheelchair/proc/handle_rotation(direction) + if(has_buckled_mobs()) + handle_rotation_overlayed() + for(var/m in buckled_mobs) + var/mob/living/buckled_mob = m + buckled_mob.setDir(direction) + +/obj/vehicle/ridden/wheelchair/proc/handle_rotation_overlayed() + cut_overlays() + var/image/V = image(icon = icon, icon_state = "wheelchair_overlay", layer = FLY_LAYER, dir = src.dir) + add_overlay(V) + + + +/obj/vehicle/ridden/wheelchair/proc/can_be_rotated(mob/living/user) + return TRUE + +/obj/vehicle/ridden/wheelchair/proc/can_user_rotate(mob/living/user) + var/mob/living/L = user + if(istype(L)) + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return FALSE + if(isobserver(user) && CONFIG_GET(flag/ghost_interaction)) + return TRUE + return FALSE + +/obj/vehicle/ridden/wheelchair/the_whip/driver_move(mob/living/user, direction) + if(istype(user)) + var/datum/component/riding/D = GetComponent(/datum/component/riding) + D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / user.get_num_arms() + return ..() diff --git a/tgstation.dme b/tgstation.dme index f2cef76dd9..66d883433a 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2505,22 +2505,10 @@ #include "code\modules\research\designs\AI_module_designs.dm" #include "code\modules\research\designs\biogenerator_designs.dm" #include "code\modules\research\designs\bluespace_designs.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm" #include "code\modules\research\designs\computer_part_designs.dm" #include "code\modules\research\designs\electronics_designs.dm" #include "code\modules\research\designs\equipment_designs.dm" #include "code\modules\research\designs\limbgrower_designs.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_service.dm" #include "code\modules\research\designs\mecha_designs.dm" #include "code\modules\research\designs\mechfabricator_designs.dm" #include "code\modules\research\designs\medical_designs.dm" @@ -2538,6 +2526,18 @@ #include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" #include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" #include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_service.dm" #include "code\modules\research\machinery\_production.dm" #include "code\modules\research\machinery\circuit_imprinter.dm" #include "code\modules\research\machinery\departmental_circuit_imprinter.dm" @@ -2766,6 +2766,7 @@ #include "code\modules\vehicles\speedbike.dm" #include "code\modules\vehicles\vehicle_actions.dm" #include "code\modules\vehicles\vehicle_key.dm" +#include "code\modules\vehicles\wheelchair.dm" #include "code\modules\vehicles\cars\car.dm" #include "code\modules\vehicles\cars\clowncar.dm" #include "code\modules\vending\_vending.dm" From bebaf8e7a8915e2ef40080adea89f6ff4a66a813 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 18:17:49 +0100 Subject: [PATCH 04/12] Wheelchairs are apparently banned, we now have HOVERCHAIRS! --- code/datums/brain_damage/severe.dm | 2 +- code/modules/crafting/recipes.dm | 8 ++++++++ code/modules/vehicles/_vehicle.dm | 13 +++++++++++++ icons/obj/vehicles.dmi | Bin 31897 -> 35401 bytes 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 6ab1d1859e..f2d96c9e4d 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -119,7 +119,7 @@ owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/paraplegic - can_gain = FALSE + //can_gain = FALSE maybe breaks. paralysis_type = "legs" resilience = TRAUMA_RESILIENCE_ABSOLUTE diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index ca10d5092f..27d9cef4ca 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -623,6 +623,14 @@ /obj/item/assembly/igniter = 1) category = CAT_MISC +/datum/crafting_recipe/wheelchair + name = "Wheelchair" + result = /obj/vehicle/ridden/wheelchair + reqs = list(/obj/item/stack/sheet/plasteel = 2, + /obj/item/stack/rods = 8) + time = 100 + category = CAT_MISC + /datum/crafting_recipe/rcl name = "Makeshift Rapid Cable Layer" diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index be59a6df65..54bc03bcf3 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -31,6 +31,19 @@ occupant_actions = list() generate_actions() +/obj/vehicle/examine(mob/user) + ..() + if(resistance_flags & ON_FIRE) + to_chat(user, "It's on fire!") + var/healthpercent = obj_integrity/max_integrity * 100 + switch(healthpercent) + if(50 to 99) + to_chat(user, "It looks slightly damaged.") + if(25 to 50) + to_chat(user, "It appears heavily damaged.") + if(0 to 25) + to_chat(user, "It's falling apart!") + /obj/vehicle/proc/is_key(obj/item/I) return I? (key_type_exact? (I.type == key_type) : istype(I, key_type)) : FALSE diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index 5e3757cedd21d848541530d0d216d47afc74ab87..fc8f0755cb9238b2439409c3e09be511db514458 100644 GIT binary patch delta 14666 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μ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 Date: Sat, 1 Jun 2019 18:24:17 +0100 Subject: [PATCH 05/12] Quick fix to prevent parapalegics driving with no legs. --- code/modules/vehicles/ridden.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index ba37f39bb3..8535bf2ba0 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -60,6 +60,11 @@ if(key_type && !is_key(inserted_key)) to_chat(user, "[src] has no key inserted!") return FALSE + if(canmove && (user.get_num_arms() < arms_required)) + to_chat(user, "You don't have enough legs to operate the pedals!") + canmove = FALSE + addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) + return FALSE var/datum/component/riding/R = GetComponent(/datum/component/riding) R.handle_ride(user, direction) return ..() From cd310b37fe0c858b2bfc9a278a24f0a374977733 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 18:33:42 +0100 Subject: [PATCH 06/12] One pixel missing. --- icons/obj/vehicles.dmi | Bin 35401 -> 35254 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index fc8f0755cb9238b2439409c3e09be511db514458..67079de3e2fa6bc83ce63dfe4241e3d210c7367e 100644 GIT binary patch delta 14476 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 Date: Sun, 2 Jun 2019 18:26:00 +0100 Subject: [PATCH 07/12] Actually check legs. --- code/modules/vehicles/ridden.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 8535bf2ba0..73e08975ba 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -60,7 +60,7 @@ if(key_type && !is_key(inserted_key)) to_chat(user, "[src] has no key inserted!") return FALSE - if(canmove && (user.get_num_arms() < arms_required)) + if(canmove && (user.get_num_lehs() < legs_required)) to_chat(user, "You don't have enough legs to operate the pedals!") canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) From 59e5372abd11461fb9d796b8b470bf61ed92ac5c Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 2 Jun 2019 18:40:56 +0100 Subject: [PATCH 08/12] Made it so prosthetics can't replace legs. Compiled and tested. --- code/__DEFINES/traits.dm | 1 + code/datums/traits/negative.dm | 7 ++++++- code/modules/vehicles/ridden.dm | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index c0e3e141c7..ff45ac474f 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -78,6 +78,7 @@ #define TRAIT_CROCRIN_IMMUNE "crocin_immune" #define TRAIT_NYMPHO "nymphomania" #define TRAIT_MASO "masochism" +#define TRAIT_PARA "paraplegic" // common trait sources #define TRAIT_GENERIC "generic" diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index b7307b10e4..a1a7c16098 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -191,6 +191,7 @@ name = "Paraplegic" desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!" value = -3 + mob_trait = TRAIT_PARA human_only = TRUE gain_text = null // Handled by trauma. lose_text = null @@ -242,8 +243,12 @@ var/slot_string = "limb" /datum/quirk/prosthetic_limb/on_spawn() - var/limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/mob/living/carbon/human/H = quirk_holder + var/limb_slot + if(H.has_trait("TRAIT_PARA"))//Prevent paraplegic legs being replaced + limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + else + limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/obj/item/bodypart/old_part = H.get_bodypart(limb_slot) var/obj/item/bodypart/prosthetic switch(limb_slot) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 73e08975ba..72881e314f 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -60,7 +60,7 @@ if(key_type && !is_key(inserted_key)) to_chat(user, "[src] has no key inserted!") return FALSE - if(canmove && (user.get_num_lehs() < legs_required)) + if(canmove && (user.get_num_legs() < legs_required)) to_chat(user, "You don't have enough legs to operate the pedals!") canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) From e607cd3c7d4a32cce49ac892dd3274b03b964ff8 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 2 Jun 2019 19:11:34 +0100 Subject: [PATCH 09/12] Fixes para's abilities to use other vehicles. --- code/datums/traits/negative.dm | 2 +- code/modules/vehicles/ridden.dm | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index a1a7c16098..aba9404d9a 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -245,7 +245,7 @@ /datum/quirk/prosthetic_limb/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/limb_slot - if(H.has_trait("TRAIT_PARA"))//Prevent paraplegic legs being replaced + if(H.has_trait(TRAIT_PARA))//Prevent paraplegic legs being replaced limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) else limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 72881e314f..8fe7322579 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -4,7 +4,7 @@ max_buckled_mobs = 1 buckle_lying = FALSE default_driver_move = FALSE - var/legs_required = 2 + var/legs_required = 1 var/arms_required = 0 //why not? /obj/vehicle/ridden/Initialize() @@ -31,6 +31,9 @@ /obj/vehicle/ridden/post_buckle_mob(mob/living/M) add_occupant(M) + if(M.get_num_legs() < legs_required) + to_chat(M, "You don't have enough legs to operate the pedals!") + unbuckle_mob(M) return ..() /obj/vehicle/ridden/attackby(obj/item/I, mob/user, params) @@ -60,11 +63,6 @@ if(key_type && !is_key(inserted_key)) to_chat(user, "[src] has no key inserted!") return FALSE - if(canmove && (user.get_num_legs() < legs_required)) - to_chat(user, "You don't have enough legs to operate the pedals!") - canmove = FALSE - addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) - return FALSE var/datum/component/riding/R = GetComponent(/datum/component/riding) R.handle_ride(user, direction) return ..() From 2681a8f7a9ccf858e0acb1bea6fcf12068ad2994 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 17 Jun 2019 12:02:39 +0100 Subject: [PATCH 10/12] Updates has_trait to HAS_TRAIT --- code/modules/surgery/bodyparts/bodyparts.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index b8f4dbd4cc..2a49c37590 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -88,7 +88,7 @@ /obj/item/bodypart/attack(mob/living/carbon/C, mob/user) if(ishuman(C)) var/mob/living/carbon/human/H = C - if(C.has_trait(TRAIT_LIMBATTACHMENT)) + if(HAS_TRAIT(C, TRAIT_LIMBATTACHMENT)) if(!H.get_bodypart(body_zone) && !animal_origin) if(H == user) H.visible_message("[H] jams [src] into [H.p_their()] empty socket!",\ @@ -225,9 +225,9 @@ set_disabled(is_disabled()) /obj/item/bodypart/proc/is_disabled() - if(owner.has_trait(TRAIT_PARALYSIS)) + if(HAS_TRAIT(owner, TRAIT_PARALYSIS)) return BODYPART_DISABLED_PARALYSIS - if(can_dismember() && !owner.has_trait(TRAIT_NODISMEMBER)) + if(can_dismember() && !HAS_TRAIT(owner, TRAIT_NODISMEMBER)) . = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled if((get_damage(TRUE) >= max_damage)) return BODYPART_DISABLED_DAMAGE @@ -293,7 +293,7 @@ C = owner no_update = FALSE - if(C.has_trait(TRAIT_HUSK) && is_organic_limb()) + if(HAS_TRAIT(C, TRAIT_HUSK) && is_organic_limb()) species_id = "husk" //overrides species_id dmg_overlay_type = "" //no damage overlay shown when husked should_draw_gender = FALSE @@ -607,7 +607,7 @@ stam_heal_tick = 2 /obj/item/bodypart/l_arm/is_disabled() - if(owner.has_trait(TRAIT_PARALYSIS_L_ARM)) + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM)) return BODYPART_DISABLED_PARALYSIS return ..() @@ -672,7 +672,7 @@ max_stamina_damage = 50 /obj/item/bodypart/r_arm/is_disabled() - if(owner.has_trait(TRAIT_PARALYSIS_R_ARM)) + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_ARM)) return BODYPART_DISABLED_PARALYSIS return ..() @@ -735,7 +735,7 @@ max_stamina_damage = 50 /obj/item/bodypart/l_leg/is_disabled() - if(owner.has_trait(TRAIT_PARALYSIS_L_LEG)) + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG)) return BODYPART_DISABLED_PARALYSIS return ..() @@ -795,7 +795,7 @@ stam_heal_tick = 2 /obj/item/bodypart/r_leg/is_disabled() - if(owner.has_trait(TRAIT_PARALYSIS_R_LEG)) + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG)) return BODYPART_DISABLED_PARALYSIS return ..() From dd7421f130500a914913a8a53d612d9785072c5a Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 17 Jun 2019 12:05:21 +0100 Subject: [PATCH 11/12] Missed one. --- code/datums/traits/negative.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 7c13310af8..bbf38c822a 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -245,7 +245,7 @@ /datum/quirk/prosthetic_limb/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/limb_slot - if(H.has_trait(TRAIT_PARA))//Prevent paraplegic legs being replaced + if(HAS_TRAIT(H, TRAIT_PARA))//Prevent paraplegic legs being replaced limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) else limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) From 0457026c0fbd1264e30f57257096eb9dea5cb800 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 17 Jun 2019 12:15:54 +0100 Subject: [PATCH 12/12] Missed another. --- code/datums/brain_damage/severe.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 852b6b93c2..d094c162d7 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -109,13 +109,13 @@ /datum/brain_trauma/severe/paralysis/on_gain() ..() for(var/X in paralysis_traits) - owner.add_trait(X, "trauma_paralysis") + ADD_TRAIT(owner, X, "trauma_paralysis") owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/on_lose() ..() for(var/X in paralysis_traits) - owner.remove_trait(X, "trauma_paralysis") + REMOVE_TRAIT(owner, X, "trauma_paralysis") owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/paraplegic