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