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"