diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 2c5c77ffa9c..5c1f427a27e 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -49,6 +49,7 @@ #define NO_INTORGANS 4096 #define NO_POISON 8192 #define RADIMMUNE 16384 +#define ALL_RPARTS 32768 //Species clothing flags #define HAS_UNDERWEAR 1 diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index e30e904a462..001f2b148ce 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -46,6 +46,7 @@ proc/random_hair_style(var/gender, species = "Human") continue if( !(species in S.species_allowed)) continue + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] if(valid_hairstyles.len) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 0cf3a0d2853..ba8513981ea 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -2,7 +2,7 @@ //Head accessory styles var/global/list/head_accessory_styles_list = list() //stores /datum/sprite_accessory/head_accessory indexed by name //Marking styles -var/global/list/marking_styles_list = list() //stores /datum/sprite_accessory/horns indexed by name +var/global/list/marking_styles_list = list() //stores /datum/sprite_accessory/body_markings indexed by name //Hairstyles var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name var/global/list/hair_styles_male_list = list() diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 409679d4ac3..8a413049af4 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -95,6 +95,10 @@ if(!get_location_accessible(H, "mouth")) user << "The mask is in the way." return + if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one... + if(!H.client.prefs.rlimb_data["head"]) + user << "You find yourself disappointed at the appalling lack of facial hair." + return if(H.f_style == "Shaved") user << "Already clean-shaven." return @@ -123,6 +127,10 @@ if(!get_location_accessible(H, "head")) user << "The headgear is in the way." return + if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one... + if(!H.client.prefs.rlimb_data["head"]) + user << "You find yourself disappointed at the appalling lack of hair." + return if(H.h_style == "Bald" || H.h_style == "Balding Hair" || H.h_style == "Skinhead") user << "There is not enough hair left to shave..." return diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index 577f4b113b3..34b700d440d 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -34,8 +34,14 @@ if(H.species) for(var/i in facial_hair_styles_list) var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i] - if(H.species.name in tmp_facial.species_allowed) + if(H.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles. species_facial_hair += i + else + if(H.species.flags & ALL_RPARTS) + if(("head" in H.client.prefs.rlimb_data) && ("Human" in tmp_facial.species_allowed)) + species_facial_hair += i + else + return else species_facial_hair = facial_hair_styles_list var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair @@ -44,8 +50,16 @@ if(H.species) for(var/i in hair_styles_list) var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] - if(H.species.name in tmp_hair.species_allowed) + if(H.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles. + if((H.species.flags & ALL_RPARTS) && !("head" in H.client.prefs.rlimb_data)) + return species_hair += i + else + if(H.species.flags & ALL_RPARTS) + if(("head" in H.client.prefs.rlimb_data) && ("Human" in tmp_hair.species_allowed)) + species_facial_hair += i + else + return else species_hair = hair_styles_list var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 4e0fbd3a666..f6a903ac10e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -446,7 +446,7 @@ var/list/admin_verbs_proccall = list ( /client/proc/big_brother() set category = "Admin" set name = "Big Brother Mode" - + if(!check_rights(R_PERMISSIONS)) return @@ -809,7 +809,17 @@ var/list/admin_verbs_proccall = list ( return if(!istype(H)) - return + if(istype(H, /mob/living/carbon/brain)) + var/mob/living/carbon/brain/B = H + if(istype(B.container, /obj/item/device/mmi/posibrain/ipc)) + var/obj/item/device/mmi/posibrain/ipc/C = B.container + var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc + if(istype(P.owner, /mob/living/carbon/human)) + H = P.owner + else + return + else + return if(holder) admin_log_and_message_admins("is altering the appearance of [H].") @@ -825,7 +835,17 @@ var/list/admin_verbs_proccall = list ( return if(!istype(H)) - return + if(istype(H, /mob/living/carbon/brain)) + var/mob/living/carbon/brain/B = H + if(istype(B.container, /obj/item/device/mmi/posibrain/ipc)) + var/obj/item/device/mmi/posibrain/ipc/C = B.container + var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc + if(istype(P.owner, /mob/living/carbon/human)) + H = P.owner + else + return + else + return if(!H.client) usr << "Only mobs with clients can alter their own appearance." diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 077af57dfee..650cce78080 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -255,7 +255,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts // dat += "Skin pattern: Adjust
" dat += "
Handicaps
" dat += "\t\[Set Disabilities\]
" - dat += "Limbs: Adjust
" + dat += "Limbs and Parts: Adjust
" if(species != "Slime People" && species != "Machine") dat += "Internal Organs: Adjust
" @@ -266,6 +266,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/status = organ_data[name] var/organ_name = null switch(name) + if("chest") + organ_name = "torso" + if("groin") + organ_name = "lower body" + if("head") + organ_name = "head" if("l_arm") organ_name = "left arm" if("r_arm") @@ -296,7 +302,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts R = all_robolimbs[rlimb_data[name]] else R = basic_robolimb - dat += "\t[R.company] [organ_name] prothesis" + dat += "\t[R.company] [organ_name] prosthesis" else if(status == "amputated") @@ -350,7 +356,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "[TextPreview(flavor_text)]...
" dat += "
" - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) //Species that have head accessories. + if((species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))) //Species that have head accessories. var/headaccessoryname = "Head Accessory" if(species == "Unathi") headaccessoryname = "Horns" @@ -358,23 +364,22 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Change Color
__
" dat += "Style: [ha_style]
" + if((species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))) //Species that have body markings. dat += "
Body Markings
" dat += "Change Color
__
" dat += "
Style: [m_style]
" - var/hairname = "Hair" - if(species == "Machine") - hairname = "Frame Color" - dat += "
[hairname]
" + dat += "
Hair
" dat += "Change Color
__
" dat += "
Style: [h_style]
" - dat += "
Facial
" + dat += "
Facial Hair
" dat += "Change Color
__
" - dat += "
Style: [f_style]
" + dat += "
Style: [f_style ? "[f_style]" : "Shaved"]
" - dat += "
Eyes
" - dat += "Change Color
__

