mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-17 10:03:50 +01:00
Fix improper skin tones and lots of DNA inconsistencies. Improve mob spawners by a little (#29271)
* sane appearance * updatepaths * flip-vitiligo * equal color options * ... * Update golems.dm * typo
This commit is contained in:
@@ -445,9 +445,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/decal/cleanable/blood/tracks/mapped,
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/obj/effect/spawner/random/blood/often,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
|
||||
@@ -232,9 +232,7 @@
|
||||
/area/template_noop)
|
||||
"fQ" = (
|
||||
/obj/effect/mapping_helpers/turfs/burn,
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/template_noop)
|
||||
"fU" = (
|
||||
@@ -247,9 +245,7 @@
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"gd" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/obj/effect/spawner/random/dirt/frequent,
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
@@ -411,9 +407,7 @@
|
||||
},
|
||||
/area/template_noop)
|
||||
"kr" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/obj/effect/spawner/random/blood/often,
|
||||
/turf/simulated/floor/plating/asteroid,
|
||||
/area/template_noop)
|
||||
@@ -593,9 +587,7 @@
|
||||
/area/template_noop)
|
||||
"mX" = (
|
||||
/obj/effect/mapping_helpers/turfs/burn,
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/doctor{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/doctor,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/template_noop)
|
||||
"mY" = (
|
||||
@@ -829,9 +821,7 @@
|
||||
},
|
||||
/area/template_noop)
|
||||
"rN" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/obj/effect/mapping_helpers/turfs/burn,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/template_noop)
|
||||
@@ -904,9 +894,7 @@
|
||||
},
|
||||
/area/template_noop)
|
||||
"te" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/engineer{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/engineer,
|
||||
/obj/effect/mapping_helpers/turfs/burn,
|
||||
/obj/effect/decal/cleanable/blood/tracks/mapped{
|
||||
dir = 4
|
||||
@@ -963,9 +951,7 @@
|
||||
},
|
||||
/area/template_noop)
|
||||
"ue" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/obj/effect/spawner/random/blood/often,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/template_noop)
|
||||
@@ -1107,9 +1093,7 @@
|
||||
"xQ" = (
|
||||
/obj/effect/spawner/themed_mess/engineering,
|
||||
/obj/structure/chair,
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/engineer{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/engineer,
|
||||
/obj/effect/spawner/random/blood/often,
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/template_noop)
|
||||
@@ -1178,9 +1162,7 @@
|
||||
/area/template_noop)
|
||||
"zo" = (
|
||||
/obj/machinery/firealarm/directional/south,
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/security_officer{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/security_officer,
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"zs" = (
|
||||
@@ -1221,9 +1203,7 @@
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"zR" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/assistant{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/assistant,
|
||||
/obj/effect/decal/cleanable/blood,
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
@@ -1234,9 +1214,7 @@
|
||||
},
|
||||
/area/template_noop)
|
||||
"zV" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/engineer{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/engineer,
|
||||
/obj/item/trash/spentcasing/bullet,
|
||||
/obj/effect/mapping_helpers/turfs/burn,
|
||||
/obj/effect/spawner/random/blood/often,
|
||||
@@ -1272,9 +1250,7 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/template_noop)
|
||||
"AW" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/obj/item/trash/spentcasing/bullet,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/template_noop)
|
||||
@@ -1340,9 +1316,7 @@
|
||||
/area/template_noop)
|
||||
"BZ" = (
|
||||
/obj/effect/spawner/random/blood/often,
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/security_officer{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/security_officer,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/template_noop)
|
||||
"Cj" = (
|
||||
@@ -1398,9 +1372,7 @@
|
||||
/area/template_noop)
|
||||
"DK" = (
|
||||
/obj/structure/chair,
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/engineer{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/engineer,
|
||||
/obj/effect/spawner/random/blood/often,
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/template_noop)
|
||||
@@ -1812,9 +1784,7 @@
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"MI" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/obj/effect/decal/cleanable/blood,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/template_noop)
|
||||
@@ -1829,9 +1799,7 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/template_noop)
|
||||
"Na" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/security_officer{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/security_officer,
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"Nb" = (
|
||||
@@ -1946,9 +1914,7 @@
|
||||
},
|
||||
/area/template_noop)
|
||||
"OM" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"Pa" = (
|
||||
@@ -2068,9 +2034,7 @@
|
||||
"SJ" = (
|
||||
/obj/effect/mapping_helpers/turfs/burn,
|
||||
/obj/effect/spawner/random/blood/often,
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/assistant{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/assistant,
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"SS" = (
|
||||
@@ -2267,9 +2231,7 @@
|
||||
"Yg" = (
|
||||
/obj/effect/mapping_helpers/turfs/burn,
|
||||
/obj/effect/spawner/random/dirt/often,
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/template_noop)
|
||||
"Yo" = (
|
||||
@@ -2330,9 +2292,7 @@
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"ZI" = (
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist{
|
||||
random = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/corpse/random_species/scientist,
|
||||
/obj/effect/mapping_helpers/turfs/burn,
|
||||
/obj/effect/decal/cleanable/blood/tracks/mapped,
|
||||
/turf/template_noop,
|
||||
|
||||
@@ -88,6 +88,45 @@
|
||||
|
||||
return f_style
|
||||
|
||||
// it might be made species related, but it is pretty okay now
|
||||
/proc/random_hair_color(tint = TRUE, range)
|
||||
if(prob(1))
|
||||
return rand_hex_color() // sPaCe PuNk
|
||||
var/list/color_options = list(
|
||||
// gray, black, blue - 5 total
|
||||
COLOR_GRAY15,
|
||||
COLOR_GRAY40,
|
||||
COLOR_SILVER,
|
||||
COLOR_DARK_BLUE_GRAY,
|
||||
COLOR_WALL_GUNMETAL,
|
||||
// yellow, red, orange - 5 total
|
||||
COLOR_YELLOW_GRAY,
|
||||
COLOR_WARM_YELLOW,
|
||||
COLOR_DARK_ORANGE,
|
||||
COLOR_PALE_ORANGE,
|
||||
COLOR_SUN,
|
||||
// brownish. there is not much of them so they are repeated - 5 total
|
||||
COLOR_CHESTNUT,
|
||||
COLOR_CHESTNUT,
|
||||
COLOR_BEASTY_BROWN,
|
||||
COLOR_BEASTY_BROWN,
|
||||
COLOR_BROWN_ORANGE,
|
||||
)
|
||||
if(tint) // returns a tint of selected color
|
||||
return tint_color(pick(color_options), range)
|
||||
return pick(color_options)
|
||||
|
||||
/// Returns a purely random tint for specific color
|
||||
/proc/tint_color(color, range = 25)
|
||||
if(!istext(color) || length(color) < 7 || copytext(color, 1, 2) != "#") // if it's not a hex color
|
||||
return color // just leave it as it is
|
||||
|
||||
var/R = clamp(color2R(color) + rand(-range, range), 0, 255)
|
||||
var/G = clamp(color2G(color) + rand(-range, range), 0, 255)
|
||||
var/B = clamp(color2B(color) + rand(-range, range), 0, 255)
|
||||
|
||||
return rgb(R, G, B)
|
||||
|
||||
/proc/random_head_accessory(species = "Human")
|
||||
var/ha_style = "None"
|
||||
var/list/valid_head_accessories = list()
|
||||
@@ -177,22 +216,18 @@
|
||||
else
|
||||
return current_species.get_random_name(gender)
|
||||
|
||||
/// Randomises skin tone, specifically for each species that has a skin tone. Otherwise keeps a default of 1
|
||||
/proc/random_skin_tone(species = "Human")
|
||||
if(species == "Human" || species == "Drask")
|
||||
switch(pick(60;"caucasian", 15;"afroamerican", 10;"african", 10;"latino", 5;"albino"))
|
||||
if("caucasian") . = -10
|
||||
if("afroamerican") . = -115
|
||||
if("african") . = -165
|
||||
if("latino") . = -55
|
||||
if("albino") . = 34
|
||||
else . = rand(-185, 34)
|
||||
return min(max(. + rand(-25, 25), -185), 34)
|
||||
else if(species == "Vox")
|
||||
. = rand(1, 6)
|
||||
else if(species == "Nian")
|
||||
. = rand(1, 4)
|
||||
else
|
||||
. = 1
|
||||
switch(species)
|
||||
if("Human")
|
||||
return rand(1, 13)
|
||||
if("Drask")
|
||||
return rand(1, 220)
|
||||
if("Nian")
|
||||
return rand(1, 4)
|
||||
if("Vox")
|
||||
return rand(1, 8)
|
||||
return 1
|
||||
|
||||
/proc/skintone2racedescription(tone, species = "Human")
|
||||
if(species == "Human")
|
||||
|
||||
@@ -30,11 +30,11 @@ BONUS
|
||||
var/mob/living/M = A.affected_mob
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.s_tone == -85)
|
||||
if(H.s_tone == 85)
|
||||
return
|
||||
switch(A.stage)
|
||||
if(5)
|
||||
H.change_skin_tone(-85)
|
||||
H.change_skin_tone(85, TRUE)
|
||||
else
|
||||
H.visible_message("<span class='warning'>[H] looks a bit pale...</span>", "<span class='notice'>Your skin suddenly appears lighter...</span>")
|
||||
|
||||
@@ -73,11 +73,11 @@ BONUS
|
||||
var/mob/living/M = A.affected_mob
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.s_tone == 85)
|
||||
if(H.s_tone == -85)
|
||||
return
|
||||
switch(A.stage)
|
||||
if(5)
|
||||
H.change_skin_tone(85)
|
||||
H.change_skin_tone(-85, TRUE)
|
||||
else
|
||||
H.visible_message("<span class='warning'>[H] looks a bit dark...</span>", "<span class='notice'>Your skin suddenly appears darker...</span>")
|
||||
|
||||
|
||||
@@ -1593,7 +1593,7 @@
|
||||
if(prob(50))
|
||||
var/codename_prefix = pick("Exposed", "Unveiled", "Phantom", "Mirage", "Punished", "Invisible", "Swift")
|
||||
codename = "[codename_prefix] [codename]"
|
||||
H.rename_character(null, codename)
|
||||
H.rename_character(H.real_name, codename)
|
||||
|
||||
var/hair_color = "#361A00"
|
||||
|
||||
|
||||
+26
-27
@@ -98,7 +98,7 @@ GLOBAL_LIST_EMPTY(bad_blocks)
|
||||
|
||||
/datum/dna/proc/ResetUIFrom(mob/living/carbon/human/character)
|
||||
// INITIALIZE!
|
||||
ResetUI(1)
|
||||
ResetUI(TRUE)
|
||||
// Hair
|
||||
// FIXME: Species-specific defaults pls
|
||||
var/obj/item/organ/external/head/head = character.get_organ("head")
|
||||
@@ -120,33 +120,33 @@ GLOBAL_LIST_EMPTY(bad_blocks)
|
||||
head_traits_to_dna(character, head)
|
||||
eye_color_to_dna(eyes_organ)
|
||||
|
||||
SetUIValueRange(DNA_UI_SKIN_R, color2R(character.skin_colour), 255, 1)
|
||||
SetUIValueRange(DNA_UI_SKIN_G, color2G(character.skin_colour), 255, 1)
|
||||
SetUIValueRange(DNA_UI_SKIN_B, color2B(character.skin_colour), 255, 1)
|
||||
SetUIValueRange(DNA_UI_SKIN_R, color2R(character.skin_colour), 255, TRUE)
|
||||
SetUIValueRange(DNA_UI_SKIN_G, color2G(character.skin_colour), 255, TRUE)
|
||||
SetUIValueRange(DNA_UI_SKIN_B, color2B(character.skin_colour), 255, TRUE)
|
||||
|
||||
SetUIValueRange(DNA_UI_HEAD_MARK_R, color2R(character.m_colours["head"]), 255, 1)
|
||||
SetUIValueRange(DNA_UI_HEAD_MARK_G, color2G(character.m_colours["head"]), 255, 1)
|
||||
SetUIValueRange(DNA_UI_HEAD_MARK_B, color2B(character.m_colours["head"]), 255, 1)
|
||||
SetUIValueRange(DNA_UI_HEAD_MARK_R, color2R(character.m_colours["head"]), 255, TRUE)
|
||||
SetUIValueRange(DNA_UI_HEAD_MARK_G, color2G(character.m_colours["head"]), 255, TRUE)
|
||||
SetUIValueRange(DNA_UI_HEAD_MARK_B, color2B(character.m_colours["head"]), 255, TRUE)
|
||||
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_R, color2R(character.m_colours["body"]), 255, 1)
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_G, color2G(character.m_colours["body"]), 255, 1)
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_B, color2B(character.m_colours["body"]), 255, 1)
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_R, color2R(character.m_colours["body"]), 255, TRUE)
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_G, color2G(character.m_colours["body"]), 255, TRUE)
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_B, color2B(character.m_colours["body"]), 255, TRUE)
|
||||
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_R, color2R(character.m_colours["tail"]), 255, 1)
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_G, color2G(character.m_colours["tail"]), 255, 1)
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_B, color2B(character.m_colours["tail"]), 255, 1)
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_R, color2R(character.m_colours["tail"]), 255, TRUE)
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_G, color2G(character.m_colours["tail"]), 255, TRUE)
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_B, color2B(character.m_colours["tail"]), 255, TRUE)
|
||||
|
||||
SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative.
|
||||
SetUIValueRange(DNA_UI_SKIN_TONE, abs(35 - character.s_tone), 220, TRUE)
|
||||
|
||||
SetUIValueRange(DNA_UI_HEAD_MARK_STYLE, head_marks, length(GLOB.marking_styles_list), 1)
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_STYLE, body_marks, length(GLOB.marking_styles_list), 1)
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_STYLE, tail_marks, length(GLOB.marking_styles_list), 1)
|
||||
SetUIValueRange(DNA_UI_HEAD_MARK_STYLE, head_marks, length(GLOB.marking_styles_list), TRUE)
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_STYLE, body_marks, length(GLOB.marking_styles_list), TRUE)
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_STYLE, tail_marks, length(GLOB.marking_styles_list), TRUE)
|
||||
|
||||
SetUIValueRange(DNA_UI_PHYSIQUE, GLOB.character_physiques.Find(character.physique), length(GLOB.character_physiques), 1)
|
||||
SetUIValueRange(DNA_UI_HEIGHT, GLOB.character_heights.Find(character.height), length(GLOB.character_heights), 1)
|
||||
SetUIValueRange(DNA_UI_PHYSIQUE, GLOB.character_physiques.Find(character.physique), length(GLOB.character_physiques), TRUE)
|
||||
SetUIValueRange(DNA_UI_HEIGHT, GLOB.character_heights.Find(character.height), length(GLOB.character_heights), TRUE)
|
||||
|
||||
var/list/bodyacc = GLOB.body_accessory_by_name.Find(character.body_accessory?.name || "None")
|
||||
SetUIValueRange(DNA_UI_BACC_STYLE, bodyacc, length(GLOB.body_accessory_by_name), 1)
|
||||
SetUIValueRange(DNA_UI_BACC_STYLE, bodyacc, length(GLOB.body_accessory_by_name), TRUE)
|
||||
|
||||
switch(character.body_type)
|
||||
if(FEMALE)
|
||||
@@ -157,16 +157,15 @@ GLOBAL_LIST_EMPTY(bad_blocks)
|
||||
//Set the Gender
|
||||
switch(character.gender)
|
||||
if(FEMALE)
|
||||
SetUITriState(DNA_UI_GENDER, DNA_GENDER_FEMALE, 1)
|
||||
SetUITriState(DNA_UI_GENDER, DNA_GENDER_FEMALE, TRUE)
|
||||
if(MALE)
|
||||
SetUITriState(DNA_UI_GENDER, DNA_GENDER_MALE, 1)
|
||||
SetUITriState(DNA_UI_GENDER, DNA_GENDER_MALE, TRUE)
|
||||
if(PLURAL)
|
||||
SetUITriState(DNA_UI_GENDER, DNA_GENDER_PLURAL, 1)
|
||||
SetUITriState(DNA_UI_GENDER, DNA_GENDER_PLURAL, TRUE)
|
||||
|
||||
if(head)
|
||||
head.dna.UI = character.dna.UI
|
||||
if(eyes_organ)
|
||||
eyes_organ.dna.UI = character.dna.UI
|
||||
// updates DNA for our external and internal organs
|
||||
for(var/obj/item/organ/organ in (character.bodyparts + character.internal_organs))
|
||||
organ.dna.UI = character.dna.UI
|
||||
|
||||
UpdateUI()
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
H.m_colours["body"] = rgb(dna.GetUIValueRange(DNA_UI_BODY_MARK_R, 255), dna.GetUIValueRange(DNA_UI_BODY_MARK_G, 255), dna.GetUIValueRange(DNA_UI_BODY_MARK_B, 255))
|
||||
H.m_colours["tail"] = rgb(dna.GetUIValueRange(DNA_UI_TAIL_MARK_R, 255), dna.GetUIValueRange(DNA_UI_TAIL_MARK_G, 255), dna.GetUIValueRange(DNA_UI_TAIL_MARK_B, 255))
|
||||
|
||||
H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative.
|
||||
H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220)
|
||||
|
||||
switch(dna.GetUIState(DNA_UI_BODY_TYPE))
|
||||
if(DNA_GENDER_FEMALE)
|
||||
|
||||
@@ -939,7 +939,7 @@
|
||||
if(!new_tone)
|
||||
new_tone = 35
|
||||
else
|
||||
new_tone = 35 - max(min(round(text2num(new_tone)), 220), 1)
|
||||
new_tone = max(min(round(text2num(new_tone)), 220), 1)
|
||||
M.change_skin_tone(new_tone)
|
||||
|
||||
if(M.dna.species.bodyflags & HAS_ICON_SKIN_TONE)
|
||||
|
||||
@@ -59,25 +59,25 @@
|
||||
/obj/effect/mob_spawn/human/alive/golem
|
||||
name = "inert free golem shell"
|
||||
desc = "A humanoid shape, empty, lifeless, and full of potential."
|
||||
mob_name = "a free golem"
|
||||
role_name = "free golem"
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "construct"
|
||||
mob_species = /datum/species/golem
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
anchored = FALSE
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
density = FALSE
|
||||
death_cooldown = 300 SECONDS
|
||||
STATIC_COOLDOWN_DECLARE(ghost_flash_cooldown)
|
||||
var/has_owner = FALSE
|
||||
var/can_transfer = TRUE //if golems can switch bodies to this new shell
|
||||
var/mob/living/owner = null //golem's owner if it has one
|
||||
important_info = "You are not an antagonist. Do not create AIs without explicit admin permission. Do not involve yourself with the main station, boarding the main station requires explicit admin permission."
|
||||
description = "As a Free Golem on lavaland, you are unable to use most weapons, but you can mine, research and make more of your kind. Earn enough mining points and you can even move your shuttle out of there. Your goal is to survive on lavaland with your kin, not to become crew on the primary station."
|
||||
flavour_text = "You are a Free Golem. Your family worships The Liberator. In his infinite and divine wisdom, he set your clan free to \
|
||||
travel the stars with a single declaration: \"Yeah go do whatever.\" Though you are bound to the one who created you, it is customary in your society to repeat those same words to newborn \
|
||||
golems, so that no golem may ever be forced to serve again."
|
||||
density = FALSE
|
||||
anchored = FALSE
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
death_cooldown = 300 SECONDS
|
||||
mob_species = /datum/species/golem
|
||||
var/has_owner = FALSE
|
||||
/// If golems can switch bodies to this new shell
|
||||
var/can_transfer = TRUE
|
||||
/// Golem's owner if it has one
|
||||
var/mob/living/owner
|
||||
STATIC_COOLDOWN_DECLARE(ghost_flash_cooldown)
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/golem/Initialize(mapload, datum/species/golem/species = null, mob/creator = null)
|
||||
if(species) //spawners list uses object name to register so this goes before ..()
|
||||
@@ -98,7 +98,7 @@
|
||||
Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost."
|
||||
owner = creator
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/golem/special(mob/living/new_spawn, name)
|
||||
/obj/effect/mob_spawn/human/alive/golem/special(mob/living/new_spawn)
|
||||
var/datum/species/golem/X = mob_species
|
||||
to_chat(new_spawn, "[initial(X.info_text)]")
|
||||
if(!owner)
|
||||
@@ -130,10 +130,6 @@
|
||||
if(has_owner)
|
||||
var/datum/species/golem/G = H.dna.species
|
||||
G.owner = owner
|
||||
if(!name)
|
||||
H.rename_character(null, H.dna.species.get_random_name())
|
||||
else
|
||||
H.rename_character(null, name)
|
||||
if(is_species(H, /datum/species/golem/tranquillite) && H.mind)
|
||||
H.mind.AddSpell(new /datum/spell/aoe/conjure/build/mime_wall(null))
|
||||
H.mind.AddSpell(new /datum/spell/mime/speak(null))
|
||||
@@ -198,7 +194,7 @@
|
||||
/obj/effect/mob_spawn/human/alive/golem/servant
|
||||
has_owner = TRUE
|
||||
name = "inert servant golem shell"
|
||||
mob_name = "a servant golem"
|
||||
role_name = "servant golem"
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/golem/servant/handle_becoming_golem(obj/item/I, mob/living/carbon/user)
|
||||
if(!isgolem(user))
|
||||
@@ -208,7 +204,6 @@
|
||||
/obj/effect/mob_spawn/human/alive/golem/adamantine
|
||||
name = "dust-caked free golem shell"
|
||||
desc = "A humanoid shape, empty, lifeless, and full of potential."
|
||||
mob_name = "a free golem"
|
||||
assignedrole = "Free Golem"
|
||||
can_transfer = FALSE
|
||||
mob_species = /datum/species/golem/adamantine
|
||||
assignedrole = "Free Golem"
|
||||
|
||||
@@ -1,107 +1,54 @@
|
||||
//Ancient cryogenic sleepers. Players become NT crewmen from a hundred year old space station, now on the verge of collapse.
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/sec
|
||||
/obj/effect/mob_spawn/human/alive/old
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a security uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a security officer"
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
description = "Work as a team with your fellow survivors aboard a ruined, ancient space station."
|
||||
important_info = ""
|
||||
flavour_text = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
assignedrole = "Ancient Crew"
|
||||
allow_gender_pick = TRUE
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/Initialize(mapload)
|
||||
flavour_text = "You are \a [role_name] working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod."
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/sec
|
||||
role_name = "security officer"
|
||||
uniform = /obj/item/clothing/under/retro/security
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
id = /obj/item/card/id/away/old/sec
|
||||
r_pocket = /obj/item/restraints/handcuffs
|
||||
l_pocket = /obj/item/flash
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/sec/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/med
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a medical uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a medical doctor"
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
description = "Work as a team with your fellow survivors aboard a ruined, ancient space station."
|
||||
important_info = ""
|
||||
flavour_text = "You are a medical doctor working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod."
|
||||
role_name = "medical doctor"
|
||||
uniform = /obj/item/clothing/under/retro/medical
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
id = /obj/item/card/id/away/old/med
|
||||
l_pocket = /obj/item/stack/medical/ointment
|
||||
r_pocket = /obj/item/stack/medical/ointment
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/med/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/eng
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise an engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "an engineer"
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
description = "Work as a team with your fellow survivors aboard a ruined, ancient space station."
|
||||
important_info = ""
|
||||
flavour_text = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod."
|
||||
role_name = "engineer"
|
||||
uniform = /obj/item/clothing/under/retro/engineering
|
||||
shoes = /obj/item/clothing/shoes/workboots
|
||||
id = /obj/item/card/id/away/old/eng
|
||||
gloves = /obj/item/clothing/gloves/color/fyellow/old
|
||||
l_pocket = /obj/item/tank/internals/emergency_oxygen
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/eng/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/sci
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a science uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a scientist"
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
description = "Work as a team with your fellow survivors aboard a ruined, ancient space station."
|
||||
important_info = ""
|
||||
flavour_text = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod."
|
||||
role_name = "scientist"
|
||||
uniform = /obj/item/clothing/under/retro/science
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
id = /obj/item/card/id/away/old/sci
|
||||
l_pocket = /obj/item/stack/medical/bruise_pack
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/old/sci/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/structure/showcase/machinery/oldpod
|
||||
name = "damaged cryogenic pod"
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define HAIR_TINT_RANGE 10 // range of available tint for our hair
|
||||
|
||||
//These are meant for spawning on maps, namely Away Missions.
|
||||
|
||||
//If someone can do this in a neater way, be my guest-Kor
|
||||
@@ -10,41 +12,57 @@
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
var/mob_type = null
|
||||
var/mob_name = "unidentified entity"
|
||||
var/mob_gender = null
|
||||
var/death = TRUE //Kill the mob
|
||||
var/roundstart = TRUE //fires on initialize
|
||||
var/instant = FALSE //fires on New
|
||||
var/flavour_text = "" //flavour/fluff about the role, optional.
|
||||
var/description = "A description for this has not been set. This is either an oversight or an admin-spawned spawner not in normal use." //intended as OOC info about the role
|
||||
var/important_info = "" //important info such as rules that apply to you, etc. Optional.
|
||||
var/faction = null
|
||||
var/permanent = FALSE //If true, the spawner will not disappear upon running out of uses.
|
||||
var/random = FALSE //Don't set a name or gender, just go random
|
||||
var/objectives = null
|
||||
var/uses = 1 //how many times can we spawn from it. set to -1 for infinite.
|
||||
var/mob_type
|
||||
/// Overrides name given to our mob
|
||||
var/mob_name
|
||||
/// Who do we gonna play for
|
||||
var/role_name
|
||||
/// Kill the mob
|
||||
var/death = TRUE
|
||||
/// Fires on initialize
|
||||
var/roundstart = TRUE
|
||||
/// Fires on New
|
||||
var/instant = FALSE
|
||||
/// Flavour/fluff about the role, optional.
|
||||
var/flavour_text = ""
|
||||
/// Intended as OOC info about the role
|
||||
var/description = "A description for this has not been set. This is either an oversight or an admin-spawned spawner not in normal use."
|
||||
/// Important info such as rules that apply to you, etc. Optional.
|
||||
var/important_info = ""
|
||||
/// List of additional factions for our mob
|
||||
var/list/faction = list()
|
||||
/// If true, the spawner will not disappear upon running out of uses.
|
||||
var/permanent = FALSE
|
||||
var/objectives
|
||||
/// How many times can we spawn from it. Set to -1 for infinite.
|
||||
var/uses = 1
|
||||
var/brute_damage = 0
|
||||
var/oxy_damage = 0
|
||||
var/burn_damage = 0
|
||||
var/datum/disease/disease = null //Do they start with a pre-spawned disease?
|
||||
var/mob_color //Change the mob's color
|
||||
/// Do they start with a pre-spawned disease?
|
||||
var/datum/disease/disease
|
||||
/// Change the mob's color
|
||||
var/mob_color
|
||||
var/assignedrole
|
||||
var/banType = ROLE_GHOST
|
||||
var/ban_type = ROLE_GHOST
|
||||
var/ghost_usable = TRUE
|
||||
var/offstation_role = TRUE // If set to true, the role of the user's mind will be set to offstation
|
||||
var/death_cooldown = 0 // How long you have to wait after dying before using it again, in deciseconds. People that join as observers are not included.
|
||||
///If antagbanned people are prevented from using it, only false for the ghost bar spawner.
|
||||
/// If set to true, the role of the user's mind will be set to offstation
|
||||
var/offstation_role = TRUE
|
||||
/// How long you have to wait after dying before using it again. People that join as observers are not included.
|
||||
var/death_cooldown = 0
|
||||
/// If antagbanned people are prevented from using it, only false for the ghost bar spawner.
|
||||
var/restrict_antagban = TRUE
|
||||
|
||||
/obj/effect/mob_spawn/attack_ghost(mob/user)
|
||||
if(!valid_to_spawn(user))
|
||||
return
|
||||
var/ghost_role = tgui_alert(user, "Become [mob_name]? (Warning, You can no longer be cloned!)", "Respawn", list("Yes", "No"))
|
||||
var/ghost_role = tgui_alert(user, "Become \a [role_name]? (Warning, You can no longer be cloned!)", "Respawn", list("Yes", "No"))
|
||||
if(ghost_role != "Yes")
|
||||
return
|
||||
if(!species_prompt(user))
|
||||
return
|
||||
if(!gender_prompt(user))
|
||||
return
|
||||
if(!loc || !uses && !permanent || QDELETED(src) || QDELETED(user))
|
||||
to_chat(user, "<span class='warning'>The [name] is no longer usable!</span>")
|
||||
return
|
||||
@@ -71,6 +89,9 @@
|
||||
/obj/effect/mob_spawn/proc/species_prompt()
|
||||
return TRUE
|
||||
|
||||
/obj/effect/mob_spawn/proc/gender_prompt()
|
||||
return TRUE
|
||||
|
||||
/obj/effect/mob_spawn/proc/special(mob/M)
|
||||
return
|
||||
|
||||
@@ -83,7 +104,7 @@
|
||||
if(!uses && !permanent)
|
||||
to_chat(user, "<span class='warning'>This spawner is out of charges!</span>")
|
||||
return FALSE
|
||||
if((jobban_isbanned(user, banType) || (restrict_antagban && jobban_isbanned(user, ROLE_SYNDICATE))))
|
||||
if((jobban_isbanned(user, ban_type) || (restrict_antagban && jobban_isbanned(user, ROLE_SYNDICATE))))
|
||||
to_chat(user, "<span class='warning'>You are jobanned!</span>")
|
||||
return FALSE
|
||||
if(!HAS_TRAIT(user, TRAIT_RESPAWNABLE))
|
||||
@@ -125,13 +146,10 @@
|
||||
/obj/effect/mob_spawn/proc/create(ckey, flavour = TRUE, name, mob/user = usr)
|
||||
log_game("[ckey] became [mob_name]")
|
||||
var/mob/living/M = new mob_type(get_turf(src)) //living mobs only
|
||||
if(!random)
|
||||
M.real_name = mob_name ? mob_name : M.name
|
||||
if(!mob_gender)
|
||||
mob_gender = pick(MALE, FEMALE)
|
||||
M.gender = mob_gender
|
||||
if(mob_name)
|
||||
M.rename_character(M.real_name, mob_name)
|
||||
if(faction)
|
||||
M.faction = list(faction)
|
||||
M.faction |= faction
|
||||
if(disease)
|
||||
M.ForceContractDisease(new disease)
|
||||
if(death)
|
||||
@@ -141,7 +159,7 @@
|
||||
M.adjustBruteLoss(brute_damage)
|
||||
M.adjustFireLoss(burn_damage)
|
||||
M.color = mob_color
|
||||
equip(M, TRUE)
|
||||
equip(M)
|
||||
|
||||
if(ckey)
|
||||
M.ckey = ckey
|
||||
@@ -169,19 +187,33 @@
|
||||
/obj/effect/mob_spawn/human
|
||||
mob_type = /mob/living/carbon/human
|
||||
//Human specific stuff.
|
||||
var/mob_species = null //Set species
|
||||
/// Species of our mob. Default is human
|
||||
var/mob_species
|
||||
/// Gender of our mob. Default will randomise between male and female
|
||||
var/mob_gender
|
||||
/// Allows ghost to select a species on mob creation
|
||||
var/allow_species_pick = FALSE
|
||||
/// List of available species to be picked by ghost
|
||||
var/list/pickable_species = list("Human", "Vulpkanin", "Tajaran", "Unathi", "Skrell", "Diona", "Nian")
|
||||
var/datum/outfit/outfit = /datum/outfit //If this is a path, it will be instanced in Initialize()
|
||||
/// Allows ghost to select a gender on mob creation
|
||||
var/allow_gender_pick = FALSE
|
||||
/// List of available genders to be picked by ghost
|
||||
var/list/pickable_genders = list(MALE, FEMALE)
|
||||
/// If this is a path, it will be instanced in Initialize()
|
||||
var/datum/outfit/outfit = /datum/outfit
|
||||
var/disable_pda = TRUE
|
||||
var/disable_sensors = TRUE
|
||||
|
||||
//All of these only affect the ID that the outfit has placed in the ID slot
|
||||
var/id_job = null //Such as "Clown" or "Chef." This just determines what the ID reads as, not their access
|
||||
var/id_access = null //This is for access. See access.dm for which jobs give what access. Use "Captain" if you want it to be all access.
|
||||
var/id_access_list = null //Allows you to manually add access to an ID card.
|
||||
/// Such as "Clown" or "Chef." This just determines what the ID reads as, not their access
|
||||
var/id_job
|
||||
/// This is for access. See access.dm for which jobs give what access. Use "Captain" if you want it to be all access.
|
||||
var/id_access
|
||||
/// Allows you to manually add access to an ID card.
|
||||
var/id_access_list
|
||||
assignedrole = "Ghost Role"
|
||||
|
||||
var/husk = null
|
||||
var/husk
|
||||
/// Should we fully dna-scramble these humans?
|
||||
var/dna_scrambled = FALSE
|
||||
//these vars are for lazy mappers to override parts of the outfit
|
||||
@@ -209,6 +241,7 @@
|
||||
var/facial_hair_style
|
||||
var/hair_color
|
||||
var/facial_hair_color
|
||||
/// If set, should be a value between -185 and 220. Go to `random_skin_tone()` for species-specific numbers' range you'd like to use
|
||||
var/skin_tone
|
||||
var/eyes_color
|
||||
|
||||
@@ -227,16 +260,31 @@
|
||||
if(allow_species_pick)
|
||||
var/selected_species = tgui_input_list(user, "Select a species", "Species Selection", pickable_species)
|
||||
if(!selected_species)
|
||||
return TRUE // You didn't pick, so just continue on with the spawning process as a human
|
||||
return FALSE
|
||||
var/datum/species/S = GLOB.all_species[selected_species]
|
||||
mob_species = S.type
|
||||
return TRUE
|
||||
|
||||
/obj/effect/mob_spawn/human/gender_prompt(mob/user)
|
||||
if(allow_gender_pick)
|
||||
var/selected_gender = tgui_input_list(user, "Select a gender", "Gender Selection", pickable_genders)
|
||||
if(!selected_gender)
|
||||
return FALSE
|
||||
mob_gender = selected_gender
|
||||
return TRUE
|
||||
|
||||
/obj/effect/mob_spawn/human/equip(mob/living/carbon/human/H)
|
||||
if(mob_species)
|
||||
H.set_species(mob_species)
|
||||
if(random)
|
||||
H.real_name = random_name(H.gender, H.dna.species.name)
|
||||
if(mob_gender)
|
||||
H.change_gender(mob_gender)
|
||||
if(mob_gender == FEMALE)
|
||||
H.change_body_type(FEMALE)
|
||||
else if(prob(50))
|
||||
H.change_gender(FEMALE)
|
||||
H.change_body_type(FEMALE)
|
||||
if(!mob_name) // randomise our name if it's not yet overriden
|
||||
H.rename_character(H.real_name, random_name(H.gender, H.dna.species.name))
|
||||
|
||||
if(husk)
|
||||
H.Drain()
|
||||
@@ -248,37 +296,47 @@
|
||||
var/obj/item/organ/external/head/D = H.get_organ("head")
|
||||
if(istype(D))
|
||||
if(eyes_color)
|
||||
H.change_eye_color(eyes_color)
|
||||
H.change_eye_color(eyes_color, FALSE)
|
||||
|
||||
if(hair_style)
|
||||
D.h_style = hair_style
|
||||
else
|
||||
D.h_style = random_hair_style(gender, D.dna.species.name)
|
||||
if(hair_color)
|
||||
D.hair_colour = hair_color
|
||||
D.sec_hair_colour = hair_color
|
||||
else
|
||||
D.hair_colour = rand_hex_color()
|
||||
D.sec_hair_colour = D.hair_colour
|
||||
D.h_style = random_hair_style(H.gender, D.dna.species.name)
|
||||
|
||||
if(facial_hair_style)
|
||||
D.f_style = facial_hair_style
|
||||
else if(H.gender != FEMALE) // no beard for women
|
||||
D.f_style = random_facial_hair_style(H.gender, D.dna.species.name)
|
||||
|
||||
if(hair_color)
|
||||
D.hair_colour = hair_color
|
||||
D.sec_hair_colour = tint_color(hair_color, HAIR_TINT_RANGE)
|
||||
else
|
||||
D.f_style = random_facial_hair_style(gender, D.dna.species.name)
|
||||
D.hair_colour = random_hair_color(range = HAIR_TINT_RANGE)
|
||||
D.sec_hair_colour = tint_color(D.hair_colour, HAIR_TINT_RANGE)
|
||||
|
||||
if(facial_hair_color)
|
||||
D.facial_colour = facial_hair_color
|
||||
D.sec_facial_colour = facial_hair_color
|
||||
D.sec_facial_colour = tint_color(facial_hair_color, HAIR_TINT_RANGE)
|
||||
else
|
||||
D.facial_colour = rand_hex_color()
|
||||
D.sec_facial_colour = D.facial_colour
|
||||
if(skin_tone)
|
||||
H.s_tone = skin_tone
|
||||
D.facial_colour = tint_color(D.hair_colour, HAIR_TINT_RANGE)
|
||||
D.sec_facial_colour = tint_color(D.hair_colour, HAIR_TINT_RANGE)
|
||||
|
||||
if(!isnull(skin_tone))
|
||||
H.change_skin_tone(skin_tone)
|
||||
else
|
||||
H.s_tone = random_skin_tone()
|
||||
H.skin_colour = rand_hex_color()
|
||||
H.change_skin_tone(random_skin_tone(H.dna.species.name))
|
||||
|
||||
if(istype(D))
|
||||
H.change_skin_color(tint_color(D.hair_colour))
|
||||
else
|
||||
H.change_skin_color(random_hair_color())
|
||||
|
||||
if(dna_scrambled)
|
||||
H.get_dna_scrambled()
|
||||
|
||||
H.update_body(rebuild_base = TRUE)
|
||||
H.update_dna() // saves everything we've set above
|
||||
H.regenerate_icons()
|
||||
|
||||
if(outfit)
|
||||
var/static/list/slots = list("uniform", "r_hand", "l_hand", "suit", "shoes", "gloves", "ears", "glasses", "mask", "head", "belt", "r_pocket", "l_pocket", "back", "id", "neck", "backpack_contents", "suit_store")
|
||||
@@ -325,30 +383,23 @@
|
||||
/obj/effect/mob_spawn/human/corpse
|
||||
roundstart = FALSE
|
||||
instant = TRUE
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/create(ckey, flavour, name, mob/user)
|
||||
var/mob/corpse = ..()
|
||||
corpse.faction |= "spawned_corpse"
|
||||
return corpse
|
||||
faction = list("spawned_corpse")
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/damaged
|
||||
brute_damage = 1000
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/alive
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
death = FALSE
|
||||
roundstart = FALSE //you could use these for alive fake humans on roundstart but this is more common scenario
|
||||
|
||||
|
||||
//////////Alive ones, used as "core" for ghost roles now and in future.//////////
|
||||
|
||||
//Space(?) Bar Patron (ghost role).
|
||||
/obj/effect/mob_spawn/human/alive/space_bar_patron
|
||||
name = "Bar cryogenics"
|
||||
mob_name = "Bar patron"
|
||||
random = TRUE
|
||||
permanent = TRUE
|
||||
uses = -1
|
||||
outfit = /datum/outfit/spacebartender
|
||||
@@ -369,24 +420,6 @@
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
|
||||
//Lavaland Animal Doctor (ghost role).
|
||||
/obj/effect/mob_spawn/human/alive/doctor
|
||||
random = TRUE
|
||||
name = "sleeper"
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a space doctor!"
|
||||
assignedrole = "Space Doctor"
|
||||
outfit = /datum/outfit/job/doctor
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/doctor/equip(mob/living/carbon/human/H)
|
||||
..()
|
||||
// Remove radio and PDA so they wouldn't annoy station crew.
|
||||
var/list/del_types = list(/obj/item/pda, /obj/item/radio/headset)
|
||||
for(var/del_type in del_types)
|
||||
var/obj/item/I = locate(del_type) in H
|
||||
qdel(I)
|
||||
|
||||
//Spooky Scary Skeleton...
|
||||
/obj/effect/mob_spawn/human/alive/skeleton
|
||||
icon = 'icons/mob/simple_human.dmi'
|
||||
@@ -759,3 +792,5 @@
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "goliath_dead"
|
||||
pixel_x = -12
|
||||
|
||||
#undef HAIR_TINT_RANGE
|
||||
|
||||
@@ -327,14 +327,20 @@
|
||||
force_update_limbs()
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/proc/change_skin_tone(tone)
|
||||
/// Tone must be between -185 and 220. commonly used in 1 to 220, see `random_skin_tone()` for species-specific values
|
||||
/mob/living/carbon/human/proc/change_skin_tone(tone, override = FALSE)
|
||||
if(s_tone == tone || !((dna.species.bodyflags & HAS_SKIN_TONE) || (dna.species.bodyflags & HAS_ICON_SKIN_TONE)))
|
||||
return
|
||||
|
||||
s_tone = tone
|
||||
if(tone in -185 to 220)
|
||||
if(dna.species.bodyflags & HAS_ICON_SKIN_TONE || override)
|
||||
s_tone = tone
|
||||
else
|
||||
s_tone = 35 - tone
|
||||
force_update_limbs()
|
||||
return TRUE
|
||||
|
||||
force_update_limbs()
|
||||
return TRUE
|
||||
CRASH("Skin tone values must be between -185 and 220!")
|
||||
|
||||
/mob/living/carbon/human/proc/change_hair_gradient(style, offset_raw, color, alpha)
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
|
||||
@@ -172,7 +172,6 @@ GLOBAL_LIST_EMPTY(ert_request_messages)
|
||||
M.overeatduration = 0
|
||||
var/obj/item/organ/external/head/head_organ = M.get_organ("head")
|
||||
var/eye_c = pick("#000000", "#8B4513", "#1E90FF", "#8c00ff", "#a80c0c", "#2fdb63") // Black, brown, blue, purple, red, green
|
||||
var/skin_tone = random_skin_tone(new_species) // randomise skin tone depending on mob's species
|
||||
|
||||
switch(new_species) //Diona not included as they don't use the hair colours, kidan use accessory, drask are skin tone Grey not included as they are BALD
|
||||
if("Human", "Tajaran", "Vulpkanin", "Nian")
|
||||
@@ -195,17 +194,17 @@ GLOBAL_LIST_EMPTY(ert_request_messages)
|
||||
M.skin_colour = pick(su) //Pick a diffrent colour for body.
|
||||
|
||||
|
||||
M.change_eye_color(eye_c)
|
||||
M.s_tone = skin_tone
|
||||
M.change_eye_color(eye_c, FALSE)
|
||||
M.change_skin_tone(random_skin_tone(M.dna.species.name))
|
||||
head_organ.headacc_colour = pick("#1f138b", "#272525", "#07a035", "#8c00ff", "#a80c0c")
|
||||
head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.name)
|
||||
if(M.gender != FEMALE) // no beard for women pls
|
||||
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(GLOB.last_names)]")
|
||||
M.rename_character(M.real_name, "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(GLOB.last_names)]")
|
||||
M.age = rand(23,35)
|
||||
M.update_dna()
|
||||
M.regenerate_icons()
|
||||
M.update_body()
|
||||
|
||||
//Creates mind stuff.
|
||||
M.mind = new
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
/datum/outfit/job/response_team/commander/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
. = ..()
|
||||
|
||||
H.rename_character(null, "[pick("Lieutenant", "Captain", "Major")] [pick(GLOB.last_names)]")
|
||||
H.rename_character(H.real_name, "[pick("Lieutenant", "Captain", "Major")] [pick(GLOB.last_names)]")
|
||||
H.age = rand(35, 45)
|
||||
|
||||
/datum/outfit/job/response_team/commander/amber
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
resistance_flags = FIRE_PROOF | LAVA_PROOF
|
||||
max_integrity = 200
|
||||
|
||||
var/faction = list("ashwalker")
|
||||
var/meat_counter = 6
|
||||
|
||||
/obj/structure/lavaland/ash_walker/Initialize(mapload)
|
||||
@@ -57,28 +56,24 @@
|
||||
/obj/effect/mob_spawn/human/alive/ash_walker
|
||||
name = "ash walker egg"
|
||||
desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within."
|
||||
mob_name = "an ash walker"
|
||||
role_name = "ash walker"
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "large_egg"
|
||||
mob_species = /datum/species/unathi/ashwalker
|
||||
outfit = /datum/outfit/ashwalker
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
anchored = FALSE
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
density = FALSE
|
||||
death_cooldown = 300 SECONDS
|
||||
important_info = "Do not leave Lavaland without admin permission. Do not attack the mining outpost without being provoked."
|
||||
description = "You are an ashwalker, a native inhabitant of Lavaland. Try to survive with nothing but spears and other tribal technology. Bring dead bodies back to your tendril to create more of your kind. You are free to attack miners and other outsiders."
|
||||
flavour_text = "Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. \
|
||||
You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest. \
|
||||
Keep in mind - your speed is given to you by the power of the Necropolis, <b>leaving the planet will make your body more lethargic!</b>"
|
||||
assignedrole = "Ash Walker"
|
||||
density = FALSE
|
||||
anchored = FALSE
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
death_cooldown = 300 SECONDS
|
||||
allow_gender_pick = TRUE
|
||||
mob_species = /datum/species/unathi/ashwalker
|
||||
outfit = /datum/outfit/ashwalker
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/ash_walker/special(mob/living/carbon/human/new_spawn)
|
||||
new_spawn.rename_character(new_spawn.real_name, new_spawn.dna.species.get_random_name(new_spawn.gender))
|
||||
new_spawn.mind.offstation_role = TRUE
|
||||
|
||||
to_chat(new_spawn, "<b>Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Glory to the Necropolis!</b>")
|
||||
to_chat(new_spawn, "<span class='motd'>For more information, check the wiki page: ([GLOB.configuration.url.wiki_url]/index.php/Ash_Walker)</span>")
|
||||
|
||||
@@ -89,7 +84,7 @@
|
||||
notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
|
||||
|
||||
/datum/outfit/ashwalker
|
||||
name ="Ashwalker"
|
||||
name = "Ashwalker"
|
||||
head = /obj/item/clothing/head/helmet/gladiator
|
||||
uniform = /obj/item/clothing/under/costume/gladiator/ash_walker
|
||||
|
||||
|
||||
@@ -2,27 +2,21 @@
|
||||
/obj/effect/mob_spawn/human/alive/hermit
|
||||
name = "malfunctioning cryostasis sleeper"
|
||||
desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed."
|
||||
mob_name = "a stranded hermit"
|
||||
role_name = "stranded hermit"
|
||||
icon = 'icons/obj/lavaland/spawners.dmi'
|
||||
icon_state = "cryostasis_sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
allow_species_pick = TRUE
|
||||
mob_species = /datum/species/human
|
||||
description = "You are a single survivor stranded on lavaland in a makeshift shelter. Try to survive with barely any equipment. For when miner is just too boring."
|
||||
flavour_text = "You've been stranded in this godless prison of a planet for longer than you can remember. Each day you barely scrape by, and between the terrible \
|
||||
conditions of your makeshift shelter, the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \
|
||||
the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you got here... "
|
||||
assignedrole = "Hermit"
|
||||
allow_species_pick = TRUE
|
||||
allow_gender_pick = TRUE
|
||||
outfit = /datum/outfit/hermit
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/hermit/Initialize(mapload)
|
||||
. = ..()
|
||||
var/arrpee = rand(1,4)
|
||||
outfit.suit = /obj/item/clothing/suit/space/syndicate/orange
|
||||
outfit.head = /obj/item/clothing/head/helmet/space/syndicate/orange
|
||||
outfit.shoes = /obj/item/clothing/shoes/black
|
||||
outfit.back = /obj/item/storage/backpack
|
||||
switch(arrpee)
|
||||
if(1)
|
||||
flavour_text += "you were a [pick("arms dealer", "shipwright", "docking manager")]'s assistant on a small trading station several sectors from here. Raiders attacked, and there was \
|
||||
@@ -49,3 +43,9 @@
|
||||
/obj/effect/mob_spawn/human/alive/hermit/Destroy()
|
||||
new/obj/structure/fluff/empty_cryostasis_sleeper(get_turf(src))
|
||||
return ..()
|
||||
|
||||
/datum/outfit/hermit
|
||||
suit = /obj/item/clothing/suit/space/syndicate/orange
|
||||
head = /obj/item/clothing/head/helmet/space/syndicate/orange
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
back = /obj/item/storage/backpack
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/obj/effect/spawner/random/seed_vault
|
||||
name = "seed vault seeds"
|
||||
|
||||
loot = list(
|
||||
/obj/item/food/grown/mushroom/glowshroom/glowcap = 10,
|
||||
/obj/item/seeds/cherry/bomb = 10,
|
||||
@@ -11,7 +10,7 @@
|
||||
/obj/effect/mob_spawn/human/alive/seed_vault
|
||||
name = "preserved terrarium"
|
||||
desc = "An ancient machine that seems to be used for storing plant matter. The glass is obstructed by a mat of vines."
|
||||
mob_name = "a lifebringer"
|
||||
role_name = "lifebringer"
|
||||
icon = 'icons/obj/lavaland/spawners.dmi'
|
||||
icon_state = "terrarium"
|
||||
density = TRUE
|
||||
@@ -24,10 +23,10 @@
|
||||
for contact from your creators. Estimated time of last contact: Deployment, 5x10^3 millennia ago."
|
||||
assignedrole = "Seed Vault Diona"
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/seed_vault/special(mob/living/new_spawn)
|
||||
var/plant_name = pick("Tomato", "Potato", "Broccoli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Banana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", \
|
||||
"Venus", "Sprout","Cocoa", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper")
|
||||
new_spawn.rename_character(null, plant_name)
|
||||
/obj/effect/mob_spawn/human/alive/seed_vault/Initialize(mapload)
|
||||
mob_name = pick("Tomato", "Potato", "Broccoli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Banana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", \
|
||||
"Venus", "Sprout", "Cocoa", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper")
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/seed_vault/Destroy()
|
||||
new/obj/structure/fluff/empty_terrarium(get_turf(src))
|
||||
|
||||
@@ -24,9 +24,7 @@
|
||||
// Spawners
|
||||
/obj/effect/mob_spawn/human/alive/spacebase_syndicate
|
||||
name = "Syndicate Researcher sleeper"
|
||||
mob_name = "Syndicate Researcher"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
role_name = "syndicate researcher"
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper_s"
|
||||
important_info = "Do not work against traitors or nukies. Do not leave the base."
|
||||
@@ -36,7 +34,9 @@
|
||||
assignedrole = "Syndicate Researcher"
|
||||
del_types = list() // Necessary to prevent del_types from removing radio!
|
||||
allow_species_pick = TRUE
|
||||
allow_gender_pick = TRUE
|
||||
skin_tone = 2
|
||||
faction = list("syndicate")
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/spacebase_syndicate/Destroy()
|
||||
var/obj/structure/fluff/empty_sleeper/syndicate/S = new /obj/structure/fluff/empty_sleeper/syndicate(get_turf(src))
|
||||
@@ -49,7 +49,7 @@
|
||||
suit = /obj/item/clothing/suit/storage/labcoat
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
r_ear = /obj/item/radio/headset/syndicate/alt/nocommon // See del_types above
|
||||
l_ear = /obj/item/radio/headset/syndicate/alt/nocommon // See del_types above
|
||||
back = /obj/item/storage/backpack
|
||||
belt = /obj/item/storage/belt/utility/syndi_researcher
|
||||
r_pocket = /obj/item/gun/projectile/automatic/pistol
|
||||
@@ -63,9 +63,6 @@
|
||||
|
||||
/datum/outfit/spacebase_syndicate/post_equip(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
H.faction |= "syndicate"
|
||||
var/random_name = random_name(pick(MALE,FEMALE), H.dna.species.name)
|
||||
H.rename_character(H.real_name, random_name)
|
||||
H.job = "Syndi Researcher" // ensures they show up right in player panel for admins
|
||||
if(isunathi(H) || isvulpkanin(H) || istajaran(H) || isskrell(H))
|
||||
H.change_skin_color("#B2B2B2")
|
||||
@@ -74,3 +71,5 @@
|
||||
H.change_markings("White Fly Markings", "body")
|
||||
H.change_head_accessory("White Fly Antennae")
|
||||
H.change_body_accessory("White Fly Wings")
|
||||
H.update_dna()
|
||||
H.regenerate_icons()
|
||||
|
||||
@@ -45,10 +45,10 @@
|
||||
return
|
||||
if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && ((dna.species.bodyflags & HAS_SKIN_TONE) || (dna.species.bodyflags & HAS_ICON_SKIN_TONE)))
|
||||
s_col = null
|
||||
s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE)
|
||||
s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220)
|
||||
if(dna.species.bodyflags & HAS_SKIN_COLOR)
|
||||
s_tone = null
|
||||
s_col = rgb(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B))
|
||||
s_col = rgb(dna.GetUIValueRange(DNA_UI_SKIN_R, 255), dna.GetUIValueRange(DNA_UI_SKIN_G, 255), dna.GetUIValueRange(DNA_UI_SKIN_B, 255))
|
||||
|
||||
/obj/item/organ/external/head/sync_colour_to_human(mob/living/carbon/human/H)
|
||||
..()
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
if(owner.dna.species.bodyflags & HAS_SKIN_TONE)
|
||||
new_s_tone = input(usr, "Choose your character's skin tone:\n(Light 1 - 220 Dark)", "Skin Tone", owner.s_tone) as num|null
|
||||
if(isnum(new_s_tone) && (!..()))
|
||||
new_s_tone = 35 - max(min(round(new_s_tone), 220),1)
|
||||
new_s_tone = max(min(round(new_s_tone), 220),1)
|
||||
else if(owner.dna.species.bodyflags & HAS_ICON_SKIN_TONE)
|
||||
var/const/MAX_LINE_ENTRIES = 4
|
||||
var/prompt = "Choose your character's skin tone: 1-[length(owner.dna.species.icon_skin_tones)]\n("
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
/obj/effect/mob_spawn/@SUBTYPES : /obj/effect/mob_spawn/@SUBTYPES{@OLD;random=@SKIP}
|
||||
Reference in New Issue
Block a user