diff --git a/code/WorkInProgress/Cib/meme.dm b/code/WorkInProgress/Cib/meme.dm
index 880f21bad5..cbd536da93 100644
--- a/code/WorkInProgress/Cib/meme.dm
+++ b/code/WorkInProgress/Cib/meme.dm
@@ -292,8 +292,12 @@ mob/living/parasite/meme/verb/Agony()
spawn
// backup the host incase we switch hosts after using the verb
- var/mob/host = src.host
+ var/mob/living/carbon/host = src.host
+ if (host.species && (host.species.flags & NO_PAIN))
+ usr << "Nothing seems to happen."
+ return
+
host.paralysis = max(host.paralysis, 2)
host.flash_weak_pain()
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index aae0870d8c..337bfa50bb 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -104,9 +104,13 @@ var/list/sacrificed = list()
if(M.stat==2)
continue
usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
- M.visible_message("\red [M] writhes in pain as the markings below \him glow a bloody red.", \
- "\red AAAAAAHHHH!", \
- "\red You hear an anguished scream.")
+
+ if (M.species && (M.species.flags & NO_PAIN))
+ M.visible_message("\red The markings below [M] glow a bloody red.")
+ else
+ M.visible_message("\red [M] writhes in pain as the markings below \him glow a bloody red.", \
+ "\red AAAAAAHHHH!", \
+ "\red You hear an anguished scream.")
if(is_convertable_to_cult(M.mind) && !jobban_isbanned(M, "cultist"))//putting jobban check here because is_convertable uses mind as argument
// Mostly for the benefit of those who resist, but it makes sense for even those who join to have some.. effect.
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 443e642963..2e563bd9a5 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1295,7 +1295,10 @@ About the new airlock wires panel:
S.loc = M.loc
spawn(20)
del(S)
- M.emote("scream")
+ if (iscarbon(M))
+ var/mob/living/carbon/C = M
+ if (!(C.species && (C.species.flags & NO_PAIN)))
+ M.emote("scream")
var/turf/location = src.loc
if(istype(location, /turf/simulated))
location.add_blood(M)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 8fc6fa3599..8ae68ce862 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -329,14 +329,18 @@
for(i=0,i<4,i++)
sleep(50)
if(src.OCCUPANT)
- if(src.issuperUV)
- var/burndamage = rand(28,35)
- OCCUPANT.take_organ_damage(0,burndamage)
- OCCUPANT.emote("scream")
- else
- var/burndamage = rand(6,10)
- OCCUPANT.take_organ_damage(0,burndamage)
- OCCUPANT.emote("scream")
+ var/datum/organ/internal/diona/nutrients/rad_organ = locate() in OCCUPANT.internal_organs
+ if (!rad_organ)
+ if(src.issuperUV)
+ var/burndamage = rand(28,35)
+ OCCUPANT.take_organ_damage(0,burndamage)
+ if (!(OCCUPANT.species && (OCCUPANT.species.flags & NO_PAIN)))
+ OCCUPANT.emote("scream")
+ else
+ var/burndamage = rand(6,10)
+ OCCUPANT.take_organ_damage(0,burndamage)
+ if (!(OCCUPANT.species && (OCCUPANT.species.flags & NO_PAIN)))
+ OCCUPANT.emote("scream")
if(i==3) //End of the cycle
if(!src.issuperUV)
if(src.HELMET)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index eea0358763..d08ce8ec20 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -319,7 +319,13 @@
for(var/mob/living/M in contents)
if (M.stat!=2)
- M.emote("scream")
+ if (!iscarbon(M))
+ M.emote("scream")
+ else
+ var/mob/living/carbon/C = M
+ if (!(C.species && (C.species.flags & NO_PAIN)))
+ C.emote("scream")
+
//Logging for this causes runtimes resulting in the cremator locking up. Commenting it out until that's figured out.
//M.attack_log += "\[[time_stamp()]\] Has been cremated by [user]/[user.ckey]" //No point in this when the mob's about to be deleted
//user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]"
diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm
index 3f4bc2105d..a91f55d4b6 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona.dm
@@ -19,6 +19,7 @@
/mob/living/carbon/alien/diona/New()
..()
+ species = all_species["Diona"]
verbs += /mob/living/carbon/proc/eat_weeds
verbs += /mob/living/carbon/proc/fertilize_plant
verbs += /mob/living/carbon/alien/diona/proc/steal_blood
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index feed242bef..bf72360399 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -1,5 +1,6 @@
/mob/living/carbon/
gender = MALE
+ var/datum/species/species //Contains icon generation and language information, set during New().
var/list/stomach_contents = list()
var/list/datum/disease2/disease/virus2 = list()
var/antibodies = 0
diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm
index f4bc6e4d68..7dc0f45087 100644
--- a/code/modules/mob/living/carbon/carbon_powers.dm
+++ b/code/modules/mob/living/carbon/carbon_powers.dm
@@ -72,7 +72,12 @@
if(B.host_brain.ckey)
src << "\red You send a punishing spike of psychic agony lancing into your host's brain."
- B.host_brain << "\red Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!"
+
+ if (species && (species.flags & NO_PAIN))
+ B.host_brain << "\red You feel a strange sensation as a foreign influence prods your mind."
+ src << "\red It doesn't seem to be as effective as you hoped."
+ else
+ B.host_brain << "\red Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!"
/mob/living/carbon/proc/spawn_larvae()
set category = "Abilities"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 275790fe5e..59e402548a 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -6,7 +6,6 @@
icon_state = "body_m_s"
var/list/hud_list[9]
- var/datum/species/species //Contains icon generation and language information, set during New().
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
/mob/living/carbon/human/New(var/new_loc, var/new_species = null)
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 0c21befe29..579927ec04 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -351,7 +351,7 @@ This function restores all organs.
//Handle other types of damage
if((damagetype != BRUTE) && (damagetype != BURN))
- if(damagetype == HALLOSS)
+ if(damagetype == HALLOSS && !(species && (species.flags & NO_PAIN)))
if ((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
emote("scream")
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 30c883becb..c5436aa48f 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -17,7 +17,8 @@
var/health_deficiency = (100 - health)
if(health_deficiency >= 40) tally += (health_deficiency / 25)
- if(halloss >= 10) tally += (halloss / 10)
+ if (!(species && (species.flags & NO_PAIN)))
+ if(halloss >= 10) tally += (halloss / 10) //halloss shouldn't slow you down if you can't even feel it
var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
if (hungry >= 70) tally += hungry/50
diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm
index 15fdb60349..23ca8acbf6 100644
--- a/code/modules/mob/living/carbon/metroid/powers.dm
+++ b/code/modules/mob/living/carbon/metroid/powers.dm
@@ -61,13 +61,15 @@
loc = M.loc
if(prob(15) && M.client && istype(M, /mob/living/carbon))
- M << "[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!")]"
+ var/mob/living/carbon/C = M
+ if (!(C.species && (C.species.flags & NO_PAIN)))
+ M << "[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(istype(M, /mob/living/carbon))
Victim.adjustCloneLoss(rand(5,6))
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 4371c68f8f..aff3c11f33 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -41,6 +41,9 @@
reagents = R
R.my_atom = src
+ species = all_species[greaterform]
+ add_language(species.language)
+
if(name == initial(name)) //To stop Pun-Pun becoming generic.
name = "[name] ([rand(1, 1000)])"
real_name = name
@@ -78,24 +81,22 @@
/mob/living/carbon/monkey/unathi/New()
- ..()
dna.mutantrace = "lizard"
greaterform = "Unathi"
- add_language("Sinta'unathi")
+ ..()
/mob/living/carbon/monkey/skrell/New()
- ..()
+
dna.mutantrace = "skrell"
greaterform = "Skrell"
- add_language("Skrellian")
+ ..()
/mob/living/carbon/monkey/tajara/New()
- ..()
dna.mutantrace = "tajaran"
greaterform = "Tajara"
- add_language("Siik'tajr")
+ ..()
/mob/living/carbon/monkey/movement_delay()
var/tally = 0
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index a69ee36c7d..fe3937cf67 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -107,7 +107,7 @@
// standing is poor
if(leg_tally <= 0 && !paralysis && !(lying || resting) && prob(5))
- if(species && species.flags & NO_PAIN)
+ if(!(species && (species.flags & NO_PAIN)))
emote("scream")
emote("collapse")
paralysis = 10
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 6bbf2553c9..c0c2397518 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -98,7 +98,8 @@
brute -= brute / 2
if(status & ORGAN_BROKEN && prob(40) && brute)
- owner.emote("scream") //getting hit on broken hand hurts
+ if (!(owner.species && (owner.species.flags & NO_PAIN)))
+ owner.emote("scream") //getting hit on broken hand hurts
if(used_weapon)
add_autopsy_data("[used_weapon]", brute + burn)
@@ -648,7 +649,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(status & ORGAN_ROBOT && !no_explode && sabotaged)
owner.visible_message("\red \The [owner]'s [display_name] explodes violently!",\
"\red Your [display_name] explodes!",\
- "You hear an explosion followed by a scream!")
+ "You hear an explosion!")
explosion(get_turf(owner),-1,-1,2,3)
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, owner)
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 885301fa4d..6389ab94ee 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -1941,7 +1941,8 @@ datum
if(affecting.take_damage(4*toxpwr, 2*toxpwr))
H.UpdateDamageIcon()
if(prob(meltprob)) //Applies disfigurement
- H.emote("scream")
+ if (!(H.species && (H.species.flags & NO_PAIN)))
+ H.emote("scream")
H.status_flags |= DISFIGURED
else
M.take_organ_damage(min(6*toxpwr, volume * toxpwr)) // uses min() and volume to make sure they aren't being sprayed in trace amounts (1 unit != insta rape) -- Doohl
@@ -2103,7 +2104,7 @@ datum
if ( eyes_covered && mouth_covered )
victim << "\red Your [safe_thing] protects you from the pepperspray!"
return
- else if ( mouth_covered ) // Reduced effects if partially protected
+ else if ( eyes_covered ) // Reduced effects if partially protected
victim << "\red Your [safe_thing] protect you from most of the pepperspray!"
victim.eye_blurry = max(M.eye_blurry, 15)
victim.eye_blind = max(M.eye_blind, 5)
@@ -2112,13 +2113,15 @@ datum
//victim.Paralyse(10)
//victim.drop_item()
return
- else if ( eyes_covered ) // Eye cover is better than mouth cover
- victim << "\red Your [safe_thing] protects your eyes from the pepperspray!"
- victim.emote("scream")
+ else if ( mouth_covered ) // Mouth cover is better than eye cover
+ victim << "\red Your [safe_thing] protects your face from the pepperspray!"
+ if (!(victim.species && (victim.species.flags & NO_PAIN)))
+ victim.emote("scream")
victim.eye_blurry = max(M.eye_blurry, 5)
return
else // Oh dear :D
- victim.emote("scream")
+ if (!(victim.species && (victim.species.flags & NO_PAIN)))
+ victim.emote("scream")
victim << "\red You're sprayed directly in the eyes with pepperspray!"
victim.eye_blurry = max(M.eye_blurry, 25)
victim.eye_blind = max(M.eye_blind, 10)