diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm
index 88f4309e360..9082482ebea 100644
--- a/code/__defines/species_languages.dm
+++ b/code/__defines/species_languages.dm
@@ -7,6 +7,8 @@
#define NO_POISON 0x20 // Cannot not suffer toxloss.
#define NO_EMBED 0x40 // Can step on broken glass with no ill-effects and cannot have shrapnel embedded in it.
#define NO_HALLUCINATION 0x80 // Don't hallucinate, ever
+#define NO_BLOOD 0x100 // Never bleed, never show blood amount
+#define UNDEAD 0x200 // Various things that living things don't do, mostly for skeletons
// unused: 0x8000 - higher than this will overflow
// Species spawn flags
diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm
index 92cb782e8a2..4fb71725635 100644
--- a/code/game/objects/items/weapons/material/shards.dm
+++ b/code/game/objects/items/weapons/material/shards.dm
@@ -78,7 +78,10 @@
if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) )
return
- M << "You step on \the [src]!"
+ if(H.species.flags & NO_MINOR_CUT)
+ return
+
+ to_chat(H, "You step on \the [src]!")
var/list/check = list("l_foot", "r_foot")
while(check.len)
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index b4a47d2e47f..ffac791a1fd 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -112,5 +112,5 @@
mutations.Add(SKELETON)
status_flags |= DISFIGURED
- update_body(0)
+ update_body(1)
return
diff --git a/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm
new file mode 100644
index 00000000000..d6c5d030a5e
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm
@@ -0,0 +1,53 @@
+/datum/species/skeleton
+ name = "Skeleton"
+ name_plural = "Skeletons"
+ icobase = 'icons/mob/human_races/r_skeleton.dmi'
+ primitive_form = "Monkey"
+ language = "Sol Common"
+ unarmed_types = list(/datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/sharp) //Bones are pointy, fight me.
+ blurb = "Spooky Scary Skeletons!"
+ name_language = null // Use the first-name last-name generator rather than a language scrambler
+ min_age = 17
+ max_age = 110
+ health_hud_intensity = 1.5
+
+ flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_BLOOD | UNDEAD
+ spawn_flags = SPECIES_IS_RESTRICTED
+ appearance_flags = null
+
+ show_ssd = null
+
+ blood_volume = null
+ taste_sensitivity = TASTE_DULL
+ hunger_factor = 0
+ metabolic_rate = 0
+
+ virus_immune = 1
+
+ brute_mod = 1
+ burn_mod = 0
+ oxy_mod = 0
+ toxins_mod = 0
+ radiation_mod = 0
+ flash_mod = 0
+ chemOD_mod = 0
+
+ siemens_coefficient = 0
+
+ death_message = "falls over and stops moving!"
+ knockout_message = "falls over and stops moving!"
+
+ has_organ = list()
+
+ warning_low_pressure = 50
+ hazard_low_pressure = -1
+
+ cold_level_1 = 50
+ cold_level_2 = -1
+ cold_level_3 = -1
+
+ heat_level_1 = 2000
+ heat_level_2 = 3000
+ heat_level_3 = 4000
+
+ body_temperature = T20C
\ No newline at end of file
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 3f4e37f1a0f..6f7fb44e1d4 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -695,9 +695,21 @@ default behaviour is:
if(A.has_gravity)
//this is the gay blood on floor shit -- Added back -- Skie
if (M.lying && (prob(M.getBruteLoss() / 6)))
- var/turf/location = M.loc
- if (istype(location, /turf/simulated))
- location.add_blood(M)
+ var/bloodtrail = 1 //Checks if it's possible to even spill blood
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species.flags & NO_BLOOD)
+ bloodtrail = 0
+ else
+ var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100)
+ if(blood_volume < BLOOD_VOLUME_SURVIVE)
+ bloodtrail = 0 //Most of it's gone already, just leave it be
+ else
+ H.vessel.remove_reagent("blood", 1)
+ if(bloodtrail)
+ var/turf/location = M.loc
+ if(istype(location, /turf/simulated))
+ location.add_blood(M)
//pull damage with injured people
if(prob(25))
M.adjustBruteLoss(1)
@@ -708,13 +720,20 @@ default behaviour is:
visible_message("\The [M]'s [M.isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!")
var/turf/location = M.loc
if (istype(location, /turf/simulated))
- location.add_blood(M)
+ var/bloodtrail = 1 //Checks if it's possible to even spill blood
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/blood_volume = round(H.vessel.get_reagent_amount("blood"))
- if(blood_volume > 0)
- H.vessel.remove_reagent("blood", 1)
-
+ if(H.species.flags & NO_BLOOD)
+ bloodtrail = 0
+ else
+ var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100)
+ if(blood_volume < BLOOD_VOLUME_SURVIVE)
+ bloodtrail = 0 //Most of it's gone already, just leave it be
+ else
+ H.vessel.remove_reagent("blood", 1)
+ if(bloodtrail)
+ if(istype(location, /turf/simulated))
+ location.add_blood(M)
step(pulling, get_dir(pulling.loc, T))
if(t)
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index dff2a9b2255..5ce463e3092 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -17,6 +17,9 @@ var/const/CE_STABLE_THRESHOLD = 0.5
if(vessel)
return
+ if(species.flags & NO_BLOOD)
+ return
+
vessel = new/datum/reagents(species.blood_volume)
vessel.my_atom = src
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 20390a35553..aef7502354c 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -485,13 +485,13 @@ This function completely restores a damaged organ to perfect condition.
//moved this before the open_wound check so that having many small wounds for example doesn't somehow protect you from taking internal damage (because of the return)
//Possibly trigger an internal wound, too.
var/local_damage = brute_dam + burn_dam + damage
- if((damage > 15) && (type != BURN) && (local_damage > 30) && prob(damage) && (robotic < ORGAN_ROBOT))
+ if((damage > 15) && (type != BURN) && (local_damage > 30) && prob(damage) && (robotic < ORGAN_ROBOT) && !(species.flags & NO_BLOOD))
var/datum/wound/internal_bleeding/I = new (min(damage - 15, 15))
wounds += I
owner.custom_pain("You feel something rip in your [name]!", 50)
//Burn damage can cause fluid loss due to blistering and cook-off
- if((damage > 5 || damage + burn_dam >= 15) && type == BURN && (robotic < ORGAN_ROBOT))
+ if((damage > 5 || damage + burn_dam >= 15) && type == BURN && (robotic < ORGAN_ROBOT) && !(species.flags & NO_BLOOD))
var/fluid_loss = 0.75 * (damage/(owner.getMaxHealth() - config.health_threshold_dead)) * owner.species.blood_volume*(1 - BLOOD_VOLUME_SURVIVE/100)
owner.remove_blood(fluid_loss)
@@ -679,7 +679,7 @@ Note that amputating the affected organ does in fact remove the infection from t
//Updating wounds. Handles wound natural I had some free spachealing, internal bleedings and infections
/obj/item/organ/external/proc/update_wounds()
- if((robotic >= ORGAN_ROBOT)) //Robotic limbs don't heal or get worse.
+ if((robotic >= ORGAN_ROBOT) || (species.flags & UNDEAD)) //Robotic and dead limbs don't heal or get worse.
for(var/datum/wound/W in wounds) //Repaired wounds disappear though
if(W.damage <= 0) //and they disappear right away
wounds -= W //TODO: robot wounds for robot limbs
@@ -754,7 +754,7 @@ Note that amputating the affected organ does in fact remove the infection from t
else
brute_dam += W.damage
- if(!(robotic >= ORGAN_ROBOT) && W.bleeding() && (H && H.should_have_organ(O_HEART)))
+ if(!(robotic >= ORGAN_ROBOT) && W.bleeding() && (H && H.should_have_organ(O_HEART)) && !(H.species.flags & NO_BLOOD))
W.bleed_timer--
status |= ORGAN_BLEEDING
diff --git a/icons/mob/human_races/r_skeleton.dmi b/icons/mob/human_races/r_skeleton.dmi
index c30eb60fde5..30c368b1fc3 100644
Binary files a/icons/mob/human_races/r_skeleton.dmi and b/icons/mob/human_races/r_skeleton.dmi differ
diff --git a/polaris.dme b/polaris.dme
index 57ab75931e8..dfe4b32a575 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1685,6 +1685,7 @@
#include "code\modules\mob\living\carbon\human\species\species_hud.dm"
#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm"
#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm"
+#include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm"
#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm"
#include "code\modules\mob\living\carbon\human\species\station\golem.dm"
#include "code\modules\mob\living\carbon\human\species\station\monkey.dm"