Merge remote-tracking branch 'citadel/master' into combat_v7
This commit is contained in:
@@ -101,6 +101,9 @@
|
||||
var/generic_bleedstacks
|
||||
/// If we have a gauze wrapping currently applied (not including splints)
|
||||
var/obj/item/stack/current_gauze
|
||||
/// does this limb have replacement capability, despite probably not being robotic?
|
||||
// see code\modules\surgery\limb_augmentation.dm, or code\game\machinery\limbgrower.dm
|
||||
var/forcereplace = FALSE
|
||||
|
||||
/obj/item/bodypart/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -242,7 +245,13 @@
|
||||
wounding_dmg *= (easy_dismember ? 1 : 0.75)
|
||||
if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus))
|
||||
return
|
||||
// note that there's no handling for BIO_JUST_FLESH since we don't have any that are that right now (slimepeople maybe someday)
|
||||
// if we're flesh only, all blunt attacks become weakened slashes in terms of wound damage
|
||||
if(BIO_JUST_FLESH)
|
||||
if(wounding_type == WOUND_BLUNT)
|
||||
wounding_type = WOUND_SLASH
|
||||
wounding_dmg *= (easy_dismember ? 1 : 0.3)
|
||||
if((mangled_state & BODYPART_MANGLED_FLESH) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus))
|
||||
return
|
||||
// standard humanoids
|
||||
if(BIO_FLESH_BONE)
|
||||
// if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
return TRUE
|
||||
|
||||
//Dismember a limb
|
||||
/obj/item/bodypart/proc/dismember(dam_type = BRUTE, silent=TRUE)
|
||||
/obj/item/bodypart/proc/dismember(dam_type = BRUTE, silent=TRUE, harmless=FALSE)
|
||||
if(!owner)
|
||||
return FALSE
|
||||
var/mob/living/carbon/C = owner
|
||||
@@ -14,24 +14,28 @@
|
||||
return FALSE
|
||||
if(HAS_TRAIT(C, TRAIT_NODISMEMBER))
|
||||
return FALSE
|
||||
var/obj/item/bodypart/affecting = C.get_bodypart(BODY_ZONE_CHEST)
|
||||
affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50), wound_bonus=CANT_WOUND) //Damage the chest based on limb's existing damage
|
||||
if(!harmless)
|
||||
var/obj/item/bodypart/affecting = C.get_bodypart(BODY_ZONE_CHEST)
|
||||
affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50), wound_bonus=CANT_WOUND) //Damage the chest based on limb's existing damage
|
||||
if(!silent)
|
||||
C.visible_message("<span class='danger'><B>[C]'s [name] is violently dismembered!</B></span>")
|
||||
C.emote("scream")
|
||||
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered)
|
||||
if(!harmless)
|
||||
C.emote("scream")
|
||||
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered)
|
||||
else C.emote("pain")
|
||||
drop_limb()
|
||||
C.update_equipment_speed_mods() // Update in case speed affecting item unequipped by dismemberment
|
||||
|
||||
C.bleed(40)
|
||||
if(!harmless) C.bleed(40)
|
||||
|
||||
if(QDELETED(src)) //Could have dropped into lava/explosion/chasm/whatever
|
||||
return TRUE
|
||||
if(dam_type == BURN)
|
||||
burn()
|
||||
return TRUE
|
||||
add_mob_blood(C)
|
||||
C.bleed(rand(20, 40))
|
||||
if(!harmless)
|
||||
if(dam_type == BURN)
|
||||
burn()
|
||||
return TRUE
|
||||
add_mob_blood(C)
|
||||
C.bleed(rand(20, 40))
|
||||
var/direction = pick(GLOB.cardinals)
|
||||
var/t_range = rand(2,max(throw_range/2, 2))
|
||||
var/turf/target_turf = get_turf(src)
|
||||
@@ -45,12 +49,12 @@
|
||||
throw_at(target_turf, throw_range, throw_speed)
|
||||
return TRUE
|
||||
|
||||
/obj/item/bodypart/head/dismember()
|
||||
/obj/item/bodypart/head/dismember(dam_type = BRUTE, silent=TRUE, harmless=FALSE)
|
||||
if(HAS_TRAIT(owner, TRAIT_NODECAP))
|
||||
return FALSE
|
||||
..()
|
||||
|
||||
/obj/item/bodypart/chest/dismember()
|
||||
/obj/item/bodypart/chest/dismember(dam_type = BRUTE, silent=TRUE, harmless=FALSE)
|
||||
if(!owner)
|
||||
return FALSE
|
||||
var/mob/living/carbon/C = owner
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
|
||||
possible_locs = list(BODY_ZONE_CHEST)
|
||||
requires_bodypart_type = BODYPART_ORGANIC
|
||||
requires_bodypart_type = NONE
|
||||
replaced_by = /datum/surgery
|
||||
ignore_clothes = TRUE
|
||||
var/healing_step_type
|
||||
@@ -21,6 +21,12 @@
|
||||
healing_step_type, //hehe cheeky
|
||||
/datum/surgery_step/close)
|
||||
|
||||
/datum/surgery/healing/can_start(mob/user, mob/living/carbon/target, obj/item/tool)
|
||||
for(var/obj/item/bodypart/B in target.bodyparts)
|
||||
if(B.is_organic_limb(FALSE))
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/surgery_step/heal
|
||||
name = "repair body"
|
||||
implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 65, /obj/item/pen = 55)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
if(istype(tool, /obj/item/organ_storage) && istype(tool.contents[1], /obj/item/bodypart))
|
||||
tool = tool.contents[1]
|
||||
var/obj/item/bodypart/aug = tool
|
||||
if(!aug.is_robotic_limb())
|
||||
if(!aug.is_robotic_limb() && !aug.forcereplace) // forcereplace used here to allow for replacing limbs with synthflesh variants
|
||||
to_chat(user, "<span class='warning'>That's not an augment, silly!</span>")
|
||||
return -1
|
||||
if(aug.body_zone != target_zone)
|
||||
@@ -18,9 +18,14 @@
|
||||
return -1
|
||||
L = surgery.operated_bodypart
|
||||
if(L)
|
||||
display_results(user, target, "<span class ='notice'>You begin to augment [target]'s [parse_zone(user.zone_selected)]...</span>",
|
||||
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug].",
|
||||
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)].")
|
||||
if(aug.is_robotic_limb())
|
||||
display_results(user, target, "<span class ='notice'>You begin to augment [target]'s [parse_zone(user.zone_selected)]...</span>",
|
||||
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug].",
|
||||
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)].")
|
||||
else
|
||||
display_results(user, target, "<span class ='notice'>You begin to replace [target]'s [parse_zone(user.zone_selected)]...</span>",
|
||||
"[user] begins to replace [target]'s [parse_zone(user.zone_selected)] with [aug].",
|
||||
"[user] begins to replace [target]'s [parse_zone(user.zone_selected)].")
|
||||
else
|
||||
user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "<span class ='notice'>You look for [target]'s [parse_zone(user.zone_selected)]...</span>")
|
||||
|
||||
@@ -47,10 +52,15 @@
|
||||
tool = tool.contents[1]
|
||||
if(istype(tool) && user.temporarilyRemoveItemFromInventory(tool))
|
||||
tool.replace_limb(target, TRUE)
|
||||
display_results(user, target, "<span class='notice'>You successfully augment [target]'s [parse_zone(target_zone)].</span>",
|
||||
"[user] successfully augments [target]'s [parse_zone(target_zone)] with [tool]!",
|
||||
"[user] successfully augments [target]'s [parse_zone(target_zone)]!")
|
||||
log_combat(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
|
||||
if(tool.is_robotic_limb())
|
||||
display_results(user, target, "<span class='notice'>You successfully augment [target]'s [parse_zone(target_zone)].</span>",
|
||||
"[user] successfully augments [target]'s [parse_zone(target_zone)] with [tool]!",
|
||||
"[user] successfully augments [target]'s [parse_zone(target_zone)]!")
|
||||
else
|
||||
display_results(user, target, "<span class='notice'>You successfully replace [target]'s [parse_zone(target_zone)].</span>",
|
||||
"[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!",
|
||||
"[user] successfully replaces [target]'s [parse_zone(target_zone)]!")
|
||||
log_combat(user, target, "augmented", addition="by giving them a new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[target] has no organic [parse_zone(target_zone)] there!</span>")
|
||||
return TRUE
|
||||
|
||||
@@ -98,8 +98,8 @@
|
||||
failed = TRUE
|
||||
|
||||
/obj/item/organ/heart/slime
|
||||
name = "slime heart"
|
||||
desc = "It seems we've gotten to the slimy core of the matter."
|
||||
name = "mitochondria"
|
||||
desc = "The powerhouse of the cell. Or in this case, the hearty organelle of a slimeperson."
|
||||
icon_state = "heart-s-on"
|
||||
icon_base = "heart-s"
|
||||
|
||||
|
||||
@@ -77,6 +77,11 @@
|
||||
C.action_cooldown_mod *= value
|
||||
cachedmoveCalc = value
|
||||
|
||||
/obj/item/organ/liver/slime
|
||||
name = "viscoplasm" //this is the name that Fermis came up with when working on that organ PR that never got finished - if Fermis ever updates this, this probably will have a lot more functionality.
|
||||
icon_state = "liver-s"
|
||||
desc = "An organelle resembling a liver for slimepeople."
|
||||
|
||||
/obj/item/organ/liver/fly
|
||||
name = "insectoid liver"
|
||||
icon_state = "liver-x" //xenomorph liver? It's just a black liver so it fits.
|
||||
|
||||
@@ -591,6 +591,7 @@
|
||||
|
||||
/obj/item/organ/lungs/slime
|
||||
name = "vacuole"
|
||||
icon_state = "lungs-s"
|
||||
desc = "A large organelle designed to store oxygen and other important gasses."
|
||||
|
||||
safe_toxins_max = 0 //We breathe this to gain POWER.
|
||||
|
||||
@@ -78,6 +78,11 @@
|
||||
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust")
|
||||
..()
|
||||
|
||||
/obj/item/organ/stomach/slime
|
||||
name = "macrolysosome" //an original cell has multiple lysosomes, but in this case a slimeperson only really has one... a big one? probably give it "macro" in the name.
|
||||
icon_state = "stomach-s"
|
||||
desc = "A slimeperson organelle resembling a stomach. It breaks down, or digests macromolecules. Or food and drinks."
|
||||
|
||||
/obj/item/organ/stomach/fly
|
||||
name = "insectoid stomach"
|
||||
icon_state = "stomach-x" //xenomorph liver? It's just a black liver so it fits.
|
||||
|
||||
Reference in New Issue
Block a user