Refactors DNA Mutations; Refactors Mutations to use Traits (#15483)

* Refactors Mutations

* traits

* more work

* styling fix

* yet even more work

* oh hush

* almost there

* it continues yet further

* and that's genetics done

* and that's it folks

* last bit and golem fixup

* oof

* oops

* tweaks and fixes

* styling
This commit is contained in:
Fox McCloud
2021-02-21 16:25:19 -05:00
committed by GitHub
parent 324af7454c
commit 02b9445b9b
223 changed files with 2908 additions and 3049 deletions
+1 -1
View File
@@ -222,7 +222,7 @@ GLOBAL_VAR_INIT(nologevent, 0)
body += "<br><br>"
body += "<b>DNA Blocks:</b><br><table border='0'><tr><th>&nbsp;</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th>"
var/bname
for(var/block=1;block<=DNA_SE_LENGTH;block++)
for(var/block in 1 to DNA_SE_LENGTH)
if(((block-1)%5)==0)
body += "</tr><tr><th>[block-1]</th>"
bname = GLOB.assigned_blocks[block]
+7 -7
View File
@@ -2087,15 +2087,15 @@
logmsg = "a heal over time."
if("Permanent Regeneration")
H.dna.SetSEState(GLOB.regenerateblock, 1)
genemutcheck(H, GLOB.regenerateblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.regenerateblock, MUTCHK_FORCED)
H.update_mutations()
H.gene_stability = 100
logmsg = "permanent regeneration."
if("Super Powers")
var/list/default_genes = list(GLOB.regenerateblock, GLOB.breathlessblock, GLOB.coldblock)
for(var/gene in default_genes)
H.dna.SetSEState(gene, 1)
genemutcheck(H, gene, null, MUTCHK_FORCED)
var/list/default_mutations = list(GLOB.regenerateblock, GLOB.breathlessblock, GLOB.coldblock)
for(var/mutation in default_mutations)
H.dna.SetSEState(mutation, 1)
singlemutcheck(H, mutation, MUTCHK_FORCED)
H.update_mutations()
H.gene_stability = 100
logmsg = "superpowers."
@@ -2234,7 +2234,7 @@
logmsg = "starvation."
if("Cluwne")
H.makeCluwne()
H.mutations |= NOCLONE
ADD_TRAIT(H, TRAIT_BADDNA, "smiting")
logmsg = "cluwned."
if("Mutagen Cookie")
var/obj/item/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/reagent_containers/food/snacks/cookie
@@ -2255,7 +2255,7 @@
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a hellwater cookie."
if("Hunter")
H.mutations |= NOCLONE
ADD_TRAIT(H, TRAIT_BADDNA, "smiting")
usr.client.create_eventmob_for(H, 1)
logmsg = "hunter."
if("Crew Traitor")
+4 -4
View File
@@ -852,12 +852,12 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
if(!SSticker)
alert("Wait until the game starts")
return
if(istype(M, /mob/living/carbon))
if(ishuman(M))
M.dna.SetSEState(block,!M.dna.GetSEState(block))
genemutcheck(M,block,null,MUTCHK_FORCED)
singlemutcheck(M, block, MUTCHK_FORCED)
M.update_mutations()
var/state="[M.dna.GetSEState(block)?"on":"off"]"
var/blockname=GLOB.assigned_blocks[block]
var/state = "[M.dna.GetSEState(block) ? "on" : "off"]"
var/blockname = GLOB.assigned_blocks[block]
message_admins("[key_name_admin(src)] has toggled [M.key]'s [blockname] block [state]!")
log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!")
else
+2 -1
View File
@@ -126,7 +126,8 @@ GLOBAL_VAR_INIT(sent_honksquad, 0)
equip_to_slot_or_del(new /obj/item/gun/energy/clown(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/gun/throw/piecannon(src), slot_in_backpack)
src.mutations.Add(CLUMSY)
dna.SetSEState(GLOB.clumsyblock, TRUE)
singlemutcheck(src, GLOB.clumsyblock, MUTCHK_FORCED)
@@ -28,14 +28,16 @@
var/mob/living/carbon/human/slave_mob = owner.current
if(slave_mob && istype(slave_mob))
to_chat(slave_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
slave_mob.mutations.Remove(CLUMSY)
slave_mob.dna.SetSEState(GLOB.clumsyblock, FALSE)
singlemutcheck(slave_mob, GLOB.clumsyblock, MUTCHK_FORCED)
/datum/antagonist/mindslave/remove_innate_effects()
. = ..()
if(owner.assigned_role == "Clown")
var/mob/living/carbon/human/slave_mob = owner.current
if(slave_mob && istype(slave_mob))
slave_mob.mutations.Add(CLUMSY)
slave_mob.dna.SetSEState(GLOB.clumsyblock, TRUE)
singlemutcheck(slave_mob, GLOB.clumsyblock, MUTCHK_FORCED)
/datum/antagonist/mindslave/proc/add_objective(datum/objective/O)
owner.objectives += O
@@ -68,7 +68,8 @@
var/mob/living/carbon/human/traitor_mob = owner.current
if(traitor_mob && istype(traitor_mob))
to_chat(traitor_mob, "<span class='warning'>Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.</span>")
traitor_mob.mutations.Remove(CLUMSY)
traitor_mob.dna.SetSEState(GLOB.clumsyblock, FALSE)
singlemutcheck(traitor_mob, GLOB.clumsyblock, MUTCHK_FORCED)
var/datum/action/innate/toggle_clumsy/A = new
A.Grant(traitor_mob)
@@ -79,7 +80,8 @@
var/mob/living/carbon/human/traitor_mob = owner.current
if(traitor_mob && istype(traitor_mob))
to_chat(traitor_mob, "<span class='warning'>You lose your syndicate training and return to your own clumsy, clownish self.</span>")
traitor_mob.mutations.Add(CLUMSY)
traitor_mob.dna.SetSEState(GLOB.clumsyblock, TRUE)
singlemutcheck(traitor_mob, GLOB.clumsyblock, MUTCHK_FORCED)
for(var/datum/action/innate/A in traitor_mob.actions)
if(istype(A, /datum/action/innate/toggle_clumsy))
A.Remove(traitor_mob)
@@ -23,56 +23,56 @@
return
H.ignore_gene_stability = TRUE
H.dna.SetSEState(GLOB.hulkblock, TRUE)
genemutcheck(H, GLOB.hulkblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.hulkblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.xrayblock, TRUE)
genemutcheck(H, GLOB.xrayblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.xrayblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.fireblock, TRUE)
genemutcheck(H, GLOB.fireblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.fireblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.coldblock, TRUE)
genemutcheck(H, GLOB.coldblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.coldblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.teleblock, TRUE)
genemutcheck(H, GLOB.teleblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.teleblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.increaserunblock, TRUE)
genemutcheck(H, GLOB.increaserunblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.increaserunblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.breathlessblock, TRUE)
genemutcheck(H, GLOB.breathlessblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.breathlessblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.regenerateblock, TRUE)
genemutcheck(H, GLOB.regenerateblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.regenerateblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.shockimmunityblock, TRUE)
genemutcheck(H, GLOB.shockimmunityblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.shockimmunityblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.smallsizeblock, TRUE)
genemutcheck(H, GLOB.smallsizeblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.smallsizeblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.soberblock, TRUE)
genemutcheck(H, GLOB.soberblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.soberblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.psyresistblock, TRUE)
genemutcheck(H, GLOB.psyresistblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.psyresistblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.shadowblock, TRUE)
genemutcheck(H, GLOB.shadowblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.shadowblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.cryoblock, TRUE)
genemutcheck(H, GLOB.cryoblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.cryoblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.eatblock, TRUE)
genemutcheck(H, GLOB.eatblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.eatblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.jumpblock, TRUE)
genemutcheck(H, GLOB.jumpblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.jumpblock, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.immolateblock, TRUE)
genemutcheck(H, GLOB.immolateblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.immolateblock, MUTCHK_FORCED)
H.mutations.Add(LASER)
ADD_TRAIT(H, TRAIT_LASEREYES, "wishgranter")
H.update_mutations()
H.update_body()
+4 -4
View File
@@ -19,7 +19,7 @@
if(!armed)
if(ishuman(usr))
var/mob/living/carbon/human/user = usr
if((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))
if((user.getBrainLoss() >= 60 || HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
to_chat(user, "Your hand slips, setting off the trigger.")
pulse(0)
update_icon()
@@ -43,7 +43,7 @@
var/obj/item/organ/external/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(PIERCEIMMUNE in H.dna.species.species_traits)
if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE))
playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
armed = FALSE
update_icon()
@@ -75,7 +75,7 @@
if(!armed)
to_chat(user, "<span class='notice'>You arm [src].</span>")
else
if((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))
if((user.getBrainLoss() >= 60 || HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
@@ -90,7 +90,7 @@
/obj/item/assembly/mousetrap/attack_hand(mob/living/user)
if(armed)
if((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))
if((user.getBrainLoss() >= 60 || HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
+2 -2
View File
@@ -194,9 +194,9 @@
H.set_species(mob_species)
if(husk)
H.ChangeToHusk()
H.Drain()
else //Because for some reason I can't track down, things are getting turned into husks even if husk = false. It's in some damage proc somewhere.
H.mutations.Remove(HUSK)
H.cure_husk()
H.underwear = "Nude"
H.undershirt = "Nude"
H.socks = "Nude"
@@ -76,9 +76,11 @@
if("Power")
to_chat(user, "<B>Your wish is granted, but at a terrible cost...</B>")
to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.")
user.mutations.Add(LASER)
user.mutations.Add(COLDRES)
user.mutations.Add(XRAY)
ADD_TRAIT(user, TRAIT_LASEREYES, "ww_wishgranter")
user.dna.SetSEState(GLOB.fireblock, TRUE)
singlemutcheck(user, GLOB.fireblock, MUTCHK_FORCED)
user.dna.SetSEState(GLOB.xrayblock, TRUE)
singlemutcheck(user, GLOB.xrayblock, MUTCHK_FORCED)
if(ishuman(user))
var/mob/living/carbon/human/human = user
if(!isshadowperson(human))
@@ -867,7 +867,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
HTML += ShowDisabilityState(user, DISABILITY_FLAG_BLIND, "Blind")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_DEAF, "Deaf")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_MUTE, "Mute")
if(!(NO_OBESITY in S.species_traits))
if(!(TRAIT_NOFAT in S.inherent_traits))
HTML += ShowDisabilityState(user, DISABILITY_FLAG_FAT, "Obese")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_NERVOUS, "Stutter")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_SWEDISH, "Swedish accent")
@@ -2291,7 +2291,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
if(character.dna.dirtySE)
character.dna.UpdateSE()
domutcheck(character, null, MUTCHK_FORCED) //'Activates' all the above disabilities.
domutcheck(character, MUTCHK_FORCED) //'Activates' all the above disabilities.
character.dna.ready_dna(character, flatten_SE = 0)
character.sync_organ_dna(assimilate=1)
+1 -1
View File
@@ -526,7 +526,7 @@ BLIND // can't see anything
/obj/item/clothing/suit/proc/adjustsuit(var/mob/user)
if(!ignore_suitadjust)
if(!user.incapacitated())
if(!(HULK in user.mutations))
if(!HAS_TRAIT(user, TRAIT_HULK))
if(suit_adjusted)
var/flavour = "close"
icon_state = copytext(icon_state, 1, findtext(icon_state, "_open")) /*Trims the '_open' off the end of the icon state, thus avoiding a case where jackets that start open will
+13 -1
View File
@@ -4,7 +4,19 @@
icon_state = "earmuffs"
item_state = "earmuffs"
flags = EARBANGPROTECT
flags_2 = HEALS_EARS_2
strip_delay = 15
put_on_delay = 25
resistance_flags = FLAMMABLE
/obj/item/clothing/ears/earmuffs/ComponentInitialize()
. = ..()
AddElement(/datum/element/earhealing)
/obj/item/clothing/ears/earmuffs/equipped(mob/user, slot)
. = ..()
if(ishuman(user) && ((slot == slot_l_ear) || (slot == slot_r_ear)))
ADD_TRAIT(user, TRAIT_DEAF, CLOTHING_TRAIT)
/obj/item/clothing/ears/earmuffs/dropped(mob/user)
. = ..()
REMOVE_TRAIT(user, TRAIT_DEAF, CLOTHING_TRAIT)
+15 -11
View File
@@ -45,6 +45,19 @@
user.update_sight()
user.update_inv_glasses()
//called when thermal glasses are emped.
/obj/item/clothing/glasses/proc/thermal_overload()
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
var/obj/item/organ/internal/eyes/eyes = H.get_organ_slot("eyes")
if(!H.eye_blind && eyes)
if(H.glasses == src)
to_chat(H, "<span class='danger'>[src] overloads and blinds you!</span>")
H.flash_eyes(visual = TRUE)
H.EyeBlind(3)
H.EyeBlurry(5)
eyes.receive_damage(5)
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
desc = "Used for seeing walls, floors, and stuff through anything."
@@ -340,7 +353,7 @@
/obj/item/clothing/glasses/sunglasses/lasers/equipped(mob/user, slot) //grant them laser eyes upon equipping it.
if(slot == slot_glasses)
user.mutations.Add(LASER)
ADD_TRAIT(user, TRAIT_LASEREYES, "admin_zapglasses")
user.regenerate_icons()
..(user, slot)
@@ -404,16 +417,7 @@
)
/obj/item/clothing/glasses/thermal/emp_act(severity)
if(istype(src.loc, /mob/living/carbon/human))
var/mob/living/carbon/human/M = src.loc
to_chat(M, "<span class='warning'>The Optical Thermal Scanner overloads and blinds you!</span>")
if(M.glasses == src)
M.EyeBlind(3)
M.EyeBlurry(5)
if(!(NEARSIGHTED in M.mutations))
M.BecomeNearsighted()
spawn(100)
M.CureNearsighted()
thermal_overload()
..()
/obj/item/clothing/glasses/thermal/monocle
@@ -141,7 +141,7 @@
user.visible_message("[user] places \the [src] against [M]'s chest and listens attentively.", "You place \the [src] against [M]'s chest...")
var/obj/item/organ/internal/H = M.get_int_organ(/obj/item/organ/internal/heart)
var/obj/item/organ/internal/L = M.get_int_organ(/obj/item/organ/internal/lungs)
if((H && M.pulse) || (L && !(BREATHLESS in M.mutations) && !(NO_BREATHE in M.dna.species.species_traits)))
if((H && M.pulse) || (L && !HAS_TRAIT(M, TRAIT_NOBREATH)))
var/color = "notice"
if(H)
var/heart_sound
+1 -1
View File
@@ -10,7 +10,7 @@
if(!is_station_level(T.z))
continue
var/armor = H.getarmor(type = "rad")
if((RADIMMUNE in H.dna.species.species_traits) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected
if(HAS_TRAIT(H, TRAIT_RADIMMUNE) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected
continue
H.AdjustHallucinate(rand(50, 100))
@@ -72,7 +72,7 @@
return
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/attack(mob/living/carbon/human/user)
if((CLUMSY in user.mutations) && prob(50) && (resistance_flags & ON_FIRE))
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50) && (resistance_flags & ON_FIRE))
clumsilyDrink(user)
else
..()
@@ -89,7 +89,7 @@
..()
if(!(resistance_flags & ON_FIRE))
return
if((CLUMSY in user.mutations) && prob(50))
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
clumsilyDrink(user)
else
user.visible_message("<span class = 'notice'>[user] places [user.p_their()] hand over [src] to put it out!</span>", "<span class = 'notice'>You use your hand to extinguish [src]!</span>")
@@ -98,7 +98,7 @@
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/MouseDrop(mob/living/carbon/human/user)
if(!ishuman(user))
return
if((CLUMSY in user.mutations) && prob(50) && (resistance_flags & ON_FIRE))
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50) && (resistance_flags & ON_FIRE))
clumsilyDrink(user)
else
..()
+1 -1
View File
@@ -54,7 +54,7 @@
var/mob/living/carbon/human/H = user
if(H.gloves)
return TRUE
if(PIERCEIMMUNE in H.dna.species.species_traits)
if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE))
return TRUE
var/organ = ((H.hand ? "l_":"r_") + "arm")
var/obj/item/organ/external/affecting = H.get_organ(organ)
+1 -1
View File
@@ -30,7 +30,7 @@
if(!contains_sample)
for(var/datum/reagent/blood/bloodSample in W.reagents.reagent_list)
var/datum/dna/dna = bloodSample.data["dna"]
if(bloodSample.data["mind"] && bloodSample.data["cloneable"] && !(NO_SCAN in dna.species.species_traits))
if(bloodSample.data["mind"] && bloodSample.data["cloneable"] && !(NO_CLONESCAN in dna.species.species_traits))
var/datum/mind/tempmind = bloodSample.data["mind"]
if(tempmind.is_revivable())
mind = bloodSample.data["mind"]
+1 -1
View File
@@ -307,7 +307,7 @@
/obj/item/twohanded/bostaff/attack(mob/target, mob/living/user)
add_fingerprint(user)
if((CLUMSY in user.mutations) && prob(50))
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
to_chat(user, "<span class ='warning'>You club yourself over the head with [src].</span>")
user.Weaken(3)
if(ishuman(user))
@@ -217,7 +217,7 @@
if(H.stat == DEAD)
H.set_species(/datum/species/shadow)
H.revive()
H.mutations |= NOCLONE //Free revives, but significantly limits your options for reviving except via the crystal
ADD_TRAIT(H, TRAIT_BADDNA, MAGIC_TRAIT) //Free revives, but significantly limits your options for reviving except via the crystal
H.grab_ghost(force = TRUE)
/obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans
@@ -370,7 +370,7 @@
if(isliving(A) && holder_animal)
var/mob/living/L = A
L.notransform = 1
L.mutations |= MUTE
ADD_TRAIT(L, TRAIT_MUTE, STASIS_MUTE)
L.status_flags |= GODMODE
L.mind.transfer_to(holder_animal)
var/obj/effect/proc_holder/spell/targeted/exit_possession/P = new /obj/effect/proc_holder/spell/targeted/exit_possession
@@ -380,7 +380,7 @@
/obj/structure/closet/stasis/dump_contents(var/kill = 1)
STOP_PROCESSING(SSobj, src)
for(var/mob/living/L in src)
L.mutations -=MUTE
REMOVE_TRAIT(L, TRAIT_MUTE, STASIS_MUTE)
L.status_flags &= ~GODMODE
L.notransform = 0
if(holder_animal && !QDELETED(holder_animal))
@@ -193,7 +193,7 @@ Des: Gives the client of the alien an image on each infected mob.
/mob/living/carbon/alien/proc/AddInfectionImages()
if(client)
for(var/mob/living/C in GLOB.mob_list)
if(C.status_flags & XENO_HOST)
if(HAS_TRAIT(C, TRAIT_XENO_HOST))
var/obj/item/organ/internal/body_egg/alien_embryo/A = C.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo)
if(A)
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]")
@@ -104,24 +104,23 @@
/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M)
if(!isliving(M))
return 0
return FALSE
if((!iscorgi(M) && !iscarbon(M)) || isalien(M))
return 0
return FALSE
if(attached)
return 0
return FALSE
else
attached++
spawn(MAX_IMPREGNATION_TIME)
attached = 0
if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
return 0
if(M.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo))
return 0
if(HAS_TRAIT(M, TRAIT_XENO_IMMUNE))
return FALSE
if(loc == M)
return 0
return FALSE
if(stat != CONSCIOUS)
return 0
if(!sterile) M.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
return FALSE
if(!sterile)
M.take_organ_damage(strength, 0) //done here so that even borgs and humans in helmets take damage
M.visible_message("<span class='danger'>[src] leaps at [M]'s face!</span>", \
"<span class='userdanger'>[src] leaps at [M]'s face!</span>")
if(ishuman(M))
@@ -130,12 +129,12 @@
H.visible_message("<span class='danger'>[src] smashes against [H]'s [H.head]!</span>", \
"<span class='userdanger'>[src] smashes against [H]'s [H.head]!</span>")
Die()
return 0
return FALSE
if(iscarbon(M))
var/mob/living/carbon/target = M
if(target.wear_mask)
if(prob(20))
return 0
return FALSE
if(istype(target.wear_mask, /obj/item/clothing/mask/muzzle))
var/obj/item/clothing/mask/muzzle/S = target.wear_mask
if(S.do_break())
@@ -143,7 +142,7 @@
"<span class='userdanger'>[src] spits acid onto [S] melting the lock!</span>")
var/obj/item/clothing/W = target.wear_mask
if(W.flags & NODROP)
return 0
return FALSE
target.unEquip(W)
target.visible_message("<span class='danger'>[src] tears [W] off of [target]'s face!</span>", \
@@ -159,7 +158,7 @@
spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME))
Impregnate(M)
return 1
return TRUE
/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target as mob)
if(!target || target.stat == DEAD || loc != target) //was taken off or something
@@ -220,22 +219,22 @@
/proc/CanHug(mob/living/M)
if(!istype(M))
return 0
return FALSE
if(M.stat == DEAD)
return 0
if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
return 0
return FALSE
if(HAS_TRAIT(M, TRAIT_XENO_IMMUNE))
return FALSE
if(iscorgi(M))
return 1
return TRUE
var/mob/living/carbon/C = M
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(H.head && H.head.flags_cover & HEADCOVERSMOUTH)
return 0
return 1
return 0
return FALSE
return TRUE
return FALSE
/obj/item/clothing/mask/facehugger/lamarr
name = "Lamarr"
+10 -6
View File
@@ -39,7 +39,7 @@
adjust_nutrition(-(hunger_drain * 0.1))
if(m_intent == MOVE_INTENT_RUN)
adjust_nutrition(-(hunger_drain * 0.1))
if((FAT in mutations) && m_intent == MOVE_INTENT_RUN && bodytemperature <= 360)
if(HAS_TRAIT(src, TRAIT_FAT) && m_intent == MOVE_INTENT_RUN && bodytemperature <= 360)
bodytemperature += 2
// Moving around increases germ_level faster
@@ -244,7 +244,7 @@
if(prob(30) && ishuman(M)) // 30% chance of burning your hands
var/mob/living/carbon/human/H = M
var/protected = FALSE // Protected from the fire
if((H.gloves?.max_heat_protection_temperature > 360) || (HEATRES in H.mutations))
if((H.gloves?.max_heat_protection_temperature > 360) || HAS_TRAIT(H, TRAIT_RESISTHEAT) || HAS_TRAIT(H, TRAIT_RESISTHEATHANDS))
protected = TRUE
var/obj/item/organ/external/active_hand = H.get_organ("[H.hand ? "l" : "r"]_hand")
@@ -327,7 +327,7 @@
to_chat(src, "<span class='info'>You're completely exhausted.</span>")
else
to_chat(src, "<span class='info'>You feel fatigued.</span>")
if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit))
if(HAS_TRAIT(H, TRAIT_SKELETONIZED) && (!H.w_uniform) && (!H.wear_suit))
H.play_xylophone()
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
@@ -1200,10 +1200,14 @@ so that different stomachs can handle things in different ways VB*/
if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates.
return
if(XRAY in mutations)
if(HAS_TRAIT(src, TRAIT_THERMAL_VISION))
sight |= (SEE_MOBS)
lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
if(HAS_TRAIT(src, TRAIT_XRAY_VISION))
sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
see_in_dark = max(see_in_dark, 8)
lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE)
SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT)
sync_lighting_plane_alpha()
+32 -38
View File
@@ -119,9 +119,9 @@
dna.species.update_sight(src)
/mob/living/carbon/human/proc/makeSkeleton()
var/obj/item/organ/external/head/H = get_organ("head")
if(SKELETON in src.mutations)
if(HAS_TRAIT(src, TRAIT_SKELETONIZED))
return
var/obj/item/organ/external/head/H = get_organ("head")
if(istype(H))
H.disfigured = TRUE
@@ -140,45 +140,39 @@
update_head_accessory()
update_markings()
mutations.Add(SKELETON)
mutations.Add(NOCLONE)
ADD_TRAIT(src, TRAIT_SKELETONIZED, "skeletonization")
ADD_TRAIT(src, TRAIT_BADDNA, "skeletonization")
update_body()
update_mutantrace()
return
/mob/living/carbon/human/proc/ChangeToHusk()
// If the target has no DNA to begin with, its DNA can't be damaged beyond repair.
if(NO_DNA in dna.species.species_traits)
return
if(HUSK in mutations)
return
var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
if(istype(H))
H.disfigured = TRUE //makes them unknown without fucking up other stuff like admintools
if(H.f_style)
H.f_style = "Shaved" //we only change the icon_state of the hair datum, so it doesn't mess up their UI/UE
if(H.h_style)
H.h_style = "Bald"
update_fhair()
update_hair()
mutations.Add(HUSK)
update_body()
update_mutantrace()
return
/mob/living/carbon/human/proc/become_husk(source)
if(!HAS_TRAIT(src, TRAIT_HUSK))
ADD_TRAIT(src, TRAIT_HUSK, source)
var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
if(istype(H))
H.disfigured = TRUE //makes them unknown without fucking up other stuff like admintools
if(H.f_style)
H.f_style = "Shaved" //we only change the icon_state of the hair datum, so it doesn't mess up their UI/UE
if(H.h_style)
H.h_style = "Bald"
update_fhair()
update_hair()
update_body()
update_mutantrace()
else
ADD_TRAIT(src, TRAIT_HUSK, source)
/mob/living/carbon/human/proc/Drain()
ChangeToHusk()
mutations |= NOCLONE
return
become_husk(CHANGELING_DRAIN)
ADD_TRAIT(src, TRAIT_BADDNA, CHANGELING_DRAIN)
blood_volume = 0
/mob/living/carbon/human/proc/cure_husk()
mutations.Remove(HUSK)
var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
if(istype(H))
H.disfigured = FALSE
update_body()
update_mutantrace()
UpdateAppearance() // reset hair from DNA
/mob/living/carbon/human/proc/cure_husk(source)
REMOVE_TRAIT(src, TRAIT_HUSK, source)
if(!HAS_TRAIT(src, TRAIT_HUSK))
var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
if(istype(H))
H.disfigured = FALSE
update_body()
update_mutantrace()
UpdateAppearance() // reset hair from DNA
@@ -1,6 +1,6 @@
/mob/living/carbon/human/emote(act, m_type = 1, message = null, force)
if((stat == DEAD) || (status_flags & FAKEDEATH))
if((stat == DEAD) || HAS_TRAIT(src, TRAIT_FAKEDEATH))
return // No screaming bodies
var/param = null
@@ -37,7 +37,7 @@
on_CD = handle_emote_CD()
emote("gasp")
return
switch(act) //This switch adds cooldowns to some emotes
if("ping", "pings", "buzz", "buzzes", "beep", "beeps", "yes", "no", "buzz2")
var/found_machine_head = FALSE
@@ -37,7 +37,7 @@
if(C == src.head || C == src.wear_suit || C == src.wear_mask || C == src.w_uniform || C == src.belt || C == src.back)
if(C.species_disguise)
displayed_species = C.species_disguise
if(skipjumpsuit && skipface || (NO_EXAMINE in dna.species.species_traits)) //either obscured or on the nospecies list
if(skipjumpsuit && skipface || HAS_TRAIT(src, TRAIT_NOEXAMINE)) //either obscured or on the nospecies list
msg += "!\n" //omit the species when examining
else if(displayed_species == "Slime People") //snowflakey because Slime People are defined as a plural
msg += ", a<b><font color='[examine_color]'> slime person</font></b>!\n"
@@ -177,7 +177,7 @@
var/appears_dead = FALSE
if(stat == DEAD || (status_flags & FAKEDEATH))
if(stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH))
appears_dead = TRUE
if(suiciding)
msg += "<span class='warning'>[p_they(TRUE)] appear[p_s()] to have committed suicide... there is no hope of recovery.</span>\n"
@@ -298,7 +298,7 @@
if(nutrition < NUTRITION_LEVEL_HYPOGLYCEMIA)
msg += "[p_they(TRUE)] [p_are()] severely malnourished.\n"
if(FAT in mutations)
if(HAS_TRAIT(src, TRAIT_FAT))
msg += "[p_they(TRUE)] [p_are()] morbidly obese.\n"
if(user.nutrition < NUTRITION_LEVEL_HYPOGLYCEMIA)
msg += "[p_they(TRUE)] [p_are()] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
+14 -26
View File
@@ -504,7 +504,7 @@
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
/mob/living/carbon/human/proc/get_face_name()
var/obj/item/organ/external/head = get_organ("head")
if(!head || head.disfigured || cloneloss > 50 || !real_name || (HUSK in mutations)) //disfigured. use id-name if possible
if(!head || head.disfigured || cloneloss > 50 || !real_name || HAS_TRAIT(src, TRAIT_HUSK)) //disfigured. use id-name if possible
return "Unknown"
return real_name
@@ -1007,7 +1007,7 @@
else
target_zone = user.zone_selected
if(PIERCEIMMUNE in dna.species.species_traits)
if(HAS_TRAIT(src, TRAIT_PIERCEIMMUNE))
. = FALSE
var/obj/item/organ/external/affecting = get_organ(target_zone)
@@ -1127,12 +1127,9 @@
check_and_regenerate_organs(src) //Regenerate limbs and organs only if they're really missing.
surgeries.Cut() //End all surgeries.
if(!isskeleton(src) && (SKELETON in mutations))
mutations.Remove(SKELETON)
if(NOCLONE in mutations)
mutations.Remove(NOCLONE)
if(HUSK in mutations)
mutations.Remove(HUSK)
REMOVE_TRAIT(src, TRAIT_SKELETONIZED, null)
REMOVE_TRAIT(src, TRAIT_BADDNA, null)
cure_husk()
if(!client || !key) //Don't boot out anyone already in the mob.
for(var/obj/item/organ/internal/brain/H in world)
@@ -1161,7 +1158,7 @@
L.damage = L.min_bruised_damage
/mob/living/carbon/human/cuff_resist(obj/item/I)
if(HULK in mutations)
if(HAS_TRAIT(src, TRAIT_HULK))
say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
if(..(I, cuff_break = 1))
unEquip(I)
@@ -1221,7 +1218,7 @@
set_species(new_dna.species.type, retain_damage = TRUE)
dna = new_dna.Clone()
real_name = new_dna.real_name
domutcheck(src, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
domutcheck(src, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
if(!keep_flavor_text)
flavor_text = ""
dna.UpdateSE()
@@ -1247,8 +1244,7 @@
if(gender == PLURAL && oldspecies.has_gender)
change_gender(pick(MALE, FEMALE))
if(oldspecies.default_genes.len)
oldspecies.handle_dna(src, TRUE) // Remove any genes that belong to the old species
oldspecies.handle_dna(src, TRUE) // Remove any mutations that belong to the old species
oldspecies.on_species_loss(src)
@@ -1504,7 +1500,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
if(!get_location_accessible(src, "eyes"))
return FALSE
// Natural eyeshine, any implants, and XRAY - all give shiny appearance.
if((istype(eyes) && eyes.shine()) || istype(eye_implant) || (XRAY in mutations))
if((istype(eyes) && eyes.shine()) || istype(eye_implant) || HAS_TRAIT(src, TRAIT_XRAY_VISION))
return TRUE
return FALSE
@@ -1607,16 +1603,11 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
return
..()
/mob/living/carbon/human/rad_act(amount)
if(RADIMMUNE in dna.species.species_traits)
return SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, amount)
. = ..()
/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/human/H)
if(H == src)
to_chat(src, "<span class='warning'>You cannot perform CPR on yourself!</span>")
return
if(H.stat == DEAD || (H.status_flags & FAKEDEATH))
if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_FAKEDEATH))
to_chat(src, "<span class='warning'>[H.name] is dead!</span>")
return
if(!check_has_mouth())
@@ -1771,12 +1762,9 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
. = ..()
if(G.trigger_guard == TRIGGER_GUARD_NORMAL)
if(HULK in mutations)
if(HAS_TRAIT(src, TRAIT_CHUNKYFINGERS))
to_chat(src, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
return FALSE
if(NOGUNS in dna.species.species_traits)
to_chat(src, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
return FALSE
if(mind && mind.martial_art && mind.martial_art.no_guns) //great dishonor to famiry
to_chat(src, "<span class='warning'>[mind.martial_art.no_guns_message]</span>")
@@ -1901,12 +1889,12 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
. += "---"
/mob/living/carbon/human/adjust_nutrition(change)
if(NO_HUNGER in dna.species.species_traits)
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
return FALSE
return ..()
/mob/living/carbon/human/set_nutrition(change)
if(NO_HUNGER in dna.species.species_traits)
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
return FALSE
return ..()
@@ -1961,7 +1949,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
/mob/living/carbon/human/proc/cleanSE() //remove all disabilities/powers
for(var/block = 1; block <= DNA_SE_LENGTH; block++)
dna.SetSEState(block, FALSE, TRUE)
genemutcheck(src, block, null, MUTCHK_FORCED)
singlemutcheck(src, block, MUTCHK_FORCED)
dna.UpdateSE()
/mob/living/carbon/human/get_spooked()
@@ -14,9 +14,8 @@
health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
//TODO: fix husking
if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD)
ChangeToHusk()
if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD * 2) && stat == DEAD)
become_husk(BURN)
update_stat("updatehealth([reason])")
med_hud_set_health()
@@ -170,17 +169,11 @@
// Defined here solely to take species flags into account without having to recast at mob/living level.
/mob/living/carbon/human/adjustOxyLoss(amount)
if(NO_BREATHE in dna.species.species_traits)
oxyloss = 0
return FALSE
if(dna.species && amount > 0)
amount = amount * dna.species.oxy_mod
. = ..()
/mob/living/carbon/human/setOxyLoss(amount)
if(NO_BREATHE in dna.species.species_traits)
oxyloss = 0
return FALSE
if(dna.species && amount > 0)
amount = amount * dna.species.oxy_mod
. = ..()
@@ -37,7 +37,7 @@ emp_act
return 2
if(mind?.martial_art?.deflection_chance) //Some martial arts users can deflect projectiles!
if(!lying && !(HULK in mutations) && prob(mind.martial_art.deflection_chance)) //But only if they're not lying down, and hulks can't do it
if(!lying && !HAS_TRAIT(src, TRAIT_HULK) && prob(mind.martial_art.deflection_chance)) //But only if they're not lying down, and hulks can't do it
add_attack_logs(P.firer, src, "hit by [P.type] but got deflected by martial arts '[mind.martial_art]'")
visible_message("<span class='danger'>[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!</span>", "<span class='userdanger'>You deflect the projectile!</span>")
return FALSE
@@ -518,7 +518,7 @@ emp_act
else if(I)
if(((throwingdatum ? throwingdatum.speed : I.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || I.embedded_ignore_throwspeed_threshold)
if(can_embed(I))
if(prob(I.embed_chance) && !(PIERCEIMMUNE in dna.species.species_traits))
if(prob(I.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE))
throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
var/obj/item/organ/external/L = pick(bodyparts)
L.embedded_objects |= I
@@ -65,7 +65,7 @@
// standing is poor
if(stance_damage >= 8)
if(!(lying || resting))
if(!(NO_PAIN in dna.species.species_traits))
if(!HAS_TRAIT(src, TRAIT_NOPAIN))
emote("scream")
custom_emote(1, "collapses!")
Weaken(5) //can't emote while weakened, apparently.
@@ -93,7 +93,7 @@
continue
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
custom_emote(1, "[(NO_PAIN in dna.species.species_traits) ? "" : emote_scream ]drops what [p_they()] [p_were()] holding in [p_their()] [E.name]!")
custom_emote(1, "[HAS_TRAIT(src, TRAIT_NOPAIN) ? "" : emote_scream ]drops what [p_they()] [p_were()] holding in [p_their()] [E.name]!")
else if(E.is_malfunctioning())
@@ -119,11 +119,11 @@
/mob/living/carbon/human/proc/becomeSlim()
to_chat(src, "<span class='notice'>You feel fit again!</span>")
mutations.Remove(FAT)
ADD_TRAIT(src, TRAIT_FAT, OBESITY)
/mob/living/carbon/human/proc/becomeFat()
to_chat(src, "<span class='alert'>You suddenly feel blubbery!</span>")
mutations.Add(FAT)
REMOVE_TRAIT(src, TRAIT_FAT, OBESITY)
//Handles chem traces
/mob/living/carbon/human/proc/handle_trace_chems()
+22 -22
View File
@@ -15,7 +15,7 @@
if(.) //not dead
if(check_mutations)
domutcheck(src,null)
domutcheck(src)
update_mutations()
check_mutations = FALSE
@@ -101,7 +101,7 @@
else
//blindness
if(BLINDNESS in mutations) // Disabled-blind, doesn't get better on its own
if(HAS_TRAIT(src, TRAIT_BLIND)) // Disabled-blind, doesn't get better on its own
else if(eye_blind) // Blindness, heals slowly over time
AdjustEyeBlind(-1)
@@ -170,11 +170,11 @@
emote("drool")
/mob/living/carbon/human/handle_mutations_and_radiation()
for(var/datum/dna/gene/gene in GLOB.dna_genes)
if(!gene.block)
for(var/datum/mutation/mutation in GLOB.dna_mutations)
if(!mutation.block)
continue
if(gene.is_active(src))
gene.OnMobLife(src)
if(mutation.is_active(src))
mutation.on_life(src)
if(!ignore_gene_stability && gene_stability < GENETIC_DAMAGE_STAGE_1)
var/instability = DEFAULT_GENE_STABILITY - gene_stability
if(prob(instability * 0.1))
@@ -207,7 +207,7 @@
if(!L || L && (L.status & ORGAN_DEAD))
if(health >= HEALTH_THRESHOLD_CRIT)
adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1)
else if(!(NOCRITDAMAGE in dna.species.species_traits))
else if(!HAS_TRAIT(src, TRAIT_NOCRITDAMAGE))
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
if(dna.species)
@@ -329,7 +329,7 @@
if(status_flags & GODMODE) return 1 //godmode
if(adjusted_pressure >= dna.species.hazard_high_pressure)
if(!(HEATRES in mutations))
if(!HAS_TRAIT(src, TRAIT_RESISTHIGHPRESSURE))
var/pressure_damage = min( ( (adjusted_pressure / dna.species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
take_overall_damage(brute=pressure_damage, updating_health = TRUE, used_weapon = "High Pressure")
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
@@ -342,7 +342,7 @@
else if(adjusted_pressure >= dna.species.hazard_low_pressure)
throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
else
if(COLDRES in mutations)
if(HAS_TRAIT(src, TRAIT_RESISTLOWPRESSURE))
clear_alert("pressure")
else
take_overall_damage(brute=LOW_PRESSURE_DAMAGE, updating_health = TRUE, used_weapon = "Low Pressure")
@@ -354,7 +354,7 @@
. = ..()
if(!.)
return
if(HEATRES in mutations)
if(HAS_TRAIT(src, TRAIT_NOFIRE))
return
var/thermal_protection = get_thermal_protection()
@@ -417,7 +417,7 @@
/mob/living/carbon/human/proc/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to.
if(HEATRES in mutations)
if(HAS_TRAIT(src, TRAIT_RESISTHEAT))
return 1
var/thermal_protection_flags = get_heat_protection_flags(temperature)
@@ -478,7 +478,7 @@
/mob/living/carbon/human/proc/get_cold_protection(temperature)
if(COLDRES in mutations)
if(HAS_TRAIT(src, TRAIT_RESISTCOLD))
return 1 //Fully protected from the cold.
temperature = max(temperature, TCMB) //There is an occasional bug where the temperature is miscalculated in areas with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K.
@@ -536,12 +536,12 @@
if(status_flags & GODMODE)
return 0 //godmode
if(!(NO_HUNGER in dna.species.species_traits))
if(FAT in mutations)
if(!HAS_TRAIT(src, TRAIT_NOHUNGER))
if(HAS_TRAIT(src, TRAIT_FAT))
if(overeatduration < 100)
becomeSlim()
else
if(overeatduration > 500 && !(NO_OBESITY in dna.species.species_traits))
if(overeatduration > 500 && !HAS_TRAIT(src, TRAIT_NOFAT))
becomeFat()
// nutrition decrease
@@ -564,8 +564,8 @@
else
if(overeatduration > 1)
if(OBESITY in mutations)
overeatduration -= 1 // Those with obesity gene take twice as long to unfat
if(HAS_TRAIT(src, TRAIT_SLOWDIGESTION))
overeatduration -= 1 // Those with slow digestion trait, it takes longer to lose weight
else
overeatduration -= 2
@@ -626,7 +626,7 @@
var/collapse_start = 75
var/braindamage_start = 120
var/alcohol_strength = drunk
var/sober_str =! (SOBER in mutations) ? 1 : 2
var/sober_str = !HAS_TRAIT(src, TRAIT_ALCOHOL_TOLERANCE) ? 1 : 2
alcohol_strength /= sober_str
@@ -800,7 +800,7 @@
healthdoll.cached_healthdoll_overlays = new_overlays
/mob/living/carbon/human/proc/handle_nutrition_alerts() //This is a terrible abuse of the alert system; something like this should be a HUD element
if(NO_HUNGER in dna.species.species_traits)
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
return
if(mind?.vampire && (mind in SSticker.mode.vampires)) //Vampires
switch(nutrition)
@@ -887,7 +887,7 @@
if(blood_volume <= BLOOD_VOLUME_BAD)//how much blood do we have
temp = PULSE_THREADY //not enough :(
if(status_flags & FAKEDEATH)
if(HAS_TRAIT(src, TRAIT_FAKEDEATH))
temp = PULSE_NONE //pretend that we're dead. unlike actual death, can be inflienced by meds
for(var/datum/reagent/R in reagents.reagent_list)
@@ -912,7 +912,7 @@
/mob/living/carbon/human/proc/handle_decay()
var/decaytime = world.time - timeofdeath
if(NO_DECAY in dna.species.species_traits)
if(HAS_TRAIT(src, TRAIT_NODECAY))
return
if(reagents.has_reagent("formaldehyde")) //embalming fluid stops decay
@@ -943,7 +943,7 @@
var/obj/item/clothing/mask/M = H.wear_mask
if(M && (M.flags_cover & MASKCOVERSMOUTH))
continue
if(NO_BREATHE in H.dna.species.species_traits)
if(HAS_TRAIT(H, TRAIT_NOBREATH))
continue //no puking if you can't smell!
// Humans can lack a mind datum, y'know
if(H.mind && (H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Coroner"))
+8 -10
View File
@@ -96,7 +96,7 @@
if(translator && translator.active)
return TRUE
// how do species that don't breathe talk? magic, that's what.
var/breathes = (!(NO_BREATHE in dna.species.species_traits))
var/breathes = (!HAS_TRAIT(src, TRAIT_NOBREATH))
var/obj/item/organ/internal/L = get_organ_slot("lungs")
if((breathes && !L) || breathes && L && (L.status & ORGAN_DEAD))
return FALSE
@@ -129,12 +129,10 @@
S.message = "<span class='[span]'>[S.message]</span>"
verb = translator.speech_verb
return list("verb" = verb)
if((COMIC in mutations) \
|| (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) \
|| HAS_TRAIT(src, TRAIT_JESTER))
if(HAS_TRAIT(src, TRAIT_COMIC_SANS))
span = "sans"
if(WINGDINGS in mutations)
if(HAS_TRAIT(src, TRAIT_WINGDINGS))
span = "wingdings"
var/list/parent = ..()
@@ -144,7 +142,7 @@
if(S.speaking && S.speaking.flags & NO_STUTTER)
continue
if(silent || (MUTE in mutations))
if(silent || HAS_TRAIT(src, TRAIT_MUTE))
S.message = ""
if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
@@ -154,11 +152,11 @@
verb = pick("whinnies", "neighs", "says")
if(dna)
for(var/datum/dna/gene/gene in GLOB.dna_genes)
if(!gene.block)
for(var/datum/mutation/mutation in GLOB.dna_mutations)
if(!mutation.block)
continue
if(gene.is_active(src))
S.message = gene.OnSay(src, S.message)
if(mutation.is_active(src))
S.message = mutation.on_say(src, S.message)
var/braindam = getBrainLoss()
if(braindam >= 60)
@@ -57,7 +57,6 @@
var/punchdamagelow = 0 //lowest possible punch damage
var/punchdamagehigh = 9 //highest possible punch damage
var/punchstunthreshold = 9 //damage at which punches from this race will stun //yes it should be to the attacked race but it's not useful that way even if it's logical
var/list/default_genes = list()
var/ventcrawler = VENTCRAWLER_NONE //Determines if the mob can go through the vents.
var/has_fine_manipulation = 1 // Can use small items.
@@ -65,6 +64,8 @@
var/list/allowed_consumed_mobs = list() //If a species can consume mobs, put the type of mobs it can consume here.
var/list/species_traits = list()
///Generic traits tied to having the species.
var/list/inherent_traits = list()
var/breathid = "o2"
@@ -212,7 +213,7 @@
ears = new mutantears(H)
/datum/species/proc/breathe(mob/living/carbon/human/H)
if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations))
if(HAS_TRAIT(H, TRAIT_NOBREATH))
return TRUE
////////////////
@@ -222,17 +223,15 @@
/datum/species/proc/movement_delay(mob/living/carbon/human/H)
. = 0 //We start at 0.
if(H.status_flags & IGNORE_SPEED_CHANGES)
return .
if(has_gravity(H))
if(H.status_flags & GOTTAGOFAST)
if(HAS_TRAIT(H, TRAIT_GOTTAGOFAST))
. -= 1
else if(H.status_flags & GOTTAGONOTSOFAST)
else if(HAS_TRAIT(H, TRAIT_GOTTAGONOTSOFAST))
. -= 0.5
var/ignoreslow = FALSE
if((H.status_flags & IGNORESLOWDOWN) || (RUN in H.mutations))
if(HAS_TRAIT(H, TRAIT_IGNORESLOWDOWN))
ignoreslow = TRUE
var/flight = H.flying //Check for flight and flying items
@@ -259,16 +258,17 @@
for(var/datum/reagent/R in H.reagents.reagent_list)
if(R.shock_reduction)
health_deficiency -= R.shock_reduction
if(health_deficiency >= 40)
if(flight)
. += (health_deficiency / 75)
else
. += (health_deficiency / 25)
if(!HAS_TRAIT(H, TRAIT_IGNOREDAMAGESLOWDOWN))
if(health_deficiency >= 40)
if(flight)
. += (health_deficiency / 75)
else
. += (health_deficiency / 25)
. += 2 * H.stance_damage //damaged/missing feet or legs is slow
if((hungry >= 70) && !flight)
. += hungry/50
if(FAT in H.mutations)
if(HAS_TRAIT(H, TRAIT_FAT))
. += (1.5 - flight)
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
. += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
@@ -286,11 +286,22 @@
H.hud_used.update_locked_slots()
H.ventcrawler = ventcrawler
for(var/X in inherent_traits)
ADD_TRAIT(H, X, SPECIES_TRAIT)
if(TRAIT_VIRUSIMMUNE in inherent_traits)
for(var/datum/disease/A in H.viruses)
if(!A.bypasses_immunity)
A.cure(FALSE)
if(inherent_factions)
for(var/i in inherent_factions)
H.faction += i //Using +=/-= for this in case you also gain the faction from a different source.
/datum/species/proc/on_species_loss(mob/living/carbon/human/H)
for(var/X in inherent_traits)
REMOVE_TRAIT(H, X, SPECIES_TRAIT)
if(H.butcher_results) //clear it out so we don't butcher a actual human.
H.butcher_results = null
H.ventcrawler = initial(H.ventcrawler)
@@ -317,8 +328,8 @@
// For special snowflake species effects
// (Slime People changing color based on the reagents they consume)
/datum/species/proc/handle_life(mob/living/carbon/human/H)
if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations))
var/takes_crit_damage = (!(NOCRITDAMAGE in species_traits))
if(HAS_TRAIT(H, TRAIT_NOBREATH))
var/takes_crit_damage = (!HAS_TRAIT(H, TRAIT_NOCRITDAMAGE))
if((H.health <= HEALTH_THRESHOLD_CRIT) && takes_crit_damage)
H.adjustBruteLoss(1)
return
@@ -376,7 +387,7 @@
/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(attacker_style && attacker_style.help_act(user, target) == TRUE)//adminfu only...
return TRUE
if(target.health >= HEALTH_THRESHOLD_CRIT && !(target.status_flags & FAKEDEATH))
if(target.health >= HEALTH_THRESHOLD_CRIT && !HAS_TRAIT(target, TRAIT_FAKEDEATH))
target.help_shake_act(user)
return TRUE
else
@@ -404,7 +415,7 @@
if(target.mind && target.mind.vampire && (target.mind in SSticker.mode.vampires))
to_chat(user, "<span class='warning'>Your fangs fail to pierce [target.name]'s cold flesh</span>")
return
if(SKELETON in target.mutations)
if(HAS_TRAIT(target, TRAIT_SKELETONIZED))
to_chat(user, "<span class='warning'>There is no blood in a skeleton!</span>")
return
//we're good to suck the blood, blaah
@@ -750,7 +761,7 @@
return FALSE
/datum/species/proc/handle_mutations_and_radiation(mob/living/carbon/human/H)
if(RADIMMUNE in species_traits)
if(HAS_TRAIT(H, TRAIT_RADIMMUNE))
H.radiation = 0
return TRUE
@@ -771,7 +782,7 @@
to_chat(H, "<span class='danger'>You mutate!</span>")
randmutb(H)
H.emote("gasp")
domutcheck(H, null)
domutcheck(H)
if(radiation > RAD_MOB_HAIRLOSS)
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
@@ -873,7 +884,11 @@ It'll return null if the organ doesn't correspond, so include null checks when u
if(H.vision_type.light_sensitive)
H.weakeyes = TRUE
if(XRAY in H.mutations)
if(HAS_TRAIT(src, TRAIT_THERMAL_VISION))
H.sight |= (SEE_MOBS)
H.lighting_alpha = min(H.lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
if(HAS_TRAIT(H, TRAIT_XRAY_VISION))
H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
if(H.has_status_effect(STATUS_EFFECT_SUMMONEDGHOST))
@@ -906,7 +921,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
/datum/species/proc/can_hear(mob/living/carbon/human/H)
. = FALSE
var/obj/item/organ/internal/ears/ears = H.get_int_organ(/obj/item/organ/internal/ears)
if(istype(ears) && !ears.deaf)
if(istype(ears) && !HAS_TRAIT(H, TRAIT_DEAF))
. = TRUE
/**
@@ -14,7 +14,8 @@
"eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight.
)
species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS, NO_HUNGER, NO_EXAMINE)
species_traits = list(NO_BLOOD)
inherent_traits = list(TRAIT_VIRUSIMMUNE, TRAIT_CHUNKYFINGERS, TRAIT_NOHUNGER, TRAIT_NOBREATH, TRAIT_NOEXAMINE)
dies_at_threshold = TRUE
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
@@ -21,7 +21,8 @@
even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
water and other radiation."
species_traits = list(IS_PLANT, NO_GERMS, NO_DECAY)
species_traits = list(IS_PLANT)
inherent_traits = list(TRAIT_NOGERMS, TRAIT_NODECAY)
clothing_flags = HAS_SOCKS
default_hair_colour = "#000000"
has_gender = FALSE
@@ -112,6 +113,26 @@
H.adjustBruteLoss(2)
..()
/datum/species/diona/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
switch(P.type)
if(/obj/item/projectile/energy/floramut)
if(prob(15))
H.rad_act(rand(30, 80))
H.Weaken(5)
H.visible_message("<span class='warning'>[H] writhes in pain as [H.p_their()] vacuoles boil.</span>", "<span class='userdanger'>You writhe in pain as your vacuoles boil!</span>", "<span class='italics'>You hear the crunching of leaves.</span>")
if(prob(80))
randmutb(H)
domutcheck(H)
else
randmutg(H)
domutcheck(H)
else
H.adjustFireLoss(rand(5, 15))
H.show_message("<span class='warning'>The radiation beam singes you!</span>")
if(/obj/item/projectile/energy/florayield)
H.set_nutrition(min(H.nutrition + 30, NUTRITION_LEVEL_FULL))
return TRUE
/datum/species/diona/pod //Same name and everything; we want the same limitations on them; we just want their regeneration to kick in at all times and them to have special factions
pod = TRUE
inherent_factions = list("plants", "vines")
@@ -5,7 +5,8 @@
icobase = 'icons/mob/human_races/r_golem.dmi'
deform = 'icons/mob/human_races/r_golem.dmi'
species_traits = list(NO_BREATHE, NO_BLOOD, NO_PAIN, RADIMMUNE, NOGUNS, PIERCEIMMUNE)
species_traits = list(NO_BLOOD)
inherent_traits = list(TRAIT_RESISTHEAT, TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_NOFIRE, TRAIT_CHUNKYFINGERS, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOPAIN)
dies_at_threshold = TRUE
speed_mod = 2
brute_mod = 0.45 //55% damage reduction
@@ -24,19 +25,6 @@
dietflags = DIET_OMNI //golems can eat anything because they are magic or something
reagent_tag = PROCESS_ORG
warning_low_pressure = -INFINITY
hazard_low_pressure = -INFINITY
hazard_high_pressure = INFINITY
warning_high_pressure = INFINITY
cold_level_1 = -INFINITY
cold_level_2 = -INFINITY
cold_level_3 = -INFINITY
heat_level_1 = INFINITY
heat_level_2 = INFINITY
heat_level_3 = INFINITY
blood_color = "#515573"
flesh_color = "#137E8F"
skinned_type = /obj/item/stack/sheet/metal
@@ -138,10 +126,9 @@
/datum/species/golem/plasma
name = "Plasma Golem"
skinned_type = /obj/item/stack/ore/plasma
//Can burn and takes damage from heat
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_CHUNKYFINGERS, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOPAIN) //no RESISTHEAT, NOFIRE
golem_colour = rgb(170, 51, 221)
heat_level_1 = 360
heat_level_2 = 400
heat_level_3 = 460
info_text = "As a <span class='danger'>Plasma Golem</span>, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!"
heatmod = 0 //fine until they blow up
prefix = "Plasma"
@@ -327,8 +314,9 @@
name = "Wood Golem"
golem_colour = rgb(158, 112, 75)
skinned_type = /obj/item/stack/sheet/wood
species_traits = list(NO_BREATHE, NO_BLOOD, NO_PAIN, RADIMMUNE, NOGUNS, PIERCEIMMUNE, IS_PLANT)
species_traits = list(NO_BLOOD, IS_PLANT) // Refactor into biotype
//Can burn and take damage from heat
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_CHUNKYFINGERS, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOPAIN)
brute_mod = 0.7 //30% damage reduction down from 55%
burn_mod = 0.875
tox_mod = 0.7
@@ -336,11 +324,6 @@
brain_mod = 0.7
stamina_mod = 0.7
heatmod = 1.5
heat_level_1 = 300
heat_level_2 = 340
heat_level_3 = 400
dietflags = DIET_HERB // Plants eat...plants?
info_text = "As a <span class='danger'>Wooden Golem</span>, you have plant-like traits: you take damage from extreme temperatures, can be set on fire, and have lower armor than a normal golem. You regenerate when in the light and wither in the darkness."
@@ -616,7 +599,7 @@
prefix = "Bananium"
special_names = null
unarmed_type = /datum/unarmed_attack/golem/bananium
inherent_traits = list(TRAIT_RESISTHEAT, TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_NOFIRE, TRAIT_CHUNKYFINGERS, TRAIT_CLUMSY, TRAIT_COMIC_SANS, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOPAIN)
var/last_honk = 0
var/honkooldown = 0
var/last_banana = 0
@@ -627,7 +610,6 @@
..()
last_banana = world.time
last_honk = world.time
H.mutations.Add(COMIC)
H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/bikehorn(H), slot_l_store)
H.AddElement(/datum/element/waddling)
@@ -19,8 +19,6 @@
brute_mod = 1.25 //greys are fragile
default_genes = list(REMOTE_TALK)
species_traits = list(LIPS, IS_WHITELISTED, CAN_WINGDINGS)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_BODY_MARKINGS
@@ -32,9 +30,12 @@
/datum/species/grey/handle_dna(mob/living/carbon/human/H, remove)
..()
H.dna.SetSEState(GLOB.remotetalkblock, !remove, 1)
genemutcheck(H, GLOB.remotetalkblock, null, MUTCHK_FORCED)
H.dna.default_blocks.Add(GLOB.remotetalkblock)
H.dna.SetSEState(GLOB.remotetalkblock, !remove, TRUE)
singlemutcheck(H, GLOB.remotetalkblock, MUTCHK_FORCED)
if(!remove)
H.dna.default_blocks.Add(GLOB.remotetalkblock)
else
H.dna.default_blocks.Remove(GLOB.remotetalkblock)
/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source, method = REAGENT_TOUCH)
. = ..()
@@ -68,7 +69,7 @@
/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H)
var/translator_pref = H.client.prefs.speciesprefs
if(translator_pref || ((ismindshielded(H) || J.is_command || J.supervisors == "the captain") && (WINGDINGS in H.mutations)))
if(translator_pref || ((ismindshielded(H) || J.is_command || J.supervisors == "the captain") && HAS_TRAIT(H, TRAIT_WINGDINGS)))
if(J.title == "Mime")
return
if(J.title == "Clown")
@@ -22,7 +22,8 @@
death_message = "gives a short series of shrill beeps, their chassis shuddering before falling limp, nonfunctional."
death_sounds = list('sound/voice/borg_deathsound.ogg') //I've made this a list in the event we add more sounds for dead robots.
species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_BLOOD, NO_SCAN, NO_INTORGANS, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NO_GERMS, NO_DECAY, NOTRANSSTING) //Computers that don't decay? What a lie!
species_traits = list(IS_WHITELISTED, NO_BLOOD, NO_CLONESCAN, NO_INTORGANS, NOTRANSSTING)
inherent_traits = list(TRAIT_VIRUSIMMUNE, TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_NOGERMS, TRAIT_NODECAY, TRAIT_NOPAIN, TRAIT_GENELESS) //Computers that don't decay? What a lie!
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS
dietflags = 0 //IPCs can't eat, so no diet
@@ -10,7 +10,7 @@
blood_mask = 'icons/mob/human_races/masks/blood_monkey.dmi'
language = null
default_language = "Chimpanzee"
species_traits = list(NO_EXAMINE)
inherent_traits = list(TRAIT_NOEXAMINE)
skinned_type = /obj/item/stack/sheet/animalhide/monkey
greater_form = /datum/species/human
no_equip = list(slot_belt, slot_wear_id, slot_l_ear, slot_r_ear, slot_glasses, slot_gloves, slot_shoes, slot_wear_suit, slot_w_uniform, slot_l_store, slot_r_store, slot_s_store, slot_wear_pda)
@@ -59,7 +59,7 @@
..()
if(!remove)
H.dna.SetSEState(GLOB.monkeyblock, TRUE)
genemutcheck(H, GLOB.monkeyblock, null, MUTCHK_FORCED)
singlemutcheck(H, GLOB.monkeyblock, MUTCHK_FORCED)
/datum/species/monkey/tajaran
name = "Farwa"
@@ -123,6 +123,8 @@
reagent_tag = PROCESS_ORG
tail = null
inherent_traits = list(TRAIT_NOEXAMINE, TRAIT_NOFAT, TRAIT_WATERBREATH)
has_organ = list(
"heart" = /obj/item/organ/internal/heart/skrell,
"lungs" = /obj/item/organ/internal/lungs/skrell,
@@ -132,13 +134,6 @@
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/skrell //Tajara monkey-forms are uniquely colourblind and have excellent darksight, which is why they need a subtype of their greater-form's organ..
)
/datum/species/monkey/skrell/on_species_gain(mob/living/carbon/human/H)
..()
ADD_TRAIT(H, TRAIT_WATERBREATH, "species")
/datum/species/monkey/skrell/on_species_loss(mob/living/carbon/human/H)
..()
REMOVE_TRAIT(H, TRAIT_WATERBREATH, "species")
/datum/species/monkey/unathi
name = "Stok"
@@ -13,7 +13,8 @@
language = "Sol Common"
burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores
brute_mod = 2 // damn, double wham, double dam
species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_BLOOD, NO_PAIN, NO_SCAN, RADIMMUNE)
species_traits = list(LIPS, IS_WHITELISTED, NO_BLOOD, NO_CLONESCAN)
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_NOPAIN)
dies_at_threshold = TRUE
dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet
@@ -6,7 +6,8 @@
dangerous_existence = TRUE //So so much
//language = "Clatter"
species_traits = list(IS_WHITELISTED, RADIMMUNE, NO_BLOOD, NO_HUNGER, NOTRANSSTING)
species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
inherent_traits = list(TRAIT_RADIMMUNE, TRAIT_NOHUNGER)
forced_heartattack = TRUE // Plasmamen have no blood, but they should still get heart-attacks
skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently*
dietflags = DIET_OMNI
@@ -143,26 +144,21 @@
return FALSE
/datum/species/plasmaman/handle_life(mob/living/carbon/human/H)
var/datum/gas_mixture/environment = H.loc.return_air()
var/atmos_sealed = FALSE
if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing))
var/obj/item/clothing/CS = H.wear_suit
var/obj/item/clothing/CH = H.head
if (CS.flags & CH.flags & STOPSPRESSUREDMAGE)
atmos_sealed = TRUE
if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman)) && !atmos_sealed)
var/atmos_sealed = !HAS_TRAIT(H, TRAIT_NOFIRE) && (isclothing(H.wear_suit) && H.wear_suit.flags & STOPSPRESSUREDMAGE) && (isclothing(H.head) && H.head.flags & STOPSPRESSUREDMAGE)
if(!atmos_sealed && (!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman)))
var/datum/gas_mixture/environment = H.loc.return_air()
if(environment)
if(environment.total_moles())
if(environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Same threshhold that extinguishes fire
H.adjust_fire_stacks(0.5)
if(!H.on_fire && H.fire_stacks > 0)
H.visible_message("<span class='danger'>[H]'s body reacts with the atmosphere and bursts into flames!</span>","<span class='userdanger'>Your body reacts with the atmosphere and bursts into flame!</span>")
H.IgniteMob()
else
if(H.fire_stacks)
var/obj/item/clothing/under/plasmaman/P = H.w_uniform
if(istype(P))
P.Extinguish(H)
if(!HAS_TRAIT(H, TRAIT_NOFIRE))
if(environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Same threshhold that extinguishes fire
H.adjust_fire_stacks(0.5)
if(!H.on_fire && H.fire_stacks > 0)
H.visible_message("<span class='danger'>[H]'s body reacts with the atmosphere and bursts into flames!</span>","<span class='userdanger'>Your body reacts with the atmosphere and bursts into flame!</span>")
H.IgniteMob()
else if(H.fire_stacks)
var/obj/item/clothing/under/plasmaman/P = H.w_uniform
if(istype(P))
P.Extinguish(H)
H.update_fire()
..()
@@ -16,7 +16,8 @@
"eyes" = /obj/item/organ/internal/eyes/shadow //8 darksight.
)
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE)
species_traits = list(NO_BLOOD)
inherent_traits = list(TRAIT_VIRUSIMMUNE, TRAIT_NOBREATH, TRAIT_RADIMMUNE)
dies_at_threshold = TRUE
dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race
@@ -9,7 +9,8 @@
blood_color = "#555555"
flesh_color = "#222222"
species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS, NO_HUNGER, NO_EXAMINE) //Can't use guns due to muzzle flash
species_traits = list(NO_BLOOD) //Can't use guns due to muzzle flash
inherent_traits = list(TRAIT_CHUNKYFINGERS, TRAIT_NOHUNGER, TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_NOEXAMINE)
burn_mod = 1.5 //1.5x burn damage, 2x is excessive
heatmod = 1.5
@@ -42,8 +43,8 @@
H.adjustToxLoss(-5)
H.adjustBrainLoss(-25) //Shad O. Ling gibbers, "CAN U BE MY THRALL?!!"
H.AdjustEyeBlurry(-1)
H.CureNearsighted()
H.CureBlind()
H.cure_nearsighted()
H.cure_blind()
H.adjustCloneLoss(-1)
H.SetWeakened(0)
H.SetStunned(0)
@@ -59,7 +60,8 @@
blood_color = "#CCCCCC"
flesh_color = "#AAAAAA"
species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NO_HUNGER, NO_EXAMINE)
species_traits = list(NO_BLOOD)
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_NOHUNGER, TRAIT_NOEXAMINE)
burn_mod = 1.1
heatmod = 1.1
@@ -10,7 +10,10 @@
blood_color = "#FFFFFF"
flesh_color = "#E6E6C6"
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE, NO_HUNGER, PIERCEIMMUNE)
species_traits = list(NO_BLOOD)
inherent_traits = list(TRAIT_RESISTHEAT, TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOHUNGER, TRAIT_XENO_IMMUNE)
tox_mod = 0
clone_mod = 0
dies_at_threshold = TRUE
skinned_type = /obj/item/stack/sheet/bone
@@ -19,19 +22,6 @@
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
warning_low_pressure = -INFINITY
hazard_low_pressure = -INFINITY
hazard_high_pressure = INFINITY
warning_high_pressure = INFINITY
cold_level_1 = -INFINITY
cold_level_2 = -INFINITY
cold_level_3 = -INFINITY
heat_level_1 = INFINITY
heat_level_2 = INFINITY
heat_level_3 = INFINITY
suicide_messages = list(
"is snapping their own bones!",
"is collapsing into a pile!",
@@ -13,7 +13,8 @@
the secrets of their empire to their allies."
species_traits = list(LIPS, NO_OBESITY)
species_traits = list(LIPS)
inherent_traits = list(TRAIT_NOFAT, TRAIT_WATERBREATH)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS
dietflags = DIET_HERB
@@ -45,11 +46,3 @@
"is twisting their own neck!",
"makes like a fish and suffocates!",
"is strangling themselves with their own tendrils!")
/datum/species/skrell/on_species_gain(mob/living/carbon/human/H)
..()
ADD_TRAIT(H, TRAIT_WATERBREATH, "species")
/datum/species/skrell/on_species_loss(mob/living/carbon/human/H)
..()
REMOVE_TRAIT(H, TRAIT_WATERBREATH, "species")
@@ -26,7 +26,8 @@
male_cough_sounds = list('sound/effects/slime_squish.ogg')
female_cough_sounds = list('sound/effects/slime_squish.ogg')
species_traits = list(LIPS, IS_WHITELISTED, NO_SCAN, EXOTIC_COLOR)
species_traits = list(LIPS, IS_WHITELISTED, NO_CLONESCAN, EXOTIC_COLOR)
inherent_traits = list(TRAIT_WATERBREATH)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | NO_EYES
dietflags = DIET_CARN
@@ -73,7 +74,6 @@
grow.Grant(H)
recolor = new()
recolor.Grant(H)
ADD_TRAIT(H, TRAIT_WATERBREATH, "species")
RegisterSignal(H, COMSIG_HUMAN_UPDATE_DNA, /datum/species/slime/./proc/blend)
blend(H)
@@ -84,7 +84,6 @@
grow.Remove(H)
if(recolor)
recolor.Remove(H)
REMOVE_TRAIT(H, TRAIT_WATERBREATH, "species")
UnregisterSignal(H, COMSIG_HUMAN_UPDATE_DNA)
/datum/species/slime/proc/blend(mob/living/carbon/human/H)
@@ -112,8 +111,10 @@
/datum/species/slime/can_hear() // fucking snowflakes
. = TRUE
/datum/species/slime/can_hear(mob/living/carbon/human/H) // fucking snowflakes
. = FALSE
if(!HAS_TRAIT(H, TRAIT_DEAF))
. = TRUE
/datum/action/innate/slimecolor
name = "Toggle Recolor"
@@ -117,4 +117,4 @@
default_language = "Sinta'unathi"
speed_mod = -0.80
species_traits = list(NO_BREATHE, NOGUNS)
inherent_traits = list(TRAIT_CHUNKYFINGERS, TRAIT_NOBREATH)
@@ -23,7 +23,8 @@
eyes = "vox_eyes_s"
species_traits = list(NO_SCAN, NO_GERMS, NO_DECAY, IS_WHITELISTED, NOTRANSSTING)
species_traits = list(NO_CLONESCAN, IS_WHITELISTED, NOTRANSSTING)
inherent_traits = list(TRAIT_NOGERMS, TRAIT_NODECAY)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS //Species-fitted 'em all.
dietflags = DIET_OMNI
bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS
@@ -150,23 +151,13 @@
unarmed_type = /datum/unarmed_attack/claws/armalis
blacklisted = TRUE
warning_low_pressure = 50
hazard_low_pressure = 0
cold_level_1 = 80
cold_level_2 = 50
cold_level_3 = 0
heat_level_1 = 2000
heat_level_2 = 3000
heat_level_3 = 4000
brute_mod = 0.2
burn_mod = 0.2
eyes = "blank_eyes"
species_traits = list(NO_SCAN, NO_GERMS, NO_DECAY, NO_BLOOD, NO_PAIN, IS_WHITELISTED)
species_traits = list(NO_CLONESCAN, NO_BLOOD, IS_WHITELISTED)
inherent_traits = list(TRAIT_RESISTHEAT, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_NOFIRE, TRAIT_NOPAIN, TRAIT_NOGERMS, TRAIT_NODECAY)
clothing_flags = 0 //IDK if you've ever seen underwear on an Armalis, but it ain't pretty.
bodyflags = HAS_TAIL
dies_at_threshold = TRUE
@@ -35,7 +35,8 @@
"antennae" = /obj/item/organ/internal/wryn/hivenode
)
species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_SCAN, HIVEMIND)
species_traits = list(LIPS, IS_WHITELISTED, NO_CLONESCAN, HIVEMIND)
inherent_traits = list(TRAIT_NOBREATH)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR
dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too
@@ -1,9 +1,3 @@
/mob/living/carbon/human/SetLoseBreath(amount)
if(NO_BREATHE in dna.species.species_traits)
losebreath = 0
return FALSE
. = ..()
/mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0)
if(dna.species.stun_mod)
amount = amount * dna.species.stun_mod
@@ -172,9 +172,9 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
var/husk_color_mod = rgb(96, 88, 80)
var/hulk_color_mod = rgb(48, 224, 40)
var/husk = (HUSK in mutations)
var/hulk = (HULK in mutations)
var/skeleton = (SKELETON in mutations)
var/husk = HAS_TRAIT(src, TRAIT_HUSK)
var/hulk = HAS_TRAIT(src, TRAIT_HULK)
var/skeleton = HAS_TRAIT(src, TRAIT_SKELETONIZED)
if(dna.species && dna.species.bodyflags & HAS_ICON_SKIN_TONE)
dna.species.updatespeciescolor(src)
@@ -450,20 +450,18 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
if(gender == FEMALE)
g = "f"
// DNA2 - Drawing underlays.
for(var/datum/dna/gene/gene in GLOB.dna_genes)
if(!gene.block)
for(var/datum/mutation/mutation in GLOB.dna_mutations)
if(!mutation.block)
continue
if(gene.is_active(src))
var/underlay = gene.OnDrawUnderlays(src, g)
if(mutation.is_active(src))
var/underlay = mutation.on_draw_underlays(src, g)
if(underlay)
standing.underlays += underlay
add_image = 1
for(var/mut in mutations)
switch(mut)
if(LASER)
standing.overlays += "lasereyes_s"
add_image = 1
if((COLDRES in mutations) && (HEATRES in mutations))
if(HAS_TRAIT(src, TRAIT_LASEREYES))
standing.overlays += "lasereyes_s"
add_image = 1
if(dna.GetSEState(GLOB.fireblock) && dna.GetSEState(GLOB.coldblock))
standing.underlays -= "cold_s"
standing.underlays -= "fire_s"
standing.underlays += "coldfire_s"
@@ -475,7 +473,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
/mob/living/carbon/human/proc/update_mutantrace()
//BS12 EDIT
var/skel = (SKELETON in mutations)
var/skel = HAS_TRAIT(src, TRAIT_SKELETONIZED)
if(skel)
skeleton = 'icons/mob/human_races/r_skeleton.dmi'
else
@@ -1300,9 +1298,9 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
return out
/mob/living/carbon/human/proc/generate_icon_render_key()
var/husk = (HUSK in mutations)
var/hulk = (HULK in mutations)
var/skeleton = (SKELETON in mutations)
var/husk = HAS_TRAIT(src, TRAIT_HUSK)
var/hulk = HAS_TRAIT(src, TRAIT_HULK)
var/skeleton = HAS_TRAIT(src, TRAIT_SKELETONIZED)
var/g = dna.GetUITriState(DNA_UI_GENDER)
if(g == DNA_GENDER_PLURAL)
g = DNA_GENDER_FEMALE
@@ -12,7 +12,7 @@
/mob/living/carbon/human/update_nearsighted_effects()
var/obj/item/clothing/glasses/G = glasses
if((NEARSIGHTED in mutations) && (!istype(G) || !G.prescription))
if(HAS_TRAIT(src, TRAIT_NEARSIGHT) && (!istype(G) || !G.prescription))
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
else
clear_fullscreen("nearsighted")
@@ -7,12 +7,11 @@
var/name
var/desc
var/class
var/list/default_genes = list(REGEN, BREATHLESS, COLDRES)
var/list/default_spells = list()
var/activated = FALSE //for wishgranters to not give an option if someone already has it.
/datum/superheroes/proc/create(var/mob/living/carbon/human/H)
assign_genes(H)
assign_mutations(H)
assign_spells(H)
equip(H)
fixflags(H)
@@ -29,11 +28,11 @@
for(var/obj/item/W in H.get_all_slots())
W.flags |= NODROP
/datum/superheroes/proc/assign_genes(var/mob/living/carbon/human/H)
if(default_genes.len)
for(var/gene in default_genes)
H.mutations |= gene
H.update_mutations()
/datum/superheroes/proc/assign_mutations(var/mob/living/carbon/human/H)
var/list/default_mutations = list(GLOB.regenerateblock, GLOB.breathlessblock, GLOB.coldblock)
for(var/mutation in default_mutations)
H.dna.SetSEState(mutation, 1)
singlemutcheck(H, mutation, MUTCHK_FORCED)
/datum/superheroes/proc/assign_spells(var/mob/living/carbon/human/H)
if(default_spells.len)
@@ -6,7 +6,7 @@
death()
create_debug_log("died of damage, trigger reason: [reason]")
return
if(paralysis || sleeping || (check_death_method() && getOxyLoss() > 50) || (status_flags & FAKEDEATH) || health <= HEALTH_THRESHOLD_CRIT && check_death_method())
if(paralysis || sleeping || (check_death_method() && getOxyLoss() > 50) || HAS_TRAIT(src, TRAIT_FAKEDEATH) || health <= HEALTH_THRESHOLD_CRIT && check_death_method())
if(stat == CONSCIOUS)
KnockOut()
create_debug_log("fell unconscious, trigger reason: [reason]")
@@ -29,5 +29,5 @@
/mob/living/carbon/can_hear()
. = FALSE
var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears)
if(istype(ears) && !ears.deaf)
if(istype(ears) && !HAS_TRAIT(src, TRAIT_DEAF))
. = TRUE
+4 -3
View File
@@ -84,7 +84,8 @@
if(PARALYZE)
Paralyse(effect * blocked)
if(IRRADIATE)
radiation += max(effect * blocked, 0)
if(!HAS_TRAIT(src, TRAIT_RADIMMUNE))
radiation += max(effect * blocked, 0)
if(SLUR)
Slur(effect * blocked)
if(STUTTER)
@@ -148,7 +149,7 @@
if(status_flags & GODMODE)
oxyloss = 0
return FALSE //godmode
if(BREATHLESS in mutations)
if(HAS_TRAIT(src, TRAIT_NOBREATH))
oxyloss = 0
return FALSE
var/old_oxyloss = oxyloss
@@ -165,7 +166,7 @@
if(status_flags & GODMODE)
oxyloss = 0
return FALSE //godmode
if(BREATHLESS in mutations)
if(HAS_TRAIT(src, TRAIT_NOBREATH))
oxyloss = 0
return FALSE
var/old_oxyloss = oxyloss
+1 -1
View File
@@ -155,7 +155,7 @@
/mob/living/proc/handle_disabilities()
//Eyes
if((BLINDNESS in mutations) || stat) //blindness from disability or unconsciousness doesn't get better on its own
if(HAS_TRAIT(src, TRAIT_BLIND) || stat) //blindness from disability or unconsciousness doesn't get better on its own
EyeBlind(1)
else if(eye_blind) //blindness, heals slowly over time
AdjustEyeBlind(-1)
+5 -5
View File
@@ -242,7 +242,7 @@
/mob/living/pointed(atom/A as mob|obj|turf in view())
if(incapacitated(ignore_lying = TRUE))
return FALSE
if(status_flags & FAKEDEATH)
if(HAS_TRAIT(src, TRAIT_FAKEDEATH))
return FALSE
if(!..())
return FALSE
@@ -456,8 +456,8 @@
SetHallucinate(0)
set_nutrition(NUTRITION_LEVEL_FED + 50)
bodytemperature = 310
CureBlind()
CureNearsighted()
cure_blind()
cure_nearsighted()
CureMute()
CureDeaf()
CureTourettes()
@@ -780,7 +780,7 @@
//called when the mob receives a bright flash
/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash)
if(check_eye_prot() < intensity && (override_blindness_check || !(BLINDNESS in mutations)))
if(check_eye_prot() < intensity && (override_blindness_check || !HAS_TRAIT(src, TRAIT_BLIND)))
overlay_fullscreen("flash", type)
addtimer(CALLBACK(src, .proc/clear_fullscreen, "flash", 25), 25)
return 1
@@ -1036,7 +1036,7 @@
/mob/living/rad_act(amount)
. = ..()
if(!amount || (amount < RAD_MOB_SKIN_PROTECTION))
if(!amount || (amount < RAD_MOB_SKIN_PROTECTION) || HAS_TRAIT(src, TRAIT_RADIMMUNE))
return
amount -= RAD_BACKGROUND_RADIATION // This will always be at least 1 because of how skin protection is calculated
+6 -7
View File
@@ -62,7 +62,7 @@
return FALSE
if((flags & SHOCK_TESLA) && HAS_TRAIT(src, TRAIT_TESLA_SHOCKIMMUNE))
return FALSE
if(NO_SHOCK in mutations) //shockproof
if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE))
return FALSE
shock_damage *= siemens_coeff
if(shock_damage < 1)
@@ -166,15 +166,14 @@
//Mobs on Fire
/mob/living/proc/IgniteMob()
if(fire_stacks > 0 && !on_fire)
on_fire = 1
visible_message("<span class='warning'>[src] catches fire!</span>", \
"<span class='userdanger'>You're set on fire!</span>")
if(fire_stacks > 0 && !on_fire && !HAS_TRAIT(src, TRAIT_NOFIRE))
on_fire = TRUE
visible_message("<span class='warning'>[src] catches fire!</span>", "<span class='userdanger'>You're set on fire!</span>")
set_light(light_range + 3,l_color = "#ED9200")
throw_alert("fire", /obj/screen/alert/fire)
update_fire()
return 1
return 0
return TRUE
return FALSE
/mob/living/proc/ExtinguishMob()
if(on_fire)
+1 -1
View File
@@ -67,7 +67,7 @@ GLOBAL_LIST_EMPTY(channel_to_radio_key)
if(S.speaking && S.speaking.flags & NO_STUTTER)
continue
if((HULK in mutations) && health >= 25)
if(HAS_TRAIT(src, TRAIT_HULK) && health >= 25)
S.message = "[uppertext(S.message)]!!!"
verb = pick("yells", "roars", "hollers")
@@ -230,7 +230,7 @@
var/mode = 1
/obj/item/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
if(( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50))
if((HAS_TRAIT(user, TRAIT_CLUMSY) || user.getBrainLoss() >= 60) && prob(50))
user.visible_message("<span class='warning'>[user] has analyzed the floor's vitals!</span>", "<span class='warning'>You try to analyze the floor's vitals!</span>")
to_chat(user, "<span class='notice'>Analyzing Results for The floor:\n\t Overall Status: Healthy</span>")
to_chat(user, "<span class='notice'>\t Damage Specifics: [0]-[0]-[0]-[0]</span>")
@@ -168,7 +168,7 @@
if(!spam_flag)
if(ishuman(C))
C.stuttering = 20 //stammer
C.MinimumDeafTicks(0, 5) //far less damage than the H.O.N.K.
C.AdjustEarDamage(0, 5) //far less damage than the H.O.N.K.
C.Jitter(50)
C.Weaken(5)
C.Stun(5) // Paralysis from tg ported as stun
@@ -458,7 +458,7 @@
soft_reset()
return
if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
if(C.stat == DEAD || HAS_TRAIT(C, TRAIT_FAKEDEATH))
var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/mno.ogg', "Live, damnit! LIVE!" = 'sound/voice/mlive.ogg', "I...I've never lost a patient before. Not today, I mean." = 'sound/voice/mlost.ogg')
var/message = pick(messagevoice)
speak(message)
@@ -213,7 +213,6 @@
icon_resting = "Syndicat_rest"
meow_sound = null //Need robo-meow.
gender = FEMALE
mutations = list(BREATHLESS)
faction = list("syndicate")
gold_core_spawnable = NO_SPAWN
eats_mice = 0
@@ -222,6 +221,10 @@
melee_damage_lower = 5
melee_damage_upper = 15
/mob/living/simple_animal/pet/cat/Syndi/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NOBREATH, SPECIES_TRAIT)
/mob/living/simple_animal/pet/cat/cak
name = "Keeki"
desc = "It's a cat made out of cake."
@@ -353,7 +353,7 @@
desc = initial(desc)
set_light(0)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
mutations.Remove(BREATHLESS)
REMOVE_TRAIT(src, TRAIT_NOBREATH, DOGGO_SPACESUIT)
minbodytemp = initial(minbodytemp)
if(inventory_head && inventory_head.dog_fashion)
@@ -33,7 +33,6 @@
icon_living = "Syndifox"
icon_dead = "Syndifox_dead"
icon_resting = "Syndifox_rest"
mutations = list(BREATHLESS)
faction = list("syndicate")
unique_pet = TRUE
gold_core_spawnable = NO_SPAWN
@@ -41,3 +40,7 @@
minbodytemp = 0
melee_damage_lower = 10
melee_damage_upper = 20
/mob/living/simple_animal/pet/dog/fox/Syndifox/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NOBREATH, SPECIES_TRAIT)
@@ -46,7 +46,7 @@
if(istype(F) && !F.intact)
var/obj/structure/cable/C = locate() in F
if(C && prob(15))
if(C.avail())
if(C.avail() && !HAS_TRAIT(src, TRAIT_SHOCKIMMUNE))
visible_message("<span class='warning'>[src] chews through [C]. It's toast!</span>")
playsound(src, 'sound/effects/sparks2.ogg', 100, 1)
toast() // mmmm toasty.
@@ -169,6 +169,10 @@
unique_pet = TRUE
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/mouse/brown/Tom/Initialize(mapload)
. = ..()
// Tom fears no cable.
ADD_TRAIT(src, TRAIT_SHOCKIMMUNE, SPECIES_TRAIT)
/mob/living/simple_animal/mouse/blobinfected
maxHealth = 100
@@ -346,7 +346,7 @@
visible_message("<span class='danger'>[src] begins dragging [H] under the floor!</span>")
if(do_after(src, 50, target = H) && eating)
H.BecomeBlind()
H.become_blind(FLOORCLUWNE)
H.layer = GAME_PLANE
H.invisibility = INVISIBILITY_MAXIMUM
H.mouse_opacity = 0
@@ -388,7 +388,7 @@
O.droplimb()
Reset_View(FALSE, old_color, H)
H.CureBlind()
H.cure_blind(FLOORCLUWNE)
H.layer = initial(H.layer)
H.invisibility = initial(H.invisibility)
H.mouse_opacity = initial(H.mouse_opacity)
@@ -50,7 +50,7 @@
// Changeling egg can survive in aliens!
var/mob/living/carbon/C = target
if(C.stat == DEAD)
if(C.status_flags & XENO_HOST)
if(HAS_TRAIT(C, TRAIT_XENO_HOST))
to_chat(src, "<span class='userdanger'>A foreign presence repels us from this body. Perhaps we should try to infest another?</span>")
return
Infect(target)
@@ -7,7 +7,6 @@
icon_living = "hellhound"
icon_dead = "hellhound_dead"
icon_resting = "hellhound_rest"
mutations = list(BREATHLESS)
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
@@ -39,6 +38,7 @@
. = ..()
whisper_action = new()
whisper_action.Grant(src)
ADD_TRAIT(src, TRAIT_NOBREATH, SPECIES_TRAIT)
/mob/living/simple_animal/hostile/hellhound/handle_automated_action()
if(!..())
@@ -250,7 +250,7 @@
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
visible_message("<span class='warning'>[name] burrows into the flesh of [H]!</span>")
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
if((DWARF in H.mutations)) //dwarf legions aren't just fluff!
if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff!
L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
else
L = new(H.loc)
@@ -328,9 +328,8 @@
/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/dwarf/equip(mob/living/carbon/human/H)
. = ..()
H.dna.SetSEState(GLOB.smallsizeblock, 1, 1)
H.mutations.Add(DWARF)
genemutcheck(H, GLOB.smallsizeblock, null, MUTCHK_FORCED)
H.dna.SetSEState(GLOB.smallsizeblock, TRUE, TRUE)
singlemutcheck(H, GLOB.smallsizeblock, MUTCHK_FORCED)
H.update_mutations()
/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize(mapload)
@@ -239,7 +239,7 @@
var/areatemp = get_temperature(environment)
if(abs(areatemp - bodytemperature) > 5 && !(BREATHLESS in mutations))
if(abs(areatemp - bodytemperature) > 5 && !HAS_TRAIT(src, TRAIT_NOBREATH))
var/diff = areatemp - bodytemperature
diff = diff / 5
bodytemperature += diff
+31 -90
View File
@@ -18,10 +18,6 @@
// BOOLEAN STATES
/*
* EyesBlocked
Your eyes are covered somehow
* EarsBlocked
Your ears are covered somehow
* Resting
You are lying down of your own volition
* Flying
@@ -33,68 +29,46 @@
// All of these decrement over time - at a rate of 1 per life cycle unless otherwise noted
// Status effects sorted alphabetically:
/*
* Confused *
* Confused *
Movement is scrambled
* Dizzy *
* Dizzy *
The screen goes all warped
* Drowsy
* Drowsy
You begin to yawn, and have a chance of incrementing "Paralysis"
* Druggy *
* Druggy *
A trippy overlay appears.
* Drunk *
* Drunk *
Essentially what your "BAC" is - the higher it is, the more alcohol you have in you
* EyeBlind *
* EyeBlind *
You cannot see. Prevents EyeBlurry from healing naturally.
* EyeBlurry *
* EyeBlurry *
A hazy overlay appears on your screen.
* Hallucination *
* Hallucination *
Your character will imagine various effects happening to them, vividly.
* Jitter *
* Jitter *
Your character will visibly twitch. Higher values amplify the effect.
* LoseBreath *
Your character is unable to breathe.
* Paralysis *
* Paralysis *
Your character is knocked out.
* Silent *
* Silent *
Your character is unable to speak.
* Sleeping *
* Sleeping *
Your character is asleep.
* Slowed *
* Slowed *
Your character moves slower.
* Slurring *
* Slurring *
Your character cannot enunciate clearly.
* CultSlurring *
* CultSlurring *
Your character cannot enunciate clearly while mumbling about elder codes.
* Stunned *
* Stunned *
Your character is unable to move, and drops stuff in their hands. They keep standing, though.
* Stuttering *
Your character stutters parts of their messages.
* Weakened *
* Weakened *
Your character collapses, but is still conscious.
*/
// DISABILITIES
// These are more permanent than the above.
// Disabilities sorted alphabetically
/*
* Blind (32)
Can't see. EyeBlind does not heal when this is active.
* Coughing (4)
Cough occasionally, causing you to drop your items
* Deaf (128)
Can't hear. EarDeaf does not heal when this is active
* Epilepsy (2)
Occasionally go "Epileptic", causing you to become very twitchy, drop all items, and fall to the floor
* Mute (64)
Cannot talk.
* Nearsighted (1)
My glasses! I can't see without my glasses! (Nearsighted overlay when not wearing prescription eyewear)
* Nervous (16)
Occasionally begin to stutter.
* Tourettes (8)
SHIT (say bad words, and drop stuff occasionally)
*/
/mob/living
// Booleans
@@ -281,7 +255,7 @@
SetLoseBreath(max(losebreath, amount))
/mob/living/SetLoseBreath(amount)
if(BREATHLESS in mutations)
if(HAS_TRAIT(src, TRAIT_NOBREATH))
losebreath = 0
return FALSE
losebreath = max(amount, 0)
@@ -455,96 +429,63 @@
// Blind
/mob/living/proc/BecomeBlind(updating = TRUE)
var/val_change = !(BLINDNESS in mutations)
/mob/living/proc/become_blind(source, updating = TRUE)
var/val_change = !HAS_TRAIT(src, TRAIT_BLIND)
. = val_change ? STATUS_UPDATE_BLIND : STATUS_UPDATE_NONE
mutations |= BLINDNESS
ADD_TRAIT(src, TRAIT_BLIND, source)
if(val_change && updating)
update_blind_effects()
/mob/living/proc/CureBlind(updating = TRUE)
var/val_change = !!(BLINDNESS in mutations)
/mob/living/proc/cure_blind(source, updating = TRUE)
var/val_change = !!HAS_TRAIT(src, TRAIT_BLIND)
. = val_change ? STATUS_UPDATE_BLIND : STATUS_UPDATE_NONE
mutations -= BLINDNESS
REMOVE_TRAIT(src, TRAIT_BLIND, source)
if(val_change && updating)
CureIfHasDisability(GLOB.blindblock)
update_blind_effects()
// Coughing
/mob/living/proc/BecomeCoughing()
mutations |= COUGHING
/mob/living/proc/CureCoughing()
mutations -= COUGHING
CureIfHasDisability(GLOB.coughblock)
// Deaf
/mob/living/proc/BecomeDeaf()
mutations |= DEAF
/mob/living/proc/CureDeaf()
mutations -= DEAF
CureIfHasDisability(GLOB.deafblock)
// Epilepsy
/mob/living/proc/BecomeEpilepsy()
mutations |= EPILEPSY
/mob/living/proc/CureEpilepsy()
mutations -= EPILEPSY
CureIfHasDisability(GLOB.epilepsyblock)
// Mute
/mob/living/proc/BecomeMute()
mutations |= MUTE
/mob/living/proc/CureMute()
mutations -= MUTE
CureIfHasDisability(GLOB.muteblock)
// Nearsighted
/mob/living/proc/BecomeNearsighted(updating = TRUE)
var/val_change = !(NEARSIGHTED in mutations)
/mob/living/proc/become_nearsighted(source, updating = TRUE)
var/val_change = !HAS_TRAIT(src, TRAIT_NEARSIGHT)
. = val_change ? STATUS_UPDATE_NEARSIGHTED : STATUS_UPDATE_NONE
mutations |= NEARSIGHTED
ADD_TRAIT(src, TRAIT_NEARSIGHT, source)
if(val_change && updating)
update_nearsighted_effects()
/mob/living/proc/CureNearsighted(updating = TRUE)
var/val_change = !!(NEARSIGHTED in mutations)
/mob/living/proc/cure_nearsighted(source, updating = TRUE)
var/val_change = !!HAS_TRAIT(src, TRAIT_NEARSIGHT)
. = val_change ? STATUS_UPDATE_NEARSIGHTED : STATUS_UPDATE_NONE
mutations -= NEARSIGHTED
REMOVE_TRAIT(src, TRAIT_NEARSIGHT, source)
if(val_change && updating)
CureIfHasDisability(GLOB.glassesblock)
update_nearsighted_effects()
// Nervous
/mob/living/proc/BecomeNervous()
mutations |= NERVOUS
/mob/living/proc/CureNervous()
mutations -= NERVOUS
CureIfHasDisability(GLOB.nervousblock)
// Tourettes
/mob/living/proc/BecomeTourettes()
mutations |= TOURETTES
/mob/living/proc/CureTourettes()
mutations -= TOURETTES
CureIfHasDisability(GLOB.twitchblock)
/mob/living/proc/CureIfHasDisability(block)
if(dna && dna.GetSEState(block))
dna.SetSEState(block, 0, 1) //Fix the gene
genemutcheck(src, block,null, MUTCHK_FORCED)
singlemutcheck(src, block, MUTCHK_FORCED)
dna.UpdateSE()
///////////////////////////////// FROZEN /////////////////////////////////////
+5 -5
View File
@@ -25,7 +25,7 @@
clear_alert("high")
/mob/living/update_nearsighted_effects()
if(NEARSIGHTED in mutations)
if(HAS_TRAIT(src, TRAIT_NEARSIGHT))
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
else
clear_fullscreen("nearsighted")
@@ -41,17 +41,17 @@
// Whether the mob can hear things
/mob/living/can_hear()
. = !(DEAF in mutations)
. = !HAS_TRAIT(src, TRAIT_DEAF)
// Whether the mob is able to see
// `information_only` is for stuff that's purely informational - like blindness overlays
// This flag exists because certain things like angel statues expect this to be false for dead people
/mob/living/has_vision(information_only = FALSE)
return (information_only && stat == DEAD) || !(eye_blind || (BLINDNESS in mutations) || stat)
return (information_only && stat == DEAD) || !(eye_blind || HAS_TRAIT(src, TRAIT_BLIND) || stat)
// Whether the mob is capable of talking
/mob/living/can_speak()
if(!(silent || (MUTE in mutations)))
if(!(silent || HAS_TRAIT(src, TRAIT_MUTE)))
if(is_muzzled())
var/obj/item/clothing/mask/muzzle/M = wear_mask
if(M.mute >= MUZZLE_MUTE_MUFFLE)
@@ -62,7 +62,7 @@
// Whether the mob is capable of standing or not
/mob/living/proc/can_stand()
return !(IsWeakened() || paralysis || stat || (status_flags & FAKEDEATH))
return !(IsWeakened() || paralysis || stat || HAS_TRAIT(src, TRAIT_FAKEDEATH))
// Whether the mob is capable of actions or not
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE, list/extra_checks = list(), use_default_checks = TRUE)
+1 -4
View File
@@ -105,9 +105,6 @@
var/datum/dna/dna = null //Carbon
var/radiation = 0 //Carbon
var/list/mutations = list() //Carbon -- Doohl
//see: setup.dm for list of mutations
var/voice_name = "unidentifiable voice"
var/list/faction = list("neutral") //Used for checking whether hostile simple animals will attack you, possibly more stuff later
@@ -179,7 +176,7 @@
var/stance_damage = 0 //Whether this mob's ability to stand has been affected
var/list/active_genes = list()
var/list/active_mutations = list()
var/last_movement = -100 // Last world.time the mob actually moved of its own accord.
-4
View File
@@ -58,10 +58,6 @@
/mob/proc/AdjustEarDamage()
return
/mob/proc/MinimumDeafTicks()
return
/mob/proc/EyeBlind()
return
+1 -1
View File
@@ -1,7 +1,7 @@
/mob/living/carbon/human/proc/monkeyize()
var/mob/H = src
H.dna.SetSEState(GLOB.monkeyblock,1)
genemutcheck(H,GLOB.monkeyblock,null,MUTCHK_FORCED)
singlemutcheck(H, GLOB.monkeyblock, MUTCHK_FORCED)
/mob/new_player/AIize()
spawning = 1
+1 -1
View File
@@ -23,7 +23,7 @@ GLOBAL_LIST_EMPTY(typing_indicator)
if(ishuman(src))
var/mob/living/carbon/human/H = src
if((MUTE in H.mutations) || H.silent)
if(HAS_TRAIT(H, TRAIT_MUTE) || H.silent)
overlays -= GLOB.typing_indicator[bubble_icon]
return
+4 -2
View File
@@ -266,7 +266,7 @@
if(!user.dna)
return -1
user.dna.SetSEState(GLOB.hulkblock,1)
genemutcheck(user, GLOB.hulkblock,null,MUTCHK_FORCED)
singlemutcheck(user, GLOB.hulkblock, MUTCHK_FORCED)
// Demonic power gives you consequenceless hulk
user.gene_stability += GENE_INSTABILITY_MAJOR
if(ishuman(user))
@@ -321,7 +321,9 @@
/obj/item/paper/contract/infernal/knowledge/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind)
return -1
user.mutations.Add(XRAY)
ADD_TRAIT(user, TRAIT_XRAY_VISION, "devils_bargain")
user.update_sight()
user.update_icons()
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/view_range(null))
return ..()
+3 -3
View File
@@ -97,7 +97,7 @@
set category = "Object"
set src in usr
if((CLUMSY in usr.mutations) && prob(50))
if(HAS_TRAIT(usr, TRAIT_CLUMSY) && prob(50))
to_chat(usr, "<span class='warning'>You cut yourself on the paper.</span>")
return
if(!usr.is_literate())
@@ -390,7 +390,7 @@
to_chat(user, "<span class='notice'>You stamp the paper with your rubber stamp.</span>")
if(is_hot(P))
if((CLUMSY in user.mutations) && prob(10))
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10))
user.visible_message("<span class='warning'>[user] accidentally ignites [user.p_them()]self!</span>", \
"<span class='userdanger'>You miss the paper and accidentally light yourself on fire!</span>")
user.unEquip(P)
@@ -686,7 +686,7 @@
target.adjustFireLoss(150) // hard crit, the burning takes care of the rest.
else if(myeffect == "Total Brain Death")
to_chat(target,"<span class='userdanger'>You see a message appear in front of you in bright red letters: <b>YHWH-3 ACTIVATED. TERMINATION IN 3 SECONDS</b></span>")
target.mutations.Add(NOCLONE)
ADD_TRAIT(target, TRAIT_BADDNA, "evil_fax")
target.adjustBrainLoss(125)
else if(myeffect == "Honk Tumor")
if(!target.get_int_organ(/obj/item/organ/internal/honktumor))
+1 -1
View File
@@ -72,7 +72,7 @@
update_icon()
else if(is_hot(P))
if((CLUMSY in user.mutations) && prob(10))
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10))
user.visible_message("<span class='warning'>[user] accidentally ignites [user.p_them()]self!</span>", \
"<span class='userdanger'>You miss [src] and accidentally light yourself on fire!</span>")
user.unEquip(P)
+1 -1
View File
@@ -215,7 +215,7 @@
/obj/item/ticket_machine_ticket/attackby(obj/item/P, mob/living/carbon/human/user, params) //Stolen from papercode
..()
if(is_hot(P))
if((CLUMSY in user.mutations) && prob(10))
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10))
user.visible_message("<span class='warning'>[user] accidentally ignites [user.p_them()]self!</span>", \
"<span class='userdanger'>You miss the paper and accidentally light yourself on fire!</span>")
user.drop_item()
+2 -2
View File
@@ -576,9 +576,9 @@
else
prot = 1
if(prot > 0 || (HEATRES in user.mutations))
if(prot > 0 || HAS_TRAIT(user, TRAIT_RESISTHEAT) || HAS_TRAIT(user, TRAIT_RESISTHEATHANDS))
to_chat(user, "<span class='notice'>You remove the light [fitting]</span>")
else if(TK in user.mutations)
else if(user.dna?.GetSEState(GLOB.teleblock))
to_chat(user, "<span class='notice'>You telekinetically remove the light [fitting].</span>")
else
if(user.a_intent == INTENT_DISARM || user.a_intent == INTENT_GRAB)
+1 -1
View File
@@ -172,7 +172,7 @@
//Exclude lasertag guns from the CLUMSY check.
if(clumsy_check)
if(istype(user))
if((CLUMSY in user.mutations) && prob(40))
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40))
to_chat(user, "<span class='userdanger'>You shoot yourself in the foot with \the [src]!</span>")
var/shot_leg = pick("l_foot", "r_foot")
process_fire(user, user, 0, params, zone_override = shot_leg)
@@ -25,7 +25,7 @@
do_sparks(1, 1, src)
else if(iscarbon(target))
var/mob/living/carbon/C = target
if(HULK in C.mutations)
if(HAS_TRAIT(C, TRAIT_HULK))
C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
else if(C.status_flags & CANWEAKEN)
spawn(5)
@@ -133,30 +133,6 @@
impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
flag = "energy"
/obj/item/projectile/energy/floramut/on_hit(var/atom/target, var/blocked = 0)
..()
var/mob/living/M = target
if(ishuman(target))
var/mob/living/carbon/human/H = M
if(IS_PLANT in H.dna.species.species_traits)
if(prob(15))
H.rad_act(rand(30, 80))
H.Weaken(5)
H.visible_message("<span class='warning'>[H] writhes in pain as [M.p_their()] vacuoles boil.</span>", "<span class='userdanger'>You writhe in pain as your vacuoles boil!</span>", "<span class='italics'>You hear the crunching of leaves.</span>")
if(prob(80))
randmutb(H)
domutcheck(H, null)
else
randmutg(H)
domutcheck(H, null)
else
H.adjustFireLoss(rand(5, 15))
H.show_message("<span class='warning'>The radiation beam singes you!</span>")
else if(iscarbon(target))
M.show_message("<span class='notice'>The radiation beam dissipates harmlessly through your body.</span>")
else
return 1
/obj/item/projectile/energy/florayield
name = "beta somatoray"
icon_state = "energy2"
@@ -165,19 +141,6 @@
nodamage = 1
flag = "energy"
/obj/item/projectile/energy/florayield/on_hit(var/atom/target, var/blocked = 0)
..()
var/mob/M = target
if(ishuman(target)) //These rays make plantmen fat.
var/mob/living/carbon/human/H = M
if(IS_PLANT in H.dna.species.species_traits)
H.set_nutrition(min(H.nutrition+30, NUTRITION_LEVEL_FULL))
else if(iscarbon(target))
M.show_message("<span class='notice'>The radiation beam dissipates harmlessly through your body.</span>")
else
return 1
/obj/item/projectile/beam/mindflayer
name = "flayer ray"
+4 -4
View File
@@ -227,24 +227,24 @@
return update_flags
/datum/reagent/proc/fakedeath(mob/living/M)
if(M.status_flags & FAKEDEATH)
if(HAS_TRAIT(M, TRAIT_FAKEDEATH))
return
if(!(M.status_flags & CANPARALYSE))
return
if(M.mind && M.mind.changeling && M.mind.changeling.regenerating) //no messing with changeling's fake death
return
M.emote("deathgasp")
M.status_flags |= FAKEDEATH
ADD_TRAIT(M, TRAIT_FAKEDEATH, id)
M.updatehealth("fakedeath reagent")
/datum/reagent/proc/fakerevive(mob/living/M)
if(!(M.status_flags & FAKEDEATH))
if(!HAS_TRAIT(M, TRAIT_FAKEDEATH))
return
if(M.mind && M.mind.changeling && M.mind.changeling.regenerating)
return
if(M.resting)
M.StopResting()
M.status_flags &= ~(FAKEDEATH)
REMOVE_TRAIT(M, TRAIT_FAKEDEATH, id)
if(M.healthdoll)
M.healthdoll.cached_healthdoll_overlays.Cut()
M.updatehealth("fakedeath reagent end")
@@ -25,8 +25,8 @@
E.mend_fracture()
E.internal_bleeding = FALSE
M.SetEyeBlind(0, FALSE)
M.CureNearsighted(FALSE)
M.CureBlind(FALSE)
M.cure_nearsighted(null, FALSE)
M.cure_blind(null, FALSE)
M.CureMute()
M.CureDeaf()
M.CureEpilepsy()
@@ -73,11 +73,11 @@
update_flags |= M.Druggy(30, FALSE)
M.AdjustDizzy(5)
M.SetDrowsy(0)
M.status_flags |= GOTTAGONOTSOFAST
ADD_TRAIT(M, TRAIT_GOTTAGONOTSOFAST, id)
return ..() | update_flags
/datum/reagent/consumable/drink/cold/nuka_cola/on_mob_delete(mob/living/M)
M.status_flags &= ~GOTTAGONOTSOFAST
REMOVE_TRAIT(M, TRAIT_GOTTAGONOTSOFAST, id)
..()
/datum/reagent/consumable/drink/cold/spacemountainwind
@@ -74,8 +74,8 @@
if(1 to 20)
//nothing
if(21 to INFINITY)
if(prob(current_cycle-10))
update_flags |= M.CureNearsighted(FALSE)
if(prob(current_cycle - 10))
update_flags |= M.cure_nearsighted(EYE_DAMAGE, FALSE)
return ..() | update_flags
/datum/reagent/consumable/drink/doctor_delight
@@ -178,7 +178,7 @@
/datum/reagent/consumable/drink/banana/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
if((ishuman(M) && (COMIC in M.mutations)) || issmall(M))
if(HAS_TRAIT(M, TRAIT_COMIC_SANS) || issmall(M))
update_flags |= M.adjustBruteLoss(-1, FALSE)
update_flags |= M.adjustFireLoss(-1, FALSE)
return ..() | update_flags
@@ -409,7 +409,7 @@
/datum/reagent/consumable/drink/bananahonk/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
if((ishuman(M) && (COMIC in M.mutations)) || issmall(M))
if(HAS_TRAIT(M, TRAIT_COMIC_SANS) || issmall(M))
update_flags |= M.adjustBruteLoss(-1, FALSE)
update_flags |= M.adjustFireLoss(-1, FALSE)
return ..() | update_flags
@@ -517,7 +517,7 @@
description = "Beloved of children and teetotalers."
color = "#E6CDFF"
taste_description = "grape soda"
/datum/reagent/consumable/drink/coco/icecoco
name = "Iced Cocoa"
id = "icecoco"
@@ -290,7 +290,7 @@
H.visible_message("<span class='warning'>[M]'s skin is rotting away!</span>")
update_flags |= H.adjustBruteLoss(25, FALSE)
H.emote("scream")
H.ChangeToHusk()
H.become_husk("krokodil_overdose")
H.emote("faint")
else if(effect <= 7)
M.emote("shiver")
@@ -322,13 +322,13 @@
update_flags |= M.AdjustWeakened(-2.5, FALSE)
update_flags |= M.adjustStaminaLoss(-2, FALSE)
update_flags |= M.SetSleeping(0, FALSE)
M.status_flags |= GOTTAGOFAST
ADD_TRAIT(M, TRAIT_GOTTAGOFAST, id)
if(prob(50))
update_flags |= M.adjustBrainLoss(1, FALSE)
return ..() | update_flags
/datum/reagent/methamphetamine/on_mob_delete(mob/living/M)
M.status_flags &= ~GOTTAGOFAST
REMOVE_TRAIT(M, TRAIT_GOTTAGOFAST, id)
..()
/datum/reagent/methamphetamine/overdose_process(mob/living/M, severity)
@@ -684,7 +684,7 @@
update_flags |= M.AdjustStunned(-2, FALSE)
update_flags |= M.AdjustWeakened(-2, FALSE)
update_flags |= M.adjustStaminaLoss(-2, FALSE)
M.status_flags |= GOTTAGOFAST
ADD_TRAIT(M, TRAIT_GOTTAGOFAST, id)
M.Jitter(3)
update_flags |= M.adjustBrainLoss(0.5, FALSE)
if(prob(5))
@@ -692,7 +692,7 @@
return ..() | update_flags
/datum/reagent/lube/ultra/on_mob_delete(mob/living/M)
M.status_flags &= ~GOTTAGOFAST
REMOVE_TRAIT(M, TRAIT_GOTTAGOFAST, id)
..()
/datum/reagent/lube/ultra/overdose_process(mob/living/M, severity)
@@ -809,7 +809,7 @@
H.Weaken(2, FALSE)
H.update_canmove()
to_chat(H, "<span class='danger'>Ugh! Eating that was a terrible idea!</span>")
if(NO_HUNGER in H.dna.species.species_traits) //If you don't eat, then you can't get food poisoning
if(HAS_TRAIT(H, TRAIT_NOHUNGER)) //If you don't eat, then you can't get food poisoning
return
H.ForceContractDisease(new /datum/disease/food_poisoning(0))
@@ -295,6 +295,11 @@
M.adjustFireLoss(-1.5*volume)
if(show_message)
to_chat(M, "<span class='notice'>The synthetic flesh integrates itself into your wounds, healing you.</span>")
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(HAS_TRAIT_FROM(H, TRAIT_HUSK, BURN) && H.getFireLoss() < UNHUSK_DAMAGE_THRESHOLD && (H.reagents.get_reagent_amount("synthflesh") + volume >= SYNTHFLESH_UNHUSK_AMOUNT))
H.cure_husk(BURN)
H.visible_message("<span class='nicegreen'>The squishy liquid coats [H]'s burns. [H] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because humans could be a skeleton or a golem or something
..()
/datum/reagent/medicine/synthflesh/reaction_turf(turf/T, volume) //let's make a mess!
@@ -639,9 +644,9 @@
update_flags |= M.AdjustEyeBlurry(-1, FALSE)
update_flags |= M.AdjustEarDamage(-1)
if(prob(50))
update_flags |= M.CureNearsighted(FALSE)
update_flags |= M.cure_nearsighted(EYE_DAMAGE, FALSE)
if(prob(30))
update_flags |= M.CureBlind(FALSE)
update_flags |= M.cure_blind(EYE_DAMAGE, FALSE)
update_flags |= M.SetEyeBlind(0, FALSE)
return ..() | update_flags
@@ -769,7 +774,7 @@
if(M.getBruteLoss() + M.getFireLoss() + M.getCloneLoss() >= 150)
M.delayed_gib()
return
if(!M.suiciding && !(NOCLONE in M.mutations) && (!M.mind || M.mind && M.mind.is_revivable()))
if(!M.suiciding && !HAS_TRAIT(M, TRAIT_HUSK) && !HAS_TRAIT(M, TRAIT_BADDNA) && (!M.mind || M.mind && M.mind.is_revivable()))
var/time_dead = world.time - M.timeofdeath
M.visible_message("<span class='warning'>[M] seems to rise from the dead!</span>")
M.adjustCloneLoss(50)
@@ -820,13 +825,13 @@
..()
return
M.SetJitter(0)
var/needs_update = M.mutations.len > 0
var/needs_update = length(M.active_mutations)
if(needs_update)
for(var/block = 1; block<=DNA_SE_LENGTH; block++)
if(!(block in M.dna.default_blocks))
M.dna.SetSEState(block, FALSE, TRUE)
genemutcheck(M, block, null, MUTCHK_FORCED)
singlemutcheck(M, block, MUTCHK_FORCED)
M.dna.UpdateSE()
M.dna.struc_enzymes = M.dna.struc_enzymes_original
@@ -902,7 +907,7 @@
/datum/reagent/medicine/stimulative_agent/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
M.status_flags |= GOTTAGOFAST
ADD_TRAIT(M, TRAIT_GOTTAGOFAST, id)
if(M.health < 50 && M.health > 0)
update_flags |= M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
update_flags |= M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
@@ -915,7 +920,7 @@
return ..() | update_flags
/datum/reagent/medicine/stimulative_agent/on_mob_delete(mob/living/M)
M.status_flags &= ~GOTTAGOFAST
REMOVE_TRAIT(M, TRAIT_GOTTAGOFAST, id)
..()
/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M, severity)
@@ -460,7 +460,7 @@
else
to_chat(C, "<span class='warning'>Something doesn't feel right...</span>")
C.AdjustDizzy(volume)
ADD_TRAIT(C, TRAIT_JESTER, id)
ADD_TRAIT(C, TRAIT_COMIC_SANS, id)
C.AddComponent(/datum/component/squeak, null, null, null, null, null, TRUE)
C.AddElement(/datum/element/waddling)
@@ -496,7 +496,7 @@
/datum/reagent/jestosterone/on_mob_delete(mob/living/M)
..()
REMOVE_TRAIT(M, TRAIT_JESTER, id)
REMOVE_TRAIT(M, TRAIT_COMIC_SANS, id)
qdel(M.GetComponent(/datum/component/squeak))
M.RemoveElement(/datum/element/waddling)
@@ -34,7 +34,7 @@
taste_description = "mint"
/datum/reagent/minttoxin/on_mob_life(mob/living/M)
if(FAT in M.mutations)
if(HAS_TRAIT(M, TRAIT_FAT))
M.gib()
return ..()
@@ -180,11 +180,11 @@
/datum/reagent/mutagen/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)
if(!..())
return
if(!M.dna)
if(!M.dna || HAS_TRAIT(M, TRAIT_BADDNA) || HAS_TRAIT(M, TRAIT_GENELESS))
return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
if((method==REAGENT_TOUCH && prob(33)) || method==REAGENT_INGEST)
randmutb(M)
domutcheck(M, null)
domutcheck(M)
M.UpdateAppearance()
/datum/reagent/mutagen/on_mob_life(mob/living/M)
@@ -213,7 +213,7 @@
return ..()
/datum/reagent/stable_mutagen/on_mob_life(mob/living/M)
if(!ishuman(M) || !M.dna)
if(!ishuman(M) || !M.dna || HAS_TRAIT(M, TRAIT_BADDNA) || HAS_TRAIT(M, TRAIT_GENELESS))
return
M.apply_effect(2 * REAGENTS_EFFECT_MULTIPLIER, IRRADIATE)
if(current_cycle == 10 && islist(data))
@@ -1113,12 +1113,12 @@
update_flags |= M.AdjustEyeBlurry(10, FALSE)
if(70 to INFINITY)
update_flags |= M.AdjustEyeBlurry(10, FALSE)
if(M.status_flags & FAKEDEATH)
if(HAS_TRAIT(M, TRAIT_FAKEDEATH))
fakerevive(M)
return ..() | update_flags
/datum/reagent/capulettium/on_mob_delete(mob/living/M)
if(M.status_flags & FAKEDEATH)
if(HAS_TRAIT(M, TRAIT_FAKEDEATH))
fakerevive(M)
..()
@@ -1133,14 +1133,14 @@
/datum/reagent/capulettium_plus/on_mob_life(mob/living/M)
M.Silence(2)
if((M.status_flags & FAKEDEATH) && !M.resting)
if((HAS_TRAIT(M, TRAIT_FAKEDEATH)) && !M.resting)
fakerevive(M)
else if(!(M.status_flags & FAKEDEATH) && M.resting)
else if(!HAS_TRAIT(M, TRAIT_FAKEDEATH) && M.resting)
fakedeath(M)
return ..()
/datum/reagent/capulettium_plus/on_mob_delete(mob/living/M)
if(M.status_flags & FAKEDEATH)
if(HAS_TRAIT(M, TRAIT_FAKEDEATH))
fakerevive(M)
..()
@@ -1178,7 +1178,7 @@
return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
if((method==REAGENT_TOUCH && prob(50)) || method==REAGENT_INGEST)
randmutb(M)
domutcheck(M, null)
domutcheck(M)
M.UpdateAppearance()
/datum/reagent/glowing_slurry/on_mob_life(mob/living/M)
@@ -1193,7 +1193,7 @@
randmutg(M)
did_mutation = TRUE
if(did_mutation)
domutcheck(M, null)
domutcheck(M)
M.UpdateAppearance()
return ..()
+1 -1
View File
@@ -553,7 +553,7 @@
SEND_SIGNAL(AM, COMSIG_MOVABLE_DISPOSING, src, D)
if(istype(AM, /mob/living/carbon/human))
var/mob/living/carbon/human/H = AM
if(FAT in H.mutations) // is a human and fat?
if(HAS_TRAIT(H, TRAIT_FAT)) // is a human and fat?
has_fat_guy = 1 // set flag on holder
if(istype(AM, /obj/structure/bigDelivery) && !hasmob)
var/obj/structure/bigDelivery/T = AM
@@ -90,7 +90,7 @@
/obj/effect/gluttony/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff.
if(ishuman(mover))
var/mob/living/carbon/human/H = mover
if(H.nutrition >= NUTRITION_LEVEL_FAT || (FAT in H.mutations))
if(H.nutrition >= NUTRITION_LEVEL_FAT || HAS_TRAIT(H, TRAIT_FAT))
H.visible_message("<span class='warning'>[H] pushes through [src]!</span>", "<span class='notice'>You've seen and eaten worse than this.</span>")
return TRUE
else
+6 -6
View File
@@ -110,7 +110,7 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m
//humans
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(NO_DNA in H.dna.species.species_traits)
if(HAS_TRAIT(H, TRAIT_GENELESS))
to_chat(user, "<span class='notice'>This humanoid doesn't have DNA.</span>")
return
if(dna[H.dna.uni_identity])
@@ -298,7 +298,7 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m
if(!completed)
return
var/datum/species/S = H.dna.species
if(NO_DNA in S.species_traits)
if(HAS_TRAIT(H, TRAIT_GENELESS))
to_chat(H, "<span class='warning'>Error, no DNA detected.</span>")
return
switch(upgrade_type)
@@ -308,14 +308,14 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m
if(L)
L.tox_breath_dam_min = 0
L.tox_breath_dam_max = 0
S.species_traits |= VIRUSIMMUNE
ADD_TRAIT(H, TRAIT_VIRUSIMMUNE, "dna_vault")
if(VAULT_NOBREATH)
to_chat(H, "<span class='notice'>Your lungs feel great.</span>")
S.species_traits |= NO_BREATHE
ADD_TRAIT(H, TRAIT_NOBREATH, "dna_vault")
if(VAULT_FIREPROOF)
to_chat(H, "<span class='notice'>You feel fireproof.</span>")
S.burn_mod *= 0.5
S.species_traits |= RESISTHOT
ADD_TRAIT(H, TRAIT_RESISTHEAT, "dna_vault")
if(VAULT_STUNTIME)
to_chat(H, "<span class='notice'>Nothing can keep you down for long.</span>")
S.stun_mod *= 0.5
@@ -328,7 +328,7 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m
S.clone_mod *= 0.7
S.brain_mod *= 0.7
S.stamina_mod *= 0.7
S.species_traits |= PIERCEIMMUNE
ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, "dna_vault")
if(VAULT_SPEED)
to_chat(H, "<span class='notice'>You feel very fast and agile.</span>")
S.speed_mod = -1
+1 -1
View File
@@ -113,7 +113,7 @@
/proc/get_pain_modifier(mob/living/carbon/human/M) //returns modfier to make surgery harder if patient is conscious and feels pain
if(M.stat) //stat=0 if CONSCIOUS, 1=UNCONSCIOUS and 2=DEAD. Operating on dead people is easy, too. Just sleeping won't work, though.
return 1
if(NO_PAIN in M.dna.species.species_traits)//if you don't feel pain, you can hold still
if(HAS_TRAIT(M, TRAIT_NOPAIN))//if you don't feel pain, you can hold still
return 1
if(M.reagents.has_reagent("hydrocodone"))//really good pain killer
return 0.99
@@ -215,6 +215,14 @@
slot = "brain_clownvoice"
origin_tech = "materials=2;biotech=2"
/obj/item/organ/internal/cyberimp/brain/clown_voice/insert(mob/living/carbon/M, special = FALSE)
..()
ADD_TRAIT(M, TRAIT_COMIC_SANS, "augment")
/obj/item/organ/internal/cyberimp/brain/clown_voice/remove(mob/living/carbon/M, special = FALSE)
REMOVE_TRAIT(M, TRAIT_COMIC_SANS, "augment")
return ..()
/obj/item/organ/internal/cyberimp/brain/speech_translator //actual translating done in human/handle_speech_problems
name = "Speech translator implant"
desc = "While known as a translator, this implant actually generates speech based on the user's thoughts when activated, completely bypassing the need to speak."

Some files were not shown because too many files have changed in this diff Show More