mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 11:34:19 +01:00
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:
@@ -222,7 +222,7 @@ GLOBAL_VAR_INIT(nologevent, 0)
|
||||
body += "<br><br>"
|
||||
body += "<b>DNA Blocks:</b><br><table border='0'><tr><th> </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]
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 /////////////////////////////////////
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -58,10 +58,6 @@
|
||||
/mob/proc/AdjustEarDamage()
|
||||
return
|
||||
|
||||
/mob/proc/MinimumDeafTicks()
|
||||
return
|
||||
|
||||
|
||||
/mob/proc/EyeBlind()
|
||||
return
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user