/mob/living/carbon/get_eye_protection() var/number = ..() if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item number += HFP.flash_protect if(istype(src.glasses, /obj/item/clothing/glasses)) //glasses var/obj/item/clothing/glasses/GFP = src.glasses number += GFP.flash_protect if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask var/obj/item/clothing/mask/MFP = src.wear_mask number += MFP.flash_protect var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) if(!E) number = INFINITY //Can't get flashed without eyes else number += E.flash_protect return number /mob/living/carbon/get_ear_protection() var/number = ..() if(ears && (ears.flags_2 & BANG_PROTECT_2)) number += 1 if(head && (head.flags_2 & BANG_PROTECT_2)) number += 1 var/obj/item/organ/ears/E = getorganslot(ORGAN_SLOT_EARS) if(!E) number = INFINITY else number += E.bang_protect return number /mob/living/carbon/is_mouth_covered(head_only = 0, mask_only = 0) if( (!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)) ) return TRUE /mob/living/carbon/is_eyes_covered(check_glasses = 1, check_head = 1, check_mask = 1) if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES)) return TRUE if(check_head && head && (head.flags_cover & HEADCOVERSEYES)) return TRUE if(check_mask && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)) return TRUE /mob/living/carbon/check_projectile_dismemberment(obj/item/projectile/P, def_zone) var/obj/item/bodypart/affecting = get_bodypart(def_zone) if(affecting && affecting.dismemberable && affecting.get_damage() >= (affecting.max_damage - P.dismemberment)) affecting.dismember(P.damtype) /mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE) if(!skipcatch) //ugly, but easy if(in_throw_mode && !get_active_held_item()) //empty active hand and we're in throw mode if(canmove && !restrained()) if(istype(AM, /obj/item)) var/obj/item/I = AM if(isturf(I.loc)) I.attack_hand(src) if(get_active_held_item() == I) //if our attack_hand() picks up the item... visible_message("[src] catches [I]!") //catch that sucker! throw_mode_off() return 1 ..() /mob/living/carbon/attacked_by(obj/item/I, mob/living/user) var/obj/item/bodypart/affecting if(user == src) affecting = get_bodypart(check_zone(user.zone_selected)) //we're self-mutilating! yay! else affecting = get_bodypart(ran_zone(user.zone_selected)) if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest) affecting = bodyparts[1] send_item_attack_message(I, user, affecting.name) if(I.force) apply_damage(I.force, I.damtype, affecting) if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) if(prob(33)) I.add_mob_blood(src) var/turf/location = get_turf(src) add_splatter_floor(location) if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood user.add_mob_blood(src) if(affecting.body_zone == "head") if(wear_mask) wear_mask.add_mob_blood(src) update_inv_wear_mask() if(wear_neck) wear_neck.add_mob_blood(src) update_inv_neck() if(head) head.add_mob_blood(src) update_inv_head() //dismemberment var/probability = I.get_dismemberment_chance(affecting) if(prob(probability)) if(affecting.dismember(I.damtype)) I.add_mob_blood(src) playsound(get_turf(src), I.get_dismember_sound(), 80, 1) return TRUE //successful attack /mob/living/carbon/attack_drone(mob/living/simple_animal/drone/user) return //so we don't call the carbon's attack_hand(). /mob/living/carbon/attack_hand(mob/living/carbon/human/user) for(var/thing in viruses) var/datum/disease/D = thing if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) user.ContactContractDisease(D) for(var/thing in user.viruses) var/datum/disease/D = thing if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) ContactContractDisease(D) if(lying && surgeries.len) if(user.a_intent == INTENT_HELP) for(var/datum/surgery/S in surgeries) if(S.next_step(user)) return 1 return 0 /mob/living/carbon/attack_paw(mob/living/carbon/monkey/M) if(can_inject(M, TRUE)) for(var/thing in viruses) var/datum/disease/D = thing if((D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) && prob(85)) M.ContactContractDisease(D) for(var/thing in M.viruses) var/datum/disease/D = thing if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) ContactContractDisease(D) if(M.a_intent == INTENT_HELP) help_shake_act(M) return 0 if(..()) //successful monkey bite. for(var/thing in M.viruses) var/datum/disease/D = thing ForceContractDisease(D) return 1 /mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M) if(..()) //successful slime attack if(M.powerlevel > 0) var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10 if(prob(stunprob)) M.powerlevel -= 3 if(M.powerlevel < 0) M.powerlevel = 0 visible_message("The [M.name] has shocked [src]!", \ "The [M.name] has shocked [src]!") do_sparks(5, TRUE, src) var/power = M.powerlevel + rand(0,3) Knockdown(power*20) if(stuttering < power) stuttering = power if (prob(stunprob) && M.powerlevel >= 8) adjustFireLoss(M.powerlevel * rand(6,10)) updatehealth() return 1 /mob/living/carbon/proc/dismembering_strike(mob/living/attacker, dam_zone) if(!attacker.limb_destroyer) return dam_zone var/obj/item/bodypart/affecting if(dam_zone && attacker.client) affecting = get_bodypart(ran_zone(dam_zone)) else var/list/things_to_ruin = shuffle(bodyparts.Copy()) for(var/B in things_to_ruin) var/obj/item/bodypart/bodypart = B if(bodypart.body_zone == "head" || bodypart.body_zone == "chest") continue if(!affecting || ((affecting.get_damage() / affecting.max_damage) < (bodypart.get_damage() / bodypart.max_damage))) affecting = bodypart if(affecting) dam_zone = affecting.body_zone if(affecting.get_damage() >= affecting.max_damage) affecting.dismember() return null return affecting.body_zone return dam_zone /mob/living/carbon/blob_act(obj/structure/blob/B) if (stat == DEAD) return else show_message("The blob attacks!") adjustBruteLoss(10) /mob/living/carbon/emp_act(severity) for(var/X in internal_organs) var/obj/item/organ/O = X O.emp_act(severity) ..() /mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0, illusion = 0, stun = TRUE) if(tesla_shock && (flags_2 & TESLA_IGNORE_2)) return FALSE if(has_trait(TRAIT_SHOCKIMMUNE)) return FALSE shock_damage *= siemens_coeff if(dna && dna.species) shock_damage *= dna.species.siemens_coeff if(shock_damage<1 && !override) return 0 if(reagents.has_reagent("teslium")) shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging! if(illusion) adjustStaminaLoss(shock_damage) else take_overall_damage(0,shock_damage) visible_message( "[src] was shocked by \the [source]!", \ "You feel a powerful shock coursing through your body!", \ "You hear a heavy electrical crack." \ ) jitteriness += 1000 //High numbers for violent convulsions do_jitter_animation(jitteriness) stuttering += 2 if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun) Stun(40) spawn(20) jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun) Knockdown(60) if(override) return override else return shock_damage /mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) if(on_fire) to_chat(M, "You can't put them out with just your bare hands!") return if(health >= 0 && !(has_trait(TRAIT_FAKEDEATH))) if(lying) if(buckled) to_chat(M, "You need to unbuckle [src] first to do that!") return M.visible_message("[M] shakes [src] trying to get [p_them()] up!", \ "You shake [src] trying to get [p_them()] up!") else if(check_zone(M.zone_selected) == "head") M.visible_message("[M] gives [src] a pat on the head to make [p_them()] feel better!", \ "You give [src] a pat on the head to make [p_them()] feel better!") if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || (dna.features["tail_human"] != "None") || ("mam_tail" in dna.species.mutant_bodyparts))) emote("wag") //lewd else M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ "You hug [src] to make [p_them()] feel better!") AdjustStun(-60) AdjustKnockdown(-60) AdjustUnconscious(-60) AdjustSleeping(-100) if(resting) resting = 0 update_canmove() playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) /mob/living/carbon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) . = ..() var/damage = intensity - get_eye_protection() if(.) // we've been flashed var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) if (!eyes) return if(visual) return if (damage == 1) to_chat(src, "Your eyes sting a little.") if(prob(40)) adjust_eye_damage(1) else if (damage == 2) to_chat(src, "Your eyes burn.") adjust_eye_damage(rand(2, 4)) else if( damage >= 3) to_chat(src, "Your eyes itch and burn severely!") adjust_eye_damage(rand(12, 16)) if(eyes.eye_damage > 10) blind_eyes(damage) blur_eyes(damage * rand(3, 6)) if(eyes.eye_damage > 20) if(prob(eyes.eye_damage - 20)) if(!has_trait(TRAIT_NEARSIGHT)) to_chat(src, "Your eyes start to burn badly!") become_nearsighted(EYE_DAMAGE) else if(prob(eyes.eye_damage - 25)) if(!has_trait(TRAIT_BLIND)) to_chat(src, "You can't see anything!") become_blind(EYE_DAMAGE) else to_chat(src, "Your eyes are really starting to hurt. This can't be good for you!") if(has_bane(BANE_LIGHT)) mind.disrupt_spells(-500) return 1 else if(damage == 0) // just enough protection if(prob(20)) to_chat(src, "Something bright flashes in the corner of your vision!") if(has_bane(BANE_LIGHT)) mind.disrupt_spells(0) /mob/living/carbon/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) var/ear_safety = get_ear_protection() var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) var/effect_amount = intensity - ear_safety if(effect_amount > 0) if(stun_pwr) Knockdown(stun_pwr*effect_amount) if(istype(ears) && (deafen_pwr || damage_pwr)) var/ear_damage = damage_pwr * effect_amount var/deaf = max(ears.deaf, deafen_pwr * effect_amount) adjustEarDamage(ear_damage,deaf) if(ears.ear_damage >= 15) to_chat(src, "Your ears start to ring badly!") if(prob(ears.ear_damage - 5)) to_chat(src, "You can't hear anything!") ears.ear_damage = min(ears.ear_damage, UNHEALING_EAR_DAMAGE) // you need earmuffs, inacusiate, or replacement else if(ears.ear_damage >= 5) to_chat(src, "Your ears start to ring!") SEND_SOUND(src, sound('sound/weapons/flash_ring.ogg',0,1,0,250)) return effect_amount //how soundbanged we are /mob/living/carbon/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone) if(damage_type != BRUTE && damage_type != BURN) return damage_amount *= 0.5 //0.5 multiplier for balance reason, we don't want clothes to be too easily destroyed if(!def_zone || def_zone == "head") var/obj/item/clothing/hit_clothes if(wear_mask) hit_clothes = wear_mask if(wear_neck) hit_clothes = wear_neck if(head) hit_clothes = head if(hit_clothes) hit_clothes.take_damage(damage_amount, damage_type, damage_flag, 0) /mob/living/carbon/can_hear() . = FALSE var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) if(istype(ears) && !ears.deaf) . = TRUE