mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-19 19:15:11 +01:00
Split NO_SCAN into two flags (#17226)
* Split NO_SCAN into two flags * traits * species flags applied correctly by traits * fixed species flag toggling for traits * bold of you --------- Co-authored-by: Willburd <7099514+Willburd@users.noreply.github.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
// Species flags.
|
||||
#define NO_MINOR_CUT 0x1 // Can step on broken glass with no ill-effects. Either thick skin (diona), cut resistant (slimes) or incorporeal (shadows)
|
||||
#define IS_PLANT 0x2 // Is a treeperson.
|
||||
#define NO_SCAN 0x4 // Cannot be scanned in a DNA machine/genome-stolen.
|
||||
#define NO_SLEEVE 0x4 // Cannot be resleeved by clonepods
|
||||
#define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator.
|
||||
#define NO_SLIP 0x10 // Cannot fall over.
|
||||
#define NO_POISON 0x20 // Cannot not suffer toxloss.
|
||||
@@ -11,6 +11,7 @@
|
||||
#define UNDEAD 0x200 // Various things that living things don't do, mostly for skeletons
|
||||
#define NO_INFECT 0x400 // Don't allow infections in limbs or organs, similar to IS_PLANT, without other strings.
|
||||
#define NO_DEFIB 0x800 // Don't allow them to be defibbed
|
||||
#define NO_DNA 0x1000 // Cannot have mutations or have their dna changed by genetics/radiation/genome-stolen.
|
||||
// unused: 0x8000 - higher than this will overflow
|
||||
|
||||
// Species EMP vuln for carbons
|
||||
|
||||
@@ -64,15 +64,15 @@
|
||||
var/mob/living/carbon/human/H = player.current
|
||||
if(H.isSynthetic())
|
||||
return 0
|
||||
if(H.species.flags & NO_SCAN)
|
||||
if(H.species.flags & (NO_SLEEVE|NO_DNA))
|
||||
return 0
|
||||
return 1
|
||||
else if(isnewplayer(player.current))
|
||||
if(player.current.client && player.current.client.prefs)
|
||||
var/datum/species/S = GLOB.all_species[player.current.client.prefs.species]
|
||||
if(S && (S.flags & NO_SCAN))
|
||||
if(S && (S.flags & (NO_SLEEVE|NO_DNA)))
|
||||
return 0
|
||||
if(player.current.client.prefs.organ_data["torso"] == "cyborg") // Full synthetic.
|
||||
if(player.current.client.prefs.organ_data["torso"] == "cyborg") // Full synthetic. // TODO, this to issynthetic()?
|
||||
return 0
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
// flags: See below, bitfield.
|
||||
|
||||
/proc/domutcheck(var/mob/living/M, var/connected=null, var/flags=0)
|
||||
// Traitgenes NO_SCAN and Synthetics cannot be mutated
|
||||
// Traitgenes NO_DNA and Synthetics cannot be mutated
|
||||
if(M.isSynthetic())
|
||||
return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!H.species || H.species.flags & NO_SCAN)
|
||||
if(!H.species || H.species.flags & NO_DNA)
|
||||
return
|
||||
// Traitgenes Sort genes into currently active, and deactivated... Genes that are active and may deactivate should do so before attempting to activate genes(to avoid conflicts blocking them!)
|
||||
var/list/enabled_genes = list()
|
||||
|
||||
@@ -23,12 +23,12 @@
|
||||
// Give Random Bad Mutation to M
|
||||
/proc/randmutb(var/mob/living/M)
|
||||
if(!M || !(M.dna)) return
|
||||
// Traitgenes NO_SCAN and Synthetics cannot be mutated
|
||||
// Traitgenes NO_DNA and Synthetics cannot be mutated
|
||||
if(M.isSynthetic())
|
||||
return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!H.species || H.species.flags & NO_SCAN)
|
||||
if(!H.species || H.species.flags & NO_DNA)
|
||||
return
|
||||
M.dna.check_integrity()
|
||||
// Traitgenes Pick from bad traitgenes
|
||||
@@ -38,12 +38,12 @@
|
||||
// Give Random Good Mutation to M
|
||||
/proc/randmutg(var/mob/living/M)
|
||||
if(!M || !(M.dna)) return
|
||||
// Traitgenes NO_SCAN and Synthetics cannot be mutated
|
||||
// Traitgenes NO_DNA and Synthetics cannot be mutated
|
||||
if(M.isSynthetic())
|
||||
return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!H.species || H.species.flags & NO_SCAN)
|
||||
if(!H.species || H.species.flags & NO_DNA)
|
||||
return
|
||||
M.dna.check_integrity()
|
||||
// Traitgenes Pick from good traitgenes
|
||||
@@ -53,12 +53,12 @@
|
||||
// Scramble UI or SE.
|
||||
/proc/scramble(var/UI, var/mob/M, var/prob)
|
||||
if(!M || !(M.dna)) return
|
||||
// Traitgenes edit begin - NO_SCAN and Synthetics cannot be mutated
|
||||
// Traitgenes edit begin - NO_DNA and Synthetics cannot be mutated
|
||||
if(M.isSynthetic())
|
||||
return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!H.species || H.species.flags & NO_SCAN)
|
||||
if(!H.species || H.species.flags & NO_DNA)
|
||||
return
|
||||
// Traitgenes edit end
|
||||
M.dna.check_integrity()
|
||||
|
||||
@@ -467,13 +467,13 @@
|
||||
occupantData["name"] = WC.real_name
|
||||
occupantData["stat"] = WC.stat
|
||||
occupantData["isViableSubject"] = 1
|
||||
// Traitgenes NO_SCAN and Synthetics cannot be mutated
|
||||
// Traitgenes NO_DNA and Synthetics cannot be mutated
|
||||
var/allowed = TRUE
|
||||
if(WC.isSynthetic())
|
||||
allowed = FALSE
|
||||
if(ishuman(WC))
|
||||
var/mob/living/carbon/human/H = WC
|
||||
if(!H.species || (H.species.flags & NO_SCAN))
|
||||
if(!H.species || (H.species.flags & NO_DNA))
|
||||
allowed = FALSE
|
||||
if(!allowed || (NOCLONE in WC.mutations) || !WC.dna)
|
||||
occupantData["isViableSubject"] = 0
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
to_chat(src, span_warning("\The [T] is not compatible with our biology."))
|
||||
return
|
||||
|
||||
if(T.species.flags & NO_SCAN)
|
||||
if(T.species.flags & (NO_DNA|NO_SLEEVE))
|
||||
to_chat(src, span_warning("We do not know how to parse this creature's DNA!"))
|
||||
return
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
to_chat(src, span_warning("\The [T] is not compatible with our biology."))
|
||||
return 0
|
||||
|
||||
if(T.species.flags & NO_SCAN)
|
||||
if(T.species.flags & (NO_DNA|NO_SLEEVE))
|
||||
to_chat(src, span_warning("We do not know how to parse this creature's DNA!"))
|
||||
return 0
|
||||
|
||||
|
||||
@@ -335,7 +335,7 @@
|
||||
eject_wait = 0 //If it's still set somehow.
|
||||
if(ishuman(occupant)) //Need to be safe.
|
||||
var/mob/living/carbon/human/patient = occupant
|
||||
if(!(patient.species.flags & NO_SCAN)) //If, for some reason, someone makes a genetically-unalterable clone, let's not make them permanently disabled.
|
||||
if(!(patient.species.flags & NO_DNA)) //If, for some reason, someone makes a genetically-unalterable clone, let's not make them permanently disabled.
|
||||
domutcheck(occupant) //Waiting until they're out before possible transforming.
|
||||
occupant.UpdateAppearance()
|
||||
occupant = null
|
||||
|
||||
@@ -71,16 +71,16 @@
|
||||
L.apply_effect(rand(5,20), IRRADIATE, check_protection = 0)
|
||||
L.apply_damage(max(2,L.getCloneLoss()), CLONE)
|
||||
|
||||
// Traitgenes edit begin - NO_SCAN and Synthetics cannot be mutated
|
||||
// Traitgenes edit begin - NO_DNA and Synthetics cannot be mutated
|
||||
var/allow = TRUE
|
||||
if(M.isSynthetic())
|
||||
allow = FALSE
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!H.species || H.species.flags & NO_SCAN)
|
||||
if(!H.species || H.species.flags & NO_DNA)
|
||||
allow = FALSE
|
||||
// Traitgenes edit end
|
||||
if (!(NOCLONE in M.mutations) && allow) // prevents drained people from having their DNA changed, Traitgenes edit - NO_SCAN and Synthetics cannot be mutated
|
||||
if (!(NOCLONE in M.mutations) && allow) // prevents drained people from having their DNA changed, Traitgenes edit - NO_DNA and Synthetics cannot be mutated
|
||||
if(buf)
|
||||
if (buf.types & DNA2_BUF_UI)
|
||||
if (!block) //isolated block?
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
src.icon_state = "morgue2"
|
||||
get_occupants()
|
||||
for (var/mob/living/carbon/human/H in occupants)
|
||||
if(H.isSynthetic() || H.suiciding || !H.ckey || !H.client || (NOCLONE in H.mutations) || (H.species && H.species.flags & NO_SCAN))
|
||||
if(H.isSynthetic() || H.suiciding || !H.ckey || !H.client || (NOCLONE in H.mutations) || (H.species && H.species.flags & NO_SLEEVE))
|
||||
src.icon_state = "morgue2"
|
||||
break
|
||||
else
|
||||
|
||||
@@ -652,7 +652,7 @@
|
||||
if(Tar.nif)
|
||||
to_chat(user,span_warning("Target already has a NIF."))
|
||||
return
|
||||
if(Tar.species.flags & NO_SCAN)
|
||||
if(Tar.species.flags & NO_DNA)
|
||||
var/obj/item/nif/S = /obj/item/nif/bioadap
|
||||
input_NIF = initial(S.name)
|
||||
new /obj/item/nif/bioadap(Tar)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
to_chat(usr,span_warning("Target already has a NIF."))
|
||||
return
|
||||
|
||||
if(H.species.flags & NO_SCAN)
|
||||
if(H.species.flags & NO_DNA)
|
||||
var/obj/item/nif/S = /obj/item/nif/bioadap
|
||||
input_NIF = initial(S.name)
|
||||
new /obj/item/nif/bioadap(H)
|
||||
|
||||
@@ -1211,8 +1211,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
dat += "</br>" + span_bold("Does not have a circulatory system.")
|
||||
if(!current_species.has_organ[O_LUNGS])
|
||||
dat += "</br>" + span_bold("Does not have a respiratory system.")
|
||||
if(current_species.flags & NO_SCAN)
|
||||
if(current_species.flags & NO_DNA)
|
||||
dat += "</br>" + span_bold("Does not have DNA.")
|
||||
if(current_species.flags & NO_SLEEVE)
|
||||
dat += "</br>" + span_bold("Cannot be cloned.")
|
||||
if(current_species.flags & NO_DEFIB)
|
||||
dat += "</br>" + span_bold("Cannot be defibrillated.")
|
||||
if(current_species.flags & NO_PAIN)
|
||||
|
||||
@@ -1487,20 +1487,6 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/getDNA()
|
||||
if(species.flags & NO_SCAN)
|
||||
return null
|
||||
if(isSynthetic())
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/setDNA()
|
||||
if(species.flags & NO_SCAN)
|
||||
return
|
||||
if(isSynthetic())
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/has_brain()
|
||||
if(internal_organs_by_name[O_BRAIN])
|
||||
var/obj/item/organ/brain = internal_organs_by_name[O_BRAIN]
|
||||
|
||||
@@ -221,13 +221,13 @@
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/proc/Stasis(amount)
|
||||
if((species.flags & NO_SCAN) || isSynthetic())
|
||||
if((species.flags & NO_DNA) || isSynthetic())
|
||||
in_stasis = 0
|
||||
else
|
||||
in_stasis = amount
|
||||
|
||||
/mob/living/carbon/human/proc/getStasis()
|
||||
if((species.flags & NO_SCAN) || isSynthetic())
|
||||
if((species.flags & NO_DNA) || isSynthetic())
|
||||
return 0
|
||||
|
||||
return in_stasis
|
||||
@@ -241,12 +241,12 @@
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/getCloneLoss()
|
||||
if((species.flags & NO_SCAN) || isSynthetic())
|
||||
if((species.flags & NO_DNA) || isSynthetic())
|
||||
cloneloss = 0
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/setCloneLoss(var/amount)
|
||||
if((species.flags & NO_SCAN) || isSynthetic())
|
||||
if((species.flags & NO_DNA) || isSynthetic())
|
||||
cloneloss = 0
|
||||
else
|
||||
..()
|
||||
@@ -254,7 +254,7 @@
|
||||
/mob/living/carbon/human/adjustCloneLoss(var/amount)
|
||||
..()
|
||||
|
||||
if((species.flags & NO_SCAN) || isSynthetic())
|
||||
if((species.flags & NO_DNA) || isSynthetic())
|
||||
cloneloss = 0
|
||||
return
|
||||
|
||||
|
||||
@@ -192,10 +192,10 @@
|
||||
SHOULD_NOT_OVERRIDE(TRUE) //Don't. Even. /Think/. About. It.
|
||||
if(!dna || !species)
|
||||
return
|
||||
// Traitgenes NO_SCAN and Synthetics cannot be mutated
|
||||
// Traitgenes NO_DNA and Synthetics cannot be mutated
|
||||
if(isSynthetic())
|
||||
return
|
||||
if(species.flags & NO_SCAN)
|
||||
if(species.flags & NO_DNA)
|
||||
return
|
||||
if(refresh_traits && species.traits)
|
||||
for(var/TR in species.traits)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
language = LANGUAGE_LLEILL
|
||||
name_language = LANGUAGE_LLEILL
|
||||
|
||||
flags = NO_SCAN | NO_MINOR_CUT | NO_INFECT | NO_HALLUCINATION
|
||||
flags = NO_SLEEVE | NO_MINOR_CUT | NO_INFECT | NO_HALLUCINATION
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_UNDERWEAR
|
||||
|
||||
|
||||
@@ -197,7 +197,10 @@ Variables you may want to make use of are:
|
||||
flags ^= NO_SLIP
|
||||
|
||||
/datum/species/event1/proc/toggle_cloning()
|
||||
flags ^= NO_SCAN
|
||||
flags ^= NO_SLEEVE
|
||||
|
||||
/datum/species/event1/proc/toggle_dna()
|
||||
flags ^= NO_DNA
|
||||
|
||||
/datum/species/event1/proc/toggle_defibbing()
|
||||
flags ^= NO_DEFIB
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
remains_type = /obj/effect/decal/cleanable/ash
|
||||
death_message = "dissolves into ash..."
|
||||
|
||||
flags = NO_SCAN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_DEFIB
|
||||
flags = NO_DNA | NO_SLEEVE | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_DEFIB
|
||||
spawn_flags = SPECIES_IS_RESTRICTED
|
||||
|
||||
genders = list(NEUTER)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
max_age = 110
|
||||
health_hud_intensity = 1.5
|
||||
|
||||
flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_BLOOD | UNDEAD | NO_DEFIB
|
||||
flags = NO_DNA | NO_SLEEVE | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_BLOOD | UNDEAD | NO_DEFIB
|
||||
spawn_flags = SPECIES_IS_RESTRICTED
|
||||
appearance_flags = null
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
ideal_air_type = /datum/gas_mixture/belly_air/vox
|
||||
siemens_coefficient = 0.2
|
||||
|
||||
flags = NO_SCAN
|
||||
flags = NO_DNA | NO_SLEEVE | NO_DEFIB
|
||||
spawn_flags = SPECIES_IS_WHITELISTED
|
||||
appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_SKIN_COLOR
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
heat_level_2 = 1000
|
||||
heat_level_3 = 1150
|
||||
|
||||
flags = NO_SCAN | NO_MINOR_CUT | NO_INFECT
|
||||
flags = NO_DNA | NO_SLEEVE | NO_MINOR_CUT | NO_INFECT
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
|
||||
|
||||
reagent_tag = IS_SHADEKIN // for shadekin-unqiue chem interactions
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
breath_heat_level_3 = 800 //lower incineration threshold though
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
flags = NO_SCAN | IS_PLANT | NO_MINOR_CUT
|
||||
flags = NO_DNA | NO_SLEEVE | IS_PLANT | NO_MINOR_CUT
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/alraune_fruit_select, //Give them the voremodes related to wrapping people in vines and sapping their fluids
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
language = "Sol Common" //todo?
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch)
|
||||
flags = NO_PAIN | NO_SCAN | NO_POISON | NO_MINOR_CUT | NO_DEFIB
|
||||
flags = NO_PAIN | NO_DNA | NO_SLEEVE | NO_POISON | NO_MINOR_CUT | NO_DEFIB
|
||||
spawn_flags = SPECIES_IS_RESTRICTED
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
bump_flag = SLIME
|
||||
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
|
||||
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
|
||||
flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_DEFIB
|
||||
flags = NO_DNA | NO_SLEEVE | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_DEFIB
|
||||
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
|
||||
health_hud_intensity = 2
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
flesh_color = "#505050"
|
||||
base_color = "#FFFFFF" //Color mult, start out with this
|
||||
|
||||
flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_PAIN
|
||||
flags = NO_DNA | NO_SLEEVE | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_PAIN
|
||||
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_LIPS
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
|
||||
health_hud_intensity = 2
|
||||
|
||||
@@ -591,7 +591,7 @@
|
||||
|
||||
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
|
||||
|
||||
flags = NO_SCAN | IS_PLANT | NO_PAIN | NO_SLIP | NO_MINOR_CUT | NO_DEFIB
|
||||
flags = NO_DNA | NO_SLEEVE | IS_PLANT | NO_PAIN | NO_SLIP | NO_MINOR_CUT | NO_DEFIB
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
|
||||
|
||||
blood_color = "#004400"
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
//primitive_form = SPECIES_MONKEY_TAJ
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken.
|
||||
flags = NO_SCAN | NO_INFECT // | NO_DEFIB // Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. Leaving NO_DEFIB there for the future/in case reversion to old 'chimera no-defib.
|
||||
flags = NO_SLEEVE | NO_DNA | NO_INFECT // | NO_DEFIB // Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. Leaving NO_DEFIB there for the future/in case reversion to old 'chimera no-defib.
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
@@ -497,7 +497,7 @@
|
||||
heat_level_2 = 1000
|
||||
heat_level_3 = 1150
|
||||
|
||||
flags = NO_SCAN
|
||||
flags = NO_DNA | NO_SLEEVE
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
|
||||
|
||||
reagent_tag = IS_SHADEKIN // for shadekin-unqiue chem interactions
|
||||
|
||||
@@ -702,3 +702,28 @@
|
||||
desc = "Even the tiniest particles of dirt give you uneasy footing, even through several layers of footwear."
|
||||
cost = -5
|
||||
var_changes = list("dirtslip" = TRUE)
|
||||
|
||||
/datum/trait/negative/nodefib
|
||||
name = "Unreviveable"
|
||||
desc = "For whatever strange genetic reason, defibs cannot restart your heart."
|
||||
cost = -1
|
||||
custom_only = FALSE
|
||||
var_changes = list("flags" = NO_DEFIB)
|
||||
can_take = ORGANICS
|
||||
excludes = list(/datum/trait/negative/noresleeve, /datum/trait/negative/onelife)
|
||||
|
||||
/datum/trait/negative/noresleeve
|
||||
name = "Unsleeveable"
|
||||
desc = "Your genetics have been ruined, to the point where resleeving can no longer bring you back. Your DNA is unappealing to slimes as a result." //The autoresleever still resleeves on Virgo as that section has been commented out, but eh, whatever. It's not really a big concern. -1+-1 = -2 is all I care about.
|
||||
cost = -1
|
||||
custom_only = TRUE
|
||||
var_changes = list("flags" = NO_SLEEVE)
|
||||
excludes = list(/datum/trait/negative/nodefib, /datum/trait/negative/onelife)
|
||||
|
||||
/datum/trait/negative/onelife
|
||||
name = "One Life"
|
||||
desc = "Once you are dead, you are incapable of being resleeved or revived using a defib."
|
||||
cost = -2
|
||||
custom_only = TRUE
|
||||
var_changes = list("flags" = NO_SLEEVE | NO_DEFIB)
|
||||
excludes = list(/datum/trait/negative/nodefib, /datum/trait/negative/noresleeve)
|
||||
|
||||
@@ -386,3 +386,10 @@
|
||||
/datum/trait/positive/vibration_sense/unapply(datum/species/S, mob/living/carbon/human/H, trait_prefs)
|
||||
. = ..()
|
||||
H.motiontracker_unsubscribe()
|
||||
|
||||
/datum/trait/positive/stable_genetics
|
||||
name = "Stable Genetics"
|
||||
desc = "Your genetics are extraordinarily stable, with your DNA being immune to any changes, including slimes!"
|
||||
cost = 2
|
||||
custom_only = TRUE
|
||||
var_changes = list("flags" = NO_DNA)
|
||||
|
||||
@@ -49,7 +49,10 @@
|
||||
ASSERT(S)
|
||||
if(var_changes)
|
||||
for(var/V in var_changes)
|
||||
S.vars[V] = var_changes[V]
|
||||
if(V == "flags") // Is bitflag, implimentation means traits can only GIVE you flags, not remove them.
|
||||
S.vars[V] |= var_changes[V]
|
||||
else
|
||||
S.vars[V] = var_changes[V]
|
||||
if (trait_prefs)
|
||||
for (var/trait in trait_prefs)
|
||||
switch(has_preferences[trait][3])
|
||||
@@ -77,7 +80,11 @@
|
||||
ASSERT(S)
|
||||
if(var_changes)
|
||||
for(var/V in var_changes)
|
||||
S.vars[V] = initial(S.vars[V])
|
||||
if(V == "flags") // Is bitflag, this assumes traits can only ever GIVE you flags.
|
||||
if(!(initial(S.vars[V]) & var_changes[V]))
|
||||
S.vars[V] &= ~var_changes[V]
|
||||
else
|
||||
S.vars[V] = initial(S.vars[V])
|
||||
if (trait_prefs)
|
||||
for (var/trait in trait_prefs)
|
||||
switch(has_preferences[trait][3])
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
cold_level_2 = -1
|
||||
cold_level_3 = -1
|
||||
|
||||
flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_INFECT | NO_DEFIB
|
||||
flags = NO_DNA | NO_SLEEVE | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_INFECT | NO_DEFIB
|
||||
spawn_flags = SPECIES_IS_RESTRICTED
|
||||
|
||||
reagent_tag = IS_XENOS
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
//VOREStation Addition start
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.species.flags & NO_SCAN)
|
||||
if(H.species.flags & (NO_DNA|NO_SLEEVE))
|
||||
to_chat(src, "This subject's life energy is beyond my reach...")
|
||||
return FALSE
|
||||
//VOREStation Addition end
|
||||
|
||||
@@ -119,7 +119,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
|
||||
should_be_in = brain.parent_organ
|
||||
|
||||
if(istype(H) && !H.nif && H.species && (loc == H.get_organ(should_be_in)))
|
||||
if(!bioadap && (H.species.flags & NO_SCAN)) //NO_SCAN is the default 'too complicated' flag
|
||||
if(!bioadap && (H.species.flags & NO_DNA)) //NO_DNA is the default 'too complicated' flag
|
||||
return FALSE
|
||||
|
||||
human = H
|
||||
|
||||
@@ -605,7 +605,7 @@
|
||||
H.b_hair = max(0, min(255, H.b_hair + color_shift))
|
||||
if(H.b_facial)
|
||||
H.b_facial = max(0, min(255, H.b_facial + color_shift))
|
||||
if(H.species.flags & NO_SCAN)
|
||||
if(H.species.flags & NO_DNA)
|
||||
return
|
||||
|
||||
//The original coder comment here wanted it to be "Approx. one mutation per 10 injected/20 ingested/30 touching units"
|
||||
@@ -875,7 +875,7 @@
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H) && (H.species.flags & NO_SCAN))
|
||||
if(istype(H) && (H.species.flags & NO_DNA))
|
||||
return
|
||||
|
||||
if(M.dna)
|
||||
@@ -901,7 +901,7 @@
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H) && (H.species.flags & NO_SCAN))
|
||||
if(istype(H) && (H.species.flags & NO_DNA))
|
||||
return
|
||||
|
||||
if(M.dna)
|
||||
|
||||
@@ -79,12 +79,12 @@
|
||||
to_chat(ghost, span_warning("You are not whitelisted to spawn as this species!"))
|
||||
return
|
||||
|
||||
/* // Comments out NO_SCAN restriction, as per headmin/maintainer request.
|
||||
/* // Comments out NO_SLEEVE restriction, as per headmin/maintainer request.
|
||||
var/datum/species/chosen_species
|
||||
if(ghost.client.prefs.species) // In case we somehow don't have a species set here.
|
||||
chosen_species = GLOB.all_species[ghost_client.prefs.species]
|
||||
|
||||
if(chosen_species.flags && NO_SCAN) // Sanity. Prevents species like Xenochimera, Proteans, etc from rejoining the round via resleeve, as they should have their own methods of doing so already, as agreed to when you whitelist as them.
|
||||
if(chosen_species.flags && NO_SLEEVE) // Sanity. Prevents species like Xenochimera, Proteans, etc from rejoining the round via resleeve, as they should have their own methods of doing so already, as agreed to when you whitelist as them.
|
||||
to_chat(ghost, span_warning("This species cannot be resleeved!"))
|
||||
return
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user