mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Xenomorph Hybrids species (#6893)
This commit is contained in:
@@ -47,4 +47,251 @@
|
||||
|
||||
breath_heat_level_1 = 430 //Default 380 - Higher is better
|
||||
breath_heat_level_2 = 510 //Default 450
|
||||
breath_heat_level_3 = 1200 //Default 1250
|
||||
breath_heat_level_3 = 1200 //Default 1250
|
||||
|
||||
|
||||
/datum/species/xenomorph_hybrid
|
||||
name = SPECIES_XENOMORPH_HYBRID
|
||||
name_plural = "Xenomorph Hybrids"
|
||||
icobase = 'modular_chomp/icons/mob/human_races/r_xenomorph_hybrid.dmi'
|
||||
deform = 'modular_chomp/icons/mob/human_races/r_xenomorph_hybrid.dmi'
|
||||
tail = "tail"
|
||||
icobase_tail = 1
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) // Innate claws and bite.
|
||||
darksight = 8 // Same as Tajarans.
|
||||
ambiguous_genders = TRUE
|
||||
slowdown = -0.2 // Slightly faster than average.
|
||||
total_health = 150 // Takes a lot of effort to take a Xenomorph down.
|
||||
brute_mod = 0.90 // Physical damage doesn't phase them as much.
|
||||
burn_mod = 1.40 // They do NOT like fire.
|
||||
toxins_mod = 0.90 // Slightly resistant to toxins.
|
||||
radiation_mod = 0.7 // Quite resistant to radiation exposure.
|
||||
flash_mod = 1.1 // Flashes are slightly more effective.
|
||||
metabolic_rate = 1.2 // Very physically active species, thus requiring more nutritional intake.
|
||||
item_slowdown_mod = 0.90 // They carry heavy things slightly better.
|
||||
mob_size = MOB_MEDIUM // Technically doesn't even need this but still adding the override just in case.
|
||||
blood_volume = 640 // More blood to compound their high health.
|
||||
bloodloss_rate = 0.90 // Bleed slightly slower.
|
||||
num_alternate_languages = 3
|
||||
name_language = LANGUAGE_XENOLINGUA
|
||||
species_language = LANGUAGE_XENOLINGUA
|
||||
secondary_langs = list(LANGUAGE_XENOLINGUA, LANGUAGE_HIVEMIND)
|
||||
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN) // Can use the Hivemind language.
|
||||
color_mult = 1
|
||||
health_hud_intensity = 1.5
|
||||
chem_strength_alcohol = 1.2 // They don't handle their drinks very well.
|
||||
throwforce_absorb_threshold = 10 // Heavy.
|
||||
|
||||
economic_modifier = 5 // While they aren't true Xenomorphs, they still draw a lot of social stigma, and are generally mistreated and underpaid as a result.
|
||||
rarity_value = 4 // Very rare to find these guys on human stations.
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
flesh_color = "##242424"
|
||||
blood_color = "##00C202"
|
||||
base_color = "##242424"
|
||||
|
||||
blurb = "Xenomorph Hybrids are a strange amalgamation of xenomorph and alternative-species DNA of \
|
||||
disputed origin. While hybrids share many traits with their species's namesake, the vast majority \
|
||||
are no less docile or aggressive than the vast majority of spacefaring races. Even still, their unsettling appearance, \
|
||||
demeanour and innate xenomorph-inherited abilities are enough to draw widespread ire and distrust."
|
||||
|
||||
min_age = 18
|
||||
max_age = 300 // Big number lol
|
||||
|
||||
move_trail = /obj/effect/decal/cleanable/blood/tracks/claw
|
||||
digi_allowed = TRUE
|
||||
icodigi = 'modular_chomp/icons/mob/human_races/r_digi_xeno.dmi'
|
||||
|
||||
species_sounds = "Xeno"
|
||||
gender_specific_species_sounds = FALSE
|
||||
|
||||
has_limbs = list(
|
||||
BP_TORSO = list("path" = /obj/item/organ/external/chest),
|
||||
BP_GROIN = list("path" = /obj/item/organ/external/groin),
|
||||
BP_HEAD = list("path" = /obj/item/organ/external/head),
|
||||
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
|
||||
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
|
||||
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
|
||||
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
|
||||
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
|
||||
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
|
||||
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
|
||||
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
|
||||
)
|
||||
|
||||
// Some Xeno parts included.
|
||||
has_organ = list(
|
||||
O_HEART = /obj/item/organ/internal/heart,
|
||||
O_LUNGS = /obj/item/organ/internal/lungs,
|
||||
O_LIVER = /obj/item/organ/internal/liver,
|
||||
O_BRAIN = /obj/item/organ/internal/brain,
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_KIDNEYS = /obj/item/organ/internal/kidneys,
|
||||
O_APPENDIX = /obj/item/organ/internal/appendix,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine,
|
||||
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/weak, // Less plasma capacity.
|
||||
O_HIVE = /obj/item/organ/internal/xenos/hivenode, // Lets them speak Hivemind and open resin doors.
|
||||
O_RESIN = /obj/item/organ/internal/xenos/resinspinner/weak // Weaker weed nodes with less spread range.
|
||||
)
|
||||
|
||||
|
||||
heat_discomfort_level = 303.15 // 30 Celsius, not so comfortable in high temperatures.
|
||||
heat_discomfort_strings = list(
|
||||
"Our carapace bristles in the heat."
|
||||
)
|
||||
|
||||
cold_discomfort_level = 263.15 // -10 Celsius, comfortable in below freezing temperatures.
|
||||
cold_discomfort_strings = list(
|
||||
"The cold bites through our carapace."
|
||||
)
|
||||
|
||||
var/weeds_plasma_rate = 3 // Plasma regen. Much lower than actual xenos. Faster on weeds.
|
||||
var/weeds_heal_rate = 0.5 // Health regen on weeds. No healing unless resting.
|
||||
|
||||
/datum/species/xenomorph_hybrid/handle_environment_special(var/mob/living/carbon/human/H)
|
||||
|
||||
var/turf/T = H.loc
|
||||
if(!T) return
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
if(!environment) return
|
||||
|
||||
if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T)
|
||||
if(!regenerate(H))
|
||||
var/obj/item/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name[O_PLASMA]
|
||||
P.stored_plasma += weeds_plasma_rate
|
||||
P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma)
|
||||
..()
|
||||
|
||||
/datum/species/xenomorph_hybrid/proc/regenerate(var/mob/living/carbon/human/H)
|
||||
var/heal_rate = weeds_heal_rate
|
||||
var/mend_prob = 5 // Much lower than regular xenos.
|
||||
if (!H.resting)
|
||||
heal_rate = 0 // No passive health regen without resting.
|
||||
mend_prob = 0 // No passive health regen without resting.
|
||||
|
||||
//first heal damages
|
||||
if (H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss())
|
||||
H.adjustBruteLoss(-heal_rate)
|
||||
H.adjustFireLoss(-heal_rate)
|
||||
H.adjustOxyLoss(-heal_rate)
|
||||
H.adjustToxLoss(-heal_rate)
|
||||
if (prob(5))
|
||||
to_chat(H, "<span class='alien'>A soothing sensation falls over us...</span>")
|
||||
return 1
|
||||
|
||||
//next internal organs
|
||||
for(var/obj/item/organ/I in H.internal_organs)
|
||||
if(I.damage > 0)
|
||||
I.damage = max(I.damage - heal_rate, 0)
|
||||
if (prob(5))
|
||||
to_chat(H, "<span class='alien'>We feel a soothing sensation within our [I.parent_organ]...</span>")
|
||||
return 1
|
||||
|
||||
//next mend broken bones. May remove this if it's abused.
|
||||
for(var/obj/item/organ/external/E in H.bad_external_organs)
|
||||
if (E.status & ORGAN_BROKEN)
|
||||
if (prob(mend_prob))
|
||||
if (E.mend_fracture())
|
||||
to_chat(H, "<span class='alien'>We feel something mend within our [E.name].</span>")
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/// WEAKER XENOMORPH HYBRID ABILITIES / ORGANS. ///
|
||||
|
||||
// ABILITIES //
|
||||
|
||||
/mob/living/carbon/human/proc/plant_weak()
|
||||
set name = "Plant Weeds (150)"
|
||||
set desc = "Plants some alien weeds."
|
||||
set category = "Abilities"
|
||||
|
||||
if(check_alien_ability(150,1,O_RESIN))
|
||||
visible_message("<span class='alium'><B>[src] has planted some alien weeds!</B></span>")
|
||||
new /obj/effect/alien/weeds/node/weak(get_turf(src), null, "#321D37") // Aliens.dm for weed node origin.
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/check_plasma_amount(mob/living/carbon/human/M as mob)
|
||||
set name = "Check Plasma Reserves"
|
||||
set category = "Abilities"
|
||||
|
||||
var/obj/item/organ/internal/xenos/plasmavessel/I = M.internal_organs_by_name[O_PLASMA]
|
||||
if(!istype(I))
|
||||
to_chat(src, "<span class='alium'>Our plasma vessel is missing!</span>")
|
||||
return
|
||||
|
||||
to_chat(src, "Our plasma reserves are at [I.stored_plasma]/[I.max_plasma].")
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/proc/resin_weak() // Technically stronger in some aspects.
|
||||
set name = "Secrete Resin (25)"
|
||||
set desc = "Secrete tough, malleable resin in front of us."
|
||||
set category = "Abilities"
|
||||
|
||||
var/list/options = list("resin door","resin wall","resin membrane","nest","resin blob")
|
||||
for(var/option in options)
|
||||
LAZYSET(options, option, new /image('icons/mob/alien.dmi', option)) // based off 'icons/effects/thinktank_labels.dmi'
|
||||
|
||||
var/choice = show_radial_menu(src, src, options, radius = 42, require_near = TRUE)
|
||||
|
||||
if(!choice || QDELETED(src) || src.incapacitated())
|
||||
return FALSE
|
||||
|
||||
var/targetLoc = get_step(src, dir)
|
||||
|
||||
if(iswall(targetLoc))
|
||||
targetLoc = get_turf(src)
|
||||
|
||||
var/obj/O
|
||||
|
||||
switch(choice)
|
||||
if("resin door")
|
||||
if(!check_alien_ability(25,1,O_RESIN))
|
||||
return
|
||||
else O = new /obj/structure/simple_door/resin(targetLoc)
|
||||
if("resin wall")
|
||||
if(!check_alien_ability(25,1,O_RESIN))
|
||||
return
|
||||
else O = new /obj/structure/alien/wall(targetLoc)
|
||||
if("resin membrane")
|
||||
if(!check_alien_ability(25,1,O_RESIN))
|
||||
return
|
||||
else O = new /obj/structure/alien/membrane(targetLoc)
|
||||
if("nest")
|
||||
if(!check_alien_ability(25,1,O_RESIN))
|
||||
return
|
||||
else O = new /obj/structure/bed/nest(targetLoc)
|
||||
if("resin blob")
|
||||
if(!check_alien_ability(25,1,O_RESIN))
|
||||
return
|
||||
else O = new /obj/item/stack/material/resin(targetLoc)
|
||||
|
||||
if(O)
|
||||
visible_message("<span class='warning'><B>[src] vomits up a thick purple substance and begins to shape it!</B></span>", "<span class='alium'>You shape a [choice].</span>")
|
||||
O.color = "#321D37"
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
|
||||
|
||||
return
|
||||
|
||||
// ORGANS //
|
||||
|
||||
/obj/item/organ/internal/xenos/resinspinner/weak
|
||||
name = "resin spinner"
|
||||
parent_organ = BP_HEAD
|
||||
icon_state = "xenode"
|
||||
organ_tag = O_RESIN
|
||||
|
||||
organ_verbs = list(
|
||||
/mob/living/carbon/human/proc/resin_weak,
|
||||
/mob/living/carbon/human/proc/plant_weak,
|
||||
/mob/living/carbon/human/proc/check_plasma_amount
|
||||
)
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/weak
|
||||
name = "hybrid plasma vessel"
|
||||
stored_plasma = 250 // Starts with max plasma.
|
||||
max_plasma = 250 // Maximum of 250 plasma stored at any one time. Drones normally have 500.
|
||||
@@ -240,14 +240,31 @@
|
||||
icon = 'icons/mob/human_races/markings_digi_ch.dmi'
|
||||
icon_state = "xeno_digi"
|
||||
digitigrade_acceptance = MARKING_DIGITIGRADE_ONLY
|
||||
body_parts = list(BP_R_LEG)
|
||||
body_parts = list(BP_R_LEG, BP_R_FOOT)
|
||||
|
||||
/datum/sprite_accessory/marking/ch/xenomorph/digi_r_leg_hidden
|
||||
name = "Xenomorph right leg (digitigrade, hide)"
|
||||
icon = 'icons/mob/human_races/markings_digi_ch.dmi'
|
||||
icon_state = "xeno_digi"
|
||||
digitigrade_acceptance = MARKING_DIGITIGRADE_ONLY
|
||||
body_parts = list(BP_R_LEG, BP_R_FOOT)
|
||||
hide_body_parts = list(BP_R_LEG, BP_R_FOOT)
|
||||
|
||||
/datum/sprite_accessory/marking/ch/xenomorph/digi_l_leg
|
||||
name = "Xenomorph left leg (digitigrade)"
|
||||
icon = 'icons/mob/human_races/markings_digi_ch.dmi'
|
||||
icon_state = "xeno_digi"
|
||||
digitigrade_acceptance = MARKING_DIGITIGRADE_ONLY
|
||||
body_parts = list(BP_L_LEG)
|
||||
body_parts = list(BP_L_LEG, BP_L_FOOT)
|
||||
|
||||
/datum/sprite_accessory/marking/ch/xenomorph/digi_l_leg_hidden
|
||||
name = "Xenomorph left leg (digitigrade, hide)"
|
||||
icon = 'icons/mob/human_races/markings_digi_ch.dmi'
|
||||
icon_state = "xeno_digi"
|
||||
digitigrade_acceptance = MARKING_DIGITIGRADE_ONLY
|
||||
body_parts = list(BP_L_LEG, BP_L_FOOT)
|
||||
hide_body_parts = list(BP_L_LEG, BP_L_FOOT)
|
||||
|
||||
|
||||
// TORSOS //
|
||||
|
||||
|
||||
Reference in New Issue
Block a user