mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-21 19:17:50 +01:00
Merge pull request #9223 from Fox-McCloud/what-is-this-species
Makes Species datum Non-Global
This commit is contained in:
@@ -142,4 +142,5 @@
|
||||
#define VIRUSIMMUNE 14
|
||||
#define NOCRITDAMAGE 15
|
||||
#define RESISTHOT 16
|
||||
#define RESISTCOLD 17
|
||||
#define RESISTCOLD 17
|
||||
#define NO_EXAMINE 18
|
||||
+25
-1
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
+15
-15
@@ -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)
|
||||
|
||||
@@ -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]")
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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, "<span class='notice'>You feel good.</span>")
|
||||
else
|
||||
to_chat(affected_mob, "<span class='notice'>You feel like playing with string.</span>")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
if(affected_mob.get_species() == "Tajaran")
|
||||
if(istajaran(affected_mob))
|
||||
to_chat(affected_mob, "<span class='danger'>Something in your throat itches.</span>")
|
||||
else
|
||||
to_chat(affected_mob, "<span class='danger'>You NEED to find a mouse.</span>")
|
||||
if(3)
|
||||
if(prob(10))
|
||||
if(affected_mob.get_species() == "Tajaran")
|
||||
if(istajaran(affected_mob))
|
||||
to_chat(affected_mob, "<span class='danger'>You feel something in your throat!</span>")
|
||||
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("<span class='danger'>[affected_mob] coughs up a hairball!</span>", \
|
||||
"<span class='userdanger'>You cough up a hairball!</span>")
|
||||
affected_mob.Stun(5)
|
||||
@@ -43,7 +43,7 @@
|
||||
affected_mob.visible_message("<span class='danger'>[affected_mob]'s form contorts into something more feline!</span>", \
|
||||
"<span class='userdanger'>YOU TURN INTO A TAJARAN!</span>")
|
||||
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, "<span class='notice'>You feel awkward.</span>")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
to_chat(affected_mob, "<span class='danger'>You itch.</span>")
|
||||
if(3)
|
||||
if(prob(10))
|
||||
to_chat(affected_mob, "<span class='danger'>Your skin starts to flake!</span>")
|
||||
if(ishuman(affected_mob))
|
||||
var/mob/living/carbon/human/twisted = affected_mob
|
||||
switch(stage)
|
||||
if(1)
|
||||
if(prob(10))
|
||||
to_chat(twisted, "<span class='notice'>You feel awkward.</span>")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
to_chat(twisted, "<span class='danger'>You itch.</span>")
|
||||
if(3)
|
||||
if(prob(10))
|
||||
to_chat(twisted, "<span class='danger'>Your skin starts to flake!</span>")
|
||||
|
||||
if(4)
|
||||
if(prob(5))
|
||||
if(affected_mob.get_species() != chosentype)
|
||||
affected_mob.visible_message("<span class='danger'>[affected_mob]'s skin splits and form contorts!</span>", \
|
||||
"<span class='userdanger'>Your body mutates into a [chosentype]!</span>")
|
||||
var/mob/living/carbon/human/twisted = affected_mob
|
||||
twisted.set_species(chosentype)
|
||||
else
|
||||
affected_mob.visible_message("<span class='danger'>[affected_mob] scratches at thier skin!</span>", \
|
||||
"<span class='userdanger'>You scratch your skin to try not to itch!</span>")
|
||||
affected_mob.adjustBruteLoss(-5)
|
||||
affected_mob.adjustStaminaLoss(5)
|
||||
if(4)
|
||||
if(prob(5))
|
||||
if(!istype(twisted.dna.species, chosentype))
|
||||
twisted.visible_message("<span class='danger'>[twisted]'s skin splits and form contorts!</span>", \
|
||||
"<span class='userdanger'>Your body mutates into a [initial(chosentype.name)]!</span>")
|
||||
twisted.set_species(chosentype)
|
||||
else
|
||||
twisted.visible_message("<span class='danger'>[twisted] scratches at thier skin!</span>", \
|
||||
"<span class='userdanger'>You scratch your skin to try not to itch!</span>")
|
||||
twisted.adjustBruteLoss(-5)
|
||||
twisted.adjustStaminaLoss(5)
|
||||
@@ -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"
|
||||
|
||||
+17
-19
@@ -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, "<span class='warning'>This only works on humans!</span>")
|
||||
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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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, "<span class='warning'>Your bones clatter and shutter as they're pulled back into this world!</span>")
|
||||
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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
+7
-11
@@ -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"]
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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, "<B>You are now a [H.species.name].</B>")
|
||||
to_chat(H, "<B>You are now a [H.dna.species.name].</B>")
|
||||
|
||||
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, "<B>You are now a [H.species.name].</B>")
|
||||
to_chat(H, "<B>You are now a [H.dna.species.name].</B>")
|
||||
|
||||
return H
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, "<span class='warning'>DNA of [target] is ruined beyond usability!</span>")
|
||||
return
|
||||
|
||||
if(NO_DNA in T.species.species_traits)
|
||||
if(NO_DNA in T.dna.species.species_traits)
|
||||
to_chat(user, "<span class='warning'>This creature does not have DNA!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -26,10 +26,10 @@
|
||||
to_chat(user, "<span class='notice'>We transform our appearance.</span>")
|
||||
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()
|
||||
|
||||
@@ -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, "<span class='warning'>We cannot perform this ability in this form!</span>")
|
||||
return
|
||||
|
||||
user.dna = user.dna.Clone()
|
||||
H.visible_message("<span class='warning'>[H] transforms!</span>")
|
||||
changeling.geneticdamage = 30
|
||||
to_chat(H, "<span class='warning'>Our genes cry out!</span>")
|
||||
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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
if((NOCLONE || SKELETON || HUSK) in target.mutations)
|
||||
to_chat(user, "<span class='warning'>DNA of [target] is ruined beyond usability!</span>")
|
||||
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, "<span class='warning'>[target] is not compatible with this ability.</span>")
|
||||
return
|
||||
return 1
|
||||
|
||||
@@ -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, "<span class='warning'>The selected DNA is incompatible with our sting.</span>")
|
||||
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, "<span class='warning'>This won't work on a creature without DNA.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
@@ -112,11 +111,11 @@
|
||||
target.visible_message("<span class='danger'>[target] begins to violenty convulse!</span>","<span class='userdanger'>You feel a tiny prick and a begin to uncontrollably convulse!</span>")
|
||||
|
||||
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")
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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" : ""]"
|
||||
|
||||
@@ -279,7 +279,7 @@
|
||||
var/mob/living/carbon/human/H = user
|
||||
user.visible_message("<span class='warning'>Otherworldly armor suddenly appears on [user]!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, arming yourself!</span>")
|
||||
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
|
||||
|
||||
@@ -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 = ""
|
||||
|
||||
@@ -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++)
|
||||
|
||||
@@ -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."
|
||||
@@ -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, "<span class='notice'>With the help of your teammate, kidnap and experiment on station crew members!</span>")
|
||||
to_chat(abductor.current, "<span class='notice'>Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve.</span>")
|
||||
|
||||
var/obj_count = 1
|
||||
for(var/datum/objective/objective in abductor.objectives)
|
||||
to_chat(abductor.current, "<B>Objective #[obj_count]</B>: [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, "<span class='notice'>With the help of your teammate, kidnap and experiment on station crew members!</span>")
|
||||
to_chat(abductor.current, "<span class='notice'>Use your tool and ship consoles to support the agent and retrieve human specimens.</span>")
|
||||
|
||||
var/obj_count = 1
|
||||
for(var/datum/objective/objective in abductor.objectives)
|
||||
to_chat(abductor.current, "<B>Objective #[obj_count]</B>: [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, "<span class='userdanger'>You have been turned into a robot! You are no longer an abductor.</span>")
|
||||
else
|
||||
to_chat(abductor_mind.current, "<span class='userdanger'>You have been brainwashed! You are no longer an abductor.</span>")
|
||||
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."
|
||||
set_antag_hud(alien_mind.current, null)
|
||||
@@ -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 = "<span clas=='notice'>[H.species.name]</span>"
|
||||
species = "<span clas=='notice'>[H.dna.species.name]</span>"
|
||||
if(L.mind && L.mind.changeling)
|
||||
species = "<span class='warning'>Changeling lifeform</span>"
|
||||
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, "<span class='warning'>The baton is in probing mode.</span>")
|
||||
|
||||
|
||||
/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."
|
||||
|
||||
@@ -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)
|
||||
@@ -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!", "<span class='notice'>You prepare [target]'s [target_zone] for further dissection.</span>")
|
||||
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
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
/obj/item/organ/internal/heart/gland/pop/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
|
||||
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)
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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++
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, "<span class='warning'>You can't wrap your head around how to do this.</span>")
|
||||
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, "<span class='warning'>[thrallToRevive] must be conscious to become empowered.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(thrallToRevive.get_species() == "Lesser Shadowling")
|
||||
if(isshadowlinglesser(thrallToRevive))
|
||||
to_chat(user, "<span class='warning'>[thrallToRevive] is already empowered.</span>")
|
||||
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, "<span class='warning'>You cannot spare this much energy. There are too many empowered thralls.</span>")
|
||||
@@ -644,7 +646,7 @@
|
||||
thrallToRevive.visible_message("<span class='warning'>[thrallToRevive] slowly rises, no longer recognizable as human.</span>", \
|
||||
"<span class='shadowling'><b>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.</b></span>")
|
||||
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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -321,11 +321,11 @@ var/global/list/multiverse = list()
|
||||
to_chat(M, "<B>You are an alternate version of [user.real_name] from another universe! Help [user.p_them()] accomplish [user.p_their()] goals at all costs.</B>")
|
||||
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("<span class = 'warning'> A massive amount of flesh sloughs off [M] and a skeleton rises up!</span>")
|
||||
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)
|
||||
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 = "<span class=\"bad\">Error: Unable to locate valid genetic data.</span>"
|
||||
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 = "<span class=\"bad\">Error: Subject's brain is incompatible.</span>"
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, "<span class='warning'>'[target_species]' is not a valid species!</span>")
|
||||
return
|
||||
H.set_species(target_species)
|
||||
@@ -336,7 +336,7 @@
|
||||
to_chat(H, "<span class='warning'>No genetic template configured!</span>")
|
||||
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)
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 << "<span class='warning'>Your fingers can't press the button!</span>"
|
||||
return
|
||||
|
||||
|
||||
@@ -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, "<span class='warning'>Megaphones can't project psionic communication!</span>")
|
||||
return
|
||||
if(ishuman(user))
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
if(!get_location_accessible(H, "mouth"))
|
||||
to_chat(user, "<span class='warning'>The mask is in the way.</span>")
|
||||
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, "<span class='warning'>You find yourself disappointed at the appalling lack of facial hair.</span>")
|
||||
return
|
||||
if(C.f_style == "Shaved")
|
||||
@@ -130,13 +130,13 @@
|
||||
if(!get_location_accessible(H, "head"))
|
||||
to_chat(user, "<span class='warning'>The headgear is in the way.</span>")
|
||||
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, "<span class='warning'>You find yourself disappointed at the appalling lack of hair.</span>")
|
||||
return
|
||||
if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead")
|
||||
to_chat(user, "<span class='notice'>There is not enough hair left to shave...</span>")
|
||||
return
|
||||
if(M.get_species() == "Skrell")
|
||||
if(isskrell(M))
|
||||
to_chat(user, "<span class='warning'>Your razor isn't going to cut through tentacles.</span>")
|
||||
return
|
||||
if(H == user) //shaving yourself
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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, "<span class='warning'>You failed to inject [M], as [M.p_they()] [M.p_have()] no DNA to scramble, nor flesh to inject.</span>")
|
||||
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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, "<span class='warning'>You are unable to find anything on [H]'s face worth cutting. How disappointing.</span>")
|
||||
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, "<span class='warning'>You are unable to find anything on [H]'s head worth cutting. How disappointing.</span>")
|
||||
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
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
to_chat(user, "<span class='notice'>You need to take that [target.name] off before cleaning it.</span>")
|
||||
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
|
||||
|
||||
@@ -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, "<span class='warning'>It's too heavy for you to wield fully.</span>")
|
||||
return
|
||||
if(user.get_inactive_hand())
|
||||
|
||||
@@ -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, "<span class='warning'>The whetstone is too worn to use again!</span>")
|
||||
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("<span class='notice'>[H] sharpens [H.p_their()] claws on the [src]!</span>", "<span class='notice'>You sharpen your claws on the [src].</span>")
|
||||
attack.damage += claw_damage_increase
|
||||
H.visible_message("<span class='notice'>[H] sharpens [H.p_their()] claws on [src]!</span>", "<span class='notice'>You sharpen your claws on [src].</span>")
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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), "<span class=danger>[src] [replacetext(pick(species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.</span>")
|
||||
to_chat(viewers(src), "<span class=danger>[src] [replacetext(pick(dna.species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.</span>")
|
||||
do_suicide(0)
|
||||
|
||||
updatehealth()
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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, "<span class='warning'>Your flesh rapidly mutates!</span>")
|
||||
to_chat(user, "<b>You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.</b>")
|
||||
to_chat(user, "<span class='warning'>Your body reacts violently to light.</span> <span class='notice'>However, it naturally heals in darkness.</span>")
|
||||
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, "<B>Your wish is granted, but at a terrible cost...</B>")
|
||||
@@ -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, "<span class='warning'>Your flesh rapidly mutates!</span>")
|
||||
to_chat(user, "<b>You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.</b>")
|
||||
to_chat(user, "<span class='warning'>Your body reacts violently to light.</span> <span class='notice'>However, it naturally heals in darkness.</span>")
|
||||
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, "<B>Your wish is granted, but at a terrible cost...</B>")
|
||||
@@ -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, "<span class='warning'>Your flesh rapidly mutates!</span>")
|
||||
to_chat(user, "<b>You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.</b>")
|
||||
to_chat(user, "<span class='warning'>Your body reacts violently to light.</span> <span class='notice'>However, it naturally heals in darkness.</span>")
|
||||
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, "<B>Your wish is granted, but at a terrible cost...</B>")
|
||||
@@ -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, "<span class='warning'>Your flesh rapidly mutates!</span>")
|
||||
to_chat(user, "<b>You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.</b>")
|
||||
to_chat(user, "<span class='warning'>Your body reacts violently to light.</span> <span class='notice'>However, it naturally heals in darkness.</span>")
|
||||
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, "<B>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.</B>")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
var/mob/living/carbon/human/target = M
|
||||
|
||||
if(istype(target.species, /datum/species/machine))
|
||||
if(ismachine(target))
|
||||
to_chat(user, "<span class= 'notice'>[target] has no skin, how do you expect to tattoo [target.p_them()]?</span>")
|
||||
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, "<span class= 'notice'>You can't think of a way to make the [tattoo_name] design work on [target == user ? "your" : "[target]'s"] body type.</span>")
|
||||
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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
to_chat(user, "<span class='danger'>The [src] is locked and running, wait for it to finish.</span>")
|
||||
return
|
||||
|
||||
if(!ishuman(victim) || issmall(victim))
|
||||
if(!ishuman(victim))
|
||||
to_chat(user, "<span class='danger'>This is not suitable for the [src]!</span>")
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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("<span class='warning'>[A] has attempted to hit [D] with a [atk_verb]!</span>")
|
||||
|
||||
@@ -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("<span class='danger'>[A] has weakened [D]!!</span>", \
|
||||
"<span class='userdanger'>[A] has weakened [D]!</span>")
|
||||
D.apply_effect(4, WEAKEN, armor_block)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user