" + if(species != "Machine") + dat += "
Eyes
" + dat += "Change Color
__

" if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins dat += "
Body Color
" @@ -1060,7 +1065,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) if("species") - var/list/new_species = list("Human","Tajaran","Skrell","Unathi","Diona", "Vulpkanin") + var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin") var/prev_species = species // var/whitelisted = 0 @@ -1087,6 +1092,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts continue if( !(species in S.species_allowed)) continue + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] if(valid_hairstyles.len) @@ -1138,6 +1144,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts m_style = "None" // No Unathi markings on Tajara body_accessory = null //no vulptail on humans damnit + + //Reset prosthetics. + organ_data = list() + rlimb_data = list() if("speciesprefs")//oldvox code speciesprefs = !speciesprefs @@ -1176,7 +1186,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("hair") if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin") var/input = "Choose your character's hair colour:" - if(species == "Machine") + if(species == "Machine" && !("head" in rlimb_data)) input = "Choose your character's frame colour:" var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null if(new_hair) @@ -1188,17 +1198,31 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if( !(species in S.species_allowed)) - continue + if(species == "Machine") //Species that can use prosthetic heads. + if((species in S.species_allowed)) + if(!rlimb_data["head"]) + valid_hairstyles[hairstyle] = S + continue + else + continue + else + if(!rlimb_data["head"]) + continue + else if(("Human" in S.species_allowed)) + valid_hairstyles[hairstyle] = S + continue + else + if(!(species in S.species_allowed)) + continue - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + valid_hairstyles[hairstyle] = S var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles if(new_h_style) h_style = new_h_style if("headaccessory") - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with head accessories + if((species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))) // Species with head accessories var/input = "Choose the colour of your your character's head accessory:" var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null if(new_head_accessory) @@ -1207,7 +1231,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts b_headacc = hex2num(copytext(new_head_accessory, 6, 8)) if("ha_style") - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with head accessories + if((species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))) // Species with head accessories var/list/valid_head_accessory_styles = list() for(var/head_accessory_style in head_accessory_styles_list) var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style] @@ -1221,8 +1245,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts ha_style = new_head_accessory_style if("markings") - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with markings - var/input = "Choose the colour of your your character's body markings:" + if((species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))) // Species with markings + var/input = "Choose the colour of your your character's markings:" var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null if(new_markings) r_markings = hex2num(copytext(new_markings, 2, 4)) @@ -1237,9 +1261,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if( !(species in M.species_allowed)) continue + if(species == "Machine") //Species that can use prosthetic heads. + if(!("head" in rlimb_data) && M.name != "None") //If the character can have prosthetic heads and they have the default head (with screen), no optic markings. + continue + else if(("head" in rlimb_data) && M.name == "None") //Otherwise, if they DON'T have the default head and since they must have optics, give them a list of styles excluding the "None" option. + continue + valid_markings[markingstyle] = marking_styles_list[markingstyle] - var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference") as null|anything in valid_markings + var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings if(new_marking_style) m_style = new_marking_style @@ -1275,8 +1305,24 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts continue if(gender == FEMALE && S.gender == MALE) continue - if( !(species in S.species_allowed)) - continue + if(species == "Machine") //Species that can use prosthetic heads. + if((species in S.species_allowed)) + if(!rlimb_data["head"]) + valid_facialhairstyles[facialhairstyle] = S + continue + else + continue + else + if(!rlimb_data["head"]) + continue + else if(("Human" in S.species_allowed)) + valid_facialhairstyles[facialhairstyle] = S + continue + else + continue + else + if(!(species in S.species_allowed)) + continue valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] @@ -1370,14 +1416,29 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts flavor_text = msg if("limbs") - var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") + var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand") + if(species == "Machine") + valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand") + var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs if(!limb_name) return var/limb = null var/second_limb = null // if you try to change the arm, the hand should also change var/third_limb = null // if you try to unchange the hand, the arm should also change - var/valid_limb_states=list("Normal","Amputated","Prothesis") + var/valid_limb_states = list("Normal", "Amputated", "Prosthesis") + var/no_amputate = 0 + switch(limb_name) + if("Torso") + limb = "chest" + second_limb = "groin" + no_amputate = 1 + if("Lower Body") + limb = "groin" + no_amputate = 1 + if("Head") + limb = "head" + no_amputate = 1 if("Left Leg") limb = "l_leg" second_limb = "l_foot" @@ -1392,37 +1453,50 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts second_limb = "r_hand" if("Left Foot") limb = "l_foot" - third_limb = "l_leg" + if(species != "Machine") + third_limb = "l_leg" if("Right Foot") limb = "r_foot" - third_limb = "r_leg" + if(species != "Machine") + third_limb = "r_leg" if("Left Hand") limb = "l_hand" - third_limb = "l_arm" + if(species != "Machine") + third_limb = "l_arm" if("Right Hand") limb = "r_hand" - third_limb = "r_arm" + if(species != "Machine") + third_limb = "r_arm" var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states if(!new_state) return switch(new_state) if("Normal") + if(limb == "head") + m_style = "None" + h_style = random_hair_style(gender, species) + f_style = facial_hair_styles_list["Shaved"] organ_data[limb] = null rlimb_data[limb] = null if(third_limb) organ_data[third_limb] = null rlimb_data[third_limb] = null if("Amputated") - organ_data[limb] = "amputated" - rlimb_data[limb] = null - if(second_limb) - organ_data[second_limb] = "amputated" - rlimb_data[second_limb] = null + if(!no_amputate) + organ_data[limb] = "amputated" + rlimb_data[limb] = null + if(second_limb) + organ_data[second_limb] = "amputated" + rlimb_data[second_limb] = null if("Prothesis") var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in chargen_robolimbs if(!choice) return + if(limb == "head") + m_style = "Humanoid Optics" + ha_style = "None" + h_style = hair_styles_list["Bald"] rlimb_data[limb] = choice organ_data[limb] = "cyborg" if(second_limb) @@ -1499,7 +1573,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts UI_style_color = UI_style_color_new if("UIalpha") - var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parametr for UI, between 50 and 255") as num + var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parameter for UI, between 50 and 255", UI_style_alpha) as num if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return UI_style_alpha = UI_style_alpha_new @@ -1618,9 +1692,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts character.h_style = h_style character.f_style = f_style - // Destroy/cyborgize organs - for(var/name in organ_data) var/status = organ_data[name] diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 6cd20e79b19..e691e35ecac 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -169,6 +169,12 @@ return valid_species /mob/living/carbon/human/proc/generate_valid_hairstyles() + var/mob/living/carbon/human/user + if(istype(usr, /mob/new_player)) + user = usr + else + user = src + var/list/valid_hairstyles = new() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] @@ -177,13 +183,34 @@ continue if(gender == FEMALE && S.gender == MALE) continue - if(!(species.name in S.species_allowed)) - continue - valid_hairstyles += hairstyle + if(species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head... + if((species.name in S.species_allowed)) //If this is a hairstyle native to the user's species... + if(!user.client.prefs.rlimb_data["head"]) //Check to see if they have the default head. + valid_hairstyles += hairstyle //Give them their hairstyles if they do. + continue + else //If they don't have the default head, they shouldn't be getting any hairstyles they wouldn't normally. + continue + else + if(!user.client.prefs.rlimb_data["head"]) //If the hairstyle is not native to the user's species, and they're using the default head, don't let them access it. + continue + else + if(("Human" in S.species_allowed)) //If the user has a robotic head and the hairstyle can fit humans, let them use it as a wig for their humanoid robot head. + valid_hairstyles += hairstyle + continue + else + if(!(species.name in S.species_allowed)) //If the user is not a species who can have robotic heads, use the default handling. + continue + valid_hairstyles += hairstyle return valid_hairstyles /mob/living/carbon/human/proc/generate_valid_facial_hairstyles() + var/mob/living/carbon/human/user + if(istype(usr, /mob/new_player)) + user = usr + else + user = src + var/list/valid_facial_hairstyles = new() for(var/facialhairstyle in facial_hair_styles_list) var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] @@ -192,9 +219,23 @@ continue if(gender == FEMALE && S.gender == MALE) continue - if(!(species.name in S.species_allowed)) - continue - - valid_facial_hairstyles += facialhairstyle + if(species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head... + if((species.name in S.species_allowed)) //If this is a facial hair style native to the user's species... + if(!user.client.prefs.rlimb_data["head"]) //Check to see if they have the default head. + valid_facial_hairstyles += facialhairstyle //Give them their facial hair styles if they do. + continue + else //If they don't have the default head, they shouldn't be getting any facial hair styles they wouldn't normally. + continue + else + if(!user.client.prefs.rlimb_data["head"]) //If the facial hair style is not native to the user's species, and they're using the default head, don't let them access it. + continue + else + if(("Human" in S.species_allowed)) //If the user has a robotic head and the facial hair style can fit humans, let them use it as a postiche for their humanoid robot head. + valid_facial_hairstyles += facialhairstyle + continue + else //If the user is not a species who can have robotic heads, use the default handling. + if(!(species.name in S.species_allowed)) + continue + valid_facial_hairstyles += facialhairstyle return valid_facial_hairstyles diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 787d1e51b44..9eb01aec4fd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1619,26 +1619,36 @@ // Allows IPC's to change their monitor display /mob/living/carbon/human/proc/change_monitor() set category = "IC" - set name = "Change Monitor Display" - set desc = "Change the display on your monitor." + set name = "Change Monitor/Optical Display" + set desc = "Change the display on your monitor or the colour of your optics." - if(stat || paralysis || stunned || weakened) - src << "You cannot change your monitor display in your current state." + if(incapacitated()) + src << "You cannot change your monitor or optical display in your current state." return - var/list/hair = list() - for(var/i in hair_styles_list) - var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] - if(species.name in tmp_hair.species_allowed) - hair += i + if(species.flags & ALL_RPARTS) //If they can have a fully cybernetic body... + if(client.prefs.rlimb_data["head"]) //If head is present here, that means it's not the default Morpheus. Thus, no screen to adjust. Instead, let them change the colour of their optics! + var/optic_colour = input(src, "Select optic colour", rgb(r_markings, g_markings, b_markings)) as color|null + if(optic_colour) + r_markings = hex2num(copytext(optic_colour, 2, 4)) + g_markings = hex2num(copytext(optic_colour, 4, 6)) + b_markings = hex2num(copytext(optic_colour, 6, 8)) - var/new_style = input(src, "Select a monitor display", "Monitor Display") as null|anything in hair - if(stat || paralysis || stunned || weakened) - return - if(new_style) - h_style = new_style + update_markings() + else if(!(client.prefs.rlimb_data["head"]))//Means that the character has the default Morpheus head, which has a screen. Time to customize. + var/list/hair = list() + for(var/i in hair_styles_list) + var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] + if(species.name in tmp_hair.species_allowed) + hair += i - update_hair() + var/new_style = input(src, "Select a monitor display", "Monitor Display", h_style) as null|anything in hair + if(incapacitated()) + return + if(new_style) + h_style = new_style + + update_hair() //Putting a couple of procs here that I don't know where else to dump. //Mostly going to be used for Vox and Vox Armalis, but other human mobs might like them (for adminbuse). diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 46e9bddf9b3..fd8fcd50909 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -712,9 +712,9 @@ passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE - clothing_flags = HAS_SOCKS - bodyflags = HAS_SKIN_COLOR + flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_SKIN_COLOR | HAS_MARKINGS | HAS_HEAD_ACCESSORY dietflags = 0 //IPCs can't eat, so no diet blood_color = "#1F181F" flesh_color = "#AAAAAA" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 07fe43107f9..7849deb633b 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -461,7 +461,7 @@ var/global/list/damage_icon_parts = list() //if(!src.get_int_organ(/obj/item/organ/internal/brain) && src.get_species() != "Machine" )//make it obvious we have NO BRAIN // hair_standing.Blend(debrained_s, ICON_OVERLAY) if(hair_style && hair_style.species_allowed) - if(src.species.name in hair_style.species_allowed) + if((src.species.name in hair_style.species_allowed) || (src.species.flags & ALL_RPARTS)) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(src.get_species() == "Slime People") // I am el worstos hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) @@ -499,7 +499,7 @@ var/global/list/damage_icon_parts = list() if(f_style) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] if(facial_hair_style && facial_hair_style.species_allowed) - if(src.species.name in facial_hair_style.species_allowed) + if((src.species.name in facial_hair_style.species_allowed) || (src.species.flags & ALL_RPARTS)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(src.get_species() == "Slime People") // I am el worstos facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index e8b9f948ee7..640197b09d6 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -227,12 +227,14 @@ datum/preferences var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state) preview_icon.Blend(temp, ICON_OVERLAY) - for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand")) + for(var/name in list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand")) if(organ_data[name] == "amputated") continue if(organ_data[name] == "cyborg") var/datum/robolimb/R if(rlimb_data[name]) R = all_robolimbs[rlimb_data[name]] if(!R) R = basic_robolimb + if(name == "chest") + name = "torso" preview_icon.Blend(icon(R.icon, "[name]"), ICON_OVERLAY) // This doesn't check gendered_icon. Not an issue while only limbs can be robotic. continue preview_icon.Blend(new /icon(icobase, "[name]"), ICON_OVERLAY) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 60b28f69213..23e3fb1d906 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -64,7 +64,7 @@ name = "Bald" icon_state = "bald" gender = MALE - species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skeleton") + species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton") short name = "Short Hair" // try to capatilize the names please~ @@ -152,7 +152,7 @@ name = "Pompadour" icon_state = "hair_pompadour" gender = MALE - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") quiff name = "Quiff" @@ -175,19 +175,19 @@ name = "Beehive" icon_state = "hair_beehive" gender = FEMALE - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") bobcurl name = "Bobcurl" icon_state = "hair_bobcurl" gender = FEMALE - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") bob name = "Bob" icon_state = "hair_bobcut" gender = FEMALE - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") bowl name = "Bowl" @@ -203,7 +203,7 @@ name = "Buzzcut" icon_state = "hair_buzzcut" gender = MALE - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") crew name = "Crewcut" @@ -265,12 +265,23 @@ mohawk name = "Mohawk" icon_state = "hair_d" - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") + jensen name = "Adam Jensen Hair" icon_state = "hair_jensen" gender = MALE + cia + name = "CIA" + icon_state = "hair_cia" + gender = MALE + + mulder + name = "Mulder" + icon_state = "hair_mulder" + gender = MALE + gelled name = "Gelled Back" icon_state = "hair_gelled" @@ -284,7 +295,7 @@ spiky name = "Spiky" icon_state = "hair_spikey" - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") kusangi name = "Kusanagi Hair" @@ -485,7 +496,7 @@ name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Diona","Kidan","Greys","Machine", "Vulpkanin", "Slime People") + species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Machine", "Vulpkanin", "Slime People") watson @@ -1074,7 +1085,7 @@ /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skeleton") + species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine") nude name = "Nude" @@ -1222,7 +1233,7 @@ /datum/sprite_accessory/undershirt icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skeleton") + species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine") /datum/sprite_accessory/undershirt/nude name = "Nude" @@ -1508,13 +1519,13 @@ /////////////////////// /datum/sprite_accessory/socks icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton") + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton") /datum/sprite_accessory/socks/nude name = "Nude" icon_state = null gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox") + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox") /datum/sprite_accessory/socks/white_norm @@ -1681,12 +1692,12 @@ /datum/sprite_accessory/head_accessory icon = 'icons/mob/body_accessory.dmi' - species_allowed = list("Unathi", "Vulpkanin", "Tajaran") + species_allowed = list("Unathi", "Vulpkanin", "Tajaran", "Machine") icon_state = "accessory_none" /datum/sprite_accessory/head_accessory/none name = "None" - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox") + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox") icon_state = "accessory_none" /datum/sprite_accessory/head_accessory/simple @@ -1769,16 +1780,22 @@ icon_state = "ears_plain" species_allowed = list("Tajaran") +/datum/sprite_accessory/head_accessory/ipc_antennae + name = "Antennae" + icon_state = "antennae" + species_allowed = list("Machine") + + /* BODY MARKINGS */ /datum/sprite_accessory/body_markings icon = 'icons/mob/body_accessory.dmi' - species_allowed = list("Unathi", "Tajaran", "Vulpkanin") + species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/none name = "None" - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox") + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/stripe @@ -1811,6 +1828,11 @@ species_allowed = list("Unathi") icon_state = "markings_tigerheadface_una" +/datum/sprite_accessory/body_markings/optics + name = "Humanoid Optics" + species_allowed = list("Machine") + icon_state = "optics" + /datum/sprite_accessory/body_markings/tattoo // Tattoos applied post-round startup with tattoo guns in item_defines.dm name = "base tattoo" species_allowed = list() diff --git a/code/modules/surgery/organs/robolimbs.dm b/code/modules/surgery/organs/robolimbs.dm index ddb41ee3015..bcebd7e1e64 100644 --- a/code/modules/surgery/organs/robolimbs.dm +++ b/code/modules/surgery/organs/robolimbs.dm @@ -8,7 +8,8 @@ var/global/datum/robolimb/basic_robolimb var/datum/robolimb/R = new limb_type() all_robolimbs[R.company] = R if(!R.unavailable_at_chargen) - chargen_robolimbs[R.company] = R + if(R != "head" && R != "chest" && R != "groin" ) //Part of the method that ensures only IPCs can access head, chest and groin prosthetics. + chargen_robolimbs[R.company] = R /datum/robolimb var/company = "Unbranded" // Shown when selecting the limb. @@ -26,16 +27,6 @@ var/global/datum/robolimb/basic_robolimb desc = "This limb has a militaristic black and green casing with gold stripes." icon = 'icons/mob/human_races/cyberlimbs/hesphaistos.dmi' -/datum/robolimb/zenghu - company = "Zeng-Hu Pharmaceuticals" - desc = "This limb has a rubbery fleshtone covering with visible seams." - icon = 'icons/mob/human_races/cyberlimbs/zenghu.dmi' - -/datum/robolimb/xion - company = "Xion Manufacturing Group" - desc = "This limb has a minimalist black and red casing." - icon = 'icons/mob/human_races/cyberlimbs/xion.dmi' - /datum/robolimb/ipc company = "Morpheus Cyberkinetics" desc = "This limb is simple and functional; no effort has been made to make it look human." @@ -45,4 +36,14 @@ var/global/datum/robolimb/basic_robolimb /datum/robolimb/wardtakahashi company = "Ward-Takahashi" desc = "This limb features sleek black and white polymers." - icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi.dmi' \ No newline at end of file + icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi.dmi' + +/datum/robolimb/xion + company = "Xion Manufacturing Group" + desc = "This limb has a minimalist black and red casing." + icon = 'icons/mob/human_races/cyberlimbs/xion.dmi' + +/datum/robolimb/zenghu + company = "Zeng-Hu Pharmaceuticals" + desc = "This limb has a rubbery fleshtone covering with visible seams." + icon = 'icons/mob/human_races/cyberlimbs/zenghu.dmi' \ No newline at end of file diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index 1794a4782a3..16d6b2f03f9 100644 Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index a126f3d067a..abb390fdffe 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/bishop.dmi b/icons/mob/human_races/cyberlimbs/bishop.dmi index a3fdb455f89..3bf83ae98cd 100644 Binary files a/icons/mob/human_races/cyberlimbs/bishop.dmi and b/icons/mob/human_races/cyberlimbs/bishop.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/hesphaistos.dmi b/icons/mob/human_races/cyberlimbs/hesphaistos.dmi index 45423ee1698..683339efc05 100644 Binary files a/icons/mob/human_races/cyberlimbs/hesphaistos.dmi and b/icons/mob/human_races/cyberlimbs/hesphaistos.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/wardtakahashi.dmi b/icons/mob/human_races/cyberlimbs/wardtakahashi.dmi index 01ded594a2c..7122cafb818 100644 Binary files a/icons/mob/human_races/cyberlimbs/wardtakahashi.dmi and b/icons/mob/human_races/cyberlimbs/wardtakahashi.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/xion.dmi b/icons/mob/human_races/cyberlimbs/xion.dmi index a4fecb0008b..0ee9a0c4965 100644 Binary files a/icons/mob/human_races/cyberlimbs/xion.dmi and b/icons/mob/human_races/cyberlimbs/xion.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/zenghu.dmi b/icons/mob/human_races/cyberlimbs/zenghu.dmi index d54316e192e..f697eb0e03c 100644 Binary files a/icons/mob/human_races/cyberlimbs/zenghu.dmi and b/icons/mob/human_races/cyberlimbs/zenghu.dmi differ diff --git a/icons/mob/human_races/robotic.dmi b/icons/mob/human_races/robotic.dmi index 203f627f6f1..6b9b9cc5371 100644 Binary files a/icons/mob/human_races/robotic.dmi and b/icons/mob/human_races/robotic.dmi differ