diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index c60e122936..5d38343e5f 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -88,6 +88,7 @@
#define DRONE 32
#define SWARMER 64
#define RATVAR 128
+#define YAUTJA 256
// Flags for reagents
#define REAGENT_NOREACT 1
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 8e0bd5f6ad..ec4017088c 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -30,5 +30,5 @@
#define CHAT_GHOSTRADIO 512
#define CHAT_LOOC 1024
-#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO)
+#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_LOOC)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index bf3bb7c521..f6b65bfa39 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -13,17 +13,18 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f)
//socks
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list)
+ //human mutant bodyparts
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, tails_list_human)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/human, animated_tails_list_human)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, ears_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, wings_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open, wings_open_list)
//lizard bodyparts (blizzard intensifies)
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, tails_list_lizard)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/lizard, animated_tails_list_lizard)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, tails_list_human)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/human, animated_tails_list_human)
init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, snouts_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, ears_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, wings_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open, wings_open_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, animated_spines_list)
@@ -33,6 +34,15 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, mam_tails_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, mam_ears_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails_animated, mam_tails_animated_list)
+ //avian bodyparts (i swear this isn't starbound)
+// init_sprite_accessory_subtypes(/datum/sprite_accessory/beaks/avian, avian_beaks_list)
+// init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/avian, avian_tails_list)
+// init_sprite_accessory_subtypes(/datum/sprite_accessory/avian_wings, avian_wings_list)
+// init_sprite_accessory_subtypes(/datum/sprite_accessory/avian_open_wings, avian_open_wings_list)
+ //xeno parts (hiss?)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_head, xeno_head_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_tail, xeno_tail_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, xeno_dorsal_list)
//Species
for(var/spath in subtypesof(/datum/species))
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index bb788360e4..e3e3d1274c 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -124,6 +124,7 @@ var/list/skin_tones = list(
)
var/global/list/species_list[0]
+var/global/list/whitelisted_species_list[0]
var/global/list/roundstart_species[0]
/proc/age2agedescription(age)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 11f412de0d..6e4ab3ee76 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -16,6 +16,7 @@ var/global/list/undershirt_m = list() //stores only undershirt name
var/global/list/undershirt_f = list() //stores only undershirt name
//Socks
var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name
+
//Lizard Bits (all datum lists indexed by name)
var/global/list/body_markings_list = list()
var/global/list/tails_list_lizard = list()
@@ -34,12 +35,24 @@ var/global/list/wings_list = list()
var/global/list/wings_open_list = list()
var/global/list/r_wings_list = list()
- //Mammal Specific Mutant Human Bits
+ //Mammal Species
var/global/list/mam_body_markings_list = list()
var/global/list/mam_ears_list = list()
var/global/list/mam_tails_list = list()
var/global/list/mam_tails_animated_list = list()
+ //Exotic Species
+var/global/list/exotic_tails_list = list()
+var/global/list/exotic_tails_animated_list = list()
+var/global/list/exotic_ears_list = list()
+var/global/list/exotic_head_list = list()
+var/global/list/exotic_back_list = list()
+
+ //Xenomorph Species
+var/global/list/xeno_head_list = list() //I forgot the ' = list()' part for the longest time and couldn't figure out what was wrong. *facepalm
+var/global/list/xeno_tail_list = list()
+var/global/list/xeno_dorsal_list = list()
+
var/global/list/ghost_forms_with_directions_list = list("ghost") //stores the ghost forms that support directional sprites
var/global/list/ghost_forms_with_accessories_list = list("ghost") //stores the ghost forms that support hair and other such things
diff --git a/code/citadel/_helpers.dm b/code/citadel/_helpers.dm
index dc24a27f4b..e898f30b65 100644
--- a/code/citadel/_helpers.dm
+++ b/code/citadel/_helpers.dm
@@ -1,4 +1,4 @@
-//THIS FOLDER CONTAINS CONSTANTS, PROCS, DEFINES, AND OTHER THINGS//
+//THIS FILE CONTAINS CONSTANTS, PROCS, DEFINES, AND OTHER THINGS//
////////////////////////////////////////////////////////////////////
var/const/SIZEPLAY_TINY=1
@@ -18,97 +18,17 @@ var/const/SIZEPLAY_HUGE=5
return mtrx
/proc/get_matrix_small()
var/matrix/mtrx=new()
- return mtrx.Scale(0.7)
+ return mtrx.Scale(0.8)
/proc/get_matrix_smallest()
var/matrix/mtrx=new()
- return mtrx.Scale(0.5)
+ return mtrx.Scale(0.65)
-proc/kpcode_race_getlist(var/restrict=0)
- var/list/race_options = list()
- for(var/r_id in species_list)
- var/datum/species/R = kpcode_race_get(r_id)
- if(!R.restricted||R.restricted==restrict)
- race_options[r_id]=kpcode_race_get(r_id)
- return race_options
-
-proc/kpcode_race_get(var/name="human")
- name=kpcode_race_san(name)
- if(!name||name=="") name="human"
- if(species_list[name])
- var/type_to_use=species_list[name]
- var/datum/species/return_this=new type_to_use()
- return return_this
- else
- return kpcode_race_get()
-
-proc/kpcode_race_san(var/input)
- if(!input)input="human"
- if(istype(input,/datum/species))
- input=input:id
- return input
-
-proc/kpcode_race_restricted(var/name="human")
- name=kpcode_race_san(name)
- if(kpcode_race_get(name))
- var/datum/species/D=kpcode_race_get(name)
- return D.restricted
- return 2
-/*
-proc/kpcode_race_tail(var/name="human")
- name=kpcode_race_san(name)
- if(kpcode_race_get(name))
- var/datum/species/D=kpcode_race_get(name)
- return D.tail
- return 0
-
-proc/kpcode_race_taur(var/name="human")
- name=kpcode_race_san(name)
- if(kpcode_race_get(name))
- var/datum/species/D=kpcode_race_get(name)
- if(D.taur==1)
- return D.id
- return D.taur
- return 0
-
-proc/kpcode_race_generic(var/name="human")
- name=kpcode_race_san(name)
- if(kpcode_race_get(name))
- var/datum/species/D=kpcode_race_get(name)
- return D.generic
- return 0
-
-proc/kpcode_race_adjective(var/name="human")
- name=kpcode_race_san(name)
- if(kpcode_race_get(name))
- var/datum/species/D=kpcode_race_get(name)
- return D.adjective
- return 0
-
-proc/kpcode_get_generic(var/mob/living/M)
- if(istype(M,/mob/living/carbon/human))
- if(M:dna)
- return kpcode_race_generic(M:dna:mutantrace())
- else
- return kpcode_race_generic("human")
- if(istype(M,/mob/living/carbon/monkey))
- return "monkey"
- if(istype(M,/mob/living/carbon/alien))
- return "xeno"
- if(istype(M,/mob/living/simple_animal))
- return M.name
- return "something"
-
-proc/kpcode_get_adjective(var/mob/living/M)
- if(istype(M,/mob/living/carbon/human))
- if(M:dna)
- return kpcode_race_adjective(M:dna:mutantrace())
- else
- return kpcode_race_adjective("human")
- if(istype(M,/mob/living/carbon/monkey))
- return "cranky"
- if(istype(M,/mob/living/carbon/alien))
- return "alien"
- if(istype(M,/mob/living/simple_animal))
- return "beastly"
- return "something"
-*/
\ No newline at end of file
+proc/get_racelist(var/mob/user)//This proc returns a list of species that 'user' has available to them. It searches the list of ckeys attached to the 'whitelist' var for a species and also checks if they're an admin.
+ for(var/spath in subtypesof(/datum/species))
+ var/datum/species/S = new spath()
+ var/list/wlist = S.whitelist
+ if(S.whitelisted && (wlist.Find(user.ckey) || wlist.Find(user.key) || user.client.holder)) //If your ckey is on the species whitelist or you're an admin:
+ whitelisted_species_list[S.id] = S.type //Add the species to their available species list.
+ else if(!S.whitelisted && S.roundstart) //Normal roundstart species will be handled here.
+ whitelisted_species_list[S.id] = S.type
+ return whitelisted_species_list
diff --git a/code/citadel/organs.dm b/code/citadel/organs.dm
index ef9359a2a9..7ba1fd0ac2 100644
--- a/code/citadel/organs.dm
+++ b/code/citadel/organs.dm
@@ -1,4 +1,3 @@
-
/obj/item/organ/stomach
name = "stomach"
icon_state = "stomach"
@@ -44,4 +43,3 @@
zone = "groin"
slot = "womb"
w_class = 3
-
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 5f494d3036..3c9de3b38c 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -117,6 +117,23 @@
soundin = pick('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
if ("ricochet")
soundin = pick( 'sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg','sound/weapons/effects/ric3.ogg','sound/weapons/effects/ric4.ogg','sound/weapons/effects/ric5.ogg')
+ if ("predsay")
+ soundin = pick('sound/voice/pred/predsay1.ogg', 'sound/voice/pred/predsay2.ogg', 'sound/voice/pred/predsay3.ogg')
+ if ("predroar")
+ soundin = pick('sound/voice/pred/predroar1.ogg', 'sound/voice/pred/predroar2.ogg')
+ if ("alienscreech")
+ soundin = pick('sound/alien/Voice/screech1.ogg', 'sound/alien/Voice/screech2.ogg', 'sound/alien/Voice/screech3.ogg', 'sound/alien/Voice/screech4.ogg')
+ //Scream emote sounds
+ if ("malescream")
+ soundin = pick('sound/voice/scream/scream_m1.ogg', 'sound/voice/scream/scream_m2.ogg')
+ if ("femscream")
+ soundin = pick('sound/voice/scream/scream_f1.ogg', 'sound/voice/scream/scream_f2.ogg', 'sound/voice/scream/scream_f3.ogg')
+ if ("drakescream")
+ soundin = pick('sound/voice/scream/drake1.ogg', 'sound/voice/scream/drake2.ogg')
+ if ("birdscream")
+ soundin = pick('sound/voice/scream/bird1.ogg', 'sound/voice/scream/bird2.ogg')
+ if ("mothscream")
+ soundin = pick('sound/voice/scream/moth1.ogg')
return soundin
/proc/playsound_global(file, repeat=0, wait, channel, volume)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 8fd54c1a9d..7a22e62d31 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -76,7 +76,11 @@ var/list/preferences_datums = list()
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
- var/list/features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "mam_body_markings" = "None", "mam_ears" = "None", "mam_tail" = "None", "mam_tail_animated" = "None")
+ var/list/features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "tail_lizard" = "Smooth",
+ "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None",
+ "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None",
+ "mam_body_markings" = "None", "mam_ears" = "None", "mam_tail" = "None", "mam_tail_animated" = "None",
+ "xenodorsal" = "None", "xenohead" = "None", "xenotail" = "None")
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
//Mob preview
@@ -340,7 +344,7 @@ var/list/preferences_datums = list()
dat += "[features["body_markings"]]
"
dat += ""
-//mammal bodyparts
+//Mammal bodyparts
if("mam_body_markings" in pref_species.mutant_bodyparts)
dat += "
"
@@ -368,6 +372,34 @@ var/list/preferences_datums = list()
dat += " | "
+//Xeno Bodyparts
+ if("xenohead" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Head/Caste"
+
+ dat += "[features["xenohead"]] "
+
+ dat += " | "
+
+ if("xenotail" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Tail"
+
+ dat += "[features["xenotail"]] "
+
+ dat += " | "
+
+ if("xenodorsal" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Dorsal Tubes"
+
+ dat += "[features["xenodorsal"]] "
+
+ dat += " | "
+
if(config.mutant_humans)
if("tail_human" in pref_species.mutant_bodyparts)
@@ -977,18 +1009,18 @@ var/list/preferences_datums = list()
if("species")
- var/result = input(user, "Select a species", "Species Selection") as null|anything in roundstart_species
+ var/result = input(user, "Select a species", "Species Selection") as null|anything in get_racelist(user)
if(result)
var/newtype = roundstart_species[result]
pref_species = new newtype()
//Now that we changed our species, we must verify that the mutant colour is still allowed.
var/temp_hsv = RGBtoHSV(features["mcolor"])
- if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3]))
+ if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
features["mcolor"] = pref_species.default_color
- if(features["mcolor2"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3]))
+ if(features["mcolor2"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
features["mcolor2"] = pref_species.default_color
- if(features["mcolor3"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3]))
+ if(features["mcolor3"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
features["mcolor3"] = pref_species.default_color
if("mutant_color")
@@ -1041,7 +1073,13 @@ var/list/preferences_datums = list()
new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in mam_tails_list
if(new_tail)
features["mam_tail"] = new_tail
-
+/* Doesn't exist yet. will include facial overlays to mimic 5th port species heads.
+ if("mam_snout")
+ var/new_snout
+ new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in mam_snouts_list
+ if(new_snout)
+ features["snout"] = new_snout
+*/
if("snout")
var/new_snout
new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snouts_list
@@ -1096,6 +1134,25 @@ var/list/preferences_datums = list()
if(new_mam_body_markings)
features["mam_body_markings"] = new_mam_body_markings
+ //Xeno Bodyparts
+ if("xenohead")//Head or caste type
+ var/new_head
+ new_head = input(user, "Choose your character's caste:", "Character Preference") as null|anything in xeno_head_list
+ if(new_head)
+ features["xenohead"] = new_head
+
+ if("xenotail")//Currently one one type, more maybe later if someone sprites them. Might include animated variants in the future.
+ var/new_tail
+ new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in xeno_tail_list
+ if(new_tail)
+ features["xenotail"] = new_tail
+
+ if("xenodorsal")
+ var/new_dors
+ new_dors = input(user, "Choose your character's dorsal tube type:", "Character Preference") as null|anything in xeno_dorsal_list
+ if(new_dors)
+ features["xenodorsal"] = new_dors
+
if("s_tone")
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones
if(new_s_tone)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 30d98ca110..d79b57ff93 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -377,6 +377,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_mam_tail"] >> features["mam_tail"]
S["feature_mam_ears"] >> features["mam_ears"]
S["feature_mam_tail_animated"] >> features["mam_tail_animated"]
+ //Xeno features
+ S["feature_xeno_tail"] >> features["xenotail"]
+ S["feature_xeno_dors"] >> features["xenodorsal"]
+ S["feature_xeno_head"] >> features["xenohead"]
if(!config.mutant_humans)
features["tail_human"] = "none"
features["ears"] = "none"
@@ -451,6 +455,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], mam_body_markings_list)
features["mam_ears"] = sanitize_inlist(features["mam_ears"], mam_ears_list)
features["mam_tail"] = sanitize_inlist(features["mam_tail"], mam_tails_list)
+ //Xeno features
+ features["xenotail"] = sanitize_inlist(features["xenotail"], xeno_tail_list)
+ features["xenohead"] = sanitize_inlist(features["xenohead"], xeno_head_list)
+ features["xenodorsal"] = sanitize_inlist(features["xenodorsal"], xeno_dorsal_list)
userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
@@ -508,6 +516,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_mam_tail"] << features["mam_tail"]
S["feature_mam_ears"] << features["mam_ears"]
S["feature_mam_tail_animated"] << features["mam_tail_animated"]
+ //Xeno features
+ S["feature_xeno_tail"] << features["xenotail"]
+ S["feature_xeno_dors"] << features["xenodorsal"]
+ S["feature_xeno_head"] << features["xenohead"]
+
S["clown_name"] << custom_names["clown"]
S["mime_name"] << custom_names["mime"]
S["ai_name"] << custom_names["ai"]
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 8ff63b5ffc..8b559e9220 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -169,3 +169,92 @@
name = "carp mask"
desc = "Gnash gnash."
icon_state = "carp_mask"
+
+/obj/item/clothing/mask/gas/yautja_fake
+ name = "ceremonial mask"
+ desc = "A beautifully designed metallic face mask. This one appears to be mostly decorative."
+ icon_state = "pred_mask"
+ flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDEHAIR
+ item_state = "pred_mask"
+ flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
+ burn_state = LAVA_PROOF
+ var/list/options = list()
+ var/current_skin = ""
+
+/obj/item/clothing/mask/gas/yautja_fake/New()
+ options["Jawbone"] = "jaw"
+ options["Plain"] = "plain"
+ options["Horned"] = "horn"
+ options["Winged"] = "wing"
+ options["Cancel"] = null
+
+/obj/item/clothing/mask/gas/yautja_fake/examine(mob/user)
+ ..()
+ if(!current_skin)
+ user << "Alt-click [src.name] to reskin it."
+
+/obj/item/clothing/mask/gas/yautja_fake/proc/reskin_mask(mob/M)
+ var/choice = input(M,"Warning, you can only reskin your mask once!","Reskin Mask") in options
+
+ if(src && choice && !current_skin && !M.incapacitated() && in_range(M,src))
+ if(options[choice] == null)
+ return
+ current_skin = options[choice]
+ icon_state = "[initial(icon_state)]_[current_skin]"
+ item_state = "[initial(item_state)]_[current_skin]"
+ M << "Your mask is now skinned as \"[choice]\"."
+ update_icon()
+ M.regenerate_icons()
+
+/obj/item/clothing/mask/gas/yautja_fake/AltClick(mob/user)
+ ..()
+ if(user.incapacitated())
+ user << "You can't do that right now!"
+ return
+ if(!current_skin && loc == user)
+ reskin_mask(user)
+
+/obj/item/clothing/mask/gas/yautja
+ name = "clan mask"
+ desc = "A beautifully designed metallic face mask. Both decorative and functional."
+ icon_state = "pred_mask"
+ flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDEHAIR
+ item_state = "pred_mask"
+ flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
+ burn_state = LAVA_PROOF
+ armor = list(melee = 50, bullet = 50, laser = 50,energy = 50, bomb = 50, bio = 80, rad = 50)
+ var/list/options = list()
+ var/current_skin = ""
+
+/obj/item/clothing/mask/gas/yautja/New()
+ options["Jawbone"] = "jaw"
+ options["Plain"] = "plain"
+ options["Horned"] = "horn"
+ options["Winged"] = "wing"
+ options["Cancel"] = null
+
+/obj/item/clothing/mask/gas/yautja/proc/reskin_mask(mob/M)
+ var/choice = input(M,"Warning, you can only reskin your mask once!","Reskin Mask") in options
+
+ if(src && choice && !current_skin && !M.incapacitated() && in_range(M,src))
+ if(options[choice] == null)
+ return
+ current_skin = options[choice]
+ icon_state = "[initial(icon_state)]_[current_skin]"
+ item_state = "[initial(item_state)]_[current_skin]"
+ M << "Your mask is now skinned as \"[choice]\"."
+ update_icon()
+ M.regenerate_icons()
+
+/obj/item/clothing/mask/gas/yautja/AltClick(mob/user)
+ ..()
+ if(user.incapacitated())
+ user << "You can't do that right now!"
+ return
+ if(!current_skin && loc == user)
+ reskin_mask(user)
+
+/obj/item/clothing/mask/gas/yautja/examine(mob/user)
+ ..()
+ if(!current_skin)
+ user << "Alt-click [src.name] to reskin it."
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index b021a20ba6..638e70fad5 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -162,3 +162,10 @@
icon_state = "griffinboots"
item_state = "griffinboots"
can_hold_items = 1
+
+/obj/item/clothing/shoes/yautja_fake
+ name = "clan greaves"
+ desc = "A pair of armored, perfectly balanced boots. Perfect for running through the jungle or the central primary hallway."
+ icon_state = "yautjaboots"
+ item_state = "yautjaboots"
+ can_hold_items = 1
\ No newline at end of file
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 6b9fe2ed2f..1ad08042ed 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -396,4 +396,49 @@
icon_state = "knight_templar"
item_state = "knight_templar"
+/obj/item/clothing/suit/armor/yautja_fake
+ name = "ceremonial breastplate"
+ desc = "Half of an aging, ceremonial breastplate. Its usefulness as armor are long gone."
+ icon_state = "yautjahalfarmor"
+ item_state = "yautjahalfarmor"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ unacidable = TRUE
+ burn_state = FIRE_PROOF
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ cold_protection = CHEST|GROIN|LEGS|ARMS
+ heat_protection = CHEST|GROIN|LEGS|ARMS
+ allowed = list(/obj/item/device/flashlight,
+ /obj/item/weapon/tank/internals,
+ /obj/item/weapon/resonator,
+ /obj/item/device/mining_scanner,
+ /obj/item/device/t_scanner/adv_mining_scanner,
+ /obj/item/weapon/gun/energy/kinetic_accelerator,
+ /obj/item/weapon/pickaxe)
+/obj/item/clothing/suit/armor/yautja
+ name = "clan breastplate"
+ desc = "An armored breastplate. This type is used by most clans for combat among elders."
+ icon_state = "yautjafullarmor"
+ item_state = "yautjafullarmor"
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 0, rad = 15)
+ unacidable = TRUE
+ burn_state = FIRE_PROOF
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ cold_protection = CHEST|GROIN|LEGS|ARMS
+ heat_protection = CHEST|GROIN|LEGS|ARMS
+ allowed = list(/obj/item/device/flashlight,
+ /obj/item/weapon/tank/internals,
+ /obj/item/weapon/resonator,
+ /obj/item/device/mining_scanner,
+ /obj/item/device/t_scanner/adv_mining_scanner,
+ /obj/item/weapon/gun,
+ /obj/item/weapon/pickaxe,
+ /obj/item/weapon/melee,
+ /obj/item/weapon/kitchen/knife)
+
+/obj/item/clothing/suit/armor/yautja/half
+ name = "clan half-breastplate"
+ desc = "Half of an armored breastplate. This type is used by most clans for combat among blooded."
+ icon_state = "yautjahalfarmor"
+ item_state = "yautjahalfarmor"
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 30, bio = 0, rad = 5)
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 90bc0615ec..465a8ef886 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -574,3 +574,22 @@
icon_state = "hostanclothes"
item_state = "hostanclothes"
item_color = "hostanclothes"
+
+/obj/item/clothing/under/mesh
+ name = "mesh suit"
+ desc = "A mesh of strong fabric worn underneath normal clothing and armor."
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ icon_state = "mesh_suit"
+ item_color = "mesh_suit"
+ item_state = "mesh_suit"
+ can_adjust = FALSE
+ burn_state = FIRE_PROOF
+ unacidable = TRUE
+
+/obj/item/clothing/under/mesh/top
+ name = "mesh shirt"
+ desc = "A mesh of strong fabric worn underneath normal clothing and armor."
+ body_parts_covered = CHEST|GROIN
+ icon_state = "mesh_shirt"
+ item_color = "mesh_shirt"
+ item_state = "mesh_shirt"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 57bf8848d5..1983917eaf 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -259,6 +259,21 @@
message = "[src] raises a hand."
m_type = 1
+ if ("roar","roars")
+ if (miming)
+ message = "[src] appears to roar!"
+ else
+ if(!muzzled && has_dna())
+ m_type = 2
+ message = "[src] roars!"
+ switch(dna.species.id)
+ if("pred")
+ playsound(get_turf(src), "predroar", 50, 0, 5)
+ if("xeno")
+ playsound(get_turf(src), "alienscreech", 50, 0, 5)
+ else
+ ..(act)
+
if ("salute","salutes")
if (!src.buckled)
var/M = null
@@ -279,6 +294,23 @@
if (miming)
message = "[src] acts out a scream!"
else
+ if(has_dna())
+ switch(dna.species.id) //Visit sound.dm to see and add more 'soundin' options. (alienscreech, malescream, femscream, etc)
+ if("xeno")
+ playsound(get_turf(src), "alienscreech", 50, 0, 5)
+ if("pred")
+ playsound(get_turf(src), "predroar", 50, 0, 5)
+ if("moth")
+ playsound(get_turf(src), "mothscream", 50, 1, 5)
+ if("lizard" || "drake")
+ playsound(get_turf(src), "drakescream", 50, 0, 5)
+ if("avian")
+ playsound(get_turf(src), "birdscream", 50, 0, 5)
+ else
+ if(gender == MALE)
+ playsound(get_turf(src), "malescream", 50, 0, 5)
+ if(gender == FEMALE)
+ playsound(get_turf(src), "femscream", 50, 0, 5)
..(act)
if ("shiver","shivers")
@@ -342,7 +374,13 @@
src << "Unusable emote '[act]'. Say *help for a list."
if ("help") //This can stay at the bottom.
- src << "Help for human emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, dance, dap, deathgasp, drool, eyebrow, faint, flap, frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, jump, laugh, look-(none)/mob, me, moan, mumble, nod, pale, point-(atom), raise, salute, scream, shake, shiver, shrug, sigh, signal-#1-10, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, wink, wings, wag, yawn"
+ if(has_dna(src))
+ switch(dna.species.id)//Set lists of emotes for specific species. Not the best way to do this, but the easiest considering they'll share most emotes.
+ if("pred")
+ src << "Help for yautja emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, dance, dap, deathgasp, drool, eyebrow, faint, flap, frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, jump, laugh, look-(none)/mob, me, moan, mumble, nod, pale, point-(atom), raise, roar, salute, scream, shake, shiver, shrug, sigh, signal-#1-10, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, wink, wings, wag, yawn"
+
+ else
+ src << "Help for human emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, dance, dap, deathgasp, drool, eyebrow, faint, flap, frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, jump, laugh, look-(none)/mob, me, moan, mumble, nod, pale, point-(atom), raise, salute, scream, shake, shiver, shrug, sigh, signal-#1-10, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, wink, wings, wag, yawn"
else
..(act)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index bcf835d31a..cd8a8f1e3f 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -357,7 +357,8 @@
msg += "\[View comment log\] "
msg += "\[Add comment\]\n"
- if(print_flavor_text()) msg += "[print_flavor_text()]\n"
+ if(print_flavor_text() && get_visible_name() != "Unknown")//Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
+ msg += "[print_flavor_text()]\n"
msg += "*---------*"
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index c7070d6416..83f630532f 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -94,6 +94,8 @@
if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask
var/obj/item/clothing/mask/MFP = src.wear_mask
number += MFP.flash_protect
+ if(istype(src.dna.species, /datum/species/xeno)) //Xenos don't have eyes.
+ number += 2 //So give them protection from flashes.
return number
/mob/living/carbon/human/check_ear_prot()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index cd5e18698b..67077b4790 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -26,7 +26,7 @@
var/roundstart = 0 // can this mob be chosen at roundstart? (assuming the config option is checked?)
var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race
- var/eyes = "eyes" // which eyes the race uses. at the moment, the only types of eyes are "eyes" (regular eyes) and "jelleyes" (three eyes)
+ var/eyes = "eyes" // which eyes the race uses(the icon state). "eyes" are for normal humans and most other races, check human_face.dmi to make new ones
var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows
var/hair_color = null // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color
var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent.
@@ -58,12 +58,10 @@
var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"]
var/fixed_mut_color2 = ""
var/fixed_mut_color3 = ""
- var/generic = "something"
- var/adjective = "unknown"
- var/restricted = 0 //Set to 1 to not allow anyone to choose it, 2 to hide it from the DNA scanner, and text to restrict it to one person
-// var/tail=0
-// var/taur=0
-
+ var/whitelisted = 0 //Is this species restricted to certain players?
+ var/whitelist = list() //List the ckeys that can use this species, if it's whitelisted.: list("John Doe", "poopface666", "SeeALiggerPullTheTrigger") Spaces & capitalization can be included or ignored entirely for each key as it checks for both.
+ var/lang_spoken = HUMAN
+ var/lang_understood = HUMAN
var/invis_sight = SEE_INVISIBLE_LIVING
var/darksight = 2
@@ -102,6 +100,11 @@
// PROCS //
///////////
+mob/living/carbon/human/proc/get_species()
+ if(has_dna())
+ return dna.species.id
+ else
+ return
/datum/species/New()
if(!limbs_id) //if we havent set a limbs id to use, just use our own id
@@ -149,6 +152,7 @@
if((NOBLOOD in specflags) && heart)
heart.Remove(C)
qdel(heart)
+
else if((!(NOBLOOD in specflags)) && (!heart))
heart = new()
heart.Insert(C)
@@ -156,6 +160,7 @@
if((NOBREATH in specflags) && lungs)
lungs.Remove(C)
qdel(lungs)
+
else if((!(NOBREATH in specflags)) && (!lungs))
lungs = new()
lungs.Insert(C)
@@ -163,6 +168,7 @@
if((NOHUNGER in specflags) && appendix)
appendix.Remove(C)
qdel(appendix)
+
else if((!(NOHUNGER in specflags)) && (!appendix))
appendix = new()
appendix.Insert(C)
@@ -174,6 +180,8 @@
if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
C.dna.blood_type = exotic_bloodtype
+ C.languages_spoken = lang_spoken
+ C.languages_understood = lang_understood
/datum/species/proc/on_species_loss(mob/living/carbon/C)
if(C.dna.species.exotic_bloodtype)
@@ -322,15 +330,8 @@
var/obj/item/bodypart/head/HD = H.get_bodypart("head")
- if("tail_lizard" in mutant_bodyparts)
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
- bodyparts_to_add -= "tail_lizard"
-
- if("waggingtail_lizard" in mutant_bodyparts)
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
- bodyparts_to_add -= "waggingtail_lizard"
- else if ("tail_lizard" in mutant_bodyparts)
- bodyparts_to_add -= "waggingtail_lizard"
+ //At this point, the game will decide which bodyparts it will render on the sprite of the player; depending on clothing worn, DNA, and other factors.
+ //This helps eliminate clipping with certain clothing types, as well as providing a means to effectively hide your species identity from other players.
if("tail_human" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
@@ -342,6 +343,22 @@
else if ("tail_human" in mutant_bodyparts)
bodyparts_to_add -= "waggingtail_human"
+ if("ears" in mutant_bodyparts)
+ if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == ORGAN_ROBOTIC)
+ bodyparts_to_add -= "ears"
+ //Race specific bodyparts:
+ //Xenos
+ if("xenodorsal" in mutant_bodyparts)
+ if(!H.dna.features["xenodorsal"] || H.dna.features["xenodorsal"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)))
+ bodyparts_to_add -= "xenodorsal"
+ if("xenohead" in mutant_bodyparts)//This is an overlay for different castes using different head crests
+ if(!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == ORGAN_ROBOTIC)
+ bodyparts_to_add -= "xenohead"
+ if("xenotail" in mutant_bodyparts)
+ if(!H.dna.features["xenotail"] || H.dna.features["xenotail"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "xenotail"
+
+ //Canids/Felids
if("mam_tail" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "mam_tail"
@@ -356,9 +373,27 @@
if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == ORGAN_ROBOTIC)
bodyparts_to_add -= "mam_ears"
- if("spines" in mutant_bodyparts)
- if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
- bodyparts_to_add -= "spines"
+ //Angels
+ if("wings" in mutant_bodyparts)//Will likely define these as "angel_wings" later so we can have cosmetic wings for other species.
+ if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)))
+ bodyparts_to_add -= "wings"
+
+ if("wings_open" in mutant_bodyparts)
+ if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "wings_open"
+ else if ("wings" in mutant_bodyparts)
+ bodyparts_to_add -= "wings_open"
+
+ //Lizards
+ if("tail_lizard" in mutant_bodyparts)
+ if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "tail_lizard"
+
+ if("waggingtail_lizard" in mutant_bodyparts)
+ if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "waggingtail_lizard"
+ else if ("tail_lizard" in mutant_bodyparts)
+ bodyparts_to_add -= "waggingtail_lizard"
if("waggingspines" in mutant_bodyparts)
if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
@@ -378,19 +413,21 @@
if(!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == ORGAN_ROBOTIC)
bodyparts_to_add -= "horns"
- if("ears" in mutant_bodyparts)
- if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == ORGAN_ROBOTIC)
- bodyparts_to_add -= "ears"
-
- if("wings" in mutant_bodyparts)
- if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)))
- bodyparts_to_add -= "wings"
-
- if("wings_open" in mutant_bodyparts)
+ if("spines" in mutant_bodyparts)
+ if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "spines"
+ //Slimecoons
+ if("slimecoontail" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
- bodyparts_to_add -= "wings_open"
- else if ("wings" in mutant_bodyparts)
- bodyparts_to_add -= "wings_open"
+ bodyparts_to_add -= "slimecoontail"
+
+ if("slimecoonears" in mutant_bodyparts)
+ if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == ORGAN_ROBOTIC)
+ bodyparts_to_add -= "slimecoonears"
+
+ if("slimecoonsnout" in mutant_bodyparts)
+ if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE)) || !HD || HD.status == ORGAN_ROBOTIC)
+ bodyparts_to_add -= "slimecoonsnout"
if(!bodyparts_to_add)
@@ -404,33 +441,16 @@
for(var/bodypart in bodyparts_to_add)
var/datum/sprite_accessory/S
switch(bodypart)
- if("tail_lizard")
- S = tails_list_lizard[H.dna.features["tail_lizard"]]
- if("waggingtail_lizard")
- S.= animated_tails_list_lizard[H.dna.features["tail_lizard"]]
if("tail_human")
S = tails_list_human[H.dna.features["tail_human"]]
if("waggingtail_human")
S.= animated_tails_list_human[H.dna.features["tail_human"]]
- if("spines")
- S = spines_list[H.dna.features["spines"]]
- if("waggingspines")
- S.= animated_spines_list[H.dna.features["spines"]]
- if("snout")
- S = snouts_list[H.dna.features["snout"]]
- if("frills")
- S = frills_list[H.dna.features["frills"]]
- if("horns")
- S = horns_list[H.dna.features["horns"]]
if("ears")
S = ears_list[H.dna.features["ears"]]
if("body_markings")
S = body_markings_list[H.dna.features["body_markings"]]
- if("wings")
- S = wings_list[H.dna.features["wings"]]
- if("wingsopen")
- S = wings_open_list[H.dna.features["wings"]]
- //mammal bodyparts
+
+ //Mammal Bodyparts (Canid/Felid, others maybe in the future)
if("mam_tail")
S = mam_tails_list[H.dna.features["mam_tail"]]
if("mam_waggingtail")
@@ -440,16 +460,56 @@
if("mam_ears")
S = mam_ears_list[H.dna.features["mam_ears"]]
+ //Lizard Bodyparts
+ if("tail_lizard")
+ S = tails_list_lizard[H.dna.features["tail_lizard"]]
+ if("waggingtail_lizard")
+ S.= animated_tails_list_lizard[H.dna.features["tail_lizard"]]
+ if("spines")
+ S = spines_list[H.dna.features["spines"]]
+ if("waggingspines")
+ S.= animated_spines_list[H.dna.features["spines"]]
+ if("snout")//This is shared between lizard and mammals currently.(9/8/16)
+ S = snouts_list[H.dna.features["snout"]]
+ if("frills")
+ S = frills_list[H.dna.features["frills"]]
+ if("horns")
+ S = horns_list[H.dna.features["horns"]]
+
+ //Xeno Bodyparts
+ if("xenodorsal")
+ S = xeno_dorsal_list[H.dna.features["xenodorsal"]]
+ if("xenohead")
+ S = xeno_head_list[H.dna.features["xenohead"]]
+ if("xenotail")
+ S = xeno_tail_list[H.dna.features["xenotail"]]
+
+ //Angel Bodyparts
+ if("wings")
+ S = wings_list[H.dna.features["wings"]]
+ if("wingsopen")
+ S = wings_open_list[H.dna.features["wings"]]
+
+ //Slimecoon Bodyparts
+ if("slimecoontail")
+ S = /datum/sprite_accessory/slimecoon_tail
+ if("slimecoonears")
+ S = /datum/sprite_accessory/slimecoon_ears
+ if("slimecoonsnout")
+ S = /datum/sprite_accessory/slimecoon_snout
+
if(!S || S.icon_state == "none")
continue
//A little rename so we don't have to use tail_lizard or tail_human when naming the sprites.
- if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail")
+ if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail" || bodypart == "slimecoontail" || bodypart == "xenotail")
bodypart = "tail"
else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human" || bodypart == "mam_waggingtail")
bodypart = "waggingtail"
if(bodypart == "mam_ears")
bodypart = "ears"
+ if(bodypart == "xenohead")
+ bodypart = "xhead"
var/icon_string
@@ -495,7 +555,7 @@
standing += I
- if(S.hasinner)
+ if(S.hasinner) //apply the inner ear sprite
if(S.gender_specific)
icon_string = "[g]_[bodypart]inner_[S.icon_state]_[layer]"
else
@@ -508,7 +568,7 @@
standing += I
- if(S.extra)
+ if(S.extra) //apply the extra overlay, if there is one
if(S.gender_specific)
icon_string = "[g]_[bodypart]_extra_[S.icon_state]_[layer]"
else
@@ -519,7 +579,7 @@
if(S.center)
I = center_image(I,S.dimension_x,S.dimension_y)
- switch(S.extra_color_src)
+ switch(S.extra_color_src) //change the color of the extra overlay
if(MUTCOLORS)
if(fixed_mut_color)
I.color = "#[fixed_mut_color]"
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index 6361369727..0b35a1d691 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -3,6 +3,7 @@
*/
/datum/species/human
+ roundstart = 1
name = "Human"
id = "human"
default_color = "FFFFFF"
@@ -94,6 +95,7 @@
/datum/species/pod
// A mutation caused by a human being ressurected in a revival pod. These regain health in light, and begin to wither in darkness.
+ roundstart = 1
name = "Podperson"
id = "pod"
default_color = "59CE00"
@@ -166,7 +168,6 @@
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE)
dangerous_existence = 1
- restricted = 2
/datum/species/shadow/spec_life(mob/living/carbon/human/H)
var/light_amount = 0
@@ -194,7 +195,6 @@
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime
exotic_blood = "slimejelly"
var/datum/action/innate/regenerate_limbs/regenerate_limbs
- restricted = 2
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
if(regenerate_limbs)
@@ -539,7 +539,6 @@
dangerous_existence = TRUE
limbs_id = "golem"
fixed_mut_color = "aaa"
- restricted = 2
/datum/species/golem/random
name = "Random Golem"
@@ -595,6 +594,7 @@
name = "Human?"
id = "fly"
say_mod = "buzzes"
+ eyes = "flyeyes"
mutant_organs = list(/obj/item/organ/tongue/fly)
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly
@@ -630,7 +630,6 @@
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
specflags = list(NOBREATH,RESISTTEMP,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT)
mutant_organs = list(/obj/item/organ/tongue/bone)
- restricted = 2
/*
ZOMBIES
@@ -647,7 +646,6 @@
specflags = list(NOBREATH,RESISTTEMP,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT, TOXINLOVER)
mutant_organs = list(/obj/item/organ/tongue/zombie)
speedmod = 2
- restricted = 2
/datum/species/zombie/infectious
name = "Infectious Zombie"
@@ -694,7 +692,6 @@
sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
mutant_organs = list(/obj/item/organ/tongue/zombie)
- restricted = 2
/datum/species/abductor
name = "Abductor"
@@ -707,7 +704,6 @@
var/scientist = 0 // vars to not pollute spieces list with castes
var/agent = 0
var/team = 1
- restricted = 2
var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_state"="plasmaman")
@@ -782,7 +778,6 @@ var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_
var/list/initial_specflags = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //for getting these values back for assume_disguise()
var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
- restricted = 2
roundstart = 0
/datum/species/synth/military
@@ -793,7 +788,6 @@ var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_
punchdamagehigh = 19
punchstunthreshold = 14 //about 50% chance to stun
disguise_fail_health = 50
- restricted = 2
/datum/species/synth/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
..()
@@ -914,7 +908,6 @@ SYNDICATE BLACK OPS
use_skintones = 0
specflags = list(RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER,NOHUNGER)
sexes = 0
- restricted = 2
/datum/species/angel
name = "Angel"
@@ -926,7 +919,6 @@ SYNDICATE BLACK OPS
use_skintones = 1
no_equip = list(slot_back)
blacklisted = 1
- restricted = 2
limbs_id = "human"
skinned_type = /obj/item/stack/sheet/animalhide/human
@@ -1098,7 +1090,7 @@ datum/species/canid
H.endTailWag()
//AVIAN//
-/datum/species/ave
+/datum/species/avian
name = "Avian"
id = "avian"
default_color = "BCAC9B"
@@ -1114,36 +1106,46 @@ datum/species/canid
//HERBIVOROUS//
//EXOTIC//
+//These races will likely include lots of downsides and upsides. Keep them relatively balanced.//
/datum/species/xeno
name = "Xenomorph"
id = "xeno"
- default_color = "BCAC9B"
say_mod = "hisses"
- eyes = "eyes_xeno"
- specflags = list(NOGUNS,MUTCOLORS)
- mutant_bodyparts = list("xeno_head", "dorsal_tubes")
- default_features = list("xeno_head" = "None", "dorsal_tubes" = "None")
+ eyes = "none"
+ specflags = list()
+ mutant_organs = list(/obj/item/organ/tongue/alien)
+ mutant_bodyparts = list("xenohead",
+ "xenodorsal",
+ "xenotail")
+ default_features = list("xenohead"="Hunter",
+ "xenodorsal"="Dorsal Tubes",
+ "xenotail"="Xenomorph Tail")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
- burnmod = 1.5
- heatmod = 1.5
- safe_toxins_max = 9999999
+ burnmod = 1.75
+ heatmod = 1.75
+ darksight = 4 //Just above slimes
exotic_blood = "xblood"
exotic_damage_overlay = "xeno"
- roundstart = 0 //wip
- blacklisted = 1 //so xenobio can't steal the broken races
no_equip = list(slot_glasses) //MY EYES, THEY'RE GONE
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno
skinned_type = /obj/item/stack/sheet/animalhide/xeno
+ safe_toxins_max = 32 //Too much of anything is bad.
+ roundstart = 1
+// whitelisted = 1
+// whitelist = list("talkingcactus") //testing whitelisting
/datum/species/xeno/on_species_gain(mob/living/carbon/C, datum/species/old_species)
+ ..()
var/obj/effect/decal/cleanable/xenoblood/xgibs/XG
if(istype(C.gib_type, XG))
return
else
C.gib_type = XG
+
/datum/species/xeno/on_species_loss(mob/living/carbon/C)
+ ..()
var/obj/effect/decal/cleanable/xenoblood/xgibs/XG
var/obj/effect/decal/cleanable/blood/gibs/HG
if(istype(C.gib_type, XG))
@@ -1156,5 +1158,57 @@ datum/species/canid
id = "xblood"
description = "A highly corrosive substance, it is capable of burning through most natural or man-made materials in short order."
color = "#66CC00"
- toxpwr = 0.5
+ toxpwr = 0
acidpwr = 12
+
+/datum/species/yautja
+ name = "Yautja"
+ id = "pred"
+ say_mod = "clicks"
+ eyes = "predeyes"
+ mutant_organs = list(/obj/item/organ/tongue/yautja)
+ specflags = list(EYECOLOR)
+ lang_spoken = YAUTJA
+ lang_understood = HUMAN|YAUTJA|ALIEN
+ no_equip = list(slot_head)
+ punchdamagelow = 4
+ punchdamagehigh = 14
+ punchstunthreshold = 13
+ blacklisted = 1
+ roundstart = 0
+ whitelist = 1
+ whitelist = list("talkingcactus")
+
+/datum/outfit/yautja_basic
+ name = "Yautja, Basic"
+ uniform = /obj/item/clothing/under/mesh
+ suit = /obj/item/clothing/suit/armor/yautja_fake
+ shoes = /obj/item/clothing/shoes/yautja_fake
+ mask = /obj/item/clothing/mask/gas/yautja_fake
+
+/datum/species/yautja/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
+ var/datum/outfit/yautja_basic/O = new /datum/outfit/yautja_basic//Just basic gear. Doesn't include anything that gives any meaningful advantage.
+ H.equipOutfit(O, visualsOnly)
+ return 0
+
+/datum/species/octopus
+ blacklisted = 1
+/datum/species/carp
+ blacklisted = 1
+/datum/species/horse
+ blacklisted = 1
+
+///////////////////
+//DONATOR SPECIES//
+///////////////////
+
+//ChronoFlux: Slimecoon
+/datum/species/jelly/slime/slimecoon
+ name = "Slime Raccoon"
+ id = "slimecoon"
+ limbs_id = "slime"
+ whitelisted = 1
+ whitelist = list("chronoflux")
+ blacklisted = 1
+ mutant_bodyparts = list("slimecoontail", "slimecoonears", "slimecoonsnout")
+ default_features = list("slimecoontail" = "Slimecoon Tail", "slimecoonears" = "Slimecoon Ears", "slimecoonsnout" = "Slimecoon Snout")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 0e52ed64e2..3ffdb81f07 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -640,10 +640,25 @@ Sorry Giacom. Please don't be mad :(
..()
/mob/living/proc/getTrail()
- if(getBruteLoss() < 300)
- return pick("ltrails_1", "ltrails_2")
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ var/species = H.dna.species.id
+ if(species == "xeno") //Here we can define custom blood trails for different species; copy+paste the xenos species to add new ones.
+ if(getBruteLoss() < 300)
+ return pick (list("xltrails_1", "xltrails2"))
+ else
+ return pick (list("xttrails_1", "xttrails2"))
+ else
+ if(getBruteLoss() < 300)
+ return pick("ltrails_1", "ltrails_2")
+ else
+ return pick("trails_1", "trails_2")
+
else
- return pick("trails_1", "trails_2")
+ if(getBruteLoss() < 300)
+ return pick("ltrails_1", "ltrails_2")
+ else
+ return pick("trails_1", "trails_2")
/mob/living/verb/resist()
set name = "Resist"
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 09516fb25a..db0f66893e 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -60,9 +60,10 @@
var/dimension_x = 32
var/dimension_y = 32
var/center = FALSE //Should we center the sprite?
- var/extra = 0 //Used for extra overlays on top of the bodypart that may be colored seperately. Uses the secondary mutant color as default. See species.dm for the actual overlay code.
+ var/extra = 0 //Used for extra overlays on top of the bodypart that may be colored seperately. Uses the secondary mutant color as default. See species.dm for the actual overlay code.
var/extra_icon = 'icons/mob/mam_bodyparts.dmi'
- var/extra_color_src = MUTCOLORS2 //The color source for the extra overlay.
+ var/extra_color_src = MUTCOLORS2 //The color source for the extra overlay.
+
//////////////////////
// Hair Definitions //
//////////////////////
@@ -1419,7 +1420,7 @@
/datum/sprite_accessory/ears/wolf
name = "Wolf"
icon_state = "wolf"
- hasinner = 0
+ hasinner = 1
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/fox
@@ -1487,24 +1488,73 @@
icon = 'icons/mob/mam_bodyparts.dmi'
extra = 1
+/datum/sprite_accessory/ears/murid
+ name = "Murid"
+ icon_state = "murid"
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
+/datum/sprite_accessory/tails/human/murid
+ name = "Murid"
+ icon_state = "murid"
+ color_src = 0
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
+/datum/sprite_accessory/tails_animated/human/murid
+ name = "Murid"
+ icon_state = "murid"
+ color_src = 0
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
+/datum/sprite_accessory/ears/squirrel
+ name = "Squirrel"
+ icon_state = "squirrel"
+ hasinner= 1
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
+/datum/sprite_accessory/tails/human/squirrel
+ name = "Squirrel"
+ icon_state = "squirrel"
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
+/datum/sprite_accessory/tails_animated/human/squirrel
+ name = "Squirrel"
+ icon_state = "squirrel"
+ icon = 'icons/mob/mam_bodyparts.dmi'
+
//Mammal Bodyparts
/datum/sprite_accessory/mam_ears
icon = 'icons/mob/mam_bodyparts.dmi'
+/datum/sprite_accessory/mam_ears/none
+ name = "None"
/datum/sprite_accessory/mam_tails
icon = 'icons/mob/mam_bodyparts.dmi'
+/datum/sprite_accessory/mam_tails/none
+ name = "None"
/datum/sprite_accessory/mam_tails_animated
icon = 'icons/mob/mam_bodyparts.dmi'
+/datum/sprite_accessory/mam_tails_animated/none
+ name = "None"
//Snouts
/datum/sprite_accessory/snouts/lcanid
- name = "Long, Thin"
+ name = "Fox, Long"
icon_state = "lcanid"
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+ extra = 1
/datum/sprite_accessory/snouts/scanid
- name = "Short, Thin"
+ name = "Fox, Short"
icon_state = "scanid"
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+ extra = 1
+
+/datum/sprite_accessory/snouts/wolf
+ name = "Wolf"
+ icon_state = "wolf"
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+ extra = 1
//Cat, Big
/datum/sprite_accessory/mam_ears/catbig
@@ -1571,7 +1621,6 @@
/datum/sprite_accessory/mam_ears/lab
name = "Dog, Long"
icon_state = "lab"
- hasinner = 0
/datum/sprite_accessory/mam_tails/lab
name = "Lab"
@@ -1587,6 +1636,40 @@
icon_state = "husky"
extra = 1
+/datum/sprite_accessory/mam_tails_animated/husky
+ name = "Husky"
+ icon_state = "husky"
+ extra = 1
+
+//Murid
+/datum/sprite_accessory/mam_ears/murid
+ name = "Murid"
+ icon_state = "murid"
+
+/datum/sprite_accessory/mam_tails/murid
+ name = "Murid"
+ icon_state = "murid"
+ color_src = 0
+
+/datum/sprite_accessory/mam_tails_animated/murid
+ name = "Murid"
+ icon_state = "murid"
+ color_src = 0
+
+//Squirrel
+/datum/sprite_accessory/mam_ears/squirrel
+ name = "Squirrel"
+ icon_state = "squirrel"
+ hasinner= 1
+
+/datum/sprite_accessory/mam_tails/squirrel
+ name = "Squirrel"
+ icon_state = "squirrel"
+
+/datum/sprite_accessory/mam_tails_animated/squirrel
+ name = "Squirrel"
+ icon_state = "squirrel"
+
//Mammal Specific Body Markings
/datum/sprite_accessory/mam_body_markings
color_src = MUTCOLORS2
@@ -1609,14 +1692,61 @@
extra_color_src = MUTCOLORS3
*/
-//Exotic Bodyparts
-/*
+//Xeno Dorsal Tubes
/datum/sprite_accessory/xeno_dorsal
- locked = 1
+ icon = 'icons/mob/exotic_bodyparts.dmi'
+ color_src = 0
+
+/datum/sprite_accessory/xeno_dorsal/none
+ name = "None"
+
+/datum/sprite_accessory/xeno_dorsal/normal
name = "Dorsal Tubes"
- icon_state "dortubes"
-/datum/sprite_accessory/tails/xeno
- locked = 1
+ icon_state = "dortubes"
+
+//Xeno Tail
+/datum/sprite_accessory/xeno_tail
+ icon = 'icons/mob/exotic_bodyparts.dmi'
+ color_src = 0
+
+/datum/sprite_accessory/xeno_tail/none
+ name = "None"
+
+/datum/sprite_accessory/xeno_tail/normal
name = "Xenomorph Tail"
- icon_state = "xenotail"
-*/
\ No newline at end of file
+ icon_state = "xeno"
+
+//Xeno Caste Heads
+//unused as of October 3, 2016
+/datum/sprite_accessory/xeno_head
+ icon = 'icons/mob/exotic_bodyparts.dmi'
+ color_src = 0
+
+/datum/sprite_accessory/xeno_head/none
+ name = "None"
+
+/datum/sprite_accessory/xeno_head/hunter
+ name = "Hunter"
+ icon_state = "hunter"
+
+/datum/sprite_accessory/xeno_head/drone
+ name = "Drone"
+ icon_state = "drone"
+
+/datum/sprite_accessory/xeno_head/sentinel
+ name = "Sentinel"
+ icon_state = "sentinel"
+
+//Slimecoon Parts
+/datum/sprite_accessory/slimecoon_ears
+ icon = 'icons/mob/exotic_bodyparts.dmi'
+ name = "Slimecoon Ears"
+ icon_state = "slimecoon"
+/datum/sprite_accessory/slimecoon_tail
+ icon = 'icons/mob/exotic_bodyparts.dmi'
+ name = "Slimecoon Tail"
+ icon_state = "slimecoon"
+/datum/sprite_accessory/slimecoon_snout
+ icon = 'icons/mob/exotic_bodyparts.dmi'
+ name = "Hunter"
+ icon_state = "slimecoon"
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index ca49e5cc12..b8bf291090 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -25,7 +25,7 @@
var/paused = FALSE //for suspending the projectile midair
var/p_x = 16
var/p_y = 16 // the pixel location of the tile that the player clicked. Default is the center
- var/speed = 1 //Amount of deciseconds it takes for projectile to travel
+ var/speed = 0.1 //Amount of deciseconds it takes for projectile to travel
var/Angle = 0
var/spread = 0 //amount (in degrees) of projectile spread
var/legacy = 0 //legacy projectile system
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 11f44dbc52..2db1424345 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -688,6 +688,8 @@
/datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume)
if(!istype(C))
return
+ if(C.dna && C.dna.species.id == "xeno")
+ return
reac_volume = round(reac_volume,0.1)
if(method == INGEST)
C.adjustBruteLoss(min(6*toxpwr, reac_volume * toxpwr))
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index e1faf60ea6..acb27d5c4c 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -358,10 +358,10 @@
name = "alien tongue"
desc = "According to leading xenobiologists the evolutionary benefit of having a second mouth in your mouth is \"that it looks badass\"."
icon_state = "tonguexeno"
- say_mod = "hiss"
+ say_mod = "hisses"
/obj/item/organ/tongue/alien/TongueSpeech(var/message)
- playsound(owner, "hiss", 25, 1, 1)
+ playsound(owner, "hiss", 15, 1, 1)
return message
/obj/item/organ/tongue/bone
@@ -433,3 +433,13 @@
if(inflamed)
S.reagents.add_reagent("????", 5)
return S
+
+/obj/item/organ/tongue/yautja
+ name = "yautja tongue"
+ desc = "You're having a hard time even deciding if this is a tongue or not."
+ icon_state = "tongueyautja"
+ say_mod = "clicks"
+
+/obj/item/organ/tongue/yautja/TongueSpeech(var/message)
+ playsound(owner, "predsay", 50, 0, 1)
+ return message
\ No newline at end of file
diff --git a/config/config.txt b/config/config.txt
index d04cd64cd3..38ff81a760 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -254,7 +254,7 @@ ANNOUNCE_ADMIN_LOGOUT
## GENERATE_MINIMAPS
## Generating minimaps(For crew monitor) is slow and bogs down testing, so its disabled by default and must be enabled by uncommenting this config if you are running a production server.
-#GENERATE_MINIMAPS
+GENERATE_MINIMAPS
## CLIENT VERSION CONTROL
## This allows you to configure the minimum required client version, as well as a warning version, and message for both.
diff --git a/config/game_options.txt b/config/game_options.txt
index 5ed42b37cd..efe59f12d2 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -274,20 +274,21 @@ JOIN_WITH_MUTANT_RACE
## Uncommenting races will allow them to be choosen at roundstart while join_with_muntant_race is on. You'll need at least one.
## You probably want humans on your space station, but technically speaking you can turn them off without any ill effect
-ROUNDSTART_RACES human
+#ROUNDSTART_RACES human
## Races because TG is racist
-ROUNDSTART_RACES canid
-ROUNDSTART_RACES felid
+#ROUNDSTART_RACES canid
+#ROUNDSTART_RACES felid
+#ROUNDSTART_RACES xeno
#ROUNDSTART_RACES avian
#ROUNDSTART_RACES rodent
#ROUNDSTART_RACES herbivorous
#ROUNDSTART_RACES exotic
## Races that are strictly worse than humans that could probably be turned on without balance concerns
-ROUNDSTART_RACES lizard
-ROUNDSTART_RACES fly
-ROUNDSTART_RACES plasmaman
+#ROUNDSTART_RACES lizard
+#ROUNDSTART_RACES fly
+#ROUNDSTART_RACES plasmaman
#ROUNDSTART_RACES shadow
#ROUNDSTART_RACES shadowling
@@ -306,7 +307,7 @@ ROUNDSTART_RACES plasmaman
## Races that are straight upgrades. If these are on expect powergamers to always pick them
#ROUNDSTART_RACES skeleton
#ROUNDSTART_RACES zombie
-ROUNDSTART_RACES slime
+#ROUNDSTART_RACES slime
#ROUNDSTART_RACES pod
#ROUNDSTART_RACES military_synth
#ROUNDSTART_RACES agent
diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi
index ebceed99a1..b057b6d8bb 100644
Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ
diff --git a/icons/mob/exotic_bodyparts.dmi b/icons/mob/exotic_bodyparts.dmi
new file mode 100644
index 0000000000..71d37be990
Binary files /dev/null and b/icons/mob/exotic_bodyparts.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index f68b23f4ba..d779ff9d5d 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 015eee1794..1b2102aa7d 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index b0a1fc7a3b..c82951a832 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index b783d965b4..0c3b02c3fc 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/mam_bodyparts.dmi b/icons/mob/mam_bodyparts.dmi
index 9925e7a539..e67f6afd18 100644
Binary files a/icons/mob/mam_bodyparts.dmi and b/icons/mob/mam_bodyparts.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index e82945a3a9..fd8de84425 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index 173c6f0b0d..f75a855ac7 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index d8a303241e..60fed9e501 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 836b5da822..2647953565 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 331e541f7d..872acd78a8 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 9450f42528..a66b382419 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 8998ce032b..17ee04cc12 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 14a0963995..08ab551563 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index a604b6e302..565b6f8bcc 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 78bb775406..fd6dab68c6 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/sound/voice/pred/predroar1.ogg b/sound/voice/pred/predroar1.ogg
new file mode 100644
index 0000000000..9745d0d356
Binary files /dev/null and b/sound/voice/pred/predroar1.ogg differ
diff --git a/sound/voice/pred/predroar2.ogg b/sound/voice/pred/predroar2.ogg
new file mode 100644
index 0000000000..ae18509044
Binary files /dev/null and b/sound/voice/pred/predroar2.ogg differ
diff --git a/sound/voice/pred/predsay1.ogg b/sound/voice/pred/predsay1.ogg
new file mode 100644
index 0000000000..76790c3253
Binary files /dev/null and b/sound/voice/pred/predsay1.ogg differ
diff --git a/sound/voice/pred/predsay2.ogg b/sound/voice/pred/predsay2.ogg
new file mode 100644
index 0000000000..001c9736fa
Binary files /dev/null and b/sound/voice/pred/predsay2.ogg differ
diff --git a/sound/voice/pred/predsay3.ogg b/sound/voice/pred/predsay3.ogg
new file mode 100644
index 0000000000..50625f3e9d
Binary files /dev/null and b/sound/voice/pred/predsay3.ogg differ
diff --git a/sound/voice/scream/bird1.ogg b/sound/voice/scream/bird1.ogg
new file mode 100644
index 0000000000..121ee5ec25
Binary files /dev/null and b/sound/voice/scream/bird1.ogg differ
diff --git a/sound/voice/scream/bird2.ogg b/sound/voice/scream/bird2.ogg
new file mode 100644
index 0000000000..f66179cdf6
Binary files /dev/null and b/sound/voice/scream/bird2.ogg differ
diff --git a/sound/voice/scream/drake1.ogg b/sound/voice/scream/drake1.ogg
new file mode 100644
index 0000000000..82dd6dc60a
Binary files /dev/null and b/sound/voice/scream/drake1.ogg differ
diff --git a/sound/voice/scream/drake2.ogg b/sound/voice/scream/drake2.ogg
new file mode 100644
index 0000000000..9900f093df
Binary files /dev/null and b/sound/voice/scream/drake2.ogg differ
diff --git a/sound/voice/scream/moth1.ogg b/sound/voice/scream/moth1.ogg
new file mode 100644
index 0000000000..c94644fc17
Binary files /dev/null and b/sound/voice/scream/moth1.ogg differ
diff --git a/sound/voice/scream/scream_f1.ogg b/sound/voice/scream/scream_f1.ogg
new file mode 100644
index 0000000000..499d327325
Binary files /dev/null and b/sound/voice/scream/scream_f1.ogg differ
diff --git a/sound/voice/scream/scream_f2.ogg b/sound/voice/scream/scream_f2.ogg
new file mode 100644
index 0000000000..8e2b6f13f7
Binary files /dev/null and b/sound/voice/scream/scream_f2.ogg differ
diff --git a/sound/voice/scream/scream_f3.ogg b/sound/voice/scream/scream_f3.ogg
new file mode 100644
index 0000000000..f90840cc87
Binary files /dev/null and b/sound/voice/scream/scream_f3.ogg differ
diff --git a/sound/voice/scream/scream_m1.ogg b/sound/voice/scream/scream_m1.ogg
new file mode 100644
index 0000000000..a09dd04d51
Binary files /dev/null and b/sound/voice/scream/scream_m1.ogg differ
diff --git a/sound/voice/scream/scream_m2.ogg b/sound/voice/scream/scream_m2.ogg
new file mode 100644
index 0000000000..bb67b84072
Binary files /dev/null and b/sound/voice/scream/scream_m2.ogg differ
diff --git a/sound/voice/scream/scream_r.ogg b/sound/voice/scream/scream_r.ogg
new file mode 100644
index 0000000000..511260a2b2
Binary files /dev/null and b/sound/voice/scream/scream_r.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index f018c061bc..0178f59e15 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -128,8 +128,10 @@
#include "code\_onclick\hud\robot.dm"
#include "code\_onclick\hud\screen_objects.dm"
#include "code\_onclick\hud\swarmer.dm"
+#include "code\citadel\_helpers.dm"
#include "code\citadel\dogborgs.dm"
#include "code\citadel\dogborgstuff.dm"
+#include "code\citadel\organs.dm"
#include "code\citadel\pokemon.dm"
#include "code\citadel\vore\hook-defs_vr.dm"
#include "code\citadel\vore\trycatch_vr.dm"