Files
vgstation13/code/modules/mob/living/carbon/species.dm
Kurfursten b3d42076d8 Create Racial Fallbacks (#37436)
* Update new_player.dm

* Update species.dm

* Update vox.dm

* update to string
2025-03-03 20:24:32 -06:00

1296 lines
45 KiB
Plaintext

#define GAS_CONSUME_TO_WASTE_DENOMINATOR 2
/*
Datum-based species. Should make for much cleaner and easier to maintain mutantrace code.
*/
// Global Lists ////////////////////////////////////////////////
// Languages
var/global/list/language_keys[0]
var/global/list/all_languages[0]
var/global/list/all_species = list()
var/global/list/whitelisted_species = list("Human")
var/global/list/playable_species = list("Human")
/proc/buildSpeciesLists()
var/datum/language/L
var/datum/species/S
for(. in subtypesof(/datum/language))
L = new .
all_languages[L.name] = L
for (var/language_name in all_languages)
L = all_languages[language_name]
language_keys[":[lowertext(L.key)]"] = L
language_keys[".[lowertext(L.key)]"] = L
language_keys["#[lowertext(L.key)]"] = L
for(. in subtypesof(/datum/species))
S = new .
all_species[S.name] = S
if(S.flags & WHITELISTED)
whitelisted_species += S.name
if(S.flags & PLAYABLE || S.conditional_playable())
playable_species += S.name
return
////////////////////////////////////////////////////////////////
/datum/species
var/name // Species name.
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
var/override_icon = null // DMI for overriding the icon. states: [lowertext(species.name)]_[gender][fat?"_fat":""]
var/eyes = "eyes_s" // Icon for eyes.
var/primitive // Lesser form, if any (ie. monkey for humans)
var/tail // Name of tail icon state
var/tail_icon = 'icons/mob/tails.dmi'
var/tail_type
var/tail_overlapping = TRUE
var/list/known_languages = list(LANGUAGE_GALACTIC_COMMON) // Languages that this species innately knows.
var/default_language = LANGUAGE_GALACTIC_COMMON // Default language is used when 'say' is used without modifiers.
var/attack_verb = "punches" // Empty hand hurt intent verb.
var/punch_damage = 0 // Extra empty hand attack damage.
var/punch_sharpness = 0 // Slicing/cutting force of punches. Independent of the sharpness added by claws.
var/punch_throw_range = 0
var/punch_throw_speed = 1
var/tacklePower = 50
var/tackleRange = 2
var/mutantrace // Safeguard due to old code.
var/myhuman // mob reference
var/breath_type = GAS_OXYGEN // Non-oxygen gas breathed, if any.
var/survival_gear = /obj/item/weapon/storage/box/survival // For spawnin'.
var/cold_level_1 = 220 // Cold damage level 1 below this point.
var/cold_level_2 = 200 // Cold damage level 2 below this point.
var/cold_level_3 = 120 // Cold damage level 3 below this point.
var/heat_level_1 = 360 // Heat damage level 1 above this point.
var/heat_level_2 = 400 // Heat damage level 2 above this point.
var/heat_level_3 = 1000 // Heat damage level 2 above this point.
var/fireloss_mult = 1
var/throw_mult = 1 // Default mob throw_mult.
var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure.
var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning.
var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure.
var/pressure_resistance = 0 //how much we can take a change in pressure, in kPa
// This shit is apparently not even wired up.
var/brute_resist // Physical damage reduction.
var/burn_resist // Burn damage reduction.
var/brute_mod // brute multiplier
var/burn_mod // burn multiplier
var/tox_mod // toxin multiplier
var/rad_mod // radiation multiplier
var/body_temperature = 310.15
var/footprint_type = /obj/effect/decal/cleanable/blood/tracks/footprints //The type of footprint the species leaves if they are not wearing shoes. If we ever get any other than human and vox, maybe this should be explicitly defined for each species.
// For grays
var/max_hurt_damage = 5 // Max unarmed damage
var/power_multiplier = 1 //A melee damage modifier
var/list/default_mutations = list()
var/list/default_blocks = list() // Don't touch.
var/list/default_block_names = list() // Use this instead, using the names from setupgame.dm
var/flags = 0 // Various specific features.
var/anatomy_flags = 0 // Anatomical traits such as not having blood or being bulky.
var/chem_flags = 0 //how we handle chemicals and eating/drinking i guess
var/list/abilities = list() // For species-derived or admin-given powers
var/list/spells = list() // Because spells are the hip new thing to replace verbs
var/blood_color = DEFAULT_BLOOD //Red.
var/flesh_color = DEFAULT_FLESH //Pink.
var/base_color //Used when setting species.
var/max_skin_tone = 1
var/uniform_icons = 'icons/mob/uniform.dmi'
var/fat_uniform_icons = 'icons/mob/uniform_fat.dmi'
var/gloves_icons = 'icons/mob/hands.dmi'
var/glasses_icons = 'icons/mob/eyes.dmi'
var/ears_icons = 'icons/mob/ears.dmi'
var/shoes_icons = 'icons/mob/feet.dmi'
var/head_icons = 'icons/mob/head.dmi'
var/belt_icons = 'icons/mob/belt.dmi'
var/wear_suit_icons = 'icons/mob/suit.dmi'
var/fat_wear_suit_icons = 'icons/mob/suit_fat.dmi'
var/wear_mask_icons = 'icons/mob/mask.dmi'
var/back_icons = 'icons/mob/back.dmi'
var/id_icons = 'icons/mob/ids.dmi'
var/accessory_icons = 'icons/mob/clothing_accessories.dmi'
//Used in icon caching.
var/race_key = 0
var/icon/icon_template
var/list/has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"liver" = /datum/organ/internal/liver,
"kidneys" = /datum/organ/internal/kidney,
"brain" = /datum/organ/internal/brain,
"appendix" = /datum/organ/internal/appendix,
"eyes" = /datum/organ/internal/eyes
)
//If we will apply mutant race overlays or not.
var/has_mutant_race = 1
var/move_speed_mod = 0 //Higher value is slower, lower is faster.
var/move_speed_multiplier = 1 //This is a multiplier, and can make the mob either faster or slower.
var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human
var/gender //For races with only one or neither
var/list/inventory_offsets
var/species_intro //What intro you're given when you become this species.
var/monkey_anim = "h2monkey" // Animation from monkeyisation.
var/datum/speech_filter/speech_filter
var/list/damage_overlays = list("brute", "burn") //What damage overlays will be rendered on the species when harmed
/datum/species/New()
..()
if(all_species[name])
var/datum/species/globalspeciesholder = all_species[name]
default_blocks = globalspeciesholder.default_blocks.Copy()
default_mutations = globalspeciesholder.default_mutations.Copy()
inventory_offsets = get_inventory_offsets()
/datum/species/Destroy()
if(myhuman)
clear_organs(myhuman)
myhuman = null
..()
/datum/species/proc/gib(var/mob/living/carbon/human/H, animation, meat)
if(H.status_flags & BUDDHAMODE)
H.adjustBruteLoss(200)
return
if(!H.isUnconscious())
H.forcesay("-")
H.default_gib(H, animation, meat)
/datum/species/proc/dust(var/mob/living/carbon/human/H, drop_everything)
if(!H.isUnconscious())
H.forcesay("-")
H.default_dust(H, drop_everything)
/datum/species/proc/handle_speech(var/datum/speech/speech, mob/living/carbon/human/H)
if(speech_filter)
speech.message = speech_filter.FilterSpeech(speech.message)
if(H.dna)
if(length(speech.message) >= 2)
for(var/gene_type in H.active_genes)
var/datum/dna/gene/gene = dna_genes[gene_type]
if(!gene.block)
continue
if(gene.OnSay(H,speech))
return 0
return 1
/datum/species/proc/clear_organs(var/mob/living/carbon/human/H)
if(H.organs)
for(var/datum/organ/I in H.organs)
qdel(I)
H.organs.len=0
if(H.internal_organs)
for(var/datum/organ/I in H.internal_organs)
qdel(I)
H.internal_organs.len=0
if(H.cosmetic_organs)
for(var/organ in H.cosmetic_organs)
qdel(organ)
H.cosmetic_organs.len=0
//The rest SHOULD only refer to organs that were already deleted by the above loops, so we can just clear the lists.
if(H.organs_by_name)
H.organs_by_name.len=0
if(H.cosmetic_organs_by_name)
H.cosmetic_organs_by_name.len = 0
if(H.internal_organs_by_name)
H.internal_organs_by_name.len=0
if(H.grasp_organs)
H.grasp_organs.len = 0
H.bad_external_organs.Cut()
/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.
//This is a basic humanoid limb setup.
H.organs = list()
H.cosmetic_organs = list()
H.organs_by_name[LIMB_CHEST] = new/datum/organ/external/chest()
H.organs_by_name[LIMB_GROIN] = new/datum/organ/external/groin(H.organs_by_name[LIMB_CHEST])
H.organs_by_name[LIMB_HEAD] = new/datum/organ/external/head(H.organs_by_name[LIMB_CHEST])
H.organs_by_name[LIMB_LEFT_ARM] = new/datum/organ/external/l_arm(H.organs_by_name[LIMB_CHEST])
H.organs_by_name[LIMB_RIGHT_ARM] = new/datum/organ/external/r_arm(H.organs_by_name[LIMB_CHEST])
H.organs_by_name[LIMB_RIGHT_LEG] = new/datum/organ/external/r_leg(H.organs_by_name[LIMB_GROIN])
H.organs_by_name[LIMB_LEFT_LEG] = new/datum/organ/external/l_leg(H.organs_by_name[LIMB_GROIN])
H.organs_by_name[LIMB_LEFT_HAND] = new/datum/organ/external/hand/l_hand(H.organs_by_name[LIMB_LEFT_ARM])
H.organs_by_name[LIMB_RIGHT_HAND] = new/datum/organ/external/hand/r_hand(H.organs_by_name[LIMB_RIGHT_ARM])
H.organs_by_name[LIMB_LEFT_FOOT] = new/datum/organ/external/l_foot(H.organs_by_name[LIMB_LEFT_LEG])
H.organs_by_name[LIMB_RIGHT_FOOT] = new/datum/organ/external/r_foot(H.organs_by_name[LIMB_RIGHT_LEG])
H.cosmetic_organs_by_name[COSMETIC_ORGAN_TAIL] = new/datum/organ/external/tail(H.organs_by_name[LIMB_GROIN], src)
H.internal_organs = list()
for(var/organ in has_organ)
var/organ_type = has_organ[organ]
var/datum/organ/internal/O = new organ_type(H)
if(O.CanInsert(H))
H.internal_organs_by_name[organ] = O
O.Insert(H)
for(var/name in H.organs_by_name)
var/datum/organ/external/OE = H.organs_by_name[name]
H.organs += OE
if(OE.grasp_id)
H.grasp_organs += OE
for(var/organ in H.cosmetic_organs_by_name)
var/datum/organ/external/cosmetic_organ = H.cosmetic_organs_by_name[organ]
H.cosmetic_organs += cosmetic_organ
for(var/datum/organ/external/external_organ in H.organs)
external_organ.owner = H
for(var/datum/organ/external/cosmetic_organ as anything in H.cosmetic_organs)
cosmetic_organ.owner = H
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment.
return
/datum/species/proc/updatespeciescolor(var/mob/living/carbon/human/H) //Handles changing icobase for species that have multiple skin colors.
return
// Sent from /datum/lung_gas/metabolizable.
/datum/species/proc/receiveGas(var/gas_id, var/ratio, var/moles, var/mob/living/carbon/human/H)
//testing("receiveGas: [gas_id] ? [breath_type] - ratio=[ratio], moles=[moles]")
if(ratio <= 0 || gas_id != breath_type)
//testing(" ratio is 0 or gas_id doesn't match up, adding oxyLoss.")
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
H.failed_last_breath = 1
return 0
else if(ratio >= 1)
//testing(" we cool")
H.failed_last_breath = 0
H.adjustOxyLoss(-5)
H.oxygen_alert = 0
return moles/GAS_CONSUME_TO_WASTE_DENOMINATOR
else
//testing(" ratio < 1, adding oxyLoss.")
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS * (1 - ratio)) //Damage proportional to how much gas you didn't get
H.failed_last_breath = 1
H.oxygen_alert = 1
return moles*ratio/GAS_CONSUME_TO_WASTE_DENOMINATOR
/datum/species/proc/handle_environment(var/datum/gas_mixture/environment, var/mob/living/carbon/human/host)
// Used for species-specific names (Vox, etc)
/datum/species/proc/makeName(var/gender,var/mob/living/carbon/C=null)
if(gender==FEMALE)
return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
else
return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
/datum/species/proc/handle_death(var/mob/living/carbon/human/H, var/gibbed = 0) //Handles any species-specific death events (such as dionaea nymph spawns).
return
/datum/species/proc/can_artifact_revive()
return 1
/datum/species/proc/OnCrit(var/mob/living/carbon/human/H)
/datum/species/proc/OutOfCrit(var/mob/living/carbon/human/H)
/datum/species/proc/silent_speech(message)
// -- Outfit datums --
/datum/species/proc/final_equip(var/mob/living/carbon/human/H)
/datum/species/proc/get_inventory_offsets() //This is what you override if you want to give your species unique inventory offsets.
var/static/list/offsets = list(
"[slot_back]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_wear_mask]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_handcuffed]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_belt]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_wear_id]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_ears]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_glasses]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_gloves]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_head]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_shoes]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_wear_suit]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_w_uniform]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_s_store]" = list("pixel_x" = 0, "pixel_y" = 0),
"[slot_legcuffed]" = list("pixel_x" = 0, "pixel_y" = 0)
)
return offsets
/datum/species/proc/conditional_playable()
return 0
/datum/species/proc/fallback()
return "Human"
/datum/species/human
name = "Human"
known_languages = list(LANGUAGE_HUMAN)
primitive = /mob/living/carbon/monkey
anatomy_flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT | HAS_SWEAT_GLANDS
max_skin_tone = 220
/datum/species/manifested
name = "Manifested"
icobase = 'icons/mob/human_races/r_manifested.dmi'
deform = 'icons/mob/human_races/r_def_manifested.dmi'
known_languages = list(LANGUAGE_HUMAN)
primitive = /mob/living/carbon/monkey
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"liver" = /datum/organ/internal/liver,
"kidneys" = /datum/organ/internal/kidney,
"brain" = /datum/organ/internal/brain/ash,
"appendix" = /datum/organ/internal/appendix,
"eyes" = /datum/organ/internal/eyes
)
cold_level_1 = 210 //Default 220 - Lower is better
cold_level_2 = 190 //Default 200
cold_level_3 = 110 //Default 120
heat_level_1 = 380 //Default 360 - Higher is better
heat_level_2 = 420 //Default 400
heat_level_3 = 1200 //Default 1000
flags = NO_PAIN
anatomy_flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT | HAS_SWEAT_GLANDS
blood_color = PALE_BLOOD
flesh_color = "#C3C1BE"
/datum/species/manifested/handle_death(var/mob/living/carbon/human/H)
H.dust(TRUE)
/datum/species/manifested/OnCrit(var/mob/living/carbon/human/H)
H.overlays |= image('icons/mob/human.dmi',src,"CritPale")
anim(target = H, a_icon = 'icons/effects/96x96.dmi', flick_anim = "rune_blind", offX = -WORLD_ICON_SIZE)
H.take_overall_damage(1, 0)
if (H.health < -50)
H.dust()
/datum/species/manifested/OutOfCrit(var/mob/living/carbon/human/H)
H.overlays -= image('icons/mob/human.dmi',src,"CritPale")
/datum/species/manifested/can_artifact_revive()
return 0
/datum/species/manifested/gib(mob/living/carbon/human/H)
handle_death(H)
/datum/species/unathi
name = "Unathi"
icobase = 'icons/mob/human_races/r_lizard.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi'
known_languages = list(LANGUAGE_UNATHI)
tail = "unathi"
tail_type = "unathi"
attack_verb = "scratches"
punch_damage = 2
primitive = /mob/living/carbon/monkey/unathi
cold_level_1 = 260 //Default 220 - Lower is better
cold_level_2 = 220 //Default 200
cold_level_3 = 130 //Default 120
heat_level_1 = 420 //Default 360 - Higher is better
heat_level_2 = 480 //Default 400
heat_level_3 = 1100 //Default 1000
flags = WHITELISTED
anatomy_flags = HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
default_mutations=list(M_CLAWS)
flesh_color = "#34AF10"
head_icons = 'icons/mob/species/unathi/head.dmi'
wear_suit_icons = 'icons/mob/species/unathi/suit.dmi'
/datum/species/unathi/New()
..()
speech_filter = new /datum/speech_filter/unathi
/datum/species/skellington // /vg/
name = "Skellington"
icobase = 'icons/mob/human_races/r_skeleton.dmi'
deform = 'icons/mob/human_races/r_skeleton.dmi' // TODO: Need deform.
known_languages = list(LANGUAGE_CLATTER)
flags = WHITELISTED | NO_BREATHE
anatomy_flags = NO_SKIN | NO_BLOOD
meat_type = /obj/item/stack/sheet/bone
chem_flags = NO_EAT | NO_INJECT
default_mutations=list(M_SKELETON)
brute_mod = 2.0
tacklePower = 20
tackleRange = 3 //How terribly spooky
has_organ = list(
"brain" = /datum/organ/internal/brain,
)
move_speed_multiplier = 1.5
primitive = /mob/living/carbon/monkey/skellington
species_intro = "You are a Skellington<br>\
You have no skin, no blood, no lips, and only just enough brain to function.<br>\
You can not eat normally, as your necrotic state only permits you to only eat raw flesh. As you lack skin, you can not be injected via syringe.<br>\
You are also incredibly weak to brute damage, but you're fast and don't need to breathe, so that's going for you."
damage_overlays = list()
/datum/species/skellington/conditional_playable()
var/MM = text2num(time2text(world.timeofday, "MM"))
return MM == 10 //October
/datum/species/skellington/fallback()
return "Plasmaman"
/datum/species/skellington/handle_speech(var/datum/speech/speech, mob/living/carbon/human/H)
if (prob(25))
speech.message += " ACK ACK!"
return ..(speech, H)
/datum/species/skellington/can_artifact_revive()
return 0
/datum/species/skellington/gib(mob/living/carbon/human/H)
..()
var/datum/organ/external/head_organ = H.get_organ(LIMB_HEAD)
if(head_organ.status & ORGAN_DESTROYED)
new /obj/effect/decal/remains/human/noskull(H.loc)
else
new /obj/effect/decal/remains/human(H.loc)
head_organ.droplimb(1,1)
H.drop_all()
qdel(src)
/datum/species/tajaran
name = "Tajaran"
icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
known_languages = list(LANGUAGE_CATBEAST, LANGUAGE_MOUSE)
tail = "tajaran_brown"
tail_type = "tajaran"
attack_verb = "scratches"
punch_damage = 2 //Claws add 3 damage without gloves, so the total is 5
cold_level_1 = 200 //Default 260
cold_level_2 = 140 //Default 200
cold_level_3 = 80 //Default 120
heat_level_1 = 330 //Default 360
heat_level_2 = 380 //Default 400
heat_level_3 = 800 //Default 1000
primitive = /mob/living/carbon/monkey/tajara
flags = WHITELISTED
anatomy_flags = HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL | HAS_SWEAT_GLANDS | HAS_ICON_SKIN_TONE
default_mutations=list(M_CLAWS)
footprint_type = /obj/effect/decal/cleanable/blood/tracks/footprints/catbeast
flesh_color = "#AFA59E"
max_skin_tone = 1
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"liver" = /datum/organ/internal/liver,
"kidneys" = /datum/organ/internal/kidney,
"brain" = /datum/organ/internal/brain,
"appendix" = /datum/organ/internal/appendix,
"eyes" = /datum/organ/internal/eyes/tajaran
)
head_icons = 'icons/mob/species/tajaran/head.dmi'
wear_suit_icons = 'icons/mob/species/tajaran/suit.dmi'
/datum/species/tajaran/New()
..()
speech_filter = new /datum/speech_filter/tajaran
/datum/species/tajaran/handle_post_spawn(var/mob/living/carbon/human/H)
if(myhuman != H)
return
updatespeciescolor(H)
H.update_icon()
/datum/species/tajaran/updatespeciescolor(mob/living/carbon/human/tajaran)
var/datum/organ/external/tail/tajaran_tail = tajaran.get_cosmetic_organ(COSMETIC_ORGAN_TAIL)
switch(tajaran.my_appearance.s_tone)
if(CATBEASTBLACK)
icobase = 'icons/mob/human_races/r_tajaranblack.dmi'
deform = 'icons/mob/human_races/r_def_tajaranblack.dmi'
tajaran.my_appearance.h_style = "Black Tajaran Ears"
else
icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
tajaran.my_appearance.h_style = "Tajaran Ears"
if(tajaran_tail && (tajaran_tail.status & ORGAN_DESTROYED))
return
tajaran_tail.update_tail(tajaran)
/datum/species/tajaran/handle_speech(var/datum/speech/speech, mob/living/carbon/human/H)
if (prob(15))
speech.message = ""
if (prob(50))
speech.message = pick("GOD, PLEASE", "NO, GOD", "AGGGGGGGH") + " "
speech.message += pick("KILL ME", "END MY SUFFERING", "I CAN'T DO THIS ANYMORE")
return ..()
/datum/species/grey // /vg/
name = "Grey"
icobase = 'icons/mob/human_races/grey/r_grey.dmi'
deform = 'icons/mob/human_races/grey/r_def_grey.dmi'
known_languages = list(LANGUAGE_GREY)
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/grey
eyes = "grey_eyes_s"
max_hurt_damage = 3 // From 5 (for humans)
tacklePower = 25
power_multiplier = 0.8
blood_color = "#CFAAAA"
flesh_color = "#B5B5B5"
max_skin_tone = 4
primitive = /mob/living/carbon/monkey/grey
flags = PLAYABLE | WHITELISTED
anatomy_flags = HAS_LIPS | HAS_SWEAT_GLANDS | ACID4WATER | HAS_ICON_SKIN_TONE
spells = list(/spell/targeted/telepathy)
//PLEASE IF YOU MAKE A NEW RACE, KEEP IN MIND PEOPLE WILL PROBABLY MAKE UNIFORM SPRITES.
uniform_icons = 'icons/mob/species/grey/uniform.dmi'
// fat_uniform_icons = 'icons/mob/uniform_fat.dmi'
// gloves_icons = 'icons/mob/gloves.dmi'
glasses_icons = 'icons/mob/species/grey/eyes.dmi'
// ears_icons = 'icons/mob/ears.dmi'
// shoes_icons = 'icons/mob/shoes.dmi'
head_icons = 'icons/mob/species/grey/head.dmi'
// belt_icons = 'icons/mob/belt.dmi'
wear_suit_icons = 'icons/mob/species/grey/suit.dmi'
wear_mask_icons = 'icons/mob/species/grey/masks.dmi'
// back_icons = 'icons/mob/back.dmi'
has_mutant_race = 0
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"liver" = /datum/organ/internal/liver,
"kidneys" = /datum/organ/internal/kidney,
"brain" = /datum/organ/internal/brain,
"appendix" = /datum/organ/internal/appendix,
"eyes" = /datum/organ/internal/eyes/grey
)
species_intro = "You are a Grey.<br>\
You are particularly allergic to water, which acts like acid to you, but the inverse is so for acid, so you're fun at parties.<br>\
You're not as good at swinging a toolbox or throwing a punch as a baseline human, but you make up for this by bullying them from afar by talking directly into peoples minds."
/datum/species/grey/makeName(var/gender,var/mob/living/carbon/human/H=null) // Grey names are hard to pin down. Some have surnames, some lack surnames. And due to their long period of contact with humanity, a few have more humanized names
if(prob(90)) // More alien sounding name
switch(rand(0,1))
if(0) // No surname. Maybe we're a clone who has forgotten it, or we don't care
if(gender==FEMALE)
return capitalize(pick(grey_first_female))
else
return capitalize(pick(grey_first_male))
if(1) // Surname present. Maybe we held on to one for sentimental reasons, or wanted to feel more important
if(gender==FEMALE)
return capitalize(pick(grey_first_female)) + " " + capitalize(pick(grey_last))
else
return capitalize(pick(grey_first_male)) + " " + capitalize(pick(grey_last))
else // More humanized name
if(gender==FEMALE)
return capitalize(pick(grey_first_female_h)) + " " + capitalize(pick(grey_last_h))
else
return capitalize(pick(grey_first_male_h)) + " " + capitalize(pick(grey_last_h))
/datum/species/grey/handle_post_spawn(var/mob/living/carbon/human/H)
if(myhuman != H)
return
updatespeciescolor(H)
H.update_icon()
/datum/species/grey/updatespeciescolor(var/mob/living/carbon/human/H)
switch(H.my_appearance.s_tone)
if(4)
icobase = 'icons/mob/human_races/grey/r_greyblue.dmi'
deform = 'icons/mob/human_races/grey/r_def_greyblue.dmi'
if(3)
icobase = 'icons/mob/human_races/grey/r_greygreen.dmi'
deform = 'icons/mob/human_races/grey/r_def_greygreen.dmi'
if(2)
icobase = 'icons/mob/human_races/grey/r_greylight.dmi'
deform = 'icons/mob/human_races/grey/r_def_greylight.dmi'
else
icobase = 'icons/mob/human_races/grey/r_grey.dmi'
deform = 'icons/mob/human_races/grey/r_def_grey.dmi'
/datum/species/muton // /vg/
name = "Muton"
icobase = 'icons/mob/human_races/r_muton.dmi'
deform = 'icons/mob/human_races/r_def_muton.dmi'
//known_languages = list("Muton") //this language doesn't even EXIST
eyes = "eyes_s"
max_hurt_damage = 10
tacklePower = 90
primitive = /mob/living/carbon/monkey // TODO
anatomy_flags = HAS_LIPS | HAS_SWEAT_GLANDS
// Both must be set or it's only a 45% chance of manifesting.
default_mutations=list(M_STRONG | M_RUN | M_LOUD)
default_block_names=list("STRONGBLOCK","LOUDBLOCK","INCREASERUNBLOCK")
has_mutant_race = 0
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"liver" = /datum/organ/internal/liver,
"kidneys" = /datum/organ/internal/kidney,
"brain" = /datum/organ/internal/brain,
"appendix" = /datum/organ/internal/appendix,
"eyes" = /datum/organ/internal/eyes/muton
)
move_speed_mod = 1
/datum/species/muton/final_equip(var/mob/living/carbon/human/H)
// Unequip existing suits and hats.
H.u_equip(H.wear_suit,1)
H.u_equip(H.head,1)
move_speed_mod = 1
/datum/species/skrell
name = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
known_languages = list(LANGUAGE_SKRELLIAN)
primitive = /mob/living/carbon/monkey/skrell
flags = WHITELISTED
anatomy_flags = HAS_LIPS | HAS_UNDERWEAR | HAS_SWEAT_GLANDS
flesh_color = "#8CD7A3"
head_icons = 'icons/mob/species/skrell/head.dmi'
wear_suit_icons = 'icons/mob/species/skrell/suit.dmi'
/datum/species/diona
name = "Diona"
icobase = 'icons/mob/human_races/r_plant.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi'
known_languages = list(LANGUAGE_ROOTSPEAK)
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/diona
attack_verb = "slashes"
punch_damage = 5
tacklePower = 65
tackleRange = 1
primitive = /mob/living/carbon/monkey/diona
spells = list(/spell/targeted/transfer_reagents)
warning_low_pressure = 50
hazard_low_pressure = -1
cold_level_1 = 50
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = T0C + 50
heat_level_2 = T0C + 75
heat_level_3 = T0C + 100
flags = WHITELISTED | PLAYABLE | NO_BREATHE | REQUIRE_LIGHT | IS_PLANT | RAD_ABSORB | IS_SLOW | NO_PAIN | HYPOTHERMIA_IMMUNE
anatomy_flags = NO_BLOOD | HAS_SWEAT_GLANDS
blood_color = "#004400"
flesh_color = "#907E4A"
has_mutant_race = 0
burn_mod = 2.5 //treeeeees
move_speed_mod = 4
species_intro = "You are a Diona.<br>\
You are a plant, so light is incredibly helpful for you, in both photosynthesis, and regenerating damage you have received.<br>\
You absorb radiation which helps you in a similar way to sunlight. Your rigid, wooden limbs make you incredibly slow.<br>\
You do not need to breathe, do not feel pain, you are incredibly resistant to cold and low pressure, and have no blood to bleed.<br>\
However, as you are a plant, you are incredibly susceptible to burn damage, which is something you can not regenerate normally.<br>\
Your liver is special. It converts a portion of what you ingest into ammonia. You can use your transfer reagents spell to inject plants."
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"liver" = /datum/organ/internal/liver/diona,
"kidneys" = /datum/organ/internal/kidney,
"brain" = /datum/organ/internal/brain,
"appendix" = /datum/organ/internal/appendix,
"eyes" = /datum/organ/internal/eyes
)
/datum/species/golem
name = "Golem"
icobase = 'icons/mob/human_races/r_golem.dmi'
deform = 'icons/mob/human_races/r_def_golem.dmi'
known_languages = list(LANGUAGE_GOLEM)
meat_type = /obj/item/stack/ore/diamond
attack_verb = "punches"
tacklePower = 70
tackleRange = 1
flags = NO_BREATHE | NO_PAIN | HYPOTHERMIA_IMMUNE
anatomy_flags = HAS_LIPS | NO_SKIN | NO_BLOOD | IS_BULKY | NO_STRUCTURE
uniform_icons = 'icons/mob/uniform_fat.dmi'
primitive = /mob/living/carbon/monkey/rock
gender = NEUTER
blood_color = "#B4DBCB"
flesh_color = "#B4DBCB"
warning_low_pressure = -1
hazard_low_pressure = -1
body_temperature = 0
cold_level_1 = -1 // Cold damage level 1 below this point.
cold_level_2 = -1 // Cold damage level 2 below this point.
cold_level_3 = -1 // Cold damage level 3 below this point.
heat_level_1 = 3600
heat_level_2 = 4000
heat_level_3 = 10000
burn_mod = 0.0001
has_mutant_race = 0
move_speed_mod = 1
default_mutations = list(M_STONE_SKIN)
chem_flags = NO_INJECT
has_organ = list(
"brain" = /datum/organ/internal/brain,
)
/datum/species/golem/makeName()
return capitalize(pick(golem_names))
var/list/has_died_as_golem = list()
/datum/species/golem/handle_death(var/mob/living/carbon/human/H, gibbed) //Handles any species-specific death events (such as dionaea nymph spawns).
if(!isgolem(H))
return
var/datum/mind/golemmind = H.mind
if(!istype(golemmind,/datum/mind)) //not a mind
golemmind = null
for(var/atom/movable/I in H.contents)
I.forceMove(H.loc)
anim(target = H, a_icon = 'icons/mob/mob.dmi', flick_anim = "dust-g", sleeptime = 15)
var/mob/living/adamantine_dust/A = new(H.loc)
if(golemmind)
has_died_as_golem[H.mind.key] = world.time
A.mind = golemmind
H.mind = null
golemmind.current = A
if(H.real_name)
A.real_name = H.real_name
A.desc = "The remains of what used to be [A.real_name]."
A.key = H.key
/datum/species/golem/can_artifact_revive()
return FALSE
/datum/species/golem/gib(var/mob/living/carbon/human/H, animation, meat)
if(H.status_flags & BUDDHAMODE)
H.adjustBruteLoss(200)
return
if(!H.isUnconscious())
H.forcesay("-")
H.death(1)
H.handle_body_destroyed()
var/gib_radius = 0
if(H.reagents.has_reagent(LUBE))
gib_radius = 6
hgibs(H.loc, H.virus2, H.dna, flesh_color, blood_color, gib_radius)
spawn()
qdel(H)
/datum/species/golem/dust(var/mob/living/carbon/human/H, drop_everything)
if(!H.isUnconscious())
H.forcesay("-")
H.death(1)
H.handle_body_destroyed()
if(drop_everything)
H.drop_all()
spawn()
qdel(H)
/mob/living/adamantine_dust //serves as the corpse of adamantine golems
name = "adamantine dust"
desc = "The remains of an adamantine golem."
stat = DEAD
icon = 'icons/mob/human_races/r_golem.dmi'
icon_state = "golem_dust"
density = 0
meat_type = /obj/item/stack/ore/diamond
/mob/living/adamantine_dust/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/slime_extract/adamantine))
var/obj/item/slime_extract/adamantine/A = I
if(A.Uses)
if(!mind)
to_chat(user, "<span class='warning'>You press \the [A] into \the [src], but nothing happens.</span>")
else
if(!client)
to_chat(user, "<span class='notice'>As you press \the [A] into \the [src], it shudders briefly, but falls still.</span>")
ghost_reenter_alert("Someone is trying to resurrect you. Return to your body if you want to live again!")
else
anim(target = src, a_icon = 'icons/mob/mob.dmi', flick_anim = "reverse-dust-g", sleeptime = 15)
var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem
if(!real_name)
real_name = G.species.makeName()
to_chat(user, "<span class='notice'>As you press \the [A] into \the [src], it is consumed. [real_name] reconstitutes itself!.</span>")
qdel(A)
G.real_name = real_name
G.forceMove(src.loc) //we use move to get the entering procs - this fixes gravity
var/datum/mind/dustmind = mind
G.mind = dustmind
dustmind.current = G
mind = null
G.key = key
to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as impervious to burn damage. You are unable to wear most clothing, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.")
qdel(src)
else
to_chat(user, "<span class='warning'>The used extract doesn't have any effect on \the [src].</span>")
/datum/species/vampire
name = "Vampire"
icobase = 'icons/mob/human_races/r_grue.dmi' // Normal icon set.
deform = 'icons/mob/human_races/r_def_grue.dmi' // Mutated icon set.
attack_verb = "claws"
flags = HYPOTHERMIA_IMMUNE
anatomy_flags = HAS_LIPS
punch_damage = 7
default_mutations=list(M_CLAWS,M_TALONS)
has_mutant_race = 0
primitive = /mob/living/carbon/monkey //Just to keep them SoC friendly.
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"liver" = /datum/organ/internal/liver,
"kidneys" = /datum/organ/internal/kidney,
"brain" = /datum/organ/internal/brain,
"appendix" = /datum/organ/internal/appendix,
"eyes" = /datum/organ/internal/eyes/monstrous
)
/datum/species/vampire/makeName()
return "vampire"
/datum/species/ghoul
name = "Ghoul"
icobase = 'icons/mob/human_races/r_ghoul.dmi'
deform = 'icons/mob/human_races/r_skeleton.dmi' //It's thin leathery skin on top of bone, deformation's just gonna show bone
flags = NO_PAIN | WHITELISTED | RAD_ABSORB
anatomy_flags = HAS_LIPS | HAS_SWEAT_GLANDS
has_mutant_race = 0
burn_mod = 1.2
brute_mod = 0.8
move_speed_multiplier = 2
blood_color = GHOUL_BLOOD
primitive = /mob/living/carbon/monkey //Just to keep them SoC friendly.
/datum/species/slime
name = "Slime"
icobase = 'icons/mob/human_races/r_slime.dmi'
deform = 'icons/mob/human_races/r_def_slime.dmi'
known_languages = list(LANGUAGE_SLIME)
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slime
attack_verb = "glomps"
tacklePower = 35
flags = WHITELISTED | NO_BREATHE | ELECTRIC_HEAL
anatomy_flags = NO_SKIN | NO_BLOOD | NO_BONES | NO_STRUCTURE | MULTICOLOR
spells = list(/spell/regen_limbs)
gender = NEUTER
tox_mod = 2
primitive = /mob/living/carbon/slime/pygmy
blood_color = "#96FFC5"
flesh_color = "#96FFC5"
cold_level_1 = T0C // Cold damage level 1 below this point.
cold_level_2 = T0C-23 // Cold damage level 2 below this point.
cold_level_3 = T0C-43 // Cold damage level 3 below this point.
heat_level_1 = T0C+57 // Heat damage level 1 above this point.
heat_level_2 = T0C+77 // Heat damage level 2 above this point.
heat_level_3 = T0C+100 // Heat damage level 3 above this point.
has_mutant_race = 0
has_organ = list(
"brain" = /datum/organ/internal/brain/slime_core,
)
/datum/species/slime/handle_death(var/mob/living/carbon/human/H, gibbed) //Handles any species-specific death events (such as dionaea nymph spawns).
H.dropBorers(gibbed)
H.unequip_everything()
anim(target = H, a_icon = 'icons/mob/mob.dmi', flick_anim = "liquify", sleeptime = 15)
if(!gibbed)
handle_slime_puddle(H)
/datum/species/slime/gib(mob/living/carbon/human/H)
handle_slime_puddle(H)
..()
H.monkeyizing = TRUE
for(var/datum/organ/external/E in H.organs)
if(istype(E, /datum/organ/external/chest) || istype(E, /datum/organ/external/groin) || istype(E, /datum/organ/external/head))
continue
//Only make the limb drop if it's not too damaged
if(prob(100 - E.get_damage()))
//Override the current limb status and don't cause an explosion
E.droplimb(1, 1)
var/gib_radius = 0
if(H.reagents.has_reagent(LUBE))
gib_radius = 6
anim(target = H, a_icon = 'icons/mob/mob.dmi', flick_anim = "gibbed-h", sleeptime = 15)
hgibs(H.loc, H.virus2, H.dna, flesh_color, blood_color, gib_radius)
/datum/species/slime/proc/handle_slime_puddle(var/mob/living/carbon/human/H)
if(!H)
return
var/mob/living/slime_pile/S = new(H.loc)
if(H.real_name)
S.real_name = H.real_name
S.name = "puddle of [H.real_name]"
S.desc = "The slimy remains of what used to be [S.real_name]. There's probably still enough genetic material in there for a cloning console to work its magic."
S.slime_person = H
H.forceMove(S)
//Transfer the DNA and mind into the slime puddle.
S.dna=H.dna
S.mind=H.mind
/mob/living/slime_pile //serves as the corpse of slime people
name = "puddle of slime"
desc = "The remains of a slime person."
stat = DEAD
icon = null //'icons/mob/human_races/r_slime.dmi'
icon_state = null //"slime_puddle"
density = 0
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slime
var/mob/living/carbon/human/slime_person
/mob/living/slime_pile/New()
..()
spawn(1)
update_icon()
/mob/living/slime_pile/update_icon()
if(slime_person)
var/icon/I = new ('icons/mob/human_races/r_slime.dmi', "slime_puddle")
I.Blend(rgb(slime_person.multicolor_skin_r, slime_person.multicolor_skin_g, slime_person.multicolor_skin_b), ICON_ADD)
overlays += I
/mob/living/slime_pile/attack_hand(mob/user)
if(slime_person)
var/datum/organ/external/head = slime_person.get_organ(LIMB_HEAD)
var/datum/organ/internal/I = slime_person.internal_organs_by_name["brain"]
var/obj/item/organ/internal/O
if(I && istype(I))
O = I.remove(user)
if(O && istype(O))
O.organ_data.rejecting = null
slime_person.internal_organs_by_name["brain"] = null
slime_person.internal_organs_by_name -= "brain"
slime_person.internal_organs -= O.organ_data
head.internal_organs -= O.organ_data
O.removed(slime_person,user)
user.put_in_hands(O)
to_chat(user, "<span class='notice'>You remove \the [O] from \the [src].</span>")
else
to_chat(user, "<span class='notice'>You root around inside \the [src], but find nothing.</span>")
/mob/living/slime_pile/attackby(obj/item/I, mob/user)
if(slime_person)
if(istype(I, /obj/item/organ/internal/brain/slime_core))
if(slime_person.internal_organs_by_name["brain"])
to_chat(user, "<span class='notice'>There is already \a [I] in \the [src].</span>")
return
if(user.drop_item(I))
var/datum/organ/external/head = slime_person.get_organ(LIMB_HEAD)
var/obj/item/organ/internal/O = I
if(istype(O))
O.organ_data.transplant_data = list()
O.organ_data.transplant_data["species"] = slime_person.species.name
O.organ_data.transplant_data["blood_type"] = slime_person.dna.b_type
O.organ_data.transplant_data["blood_DNA"] = slime_person.dna.unique_enzymes
O.organ_data.owner = slime_person
slime_person.internal_organs |= O.organ_data
head.internal_organs |= O.organ_data
slime_person.internal_organs_by_name[O.organ_tag] = O.organ_data
O.organ_data.status |= ORGAN_CUT_AWAY
O.replaced(slime_person)
to_chat(user, "<span class='notice'>You place \the [O] into \the [src].</span>")
O.stabilized = TRUE
O.loc = null
/datum/species/insectoid
name = "Insectoid"
icobase = 'icons/mob/human_races/r_insectoid.dmi'
deform = 'icons/mob/human_races/r_def_insectoid.dmi'
eyes = "insectoid_eyes_m"
known_languages = list(LANGUAGE_INSECT)
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/insectoid
primitive = /mob/living/carbon/monkey/roach
flags = WHITELISTED | PLAYABLE
anatomy_flags = HAS_LIPS | HAS_SWEAT_GLANDS | NO_BALD | RGBSKINTONE
burn_mod = 1.1
tox_mod = 0.5
rad_mod = 0.5
blood_color = INSECT_BLOOD
flesh_color = "#9C7F25"
uniform_icons = 'icons/mob/species/insectoid/uniform.dmi'
// fat_uniform_icons = 'icons/mob/uniform_fat.dmi'
gloves_icons = 'icons/mob/species/vox/gloves.dmi'
glasses_icons = 'icons/mob/species/insectoid/eyes.dmi'
ears_icons = 'icons/mob/species/insectoid/ears.dmi'
shoes_icons = 'icons/mob/species/insectoid/feet.dmi'
head_icons = 'icons/mob/species/insectoid/head.dmi'
// belt_icons = 'icons/mob/belt.dmi'
wear_suit_icons = 'icons/mob/species/insectoid/suit.dmi'
wear_mask_icons = 'icons/mob/species/insectoid/mask.dmi'
// back_icons = 'icons/mob/back.dmi'
has_mutant_race = 0
has_organ = list(
"heart" = /datum/organ/internal/heart/insect,
"lungs" = /datum/organ/internal/lungs,
"liver" = /datum/organ/internal/liver,
"kidneys" = /datum/organ/internal/kidney,
"brain" = /datum/organ/internal/brain,
"eyes" = /datum/organ/internal/eyes/compound/
)
species_intro = "You are an Insectoid.<br>\
Your body is highly resistant to the initial effects of radiation exposure, and you'll be better able to defend against toxic chemicals. <br>\
However, your body is more susceptible to heat than that of other species. Resilient though you may be, heat and flame are your biggest concern."
/datum/species/insectoid/New()
..()
speech_filter = new /datum/speech_filter/insectoid
/datum/species/insectoid/makeName(var/gender,var/mob/living/carbon/human/H=null)
var/sounds = rand(2,3)
var/newname = ""
for(var/i = 1 to sounds)
newname += pick(insectoid_name_syllables)
return capitalize(newname)
/datum/species/mushroom
name = "Mushroom"
icobase = 'icons/mob/human_races/r_mushman.dmi'
deform = 'icons/mob/human_races/r_mushman.dmi'
eyes = "mushroom_eyes"
known_languages = list(LANGUAGE_VOX)
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/hugemushroomslice/mushroom_man
flags = WHITELISTED | PLAYABLE | NO_BREATHE | IS_PLANT | SPECIES_NO_MOUTH
anatomy_flags = NO_BALD
gender = NEUTER
tox_mod = 0.8
brute_mod = 1.8
burn_mod = 0.6
primitive = /mob/living/carbon/monkey/mushroom
spells = list(/spell/targeted/genetic/invert_eyes, /spell/targeted/telepathy)
default_mutations=list() //exoskeleton someday...
blood_color = MUSHROOM_BLOOD
flesh_color = "#D3D3D3"
//Copypaste of Dionae
cold_level_1 = 50
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = T0C + 50
heat_level_2 = T0C + 75
heat_level_3 = T0C + 100
// uniform_icons = 'icons/mob/species/mushroom/uniform.dmi'
// fat_uniform_icons = 'icons/mob/uniform_fat.dmi'
// gloves_icons = 'icons/mob/species/vox/gloves.dmi'
// glasses_icons = 'icons/mob/species/vox/eyes.dmi'
// ears_icons = 'icons/mob/ears.dmi'
// shoes_icons = 'icons/mob/species/vox/shoes.dmi'
head_icons = 'icons/mob/species/mushroom/head.dmi'
// belt_icons = 'icons/mob/belt.dmi'
wear_suit_icons = 'icons/mob/species/mushroom/suit.dmi'
// wear_mask_icons = 'icons/mob/species/mushroom/masks.dmi'
// back_icons = 'icons/mob/back.dmi'
has_mutant_race = 0
has_organ = list(
"brain" = /datum/organ/internal/brain/mushroom_brain,
"eyes" = /datum/organ/internal/eyes/mushroom,
)
species_intro = "You are a Mushroom Person.<br>\
You are an odd creature. Your lack of a mouth prevents you from eating, but you can stand or lay on food to absorb it.<br>\
You have a resistance to burn and toxin, but you are vulnerable to brute attacks.<br>\
You are adept at seeing in the dark, moreso with your light inversion ability. When you speak, it will only go to the targets chosen with your Fungal Telepathy.<br>\
You also have access to the Sporemind, which allows you to communicate with others on the Sporemind through :~"
var/mob/living/telepathic_target[] = list()
var/telepathy_type = LOCAL_TELEPATHY
/datum/species/mushroom/makeName()
return capitalize(pick(mush_first)) + " " + capitalize(pick(mush_last))
/datum/species/mushroom/silent_speech(mob/M, message)
if(!message)
return
if(M.stat == DEAD)
to_chat(M, "<span class='warning'>You must be alive to do this!</span>")
return
if (M.stat == UNCONSCIOUS)
to_chat(M, "<span class='warning'>You must be conscious to do this!</span>")
return
if(telepathy_type & (LOCAL_TELEPATHY | GLOBAL_TELEPATHY))
telepathic_target.len = 0
var/list/possible_targets = M.mind.heard_before
var/datum/mind/temp_target
for(var/T in possible_targets)
temp_target = possible_targets[T]
if(!temp_target.current || ((telepathy_type & LOCAL_TELEPATHY) && !(get_dist(temp_target.current, M) <= SPEECH_RANGE)))
continue
telepathic_target += temp_target.current
if(!telepathic_target.len)
var/mob/living/L = M
telepathic_target += L
var/all_switch = TRUE
for(var/mob/living/T in telepathic_target)
if(istype(T) && M.can_mind_interact(T))
to_chat(T,"<span class='mushroom'>You feel <b>[M]</b>'s thoughts: </span><span class='mushroom'>[message]</span>")
if(all_switch)
all_switch = FALSE
if(T != M)
to_chat(M,"<span class='mushroom'>Projected to <b>[english_list(telepathic_target)]</b>: \"[message]\"</span>")
for(var/mob/dead/observer/G in dead_mob_list)
G.show_message("<i>Telepathy, <b>[M]</b> to <b>[english_list(telepathic_target)]</b>: [message]</i>")
log_admin("[key_name(M)] projects his mind towards [english_list(telepathic_target)]: [message]")
/datum/species/lich
name = "Undead"
icobase = 'icons/mob/human_races/r_lich.dmi'
deform = 'icons/mob/human_races/r_lich.dmi'
known_languages = list(LANGUAGE_CLATTER)
flags = WHITELISTED | NO_BREATHE
anatomy_flags = HAS_LIPS | NO_SKIN | NO_BLOOD
meat_type = /obj/item/stack/sheet/bone
chem_flags = NO_EAT | NO_INJECT
brute_mod = 1.2
has_organ = list(
"brain" = /datum/organ/internal/brain,
)
move_speed_multiplier = 1
primitive = /mob/living/carbon/monkey/skellington
species_intro = "You are a Lich<br>\
A more refined version of the skellington, you're not as brittle, but not quite as fast.<br>\
You have no skin, no blood, and only a brain to guide you.<br>\
You can not eat normally, as your necrotic state permits you to only eat raw flesh. As you lack skin, you can not be injected via syringe."
damage_overlays = list()
/datum/species/lich/gib(mob/living/carbon/human/H)
..()
var/datum/organ/external/head_organ = H.get_organ(LIMB_HEAD)
if(head_organ.status & ORGAN_DESTROYED)
new /obj/effect/decal/remains/human/noskull(H.loc)
else
new /obj/effect/decal/remains/human(H.loc)
head_organ.droplimb(1,1)
H.drop_all()
qdel(src)