diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index aba6e6baea9..65b7f0f24d0 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -142,4 +142,5 @@
#define VIRUSIMMUNE 14
#define NOCRITDAMAGE 15
#define RESISTHOT 16
-#define RESISTCOLD 17
\ No newline at end of file
+#define RESISTCOLD 17
+#define NO_EXAMINE 18
\ No newline at end of file
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 023ebe426d9..1d47ae409b3 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -130,7 +130,31 @@
#define EYE_SHINE_THRESHOLD 6 //dark_view threshold past which a humanoid's eyes will 'shine' in the dark.
//Human sub-species
-#define isabductor(A) (is_species(A, "Abductor"))
+#define isshadowling(A) (is_species(A, /datum/species/shadow/ling))
+#define isshadowlinglesser(A) (is_species(A, /datum/species/shadow/ling/lesser))
+#define isabductor(A) (is_species(A, /datum/species/abductor))
+#define isgolem(A) (is_species(A, /datum/species/golem))
+#define ismonkeybasic(A) (is_species(A, /datum/species/monkey))
+#define isfarwa(A) (is_species(A, /datum/species/monkey/tajaran))
+#define iswolpin(A) (is_species(A, /datum/species/monkey/vulpkanin))
+#define isneara(A) (is_species(A, /datum/species/monkey/skrell))
+#define isstok(A) (is_species(A, /datum/species/monkey/unathi))
+#define isplasmaman(A) (is_species(A, /datum/species/plasmaman))
+#define isshadowperson(A) (is_species(A, /datum/species/shadow))
+#define isskeleton(A) (is_species(A, /datum/species/skeleton))
+#define ishumanbasic(A) (is_species(A, /datum/species/human))
+#define isunathi(A) (is_species(A, /datum/species/unathi))
+#define istajaran(A) (is_species(A, /datum/species/tajaran))
+#define isvulpkanin(A) (is_species(A, /datum/species/vulpkanin))
+#define isskrell(A) (is_species(A, /datum/species/skrell))
+#define isvox(A) (is_species(A, /datum/species/vox))
+#define isvoxarmalis(A) (is_species(A, /datum/species/vox/armalis))
+#define iskidan(A) (is_species(A, /datum/species/kidan))
+#define isslimeperson(A) (is_species(A, /datum/species/slime))
+#define isgrey(A) (is_species(A, /datum/species/grey))
+#define isdiona(A) (is_species(A, /datum/species/diona))
+#define ismachine(A) (is_species(A, /datum/species/machine))
+#define isdrask(A) (is_species(A, /datum/species/drask))
#define isanimal(A) (istype((A), /mob/living/simple_animal))
#define iscorgi(A) (istype((A), /mob/living/simple_animal/pet/corgi))
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 8628e6957cf..3a6e8be62ac 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -373,11 +373,11 @@ This is always put in the attack log.
if(progress)
qdel(progbar)
-/proc/is_species(A, species_name)
+/proc/is_species(A, species_datum)
. = FALSE
if(ishuman(A))
var/mob/living/carbon/human/H = A
- if(H.get_species() == species_name)
+ if(H.dna && istype(H.dna.species, species_datum))
. = TRUE
/proc/spawn_atom_to_turf(spawn_type, target, amount, admin_spawn=FALSE, list/extra_args)
diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm
index 959c930bbf1..f403695b0f6 100644
--- a/code/_globalvars/lists/names.dm
+++ b/code/_globalvars/lists/names.dm
@@ -9,7 +9,6 @@ var/list/first_names_female = file2list("config/names/first_female.txt")
var/list/last_names = file2list("config/names/last.txt")
var/list/clown_names = file2list("config/names/clown.txt")
var/list/mime_names = file2list("config/names/mime.txt")
-var/list/diona_names = file2list ("config/names/diona.txt")
var/list/verbs = file2list("config/names/verbs.txt")
var/list/adjectives = file2list("config/names/adjectives.txt")
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 71cb7bc9cc0..0299a7ec2fc 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -43,7 +43,7 @@
else
return 1
- if(isscrewdriver(src) && M.get_species() == "Machine")
+ if(isscrewdriver(src) && ismachine(M))
if(!attempt_initiate_surgery(src, M, user))
return 0
else
diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm
index 9b056472bde..177e670d6c9 100644
--- a/code/controllers/communications.dm
+++ b/code/controllers/communications.dm
@@ -351,7 +351,7 @@ var/global/datum/controller/radio/radio_controller
/datum/signal/proc/get_race(mob/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- . = H.species.name
+ . = H.dna.species.name
else if(isbrain(M))
var/mob/living/carbon/brain/B = M
. = B.get_race()
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 1a22131d55f..4fc2522ce65 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -280,7 +280,7 @@ var/record_id_num = 1001
G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable"
G.fields["sex"] = capitalize(H.gender)
- G.fields["species"] = H.get_species()
+ G.fields["species"] = H.dna.species.name
G.fields["photo"] = get_id_photo(H)
G.fields["photo-south"] = "'data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = SOUTH))]'"
G.fields["photo-west"] = "'data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = WEST))]'"
@@ -357,7 +357,7 @@ var/record_id_num = 1001
temp = new /icon(icobase, "groin_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
var/head = "head"
- if(head_organ.alt_head && head_organ.species.bodyflags & HAS_ALT_HEADS)
+ if(head_organ.alt_head && head_organ.dna.species.bodyflags & HAS_ALT_HEADS)
var/datum/sprite_accessory/alt_heads/alternate_head = alt_heads_list[head_organ.alt_head]
if(alternate_head.icon_state)
head = alternate_head.icon_state
@@ -368,7 +368,7 @@ var/record_id_num = 1001
if(H.body_accessory && istype(H.body_accessory, /datum/body_accessory/tail))
temp = new/icon("icon" = H.body_accessory.icon, "icon_state" = H.body_accessory.icon_state)
preview_icon.Blend(temp, ICON_OVERLAY)
- else if(H.tail && H.species.bodyflags & HAS_TAIL)
+ else if(H.tail && H.dna.species.bodyflags & HAS_TAIL)
temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[H.tail]_s")
preview_icon.Blend(temp, ICON_OVERLAY)
@@ -376,19 +376,19 @@ var/record_id_num = 1001
preview_icon.Blend(E.get_icon(), ICON_OVERLAY)
// Skin tone
- if(H.species.bodyflags & HAS_SKIN_TONE)
+ if(H.dna.species.bodyflags & HAS_SKIN_TONE)
if(H.s_tone >= 0)
preview_icon.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD)
else
preview_icon.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT)
// Proper Skin color - Fix, you can't have HAS_SKIN_TONE *and* HAS_SKIN_COLOR
- if(H.species.bodyflags & HAS_SKIN_COLOR)
+ if(H.dna.species.bodyflags & HAS_SKIN_COLOR)
preview_icon.Blend(H.skin_colour, ICON_ADD)
//Tail Markings
var/icon/t_marking_s
- if(H.species.bodyflags & HAS_TAIL_MARKINGS)
+ if(H.dna.species.bodyflags & HAS_TAIL_MARKINGS)
var/tail_marking = H.m_styles["tail"]
var/datum/sprite_accessory/tail_marking_style = marking_styles_list[tail_marking]
if(tail_marking_style && tail_marking_style.species_allowed)
@@ -398,8 +398,8 @@ var/record_id_num = 1001
preview_icon.Blend(t_marking_s, ICON_OVERLAY)
var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s")
- if(!(H.species.bodyflags & NO_EYES))
- var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s")
+ if(!(H.dna.species.bodyflags & NO_EYES))
+ var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.dna.species ? H.dna.species.eyes : "eyes_s")
if(!eyes_organ)
return
eyes_s.Blend(eyes_organ.eye_colour, ICON_ADD)
@@ -410,7 +410,7 @@ var/record_id_num = 1001
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
// I'll want to make a species-specific proc for this sooner or later
// But this'll do for now
- if(head_organ.species.name == "Slime People")
+ if(istype(head_organ.dna.species, /datum/species/slime))
hair_s.Blend("[H.skin_colour]A0", ICON_AND) //A0 = 160 alpha.
else
hair_s.Blend(head_organ.hair_colour, ICON_ADD)
@@ -424,7 +424,7 @@ var/record_id_num = 1001
face_s.Blend(hair_s, ICON_OVERLAY)
//Head Accessory
- if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
+ if(head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[head_organ.ha_style]
if(head_accessory_style && head_accessory_style.species_allowed)
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
@@ -434,7 +434,7 @@ var/record_id_num = 1001
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[head_organ.f_style]
if(facial_hair_style && facial_hair_style.species_allowed)
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
- if(head_organ.species.name == "Slime People")
+ if(istype(head_organ.dna.species, /datum/species/slime))
facial_s.Blend("[H.skin_colour]A0", ICON_ADD) //A0 = 160 alpha.
else
facial_s.Blend(head_organ.facial_colour, ICON_ADD)
@@ -448,15 +448,15 @@ var/record_id_num = 1001
face_s.Blend(facial_s, ICON_OVERLAY)
//Markings
- if((H.species.bodyflags & HAS_HEAD_MARKINGS) || (H.species.bodyflags & HAS_BODY_MARKINGS))
- if(H.species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
+ if((H.dna.species.bodyflags & HAS_HEAD_MARKINGS) || (H.dna.species.bodyflags & HAS_BODY_MARKINGS))
+ if(H.dna.species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
var/body_marking = H.m_styles["body"]
var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
if(body_marking_style && body_marking_style.species_allowed)
var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
b_marking_s.Blend(H.m_colours["body"], ICON_ADD)
face_s.Blend(b_marking_s, ICON_OVERLAY)
- if(H.species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
+ if(H.dna.species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
var/head_marking = H.m_styles["head"]
var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
if(head_marking_style && head_marking_style.species_allowed)
@@ -615,7 +615,7 @@ var/record_id_num = 1001
temp.Shift(EAST, H.body_accessory.pixel_x_offset)
if(H.body_accessory.pixel_y_offset)
temp.Shift(NORTH, H.body_accessory.pixel_y_offset)
- if(H.species.bodyflags & HAS_SKIN_COLOR)
+ if(H.dna.species.bodyflags & HAS_SKIN_COLOR)
temp.Blend(H.skin_colour, H.body_accessory.blend_mode)
if(t_marking_s)
temp.Blend(t_marking_s, ICON_OVERLAY)
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 485d0f1165a..18d80b40e21 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -1016,8 +1016,9 @@
to_chat(usr, "Mob doesn't exist anymore")
return
- if(H.set_species(new_species))
- to_chat(usr, "Set species of [H] to [H.species].")
+ var/datum/species/S = all_species[new_species]
+ if(H.set_species(S.type))
+ to_chat(usr, "Set species of [H] to [H.dna.species].")
H.regenerate_icons()
message_admins("[key_name_admin(usr)] has changed the species of [key_name_admin(H)] to [new_species]")
log_admin("[key_name(usr)] has changed the species of [key_name(H)] to [new_species]")
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index e39a592bc3b..1bbba44f78b 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -134,7 +134,7 @@
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
- if((VIRUSIMMUNE in species.species_traits) && !D.bypasses_immunity)
+ if((VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity)
return 0
for(var/thing in D.required_organs)
if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs)))
diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm
index 8a90b848f22..8ba3ed64008 100644
--- a/code/datums/diseases/advance/symptoms/voice_change.dm
+++ b/code/datums/diseases/advance/symptoms/voice_change.dm
@@ -36,7 +36,7 @@ Bonus
else
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.SetSpecialVoice(H.species.get_random_name(H.gender))
+ H.SetSpecialVoice(H.dna.species.get_random_name(H.gender))
return
diff --git a/code/datums/diseases/kingstons.dm b/code/datums/diseases/kingstons.dm
index abad7dcf720..260f01e0301 100644
--- a/code/datums/diseases/kingstons.dm
+++ b/code/datums/diseases/kingstons.dm
@@ -16,26 +16,26 @@
switch(stage)
if(1)
if(prob(10))
- if(affected_mob.get_species() == "Tajaran")
+ if(istajaran(affected_mob))
to_chat(affected_mob, "You feel good.")
else
to_chat(affected_mob, "You feel like playing with string.")
if(2)
if(prob(10))
- if(affected_mob.get_species() == "Tajaran")
+ if(istajaran(affected_mob))
to_chat(affected_mob, "Something in your throat itches.")
else
to_chat(affected_mob, "You NEED to find a mouse.")
if(3)
if(prob(10))
- if(affected_mob.get_species() == "Tajaran")
+ if(istajaran(affected_mob))
to_chat(affected_mob, "You feel something in your throat!")
affected_mob.emote("cough")
else
affected_mob.say(pick(list("Mew", "Meow!", "Nya!~")))
if(4)
if(prob(5))
- if(affected_mob.get_species() == "Tajaran")
+ if(istajaran(affected_mob))
affected_mob.visible_message("[affected_mob] coughs up a hairball!", \
"You cough up a hairball!")
affected_mob.Stun(5)
@@ -43,7 +43,7 @@
affected_mob.visible_message("[affected_mob]'s form contorts into something more feline!", \
"YOU TURN INTO A TAJARAN!")
var/mob/living/carbon/human/catface = affected_mob
- catface.set_species("Tajaran")
+ catface.set_species(/datum/species/tajaran)
/datum/disease/kingstons/advanced
@@ -57,9 +57,9 @@
permeability_mod = 0.75
desc = "If left untreated the subject will mutate to a different species."
severity = BIOHAZARD
- var/list/virspecies = list("Human", "Tajaran", "Unathi", "Skrell", "Vulpkanin")//no karma races sorrys.
+ var/list/virspecies = list(/datum/species/human, /datum/species/tajaran, /datum/species/unathi,/datum/species/skrell, /datum/species/vulpkanin) //no karma races sorrys.
var/list/virsuffix = list("pox", "rot", "flu", "cough", "-gitis", "cold", "rash", "itch", "decay")
- var/chosentype
+ var/datum/species/chosentype
var/chosensuff
/datum/disease/kingstons/advanced/New()
@@ -70,26 +70,27 @@
/datum/disease/kingstons/advanced/stage_act()
..()
- switch(stage)
- if(1)
- if(prob(10))
- to_chat(affected_mob, "You feel awkward.")
- if(2)
- if(prob(10))
- to_chat(affected_mob, "You itch.")
- if(3)
- if(prob(10))
- to_chat(affected_mob, "Your skin starts to flake!")
+ if(ishuman(affected_mob))
+ var/mob/living/carbon/human/twisted = affected_mob
+ switch(stage)
+ if(1)
+ if(prob(10))
+ to_chat(twisted, "You feel awkward.")
+ if(2)
+ if(prob(10))
+ to_chat(twisted, "You itch.")
+ if(3)
+ if(prob(10))
+ to_chat(twisted, "Your skin starts to flake!")
- if(4)
- if(prob(5))
- if(affected_mob.get_species() != chosentype)
- affected_mob.visible_message("[affected_mob]'s skin splits and form contorts!", \
- "Your body mutates into a [chosentype]!")
- var/mob/living/carbon/human/twisted = affected_mob
- twisted.set_species(chosentype)
- else
- affected_mob.visible_message("[affected_mob] scratches at thier skin!", \
- "You scratch your skin to try not to itch!")
- affected_mob.adjustBruteLoss(-5)
- affected_mob.adjustStaminaLoss(5)
\ No newline at end of file
+ if(4)
+ if(prob(5))
+ if(!istype(twisted.dna.species, chosentype))
+ twisted.visible_message("[twisted]'s skin splits and form contorts!", \
+ "Your body mutates into a [initial(chosentype.name)]!")
+ twisted.set_species(chosentype)
+ else
+ twisted.visible_message("[twisted] scratches at thier skin!", \
+ "You scratch your skin to try not to itch!")
+ twisted.adjustBruteLoss(-5)
+ twisted.adjustStaminaLoss(5)
\ No newline at end of file
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 5546efe537e..444b4838319 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -194,13 +194,13 @@
if(1)
if(ishuman(affected_mob))
var/mob/living/carbon/human/H = affected_mob
- if(H.species.name == "Slime People")
+ if(isslimeperson(H))
stage = 5
if(3)
if(ishuman(affected_mob))
var/mob/living/carbon/human/human = affected_mob
- if(human.species.name != "Slime People")
- human.set_species("Slime People")
+ if(!isslimeperson(human))
+ human.set_species(/datum/species/slime)
/datum/disease/transformation/corgi
name = "The Barkening"
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 3f62c8ffaed..0e8d655c546 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -61,7 +61,6 @@
var/linglink
var/datum/vampire/vampire //vampire holder
var/datum/nations/nation //nation holder
- var/datum/abductor/abductor //abductor holder
var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state
var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD
@@ -1132,14 +1131,17 @@
log_admin("[key_name(usr)] turned [current] into abductor.")
ticker.mode.update_abductor_icons_added(src)
if("equip")
+ if(!ishuman(current))
+ to_chat(usr, "This only works on humans!")
+ return
+
+ var/mob/living/carbon/human/H = current
var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist")
if(gear)
- var/datum/game_mode/abduction/temp = new
- temp.equip_common(current)
if(gear=="Agent")
- temp.equip_agent(current)
+ H.equipOutfit(/datum/outfit/abductor/agent)
else
- temp.equip_scientist(current)
+ H.equipOutfit(/datum/outfit/abductor/scientist)
else if(href_list["silicon"])
switch(href_list["silicon"])
@@ -1424,36 +1426,32 @@
var/mob/living/carbon/human/H = current
- H.set_species("Abductor")
+ H.set_species(/datum/species/abductor)
+ var/datum/species/abductor/S = H.dna.species
- switch(role)
- if("Agent")
- H.mind.abductor.agent = 1
- if("Scientist")
- H.mind.abductor.scientist = 1
- H.mind.abductor.team = team
+ if(role == "Scientist")
+ S.scientist = TRUE
+
+ S.team = team
var/list/obj/effect/landmark/abductor/agent_landmarks = new
var/list/obj/effect/landmark/abductor/scientist_landmarks = new
agent_landmarks.len = 4
scientist_landmarks.len = 4
for(var/obj/effect/landmark/abductor/A in landmarks_list)
- if(istype(A,/obj/effect/landmark/abductor/agent))
+ if(istype(A, /obj/effect/landmark/abductor/agent))
agent_landmarks[text2num(A.team)] = A
- else if(istype(A,/obj/effect/landmark/abductor/scientist))
+ else if(istype(A, /obj/effect/landmark/abductor/scientist))
scientist_landmarks[text2num(A.team)] = A
var/obj/effect/landmark/L
- if(teleport=="Yes")
+ if(teleport == "Yes")
switch(role)
if("Agent")
- H.mind.abductor.agent = 1
L = agent_landmarks[team]
- H.loc = L.loc
if("Scientist")
- H.mind.abductor.scientist = 1
L = agent_landmarks[team]
- H.loc = L.loc
+ H.forceMove(L.loc)
// check whether this mind's mob has been brigged for the given duration
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index b31084aee9f..edb254203bf 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -371,7 +371,7 @@
)
/datum/outfit/admin/vox/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- if(H.get_species() == "Vox Armalis")
+ if(isvoxarmalis(H))
. = ..()
else
H.equip_vox_raider()
diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm
index 84c3a552c03..f1744e22550 100644
--- a/code/datums/spells/lichdom.dm
+++ b/code/datums/spells/lichdom.dm
@@ -68,7 +68,7 @@
lich.real_name = M.mind.name
M.mind.transfer_to(lich)
- lich.set_species("Skeleton")
+ lich.set_species(/datum/species/skeleton)
to_chat(lich, "Your bones clatter and shutter as they're pulled back into this world!")
charge_max += 600
var/mob/old_body = current_body
@@ -122,7 +122,7 @@
current_body = M.mind.current
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.set_species("Skeleton")
+ H.set_species(/datum/species/skeleton)
H.unEquip(H.wear_suit)
H.unEquip(H.head)
H.unEquip(H.shoes)
diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm
index acd155e7560..a1c6a83da61 100644
--- a/code/datums/weather/weather_types/radiation_storm.dm
+++ b/code/datums/weather/weather_types/radiation_storm.dm
@@ -34,7 +34,7 @@
if(prob(40))
if(ishuman(L))
var/mob/living/carbon/human/H = L
- if(!(RADIMMUNE in H.species.species_traits))
+ if(!(RADIMMUNE in H.dna.species.species_traits))
if(prob(max(0, 100 - resist)))
randmuti(H) // Applies bad mutation
if(prob(50))
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index f21c2948b01..cba96ded0db 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -99,8 +99,7 @@ var/global/list/bad_blocks[0]
var/b_type = "A+" // Should probably change to an integer => string map but I'm lazy.
var/real_name // Stores the real name of the person who originally got this dna datum. Used primarily for changelings,
- // New stuff
- var/species = "Human"
+ var/datum/species/species = new /datum/species/human //The type of mutant race the player is if applicable (i.e. potato-man)
// Make a copy of this strand.
// USE THIS WHEN COPYING STUFF OR YOU'LL GET CORRUPTION!
@@ -110,7 +109,7 @@ var/global/list/bad_blocks[0]
new_dna.struc_enzymes_original=struc_enzymes_original // will make clone's SE the same as the original, do we want this?
new_dna.b_type=b_type
new_dna.real_name=real_name
- new_dna.species=species
+ new_dna.species = new species.type
for(var/b=1;b<=DNA_SE_LENGTH;b++)
new_dna.SE[b]=SE[b]
if(b<=DNA_UI_LENGTH)
@@ -141,7 +140,7 @@ var/global/list/bad_blocks[0]
// FIXME: Species-specific defaults pls
var/obj/item/organ/external/head/H = character.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = character.get_int_organ(/obj/item/organ/internal/eyes)
- var/datum/species/S = character.species
+ var/datum/species/S = character.dna.species
/*// Body Accessory
if(!character.body_accessory)
@@ -421,7 +420,7 @@ var/global/list/bad_blocks[0]
data["UE"] = unique_enzymes
data["SE"] = SE.Copy() // This is probably too lazy for my own good
data["UI"] = UI.Copy()
- data["species"] = species // This works because `species` is a string, not a datum
+ data["species"] = species.type
// Because old DNA coders were insane or something
data["b_type"] = b_type
data["real_name"] = real_name
@@ -434,10 +433,7 @@ var/global/list/bad_blocks[0]
UI = data["UI"]
UpdateUI()
UpdateSE()
- species = data["species"]
+ var/datum/species/S = data["species"]
+ species = new S
b_type = data["b_type"]
- real_name = data["real_name"]
-
-// a nice hook for if/when we refactor species on dna
-/datum/dna/proc/get_species_name()
- return species
+ real_name = data["real_name"]
\ No newline at end of file
diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm
index f2ad2b2fe03..07979f40b7c 100644
--- a/code/game/dna/dna2_domutcheck.dm
+++ b/code/game/dna/dna2_domutcheck.dm
@@ -16,7 +16,7 @@
/proc/genemutcheck(var/mob/living/M, var/block, var/connected=null, var/flags=0)
if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure.
var/mob/living/carbon/human/H = M
- if(NO_DNA in H.species.species_traits)
+ if(NO_DNA in H.dna.species.species_traits)
return
if(!M)
return
@@ -42,7 +42,7 @@
var/defaultgenes // Do not mutate inherent species abilities
if(ishuman(M))
var/mob/living/carbon/human/H = M
- defaultgenes = H.species.default_genes
+ defaultgenes = H.dna.species.default_genes
if((gene in defaultgenes) && gene_active)
return
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 6c05dfd6f2b..d392ab303ca 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -133,7 +133,7 @@
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
var/obj/item/organ/internal/eyes/eye_organ = H.get_int_organ(/obj/item/organ/internal/eyes)
- var/datum/species/S = H.species
+ var/datum/species/S = H.dna.species
if(istype(head_organ))
dna.write_head_attributes(head_organ)
if(istype(eye_organ))
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 93d9977b5e8..354536561c1 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -327,7 +327,7 @@
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
- if(NO_DNA in H.species.species_traits)
+ if(NO_DNA in H.dna.species.species_traits)
return 1
var/radiation_protection = occupant.run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm.")
diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm
index e59dd3fc558..b39b31a1c5a 100644
--- a/code/game/dna/genes/goon_disabilities.dm
+++ b/code/game/dna/genes/goon_disabilities.dm
@@ -44,7 +44,7 @@
return 0
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if((RADIMMUNE in H.species.species_traits) && !(flags & MUTCHK_FORCED))
+ if((RADIMMUNE in H.dna.species.species_traits) && !(flags & MUTCHK_FORCED))
return 0
return 1
diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm
index 666cb057635..38caf8eda74 100644
--- a/code/game/dna/genes/monkey.dm
+++ b/code/game/dna/genes/monkey.dm
@@ -7,8 +7,8 @@
/datum/dna/gene/monkey/can_activate(var/mob/M,var/flags)
return ishuman(M)
-/datum/dna/gene/monkey/activate(var/mob/living/carbon/human/H, var/connected, var/flags)
- if(!istype(H,/mob/living/carbon/human))
+/datum/dna/gene/monkey/activate(mob/living/carbon/human/H, connected, flags)
+ if(!istype(H))
return
if(issmall(H))
return
@@ -31,23 +31,24 @@
H.SetStunned(0)
H.invisibility = initial(H.invisibility)
- if(!H.species.primitive_form) //If the creature in question has no primitive set, this is going to be messy.
+ if(!H.dna.species.primitive_form) //If the creature in question has no primitive set, this is going to be messy.
H.gib()
return
- H.set_species(H.species.primitive_form)
+ H.set_species(H.dna.species.primitive_form)
QDEL_NULL(H.hud_used)
if(H.client)
H.hud_used = new /datum/hud/monkey(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha)
+ H.hud_used.show_hud(H.hud_used.hud_version)
- to_chat(H, "You are now a [H.species.name].")
+ to_chat(H, "You are now a [H.dna.species.name].")
return H
-/datum/dna/gene/monkey/deactivate(var/mob/living/carbon/human/H, var/connected, var/flags)
- if(!istype(H,/mob/living/carbon/human))
+/datum/dna/gene/monkey/deactivate(mob/living/carbon/human/H, connected, flags)
+ if(!istype(H))
return
for(var/obj/item/W in H)
if(W == H.w_uniform) // will be torn
@@ -69,11 +70,11 @@
H.SetStunned(0)
H.invisibility = initial(H.invisibility)
- if(!H.species.greater_form) //If the creature in question has no primitive set, this is going to be messy.
+ if(!H.dna.species.greater_form) //If the creature in question has no primitive set, this is going to be messy.
H.gib()
return
- H.set_species(H.species.greater_form)
+ H.set_species(H.dna.species.greater_form)
H.real_name = H.dna.real_name
H.name = H.real_name
@@ -81,7 +82,8 @@
if(H.client)
H.hud_used = new /datum/hud/human(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha)
+ H.hud_used.show_hud(H.hud_used.hud_version)
- to_chat(H, "You are now a [H.species.name].")
+ to_chat(H, "You are now a [H.dna.species.name].")
return H
diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm
index e9d69c2b904..1e5e6b66842 100644
--- a/code/game/dna/genes/powers.dm
+++ b/code/game/dna/genes/powers.dm
@@ -39,7 +39,7 @@
return 0
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species && H.species.slowdown && !(flags & MUTCHK_FORCED))
+ if(H.dna.species && H.dna.species.slowdown && !(flags & MUTCHK_FORCED))
return 0
return 1
diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm
index 3e709560a45..f9e8620bef1 100644
--- a/code/game/dna/genes/vg_powers.dm
+++ b/code/game/dna/genes/vg_powers.dm
@@ -50,7 +50,7 @@
M.change_eye_color(new_eyes)
//Alt heads.
- if(head_organ.species.bodyflags & HAS_ALT_HEADS)
+ if(head_organ.dna.species.bodyflags & HAS_ALT_HEADS)
var/list/valid_alt_heads = M.generate_valid_alt_heads()
var/new_alt_head = input("Please select alternate head", "Character Generation", head_organ.alt_head) as null|anything in valid_alt_heads
if(new_alt_head)
@@ -92,7 +92,7 @@
M.change_facial_hair_color(new_facial, 1)
//Head accessory.
- if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
+ if(head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY)
var/list/valid_head_accessories = M.generate_valid_head_accessories()
var/new_head_accessory = input("Please select head accessory style", "Character Generation", head_organ.ha_style) as null|anything in valid_head_accessories
if(new_head_accessory)
@@ -103,7 +103,7 @@
M.change_head_accessory_color(new_head_accessory_colour)
//Body accessory.
- if(M.species.tail && M.species.bodyflags & HAS_TAIL)
+ if(M.dna.species.tail && M.dna.species.bodyflags & HAS_TAIL)
var/list/valid_body_accessories = M.generate_valid_body_accessories()
if(valid_body_accessories.len > 1) //By default valid_body_accessories will always have at the very least a 'none' entry populating the list, even if the user's species is not present in any of the list items.
var/new_body_accessory = input("Please select body accessory style", "Character Generation", M.body_accessory) as null|anything in valid_body_accessories
@@ -111,7 +111,7 @@
M.change_body_accessory(new_body_accessory)
//Head markings.
- if(M.species.bodyflags & HAS_HEAD_MARKINGS)
+ if(M.dna.species.bodyflags & HAS_HEAD_MARKINGS)
var/list/valid_head_markings = M.generate_valid_markings("head")
var/new_marking = input("Please select head marking style", "Character Generation", M.m_styles["head"]) as null|anything in valid_head_markings
if(new_marking)
@@ -121,7 +121,7 @@
if(new_marking_colour)
M.change_marking_color(new_marking_colour, "head")
//Body markings.
- if(M.species.bodyflags & HAS_BODY_MARKINGS)
+ if(M.dna.species.bodyflags & HAS_BODY_MARKINGS)
var/list/valid_body_markings = M.generate_valid_markings("body")
var/new_marking = input("Please select body marking style", "Character Generation", M.m_styles["body"]) as null|anything in valid_body_markings
if(new_marking)
@@ -131,7 +131,7 @@
if(new_marking_colour)
M.change_marking_color(new_marking_colour, "body")
//Tail markings.
- if(M.species.bodyflags & HAS_TAIL_MARKINGS)
+ if(M.dna.species.bodyflags & HAS_TAIL_MARKINGS)
var/list/valid_tail_markings = M.generate_valid_markings("tail")
var/new_marking = input("Please select tail marking style", "Character Generation", M.m_styles["tail"]) as null|anything in valid_tail_markings
if(new_marking)
@@ -142,7 +142,7 @@
M.change_marking_color(new_marking_colour, "tail")
//Skin tone.
- if(M.species.bodyflags & HAS_SKIN_TONE)
+ if(M.dna.species.bodyflags & HAS_SKIN_TONE)
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", M.s_tone) as null|text
if(!new_tone)
new_tone = 35
@@ -150,11 +150,11 @@
new_tone = 35 - max(min(round(text2num(new_tone)), 220), 1)
M.change_skin_tone(new_tone)
- if(M.species.bodyflags & HAS_ICON_SKIN_TONE)
- var/prompt = "Please select skin tone: 1-[M.species.icon_skin_tones.len] ("
- for(var/i = 1 to M.species.icon_skin_tones.len)
- prompt += "[i] = [M.species.icon_skin_tones[i]]"
- if(i != M.species.icon_skin_tones.len)
+ if(M.dna.species.bodyflags & HAS_ICON_SKIN_TONE)
+ var/prompt = "Please select skin tone: 1-[M.dna.species.icon_skin_tones.len] ("
+ for(var/i = 1 to M.dna.species.icon_skin_tones.len)
+ prompt += "[i] = [M.dna.species.icon_skin_tones[i]]"
+ if(i != M.dna.species.icon_skin_tones.len)
prompt += ", "
prompt += ")"
@@ -162,11 +162,11 @@
if(!new_tone)
new_tone = 0
else
- new_tone = max(min(round(text2num(new_tone)), M.species.icon_skin_tones.len), 1)
+ new_tone = max(min(round(text2num(new_tone)), M.dna.species.icon_skin_tones.len), 1)
M.change_skin_tone(new_tone)
//Skin colour.
- if(M.species.bodyflags & HAS_SKIN_COLOR)
+ if(M.dna.species.bodyflags & HAS_SKIN_COLOR)
var/new_body_colour = input("Please select body colour.", "Character Generation", M.skin_colour) as null|color
if(new_body_colour)
M.change_skin_color(new_body_colour)
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 329408bffce..477a0de2573 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -112,7 +112,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
if(identity_theft.target && identity_theft.target.current)
identity_theft.target_real_name = kill_objective.target.current.real_name //Whoops, forgot this.
var/mob/living/carbon/human/H = identity_theft.target.current
- if(can_absorb_species(H.species)) // For species that can't be absorbed - should default to an escape objective
+ if(can_absorb_species(H.dna.species)) // For species that can't be absorbed - should default to an escape objective
identity_theft.explanation_text = "Escape on the shuttle or an escape pod with the identity of [identity_theft.target_real_name], the [identity_theft.target.assigned_role] while wearing [identity_theft.target.p_their()] identification card."
changeling.objectives += identity_theft
else
@@ -273,7 +273,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling/proc/find_dna(datum/dna/tDNA)
for(var/datum/dna/D in (absorbed_dna + protected_dna))
- if(tDNA.unique_enzymes == D.unique_enzymes && tDNA.uni_identity == D.uni_identity && tDNA.species == D.species)
+ if(tDNA.unique_enzymes == D.unique_enzymes && tDNA.uni_identity == D.uni_identity && tDNA.species.type == D.species.type)
return D
return null
@@ -316,7 +316,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
to_chat(user, "DNA of [target] is ruined beyond usability!")
return
- if(NO_DNA in T.species.species_traits)
+ if(NO_DNA in T.dna.species.species_traits)
to_chat(user, "This creature does not have DNA!")
return
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index a7af2b94482..befdf899253 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -375,7 +375,7 @@ var/list/sting_paths
path.on_purchase(src)
var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste
- mind.changeling.absorbed_dna |= C.dna
+ mind.changeling.absorbed_dna |= C.dna.Clone()
mind.changeling.trim_dna()
return 1
diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm
index fb3012cd274..72b0e821e66 100644
--- a/code/game/gamemodes/changeling/powers/humanform.dm
+++ b/code/game/gamemodes/changeling/powers/humanform.dm
@@ -26,10 +26,10 @@
to_chat(user, "We transform our appearance.")
user.dna.SetSEState(MONKEYBLOCK,0,1)
genemutcheck(user,MONKEYBLOCK,null,MUTCHK_FORCED)
+ if(istype(user))
+ user.set_species(chosen_dna.species.type)
user.dna = chosen_dna.Clone()
user.real_name = chosen_dna.real_name
- if(istype(user))
- user.set_species(chosen_dna.species)
domutcheck(user,null,MUTCHK_FORCED)
user.flavor_text = ""
user.dna.UpdateSE()
diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm
index 3d3b7f2bc07..2197163cbd5 100644
--- a/code/game/gamemodes/changeling/powers/lesserform.dm
+++ b/code/game/gamemodes/changeling/powers/lesserform.dm
@@ -17,17 +17,13 @@
var/mob/living/carbon/human/H = user
- if(!istype(H) || !H.species.primitive_form)
+ if(!istype(H) || !H.dna.species.primitive_form)
to_chat(H, "We cannot perform this ability in this form!")
return
- user.dna = user.dna.Clone()
H.visible_message("[H] transforms!")
changeling.geneticdamage = 30
to_chat(H, "Our genes cry out!")
- var/list/implants = list() //Try to preserve implants.
- for(var/obj/item/implant/W in H)
- implants += W
H.monkeyize()
changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
feedback_add_details("changeling_powers","LF")
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index b3881ee54fb..3e03d49dc49 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -31,7 +31,7 @@
H.traumatic_shock = 0
H.shock_stage = 0
H.next_pain_time = 0
- H.species.create_organs(H)
+ H.dna.species.create_organs(H)
// Now that recreating all organs is necessary, the rest of this organ stuff probably
// isn't, but I don't want to remove it, just in case.
for(var/organ_name in H.bodyparts_by_name)
diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm
index 9015677c70e..c40a33284a1 100644
--- a/code/game/gamemodes/changeling/powers/swap_form.dm
+++ b/code/game/gamemodes/changeling/powers/swap_form.dm
@@ -17,7 +17,7 @@
if((NOCLONE || SKELETON || HUSK) in target.mutations)
to_chat(user, "DNA of [target] is ruined beyond usability!")
return
- if(!istype(target) || issmall(target) || NO_DNA in target.species.species_traits)
+ if(!istype(target) || issmall(target) || NO_DNA in target.dna.species.species_traits)
to_chat(user, "[target] is not compatible with this ability.")
return
return 1
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index c344897c624..bb216ddad35 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -80,8 +80,7 @@
selected_dna = changeling.select_dna("Select the target DNA: ", "Target DNA")
if(!selected_dna)
return
- var/datum/species/newspecies = all_species[selected_dna.species]
- if((NOTRANSSTING in newspecies.species_traits) || newspecies.is_small)
+ if((NOTRANSSTING in selected_dna.species.species_traits) || selected_dna.species.is_small)
to_chat(user, "The selected DNA is incompatible with our sting.")
return
..()
@@ -94,7 +93,7 @@
return FALSE
if(ishuman(target))
var/mob/living/carbon/human/H = target
- if(NO_DNA in H.species.species_traits)
+ if(NO_DNA in H.dna.species.species_traits)
to_chat(user, "This won't work on a creature without DNA.")
return FALSE
return TRUE
@@ -112,11 +111,11 @@
target.visible_message("[target] begins to violenty convulse!","You feel a tiny prick and a begin to uncontrollably convulse!")
spawn(10)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.set_species(NewDNA.species.type)
target.dna = NewDNA.Clone()
target.real_name = NewDNA.real_name
- var/mob/living/carbon/human/H = target
- if(istype(H))
- H.set_species()
target.UpdateAppearance()
domutcheck(target, null)
feedback_add_details("changeling_powers","TS")
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index b7c8abefd1d..bacdc8b0d8b 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -14,10 +14,10 @@
if(!chosen_dna)
return
+ if(ishuman(user))
+ user.set_species(chosen_dna.species.type)
user.dna = chosen_dna.Clone()
user.real_name = chosen_dna.real_name
- if(ishuman(user))
- user.set_species(chosen_dna.species)
domutcheck(user, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
user.flavor_text = ""
user.dna.UpdateSE()
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 2edbfca609f..b8e5365cb5d 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -50,7 +50,7 @@
..()
if(ishuman(target))
var/mob/living/carbon/human/H = target
- if((H.stat != DEAD) && !(NO_BLOOD in H.species.species_traits))
+ if((H.stat != DEAD) && !(NO_BLOOD in H.dna.species.species_traits))
H.bleed(50)
/obj/item/restraints/legcuffs/bola/cult
@@ -201,6 +201,7 @@
increment = 5
max = 40
prefix = "darkened"
+ claw_damage_increase = 2
/obj/item/whetstone/cult/update_icon()
icon_state = "cult_sharpener[used ? "_used" : ""]"
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 8d858c6fade..70e78176463 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -279,7 +279,7 @@
var/mob/living/carbon/human/H = user
user.visible_message("Otherworldly armor suddenly appears on [user]!", \
"You speak the words of the talisman, arming yourself!")
- if(H.get_species() == "Plasmaman")
+ if(isplasmaman(H))
H.equip_to_slot(new /obj/item/clothing/suit/space/eva/plasmaman/cultist(H), slot_wear_suit)
H.equip_to_slot(new /obj/item/clothing/head/helmet/space/eva/plasmaman/cultist(H), slot_head)
else
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 3b908952de7..4cbe909ef84 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -101,7 +101,7 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
vox.name = vox.real_name
newraider.name = vox.name
vox.age = rand(12,20)
- vox.set_species("Vox")
+ vox.set_species(/datum/species/vox)
vox.s_tone = rand(1, 6)
vox.languages = list() // Removing language from chargen.
vox.flavor_text = ""
diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm
index 50b749a62a2..ca868f4874e 100644
--- a/code/game/gamemodes/intercept_report.dm
+++ b/code/game/gamemodes/intercept_report.dm
@@ -116,7 +116,7 @@
if((man.mind.assigned_role in ticker.mode.protected_jobs) || (man.mind.assigned_role in ticker.mode.restricted_jobs))
return
//don't include suspects who can't possibly be the antag based on their species (no suspecting the machines of being sneaky changelings)
- if(man.get_species() in ticker.mode.protected_species)
+ if(man.dna.species.name in ticker.mode.protected_species)
return
dudes += man
for(var/i = 0, i < max(player_list.len/10,2), i++)
diff --git a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm
new file mode 100644
index 00000000000..af2920c4626
--- /dev/null
+++ b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm
@@ -0,0 +1,147 @@
+/datum/objective/abductee
+ completed = 1
+
+/datum/objective/abductee/steal
+ explanation_text = "Steal all"
+
+/datum/objective/abductee/steal/New()
+ var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs"))
+ explanation_text+=" [target]."
+
+/datum/objective/abductee/paint
+ explanation_text = "The station is hideous. You must color it all"
+
+/datum/objective/abductee/paint/New()
+ var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood"))
+ explanation_text+= " [color]!"
+
+/datum/objective/abductee/speech
+ explanation_text = "Your brain is broken... you can only communicate in"
+
+/datum/objective/abductee/speech/New()
+ var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon"))
+ explanation_text+= " [style]."
+
+/datum/objective/abductee/capture
+ explanation_text = "Capture"
+
+/datum/objective/abductee/capture/New()
+ var/list/jobs = job_master.occupations.Copy()
+ for(var/datum/job/J in jobs)
+ if(J.current_positions < 1)
+ jobs -= J
+ if(jobs.len > 0)
+ var/datum/job/target = pick(jobs)
+ explanation_text += " a [target.title]."
+ else
+ explanation_text += " someone."
+
+/datum/objective/abductee/shuttle
+ explanation_text = "You must escape the station! Get the shuttle called!"
+
+/datum/objective/abductee/noclone
+ explanation_text = "Don't allow anyone to be cloned."
+
+/datum/objective/abductee/oxygen
+ explanation_text = "The oxygen is killing them all and they don't even know it. Make sure no oxygen is on the station."
+
+/datum/objective/abductee/blazeit
+ explanation_text = "Your body must be improved. Ingest as many drugs as you can."
+
+/datum/objective/abductee/yumyum
+ explanation_text = "You are hungry. Eat as much food as you can find."
+
+/datum/objective/abductee/insane
+ explanation_text = "You see you see what they cannot you see the open door you seeE you SEeEe you SEe yOU seEee SHOW THEM ALL"
+
+/datum/objective/abductee/cannotmove
+ explanation_text = "Convince the crew that you are a paraplegic."
+
+/datum/objective/abductee/deadbodies
+ explanation_text = "Start a collection of corpses. Don't kill people to get these corpses."
+
+/datum/objective/abductee/floors
+ explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling."
+
+/datum/objective/abductee/POWERUNLIMITED
+ explanation_text = "Flood the station's powernet with as much electricity as you can."
+
+/datum/objective/abductee/pristine
+ explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition."
+
+/datum/objective/abductee/nowalls
+ explanation_text = "The crew must get to know one another better. Break down the walls inside the station!"
+
+/datum/objective/abductee/nations
+ explanation_text = "Ensure your department prospers over all else."
+
+/datum/objective/abductee/abductception
+ explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine."
+
+/datum/objective/abductee/summon
+ explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one."
+
+/datum/objective/abductee/machine
+ explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last."
+
+/datum/objective/abductee/calling
+ explanation_text = "Call forth a spirit from the other side."
+
+/datum/objective/abductee/calling/New()
+ var/mob/dead/D = pick(dead_mob_list)
+ if(D)
+ explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm."
+
+/datum/objective/abductee/social_experiment
+ explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth."
+
+/datum/objective/abductee/vr
+ explanation_text = "It's all an entirely virtual simulation within an underground vault. Convince the crew to escape the shackles of VR."
+
+/datum/objective/abductee/pets
+ explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!"
+
+/datum/objective/abductee/defect
+ explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Mining Outpost or the derelict. Recruit crewmates if you can."
+
+/datum/objective/abductee/promote
+ explanation_text = "Climb the corporate ladder all the way to the top!"
+
+/datum/objective/abductee/science
+ explanation_text = "So much lies undiscovered. Look deeper into the machinations of the universe."
+
+/datum/objective/abductee/build
+ explanation_text = "Expand the station."
+
+/datum/objective/abductee/pragnant
+ explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby."
+
+/datum/objective/abductee/engine
+ explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds."
+
+/datum/objective/abductee/music
+ explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!"
+
+/datum/objective/abductee/clown
+ explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!"
+
+/datum/objective/abductee/party
+ explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!"
+
+/datum/objective/abductee/pets
+ explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!"
+
+/datum/objective/abductee/conspiracy
+ explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!"
+
+/datum/objective/abductee/stalker
+ explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it."
+
+/datum/objective/abductee/narrator
+ explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story."
+
+/datum/objective/abductee/lurve
+ explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!"
+
+/datum/objective/abductee/sixthsense
+ explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo."
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm
index 1c6dc7d3022..5d5c3342010 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction.dm
@@ -89,62 +89,14 @@
return 1
/datum/game_mode/abduction/post_setup()
- //Spawn Team
- var/list/obj/effect/landmark/abductor/agent_landmarks = new
- var/list/obj/effect/landmark/abductor/scientist_landmarks = new
- agent_landmarks.len = max_teams
- scientist_landmarks.len = max_teams
- for(var/obj/effect/landmark/abductor/A in landmarks_list)
- if(istype(A,/obj/effect/landmark/abductor/agent))
- agent_landmarks[text2num(A.team)] = A
- else if(istype(A,/obj/effect/landmark/abductor/scientist))
- scientist_landmarks[text2num(A.team)] = A
-
- var/datum/mind/agent
- var/obj/effect/landmark/L
- var/datum/mind/scientist
- var/team_name
- var/mob/living/carbon/human/H
for(var/team_number=1,team_number<=abductor_teams,team_number++)
- team_name = team_names[team_number]
- agent = agents[team_number]
- H = agent.current
- L = agent_landmarks[team_number]
- H.forceMove(get_turf(L))
- H.body_accessory = null
- H.set_species("Abductor")
- H.mind.abductor.agent = 1
- H.mind.abductor.team = team_number
- H.real_name = team_name + " Agent"
- H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys.
- H.overeatduration = 0
- equip_common(H,team_number)
- equip_agent(H,team_number)
- greet_agent(agent,team_number)
- update_abductor_icons_added(agent)
-
- scientist = scientists[team_number]
- H = scientist.current
- L = scientist_landmarks[team_number]
- H.forceMove(get_turf(L))
- H.body_accessory = null
- H.set_species("Abductor")
- H.mind.abductor.scientist = 1
- H.mind.abductor.team = team_number
- H.real_name = team_name + " Scientist"
- H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys.
- H.overeatduration = 0
- equip_common(H,team_number)
- equip_scientist(H,team_number)
- greet_scientist(scientist,team_number)
- update_abductor_icons_added(scientist)
-
+ post_setup_team(team_number)
return ..()
//Used for create antag buttons
/datum/game_mode/abduction/proc/post_setup_team(team_number)
- var/list/obj/effect/landmark/abductor/agent_landmarks = new
- var/list/obj/effect/landmark/abductor/scientist_landmarks = new
+ var/list/obj/effect/landmark/abductor/agent_landmarks = list()
+ var/list/obj/effect/landmark/abductor/scientist_landmarks = list()
agent_landmarks.len = max_teams
scientist_landmarks.len = max_teams
for(var/obj/effect/landmark/abductor/A in landmarks_list)
@@ -153,11 +105,13 @@
else if(istype(A,/obj/effect/landmark/abductor/scientist))
scientist_landmarks[text2num(A.team)] = A
+ var/team_name = team_names[team_number]
+
var/datum/mind/agent
var/obj/effect/landmark/L
var/datum/mind/scientist
- var/team_name
var/mob/living/carbon/human/H
+ var/datum/species/abductor/S
team_name = team_names[team_number]
agent = agents[team_number]
@@ -165,12 +119,13 @@
L = agent_landmarks[team_number]
H.forceMove(get_turf(L))
H.body_accessory = null
- H.set_species("Abductor")
- H.mind.abductor.agent = 1
- H.mind.abductor.team = team_number
+ H.set_species(/datum/species/abductor)
+ S = H.dna.species
+ S.team = team_number
H.real_name = team_name + " Agent"
- equip_common(H,team_number)
- equip_agent(H,team_number)
+ H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys.
+ H.overeatduration = 0
+ H.equipOutfit(/datum/outfit/abductor/agent)
greet_agent(agent,team_number)
update_abductor_icons_added(agent)
@@ -179,21 +134,17 @@
L = scientist_landmarks[team_number]
H.forceMove(get_turf(L))
H.body_accessory = null
- H.set_species("Abductor")
- H.mind.abductor.scientist = 1
- H.mind.abductor.team = team_number
+ H.set_species(/datum/species/abductor)
+ S = H.dna.species
+ S.scientist = TRUE
+ S.team = team_number
H.real_name = team_name + " Scientist"
- equip_common(H,team_number)
- equip_scientist(H,team_number)
+ H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys.
+ H.overeatduration = 0
+ H.equipOutfit(/datum/outfit/abductor/scientist)
greet_scientist(scientist,team_number)
update_abductor_icons_added(scientist)
-
-/datum/abductor //stores abductor's team and whether they're a scientist or agent; since species datums are global, we have to use this, instead.
- var/scientist = 0
- var/agent = 0
- var/team = 1
-
/datum/game_mode/abduction/proc/greet_agent(datum/mind/abductor,team_number)
abductor.objectives += team_objectives[team_number]
var/team_name = team_names[team_number]
@@ -202,11 +153,7 @@
to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!")
to_chat(abductor.current, "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve.")
- var/obj_count = 1
- for(var/datum/objective/objective in abductor.objectives)
- to_chat(abductor.current, "Objective #[obj_count]: [objective.explanation_text]")
- obj_count++
- return
+ abductor.announce_objectives()
/datum/game_mode/abduction/proc/greet_scientist(datum/mind/abductor,team_number)
abductor.objectives += team_objectives[team_number]
@@ -216,64 +163,12 @@
to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!")
to_chat(abductor.current, "Use your tool and ship consoles to support the agent and retrieve human specimens.")
- var/obj_count = 1
- for(var/datum/objective/objective in abductor.objectives)
- to_chat(abductor.current, "Objective #[obj_count]: [objective.explanation_text]")
- obj_count++
- return
-
-/datum/game_mode/abduction/proc/equip_common(mob/living/carbon/human/agent,team_number)
- var/radio_freq = SYND_FREQ
-
- var/obj/item/radio/R = new /obj/item/radio/headset/syndicate/alt(agent)
- R.set_frequency(radio_freq)
- R.name = "alien headset"
- agent.equip_to_slot_or_del(R, slot_l_ear)
- agent.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(agent), slot_shoes)
- agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit
- agent.equip_to_slot_or_del(new /obj/item/storage/backpack(agent), slot_back)
-
-/datum/game_mode/abduction/proc/get_team_console(team)
- var/obj/machinery/abductor/console/console
- for(var/obj/machinery/abductor/console/c in abductor_equipment)
- if(c.team == team)
- console = c
- break
- return console
-
-/datum/game_mode/abduction/proc/equip_agent(mob/living/carbon/human/agent,team_number)
- if(!team_number)
- team_number = agent.mind.abductor.team
-
- var/obj/machinery/abductor/console/console = get_team_console(team_number)
- var/obj/item/clothing/suit/armor/abductor/vest/V = new /obj/item/clothing/suit/armor/abductor/vest(agent)
- if(console!=null)
- console.vest = V
- V.flags |= NODROP
- agent.equip_to_slot_or_del(V, slot_wear_suit)
- agent.equip_to_slot_or_del(new /obj/item/abductor_baton(agent), slot_in_backpack)
- agent.equip_to_slot_or_del(new /obj/item/gun/energy/alien(agent), slot_in_backpack)
- agent.equip_to_slot_or_del(new /obj/item/abductor/silencer(agent), slot_in_backpack)
- agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head)
- agent.equip_to_slot_or_del(new /obj/item/storage/belt/military/abductor/full(agent), slot_belt)
- agent.update_icons()
-
-
-/datum/game_mode/abduction/proc/equip_scientist(var/mob/living/carbon/human/scientist,var/team_number)
- if(!team_number)
- team_number = scientist.mind.abductor.team
-
- var/obj/machinery/abductor/console/console = get_team_console(team_number)
- var/obj/item/abductor/gizmo/G = new /obj/item/abductor/gizmo(scientist)
- if(console!=null)
- console.gizmo = G
- G.console = console
- scientist.equip_to_slot_or_del(G, slot_in_backpack)
-
- var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(scientist)
- beamplant.implant(scientist)
- scientist.update_icons()
+ abductor.announce_objectives()
+/datum/game_mode/abduction/proc/get_team_console(team_number)
+ for(var/obj/machinery/abductor/console/C in machines)
+ if(C.team == team_number)
+ return C
/datum/game_mode/abduction/check_finished()
if(!finished)
@@ -336,18 +231,19 @@
var/ab_team = team
if(owner)
if(!owner.current || !ishuman(owner.current))
- return 0
+ return FALSE
var/mob/living/carbon/human/H = owner.current
- if(H.get_species() != "Abductor")
- return 0
- ab_team = H.mind.abductor.team
- for(var/obj/machinery/abductor/experiment/E in abductor_equipment)
+ if(!isabductor(H))
+ return FALSE
+ var/datum/species/abductor/S = H.dna.species
+ ab_team = S.team
+ for(var/obj/machinery/abductor/experiment/E in machines)
if(E.team == ab_team)
if(E.points >= target_amount)
- return 1
+ return TRUE
else
- return 0
- return 0
+ return FALSE
+ return FALSE
/datum/game_mode/proc/remove_abductor(datum/mind/abductor_mind)
if(abductor_mind in abductors)
@@ -358,7 +254,7 @@
to_chat(abductor_mind.current, "You have been turned into a robot! You are no longer an abductor.")
else
to_chat(abductor_mind.current, "You have been brainwashed! You are no longer an abductor.")
- ticker.mode.update_abductor_icons_added(abductor_mind)
+ ticker.mode.update_abductor_icons_removed(abductor_mind)
/datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind)
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR]
@@ -368,152 +264,4 @@
/datum/game_mode/proc/update_abductor_icons_removed(datum/mind/alien_mind)
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR]
hud.leave_hud(alien_mind.current)
- set_antag_hud(alien_mind.current, null)
-
-/datum/objective/abductee
- completed = 1
-
-/datum/objective/abductee/steal
- explanation_text = "Steal all"
-
-/datum/objective/abductee/steal/New()
- var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs"))
- explanation_text+=" [target]."
-
-/datum/objective/abductee/paint
- explanation_text = "The station is hideous. You must color it all"
-
-/datum/objective/abductee/paint/New()
- var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood"))
- explanation_text+= " [color]!"
-
-/datum/objective/abductee/speech
- explanation_text = "Your brain is broken... you can only communicate in"
-
-/datum/objective/abductee/speech/New()
- var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon"))
- explanation_text+= " [style]."
-
-/datum/objective/abductee/capture
- explanation_text = "Capture"
-
-/datum/objective/abductee/capture/New()
- var/list/jobs = job_master.occupations.Copy()
- for(var/datum/job/J in jobs)
- if(J.current_positions < 1)
- jobs -= J
- if(jobs.len > 0)
- var/datum/job/target = pick(jobs)
- explanation_text += " a [target.title]."
- else
- explanation_text += " someone."
-
-/datum/objective/abductee/shuttle
- explanation_text = "You must escape the station! Get the shuttle called!"
-
-/datum/objective/abductee/noclone
- explanation_text = "Don't allow anyone to be cloned."
-
-/datum/objective/abductee/oxygen
- explanation_text = "The oxygen is killing them all and they don't even know it. Make sure no oxygen is on the station."
-
-/datum/objective/abductee/blazeit
- explanation_text = "Your body must be improved. Ingest as many drugs as you can."
-
-/datum/objective/abductee/yumyum
- explanation_text = "You are hungry. Eat as much food as you can find."
-
-/datum/objective/abductee/insane
- explanation_text = "You see you see what they cannot you see the open door you seeE you SEeEe you SEe yOU seEee SHOW THEM ALL"
-
-/datum/objective/abductee/cannotmove
- explanation_text = "Convince the crew that you are a paraplegic."
-
-/datum/objective/abductee/deadbodies
- explanation_text = "Start a collection of corpses. Don't kill people to get these corpses."
-
-/datum/objective/abductee/floors
- explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling."
-
-/datum/objective/abductee/POWERUNLIMITED
- explanation_text = "Flood the station's powernet with as much electricity as you can."
-
-/datum/objective/abductee/pristine
- explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition."
-
-/datum/objective/abductee/nowalls
- explanation_text = "The crew must get to know one another better. Break down the walls inside the station!"
-
-/datum/objective/abductee/nations
- explanation_text = "Ensure your department prospers over all else."
-
-/datum/objective/abductee/abductception
- explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine."
-
-/datum/objective/abductee/summon
- explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one."
-
-/datum/objective/abductee/machine
- explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last."
-
-/datum/objective/abductee/calling
- explanation_text = "Call forth a spirit from the other side."
-
-/datum/objective/abductee/calling/New()
- var/mob/dead/D = pick(dead_mob_list)
- if(D)
- explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm."
-
-/datum/objective/abductee/social_experiment
- explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth."
-
-/datum/objective/abductee/vr
- explanation_text = "It's all an entirely virtual simulation within an underground vault. Convince the crew to escape the shackles of VR."
-
-/datum/objective/abductee/pets
- explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!"
-
-/datum/objective/abductee/defect
- explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Mining Outpost or the derelict. Recruit crewmates if you can."
-
-/datum/objective/abductee/promote
- explanation_text = "Climb the corporate ladder all the way to the top!"
-
-/datum/objective/abductee/science
- explanation_text = "So much lies undiscovered. Look deeper into the machinations of the universe."
-
-/datum/objective/abductee/build
- explanation_text = "Expand the station."
-
-/datum/objective/abductee/pragnant
- explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby."
-
-/datum/objective/abductee/engine
- explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds."
-
-/datum/objective/abductee/music
- explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!"
-
-/datum/objective/abductee/clown
- explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!"
-
-/datum/objective/abductee/party
- explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!"
-
-/datum/objective/abductee/pets
- explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!"
-
-/datum/objective/abductee/conspiracy
- explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!"
-
-/datum/objective/abductee/stalker
- explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it."
-
-/datum/objective/abductee/narrator
- explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story."
-
-/datum/objective/abductee/lurve
- explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!"
-
-/datum/objective/abductee/sixthsense
- explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo."
\ No newline at end of file
+ set_antag_hud(alien_mind.current, null)
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 9b2a0ca621b..40d48f7fd59 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -117,8 +117,8 @@
/obj/item/abductor/proc/ScientistCheck(user)
var/mob/living/carbon/human/H = user
- if(H.mind && H.mind.abductor)
- return H.mind.abductor.scientist
+ var/datum/species/abductor/S = H.dna.species
+ return S.scientist
/obj/item/abductor/gizmo
name = "science tool"
@@ -248,7 +248,7 @@
name = "alien pistol"
desc = "A complicated gun that fires bursts of high-intensity radiation."
ammo_type = list(/obj/item/ammo_casing/energy/declone)
- restricted_species = list("Abductor")
+ restricted_species = list(/datum/species/abductor)
icon_state = "alienpistol"
item_state = "alienpistol"
origin_tech = "combat=4;magnets=7;powerstorage=3;abductor=3"
@@ -431,7 +431,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
if(ishuman(L))
var/mob/living/carbon/human/H = L
- species = "[H.species.name]"
+ species = "[H.dna.species.name]"
if(L.mind && L.mind.changeling)
species = "Changeling lifeform"
var/obj/item/organ/internal/heart/gland/temp = locate() in H.internal_organs
@@ -476,6 +476,25 @@ Congratulations! You are now trained for invasive xenobiology research!"}
to_chat(user, "The baton is in probing mode.")
+/obj/item/radio/headset/abductor
+ name = "alien headset"
+ desc = "An advanced alien headset designed to monitor communications of human space stations. Why does it have a microphone? No one knows."
+ flags = EARBANGPROTECT
+ origin_tech = "magnets=2;abductor=3"
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "abductor_headset"
+ item_state = "abductor_headset"
+ ks2type = /obj/item/encryptionkey/heads/captain
+
+/obj/item/radio/headset/abductor/New()
+ ..()
+ make_syndie()
+
+/obj/item/radio/headset/abductor/attackby(obj/item/I, mob/user, params)
+ if(isscrewdriver(I))
+ return // Stops humans from disassembling abductor headsets.
+ return ..()
+
/obj/item/scalpel/alien
name = "alien scalpel"
desc = "It's a gleaming sharp knife made out of silvery-green metal."
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
new file mode 100644
index 00000000000..bb39e90cd01
--- /dev/null
+++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
@@ -0,0 +1,62 @@
+/datum/outfit/abductor
+ name = "Abductor Basic"
+ uniform = /obj/item/clothing/under/color/grey //they're greys gettit
+ shoes = /obj/item/clothing/shoes/combat
+ back = /obj/item/storage/backpack
+ l_ear = /obj/item/radio/headset/abductor
+
+/datum/outfit/abductor/proc/get_team_console(team_number)
+ for(var/obj/machinery/abductor/console/C in machines)
+ if(C.team == team_number)
+ return C
+
+/datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number)
+ if(!team_number && isabductor(H))
+ var/datum/species/abductor/S = H.dna.species
+ team_number = S.team
+
+ if(!team_number)
+ team_number = 1
+
+ var/obj/machinery/abductor/console/console = get_team_console(team_number)
+ if(console)
+ var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H
+ if(V)
+ console.vest = V
+ V.flags |= NODROP
+
+ var/obj/item/abductor/gizmo/G = locate() in H.get_item_by_slot(slot_back)
+ if(G)
+ console.gizmo = G
+ G.console = console
+
+/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ ..()
+ if(!visualsOnly)
+ link_to_console(H)
+
+
+/datum/outfit/abductor/agent
+ name = "Abductor Agent"
+ head = /obj/item/clothing/head/helmet/abductor
+ suit = /obj/item/clothing/suit/armor/abductor/vest
+ belt = /obj/item/storage/belt/military/abductor/full
+
+ backpack_contents = list(
+ /obj/item/abductor_baton = 1,
+ /obj/item/gun/energy/alien = 1,
+ /obj/item/abductor/silencer = 1
+ )
+
+/datum/outfit/abductor/scientist
+ name = "Abductor Scientist"
+
+ backpack_contents = list(
+ /obj/item/abductor/gizmo = 1
+ )
+
+/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ ..()
+ if(!visualsOnly)
+ var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H)
+ beamplant.implant(H)
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
index d07381b7cce..d4d791c5b19 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
@@ -15,7 +15,7 @@
return FALSE
var/mob/living/carbon/human/H = user
// You must either: Be of the abductor species, or contain an abductor implant
- if((H.get_species() == "Abductor" || (locate(/obj/item/implant/abductor) in H)))
+ if((isabductor(H) || (locate(/obj/item/implant/abductor) in H)))
return TRUE
return FALSE
@@ -37,7 +37,7 @@
/datum/surgery_step/internal/extract_organ/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/mob/living/carbon/human/AB = target
- if(NO_INTORGANS in AB.species.species_traits)
+ if(NO_INTORGANS in AB.dna.species.species_traits)
user.visible_message("[user] prepares [target]'s [target_zone] for further dissection!", "You prepare [target]'s [target_zone] for further dissection.")
return TRUE
if(IC)
@@ -93,7 +93,7 @@
return FALSE
var/mob/living/carbon/human/H = user
// You must either: Be of the abductor species, or contain an abductor implant
- if((H.get_species() == "Abductor" || (locate(/obj/item/implant/abductor) in H)))
+ if((isabductor(H) || (locate(/obj/item/implant/abductor) in H)))
return TRUE
return FALSE
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index 8e7219e401a..ebc14225cd7 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -108,7 +108,7 @@
/obj/item/organ/internal/heart/gland/pop/activate()
to_chat(owner, "You feel unlike yourself.")
- var/species = pick("Unathi","Skrell","Diona","Tajaran","Vulpkanin","Kidan","Grey","Diona")
+ var/species = pick(/datum/species/unathi, /datum/species/skrell, /datum/species/diona, /datum/species/tajaran, /datum/species/vulpkanin, /datum/species/kidan, /datum/species/grey)
owner.set_species(species)
/obj/item/organ/internal/heart/gland/ventcrawling
@@ -217,8 +217,8 @@
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
var/datum/dna/owner_dna = H.dna
clone.rename_character(clone.name, owner_dna.real_name)
+ clone.set_species(owner_dna.species.type)
clone.dna = owner_dna.Clone()
- clone.set_species(H.species.name)
clone.body_accessory = H.body_accessory
domutcheck(clone)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 219ae4b6e54..cd4f80f2527 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -2,7 +2,6 @@
name = "Human Observation Console"
var/team = 0
networks = list("SS13","Abductor")
- off_action = new /datum/action/innate/camera_off/abductor //specific datum
var/datum/action/innate/teleport_in/tele_in_action = new
var/datum/action/innate/teleport_out/tele_out_action = new
var/datum/action/innate/teleport_self/tele_self_action = new
@@ -25,65 +24,43 @@
eyeobj.icon_state = "camera_target"
/obj/machinery/computer/camera_advanced/abductor/GrantActions(mob/living/carbon/user)
- off_action.target = user
- off_action.Grant(user)
+ ..()
- jump_action.target = user
- jump_action.Grant(user)
- //TODO : add null checks
- tele_in_action.target = console.pad
- tele_in_action.Grant(user)
+ if(tele_in_action)
+ tele_in_action.target = console.pad
+ tele_in_action.Grant(user)
+ actions += tele_in_action
- tele_out_action.target = console
- tele_out_action.Grant(user)
+ if(tele_out_action)
+ tele_out_action.target = console
+ tele_out_action.Grant(user)
+ actions += tele_out_action
- tele_self_action.target = console.pad
- tele_self_action.Grant(user)
+ if(tele_self_action)
+ tele_self_action.target = console.pad
+ tele_self_action.Grant(user)
+ actions += tele_self_action
- vest_mode_action.target = console
- vest_mode_action.Grant(user)
+ if(vest_mode_action)
+ vest_mode_action.target = console
+ vest_mode_action.Grant(user)
+ actions += vest_mode_action
- vest_disguise_action.target = console
- vest_disguise_action.Grant(user)
+ if(vest_disguise_action)
+ vest_disguise_action.target = console
+ vest_disguise_action.Grant(user)
+ actions += vest_disguise_action
- set_droppoint_action.target = console
- set_droppoint_action.Grant(user)
-
-/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H)
- if(H.mind && H.mind.abductor)
- return H.mind.abductor.scientist
+ if(set_droppoint_action)
+ set_droppoint_action.target = console
+ set_droppoint_action.Grant(user)
+ actions += set_droppoint_action
/obj/machinery/computer/camera_advanced/abductor/attack_hand(mob/user)
if(!isabductor(user))
return
return ..()
-/datum/action/innate/camera_off/abductor/Activate()
- if(!target || !iscarbon(target))
- return
- var/mob/living/carbon/C = target
- var/mob/camera/aiEye/remote/remote_eye = C.remote_control
- var/obj/machinery/computer/camera_advanced/abductor/origin = remote_eye.origin
- C.remote_view = 0
- origin.current_user = null
- origin.jump_action.Remove(C)
- origin.tele_in_action.Remove(C)
- origin.tele_out_action.Remove(C)
- origin.tele_self_action.Remove(C)
- origin.vest_mode_action.Remove(C)
- origin.vest_disguise_action.Remove(C)
- origin.set_droppoint_action.Remove(C)
- remote_eye.eye_user = null
- C.reset_perspective(null)
- if(C.client)
- C.client.images -= remote_eye.user_image
- for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
- C.client.images -= chunk.obscured
- C.remote_control = null
- C.unset_machine()
- src.Remove(C)
-
-
/datum/action/innate/teleport_in
name = "Send To"
button_icon_state = "beam_down"
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
index 8682b50fc05..3b339ad7c40 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
@@ -47,9 +47,9 @@
/obj/machinery/abductor/experiment/proc/dissection_icon(mob/living/carbon/human/H)
var/icon/I = icon(H.stand_icon)
- var/icon/splat = icon(H.species.damage_overlays, "30")
- splat.Blend(icon(H.species.damage_mask, "torso"), ICON_MULTIPLY)
- splat.Blend(H.species.blood_color, ICON_MULTIPLY)
+ var/icon/splat = icon(H.dna.species.damage_overlays, "30")
+ splat.Blend(icon(H.dna.species.damage_mask, "torso"), ICON_MULTIPLY)
+ splat.Blend(H.dna.species.blood_color, ICON_MULTIPLY)
I.Blend(splat, ICON_OVERLAY)
return I
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index feffadcf9ab..17afd375952 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -141,15 +141,15 @@ proc/issyndicate(mob/living/M as mob)
return ..()
-/datum/game_mode/proc/create_syndicate(var/datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human
+/datum/game_mode/proc/create_syndicate(datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human
var/mob/living/carbon/human/M = synd_mind.current
- var/obj/item/organ/external/head/head_organ = M.get_organ("head")
- M.set_species("Human",1)
+ M.set_species(/datum/species/human, TRUE)
M.dna.ready_dna(M) // Quadriplegic Nuke Ops won't be participating in the paralympics
M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ops.
M.overeatduration = 0
+ var/obj/item/organ/external/head/head_organ = M.get_organ("head")
var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde
var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue
var/skin_tone = pick(-50, -30, -10, 0, 0, 0, 10) // Caucasian/black
@@ -159,8 +159,8 @@ proc/issyndicate(mob/living/M as mob)
head_organ.sec_hair_colour = hair_c
M.change_eye_color(eye_c)
M.s_tone = skin_tone
- head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
- head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
+ head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.name)
+ head_organ.f_style = random_facial_hair_style(M.gender, head_organ.dna.species.name)
M.body_accessory = null
M.regenerate_icons()
M.update_body()
@@ -253,7 +253,7 @@ proc/issyndicate(mob/living/M as mob)
U.hidden_uplink.uses = 20
synd_mob.equip_to_slot_or_del(U, slot_in_backpack)
- if(synd_mob.species)
+ if(synd_mob.dna.species)
/*
Incase anyone ever gets the burning desire to have nukeops with randomized apperances. -- Dave
@@ -262,7 +262,7 @@ proc/issyndicate(mob/living/M as mob)
A.randomize_appearance_for(synd_mob)
*/
- var/race = synd_mob.species.name
+ var/race = synd_mob.dna.species.name
switch(race)
if("Vox" || "Vox Armalis")
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 07395aa0578..b7364970351 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -281,7 +281,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
for(var/datum/mind/possible_target in ticker.minds)
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && possible_target.current.client)
var/mob/living/carbon/human/H = possible_target.current
- if(!(NO_DNA in H.species.species_traits))
+ if(!(NO_DNA in H.dna.species.species_traits))
possible_targets += possible_target
if(possible_targets.len > 0)
target = pick(possible_targets)
@@ -445,7 +445,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
n_p++
else if(ticker.current_state == GAME_STATE_PLAYING)
for(var/mob/living/carbon/human/P in player_list)
- if(NO_DNA in P.species.species_traits)
+ if(NO_DNA in P.dna.species.species_traits)
continue
if(P.client && !(P.mind in ticker.mode.changelings) && P.mind!=owner)
n_p++
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 1d0bb3adf03..3c1f5d47ed8 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -209,7 +209,7 @@ Made by Xhuis
if(shadow.special_role == SPECIAL_ROLE_SHADOWLING && config.shadowling_max_age)
if(ishuman(shadow.current))
var/mob/living/carbon/human/H = shadow.current
- if(H.get_species() != "Shadow")
+ if(!isshadowling(H))
for(var/obj/effect/proc_holder/spell/targeted/shadowling_hatch/hatch_ability in shadow.spell_list)
hatch_ability.cycles_unused++
if(!H.stunned && prob(20) && hatch_ability.cycles_unused > config.shadowling_max_age)
@@ -317,7 +317,7 @@ Made by Xhuis
blood_color = "#555555"
flesh_color = "#222222"
- species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS) //Can't use guns due to muzzle flash
+ species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS, NO_EXAMINE) //Can't use guns due to muzzle flash
burn_mod = 1.5 //1.5x burn damage, 2x is excessive
oxy_mod = 0
heatmod = 1.5
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 89aee290422..f8f55f0e126 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -2,8 +2,10 @@
/obj/effect/proc_holder/spell/proc/shadowling_check(var/mob/living/carbon/human/H)
if(!H || !istype(H)) return
- if(H.get_species() == "Shadowling" && is_shadow(H)) return 1
- if(H.get_species() == "Lesser Shadowling" && is_thrall(H)) return 1
+ if(isshadowling(H) && is_shadow(H))
+ return 1
+ if(isshadowlinglesser(H) && is_thrall(H))
+ return 1
if(!is_shadow_or_thrall(usr))
to_chat(usr, "You can't wrap your head around how to do this.")
else if(is_thrall(usr))
@@ -267,7 +269,7 @@
listclearnulls(ticker.mode.shadowling_thralls)
if(!(ling.mind in ticker.mode.shadows))
return
- if(ling.get_species() != "Shadowling")
+ if(!isshadowling(ling))
if(ticker.mode.shadowling_thralls.len >= 5)
charge_counter = charge_max
return
@@ -371,7 +373,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(H), slot_glasses)
- H.set_species("Shadowling")
+ H.set_species(/datum/species/shadow/ling)
/obj/effect/proc_holder/spell/targeted/collective_mind //Lets a shadowling bring together their thralls' strength, granting new abilities and a headcount
name = "Collective Hivemind"
@@ -610,7 +612,7 @@
to_chat(user, "[thrallToRevive] must be conscious to become empowered.")
charge_counter = charge_max
return
- if(thrallToRevive.get_species() == "Lesser Shadowling")
+ if(isshadowlinglesser(thrallToRevive))
to_chat(user, "[thrallToRevive] is already empowered.")
charge_counter = charge_max
return
@@ -619,7 +621,7 @@
if(!ishuman(M.current))
return
var/mob/living/carbon/human/H = M.current
- if(H.get_species() == "Lesser Shadowling")
+ if(isshadowlinglesser(H))
empowered_thralls++
if(empowered_thralls >= EMPOWERED_THRALL_LIMIT)
to_chat(user, "You cannot spare this much energy. There are too many empowered thralls.")
@@ -644,7 +646,7 @@
thrallToRevive.visible_message("[thrallToRevive] slowly rises, no longer recognizable as human.", \
"You feel new power flow into you. You have been gifted by your masters. You now closely resemble them. You are empowered in \
darkness but wither slowly in light. In addition, you now have glare and true shadow walk.")
- thrallToRevive.set_species("Lesser Shadowling")
+ thrallToRevive.set_species(/datum/species/shadow/ling/lesser)
thrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk)
thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare(null))
thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk(null))
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
index 4239b5db327..03780f7a47e 100644
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
@@ -91,7 +91,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(user), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(user), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(user), slot_glasses)
- H.set_species("Shadowling") //can't be a shadowling without being a shadowling
+ H.set_species(/datum/species/shadow/ling) //can't be a shadowling without being a shadowling
H.mind.RemoveSpell(src)
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index c9dad5c510d..6d82f6c48e1 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -239,7 +239,7 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
scramble(1, H, 100)
- H.real_name = random_name(H.gender, H.species.name) //Give them a name that makes sense for their species.
+ H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
H.sync_organ_dna(assimilate = 1)
H.update_body(0)
H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 7c1a3526002..2ac4bc0b2f8 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -321,11 +321,11 @@ var/global/list/multiverse = list()
to_chat(M, "You are an alternate version of [user.real_name] from another universe! Help [user.p_them()] accomplish [user.p_their()] goals at all costs.")
M.faction = list("[user.real_name]")
if(duplicate_self)
- M.set_species(user.get_species()) //duplicate the sword user's species.
+ M.set_species(user.dna.species.type) //duplicate the sword user's species.
else
if(prob(50))
- var/list/all_species = list("Human","Unathi","Skrell","Tajaran","Kidan","Golem","Diona","Machine","Slime People","Grey","Vulpkanin")
- M.set_species(pick(all_species))
+ var/list/list_all_species = list(/datum/species/human, /datum/species/unathi, /datum/species/skrell, /datum/species/tajaran, /datum/species/kidan, /datum/species/golem, /datum/species/diona, /datum/species/machine, /datum/species/slime, /datum/species/grey, /datum/species/vulpkanin)
+ M.set_species(pick(list_all_species))
M.real_name = user.real_name //this is clear down here in case the user happens to become a golem; that way they have the proper name.
M.name = user.real_name
if(duplicate_self)
@@ -429,7 +429,7 @@ var/global/list/multiverse = list()
M.equip_to_slot_or_del(sword, slot_r_hand) //Don't duplicate what's equipped to hands, or else duplicate swords could be generated...or weird cases of factionless swords.
else
- if(M.get_species() == "Tajaran" || M.get_species() == "Unathi")
+ if(istajaran(M) || isunathi(M))
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) //If they can't wear shoes, give them a pair of sandals.
var/randomize = pick("mobster","roman","wizard","cyborg","syndicate","assistant", "animu", "cultist", "highlander", "clown", "killer", "pirate", "soviet", "officer", "gladiator")
@@ -461,7 +461,7 @@ var/global/list/multiverse = list()
M.equip_to_slot_or_del(sword, slot_r_hand)
if("cyborg")
- if(M.get_species() != "Machine")
+ if(!ismachine(M))
for(var/obj/item/organ/O in M.bodyparts)
O.robotize(make_tough = 1)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
@@ -584,10 +584,10 @@ var/global/list/multiverse = list()
W.SetOwnerInfo(M)
M.equip_to_slot_or_del(W, slot_wear_id)
- if(M.get_species() == "Vox")
- M.species.after_equip_job(null, M) //Voxygen(tm)
- if(M.get_species() == "Plasmaman")
- M.species.after_equip_job(null, M) //No fireballs from other dimensions.
+ if(isvox(M))
+ M.dna.species.after_equip_job(null, M) //Nitrogen tanks
+ if(isplasmaman(M))
+ M.dna.species.after_equip_job(null, M) //No fireballs from other dimensions.
M.update_icons()
@@ -646,7 +646,7 @@ var/global/list/multiverse = list()
if(heresy)
spawnheresy(M)//oh god why
else
- M.set_species("Skeleton")
+ M.set_species(/datum/species/skeleton)
M.visible_message(" A massive amount of flesh sloughs off [M] and a skeleton rises up!")
M.revive()
equip_skeleton(M)
@@ -713,7 +713,7 @@ var/global/list/multiverse = list()
H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), slot_back)
/obj/item/necromantic_stone/proc/spawnheresy(mob/living/carbon/human/H as mob)
- H.set_species("Human")
+ H.set_species(/datum/species/human)
if(H.gender == MALE)
H.change_gender(FEMALE)
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index b5e798b95c7..18dda0fcbc4 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -141,7 +141,7 @@
wizard_mob.equip_to_slot_or_del(new /obj/item/radio/headset(wizard_mob), slot_l_ear)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(wizard_mob), slot_w_uniform)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(wizard_mob), slot_shoes)
- if(wizard_mob.get_species() != "Plasmaman") //handled in the species file for plasmen on the afterjob equip proc for now
+ if(!isplasmaman(wizard_mob)) //handled in the species file for plasmen on the afterjob equip proc for now
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(wizard_mob), slot_wear_suit)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(wizard_mob), slot_head)
wizard_mob.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(wizard_mob), slot_back)
@@ -153,7 +153,7 @@
wizard_mob.faction = list("wizard")
- wizard_mob.species.after_equip_job(null, wizard_mob)
+ wizard_mob.dna.species.after_equip_job(null, wizard_mob)
to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.")
to_chat(wizard_mob, "The spellbook is bound to you, and others cannot use it.")
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index ffcb288c1c5..418539b5bed 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -74,12 +74,12 @@
if(!H)
return 0
- H.species.before_equip_job(src, H, visualsOnly)
+ H.dna.species.before_equip_job(src, H, visualsOnly)
if(outfit)
H.equipOutfit(outfit, visualsOnly)
- H.species.after_equip_job(src, H, visualsOnly)
+ H.dna.species.after_equip_job(src, H, visualsOnly)
if(!visualsOnly && announce)
announce(H)
@@ -183,7 +183,7 @@
else
permitted = TRUE
- if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
+ if(G.whitelisted && (G.whitelisted != H.dna.species.name || !is_alien_whitelisted(H, G.whitelisted)))
permitted = FALSE
if(!permitted)
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 154a34750cd..5c4c559a8b0 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -244,7 +244,7 @@
if(visualsOnly)
return
- if(H.get_species() == "Machine")
+ if(ismachine(H))
var/obj/item/organ/internal/cyberimp/brain/clown_voice/implant = new
implant.insert(H)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 934e925ce62..44ef4ee26da 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -92,7 +92,7 @@
if(filtering > 0)
if(beaker)
// To prevent runtimes from drawing blood from runtime, and to prevent getting IPC blood.
- if(!istype(occupant) || !occupant.dna || (NO_BLOOD in occupant.species.species_traits))
+ if(!istype(occupant) || !occupant.dna || (NO_BLOOD in occupant.dna.species.species_traits))
filtering = 0
return
@@ -167,10 +167,10 @@
occupantData["maxTemp"] = 1000 // If you get a burning vox armalis into the sleeper, congratulations
// Because we can put simple_animals in here, we need to do something tricky to get things working nice
occupantData["temperatureSuitability"] = 0 // 0 is the baseline
- if(ishuman(occupant) && occupant.species)
+ if(ishuman(occupant) && occupant.dna.species)
// I wanna do something where the bar gets bluer as the temperature gets lower
// For now, I'll just use the standard format for the temperature status
- var/datum/species/sp = occupant.species
+ var/datum/species/sp = occupant.dna.species
if(occupant.bodytemperature < sp.cold_level_3)
occupantData["temperatureSuitability"] = -3
else if(occupant.bodytemperature < sp.cold_level_2)
@@ -197,7 +197,7 @@
crisis = (occupant.health < min_health)
// I'm not sure WHY you'd want to put a simple_animal in a sleeper, but precedent is precedent
// Runtime is aptly named, isn't she?
- if(ishuman(occupant) && !(NO_BLOOD in occupant.species.species_traits))
+ if(ishuman(occupant) && !(NO_BLOOD in occupant.dna.species.species_traits))
occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL)
occupantData["hasBlood"] = 1
occupantData["bloodLevel"] = round(occupant.blood_volume)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 1d70b389a94..2566cc0f410 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -387,7 +387,7 @@
var/bloodData[0]
bloodData["hasBlood"] = 0
- if(ishuman(H) && !(NO_BLOOD in H.species.species_traits))
+ if(ishuman(H) && !(NO_BLOOD in H.dna.species.species_traits))
bloodData["hasBlood"] = 1
bloodData["volume"] = H.blood_volume
bloodData["percent"] = round(((H.blood_volume / BLOOD_VOLUME_NORMAL)*100))
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 881136dbd58..798a01f2bda 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -231,7 +231,7 @@
R.dna = new /datum/dna()
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
- H.set_species(R.dna.species)
+ H.set_species(R.dna.species.type)
occupant = H
if(!R.dna.real_name) //to prevent null names
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 42061760d92..00bd309b21e 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -123,8 +123,8 @@
occupantData["maxTemp"] = 1000 // If you get a burning vox armalis into the sleeper, congratulations
// Because we can put simple_animals in here, we need to do something tricky to get things working nice
occupantData["temperatureSuitability"] = 0 // 0 is the baseline
- if(ishuman(occupant) && occupant.species)
- var/datum/species/sp = occupant.species
+ if(ishuman(occupant) && occupant.dna.species)
+ var/datum/species/sp = occupant.dna.species
if(occupant.bodytemperature < sp.cold_level_3)
occupantData["temperatureSuitability"] = -3
else if(occupant.bodytemperature < sp.cold_level_2)
@@ -147,7 +147,7 @@
occupantData["btCelsius"] = occupant.bodytemperature - T0C
occupantData["btFaren"] = ((occupant.bodytemperature - T0C) * (9.0/5.0))+ 32
- if(ishuman(occupant) && !(NO_BLOOD in occupant.species.species_traits))
+ if(ishuman(occupant) && !(NO_BLOOD in occupant.dna.species.species_traits))
occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL)
occupantData["hasBlood"] = 1
occupantData["bloodLevel"] = round(occupant.blood_volume)
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 00f6a98f2bc..99eaeae3fe6 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -31,6 +31,7 @@
for(var/V in actions)
var/datum/action/A = V
A.Remove(user)
+ actions.Cut()
if(user.client)
user.reset_perspective(null)
eyeobj.RemoveImages()
@@ -52,6 +53,7 @@
if(current_user)
current_user.unset_machine()
QDEL_NULL(eyeobj)
+ QDEL_LIST(actions)
return ..()
/obj/machinery/computer/camera_advanced/on_unset_machine(mob/M)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 95aee7cb9fe..c134747cd41 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -356,15 +356,14 @@
return
if(scan_brain && !can_brainscan())
return
- if((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (NO_SCAN in subject.species.species_traits))
+ if((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (NO_SCAN in subject.dna.species.species_traits))
scantemp = "Error: Unable to locate valid genetic data."
SSnanoui.update_uis(src)
return
if(subject.get_int_organ(/obj/item/organ/internal/brain))
var/obj/item/organ/internal/brain/Brn = subject.get_int_organ(/obj/item/organ/internal/brain)
if(istype(Brn))
- var/datum/species/S = all_species[Brn.dna.species] // stepladder code wooooo
- if(NO_SCAN in S.species_traits)
+ if(NO_SCAN in Brn.dna.species.species_traits)
scantemp = "Error: Subject's brain is incompatible."
SSnanoui.update_uis(src)
return
@@ -402,10 +401,9 @@
var/obj/item/organ/B = subject.get_int_organ(/obj/item/organ/internal/brain)
B.dna.check_integrity()
R.dna=B.dna.Clone()
- var/datum/species/S = all_species[R.dna.species]
- if(NO_SCAN in S.species_traits)
+ if(NO_SCAN in R.dna.species.species_traits)
extra_info = "Proper genetic interface not found, defaulting to genetic data of the body."
- R.dna.species = subject.species.name
+ R.dna.species = new subject.dna.species.type
R.id= copytext(md5(B.dna.real_name), 2, 6)
R.name=B.dna.real_name
else
diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm
index 89974f9b337..52b11da599b 100644
--- a/code/game/machinery/dye_generator.dm
+++ b/code/game/machinery/dye_generator.dm
@@ -98,11 +98,11 @@
var/mob/living/carbon/human/H = M
var/dye_list = list("hair", "alt. hair theme")
- if(H.gender == MALE || H.get_species() == "Vulpkanin")
+ if(H.gender == MALE || isvulpkanin(H))
dye_list += "facial hair"
dye_list += "alt. facial hair theme"
- if(H && (H.species.bodyflags & HAS_SKIN_COLOR))
+ if(H && (H.dna.species.bodyflags & HAS_SKIN_COLOR))
dye_list += "body"
var/what_to_dye = input(user, "Choose an area to apply the dye", "Dye Application") in dye_list
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 8994d1eccbd..aef8de7c306 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -561,7 +561,7 @@ Class Procs:
if(istype(perp.belt, /obj/item/gun) || istype(perp.belt, /obj/item/melee))
threatcount += 2
- if(perp.species.name != "Human") //beepsky so racist.
+ if(!ishumanbasic(perp)) //beepsky so racist.
threatcount += 2
if(check_records || check_arrest)
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index 39f67a72add..3d7f6a52e70 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -90,9 +90,9 @@
if(drownee && (drownee.lying || deep_water)) //Mob lying down or water is deep (determined by controller)
if(drownee.internal)
return //Has internals, no drowning
- if((NO_BREATHE in drownee.species.species_traits) || (BREATHLESS in drownee.mutations))
+ if((NO_BREATHE in drownee.dna.species.species_traits) || (BREATHLESS in drownee.mutations))
return //doesn't breathe, no drowning
- if(drownee.get_species() == "Skrell" || drownee.get_species() == "Neara")
+ if(isskrell(drownee) || isneara(drownee))
return //fish things don't drown
if(drownee.stat == DEAD) //Dead spacemen don't drown more
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index 09385fa3a3e..5e99a954650 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -289,18 +289,18 @@
qdel(I)
H.equipOutfit(selected_outfit)
- H.species.after_equip_job(null, H)
+ H.dna.species.after_equip_job(null, H)
/obj/machinery/transformer/transmogrifier
name = "species transmogrifier"
desc = "As promoted in Calvin & Hobbes!"
- var/target_species = "Human"
+ var/datum/species/target_species = /datum/species/human
/obj/machinery/transformer/transmogrifier/do_transform(mob/living/carbon/human/H)
if(!istype(H))
return
- if(!(target_species in all_species))
+ if(!ispath(target_species))
to_chat(H, "'[target_species]' is not a valid species!")
return
H.set_species(target_species)
@@ -336,7 +336,7 @@
to_chat(H, "No genetic template configured!")
return
var/prev_ue = H.dna.unique_enzymes
- H.set_species(template.species)
+ H.set_species(template.species.type)
H.dna = template.Clone()
H.real_name = template.real_name
H.sync_organ_dna(assimilate = 0, old_ue = prev_ue)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 88c15e687ac..d0af747dc64 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -158,14 +158,14 @@
overlays -= "fab-active"
desc = initial(desc)
- var/obj/item/I = new D.build_path
+ var/obj/item/I = new D.build_path(loc)
if(D.locked)
- var/obj/item/storage/lockbox/large/L = new /obj/item/storage/lockbox/large(get_step(src,SOUTH)) //(Don't use capitals in paths, or single letters.
- I.loc = L
+ var/obj/item/storage/lockbox/large/L = new /obj/item/storage/lockbox/large(get_step(src, SOUTH)) //(Don't use capitals in paths, or single letters.
+ I.forceMove(L)
L.name += " [initial(I.name)]"
L.origin_tech = I.origin_tech
else
- I.loc = get_step(src,SOUTH)
+ I.forceMove(get_step(src, SOUTH))
if(istype(I))
I.materials = res_coef
atom_say("[I] is complete.")
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index a11236df0e5..18506a5c882 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -60,7 +60,7 @@
victim.apply_effect(radiation_amount, IRRADIATE, 0)
if(ishuman(victim))
var/mob/living/carbon/human/V = victim
- if(NO_DNA in V.species.species_traits)
+ if(NO_DNA in V.dna.species.species_traits)
return
randmutb(victim)
domutcheck(victim ,null)
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index c8ab2e1fc4f..32b548c38aa 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -81,7 +81,7 @@
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if((HULK in H.mutations) || (NOGUNS in H.species.species_traits))
+ if((HULK in H.mutations) || (NOGUNS in H.dna.species.species_traits))
user << "Your fingers can't press the button!"
return
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 4bbdaa2f723..4fea8e93a39 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -24,7 +24,7 @@
return
if(ishuman(user))
var/mob/living/carbon/human/abductor/H = user
- if(H && H.mind.abductor)
+ if(isabductor(H))
to_chat(user, "Megaphones can't project psionic communication!")
return
if(ishuman(user))
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index ec8a2a5e325..c28fd68fc62 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -99,7 +99,7 @@
if(!get_location_accessible(H, "mouth"))
to_chat(user, "The mask is in the way.")
return
- if((C.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
+ if((C.dna.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
to_chat(user, "You find yourself disappointed at the appalling lack of facial hair.")
return
if(C.f_style == "Shaved")
@@ -130,13 +130,13 @@
if(!get_location_accessible(H, "head"))
to_chat(user, "The headgear is in the way.")
return
- if((C.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
+ if((C.dna.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
to_chat(user, "You find yourself disappointed at the appalling lack of hair.")
return
if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead")
to_chat(user, "There is not enough hair left to shave...")
return
- if(M.get_species() == "Skrell")
+ if(isskrell(M))
to_chat(user, "Your razor isn't going to cut through tentacles.")
return
if(H == user) //shaving yourself
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 3a8bf12b143..3a7e203101d 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -74,7 +74,7 @@
H = M
spawn(0) //Some mutations have sleeps in them, like monkey
- if(!(NOCLONE in M.mutations) && !(H && (NO_DNA in H.species.species_traits))) // prevents drained people from having their DNA changed
+ if(!(NOCLONE in M.mutations) && !(H && (NO_DNA in H.dna.species.species_traits))) // prevents drained people from having their DNA changed
var/prev_ue = M.dna.unique_enzymes
var/mutflags = 0
// UI in syringe.
@@ -113,7 +113,7 @@
if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure.
var/mob/living/carbon/human/H = M
- if(NO_DNA in H.species.species_traits)
+ if(NO_DNA in H.dna.species.species_traits)
return 0
if(!user.IsAdvancedToolUser())
diff --git a/code/game/objects/items/weapons/dnascrambler.dm b/code/game/objects/items/weapons/dnascrambler.dm
index 2866e8d06ec..fc13fa69f79 100644
--- a/code/game/objects/items/weapons/dnascrambler.dm
+++ b/code/game/objects/items/weapons/dnascrambler.dm
@@ -24,7 +24,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(NO_DNA in H.species.species_traits)
+ if(NO_DNA in H.dna.species.species_traits)
to_chat(user, "You failed to inject [M], as [M.p_they()] [M.p_have()] no DNA to scramble, nor flesh to inject.")
return
@@ -43,7 +43,7 @@
if(istype(target))
var/mob/living/carbon/human/H = target
scramble(1, H, 100)
- H.real_name = random_name(H.gender, H.species.name) //Give them a name that makes sense for their species.
+ H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
H.sync_organ_dna(assimilate = 1)
H.update_body(0)
H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
diff --git a/code/game/objects/items/weapons/implants/implant_abductor.dm b/code/game/objects/items/weapons/implants/implant_abductor.dm
index 0d5bc869e44..3ec571c94a6 100644
--- a/code/game/objects/items/weapons/implants/implant_abductor.dm
+++ b/code/game/objects/items/weapons/implants/implant_abductor.dm
@@ -28,8 +28,9 @@
var/obj/machinery/abductor/console/console
if(ishuman(source))
var/mob/living/carbon/human/H = source
- if(H.get_species() == "Abductor")
- console = get_team_console(H.mind.abductor.team)
+ if(isabductor(H))
+ var/datum/species/abductor/S = H.dna.species
+ console = get_team_console(S.team)
home = console.pad
if(!home)
diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm
index 6ff1fbe95b0..2f53a1200a9 100644
--- a/code/game/objects/items/weapons/scissors.dm
+++ b/code/game/objects/items/weapons/scissors.dm
@@ -33,19 +33,19 @@
var/list/species_facial_hair = list()
var/obj/item/organ/external/head/C = H.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[C.model]
- if(H.gender == MALE || H.get_species() == "Vulpkanin")
- if(C.species)
+ if(H.gender == MALE || isvulpkanin(H))
+ if(C.dna.species)
for(var/i in facial_hair_styles_list)
var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i]
- if(C.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
- if(C.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
+ if(C.dna.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
+ if(C.dna.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(robohead.is_monitor)
to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.")
return
continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_facial_hair += i
else
- if(C.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
+ if(C.dna.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(!robohead.is_monitor)
if("Human" in tmp_facial.species_allowed)
species_facial_hair += i
@@ -57,18 +57,18 @@
var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair
//handle normal hair
var/list/species_hair = list()
- if(C.species)
+ if(C.dna.species)
for(var/i in hair_styles_public_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i]
- if(C.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
- if(C.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
+ if(C.dna.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
+ if(C.dna.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(robohead.is_monitor)
to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.")
return
continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_hair += i
else
- if(C.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
+ if(C.dna.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(!robohead.is_monitor)
if("Human" in tmp_hair.species_allowed)
species_hair += i
diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm
index a6046b575f7..742f5b3d0c0 100644
--- a/code/game/objects/items/weapons/soap.dm
+++ b/code/game/objects/items/weapons/soap.dm
@@ -26,7 +26,7 @@
to_chat(user, "You need to take that [target.name] off before cleaning it.")
else if(target == user && user.a_intent == INTENT_GRAB && ishuman(target))
var/mob/living/carbon/human/muncher = user
- if(muncher && muncher.get_species() == "Drask")
+ if(muncher && isdrask(muncher))
to_chat(user, "You take a bite of the [name]. Delicious!")
playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0)
user.nutrition += 2
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index abe546d25b1..3e7f3eaffe3 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -58,7 +58,7 @@
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.species.is_small)
+ if(H.dna.species.is_small)
to_chat(user, "It's too heavy for you to wield fully.")
return
if(user.get_inactive_hand())
diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm
index 6cbc2e0e972..fcb2fab2d4e 100644
--- a/code/game/objects/items/weapons/whetstone.dm
+++ b/code/game/objects/items/weapons/whetstone.dm
@@ -10,6 +10,7 @@
var/max = 30
var/prefix = "sharpened"
var/requires_sharpness = 1
+ var/claw_damage_increase = 1
/obj/item/whetstone/attackby(obj/item/I, mob/user, params)
@@ -46,16 +47,24 @@
playsound(get_turf(src), usesound, 50, 1)
name = "worn out [name]"
desc = "[desc] At least, it used to."
- used = 1
+ used = TRUE
update_icon()
-/obj/item/whetstone/attack_self(mob/user as mob) //This is just fluff for now. Species datums are global and not newly created instances, so we can't adjust unarmed damage on a per mob basis.
+/obj/item/whetstone/attack_self(mob/user)
+ if(used)
+ to_chat(user, "The whetstone is too worn to use again!")
+ return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/datum/unarmed_attack/attack = H.species.unarmed
+ var/datum/unarmed_attack/attack = H.dna.species.unarmed
if(istype(attack, /datum/unarmed_attack/claws))
- H.visible_message("[H] sharpens [H.p_their()] claws on the [src]!", "You sharpen your claws on the [src].")
+ attack.damage += claw_damage_increase
+ H.visible_message("[H] sharpens [H.p_their()] claws on [src]!", "You sharpen your claws on [src].")
playsound(get_turf(H), usesound, 50, 1)
+ name = "worn out [name]"
+ desc = "[desc] At least, it used to."
+ used = TRUE
+ update_icon()
/obj/item/whetstone/super
name = "super whetstone block"
@@ -64,3 +73,4 @@
max = 200
prefix = "super-sharpened"
requires_sharpness = 0
+ claw_damage_increase = 200
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 348c92a5335..a7233bf6a82 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -23,7 +23,7 @@
var/list/valid_underwear = list()
for(var/underwear in underwear_list)
var/datum/sprite_accessory/S = underwear_list[underwear]
- if(!(H.species.name in S.species_allowed))
+ if(!(H.dna.species.name in S.species_allowed))
continue
valid_underwear[underwear] = underwear_list[underwear]
var/new_underwear = input(user, "Choose your underwear:", "Changing") as null|anything in valid_underwear
@@ -34,7 +34,7 @@
var/list/valid_undershirts = list()
for(var/undershirt in undershirt_list)
var/datum/sprite_accessory/S = undershirt_list[undershirt]
- if(!(H.species.name in S.species_allowed))
+ if(!(H.dna.species.name in S.species_allowed))
continue
valid_undershirts[undershirt] = undershirt_list[undershirt]
var/new_undershirt = input(user, "Choose your undershirt:", "Changing") as null|anything in valid_undershirts
@@ -45,7 +45,7 @@
var/list/valid_sockstyles = list()
for(var/sockstyle in socks_list)
var/datum/sprite_accessory/S = socks_list[sockstyle]
- if(!(H.species.name in S.species_allowed))
+ if(!(H.dna.species.name in S.species_allowed))
continue
valid_sockstyles[sockstyle] = socks_list[sockstyle]
var/new_socks = input(user, "Choose your socks:", "Changing") as null|anything in valid_sockstyles
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
index 8d22732e5dd..3911d366ad6 100644
--- a/code/game/objects/structures/plasticflaps.dm
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -86,7 +86,7 @@
return ..()
if(istype(A, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.species.is_small)
+ if(H.dna.species.is_small)
return ..()
return 0
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index c59dd7bd78f..646adfa2038 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -143,7 +143,7 @@ var/ert_request_answered = 0
else
M.change_gender(FEMALE)
- M.set_species("Human",1)
+ M.set_species(/datum/species/human, TRUE)
M.dna.ready_dna(M)
M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ERT.
M.overeatduration = 0
@@ -158,8 +158,8 @@ var/ert_request_answered = 0
head_organ.sec_hair_colour = hair_c
M.change_eye_color(eye_c)
M.s_tone = skin_tone
- head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
- head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
+ head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.name)
+ head_organ.f_style = random_facial_hair_style(M.gender, head_organ.dna.species.name)
M.rename_character(null, "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]")
M.age = rand(23,35)
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 32d5824c4d5..da843d8e53c 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -37,7 +37,7 @@
// Failing that...
if(!(damagetype & BRUTELOSS) && !(damagetype & FIRELOSS) && !(damagetype & TOXLOSS) && !(damagetype & OXYLOSS))
- if(NO_BREATHE in species.species_traits)
+ if(NO_BREATHE in dna.species.species_traits)
// the ultimate fallback
take_overall_damage(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0), 0)
else
@@ -84,7 +84,7 @@
do_suicide(damagetype, held_item)
return
- to_chat(viewers(src), "[src] [replacetext(pick(species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.")
+ to_chat(viewers(src), "[src] [replacetext(pick(dna.species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.")
do_suicide(0)
updatehealth()
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index abfc807f9df..798185188ff 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -337,7 +337,7 @@
if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/queen/large , null, null, delmob, 1 )
if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob, 1 )
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob, 1 )
- if("human") M.change_mob_type( /mob/living/carbon/human/human , null, null, delmob, 1 )
+ if("human") M.change_mob_type( /mob/living/carbon/human, null, null, delmob, 1 )
if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob, 1 )
if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob, 1 )
if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 )
diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm
index 3d524e863cd..bffaaa9bc9c 100644
--- a/code/modules/admin/verbs/onlyone.dm
+++ b/code/modules/admin/verbs/onlyone.dm
@@ -3,14 +3,14 @@
alert("The game hasn't started yet!")
return
- var/list/incompatible_species = list("Plasmaman", "Vox")
+ var/list/incompatible_species = list(/datum/species/plasmaman, /datum/species/vox)
for(var/mob/living/carbon/human/H in player_list)
if(H.stat == DEAD || !(H.client))
continue
if(is_special_character(H))
continue
- if(H.species.name in incompatible_species)
- H.set_species("Human")
+ if(is_type_in_list(H.dna.species, incompatible_species))
+ H.set_species(/datum/species/human)
var/datum/preferences/A = new() // Randomize appearance
A.copy_to(H)
@@ -49,7 +49,7 @@
W.assignment = "Highlander"
W.registered_name = H.real_name
H.equip_to_slot_or_del(W, slot_wear_id)
- H.species.after_equip_job(null, H)
+ H.dna.species.after_equip_job(null, H)
H.regenerate_icons()
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm
index 12567cec70b..715472128b8 100644
--- a/code/modules/admin/verbs/onlyoneteam.dm
+++ b/code/modules/admin/verbs/onlyoneteam.dm
@@ -3,15 +3,15 @@
alert("The game hasn't started yet!")
return
- var/list/incompatible_species = list("Plasmaman", "Vox")
+ var/list/incompatible_species = list(/datum/species/plasmaman, /datum/species/vox)
var/team_toggle = 0
for(var/mob/living/carbon/human/H in player_list)
if(H.stat == DEAD || !(H.client))
continue
if(is_special_character(H))
continue
- if(H.species.name in incompatible_species)
- H.set_species("Human")
+ if(is_type_in_list(H.dna.species, incompatible_species))
+ H.set_species(/datum/species/human)
var/datum/preferences/A = new() // Randomize appearance
A.copy_to(H)
@@ -55,7 +55,7 @@
H.equip_to_slot_or_del(W, slot_wear_id)
team_toggle = !team_toggle
- H.species.after_equip_job(null, H)
+ H.dna.species.after_equip_job(null, H)
H.regenerate_icons()
message_admins("[key_name_admin(usr)] used DODGEBAWWWWWWWL! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 94e0ea2acce..627cde823fa 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -37,7 +37,7 @@
createCorpse()
/obj/effect/landmark/corpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
- var/mob/living/carbon/human/human/M = new /mob/living/carbon/human/human (src.loc)
+ var/mob/living/carbon/human/M = new /mob/living/carbon/human(src.loc)
M.real_name = src.name
M.death(1) //Kills the new mob
M.adjustOxyLoss(oxy_damage)
@@ -293,6 +293,6 @@
/obj/effect/landmark/corpse/abductor //Connected to ruins, for some reason?
name = "abductor"
mobname = "???"
- mob_species = "abductor"
+ mob_species = /datum/species/abductor
corpseuniform = /obj/item/clothing/under/color/grey
corpseshoes = /obj/item/clothing/shoes/combat
diff --git a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm
index dcf4a48a280..5426516f86b 100644
--- a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm
+++ b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm
@@ -3,8 +3,8 @@
override_under = /obj/item/clothing/under/mafia
chattyness = SNPC_CHANCE_TALK / 4
-/mob/living/carbon/human/interactive/away/hotel/New(loc)
- ..(loc, "Skrell")
+/mob/living/carbon/human/interactive/away/hotel/Initialize(mapload)
+ ..(loc, /datum/species/skrell)
/mob/living/carbon/human/interactive/away/hotel/doSetup()
..()
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index d159ed70eb2..b26bdba7d92 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -82,12 +82,12 @@
user.mutations.Add(XRAY)
if(ishuman(user))
var/mob/living/carbon/human/human = user
- if(human.species.name != "Shadow")
+ if(!isshadowperson(human))
to_chat(user, "Your flesh rapidly mutates!")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
+ human.set_species(/datum/species/shadow)
user.regenerate_icons()
if("Wealth")
to_chat(user, "Your wish is granted, but at a terrible cost...")
@@ -95,12 +95,12 @@
new /obj/structure/closet/syndicate/resources/everything(loc)
if(ishuman(user))
var/mob/living/carbon/human/human = user
- if(human.species.name != "Shadow")
+ if(!isshadowperson(human))
to_chat(user, "Your flesh rapidly mutates!")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
+ human.set_species(/datum/species/shadow)
user.regenerate_icons()
if("Immortality")
to_chat(user, "Your wish is granted, but at a terrible cost...")
@@ -108,12 +108,12 @@
user.verbs += /mob/living/carbon/proc/immortality
if(ishuman(user))
var/mob/living/carbon/human/human = user
- if(human.species.name != "Shadow")
+ if(!isshadowperson(human))
to_chat(user, "Your flesh rapidly mutates!")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
+ human.set_species(/datum/species/shadow)
user.regenerate_icons()
if("To Kill")
to_chat(user, "Your wish is granted, but at a terrible cost...")
@@ -130,12 +130,12 @@
obj_count++
if(ishuman(user))
var/mob/living/carbon/human/human = user
- if(human.species.name != "Shadow")
+ if(!isshadowperson(human))
to_chat(user, "Your flesh rapidly mutates!")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
+ human.set_species(/datum/species/shadow)
user.regenerate_icons()
if("Peace")
to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.")
diff --git a/code/modules/awaymissions/snpc.dm b/code/modules/awaymissions/snpc.dm
index 0b0de76ead3..8dc2b1b31e9 100644
--- a/code/modules/awaymissions/snpc.dm
+++ b/code/modules/awaymissions/snpc.dm
@@ -4,7 +4,7 @@
var/squad_member = 0 // was spawned by squad
var/home_z
-/mob/living/carbon/human/interactive/away/New()
+/mob/living/carbon/human/interactive/away/Initialize(mapload)
..()
TRAITS |= TRAIT_ROBUST
faction += "away"
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index 0582b92be67..8edec3a7b29 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -2084,7 +2084,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
/datum/preferences/proc/copy_to(mob/living/carbon/human/character)
var/datum/species/S = all_species[species]
- character.change_species(species) // Yell at me if this causes everything to melt
+ character.change_species(S.type) // Yell at me if this causes everything to melt
if(be_random_name)
real_name = random_name(gender,species)
@@ -2170,10 +2170,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.undershirt = undershirt
character.socks = socks
- if(character.species.bodyflags & HAS_HEAD_ACCESSORY)
+ if(character.dna.species.bodyflags & HAS_HEAD_ACCESSORY)
H.headacc_colour = hacc_colour
H.ha_style = ha_style
- if(character.species.bodyflags & HAS_MARKINGS)
+ if(character.dna.species.bodyflags & HAS_MARKINGS)
character.m_colours = m_colours
character.m_styles = m_styles
@@ -2183,14 +2183,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.backbag = backbag
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
- if(S.has_gender && (character.gender in list(PLURAL, NEUTER)))
+ if(character.dna.species.has_gender && (character.gender in list(PLURAL, NEUTER)))
if(isliving(src)) //Ghosts get neuter by default
message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
character.change_gender(MALE)
character.change_eye_color(e_colour)
- if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.species.species_traits))
+ if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.dna.species.species_traits))
character.dna.SetSEState(FATBLOCK,1,1)
character.overeatduration = 600
@@ -2233,7 +2233,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
- S.handle_dna(character)
+ character.dna.species.handle_dna(character)
if(character.dna.dirtySE)
character.dna.UpdateSE()
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 060e53df5b7..a5b4e614551 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -49,12 +49,12 @@
if("exclude" in species_restricted)
exclusive = 1
- if(H.species)
+ if(H.dna.species)
if(exclusive)
- if(!(H.species.name in species_restricted))
+ if(!(H.dna.species.name in species_restricted))
wearable = 1
else
- if(H.species.name in species_restricted)
+ if(H.dna.species.name in species_restricted)
wearable = 1
if(!wearable)
@@ -504,7 +504,7 @@ BLIND // can't see anything
/obj/item/clothing/suit/equipped(var/mob/living/carbon/human/user, var/slot) //Handle tail-hiding on a by-species basis.
..()
if(ishuman(user) && hide_tail_by_species && slot == slot_wear_suit)
- if(user.species.name in hide_tail_by_species)
+ if(user.dna.species.name in hide_tail_by_species)
if(!(flags_inv & HIDETAIL)) //Hide the tail if the user's species is in the hide_tail_by_species list and the tail isn't already hidden.
flags_inv |= HIDETAIL
else
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 8ee357b1ffb..1e874772478 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -16,7 +16,7 @@
/obj/item/clothing/head/helmet/space/capspace/equipped(mob/living/carbon/human/user, slot)
if(ishuman(user) && slot == slot_head)
- if(user.species.name == "Vox")
+ if(isvox(user))
if(flags & BLOCKHAIR)
flags &= ~BLOCKHAIR
else
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index eab5aa0c5bb..c65ea335c4d 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -609,8 +609,8 @@
var/species_icon = 'icons/mob/rig_back.dmi'
// Since setting mob_icon will override the species checks in
// update_inv_wear_suit(), handle species checks here.
- if(wearer && sprite_sheets && sprite_sheets[wearer.get_species()])
- species_icon = sprite_sheets[wearer.get_species()]
+ if(wearer && sprite_sheets && sprite_sheets[wearer.dna.species.name])
+ species_icon = sprite_sheets[wearer.dna.species.name]
mob_icon = image("icon" = species_icon, "icon_state" = "[icon_state]")
if(installed_modules.len)
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index aac34032dfb..764ee71583a 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -136,7 +136,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.species.species_traits)))
+ if((H && M.pulse) || (L && !(BREATHLESS in M.mutations) && !(NO_BREATHE in M.dna.species.species_traits)))
var/color = "notice"
if(H)
var/heart_sound
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index ce3e9df0655..2a734e91dcd 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -45,7 +45,7 @@
var/mob/living/carbon/human/target = M
- if(istype(target.species, /datum/species/machine))
+ if(ismachine(target))
to_chat(user, "[target] has no skin, how do you expect to tattoo [target.p_them()]?")
return
@@ -54,7 +54,7 @@
return
var/datum/sprite_accessory/body_markings/tattoo/temp_tatt = marking_styles_list[tattoo_icon]
- if(!(target.species.name in temp_tatt.species_allowed))
+ if(!(target.dna.species.name in temp_tatt.species_allowed))
to_chat(user, "You can't think of a way to make the [tattoo_name] design work on [target == user ? "your" : "[target]'s"] body type.")
return
@@ -268,7 +268,7 @@
return
var/mob/living/carbon/human/target = user
- if(!istype(target) || target.get_species() != "Tajaran") // Only catbeasts, kthnx.
+ if(!istype(target) || !istajaran(target)) // Only catbeasts, kthnx.
return
if(target.change_body_accessory("Jay Wingler Tail"))
@@ -1276,7 +1276,7 @@
/obj/item/fluff/zekemirror/attack_self(mob/user)
var/mob/living/carbon/human/target = user
- if(!istype(target) || target.get_species() != "Skrell") // It'd be strange to see other races with head tendrils.
+ if(!istype(target) || !isskrell(target)) // It'd be strange to see other races with head tendrils.
return
if(target.change_hair("Zekes Tentacles", 1))
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index cf2e3621498..87836f217b8 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -18,7 +18,7 @@
continue
if(!H.client)
continue
- if(VIRUSIMMUNE in H.species.species_traits) //don't let virus immune things get diseases they're not supposed to get.
+ if(VIRUSIMMUNE in H.dna.species.species_traits) //don't let virus immune things get diseases they're not supposed to get.
continue
var/turf/T = get_turf(H)
if(!T)
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index cc59ec78128..321a8135150 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -4,7 +4,7 @@
/datum/event/mass_hallucination/start()
for(var/mob/living/carbon/human/H in living_mob_list)
var/armor = H.getarmor(type = "rad")
- if((RADIMMUNE in H.species.species_traits) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected
+ if((RADIMMUNE in H.dna.species.species_traits) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected
continue
H.AdjustHallucinate(rand(50, 100))
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 3a730c3868d..64b856628ab 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -1252,7 +1252,7 @@
icon_state = "monkeycube"
bitesize = 12
filling_color = "#ADAC7F"
- var/monkey_type = "Monkey"
+ var/datum/species/monkey_type = /datum/species/monkey
list_reagents = list("nutriment" = 2)
/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
@@ -1279,19 +1279,19 @@
/obj/item/reagent_containers/food/snacks/monkeycube/farwacube
name = "farwa cube"
- monkey_type = "Farwa"
+ monkey_type = /datum/species/monkey/tajaran
/obj/item/reagent_containers/food/snacks/monkeycube/wolpincube
name = "wolpin cube"
- monkey_type = "Wolpin"
+ monkey_type = /datum/species/monkey/vulpkanin
/obj/item/reagent_containers/food/snacks/monkeycube/stokcube
name = "stok cube"
- monkey_type = "Stok"
+ monkey_type = /datum/species/monkey/unathi
/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube
name = "neaera cube"
- monkey_type = "Neara"
+ monkey_type = /datum/species/monkey/skrell
/obj/item/reagent_containers/food/snacks/spellburger
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index a67b88f97d4..1e3c5602a22 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -122,7 +122,7 @@
to_chat(user, "The [src] is locked and running, wait for it to finish.")
return
- if(!ishuman(victim) || issmall(victim))
+ if(!ishuman(victim))
to_chat(user, "This is not suitable for the [src]!")
return
@@ -255,8 +255,11 @@
if(occupant.reagents)
occupant.reagents.trans_to(new_meat, round(occupant.reagents.total_volume/slab_count,1))
- if(occupant.get_species() == "Human")
- new /obj/item/stack/sheet/animalhide/human(src)
+ if(ishuman(occupant))
+ var/mob/living/carbon/human/H = occupant
+ var/skinned = H.dna.species.skinned_type
+ if(skinned)
+ new skinned(src)
new /obj/effect/decal/cleanable/blood/gibs(src)
if(!UserOverride)
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 950b873af55..7acd3efc961 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -23,7 +23,7 @@
return 1
/mob/living/carbon/human/bee_friendly()
- if(get_species() == "Diona") //bees pollinate plants, duh.
+ if(isdiona(src)) //bees pollinate plants, duh.
return 1
if((wear_suit && (wear_suit.flags & THICKMATERIAL)) && (head && (head.flags & THICKMATERIAL)))
return 1
diff --git a/code/modules/martial_arts/brawling.dm b/code/modules/martial_arts/brawling.dm
index a40a52b86be..b326e9f8b33 100644
--- a/code/modules/martial_arts/brawling.dm
+++ b/code/modules/martial_arts/brawling.dm
@@ -15,7 +15,7 @@
var/atk_verb = pick("left hook","right hook","straight punch")
- var/damage = rand(5, 8) + A.species.punchdamagelow
+ var/damage = rand(5, 8) + A.dna.species.punchdamagelow
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
D.visible_message("[A] has attempted to hit [D] with a [atk_verb]!")
diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm
index f42b7963104..bff0cf0d2e4 100644
--- a/code/modules/martial_arts/martial.dm
+++ b/code/modules/martial_arts/martial.dm
@@ -33,8 +33,8 @@
/datum/martial_art/proc/basic_hit(var/mob/living/carbon/human/A,var/mob/living/carbon/human/D)
- var/damage = rand(A.species.punchdamagelow, A.species.punchdamagehigh)
- var/datum/unarmed_attack/attack = A.species.unarmed
+ var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
+ var/datum/unarmed_attack/attack = A.dna.species.unarmed
var/atk_verb = "[pick(attack.attack_verb)]"
if(D.lying)
@@ -62,7 +62,7 @@
add_attack_logs(A, D, "Melee attacked with martial-art [src]", (damage > 0) ? null : ATKLOG_ALL)
- if((D.stat != DEAD) && damage >= A.species.punchstunthreshold)
+ if((D.stat != DEAD) && damage >= A.dna.species.punchstunthreshold)
D.visible_message("[A] has weakened [D]!!", \
"[A] has weakened [D]!")
D.apply_effect(4, WEAKEN, armor_block)
diff --git a/code/modules/martial_arts/mimejutsu.dm b/code/modules/martial_arts/mimejutsu.dm
index 38605c3538d..e8aa7a53d03 100644
--- a/code/modules/martial_arts/mimejutsu.dm
+++ b/code/modules/martial_arts/mimejutsu.dm
@@ -23,7 +23,7 @@
/datum/martial_art/mimejutsu/proc/mimeChuck(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
- var/damage = rand(5, 8) + A.species.punchdamagelow
+ var/damage = rand(5, 8) + A.dna.species.punchdamagelow
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
D.visible_message("[A] swings invisible nunchcuks at [D]..and misses?")
diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
index ff0db975895..d88ec709dce 100644
--- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm
+++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
@@ -116,7 +116,7 @@
switch(random)
if(1)
to_chat(user, "Your flesh begins to melt! Miraculously, you seem fine otherwise.")
- H.set_species("Skeleton")
+ H.set_species(/datum/species/skeleton)
if(2)
to_chat(user, "Power courses through you! You can now shift your form at will.")
if(user.mind)
diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm
index ddf1255cca0..59d3a715f32 100644
--- a/code/modules/mining/lavaland/loot/colossus_loot.dm
+++ b/code/modules/mining/lavaland/loot/colossus_loot.dm
@@ -289,7 +289,7 @@
if(ishuman(i))
var/mob/living/carbon/human/H = i
if(H.stat == DEAD)
- H.set_species("Shadow")
+ H.set_species(/datum/species/shadow)
H.revive()
H.disabilities |= NOCLONE //Free revives, but significantly limits your options for reviving except via the crystal
H.grab_ghost(force = TRUE)
diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm
index e1c6c7f28a9..a80c2ae6c18 100644
--- a/code/modules/mining/lavaland/loot/tendril_loot.dm
+++ b/code/modules/mining/lavaland/loot/tendril_loot.dm
@@ -105,13 +105,13 @@
to_chat(M, "This item is currently non-functional.")
/*if(ishuman(M) && M.stat != DEAD)
var/mob/living/carbon/human/H = M
- if(H.species.name != "Human" || reac_volume < 5) // implying xenohumans are holy
+ if(!ishumanbasic(H) || reac_volume < 5) // implying xenohumans are holy
if(method == INGEST && show_message)
to_chat(H, "You feel nothing but a terrible aftertaste.")
return ..()
to_chat(H, "A terrible pain travels down your back as wings burst out!")
- H.set_species("Angel")
+ H.set_species(/datum/species/angel)
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1, -1)
H.adjustBruteLoss(20)
H.emote("scream")
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 93bdfe30c27..1a6f29a6dd0 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -226,7 +226,14 @@
"SKRE","AHK","EHK","RAWK","KRA","AAA","EEE","KI","II","KRI","KA")
/datum/language/vox/get_random_name()
- return ..(FEMALE,1,6)
+ var/sounds = rand(2, 8)
+ var/i = 0
+ var/newname = ""
+
+ while(i <= sounds)
+ i++
+ newname += pick(vox_name_syllables)
+ return capitalize(newname)
/datum/language/diona
name = "Rootspeak"
@@ -240,8 +247,8 @@
syllables = list("hs","zt","kr","st","sh")
/datum/language/diona/get_random_name()
- var/new_name = "[pick(list("To Sleep Beneath","Wind Over","Embrace of","Dreams of","Witnessing","To Walk Beneath","Approaching the"))]"
- new_name += " [pick(list("the Void","the Sky","Encroaching Night","Planetsong","Starsong","the Wandering Star","the Empty Day","Daybreak","Nightfall","the Rain"))]"
+ var/new_name = "[pick(list("To Sleep Beneath", "Wind Over", "Embrace of", "Dreams of", "Witnessing", "To Walk Beneath", "Approaching the", "Glimmer of", "The Ripple of", "Colors of", "The Still of", "Silence of", "Gentle Breeze of", "Glistening Waters under", "Child of", "Blessed Plant-ling of", "Grass-Walker of", "Element of", "Spawn of"))]"
+ new_name += " [pick(list("the Void", "the Sky", "Encroaching Night", "Planetsong", "Starsong", "the Wandering Star", "the Empty Day", "Daybreak", "Nightfall", "the Rain", "the Stars", "the Waves", "Dusk", "Night", "the Wind", "the Summer Wind", "the Blazing Sun", "the Scorching Sun", "Eternal Fields", "the Soothing Plains", "the Undying Fiona", "Mother Nature's Bousum"))]"
return new_name
/datum/language/trinary
@@ -507,8 +514,10 @@
..(speaker,message,speaker.real_name)
/datum/language/abductor/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker)
- if(other.mind && other.mind.abductor)
- if(other.mind.abductor.team == speaker.mind.abductor.team)
+ if(isabductor(other) && isabductor(speaker))
+ var/datum/species/abductor/A = speaker.dna.species
+ var/datum/species/abductor/A2 = other.dna.species
+ if(A.team == A2.team)
return TRUE
return FALSE
@@ -553,7 +562,7 @@
if(!message)
return
-
+
log_say("(ROBOT) [message]", speaker)
var/message_start = "[name], [speaker.name]"
var/message_body = "[speaker.say_quote(message)],\"[message]\""
diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm
index da19b6a35b2..df1bde34306 100644
--- a/code/modules/mob/living/autohiss.dm
+++ b/code/modules/mob/living/autohiss.dm
@@ -4,7 +4,7 @@
/mob/living/carbon/human/handle_autohiss(message, datum/language/L)
if(!client || client.prefs.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off
return message
- return species.handle_autohiss(message, L, client.prefs.autohiss_mode)
+ return dna.species.handle_autohiss(message, L, client.prefs.autohiss_mode)
/client/verb/toggle_autohiss()
set name = "Toggle Auto-Accent"
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index e3069f4d5d3..9d50d8bf2ea 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -121,10 +121,10 @@
brainmob.dna = H.dna.Clone()
brainmob.container = src
- if(!istype(H.species) || isnull(H.species.return_organ("brain"))) // Diona/buggy people
+ if(!istype(H.dna.species) || isnull(H.dna.species.return_organ("brain"))) // Diona/buggy people
held_brain = new(src)
else // We have a species, and it has a brain
- var/brain_path = H.species.return_organ("brain")
+ var/brain_path = H.dna.species.return_organ("brain")
if(!ispath(brain_path, /obj/item/organ/internal/brain))
brain_path = /obj/item/organ/internal/brain
held_brain = new brain_path(src) // Slime people will keep their slimy brains this way
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 82e062246b6..c64318d804b 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -84,12 +84,12 @@ I'm using this for Stat to give it a more nifty interface to work with
if(container)
var/obj/item/mmi/M = container
if(istype(M) && M.held_brain)
- return M.held_brain.dna.get_species_name()
+ return M.held_brain.dna.species.name
else
return "Artificial Life"
if(istype(loc, /obj/item/organ/internal/brain))
var/obj/item/organ/internal/brain/B = loc
- return B.dna.get_species_name()
+ return B.dna.species.name
/mob/living/carbon/brain/Stat()
..()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 604dfc36f32..4b00bf832c8 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -382,7 +382,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(!ventcrawler)
if(ishuman(src))
var/mob/living/carbon/human/H = src
- ventcrawlerlocal = H.species.ventcrawler
+ ventcrawlerlocal = H.dna.species.ventcrawler
if(!ventcrawlerlocal) return
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 152262b69ea..3f79b90628d 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -3,20 +3,20 @@
AC.flags = flags
AC.ui_interact(user, state = state)
-/mob/living/carbon/human/proc/change_species(var/new_species)
- if(!new_species || species == new_species || !(new_species in all_species))
- return
+/mob/living/carbon/human/proc/change_species(datum/species/new_species)
+ if(!new_species || dna.species.type == new_species || !ispath(new_species, /datum/species))
+ return FALSE
- set_species(new_species, null, 1)
+ set_species(new_species, null, TRUE)
reset_hair()
- if(species.bodyflags & HAS_MARKINGS)
+ if(dna.species.bodyflags & HAS_MARKINGS)
reset_markings()
- return 1
+ return TRUE
/mob/living/carbon/human/proc/change_gender(var/new_gender, var/update_dna = 1)
var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
- if(gender == new_gender || (gender == PLURAL && species.has_gender))
+ if(gender == new_gender || (gender == PLURAL && dna.species.has_gender))
return
gender = new_gender
@@ -129,7 +129,7 @@
/mob/living/carbon/human/proc/change_alt_head(var/alternate_head)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!H || H.alt_head == alternate_head || H.is_robotic() || (!(species.bodyflags & HAS_ALT_HEADS) && alternate_head != "None") || !(alternate_head in alt_heads_list))
+ if(!H || H.alt_head == alternate_head || H.is_robotic() || (!(dna.species.bodyflags & HAS_ALT_HEADS) && alternate_head != "None") || !(alternate_head in alt_heads_list))
return
H.alt_head = alternate_head
@@ -296,7 +296,7 @@
/mob/living/carbon/human/proc/change_skin_color(var/colour = "#000000")
- if(colour == skin_colour || !(species.bodyflags & HAS_SKIN_COLOR))
+ if(colour == skin_colour || !(dna.species.bodyflags & HAS_SKIN_COLOR))
return
skin_colour = colour
@@ -306,7 +306,7 @@
return 1
/mob/living/carbon/human/proc/change_skin_tone(var/tone)
- if(s_tone == tone || !((species.bodyflags & HAS_SKIN_TONE) || (species.bodyflags & HAS_ICON_SKIN_TONE)))
+ if(s_tone == tone || !((dna.species.bodyflags & HAS_SKIN_TONE) || (dna.species.bodyflags & HAS_ICON_SKIN_TONE)))
return
s_tone = tone
@@ -350,16 +350,16 @@
continue
if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
continue
- if(H.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head...
+ if(H.dna.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
- if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ if((H.dna.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_hairstyles += hairstyle //Give them their hairstyles if they do.
else
if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
valid_hairstyles += hairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(H.species.name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ if(H.dna.species.name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
valid_hairstyles += hairstyle
return valid_hairstyles
@@ -378,17 +378,17 @@
continue
if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
continue
- if(H.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head...
+ if(H.dna.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(H.species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
- if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ if(H.dna.species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
+ if((H.dna.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
else
if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
valid_facial_hairstyles += facialhairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(H.species.name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ if(H.dna.species.name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
valid_facial_hairstyles += facialhairstyle
return valid_facial_hairstyles
@@ -402,7 +402,7 @@
for(var/head_accessory in head_accessory_styles_list)
var/datum/sprite_accessory/S = head_accessory_styles_list[head_accessory]
- if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the head accessory style allows, skip it. Otherwise, add it to the list.
+ if(!(H.dna.species.name in S.species_allowed)) //If the user's head is not of a species the head accessory style allows, skip it. Otherwise, add it to the list.
continue
valid_head_accessories += head_accessory
@@ -421,7 +421,7 @@
continue
if(S.marking_location != location) //If the marking isn't for the location we desire, skip.
continue
- if(!(species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list.
+ if(!(dna.species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list.
continue
if(location == "tail")
if(!body_accessory)
@@ -432,7 +432,7 @@
continue
if(location == "head")
var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name]
- if(H.species.bodyflags & ALL_RPARTS)//If the user is a species that can have a robotic head...
+ if(H.dna.species.bodyflags & ALL_RPARTS) //If the user is a species that can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
continue
@@ -456,7 +456,7 @@
if(!istype(A))
valid_body_accessories["None"] = "None" //The only null entry should be the "None" option.
continue
- if(species.name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
+ if(dna.species.name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
valid_body_accessories += B
return valid_body_accessories
@@ -469,7 +469,7 @@
valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option, and there should always be a "None" option.
for(var/alternate_head in alt_heads_list)
var/datum/sprite_accessory/alt_heads/head = alt_heads_list[alternate_head]
- if(!(H.species.name in head.species_allowed))
+ if(!(H.dna.species.name in head.species_allowed))
continue
valid_alt_heads += alternate_head
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 37749c0dd76..bdca496d256 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -62,7 +62,7 @@
animation.master = src
flick("dust-h", animation)
- new species.remains_type(get_turf(src))
+ new dna.species.remains_type(get_turf(src))
spawn(15)
if(animation) qdel(animation)
@@ -103,8 +103,8 @@
set_heartattack(FALSE)
//Handle species-specific deaths.
- if(species)
- species.handle_death(src)
+ if(dna.species)
+ dna.species.handle_death(src)
callHook("death", list(src, gibbed))
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index be46cc9fa7d..c1eb8641820 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -29,34 +29,42 @@
switch(act)
//Cooldown-inducing emotes
if("ping", "pings", "buzz", "buzzes", "beep", "beeps", "yes", "no", "buzz2")
- if(species.name == "Machine") //Only Machines can beep, ping, and buzz, yes, no, and make a silly sad trombone noise.
+ var/found_machine_head = FALSE
+ if(ismachine(src)) //Only Machines can beep, ping, and buzz, yes, no, and make a silly sad trombone noise.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
- else //Everyone else fails, skip the emote attempt
- return
+ found_machine_head = TRUE
+ else
+ var/obj/item/organ/external/head/H = get_organ("head") // If you have a robotic head, you can make beep-boop noises
+ if(H && H.is_robotic())
+ on_CD = handle_emote_CD()
+ found_machine_head = TRUE
+
+ if(!found_machine_head) //Everyone else fails, skip the emote attempt
+ return //Everyone else fails, skip the emote attempt
if("drone","drones","hum","hums","rumble","rumbles")
- if(get_species() == "Drask") //Only Drask can make whale noises
+ if(isdrask(src)) //Only Drask can make whale noises
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
else
return
if("howl", "howls")
- if(get_species() == "Vulpkanin") //Only Vulpkanin can howl
+ if(isvulpkanin(src)) //Only Vulpkanin can howl
on_CD = handle_emote_CD(100)
else
return
if("growl", "growls")
- if(get_species() == "Vulpkanin") //Only Vulpkanin can growl
+ if(isvulpkanin(src)) //Only Vulpkanin can growl
on_CD = handle_emote_CD()
else
return
if("squish", "squishes")
var/found_slime_bodypart = 0
- if(get_species() == "Slime People") //Only Slime People can squish
+ if(isslimeperson(src)) //Only Slime People can squish
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
found_slime_bodypart = 1
else
for(var/obj/item/organ/external/L in bodyparts) // if your limbs are squishy you can squish too!
- if(L.dna.species in list("Slime People"))
+ if(istype(L.dna.species, /datum/species/slime))
on_CD = handle_emote_CD()
found_slime_bodypart = 1
break
@@ -65,31 +73,31 @@
return
if("clack", "clacks")
- if(get_species() == "Kidan") //Only Kidan can clack and rightfully so.
+ if(iskidan(src)) //Only Kidan can clack and rightfully so.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("click", "clicks")
- if(get_species() == "Kidan") //Only Kidan can click and rightfully so.
+ if(iskidan(src)) //Only Kidan can click and rightfully so.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("creaks", "creak")
- if(get_species() == "Diona") //Only Dionas can Creaks.
+ if(isdiona(src)) //Only Dionas can Creaks.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("hiss", "hisses")
- if(get_species() == "Unathi") //Only Unathi can hiss.
+ if(isunathi(src)) //Only Unathi can hiss.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("quill", "quills")
- if(get_species() == "Vox") //Only Vox can rustle their quills.
+ if(isvox(src)) //Only Vox can rustle their quills.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
@@ -225,7 +233,7 @@
message = "[src] starts wagging [p_their()] tail."
start_tail_wagging(1)
- else if(species.bodyflags & TAIL_WAGGING)
+ else if(dna.species.bodyflags & TAIL_WAGGING)
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
message = "[src] starts wagging [p_their()] tail."
start_tail_wagging(1)
@@ -236,7 +244,7 @@
m_type = 1
if("swag", "swags")
- if(species.bodyflags & TAIL_WAGGING || body_accessory)
+ if(dna.species.bodyflags & TAIL_WAGGING || body_accessory)
message = "[src] stops wagging [p_their()] tail."
stop_tail_wagging(1)
else
@@ -431,11 +439,11 @@
message = "[src] coughs!"
m_type = 2
if(gender == FEMALE)
- if(species.female_cough_sounds)
- playsound(src, pick(species.female_cough_sounds), 120)
+ if(dna.species.female_cough_sounds)
+ playsound(src, pick(dna.species.female_cough_sounds), 120)
else
- if(species.male_cough_sounds)
- playsound(src, pick(species.male_cough_sounds), 120)
+ if(dna.species.male_cough_sounds)
+ playsound(src, pick(dna.species.male_cough_sounds), 120)
else
message = "[src] makes a strong noise."
m_type = 2
@@ -479,7 +487,7 @@
m_type = 2
if("deathgasp", "deathgasps")
- message = "[src] [replacetext(species.death_message, "their", p_their())]"
+ message = "[src] [replacetext(dna.species.death_message, "their", p_their())]"
m_type = 1
if("giggle", "giggles")
@@ -676,9 +684,9 @@
if(!muzzled)
message = "[src] sneezes."
if(gender == FEMALE)
- playsound(src, species.female_sneeze_sound, 70)
+ playsound(src, dna.species.female_sneeze_sound, 70)
else
- playsound(src, species.male_sneeze_sound, 70)
+ playsound(src, dna.species.male_sneeze_sound, 70)
m_type = 2
else
message = "[src] makes a strange noise."
@@ -784,12 +792,12 @@
m_type = 1
else
if(!muzzled)
- message = "[src] [species.scream_verb][M ? " at [M]" : ""]!"
+ message = "[src] [dna.species.scream_verb][M ? " at [M]" : ""]!"
m_type = 2
if(gender == FEMALE)
- playsound(loc, "[species.female_scream_sound]", 80, 1, frequency = get_age_pitch())
+ playsound(loc, "[dna.species.female_scream_sound]", 80, 1, frequency = get_age_pitch())
else
- playsound(loc, "[species.male_scream_sound]", 80, 1, frequency = get_age_pitch()) //default to male screams if no gender is present.
+ playsound(loc, "[dna.species.male_scream_sound]", 80, 1, frequency = get_age_pitch()) //default to male screams if no gender is present.
else
message = "[src] makes a very loud noise[M ? " at [M]" : ""]."
@@ -890,9 +898,7 @@
+ " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \
+ " wag(s), wave(s), whimper(s), wink(s), yawn(s), quill(s)"
- switch(species.name)
- if("Machine")
- emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob, buzz2-(none)/mob"
+ switch(dna.species.name)
if("Drask")
emotelist += "\nDrask specific emotes :- drone(s)-(none)/mob, hum(s)-(none)/mob, rumble(s)-(none)/mob"
if("Kidan")
@@ -906,11 +912,18 @@
if("Diona")
emotelist += "\nDiona specific emotes :- creak(s)"
- if (species.name == "Slime People")
+ if(ismachine(src))
+ emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob, buzz2-(none)/mob"
+ else
+ var/obj/item/organ/external/head/H = get_organ("head") // If you have a robotic head, you can make beep-boop noises
+ if(H && H.is_robotic())
+ emotelist += "\nRobotic head specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob, buzz2-(none)/mob"
+
+ if(isslimeperson(src))
emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob"
else
for(var/obj/item/organ/external/L in bodyparts) // if your limbs are squishy you can squish too!
- if(L.dna.species in list("Slime People"))
+ if(istype(L.dna.species, /datum/species/slime))
emotelist += "\nSlime people body part specific emotes :- squish(es)-(none)/mob"
break
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index e382796cd09..a39d2843501 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -29,14 +29,12 @@
msg += "[bicon(icon(icon, dir=SOUTH))] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
msg += "[name]"
- var/list/nospecies = list("Abductor", "Shadowling", "Neara", "Monkey", "Stok", "Farwa", "Wolpin") //species that won't show their race no matter what
-
- var/displayed_species = get_species()
+ var/displayed_species = dna.species.name
for(var/obj/item/clothing/C in src) //Disguise checks
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 || (displayed_species in nospecies)) //either obscured or on the nospecies list
+ if(skipjumpsuit && skipface || (NO_EXAMINE in dna.species.species_traits)) //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 slime person!\n"
@@ -199,9 +197,9 @@
var/list/wound_flavor_text = list()
var/list/is_destroyed = list()
- for(var/organ_tag in species.has_limbs)
+ for(var/organ_tag in dna.species.has_limbs)
- var/list/organ_data = species.has_limbs[organ_tag]
+ var/list/organ_data = dna.species.has_limbs[organ_tag]
var/organ_descriptor = organ_data["descriptor"]
is_destroyed["[organ_data["descriptor"]]"] = 1
@@ -324,7 +322,7 @@
var/dodebug = auto.doing2string(auto.doing)
var/interestdebug = auto.interest2string(auto.interest)
msg += "[p_they(TRUE)] [p_are()] appears to be [interestdebug] and [dodebug].\n"
- else if(species.show_ssd)
+ else if(dna.species.show_ssd)
if(!key)
msg += "[p_they(TRUE)] [p_are()] totally catatonic. The stresses of life in deep-space must have been too much for [p_them()]. Any recovery is unlikely.\n"
else if(!client)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index dbc788cd0bb..1cf1a8bb942 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -4,10 +4,6 @@
voice_name = "unknown"
icon = 'icons/mob/human.dmi'
icon_state = "body_m_s"
-
- //why are these here and not in human_defines.dm
- //var/list/hud_list[10]
- var/datum/species/species //Contains icon generation and language information, set during New().
var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
/mob/living/carbon/human/New(loc)
@@ -15,21 +11,17 @@
log_runtime(EXCEPTION("human/New called with more than 1 argument (REPORT THIS ENTIRE RUNTIME TO A CODER)"))
. = ..()
-/mob/living/carbon/human/Initialize(mapload, new_species = null)
+/mob/living/carbon/human/Initialize(mapload, datum/species/new_species = /datum/species/human)
if(!dna)
dna = new /datum/dna(null)
// Species name is handled by set_species()
- if(!species)
- if(new_species)
- set_species(new_species, 1, delay_icon_update = 1)
- else
- set_species(delay_icon_update = 1)
+ set_species(new_species, 1, delay_icon_update = 1, skip_same_check = TRUE)
..()
- if(species)
- real_name = species.get_random_name(gender)
+ if(dna.species)
+ real_name = dna.species.get_random_name(gender)
name = real_name
if(mind)
mind.name = real_name
@@ -74,49 +66,46 @@
status_flags = GODMODE|CANPUSH
/mob/living/carbon/human/skrell/Initialize(mapload)
- ..(mapload, "Skrell")
+ ..(mapload, /datum/species/skrell)
/mob/living/carbon/human/tajaran/Initialize(mapload)
- ..(mapload, "Tajaran")
+ ..(mapload, /datum/species/tajaran)
/mob/living/carbon/human/vulpkanin/Initialize(mapload)
- ..(mapload, "Vulpkanin")
+ ..(mapload, /datum/species/vulpkanin)
/mob/living/carbon/human/unathi/Initialize(mapload)
- ..(mapload, "Unathi")
+ ..(mapload, /datum/species/unathi)
/mob/living/carbon/human/vox/Initialize(mapload)
- ..(mapload, "Vox")
+ ..(mapload, /datum/species/vox)
/mob/living/carbon/human/voxarmalis/Initialize(mapload)
- ..(mapload, "Vox Armalis")
+ ..(mapload, /datum/species/vox/armalis)
/mob/living/carbon/human/skeleton/Initialize(mapload)
- ..(mapload, "Skeleton")
+ ..(mapload, /datum/species/skeleton)
/mob/living/carbon/human/kidan/Initialize(mapload)
- ..(mapload, "Kidan")
+ ..(mapload, /datum/species/kidan)
/mob/living/carbon/human/plasma/Initialize(mapload)
- ..(mapload, "Plasmaman")
+ ..(mapload, /datum/species/plasmaman)
/mob/living/carbon/human/slime/Initialize(mapload)
- ..(mapload, "Slime People")
+ ..(mapload, /datum/species/slime)
/mob/living/carbon/human/grey/Initialize(mapload)
- ..(mapload, "Grey")
+ ..(mapload, /datum/species/grey)
/mob/living/carbon/human/abductor/Initialize(mapload)
- ..(mapload, "Abductor")
-
-/mob/living/carbon/human/human/Initialize(mapload)
- ..(mapload, "Human")
+ ..(mapload, /datum/species/abductor)
/mob/living/carbon/human/diona/Initialize(mapload)
- ..(mapload, "Diona")
+ ..(mapload, /datum/species/diona)
/mob/living/carbon/human/machine/Initialize(mapload)
- ..(mapload, "Machine")
+ ..(mapload, /datum/species/machine)
/mob/living/carbon/human/machine/created
name = "Integrated Robotic Chassis"
@@ -131,36 +120,38 @@
qdel(E)
for(var/obj/item/organ/O in internal_organs)
qdel(O)
+ regenerate_icons()
+ death()
/mob/living/carbon/human/shadow/Initialize(mapload)
- ..(mapload, "Shadow")
+ ..(mapload, /datum/species/shadow)
/mob/living/carbon/human/golem/Initialize(mapload)
- ..(mapload, "Golem")
+ ..(mapload, /datum/species/golem)
/mob/living/carbon/human/wryn/Initialize(mapload)
- ..(mapload, "Wryn")
+ ..(mapload, /datum/species/wryn)
/mob/living/carbon/human/nucleation/Initialize(mapload)
- ..(mapload, "Nucleation")
+ ..(mapload, /datum/species/nucleation)
/mob/living/carbon/human/drask/Initialize(mapload)
- ..(mapload, "Drask")
+ ..(mapload, /datum/species/drask)
/mob/living/carbon/human/monkey/Initialize(mapload)
- ..(mapload, "Monkey")
+ ..(mapload, /datum/species/monkey)
/mob/living/carbon/human/farwa/Initialize(mapload)
- ..(mapload, "Farwa")
+ ..(mapload, /datum/species/monkey/tajaran)
/mob/living/carbon/human/wolpin/Initialize(mapload)
- ..(mapload, "Wolpin")
+ ..(mapload, /datum/species/monkey/vulpkanin)
/mob/living/carbon/human/neara/Initialize(mapload)
- ..(mapload, "Neara")
+ ..(mapload, /datum/species/monkey/skrell)
/mob/living/carbon/human/stok/Initialize(mapload)
- ..(mapload, "Stok")
+ ..(mapload, /datum/species/monkey/unathi)
/mob/living/carbon/human/Stat()
..()
@@ -564,7 +555,7 @@
grant_death_vision()
return
- species.update_sight(src)
+ dna.species.update_sight(src)
//Removed the horrible safety parameter. It was only being used by ninja code anyways.
//Now checks siemens_coefficient of the affected area by default
@@ -594,8 +585,8 @@
if(gloves)
var/obj/item/clothing/gloves/G = gloves
gloves_siemens_coeff = G.siemens_coefficient
- if(species)
- species_siemens_coeff = species.siemens_coeff
+ if(dna.species)
+ species_siemens_coeff = dna.species.siemens_coeff
siemens_coeff = gloves_siemens_coeff * species_siemens_coeff
if(undergoing_cardiac_arrest())
if(shock_damage * siemens_coeff >= 1 && prob(25))
@@ -1046,14 +1037,6 @@
/mob/living/carbon/human/proc/check_dna()
dna.check_integrity(src)
- return
-
-/mob/living/carbon/human/get_species()
-
- if(!species)
- set_species()
-
- return species.name
/mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone)
@@ -1154,9 +1137,9 @@
//Replacing lost limbs with the species default.
var/mob/living/carbon/human/temp_holder
- for(var/limb_type in H.species.has_limbs)
+ for(var/limb_type in H.dna.species.has_limbs)
if(!(limb_type in H.bodyparts_by_name))
- var/list/organ_data = H.species.has_limbs[limb_type]
+ var/list/organ_data = H.dna.species.has_limbs[limb_type]
var/limb_path = organ_data["path"]
var/obj/item/organ/external/O = new limb_path(temp_holder)
if(H.get_limb_by_name(O.name)) //Check to see if the user already has an limb with the same name as the 'missing limb'. If they do, skip regrowth.
@@ -1169,8 +1152,8 @@
//Replacing lost organs with the species default.
temp_holder = new /mob/living/carbon/human()
- for(var/index in H.species.has_organ)
- var/organ = H.species.has_organ[index]
+ for(var/index in H.dna.species.has_organ)
+ var/organ = H.dna.species.has_organ[index]
if(!(organ in types_of_int_organs)) //If the mob is missing this particular organ...
var/obj/item/organ/internal/I = new organ(temp_holder) //Create the organ inside our holder so we can check it before implantation.
if(H.get_organ_slot(I.slot)) //Check to see if the user already has an organ in the slot the 'missing organ' belongs to. If they do, skip implantation.
@@ -1187,7 +1170,7 @@
surgeries.Cut() //End all surgeries.
update_revive()
- if(species.name != "Skeleton" && (SKELETON in mutations))
+ if(!isskeleton(src) && (SKELETON in mutations))
mutations.Remove(SKELETON)
if(NOCLONE in mutations)
mutations.Remove(NOCLONE)
@@ -1250,7 +1233,7 @@
..()
/mob/living/carbon/human/generate_name()
- name = species.makeName(gender,src)
+ name = dna.species.get_random_name(gender)
real_name = name
if(dna)
dna.real_name = name
@@ -1289,88 +1272,90 @@
else
to_chat(usr, "[self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].")
-/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0)
- var/datum/species/oldspecies = species
- var/datum/species/NS = all_species[new_species]
- if(!dna)
- if(!new_species)
- new_species = "Human"
- else
- if(!new_species)
- new_species = dna.species
- else
- dna.species = new_species
-
- if(species)
- if(species.name && species.name == new_species)
+/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE)
+ if(!skip_same_check)
+ if(dna.species.name == initial(new_species.name))
return
-
- if(species.language)
- remove_language(species.language)
-
- if(species.default_language)
- remove_language(species.default_language)
-
- if(gender == PLURAL && NS.has_gender)
- change_gender(pick(MALE,FEMALE))
- species.handle_pre_change(src)
-
- species = all_species[new_species]
+ var/datum/species/oldspecies = dna.species
if(oldspecies)
+ if(oldspecies.language)
+ remove_language(oldspecies.language)
+
+ if(oldspecies.default_language)
+ remove_language(oldspecies.default_language)
+
+ if(gender == PLURAL && oldspecies.has_gender)
+ change_gender(pick(MALE, FEMALE))
+
if(oldspecies.default_genes.len)
- oldspecies.handle_dna(src,1) // Remove any genes that belong to the old species
+ oldspecies.handle_dna(src, TRUE) // Remove any genes that belong to the old species
- tail = species.tail
+ oldspecies.handle_pre_change(src)
- maxHealth = species.total_health
+ dna.species = new new_species()
- if(species.language)
- add_language(species.language)
+ tail = dna.species.tail
- if(species.default_language)
- add_language(species.default_language)
+ maxHealth = dna.species.total_health
- hunger_drain = species.hunger_drain
- digestion_ratio = species.digestion_ratio
+ if(dna.species.language)
+ add_language(dna.species.language)
- if(species.base_color && default_colour)
+ if(dna.species.default_language)
+ add_language(dna.species.default_language)
+
+ hunger_drain = dna.species.hunger_drain
+ digestion_ratio = dna.species.digestion_ratio
+
+ if(dna.species.base_color && default_colour)
//Apply colour.
- skin_colour = species.base_color
+ skin_colour = dna.species.base_color
else
skin_colour = "#000000"
- if(!(species.bodyflags & HAS_SKIN_TONE))
+ if(!(dna.species.bodyflags & HAS_SKIN_TONE))
s_tone = 0
- species.create_organs(src)
+ var/list/thing_to_check = list(slot_wear_mask, slot_head, slot_shoes, slot_gloves, slot_l_ear, slot_r_ear, slot_glasses, slot_l_hand, slot_r_hand)
+ var/list/kept_items[0]
+
+ for(var/thing in thing_to_check)
+ var/obj/item/I = get_item_by_slot(thing)
+ if(I)
+ kept_items[I] = thing
+
+ dna.species.create_organs(src)
+
+ for(var/thing in kept_items)
+ equip_to_slot_or_del(thing, kept_items[thing])
//Handle default hair/head accessories for created mobs.
var/obj/item/organ/external/head/H = get_organ("head")
- if(species.default_hair)
- H.h_style = species.default_hair
+ if(dna.species.default_hair)
+ H.h_style = dna.species.default_hair
else
H.h_style = "Bald"
- if(species.default_fhair)
- H.f_style = species.default_fhair
+ if(dna.species.default_fhair)
+ H.f_style = dna.species.default_fhair
else
H.f_style = "Shaved"
- if(species.default_headacc)
- H.ha_style = species.default_headacc
+ if(dna.species.default_headacc)
+ H.ha_style = dna.species.default_headacc
else
H.ha_style = "None"
- if(species.default_hair_colour)
+ if(dna.species.default_hair_colour)
//Apply colour.
- H.hair_colour = species.default_hair_colour
+ H.hair_colour = dna.species.default_hair_colour
else
H.hair_colour = "#000000"
- if(species.default_fhair_colour)
- H.facial_colour = species.default_fhair_colour
+ if(dna.species.default_fhair_colour)
+ H.facial_colour = dna.species.default_fhair_colour
else
H.facial_colour = "#000000"
- if(species.default_headacc_colour)
- H.headacc_colour = species.default_headacc_colour
+ if(dna.species.default_headacc_colour)
+ H.headacc_colour = dna.species.default_headacc_colour
else
H.headacc_colour = "#000000"
@@ -1378,43 +1363,39 @@
m_colours = DEFAULT_MARKING_COLOURS //Defaults colour to #00000 for all markings.
body_accessory = null
- if(!dna)
- dna = new /datum/dna(null)
- dna.species = species.name
- dna.real_name = real_name
+ dna.real_name = real_name
- species.handle_post_spawn(src)
+ dna.species.handle_post_spawn(src)
- see_in_dark = species.get_resultant_darksight(src)
+ see_in_dark = dna.species.get_resultant_darksight(src)
if(see_in_dark > 2)
see_invisible = SEE_INVISIBLE_LEVEL_ONE
else
see_invisible = SEE_INVISIBLE_LIVING
- species.handle_dna(src) //Give them whatever special dna business they got.
+ dna.species.handle_dna(src) //Give them whatever special dna business they got.
update_client_colour(0)
- spawn(0)
- overlays.Cut()
- update_mutantrace(1)
- regenerate_icons()
-
if(!delay_icon_update)
UpdateAppearance()
- if(species)
- return 1
+ overlays.Cut()
+ update_mutantrace(1)
+ regenerate_icons()
+
+ if(dna.species)
+ return TRUE
else
- return 0
+ return FALSE
/mob/living/carbon/human/get_default_language()
if(default_language)
return default_language
- if(!species)
+ if(!dna.species)
return null
- return species.default_language ? all_languages[species.default_language] : null
+ return dna.species.default_language ? all_languages[dna.species.default_language] : null
/mob/living/carbon/human/proc/bloody_doodle()
set category = "IC"
@@ -1481,7 +1462,7 @@
to_chat(src, "Where's your head at? Can't change your monitor/display without one.")
return
- if(species.bodyflags & ALL_RPARTS) //If they can have a fully cybernetic body...
+ if(dna.species.bodyflags & ALL_RPARTS) //If they can have a fully cybernetic body...
var/datum/robolimb/robohead = all_robolimbs[head_organ.model]
if(!head_organ)
return
@@ -1497,7 +1478,7 @@
var/list/hair = list()
for(var/i in hair_styles_public_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i]
- if((head_organ.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
+ if((head_organ.dna.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
@@ -1585,8 +1566,8 @@
/mob/living/carbon/human/proc/get_eyecon()
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
var/obj/item/organ/internal/cyberimp/eyes/eye_implant = get_int_organ(/obj/item/organ/internal/cyberimp/eyes)
- if(istype(species) && species.eyes)
- var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes)
+ if(istype(dna.species) && dna.species.eyes)
+ var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', dna.species.eyes)
if(eye_implant) //Eye implants override native DNA eye colo(u)r
eyes_icon = eye_implant.generate_icon()
else if(eyes)
@@ -1792,7 +1773,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
/mob/living/carbon/human/IsAdvancedToolUser()
- if(species.has_fine_manipulation)
+ if(dna.species.has_fine_manipulation)
return 1
return 0
@@ -1827,7 +1808,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
return 1
/mob/living/carbon/human/can_eat(flags = 255)
- return species && (species.dietflags & flags)
+ return dna.species && (dna.species.dietflags & flags)
/mob/living/carbon/human/selfFeed(var/obj/item/reagent_containers/food/toEat, fullness)
if(!check_has_mouth())
@@ -1837,14 +1818,14 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
/mob/living/carbon/human/forceFed(var/obj/item/reagent_containers/food/toEat, mob/user, fullness)
if(!check_has_mouth())
- if(!((istype(toEat, /obj/item/reagent_containers/food/drinks) && (get_species() == "Machine"))))
+ if(!((istype(toEat, /obj/item/reagent_containers/food/drinks) && (ismachine(src)))))
to_chat(user, "Where do you intend to put \the [toEat]? \The [src] doesn't have a mouth!")
return 0
return ..()
/mob/living/carbon/human/selfDrink(var/obj/item/reagent_containers/food/drinks/toDrink)
if(!check_has_mouth())
- if(!get_species() == "Machine")
+ if(!ismachine(src))
to_chat(src, "Where do you intend to put \the [src]? You don't have a mouth!")
return 0
else
@@ -1888,7 +1869,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
. |= A.GetAccess()
/mob/living/carbon/human/is_mechanical()
- return ..() || (species.bodyflags & ALL_RPARTS) != 0
+ return ..() || (dna.species.bodyflags & ALL_RPARTS) != 0
/mob/living/carbon/human/can_use_guns(var/obj/item/gun/G)
. = ..()
@@ -1897,7 +1878,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
if(HULK in mutations)
to_chat(src, "Your meaty finger is much too large for the trigger guard!")
return 0
- if(NOGUNS in species.species_traits)
+ if(NOGUNS in dna.species.species_traits)
to_chat(src, "Your fingers don't fit in the trigger guard!")
return 0
@@ -1964,7 +1945,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
dna.deserialize(data["dna"])
real_name = dna.real_name
name = real_name
- set_species(dna.species)
+ set_species(dna.species.type, skip_same_check = TRUE)
age = data["age"]
undershirt = data["ushirt"]
underwear = data["uwear"]
@@ -2026,8 +2007,8 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
. += "---"
/mob/living/carbon/human/get_taste_sensitivity()
- if(species)
- return species.taste_sensitivity
+ if(dna.species)
+ return dna.species.taste_sensitivity
else
return 1
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index c2c16382995..80c128ee07f 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -17,7 +17,7 @@
//TODO: fix husking
if(((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD)
ChangeToHusk()
- if(species.can_revive_by_healing)
+ if(dna.species.can_revive_by_healing)
var/obj/item/organ/internal/brain/B = get_int_organ(/obj/item/organ/internal/brain)
if(B)
if((health >= (config.health_threshold_dead + config.health_threshold_crit) * 0.5) && stat == DEAD && getBrainLoss()<120)
@@ -32,11 +32,11 @@
if(status_flags & GODMODE)
return 0 //godmode
- if(species && species.has_organ["brain"])
+ if(dna.species && dna.species.has_organ["brain"])
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
- if(species)
- amount = amount * species.brain_mod
+ if(dna.species)
+ amount = amount * dna.species.brain_mod
sponge.receive_damage(amount, 1)
brainloss = sponge.damage
else
@@ -48,11 +48,11 @@
if(status_flags & GODMODE)
return 0 //godmode
- if(species && species.has_organ["brain"])
+ if(dna.species && dna.species.has_organ["brain"])
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
- if(species)
- amount = amount * species.brain_mod
+ if(dna.species)
+ amount = amount * dna.species.brain_mod
sponge.damage = min(max(amount, 0), (maxHealth*2))
brainloss = sponge.damage
else
@@ -64,7 +64,7 @@
if(status_flags & GODMODE)
return 0 //godmode
- if(species && species.has_organ["brain"])
+ if(dna.species && dna.species.has_organ["brain"])
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
brainloss = min(sponge.damage,maxHealth*2)
@@ -89,24 +89,24 @@
/mob/living/carbon/human/adjustBruteLoss(amount, damage_source)
- if(species)
- amount = amount * species.brute_mod
+ if(dna.species)
+ amount = amount * dna.species.brute_mod
if(amount > 0)
take_overall_damage(amount, 0, used_weapon = damage_source)
else
heal_overall_damage(-amount, 0)
/mob/living/carbon/human/adjustFireLoss(amount, damage_source)
- if(species)
- amount = amount * species.burn_mod
+ if(dna.species)
+ amount = amount * dna.species.burn_mod
if(amount > 0)
take_overall_damage(0, amount, used_weapon = damage_source)
else
heal_overall_damage(0, -amount)
/mob/living/carbon/human/proc/adjustBruteLossByPart(amount, organ_name, obj/damage_source = null)
- if(species)
- amount = amount * species.brute_mod
+ if(dna.species)
+ amount = amount * dna.species.brute_mod
if(organ_name in bodyparts_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
@@ -119,8 +119,8 @@
/mob/living/carbon/human/proc/adjustFireLossByPart(amount, organ_name, obj/damage_source = null)
- if(species)
- amount = amount * species.burn_mod
+ if(dna.species)
+ amount = amount * dna.species.burn_mod
if(organ_name in bodyparts_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
@@ -139,8 +139,8 @@
..()
/mob/living/carbon/human/adjustCloneLoss(amount)
- if(species)
- amount = amount * species.clone_mod
+ if(dna.species)
+ amount = amount * dna.species.clone_mod
..()
var/heal_prob = max(0, 80 - getCloneLoss())
@@ -179,23 +179,23 @@
// Defined here solely to take species flags into account without having to recast at mob/living level.
/mob/living/carbon/human/adjustOxyLoss(amount)
- if(species)
- amount = amount * species.oxy_mod
+ if(dna.species)
+ amount = amount * dna.species.oxy_mod
..()
/mob/living/carbon/human/setOxyLoss(amount)
- if(species)
- amount = amount * species.oxy_mod
+ if(dna.species)
+ amount = amount * dna.species.oxy_mod
..()
/mob/living/carbon/human/adjustToxLoss(amount)
- if(species)
- amount = amount * species.tox_mod
+ if(dna.species)
+ amount = amount * dna.species.tox_mod
..()
/mob/living/carbon/human/setToxLoss(amount)
- if(species)
- amount = amount * species.tox_mod
+ if(dna.species)
+ amount = amount * dna.species.tox_mod
..()
////////////////////////////////////////////
@@ -352,8 +352,8 @@ This function restores all organs.
switch(damagetype)
if(BRUTE)
damageoverlaytemp = 20
- if(species)
- damage = damage * species.brute_mod
+ if(dna.species)
+ damage = damage * dna.species.brute_mod
if(organ.receive_damage(damage, 0, sharp, used_weapon))
UpdateDamageIcon()
@@ -376,8 +376,8 @@ This function restores all organs.
if(BURN)
damageoverlaytemp = 20
- if(species)
- damage = damage * species.burn_mod
+ if(dna.species)
+ damage = damage * dna.species.burn_mod
if(organ.receive_damage(0, damage, sharp, used_weapon))
UpdateDamageIcon()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 2991e0a7111..6c2bb844155 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -354,7 +354,7 @@ emp_act
if(check_shields(user, 15, "the [hulk_verb]ing"))
return
..(user, TRUE)
- playsound(loc, user.species.unarmed.attack_sound, 25, 1, -1)
+ playsound(loc, user.dna.species.unarmed.attack_sound, 25, 1, -1)
var/message = "[user] has [hulk_verb]ed [src]!"
visible_message("[message]", "[message]")
adjustBruteLoss(15)
@@ -365,7 +365,7 @@ emp_act
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- species.spec_attack_hand(H, src)
+ dna.species.spec_attack_hand(H, src)
/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L)
if(..()) //successful larva bite.
@@ -494,7 +494,7 @@ emp_act
/mob/living/carbon/human/water_act(volume, temperature, source)
..()
- species.water_act(src,volume,temperature,source)
+ dna.species.water_act(src,volume,temperature,source)
/mob/living/carbon/human/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES))
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index a835133f4d0..71a5f0396a1 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -2,7 +2,7 @@
. = 0
. += ..()
. += config.human_delay
- . += species.movement_delay(src)
+ . += dna.species.movement_delay(src)
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0)
@@ -39,12 +39,12 @@
if(!lying && !buckled && !throwing)
for(var/obj/item/organ/external/splinted in splinted_limbs)
splinted.update_splints()
-
+
if(!has_gravity(loc))
return
-
+
var/obj/item/clothing/shoes/S = shoes
-
+
//Bloody footprints
var/turf/T = get_turf(src)
var/obj/item/organ/external/l_foot = get_organ("l_foot")
@@ -119,7 +119,7 @@
if(step_count % 3) //this basically says, every three moves make a noise
return 0 //1st - none, 1%3==1, 2nd - none, 2%3==2, 3rd - noise, 3%3==0
- if(species.silent_steps)
+ if(dna.species.silent_steps)
return 0 //species is silent
playsound(T, S, volume, 1, range)
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 3f478e65d40..5dcae16b87a 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -62,7 +62,7 @@
// standing is poor
if(stance_damage >= 8)
if(!(lying || resting))
- if(!(NO_PAIN in species.species_traits))
+ if(!(NO_PAIN in dna.species.species_traits))
emote("scream")
custom_emote(1, "collapses!")
Weaken(5) //can't emote while weakened, apparently.
@@ -90,7 +90,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 species.species_traits) ? "" : emote_scream ]drops what [p_they()] [p_were()] holding in [p_their()] [E.name]!")
+ custom_emote(1, "[(NO_PAIN in dna.species.species_traits) ? "" : emote_scream ]drops what [p_they()] [p_were()] holding in [p_their()] [E.name]!")
else if(E.is_malfunctioning())
diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm
index a93fd9e8635..fe50206aedc 100644
--- a/code/modules/mob/living/carbon/human/interactive/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm
@@ -128,7 +128,7 @@
//this is here because this has no client/prefs/brain whatever.
age = rand(AGE_MIN, AGE_MAX)
change_gender(pick("male", "female"))
- rename_character(real_name, species.get_random_name(gender))
+ rename_character(real_name, dna.species.get_random_name(gender))
//job handling
myjob = new default_job()
job = myjob.title
@@ -208,9 +208,9 @@
var/datum/dna/toDoppel = chosen.dna
T.real_name = toDoppel.real_name
- T.set_species(chosen.species.name)
- T.body_accessory = chosen.body_accessory
+ T.set_species(chosen.dna.species.type)
T.dna = toDoppel.Clone()
+ T.body_accessory = chosen.body_accessory
T.UpdateAppearance()
domutcheck(T)
@@ -403,7 +403,7 @@
if(!hud_used)
hud_used = new /datum/hud/human(src)
-/mob/living/carbon/human/interactive/New(var/new_loc, var/new_species = null)
+/mob/living/carbon/human/interactive/Initialize(mapload)
..()
snpc_list += src
diff --git a/code/modules/mob/living/carbon/human/interactive/prefabs.dm b/code/modules/mob/living/carbon/human/interactive/prefabs.dm
index 6553bb26b70..85824145019 100644
--- a/code/modules/mob/living/carbon/human/interactive/prefabs.dm
+++ b/code/modules/mob/living/carbon/human/interactive/prefabs.dm
@@ -1,10 +1,10 @@
-/mob/living/carbon/human/interactive/angry/New()
+/mob/living/carbon/human/interactive/angry/Initialize(mapload)
TRAITS |= TRAIT_ROBUST
TRAITS |= TRAIT_MEAN
faction += "bot_angry"
..()
-/mob/living/carbon/human/interactive/friendly/New()
+/mob/living/carbon/human/interactive/friendly/Initialize(mapload)
TRAITS |= TRAIT_FRIENDLY
TRAITS |= TRAIT_UNROBUST
faction += "bot_friendly"
@@ -12,7 +12,7 @@
functions -= "combat"
..()
-/mob/living/carbon/human/interactive/greytide/New()
+/mob/living/carbon/human/interactive/greytide/Initialize(mapload)
TRAITS |= TRAIT_ROBUST
TRAITS |= TRAIT_MEAN
TRAITS |= TRAIT_THIEVING
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 882501c49f2..50848851646 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -419,7 +419,7 @@
..(what, who, where, silent = is_silent)
/mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0)
- switch(species.handle_can_equip(I, slot, disable_warning, src))
+ switch(dna.species.handle_can_equip(I, slot, disable_warning, src))
if(1) return 1
if(2) return 0 //if it returns 2, it wants no normal handling
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 2e9e9b88656..d577a02e2c4 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -15,10 +15,10 @@
handle_heartbeat()
handle_heartattack()
handle_drunk()
- species.handle_life(src)
+ dna.species.handle_life(src)
if(!client)
- species.handle_npc(src)
+ dna.species.handle_npc(src)
if(stat != DEAD)
//Stuff jammed in your limbs hurts
@@ -178,7 +178,7 @@
if(gene_stability < GENETIC_DAMAGE_STAGE_3)
gib()
- if(!(RADIMMUNE in species.species_traits))
+ if(!(RADIMMUNE in dna.species.species_traits))
if(radiation)
radiation = Clamp(radiation, 0, 200)
@@ -238,7 +238,7 @@
chest.add_autopsy_data("Radiation Poisoning", autopsy_damage)
/mob/living/carbon/human/breathe()
- if(!species.breathe(src))
+ if(!dna.species.breathe(src))
..()
/mob/living/carbon/human/check_breath(datum/gas_mixture/breath)
@@ -253,8 +253,8 @@
failed_last_breath = TRUE
- if(species)
- var/datum/species/S = species
+ if(dna.species)
+ var/datum/species/S = dna.species
if(S.breathid == "o2")
throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
@@ -332,39 +332,39 @@
bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX)
// +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt.
- if(bodytemperature > species.heat_level_1)
+ if(bodytemperature > dna.species.heat_level_1)
//Body temperature is too hot.
if(status_flags & GODMODE) return 1 //godmode
- var/mult = species.heatmod
+ var/mult = dna.species.heatmod
- if(bodytemperature >= species.heat_level_1 && bodytemperature <= species.heat_level_2)
+ if(bodytemperature >= dna.species.heat_level_1 && bodytemperature <= dna.species.heat_level_2)
throw_alert("temp", /obj/screen/alert/hot, 1)
take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_1, used_weapon = "High Body Temperature")
- if(bodytemperature > species.heat_level_2 && bodytemperature <= species.heat_level_3)
+ if(bodytemperature > dna.species.heat_level_2 && bodytemperature <= dna.species.heat_level_3)
throw_alert("temp", /obj/screen/alert/hot, 2)
take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_2, used_weapon = "High Body Temperature")
- if(bodytemperature > species.heat_level_3 && bodytemperature < INFINITY)
+ if(bodytemperature > dna.species.heat_level_3 && bodytemperature < INFINITY)
throw_alert("temp", /obj/screen/alert/hot, 3)
if(on_fire)
take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_3, used_weapon = "Fire")
else
take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_2, used_weapon = "High Body Temperature")
- else if(bodytemperature < species.cold_level_1)
+ else if(bodytemperature < dna.species.cold_level_1)
if(status_flags & GODMODE)
return 1
if(stat == DEAD)
return 1
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
- var/mult = species.coldmod
- if(bodytemperature >= species.cold_level_2 && bodytemperature <= species.cold_level_1)
+ var/mult = dna.species.coldmod
+ if(bodytemperature >= dna.species.cold_level_2 && bodytemperature <= dna.species.cold_level_1)
throw_alert("temp", /obj/screen/alert/cold, 1)
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_1, used_weapon = "Low Body Temperature")
- if(bodytemperature >= species.cold_level_3 && bodytemperature < species.cold_level_2)
+ if(bodytemperature >= dna.species.cold_level_3 && bodytemperature < dna.species.cold_level_2)
throw_alert("temp", /obj/screen/alert/cold, 2)
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_2, used_weapon = "Low Body Temperature")
- if(bodytemperature > -INFINITY && bodytemperature < species.cold_level_3)
+ if(bodytemperature > -INFINITY && bodytemperature < dna.species.cold_level_3)
throw_alert("temp", /obj/screen/alert/cold, 3)
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_3, used_weapon = "Low Body Temperature")
else
@@ -379,18 +379,18 @@
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
if(status_flags & GODMODE) return 1 //godmode
- if(adjusted_pressure >= species.hazard_high_pressure)
+ if(adjusted_pressure >= dna.species.hazard_high_pressure)
if(!(HEATRES in mutations))
- var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
+ 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, used_weapon = "High Pressure")
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
else
clear_alert("pressure")
- else if(adjusted_pressure >= species.warning_high_pressure)
+ else if(adjusted_pressure >= dna.species.warning_high_pressure)
throw_alert("pressure", /obj/screen/alert/highpressure, 1)
- else if(adjusted_pressure >= species.warning_low_pressure)
+ else if(adjusted_pressure >= dna.species.warning_low_pressure)
clear_alert("pressure")
- else if(adjusted_pressure >= species.hazard_low_pressure)
+ else if(adjusted_pressure >= dna.species.hazard_low_pressure)
throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
else
if(COLDRES in mutations)
@@ -430,13 +430,13 @@
//END FIRE CODE
/mob/living/carbon/human/proc/stabilize_temperature_from_calories()
- var/body_temperature_difference = species.body_temperature - bodytemperature
+ var/body_temperature_difference = dna.species.body_temperature - bodytemperature
- if(bodytemperature <= species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
+ if(bodytemperature <= dna.species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
bodytemperature += max((body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM)
- if(bodytemperature >= species.cold_level_1 && bodytemperature <= species.heat_level_1)
+ if(bodytemperature >= dna.species.cold_level_1 && bodytemperature <= dna.species.heat_level_1)
bodytemperature += body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR
- if(bodytemperature >= species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
+ if(bodytemperature >= dna.species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
//We totally need a sweat system cause it totally makes sense...~
bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers
@@ -588,7 +588,7 @@
return 0 //godmode
//The fucking FAT mutation is the greatest shit ever. It makes everyone so hot and bothered.
- if(CAN_BE_FAT in species.species_traits)
+ if(CAN_BE_FAT in dna.species.species_traits)
if(FAT in mutations)
if(overeatduration < 100)
becomeSlim()
@@ -652,7 +652,7 @@
AdjustDizzy(-3)
AdjustJitter(-3)
- if(NO_INTORGANS in species.species_traits)
+ if(NO_INTORGANS in dna.species.species_traits)
return
handle_trace_chems()
@@ -766,10 +766,10 @@
//Vision //god knows why this is here
var/obj/item/organ/vision
- if(species.vision_organ)
- vision = get_int_organ(species.vision_organ)
+ if(dna.species.vision_organ)
+ vision = get_int_organ(dna.species.vision_organ)
- if(!species.vision_organ) // Presumably if a species has no vision organs, they see via some other means.
+ if(!dna.species.vision_organ) // Presumably if a species has no vision organs, they see via some other means.
SetEyeBlind(0)
blinded = 0
SetEyeBlurry(0)
@@ -860,10 +860,10 @@
remoteview_target = null
reset_perspective(null)
- species.handle_vision(src)
+ dna.species.handle_vision(src)
/mob/living/carbon/human/handle_hud_icons()
- species.handle_hud_icons(src)
+ dna.species.handle_hud_icons(src)
/mob/living/carbon/human/handle_random_events()
// Puke if toxloss is too high
@@ -907,7 +907,7 @@
if(times_fired % 5 == 1)
return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load)
- if(NO_BLOOD in species.species_traits)
+ if(NO_BLOOD in dna.species.species_traits)
return PULSE_NONE //No blood, no pulse.
if(stat == DEAD)
@@ -977,7 +977,7 @@
var/obj/item/clothing/mask/M = H.wear_mask
if(M && (M.flags_cover & MASKCOVERSMOUTH))
return
- if(NO_BREATHE in H.species.species_traits)
+ if(NO_BREATHE in H.dna.species.species_traits)
return //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"))
@@ -1054,9 +1054,9 @@
/mob/living/carbon/human/proc/can_heartattack()
- if(NO_BLOOD in species.species_traits)
+ if(NO_BLOOD in dna.species.species_traits)
return FALSE
- if(NO_INTORGANS in species.species_traits)
+ if(NO_INTORGANS in dna.species.species_traits)
return FALSE
return TRUE
diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm
index d4b160509ea..e16c67a56d0 100644
--- a/code/modules/mob/living/carbon/human/login.dm
+++ b/code/modules/mob/living/carbon/human/login.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/human/Login()
..()
- if(species && species.ventcrawler)
+ if(dna.species && dna.species.ventcrawler)
to_chat(src, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.")
update_pipe_vision()
return
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 7657a3be3be..7d408ce9199 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -42,7 +42,7 @@
if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak.
return 1
- if(species.can_understand(other))
+ if(dna.species.can_understand(other))
return 1
//These only pertain to common. Languages are handled by mob/say_understands()
@@ -87,7 +87,7 @@
/mob/living/carbon/human/IsVocal()
// how do species that don't breathe talk? magic, that's what.
- var/breathes = (!(NO_BREATHE in species.species_traits))
+ var/breathes = (!(NO_BREATHE in dna.species.species_traits))
var/obj/item/organ/internal/L = get_organ_slot("lungs")
if((breathes && !L) || breathes && L && (L.status & ORGAN_DEAD))
return FALSE
@@ -219,8 +219,8 @@
/mob/living/carbon/human/handle_speech_sound()
var/list/returns[2]
- if(species.speech_sounds && prob(species.speech_chance))
- returns[1] = sound(pick(species.speech_sounds))
+ if(dna.species.speech_sounds && prob(dna.species.speech_chance))
+ returns[1] = sound(pick(dna.species.speech_sounds))
returns[2] = 50
return returns
diff --git a/code/modules/mob/living/carbon/human/shock.dm b/code/modules/mob/living/carbon/human/shock.dm
index d8dc9356de7..e2d5dd79cec 100644
--- a/code/modules/mob/living/carbon/human/shock.dm
+++ b/code/modules/mob/living/carbon/human/shock.dm
@@ -23,7 +23,7 @@
/mob/living/carbon/human/proc/handle_shock()
if(status_flags & GODMODE) //godmode
return
- if(NO_PAIN in species.species_traits)
+ if(NO_PAIN in dna.species.species_traits)
return
updateshock()
diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm
index 8aeb6f88a3d..d50be2e73e8 100644
--- a/code/modules/mob/living/carbon/human/species/abductor.dm
+++ b/code/modules/mob/living/carbon/human/species/abductor.dm
@@ -3,7 +3,6 @@
name_plural = "Abductors"
icobase = 'icons/mob/human_races/r_abductor.dmi'
deform = 'icons/mob/human_races/r_abductor.dmi'
- path = /mob/living/carbon/human/abductor
language = "Abductor Mindlink"
default_language = "Abductor Mindlink"
eyes = "blank_eyes"
@@ -16,7 +15,7 @@
"eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight.
)
- species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS)
+ species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS, NO_EXAMINE)
oxy_mod = 0
@@ -27,14 +26,14 @@
female_scream_sound = 'sound/goonstation/voice/male_scream.ogg'
female_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
female_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg' //Abductors always scream like guys
+ var/team = 1
+ var/scientist = FALSE // vars to not pollute spieces list with castes
/datum/species/abductor/can_understand(mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
- return 1
+ return TRUE
/datum/species/abductor/handle_post_spawn(mob/living/carbon/human/H)
H.gender = NEUTER
- if(H.mind)
- H.mind.abductor = new /datum/abductor
H.languages.Cut() //Under no condition should you be able to speak any language
H.add_language("Abductor Mindlink") //other than over the abductor's own mindlink
- return ..()
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index 74f3e97d879..772a5ca5ba6 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -5,7 +5,6 @@
icobase = 'icons/mob/human_races/r_golem.dmi'
deform = 'icons/mob/human_races/r_golem.dmi'
- default_language = "Galactic Common"
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE, NOGUNS)
oxy_mod = 0
diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm
index c5003b21330..4128024a8c9 100644
--- a/code/modules/mob/living/carbon/human/species/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/monkey.dm
@@ -8,10 +8,11 @@
damage_overlays = 'icons/mob/human_races/masks/dam_monkey.dmi'
damage_mask = 'icons/mob/human_races/masks/dam_mask_monkey.dmi'
blood_mask = 'icons/mob/human_races/masks/blood_monkey.dmi'
- path = /mob/living/carbon/human/monkey
language = null
default_language = "Chimpanzee"
- greater_form = "Human"
+ species_traits = list(NO_EXAMINE)
+ skinned_type = /obj/item/stack/sheet/animalhide/monkey
+ greater_form = /datum/species/human
is_small = 1
has_fine_manipulation = 0
ventcrawler = 1
@@ -99,7 +100,7 @@
icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi'
deform = 'icons/mob/human_races/monkeys/r_farwa.dmi'
- greater_form = "Tajaran"
+ greater_form = /datum/species/tajaran
default_language = "Farwa"
flesh_color = "#AFA59E"
base_color = "#000000"
@@ -123,7 +124,7 @@
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
deform = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
- greater_form = "Vulpkanin"
+ greater_form = /datum/species/vulpkanin
default_language = "Wolpin"
flesh_color = "#966464"
base_color = "#000000"
@@ -147,7 +148,7 @@
icobase = 'icons/mob/human_races/monkeys/r_neara.dmi'
deform = 'icons/mob/human_races/monkeys/r_neara.dmi'
- greater_form = "Skrell"
+ greater_form = /datum/species/skrell
default_language = "Neara"
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
@@ -162,7 +163,7 @@
deform = 'icons/mob/human_races/monkeys/r_stok.dmi'
tail = "stoktail"
- greater_form = "Unathi"
+ greater_form = /datum/species/unathi
default_language = "Stok"
flesh_color = "#34AF10"
base_color = "#000000"
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 692a23c470a..46270219735 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -6,6 +6,7 @@
//language = "Clatter"
species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
+ skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently*
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm
index 7480d7e3a66..0e8bd2e91e2 100644
--- a/code/modules/mob/living/carbon/human/species/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/shadow.dm
@@ -5,7 +5,6 @@
icobase = 'icons/mob/human_races/r_shadow.dmi'
deform = 'icons/mob/human_races/r_shadow.dmi'
- default_language = "Galactic Common"
unarmed_type = /datum/unarmed_attack/claws
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm
index 9da4d1222f6..8afc35f743a 100644
--- a/code/modules/mob/living/carbon/human/species/skeleton.dm
+++ b/code/modules/mob/living/carbon/human/species/skeleton.dm
@@ -6,13 +6,12 @@
icobase = 'icons/mob/human_races/r_skeleton.dmi'
deform = 'icons/mob/human_races/r_skeleton.dmi'
- path = /mob/living/carbon/human/skeleton
- default_language = "Galactic Common"
blood_color = "#FFFFFF"
flesh_color = "#E6E6C6"
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE)
+ skinned_type = /obj/item/stack/sheet/bone
oxy_mod = 0
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 139f2f7c9bb..6ce91d80ddd 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -1,11 +1,6 @@
-/*
- Datum-based species. Should make for much cleaner and easier to maintain mutantrace code.
-*/
-
/datum/species
var/name // Species name.
var/name_plural // Pluralized name (since "[name]s" is not always valid)
- var/path // Species path
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
@@ -18,8 +13,8 @@
var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen.
var/butt_sprite = "human"
- var/primitive_form // Lesser form, if any (ie. monkey for humans)
- var/greater_form // Greater form, if any, ie. human for monkeys.
+ var/datum/species/primitive_form = null // Lesser form, if any (ie. monkey for humans)
+ var/datum/species/greater_form = null // Greater form, if any, ie. human for monkeys.
var/tail // Name of tail image in species effects icon file.
var/datum/unarmed_attack/unarmed //For empty hand harm-intent attack
var/unarmed_type = /datum/unarmed_attack
@@ -80,6 +75,7 @@
var/clothing_flags = 0 // Underwear and socks.
var/exotic_blood
+ var/skinned_type
var/bodyflags = 0
var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods
@@ -94,6 +90,7 @@
//Used in icon caching.
var/race_key = 0
var/icon/icon_template
+
var/is_small
var/show_ssd = 1
var/can_revive_by_healing // Determines whether or not this species can be revived by simply healing them
@@ -165,11 +162,11 @@
unarmed = new unarmed_type()
-/datum/species/proc/get_random_name(var/gender)
+/datum/species/proc/get_random_name(gender)
var/datum/language/species_language = all_languages[language]
return species_language.get_random_name(gender)
-/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.
+/datum/species/proc/create_organs(mob/living/carbon/human/H) //Handles creation of mob organs.
QDEL_LIST(H.internal_organs)
QDEL_LIST(H.bodyparts)
@@ -262,28 +259,24 @@
. -= 2
return .
-/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
+/datum/species/proc/handle_post_spawn(mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
grant_abilities(C)
+
+/datum/species/proc/updatespeciescolor(mob/living/carbon/human/H) //Handles changing icobase for species that have multiple skin colors.
return
-/datum/species/proc/updatespeciescolor(var/mob/living/carbon/human/H) //Handles changing icobase for species that have multiple skin colors.
- return
-
-/datum/species/proc/grant_abilities(var/mob/living/carbon/human/H)
+/datum/species/proc/grant_abilities(mob/living/carbon/human/H)
for(var/proc/ability in species_abilities)
H.verbs += ability
- return
-/datum/species/proc/handle_pre_change(var/mob/living/carbon/human/H)
- if(H.butcher_results)//clear it out so we don't butcher a actual human.
+/datum/species/proc/handle_pre_change(mob/living/carbon/human/H)
+ if(H.butcher_results) //clear it out so we don't butcher a actual human.
H.butcher_results = null
remove_abilities(H)
- return
-/datum/species/proc/remove_abilities(var/mob/living/carbon/human/H)
+/datum/species/proc/remove_abilities(mob/living/carbon/human/H)
for(var/proc/ability in species_abilities)
H.verbs -= ability
- return
// Do species-specific reagent handling here
// Return 1 if it should do normal processing too
@@ -294,47 +287,42 @@
if(R.id == exotic_blood)
H.blood_volume = min(H.blood_volume + round(R.volume, 0.1), BLOOD_VOLUME_NORMAL)
H.reagents.del_reagent(R.id)
- return 0
- return 1
+ return FALSE
+ return TRUE
// For special snowflake species effects
// (Slime People changing color based on the reagents they consume)
-/datum/species/proc/handle_life(var/mob/living/carbon/human/H)
+/datum/species/proc/handle_life(mob/living/carbon/human/H)
if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations))
H.setOxyLoss(0)
H.SetLoseBreath(0)
-/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here
+/datum/species/proc/handle_dna(mob/living/carbon/C, remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here
return
-// Used for species-specific names (Vox, etc)
-/datum/species/proc/makeName(var/gender,var/mob/living/carbon/human/H=null)
- if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
- else return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
-
-/datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
+/datum/species/proc/handle_death(mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
return
/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))//adminfu only...
- return 1
+ return TRUE
if(target.health >= config.health_threshold_crit)
target.help_shake_act(user)
- return 1
+ return TRUE
else
user.do_cpr(target)
/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(attacker_style && attacker_style.grab_act(user, target))
- return 1
+ return TRUE
else
target.grabbedby(user)
- return 1
+ return TRUE
/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
//Vampire code
if(user.mind && user.mind.vampire && (user.mind in ticker.mode.vampires) && !user.mind.vampire.draining && user.zone_sel && user.zone_sel.selecting == "head" && target != user)
- if((NO_BLOOD in target.species.species_traits) || target.species.exotic_blood || !target.blood_volume)
+ if((NO_BLOOD in target.dna.species.species_traits) || target.dna.species.exotic_blood || !target.blood_volume)
to_chat(user, "They have no blood!")
return
if(target.mind && target.mind.vampire && (target.mind in ticker.mode.vampires))
@@ -352,9 +340,9 @@
return
//end vampire codes
if(attacker_style && attacker_style.harm_act(user, target))
- return 1
+ return TRUE
else
- var/datum/unarmed_attack/attack = user.species.unarmed
+ var/datum/unarmed_attack/attack = user.dna.species.unarmed
user.do_attack_animation(target, attack.animation_type)
add_attack_logs(user, target, "Melee attacked with fists", target.ckey ? null : ATKLOG_ALL)
@@ -364,12 +352,12 @@
else
target.LAssailant = user
- var/damage = rand(user.species.punchdamagelow, user.species.punchdamagehigh)
+ var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
damage += attack.damage
if(!damage)
playsound(target.loc, attack.miss_sound, 25, 1, -1)
target.visible_message("[user] tried to [pick(attack.attack_verb)] [target]!")
- return 0
+ return FALSE
var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting))
@@ -380,7 +368,7 @@
target.visible_message("[user] [pick(attack.attack_verb)]ed [target]!")
target.apply_damage(damage, BRUTE, affecting, armor_block, sharp = attack.sharp) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway.
- if((target.stat != DEAD) && damage >= user.species.punchstunthreshold)
+ if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
target.visible_message("[user] has weakened [target]!", \
"[user] has weakened [target]!")
target.apply_effect(4, WEAKEN, armor_block)
@@ -390,7 +378,7 @@
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(attacker_style && attacker_style.disarm_act(user, target))
- return 1
+ return TRUE
else
add_attack_logs(user, target, "Disarmed", ATKLOG_ALL)
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
@@ -463,7 +451,7 @@
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(0, M.name, attack_type = UNARMED_ATTACK))
add_attack_logs(M, H, "Melee attacked with fists (miss/block)")
H.visible_message("[M] attempted to touch [H]!")
- return 0
+ return FALSE
switch(M.a_intent)
if(INTENT_HELP)
@@ -487,11 +475,11 @@
/datum/species/proc/after_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
return
-/datum/species/proc/can_understand(var/mob/other)
+/datum/species/proc/can_understand(mob/other)
return
// Called in life() when the mob has no client.
-/datum/species/proc/handle_npc(var/mob/living/carbon/human/H)
+/datum/species/proc/handle_npc(mob/living/carbon/human/H)
return
//Species unarmed attacks
@@ -525,7 +513,7 @@
damage = 6
/datum/species/proc/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
- return 0
+ return FALSE
/datum/species/proc/handle_vision(mob/living/carbon/human/H)
// Right now this just handles blind, blurry, and similar states
@@ -631,7 +619,7 @@ Returns the path corresponding to the corresponding organ
It'll return null if the organ doesn't correspond, so include null checks when using this!
*/
//Fethas Todo:Do i need to redo this?
-/datum/species/proc/return_organ(var/organ_slot)
+/datum/species/proc/return_organ(organ_slot)
if(!(organ_slot in has_organ))
return null
return has_organ[organ_slot]
@@ -729,4 +717,4 @@ It'll return null if the organ doesn't correspond, so include null checks when u
/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source)
if(abs(temperature - M.bodytemperature) > 10) //If our water and mob temperature varies by more than 10K, cool or/ heat them appropriately
- M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling
+ M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 6b692601226..22b8b281f8b 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -3,10 +3,10 @@
name_plural = "Humans"
icobase = 'icons/mob/human_races/r_human.dmi'
deform = 'icons/mob/human_races/r_def_human.dmi'
- primitive_form = "Monkey"
- path = /mob/living/carbon/human/human
+ primitive_form = /datum/species/monkey
language = "Sol Common"
species_traits = list(LIPS, CAN_BE_FAT)
+ skinned_type = /obj/item/stack/sheet/animalhide/human
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
dietflags = DIET_OMNI
@@ -24,12 +24,11 @@
name_plural = "Unathi"
icobase = 'icons/mob/human_races/r_lizard.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi'
- path = /mob/living/carbon/human/unathi
- default_language = "Galactic Common"
language = "Sinta'unathi"
tail = "sogtail"
+ skinned_type = /obj/item/stack/sheet/animalhide/lizard
unarmed_type = /datum/unarmed_attack/claws
- primitive_form = "Stok"
+ primitive_form = /datum/species/monkey/unathi
blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \
Uuosa-Eso system, which roughly translates to 'burning mother'.
Coming from a harsh, radioactive \
@@ -118,10 +117,9 @@
name_plural = "Tajaran"
icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
- path = /mob/living/carbon/human/tajaran
- default_language = "Galactic Common"
language = "Siik'tajr"
tail = "tajtail"
+ skinned_type = /obj/item/stack/sheet/fur
unarmed_type = /datum/unarmed_attack/claws
blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \
@@ -138,7 +136,7 @@
heat_level_2 = 380
heat_level_3 = 440
- primitive_form = "Farwa"
+ primitive_form = /datum/species/monkey/tajaran
species_traits = list(LIPS, CAN_BE_FAT)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
@@ -178,11 +176,10 @@
name_plural = "Vulpkanin"
icobase = 'icons/mob/human_races/r_vulpkanin.dmi'
deform = 'icons/mob/human_races/r_vulpkanin.dmi'
- path = /mob/living/carbon/human/vulpkanin
- default_language = "Galactic Common"
language = "Canilunzt"
- primitive_form = "Wolpin"
+ primitive_form = /datum/species/monkey/vulpkanin
tail = "vulptail"
+ skinned_type = /obj/item/stack/sheet/fur
unarmed_type = /datum/unarmed_attack/claws
blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \
@@ -232,10 +229,8 @@
name_plural = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
- path = /mob/living/carbon/human/skrell
- default_language = "Galactic Common"
language = "Skrellian"
- primitive_form = "Neara"
+ primitive_form = /datum/species/monkey/skrell
blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \
the royals' or 'Light of the Crown'.
Skrell are a highly advanced and logical race who live under the rule \
@@ -281,9 +276,6 @@
name_plural = "Vox"
icobase = 'icons/mob/human_races/vox/r_vox.dmi'
deform = 'icons/mob/human_races/vox/r_def_vox.dmi'
- path = /mob/living/carbon/human/vox
-
- default_language = "Galactic Common"
language = "Vox-pidgin"
tail = "voxtail"
speech_sounds = list('sound/voice/shriek1.ogg')
@@ -348,7 +340,7 @@
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
- "stack" = /obj/item/organ/internal/stack/vox //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
+ "stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
suicide_messages = list(
@@ -361,16 +353,6 @@
/datum/species/vox/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
-/datum/species/vox/makeName(var/gender,var/mob/living/carbon/human/H=null)
- var/sounds = rand(2,8)
- var/i = 0
- var/newname = ""
-
- while(i<=sounds)
- i++
- newname += pick(vox_name_syllables)
- return capitalize(newname)
-
/datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H)
if(!H.mind || !H.mind.assigned_role || H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime")
H.unEquip(H.wear_mask)
@@ -393,7 +375,7 @@
..()
/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H, var/owner_sensitive = 1) //Handling species-specific skin-tones for the Vox race.
- if(H.species.bodyflags & HAS_ICON_SKIN_TONE) //Making sure we don't break Armalis.
+ if(H.dna.species.bodyflags & HAS_ICON_SKIN_TONE) //Making sure we don't break Armalis.
var/new_icobase = 'icons/mob/human_races/vox/r_vox.dmi' //Default Green Vox.
var/new_deform = 'icons/mob/human_races/vox/r_def_vox.dmi' //Default Green Vox.
switch(H.s_tone)
@@ -441,7 +423,6 @@
name_plural = "Vox Armalis"
icobase = 'icons/mob/human_races/r_armalis.dmi'
deform = 'icons/mob/human_races/r_armalis.dmi'
- path = /mob/living/carbon/human/voxarmalis
unarmed_type = /datum/unarmed_attack/claws/armalis
warning_low_pressure = 50
@@ -479,7 +460,7 @@
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
- "stack" = /obj/item/organ/internal/stack/vox //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
+ "stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
suicide_messages = list(
@@ -497,8 +478,6 @@
name_plural = "Kidan"
icobase = 'icons/mob/human_races/r_kidan.dmi'
deform = 'icons/mob/human_races/r_def_kidan.dmi'
- path = /mob/living/carbon/human/kidan
- default_language = "Galactic Common"
language = "Chittin"
unarmed_type = /datum/unarmed_attack/claws
@@ -539,11 +518,9 @@
/datum/species/slime
name = "Slime People"
name_plural = "Slime People"
- default_language = "Galactic Common"
language = "Bubblish"
icobase = 'icons/mob/human_races/r_slime.dmi'
deform = 'icons/mob/human_races/r_slime.dmi'
- path = /mob/living/carbon/human/slime
remains_type = /obj/effect/decal/remains/slime
// More sensitive to the cold
@@ -580,7 +557,7 @@
"is ripping out their own core!",
"is turning a dull, brown color and melting into a puddle!")
- var/list/mob/living/carbon/human/recolor_list = list()
+ var/reagent_skin_coloring = FALSE
var/datum/action/innate/regrow/grow = new()
@@ -609,7 +586,7 @@
#define SLIMEPERSON_ICON_UPDATE_PERIOD 200 // 20 seconds
#define SLIMEPERSON_BLOOD_SCALING_FACTOR 5 // Used to adjust how much of an effect the blood has on the rate of color change. Higher is slower.
// Slowly shifting to the color of the reagents
- if((H in recolor_list) && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER)
+ if(reagent_skin_coloring && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER)
var/blood_amount = H.blood_volume
var/r_color = mix_color_from_reagents(H.reagents.reagent_list)
var/new_body_color = BlendRGB(r_color, H.skin_colour, (blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)/((blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)+(H.reagents.total_volume)))
@@ -617,7 +594,7 @@
if(world.time % SLIMEPERSON_ICON_UPDATE_PERIOD > SLIMEPERSON_ICON_UPDATE_PERIOD - 20) // The 20 is because this gets called every 2 seconds, from the mob controller
for(var/organname in H.bodyparts_by_name)
var/obj/item/organ/external/E = H.bodyparts_by_name[organname]
- if(istype(E) && E.dna.species == "Slime People")
+ if(istype(E) && E.dna && istype(E.dna.species, /datum/species/slime))
E.sync_colour_to_human(H)
H.update_hair(0)
H.update_body()
@@ -627,19 +604,19 @@
#undef SLIMEPERSON_ICON_UPDATE_PERIOD
#undef SLIMEPERSON_BLOOD_SCALING_FACTOR
-/mob/living/carbon/human/proc/toggle_recolor(var/silent = 0)
- var/datum/species/slime/S = all_species[get_species()]
- if(!istype(S))
+/mob/living/carbon/human/proc/toggle_recolor(silent = FALSE)
+ if(!isslimeperson(src))
if(!silent)
to_chat(src, "You're not a slime person!")
return
- if(src in S.recolor_list)
- S.recolor_list -= src
+ var/datum/species/slime/S = dna.species
+ if(S.reagent_skin_coloring)
+ S.reagent_skin_coloring = TRUE
if(!silent)
to_chat(src, "You adjust your internal chemistry to filter out pigments from things you consume.")
else
- S.recolor_list += src
+ S.reagent_skin_coloring = TRUE
if(!silent)
to_chat(src, "You adjust your internal chemistry to permit pigments in chemicals you consume to tint you.")
@@ -672,7 +649,7 @@
for(var/l in bodyparts_by_name)
var/obj/item/organ/external/E = bodyparts_by_name[l]
if(!istype(E))
- var/list/limblist = species.has_limbs[l]
+ var/list/limblist = dna.species.has_limbs[l]
var/obj/item/organ/external/limb = limblist["path"]
var/parent_organ = initial(limb.parent_organ)
var/obj/item/organ/external/parentLimb = bodyparts_by_name[parent_organ]
@@ -708,7 +685,7 @@
stored_burn = doomedStump.burn_dam
qdel(O)
- var/limb_list = species.has_limbs[chosen_limb]
+ var/limb_list = dna.species.has_limbs[chosen_limb]
var/obj/item/organ/external/limb_path = limb_list["path"]
// Parent check
var/obj/item/organ/external/potential_parent = bodyparts_by_name[initial(limb_path.parent_organ)]
@@ -734,9 +711,9 @@
#undef SLIMEPERSON_MINHUNGER
#undef SLIMEPERSON_REGROWTHDELAY
-/datum/species/slime/handle_pre_change(var/mob/living/carbon/human/H)
+/datum/species/slime/handle_pre_change(mob/living/carbon/human/H)
..()
- if(H in recolor_list)
+ if(reagent_skin_coloring)
H.toggle_recolor(silent = 1)
/datum/species/grey
@@ -744,7 +721,6 @@
name_plural = "Greys"
icobase = 'icons/mob/human_races/r_grey.dmi'
deform = 'icons/mob/human_races/r_def_grey.dmi'
- default_language = "Galactic Common"
language = "Psionic Communication"
eyes = "grey_eyes_s"
butt_sprite = "grey"
@@ -801,8 +777,6 @@
name_plural = "Dionaea"
icobase = 'icons/mob/human_races/r_diona.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi'
- path = /mob/living/carbon/human/diona
- default_language = "Galactic Common"
language = "Rootspeak"
speech_sounds = list('sound/voice/dionatalk1.ogg') //Credit https://www.youtube.com/watch?v=ufnvlRjsOTI [0:13 - 0:16]
speech_chance = 20
@@ -836,6 +810,7 @@
default_hair_colour = "#000000"
dietflags = 0 //Diona regenerate nutrition in light and water, no diet necessary
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
+ skinned_type = /obj/item/stack/sheet/wood
oxy_mod = 0
@@ -924,10 +899,9 @@
icobase = 'icons/mob/human_races/r_machine.dmi'
deform = 'icons/mob/human_races/r_machine.dmi'
- path = /mob/living/carbon/human/machine
- default_language = "Galactic Common"
language = "Trinary"
remains_type = /obj/effect/decal/remains/robot
+ skinned_type = /obj/item/stack/sheet/metal // Let's grind up IPCs for station resources!
eyes = "blank_eyes"
brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150%
@@ -1007,8 +981,6 @@
name_plural = "Drask"
icobase = 'icons/mob/human_races/r_drask.dmi'
deform = 'icons/mob/human_races/r_drask.dmi'
- path = /mob/living/carbon/human/drask
- default_language = "Galactic Common"
language = "Orluum"
eyes = "drask_eyes_s"
diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm
index 5f74f202603..e7a65129017 100644
--- a/code/modules/mob/living/carbon/human/status_procs.dm
+++ b/code/modules/mob/living/carbon/human/status_procs.dm
@@ -1,19 +1,19 @@
/mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0)
- if(species)
- amount = amount * species.stun_mod
+ if(dna.species)
+ amount = amount * dna.species.stun_mod
..()
/mob/living/carbon/human/SetWeakened(amount, updating = 1, force = 0)
- if(species)
- amount = amount * species.stun_mod
+ if(dna.species)
+ amount = amount * dna.species.stun_mod
..()
/mob/living/carbon/human/SetParalysis(amount, updating = 1, force = 0)
- if(species)
- amount = amount * species.stun_mod
+ if(dna.species)
+ amount = amount * dna.species.stun_mod
..()
/mob/living/carbon/human/SetSleeping(amount, updating = 1, no_alert = FALSE)
- if(species)
- amount = amount * species.stun_mod
+ if(dna.species)
+ amount = amount * dna.species.stun_mod
..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 3a1ac4d3a83..af134052a66 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -185,7 +185,7 @@ var/global/list/damage_icon_parts = list()
previous_damage_appearance = damage_appearance
- var/icon/standing = new /icon(species.damage_overlays, "00")
+ var/icon/standing = new /icon(dna.species.damage_overlays, "00")
var/image/standing_image = new /image("icon" = standing)
@@ -194,12 +194,12 @@ var/global/list/damage_icon_parts = list()
O.update_icon()
if(O.damage_state == "00") continue
var/icon/DI
- var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.name]"
+ var/cache_index = "[O.damage_state]/[O.icon_name]/[dna.species.blood_color]/[dna.species.name]"
if(damage_icon_parts[cache_index] == null)
- DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human
- DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
- DI.Blend(species.blood_color, ICON_MULTIPLY)
+ DI = new /icon(dna.species.damage_overlays, O.damage_state) // the damage icon for whole human
+ DI.Blend(new /icon(dna.species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
+ DI.Blend(dna.species.blood_color, ICON_MULTIPLY)
damage_icon_parts[cache_index] = DI
else
DI = damage_icon_parts[cache_index]
@@ -220,15 +220,15 @@ var/global/list/damage_icon_parts = list()
var/hulk = (HULK in mutations)
var/skeleton = (SKELETON in mutations)
- if(species && species.bodyflags & HAS_ICON_SKIN_TONE)
- species.updatespeciescolor(src)
+ if(dna.species && dna.species.bodyflags & HAS_ICON_SKIN_TONE)
+ dna.species.updatespeciescolor(src)
//CACHING: Generate an index key from visible bodyparts.
//0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
//Create a new, blank icon for our mob to use.
if(stand_icon)
qdel(stand_icon)
- stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank")
+ stand_icon = new(dna.species.icon_template ? dna.species.icon_template : 'icons/mob/human.dmi',"blank")
var/icon_key = ""
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
@@ -237,7 +237,7 @@ var/global/list/damage_icon_parts = list()
else
icon_key += "#000000"
- for(var/organ_tag in species.has_limbs)
+ for(var/organ_tag in dna.species.has_limbs)
var/obj/item/organ/external/part = bodyparts_by_name[organ_tag]
if(isnull(part))
icon_key += "0"
@@ -249,7 +249,7 @@ var/global/list/damage_icon_parts = list()
icon_key += "1"
if(part)
- icon_key += "[part.species.race_key]"
+ icon_key += "[part.dna.species.race_key]"
icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]"
icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]"
if(part.s_col)
@@ -307,7 +307,7 @@ var/global/list/damage_icon_parts = list()
//END CACHED ICON GENERATION.
stand_icon.Blend(base_icon,ICON_OVERLAY)
- if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails).
else
overlays_standing[LIMBS_LAYER] = null // So we don't get the old species' sprite splatted on top of the new one's
@@ -316,18 +316,18 @@ var/global/list/damage_icon_parts = list()
overlays_standing[UNDERWEAR_LAYER] = null
var/icon/underwear_standing = new/icon('icons/mob/underwear.dmi',"nude")
- if(underwear && species.clothing_flags & HAS_UNDERWEAR)
+ if(underwear && dna.species.clothing_flags & HAS_UNDERWEAR)
var/datum/sprite_accessory/underwear/U = underwear_list[underwear]
if(U)
underwear_standing.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY)
- if(undershirt && species.clothing_flags & HAS_UNDERSHIRT)
+ if(undershirt && dna.species.clothing_flags & HAS_UNDERSHIRT)
var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt]
if(U2)
underwear_standing.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY)
- if(socks && species.clothing_flags & HAS_SOCKS)
+ if(socks && dna.species.clothing_flags & HAS_SOCKS)
var/datum/sprite_accessory/socks/U3 = socks_list[socks]
if(U3)
underwear_standing.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY)
@@ -339,7 +339,7 @@ var/global/list/damage_icon_parts = list()
if(update_icons)
update_icons()
- if(lip_style && (LIPS in species.species_traits))
+ if(lip_style && (LIPS in dna.species.species_traits))
var/icon/lips = icon("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]_s")
lips.Blend(lip_color, ICON_ADD)
@@ -369,7 +369,7 @@ var/global/list/damage_icon_parts = list()
if(chest_organ && m_styles["body"])
var/body_marking = m_styles["body"]
var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
- if(body_marking_style && body_marking_style.species_allowed && (species.name in body_marking_style.species_allowed))
+ if(body_marking_style && body_marking_style.species_allowed && (dna.species.name in body_marking_style.species_allowed))
var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
if(body_marking_style.do_colouration)
b_marking_s.Blend(m_colours["body"], ICON_ADD)
@@ -379,7 +379,7 @@ var/global/list/damage_icon_parts = list()
if(head_organ && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
var/head_marking = m_styles["head"]
var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
- if(head_marking_style && head_marking_style.species_allowed && (head_organ.species.name in head_marking_style.species_allowed))
+ if(head_marking_style && head_marking_style.species_allowed && (head_organ.dna.species.name in head_marking_style.species_allowed))
var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
if(head_marking_style.do_colouration)
h_marking_s.Blend(m_colours["head"], ICON_ADD)
@@ -407,10 +407,10 @@ var/global/list/damage_icon_parts = list()
//base icons
var/icon/head_accessory_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(head_organ.ha_style && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY))
+ if(head_organ.ha_style && (head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY))
var/datum/sprite_accessory/head_accessory/head_accessory_style = head_accessory_styles_list[head_organ.ha_style]
if(head_accessory_style && head_accessory_style.species_allowed)
- if(head_organ.species.name in head_accessory_style.species_allowed)
+ if(head_organ.dna.species.name in head_accessory_style.species_allowed)
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
if(head_accessory_style.do_colouration)
head_accessory_s.Blend(head_organ.headacc_colour, ICON_ADD)
@@ -448,12 +448,12 @@ var/global/list/damage_icon_parts = list()
if(head_organ.h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic())))
var/datum/sprite_accessory/hair/hair_style = hair_styles_full_list[head_organ.h_style]
- //if(!src.get_int_organ(/obj/item/organ/internal/brain) && src.get_species() != "Machine" )//make it obvious we have NO BRAIN
+ //if(!src.get_int_organ(/obj/item/organ/internal/brain) && !ismachine(src))//make it obvious we have NO BRAIN
// hair_standing.Blend(debrained_s, ICON_OVERLAY)
if(hair_style && hair_style.species_allowed)
- if((head_organ.species.name in hair_style.species_allowed) || (head_organ.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
+ if((head_organ.dna.species.name in hair_style.species_allowed) || (head_organ.dna.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
- if(head_organ.species.name == "Slime People") // I am el worstos
+ if(istype(head_organ.dna.species, /datum/species/slime)) // I am el worstos
hair_s.Blend("[skin_colour]A0", ICON_AND)
else if(hair_style.do_colouration)
hair_s.Blend(head_organ.hair_colour, ICON_ADD)
@@ -497,9 +497,9 @@ var/global/list/damage_icon_parts = list()
if(head_organ.f_style)
var/datum/sprite_accessory/facial_hair/facial_hair_style = facial_hair_styles_list[head_organ.f_style]
if(facial_hair_style && facial_hair_style.species_allowed)
- if((head_organ.species.name in facial_hair_style.species_allowed) || (head_organ.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
+ if((head_organ.dna.species.name in facial_hair_style.species_allowed) || (head_organ.dna.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
- if(head_organ.species.name == "Slime People") // I am el worstos
+ if(istype(head_organ.dna.species, /datum/species/slime)) // I am el worstos
facial_s.Blend("[skin_colour]A0", ICON_AND)
else if(facial_hair_style.do_colouration)
facial_s.Blend(head_organ.facial_colour, ICON_ADD)
@@ -644,11 +644,11 @@ var/global/list/damage_icon_parts = list()
if(w_uniform.icon_override)
standing.icon = w_uniform.icon_override
- else if(w_uniform.sprite_sheets && w_uniform.sprite_sheets[species.name])
- standing.icon = w_uniform.sprite_sheets[species.name]
+ else if(w_uniform.sprite_sheets && w_uniform.sprite_sheets[dna.species.name])
+ standing.icon = w_uniform.sprite_sheets[dna.species.name]
if(w_uniform.blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "uniformblood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "uniformblood")
bloodsies.color = w_uniform.blood_color
standing.overlays += bloodsies
@@ -658,8 +658,8 @@ var/global/list/damage_icon_parts = list()
if(!tie_color) tie_color = A.icon_state
if(A.icon_override)
standing.overlays += image("icon" = A.icon_override, "icon_state" = "[A.icon_state]")
- else if(A.sprite_sheets && A.sprite_sheets[species.name])
- standing.overlays += image("icon" = A.sprite_sheets[species.name], "icon_state" = "[A.icon_state]")
+ else if(A.sprite_sheets && A.sprite_sheets[dna.species.name])
+ standing.overlays += image("icon" = A.sprite_sheets[dna.species.name], "icon_state" = "[A.icon_state]")
else
standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]")
@@ -720,19 +720,19 @@ var/global/list/damage_icon_parts = list()
var/image/standing
if(gloves.icon_override)
standing = image("icon" = gloves.icon_override, "icon_state" = "[t_state]")
- else if(gloves.sprite_sheets && gloves.sprite_sheets[species.name])
- standing = image("icon" = gloves.sprite_sheets[species.name], "icon_state" = "[t_state]")
+ else if(gloves.sprite_sheets && gloves.sprite_sheets[dna.species.name])
+ standing = image("icon" = gloves.sprite_sheets[dna.species.name], "icon_state" = "[t_state]")
else
standing = image("icon" = 'icons/mob/hands.dmi', "icon_state" = "[t_state]")
if(gloves.blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "bloodyhands")
bloodsies.color = gloves.blood_color
standing.overlays += bloodsies
overlays_standing[GLOVES_LAYER] = standing
else
if(blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "bloodyhands")
bloodsies.color = hand_blood_color
overlays_standing[GLOVES_LAYER] = bloodsies
else
@@ -759,8 +759,8 @@ var/global/list/damage_icon_parts = list()
if(glasses.icon_override)
new_glasses = image("icon" = glasses.icon_override, "icon_state" = "[glasses.icon_state]")
- else if(glasses.sprite_sheets && glasses.sprite_sheets[head_organ.species.name])
- new_glasses = image("icon" = glasses.sprite_sheets[head_organ.species.name], "icon_state" = "[glasses.icon_state]")
+ else if(glasses.sprite_sheets && glasses.sprite_sheets[head_organ.dna.species.name])
+ new_glasses = image("icon" = glasses.sprite_sheets[head_organ.dna.species.name], "icon_state" = "[glasses.icon_state]")
else
new_glasses = image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]")
@@ -795,9 +795,9 @@ var/global/list/damage_icon_parts = list()
if(l_ear.icon_override)
t_type = "[t_type]_l"
overlays_standing[EARS_LAYER] = image("icon" = l_ear.icon_override, "icon_state" = "[t_type]")
- else if(l_ear.sprite_sheets && l_ear.sprite_sheets[species.name])
+ else if(l_ear.sprite_sheets && l_ear.sprite_sheets[dna.species.name])
t_type = "[t_type]_l"
- overlays_standing[EARS_LAYER] = image("icon" = l_ear.sprite_sheets[species.name], "icon_state" = "[t_type]")
+ overlays_standing[EARS_LAYER] = image("icon" = l_ear.sprite_sheets[dna.species.name], "icon_state" = "[t_type]")
else
overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]")
@@ -811,9 +811,9 @@ var/global/list/damage_icon_parts = list()
if(r_ear.icon_override)
t_type = "[t_type]_r"
overlays_standing[EARS_LAYER] = image("icon" = r_ear.icon_override, "icon_state" = "[t_type]")
- else if(r_ear.sprite_sheets && r_ear.sprite_sheets[species.name])
+ else if(r_ear.sprite_sheets && r_ear.sprite_sheets[dna.species.name])
t_type = "[t_type]_r"
- overlays_standing[EARS_LAYER] = image("icon" = r_ear.sprite_sheets[species.name], "icon_state" = "[t_type]")
+ overlays_standing[EARS_LAYER] = image("icon" = r_ear.sprite_sheets[dna.species.name], "icon_state" = "[t_type]")
else
overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]")
@@ -837,20 +837,20 @@ var/global/list/damage_icon_parts = list()
var/image/standing
if(shoes.icon_override)
standing = image("icon" = shoes.icon_override, "icon_state" = "[shoes.icon_state]")
- else if(shoes.sprite_sheets && shoes.sprite_sheets[species.name])
- standing = image("icon" = shoes.sprite_sheets[species.name], "icon_state" = "[shoes.icon_state]")
+ else if(shoes.sprite_sheets && shoes.sprite_sheets[dna.species.name])
+ standing = image("icon" = shoes.sprite_sheets[dna.species.name], "icon_state" = "[shoes.icon_state]")
else
standing = image("icon" = 'icons/mob/feet.dmi', "icon_state" = "[shoes.icon_state]")
if(shoes.blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "shoeblood")
bloodsies.color = shoes.blood_color
standing.overlays += bloodsies
overlays_standing[SHOES_LAYER] = standing
else
if(feet_blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "shoeblood")
bloodsies.color = feet_blood_color
overlays_standing[SHOES_LAYER] = bloodsies
else
@@ -891,13 +891,13 @@ var/global/list/damage_icon_parts = list()
var/image/standing
if(head.icon_override)
standing = image("icon" = head.icon_override, "icon_state" = "[head.icon_state]")
- else if(head.sprite_sheets && head.sprite_sheets[species.name])
- standing = image("icon" = head.sprite_sheets[species.name], "icon_state" = "[head.icon_state]")
+ else if(head.sprite_sheets && head.sprite_sheets[dna.species.name])
+ standing = image("icon" = head.sprite_sheets[dna.species.name], "icon_state" = "[head.icon_state]")
else
standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]")
if(head.blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "helmetblood")
bloodsies.color = head.blood_color
standing.overlays += bloodsies
overlays_standing[HEAD_LAYER] = standing
@@ -925,8 +925,8 @@ var/global/list/damage_icon_parts = list()
if(belt.icon_override)
t_state = "[t_state]_be"
overlays_standing[BELT_LAYER] = image("icon" = belt.icon_override, "icon_state" = "[t_state]")
- else if(belt.sprite_sheets && belt.sprite_sheets[species.name])
- overlays_standing[BELT_LAYER] = image("icon" = belt.sprite_sheets[species.name], "icon_state" = "[t_state]")
+ else if(belt.sprite_sheets && belt.sprite_sheets[dna.species.name])
+ overlays_standing[BELT_LAYER] = image("icon" = belt.sprite_sheets[dna.species.name], "icon_state" = "[t_state]")
else
overlays_standing[BELT_LAYER] = image("icon" = 'icons/mob/belt.dmi', "icon_state" = "[t_state]")
else
@@ -949,8 +949,8 @@ var/global/list/damage_icon_parts = list()
var/image/standing
if(wear_suit.icon_override)
standing = image("icon" = wear_suit.icon_override, "icon_state" = "[wear_suit.icon_state]")
- else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name])
- standing = image("icon" = wear_suit.sprite_sheets[species.name], "icon_state" = "[wear_suit.icon_state]")
+ else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[dna.species.name])
+ standing = image("icon" = wear_suit.sprite_sheets[dna.species.name], "icon_state" = "[wear_suit.icon_state]")
else if(FAT in mutations)
if(wear_suit.flags_size & ONESIZEFITSALL)
standing = image("icon" = 'icons/mob/suit_fat.dmi', "icon_state" = "[wear_suit.icon_state]")
@@ -969,7 +969,7 @@ var/global/list/damage_icon_parts = list()
if(wear_suit.blood_DNA)
var/obj/item/clothing/suit/S = wear_suit
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood")
bloodsies.color = wear_suit.blood_color
standing.overlays += bloodsies
@@ -1035,14 +1035,14 @@ var/global/list/damage_icon_parts = list()
if(wear_mask.icon_override)
mask_icon = new(wear_mask.icon_override)
standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
- else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[species.name])
- mask_icon = new(wear_mask.sprite_sheets[species.name])
- standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
+ else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[dna.species.name])
+ mask_icon = new(wear_mask.sprite_sheets[dna.species.name])
+ standing = image("icon" = wear_mask.sprite_sheets[dna.species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
else
standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood")
bloodsies.color = wear_mask.blood_color
standing.overlays += bloodsies
overlays_standing[FACEMASK_LAYER] = standing
@@ -1062,8 +1062,8 @@ var/global/list/damage_icon_parts = list()
//If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc.
var/obj/item/rig/rig = back
standing = rig.mob_icon
- else if(back.sprite_sheets && back.sprite_sheets[species.name])
- standing = image("icon" = back.sprite_sheets[species.name], "icon_state" = "[back.icon_state]")
+ else if(back.sprite_sheets && back.sprite_sheets[dna.species.name])
+ standing = image("icon" = back.sprite_sheets[dna.species.name], "icon_state" = "[back.icon_state]")
else
standing = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]")
@@ -1163,7 +1163,7 @@ var/global/list/damage_icon_parts = list()
var/icon/tail_marking_icon
var/datum/sprite_accessory/body_markings/tail/tail_marking_style
- if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ if(m_styles["tail"] != "None" && (dna.species.bodyflags & HAS_TAIL_MARKINGS))
var/tail_marking = m_styles["tail"]
tail_marking_style = marking_styles_list[tail_marking]
tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
@@ -1172,11 +1172,11 @@ var/global/list/damage_icon_parts = list()
if(body_accessory)
if(body_accessory.try_restrictions(src))
var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state)
- if(species.bodyflags & HAS_SKIN_COLOR)
+ if(dna.species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(skin_colour, body_accessory.blend_mode)
if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
- if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
var/icon/under = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
@@ -1194,14 +1194,14 @@ var/global/list/damage_icon_parts = list()
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
- else if(tail && species.bodyflags & HAS_TAIL) //no tailless tajaran
+ else if(tail && dna.species.bodyflags & HAS_TAIL) //no tailless tajaran
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]_s")
- if(species.bodyflags & HAS_SKIN_COLOR)
+ if(dna.species.bodyflags & HAS_SKIN_COLOR)
tail_s.Blend(skin_colour, ICON_ADD)
if(tail_marking_icon && !tail_marking_style.tails_allowed)
tail_s.Blend(tail_marking_icon, ICON_OVERLAY)
- if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
under.Insert(new/icon(tail_s, dir=SOUTH), dir=SOUTH)
@@ -1230,7 +1230,7 @@ var/global/list/damage_icon_parts = list()
var/icon/tail_marking_icon
var/datum/sprite_accessory/body_markings/tail/tail_marking_style
- if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ if(m_styles["tail"] != "None" && (dna.species.bodyflags & HAS_TAIL_MARKINGS))
var/tail_marking = m_styles["tail"]
tail_marking_style = marking_styles_list[tail_marking]
tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]w_s")
@@ -1238,15 +1238,15 @@ var/global/list/damage_icon_parts = list()
if(body_accessory)
var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state())
- if(species.bodyflags & HAS_SKIN_COLOR)
+ if(dna.species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(skin_colour, body_accessory.blend_mode)
if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
- if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
- if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species))
- under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ if(body_accessory.allowed_species && (dna.species.name in body_accessory.allowed_species))
+ under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay")
under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST)
under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST)
@@ -1255,23 +1255,23 @@ var/global/list/damage_icon_parts = list()
// Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
- if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
- over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ if(body_accessory.allowed_species && (dna.species.name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
+ over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay")
over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
- else if(tail && species.bodyflags & HAS_TAIL)
+ else if(tail && dna.species.bodyflags & HAS_TAIL)
var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]w_s")
- if(species.bodyflags & HAS_SKIN_COLOR)
+ if(dna.species.bodyflags & HAS_SKIN_COLOR)
tailw_s.Blend(skin_colour, ICON_ADD)
if(tail_marking_icon && !tail_marking_style.tails_allowed)
tailw_s.Blend(tail_marking_icon, ICON_OVERLAY)
- if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay")
under.Insert(new/icon(tailw_s, dir=SOUTH), dir=SOUTH)
under.Insert(new/icon(tailw_s, dir=EAST), dir=EAST)
under.Insert(new/icon(tailw_s, dir=WEST), dir=WEST)
@@ -1279,7 +1279,7 @@ var/global/list/damage_icon_parts = list()
overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under)
// Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
- var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay")
over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH)
overlays_standing[TAIL_LAYER] = image(over)
@@ -1314,8 +1314,8 @@ var/global/list/damage_icon_parts = list()
var/icon/icon_file = new(icon_path)
if(wear_suit.icon_state in icon_file.IconStates())
standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
- else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name])
- var/icon_path = "[wear_suit.sprite_sheets[species.name]]"
+ else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[dna.species.name])
+ var/icon_path = "[wear_suit.sprite_sheets[dna.species.name]]"
icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
var/icon/icon_file = new(icon_path)
diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm
index 80ed9fdbffd..5b0ee885ce7 100644
--- a/code/modules/mob/living/carbon/slime/life.dm
+++ b/code/modules/mob/living/carbon/slime/life.dm
@@ -337,7 +337,7 @@
if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men
var/mob/living/carbon/human/H = L
- if(H.species.name == "Slime People")
+ if(isslimeperson(H))
continue
if(!L.canmove) // Only one slime can latch on at a time.
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index d9c7a9f12ef..50b22a2c8ed 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -217,7 +217,7 @@
to_chat(target, "You must follow the orders of [user], and help [user.p_them()] succeed in [user.p_their()] dastardly schemes.")
to_chat(target, "You may not harm other Greyshirt or [user]. However, you do not need to obey other Greyshirts.")
ticker.mode.greyshirts += target.mind
- target.set_species("Human")
+ target.set_species(/datum/species/human)
head_organ.h_style = "Bald"
head_organ.f_style = "Shaved"
target.s_tone = 35
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index bff49e7c527..ee23633f4b6 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -660,14 +660,14 @@
TH.transfer_mob_blood_dna(src)
if(ishuman(src))
var/mob/living/carbon/human/H = src
- if(H.species.blood_color)
- TH.color = H.species.blood_color
+ if(H.dna.species.blood_color)
+ TH.color = H.dna.species.blood_color
else
TH.color = "#A10808"
/mob/living/carbon/human/makeTrail(turf/T)
- if((NO_BLOOD in species.species_traits) || species.exotic_blood || !bleed_rate || bleedsuppress)
+ if((NO_BLOOD in dna.species.species_traits) || dna.species.exotic_blood || !bleed_rate || bleedsuppress)
return
..()
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 6cdffd48f16..a60dfc344ca 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -373,7 +373,7 @@
// is secretly a silicon
if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(H.species && H.species.reagent_tag == PROCESS_SYN)
+ if(H.dna.species && H.dna.species.reagent_tag == PROCESS_SYN)
return 0
if(emagged == 2) //Everyone needs our medicine. (Our medicine is toxins)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 3243061273f..0efaefcce07 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -715,7 +715,7 @@
var/list/blood_dna = H.get_blood_dna_list()
if(blood_dna)
transfer_blood_dna(blood_dna)
- currentBloodColor = H.species.blood_color
+ currentBloodColor = H.dna.species.blood_color
return
/mob/living/simple_animal/bot/mulebot/bot_control_message(command, mob/user, user_turf)
diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm
index 64fe7d05b9b..669271f3ead 100644
--- a/code/modules/mob/living/simple_animal/friendly/diona.dm
+++ b/code/modules/mob/living/simple_animal/friendly/diona.dm
@@ -54,7 +54,7 @@
/mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M)
//Let people pick the little buggers up.
if(M.a_intent == INTENT_HELP)
- if(M.species && M.species.name == "Diona")
+ if(isdiona(M))
to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.")
to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.")
verbs += /mob/living/simple_animal/diona/proc/split
@@ -82,7 +82,7 @@
if(ishuman(C))
var/mob/living/carbon/human/D = C
- if(D.species && D.species.name == "Diona")
+ if(isdiona(D))
choices += C
var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices
@@ -142,7 +142,7 @@
visible_message("[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.")
var/mob/living/carbon/human/diona/adult = new(get_turf(loc))
- adult.set_species("Diona")
+ adult.set_species(/datum/species/diona)
if(istype(loc, /obj/item/holder/diona))
var/obj/item/holder/diona/L = loc
@@ -156,8 +156,7 @@
adult.name = "diona ([rand(100,999)])"
adult.real_name = adult.name
adult.ckey = ckey
- adult.real_name = pick(diona_names) //I hate this being here of all places but unfortunately dna is based on real_name!
- adult.rename_self("diona")
+ adult.real_name = adult.dna.species.get_random_name() //I hate this being here of all places but unfortunately dna is based on real_name!
for(var/obj/item/W in contents)
unEquip(W)
@@ -178,7 +177,7 @@
if(!M || !src)
return
- if(NO_BLOOD in M.species.species_traits)
+ if(NO_BLOOD in M.dna.species.species_traits)
to_chat(src, "That donor has no blood to take.")
return
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 283936acb44..f3e31925228 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -178,7 +178,7 @@
if(ishuman(the_target))
var/mob/living/carbon/human/H = the_target
- if(is_type_in_list(src, H.species.ignored_by))
+ if(is_type_in_list(src, H.dna.species.ignored_by))
return 0
if(istype(the_target, /obj/mecha))
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
index 235a161c595..693ca724ac6 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
@@ -196,7 +196,7 @@ var/global/list/ts_spiderling_list = list()
var/can_poison = 1
if(ishuman(G))
var/mob/living/carbon/human/H = G
- if(!(H.species.reagent_tag & PROCESS_ORG) || (!H.species.tox_mod))
+ if(!(H.dna.species.reagent_tag & PROCESS_ORG) || (!H.dna.species.tox_mod))
can_poison = 0
spider_specialattack(G,can_poison)
else
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index fb62ad3a629..2d024ec786e 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -58,8 +58,8 @@
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src
- if(H.species && H.species.abilities)
- client.verbs |= H.species.abilities
+ if(H.dna.species && H.dna.species.abilities)
+ client.verbs |= H.dna.species.abilities
client.screen += client.void
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index beba84eaa3f..84f9503066a 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1080,9 +1080,6 @@ var/list/slot_equipment_priority = list( \
/mob/proc/activate_hand(selhand)
return
-/mob/proc/get_species()
- return ""
-
/mob/dead/observer/verb/respawn()
set name = "Respawn as NPC"
set category = "Ghost"
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 458138b9db0..93941d6e7d2 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -410,7 +410,7 @@
return 1
var/mob/living/carbon/human/H = attacker
- if(ishuman(H) && is_type_in_list(prey, H.species.allowed_consumed_mobs)) //species eating of other mobs
+ if(ishuman(H) && is_type_in_list(prey, H.dna.species.allowed_consumed_mobs)) //species eating of other mobs
return 1
return 0
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index d06028625b8..d622c78f680 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -1,7 +1,7 @@
/proc/issmall(A)
if(A && istype(A, /mob/living/carbon/human))
var/mob/living/carbon/human/H = A
- if(H.species && H.species.is_small)
+ if(H.dna.species && H.dna.species.is_small)
return 1
return 0
@@ -16,9 +16,9 @@
return 0
/mob/living/carbon/human/isSynthetic()
- if(get_species() == "Machine")
- return 1
- return 0
+ if(ismachine(src))
+ return TRUE
+ return FALSE
/mob/proc/get_screen_colour()
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 274c1602e04..d8bfb77e725 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -395,7 +395,7 @@
var/arrivalmessage = announcer.arrivalmsg
arrivalmessage = replacetext(arrivalmessage,"$name",character.real_name)
arrivalmessage = replacetext(arrivalmessage,"$rank",rank ? "[rank]" : "visitor")
- arrivalmessage = replacetext(arrivalmessage,"$species",character.species.name)
+ arrivalmessage = replacetext(arrivalmessage,"$species",character.dna.species.name)
arrivalmessage = replacetext(arrivalmessage,"$age",num2text(character.age))
arrivalmessage = replacetext(arrivalmessage,"$gender",character.gender == FEMALE ? "Female" : "Male")
announcer.say(";[arrivalmessage]")
@@ -537,9 +537,6 @@
else if(mind.assigned_role == "Mime")
new_character.real_name = pick(mime_names)
new_character.rename_self("mime")
- else if(new_character.species == "Diona")
- new_character.real_name = pick(diona_names) //I hate this being here of all places but unfortunately dna is based on real_name!
- new_character.rename_self("diona")
mind.original = new_character
mind.transfer_to(new_character) //won't transfer key since the mind is not active
@@ -591,19 +588,6 @@
if(!S) return 1
return is_alien_whitelisted(src, S.name) || !config.usealienwhitelist || !(IS_WHITELISTED in S.species_traits)
-/mob/new_player/get_species()
- var/datum/species/chosen_species
- if(client.prefs.species)
- chosen_species = all_species[client.prefs.species]
-
- if(!chosen_species)
- return "Human"
-
- if(is_species_whitelisted(chosen_species) || has_admin_rights())
- return chosen_species.name
-
- return "Human"
-
/mob/new_player/get_gender()
if(!client || !client.prefs) ..()
return client.prefs.gender
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index d57c46e513c..511816124f7 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -223,13 +223,13 @@
if(current_species)
if(current_species.bodyflags & HAS_ICON_SKIN_TONE) //Handling species-specific icon-based skin tones by flagged race.
var/mob/living/carbon/human/H = new
- H.species = current_species
+ H.dna.species = current_species
H.s_tone = s_tone
- H.species.updatespeciescolor(H, 0) //The mob's species wasn't set, so it's almost certainly different than the character's species at the moment. Thus, we need to be owner-insensitive.
+ H.dna.species.updatespeciescolor(H, 0) //The mob's species wasn't set, so it's almost certainly different than the character's species at the moment. Thus, we need to be owner-insensitive.
var/obj/item/organ/external/chest/C = H.get_organ("chest")
- icobase = C.icobase ? C.icobase : C.species.icobase
- if(H.species.bodyflags & HAS_TAIL)
- coloured_tail = H.tail ? H.tail : H.species.tail
+ icobase = C.icobase ? C.icobase : C.dna.species.icobase
+ if(H.dna.species.bodyflags & HAS_TAIL)
+ coloured_tail = H.tail ? H.tail : H.dna.species.tail
qdel(H)
else
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index ad7a8f5cff6..880553a63bc 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -31,7 +31,8 @@
if(href_list["race"])
if(can_change(APPEARANCE_RACE) && (href_list["race"] in valid_species))
- if(owner.change_species(href_list["race"]))
+ var/datum/species/S = all_species[href_list["race"]]
+ if(owner.change_species(S.type))
cut_and_generate_data()
// Species change creates new organs - runtimes ahoy if we forget this
head_organ = owner.get_organ("head")
@@ -44,24 +45,24 @@
if(href_list["skin_tone"])
if(can_change_skin_tone())
var/new_s_tone = null
- if(owner.species.bodyflags & HAS_SKIN_TONE)
+ if(owner.dna.species.bodyflags & HAS_SKIN_TONE)
new_s_tone = input(usr, "Choose your character's skin tone:\n(Light 1 - 220 Dark)", "Skin Tone", owner.s_tone) as num|null
if(isnum(new_s_tone) && can_still_topic(state))
new_s_tone = 35 - max(min(round(new_s_tone), 220),1)
- else if(owner.species.bodyflags & HAS_ICON_SKIN_TONE)
+ else if(owner.dna.species.bodyflags & HAS_ICON_SKIN_TONE)
var/const/MAX_LINE_ENTRIES = 4
- var/prompt = "Choose your character's skin tone: 1-[owner.species.icon_skin_tones.len]\n("
- for(var/i = 1 to owner.species.icon_skin_tones.len)
+ var/prompt = "Choose your character's skin tone: 1-[owner.dna.species.icon_skin_tones.len]\n("
+ for(var/i = 1 to owner.dna.species.icon_skin_tones.len)
if(i > MAX_LINE_ENTRIES && !((i - 1) % MAX_LINE_ENTRIES))
prompt += "\n"
- prompt += "[i] = [owner.species.icon_skin_tones[i]]"
- if(i != owner.species.icon_skin_tones.len)
+ prompt += "[i] = [owner.dna.species.icon_skin_tones[i]]"
+ if(i != owner.dna.species.icon_skin_tones.len)
prompt += ", "
prompt += ")"
new_s_tone = input(usr, prompt, "Skin Tone", owner.s_tone) as num|null
if(isnum(new_s_tone) && can_still_topic(state))
- new_s_tone = max(min(round(new_s_tone), owner.species.icon_skin_tones.len), 1)
+ new_s_tone = max(min(round(new_s_tone), owner.dna.species.icon_skin_tones.len), 1)
if(new_s_tone)
return owner.change_skin_tone(new_s_tone)
@@ -183,9 +184,9 @@
generate_data(check_whitelist, whitelist, blacklist)
var/data[0]
- data["specimen"] = owner.species.name
+ data["specimen"] = owner.dna.species.name
data["gender"] = owner.gender
- data["has_gender"] = owner.species.has_gender
+ data["has_gender"] = owner.dna.species.has_gender
data["change_race"] = can_change(APPEARANCE_RACE)
if(data["change_race"])
var/species[0]
@@ -283,25 +284,25 @@
return owner && (flags & flag)
/datum/nano_module/appearance_changer/proc/can_change_skin_tone()
- return owner && (flags & APPEARANCE_SKIN) && ((owner.species.bodyflags & HAS_SKIN_TONE) || (owner.species.bodyflags & HAS_ICON_SKIN_TONE))
+ return owner && (flags & APPEARANCE_SKIN) && ((owner.dna.species.bodyflags & HAS_SKIN_TONE) || (owner.dna.species.bodyflags & HAS_ICON_SKIN_TONE))
/datum/nano_module/appearance_changer/proc/can_change_skin_color()
- return owner && (flags & APPEARANCE_SKIN) && (owner.species.bodyflags & HAS_SKIN_COLOR)
+ return owner && (flags & APPEARANCE_SKIN) && (owner.dna.species.bodyflags & HAS_SKIN_COLOR)
/datum/nano_module/appearance_changer/proc/can_change_head_accessory()
if(!head_organ)
log_runtime(EXCEPTION("Missing head!"), owner)
return 0
- return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
+ return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY)
/datum/nano_module/appearance_changer/proc/can_change_markings(var/location = "body")
var/marking_flag = HAS_BODY_MARKINGS
- var/body_flags = owner.species.bodyflags
+ var/body_flags = owner.dna.species.bodyflags
if(location == "head")
if(!head_organ)
log_debug("Missing head!")
return 0
- body_flags = head_organ.species.bodyflags
+ body_flags = head_organ.dna.species.bodyflags
marking_flag = HAS_HEAD_MARKINGS
if(location == "body")
marking_flag = HAS_BODY_MARKINGS
@@ -311,13 +312,13 @@
return owner && (flags & APPEARANCE_MARKINGS) && (body_flags & marking_flag)
/datum/nano_module/appearance_changer/proc/can_change_body_accessory()
- return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.species.bodyflags & HAS_TAIL)
+ return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.dna.species.bodyflags & HAS_TAIL)
/datum/nano_module/appearance_changer/proc/can_change_alt_head()
if(!head_organ)
log_debug("Missing head!")
return 0
- return owner && (flags & APPEARANCE_ALT_HEAD) && (head_organ.species.bodyflags & HAS_ALT_HEADS)
+ return owner && (flags & APPEARANCE_ALT_HEAD) && (head_organ.dna.species.bodyflags & HAS_ALT_HEADS)
/datum/nano_module/appearance_changer/proc/cut_and_generate_data()
// Making the assumption that the available species remain constant
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 41799958c4f..ed5b7c1cfd4 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -260,7 +260,7 @@
emag_cooldown = world.time + EMAG_DELAY
if(ishuman(ass)) //Suit checks are in check_ass
var/mob/living/carbon/human/H = ass
- temp_img = icon('icons/obj/butts.dmi', H.species.butt_sprite)
+ temp_img = icon('icons/obj/butts.dmi', H.dna.species.butt_sprite)
else if(istype(ass,/mob/living/silicon/robot/drone))
temp_img = icon('icons/obj/butts.dmi', "drone")
else if(istype(ass,/mob/living/simple_animal/diona))
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 51bf515ca1e..165e75f1875 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -153,10 +153,10 @@
process_fire(target,user,1,params)
-/obj/item/gun/proc/can_trigger_gun(var/mob/living/user)
+/obj/item/gun/proc/can_trigger_gun(mob/living/user)
if(!user.can_use_guns(src))
return 0
- if(restricted_species && restricted_species.len && !(user.get_species() in restricted_species))
+ if(restricted_species && restricted_species.len && !is_type_in_list(user.dna.species, restricted_species))
to_chat(user, "[src] is incompatible with your biology!")
return 0
return 1
diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm
index 7093d587b3c..95e1a586469 100644
--- a/code/modules/projectiles/guns/alien.dm
+++ b/code/modules/projectiles/guns/alien.dm
@@ -11,7 +11,7 @@
can_suppress = 0
var/charge_tick = 0
var/charge_delay = 15
- restricted_species = list("Vox", "Vox Armalis")
+ restricted_species = list(/datum/species/vox)
/obj/item/gun/projectile/automatic/spikethrower/New()
..()
@@ -79,7 +79,7 @@
force = 10
ammo_type = list(/obj/item/ammo_casing/energy/sonic)
cell_type = /obj/item/stock_parts/cell/super
- restricted_species = list("Vox Armalis")
+ restricted_species = list(/datum/species/vox/armalis)
/obj/item/gun/energy/noisecannon/update_icon()
return
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index e38a42ff88f..e19cd1165b5 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -83,7 +83,7 @@
var/blood_color = "#C80000"
if(ishuman(target))
H = target
- blood_color = H.species.blood_color
+ blood_color = H.dna.species.blood_color
new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, blood_color)
if(prob(33))
var/list/shift = list("x" = 0, "y" = 0)
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 3fe2277ed3b..1df45dbe064 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -24,15 +24,15 @@
var/exp_flash = 3
var/exp_fire = 2
-/obj/item/projectile/magic/death/on_hit(var/mob/living/carbon/G)
+/obj/item/projectile/magic/death/on_hit(mob/living/carbon/C)
. = ..()
- if(isliving(G))
- if(G.get_species() == "Machine") //speshul snowfleks deserv speshul treetment
- G.adjustFireLoss(6969) //remember - slimes love fire
+ if(isliving(C))
+ if(ismachine(C)) //speshul snowfleks deserv speshul treetment
+ C.adjustFireLoss(6969) //remember - slimes love fire
else
- G.death()
+ C.death()
- visible_message("[G] topples backwards as the death bolt impacts [G.p_them()]!")
+ visible_message("[C] topples backwards as the death bolt impacts [C.p_them()]!")
/obj/item/projectile/magic/fireball/Range()
var/turf/T1 = get_step(src,turn(dir, -45))
@@ -225,20 +225,17 @@ proc/wabbajack(mob/living/M)
else new_mob = new /mob/living/simple_animal/chick(M.loc)
new_mob.universal_speak = 1
if("human")
- new_mob = new /mob/living/carbon/human/human(M.loc)
+ new_mob = new /mob/living/carbon/human(M.loc)
// Include standard, whitelisted, and monkey species...
- var/list/new_species = list("Human","Tajaran","Skrell","Unathi","Diona","Vulpkanin")
- new_species |= whitelisted_species
- for(var/SN in all_species)
- var/datum/species/S = all_species[SN]
- if(S.greater_form) // Monkeys
- new_species |= SN
- new_species -= "Vox Armalis" // ... but not Armalis. They're not really designed to be playable
- new_species |= "Golem" // Also, golems, sure, why not
- var/picked_species = pick(new_species)
+ var/list/new_species = list()
+ for(var/datum/species/S in subtypesof(/datum/species))
+ if(istype(S, /datum/species/vox/armalis))
+ continue
+ new_species.Add(S)
var/mob/living/carbon/human/H = new_mob
- H.set_species(picked_species)
- randomize = picked_species
+ var/datum/species/S = pick(new_species)
+ H.set_species(S)
+ randomize = initial(S.name)
var/datum/preferences/A = new() //Randomize appearance for the human
A.copy_to(new_mob)
else
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 2c774b7f3dd..2003e78b780 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -133,7 +133,7 @@
var/mob/living/M = target
if(ishuman(target))
var/mob/living/carbon/human/H = M
- if(IS_PLANT in H.species.species_traits)
+ if(IS_PLANT in H.dna.species.species_traits)
if(prob(15))
M.apply_effect((rand(30,80)),IRRADIATE)
M.Weaken(5)
@@ -166,7 +166,7 @@
var/mob/M = target
if(ishuman(target)) //These rays make plantmen fat.
var/mob/living/carbon/human/H = M
- if(IS_PLANT in H.species.species_traits)
+ if(IS_PLANT in H.dna.species.species_traits)
H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL)
else if(iscarbon(target))
M.show_message("The radiation beam dissipates harmlessly through your body.")
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 83a000fa693..73a591f9ddb 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -209,17 +209,17 @@ var/const/INGEST = 2
//Check if this mob's species is set and can process this type of reagent
var/can_process = 0
//If we somehow avoided getting a species or reagent_tag set, we'll assume we aren't meant to process ANY reagents (CODERS: SET YOUR SPECIES AND TAG!)
- if(H.species && H.species.reagent_tag)
- if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
+ if(H.dna.species && H.dna.species.reagent_tag)
+ if((R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
can_process = 1
- if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
+ if((R.process_flags & ORGANIC) && (H.dna.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
can_process = 1
//Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
- if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
+ if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_DUO))
can_process = 1
//If handle_reagents returns 0, it's doing the reagent removal on its own
- var/species_handled = !(H.species.handle_reagents(H, R))
+ var/species_handled = !(H.dna.species.handle_reagents(H, R))
can_process = can_process && !species_handled
//If the mob can't process it, remove the reagent at it's normal rate without doing any addictions, overdoses, or on_mob_life() for the reagent
if(can_process == 0)
@@ -481,13 +481,13 @@ var/const/INGEST = 2
if(ishuman(M))
var/mob/living/carbon/human/H = M
//Check if this mob's species is set and can process this type of reagent
- if(H.species && H.species.reagent_tag)
- if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
+ if(H.dna.species && H.dna.species.reagent_tag)
+ if((R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
can_process = 1
- if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
+ if((R.process_flags & ORGANIC) && (H.dna.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
can_process = 1
//Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
- if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
+ if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_DUO))
can_process = 1
//We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
else
diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm
index bdabfd21956..7426844e292 100644
--- a/code/modules/reagents/chemistry/reagents/food.dm
+++ b/code/modules/reagents/chemistry/reagents/food.dm
@@ -31,7 +31,7 @@
if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
if(prob(50))
M.adjustBruteLoss(-1)
- if(!(NO_BLOOD in H.species.species_traits))//do not restore blood on things with no blood by nature.
+ if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature.
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
H.blood_volume += 0.4
..()
@@ -66,7 +66,7 @@
M.satiety += 30
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!(NO_BLOOD in H.species.species_traits))//do not restore blood on things with no blood by nature.
+ if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature.
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
H.blood_volume += 0.5
..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index c9f89743e7c..f603d5eb0d1 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -221,7 +221,7 @@
M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
if(ishuman(M) && prob(33))
var/mob/living/carbon/human/H = M
- if(!(NO_BLOOD in H.species.species_traits))//do not restore blood on things with no blood by nature.
+ if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature.
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
H.blood_volume += 1
..()
diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm
index a67fcd0f751..fdddea44bd2 100644
--- a/code/modules/reagents/chemistry/reagents/misc.dm
+++ b/code/modules/reagents/chemistry/reagents/misc.dm
@@ -155,7 +155,7 @@
/datum/reagent/iron/on_mob_life(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!H.species.exotic_blood && !(NO_BLOOD in H.species.species_traits))
+ if(!H.dna.species.exotic_blood && !(NO_BLOOD in H.dna.species.species_traits))
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
H.blood_volume += 0.8
..()
@@ -313,8 +313,8 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
- head_organ.h_style = random_hair_style(H.gender, head_organ.species.name)
- head_organ.f_style = random_facial_hair_style(H.gender, head_organ.species.name)
+ head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name)
+ head_organ.f_style = random_facial_hair_style(H.gender, head_organ.dna.species.name)
H.update_hair()
H.update_fhair()
..()
@@ -335,14 +335,14 @@
var/datum/sprite_accessory/tmp_hair_style = hair_styles_full_list["Very Long Hair"]
var/datum/sprite_accessory/tmp_facial_hair_style = facial_hair_styles_list["Very Long Beard"]
- if(head_organ.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them.
+ if(head_organ.dna.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them.
head_organ.h_style = "Very Long Hair"
else //Otherwise, give them a random hair style.
- head_organ.h_style = random_hair_style(H.gender, head_organ.species.name)
- if(head_organ.species.name in tmp_facial_hair_style.species_allowed) //If 'Very Long Beard' is a style the person's species can have, give it to them.
+ head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name)
+ if(head_organ.dna.species.name in tmp_facial_hair_style.species_allowed) //If 'Very Long Beard' is a style the person's species can have, give it to them.
head_organ.f_style = "Very Long Beard"
else //Otherwise, give them a random facial hair style.
- head_organ.f_style = random_facial_hair_style(H.gender, head_organ.species.name)
+ head_organ.f_style = random_facial_hair_style(H.gender, head_organ.dna.species.name)
H.update_hair()
H.update_fhair()
if(!H.wear_mask || H.wear_mask && !istype(H.wear_mask, /obj/item/clothing/mask/fakemoustache))
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index 7bff61218c6..a3fc113339e 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -61,12 +61,12 @@
/datum/reagent/slimetoxin/on_mob_life(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/human = M
- if(human.species.name != "Shadow")
+ if(!isshadowperson(human))
to_chat(M, "Your flesh rapidly mutates!")
to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
to_chat(M, "Your body reacts violently to light. However, it naturally heals in darkness.")
to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
+ human.set_species(/datum/species/shadow)
..()
/datum/reagent/aslimetoxin
@@ -217,7 +217,7 @@
if(method == TOUCH)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.get_species() == "Grey")
+ if(isgrey(H))
return
if(volume > 25)
@@ -246,7 +246,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.get_species() == "Grey")
+ if(isgrey(H))
return
if(volume >=10 && volume <=25)
@@ -961,7 +961,7 @@
C.adjustToxLoss(lethality)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(IS_PLANT in H.species.species_traits) //plantmen take a LOT of damage
+ if(IS_PLANT in H.dna.species.species_traits) //plantmen take a LOT of damage
H.adjustToxLoss(50)
..()
else if(istype(M, /mob/living/simple_animal/diona)) //plantmen monkeys (diona) take EVEN MORE damage
@@ -995,7 +995,7 @@
C.adjustToxLoss(2)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.get_species() == "Kidan") //RIP
+ if(iskidan(H)) //RIP
H.adjustToxLoss(20)
/datum/reagent/capulettium
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index cd338cb048d..199edb72fb4 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -29,7 +29,7 @@
var/mob/living/carbon/human/H = M
- if(H.get_species() != "Grey") //God this is so gross I hate it.
+ if(!isgrey(H)) //God this is so gross I hate it.
return
if(volume > 25)
@@ -58,7 +58,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.get_species() != "Grey")
+ if(!isgrey(H))
return
if(volume < 10)
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 715f3e9837b..1ae29143496 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -84,7 +84,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.species.species_traits)//if you don't feel pain, you can hold still
+ if(NO_PAIN in M.dna.species.species_traits)//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
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index 2e8a3b85300..42db2e97da1 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -32,7 +32,7 @@
if(ishuman(target))
var/mob/living/carbon/human/H = target
var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
- if(target.get_species() == "Machine")
+ if(ismachine(target))
// RIP bi-centennial man
return 0
if(!affected)
@@ -76,7 +76,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(affected)
return 0
- var/list/organ_data = target.species.has_limbs["[target_zone]"]
+ var/list/organ_data = target.dna.species.has_limbs["[target_zone]"]
return !isnull(organ_data)
/datum/surgery_step/limb/attach
@@ -233,7 +233,7 @@
for(var/part_name in L.part)
if(!isnull(target.get_organ(part_name)))
continue
- var/list/organ_data = target.species.has_limbs["[part_name]"]
+ var/list/organ_data = target.dna.species.has_limbs["[part_name]"]
if(!organ_data)
continue
// This will break if there's more than one stump ever
diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm
index 305bbb2c603..fe1adce42fb 100644
--- a/code/modules/surgery/organs/augments_eyes.dm
+++ b/code/modules/surgery/organs/augments_eyes.dm
@@ -33,7 +33,7 @@
var/mob/living/carbon/human/H = HA
if(!istype(H))
H = owner
- var/icon/cybereyes_icon = new /icon('icons/mob/human_face.dmi', H.species.eyes)
+ var/icon/cybereyes_icon = new /icon('icons/mob/human_face.dmi', H.dna.species.eyes)
cybereyes_icon.Blend(eye_colour, ICON_ADD) // Eye implants override native DNA eye color
return cybereyes_icon
diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm
index fecbdb05287..2a7057516f9 100644
--- a/code/modules/surgery/organs/blood.dm
+++ b/code/modules/surgery/organs/blood.dm
@@ -18,7 +18,7 @@
/mob/living/carbon/human/handle_blood()
var/list/blood_data = get_blood_data(get_blood_id())//PROCCEPTION
- if(NO_BLOOD in species.species_traits)
+ if(NO_BLOOD in dna.species.species_traits)
bleed_rate = 0
return
@@ -43,14 +43,14 @@
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
if(prob(5))
to_chat(src, "You feel [word].")
- apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1), species.blood_damage_type)
+ apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1), dna.species.blood_damage_type)
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
- apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1), species.blood_damage_type)
+ apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1), dna.species.blood_damage_type)
if(prob(5))
EyeBlurry(6)
to_chat(src, "You feel very [word].")
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
- apply_damage_type(5, species.blood_damage_type)
+ apply_damage_type(5, dna.species.blood_damage_type)
if(prob(15))
Paralyse(rand(1,3))
to_chat(src, "You feel extremely [word].")
@@ -99,9 +99,9 @@
add_splatter_floor(loc, 1)
/mob/living/carbon/human/bleed(amt)
- if(!(NO_BLOOD in species.species_traits))
+ if(!(NO_BLOOD in dna.species.species_traits))
..()
- if(species.exotic_blood)
+ if(dna.species.exotic_blood)
var/datum/reagent/R = chemical_reagents_list[get_blood_id()]
if(istype(R) && isturf(loc))
R.reaction_turf(get_turf(src), amt)
@@ -186,7 +186,7 @@
blood_data["blood_type"] = copytext(src.dna.b_type,1,0)
blood_data["gender"] = gender
blood_data["real_name"] = real_name
- blood_data["blood_color"] = species.blood_color
+ blood_data["blood_color"] = dna.species.blood_color
blood_data["factions"] = faction
return blood_data
@@ -199,9 +199,9 @@
return "blood"
/mob/living/carbon/human/get_blood_id()
- if(species.exotic_blood)//some races may bleed water..or kethcup..
- return species.exotic_blood
- else if((NO_BLOOD in species.species_traits) || (NOCLONE in mutations))
+ if(dna.species.exotic_blood)//some races may bleed water..or kethcup..
+ return dna.species.exotic_blood
+ else if((NO_BLOOD in dna.species.species_traits) || (NOCLONE in mutations))
return
return "blood"
@@ -279,7 +279,7 @@
B.layer = BELOW_MOB_LAYER //So the blood lands ontop of things like posters, windows, etc.
/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
- if(!(NO_BLOOD in species.species_traits))
+ if(!(NO_BLOOD in dna.species.species_traits))
..()
/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index bce0f0f8046..51d73fc9873 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -20,7 +20,7 @@
var/mob/living/carbon/human/H = HA
if(!istype(H))
H = owner
- var/icon/eyes_icon = new /icon('icons/mob/human_face.dmi', H.species.eyes)
+ var/icon/eyes_icon = new /icon('icons/mob/human_face.dmi', H.dna.species.eyes)
eyes_icon.Blend(eye_colour, ICON_ADD)
return eyes_icon
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 59643723d78..bd7cca63779 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -85,7 +85,7 @@
/obj/item/organ/internal/heart/cursed/attack(mob/living/carbon/human/H, mob/living/carbon/human/user, obj/target)
if(H == user && istype(H))
- if(NO_BLOOD in H.species.species_traits)
+ if(NO_BLOOD in H.dna.species.species_traits)
to_chat(H, "\The [src] is not compatible with your form!")
return
playsound(user,'sound/effects/singlebeat.ogg', 40, 1)
@@ -98,7 +98,7 @@
if(world.time > (last_pump + pump_delay))
if(ishuman(owner) && owner.client) //While this entire item exists to make people suffer, they can't control disconnects.
var/mob/living/carbon/human/H = owner
- if(!(NO_BLOOD in H.species.species_traits))
+ if(!(NO_BLOOD in H.dna.species.species_traits))
H.blood_volume = max(H.blood_volume - blood_loss, 0)
to_chat(H, "You have to keep pumping your blood!")
if(H.client)
@@ -131,7 +131,7 @@
var/mob/living/carbon/human/H = owner
if(istype(H))
- if(!(NO_BLOOD in H.species.species_traits))
+ if(!(NO_BLOOD in H.dna.species.species_traits))
H.blood_volume = min(H.blood_volume + cursed_heart.blood_loss*0.5, BLOOD_VOLUME_NORMAL)
if(owner.client)
owner.client.color = ""
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index 99bc996dce2..3c2b7e1cbd1 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -154,12 +154,12 @@
if(safe_nitro_min)
if(N2_pp < safe_nitro_min)
gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath.nitrogen)
- H.throw_alert("nitro", /obj/screen/alert/not_enough_nitro)
+ H.throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro)
else
H.failed_last_breath = FALSE
H.adjustOxyLoss(-5)
gas_breathed = breath.nitrogen
- H.clear_alert("nitro")
+ H.clear_alert("not_enough_nitro")
//Exhale
breath.nitrogen -= gas_breathed
@@ -271,11 +271,11 @@
var/breath_temperature = breath.temperature
var/species_traits = list()
- if(H && H.species && H.species.species_traits)
- species_traits = H.species.species_traits
+ if(H && H.dna.species && H.dna.species.species_traits)
+ species_traits = H.dna.species.species_traits
if(!(COLDRES in H.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
- var/CM = abs(H.species.coldmod)
+ var/CM = abs(H.dna.species.coldmod)
var/TC = 0
if(breath_temperature < cold_level_3_threshold)
TC = cold_level_3_damage
@@ -291,7 +291,7 @@
to_chat(H, "You feel [cold_message] in your [name]!")
if(!(HEATRES in H.mutations) && !(RESISTHOT in species_traits)) // HEAT DAMAGE
- var/HM = abs(H.species.heatmod)
+ var/HM = abs(H.dna.species.heatmod)
var/TH = 0
if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold)
TH = heat_level_1_damage
@@ -315,7 +315,6 @@
name = "plasma filter"
desc = "A spongy rib-shaped mass for filtering plasma from the air."
icon_state = "lungs-plasma"
- species = "Plasmaman"
safe_oxygen_min = 0 //We don't breath this
safe_toxins_min = 16 //We breathe THIS!
@@ -324,7 +323,6 @@
/obj/item/organ/internal/lungs/vox
name = "Vox lungs"
desc = "They're filled with dust....wow."
- species = "Vox"
safe_oxygen_min = 0 //We don't breathe this
safe_oxygen_max = 1 //This is toxic to us
@@ -333,7 +331,6 @@
/obj/item/organ/internal/lungs/drask
icon = 'icons/obj/surgery_drask.dmi'
- species = "Drask"
cold_message = "an invigorating coldness"
cold_level_3_threshold = 60
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index c2487503bfa..991a5d252ce 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -19,7 +19,6 @@
// links chemical IDs to number of ticks for which they'll stay in the blood
germ_level = 0
var/datum/dna/dna
- var/datum/species/species = "Human"
// Stuff for tracking if this is on a tile with an open freezer or not
var/last_freezer_update_time = 0
@@ -44,15 +43,13 @@
/obj/item/organ/proc/update_health()
return
-/obj/item/organ/New(var/mob/living/carbon/holder)
+/obj/item/organ/New(mob/living/carbon/holder, datum/species/species_override = null)
..(holder)
if(!max_damage)
max_damage = min_broken_damage * 2
if(istype(holder))
- species = all_species["Human"]
if(holder.dna)
dna = holder.dna.Clone()
- species = all_species[dna.species]
else
log_runtime(EXCEPTION("[holder] spawned without a proper DNA."), holder)
var/mob/living/carbon/human/H = holder
@@ -62,8 +59,9 @@
blood_DNA = list()
blood_DNA[dna.unique_enzymes] = dna.b_type
else
- if(istext(species))
- species = all_species[species]
+ dna = new /datum/dna(null)
+ if(species_override)
+ dna.species = new species_override
/obj/item/organ/proc/set_dna(var/datum/dna/new_dna)
if(new_dna)
@@ -93,7 +91,7 @@
return
//Process infections
- if(is_robotic() || sterile || (owner && (IS_PLANT in owner.species.species_traits)))
+ if(is_robotic() || sterile || (owner && (IS_PLANT in owner.dna.species.species_traits)))
germ_level = 0
return
@@ -155,7 +153,7 @@
germ_level++
if(germ_level >= INFECTION_LEVEL_ONE)
- var/fever_temperature = (owner.species.heat_level_1 - owner.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.species.body_temperature
+ var/fever_temperature = (owner.dna.species.heat_level_1 - owner.dna.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.dna.species.body_temperature
owner.bodytemperature += between(0, (fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, fever_temperature - owner.bodytemperature)
if(germ_level >= INFECTION_LEVEL_TWO)
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index bd064a7d062..04ce880d5f5 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -105,13 +105,12 @@
/obj/item/organ/external/New(var/mob/living/carbon/holder)
..()
var/mob/living/carbon/human/H = holder
- icobase = species.icobase
- deform = species.deform
+ icobase = dna.species.icobase
+ deform = dna.species.deform
if(istype(H))
replaced(H)
sync_colour_to_human(H)
- spawn(1)
- get_icon()
+ get_icon()
/obj/item/organ/external/replaced(var/mob/living/carbon/human/target)
owner = target
@@ -279,7 +278,8 @@ This function completely restores a damaged organ to perfect condition.
for(var/obj/item/organ/external/EO in contents)
EO.rejuvenate()
- owner.updatehealth()
+ if(owner)
+ owner.updatehealth()
update_icon()
if(!owner)
processing_objects |= src
@@ -328,7 +328,7 @@ Note that amputating the affected organ does in fact remove the infection from t
*/
/obj/item/organ/external/proc/update_germs()
- if(is_robotic() || (IS_PLANT in owner.species.species_traits)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs.
+ if(is_robotic() || (IS_PLANT in owner.dna.species.species_traits)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs.
germ_level = 0
return
@@ -400,7 +400,7 @@ Note that amputating the affected organ does in fact remove the infection from t
fracture()
/obj/item/organ/external/proc/check_for_internal_bleeding(damage)
- if(NO_BLOOD in owner.species.species_traits)
+ if(NO_BLOOD in owner.dna.species.species_traits)
return
var/local_damage = brute_dam + damage
if(damage > 15 && local_damage > 30 && prob(damage) && !is_robotic())
@@ -449,7 +449,7 @@ Note that amputating the affected organ does in fact remove the infection from t
****************************************************/
//Handles dismemberment
-/obj/item/organ/external/proc/droplimb(var/clean, var/disintegrate, var/ignore_children, var/nodamage)
+/obj/item/organ/external/proc/droplimb(clean, disintegrate, ignore_children, nodamage)
if(cannot_amputate || !owner)
return
@@ -494,16 +494,17 @@ Note that amputating the affected organ does in fact remove the infection from t
parent.receive_damage(total_brute, total_burn, ignore_resists = TRUE) //Transfer the full damage to the parent, bypass limb damage reduction.
parent = null
- spawn(1)
- if(victim)
- victim.updatehealth()
- victim.UpdateDamageIcon()
- victim.regenerate_icons()
dir = 2
+
+ if(victim)
+ victim.updatehealth()
+ victim.UpdateDamageIcon()
+ victim.regenerate_icons()
+
switch(disintegrate)
if(DROPLIMB_SHARP)
compile_icon()
- add_blood(victim.blood_DNA, victim.species.blood_color)
+ add_blood(victim.blood_DNA, victim.dna.species.blood_color)
var/matrix/M = matrix()
M.Turn(rand(180))
src.transform = M
@@ -513,7 +514,7 @@ Note that amputating the affected organ does in fact remove the infection from t
dropped_part.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
dir = 2
brute_dam = 0
- burn_dam = 0 //Reset the damage on the limb; the damage should have transferred to the parent; we don't want extra damage being re-applie when then limb is re-attached
+ burn_dam = 0 //Reset the damage on the limb; the damage should have transferred to the parent; we don't want extra damage being re-applied when then limb is re-attached
return dropped_part
else
qdel(src) // If you flashed away to ashes, YOU FLASHED AWAY TO ASHES
@@ -606,7 +607,7 @@ Note that amputating the affected organ does in fact remove the infection from t
"You hear a loud cracking sound coming from \the [owner].",\
"Something feels like it shattered in your [name]!",\
"You hear a sickening crack.")
- if(owner.species && !(NO_PAIN in owner.species.species_traits))
+ if(owner.dna.species && !(NO_PAIN in owner.dna.species.species_traits))
owner.emote("scream")
status |= ORGAN_BROKEN
diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm
index d1c1070b19d..43d699c0408 100644
--- a/code/modules/surgery/organs/organ_icon.dm
+++ b/code/modules/surgery/organs/organ_icon.dm
@@ -16,7 +16,7 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/proc/change_organ_icobase(var/new_icobase, var/new_deform, var/owner_sensitive) //Change the icobase/deform of this organ. If owner_sensitive is set, that means the proc won't mess with frankenstein limbs.
if(owner_sensitive) //This and the below statements mean that the icobase/deform will only get updated if the limb is the same species as and is owned by the mob it's attached to.
- if(species && owner.species && species.name != owner.species.name)
+ if(dna.species && owner.dna.species && dna.species.name != owner.dna.species.name)
return
if(dna.unique_enzymes != owner.dna.unique_enzymes) // This isn't MY arm
return
@@ -25,31 +25,31 @@ var/global/list/limb_icon_cache = list()
deform = new_deform ? new_deform : deform
/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/H)
- if(is_robotic() && !(species && species.name == "Machine")) //machine people get skin color
+ if(is_robotic() && !istype(dna.species, /datum/species/machine)) //machine people get skin color
return
- if(species && H.species && species.name != H.species.name)
+ if(dna.species && H.dna.species && dna.species.name != H.dna.species.name)
return
if(dna.unique_enzymes != H.dna.unique_enzymes) // This isn't MY arm
- if(!(H.species.bodyflags & HAS_ICON_SKIN_TONE))
+ if(!(H.dna.species.bodyflags & HAS_ICON_SKIN_TONE))
sync_colour_to_dna()
return
- if(!isnull(H.s_tone) && ((H.species.bodyflags & HAS_SKIN_TONE) || (H.species.bodyflags & HAS_ICON_SKIN_TONE)))
+ if(!isnull(H.s_tone) && ((H.dna.species.bodyflags & HAS_SKIN_TONE) || (H.dna.species.bodyflags & HAS_ICON_SKIN_TONE)))
s_col = null
s_tone = H.s_tone
- if(H.species.bodyflags & HAS_SKIN_COLOR)
+ if(H.dna.species.bodyflags & HAS_SKIN_COLOR)
s_tone = null
s_col = H.skin_colour
- if(H.species.bodyflags & HAS_ICON_SKIN_TONE)
+ if(H.dna.species.bodyflags & HAS_ICON_SKIN_TONE)
var/obj/item/organ/external/chest/C = H.get_organ("chest")
change_organ_icobase(C.icobase, C.deform)
/obj/item/organ/external/proc/sync_colour_to_dna()
if(is_robotic())
return
- if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && ((species.bodyflags & HAS_SKIN_TONE) || (species.bodyflags & HAS_ICON_SKIN_TONE)))
+ if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && ((dna.species.bodyflags & HAS_SKIN_TONE) || (dna.species.bodyflags & HAS_ICON_SKIN_TONE)))
s_col = null
s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE)
- if(species.bodyflags & HAS_SKIN_COLOR)
+ if(dna.species.bodyflags & HAS_SKIN_COLOR)
s_tone = null
s_col = rgb(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B))
@@ -64,11 +64,9 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/proc/get_icon(skeletal, fat)
// Kasparrov, you monster
- if(istext(species))
- species = all_species[species]
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name]")
- if(species && species.name == "Machine") //snowflake for IPC's, sorry.
+ if(istype(dna.species, /datum/species/machine)) //snowflake for IPC's, sorry.
if(s_col)
mob_icon.Blend(s_col, ICON_ADD)
else
@@ -101,13 +99,13 @@ var/global/list/limb_icon_cache = list()
if(!owner)
return
- if(species.has_organ["eyes"])
+ if(dna.species.has_organ["eyes"])
var/icon/eyes_icon = owner.get_eyecon()
if(eyes_icon)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
overlays |= eyes_icon
- if(owner.lip_style && (LIPS in species.species_traits))
+ if(owner.lip_style && (LIPS in dna.species.species_traits))
var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s")
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
@@ -115,7 +113,7 @@ var/global/list/limb_icon_cache = list()
var/head_marking = owner.m_styles["head"]
if(head_marking && head_marking != "None")
var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
- if(head_marking_style && head_marking_style.species_allowed && (species.name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head")
+ if(head_marking_style && head_marking_style.species_allowed && (dna.species.name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head")
var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
if(head_marking_style.do_colouration)
h_marking_s.Blend(owner.m_colours["head"], ICON_ADD)
@@ -123,7 +121,7 @@ var/global/list/limb_icon_cache = list()
if(ha_style)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style]
- if(head_accessory_style && head_accessory_style.species_allowed && (species.name in head_accessory_style.species_allowed))
+ if(head_accessory_style && head_accessory_style.species_allowed && (dna.species.name in head_accessory_style.species_allowed))
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
if(head_accessory_style.do_colouration)
head_accessory_s.Blend(headacc_colour, ICON_ADD)
@@ -131,9 +129,9 @@ var/global/list/limb_icon_cache = list()
if(f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
- if(facial_hair_style && ((facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed)) || (src.species.bodyflags & ALL_RPARTS)))
+ if(facial_hair_style && ((facial_hair_style.species_allowed && (dna.species.name in facial_hair_style.species_allowed)) || (dna.species.bodyflags & ALL_RPARTS)))
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
- if(species.name == "Slime People") // I am el worstos
+ if(istype(dna.species, /datum/species/slime)) // I am el worstos
facial_s.Blend("[owner.skin_colour]A0", ICON_AND) //A0 = 160 alpha.
else if(facial_hair_style.do_colouration)
facial_s.Blend(facial_colour, ICON_ADD)
@@ -141,9 +139,9 @@ var/global/list/limb_icon_cache = list()
if(h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_full_list[h_style]
- if(hair_style && ((species.name in hair_style.species_allowed) || (src.species.bodyflags & ALL_RPARTS)))
+ if(hair_style && ((dna.species.name in hair_style.species_allowed) || (dna.species.bodyflags & ALL_RPARTS)))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
- if(species.name == "Slime People") // I am el worstos
+ if(istype(dna.species, /datum/species/slime)) // I am el worstos
hair_s.Blend("[owner.skin_colour]A0", ICON_AND) //A0 = 160 alpha.
else if(hair_style.do_colouration)
hair_s.Blend(hair_colour, ICON_ADD)
@@ -184,7 +182,7 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/chest/get_icon_state(skeletal)
var/result = ..()
- if(fat && !skeletal && !is_robotic() && (CAN_BE_FAT in species.species_traits))
+ if(fat && !skeletal && !is_robotic() && (CAN_BE_FAT in dna.species.species_traits))
result[2] += "_fat"
return result
diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm
index e3386aef1b3..4863bd63901 100644
--- a/code/modules/surgery/organs/pain.dm
+++ b/code/modules/surgery/organs/pain.dm
@@ -34,7 +34,7 @@ mob/living/carbon/human/proc/custom_pain(message)
if(stat >= UNCONSCIOUS)
return
- if(NO_PAIN in species.species_traits)
+ if(NO_PAIN in dna.species.species_traits)
return
if(reagents.has_reagent("morphine"))
return
@@ -54,7 +54,7 @@ mob/living/carbon/human/proc/handle_pain()
if(stat >= UNCONSCIOUS)
return
- if(NO_PAIN in species.species_traits)
+ if(NO_PAIN in dna.species.species_traits)
return
if(reagents.has_reagent("morphine"))
return
diff --git a/code/modules/surgery/organs/subtypes/abductor.dm b/code/modules/surgery/organs/subtypes/abductor.dm
index 6fd234bc501..58efd0094ed 100644
--- a/code/modules/surgery/organs/subtypes/abductor.dm
+++ b/code/modules/surgery/organs/subtypes/abductor.dm
@@ -1,4 +1,3 @@
/obj/item/organ/internal/eyes/abductor
name = "abductor eyeballs"
- dark_view = 3
- species = "Abductor"
+ dark_view = 3
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm
index 951ca862317..be05b2917c3 100644
--- a/code/modules/surgery/organs/subtypes/diona.dm
+++ b/code/modules/surgery/organs/subtypes/diona.dm
@@ -6,7 +6,6 @@
amputation_point = "trunk"
encased = null
gendered_icon = 0
- species = "Diona"
/obj/item/organ/external/groin/diona
name = "fork"
@@ -14,7 +13,6 @@
cannot_break = 1
amputation_point = "lower trunk"
gendered_icon = 0
- species = "Diona"
/obj/item/organ/external/arm/diona
name = "left upper tendril"
@@ -22,7 +20,6 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "upper left trunk"
- species = "Diona"
/obj/item/organ/external/arm/right/diona
name = "right upper tendril"
@@ -30,7 +27,6 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "upper right trunk"
- species = "Diona"
/obj/item/organ/external/leg/diona
name = "left lower tendril"
@@ -38,7 +34,6 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "lower left fork"
- species = "Diona"
/obj/item/organ/external/leg/right/diona
name = "right lower tendril"
@@ -46,7 +41,6 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "lower right fork"
- species = "Diona"
/obj/item/organ/external/foot/diona
name = "left foot"
@@ -54,7 +48,6 @@
min_broken_damage = 10
cannot_break = 1
amputation_point = "branch"
- species = "Diona"
/obj/item/organ/external/foot/right/diona
name = "right foot"
@@ -62,19 +55,16 @@
min_broken_damage = 10
cannot_break = 1
amputation_point = "branch"
- species = "Diona"
/obj/item/organ/external/hand/diona
name = "left grasper"
cannot_break = 1
amputation_point = "branch"
- species = "Diona"
/obj/item/organ/external/hand/right/diona
name = "right grasper"
cannot_break = 1
amputation_point = "branch"
- species = "Diona"
/obj/item/organ/external/head/diona
max_damage = 50
@@ -83,16 +73,6 @@
encased = null
amputation_point = "upper trunk"
gendered_icon = 0
- species = "Diona"
-
-//DIONA ORGANS.
-/* /obj/item/organ/external/diona/removed()
- var/mob/living/carbon/human/H = owner
- ..()
- if(!istype(H) || !H.bodyparts || !H.bodyparts.len)
- H.death()
- if(prob(50) && spawn_diona_nymph_from_organ(src))
- qdel(src) */
/obj/item/organ/diona/process()
return
@@ -101,31 +81,26 @@
name = "neural strata"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- species = "Diona"
/obj/item/organ/internal/brain/diona // Turns into a nymph instantly, no transplanting possible.
name = "gas bladder"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- species = "Diona"
/obj/item/organ/internal/kidneys/diona // Turns into a nymph instantly, no transplanting possible.
name = "polyp segment"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- species = "Diona"
/obj/item/organ/internal/appendix/diona // Turns into a nymph instantly, no transplanting possible.
name = "anchoring ligament"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- species = "Diona"
/obj/item/organ/internal/eyes/diona // Turns into a nymph instantly, no transplanting possible.
name = "receptor node"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
- species = "Diona"
//TODO:Make absorb rads on insert
@@ -133,15 +108,4 @@
name = "nutrient vessel"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
- alcohol_intensity = 0.5
- species = "Diona"
-
-//TODO:Make absorb light on insert.
-
-/*/obj/item/organ/diona/removed(var/mob/living/user)
- var/mob/living/carbon/human/H = owner
- ..()
- if(!istype(H) || !H.bodyparts || !H.bodyparts.len)
- H.death()
- if(prob(50) && spawn_diona_nymph_from_organ(src))
- qdel(src) */
+ alcohol_intensity = 0.5
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/drask.dm b/code/modules/surgery/organs/subtypes/drask.dm
index 8560d2408ec..6e11cf2993e 100644
--- a/code/modules/surgery/organs/subtypes/drask.dm
+++ b/code/modules/surgery/organs/subtypes/drask.dm
@@ -4,31 +4,26 @@
icon = 'icons/obj/surgery_drask.dmi'
icon_state = "innards"
desc = "A greenish, slightly translucent organ. It is extremely cold."
- species = "Drask"
/obj/item/organ/internal/heart/drask
name = "drask heart"
icon = 'icons/obj/surgery_drask.dmi'
parent_organ = "head"
- species = "Drask"
/obj/item/organ/internal/liver/drask
name = "metabolic strainer"
icon = 'icons/obj/surgery_drask.dmi'
icon_state = "kidneys"
alcohol_intensity = 0.8
- species = "Drask"
/obj/item/organ/internal/brain/drask
icon = 'icons/obj/surgery_drask.dmi'
icon_state = "brain2"
mmi_icon = 'icons/obj/surgery_drask.dmi'
mmi_icon_state = "mmi_full"
- species = "Drask"
/obj/item/organ/internal/eyes/drask
name = "drask eyeballs"
icon = 'icons/obj/surgery_drask.dmi'
desc = "Drask eyes. They look even stranger disembodied"
- dark_view = 5
- species = "Drask"
+ dark_view = 5
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/grey.dm b/code/modules/surgery/organs/subtypes/grey.dm
index 6c06da373b7..177e4ae5be1 100644
--- a/code/modules/surgery/organs/subtypes/grey.dm
+++ b/code/modules/surgery/organs/subtypes/grey.dm
@@ -1,11 +1,9 @@
/obj/item/organ/internal/liver/grey
alcohol_intensity = 1.6
- species = "Grey"
/obj/item/organ/internal/brain/grey
icon_state = "brain-x"
mmi_icon_state = "mmi_alien"
- species = "Grey"
/obj/item/organ/internal/brain/grey/insert(var/mob/living/carbon/M, var/special = 0)
..()
@@ -17,5 +15,4 @@
/obj/item/organ/internal/eyes/grey
name = "grey eyeballs"
- dark_view = 5
- species = "Grey"
+ dark_view = 5
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/kidan.dm b/code/modules/surgery/organs/subtypes/kidan.dm
index 37fd74a6d2a..d8fc67cc542 100644
--- a/code/modules/surgery/organs/subtypes/kidan.dm
+++ b/code/modules/surgery/organs/subtypes/kidan.dm
@@ -1,6 +1,5 @@
/obj/item/organ/internal/liver/kidan
alcohol_intensity = 0.5
- species = "Kidan"
#define KIDAN_LANTERN_HUNGERCOST 0.5
#define KIDAN_LANTERN_MINHUNGER 150
diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm
index 589ade0e7de..7c2aae08894 100644
--- a/code/modules/surgery/organs/subtypes/machine.dm
+++ b/code/modules/surgery/organs/subtypes/machine.dm
@@ -5,100 +5,90 @@
min_broken_damage = 30
encased = null
status = ORGAN_ROBOT
- species = "Machine"
-/obj/item/organ/external/head/ipc/New()
+/obj/item/organ/external/head/ipc/New(mob/living/carbon/holder, datum/species/species_override = null)
+ ..(holder, /datum/species/machine) // IPC heads need to be explicitly set to this since you can print them
robotize("Morpheus Cyberkinetics")
- ..()
/obj/item/organ/external/chest/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/chest/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/groin/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/groin/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/arm/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/arm/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/arm/right/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/arm/right/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
+
/obj/item/organ/external/leg/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/leg/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/leg/right/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/leg/right/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/foot/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/foot/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/foot/right/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/foot/right/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/hand/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/hand/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/hand/right/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/hand/right/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/internal/cell
name = "microbattery"
@@ -110,26 +100,15 @@
slot = "heart"
vital = TRUE
status = ORGAN_ROBOT
- species = "Machine"
-
-/obj/item/organ/internal/cell/New()
- robotize()
- ..()
/obj/item/organ/internal/eyes/optical_sensor
name = "optical sensor"
icon = 'icons/obj/robot_component.dmi'
icon_state = "camera"
status = ORGAN_ROBOT
- species = "Machine"
// dead_icon = "camera_broken"
weld_proof = 1
-/obj/item/organ/internal/eyes/optical_sensor/New()
- robotize()
- ..()
-
-
/obj/item/organ/internal/eyes/optical_sensor/remove(var/mob/living/user,special = 0)
if(!special)
to_chat(owner, "Error 404:Optical Sensors not found.")
@@ -137,16 +116,14 @@
. = ..()
/obj/item/organ/internal/brain/mmi_holder/posibrain/New()
- stored_mmi = new /obj/item/mmi/robotic_brain/positronic(src)
..()
- spawn(1)
- if(!QDELETED(src))
- if(owner)
- stored_mmi.name = "positronic brain ([owner.real_name])"
- stored_mmi.brainmob.real_name = owner.real_name
- stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
- stored_mmi.icon_state = "posibrain-occupied"
- update_from_mmi()
- else
- stored_mmi.loc = get_turf(src)
- qdel(src)
\ No newline at end of file
+ stored_mmi = new /obj/item/mmi/robotic_brain/positronic(src)
+ if(owner)
+ stored_mmi.name = "positronic brain ([owner.real_name])"
+ stored_mmi.brainmob.real_name = owner.real_name
+ stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
+ stored_mmi.icon_state = "posibrain-occupied"
+ update_from_mmi()
+ else
+ stored_mmi.forceMove(get_turf(src))
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/nucleation.dm b/code/modules/surgery/organs/subtypes/nucleation.dm
index 4223834501d..3be564fc800 100644
--- a/code/modules/surgery/organs/subtypes/nucleation.dm
+++ b/code/modules/surgery/organs/subtypes/nucleation.dm
@@ -3,7 +3,6 @@
name = "nucleation organ"
icon = 'icons/obj/surgery.dmi'
desc = "A crystalized human organ. /red It has a strangely iridescent glow."
- species = "Nucleation"
/obj/item/organ/internal/nucleation/resonant_crystal
name = "resonant crystal"
@@ -11,7 +10,6 @@
organ_tag = "resonant crystal"
parent_organ = "head"
slot = "res_crystal"
- species = "Nucleation"
/obj/item/organ/internal/nucleation/strange_crystal
name = "strange crystal"
@@ -19,14 +17,12 @@
organ_tag = "strange crystal"
parent_organ = "chest"
slot = "heart"
- species = "Nucleation"
/obj/item/organ/internal/eyes/luminescent_crystal
name = "luminescent eyes"
icon_state = "crystal-eyes"
organ_tag = "luminescent eyes"
light_color = "#1C1C00"
- species = "Nucleation"
/obj/item/organ/internal/eyes/luminescent_crystal/New()
set_light(2)
@@ -35,5 +31,4 @@
/obj/item/organ/internal/brain/crystal
name = "crystallized brain"
icon_state = "crystal-brain"
- organ_tag = "crystallized brain"
- species = "Nucleation"
+ organ_tag = "crystallized brain"
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/shadow.dm b/code/modules/surgery/organs/subtypes/shadow.dm
index f81fc54bfb1..26a0bc50577 100644
--- a/code/modules/surgery/organs/subtypes/shadow.dm
+++ b/code/modules/surgery/organs/subtypes/shadow.dm
@@ -1,4 +1,3 @@
/obj/item/organ/internal/eyes/shadow
name = "dark orbs"
- dark_view = 8
- species = "Shadow"
+ dark_view = 8
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/skrell.dm b/code/modules/surgery/organs/subtypes/skrell.dm
index cb87d1c11c1..fd8a02f18d3 100644
--- a/code/modules/surgery/organs/subtypes/skrell.dm
+++ b/code/modules/surgery/organs/subtypes/skrell.dm
@@ -1,6 +1,5 @@
/obj/item/organ/internal/liver/skrell
alcohol_intensity = 4
- species = "Skrell"
/obj/item/organ/internal/headpocket
name = "headpocket"
@@ -10,7 +9,6 @@
w_class = WEIGHT_CLASS_TINY
parent_organ = "head"
slot = "headpocket"
- species = "Skrell"
actions_types = list(/datum/action/item_action/organ_action/toggle)
var/obj/item/storage/internal/pocket
diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm
index 1a548de7d0a..c83678a71a5 100644
--- a/code/modules/surgery/organs/subtypes/standard.dm
+++ b/code/modules/surgery/organs/subtypes/standard.dm
@@ -194,12 +194,10 @@
owner.unEquip(owner.r_ear)
if(owner.wear_mask)
owner.unEquip(owner.wear_mask)
- spawn(1)
- if(owner)//runtimer no runtiming
- owner.update_hair()
- owner.update_fhair()
- owner.update_head_accessory()
- owner.update_markings()
+ owner.update_hair()
+ owner.update_fhair()
+ owner.update_head_accessory()
+ owner.update_markings()
. = ..()
/obj/item/organ/external/head/replaced()
diff --git a/code/modules/surgery/organs/subtypes/tajaran.dm b/code/modules/surgery/organs/subtypes/tajaran.dm
index a1313934037..1857fc5e45a 100644
--- a/code/modules/surgery/organs/subtypes/tajaran.dm
+++ b/code/modules/surgery/organs/subtypes/tajaran.dm
@@ -1,17 +1,14 @@
/obj/item/organ/internal/liver/tajaran
alcohol_intensity = 1.4
- species = "Tajaran"
/obj/item/organ/internal/eyes/tajaran
name = "tajaran eyeballs"
- species = "Tajaran"
colourblind_matrix = MATRIX_TAJ_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
replace_colours = LIST_TAJ_REPLACE
dark_view = 8
/obj/item/organ/internal/eyes/tajaran/farwa //Being the lesser form of Tajara, Farwas have an utterly incurable version of their colourblindness.
name = "farwa eyeballs"
- species = "Farwa"
colourmatrix = MATRIX_TAJ_CBLIND
dark_view = 8
replace_colours = LIST_TAJ_REPLACE
diff --git a/code/modules/surgery/organs/subtypes/unathi.dm b/code/modules/surgery/organs/subtypes/unathi.dm
index 0fb45319ce5..219ef0447e6 100644
--- a/code/modules/surgery/organs/subtypes/unathi.dm
+++ b/code/modules/surgery/organs/subtypes/unathi.dm
@@ -1,8 +1,6 @@
/obj/item/organ/internal/liver/unathi
alcohol_intensity = 0.8
- species = "Unathi"
/obj/item/organ/internal/eyes/unathi
name = "unathi eyeballs"
- dark_view = 3
- species = "Unathi"
+ dark_view = 3
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/vox.dm b/code/modules/surgery/organs/subtypes/vox.dm
index f5b4b4edc07..960acf920a8 100644
--- a/code/modules/surgery/organs/subtypes/vox.dm
+++ b/code/modules/surgery/organs/subtypes/vox.dm
@@ -1,16 +1,12 @@
/obj/item/organ/internal/liver/vox
alcohol_intensity = 1.6
- species = "Vox"
/obj/item/organ/internal/stack
- name = "cortical stack"
+ name = "vox cortical stack"
icon_state = "brain-prosthetic"
parent_organ = "head"
organ_tag = "stack"
slot = "vox_stack"
status = ORGAN_ROBOT
- vital = TRUE
-
-/obj/item/organ/internal/stack/vox
- name = "vox cortical stack"
\ No newline at end of file
+ vital = TRUE
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/vulpkanin.dm b/code/modules/surgery/organs/subtypes/vulpkanin.dm
index be851c43486..959fbcc926c 100644
--- a/code/modules/surgery/organs/subtypes/vulpkanin.dm
+++ b/code/modules/surgery/organs/subtypes/vulpkanin.dm
@@ -1,18 +1,14 @@
/obj/item/organ/internal/liver/vulpkanin
alcohol_intensity = 1.4
- species = "Vulpkanin"
-
/obj/item/organ/internal/eyes/vulpkanin
name = "vulpkanin eyeballs"
- species = "Vulpkanin"
colourblind_matrix = MATRIX_VULP_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
replace_colours = LIST_VULP_REPLACE
dark_view = 8
/obj/item/organ/internal/eyes/vulpkanin/wolpin //Being the lesser form of Vulpkanin, Wolpins have an utterly incurable version of their colourblindness.
name = "wolpin eyeballs"
- species = "Wolpin"
colourmatrix = MATRIX_VULP_CBLIND
dark_view = 8
- replace_colours = LIST_VULP_REPLACE
+ replace_colours = LIST_VULP_REPLACE
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/wryn.dm b/code/modules/surgery/organs/subtypes/wryn.dm
index ee1a12fd1ab..ab30c16f61f 100644
--- a/code/modules/surgery/organs/subtypes/wryn.dm
+++ b/code/modules/surgery/organs/subtypes/wryn.dm
@@ -6,8 +6,6 @@
icon_state = "antennae"
parent_organ = "head"
slot = "hivenode"
- species = "Wryn"
/obj/item/organ/internal/eyes/wryn
- dark_view = 3
- species = "Wryn"
+ dark_view = 3
\ No newline at end of file
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 467f1e64a00..bcb5151d359 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -303,7 +303,7 @@
..()
/datum/surgery_step/internal/dethrall/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if(target.get_species() == "Lesser Shadowling") //Empowered thralls cannot be deconverted
+ if(isshadowlinglesser(target)) //Empowered thralls cannot be deconverted
to_chat(target, "NOT LIKE THIS!")
user.visible_message("[target] suddenly slams upward and knocks down [user]!", \
"[target] suddenly bolts up and slams you with tremendous force!")
diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm
index a0e4c2a3976..9483818d153 100644
--- a/code/modules/surgery/plastic_surgery.dm
+++ b/code/modules/surgery/plastic_surgery.dm
@@ -24,7 +24,7 @@
/datum/surgery_step/reshape_face/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/external/head/head = target.get_organ(target_zone)
- var/species_names = target.get_species()
+ var/species_names = target.dna.species.name
if(head.disfigured)
head.disfigured = FALSE
user.visible_message("[user] successfully restores [target]'s appearance!", "You successfully restore [target]'s appearance.")
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 3de2d350ee0..762c4e6040b 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -347,12 +347,12 @@
to_chat(user, "You cannot install a computer brain into a meat enclosure.")
return -1
- if(!target.species)
+ if(!target.dna.species)
to_chat(user, "You have no idea what species this person is. Report this on the bug tracker.")
return -1
- if(!target.species.has_organ["brain"])
- to_chat(user, "You're pretty sure [target.species.name_plural] don't normally have a brain.")
+ if(!target.dna.species.has_organ["brain"])
+ to_chat(user, "You're pretty sure [target.dna.species.name_plural] don't normally have a brain.")
return -1
if(target.get_int_organ(/obj/item/organ/internal/brain/))
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 8007c40749b..72bf70c7e81 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -67,10 +67,6 @@
//How much blood this step can get on surgeon. 1 - hands, 2 - full body.
var/blood_level = 0
- var/list/allowed_mob = list()
- var/list/disallowed_mob = list()
-
-
/datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/success = 0
if(accept_hand)
@@ -146,19 +142,8 @@
// Checks if this step applies to the user mob at all
/datum/surgery_step/proc/is_valid_target(mob/living/carbon/human/target)
if(!hasorgans(target))
- return 0
-
- if(allowed_mob)//can i just remove this and/or change it?
- for(var/species in allowed_mob)
- if(target.get_species() == species)
- return 1
-
- if(disallowed_mob)
- for(var/species in disallowed_mob)
- if(target.get_species() == species)
- return 0
-
- return 1
+ return FALSE
+ return TRUE
// checks whether this step can be applied with the given user and target
/datum/surgery_step/proc/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -206,7 +191,7 @@
for(var/mob/living/carbon/human/H in view(2, E.loc))//germs from people
if(AStar(E.loc, H.loc, /turf/proc/Distance, 2, simulated_only = 0))
- if((!(BREATHLESS in H.mutations) || !(NO_BREATHE in H.species.species_traits)) && !H.wear_mask) //wearing a mask helps preventing people from breathing cooties into open incisions
+ if((!(BREATHLESS in H.mutations) || !(NO_BREATHE in H.dna.species.species_traits)) && !H.wear_mask) //wearing a mask helps preventing people from breathing cooties into open incisions
germs += H.germ_level * 0.25
for(var/obj/effect/decal/cleanable/M in view(2, E.loc))//germs from messes
diff --git a/code/modules/vr/vr_controller.dm b/code/modules/vr/vr_controller.dm
index 45bf2a6cc74..564291b2999 100644
--- a/code/modules/vr/vr_controller.dm
+++ b/code/modules/vr/vr_controller.dm
@@ -31,12 +31,12 @@ proc/build_virtual_avatar(mob/living/carbon/human/H, location, datum/map_templat
var/mob/living/carbon/human/virtual_reality/vr_avatar
location = get_turf(location)
vr_avatar = new /mob/living/carbon/human/virtual_reality(location)
- vr_avatar.set_species(H.species.name)
if(istype(H, /mob/living/carbon/human/virtual_reality))
var/mob/living/carbon/human/virtual_reality/V = H
vr_avatar.real_me = V.real_me
else
vr_avatar.real_me = H
+ vr_avatar.set_species(H.dna.species.type)
vr_avatar.dna = H.dna.Clone()
vr_avatar.name = H.name
vr_avatar.real_name = H.real_name
diff --git a/config/names/diona.txt b/config/names/diona.txt
deleted file mode 100644
index 3eb4b5f4498..00000000000
--- a/config/names/diona.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Blade of Grass Bent Before Wind
-Glimmer Of The Stars
-The Ripple Of the Waves
-Colors Of Dusk
-The Still Of Night
-Silence Of The Wind
-Gentle Breeze of the Summer Wind
-Glistening Water under the Blazing Sun
-Child of the Scorching Sun
-Blessed Plant-ling of Eternal Fields
-Grass-walker of the Soothing Plains
-Element of the Undying Fiona
-Spawn of Mother Nature's Busum
\ No newline at end of file
diff --git a/icons/mob/ears.dmi b/icons/mob/ears.dmi
index 13d5981c458..597029a456c 100644
Binary files a/icons/mob/ears.dmi and b/icons/mob/ears.dmi differ
diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi
index 7bcd0607116..2adfdba5670 100644
Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ
diff --git a/paradise.dme b/paradise.dme
index daa3e1c9b65..cd51288c9a1 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -472,8 +472,10 @@
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
#include "code\game\gamemodes\meteor\meteor.dm"
#include "code\game\gamemodes\meteor\meteors.dm"
+#include "code\game\gamemodes\miniantags\abduction\abductee_objectives.dm"
#include "code\game\gamemodes\miniantags\abduction\abduction.dm"
#include "code\game\gamemodes\miniantags\abduction\abduction_gear.dm"
+#include "code\game\gamemodes\miniantags\abduction\abduction_outfits.dm"
#include "code\game\gamemodes\miniantags\abduction\abduction_surgery.dm"
#include "code\game\gamemodes\miniantags\abduction\gland.dm"
#include "code\game\gamemodes\miniantags\abduction\machinery\camera.dm"