mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-01-06 07:23:16 +00:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into polaris-sync
# Conflicts: # code/modules/client/preference_setup/general/03_body.dm # code/modules/mob/new_player/sprite_accessories.dm # html/changelogs/.all_changelog.yml # icons/mob/human_races/markings.dmi # vorestation.dme
This commit is contained in:
@@ -101,9 +101,9 @@
|
||||
/mob/living/silicon/ai/special_mentions()
|
||||
return list("AI") // AI door!
|
||||
|
||||
// Converts specific characters, like *, /, and _ to formatted output.
|
||||
// Converts specific characters, like *, |, and _ to formatted output.
|
||||
/mob/proc/say_emphasis(var/message)
|
||||
message = encode_html_emphasis(message, "/", "i")
|
||||
message = encode_html_emphasis(message, "|", "i")
|
||||
message = encode_html_emphasis(message, "+", "b")
|
||||
message = encode_html_emphasis(message, "_", "u")
|
||||
return message
|
||||
|
||||
@@ -71,15 +71,11 @@
|
||||
|
||||
/mob/living/carbon/brain/handle_chemicals_in_body()
|
||||
chem_effects.Cut()
|
||||
analgesic = 0
|
||||
|
||||
if(touching) touching.metabolize()
|
||||
if(ingested) ingested.metabolize()
|
||||
if(bloodstr) bloodstr.metabolize()
|
||||
|
||||
if(CE_PAINKILLER in chem_effects)
|
||||
analgesic = chem_effects[CE_PAINKILLER]
|
||||
|
||||
confused = max(0, confused - 1)
|
||||
// decrement dizziness counter, clamped to 0
|
||||
if(resting)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
return null
|
||||
..()
|
||||
|
||||
/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
|
||||
/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
|
||||
if(!effective_force || blocked >= 100)
|
||||
return 0
|
||||
|
||||
@@ -12,6 +12,10 @@
|
||||
if(HULK in user.mutations)
|
||||
effective_force *= 2
|
||||
|
||||
//If the armor soaks all of the damage, it just skips the rest of the checks
|
||||
if(effective_force <= soaked)
|
||||
return 0
|
||||
|
||||
//Apply weapon damage
|
||||
var/weapon_sharp = is_sharp(I)
|
||||
var/weapon_edge = has_edge(I)
|
||||
|
||||
@@ -7,8 +7,7 @@
|
||||
var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm
|
||||
|
||||
var/life_tick = 0 // The amount of life ticks that have processed on this mob.
|
||||
var/analgesic = 0 // when this is set, the mob isn't affected by shock or pain
|
||||
// life should decrease this by 1 every tick
|
||||
|
||||
// total amount of wounds on mob, used to spread out healing and the like over all wounds
|
||||
var/number_wounds = 0
|
||||
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
|
||||
|
||||
@@ -282,7 +282,7 @@
|
||||
msg += "<span class='warning'>[T.He] [T.is] twitching ever so slightly.</span>\n"
|
||||
|
||||
//splints
|
||||
for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM))
|
||||
for(var/organ in BP_ALL)
|
||||
var/obj/item/organ/external/o = get_organ(organ)
|
||||
if(o && o.splinted && o.splinted.loc == o)
|
||||
msg += "<span class='warning'>[T.He] [T.has] \a [o.splinted] on [T.his] [o.name]!</span>\n"
|
||||
|
||||
@@ -1071,7 +1071,7 @@
|
||||
"<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>", \
|
||||
"<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>", \
|
||||
"<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>")
|
||||
src << msg
|
||||
custom_pain(msg, 40)
|
||||
|
||||
organ.take_damage(rand(1,3), 0, 0)
|
||||
if(!(organ.robotic >= ORGAN_ROBOT) && (should_have_organ(O_HEART))) //There is no blood in protheses.
|
||||
@@ -1473,6 +1473,7 @@
|
||||
|
||||
if(stat) return
|
||||
var/datum/category_group/underwear/UWC = input(usr, "Choose underwear:", "Show/hide underwear") as null|anything in global_underwear.categories
|
||||
if(!UWC) return
|
||||
var/datum/category_item/underwear/UWI = all_underwear[UWC.name]
|
||||
if(!UWI || UWI.name == "None")
|
||||
src << "<span class='notice'>You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "\a [UWC.display_name]"].</span>"
|
||||
@@ -1510,7 +1511,7 @@
|
||||
if(check_organ)
|
||||
if(!istype(check_organ))
|
||||
return 0
|
||||
return check_organ.can_feel_pain()
|
||||
return check_organ.organ_can_feel_pain()
|
||||
return !(species.flags & NO_PAIN)
|
||||
|
||||
/mob/living/carbon/human/is_muzzled()
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
// Should this all be in Touch()?
|
||||
if(istype(H))
|
||||
if(get_accuracy_penalty(H)) //Should only trigger if they're not aiming well
|
||||
if(get_accuracy_penalty(H) && H != src) //Should only trigger if they're not aiming well
|
||||
var/hit_zone = get_zone_with_miss_chance(H.zone_sel.selecting, src, get_accuracy_penalty(H))
|
||||
if(!hit_zone)
|
||||
H.do_attack_animation(src)
|
||||
@@ -51,6 +51,7 @@
|
||||
return 0
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
var/armor_soak = get_armor_soak(affecting, "melee")
|
||||
|
||||
if(HULK in H.mutations)
|
||||
damage += 5
|
||||
@@ -59,7 +60,10 @@
|
||||
|
||||
visible_message("\red <B>[H] has punched [src]!</B>")
|
||||
|
||||
apply_damage(damage, HALLOSS, affecting, armor_block)
|
||||
if(armor_soak >= damage)
|
||||
return
|
||||
|
||||
apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak)
|
||||
if(damage >= 9)
|
||||
visible_message("\red <B>[H] has weakened [src]!</B>")
|
||||
apply_effect(4, WEAKEN, armor_block)
|
||||
@@ -258,11 +262,12 @@
|
||||
real_damage = max(1, real_damage)
|
||||
|
||||
var/armour = run_armor_check(affecting, "melee")
|
||||
var/soaked = get_armor_soak(affecting, "melee")
|
||||
// Apply additional unarmed effects.
|
||||
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
|
||||
|
||||
// Finally, apply damage to target
|
||||
apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, sharp=attack.sharp, edge=attack.edge)
|
||||
apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, soaked, sharp=attack.sharp, edge=attack.edge)
|
||||
|
||||
if(I_DISARM)
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
|
||||
@@ -338,7 +343,8 @@
|
||||
var/dam_zone = pick(organs_by_name)
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
var/armor_soak = get_armor_soak(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor_block, armor_soak)
|
||||
updatehealth()
|
||||
return 1
|
||||
|
||||
|
||||
@@ -376,7 +376,7 @@ This function restores all organs.
|
||||
if((damagetype != BRUTE) && (damagetype != BURN))
|
||||
if(damagetype == HALLOSS)
|
||||
if((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
|
||||
if(organ && organ.can_feel_pain())
|
||||
if(organ && organ.organ_can_feel_pain())
|
||||
emote("scream")
|
||||
..(damage, damagetype, def_zone, blocked)
|
||||
return 1
|
||||
|
||||
@@ -67,7 +67,7 @@ emp_act
|
||||
emote("me", 1, "drops what they were holding, their [affected.name] malfunctioning!")
|
||||
else
|
||||
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
|
||||
emote("me", 1, "[affected.can_feel_pain() ? "" : emote_scream]drops what they were holding in their [affected.name]!")
|
||||
emote("me", 1, "[affected.organ_can_feel_pain() ? "" : emote_scream] drops what they were holding in their [affected.name]!")
|
||||
|
||||
..(stun_amount, agony_amount, def_zone)
|
||||
|
||||
@@ -93,6 +93,29 @@ emp_act
|
||||
total += weight
|
||||
return (armorval/max(total, 1))
|
||||
|
||||
//Like getarmor, but the value it returns will be numerical damage reduction
|
||||
/mob/living/carbon/human/getsoak(var/def_zone, var/type)
|
||||
var/soakval = 0
|
||||
var/total = 0
|
||||
|
||||
if(def_zone)
|
||||
if(isorgan(def_zone))
|
||||
return getsoak_organ(def_zone, type)
|
||||
var/obj/item/organ/external/affecting = get_organ(def_zone)
|
||||
if(affecting)
|
||||
return getsoak_organ(affecting, type)
|
||||
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
|
||||
|
||||
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
|
||||
for(var/organ_name in organs_by_name)
|
||||
if (organ_name in organ_rel_size)
|
||||
var/obj/item/organ/external/organ = organs_by_name[organ_name]
|
||||
if(organ)
|
||||
var/weight = organ_rel_size[organ_name]
|
||||
soakval += getsoak_organ(organ, type) * weight
|
||||
total += weight
|
||||
return (soakval/max(total, 1))
|
||||
|
||||
//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ.
|
||||
/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone)
|
||||
if (!def_zone)
|
||||
@@ -119,6 +142,17 @@ emp_act
|
||||
protection += C.armor[type]
|
||||
return protection
|
||||
|
||||
/mob/living/carbon/human/proc/getsoak_organ(var/obj/item/organ/external/def_zone, var/type)
|
||||
if(!type || !def_zone) return 0
|
||||
var/soaked = 0
|
||||
var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes)
|
||||
for(var/gear in protective_gear)
|
||||
if(gear && istype(gear ,/obj/item/clothing))
|
||||
var/obj/item/clothing/C = gear
|
||||
if(istype(C) && C.body_parts_covered & def_zone.body_part)
|
||||
soaked += C.armorsoak[type]
|
||||
return soaked
|
||||
|
||||
/mob/living/carbon/human/proc/check_head_coverage()
|
||||
|
||||
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform)
|
||||
@@ -195,25 +229,35 @@ emp_act
|
||||
|
||||
visible_message("<span class='danger'>[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] in the [affecting.name] with [I.name] by [user]!</span>")
|
||||
|
||||
var/soaked = get_armor_soak(hit_zone, "melee", I.armor_penetration)
|
||||
|
||||
if(soaked >= effective_force)
|
||||
src << "Your armor absorbs the force of [I.name]!"
|
||||
return
|
||||
|
||||
var/blocked = run_armor_check(hit_zone, "melee", I.armor_penetration, "Your armor has protected your [affecting.name].", "Your armor has softened the blow to your [affecting.name].")
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone)
|
||||
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone)
|
||||
|
||||
return blocked
|
||||
|
||||
/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
|
||||
/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
|
||||
var/obj/item/organ/external/affecting = get_organ(hit_zone)
|
||||
if(!affecting)
|
||||
return 0
|
||||
|
||||
if(soaked >= effective_force)
|
||||
return 0
|
||||
|
||||
// Handle striking to cripple.
|
||||
if(user.a_intent == I_DISARM)
|
||||
effective_force *= 0.5 //reduced effective force...
|
||||
if(!..(I, user, effective_force, blocked, hit_zone))
|
||||
if(!..(I, user, effective_force, blocked, soaked, hit_zone))
|
||||
return 0
|
||||
|
||||
//set the dislocate mult less than the effective force mult so that
|
||||
//dislocating limbs on disarm is a bit easier than breaking limbs on harm
|
||||
attack_joint(affecting, I, effective_force, 0.75, blocked) //...but can dislocate joints
|
||||
attack_joint(affecting, I, effective_force, 0.75, blocked, soaked) //...but can dislocate joints
|
||||
else if(!..())
|
||||
return 0
|
||||
|
||||
@@ -243,7 +287,7 @@ emp_act
|
||||
switch(hit_zone)
|
||||
if("head")//Harder to score a stun but if you do it lasts a bit longer
|
||||
if(prob(effective_force))
|
||||
apply_effect(20, PARALYZE, blocked)
|
||||
apply_effect(20, PARALYZE, blocked, soaked)
|
||||
visible_message("<span class='danger'>\The [src] has been knocked unconscious!</span>")
|
||||
if(bloody)//Apply blood
|
||||
if(wear_mask)
|
||||
@@ -257,15 +301,15 @@ emp_act
|
||||
update_inv_glasses(0)
|
||||
if("chest")//Easier to score a stun but lasts less time
|
||||
if(prob(effective_force + 10))
|
||||
apply_effect(6, WEAKEN, blocked)
|
||||
apply_effect(6, WEAKEN, blocked, soaked)
|
||||
visible_message("<span class='danger'>\The [src] has been knocked down!</span>")
|
||||
if(bloody)
|
||||
bloody_body(src)
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked)
|
||||
if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100)
|
||||
/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked, var/soaked)
|
||||
if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100 || soaked > effective_force)
|
||||
return 0
|
||||
|
||||
if(W.damtype != BRUTE)
|
||||
@@ -338,10 +382,6 @@ emp_act
|
||||
var/hit_area = affecting.name
|
||||
|
||||
src.visible_message("\red [src] has been hit in the [hit_area] by [O].")
|
||||
var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
|
||||
|
||||
if(armor < 100)
|
||||
apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O)
|
||||
|
||||
if(ismob(O.thrower))
|
||||
var/mob/M = O.thrower
|
||||
@@ -352,12 +392,25 @@ emp_act
|
||||
if(!istype(src,/mob/living/simple_animal/mouse))
|
||||
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
|
||||
//If the armor absorbs all of the damage, skip the rest of the calculations
|
||||
var/soaked = get_armor_soak(affecting, "melee", O.armor_penetration)
|
||||
if(soaked >= throw_damage)
|
||||
src << "Your armor absorbs the force of [O.name]!"
|
||||
return
|
||||
|
||||
var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
|
||||
if(armor < 100)
|
||||
apply_damage(throw_damage, dtype, zone, armor, soaked, is_sharp(O), has_edge(O), O)
|
||||
|
||||
|
||||
//thrown weapon embedded object code.
|
||||
if(dtype == BRUTE && istype(O,/obj/item))
|
||||
var/obj/item/I = O
|
||||
if (!is_robot_module(I))
|
||||
var/sharp = is_sharp(I)
|
||||
var/damage = throw_damage
|
||||
if (soaked)
|
||||
damage -= soaked
|
||||
if (armor)
|
||||
damage /= armor+1
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
if (!lying && !buckled && world.time - l_move_time < 15)
|
||||
//Moving around with fractured ribs won't do you any good
|
||||
if (prob(10) && !stat && can_feel_pain() && analgesic < 50 && E.is_broken() && E.internal_organs.len)
|
||||
if (prob(10) && !stat && can_feel_pain() && chem_effects[CE_PAINKILLER] < 50 && E.is_broken() && E.internal_organs.len)
|
||||
custom_pain("Pain jolts through your broken [E.encased ? E.encased : E.name], staggering you!", 50)
|
||||
drop_item(loc)
|
||||
Stun(2)
|
||||
@@ -100,7 +100,7 @@
|
||||
else if (E.is_dislocated())
|
||||
stance_damage += 0.5
|
||||
|
||||
if(E) limb_pain = E.can_feel_pain()
|
||||
if(E) limb_pain = E.organ_can_feel_pain()
|
||||
|
||||
// Canes and crutches help you stand (if the latter is ever added)
|
||||
// One cane mitigates a broken leg+foot, or a missing foot.
|
||||
@@ -159,7 +159,7 @@
|
||||
drop_from_inventory(r_hand)
|
||||
|
||||
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
|
||||
emote("me", 1, "[(E.can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
|
||||
emote("me", 1, "[(can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
|
||||
|
||||
else if(E.is_malfunctioning())
|
||||
switch(E.body_part)
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
var/rn = rand(0, 200)
|
||||
if(getBrainLoss() >= 5)
|
||||
if(0 <= rn && rn <= 3)
|
||||
custom_pain("Your head feels numb and painful.")
|
||||
custom_pain("Your head feels numb and painful.", 10)
|
||||
if(getBrainLoss() >= 15)
|
||||
if(4 <= rn && rn <= 6) if(eye_blurry <= 0)
|
||||
src << "<span class='warning'>It becomes hard to see for some reason.</span>"
|
||||
@@ -329,17 +329,20 @@
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
|
||||
if(suiciding)
|
||||
failed_last_breath = 1
|
||||
adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
suiciding --
|
||||
return 0
|
||||
|
||||
if(does_not_breathe)
|
||||
failed_last_breath = 0
|
||||
adjustOxyLoss(-5)
|
||||
return
|
||||
|
||||
if(!breath || (breath.total_moles == 0) || suiciding)
|
||||
if(!breath || (breath.total_moles == 0))
|
||||
failed_last_breath = 1
|
||||
if(suiciding)
|
||||
adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
return 0
|
||||
if(health > config.health_threshold_crit)
|
||||
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
|
||||
else
|
||||
@@ -350,10 +353,6 @@
|
||||
if(!L.is_bruised() && prob(8))
|
||||
rupture_lung()
|
||||
|
||||
if(should_have_organ("brain"))
|
||||
if(prob(5))
|
||||
adjustBrainLoss(0.02 * oxyloss) //2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
|
||||
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
|
||||
return 0
|
||||
@@ -372,8 +371,9 @@
|
||||
safe_pressure_min *= 1.25
|
||||
else if(breath)
|
||||
if(breath.total_moles < BREATH_MOLES / 10 || breath.total_moles > BREATH_MOLES * 5)
|
||||
if (prob(8))
|
||||
rupture_lung()
|
||||
if(is_below_sound_pressure(get_turf(src))) //No more popped lungs from choking/drowning
|
||||
if (prob(8))
|
||||
rupture_lung()
|
||||
|
||||
var/safe_exhaled_max = 10
|
||||
var/safe_toxins_max = 0.2
|
||||
@@ -794,7 +794,6 @@
|
||||
|
||||
if(reagents)
|
||||
chem_effects.Cut()
|
||||
analgesic = 0
|
||||
|
||||
if(!isSynthetic())
|
||||
|
||||
@@ -802,9 +801,6 @@
|
||||
if(ingested) ingested.metabolize()
|
||||
if(bloodstr) bloodstr.metabolize()
|
||||
|
||||
if(CE_PAINKILLER in chem_effects)
|
||||
analgesic = chem_effects[CE_PAINKILLER]
|
||||
|
||||
var/total_phoronloss = 0
|
||||
for(var/obj/item/I in src)
|
||||
if(I.contaminated)
|
||||
@@ -923,6 +919,14 @@
|
||||
for(var/atom/a in hallucinations)
|
||||
qdel(a)
|
||||
|
||||
//Brain damage from Oxyloss
|
||||
if(should_have_organ("brain"))
|
||||
var/brainOxPercent = 0.02 //Default2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
|
||||
if(CE_STABLE in chem_effects)
|
||||
brainOxPercent = 0.01 //Halved in effect
|
||||
if(oxyloss >= 20 && prob(5))
|
||||
adjustBrainLoss(brainOxPercent * oxyloss)
|
||||
|
||||
if(halloss >= species.total_health)
|
||||
src << "<span class='notice'>You're in too much pain to keep going...</span>"
|
||||
src.visible_message("<B>[src]</B> slumps to the ground, too weak to continue fighting.")
|
||||
@@ -1155,7 +1159,7 @@
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
if(healths)
|
||||
if (analgesic > 100)
|
||||
if (chem_effects[CE_PAINKILLER] > 100)
|
||||
healths.icon_state = "health_numb"
|
||||
else
|
||||
// Generate a by-limb health display.
|
||||
@@ -1443,8 +1447,11 @@
|
||||
shock_stage = max(shock_stage-1, 0)
|
||||
return
|
||||
|
||||
if(stat)
|
||||
return 0
|
||||
|
||||
if(shock_stage == 10)
|
||||
src << "<span class='danger'>[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!</span>"
|
||||
custom_pain("[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!", 40)
|
||||
|
||||
if(shock_stage >= 30)
|
||||
if(shock_stage == 30) emote("me",1,"is having trouble keeping their eyes open.")
|
||||
|
||||
@@ -72,6 +72,7 @@
|
||||
var/toxins_mod = 1 // Toxloss modifier
|
||||
var/radiation_mod = 1 // Radiation modifier
|
||||
var/flash_mod = 1 // Stun from blindness modifier.
|
||||
var/chemOD_mod = 1 // Damage modifier for overdose
|
||||
var/vision_flags = SEE_SELF // Same flags as glasses.
|
||||
|
||||
// Death vars.
|
||||
|
||||
@@ -174,6 +174,7 @@
|
||||
|
||||
darksight = 4
|
||||
flash_mod = 1.2
|
||||
chemOD_mod = 0.9
|
||||
|
||||
ambiguous_genders = TRUE
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ var/global/list/sparring_attack_cache = list()
|
||||
if(eyes)
|
||||
eyes.take_damage(rand(3,4), 1)
|
||||
user.visible_message("<span class='danger'>[user] presses \his [eye_attack_text] into [target]'s [eyes.name]!</span>")
|
||||
var/eye_pain = eyes.can_feel_pain()
|
||||
var/eye_pain = eyes.organ_can_feel_pain()
|
||||
target << "<span class='danger'>You experience[(eye_pain) ? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(eye_pain)? "." : "!"]</span>"
|
||||
return
|
||||
user.visible_message("<span class='danger'>[user] attempts to press \his [eye_attack_text] into [target]'s eyes, but they don't have any!</span>")
|
||||
|
||||
@@ -67,15 +67,11 @@
|
||||
|
||||
/mob/living/carbon/slime/handle_chemicals_in_body()
|
||||
chem_effects.Cut()
|
||||
analgesic = 0
|
||||
|
||||
if(touching) touching.metabolize()
|
||||
if(ingested) ingested.metabolize()
|
||||
if(bloodstr) bloodstr.metabolize()
|
||||
|
||||
if(CE_PAINKILLER in chem_effects)
|
||||
analgesic = chem_effects[CE_PAINKILLER]
|
||||
|
||||
src.updatehealth()
|
||||
|
||||
return //TODO: DEFERRED
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
var/painMes = pick("You can feel your body becoming weak!", "You feel like you're about to die!", "You feel every part of your body screaming in agony!", "A low, rolling pain passes through your body!", "Your body feels as if it's falling apart!", "You feel extremely weak!", "A sharp, deep pain bathes every inch of your body!")
|
||||
if (ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.custom_pain(painMes)
|
||||
H.custom_pain(painMes, 100)
|
||||
else if (istype(M, /mob/living/carbon))
|
||||
var/mob/living/carbon/C = M
|
||||
if (C.can_feel_pain())
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
1.2 * src.getShockBruteLoss() + \
|
||||
1.7 * src.getCloneLoss() + \
|
||||
2 * src.halloss + \
|
||||
-1 * src.analgesic
|
||||
-1 * src.chem_effects[CE_PAINKILLER]
|
||||
|
||||
if(src.slurring)
|
||||
src.traumatic_shock -= 20
|
||||
|
||||
@@ -8,11 +8,13 @@
|
||||
Returns
|
||||
standard 0 if fail
|
||||
*/
|
||||
/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0)
|
||||
/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0)
|
||||
if(Debug2)
|
||||
world.log << "## DEBUG: apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked]."
|
||||
if(!damage || (blocked >= 100))
|
||||
if(!damage || (blocked >= 100) || soaked >= damage)
|
||||
return 0
|
||||
if(soaked)
|
||||
damage -= soaked
|
||||
blocked = (100-blocked)/100
|
||||
switch(damagetype)
|
||||
if(BRUTE)
|
||||
|
||||
@@ -733,11 +733,20 @@ default behaviour is:
|
||||
src << "<span class='warning'>You feel like you are about to throw up!</span>"
|
||||
sleep(100) //and you have 10 more for mad dash to the bucket
|
||||
|
||||
//Damaged livers cause you to vomit blood.
|
||||
if(!blood_vomit)
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(!H.isSynthetic())
|
||||
var/obj/item/organ/internal/liver/L = H.internal_organs_by_name["liver"]
|
||||
if(L.is_broken())
|
||||
blood_vomit = 1
|
||||
|
||||
Stun(5)
|
||||
src.visible_message("<span class='warning'>[src] throws up!</span>","<span class='warning'>You throw up!</span>")
|
||||
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
var/turf/simulated/T = get_turf(src) //TODO: Make add_blood_floor remove blood from human mobs
|
||||
if(istype(T))
|
||||
if(blood_vomit)
|
||||
T.add_blood_floor(src)
|
||||
|
||||
@@ -77,10 +77,20 @@
|
||||
return 0
|
||||
*/
|
||||
|
||||
//Certain pieces of armor actually absorb flat amounts of damage from income attacks
|
||||
/mob/living/proc/get_armor_soak(var/def_zone = null, var/attack_flag = "melee", var/armour_pen = 0)
|
||||
var/soaked = getsoak(def_zone, attack_flag)
|
||||
//5 points of armor pen negate one point of soak
|
||||
if(armour_pen)
|
||||
soaked = max(soaked - (armour_pen/5), 0)
|
||||
return soaked
|
||||
|
||||
//if null is passed for def_zone, then this should return something appropriate for all zones (e.g. area effect damage)
|
||||
/mob/living/proc/getarmor(var/def_zone, var/type)
|
||||
return 0
|
||||
|
||||
/mob/living/proc/getsoak(var/def_zone, var/type)
|
||||
return 0
|
||||
|
||||
/mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone)
|
||||
|
||||
@@ -93,6 +103,7 @@
|
||||
signaler.signal()
|
||||
|
||||
//Armor
|
||||
var/soaked = get_armor_soak(def_zone, P.check_armour, P.armor_penetration)
|
||||
var/absorb = run_armor_check(def_zone, P.check_armour, P.armor_penetration)
|
||||
var/proj_sharp = is_sharp(P)
|
||||
var/proj_edge = has_edge(P)
|
||||
@@ -105,13 +116,13 @@
|
||||
stun_effect_act(0, P.agony, def_zone, P)
|
||||
src <<"\red You have been hit by [P]!"
|
||||
if(!P.nodamage)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=proj_sharp, edge=proj_edge)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge)
|
||||
qdel(P)
|
||||
return
|
||||
|
||||
if(!P.nodamage)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=proj_sharp, edge=proj_edge)
|
||||
P.on_hit(src, absorb, def_zone)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge)
|
||||
P.on_hit(src, absorb, soaked, def_zone)
|
||||
|
||||
if(absorb == 100)
|
||||
return 2
|
||||
@@ -153,17 +164,21 @@
|
||||
/mob/living/proc/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone)
|
||||
visible_message("<span class='danger'>[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] with [I.name] by [user]!</span>")
|
||||
|
||||
var/soaked = get_armor_soak(hit_zone, "melee")
|
||||
var/blocked = run_armor_check(hit_zone, "melee")
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone)
|
||||
|
||||
if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too
|
||||
var/turf/simulated/location = get_turf(src)
|
||||
if(istype(location)) location.add_blood_floor(src)
|
||||
//If the armor absorbs all of the damage, skip the damage calculation and the blood
|
||||
if(!soaked > effective_force)
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone)
|
||||
|
||||
if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too
|
||||
var/turf/simulated/location = get_turf(src)
|
||||
if(istype(location)) location.add_blood_floor(src)
|
||||
|
||||
return blocked
|
||||
|
||||
//returns 0 if the effects failed to apply for some reason, 1 otherwise.
|
||||
/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
|
||||
/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
|
||||
if(!effective_force || blocked >= 100)
|
||||
return 0
|
||||
|
||||
@@ -171,6 +186,10 @@
|
||||
if(HULK in user.mutations)
|
||||
effective_force *= 2
|
||||
|
||||
//Armor soak
|
||||
if(soaked >= effective_force)
|
||||
return 0
|
||||
|
||||
//Apply weapon damage
|
||||
var/weapon_sharp = is_sharp(I)
|
||||
var/weapon_edge = has_edge(I)
|
||||
@@ -178,7 +197,7 @@
|
||||
weapon_sharp = 0
|
||||
weapon_edge = 0
|
||||
|
||||
apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
|
||||
apply_damage(effective_force, I.damtype, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -200,8 +219,10 @@
|
||||
|
||||
src.visible_message("\red [src] has been hit by [O].")
|
||||
var/armor = run_armor_check(null, "melee")
|
||||
var/soaked = get_armor_soak(null, "melee")
|
||||
|
||||
apply_damage(throw_damage, dtype, null, armor, is_sharp(O), has_edge(O), O)
|
||||
|
||||
apply_damage(throw_damage, dtype, null, armor, soaked, is_sharp(O), has_edge(O), O)
|
||||
|
||||
O.throwing = 0 //it hit, so stop moving
|
||||
|
||||
@@ -230,6 +251,9 @@
|
||||
if(!O || !src) return
|
||||
|
||||
if(O.sharp) //Projectile is suitable for pinning.
|
||||
if(soaked >= throw_damage) //Don't embed if it didn't actually damage
|
||||
return
|
||||
|
||||
//Handles embedding for non-humans and simple_animals.
|
||||
embed(O)
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ var/list/department_radio_keys = list(
|
||||
":s" = "Security", ".s" = "Security",
|
||||
":w" = "whisper", ".w" = "whisper",
|
||||
":t" = "Mercenary", ".t" = "Mercenary",
|
||||
":x" = "Raider", ".x" = "Raider",
|
||||
":u" = "Supply", ".u" = "Supply",
|
||||
":v" = "Service", ".v" = "Service",
|
||||
":p" = "AI Private", ".p" = "AI Private",
|
||||
@@ -26,6 +27,7 @@ var/list/department_radio_keys = list(
|
||||
":S" = "Security", ".S" = "Security",
|
||||
":W" = "whisper", ".W" = "whisper",
|
||||
":T" = "Mercenary", ".T" = "Mercenary",
|
||||
":X" = "Raider", ".X" = "Raider",
|
||||
":U" = "Supply", ".U" = "Supply",
|
||||
":V" = "Service", ".V" = "Service",
|
||||
":P" = "AI Private", ".P" = "AI Private",
|
||||
|
||||
@@ -548,7 +548,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
var/choice = alert("Would you like to select a hologram based on a (visible) crew member, switch to unique avatar, or load your character from your character slot?",,"Crew Member","Unique","My Character")
|
||||
|
||||
switch(choice)
|
||||
if("Crew Member")
|
||||
if("Crew Member") //A seeable crew member (or a dog)
|
||||
var/list/targets = trackable_mobs()
|
||||
if(targets.len)
|
||||
input = input("Select a crew member:") as null|anything in targets //The definition of "crew member" is a little loose...
|
||||
@@ -561,7 +561,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
else
|
||||
alert("No suitable records found. Aborting.")
|
||||
|
||||
if("My Character")
|
||||
if("My Character") //Loaded character slot
|
||||
if(!client || !client.prefs) return
|
||||
var/mob/living/carbon/human/dummy/dummy = new ()
|
||||
//This doesn't include custom_items because that's ... hard.
|
||||
@@ -574,25 +574,30 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
qdel(dummy)
|
||||
holo_icon = new_holo
|
||||
|
||||
else //One from the dmi.
|
||||
else //A premade from the dmi
|
||||
var/icon_list[] = list(
|
||||
"default",
|
||||
"floating face",
|
||||
"carp",
|
||||
"ian",
|
||||
"runtime",
|
||||
"poly",
|
||||
"pun pun",
|
||||
"male human",
|
||||
"female human",
|
||||
"male unathi",
|
||||
"female unathi",
|
||||
"male tajara",
|
||||
"female tajara",
|
||||
"male tesharii",
|
||||
"female tesharii",
|
||||
"male skrell",
|
||||
"female skrell"
|
||||
"default",
|
||||
"floating face",
|
||||
"singularity",
|
||||
"drone",
|
||||
"carp",
|
||||
"spider",
|
||||
"bear",
|
||||
"slime",
|
||||
"ian",
|
||||
"runtime",
|
||||
"poly",
|
||||
"pun pun",
|
||||
"male human",
|
||||
"female human",
|
||||
"male unathi",
|
||||
"female unathi",
|
||||
"male tajara",
|
||||
"female tajara",
|
||||
"male tesharii",
|
||||
"female tesharii",
|
||||
"male skrell",
|
||||
"female skrell"
|
||||
)
|
||||
input = input("Please select a hologram:") as null|anything in icon_list
|
||||
if(input)
|
||||
@@ -602,8 +607,18 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
|
||||
if("floating face")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2"))
|
||||
if("singularity")
|
||||
holo_icon = getHologramIcon(icon('icons/obj/singularity.dmi',"singularity_s1"))
|
||||
if("drone")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"drone0"))
|
||||
if("carp")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
|
||||
if("spider")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"nurse"))
|
||||
if("bear")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"brownbear"))
|
||||
if("slime")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/slimes.dmi',"cerulean adult slime"))
|
||||
if("ian")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi"))
|
||||
if("runtime")
|
||||
|
||||
@@ -28,11 +28,14 @@ var/list/datum/ai_icon/ai_icons
|
||||
name = "Red"
|
||||
alive_icon = "ai-red"
|
||||
alive_light = "#F04848"
|
||||
dead_icon = "ai-red_dead"
|
||||
dead_light = "#F04848"
|
||||
|
||||
/datum/ai_icon/green
|
||||
name = "Green"
|
||||
alive_icon = "ai-wierd"
|
||||
alive_light = "#00FF99"
|
||||
dead_icon = "ai-weird_dead"
|
||||
|
||||
/datum/ai_icon/blue
|
||||
name = "Blue"
|
||||
@@ -44,6 +47,11 @@ var/list/datum/ai_icon/ai_icons
|
||||
alive_icon = "ai-angryface"
|
||||
alive_light = "#FFFF33"
|
||||
|
||||
/datum/ai_icon/angel
|
||||
name = "Angel"
|
||||
alive_icon = "ai-angel"
|
||||
dead_icon = "ai-angel_dead"
|
||||
|
||||
/datum/ai_icon/bliss
|
||||
name = "Bliss"
|
||||
alive_icon = "ai-bliss"
|
||||
@@ -57,6 +65,7 @@ var/list/datum/ai_icon/ai_icons
|
||||
/datum/ai_icon/database
|
||||
name = "Database"
|
||||
alive_icon = "ai-database"
|
||||
dead_icon = "ai-database_dead"
|
||||
|
||||
/datum/ai_icon/dorf
|
||||
name = "Dorf"
|
||||
@@ -80,6 +89,8 @@ var/list/datum/ai_icon/ai_icons
|
||||
name = "Goon"
|
||||
alive_icon = "ai-goon"
|
||||
alive_light = "#3E5C80"
|
||||
dead_icon = "ai-goon-crash"
|
||||
dead_light = "#3E5C80"
|
||||
|
||||
/datum/ai_icon/heartline
|
||||
name = "Heartline"
|
||||
@@ -91,6 +102,10 @@ var/list/datum/ai_icon/ai_icons
|
||||
alive_icon = "ai-helios"
|
||||
alive_light = "#F2CF73"
|
||||
|
||||
/datum/ai_icon/hourglass
|
||||
name = "Hourglass"
|
||||
alive_icon = "ai-hourglass"
|
||||
|
||||
/datum/ai_icon/inverted
|
||||
name = "Inverted"
|
||||
alive_icon = "ai-u"
|
||||
@@ -100,6 +115,7 @@ var/list/datum/ai_icon/ai_icons
|
||||
name = "Lonestar"
|
||||
alive_icon = "ai-lonestar"
|
||||
alive_light = "#58751C"
|
||||
dead_icon = "ai-lonestar_dead"
|
||||
|
||||
/datum/ai_icon/matrix
|
||||
name = "Matrix"
|
||||
@@ -110,6 +126,7 @@ var/list/datum/ai_icon/ai_icons
|
||||
name = "Monochrome"
|
||||
alive_icon = "ai-mono"
|
||||
alive_light = "#585858"
|
||||
dead_icon = "ai-mono_dead"
|
||||
|
||||
/datum/ai_icon/nanotrasen
|
||||
name = "NanoTrasen"
|
||||
@@ -128,13 +145,16 @@ var/list/datum/ai_icon/ai_icons
|
||||
|
||||
/datum/ai_icon/soviet
|
||||
name = "Soviet"
|
||||
alive_icon = "ai-redoctober"
|
||||
alive_icon = "ai-soviet"
|
||||
alive_light = "#FF4307"
|
||||
dead_icon = "ai-soviet_dead"
|
||||
dead_light = "#FF4307"
|
||||
|
||||
/datum/ai_icon/Static
|
||||
name = "Static"
|
||||
alive_icon = "ai-static"
|
||||
alive_light = "#4784C1"
|
||||
alive_icon = "ai-static_dead"
|
||||
|
||||
/datum/ai_icon/text
|
||||
name = "Text"
|
||||
@@ -143,6 +163,7 @@ var/list/datum/ai_icon/ai_icons
|
||||
/datum/ai_icon/trapped
|
||||
name = "Trapped"
|
||||
alive_icon = "ai-hades"
|
||||
dead_icon = "ai-hades_dead"
|
||||
|
||||
/datum/ai_icon/triumvirate_static
|
||||
name = "Triumvirate"
|
||||
|
||||
@@ -158,9 +158,19 @@ var/global/list/robot_modules = list(
|
||||
|
||||
/obj/item/weapon/robot_module/robot/standard
|
||||
name = "standard robot module"
|
||||
sprites = list( "Basic" = "robot_old",
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robot",
|
||||
"Cabeiri" = "eyebot-standard",
|
||||
"CUPCAKE" = "Noble-STD",
|
||||
"Haruka" = "marinaSD",
|
||||
"Usagi" = "tallflower",
|
||||
"Telemachus" = "toiletbot",
|
||||
"WTOperator" = "sleekstandard",
|
||||
"WTOmni" = "omoikane",
|
||||
"XI-GUS" = "spider",
|
||||
"XI-ALP" = "heavyStandard",
|
||||
"Basic" = "robot_old",
|
||||
"Android" = "droid",
|
||||
"Default" = "robot",
|
||||
"Drone" = "drone-standard"
|
||||
)
|
||||
|
||||
@@ -181,8 +191,16 @@ var/global/list/robot_modules = list(
|
||||
/obj/item/weapon/robot_module/robot/medical/surgeon
|
||||
name = "surgeon robot module"
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotMedi",
|
||||
"Cabeiri" = "eyebot-medical",
|
||||
"CUPCAKE" = "Noble-MED",
|
||||
"Haruka" = "marinaMD",
|
||||
"Minako" = "arachne",
|
||||
"Usagi" = "tallwhite",
|
||||
"Telemachus" = "toiletbotsurgeon",
|
||||
"WTOperator" = "sleekcmo",
|
||||
"XI-ALP" = "heavyMed",
|
||||
"Basic" = "Medbot",
|
||||
"Standard" = "surgeon",
|
||||
"Advanced Droid" = "droid-medical",
|
||||
"Needles" = "medicalrobot",
|
||||
"Drone" = "drone-surgery"
|
||||
@@ -230,8 +248,16 @@ var/global/list/robot_modules = list(
|
||||
/obj/item/weapon/robot_module/robot/medical/crisis
|
||||
name = "crisis robot module"
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotMedi",
|
||||
"Cabeiri" = "eyebot-medical",
|
||||
"CUPCAKE" = "Noble-MED",
|
||||
"Haruka" = "marinaMD",
|
||||
"Minako" = "arachne",
|
||||
"Usagi" = "tallwhite",
|
||||
"Telemachus" = "toiletbotmedical",
|
||||
"WTOperator" = "sleekmedic",
|
||||
"XI-ALP" = "heavyMed",
|
||||
"Basic" = "Medbot",
|
||||
"Standard" = "surgeon",
|
||||
"Advanced Droid" = "droid-medical",
|
||||
"Needles" = "medicalrobot",
|
||||
"Drone - Medical" = "drone-medical",
|
||||
@@ -295,6 +321,15 @@ var/global/list/robot_modules = list(
|
||||
networks = list(NETWORK_ENGINEERING)
|
||||
subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor)
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotEngi",
|
||||
"Cabeiri" = "eyebot-engineering",
|
||||
"CUPCAKE" = "Noble-ENG",
|
||||
"Haruka" = "marinaENG",
|
||||
"Usagi" = "tallyellow",
|
||||
"Telemachus" = "toiletbotengineering",
|
||||
"WTOperator" = "sleekce",
|
||||
"XI-GUS" = "spidereng",
|
||||
"XI-ALP" = "heavyEng",
|
||||
"Basic" = "Engineering",
|
||||
"Antique" = "engineerrobot",
|
||||
"Landmate" = "landmate",
|
||||
@@ -312,7 +347,7 @@ var/global/list/robot_modules = list(
|
||||
src.modules += new /obj/item/weapon/rcd/borg(src)
|
||||
src.modules += new /obj/item/weapon/screwdriver(src)
|
||||
src.modules += new /obj/item/weapon/wrench(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
|
||||
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
|
||||
src.modules += new /obj/item/device/pipe_painter(src)
|
||||
src.modules += new /obj/item/device/floor_painter(src)
|
||||
@@ -348,7 +383,7 @@ var/global/list/robot_modules = list(
|
||||
/obj/item/weapon/robot_module/robot/engineering/general/New()
|
||||
..()
|
||||
src.modules += new /obj/item/borg/sight/meson(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
|
||||
src.modules += new /obj/item/weapon/screwdriver(src)
|
||||
src.modules += new /obj/item/weapon/wrench(src)
|
||||
src.modules += new /obj/item/weapon/wirecutters(src)
|
||||
@@ -408,11 +443,19 @@ var/global/list/robot_modules = list(
|
||||
|
||||
/obj/item/weapon/robot_module/robot/security/general
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotSecy",
|
||||
"Cabeiri" = "eyebot-security",
|
||||
"Cerberus" = "bloodhound",
|
||||
"Cerberus - Treaded" = "treadhound",
|
||||
"CUPCAKE" = "Noble-SEC",
|
||||
"Haruka" = "marinaSC",
|
||||
"Usagi" = "tallred",
|
||||
"Telemachus" = "toiletbotsecurity",
|
||||
"WTOperator" = "sleeksecurity",
|
||||
"XI-GUS" = "spidersec",
|
||||
"XI-ALP" = "heavySec",
|
||||
"Basic" = "secborg",
|
||||
"Red Knight" = "Security",
|
||||
"Black Knight" = "securityrobot",
|
||||
"Bloodhound" = "bloodhound",
|
||||
"Bloodhound - Treaded" = "secborg+tread",
|
||||
"Drone" = "drone-sec"
|
||||
)
|
||||
|
||||
@@ -448,6 +491,13 @@ var/global/list/robot_modules = list(
|
||||
name = "janitorial robot module"
|
||||
channels = list("Service" = 1)
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotJani",
|
||||
"Cabeiri" = "eyebot-janitor",
|
||||
"CUPCAKE" = "Noble-CLN",
|
||||
"Haruka" = "marinaJN",
|
||||
"Telemachus" = "toiletbotjanitor",
|
||||
"WTOperator" = "sleekjanitor",
|
||||
"XI-ALP" = "heavyRes",
|
||||
"Basic" = "JanBot2",
|
||||
"Mopbot" = "janitorrobot",
|
||||
"Mop Gear Rex" = "mopgearrex",
|
||||
@@ -488,11 +538,21 @@ var/global/list/robot_modules = list(
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/clerical/butler
|
||||
sprites = list( "Waitress" = "Service",
|
||||
"Kent" = "toiletbot",
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotServ",
|
||||
"Cabeiri" = "eyebot-standard",
|
||||
"CUPCAKE" = "Noble-SRV",
|
||||
"Haruka" = "marinaSV",
|
||||
"Usagi" = "tallgreen",
|
||||
"Telemachus" = "toiletbot",
|
||||
"WTOperator" = "sleekservice",
|
||||
"WTOmni" = "omoikane",
|
||||
"XI-GUS" = "spider",
|
||||
"XI-ALP" = "heavyServ",
|
||||
"Standard" = "Service2",
|
||||
"Waitress" = "Service",
|
||||
"Bro" = "Brobot",
|
||||
"Rich" = "maximillion",
|
||||
"Default" = "Service2",
|
||||
"Drone - Service" = "drone-service",
|
||||
"Drone - Hydro" = "drone-hydro"
|
||||
)
|
||||
@@ -532,12 +592,21 @@ var/global/list/robot_modules = list(
|
||||
/obj/item/weapon/robot_module/robot/clerical/general
|
||||
name = "clerical robot module"
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotCler",
|
||||
"Cabeiri" = "eyebot-standard",
|
||||
"CUPCAKE" = "Noble-SRV",
|
||||
"Haruka" = "marinaSV",
|
||||
"Usagi" = "tallgreen",
|
||||
"Telemachus" = "toiletbot",
|
||||
"WTOperator" = "sleekclerical",
|
||||
"WTOmni" = "omoikane",
|
||||
"XI-GUS" = "spidercom",
|
||||
"XI-ALP" = "heavyServ",
|
||||
"Waitress" = "Service",
|
||||
"Kent" = "toiletbot",
|
||||
"Bro" = "Brobot",
|
||||
"Rich" = "maximillion",
|
||||
"Default" = "Service2",
|
||||
"Drone" = "drone-service"
|
||||
"Drone" = "drone-blu"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/clerical/general/New()
|
||||
@@ -563,6 +632,14 @@ var/global/list/robot_modules = list(
|
||||
channels = list("Supply" = 1)
|
||||
networks = list(NETWORK_MINE)
|
||||
sprites = list(
|
||||
"NM-USE NanoTrasen" = "robotMine",
|
||||
"Cabeiri" = "eyebot-miner",
|
||||
"CUPCAKE" = "Noble-DIG",
|
||||
"Haruka" = "marinaMN",
|
||||
"Telemachus" = "toiletbotminer",
|
||||
"WTOperator" = "sleekminer",
|
||||
"XI-GUS" = "spidermining",
|
||||
"XI-ALP" = "heavyMiner",
|
||||
"Basic" = "Miner_old",
|
||||
"Advanced Droid" = "droid-miner",
|
||||
"Treadhead" = "Miner",
|
||||
@@ -586,6 +663,10 @@ var/global/list/robot_modules = list(
|
||||
name = "research module"
|
||||
channels = list("Science" = 1)
|
||||
sprites = list(
|
||||
"L'Ouef" = "peaceborg",
|
||||
"Cabeiri" = "eyebot-science",
|
||||
"Haruka" = "marinaSCI",
|
||||
"WTOperator" = "sleekscience",
|
||||
"Droid" = "droid-science",
|
||||
"Drone" = "drone-science"
|
||||
)
|
||||
@@ -599,7 +680,7 @@ var/global/list/robot_modules = list(
|
||||
src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
|
||||
src.modules += new /obj/item/device/robotanalyzer(src)
|
||||
src.modules += new /obj/item/weapon/card/robot(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
|
||||
src.modules += new /obj/item/weapon/screwdriver(src)
|
||||
src.modules += new /obj/item/weapon/wrench(src)
|
||||
src.modules += new /obj/item/weapon/wirecutters(src)
|
||||
@@ -641,7 +722,13 @@ var/global/list/robot_modules = list(
|
||||
LANGUAGE_SIGN = 0
|
||||
)
|
||||
sprites = list(
|
||||
"Dread" = "securityrobot",
|
||||
"Cerberus" = "syndie_bloodhound",
|
||||
"Cerberus - Treaded" = "syndie_treadhound",
|
||||
"Ares" = "squats",
|
||||
"Telemachus" = "toiletbotantag",
|
||||
"WTOperator" = "hosborg",
|
||||
"XI-GUS" = "spidersyndi",
|
||||
"XI-ALP" = "syndi-heavy"
|
||||
)
|
||||
var/id
|
||||
|
||||
@@ -666,7 +753,10 @@ var/global/list/robot_modules = list(
|
||||
/obj/item/weapon/robot_module/robot/security/combat
|
||||
name = "combat robot module"
|
||||
hide_on_manifest = 1
|
||||
sprites = list("Combat Android" = "droid-combat")
|
||||
sprites = list(
|
||||
"Haruka" = "marinaCB",
|
||||
"Combat Android" = "droid-combat"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/security/combat/New()
|
||||
..()
|
||||
@@ -686,7 +776,8 @@ var/global/list/robot_modules = list(
|
||||
|
||||
/obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot)
|
||||
..()
|
||||
src.modules += new /obj/item/weapon/weldingtool(src)
|
||||
src.modules += new /obj/item/borg/sight/meson(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
|
||||
src.modules += new /obj/item/weapon/screwdriver(src)
|
||||
src.modules += new /obj/item/weapon/wrench(src)
|
||||
src.modules += new /obj/item/weapon/crowbar(src)
|
||||
@@ -774,4 +865,4 @@ var/global/list/robot_modules = list(
|
||||
var/obj/item/device/lightreplacer/LR = locate() in src.modules
|
||||
LR.Charge(R, amount)
|
||||
..()
|
||||
return
|
||||
return
|
||||
@@ -115,7 +115,7 @@
|
||||
var/mob/living/carbon/human/H = target_mob
|
||||
var/dam_zone = pick(BP_TORSO, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG)
|
||||
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
|
||||
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1, edge=1)
|
||||
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), H.get_armor_soak(affecting, "melee"), sharp=1, edge=1)
|
||||
return H
|
||||
else if(isliving(target_mob))
|
||||
var/mob/living/L = target_mob
|
||||
|
||||
73
code/modules/mob/living/simple_animal/animals/fish.dm
Normal file
73
code/modules/mob/living/simple_animal/animals/fish.dm
Normal file
@@ -0,0 +1,73 @@
|
||||
// Different types of fish! They are all subtypes of this tho
|
||||
/mob/living/simple_animal/fish
|
||||
name = "fish"
|
||||
desc = "Its a fishy. No touchy fishy."
|
||||
icon = 'icons/mob/fish.dmi'
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
|
||||
// By defautl they can be in any water turf. Subtypes might restrict to deep/shallow etc
|
||||
var/global/list/suitable_turf_types = list(
|
||||
/turf/simulated/floor/beach/water,
|
||||
/turf/simulated/floor/beach/coastline,
|
||||
/turf/simulated/floor/holofloor/beach/water,
|
||||
/turf/simulated/floor/holofloor/beach/coastline,
|
||||
/turf/simulated/floor/water
|
||||
)
|
||||
|
||||
// Don't swim out of the water
|
||||
/mob/living/simple_animal/fish/handle_wander_movement()
|
||||
if(isturf(src.loc) && !resting && !buckled && canmove) //Physically capable of moving?
|
||||
lifes_since_move++ //Increment turns since move (turns are life() cycles)
|
||||
if(lifes_since_move >= turns_per_move)
|
||||
if(!(stop_when_pulled && pulledby)) //Some animals don't move when pulled
|
||||
var/moving_to = 0 // otherwise it always picks 4, fuck if I know. Did I mention fuck BYOND
|
||||
moving_to = pick(cardinal)
|
||||
dir = moving_to //How about we turn them the direction they are moving, yay.
|
||||
var/turf/T = get_step(src,moving_to)
|
||||
if(T && is_type_in_list(T, suitable_turf_types))
|
||||
Move(T)
|
||||
lifes_since_move = 0
|
||||
|
||||
// Take damage if we are not in water
|
||||
/mob/living/simple_animal/fish/handle_breathing()
|
||||
var/turf/T = get_turf(src)
|
||||
if(T && !is_type_in_list(T, suitable_turf_types))
|
||||
if(prob(50))
|
||||
say(pick("Blub", "Glub", "Burble"))
|
||||
adjustBruteLoss(unsuitable_atoms_damage)
|
||||
|
||||
/mob/living/simple_animal/fish/bass
|
||||
name = "bass"
|
||||
icon_state = "bass-swim"
|
||||
icon_living = "bass-swim"
|
||||
icon_dead = "bass-dead"
|
||||
|
||||
/mob/living/simple_animal/fish/trout
|
||||
name = "trout"
|
||||
icon_state = "trout-swim"
|
||||
icon_living = "trout-swim"
|
||||
icon_dead = "trout-dead"
|
||||
|
||||
/mob/living/simple_animal/fish/salmon
|
||||
name = "salmon"
|
||||
icon_state = "salmon-swim"
|
||||
icon_living = "salmon-swim"
|
||||
icon_dead = "salmon-dead"
|
||||
|
||||
/mob/living/simple_animal/fish/perch
|
||||
name = "perch"
|
||||
icon_state = "perch-swim"
|
||||
icon_living = "perch-swim"
|
||||
icon_dead = "perch-dead"
|
||||
|
||||
/mob/living/simple_animal/fish/pike
|
||||
name = "pike"
|
||||
icon_state = "pike-swim"
|
||||
icon_living = "pike-swim"
|
||||
icon_dead = "pike-dead"
|
||||
|
||||
/mob/living/simple_animal/fish/koi
|
||||
name = "koi"
|
||||
icon_state = "koi-swim"
|
||||
icon_living = "koi-swim"
|
||||
icon_dead = "koi-dead"
|
||||
@@ -36,7 +36,7 @@
|
||||
speak_emote = list("chitters")
|
||||
emote_hear = list("chitters")
|
||||
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidermeat
|
||||
|
||||
var/busy = 0
|
||||
var/poison_per_bite = 5
|
||||
|
||||
@@ -481,7 +481,7 @@
|
||||
var/mob/living/carbon/human/H = parrot_interest
|
||||
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone)))
|
||||
|
||||
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1)
|
||||
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), H.get_armor_soak(affecting, "melee"), sharp=1)
|
||||
visible_emote(pick("pecks [H]'s [affecting].", "cuts [H]'s [affecting] with its talons."))
|
||||
|
||||
else
|
||||
|
||||
@@ -904,7 +904,7 @@ mob/proc/yank_out_object()
|
||||
if(prob(selection.w_class * 5) && (affected.robotic < ORGAN_ROBOT)) //I'M SO ANEMIC I COULD JUST -DIE-.
|
||||
var/datum/wound/internal_bleeding/I = new (min(selection.w_class * 5, 15))
|
||||
affected.wounds += I
|
||||
H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
|
||||
H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 50)
|
||||
|
||||
if (ishuman(U))
|
||||
var/mob/living/carbon/human/human_user = U
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
user << "<span class='notice'>You must stand still to feel [E] for fractures.</span>"
|
||||
else if(E.status & ORGAN_BROKEN)
|
||||
user << "<span class='warning'>The [E.encased ? E.encased : "bone in the [E.name]"] moves slightly when you poke it!</span>"
|
||||
H.custom_pain("Your [E.name] hurts where it's poked.")
|
||||
H.custom_pain("Your [E.name] hurts where it's poked.", 40)
|
||||
else
|
||||
user << "<span class='notice'>The [E.encased ? E.encased : "bones in the [E.name]"] seem to be fine.</span>"
|
||||
|
||||
@@ -56,7 +56,8 @@
|
||||
return
|
||||
|
||||
var/armor = target.run_armor_check(target, "melee")
|
||||
if(armor < 60)
|
||||
var/soaked = target.get_armor_soak(target, "melee")
|
||||
if(armor + soaked < 60)
|
||||
target << "<span class='danger'>You feel extreme pain!</span>"
|
||||
|
||||
var/max_halloss = round(target.species.total_health * 0.8) //up to 80% of passing out
|
||||
@@ -100,8 +101,9 @@
|
||||
damage += hat.force * 3
|
||||
|
||||
var/armor = target.run_armor_check(BP_HEAD, "melee")
|
||||
target.apply_damage(damage, BRUTE, BP_HEAD, armor)
|
||||
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD, "melee"))
|
||||
var/soaked = target.get_armor_soak(BP_HEAD, "melee")
|
||||
target.apply_damage(damage, BRUTE, BP_HEAD, armor, soaked)
|
||||
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD), attacker.get_armor_soak(BP_HEAD), "melee")
|
||||
|
||||
if(!armor && target.headcheck(BP_HEAD) && prob(damage))
|
||||
target.apply_effect(20, PARALYZE)
|
||||
|
||||
@@ -715,15 +715,25 @@
|
||||
species_allowed = list("Unathi")
|
||||
|
||||
//Skrell 'hairstyles'
|
||||
skr_tentacle_m
|
||||
name = "Skrell Male Tentacles"
|
||||
icon_state = "skrell_hair_m"
|
||||
skr_tentacle_veryshort
|
||||
name = "Skrell Very Short Tentacles"
|
||||
icon_state = "skrell_hair_veryshort"
|
||||
species_allowed = list("Skrell")
|
||||
gender = MALE
|
||||
|
||||
skr_tentacle_f
|
||||
name = "Skrell Female Tentacles"
|
||||
icon_state = "skrell_hair_f"
|
||||
skr_tentacle_short
|
||||
name = "Skrell Short Tentacles"
|
||||
icon_state = "skrell_hair_short"
|
||||
species_allowed = list("Skrell")
|
||||
|
||||
skr_tentacle_average
|
||||
name = "Skrell Average Tentacles"
|
||||
icon_state = "skrell_hair_average"
|
||||
species_allowed = list("Skrell")
|
||||
|
||||
skr_tentacle_verylong
|
||||
name = "Skrell Long Tentacles"
|
||||
icon_state = "skrell_hair_verylong"
|
||||
species_allowed = list("Skrell")
|
||||
gender = FEMALE
|
||||
|
||||
@@ -1032,21 +1042,31 @@
|
||||
name = "Socks Coloration (Generic)"
|
||||
icon_state = "pawsocks"
|
||||
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
|
||||
species_allowed = list("Tajara", "Unathi")
|
||||
|
||||
paw_socks_belly
|
||||
name = "Socks,Belly Coloration (Generic)"
|
||||
icon_state = "pawsocksbelly"
|
||||
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
|
||||
species_allowed = list("Tajara", "Unathi")
|
||||
|
||||
belly_hands_feet
|
||||
name = "Hands,Feet,Belly Color (Minor)"
|
||||
icon_state = "bellyhandsfeetsmall"
|
||||
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
|
||||
species_allowed = list("Tajara", "Unathi")
|
||||
|
||||
hands_feet_belly_full
|
||||
name = "Hands,Feet,Belly Color (Major)"
|
||||
icon_state = "bellyhandsfeet"
|
||||
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
|
||||
species_allowed = list("Tajara", "Unathi")
|
||||
|
||||
hands_feet_belly_full_female
|
||||
name = "Hands,Feet,Belly Color (Major, Female)"
|
||||
icon_state = "bellyhandsfeet_female"
|
||||
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
|
||||
species_allowed = list("Tajara")
|
||||
|
||||
patches
|
||||
name = "Color Patches"
|
||||
|
||||
Reference in New Issue
Block a user