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:
Leshana
2017-04-01 19:07:55 -04:00
205 changed files with 1939 additions and 725 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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"

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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.")

View File

@@ -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.

View File

@@ -174,6 +174,7 @@
darksight = 4
flash_mod = 1.2
chemOD_mod = 0.9
ambiguous_genders = TRUE

View File

@@ -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>")

View File

@@ -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

View File

@@ -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())

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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",

View File

@@ -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")

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View 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"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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"