From 3d86eddcd464ce4297fdae3b3437b1cca74313c3 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Fri, 18 Dec 2015 23:28:34 -0500 Subject: [PATCH 01/20] Adds Alternate Unathi Tails to Body_Accessories --- .../living/carbon/human/body_accessories.dm | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index 2a8dfa4e458..99cf5d98126 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -125,4 +125,54 @@ var/global/list/body_accessory_by_species = list("None" = null) icon_state = "vulptail5" animated_icon_state = "vulptail5_a" - allowed_species = list("Vulpkanin") \ No newline at end of file + allowed_species = list("Vulpkanin") + +//Unathi +/datum/body_accessory/tail/unathi_2 + name = "Unathi Alt 1 (Smooth)" + + icon_state = "liztail2" + animated_icon_state = "liztail2_a" + allowed_species = list("Unathi") + +/datum/body_accessory/tail/unathi_3 + name = "Unathi Alt 2 (Light)" + + icon_state = "liztail3" + animated_icon_state = "liztail3_a" + allowed_species = list("Unathi") + +/datum/body_accessory/tail/unathi_4 + name = "Unathi Alt 3 (Dark Stripe)" + + icon_state = "liztail4" + animated_icon_state = "liztail4_a" + allowed_species = list("Unathi") + +/datum/body_accessory/tail/unathi_5 + name = "Unathi Alt 4 (Light Stripe)" + + icon_state = "liztail5" + animated_icon_state = "liztail5_a" + allowed_species = list("Unathi") + +/datum/body_accessory/tail/unathi_6 + name = "Unathi Alt 5 (Dark Tiger)" + + icon_state = "liztail6" + animated_icon_state = "liztail6_a" + allowed_species = list("Unathi") + +/datum/body_accessory/tail/unathi_7 + name = "Unathi Alt 6 (Light Tiger)" + + icon_state = "liztail5" + animated_icon_state = "liztail5_a" + allowed_species = list("Unathi") + +/datum/body_accessory/tail/unathi_8 + name = "Unathi Alt 7 (Aquatic)" + + icon_state = "liztail7" + animated_icon_state = "liztail7_a" + allowed_species = list("Unathi") \ No newline at end of file From 1905a9fd747c56173c05782440e6f8da0a8713e1 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Sat, 19 Dec 2015 00:06:07 -0500 Subject: [PATCH 02/20] Adds Unathi Tail Sprites --- icons/mob/body_accessory.dmi | Bin 6525 -> 9705 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index 03b9d69ab5061a9dac6109fa6aa62be2186fc305..aafc841e2b54b49c5ff11c4b40b137edcc54992b 100644 GIT binary patch literal 9705 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 literal 6525 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 c<6?xcM~|Opdd-ln0LkZ+h0TeA Date: Sat, 19 Dec 2015 00:10:05 -0500 Subject: [PATCH 03/20] Woops. Draws from appropriate tail sprites. --- code/modules/mob/living/carbon/human/body_accessories.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index 99cf5d98126..452317e7c4b 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -166,13 +166,13 @@ var/global/list/body_accessory_by_species = list("None" = null) /datum/body_accessory/tail/unathi_7 name = "Unathi Alt 6 (Light Tiger)" - icon_state = "liztail5" - animated_icon_state = "liztail5_a" + icon_state = "liztail7" + animated_icon_state = "liztail7_a" allowed_species = list("Unathi") /datum/body_accessory/tail/unathi_8 name = "Unathi Alt 7 (Aquatic)" - icon_state = "liztail7" - animated_icon_state = "liztail7_a" + icon_state = "liztail8" + animated_icon_state = "liztail8_a" allowed_species = list("Unathi") \ No newline at end of file From 0f8f514671d89735a22b0824a41d831133de5f84 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Mon, 21 Dec 2015 22:55:39 -0500 Subject: [PATCH 04/20] Adds Unathi Horn and Tail Customization Does not include tail colour correction. In this iteration, the horns do not have their own colour-- they use the skin colour. --- code/__HELPERS/global_lists.dm | 2 + code/_globalvars/lists/flavor_misc.dm | 2 + code/datums/datacore.dm | 10 +++ code/modules/client/preferences.dm | 20 ++++++ code/modules/client/preferences_savefile.dm | 2 + .../living/carbon/human/body_accessories.dm | 2 + .../mob/living/carbon/human/human_defines.dm | 4 ++ .../mob/living/carbon/human/update_icons.dm | 58 +++++++++++++++--- .../mob/new_player/preferences_setup.dm | 7 +++ .../mob/new_player/sprite_accessories.dm | 52 +++++++++++++++- icons/mob/body_accessory.dmi | Bin 9705 -> 10072 bytes 11 files changed, 148 insertions(+), 11 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 500553e1f28..185d02d69d6 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -4,6 +4,8 @@ ////////////////////////// /proc/makeDatumRefLists() + //horns + init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horn_styles_list) //hair init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, hair_styles_list, hair_styles_male_list, hair_styles_female_list) //facial hair diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 516ae5630f9..4887c4d12f7 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -1,4 +1,6 @@ //Preferences stuff + //Hornstyles +var/global/list/horn_styles_list = list() //stores /datum/sprite_accessory/horns 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/datums/datacore.dm b/code/datums/datacore.dm index 7f0e58d3bbb..0dd408a0028 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -179,6 +179,16 @@ proc/get_id_photo(var/mob/living/carbon/human/H) facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD) eyes_s.Blend(facial_s, ICON_OVERLAY) + //Horns + if(H.species && H.species.name == "Unathi") + var/datum/sprite_accessory/horns = horn_styles_list[H.horns] + if(horns) + var/icon/horns_s = new/icon("icon" = horns.icon, "icon_state" = "[horns.icon_state]_s") + horns_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) + eyes_s.Blend(horns_s, ICON_OVERLAY) + + preview_icon.Blend(eyes_s, ICON_OVERLAY) + var/icon/clothes_s = null switch(H.mind.assigned_role) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e7987280d48..f907ca9837d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -111,6 +111,7 @@ datum/preferences var/socks = "Nude" //socks type var/backbag = 2 //backpack type var/h_style = "Bald" //Hair type + var/horns = "None" //Horn style var/r_hair = 0 //Hair color var/g_hair = 0 //Hair color var/b_hair = 0 //Hair color @@ -353,6 +354,10 @@ datum/preferences dat += "[TextPreview(flavor_text)]...
" dat += "
" + if(species == "Unathi") + dat += "
Horns
" + dat += "Style: [horns]
" + var/hairname = "Hair" if(species == "Machine") hairname = "Frame Color" @@ -1188,6 +1193,19 @@ datum/preferences if(new_h_style) h_style = new_h_style + if("horns") + var/list/valid_hornstyles = list() + for(var/hornstyle in horn_styles_list) + var/datum/sprite_accessory/H = horn_styles_list[hornstyle] + if( !(species in H.species_allowed)) + continue + + valid_hornstyles[hornstyle] = horn_styles_list[hornstyle] + + var/new_horn_style = input(user, "Choose your character's horn style:", "Character Preference") as null|anything in valid_hornstyles + if(new_horn_style) + horns = new_horn_style + if("body_accessory") var/list/possible_body_accessories = list() if(check_rights(R_ADMIN, 1, user)) @@ -1607,6 +1625,8 @@ datum/preferences character.undershirt = undershirt character.socks = socks + if(character.species.name == "Unathi") + character.horns = horns if(body_accessory) character.body_accessory = body_accessory_by_name["[body_accessory]"] diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index f1dd7b307f3..8d74bbb3cbd 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -134,6 +134,7 @@ S["skin_red"] >> r_skin S["skin_green"] >> g_skin S["skin_blue"] >> b_skin + S["horn_style_name"] >> horns S["hair_style_name"] >> h_style S["facial_style_name"] >> f_style S["eyes_red"] >> r_eyes @@ -197,6 +198,7 @@ r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) + horns = sanitize_inlist(horns, horn_styles_list, initial(horns)) h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index 452317e7c4b..f9450c457ee 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -91,6 +91,8 @@ var/global/list/body_accessory_by_species = list("None" = null) icon = 'icons/mob/body_accessory.dmi' animated_icon = 'icons/mob/body_accessory.dmi' blend_mode = ICON_ADD + icon_state = "null" + animated_icon_state = "null" /datum/body_accessory/tail/try_restrictions(var/mob/living/carbon/human/H) if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL) && !istype(H.wear_suit, /obj/item/clothing/suit/space)) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 0bc919e4b0c..f2592a653c3 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,12 +1,16 @@ /mob/living/carbon/human hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD) + //Hair colour and style var/r_hair = 0 var/g_hair = 0 var/b_hair = 0 var/h_style = "Bald" + //Horns + var/horns = "None" + //Facial hair colour and style var/r_facial = 0 var/g_facial = 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index d21aea4bde2..16ec5ace8ad 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -120,16 +120,17 @@ Please contact me on #coderbus IRC. ~Carn x #define SUIT_STORE_LAYER 13 #define BACK_LAYER 14 #define HAIR_LAYER 15 //TODO: make part of head layer? -#define FACEMASK_LAYER 16 -#define HEAD_LAYER 17 -#define COLLAR_LAYER 18 -#define HANDCUFF_LAYER 19 -#define LEGCUFF_LAYER 20 -#define L_HAND_LAYER 21 -#define R_HAND_LAYER 22 -#define TARGETED_LAYER 23 //BS12: Layer for the target overlay from weapon targeting system -#define FIRE_LAYER 24 //If you're on fire -#define TOTAL_LAYERS 24 +#define HORN_LAYER 16 +#define FACEMASK_LAYER 17 +#define HEAD_LAYER 18 +#define COLLAR_LAYER 19 +#define HANDCUFF_LAYER 20 +#define LEGCUFF_LAYER 21 +#define L_HAND_LAYER 22 +#define R_HAND_LAYER 23 +#define TARGETED_LAYER 24 //BS12: Layer for the target overlay from weapon targeting system +#define FIRE_LAYER 25 //If you're on fire +#define TOTAL_LAYERS 25 @@ -350,6 +351,42 @@ var/global/list/damage_icon_parts = list() //tail update_tail_layer(0) + //horns + update_horns(0) + + +//HORN OVERLAY +/mob/living/carbon/human/proc/update_horns(var/update_icons=1) + //Reset our horns + overlays_standing[HORN_LAYER] = null + + var/obj/item/organ/external/head/head_organ = get_organ("head") + if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) ) + if(update_icons) update_icons() + return + + //masks and helmets can obscure our horns, unless we're a synthetic + if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) + if(update_icons) update_icons() + return + + //base icons + var/icon/horns_standing = new /icon('icons/mob/body_accessory.dmi',"horns_none_s") + + if(horns && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()) && (src.species.name == "Unathi"))) + var/datum/sprite_accessory/horn_style = horn_styles_list[horns] + if(horn_style && horn_style.species_allowed) + if(src.species.name in horn_style.species_allowed) + var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") + if(horn_style.do_colouration) + horns_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + horns_standing.Blend(horns_s, ICON_OVERLAY) + else + //warning("Invalid horns for [species.name]: [horns]") + + overlays_standing[HORN_LAYER] = image(horns_standing) + + if(update_icons) update_icons() //HAIR OVERLAY @@ -1032,6 +1069,7 @@ var/global/list/damage_icon_parts = list() #undef BACK_LAYER #undef HAIR_LAYER #undef HEAD_LAYER +#undef HORN_LAYER #undef COLLAR_LAYER #undef HANDCUFF_LAYER #undef LEGCUFF_LAYER diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index f1b9b80e9ab..30b9db678a7 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -263,6 +263,13 @@ datum/preferences facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) eyes_s.Blend(facial_s, ICON_OVERLAY) + //Horns + if(current_species && current_species.name == "Unathi") + var/datum/sprite_accessory/horn_style = horn_styles_list[horns] + if(horn_style) + var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") + horns_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + eyes_s.Blend(horns_s, ICON_OVERLAY) var/icon/underwear_s = null if(underwear && current_species.clothing_flags & HAS_UNDERWEAR) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 50183e4e506..b857c6c6adb 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1498,4 +1498,54 @@ name = "Vox Fishnets" icon_state = "vox_fishnet" gender = NEUTER - species_allowed = list("Vox") \ No newline at end of file + species_allowed = list("Vox") + +/* HORNS */ + +/datum/sprite_accessory/horns + icon = 'icons/mob/body_accessory.dmi' + species_allowed = list("Unathi") + icon_state = null + +/datum/sprite_accessory/horns/none + name = "None" + icon_state = "horns_none" + +/datum/sprite_accessory/horns/simple + name = "Simple" + icon_state = "horns_simple" + +/datum/sprite_accessory/horns/short + name = "Short" + icon_state = "horns_short" + +/datum/sprite_accessory/horns/curled + name = "Curled" + icon_state = "horns_curled" + +/datum/sprite_accessory/horns/ram + name = "Ram" + icon_state = "horns_ram" + +/* FRILLS */ + +/datum/sprite_accessory/frills + icon = 'icons/mob/body_accessory.dmi' + species_allowed = list("Unathi") + icon_state = null + +/datum/sprite_accessory/frills/none + name = "None" + icon_state = null + +/datum/sprite_accessory/frills/simple + name = "Simple" + icon_state = "simple" + +/datum/sprite_accessory/frills/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/frills/aquatic + name = "Aquatic" + icon_state = "aqua" diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index aafc841e2b54b49c5ff11c4b40b137edcc54992b..e18ce310a18f3f4a470f48e10b7d22e1afa9bd74 100644 GIT binary patch literal 10072 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 G)&BzXYAu@p literal 9705 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 From be3bb885f257a5b3953e42a2dfc79a69ae3fb615 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Sat, 26 Dec 2015 00:48:01 -0500 Subject: [PATCH 05/20] Melting Snowflakes & (Adds/Changes Frills & Adds Body Markings) --- code/__DEFINES/flags.dm | 12 +- code/__HELPERS/global_lists.dm | 2 + code/_globalvars/lists/flavor_misc.dm | 2 + code/datums/datacore.dm | 10 +- code/modules/client/preferences.dm | 43 ++++++- code/modules/client/preferences_savefile.dm | 8 ++ .../mob/living/carbon/human/human_defines.dm | 6 + .../living/carbon/human/species/station.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 89 ++++++++++----- .../mob/new_player/preferences_setup.dm | 18 ++- .../mob/new_player/sprite_accessories.dm | 108 ++++++++++++------ icons/mob/body_accessory.dmi | Bin 10072 -> 10946 bytes icons/mob/human_face.dmi | Bin 74337 -> 74834 bytes 13 files changed, 224 insertions(+), 76 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 20930f1cdb8..60ec7275f84 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -58,11 +58,13 @@ #define FEET_CLAWS 1 #define FEET_PADDED 2 #define FEET_NOSLIP 4 -#define HAS_TAIL 8 -#define HAS_SKIN_TONE 16 -#define HAS_SKIN_COLOR 32 -#define TAIL_WAGGING 64 -#define NO_EYES 128 +#define HAS_HORNS 8 +#define HAS_TAIL 16 +#define HAS_SKIN_TONE 32 +#define HAS_SKIN_COLOR 64 +#define HAS_MARKINGS 128 +#define TAIL_WAGGING 256 +#define NO_EYES 512 //Species Diet Flags #define DIET_CARN 1 diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 185d02d69d6..b1bce2ab2f2 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -4,6 +4,8 @@ ////////////////////////// /proc/makeDatumRefLists() + //markings + init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, marking_styles_list) //horns init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horn_styles_list) //hair diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 4887c4d12f7..115bed4d522 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -1,6 +1,8 @@ //Preferences stuff //Hornstyles var/global/list/horn_styles_list = list() //stores /datum/sprite_accessory/horns indexed by name + //Marking styles +var/global/list/marking_styles_list = list() //stores /datum/sprite_accessory/horns 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/datums/datacore.dm b/code/datums/datacore.dm index 0dd408a0028..f1858339c50 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -180,13 +180,21 @@ proc/get_id_photo(var/mob/living/carbon/human/H) eyes_s.Blend(facial_s, ICON_OVERLAY) //Horns - if(H.species && H.species.name == "Unathi") + if(H.species.bodyflags & HAS_HORNS) var/datum/sprite_accessory/horns = horn_styles_list[H.horns] if(horns) var/icon/horns_s = new/icon("icon" = horns.icon, "icon_state" = "[horns.icon_state]_s") horns_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) eyes_s.Blend(horns_s, ICON_OVERLAY) + //Horns + if(H.species.bodyflags & HAS_MARKINGS) + var/datum/sprite_accessory/marking_style = marking_styles_list[H.m_style] + if(marking_style) + var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s") + markings_s.Blend(rgb(H.r_markings, H.g_markings, H.b_markings), ICON_ADD) + eyes_s.Blend(markings_s, ICON_OVERLAY) + preview_icon.Blend(eyes_s, ICON_OVERLAY) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f907ca9837d..57e56808de6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -110,8 +110,12 @@ datum/preferences var/undershirt = "Nude" //undershirt type var/socks = "Nude" //socks type var/backbag = 2 //backpack type - var/h_style = "Bald" //Hair type var/horns = "None" //Horn style + var/m_style = "None" //Marking style + var/r_markings = 0 //Marking colour + var/g_markings = 0 //Marking colour + var/b_markings = 0 //Marking colour + var/h_style = "Bald" //Hair type var/r_hair = 0 //Hair color var/g_hair = 0 //Hair color var/b_hair = 0 //Hair color @@ -354,10 +358,14 @@ datum/preferences dat += "[TextPreview(flavor_text)]...
" dat += "
" - if(species == "Unathi") + if(species == "Unathi") //Species that have horns. dat += "
Horns
" dat += "Style: [horns]
" + dat += "
Body Markings
" + dat += "Change Color
__
" + dat += "
Style: [m_style]
" + var/hairname = "Hair" if(species == "Machine") hairname = "Frame Color" @@ -374,7 +382,7 @@ datum/preferences 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
" - dat += "Change Color
__
" + dat += "Change Color
__

" if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) dat += "
Body Accessory
" @@ -1206,6 +1214,28 @@ datum/preferences if(new_horn_style) horns = new_horn_style + if("markings") + if(species == "Unathi") + var/input = "Choose the colour of your your character's body 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)) + g_markings = hex2num(copytext(new_markings, 4, 6)) + b_markings = hex2num(copytext(new_markings, 6, 8)) + + if("m_style") + var/list/valid_markings = list() + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/M = marking_styles_list[markingstyle] + if( !(species in M.species_allowed)) + 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 + if(new_marking_style) + m_style = new_marking_style + if("body_accessory") var/list/possible_body_accessories = list() if(check_rights(R_ADMIN, 1, user)) @@ -1625,8 +1655,13 @@ datum/preferences character.undershirt = undershirt character.socks = socks - if(character.species.name == "Unathi") + if(character.species.bodyflags & HAS_HORNS) character.horns = horns + if(character.species.bodyflags & HAS_MARKINGS) + character.r_markings = r_markings + character.g_markings = g_markings + character.b_markings = b_markings + character.m_style = m_style if(body_accessory) character.body_accessory = body_accessory_by_name["[body_accessory]"] diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 8d74bbb3cbd..b0f6524b085 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -124,6 +124,9 @@ S["spawnpoint"] >> spawnpoint //colors to be consolidated into hex strings (requires some work with dna code) + S["markings_red"] >> r_markings + S["markings_green"] >> g_markings + S["markings_blue"] >> b_markings S["hair_red"] >> r_hair S["hair_green"] >> g_hair S["hair_blue"] >> b_hair @@ -135,6 +138,7 @@ S["skin_green"] >> g_skin S["skin_blue"] >> b_skin S["horn_style_name"] >> horns + S["marking_style_name"] >> m_style S["hair_style_name"] >> h_style S["facial_style_name"] >> f_style S["eyes_red"] >> r_eyes @@ -188,6 +192,9 @@ be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) gender = sanitize_gender(gender) age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) + r_markings = sanitize_integer(r_markings, 0, 255, initial(r_markings)) + g_markings = sanitize_integer(g_markings, 0, 255, initial(g_markings)) + b_markings = sanitize_integer(b_markings, 0, 255, initial(b_markings)) r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) @@ -199,6 +206,7 @@ g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) horns = sanitize_inlist(horns, horn_styles_list, initial(horns)) + m_style = sanitize_inlist(m_style, marking_styles_list, initial(m_style)) h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index f2592a653c3..a75b1ab7bb5 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -2,6 +2,12 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD) + //Marking colour and style + var/r_markings = 0 + var/g_markings = 0 + var/b_markings = 0 + var/m_style = "None" + //Hair colour and style var/r_hair = 0 var/g_hair = 0 diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 1e85a1e2e52..ae1792be965 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -40,7 +40,7 @@ flags = HAS_LIPS clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_CLAWS | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING + bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HORNS | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_CARN cold_level_1 = 280 //Default 260 - Lower is better diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 16ec5ace8ad..e40c148082f 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -106,31 +106,32 @@ Please contact me on #coderbus IRC. ~Carn x //Human Overlays Indexes///////// #define MUTANTRACE_LAYER 1 -#define MUTATIONS_LAYER 2 -#define DAMAGE_LAYER 3 -#define UNIFORM_LAYER 4 -#define ID_LAYER 5 -#define SHOES_LAYER 6 -#define GLOVES_LAYER 7 -#define EARS_LAYER 8 -#define SUIT_LAYER 9 -#define GLASSES_LAYER 10 -#define BELT_LAYER 11 //Possible make this an overlay of somethign required to wear a belt? -#define TAIL_LAYER 12 //bs12 specific. this hack is probably gonna come back to haunt me -#define SUIT_STORE_LAYER 13 -#define BACK_LAYER 14 -#define HAIR_LAYER 15 //TODO: make part of head layer? -#define HORN_LAYER 16 -#define FACEMASK_LAYER 17 -#define HEAD_LAYER 18 -#define COLLAR_LAYER 19 -#define HANDCUFF_LAYER 20 -#define LEGCUFF_LAYER 21 -#define L_HAND_LAYER 22 -#define R_HAND_LAYER 23 -#define TARGETED_LAYER 24 //BS12: Layer for the target overlay from weapon targeting system -#define FIRE_LAYER 25 //If you're on fire -#define TOTAL_LAYERS 25 +#define MARKINGS_LAYER 2 +#define MUTATIONS_LAYER 3 +#define DAMAGE_LAYER 4 +#define UNIFORM_LAYER 5 +#define ID_LAYER 6 +#define SHOES_LAYER 7 +#define GLOVES_LAYER 8 +#define EARS_LAYER 9 +#define SUIT_LAYER 10 +#define GLASSES_LAYER 11 +#define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt? +#define TAIL_LAYER 13 //bs12 specific. this hack is probably gonna come back to haunt me +#define SUIT_STORE_LAYER 14 +#define BACK_LAYER 15 +#define HAIR_LAYER 16 //TODO: make part of head layer? +#define HORN_LAYER 17 +#define FACEMASK_LAYER 18 +#define HEAD_LAYER 19 +#define COLLAR_LAYER 20 +#define HANDCUFF_LAYER 21 +#define LEGCUFF_LAYER 22 +#define L_HAND_LAYER 23 +#define R_HAND_LAYER 24 +#define TARGETED_LAYER 25 //BS12: Layer for the target overlay from weapon targeting system +#define FIRE_LAYER 26 //If you're on fire +#define TOTAL_LAYERS 26 @@ -353,8 +354,39 @@ var/global/list/damage_icon_parts = list() update_tail_layer(0) //horns update_horns(0) + //markings + update_markings(0) +//MARKINGS OVERLAY +/mob/living/carbon/human/proc/update_markings(var/update_icons=1) + world << "\red PROC CALLED" + //Reset our markings + overlays_standing[MARKINGS_LAYER] = null + + var/obj/item/organ/external/chest/chest_organ = get_organ("chest") + if(!chest_organ || chest_organ.is_stump() || (chest_organ.status & ORGAN_DESTROYED) ) + if(update_icons) update_icons() + return + + //base icons + var/icon/markings_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") + + if(m_style && (src.species.bodyflags & HAS_MARKINGS)) + var/datum/sprite_accessory/marking_style = marking_styles_list[m_style] + if(marking_style && marking_style.species_allowed) + if(src.species.name in marking_style.species_allowed) + var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s") + if(marking_style.do_colouration) + markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD) + markings_standing.Blend(markings_s, ICON_OVERLAY) + else + //warning("Invalid markings for [species.name]: [horns]") + + overlays_standing[MARKINGS_LAYER] = image(markings_standing) + + if(update_icons) update_icons() + //HORN OVERLAY /mob/living/carbon/human/proc/update_horns(var/update_icons=1) //Reset our horns @@ -365,15 +397,15 @@ var/global/list/damage_icon_parts = list() if(update_icons) update_icons() return - //masks and helmets can obscure our horns, unless we're a synthetic + //masks and helmets can obscure our horns if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) if(update_icons) update_icons() return //base icons - var/icon/horns_standing = new /icon('icons/mob/body_accessory.dmi',"horns_none_s") + var/icon/horns_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") - if(horns && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()) && (src.species.name == "Unathi"))) + if(horns && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()) && (src.species.bodyflags & HAS_HORNS))) var/datum/sprite_accessory/horn_style = horn_styles_list[horns] if(horn_style && horn_style.species_allowed) if(src.species.name in horn_style.species_allowed) @@ -1053,6 +1085,7 @@ var/global/list/damage_icon_parts = list() //Human Overlays Indexes///////// #undef MUTANTRACE_LAYER +#undef MARKINGS_LAYER #undef MUTATIONS_LAYER #undef DAMAGE_LAYER #undef UNIFORM_LAYER diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 30b9db678a7..4ee2449150a 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -248,9 +248,19 @@ datum/preferences else preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) + //Body Markings + if(current_species && (current_species.bodyflags & HAS_MARKINGS)) + var/datum/sprite_accessory/marking_style = marking_styles_list[m_style] + if(marking_style) + var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s") + markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD) + preview_icon.Blend(markings_s, ICON_OVERLAY) + + var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s") eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] if(hair_style) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") @@ -264,7 +274,7 @@ datum/preferences eyes_s.Blend(facial_s, ICON_OVERLAY) //Horns - if(current_species && current_species.name == "Unathi") + if(current_species && (current_species.bodyflags & HAS_HORNS)) var/datum/sprite_accessory/horn_style = horn_styles_list[horns] if(horn_style) var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") @@ -272,19 +282,19 @@ datum/preferences eyes_s.Blend(horns_s, ICON_OVERLAY) var/icon/underwear_s = null - if(underwear && current_species.clothing_flags & HAS_UNDERWEAR) + if(underwear && (current_species.clothing_flags & HAS_UNDERWEAR)) var/datum/sprite_accessory/underwear/U = underwear_list[underwear] if(U) underwear_s = new/icon(U.icon, "uw_[U.icon_state]_s", ICON_OVERLAY) var/icon/undershirt_s = null - if(undershirt && current_species.clothing_flags & HAS_UNDERSHIRT) + if(undershirt && (current_species.clothing_flags & HAS_UNDERSHIRT)) var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt] if(U2) undershirt_s = new/icon(U2.icon, "us_[U2.icon_state]_s", ICON_OVERLAY) var/icon/socks_s = null - if(socks && current_species.clothing_flags & HAS_SOCKS) + if(socks && (current_species.clothing_flags & HAS_SOCKS)) var/datum/sprite_accessory/socks/U3 = socks_list[socks] if(U3) socks_s = new/icon(U3.icon, "sk_[U3.icon_state]_s", ICON_OVERLAY) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index b857c6c6adb..7b5a05f7c28 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -564,25 +564,6 @@ */ /datum/sprite_accessory/hair - una_spines_long - name = "Long Unathi Spines" - icon_state = "soghun_longspines" - species_allowed = list("Unathi") - - una_spines_short - name = "Short Unathi Spines" - icon_state = "soghun_shortspines" - species_allowed = list("Unathi") - - una_frills_long - name = "Long Unathi Frills" - icon_state = "soghun_longfrills" - species_allowed = list("Unathi") - - una_frills_short - name = "Short Unathi Frills" - icon_state = "soghun_shortfrills" - species_allowed = list("Unathi") una_horns name = "Unathi Horns" @@ -872,6 +853,8 @@ /datum/sprite_accessory/facial_hair +//Tajara + taj_sideburns name = "Tajara Sideburns" icon_state = "facial_sideburns" @@ -902,6 +885,8 @@ icon_state = "facial_smallstache" species_allowed = list("Tajaran") +//Vox + vox_colonel name = "Vox Colonel Beard" icon_state = "vox_colonel" @@ -973,6 +958,51 @@ species_allowed = list("Vulpkanin") gender = NEUTER +//Unathi + + una_spines_long + name = "Long Unathi Spines" + icon_state = "soghun_longspines" + species_allowed = list("Unathi") + gender = NEUTER + + una_spines_short + name = "Short Unathi Spines" + icon_state = "soghun_shortspines" + species_allowed = list("Unathi") + gender = NEUTER + + una_frills_long + name = "Long Unathi Frills" + icon_state = "soghun_longfrills" + species_allowed = list("Unathi") + gender = NEUTER + + una_frills_short + name = "Short Unathi Frills" + icon_state = "soghun_shortfrills" + species_allowed = list("Unathi") + gender = NEUTER + + una_simple + name = "Simple" + icon_state = "soghun_longwebbed_frills" + species_allowed = list("Unathi") + gender = NEUTER + + una_short + name = "Short" + icon_state = "soghun_shortwebbed_frills" + species_allowed = list("Unathi") + gender = NEUTER + + una_aquatic + name = "Aquatic" + icon_state = "soghun_aquafrills" + species_allowed = list("Unathi") + gender = NEUTER + + //skin styles - WIP //going to have to re-integrate this with surgery //let the icon_state hold an icon preview for now @@ -1509,7 +1539,7 @@ /datum/sprite_accessory/horns/none name = "None" - icon_state = "horns_none" + icon_state = "accessory_none" /datum/sprite_accessory/horns/simple name = "Simple" @@ -1527,25 +1557,37 @@ name = "Ram" icon_state = "horns_ram" -/* FRILLS */ +/* BODY MARKINGS */ -/datum/sprite_accessory/frills +/datum/sprite_accessory/body_markings icon = 'icons/mob/body_accessory.dmi' species_allowed = list("Unathi") icon_state = null -/datum/sprite_accessory/frills/none +/datum/sprite_accessory/body_markings/none name = "None" - icon_state = null + icon_state = "accessory_none" -/datum/sprite_accessory/frills/simple - name = "Simple" - icon_state = "simple" +/datum/sprite_accessory/body_markings/dstripe + name = "Dark Stripe" + icon_state = "markings_dstripe" -/datum/sprite_accessory/frills/short - name = "Short" - icon_state = "short" +/datum/sprite_accessory/body_markings/lstripe + name = "Light Stripe" + icon_state = "markings_lstripe" -/datum/sprite_accessory/frills/aquatic - name = "Aquatic" - icon_state = "aqua" +/datum/sprite_accessory/body_markings/dtiger + name = "Dark Tiger Body" + icon_state = "markings_dtiger" + +/datum/sprite_accessory/body_markings/dtigerhead + name = "Dark Tiger Body + Head" + icon_state = "markings_dtigerhead" + +/datum/sprite_accessory/body_markings/ltiger + name = "Light Tiger Body" + icon_state = "markings_ltiger" + +/datum/sprite_accessory/body_markings/ltigerhead + name = "Light Tiger Body + Head" + icon_state = "markings_ltigerhead" diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index e18ce310a18f3f4a470f48e10b7d22e1afa9bd74..a4fc178e04b416521c9eed6e38ced023147a3673 100644 GIT binary patch literal 10946 zcmZ{K1zc0#`#+(Cl!_ooOq7rkmCg|Yf*>f;F(gD9X<=g^AgF|dfYb;HseyEDfC?f? zhm-?}0Ru*Cz&5u1@f*MYw?6mvy03HY`|RGGd!FZcKXL9$(|h`CXD*$gp`l?jxO4jf z4Gmq_pOcCH1gY4Sn?GqHOpPAuc6D|2_V%JsC^Q*3{Irw6wrru!@Qb5D1i>o^Eb#9uX1I z(9nRx;rjdgTU%QnJb0k2tUNwG4g>-vBqa3o^sKF|2L}h++uKk68XEWY`^ijb10UQo zqtRUb`S_%NGwh*N;BD6cXMcCUKzCms8k*4D>bJ%|JvYwkO&y3|`B_v!pdHm!6O{YwRO*#Ql@N)Xpd(pPxmyC29HzRaSai_yox6VUSPYeyn=8%t|5oH z0;X*ec^$Q@i*-kgYMxEG|R$?cT&gKTg5du_la zxGn;ani}NJWUn{rDij#-(T4)a>j{}z3)_*I{$$NPRKxAYz+S$x@N&s{vwLA*8SZs+_|+4IBRu3 z!_nI_Db@$Ci{AAsIJe3cs%Wl(=6Mw!43GVO7!*lS>O^&YPuDVLu@B>kpY{aoH9OID}>}p@e8qkCiL!Iq{&h%s$kEPh}=W(Cj!5_jtK8mIc_jA!+S-hOEk0 z>CC)GO=HtTAVgO7f)8a+q^~;-50Vr~L`IoJFk`D0f3Y`P&A|zFr@g}u{rYIzqktHO>+?_n_haLaFpVG%p&#rK7{MyqM;ET&0phN&lrIWseRHBrgd4KimqFH2YxAy2YyI6`*=;r>X^MQO0ibI~Q z>Qb7@Y-jZ-7v1`XkX9abnW1lGW}#1yz2)z$a0CpGM$O^Tbhs}ZDSNnjjXSB|$iMj< zca~%vH2RQVNGMXy8~@XjlgmlJMAkz3)=g*UKGJ`Wmc9W6Y-i>wK7GfKUqID@guiPD z`@!KioN-}NF-iYm=fm-6$7|U&w7_LLu8b`p?hAsRbuMx!1Iw1EIu=Yvub#gx!i2g)l*2FYGlAWue;kZ}qJPflUxJPNkwMM$vt z{h@h#Oyd{t(r7#LNu%MXxVUdqiR=r%y=vC=z`O^s$lZq>k<+yl5fAp z`j$ZYBC77seAze_wh~472Sb-%>es$1ljWM7*MD_D?V7K4RPim?9u(}IkH~zqkb-lL zo)wV+O~Lr_(&HYNmuLpj-Au#GtaeRQHp;@3z~jS>Jh5q-*Q>!FDzu3y-CL>e;Fyfd zTh68=n(U?ZPuRI?q8?s{)9?WKNa&rEa=NQ{-Q?hAlHg0#X79oWrs3~R z-;Xp=%246o%E=}Y*K&NGcA36jIS|LOpfQ4y0*e+b>l}Wp_&qY?zl!xg`#fCX_j-o4 zawc6eQ#YI&Xhzr7h&etkwijTcaz+8{(l=tA3651@{ByF5N4P!ddKq=~ip~ggiggQZ zgXI##4W6cpo}UQN+2?H^InO1}EFA*x6OW4Q=N)dm5eUrOr5POfY%}WCnIfSI#l5cD zm~Cue5_4@Va-aWHdpby&(G8gDPK2k6XJFfh*}$1&Tp(0V^u=>jTM|#rAiiBbQkl=+ zYmCFeOQwY-VBEjN%iHe9 zX(I=*=cXzMG^{fw^OukS^lFVDaSE5Fb%I8z6^1&7-@W)Iq+h5Y#8B8yIRw}GN zMvS?a6JgQfv`)$VeyIL9`x}0RztE^mBLFb*YMI}NTC|vHGXJoyLyK3d3<7M?D1Ji)xU4^HE2FtAj@ z$Mup;U51hdib#WFDE9$ssfG5nFNYZQriQJetcI zw3Y)MG^P`$W90?MYaq--#OYDz_Wg^alDoF5 zqrZry{x+k&vy=lhc_Fs1yaAT24!tH?BMU`;Zp0b`Wq9kns1O#SuYl{m>%c1Jh0!ft zHILe9p^zZlzL#kmHJYcz3*og0o_}K?deijIr}IgfBA|{xu;1Tc(^hfThbrlHepFI= zf~CD2i2Hv`{NEr){s@7s)kO@y4#n^?%6xGOB+c+~E;n8TCJ$V2AKx|cF^{OZcLNnf z2SL&8y4DMYDczB3JDN!Ka%m;-2hoV$+&N1?sBrRJ%fhN8MtymDOU7M0YW$Lmw3(NE za)N3rwf-fm+HHhy!9ln0W(I2zB%vk(48kox!)K89qYJ8 zFF(tbE09w;Is2TVD@89Zk<@6^oqmo|?eM#-$CcqV>kR%^vqBgis@_OJ5O?hJ)(fX7 zzmDb0spo%s(lJ`R8CTJpi6ZS_;2Ae}i}MH?R{K~NqK9Uaw4ef%Wy;oZc*tBv&`UM@ z7(PkMe-w~AN=(zbb?e{OMGuz1T;A+=VoKBbE!bn9>`yzo_E-vE~)sz8%-er=Byv zckYY6j&tl=a@8?bW@ExZd%%zKMj0fkVVa={y@Q#F!b~P_;FWicGGwaEq|LB)Nxx4* zEQ9pKOg0&Rvt`T%8Fme11t596+jxyrl`#cA%dis#sN08>By|RSk(kg7lZN0d*NK&O zWLFOCrwdg*netfkMCb#yaiu#5Wiu41*>DQ}kWruer^ai=1S9-`{+eiixF|{R4AaCi zhBW2f`@nZ7Pt!D8VprXCD*UZ0o@8CF0v81#pG|m3R%?Rk78mZmx7JC+syCWWyeT8p zyC5jLjkK(}7WC{0%_`3)ZUm_sUtc3MO&U?$Zpl#!tmRT&NMONUBl1csOFkfQ+)pj3 zyJ5%OD=xRNdHTPX{h!D+?e$P2+z2*kX(EJ%%ux+eL2*HFq_xb!ki6SKQ~xXEk7W2O zAeGkREjCvaWHIyy-g#3xDwBh)1V$R{K_nq`s^p*wip{W09(E=H6o#l)VSfbaoabEk zWDt}>DH4ylGTS7KiP_V|WXo?8m3S3Gf~OM&Eb zdnKrCrn?wIjm9r|WmKb$=VO+~;it6=Jl#;^@k$}iVju+rsKV?u_KJ!XGWl^@DRO!a z<+e(SnBcdQhLVVQ&um2dZu8=PUfc*(+KifLL_g6BHgXdpP&T%bw@XapTP$FU2az~F zr0;u2hct+KQEU!1A#`D}@;s}ZH0ON4f@f(|1M~8-H_?XvH!OyA zf|5iD=3a?cGTnl%r^h)8b|s9z%&$m<$b9%(_%Zjg+Yh0Soh&~s zyAEhY@n*HX-PP;PT-f_k{oUG}(#TV;O!t2Gnceyx5F9y$^zxq^uF}2*;v;f><9Szq zrB|R}DVdp&y~k`ZdyAlaiZ>P{UL0D5DD@}LKBgmN!Pc@*M4P{ z^kOeBvl0hJ-^7Kl-X-ncJuxi(8y#$G-4;6Qar-F`=@mx|8OW$x`;a_imve64%-bl2 z^5G3sn~uDFlQxRY56kTo8Snm!KIprE(Us9xfQn(g8!C|%&=(^d90fU=sZmA;>Kl@5 zUop_FW9P9D_VdygWNX!+9%xuxTp&3vuJJsR!1y6;xW9~N8h9+y>{&5H&E{*c+#_3+ z&gBi3AlEh9dZA>ZKm8TnYA0&-!R{08Gr>BxGy(Y7DIH=WR965E%IWaz`T(|gkYjf( zqgI;tnvD2h=7z;%1;4if4-d^fw8p#aKM)tYJpjov6OE>yyY}d^D&ZT~Ha3VkWiWD1 zm^Lmc9$*QY?uonV<%nleV@~@}Nf>bA2`G{<~L9p8E@Gx2xdJM0FN+S$Dl%%F8@6*BPEh71yKO9CTa`S%knjl$D>?A=sD%{|%uhh!jhuE6d$2yv968Iocld1VX- zwf1DszKwhUpz?KlUq0(=4xj8l_jFrN9%PXNfJ>Y5H+UbX5o!1s`;%|{pEv6JZQXcI z3XW`0gHCj(fER60v`KQ5hoh$<@h$wx?(AQ|XDu-L_Qdz+Dz}<}Geg5Js8a6!9s&`; z+!O#QVRH7sU)z5+6XL-hx}|iq zo7`|nW8SB2JFu}|pFJu2ead&n5dx~Q5y_)%eEkS6LpM@}WR90Rn$eF^;{zGvTzYB*c!zUK{~C$w=clPpjk-gL@;e6ETu z(t`eDb7fE)MP;med)JeoliUPePl^`%77`>`d+nAL!q%2XztT3i-23JDVvtykZ z&ZjQE=sz?bqw3tMozM{cq22BC1Ou%>?1bF`9l}R6>aN^Z14vMyy>#&2Ry4G{L7rd@eMR4eMaP&#)JJww(W=!qRz~&J6^YdXBQp9Yj zviMAtJfm?D=))&q3W9PBVs?A2?A^-3!7&L&F%k@J$;s8QW9P=1#1hp=O5Y^bb77QFvj+7dd*poxOEJ52mpQ@V#%3VlL<5hEkd6YOJsI_m#^JZk=a_V=GoX4pV2Sne!gjc^1we zea&J$7QY8-p#eFFfHziVN3HIiV1yv^ zNIlZ$S5mR35YZ6EJ-BJXOi3qW_)||*aL7!O2bz57GzQ(Jcvd|7mJp)O(9tB#pV+r) zs6O7GGbN6A7?S&3edHw0hnVY|O&zP&B4!0`x!Gr%kx`w@Aun}@OlaQLJ8euC+MD?F zpIwx;Q>QcOaoHF!w4&8v99H9Pw5nInxB5A&*kL&BHtf#q1`3I6TvkPHX0$)Q$8^@` z?H{&q*`Ra=d!7a}!6Tys&O@<(CyK6|hl7SngL}#<|3(xo;4|o%RB4vK)Eyc)ZZJd_ zKu%5HrXd1skus2d`w@L8xOX7Lc-*qSQX?kfZ}A=pv`%zS$iQZQ-E+n;zKA#p_J)Al zzom2Rl! zoUTIIy)3bNML1#I(ez|Ok@0)`=N&u5Nj8`Pv@F5V4m3J#v3{@{%F?gjTaGAypzJoi z7u0Mh=o?Chtjdrqq^j>jOr~|uY<$XvVQ1EC4r2_h4U0JM%+V!`m3_FAuYDil&JnQW zHe{LM<^*PZv*F*~tPBbfvC(jPZpeeqCm_(biAeK{2nj_L{wRAw>p65(YFNr4Z|YXk zL;pf6-M4{9{b#H)Sb`*hOS)E3*#-LT2!0OtNq`b+stQ_O5rU}fWZ7~<%!(qAIHXgl zYtdZDDdpH0f~@fF;pL@>Q(W`3dX!UAb5z4)-P=0L?W3>=mLAeHk>XZF@JmHc$NRXF5sWUx9snN`vgxd9=o zdLfZFzc{}+$Nrbn6iZL)yA2>aC^|q+a=Bq*$%!y!s*om~0nij8=gI)PDdrBb5*IqW z=@NfZ5|Abal|~T2=nI4>@BScZL0G2e(g54xT$E2?@1no@VhZP(C-=DuuuHJa6oKlC5zg6LuEQ5K+=|n zIpY-HZOZ|}3Q+^-b^9!=<$fTUP+@-8esb%4yhi9H_n>!ZMvd@v;Xnf<^v)_Y0j;n*=+v=j)FB#hRj zq9<~tZwGA!%Xq3)%=QVhFjhWQEkAj-Wj?!#&$pMVK6g+uk$XYKkV}PKFJ!)CS*kYo zf0%Yq#k?!0&4)v8p=F!%4Jy(^S|UDF zAK;H3e7jXpXO=YGIDtsf{&uFkwEV8XOAIEqjnH4m6tU0h@dMzi{mcaGA3;~1%Vl=B z9jp$#J7`b+TpVTPvyB_VDqQc{5(&M+dai=}Mtg34uToG`7Iki&v-~ZLe+bkxR4^vr zH$5fbC`}m5A=R(ci%o!)6*trfX@ifKtxMkQ ztfN@&-I!|Zr24l!u>$c@>TR8-zQlV6sFY?W^G;+Q+)#{|T$WXgaiagN8u>7DR{aN| zP4em2tCEf)Qjs-c?+AzPzVe>sRjd=2 z`IaAH^-J!8MyqMy>1~Z}(I+D{GHxo___+SVA5$Te`Ed)9f_dwMUhw*}wXChAi|#!> zt4$Xd|36Kjc5iI!YmNvwE}Inekm2L;E8^vJ=yAxJQ@bGfl=A6`i0@C9*4PU=U-QK$ zT>V@SQ>jQ5jntZ6+lY|4nb+-o$T3j5Eb%5q#HSL0#y=H5_nKm67e)#;qA zo)x_Qz{Q#aQjo`K%(*@LveBuJX&z;;Cj&F&NZlr^7d}7~JCikx!&AJb@@1;8743{_B)KM^^@MOk!bEvX2cjj<=h8s-v*OQUIQR0@J%zyLk8J z>I4`$Y6eD6%4*F!Jg@wGcv%3eZkaKGc9W0bs>ml{01l1$%nfwA%)&}7w@RD=1G%gG zlNKbsGw$s%!FS#~cUmHb75Y4nka~_%i?-P>v)18!op1Y9d6%G!z608V!BAir918BA zq3aHCm%qavQIo&L5TWs|Q|D@IOZ$qYdgNoo)lsoG9FgkQv6Zbb)j~HHn3mYP!Bu%& z3s@npptIR`(zfWE?N5hd8ebY3rVoF<1(>SC7Nd@v=e4S@)G&X5J(p*%xd*HdG@o{> z#T0RV2zyWwje|fFL+2ue1>d5xfja6DYLzBAi`L zu}}pIe(Z6$_6P-tAqTwWvcxuz2pwob>H2y5&B(dzxj*}U#T2S={3YwW`O(-HPz0SP zc8brRl$x3%KsD+hZZc-ly z6w|RCb|q-lRXwlV+9&2$-4uR-Ekx!M$qtzqi^bo6{*KuwiaH3&M|3b$CdLyLz0bC>555Y?6Q_kU>t_uf z_p|);{vFf~e=)GB$}V^rb(p@xEunHJ*eSjD@KutQ`WRA+v3W1rt?zg-3(7f0R~gLX zmJfCF@A3>}JZlHzdmurni7#)fJ%#Rnts5OAt~{=Mz?Q*j4$iLt(+nNw8Hcr6MC^D{ z{Fb%E%IuRaZRa~J+ypW-^M$IAcPBt8y&<=Dr>nT~!QTN%#rT)H8 z{>bnPy&V+XmK>^m@|(AS+;pIqUo4RMvAidf9ygXG{v#`pV`0hQ?S+%A=B#Xh81%6n zwJ_7D9bQJ+97^XtKH7EjA&+2yzuB1P0-hj#AplTHD9Nl{YirizT<7sb09aGKMqhsz zRcJA6i9De|IB4?&w&r%(aPq2X$pLVliyBw804K>*+?~f?AOlhL(aBWoeVt8OhRTyj z>DNpgwLhqXYeMdrO`M4R*=70$(1W^1Fgwbz&?!3mAKKfcDoW7T(<4r&juQP=(iKeI zAuT?J==O}sI85os&jG6{*BnP@ieS7ewAjpVXlK!1Z4PcKKl|v#GjpL+FPo~Slz428 zYI|^COF-N;&_H5eRUX9bYU*6#pN-c$xmUetZ9Ss?QP2*}Ydd~C&yLMex%%tI1!hTC z#WvC*Suv_wwK0 zc%kRndIca3v%VYTK;2VHE2iZZ;>>FB8)3*N_5oGJ@ zhi8C3YVWjT^gS5t3g=$*Tv@5@s9?uWH5ZB;tibKUvpEfz)-X-q?v z31%IXX3`RN?c9~Gx&Wbjl$fX2Iw@}_kwiu75^7Y>;Z4b8cx3zZ^;)_?%CRJZj#5Gu zJlQ0x^Cu+HFy(Tq$(NRP!V%HXwKYW|mL3NCM*P{}= zVjq{q{?IByS-X5noystYD&33xzUHk(BRFvK;tzys$J2KMDG0C zz&Y*fd}Dz4kaoIoQpaXCHc;L+Fg!=Y&X*$L;Jf3S6x^*_W9{(e&@UF>2~jwVh&nEt z?wOrES`6E_+zpF{1_T4_Tyj>-!5kMy0Iv?)=@eU}6&mQvCJWD3b~GSnf9r@v3TyYp zSgq)+#XW15^t;q&LaR|l*)@xoTqQ@atL@w3d{&J|(PojJlPI~>4lG{$a~AO|T7)R8 zjXaRJ0AA&{TzJ!^actaR zyu&wg6T-Cr(Gzj1X=ew&3Rv#FO-JQ#ZiqPM<6Xp1_?|LTFBwxU=1!r$(nQ`}DZw`e zK&HUFSYx|KWMhmcn)p@H#Rx$2OSTNfoCa3}^|+am(E^t!tocy`8?Xp5Bg8K-Gb{=Z zYkqR19?HOu(aHVVX9Y#_N7UZBJ*;&uoNFo>oPbYm7o;32?J2$*yWWfc`zKWkZSfub zvr0reMxM-_!wRxVObkW-1@%4$IY2G)>9ibh?7}hs44>Lj^bn~_Y=p-7_tX&N$;_FVi>O~imN~gvS&}L=ei8GjNIip z0UTX=2SZNtWY+E5(_W7hB-GFp-wZ}bc4Z~xVbAyp;rdSo-(rSBVmZG5JQ<`Zxb=Ud wG&Gll9qDP(oiBTX#fBK literal 10072 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 G)&BzXYAu@p diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index e01e99ba040162f9542b46d49d0e3f9b0349347d..4f9a7f5a959191aa4a9a7e314b37764296e5375c 100644 GIT binary patch delta 11563 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 delta 11177 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 From 73d514f5a25a194645b83ba23004ab2d2d5fcf24 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Sat, 26 Dec 2015 01:01:07 -0500 Subject: [PATCH 06/20] Ensures PR Won't Overwrite #2910 I was a bit sketched out 'cause #2910 changed some files that this PR deals with, so I made changes to accommodate that which was done in #2910. tl;dr this pr won't mess with the work done in #2910 now --- .../mob/new_player/sprite_accessories.dm | 50 ++++++++++++------ icons/mob/human_face.dmi | Bin 74834 -> 78753 bytes 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 7b5a05f7c28..5184fd694c4 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -368,81 +368,101 @@ //////END VG HAIRSTYLES/////// ////////////////////////////// - icp_screen_pink + ipc_screen_pink name = "pink IPC screen" icon_state = "ipc_pink" species_allowed = list("Machine") - icp_screen_red + ipc_screen_red name = "red IPC screen" icon_state = "ipc_red" species_allowed = list("Machine") - icp_screen_green + ipc_screen_green name = "green IPC screen" icon_state = "ipc_green" species_allowed = list("Machine") - icp_screen_blue + ipc_screen_blue name = "blue IPC screen" icon_state = "ipc_blue" species_allowed = list("Machine") - icp_screen_breakout + ipc_screen_breakout name = "breakout IPC screen" icon_state = "ipc_breakout" species_allowed = list("Machine") - icp_screen_eight + ipc_screen_eight name = "eight IPC screen" icon_state = "ipc_eight" species_allowed = list("Machine") - icp_screen_goggles + ipc_screen_goggles name = "goggles IPC screen" icon_state = "ipc_goggles" species_allowed = list("Machine") - icp_screen_heart + ipc_screen_heart name = "heart IPC screen" icon_state = "ipc_heart" species_allowed = list("Machine") - icp_screen_monoeye + ipc_screen_monoeye name = "monoeye IPC screen" icon_state = "ipc_monoeye" species_allowed = list("Machine") - icp_screen_nature + ipc_screen_nature name = "nature IPC screen" icon_state = "ipc_nature" species_allowed = list("Machine") - icp_screen_orange + ipc_screen_orange name = "orange IPC screen" icon_state = "ipc_orange" species_allowed = list("Machine") - icp_screen_purple + ipc_screen_purple name = "purple IPC screen" icon_state = "ipc_purple" species_allowed = list("Machine") - icp_screen_shower + ipc_screen_shower name = "shower IPC screen" icon_state = "ipc_shower" species_allowed = list("Machine") - icp_screen_static + ipc_screen_static name = "static IPC screen" icon_state = "ipc_static" species_allowed = list("Machine") - icp_screen_yellow + ipc_screen_yellow name = "yellow IPC screen" icon_state = "ipc_yellow" species_allowed = list("Machine") + ipc_screen_scrolling + name = "scanline IPC screen" + icon_state = "ipc_scroll" + species_allowed = list("Machine") + + ipc_screen_console + name = "console IPC screen" + icon_state = "ipc_console" + species_allowed = list("Machine") + + ipc_screen_rgb + name = "rgb IPC screen" + icon_state = "ipc_rgb" + species_allowed = list("Machine") + + ipc_screen_glider + name = "glider IPC screen" + icon_state = "ipc_gol_glider" + species_allowed = list("Machine") + /* /////////////////////////////////// / =---------------------------= / diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 4f9a7f5a959191aa4a9a7e314b37764296e5375c..e6e77045dd12952a7183b9a33f59b8c50a19523e 100644 GIT binary patch literal 78753 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 literal 74834 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

VWB7#Xm&2SXb0< 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

OHw0w;^fKd0V4y>1H_vF@q|9VE(byQSjF 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 From 5f72fff88003b41081db5a9ddd32903aa6f13e6b Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Sun, 27 Dec 2015 05:45:25 -0500 Subject: [PATCH 07/20] Final Pass Breaks Facial Hair updates into their own proc and puts facial hair on its own layer. Works through everything that calls update_hair with the intention of updating facial hair and adds update_fhair Fixes the sprite names and colouring on all 'facial' and 'body marking' aspects. Fixes/implements proper ID photo/preferences preview picture generation. To do: Tail marking customization possible rework, gutting in the meantime --- code/datums/datacore.dm | 14 ++-- code/game/dna/dna2_helpers.dm | 1 + .../gamemodes/changeling/powers/mutations.dm | 1 + code/game/gamemodes/wizard/artefact.dm | 1 + code/game/objects/items/weapons/cosmetics.dm | 4 +- .../mob/living/carbon/human/appearance.dm | 5 +- code/modules/mob/living/carbon/human/death.dm | 2 + .../mob/living/carbon/human/inventory.dm | 2 + .../mob/living/carbon/human/update_icons.dm | 78 ++++++++++++------ code/modules/mob/mob.dm | 3 +- .../mob/new_player/preferences_setup.dm | 16 ++-- .../mob/new_player/sprite_accessories.dm | 56 +++++-------- code/modules/organs/subtypes/standard.dm | 1 + code/modules/reagents/newchem/other.dm | 3 + code/modules/virus2/effect.dm | 4 +- icons/mob/body_accessory.dmi | Bin 10946 -> 10396 bytes icons/mob/human_face.dmi | Bin 78753 -> 78896 bytes 17 files changed, 111 insertions(+), 80 deletions(-) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index f1858339c50..a65a57a345c 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -173,12 +173,6 @@ proc/get_id_photo(var/mob/living/carbon/human/H) hair_s.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD) eyes_s.Blend(hair_s, ICON_OVERLAY) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style] - if(facial_hair_style) - var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD) - eyes_s.Blend(facial_s, ICON_OVERLAY) - //Horns if(H.species.bodyflags & HAS_HORNS) var/datum/sprite_accessory/horns = horn_styles_list[H.horns] @@ -187,7 +181,13 @@ proc/get_id_photo(var/mob/living/carbon/human/H) horns_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) eyes_s.Blend(horns_s, ICON_OVERLAY) - //Horns + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style] + if(facial_hair_style) + var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD) + eyes_s.Blend(facial_s, ICON_OVERLAY) + + //Markings if(H.species.bodyflags & HAS_MARKINGS) var/datum/sprite_accessory/marking_style = marking_styles_list[H.m_style] if(marking_style) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 06973f6f4e6..f909a241805 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -168,6 +168,7 @@ H.force_update_limbs() H.update_eyes() H.update_hair() + H.update_fhair() return 1 else diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 974879a0553..4ca71490dc0 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -70,6 +70,7 @@ H.update_inv_wear_suit() H.update_inv_head() H.update_hair() + H.update_fhair() if(blood_on_castoff) var/turf/simulated/T = get_turf(H) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 17e60881cc5..0a95335a99a 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -334,6 +334,7 @@ var/global/list/multiverse = list() domutcheck(M, null) M.update_body() M.update_hair() + M.update_fhair() equip_copy(M) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 08cc4086a9a..409679d4ac3 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -105,7 +105,7 @@ user.visible_message("[user] shaves his facial hair clean with the [src].", \ "You finish shaving with the [src]. Fast and clean!") H.f_style = "Shaved" - H.update_hair() + H.update_fhair() playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1) else var/turf/user_loc = user.loc @@ -117,7 +117,7 @@ user.visible_message("[user] shaves off [H]'s facial hair with \the [src].", \ "You shave [H]'s facial hair clean off.") H.f_style = "Shaved" - H.update_hair() + H.update_fhair() playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1) if(user.zone_sel.selecting == "head") if(!get_location_accessible(H, "head")) diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index bc0226f4597..26612b66ed1 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -54,7 +54,7 @@ f_style = facial_hair_style - update_hair() + update_fhair() return 1 /mob/living/carbon/human/proc/reset_hair() @@ -74,6 +74,7 @@ f_style = "Shaved" update_hair() + update_fhair() /mob/living/carbon/human/proc/change_eye_color(var/red, var/green, var/blue) if(red == r_eyes && green == g_eyes && blue == b_eyes) @@ -106,7 +107,7 @@ g_facial = green b_facial = blue - update_hair() + update_fhair() return 1 /mob/living/carbon/human/proc/change_skin_color(var/red, var/green, var/blue) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index bac4225bd9c..2c7b2cb8bd3 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -150,6 +150,7 @@ f_style = "Shaved" if(h_style) h_style = "Bald" + update_fhair(0) update_hair(0) mutations.Add(SKELETON) @@ -166,6 +167,7 @@ f_style = "Shaved" //we only change the icon_state of the hair datum, so it doesn't mess up their UI/UE if(h_style) h_style = "Bald" + update_fhair(0) update_hair(0) mutations.Add(HUSK) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index e728fb2db9d..4b7fa40588e 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -143,6 +143,7 @@ head = null if(I.flags & BLOCKHAIR || I.flags & BLOCKHEADHAIR) update_hair() //rebuild hair + update_fhair() update_inv_head() else if(I == r_ear) r_ear = null @@ -160,6 +161,7 @@ wear_mask = null if(I.flags & BLOCKHAIR || I.flags & BLOCKHEADHAIR) update_hair() //rebuild hair + update_fhair() if(internal) if(internals) internals.icon_state = "internal0" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e40c148082f..3f01c0937da 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -122,16 +122,17 @@ Please contact me on #coderbus IRC. ~Carn x #define BACK_LAYER 15 #define HAIR_LAYER 16 //TODO: make part of head layer? #define HORN_LAYER 17 -#define FACEMASK_LAYER 18 -#define HEAD_LAYER 19 -#define COLLAR_LAYER 20 -#define HANDCUFF_LAYER 21 -#define LEGCUFF_LAYER 22 -#define L_HAND_LAYER 23 -#define R_HAND_LAYER 24 -#define TARGETED_LAYER 25 //BS12: Layer for the target overlay from weapon targeting system -#define FIRE_LAYER 26 //If you're on fire -#define TOTAL_LAYERS 26 +#define FHAIR_LAYER 18 +#define FACEMASK_LAYER 19 +#define HEAD_LAYER 20 +#define COLLAR_LAYER 21 +#define HANDCUFF_LAYER 22 +#define LEGCUFF_LAYER 23 +#define L_HAND_LAYER 24 +#define R_HAND_LAYER 25 +#define TARGETED_LAYER 26 //BS12: Layer for the target overlay from weapon targeting system +#define FIRE_LAYER 27 //If you're on fire +#define TOTAL_LAYERS 27 @@ -356,11 +357,13 @@ var/global/list/damage_icon_parts = list() update_horns(0) //markings update_markings(0) + //hair + update_hair(0) + update_fhair(0) //MARKINGS OVERLAY /mob/living/carbon/human/proc/update_markings(var/update_icons=1) - world << "\red PROC CALLED" //Reset our markings overlays_standing[MARKINGS_LAYER] = null @@ -436,6 +439,41 @@ var/global/list/damage_icon_parts = list() if(update_icons) update_icons() return + //base icons + var/icon/hair_standing = new /icon('icons/mob/human_face.dmi',"bald_s") + + if(h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()))) + var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + if(hair_style && hair_style.species_allowed) + if(src.species.name in hair_style.species_allowed) + var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") + if(hair_style.do_colouration) + hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + + hair_standing.Blend(hair_s, ICON_OVERLAY) + else + //warning("Invalid h_style for [species.name]: [h_style]") + + overlays_standing[HAIR_LAYER] = image(hair_standing) + + if(update_icons) update_icons() + + +//FACIAL HAIR OVERLAY +/mob/living/carbon/human/proc/update_fhair(var/update_icons=1) + //Reset our facial hair + overlays_standing[FHAIR_LAYER] = null + + var/obj/item/organ/external/head/head_organ = get_organ("head") + if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) ) + if(update_icons) update_icons() + return + + //masks and helmets can obscure our facial hair, unless we're a synthetic + if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) + if(update_icons) update_icons() + return + //base icons var/icon/face_standing = new /icon('icons/mob/human_face.dmi',"bald_s") @@ -450,19 +488,7 @@ var/global/list/damage_icon_parts = list() else //warning("Invalid f_style for [species.name]: [f_style]") - if(h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()))) - var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] - if(hair_style && hair_style.species_allowed) - if(src.species.name in hair_style.species_allowed) - var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration) - hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) - - face_standing.Blend(hair_s, ICON_OVERLAY) - else - //warning("Invalid h_style for [species.name]: [h_style]") - - overlays_standing[HAIR_LAYER] = image(face_standing) + overlays_standing[FHAIR_LAYER] = image(face_standing) if(update_icons) update_icons() @@ -526,6 +552,7 @@ var/global/list/damage_icon_parts = list() skeleton = null update_hair(0) + update_fhair(0) if(update_icons) update_icons() //Call when target overlay should be added/removed @@ -554,6 +581,8 @@ var/global/list/damage_icon_parts = list() update_mutations(0) update_body(0) update_hair(0) + update_horns(0) + update_fhair(0) update_mutantrace(0) update_inv_w_uniform(0,0) update_inv_wear_id(0) @@ -1103,6 +1132,7 @@ var/global/list/damage_icon_parts = list() #undef HAIR_LAYER #undef HEAD_LAYER #undef HORN_LAYER +#undef FHAIR_LAYER #undef COLLAR_LAYER #undef HANDCUFF_LAYER #undef LEGCUFF_LAYER diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e577a2e2709..ce81f116920 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -112,7 +112,7 @@ if(self_message && M==src) msg = self_message M.show_message(msg, 2, deaf_message, 1) - + // based on say code var/omsg = replacetext(message, "[src] ", "") var/list/listening_obj = new @@ -177,6 +177,7 @@ if(ishuman(src) && W == src:head) src:update_hair() + src:update_fhair() /mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1) if(equip_to_slot_if_possible(W, slot_l_hand, del_on_fail, disable_warning, redraw_mob)) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 4ee2449150a..b8cc06da85b 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -267,12 +267,6 @@ datum/preferences hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) eyes_s.Blend(hair_s, ICON_OVERLAY) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] - if(facial_hair_style) - var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) - eyes_s.Blend(facial_s, ICON_OVERLAY) - //Horns if(current_species && (current_species.bodyflags & HAS_HORNS)) var/datum/sprite_accessory/horn_style = horn_styles_list[horns] @@ -281,6 +275,12 @@ datum/preferences horns_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) eyes_s.Blend(horns_s, ICON_OVERLAY) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] + if(facial_hair_style) + var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + eyes_s.Blend(facial_s, ICON_OVERLAY) + var/icon/underwear_s = null if(underwear && (current_species.clothing_flags & HAS_UNDERWEAR)) var/datum/sprite_accessory/underwear/U = underwear_list[underwear] @@ -821,8 +821,6 @@ datum/preferences else if(backbag == 3 || backbag == 4) clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(!(current_species.bodyflags & NO_EYES)) - preview_icon.Blend(eyes_s, ICON_OVERLAY) if(underwear_s) preview_icon.Blend(underwear_s, ICON_OVERLAY) if(undershirt_s) @@ -831,6 +829,8 @@ datum/preferences preview_icon.Blend(socks_s, ICON_OVERLAY) if(clothes_s) preview_icon.Blend(clothes_s, ICON_OVERLAY) + if(!(current_species.bodyflags & NO_EYES)) + preview_icon.Blend(eyes_s, ICON_OVERLAY) preview_icon_front = new(preview_icon, dir = SOUTH) preview_icon_side = new(preview_icon, dir = WEST) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 5184fd694c4..b498e433760 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -981,44 +981,44 @@ //Unathi una_spines_long - name = "Long Unathi Spines" + name = "Long Spines" icon_state = "soghun_longspines" species_allowed = list("Unathi") gender = NEUTER una_spines_short - name = "Short Unathi Spines" + name = "Short Spines" icon_state = "soghun_shortspines" species_allowed = list("Unathi") gender = NEUTER una_frills_long - name = "Long Unathi Frills" + name = "Long Frills" icon_state = "soghun_longfrills" species_allowed = list("Unathi") gender = NEUTER una_frills_short - name = "Short Unathi Frills" + name = "Short Frills" icon_state = "soghun_shortfrills" species_allowed = list("Unathi") gender = NEUTER - una_simple - name = "Simple" - icon_state = "soghun_longwebbed_frills" + una_frills_webbed_long + name = "Long Webbed Frills" + icon_state = "soghun_longfrills_webbed" species_allowed = list("Unathi") gender = NEUTER - una_short - name = "Short" - icon_state = "soghun_shortwebbed_frills" + una_frills_webbed_short + name = "Short Webbed Frills" + icon_state = "soghun_shortfrills_webbed" species_allowed = list("Unathi") gender = NEUTER - una_aquatic - name = "Aquatic" - icon_state = "soghun_aquafrills" + una_frills_webbed_aquatic + name = "Aquatic Frills" + icon_state = "soghun_aquaticfrills_webbed" species_allowed = list("Unathi") gender = NEUTER @@ -1588,26 +1588,14 @@ name = "None" icon_state = "accessory_none" -/datum/sprite_accessory/body_markings/dstripe - name = "Dark Stripe" - icon_state = "markings_dstripe" +/datum/sprite_accessory/body_markings/stripe + name = "Stripe" + icon_state = "markings_stripe" -/datum/sprite_accessory/body_markings/lstripe - name = "Light Stripe" - icon_state = "markings_lstripe" +/datum/sprite_accessory/body_markings/tiger + name = "Tiger Body" + icon_state = "markings_tiger" -/datum/sprite_accessory/body_markings/dtiger - name = "Dark Tiger Body" - icon_state = "markings_dtiger" - -/datum/sprite_accessory/body_markings/dtigerhead - name = "Dark Tiger Body + Head" - icon_state = "markings_dtigerhead" - -/datum/sprite_accessory/body_markings/ltiger - name = "Light Tiger Body" - icon_state = "markings_ltiger" - -/datum/sprite_accessory/body_markings/ltigerhead - name = "Light Tiger Body + Head" - icon_state = "markings_ltigerhead" +/datum/sprite_accessory/body_markings/tigerhead + name = "Tiger Body + Head" + icon_state = "markings_tigerhead" diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index 6663f833bef..893c415d1f8 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -145,6 +145,7 @@ owner.unEquip(owner.wear_mask) spawn(1) owner.update_hair() + owner.update_fhair() ..() /obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm index fa33c4fbf8e..30fde95fc3c 100644 --- a/code/modules/reagents/newchem/other.dm +++ b/code/modules/reagents/newchem/other.dm @@ -204,6 +204,7 @@ datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume) H.g_hair = rand(0,255) H.b_hair = rand(0,255) H.update_hair() + H.update_fhair() ..() return @@ -229,6 +230,7 @@ datum/reagent/hairgrownium/reaction_mob(var/mob/living/M, var/volume) H.h_style = random_hair_style(H.gender, H.species) H.f_style = random_facial_hair_style(H.gender, H.species) H.update_hair() + H.update_fhair() ..() return @@ -256,6 +258,7 @@ datum/reagent/super_hairgrownium/on_mob_life(var/mob/living/M as mob) H.h_style = "Very Long Hair" H.f_style = "Very Long Beard" H.update_hair() + H.update_fhair() if(!H.wear_mask || H.wear_mask && !istype(H.wear_mask, /obj/item/clothing/mask/fakemoustache)) if(H.wear_mask) H.unEquip(H.wear_mask) diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 6a9fcd3ffad..eca8911f6ad 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -593,7 +593,7 @@ if(H.species.name == "Human" && !(H.f_style == "Elvis Sideburns")) spawn(50) H.f_style = "Elvis Sideburns" - H.update_hair() + H.update_fhair() /obj/item/clothing/glasses/virussunglasses @@ -805,7 +805,7 @@ var/list/compatible_mobs = list(/mob/living/carbon/human) H << "Your chin and neck itch!." spawn(50) H.f_style = "Full Beard" - H.update_hair() + H.update_fhair() /datum/disease2/effect/bloodynose name = "Intranasal Hemorrhage" diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index a4fc178e04b416521c9eed6e38ced023147a3673..e0f708c69f92f0cc4de2d25989c70d77f7f1f43d 100644 GIT binary patch literal 10396 zcmaiacT^K!v~G}}prRlupi~e~O!A6m)C>??V(u5#gNeD$iMF~ok7LZPWAXQpI zk=|?Qp+g7|N&+O1_u_jkU1zL`%(23luM@t*p;^xnODA3l5# z5D<`;lY8{&5s^p?4-c=btjx>H1B1Z{2?=d&ZG(e@#l^+HfB!}x5CsJVAP^`vHulAf z7lDC+<>loh5~-u3qq@5K*|TR#N=n1S!$2VL)~#F2?l?I)<>chV#Kfeeq?n^{c6K&5 zH~$vdcZ=Cz@qT7t4A58}d(Aw){QkL__ag@{J5Og1Z)dPO0N|fe6n7uobooM1-`4Gq zHa$PxMmA?11|)=+K~CC-CN`SRta)!Sfvcm5Ztl>o6YRoUYU=H}wi3ek;FGClKsO3Y zVe{z6xc1GQ6ro=`w@wd!kUeg8o1yMu^Zvw~cD$$}cEb3j1#6hVTayf*6-aMd(VJPp zzT%S+^_z8%Qu{j|%)H)};jl=1kf^6#K}^oFx8{GC@Xg2k^mIyLGD9nOJInOAKzg3YCWnor9Q3sGpFYMC5y2a3O#s z=oJSExhYRY2P#`0yg9@$+_+1op?T`M46$otTJQZkW%W%KJ&oLGGJ)IyN@YVG8bsv@*htjy00i!d+1e9XjJhNyPEEB^Anh(K@#t1#jf zGHNLapeJCU#yaB?_r_3wL8`z{k<(=DOb<3HU&1tR&2QCFxNix+qNCDCgJ~BM8I!}9 zmn~^-e8%Ye%oR!J6+Yw5BaCd(Xu4T&1u_vThcX4#Zu=SKQ6V5;5WIW zSbbSx!)M+Q7)so{4fHGJlZ~jRQ2EPWngj+7&-6PGq5j^@OL33Y&gH^$5H_>%_3`Yi zuyX!`%)W*P%$~wZj%^Cr@4)3wIcA{v$JS;IW`=^6N*Q!nrpbm{LtAXHaY}9Qp;mu_ zAxk_PhfbykFO@H3gZEJMpwmO9u5LoQA&u=sFGGH8djS=1u`X(}*hg!-`HHab8tnk6 zC-e#Q^8p|2;%n7E#dp&91#Gt#P)}zTK>3W7u%qsx%sHX@s&w2w9$gvcz;1Tk(w43? zg-TO+Yru*iik%gI6SZ}?@^vkjrbya57Pv9fa)|_GKXKsviwL-;Fq^sL*qoEh@?VnW zza7rps0Ixx?c>-Zw5K7{;-P1Bk1Qt}9fj5pZsaASYPrIVZ_BMA(9x2%Uu=aC;)fu< zzKPi{EqRHkTEpd7yHBdsoNXw3-NkEWkwY2X_ni)J=#4WTNZ@ZT`NzxRqRiw$eu%FU zoU^mG-;a)^MA}xYCE$*lVrkNg&pNs8I-JruUfcR5P5O31K_V)k8lKB1G8*_;0WT8C zC((dEF^cyRy0HOs7LY;(_*&b50?t67)7jiUbRl_=iDM^Z+Uj+Ndf;@>7|D=Lm9AFt z%ki2Sp9w3OSj-$m2n>ZXw6U~N5)v$^c`v{9n^Jl!W|{Ds-6KOYppB)xSflU6>H9L|mD%j`0*r8SOIrkyYq1<%(u3N^S=6CT}=kg-P(!TIrXGY|y&ck(2ct(88~+Cu3cxy-jo zW#C|O!P{(hl#$zen6(3Vx|%+k(61@c446QkWKBFh*;O%jfWtmmO^8zYwrw6jrSm-j zVw_B?_((0z}GX# ztOK&JF-DvA05t(m_aQ?YRX6IODo>2)%mW4w{$v|)ny|DKq)#yN3V~pSJBq!lleGN2 zyMFvSo{;}ocGO`Tyno^iwd0!B23@Q|On^Z;Ux)r)UZfX8ba8EZS+eZP@#_4S3j4vc z#yaTwoHn+xK_Rc5TV7<4lnM95PVy#7VsA6rM{==1Gedjc-C!Rxg5AyVJ z=OQ2)({!vLV@2mcvyLkCE0pyyC9>L#ar$v{;gQ8XB%d!tEUVQ6C9)`A8*OKSb zImI5{@9PV_2|_clyv`G>7a8#d*EVLeq4(=I58G0uRdRz}VQt!OG#!hx=g~rEl=KdI z&p0SQ^mS&S!?Q<#pCIGhRFIAK(;B(2g&Ug+S+H*hn{3H+?ljSMr*!-9^}z%gcfFP2 zT?fZihORidjAQ8h77X>ofi`vw|I50KV=3-W5ov1=s##ye+WLX&9lnlcX;J&_dwfwW zPM4dED&hdCy3)s zB`9cm5U!JI!5U8;{=SJ;cMHDb;eP~q6`N~h(Xq6_cWzec-vUibQwc_Z2FZGvp-h@8%IH~lG> z%P9JFN@@1AZR{DR@(VN@F2f^QMPC))_eDkCqp`1z&{)^9;w&2BIDrzm7E-3|H#7o zJ+jxqR(|q*Ua;dQcKyA&gZwY*{=0bB0Mk5AbM=tv9{LBJ>b#8BD_k15T1gsTmmxwr zd6f#DtBx1A`6Zor+RPF}^Zl4D>Tz#|AQC*MJDYwo#q9nQLcg-n%x9K>-$y%OjCt$z zsLEZahYwW#azKuEpKkqeHYkePC-CMl*$1FS7tF1szd0&o``_k1rXz!@^p+swYm^$J zrpX?x5I?6v^xwvVyC6T#ceDu-n?aI$JjA-5;kC?xknMm>|6z@k%fuMl|zzi#N|E8Y*4YusZ_vWm5Gwy z#~ImiKafUVD~ju^zL`HRKkO$|0Ga)0&bd`fj(x%OcPI7J{Ulw?<}OyG!H8i#n7=phe5a!OUb=5On%?;xjEs6{ z0Rr#qQImqTy7qh2VJ+DiPhtX5Nv-#ChbQYE%pcLnx6R z-s#X-SUluib)|tP$*nmU^D4LdEz9v2{<)ybd9RCL($0H+NxvD(^E4;K5m2-T9pUR# zB(-(ylL_pH?)Tb!yS*%4pJq)MxvVr6Cwr6cR-(q>*{B@i-Dp$TY1XeXL;@CW^QLHT zgRjglgYPVeDz3dUyU;Y__fPSIO@;Kw2T?K$bCXSN*QR0Q6RH>cPI-{v2RE|H({1N2 zIp@3&Kb-Kw!aP}XkqE1q$hQIo$p)%Lp=E1BpB=^ev(}V8W(kMY49pCD#yGPsfd19- z{tquOT8%eAMVgG{u)ruWV z>!dW1$&rqqZWO)fFC0xCCa%aaQn<@Rxo}* ziY+D6D$S>-re@;txS5$L#a$@SnbX|_1EZ4i^?*|chhvmp)IrmDA=(&iRoQf$i9K(g^d8$U*PK(6e~S`(5=nXTg2^m zQJb?z|8y!U+S$6X>@C$!@PFGPwo_?WIvoV zpY7-FoVM}>bfX%Thq7za(hGyAEW=`%hUqZ}+mP^TD4S4AqyVLD`^ipj1kwLjtX zv$P3HvFs8Dwx?=j;pNHzxB$rDc8MdNM#Znx)&!)l)b{>F_-lLNO*dfkELlGl48hih z--xO*p!bCkte$!_6|is+M<85FoC#OYHw=`Zc{5(H`VBl`qv291=*AnR+A>QuR#A|jVa-Sj(-&o7elXDN*@sb<1nqE9nF3sZpgT?fn3F(&7l; zn&+xz*%btNiOv45MGM_><2>GcHQUgA9nX=XchDU`E zPsk>tOT*w=6Af$J{=91i@YY-%V~a8s4Qp0dDPrVJ*0oR}trl+Qz*7u^joCtK`TY1k zAf{lYggqZFPLDY-RZ;89QO`d}zUN`hpc+vB6~=(`Z#TD79*#!^UZa*ho7AWvyK>D2 zU`0BsSGqVIEQ^61C(wShyZA?Fq-fd@0*thAk)*zou|5f#ay6}thgj~PFu|H4ru3+= z_qu3pB&C?3{|-%P#m}Z=Or(x8+)ufUyH9c2R3(Kr9mE-4-anB;(x;#eXnSxI?jN}f z<(n^>+8y_KoaWbK(Rs#_uIKv8}vHI#F4*q@O--43Sy9DUGO?r zhB1&@C5{C@XJ45&uQ>VKk`ZTLnc$v2nh3unaa|=3Y17dVb!8rL;YU9p27MWZ(iM?= zRZm;!8*+3i1)E0Nzr+N-3E8m1Ik9ybq!+0MS2Va42^X;_LCxtw!&fILrld~;>fAkz z+<52pjYIqc-n$CvVlal|ctCWHV@8n!netTM>kacRST@4pvmOo6^LgMaWpxulg@Kly zr%W)%H7sFJN^wEx;r4>`-pEClSzCn9>m8BurTzz#ZgziRt-t%~C5G;GTT{m4wR3>@ zO+|mgJ3z+nAhP<|xTxaK!k{&l;g>l3Uqc7mPB_xZ+6p3ooh@qb*KZkR!>RVv(^%Yu zX~Ph!9zHjE`p%I()vSg6!flI?79NimN1~VQw(wdWl-!WhUVWTfI|+vYZTu5*`}_L~ zX8xz45qwdfr^M88c-^+g{&jfQEOB!s14-lgD~g~m#!i363A5UD4ZJ zoSYHc@o{Y5ccVL1oV-Bl+D)CN7V$^dS1jr7lWMnb_f@^nl8KQnWV7ta5;3uTYF`e) zb>BP4eLY)3Pb6i_-$bGM5QnRXSG3v74p%%0S`=m;^(4GQ z#pC~ckY);RD3eL17T|$PhaU8inQY}$#ZSSz+}lIS?S5=RaBoKTaewtqMv9JFU7Px^ zEojxz==zb9p5WIX0h&IcO33Aq-bAE;p=rdcI|c_UCB&BD(1V;aR#;5d+P@c~f<`K7 zyY3_bH`OnH=Yo*nHZ(U)DL+*@z_b|nDO9ABEOx1JzZmqVK8^Su{E6L%5x$?fRFtcZ$(WC6)vRoO3^N(HUZLAe}J*xjldEA`(7G3-iOo3 zz>wE844f;suiqY5%-hivM&*Jd!tOwBP6H9h0k(dn;E+0fkgJ9P=o_qLMFsfrOuJrs z?fR)Y)Z=!KsY$=^l>MGX&LKH`y^O}ZCE*iAupH)@OcA-n&y;h1-jy(-8X?O6h*AhpuD}B}^!(V|O(dUTYhOndX+MA#>>ALZo z)DB4DD$aQ)d!^Iwg^6tp6hV$-JJ@j`hQQuX8}Gl;#|O#wX!tb(;~{@!LIfhv?&&H_ zumi>$t;svtwS6_Ph$UUi4S@lP6xrzLo;};{9LQ*bK(uvmSOgQhkIIZn1tzG(5k4D3 zJb^BsyO0xE_~Gfyq~CW4o*mTSF5z&`2zDIe(Fs(TEk8bfayX&JHBtff@KrutQ8eJE zWP=U#g_be)NToDzOxRE&rIL7&1#dTJ7OW*&ABNPLHBZ!sj-0q{y9QW`c^c_6xzMPs zb!hNITJ6RHq%9ax{xFM){MW`@#9xLIbydVKslbmI_|p>OWnH-L=B1II*1}{CWl*uZ zBjO?c7}xzaCjT#4S%$d%Yg7R8xx;6PM3>@f$fma==`Pu;xp0=o z?9wAEs^O%Vb=EuDwZ??p+!xYWdCn$=hLsTOjHFEjNR|3)>z3)xZ+^F{K%RCE6u5co z2MH0&-A&L{p3Iq2|K@as(w;QJ_oB()-E9H$;^=!?185Xkv6u4j{O59v9D%$o=alve zjdDJECI9k{T45_n$1mm@ntoFaW1?A@f8DjuG~V%5Aba%Msa*Em z1JvU#N4j|lQ{XI7i3RT%OO#Ml^O5tlJrAFoI z-B$`Oblaem79IQ^qCTnHY^jtKL2C;(ji#XlM9NaWUf3{}5>YArCNwp271*Jf07n++ zgUpH|ce24?_dgJPvcTklh>5HLnkf6j`~KVGE|Vnz=HzDe8|I4U`eXN(C}mG`LJbl< z=cAGb;T-9ZX(xoi&0ll6cb0pM#}@ICe@kYX^3$D1p=!rR-Tw1K1uWJQ3C%W`lf%w`ptsUz74EjlFzejR? z=`ob^`ZtBnT#qsY=$E|0kI$70gF7zZWsNe^8kZZ+W+aaleQD9HfLr7o*A+R-d6!K{0X61wrr9!_2dpq{10 zc_b})d8$4oEqp@axbC8dbpk#1iMs+)iWzGcNA*XJ|7(&2Rkc*NdHsaVP($;lSxC4l zx>5M@-{l@jFM(*02T}n2t_=LSs7LiVM6@SJ*_A@D4@`)bz&j)_JQhlSN90?qmCE9X zoPPf_jaXyWRbf9QDe##7%5lVWPo;|P;xGUzx+LC zk|8_O(N2TiwWw?|0R;cA5yaGLRdzu)87epgNA&*h#T-lGjBp zl~I2_IiKRtg*~HrfoNzrJ4tqtBwE=9lWc)hVeS58bS@Bs%m?w|?;9MKelo(%UaRY5->bTkjdC6b9 zjNVQ`N6|svUQRE&{j3EIMFRK?5R_M@2lTt$Q$vr(4x<{3wG)AM-(g&LH?)k#g>2^y z8&oNSc8j&|P12iT-VyDCA=HzeoJpy6)wfYzp##{+xH4{*@eNgZ_v4AdVavqnoRvaH#-j zj9x!cVUUH9g0uUGJ-p7AU$I(cK%-K6WAJ_P(n#xxjeFVDWZ6+{Y0N}A$f@hzs)|rb zyPwUcU;6V!?m&zozjbr%OK@vxOEuVhHt!?t>qgmnJb$)w z4>Enx?smla$A__9ZBcLR+5IZo4NC`>77AR3_)G|z3F^OfcG5b~hsPes2hupaTxPd7 z+ys23T~%Gi+OBhmAx}=m`m2qZrg192?EIwS{sbr$wBwTrRnGVmF5Qx-5LwcZKW@W8 z_>rz=9g^I%uc1a%yB9w~)RKS8^F}y=Km=8!>2PwCR~3z*znT4oJ#Xio+KLGUV{LPm zkqbWg*WN+vjetNUzD97`eX-qK%ZGpK#G8uS+XG%%U|%>Kh2AFsG4@>AsI#%JKN<;z zUzit;2ay455Unhx>~pjTp_ejcpF*W&dD1(|I_LdbClE-(r`)5^PT>*eaNq7gB=dKD zyNCPA6TgiWb|U7_t5#u=MX`iM=>XrL6$abkrtfm&6bg~cHKPOoutom;7GV2I_52dz z_NT{w#iB&e;@Am{phK#Le+zRCFWXzfMeKScZJr7 zf=K6^cfDHQO+TMTBuv{a@OR!2X3^}2i=FLj7hVfc-ZE*P`1e$^Qr!19AoW?oWGYmG z=!c{Kp+NkdWx^(0Zaa1+6d@5em0|*?=?WtVOxY~_)Y@{F$*7?!wVFgwhtXJ0_v}l? z^(iTOS#LBnK(O2-Q>HlKBREKXU+XxCJ*{ei2JcaBOPzUE(Jp@q5&hIB=$621!>_+*BeFm4E7yom`h+`6zKCCRh`SH*KsuvMz>4_C( z4=9z2d(=~imJ9Yp`x|sLrm;ZeCaRD(EzGoiO9}8;B4HE`hn4+WQ32l@1YEEEW**cf z9K2|2IP7pOmxEU?ea0*-NtODFb%%8ffi4c3*6bba`tX4)w)U4c?0o?p4Q{nw5JxT3 z_IT;(>%6lU`%MnmP+nUDJ4@Pau{(Dn#rivp{W@G(QjcpT&KzwYU-#Xvp_vXj_^PqP zqlp39rHs;0d$HGe2x|4>@V@@XGBX-ICGas}WMSc{`Y)`87DMXGlQ#y%05eKED`48&QTnxvE$x{q5`=9~A=)_RGCn$9 z*njEqSoNdK0H4N3o-p*i43r%ySG<9f<-7=7|*B=k|l9_3;4>J-9xGLVEZV;06*# z{C~Btt$R1=abG_LRxQ*Mnl)Vh>Rk~phkN~?M5@dereyh*sdOO`GS038ewyzZyqWJa za=ZZw%(t@l2>R7@rnGf2q`>MFefq*g>GbTZf|dZyIEBbBnDr%H0Vf~M!@m=zkTgCx z&ippWdlhEM|LubN^Fyu|V-=M_-4~r{5-?UukREOp0vN&eu0HOt5uh+`Ts6+iMZH}J^+ zM)QM128uyOo zxRZ^pZf;){JHZT85F!{_nJtW?V7*jxggp-Z)K#~LkKP5b{Ns8Y+yb=cYb9(03v`>w z-yvAc+mc@FODu*h+zROW%6p3ra|o@cn#kJLWn9Pcuo55w-ZaA9sc#;uSR)8!Ncli| z4jgeLd8CibFgg)+f=-RUJBtO+d9G1+EaiT`e^|G*G1*73&FjL_b_$f`Y#8wtuP{=W zl^19`+q}nB$FT1I1T|qpfh`2a2Ozye_{w*W5B|7e8-@!r-o?3vs+ePen1eJk7HN7} zH!7%$QD+WKOd&7~@U!l$!v5_?m3r3t0)>_8dc9Xm+x~dgZB|H!z7jIS_fITtQcrU^sOT;`gOuPRzpZ^1Fnj z;h}kyJDY1RPS;8GWV{=q$|wyLHE6YUqM+yh5OB4K4^Tc75cj+!tjpnVUwW0tv<@M( z8Cn){@~2@Ho<`n8&6A@JmRAEjzY*e1x7Dm1potMWeGSvR$rHi41fz}@HkKkeuP0_w$(X>Q{nZs7nHP`O_-;t; zVT`wZ$#ZobjLTP`^@p(bo=?~5xVNqZR>1HAp#v6xExSGY?mt>vVlQ{dn?Ss*({h^? zLnkemu+~h8pH$|o4LO$$V`fOLV=C_bLNRkt={V2GF0cW!K2~_wjuuq D5~f;F(gD9X<=g^AgF|dfYb;HseyEDfC?f? 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 wG&Gll9qDP(oiBTX#fBK diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index e6e77045dd12952a7183b9a33f59b8c50a19523e..2501df9741f0789900a17720d9c5c327768bccfb 100644 GIT binary patch delta 15325 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 delta 15184 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 From 63b304f4f22dbd3e8f63d5ed70b26f665590e063 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Sun, 27 Dec 2015 06:19:43 -0500 Subject: [PATCH 08/20] Darkens Horn Sprites Was a little too bright before. This change darkens the horn sprites, overall improving their look since they're autocoloured based on body colour. --- icons/mob/body_accessory.dmi | Bin 10396 -> 10373 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index e0f708c69f92f0cc4de2d25989c70d77f7f1f43d..dc91d47685ffbd44ae058a4a94debc791d6fc466 100644 GIT binary patch delta 9030 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 delta 9082 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 Date: Sun, 27 Dec 2015 19:43:12 -0500 Subject: [PATCH 09/20] Guts Tails (for now), adds Horn Colour Customization, Fixes Icon Typo, Cuts Old File, Adds Species Checks Cuts tail markings to be implemented in another PR, adds the ability to change the horn colour independent of the body colour and reworks the code accordingly, drops the preferences_savefile.dm as it's unused (@crazylemon64), adds some species checks just for uniformity --- code/datums/datacore.dm | 8 +- code/modules/client/preferences.dm | 63 ++- code/modules/client/preferences_savefile.dm | 453 ------------------ .../living/carbon/human/body_accessories.dm | 50 -- .../mob/living/carbon/human/human_defines.dm | 5 +- .../mob/living/carbon/human/update_icons.dm | 6 +- .../mob/new_player/preferences_setup.dm | 2 +- icons/mob/body_accessory.dmi | Bin 10373 -> 3612 bytes icons/mob/human_face.dmi | Bin 78896 -> 78896 bytes 9 files changed, 53 insertions(+), 534 deletions(-) delete mode 100644 code/modules/client/preferences_savefile.dm diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index a65a57a345c..d967b5cc2cf 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -175,10 +175,10 @@ proc/get_id_photo(var/mob/living/carbon/human/H) //Horns if(H.species.bodyflags & HAS_HORNS) - var/datum/sprite_accessory/horns = horn_styles_list[H.horns] - if(horns) - var/icon/horns_s = new/icon("icon" = horns.icon, "icon_state" = "[horns.icon_state]_s") - horns_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) + var/datum/sprite_accessory/horn_style = horn_styles_list[H.hn_style] + if(horn_style) + var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") + horns_s.Blend(rgb(H.r_horns, H.g_horns, H.b_horns), ICON_ADD) eyes_s.Blend(horns_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style] diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 57e56808de6..0e1c731e428 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -110,7 +110,10 @@ datum/preferences var/undershirt = "Nude" //undershirt type var/socks = "Nude" //socks type var/backbag = 2 //backpack type - var/horns = "None" //Horn style + var/hn_style = "None" //Horn style + var/r_horns = 0 //Horn colour + var/g_horns = 0 //Horn colour + var/b_horns = 0 //Horn colour var/m_style = "None" //Marking style var/r_markings = 0 //Marking colour var/g_markings = 0 //Marking colour @@ -360,7 +363,8 @@ datum/preferences if(species == "Unathi") //Species that have horns. dat += "
Horns
" - dat += "Style:
[horns]
" + dat += "Change Color
__
" + dat += "Style: [hn_style]
" dat += "
Body Markings
" dat += "Change Color
__
" @@ -1201,21 +1205,32 @@ datum/preferences if(new_h_style) h_style = new_h_style + if("horns") - var/list/valid_hornstyles = list() - for(var/hornstyle in horn_styles_list) - var/datum/sprite_accessory/H = horn_styles_list[hornstyle] - if( !(species in H.species_allowed)) - continue + if(species == "Unathi") // Species with horns + var/input = "Choose the colour of your your character's horns:" + var/new_horns = input(user, input, "Character Preference", rgb(r_horns, g_horns, b_horns)) as color|null + if(new_horns) + r_horns = hex2num(copytext(new_horns, 2, 4)) + g_horns = hex2num(copytext(new_horns, 4, 6)) + b_horns = hex2num(copytext(new_horns, 6, 8)) - valid_hornstyles[hornstyle] = horn_styles_list[hornstyle] + if("hn_style") + if(species == "Unathi") // Species with horns + var/list/valid_hornstyles = list() + for(var/hornstyle in horn_styles_list) + var/datum/sprite_accessory/H = horn_styles_list[hornstyle] + if( !(species in H.species_allowed)) + continue - var/new_horn_style = input(user, "Choose your character's horn style:", "Character Preference") as null|anything in valid_hornstyles - if(new_horn_style) - horns = new_horn_style + valid_hornstyles[hornstyle] = horn_styles_list[hornstyle] + + var/new_horn_style = input(user, "Choose your character's horn style:", "Character Preference") as null|anything in valid_hornstyles + if(new_horn_style) + hn_style = new_horn_style if("markings") - if(species == "Unathi") + if(species == "Unathi") // Species with markings var/input = "Choose the colour of your your character's body markings:" var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null if(new_markings) @@ -1224,17 +1239,18 @@ datum/preferences b_markings = hex2num(copytext(new_markings, 6, 8)) if("m_style") - var/list/valid_markings = list() - for(var/markingstyle in marking_styles_list) - var/datum/sprite_accessory/M = marking_styles_list[markingstyle] - if( !(species in M.species_allowed)) - continue + if(species == "Unathi") // Species with markings + var/list/valid_markings = list() + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/M = marking_styles_list[markingstyle] + if( !(species in M.species_allowed)) + continue - valid_markings[markingstyle] = marking_styles_list[markingstyle] + 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 - if(new_marking_style) - m_style = new_marking_style + var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference") as null|anything in valid_markings + if(new_marking_style) + m_style = new_marking_style if("body_accessory") var/list/possible_body_accessories = list() @@ -1656,7 +1672,10 @@ datum/preferences character.socks = socks if(character.species.bodyflags & HAS_HORNS) - character.horns = horns + character.r_horns = r_horns + character.g_horns = g_horns + character.b_horns = b_horns + character.hn_style = hn_style if(character.species.bodyflags & HAS_MARKINGS) character.r_markings = r_markings character.g_markings = g_markings diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm deleted file mode 100644 index b0f6524b085..00000000000 --- a/code/modules/client/preferences_savefile.dm +++ /dev/null @@ -1,453 +0,0 @@ -#define SAVEFILE_VERSION_MIN 8 -#define SAVEFILE_VERSION_MAX 12 - -//handles converting savefiles to new formats -//MAKE SURE YOU KEEP THIS UP TO DATE! -//If the sanity checks are capable of handling any issues. Only increase SAVEFILE_VERSION_MAX, -//this will mean that savefile_version will still be over SAVEFILE_VERSION_MIN, meaning -//this savefile update doesn't run everytime we load from the savefile. -//This is mainly for format changes, such as the bitflags in toggles changing order or something. -//if a file can't be updated, return 0 to delete it and start again -//if a file was updated, return 1 -/datum/preferences/proc/savefile_update() - if(savefile_version < 8) //lazily delete everything + additional files so they can be saved in the new format - for(var/ckey in preferences_datums) - var/datum/preferences/D = preferences_datums[ckey] - if(D == src) - var/delpath = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/" - if(delpath && fexists(delpath)) - fdel(delpath) - break - return 0 - - if(savefile_version == SAVEFILE_VERSION_MAX) //update successful. - save_preferences() - save_character() - return 1 - return 0 - -/datum/preferences/proc/load_path(ckey,filename="preferences.sav") - if(!ckey) return - path = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/[filename]" - savefile_version = SAVEFILE_VERSION_MAX - -/* -/datum/preferences/proc/load_preferences() - if(!path) return 0 - if(!fexists(path)) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/" - - S["version"] >> savefile_version - //Conversion - if(!savefile_version || !isnum(savefile_version) || savefile_version < SAVEFILE_VERSION_MIN || savefile_version > SAVEFILE_VERSION_MAX) - if(!savefile_update()) //handles updates - savefile_version = SAVEFILE_VERSION_MAX - save_preferences() - save_character() - return 0 - - //general preferences - S["ooccolor"] >> ooccolor - S["lastchangelog"] >> lastchangelog - S["UI_style"] >> UI_style - S["be_special"] >> be_special - S["default_slot"] >> default_slot - S["toggles"] >> toggles - S["sound"] >> sound - S["UI_style_color"] >> UI_style_color - S["UI_style_alpha"] >> UI_style_alpha - S["randomslot"] >> randomslot - S["volume"] >> volume - //Sanitize - ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) - lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) - UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style)) - be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) - default_slot = sanitize_integer(default_slot, 1, MAX_SAVE_SLOTS, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) - sound = sanitize_integer(sound, 0, 65535, initial(toggles)) - UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color)) - UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha)) - randomslot = sanitize_integer(randomslot, 0, 1, initial(randomslot)) - volume = sanitize_integer(volume, 0, 100, initial(volume)) - return 1 - -/datum/preferences/proc/save_preferences() - if(!path) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/" - - S["version"] << savefile_version - - //general preferences - S["ooccolor"] << ooccolor - S["lastchangelog"] << lastchangelog - S["UI_style"] << UI_style - S["be_special"] << be_special - S["default_slot"] << default_slot - S["toggles"] << toggles - S["sound"] << sound - S["UI_style_color"] << UI_style_color - S["UI_style_alpha"] << UI_style_alpha - S["randomslot"] << randomslot - S["volume"] << volume - return 1 - - -//saving volume changes -/datum/preferences/proc/save_volume() - if(!path) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/" - - S["volume"] << volume - return 1 -*/ - -/datum/preferences/proc/load_save(dir) - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = dir - - //Character - S["OOC_Notes"] >> metadata - S["real_name"] >> real_name - S["name_is_always_random"] >> be_random_name - S["gender"] >> gender - S["age"] >> age - S["species"] >> species - S["language"] >> language - S["spawnpoint"] >> spawnpoint - - //colors to be consolidated into hex strings (requires some work with dna code) - S["markings_red"] >> r_markings - S["markings_green"] >> g_markings - S["markings_blue"] >> b_markings - S["hair_red"] >> r_hair - S["hair_green"] >> g_hair - S["hair_blue"] >> b_hair - S["facial_red"] >> r_facial - S["facial_green"] >> g_facial - S["facial_blue"] >> b_facial - S["skin_tone"] >> s_tone - S["skin_red"] >> r_skin - S["skin_green"] >> g_skin - S["skin_blue"] >> b_skin - S["horn_style_name"] >> horns - S["marking_style_name"] >> m_style - S["hair_style_name"] >> h_style - S["facial_style_name"] >> f_style - S["eyes_red"] >> r_eyes - S["eyes_green"] >> g_eyes - S["eyes_blue"] >> b_eyes - S["underwear"] >> underwear - S["undershirt"] >> undershirt - S["socks"] >> socks - S["backbag"] >> backbag - S["b_type"] >> b_type - S["accent"] >> accent - S["voice"] >> voice - S["pitch"] >> pitch - S["talkspeed"] >> talkspeed - - //Jobs - S["alternate_option"] >> alternate_option - S["job_civilian_high"] >> job_civilian_high - S["job_civilian_med"] >> job_civilian_med - S["job_civilian_low"] >> job_civilian_low - S["job_medsci_high"] >> job_medsci_high - S["job_medsci_med"] >> job_medsci_med - S["job_medsci_low"] >> job_medsci_low - S["job_engsec_high"] >> job_engsec_high - S["job_engsec_med"] >> job_engsec_med - S["job_engsec_low"] >> job_engsec_low - S["job_karma_high"] >> job_karma_high - S["job_karma_med"] >> job_karma_med - S["job_karma_low"] >> job_karma_low - - //Miscellaneous - S["flavor_text"] >> flavor_text - S["med_record"] >> med_record - S["sec_record"] >> sec_record - S["gen_record"] >> gen_record - S["be_special"] >> be_special - S["disabilities"] >> disabilities - S["player_alt_titles"] >> player_alt_titles - S["organ_data"] >> organ_data - - S["nanotrasen_relation"] >> nanotrasen_relation - //S["skin_style"] >> skin_style - - //Sanitize - metadata = sanitize_text(metadata, initial(metadata)) - real_name = reject_bad_name(real_name) - if(isnull(species)) species = "Human" - if(isnull(language)) language = "None" - if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation) - if(!real_name) real_name = random_name(gender,species) - be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) - gender = sanitize_gender(gender) - age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) - r_markings = sanitize_integer(r_markings, 0, 255, initial(r_markings)) - g_markings = sanitize_integer(g_markings, 0, 255, initial(g_markings)) - b_markings = sanitize_integer(b_markings, 0, 255, initial(b_markings)) - r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) - g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) - b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) - r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial)) - g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial)) - b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial)) - s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone)) - r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) - g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) - b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) - horns = sanitize_inlist(horns, horn_styles_list, initial(horns)) - m_style = sanitize_inlist(m_style, marking_styles_list, initial(m_style)) - h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) - f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) - r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) - g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) - b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) - underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear)) - undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt)) - socks = sanitize_integer(socks,1 socks_t.len, initial(socks)) - backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) - b_type = sanitize_text(b_type, initial(b_type)) - accent = sanitize_text(accent, initial(accent)) - voice = sanitize_text(voice, initial(voice)) - pitch = sanitize_text(pitch, initial(pitch)) - talkspeed = sanitize_text(talkspeed, initial(talkspeed)) - - alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option)) - job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) - job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) - job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) - job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high)) - job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med)) - job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low)) - job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high)) - job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) - job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) - job_karma_high = sanitize_integer(job_karma_high, 0, 65535, initial(job_karma_high)) - job_karma_med = sanitize_integer(job_karma_med, 0, 65535, initial(job_karma_med)) - job_karma_low = sanitize_integer(job_karma_low, 0, 65535, initial(job_karma_low)) - - if(isnull(disabilities)) disabilities = 0 - if(!player_alt_titles) player_alt_titles = new() - if(!organ_data) src.organ_data = list() - //if(!skin_style) skin_style = "Default" - -/datum/preferences/proc/random_character() - if(!path) return 0 - if(!fexists(path)) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - var/list/saves = list() - var/name - for(var/i=1, i<=MAX_SAVE_SLOTS, i++) - S.cd = "/character[i]" - S["real_name"] >> name - if(!name) continue - saves.Add(S.cd) - - if(!saves.len) - load_character() - return 0 - S.cd = pick(saves) - load_save(S.cd) - return 1 -/* -/datum/preferences/proc/load_character(slot) - if(!path) return 0 - if(!fexists(path)) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/" - if(!slot) slot = default_slot - slot = sanitize_integer(slot, 1, MAX_SAVE_SLOTS, initial(default_slot)) - if(slot != default_slot) - default_slot = slot - S["default_slot"] << slot - S.cd = "/character[slot]" - load_save(S.cd) - Now loaded by proc load_save(S.cd) - //Character - S["OOC_Notes"] >> metadata - S["real_name"] >> real_name - S["name_is_always_random"] >> be_random_name - S["gender"] >> gender - S["age"] >> age - S["species"] >> species - S["language"] >> language - - //colors to be consolidated into hex strings (requires some work with dna code) - S["hair_red"] >> r_hair - S["hair_green"] >> g_hair - S["hair_blue"] >> b_hair - S["facial_red"] >> r_facial - S["facial_green"] >> g_facial - S["facial_blue"] >> b_facial - S["skin_tone"] >> s_tone - S["skin_red"] >> r_skin - S["skin_green"] >> g_skin - S["skin_blue"] >> b_skin - S["hair_style_name"] >> h_style - S["facial_style_name"] >> f_style - S["eyes_red"] >> r_eyes - S["eyes_green"] >> g_eyes - S["eyes_blue"] >> b_eyes - S["underwear"] >> underwear - S["undershirt"] >> undershirt - S["backbag"] >> backbag - S["b_type"] >> b_type - - //Jobs - S["alternate_option"] >> alternate_option - S["job_civilian_high"] >> job_civilian_high - S["job_civilian_med"] >> job_civilian_med - S["job_civilian_low"] >> job_civilian_low - S["job_medsci_high"] >> job_medsci_high - S["job_medsci_med"] >> job_medsci_med - S["job_medsci_low"] >> job_medsci_low - S["job_engsec_high"] >> job_engsec_high - S["job_engsec_med"] >> job_engsec_med - S["job_engsec_low"] >> job_engsec_low - - //Miscellaneous - S["flavor_text"] >> flavor_text - S["med_record"] >> med_record - S["sec_record"] >> sec_record - S["gen_record"] >> gen_record - S["be_special"] >> be_special - S["disabilities"] >> disabilities - S["player_alt_titles"] >> player_alt_titles - S["organ_data"] >> organ_data - - S["nanotrasen_relation"] >> nanotrasen_relation - //S["skin_style"] >> skin_style - - - //Sanitize - metadata = sanitize_text(metadata, initial(metadata)) - real_name = reject_bad_name(real_name) - if(isnull(species)) species = "Human" - if(isnull(language)) language = "None" - if(isnull(spawnpoint)) spawnpoint = "Arrivals Shuttle" - if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation) - if(!real_name) real_name = random_name(gender) - be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) - gender = sanitize_gender(gender) - age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) - r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) - g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) - b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) - r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial)) - g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial)) - b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial)) - s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone)) - r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) - g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) - b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) - h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) - f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) - r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) - g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) - b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) - underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear)) - undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt)) - backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) - b_type = sanitize_text(b_type, initial(b_type)) - - alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option)) - job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) - job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) - job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) - job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high)) - job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med)) - job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low)) - job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high)) - job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) - job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) - - if(isnull(disabilities)) disabilities = 0 - if(!player_alt_titles) player_alt_titles = new() - if(!organ_data) src.organ_data = list() - //if(!skin_style) skin_style = "Default" - - return 1 - -/datum/preferences/proc/save_character() - if(!path) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/character[default_slot]" - - //Character - S["OOC_Notes"] << metadata - S["real_name"] << real_name - S["name_is_always_random"] << be_random_name - S["gender"] << gender - S["age"] << age - S["species"] << species - S["language"] << language - S["hair_red"] << r_hair - S["hair_green"] << g_hair - S["hair_blue"] << b_hair - S["facial_red"] << r_facial - S["facial_green"] << g_facial - S["facial_blue"] << b_facial - S["skin_tone"] << s_tone - S["skin_red"] << r_skin - S["skin_green"] << g_skin - S["skin_blue"] << b_skin - S["hair_style_name"] << h_style - S["facial_style_name"] << f_style - S["eyes_red"] << r_eyes - S["eyes_green"] << g_eyes - S["eyes_blue"] << b_eyes - S["underwear"] << underwear - S["undershirt"] << undershirt - S["backbag"] << backbag - S["b_type"] << b_type - S["accent"] << accent - S["voice"] << voice - S["pitch"] << pitch - S["talkspeed"] << talkspeed - - //Jobs - S["alternate_option"] << alternate_option - S["job_civilian_high"] << job_civilian_high - S["job_civilian_med"] << job_civilian_med - S["job_civilian_low"] << job_civilian_low - S["job_medsci_high"] << job_medsci_high - S["job_medsci_med"] << job_medsci_med - S["job_medsci_low"] << job_medsci_low - S["job_engsec_high"] << job_engsec_high - S["job_engsec_med"] << job_engsec_med - S["job_engsec_low"] << job_engsec_low - S["job_karma_high"] << job_karma_high - S["job_karma_med"] << job_karma_med - S["job_karma_low"] << job_karma_low - - //Miscellaneous - S["flavor_text"] << flavor_text - S["med_record"] << med_record - S["sec_record"] << sec_record - S["gen_record"] << gen_record - S["player_alt_titles"] << player_alt_titles - S["be_special"] << be_special - S["disabilities"] << disabilities - S["organ_data"] << organ_data - - S["nanotrasen_relation"] << nanotrasen_relation - //S["skin_style"] << skin_style - - return 1 -*/ - -#undef SAVEFILE_VERSION_MAX -#undef SAVEFILE_VERSION_MIN diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index f9450c457ee..ca94bd49baf 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -128,53 +128,3 @@ var/global/list/body_accessory_by_species = list("None" = null) icon_state = "vulptail5" animated_icon_state = "vulptail5_a" allowed_species = list("Vulpkanin") - -//Unathi -/datum/body_accessory/tail/unathi_2 - name = "Unathi Alt 1 (Smooth)" - - icon_state = "liztail2" - animated_icon_state = "liztail2_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_3 - name = "Unathi Alt 2 (Light)" - - icon_state = "liztail3" - animated_icon_state = "liztail3_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_4 - name = "Unathi Alt 3 (Dark Stripe)" - - icon_state = "liztail4" - animated_icon_state = "liztail4_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_5 - name = "Unathi Alt 4 (Light Stripe)" - - icon_state = "liztail5" - animated_icon_state = "liztail5_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_6 - name = "Unathi Alt 5 (Dark Tiger)" - - icon_state = "liztail6" - animated_icon_state = "liztail6_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_7 - name = "Unathi Alt 6 (Light Tiger)" - - icon_state = "liztail7" - animated_icon_state = "liztail7_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_8 - name = "Unathi Alt 7 (Aquatic)" - - icon_state = "liztail8" - animated_icon_state = "liztail8_a" - allowed_species = list("Unathi") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index a75b1ab7bb5..65d4002c7d3 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -15,7 +15,10 @@ var/h_style = "Bald" //Horns - var/horns = "None" + var/r_horns = 0 + var/g_horns = 0 + var/b_horns = 0 + var/hn_style = "None" //Facial hair colour and style var/r_facial = 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 3f01c0937da..da3e0af38f2 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -408,13 +408,13 @@ var/global/list/damage_icon_parts = list() //base icons var/icon/horns_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") - if(horns && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()) && (src.species.bodyflags & HAS_HORNS))) - var/datum/sprite_accessory/horn_style = horn_styles_list[horns] + if(hn_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()) && (src.species.bodyflags & HAS_HORNS))) + var/datum/sprite_accessory/horn_style = horn_styles_list[hn_style] if(horn_style && horn_style.species_allowed) if(src.species.name in horn_style.species_allowed) var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") if(horn_style.do_colouration) - horns_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + horns_s.Blend(rgb(r_horns, g_horns, b_horns), ICON_ADD) horns_standing.Blend(horns_s, ICON_OVERLAY) else //warning("Invalid horns for [species.name]: [horns]") diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index b8cc06da85b..1b217dcf23a 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -269,7 +269,7 @@ datum/preferences //Horns if(current_species && (current_species.bodyflags & HAS_HORNS)) - var/datum/sprite_accessory/horn_style = horn_styles_list[horns] + var/datum/sprite_accessory/horn_style = horn_styles_list[hn_style] if(horn_style) var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") horns_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index dc91d47685ffbd44ae058a4a94debc791d6fc466..b66a22cd08ae782e9ce25a800c4f5c0dc3281815 100644 GIT binary patch literal 3612 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 F{~xTwAO!#b literal 10373 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 diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 2501df9741f0789900a17720d9c5c327768bccfb..34f7669cc857d987746050d8c735b55ba081089f 100644 GIT binary patch delta 51 zcmdn+f@K2`@v#bPtzB~cti1Mz)6G$y-ObzXlwQ!7tjH?P@wi-Y(I+Z|XL HKj;AfWmpy$ delta 51 zcmdn+f@K2`@v#bLJ>8@CFQPVnPH>cGck{M8r598tE3%4nEDI9U+Z=xAX|n_Cb_Z6* G4|)JtRu#Aa From 738d95170785656844cc6cd0e58840e3207e164d Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Sun, 27 Dec 2015 19:48:24 -0500 Subject: [PATCH 10/20] Fixes Oversight - Preference Preview Icon Using Correct Colour I'd missed this bit before where for the preview icon (only) it was still using the skin colour to generate the horns. Fixed it up so the preview icon is accurate. --- code/modules/mob/new_player/preferences_setup.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 1b217dcf23a..a20f7f259a0 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -272,7 +272,7 @@ datum/preferences var/datum/sprite_accessory/horn_style = horn_styles_list[hn_style] if(horn_style) var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") - horns_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + horns_s.Blend(rgb(r_horns, g_horns, b_horns), ICON_ADD) eyes_s.Blend(horns_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] From efe48d0fd272e1d5f9ba0d0611ca7c3ddc2be1de Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Sun, 27 Dec 2015 20:27:10 -0500 Subject: [PATCH 11/20] Removes human_face from gitignore Oops, I don't know why I had that in there. --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 48286f07d71..f784b30d80e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,3 @@ data/ /_maps/map_files/**/*.dmm.backup /nano/debug.html *.db -icons/mob/human_face.dmi From c6e265e410f0b80f1d89ce618e65345a9375e387 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Sun, 27 Dec 2015 20:42:01 -0500 Subject: [PATCH 12/20] SQL Support for Horns and Markings --- code/modules/client/preferences_mysql.dm | 104 ++++++++++++++--------- 1 file changed, 66 insertions(+), 38 deletions(-) diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index 98c26df8ec8..70c037987b2 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -110,49 +110,57 @@ r_skin = text2num(query.item[18]) g_skin = text2num(query.item[19]) b_skin = text2num(query.item[20]) - h_style = query.item[21] - f_style = query.item[22] - r_eyes = text2num(query.item[23]) - g_eyes = text2num(query.item[24]) - b_eyes = text2num(query.item[25]) - underwear = query.item[26] - undershirt = query.item[27] - backbag = text2num(query.item[28]) - b_type = query.item[29] + r_markings = text2num(query.item[21]) + g_markings = text2num(query.item[22]) + b_markings = text2num(query.item[23]) + r_horns = text2num(query.item[24]) + g_horns = text2num(query.item[25]) + b_horns = text2num(query.item[26]) + h_style = query.item[27] + f_style = query.item[28] + m_style = query.item[29] + hn_style = query.item[30] + r_eyes = text2num(query.item[31]) + g_eyes = text2num(query.item[32]) + b_eyes = text2num(query.item[33]) + underwear = query.item[34] + undershirt = query.item[35] + backbag = text2num(query.item[36]) + b_type = query.item[37] //Jobs - alternate_option = text2num(query.item[30]) - job_support_high = text2num(query.item[31]) - job_support_med = text2num(query.item[32]) - job_support_low = text2num(query.item[33]) - job_medsci_high = text2num(query.item[34]) - job_medsci_med = text2num(query.item[35]) - job_medsci_low = text2num(query.item[36]) - job_engsec_high = text2num(query.item[37]) - job_engsec_med = text2num(query.item[38]) - job_engsec_low = text2num(query.item[39]) - job_karma_high = text2num(query.item[40]) - job_karma_med = text2num(query.item[41]) - job_karma_low = text2num(query.item[42]) + alternate_option = text2num(query.item[38]) + job_support_high = text2num(query.item[39]) + job_support_med = text2num(query.item[40]) + job_support_low = text2num(query.item[41]) + job_medsci_high = text2num(query.item[42]) + job_medsci_med = text2num(query.item[43]) + job_medsci_low = text2num(query.item[44]) + job_engsec_high = text2num(query.item[45]) + job_engsec_med = text2num(query.item[46]) + job_engsec_low = text2num(query.item[47]) + job_karma_high = text2num(query.item[48]) + job_karma_med = text2num(query.item[49]) + job_karma_low = text2num(query.item[50]) //Miscellaneous - flavor_text = query.item[43] - med_record = query.item[44] - sec_record = query.item[45] - gen_record = query.item[46] - be_special = text2num(query.item[47]) - disabilities = text2num(query.item[48]) - player_alt_titles = params2list(query.item[49]) - organ_data = params2list(query.item[50]) - rlimb_data = params2list(query.item[51]) - nanotrasen_relation = query.item[52] - speciesprefs = text2num(query.item[53]) + flavor_text = query.item[51] + med_record = query.item[52] + sec_record = query.item[53] + gen_record = query.item[54] + be_special = text2num(query.item[55]) + disabilities = text2num(query.item[56]) + player_alt_titles = params2list(query.item[57]) + organ_data = params2list(query.item[58]) + rlimb_data = params2list(query.item[59]) + nanotrasen_relation = query.item[60] + speciesprefs = text2num(query.item[61]) //socks - socks = query.item[54] - body_accessory = query.item[55] - + socks = query.item[62] + body_accessory = query.item[63] + //Sanitize metadata = sanitize_text(metadata, initial(metadata)) real_name = reject_bad_name(real_name) @@ -174,8 +182,16 @@ r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) + r_markings = sanitize_integer(r_markings, 0, 255, initial(r_markings)) + g_markings = sanitize_integer(g_markings, 0, 255, initial(g_markings)) + b_markings = sanitize_integer(b_markings, 0, 255, initial(b_markings)) + r_horns = sanitize_integer(r_horns, 0, 255, initial(r_horns)) + g_horns = sanitize_integer(g_horns, 0, 255, initial(g_horns)) + b_horns = sanitize_integer(b_horns, 0, 255, initial(b_horns)) h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) + m_style = sanitize_inlist(m_style, marking_styles_list, initial(m_style)) + hn_style = sanitize_inlist(hn_style, horn_styles_list, initial(hn_style)) r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) @@ -242,8 +258,16 @@ skin_red='[r_skin]', skin_green='[g_skin]', skin_blue='[b_skin]', + markings_red='[r_markings]', + markings_green='[g_markings]', + markings_blue='[b_markings]', + horns_red='[r_horns]', + horns_green='[g_horns]', + horns_blue='[b_horns]', hair_style_name='[sql_sanitize_text(h_style)]', facial_style_name='[sql_sanitize_text(f_style)]', + marking_style_name='[sql_sanitize_text(m_style)]', + horn_style_name='[sql_sanitize_text(hn_style)]', eyes_red='[r_eyes]', eyes_green='[g_eyes]', eyes_blue='[b_eyes]', @@ -294,7 +318,9 @@ hair_red, hair_green, hair_blue, facial_red, facial_green, facial_blue, skin_tone, skin_red, skin_green, skin_blue, - hair_style_name, facial_style_name, + markings_red, markings_green, markings_blue, + horns_red, horns_green, horns_blue, + hair_style_name, facial_style_name, marking_style_name, horn_style_name, eyes_red, eyes_green, eyes_blue, underwear, undershirt, backbag, b_type, alternate_option, @@ -313,7 +339,9 @@ '[r_hair]', '[g_hair]', '[b_hair]', '[r_facial]', '[g_facial]', '[b_facial]', '[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]', - '[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]', + '[r_markings]', '[g_markings]', '[b_markings]', + '[r_horns]', '[g_horns]', '[b_horns]', + '[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]', '[sql_sanitize_text(m_style)]', '[sql_sanitize_text(hn_style)]', '[r_eyes]', '[g_eyes]', '[b_eyes]', '[underwear]', '[undershirt]', '[backbag]', '[b_type]', '[alternate_option]', From 366d05f7454c7e636f8932c75934ce669b314dfe Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Mon, 28 Dec 2015 01:02:23 -0500 Subject: [PATCH 13/20] Generalization + Features for Other Species Turns horns into head accessories, fixes some species checks, gets Tajara and Vulpkanin into the mix, ensures the system cannot be exploited, adds species-specific body markings for Tajara, Vulpkanin and Unathi. --- code/__DEFINES/flags.dm | 20 ++--- code/__HELPERS/global_lists.dm | 4 +- code/_globalvars/lists/flavor_misc.dm | 4 +- code/datums/datacore.dm | 18 ++--- code/modules/client/preferences.dm | 69 ++++++++-------- code/modules/client/preferences_mysql.dm | 32 ++++---- .../mob/living/carbon/human/human_defines.dm | 10 +-- .../living/carbon/human/species/station.dm | 6 +- .../mob/living/carbon/human/update_icons.dm | 44 +++++----- .../mob/new_player/preferences_setup.dm | 18 ++--- .../mob/new_player/sprite_accessories.dm | 75 +++++++++++++----- icons/mob/body_accessory.dmi | Bin 3612 -> 3872 bytes 12 files changed, 171 insertions(+), 129 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 60ec7275f84..521349b02af 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -55,16 +55,16 @@ #define HAS_SOCKS 4 //Species Body Flags -#define FEET_CLAWS 1 -#define FEET_PADDED 2 -#define FEET_NOSLIP 4 -#define HAS_HORNS 8 -#define HAS_TAIL 16 -#define HAS_SKIN_TONE 32 -#define HAS_SKIN_COLOR 64 -#define HAS_MARKINGS 128 -#define TAIL_WAGGING 256 -#define NO_EYES 512 +#define FEET_CLAWS 1 +#define FEET_PADDED 2 +#define FEET_NOSLIP 4 +#define HAS_HEAD_ACCESSORY 8 +#define HAS_TAIL 16 +#define HAS_SKIN_TONE 32 +#define HAS_SKIN_COLOR 64 +#define HAS_MARKINGS 128 +#define TAIL_WAGGING 256 +#define NO_EYES 512 //Species Diet Flags #define DIET_CARN 1 diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index b1bce2ab2f2..e9a71917425 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -6,8 +6,8 @@ /proc/makeDatumRefLists() //markings init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, marking_styles_list) - //horns - init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horn_styles_list) + //head accessory + init_sprite_accessory_subtypes(/datum/sprite_accessory/head_accessory, head_accessory_styles_list) //hair init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, hair_styles_list, hair_styles_male_list, hair_styles_female_list) //facial hair diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 115bed4d522..0cf3a0d2853 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -1,6 +1,6 @@ //Preferences stuff - //Hornstyles -var/global/list/horn_styles_list = list() //stores /datum/sprite_accessory/horns indexed by name + //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 //Hairstyles diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index d967b5cc2cf..41019d29356 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -173,16 +173,16 @@ proc/get_id_photo(var/mob/living/carbon/human/H) hair_s.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD) eyes_s.Blend(hair_s, ICON_OVERLAY) - //Horns - if(H.species.bodyflags & HAS_HORNS) - var/datum/sprite_accessory/horn_style = horn_styles_list[H.hn_style] - if(horn_style) - var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") - horns_s.Blend(rgb(H.r_horns, H.g_horns, H.b_horns), ICON_ADD) - eyes_s.Blend(horns_s, ICON_OVERLAY) + //Head Accessory + if(H.species.bodyflags & HAS_HEAD_ACCESSORY) + var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[H.ha_style] + if(head_accessory_style && head_accessory_style.species_allowed) + var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") + head_accessory_s.Blend(rgb(H.r_headacc, H.g_headacc, H.b_headacc), ICON_ADD) + eyes_s.Blend(head_accessory_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style] - if(facial_hair_style) + if(facial_hair_style && facial_hair_style.species_allowed) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD) eyes_s.Blend(facial_s, ICON_OVERLAY) @@ -190,7 +190,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H) //Markings if(H.species.bodyflags & HAS_MARKINGS) var/datum/sprite_accessory/marking_style = marking_styles_list[H.m_style] - if(marking_style) + if(marking_style && marking_style.species_allowed) var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s") markings_s.Blend(rgb(H.r_markings, H.g_markings, H.b_markings), ICON_ADD) eyes_s.Blend(markings_s, ICON_OVERLAY) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 0e1c731e428..b1dd72f2586 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -110,10 +110,10 @@ datum/preferences var/undershirt = "Nude" //undershirt type var/socks = "Nude" //socks type var/backbag = 2 //backpack type - var/hn_style = "None" //Horn style - var/r_horns = 0 //Horn colour - var/g_horns = 0 //Horn colour - var/b_horns = 0 //Horn colour + var/ha_style = "None" //Head accessory style + var/r_headacc = 0 //Head accessory colour + var/g_headacc = 0 //Head accessory colour + var/b_headacc = 0 //Head accessory colour var/m_style = "None" //Marking style var/r_markings = 0 //Marking colour var/g_markings = 0 //Marking colour @@ -361,10 +361,13 @@ datum/preferences dat += "[TextPreview(flavor_text)]...
" dat += "
" - if(species == "Unathi") //Species that have horns. - dat += "
Horns
" - dat += "Change Color
__
" - dat += "Style: [hn_style]
" + if((species in list("Unathi", "Vulpkanin", "Tajaran"))) //Species that have head accessories. + var/headaccessoryname = "Head Accessory" + if(species == "Unathi") + headaccessoryname = "Horns" + dat += "
[headaccessoryname]
" + dat += "Change Color
__
" + dat += "Style: [ha_style]
" dat += "
Body Markings
" dat += "Change Color
__
" @@ -1145,6 +1148,8 @@ datum/preferences s_tone = 0 + ha_style = "None" // No Vulp ears on Unathi + m_style = "None" // No Unathi markings on Tajara body_accessory = null //no vulpatail on humans damnit if("speciesprefs")//oldvox code speciesprefs = !speciesprefs @@ -1206,31 +1211,31 @@ datum/preferences h_style = new_h_style - if("horns") - if(species == "Unathi") // Species with horns - var/input = "Choose the colour of your your character's horns:" - var/new_horns = input(user, input, "Character Preference", rgb(r_horns, g_horns, b_horns)) as color|null - if(new_horns) - r_horns = hex2num(copytext(new_horns, 2, 4)) - g_horns = hex2num(copytext(new_horns, 4, 6)) - b_horns = hex2num(copytext(new_horns, 6, 8)) + if("headaccessory") + if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // 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) + r_headacc = hex2num(copytext(new_head_accessory, 2, 4)) + g_headacc = hex2num(copytext(new_head_accessory, 4, 6)) + b_headacc = hex2num(copytext(new_head_accessory, 6, 8)) - if("hn_style") - if(species == "Unathi") // Species with horns - var/list/valid_hornstyles = list() - for(var/hornstyle in horn_styles_list) - var/datum/sprite_accessory/H = horn_styles_list[hornstyle] + if("ha_style") + if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // 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] if( !(species in H.species_allowed)) continue - valid_hornstyles[hornstyle] = horn_styles_list[hornstyle] + valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style] - var/new_horn_style = input(user, "Choose your character's horn style:", "Character Preference") as null|anything in valid_hornstyles - if(new_horn_style) - hn_style = new_horn_style + var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles + if(new_head_accessory_style) + ha_style = new_head_accessory_style if("markings") - if(species == "Unathi") // Species with markings + if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with markings var/input = "Choose the colour of your your character's body markings:" var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null if(new_markings) @@ -1239,7 +1244,7 @@ datum/preferences b_markings = hex2num(copytext(new_markings, 6, 8)) if("m_style") - if(species == "Unathi") // Species with markings + if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with markings var/list/valid_markings = list() for(var/markingstyle in marking_styles_list) var/datum/sprite_accessory/M = marking_styles_list[markingstyle] @@ -1671,11 +1676,11 @@ datum/preferences character.undershirt = undershirt character.socks = socks - if(character.species.bodyflags & HAS_HORNS) - character.r_horns = r_horns - character.g_horns = g_horns - character.b_horns = b_horns - character.hn_style = hn_style + if(character.species.bodyflags & HAS_HEAD_ACCESSORY) + character.r_headacc = r_headacc + character.g_headacc = g_headacc + character.b_headacc = b_headacc + character.ha_style = ha_style if(character.species.bodyflags & HAS_MARKINGS) character.r_markings = r_markings character.g_markings = g_markings diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index 70c037987b2..2541d4c3c28 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -113,13 +113,13 @@ r_markings = text2num(query.item[21]) g_markings = text2num(query.item[22]) b_markings = text2num(query.item[23]) - r_horns = text2num(query.item[24]) - g_horns = text2num(query.item[25]) - b_horns = text2num(query.item[26]) + r_headacc = text2num(query.item[24]) + g_headacc = text2num(query.item[25]) + b_headacc = text2num(query.item[26]) h_style = query.item[27] f_style = query.item[28] m_style = query.item[29] - hn_style = query.item[30] + ha_style = query.item[30] r_eyes = text2num(query.item[31]) g_eyes = text2num(query.item[32]) b_eyes = text2num(query.item[33]) @@ -185,13 +185,13 @@ r_markings = sanitize_integer(r_markings, 0, 255, initial(r_markings)) g_markings = sanitize_integer(g_markings, 0, 255, initial(g_markings)) b_markings = sanitize_integer(b_markings, 0, 255, initial(b_markings)) - r_horns = sanitize_integer(r_horns, 0, 255, initial(r_horns)) - g_horns = sanitize_integer(g_horns, 0, 255, initial(g_horns)) - b_horns = sanitize_integer(b_horns, 0, 255, initial(b_horns)) + r_headacc = sanitize_integer(r_headacc, 0, 255, initial(r_headacc)) + g_headacc = sanitize_integer(g_headacc, 0, 255, initial(g_headacc)) + b_headacc = sanitize_integer(b_headacc, 0, 255, initial(b_headacc)) h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) m_style = sanitize_inlist(m_style, marking_styles_list, initial(m_style)) - hn_style = sanitize_inlist(hn_style, horn_styles_list, initial(hn_style)) + ha_style = sanitize_inlist(ha_style, head_accessory_styles_list, initial(ha_style)) r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) @@ -261,13 +261,13 @@ markings_red='[r_markings]', markings_green='[g_markings]', markings_blue='[b_markings]', - horns_red='[r_horns]', - horns_green='[g_horns]', - horns_blue='[b_horns]', + head_accessory_red='[r_headacc]', + head_accessory_green='[g_headacc]', + head_accessory_blue='[b_headacc]', hair_style_name='[sql_sanitize_text(h_style)]', facial_style_name='[sql_sanitize_text(f_style)]', marking_style_name='[sql_sanitize_text(m_style)]', - horn_style_name='[sql_sanitize_text(hn_style)]', + head_accessory_style_name='[sql_sanitize_text(ha_style)]', eyes_red='[r_eyes]', eyes_green='[g_eyes]', eyes_blue='[b_eyes]', @@ -319,8 +319,8 @@ facial_red, facial_green, facial_blue, skin_tone, skin_red, skin_green, skin_blue, markings_red, markings_green, markings_blue, - horns_red, horns_green, horns_blue, - hair_style_name, facial_style_name, marking_style_name, horn_style_name, + head_accessory_red, head_accessory_green, head_accessory_blue, + hair_style_name, facial_style_name, marking_style_name, head_accessory_style_name, eyes_red, eyes_green, eyes_blue, underwear, undershirt, backbag, b_type, alternate_option, @@ -340,8 +340,8 @@ '[r_facial]', '[g_facial]', '[b_facial]', '[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]', '[r_markings]', '[g_markings]', '[b_markings]', - '[r_horns]', '[g_horns]', '[b_horns]', - '[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]', '[sql_sanitize_text(m_style)]', '[sql_sanitize_text(hn_style)]', + '[r_headacc]', '[g_headacc]', '[b_headacc]', + '[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]', '[sql_sanitize_text(m_style)]', '[sql_sanitize_text(ha_style)]', '[r_eyes]', '[g_eyes]', '[b_eyes]', '[underwear]', '[undershirt]', '[backbag]', '[b_type]', '[alternate_option]', diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 65d4002c7d3..2e24edb8518 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -14,11 +14,11 @@ var/b_hair = 0 var/h_style = "Bald" - //Horns - var/r_horns = 0 - var/g_horns = 0 - var/b_horns = 0 - var/hn_style = "None" + //Head accessory colour and style + var/r_headacc = 0 + var/g_headacc = 0 + var/b_headacc = 0 + var/ha_style = "None" //Facial hair colour and style var/r_facial = 0 diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index ae1792be965..056425a0966 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -40,7 +40,7 @@ flags = HAS_LIPS clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HORNS | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING + bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_CARN cold_level_1 = 280 //Default 260 - Lower is better @@ -95,7 +95,7 @@ flags = HAS_LIPS | CAN_BE_FAT clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING + bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" @@ -130,7 +130,7 @@ flags = HAS_LIPS clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING + bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI reagent_tag = PROCESS_ORG flesh_color = "#966464" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index da3e0af38f2..e1c05cc7210 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -121,7 +121,7 @@ Please contact me on #coderbus IRC. ~Carn x #define SUIT_STORE_LAYER 14 #define BACK_LAYER 15 #define HAIR_LAYER 16 //TODO: make part of head layer? -#define HORN_LAYER 17 +#define HEAD_ACCESSORY_LAYER 17 #define FHAIR_LAYER 18 #define FACEMASK_LAYER 19 #define HEAD_LAYER 20 @@ -353,8 +353,8 @@ var/global/list/damage_icon_parts = list() //tail update_tail_layer(0) - //horns - update_horns(0) + //head accessory + update_head_accessory(0) //markings update_markings(0) //hair @@ -384,42 +384,42 @@ var/global/list/damage_icon_parts = list() markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD) markings_standing.Blend(markings_s, ICON_OVERLAY) else - //warning("Invalid markings for [species.name]: [horns]") + //warning("Invalid m_style for [species.name]: [m_style]") overlays_standing[MARKINGS_LAYER] = image(markings_standing) if(update_icons) update_icons() -//HORN OVERLAY -/mob/living/carbon/human/proc/update_horns(var/update_icons=1) - //Reset our horns - overlays_standing[HORN_LAYER] = null +//HEAD ACCESSORY OVERLAY +/mob/living/carbon/human/proc/update_head_accessory(var/update_icons=1) + //Reset our head accessory + overlays_standing[HEAD_ACCESSORY_LAYER] = null var/obj/item/organ/external/head/head_organ = get_organ("head") if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) ) if(update_icons) update_icons() return - //masks and helmets can obscure our horns + //masks and helmets can obscure our head accessory if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) if(update_icons) update_icons() return //base icons - var/icon/horns_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") + var/icon/head_accessory_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") - if(hn_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()) && (src.species.bodyflags & HAS_HORNS))) - var/datum/sprite_accessory/horn_style = horn_styles_list[hn_style] - if(horn_style && horn_style.species_allowed) - if(src.species.name in horn_style.species_allowed) - var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") - if(horn_style.do_colouration) - horns_s.Blend(rgb(r_horns, g_horns, b_horns), ICON_ADD) - horns_standing.Blend(horns_s, ICON_OVERLAY) + if(ha_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()) && (src.species.bodyflags & HAS_HEAD_ACCESSORY))) + var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style] + if(head_accessory_style && head_accessory_style.species_allowed) + if(src.species.name in head_accessory_style.species_allowed) + var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") + if(head_accessory_style.do_colouration) + head_accessory_s.Blend(rgb(r_headacc, g_headacc, b_headacc), ICON_ADD) + head_accessory_standing.Blend(head_accessory_s, ICON_OVERLAY) else - //warning("Invalid horns for [species.name]: [horns]") + //warning("Invalid ha_style for [species.name]: [ha_style]") - overlays_standing[HORN_LAYER] = image(horns_standing) + overlays_standing[HEAD_ACCESSORY_LAYER] = image(head_accessory_standing) if(update_icons) update_icons() @@ -581,7 +581,7 @@ var/global/list/damage_icon_parts = list() update_mutations(0) update_body(0) update_hair(0) - update_horns(0) + update_head_accessory(0) update_fhair(0) update_mutantrace(0) update_inv_w_uniform(0,0) @@ -1131,7 +1131,7 @@ var/global/list/damage_icon_parts = list() #undef BACK_LAYER #undef HAIR_LAYER #undef HEAD_LAYER -#undef HORN_LAYER +#undef HEAD_ACCESSORY_LAYER #undef FHAIR_LAYER #undef COLLAR_LAYER #undef HANDCUFF_LAYER diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index a20f7f259a0..6c2dd25dcd8 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -251,7 +251,7 @@ datum/preferences //Body Markings if(current_species && (current_species.bodyflags & HAS_MARKINGS)) var/datum/sprite_accessory/marking_style = marking_styles_list[m_style] - if(marking_style) + if(marking_style && marking_style.species_allowed) var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s") markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD) preview_icon.Blend(markings_s, ICON_OVERLAY) @@ -267,16 +267,16 @@ datum/preferences hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) eyes_s.Blend(hair_s, ICON_OVERLAY) - //Horns - if(current_species && (current_species.bodyflags & HAS_HORNS)) - var/datum/sprite_accessory/horn_style = horn_styles_list[hn_style] - if(horn_style) - var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") - horns_s.Blend(rgb(r_horns, g_horns, b_horns), ICON_ADD) - eyes_s.Blend(horns_s, ICON_OVERLAY) + //Head Accessory + if(current_species && (current_species.bodyflags & HAS_HEAD_ACCESSORY)) + var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style] + if(head_accessory_style && head_accessory_style.species_allowed) + var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") + head_accessory_s.Blend(rgb(r_headacc, g_headacc, b_headacc), ICON_ADD) + eyes_s.Blend(head_accessory_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] - if(facial_hair_style) + if(facial_hair_style && facial_hair_style.species_allowed) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) eyes_s.Blend(facial_s, ICON_OVERLAY) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index b498e433760..d16f8ebf25b 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -930,6 +930,13 @@ //Vulpkanin + vulp_earfluff + name = "Vulpkanin Earfluff" + icon_state = "vulp_facial_earfluff" + species_allowed = list("Vulpkanin") + gender = NEUTER + + vulp_blaze name = "Blaze" icon_state = "vulp_facial_blaze" @@ -942,12 +949,6 @@ species_allowed = list("Vulpkanin") gender = NEUTER - vulp_earfluff - name = "Earfluff" - icon_state = "vulp_facial_earfluff" - species_allowed = list("Vulpkanin") - gender = NEUTER - vulp_mask name = "Mask" icon_state = "vulp_facial_mask" @@ -1550,52 +1551,88 @@ gender = NEUTER species_allowed = list("Vox") -/* HORNS */ +/* HEAD ACCESSORY */ -/datum/sprite_accessory/horns +/datum/sprite_accessory/head_accessory icon = 'icons/mob/body_accessory.dmi' - species_allowed = list("Unathi") - icon_state = null - -/datum/sprite_accessory/horns/none - name = "None" + species_allowed = list("Unathi", "Vulpkanin", "Tajaran") icon_state = "accessory_none" -/datum/sprite_accessory/horns/simple +/datum/sprite_accessory/head_accessory/none + name = "None" + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington","Vox") + icon_state = "accessory_none" + +/datum/sprite_accessory/head_accessory/simple name = "Simple" + species_allowed = list("Unathi") icon_state = "horns_simple" -/datum/sprite_accessory/horns/short +/datum/sprite_accessory/head_accessory/short name = "Short" + species_allowed = list("Unathi") icon_state = "horns_short" -/datum/sprite_accessory/horns/curled +/datum/sprite_accessory/head_accessory/curled name = "Curled" + species_allowed = list("Unathi") icon_state = "horns_curled" -/datum/sprite_accessory/horns/ram +/datum/sprite_accessory/head_accessory/ram name = "Ram" + species_allowed = list("Unathi") icon_state = "horns_ram" +/datum/sprite_accessory/head_accessory/vulp_earfluff + icon = 'icons/mob/human_face.dmi' + name = "Vulpkanin Earfluff" + icon_state = "vulp_facial_earfluff" + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/head_accessory/taj_ears + icon = 'icons/mob/human_face.dmi' + name = "Tajaran Ears" + icon_state = "ears_plain" + species_allowed = list("Tajaran") + /* BODY MARKINGS */ /datum/sprite_accessory/body_markings icon = 'icons/mob/body_accessory.dmi' - species_allowed = list("Unathi") - icon_state = null + species_allowed = list("Unathi", "Tajaran", "Vulpkanin") + icon_state = "accessory_none" /datum/sprite_accessory/body_markings/none name = "None" + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington","Vox") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/stripe name = "Stripe" + species_allowed = list("Unathi") icon_state = "markings_stripe" /datum/sprite_accessory/body_markings/tiger name = "Tiger Body" + species_allowed = list("Unathi", "Tajaran", "Vulpkanin") icon_state = "markings_tiger" /datum/sprite_accessory/body_markings/tigerhead name = "Tiger Body + Head" + species_allowed = list("Unathi", "Tajaran", "Vulpkanin") icon_state = "markings_tigerhead" + +/datum/sprite_accessory/body_markings/tigerheadface_taj + name = "Tajaran Tiger Body + Head + Face" + species_allowed = list("Tajaran") + icon_state = "markings_tigerheadface_taj" + +/datum/sprite_accessory/body_markings/tigerheadface_vulp + name = "Vulpkanin Tiger Body + Head + Face" + species_allowed = list("Vulpkanin") + icon_state = "markings_tigerheadface_vulp" + +/datum/sprite_accessory/body_markings/tigerheadface_una + name = "Unathi Tiger Body + Head + Face" + species_allowed = list("Unathi") + icon_state = "markings_tigerheadface_una" \ No newline at end of file diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index b66a22cd08ae782e9ce25a800c4f5c0dc3281815..f79b4c262f1d2c3865576a9a677dc1fcb4f92ce5 100644 GIT binary patch literal 3872 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 literal 3612 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 F{~xTwAO!#b From 8641c065a36474b679661b6ce2dc74126a3e15e8 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Mon, 28 Dec 2015 19:17:56 -0500 Subject: [PATCH 14/20] Removes Old Earfluff Entries, Finishes SQL Support, Accommodates #3025 --- SQL/paradise_schema.sql | 11 +++++++++-- SQL/paradise_schema_prefixed.sql | 11 +++++++++-- code/modules/mob/new_player/sprite_accessories.dm | 12 ------------ 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index d3594d87fa6..c33487d0394 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -40,8 +40,16 @@ CREATE TABLE `characters` ( `skin_red` smallint(4) NOT NULL, `skin_green` smallint(4) NOT NULL, `skin_blue` smallint(4) NOT NULL, + `markings_red` smallint(4) NOT NULL, + `markings_green` smallint(4) NOT NULL, + `markings_blue` smallint(4) NOT NULL, + `head_accessory_red` smallint(4) NOT NULL, + `head_accessory_green` smallint(4) NOT NULL, + `head_accessory_blue` smallint(4) NOT NULL, `hair_style_name` varchar(45) NOT NULL, `facial_style_name` varchar(45) NOT NULL, + `marking_style_name` varchar(45) NOT NULL, + `head_accessory_style_name` varchar(45) NOT NULL, `eyes_red` smallint(4) NOT NULL, `eyes_green` smallint(4) NOT NULL, `eyes_blue` smallint(4) NOT NULL, @@ -66,7 +74,6 @@ CREATE TABLE `characters` ( `med_record` mediumtext NOT NULL, `sec_record` mediumtext NOT NULL, `gen_record` mediumtext NOT NULL, - `be_special` mediumint(8) NOT NULL, `disabilities` mediumint(8) NOT NULL, `player_alt_titles` mediumtext NOT NULL, `organ_data` mediumtext NOT NULL, @@ -233,7 +240,7 @@ CREATE TABLE `player` ( `UI_style` varchar(10) DEFAULT 'Midnight', `UI_style_color` varchar(7) DEFAULT '#ffffff', `UI_style_alpha` smallint(4) DEFAULT '255', - `be_special` mediumint(8) DEFAULT '0', + `be_role` mediumtext NOT NULL, `default_slot` smallint(4) DEFAULT '1', `toggles` mediumint(8) DEFAULT '383', `sound` mediumint(8) DEFAULT '31', diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 4a61245cf83..d4d75838020 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -40,8 +40,16 @@ CREATE TABLE `SS13_characters` ( `skin_red` smallint(4) NOT NULL, `skin_green` smallint(4) NOT NULL, `skin_blue` smallint(4) NOT NULL, + `markings_red` smallint(4) NOT NULL, + `markings_green` smallint(4) NOT NULL, + `markings_blue` smallint(4) NOT NULL, + `head_accessory_red` smallint(4) NOT NULL, + `head_accessory_green` smallint(4) NOT NULL, + `head_accessory_blue` smallint(4) NOT NULL, `hair_style_name` varchar(45) NOT NULL, `facial_style_name` varchar(45) NOT NULL, + `marking_style_name` varchar(45) NOT NULL, + `head_accessory_style_name` varchar(45) NOT NULL, `eyes_red` smallint(4) NOT NULL, `eyes_green` smallint(4) NOT NULL, `eyes_blue` smallint(4) NOT NULL, @@ -66,7 +74,6 @@ CREATE TABLE `SS13_characters` ( `med_record` mediumtext NOT NULL, `sec_record` mediumtext NOT NULL, `gen_record` mediumtext NOT NULL, - `be_special` mediumint(8) NOT NULL, `disabilities` mediumint(8) NOT NULL, `player_alt_titles` mediumtext NOT NULL, `organ_data` mediumtext NOT NULL, @@ -233,7 +240,7 @@ CREATE TABLE `SS13_player` ( `UI_style` varchar(10) DEFAULT 'Midnight', `UI_style_color` varchar(7) DEFAULT '#ffffff', `UI_style_alpha` smallint(4) DEFAULT '255', - `be_special` mediumint(8) DEFAULT '0', + `be_role` mediumtext NOT NULL, `default_slot` smallint(4) DEFAULT '1', `toggles` mediumint(8) DEFAULT '383', `sound` mediumint(8) DEFAULT '31', diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index d16f8ebf25b..562e4edeba9 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -626,11 +626,6 @@ species_allowed = list("Skrell") gender = FEMALE - taj_ears - name = "Tajaran Ears" - icon_state = "ears_plain" - species_allowed = list("Tajaran") - taj_ears_clean name = "Tajara Clean" icon_state = "hair_clean" @@ -930,13 +925,6 @@ //Vulpkanin - vulp_earfluff - name = "Vulpkanin Earfluff" - icon_state = "vulp_facial_earfluff" - species_allowed = list("Vulpkanin") - gender = NEUTER - - vulp_blaze name = "Blaze" icon_state = "vulp_facial_blaze" From 78d3045ecad933ab25db1a810c6b2ae6e8e49fdc Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Mon, 28 Dec 2015 19:55:49 -0500 Subject: [PATCH 15/20] Accommodates #3025 --- code/modules/client/preferences_mysql.dm | 295 +++++++++++++++++------ 1 file changed, 226 insertions(+), 69 deletions(-) diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index 2541d4c3c28..c19d22de569 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -5,7 +5,7 @@ UI_style, UI_style_color, UI_style_alpha, - be_special, + be_role, default_slot, toggles, sound, @@ -28,7 +28,7 @@ UI_style = query.item[2] UI_style_color = query.item[3] UI_style_alpha = text2num(query.item[4]) - be_special = text2num(query.item[5]) + be_special = params2list(query.item[5]) default_slot = text2num(query.item[6]) toggles = text2num(query.item[7]) sound = text2num(query.item[8]) @@ -39,7 +39,6 @@ ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) // lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style)) - be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) sound = sanitize_integer(sound, 0, 65535, initial(sound)) @@ -51,13 +50,19 @@ /datum/preferences/proc/save_preferences(client/C) + // Might as well scrub out any malformed be_special list entries while we're here + for (var/role in be_special) + if(!(role in special_roles)) + log_to_dd("[C.key] had a malformed role entry: '[role]'. Removing!") + be_special -= role + var/DBQuery/query = dbcon.NewQuery({"UPDATE [format_table_name("player")] SET ooccolor='[ooccolor]', UI_style='[UI_style]', UI_style_color='[UI_style_color]', UI_style_alpha='[UI_style_alpha]', - be_special='[be_special]', + be_role='[list2params(sql_sanitize_text_list(be_special))]', default_slot='[default_slot]', toggles='[toggles]', sound='[sound]', @@ -82,7 +87,68 @@ var/DBQuery/firstquery = dbcon.NewQuery("UPDATE [format_table_name("player")] SET default_slot=[slot] WHERE ckey='[C.ckey]'") firstquery.Execute() - var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'") + // Let's not have this explode if you sneeze on the DB + var/DBQuery/query = dbcon.NewQuery({"SELECT + OOC_Notes, + real_name, + name_is_always_random, + gender, + age, + species, + language, + hair_red, + hair_green, + hair_blue, + facial_red, + facial_green, + facial_blue, + skin_tone, + skin_red, + skin_green, + skin_blue, + markings_red, + markings_green, + markings_blue, + head_accessory_red, + head_accessory_green, + head_accessory_blue, + hair_style_name, + facial_style_name, + marking_style_name, + head_accessory_style_name, + eyes_red, + eyes_green, + eyes_blue, + underwear, + undershirt, + backbag, + b_type, + alternate_option, + job_support_high, + job_support_med, + job_support_low, + job_medsci_high, + job_medsci_med, + job_medsci_low, + job_engsec_high, + job_engsec_med, + job_engsec_low, + job_karma_high, + job_karma_med, + job_karma_low, + flavor_text, + med_record, + sec_record, + gen_record, + disabilities, + player_alt_titles, + organ_data, + rlimb_data, + nanotrasen_relation, + speciesprefs, + socks, + body_accessory + FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"}) if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") @@ -91,75 +157,74 @@ while(query.NextRow()) //Character - metadata = query.item[4] - real_name = query.item[5] - be_random_name = text2num(query.item[6]) - gender = query.item[7] - age = text2num(query.item[8]) - species = query.item[9] - language = query.item[10] + metadata = query.item[1] + real_name = query.item[2] + be_random_name = text2num(query.item[3]) + gender = query.item[4] + age = text2num(query.item[5]) + species = query.item[6] + language = query.item[7] //colors to be consolidated into hex strings (requires some work with dna code) - r_hair = text2num(query.item[11]) - g_hair = text2num(query.item[12]) - b_hair = text2num(query.item[13]) - r_facial = text2num(query.item[14]) - g_facial = text2num(query.item[15]) - b_facial = text2num(query.item[16]) - s_tone = text2num(query.item[17]) - r_skin = text2num(query.item[18]) - g_skin = text2num(query.item[19]) - b_skin = text2num(query.item[20]) - r_markings = text2num(query.item[21]) - g_markings = text2num(query.item[22]) - b_markings = text2num(query.item[23]) - r_headacc = text2num(query.item[24]) - g_headacc = text2num(query.item[25]) - b_headacc = text2num(query.item[26]) - h_style = query.item[27] - f_style = query.item[28] - m_style = query.item[29] - ha_style = query.item[30] - r_eyes = text2num(query.item[31]) - g_eyes = text2num(query.item[32]) - b_eyes = text2num(query.item[33]) - underwear = query.item[34] - undershirt = query.item[35] - backbag = text2num(query.item[36]) - b_type = query.item[37] + r_hair = text2num(query.item[8]) + g_hair = text2num(query.item[9]) + b_hair = text2num(query.item[10]) + r_facial = text2num(query.item[11]) + g_facial = text2num(query.item[12]) + b_facial = text2num(query.item[13]) + s_tone = text2num(query.item[14]) + r_skin = text2num(query.item[15]) + g_skin = text2num(query.item[16]) + b_skin = text2num(query.item[17]) + r_markings = text2num(query.item[18]) + g_markings = text2num(query.item[19]) + b_markings = text2num(query.item[20]) + r_headacc = text2num(query.item[21]) + g_headacc = text2num(query.item[22]) + b_headacc = text2num(query.item[23]) + h_style = query.item[24] + f_style = query.item[25] + m_style = query.item[26] + ha_style = query.item[27] + r_eyes = text2num(query.item[28]) + g_eyes = text2num(query.item[29]) + b_eyes = text2num(query.item[30]) + underwear = query.item[31] + undershirt = query.item[32] + backbag = text2num(query.item[33]) + b_type = query.item[34] //Jobs - alternate_option = text2num(query.item[38]) - job_support_high = text2num(query.item[39]) - job_support_med = text2num(query.item[40]) - job_support_low = text2num(query.item[41]) - job_medsci_high = text2num(query.item[42]) - job_medsci_med = text2num(query.item[43]) - job_medsci_low = text2num(query.item[44]) - job_engsec_high = text2num(query.item[45]) - job_engsec_med = text2num(query.item[46]) - job_engsec_low = text2num(query.item[47]) - job_karma_high = text2num(query.item[48]) - job_karma_med = text2num(query.item[49]) - job_karma_low = text2num(query.item[50]) + alternate_option = text2num(query.item[35]) + job_support_high = text2num(query.item[36]) + job_support_med = text2num(query.item[37]) + job_support_low = text2num(query.item[38]) + job_medsci_high = text2num(query.item[39]) + job_medsci_med = text2num(query.item[40]) + job_medsci_low = text2num(query.item[41]) + job_engsec_high = text2num(query.item[42]) + job_engsec_med = text2num(query.item[43]) + job_engsec_low = text2num(query.item[44]) + job_karma_high = text2num(query.item[45]) + job_karma_med = text2num(query.item[46]) + job_karma_low = text2num(query.item[47]) //Miscellaneous - flavor_text = query.item[51] - med_record = query.item[52] - sec_record = query.item[53] - gen_record = query.item[54] - be_special = text2num(query.item[55]) - disabilities = text2num(query.item[56]) - player_alt_titles = params2list(query.item[57]) - organ_data = params2list(query.item[58]) - rlimb_data = params2list(query.item[59]) - nanotrasen_relation = query.item[60] - speciesprefs = text2num(query.item[61]) + flavor_text = query.item[48] + med_record = query.item[49] + sec_record = query.item[50] + gen_record = query.item[51] + disabilities = text2num(query.item[52]) + player_alt_titles = params2list(query.item[53]) + organ_data = params2list(query.item[54]) + rlimb_data = params2list(query.item[55]) + nanotrasen_relation = query.item[56] + speciesprefs = text2num(query.item[57]) //socks - socks = query.item[62] - body_accessory = query.item[63] + socks = query.item[58] + body_accessory = query.item[59] //Sanitize metadata = sanitize_text(metadata, initial(metadata)) @@ -214,7 +279,6 @@ job_karma_med = sanitize_integer(job_karma_med, 0, 65535, initial(job_karma_med)) job_karma_low = sanitize_integer(job_karma_low, 0, 65535, initial(job_karma_low)) disabilities = sanitize_integer(disabilities, 0, 65535, initial(disabilities)) - be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) socks = sanitize_text(socks, initial(socks)) body_accessory = sanitize_text(body_accessory, initial(body_accessory)) @@ -293,7 +357,6 @@ sec_record='[sql_sanitize_text(html_decode(sec_record))]', gen_record='[sql_sanitize_text(html_decode(gen_record))]', player_alt_titles='[playertitlelist]', - be_special='[be_special]', disabilities='[disabilities]', organ_data='[organlist]', rlimb_data='[rlimblist]', @@ -329,7 +392,7 @@ job_engsec_high, job_engsec_med, job_engsec_low, job_karma_high, job_karma_med, job_karma_low, flavor_text, med_record, sec_record, gen_record, - player_alt_titles, be_special, + player_alt_titles, disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, socks, body_accessory) @@ -350,7 +413,7 @@ '[job_engsec_high]', '[job_engsec_med]', '[job_engsec_low]', '[job_karma_high]', '[job_karma_med]', '[job_karma_low]', '[sql_sanitize_text(html_encode(flavor_text))]', '[sql_sanitize_text(html_encode(med_record))]', '[sql_sanitize_text(html_encode(sec_record))]', '[sql_sanitize_text(html_encode(gen_record))]', - '[playertitlelist]', '[be_special]', + '[playertitlelist]', '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]', '[socks]', '[body_accessory]') @@ -363,6 +426,100 @@ message_admins("SQL ERROR during character slot saving. Error : \[[err]\]\n") return return 1 + + +// If you see this proc lying around and don't know why it's there, expunge it, as this is for a short-term DB update, starting 27/12/2015 +// 0 on failed update, 1 on success +/datum/preferences/proc/old_roles_to_new(var/client/C) + var/DBQuery/query = dbcon.NewQuery({" + SELECT be_special + FROM [format_table_name("player")] + WHERE ckey='[C.ckey]'"}) + if(!query.Execute()) + return 0 + var/old_be_special + while(query.NextRow()) + old_be_special = text2num(query.item[1]) + if(isnull(old_be_special)) + message_admins("SQL NOTICE: be_special has been purged from the database, bug the coders.\n") + return 0 + + old_be_special = sanitize_integer(old_be_special, 0, 65535) + var/B_traitor = 1 + var/B_operative = 2 + var/B_changeling = 4 + var/B_wizard = 8 + var/B_malf = 16 + var/B_rev = 32 + var/B_alien = 64 + var/B_pai = 128 + var/B_cultist = 256 + var/B_ninja = 512 + var/B_raider = 1024 + var/B_vampire = 2048 + var/B_mutineer = 4096 + var/B_blob = 8192 + var/B_shadowling = 16384 + var/B_revenant = 32768 + + var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_ninja,B_raider,B_vampire,B_mutineer,B_blob,B_shadowling,B_revenant) + + // meow meow I am the copy cat + for(var/flag in archived) + if(old_be_special & flag) + switch(flag) + // hello i am byond i think constant variables r dumm + if(1) + be_special |= ROLE_TRAITOR + if(2) + be_special |= ROLE_OPERATIVE + if(4) + be_special |= ROLE_CHANGELING + if(8) + be_special |= ROLE_WIZARD + if(16) + be_special |= ROLE_MALF + if(32) + be_special |= ROLE_REV + if(64) + be_special |= ROLE_ALIEN + be_special |= ROLE_SENTIENT + be_special |= ROLE_DEMON + be_special |= ROLE_BORER + if(128) + be_special |= ROLE_PAI + be_special |= ROLE_POSIBRAIN + be_special |= ROLE_GUARDIAN + if(256) + be_special |= ROLE_CULTIST + if(512) + be_special |= ROLE_NINJA + if(1024) + be_special |= ROLE_RAIDER + if(2048) + be_special |= ROLE_VAMPIRE + if(4096) + be_special |= ROLE_MUTINEER + if(8192) + be_special |= ROLE_BLOB + if(16384) + be_special |= ROLE_SHADOWLING + if(32768) + be_special |= ROLE_REVENANT + + var/DBQuery/query2 = dbcon.NewQuery({"UPDATE [format_table_name("player")] + SET + be_role='[list2params(sql_sanitize_text_list(be_special))]' + WHERE ckey='[C.ckey]'"} + ) + + if(!query2.Execute()) + var/err = query2.ErrorMsg() + log_game("SQL ERROR during saving player preferences. Error : \[[err]\]\n") + message_admins("SQL ERROR during saving player preferences. Error : \[[err]\]\n") + return + return 1 + /* /datum/preferences/proc/random_character(client/C) var/DBQuery/query = dbcon.NewQuery("SELECT slot FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' ORDER BY slot") From f0c4a0623c0dc8a2d505f307af15fea06b00f87d Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Mon, 28 Dec 2015 20:43:58 -0500 Subject: [PATCH 16/20] Final Accommodation of #3025 Copypastas #3025's version of code\modules\client\preferences.dm and re-applies all the changes I made to the pre-#3025 version of that file in order to accommodate the PR. --- code/modules/client/preferences.dm | 2789 ++++++++++++++-------------- 1 file changed, 1388 insertions(+), 1401 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b1dd72f2586..ead55fa663c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2,42 +2,29 @@ var/list/preferences_datums = list() -var/global/list/special_roles = list( //keep synced with the defines BE_* in setup.dm. THE ORDER MATTERS -//some autodetection here. - "traitor" = IS_MODE_COMPILED("traitor"), // 1 / 1 - "operative" = IS_MODE_COMPILED("nuclear"), // 2 / 2 - "changeling" = IS_MODE_COMPILED("changeling"), // 4 / 3 - "wizard" = IS_MODE_COMPILED("wizard"), // 8 / 4 - "malf AI" = IS_MODE_COMPILED("malfunction"), // 16 / 5 - "revolutionary" = IS_MODE_COMPILED("revolution"), // 32 / 6 - "alien" = 1, // 62 / 7 - "pAI" = 1, // 128 / 8 - "cultist" = IS_MODE_COMPILED("cult"), // 256 / 9 - "ninja" = 1, // 512 / 10 - "raider" = IS_MODE_COMPILED("heist"), // 1024 / 11 - "vampire" = IS_MODE_COMPILED("vampire"), // 2048 / 12 - "mutineer" = IS_MODE_COMPILED("mutiny"), // 4096 / 13 - "blob" = IS_MODE_COMPILED("blob"), // 8192 / 14 - "shadowling" = IS_MODE_COMPILED("shadowling"), //16384 / 15 - "revenant" = 1 //32768 / 16 -) var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles - num2text(BE_PAI) = 0, - num2text(BE_TRAITOR) = 7, - num2text(BE_CHANGELING) = 14, - num2text(BE_SHADOWLING) = 14, - num2text(BE_WIZARD) = 14, - num2text(BE_REV) = 14, - num2text(BE_VAMPIRE) = 14, - num2text(BE_BLOB) = 14, - num2text(BE_REVENANT) = 14, - num2text(BE_OPERATIVE) = 21, - num2text(BE_CULTIST) = 21, - num2text(BE_RAIDER) = 21, - num2text(BE_ALIEN) = 21, - num2text(BE_NINJA) = 21, - num2text(BE_MUTINEER) = 21, - num2text(BE_MALF) = 30, + ROLE_PAI = 0, + ROLE_POSIBRAIN = 0, + ROLE_GUARDIAN = 0, + ROLE_TRAITOR = 7, + ROLE_CHANGELING = 14, + ROLE_SHADOWLING = 14, + ROLE_WIZARD = 14, + ROLE_REV = 14, + ROLE_VAMPIRE = 14, + ROLE_BLOB = 14, + ROLE_REVENANT = 14, + ROLE_OPERATIVE = 21, + ROLE_CULTIST = 21, + ROLE_RAIDER = 21, + ROLE_ALIEN = 21, + ROLE_DEMON = 21, + ROLE_SENTIENT = 21, +// ROLE_GANG = 21, + ROLE_BORER = 21, + ROLE_NINJA = 21, + ROLE_MUTINEER = 21, + ROLE_MALF = 30, ) /proc/player_old_enough_antag(client/C, role) @@ -75,7 +62,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts #define MAX_SAVE_SLOTS 10 // Save slots for regular players #define MAX_SAVE_SLOTS_MEMBER 10 // Save slots for BYOND members -datum/preferences +/datum/preferences //doohickeys for savefiles // var/path var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used @@ -91,7 +78,7 @@ datum/preferences //game-preferences // var/lastchangelog = "" //Saved changlog filesize to detect if there was a change var/ooccolor = "#b82e00" - var/be_special = 0 //Special role selection + var/be_special = list() //Special role selection var/UI_style = "Midnight" var/toggles = TOGGLES_DEFAULT var/sound = SOUND_DEFAULT @@ -217,1071 +204,893 @@ datum/preferences save_preferences(C) save_character(C) //let's save this new random character so it doesn't keep generating new ones. -/datum/preferences - proc/ShowChoices(mob/user) - if(!user || !user.client) return - update_preview_icon() - user << browse_rsc(preview_icon_front, "previewicon.png") - user << browse_rsc(preview_icon_side, "previewicon2.png") - var/dat = "

" +/datum/preferences/proc/ShowChoices(mob/user) + if(!user || !user.client) return + update_preview_icon() + user << browse_rsc(preview_icon_front, "previewicon.png") + user << browse_rsc(preview_icon_side, "previewicon2.png") + var/dat = "
" - dat += "Character Settings" - dat += "Game Preferences" - dat += "
" - dat += "
" + dat += "Character Settings" + dat += "Game Preferences" + dat += "
" + dat += "
" - switch(current_tab) - if (0) // Character Settings# - dat += "
" - dat += "Slot [slot_name] - " - dat += "Load slot - " - dat += "Save slot - " - dat += "Reload slot" - dat += "
" - dat += "

Occupation Choices

" - dat += "Set Occupation Preferences
" - dat += "

Identity

" - dat += "
" - if(appearance_isbanned(user)) - dat += "You are banned from using custom names and appearances. You can continue to adjust your characters, but you will be randomised once you join the game.
" - dat += "Name: " - dat += "[real_name]
" - dat += "(Random Name) " - dat += "(Always Random Name: [be_random_name ? "Yes" : "No"])" - dat += "
" - dat += "Gender: [gender == MALE ? "Male" : "Female"]
" - dat += "Age: [age]" - //dat += "Spawn Point: [spawnpoint]" - dat += "
Body " - dat += "(®)" - dat += "
" - dat += "Species: [species]
" - if(species == "Vox")//oldvox code, sucks I know - dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]
" - dat += "Secondary Language:
[language]
" - dat += "Blood Type: [b_type]
" - if(species == "Human") - dat += "Skin Tone: [-s_tone + 35]/220
" + switch(current_tab) + if (0) // Character Settings# + dat += "
" + dat += "Slot [slot_name] - " + dat += "Load slot - " + dat += "Save slot - " + dat += "Reload slot" + dat += "
" + dat += "

Occupation Choices

" + dat += "Set Occupation Preferences
" + dat += "

Identity

" + dat += "
" + if(appearance_isbanned(user)) + dat += "You are banned from using custom names and appearances. You can continue to adjust your characters, but you will be randomised once you join the game.
" + dat += "Name: " + dat += "[real_name]
" + dat += "(Random Name) " + dat += "(Always Random Name: [be_random_name ? "Yes" : "No"])" + dat += "
" + dat += "Gender: [gender == MALE ? "Male" : "Female"]
" + dat += "Age: [age]" + //dat += "Spawn Point: [spawnpoint]" + dat += "
Body " + dat += "(®)" + dat += "
" + dat += "Species: [species]
" + if(species == "Vox")//oldvox code, sucks I know + dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]
" + dat += "Secondary Language:
[language]
" + dat += "Blood Type: [b_type]
" + if(species == "Human") + dat += "Skin Tone: [-s_tone + 35]/220
" - // dat += "Skin pattern: Adjust
" - dat += "
Handicaps
" - dat += "\t\[Set Disabilities\]
" - dat += "Limbs: Adjust
" - if(species != "Slime People" && species != "Machine") - dat += "Internal Organs: Adjust
" + // dat += "Skin pattern: Adjust
" + dat += "
Handicaps
" + dat += "\t\[Set Disabilities\]
" + dat += "Limbs: Adjust
" + if(species != "Slime People" && species != "Machine") + dat += "Internal Organs: Adjust
" - //display limbs below - var/ind = 0 - for(var/name in organ_data) - //world << "[ind] \ [organ_data.len]" - var/status = organ_data[name] - var/organ_name = null - switch(name) - if("l_arm") - organ_name = "left arm" - if("r_arm") - organ_name = "right arm" - if("l_leg") - organ_name = "left leg" - if("r_leg") - organ_name = "right leg" - if("l_foot") - organ_name = "left foot" - if("r_foot") - organ_name = "right foot" - if("l_hand") - organ_name = "left hand" - if("r_hand") - organ_name = "right hand" - if("heart") - organ_name = "heart" - if("eyes") - organ_name = "eyes" + //display limbs below + var/ind = 0 + for(var/name in organ_data) + //world << "[ind] \ [organ_data.len]" + var/status = organ_data[name] + var/organ_name = null + switch(name) + if("l_arm") + organ_name = "left arm" + if("r_arm") + organ_name = "right arm" + if("l_leg") + organ_name = "left leg" + if("r_leg") + organ_name = "right leg" + if("l_foot") + organ_name = "left foot" + if("r_foot") + organ_name = "right foot" + if("l_hand") + organ_name = "left hand" + if("r_hand") + organ_name = "right hand" + if("heart") + organ_name = "heart" + if("eyes") + organ_name = "eyes" - if(status == "cyborg") - ++ind - if(ind > 1) - dat += ", " - var/datum/robolimb/R - if(rlimb_data[name] && all_robolimbs[rlimb_data[name]]) - R = all_robolimbs[rlimb_data[name]] - else - R = basic_robolimb - dat += "\t[R.company] [organ_name] prothesis" - - - else if(status == "amputated") - ++ind - if(ind > 1) - dat += ", " - dat += "\tAmputated [organ_name]" - - else if(status == "mechanical") - ++ind - if(ind > 1) - dat += ", " - dat += "\tMechanical [organ_name]" - - else if(status == "assisted") - ++ind - if(ind > 1) - dat += ", " - switch(organ_name) - if("heart") - dat += "\tPacemaker-assisted [organ_name]" - if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements - dat += "\tSurgically altered [organ_name]" - if("eyes") - dat += "\tRetinal overlayed [organ_name]" - else - dat += "\tMechanically assisted [organ_name]" - if(!ind) - dat += "\[...\]

" - else - dat += "

" - dat += "Underwear:
[underwear]
" - dat += "Undershirt:
[undershirt]
" - dat += "Socks:
[socks]
" - dat += "Backpack Type:
[backbaglist[backbag]]
" - dat += "Nanotrasen Relation:
[nanotrasen_relation]
" - dat += "
Preview
" - dat += "
" - - if(jobban_isbanned(user, "Records")) - dat += "You are banned from using character records.
" - else - dat += "Character Records
" - dat += "Set Flavor Text
" - if(lentext(flavor_text) <= 40) - if(!lentext(flavor_text)) - dat += "\[...\]" + if(status == "cyborg") + ++ind + if(ind > 1) + dat += ", " + var/datum/robolimb/R + if(rlimb_data[name] && all_robolimbs[rlimb_data[name]]) + R = all_robolimbs[rlimb_data[name]] else - dat += "[flavor_text]" + R = basic_robolimb + dat += "\t[R.company] [organ_name] prothesis" + + + else if(status == "amputated") + ++ind + if(ind > 1) + dat += ", " + dat += "\tAmputated [organ_name]" + + else if(status == "mechanical") + ++ind + if(ind > 1) + dat += ", " + dat += "\tMechanical [organ_name]" + + else if(status == "assisted") + ++ind + if(ind > 1) + dat += ", " + switch(organ_name) + if("heart") + dat += "\tPacemaker-assisted [organ_name]" + if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements + dat += "\tSurgically altered [organ_name]" + if("eyes") + dat += "\tRetinal overlayed [organ_name]" + else + dat += "\tMechanically assisted [organ_name]" + if(!ind) + dat += "\[...\]

" + else + dat += "

" + dat += "Underwear:
[underwear]
" + dat += "Undershirt:
[undershirt]
" + dat += "Socks:
[socks]
" + dat += "Backpack Type:
[backbaglist[backbag]]
" + dat += "Nanotrasen Relation:
[nanotrasen_relation]
" + dat += "
Preview
" + dat += "
" + + if(jobban_isbanned(user, "Records")) + dat += "You are banned from using character records.
" + else + dat += "Character Records
" + dat += "Set Flavor Text
" + if(lentext(flavor_text) <= 40) + if(!lentext(flavor_text)) + dat += "\[...\]" else - dat += "[TextPreview(flavor_text)]...
" - dat += "
" + dat += "[flavor_text]" + else + dat += "[TextPreview(flavor_text)]...
" + dat += "
" - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) //Species that have head accessories. - var/headaccessoryname = "Head Accessory" - if(species == "Unathi") - headaccessoryname = "Horns" - dat += "
[headaccessoryname]
" - dat += "Change Color
__
" - dat += "Style: [ha_style]
" + if((species in list("Unathi", "Vulpkanin", "Tajaran"))) //Species that have head accessories. + var/headaccessoryname = "Head Accessory" + if(species == "Unathi") + headaccessoryname = "Horns" + dat += "
[headaccessoryname]
" + dat += "Change Color
__
" + dat += "Style: [ha_style]
" + dat += "
Body Markings
" + dat += "Change Color
__
" + dat += "
Style: [m_style]
" - dat += "
Body Markings
" - dat += "Change Color
__
" - dat += "
Style: [m_style]
" + var/hairname = "Hair" + if(species == "Machine") + hairname = "Frame Color" + dat += "
[hairname]
" + dat += "Change Color
__
" + dat += "
Style: [h_style]
" - var/hairname = "Hair" - if(species == "Machine") - hairname = "Frame Color" - dat += "
[hairname]
" - dat += "Change Color
__
" - dat += "
Style: [h_style]
" + dat += "
Facial
" + dat += "Change Color
__
" + dat += "
Style: [f_style]
" - dat += "
Facial
" - dat += "Change Color
__
" - dat += "
Style: [f_style]
" + dat += "
Eyes
" + dat += "Change Color
__

" - 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
" + 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
" - dat += "Change Color
__

" + if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) + dat += "
Body Accessory
" + dat += "Accessory: [body_accessory ? "[body_accessory]" : "None"]
" - if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) - dat += "
Body Accessory
" - dat += "Accessory: [body_accessory ? "[body_accessory]" : "None"]
" + dat += "

" - dat += "

" + if (1) // General Preferences + dat += "
" + dat += "

General Settings

" + dat += "UI Style: [UI_style]
" + dat += "Custom UI settings:
" + dat += "Color: [UI_style_color]
__

" + dat += "Alpha (transparency): [UI_style_alpha]
" + dat += "Play admin midis: [(sound & SOUND_MIDI) ? "Yes" : "No"]
" + dat += "Play lobby music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
" + dat += "Randomized character slot: [randomslot ? "Yes" : "No"]
" + dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
" + dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
" + dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]
" + if(config.allow_Metadata) + dat += "OOC notes: Edit
" - if (1) // General Preferences - dat += "
" - dat += "

General Settings

" - dat += "UI Style: [UI_style]
" - dat += "Custom UI settings:
" - dat += "Color: [UI_style_color]
__

" - dat += "Alpha (transparency): [UI_style_alpha]
" - dat += "Play admin midis: [(sound & SOUND_MIDI) ? "Yes" : "No"]
" - dat += "Play lobby music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
" - dat += "Randomized character slot: [randomslot ? "Yes" : "No"]
" - dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
" - dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
" - dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]
" - if(config.allow_Metadata) - dat += "OOC notes: Edit
" + if(user.client) + if(user.client.holder) + dat += "Adminhelp sound: " + dat += "[(sound & SOUND_ADMINHELP)?"On":"Off"]
" - if(user.client) - if(user.client.holder) - dat += "Adminhelp sound: " - dat += "[(sound & SOUND_ADMINHELP)?"On":"Off"]
" + if(check_rights(R_ADMIN,0)) + dat += "OOC:     Change
" - if(check_rights(R_ADMIN,0)) - dat += "OOC:     Change
" + if(unlock_content) + dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
" - if(unlock_content) - dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
" - - dat += "
" - dat += "

Special Role Settings

" + dat += "
" + dat += "

Special Role Settings

" // dat += "

" - if(jobban_isbanned(user, "Syndicate")) - dat += "You are banned from special roles." - src.be_special = 0 - else - var/n = 0 - for (var/i in special_roles) - if(special_roles[i]) //if mode is available on the server - var/special_role_flag = be_special_flags[i] - if(jobban_isbanned(user, i)) - dat += "Be [i]: \[BANNED]
" - else if(!player_old_enough_antag(user.client,special_role_flag)) - var/available_in_days_antag = available_in_days_antag(user.client,special_role_flag) - dat += "Be [i]: \[IN [(available_in_days_antag)] DAYS]
" - else - dat += "Be [i]: [src.be_special&(1<
" - n++ - dat += "

" + if(jobban_isbanned(user, "Syndicate")) + dat += "You are banned from special roles." + src.be_special = list() + else + for (var/i in special_roles) + if(jobban_isbanned(user, i)) + dat += "Be [capitalize(i)]: \[BANNED]
" + else if(!player_old_enough_antag(user.client,i)) + var/available_in_days_antag = available_in_days_antag(user.client,i) + dat += "Be [capitalize(i)]: \[IN [(available_in_days_antag)] DAYS]
" + else + dat += "Be [capitalize(i)]: [(i in src.be_special) ? "Yes" : "No"]
" + dat += "

" - if(!IsGuestKey(user.key)) - dat += "Undo - " - dat += "Save Setup - " + if(!IsGuestKey(user.key)) + dat += "Undo - " + dat += "Save Setup - " - dat += "Reset Setup" - dat += "
" + dat += "Reset Setup" + dat += "
" // user << browse(dat, "window=preferences;size=560x580") - var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 640, 810) - popup.set_content(dat) - popup.open(0) + var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 640, 810) + popup.set_content(dat) + popup.open(0) - proc/SetChoices(mob/user, limit = 12, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790) - if(!job_master) - return +/datum/preferences/proc/SetChoices(mob/user, limit = 12, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790) + if(!job_master) + return - //limit - The amount of jobs allowed per column. Defaults to 17 to make it look nice. - //splitJobs - Allows you split the table by job. You can make different tables for each department by including their heads. Defaults to CE to make it look nice. - //width - Screen' width. Defaults to 550 to make it look nice. - //height - Screen's height. Defaults to 500 to make it look nice. + //limit - The amount of jobs allowed per column. Defaults to 17 to make it look nice. + //splitJobs - Allows you split the table by job. You can make different tables for each department by including their heads. Defaults to CE to make it look nice. + //width - Screen' width. Defaults to 550 to make it look nice. + //height - Screen's height. Defaults to 500 to make it look nice. - var/HTML = "" - HTML += "
" - HTML += "Choose occupation chances
Unavailable occupations are crossed out.

" - HTML += "
\[Done\]

" // Easier to press up here. - HTML += "
Left-click to raise an occupation preference, right-click to lower it.
" - HTML += "" - HTML += "" - switch(alternate_option) - if(GET_RANDOM_JOB) - HTML += "

Get random job if preferences unavailable

" - if(BE_CIVILIAN) - HTML += "

Be a civilian if preferences unavailable

" - if(RETURN_TO_LOBBY) - HTML += "

Return to lobby if preferences unavailable

" + for(var/i = 1, i < (limit - index), i += 1) // Finish the column so it is even + HTML += "" - HTML += "
\[Reset\]
" - HTML += "" + HTML += "
" // Table within a table for alignment, also allows you to easily add more colomns. - HTML += "" - var/index = -1 + var/HTML = "" + HTML += "
" + HTML += "Choose occupation chances
Unavailable occupations are crossed out.

" + HTML += "
\[Done\]

" // Easier to press up here. + HTML += "
Left-click to raise an occupation preference, right-click to lower it.
" + HTML += "" + HTML += "
" // Table within a table for alignment, also allows you to easily add more colomns. + HTML += "" + var/index = -1 - //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows. - var/datum/job/lastJob - if (!job_master) return - for(var/datum/job/job in job_master.occupations) + //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows. + var/datum/job/lastJob + if (!job_master) return + for(var/datum/job/job in job_master.occupations) - index += 1 - if((index >= limit) || (job.title in splitJobs)) - if((index < limit) && (lastJob != null)) - //If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with - //the last job's selection color. Creating a rather nice effect. - for(var/i = 0, i < (limit - index), i += 1) - HTML += "" - HTML += "
  
" - index = 0 + index += 1 + if((index >= limit) || (job.title in splitJobs)) + if((index < limit) && (lastJob != null)) + //If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with + //the last job's selection color. Creating a rather nice effect. + for(var/i = 0, i < (limit - index), i += 1) + HTML += "" + HTML += "
  
" + index = 0 - HTML += "" - continue - if(jobban_isbanned(user, rank)) - HTML += "[rank]" - continue - if(!job.player_old_enough(user.client)) - var/available_in_days = job.available_in_days(user.client) - HTML += "[rank]" - continue - if((job_support_low & CIVILIAN) && (rank != "Civilian")) - HTML += "[rank]" - continue - if((rank in command_positions) || (rank == "AI"))//Bold head jobs - HTML += "[rank]" - else - HTML += "[rank]" + HTML += "" + continue + if(jobban_isbanned(user, rank)) + HTML += "[rank]" + continue + if(!job.player_old_enough(user.client)) + var/available_in_days = job.available_in_days(user.client) + HTML += "[rank]" + continue + if((job_support_low & CIVILIAN) && (rank != "Civilian")) + HTML += "[rank]" + continue + if((rank in command_positions) || (rank == "AI"))//Bold head jobs + HTML += "[rank]" + else + HTML += "[rank]" - HTML += "" - HTML += "" - continue -/* - if(GetJobDepartment(job, 1) & job.flag) - HTML += " \[High]" - else if(GetJobDepartment(job, 2) & job.flag) - HTML += " \[Medium]" - else if(GetJobDepartment(job, 3) & job.flag) - HTML += " \[Low]" + if(rank == "Civilian")//Civilian is special + if(job_support_low & CIVILIAN) + HTML += " \[Yes]" else - HTML += " \[NEVER]" - */ - HTML += "[prefLevelLabel]" - + HTML += " \[No]" if(job.alt_titles) HTML += "
\[[GetPlayerAltTitle(job)]\]" - - HTML += "" + continue +/* + if(GetJobDepartment(job, 1) & job.flag) + HTML += " \[High]" + else if(GetJobDepartment(job, 2) & job.flag) + HTML += " \[Medium]" + else if(GetJobDepartment(job, 3) & job.flag) + HTML += " \[Low]" + else + HTML += " \[NEVER]" + */ + HTML += "[prefLevelLabel]" - for(var/i = 1, i < (limit - index), i += 1) // Finish the column so it is even - HTML += "" + if(job.alt_titles) + HTML += "
\[[GetPlayerAltTitle(job)]\]" - HTML += "
" - var/rank = job.title - lastJob = job - if(!is_job_whitelisted(user, rank)) - HTML += "[rank] \[KARMA]
\[BANNED]
\[IN [(available_in_days)] DAYS]
" + var/rank = job.title + lastJob = job + if(!is_job_whitelisted(user, rank)) + HTML += "[rank] \[KARMA]
\[BANNED]
\[IN [(available_in_days)] DAYS]
" + HTML += "" - var/prefLevelLabel = "ERROR" - var/prefLevelColor = "pink" - var/prefUpperLevel = -1 // level to assign on left click - var/prefLowerLevel = -1 // level to assign on right click + var/prefLevelLabel = "ERROR" + var/prefLevelColor = "pink" + var/prefUpperLevel = -1 // level to assign on left click + var/prefLowerLevel = -1 // level to assign on right click - if(GetJobDepartment(job, 1) & job.flag) - prefLevelLabel = "High" - prefLevelColor = "slateblue" - prefUpperLevel = 4 - prefLowerLevel = 2 - else if(GetJobDepartment(job, 2) & job.flag) - prefLevelLabel = "Medium" - prefLevelColor = "green" - prefUpperLevel = 1 - prefLowerLevel = 3 - else if(GetJobDepartment(job, 3) & job.flag) - prefLevelLabel = "Low" - prefLevelColor = "orange" - prefUpperLevel = 2 - prefLowerLevel = 4 - else - prefLevelLabel = "NEVER" - prefLevelColor = "red" - prefUpperLevel = 3 - prefLowerLevel = 1 + if(GetJobDepartment(job, 1) & job.flag) + prefLevelLabel = "High" + prefLevelColor = "slateblue" + prefUpperLevel = 4 + prefLowerLevel = 2 + else if(GetJobDepartment(job, 2) & job.flag) + prefLevelLabel = "Medium" + prefLevelColor = "green" + prefUpperLevel = 1 + prefLowerLevel = 3 + else if(GetJobDepartment(job, 3) & job.flag) + prefLevelLabel = "Low" + prefLevelColor = "orange" + prefUpperLevel = 2 + prefLowerLevel = 4 + else + prefLevelLabel = "NEVER" + prefLevelColor = "red" + prefUpperLevel = 3 + prefLowerLevel = 1 - HTML += "" + HTML += "" // HTML += "" - if(rank == "Civilian")//Civilian is special - if(job_support_low & CIVILIAN) - HTML += " \[Yes]" - else - HTML += " \[No]" - if(job.alt_titles) - HTML += "
\[[GetPlayerAltTitle(job)]\]
  
" - HTML += "
" + HTML += "
  
" - user << browse(null, "window=preferences") + HTML += "
" + + switch(alternate_option) + if(GET_RANDOM_JOB) + HTML += "

Get random job if preferences unavailable

" + if(BE_CIVILIAN) + HTML += "

Be a civilian if preferences unavailable

" + if(RETURN_TO_LOBBY) + HTML += "

Return to lobby if preferences unavailable

" + + HTML += "
\[Reset\]
" + HTML += "
" + + user << browse(null, "window=preferences") // user << browse(HTML, "window=mob_occupation;size=[width]x[height]") - var/datum/browser/popup = new(user, "mob_occupation", "
Occupation Preferences
", width, height) - popup.set_window_options("can_close=0") - popup.set_content(HTML) - popup.open(0) + var/datum/browser/popup = new(user, "mob_occupation", "
Occupation Preferences
", width, height) + popup.set_window_options("can_close=0") + popup.set_content(HTML) + popup.open(0) + return + +/datum/preferences/proc/SetJobPreferenceLevel(var/datum/job/job, var/level) + if (!job) + return 0 + + if (level == 1) // to high + // remove any other job(s) set to high + job_support_med |= job_support_high + job_engsec_med |= job_engsec_high + job_medsci_med |= job_medsci_high + job_karma_med |= job_karma_high + job_support_high = 0 + job_engsec_high = 0 + job_medsci_high = 0 + job_karma_high = 0 + + if (job.department_flag == SUPPORT) + job_support_low &= ~job.flag + job_support_med &= ~job.flag + job_support_high &= ~job.flag + + switch(level) + if (1) + job_support_high |= job.flag + if (2) + job_support_med |= job.flag + if (3) + job_support_low |= job.flag + + return 1 + else if (job.department_flag == ENGSEC) + job_engsec_low &= ~job.flag + job_engsec_med &= ~job.flag + job_engsec_high &= ~job.flag + + switch(level) + if (1) + job_engsec_high |= job.flag + if (2) + job_engsec_med |= job.flag + if (3) + job_engsec_low |= job.flag + + return 1 + else if (job.department_flag == MEDSCI) + job_medsci_low &= ~job.flag + job_medsci_med &= ~job.flag + job_medsci_high &= ~job.flag + + switch(level) + if (1) + job_medsci_high |= job.flag + if (2) + job_medsci_med |= job.flag + if (3) + job_medsci_low |= job.flag + + return 1 + else if (job.department_flag == KARMA) + job_karma_low &= ~job.flag + job_karma_med &= ~job.flag + job_karma_high &= ~job.flag + + switch(level) + if (1) + job_karma_high |= job.flag + if (2) + job_karma_med |= job.flag + if (3) + job_karma_low |= job.flag + + return 1 + + return 0 + +/datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl) + var/datum/job/job = job_master.GetJob(role) + + if(!job) + user << browse(null, "window=mob_occupation") + ShowChoices(user) return - proc/SetJobPreferenceLevel(var/datum/job/job, var/level) - if (!job) - return 0 + if (!isnum(desiredLvl)) + user << "\red UpdateJobPreference - desired level was not a number. Please notify coders!" + ShowChoices(user) + return - if (level == 1) // to high - // remove any other job(s) set to high + if(role == "Civilian") + if(job_support_low & job.flag) + job_support_low &= ~job.flag + else + job_support_low |= job.flag + SetChoices(user) + return 1 + + SetJobPreferenceLevel(job, desiredLvl) + SetChoices(user) + + return 1 + +/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label) + if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")) + return "
  • [species] cannot be fat.
  • " + return "
  • [label]: [disabilities & flag ? "Yes" : "No"]
  • " + +/datum/preferences/proc/SetDisabilities(mob/user) + var/HTML = "" + + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:474: HTML += "
    " + HTML += {"
    + Choose disabilities
      "} + // END AUTOFIX + HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute") + + + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:481: HTML += "
    " + HTML += {" + \[Done\] + \[Reset\] +
    "} + // END AUTOFIX + user << browse(null, "window=preferences") + user << browse(HTML, "window=disabil;size=350x300") + return + +/datum/preferences/proc/SetRecords(mob/user) + var/HTML = "" + HTML += "
    " + HTML += "Set Character Records
    " + + HTML += "Medical Records
    " + + if(lentext(med_record) <= 40) + HTML += "[med_record]" + else + HTML += "[copytext(med_record, 1, 37)]..." + + HTML += "

    Employment Records
    " + + if(lentext(gen_record) <= 40) + HTML += "[gen_record]" + else + HTML += "[copytext(gen_record, 1, 37)]..." + + HTML += "

    Security Records
    " + + if(lentext(sec_record) <= 40) + HTML += "[sec_record]
    " + else + HTML += "[copytext(sec_record, 1, 37)]...
    " + + HTML += "
    " + HTML += "\[Done\]" + HTML += "
    " + + user << browse(null, "window=preferences") + user << browse(HTML, "window=records;size=350x300") + return + +/datum/preferences/proc/GetPlayerAltTitle(datum/job/job) + return player_alt_titles.Find(job.title) > 0 \ + ? player_alt_titles[job.title] \ + : job.title + +/datum/preferences/proc/SetPlayerAltTitle(datum/job/job, new_title) + // remove existing entry + if(player_alt_titles.Find(job.title)) + player_alt_titles -= job.title + // add one if it's not default + if(job.title != new_title) + player_alt_titles[job.title] = new_title + +/datum/preferences/proc/SetJob(mob/user, role) + var/datum/job/job = job_master.GetJob(role) + if(!job) + user << browse(null, "window=mob_occupation") + ShowChoices(user) + return + + if(role == "Civilian") + if(job_support_low & job.flag) + job_support_low &= ~job.flag + else + job_support_low |= job.flag + SetChoices(user) + return 1 + + if(GetJobDepartment(job, 1) & job.flag) + SetJobDepartment(job, 1) + else if(GetJobDepartment(job, 2) & job.flag) + SetJobDepartment(job, 2) + else if(GetJobDepartment(job, 3) & job.flag) + SetJobDepartment(job, 3) + else//job = Never + SetJobDepartment(job, 4) + + SetChoices(user) + return 1 + +/datum/preferences/proc/ResetJobs() + job_support_high = 0 + job_support_med = 0 + job_support_low = 0 + + job_medsci_high = 0 + job_medsci_med = 0 + job_medsci_low = 0 + + job_engsec_high = 0 + job_engsec_med = 0 + job_engsec_low = 0 + + job_karma_high = 0 + job_karma_med = 0 + job_karma_low = 0 + + +/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level) + if(!job || !level) return 0 + switch(job.department_flag) + if(SUPPORT) + switch(level) + if(1) + return job_support_high + if(2) + return job_support_med + if(3) + return job_support_low + if(MEDSCI) + switch(level) + if(1) + return job_medsci_high + if(2) + return job_medsci_med + if(3) + return job_medsci_low + if(ENGSEC) + switch(level) + if(1) + return job_engsec_high + if(2) + return job_engsec_med + if(3) + return job_engsec_low + if(KARMA) + switch(level) + if(1) + return job_karma_high + if(2) + return job_karma_med + if(3) + return job_karma_low + return 0 + +/datum/preferences/proc/SetJobDepartment(var/datum/job/job, var/level) + if(!job || !level) return 0 + switch(level) + if(1)//Only one of these should ever be active at once so clear them all here + job_support_high = 0 + job_medsci_high = 0 + job_engsec_high = 0 + job_karma_high = 0 + return 1 + if(2)//Set current highs to med, then reset them job_support_med |= job_support_high - job_engsec_med |= job_engsec_high job_medsci_med |= job_medsci_high + job_engsec_med |= job_engsec_high job_karma_med |= job_karma_high job_support_high = 0 - job_engsec_high = 0 job_medsci_high = 0 + job_engsec_high = 0 job_karma_high = 0 - if (job.department_flag == SUPPORT) - job_support_low &= ~job.flag - job_support_med &= ~job.flag - job_support_high &= ~job.flag - + switch(job.department_flag) + if(SUPPORT) switch(level) - if (1) - job_support_high |= job.flag - if (2) + if(2) + job_support_high = job.flag + job_support_med &= ~job.flag + if(3) job_support_med |= job.flag - if (3) + job_support_low &= ~job.flag + else job_support_low |= job.flag - - return 1 - else if (job.department_flag == ENGSEC) - job_engsec_low &= ~job.flag - job_engsec_med &= ~job.flag - job_engsec_high &= ~job.flag - + if(MEDSCI) switch(level) - if (1) - job_engsec_high |= job.flag - if (2) - job_engsec_med |= job.flag - if (3) - job_engsec_low |= job.flag - - return 1 - else if (job.department_flag == MEDSCI) - job_medsci_low &= ~job.flag - job_medsci_med &= ~job.flag - job_medsci_high &= ~job.flag - - switch(level) - if (1) - job_medsci_high |= job.flag - if (2) + if(2) + job_medsci_high = job.flag + job_medsci_med &= ~job.flag + if(3) job_medsci_med |= job.flag - if (3) + job_medsci_low &= ~job.flag + else job_medsci_low |= job.flag - - return 1 - else if (job.department_flag == KARMA) - job_karma_low &= ~job.flag - job_karma_med &= ~job.flag - job_karma_high &= ~job.flag - + if(ENGSEC) switch(level) - if (1) - job_karma_high |= job.flag - if (2) + if(2) + job_engsec_high = job.flag + job_engsec_med &= ~job.flag + if(3) + job_engsec_med |= job.flag + job_engsec_low &= ~job.flag + else + job_engsec_low |= job.flag + if(KARMA) + switch(level) + if(2) + job_karma_high = job.flag + job_karma_med &= ~job.flag + if(3) job_karma_med |= job.flag - if (3) + job_karma_low &= ~job.flag + else job_karma_low |= job.flag + return 1 - return 1 +/datum/preferences/proc/process_link(mob/user, list/href_list) + if(!user) return - return 0 - - proc/UpdateJobPreference(mob/user, role, desiredLvl) - var/datum/job/job = job_master.GetJob(role) - - if(!job) - user << browse(null, "window=mob_occupation") - ShowChoices(user) - return - - if (!isnum(desiredLvl)) - user << "\red UpdateJobPreference - desired level was not a number. Please notify coders!" - ShowChoices(user) - return - - if(role == "Civilian") - if(job_support_low & job.flag) - job_support_low &= ~job.flag - else - job_support_low |= job.flag - SetChoices(user) - return 1 - - SetJobPreferenceLevel(job, desiredLvl) - SetChoices(user) - - return 1 - - proc/ShowDisabilityState(mob/user,flag,label) - if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")) - return "
  • [species] cannot be fat.
  • " - return "
  • [label]: [disabilities & flag ? "Yes" : "No"]
  • " - - proc/SetDisabilities(mob/user) - var/HTML = "" - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:474: HTML += "
    " - HTML += {"
    - Choose disabilities
      "} - // END AUTOFIX - HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses") - HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese") - HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures") - HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf") - HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind") - HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute") - - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:481: HTML += "
    " - HTML += {" - \[Done\] - \[Reset\] -
    "} - // END AUTOFIX - user << browse(null, "window=preferences") - user << browse(HTML, "window=disabil;size=350x300") - return - - proc/SetRecords(mob/user) - var/HTML = "" - HTML += "
    " - HTML += "Set Character Records
    " - - HTML += "Medical Records
    " - - if(lentext(med_record) <= 40) - HTML += "[med_record]" - else - HTML += "[copytext(med_record, 1, 37)]..." - - HTML += "

    Employment Records
    " - - if(lentext(gen_record) <= 40) - HTML += "[gen_record]" - else - HTML += "[copytext(gen_record, 1, 37)]..." - - HTML += "

    Security Records
    " - - if(lentext(sec_record) <= 40) - HTML += "[sec_record]
    " - else - HTML += "[copytext(sec_record, 1, 37)]...
    " - - HTML += "
    " - HTML += "\[Done\]" - HTML += "
    " - - user << browse(null, "window=preferences") - user << browse(HTML, "window=records;size=350x300") - return - - proc/GetPlayerAltTitle(datum/job/job) - return player_alt_titles.Find(job.title) > 0 \ - ? player_alt_titles[job.title] \ - : job.title - - proc/SetPlayerAltTitle(datum/job/job, new_title) - // remove existing entry - if(player_alt_titles.Find(job.title)) - player_alt_titles -= job.title - // add one if it's not default - if(job.title != new_title) - player_alt_titles[job.title] = new_title - - proc/SetJob(mob/user, role) - var/datum/job/job = job_master.GetJob(role) - if(!job) - user << browse(null, "window=mob_occupation") - ShowChoices(user) - return - - if(role == "Civilian") - if(job_support_low & job.flag) - job_support_low &= ~job.flag - else - job_support_low |= job.flag - SetChoices(user) - return 1 - - if(GetJobDepartment(job, 1) & job.flag) - SetJobDepartment(job, 1) - else if(GetJobDepartment(job, 2) & job.flag) - SetJobDepartment(job, 2) - else if(GetJobDepartment(job, 3) & job.flag) - SetJobDepartment(job, 3) - else//job = Never - SetJobDepartment(job, 4) - - SetChoices(user) - return 1 - - proc/ResetJobs() - job_support_high = 0 - job_support_med = 0 - job_support_low = 0 - - job_medsci_high = 0 - job_medsci_med = 0 - job_medsci_low = 0 - - job_engsec_high = 0 - job_engsec_med = 0 - job_engsec_low = 0 - - job_karma_high = 0 - job_karma_med = 0 - job_karma_low = 0 - - - proc/GetJobDepartment(var/datum/job/job, var/level) - if(!job || !level) return 0 - switch(job.department_flag) - if(SUPPORT) - switch(level) - if(1) - return job_support_high - if(2) - return job_support_med - if(3) - return job_support_low - if(MEDSCI) - switch(level) - if(1) - return job_medsci_high - if(2) - return job_medsci_med - if(3) - return job_medsci_low - if(ENGSEC) - switch(level) - if(1) - return job_engsec_high - if(2) - return job_engsec_med - if(3) - return job_engsec_low - if(KARMA) - switch(level) - if(1) - return job_karma_high - if(2) - return job_karma_med - if(3) - return job_karma_low - return 0 - - proc/SetJobDepartment(var/datum/job/job, var/level) - if(!job || !level) return 0 - switch(level) - if(1)//Only one of these should ever be active at once so clear them all here - job_support_high = 0 - job_medsci_high = 0 - job_engsec_high = 0 - job_karma_high = 0 - return 1 - if(2)//Set current highs to med, then reset them - job_support_med |= job_support_high - job_medsci_med |= job_medsci_high - job_engsec_med |= job_engsec_high - job_karma_med |= job_karma_high - job_support_high = 0 - job_medsci_high = 0 - job_engsec_high = 0 - job_karma_high = 0 - - switch(job.department_flag) - if(SUPPORT) - switch(level) - if(2) - job_support_high = job.flag - job_support_med &= ~job.flag - if(3) - job_support_med |= job.flag - job_support_low &= ~job.flag - else - job_support_low |= job.flag - if(MEDSCI) - switch(level) - if(2) - job_medsci_high = job.flag - job_medsci_med &= ~job.flag - if(3) - job_medsci_med |= job.flag - job_medsci_low &= ~job.flag - else - job_medsci_low |= job.flag - if(ENGSEC) - switch(level) - if(2) - job_engsec_high = job.flag - job_engsec_med &= ~job.flag - if(3) - job_engsec_med |= job.flag - job_engsec_low &= ~job.flag - else - job_engsec_low |= job.flag - if(KARMA) - switch(level) - if(2) - job_karma_high = job.flag - job_karma_med &= ~job.flag - if(3) - job_karma_med |= job.flag - job_karma_low &= ~job.flag - else - job_karma_low |= job.flag - return 1 - - proc/process_link(mob/user, list/href_list) - if(!user) return - - if(href_list["preference"] == "job") - switch(href_list["task"]) - if("close") - user << browse(null, "window=mob_occupation") - ShowChoices(user) - if("reset") - ResetJobs() - SetChoices(user) - if("random") - if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN) - alternate_option += 1 - else if(alternate_option == RETURN_TO_LOBBY) - alternate_option = 0 - else - return 0 - SetChoices(user) - if ("alt_title") - var/datum/job/job = locate(href_list["job"]) - if (job) - var/choices = list(job.title) + job.alt_titles - var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null - if(choice) - SetPlayerAltTitle(job, choice) - SetChoices(user) - if("input") - SetJob(user, href_list["text"]) - if("setJobLevel") - UpdateJobPreference(user, href_list["text"], text2num(href_list["level"])) + if(href_list["preference"] == "job") + switch(href_list["task"]) + if("close") + user << browse(null, "window=mob_occupation") + ShowChoices(user) + if("reset") + ResetJobs() + SetChoices(user) + if("random") + if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN) + alternate_option += 1 + else if(alternate_option == RETURN_TO_LOBBY) + alternate_option = 0 else - SetChoices(user) - return 1 - else if(href_list["preference"] == "disabilities") - - switch(href_list["task"]) - if("close") - user << browse(null, "window=disabil") - ShowChoices(user) - if("reset") - disabilities=0 - SetDisabilities(user) - if("input") - var/dflag=text2num(href_list["disability"]) - if(dflag >= 0) - if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))) - disabilities ^= text2num(href_list["disability"]) //MAGIC - SetDisabilities(user) - else - SetDisabilities(user) - return 1 - - else if(href_list["preference"] == "records") - if(text2num(href_list["record"]) >= 1) - SetRecords(user) - return + return 0 + SetChoices(user) + if ("alt_title") + var/datum/job/job = locate(href_list["job"]) + if (job) + var/choices = list(job.title) + job.alt_titles + var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null + if(choice) + SetPlayerAltTitle(job, choice) + SetChoices(user) + if("input") + SetJob(user, href_list["text"]) + if("setJobLevel") + UpdateJobPreference(user, href_list["text"], text2num(href_list["level"])) else - user << browse(null, "window=records") - if(href_list["task"] == "med_record") - var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message - - if(medmsg != null) - medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN) - medmsg = html_encode(medmsg) - - med_record = medmsg - SetRecords(user) - - if(href_list["task"] == "sec_record") - var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message - - if(secmsg != null) - secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN) - secmsg = html_encode(secmsg) - - sec_record = secmsg - SetRecords(user) - if(href_list["task"] == "gen_record") - var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message - - if(genmsg != null) - genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN) - genmsg = html_encode(genmsg) - - gen_record = genmsg - SetRecords(user) + SetChoices(user) + return 1 + else if(href_list["preference"] == "disabilities") switch(href_list["task"]) - if("random") - switch(href_list["preference"]) - if("name") - real_name = random_name(gender,species) - if("age") - age = rand(AGE_MIN, AGE_MAX) - if("hair") - if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Wryn" || species == "Vulpkanin") - r_hair = rand(0,255) - g_hair = rand(0,255) - b_hair = rand(0,255) - if("h_style") - h_style = random_hair_style(gender, species) - if("facial") - r_facial = rand(0,255) - g_facial = rand(0,255) - b_facial = rand(0,255) - if("f_style") - f_style = random_facial_hair_style(gender, species) - if("underwear") - underwear = random_underwear(gender) - ShowChoices(user) - if("undershirt") - undershirt = random_undershirt(gender) - ShowChoices(user) - if("socks") - socks = random_socks(gender) - ShowChoices(user) - if("eyes") - r_eyes = rand(0,255) - g_eyes = rand(0,255) - b_eyes = rand(0,255) - if("s_tone") - if(species == "Human") - s_tone = random_skin_tone() - if("s_color") - if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wyrn", "Vulpkanin", "Machine")) - r_skin = rand(0,255) - g_skin = rand(0,255) - b_skin = rand(0,255) - if("bag") - backbag = rand(1,4) - /*if("skin_style") - h_style = random_skin_style(gender)*/ - if("all") - random_character() + if("close") + user << browse(null, "window=disabil") + ShowChoices(user) + if("reset") + disabilities=0 + SetDisabilities(user) if("input") - switch(href_list["preference"]) - if("name") - var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null - if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) - var/new_name = reject_bad_name(raw_name) - if(new_name) - real_name = new_name - else - user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + var/dflag=text2num(href_list["disability"]) + if(dflag >= 0) + if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))) + disabilities ^= text2num(href_list["disability"]) //MAGIC + SetDisabilities(user) + else + SetDisabilities(user) + return 1 - if("age") - var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null - if(new_age) - age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) - if("species") + else if(href_list["preference"] == "records") + if(text2num(href_list["record"]) >= 1) + SetRecords(user) + return + else + user << browse(null, "window=records") + if(href_list["task"] == "med_record") + var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message - var/list/new_species = list("Human","Tajaran","Skrell","Unathi","Diona", "Vulpkanin") - var/prev_species = species + if(medmsg != null) + medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN) + medmsg = html_encode(medmsg) + + med_record = medmsg + SetRecords(user) + + if(href_list["task"] == "sec_record") + var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message + + if(secmsg != null) + secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN) + secmsg = html_encode(secmsg) + + sec_record = secmsg + SetRecords(user) + if(href_list["task"] == "gen_record") + var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message + + if(genmsg != null) + genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN) + genmsg = html_encode(genmsg) + + gen_record = genmsg + SetRecords(user) + + switch(href_list["task"]) + if("random") + switch(href_list["preference"]) + if("name") + real_name = random_name(gender,species) + if("age") + age = rand(AGE_MIN, AGE_MAX) + if("hair") + if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Wryn" || species == "Vulpkanin") + r_hair = rand(0,255) + g_hair = rand(0,255) + b_hair = rand(0,255) + if("h_style") + h_style = random_hair_style(gender, species) + if("facial") + r_facial = rand(0,255) + g_facial = rand(0,255) + b_facial = rand(0,255) + if("f_style") + f_style = random_facial_hair_style(gender, species) + if("underwear") + underwear = random_underwear(gender) + ShowChoices(user) + if("undershirt") + undershirt = random_undershirt(gender) + ShowChoices(user) + if("socks") + socks = random_socks(gender) + ShowChoices(user) + if("eyes") + r_eyes = rand(0,255) + g_eyes = rand(0,255) + b_eyes = rand(0,255) + if("s_tone") + if(species == "Human") + s_tone = random_skin_tone() + if("s_color") + if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wyrn", "Vulpkanin", "Machine")) + r_skin = rand(0,255) + g_skin = rand(0,255) + b_skin = rand(0,255) + if("bag") + backbag = rand(1,4) + /*if("skin_style") + h_style = random_skin_style(gender)*/ + if("all") + random_character() + if("input") + switch(href_list["preference"]) + if("name") + var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null + if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) + var/new_name = reject_bad_name(raw_name) + if(new_name) + real_name = new_name + else + user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + + if("age") + var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null + if(new_age) + 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/prev_species = species // var/whitelisted = 0 - if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! - for(var/S in whitelisted_species) - if(is_alien_whitelisted(user,S)) - new_species += S + if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! + for(var/S in whitelisted_species) + if(is_alien_whitelisted(user,S)) + new_species += S // whitelisted = 1 // if(!whitelisted) // alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.") - else //Not using the whitelist? Aliens for everyone! - new_species += whitelisted_species + else //Not using the whitelist? Aliens for everyone! + new_species += whitelisted_species - species = input("Please select a species", "Character Generation", null) in new_species + species = input("Please select a species", "Character Generation", null) in new_species - if(prev_species != species) - //grab one of the valid hair styles for the newly chosen species - var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if( !(species in S.species_allowed)) - continue - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] - - if(valid_hairstyles.len) - h_style = pick(valid_hairstyles) - else - //this shouldn't happen - h_style = hair_styles_list["Bald"] - - //grab one of the valid facial hair styles for the newly chosen species - var/list/valid_facialhairstyles = list() - for(var/facialhairstyle in facial_hair_styles_list) - var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if( !(species in S.species_allowed)) - continue - - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] - - if(valid_facialhairstyles.len) - f_style = pick(valid_facialhairstyles) - else - //this shouldn't happen - f_style = facial_hair_styles_list["Shaved"] - - // Don't wear another species' underwear! - var/datum/sprite_accessory/S = underwear_list[underwear] - if(!(species in S.species_allowed)) - underwear = random_underwear(gender, species) - - S = undershirt_list[undershirt] - if(!(species in S.species_allowed)) - undershirt = random_undershirt(gender, species) - - S = socks_list[socks] - if(!(species in S.species_allowed)) - socks = random_socks(gender, species) - - //reset hair colour and skin colour - r_hair = 0//hex2num(copytext(new_hair, 2, 4)) - g_hair = 0//hex2num(copytext(new_hair, 4, 6)) - b_hair = 0//hex2num(copytext(new_hair, 6, 8)) - - s_tone = 0 - - ha_style = "None" // No Vulp ears on Unathi - m_style = "None" // No Unathi markings on Tajara - body_accessory = null //no vulpatail on humans damnit - if("speciesprefs")//oldvox code - speciesprefs = !speciesprefs - - if("language") -// var/languages_available - var/list/new_languages = list("None") -/* - if(config.usealienwhitelist) - for(var/L in all_languages) - var/datum/language/lang = all_languages[L] - if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED )))) - new_languages += lang - languages_available = 1 - - if(!(languages_available)) - alert(user, "There are not currently any available secondary languages.") - else -*/ - for(var/L in all_languages) - var/datum/language/lang = all_languages[L] - if(!(lang.flags & RESTRICTED)) - new_languages += lang.name - - language = input("Please select a secondary language", "Character Generation", null) in new_languages - - if("metadata") - var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null - if(new_metadata) - metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN)) - - if("b_type") - var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" ) - if(new_b_type) - b_type = new_b_type - - 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") - 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) - r_hair = hex2num(copytext(new_hair, 2, 4)) - g_hair = hex2num(copytext(new_hair, 4, 6)) - b_hair = hex2num(copytext(new_hair, 6, 8)) - - if("h_style") + if(prev_species != species) + //grab one of the valid hair styles for the newly chosen species var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue if( !(species in S.species_allowed)) continue - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] - 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 - 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) - r_headacc = hex2num(copytext(new_head_accessory, 2, 4)) - g_headacc = hex2num(copytext(new_head_accessory, 4, 6)) - b_headacc = hex2num(copytext(new_head_accessory, 6, 8)) - - if("ha_style") - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // 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] - if( !(species in H.species_allowed)) - continue - - valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style] - - var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles - if(new_head_accessory_style) - 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:" - 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)) - g_markings = hex2num(copytext(new_markings, 4, 6)) - b_markings = hex2num(copytext(new_markings, 6, 8)) - - if("m_style") - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with markings - var/list/valid_markings = list() - for(var/markingstyle in marking_styles_list) - var/datum/sprite_accessory/M = marking_styles_list[markingstyle] - if( !(species in M.species_allowed)) - 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 - if(new_marking_style) - m_style = new_marking_style - - if("body_accessory") - var/list/possible_body_accessories = list() - if(check_rights(R_ADMIN, 1, user)) - possible_body_accessories = body_accessory_by_name.Copy() + if(valid_hairstyles.len) + h_style = pick(valid_hairstyles) else - for(var/B in body_accessory_by_name) - var/datum/body_accessory/accessory = body_accessory_by_name[B] - if(!istype(accessory)) - possible_body_accessories += "None" //the only null entry should be the "None" option - continue - if(species in accessory.allowed_species) - possible_body_accessories += B + //this shouldn't happen + h_style = hair_styles_list["Bald"] - var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories - if(new_body_accessory) - body_accessory = (new_body_accessory == "None") ? null : new_body_accessory - - if("facial") - var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null - if(new_facial) - r_facial = hex2num(copytext(new_facial, 2, 4)) - g_facial = hex2num(copytext(new_facial, 4, 6)) - b_facial = hex2num(copytext(new_facial, 6, 8)) - - if("f_style") + //grab one of the valid facial hair styles for the newly chosen species var/list/valid_facialhairstyles = list() for(var/facialhairstyle in facial_hair_styles_list) var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] @@ -1294,441 +1103,619 @@ datum/preferences valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] - var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles - if(new_f_style) - f_style = new_f_style - - if("underwear") - var/list/underwear_options - if(gender == MALE) - underwear_options = underwear_m + if(valid_facialhairstyles.len) + f_style = pick(valid_facialhairstyles) else - underwear_options = underwear_f + //this shouldn't happen + f_style = facial_hair_styles_list["Shaved"] - var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options - if(new_underwear) - underwear = new_underwear - ShowChoices(user) + // Don't wear another species' underwear! + var/datum/sprite_accessory/S = underwear_list[underwear] + if(!(species in S.species_allowed)) + underwear = random_underwear(gender, species) - if("undershirt") - var/new_undershirt - if(gender == MALE) - new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m - else - new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f - if(new_undershirt) - undershirt = new_undershirt - ShowChoices(user) + S = undershirt_list[undershirt] + if(!(species in S.species_allowed)) + undershirt = random_undershirt(gender, species) - if("socks") - var/list/valid_sockstyles = list() - for(var/sockstyle in socks_list) - var/datum/sprite_accessory/S = socks_list[sockstyle] - if(gender == MALE && S.gender == FEMALE) + S = socks_list[socks] + if(!(species in S.species_allowed)) + socks = random_socks(gender, species) + + //reset hair colour and skin colour + r_hair = 0//hex2num(copytext(new_hair, 2, 4)) + g_hair = 0//hex2num(copytext(new_hair, 4, 6)) + b_hair = 0//hex2num(copytext(new_hair, 6, 8)) + + s_tone = 0 + + ha_style = "None" // No Vulp ears on Unathi + m_style = "None" // No Unathi markings on Tajara + body_accessory = null //no vulpatail on humans damnit + if("speciesprefs")//oldvox code + speciesprefs = !speciesprefs + + if("language") +// var/languages_available + var/list/new_languages = list("None") +/* + if(config.usealienwhitelist) + for(var/L in all_languages) + var/datum/language/lang = all_languages[L] + if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED )))) + new_languages += lang + languages_available = 1 + + if(!(languages_available)) + alert(user, "There are not currently any available secondary languages.") + else +*/ + for(var/L in all_languages) + var/datum/language/lang = all_languages[L] + if(!(lang.flags & RESTRICTED)) + new_languages += lang.name + + language = input("Please select a secondary language", "Character Generation", null) in new_languages + + if("metadata") + var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null + if(new_metadata) + metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN)) + + if("b_type") + var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" ) + if(new_b_type) + b_type = new_b_type + + 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") + 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) + r_hair = hex2num(copytext(new_hair, 2, 4)) + g_hair = hex2num(copytext(new_hair, 4, 6)) + b_hair = hex2num(copytext(new_hair, 6, 8)) + + if("h_style") + 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 + + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + + 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 + 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) + r_headacc = hex2num(copytext(new_head_accessory, 2, 4)) + g_headacc = hex2num(copytext(new_head_accessory, 4, 6)) + b_headacc = hex2num(copytext(new_head_accessory, 6, 8)) + + if("ha_style") + if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // 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] + if( !(species in H.species_allowed)) continue - if(gender == FEMALE && S.gender == MALE) + + valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style] + + var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles + if(new_head_accessory_style) + 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:" + 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)) + g_markings = hex2num(copytext(new_markings, 4, 6)) + b_markings = hex2num(copytext(new_markings, 6, 8)) + + if("m_style") + if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with markings + var/list/valid_markings = list() + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/M = marking_styles_list[markingstyle] + if( !(species in M.species_allowed)) continue - if(!(species in S.species_allowed)) + + 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 + if(new_marking_style) + m_style = new_marking_style + + if("body_accessory") + var/list/possible_body_accessories = list() + if(check_rights(R_ADMIN, 1, user)) + possible_body_accessories = body_accessory_by_name.Copy() + else + for(var/B in body_accessory_by_name) + var/datum/body_accessory/accessory = body_accessory_by_name[B] + if(!istype(accessory)) + possible_body_accessories += "None" //the only null entry should be the "None" option continue - valid_sockstyles[sockstyle] = socks_list[sockstyle] - var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles - ShowChoices(user) - if(new_socks) - socks = new_socks + if(species in accessory.allowed_species) + possible_body_accessories += B - if("eyes") - var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null - if(new_eyes) - r_eyes = hex2num(copytext(new_eyes, 2, 4)) - g_eyes = hex2num(copytext(new_eyes, 4, 6)) - b_eyes = hex2num(copytext(new_eyes, 6, 8)) + var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories + if(new_body_accessory) + body_accessory = (new_body_accessory == "None") ? null : new_body_accessory - if("s_tone") - if(species != "Human") - return - var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null - if(new_s_tone) - s_tone = 35 - max(min( round(new_s_tone), 220),1) + if("facial") + var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null + if(new_facial) + r_facial = hex2num(copytext(new_facial, 2, 4)) + g_facial = hex2num(copytext(new_facial, 4, 6)) + b_facial = hex2num(copytext(new_facial, 6, 8)) - if("skin") - if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) - var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null - if(new_skin) - r_skin = hex2num(copytext(new_skin, 2, 4)) - g_skin = hex2num(copytext(new_skin, 4, 6)) - b_skin = hex2num(copytext(new_skin, 6, 8)) + if("f_style") + var/list/valid_facialhairstyles = list() + for(var/facialhairstyle in facial_hair_styles_list) + var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if( !(species in S.species_allowed)) + continue + + valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + + var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles + if(new_f_style) + f_style = new_f_style + + if("underwear") + var/list/underwear_options + if(gender == MALE) + underwear_options = underwear_m + else + underwear_options = underwear_f + + var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options + if(new_underwear) + underwear = new_underwear + ShowChoices(user) + + if("undershirt") + var/new_undershirt + if(gender == MALE) + new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m + else + new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f + if(new_undershirt) + undershirt = new_undershirt + ShowChoices(user) + + if("socks") + var/list/valid_sockstyles = list() + for(var/sockstyle in socks_list) + var/datum/sprite_accessory/S = socks_list[sockstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if(!(species in S.species_allowed)) + continue + valid_sockstyles[sockstyle] = socks_list[sockstyle] + var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles + ShowChoices(user) + if(new_socks) + socks = new_socks + + if("eyes") + var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null + if(new_eyes) + r_eyes = hex2num(copytext(new_eyes, 2, 4)) + g_eyes = hex2num(copytext(new_eyes, 4, 6)) + b_eyes = hex2num(copytext(new_eyes, 6, 8)) + + if("s_tone") + if(species != "Human") + return + var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null + if(new_s_tone) + s_tone = 35 - max(min( round(new_s_tone), 220),1) + + if("skin") + if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) + var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null + if(new_skin) + r_skin = hex2num(copytext(new_skin, 2, 4)) + g_skin = hex2num(copytext(new_skin, 4, 6)) + b_skin = hex2num(copytext(new_skin, 6, 8)) - if("ooccolor") - var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null - if(new_ooccolor) - ooccolor = new_ooccolor + if("ooccolor") + var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null + if(new_ooccolor) + ooccolor = new_ooccolor - if("bag") - var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist - if(new_backbag) - backbag = backbaglist.Find(new_backbag) + if("bag") + var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist + if(new_backbag) + backbag = backbaglist.Find(new_backbag) - if("nt_relation") - var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed") - if(new_relation) - nanotrasen_relation = new_relation + if("nt_relation") + var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed") + if(new_relation) + nanotrasen_relation = new_relation - if("flavor_text") - var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message + if("flavor_text") + var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message - if(msg != null) - msg = copytext(msg, 1, MAX_MESSAGE_LEN) - msg = html_encode(msg) + if(msg != null) + msg = copytext(msg, 1, MAX_MESSAGE_LEN) + msg = html_encode(msg) - flavor_text = msg + 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") - if(!limb_name) return + 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") + 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") - switch(limb_name) - if("Left Leg") - limb = "l_leg" - second_limb = "l_foot" - if("Right Leg") - limb = "r_leg" - second_limb = "r_foot" - if("Left Arm") - limb = "l_arm" - second_limb = "l_hand" - if("Right Arm") - limb = "r_arm" - second_limb = "r_hand" - if("Left Foot") - limb = "l_foot" - third_limb = "l_leg" - if("Right Foot") - limb = "r_foot" - third_limb = "r_leg" - if("Left Hand") - limb = "l_hand" - third_limb = "l_arm" - if("Right Hand") - limb = "r_hand" - third_limb = "r_arm" + 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") + switch(limb_name) + if("Left Leg") + limb = "l_leg" + second_limb = "l_foot" + if("Right Leg") + limb = "r_leg" + second_limb = "r_foot" + if("Left Arm") + limb = "l_arm" + second_limb = "l_hand" + if("Right Arm") + limb = "r_arm" + second_limb = "r_hand" + if("Left Foot") + limb = "l_foot" + third_limb = "l_leg" + if("Right Foot") + limb = "r_foot" + third_limb = "r_leg" + if("Left Hand") + limb = "l_hand" + third_limb = "l_arm" + if("Right Hand") + limb = "r_hand" + 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 + 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") - 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("Prothesis") - var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in chargen_robolimbs - if(!choice) - return - rlimb_data[limb] = choice - organ_data[limb] = "cyborg" - if(second_limb) - rlimb_data[second_limb] = choice - organ_data[second_limb] = "cyborg" + switch(new_state) + if("Normal") + 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("Prothesis") + var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in chargen_robolimbs + if(!choice) + return + rlimb_data[limb] = choice + organ_data[limb] = "cyborg" + if(second_limb) + rlimb_data[second_limb] = choice + organ_data[second_limb] = "cyborg" - if("organs") - var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") - if(!organ_name) return + if("organs") + var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") + if(!organ_name) return - var/organ = null - switch(organ_name) - if("Heart") - organ = "heart" - if("Eyes") - organ = "eyes" + var/organ = null + switch(organ_name) + if("Heart") + organ = "heart" + if("Eyes") + organ = "eyes" - var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical") - if(!new_state) return + var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical") + if(!new_state) return - switch(new_state) - if("Normal") - organ_data[organ] = null - if("Assisted") - organ_data[organ] = "assisted" - if("Mechanical") - organ_data[organ] = "mechanical" + switch(new_state) + if("Normal") + organ_data[organ] = null + if("Assisted") + organ_data[organ] = "assisted" + if("Mechanical") + organ_data[organ] = "mechanical" /* - if("skin_style") - var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") - if(!skin_style_name) return + if("skin_style") + var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") + if(!skin_style_name) return */ /* if("spawnpoint") - var/list/spawnkeys = list() - for(var/S in spawntypes) - spawnkeys += S - var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys - if(!choice || !spawntypes[choice]) - spawnpoint = "Arrivals Shuttle" - return - spawnpoint = choice */ + var/list/spawnkeys = list() + for(var/S in spawntypes) + spawnkeys += S + var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys + if(!choice || !spawntypes[choice]) + spawnpoint = "Arrivals Shuttle" + return + spawnpoint = choice */ - else - switch(href_list["preference"]) - if("publicity") - if(unlock_content) - toggles ^= MEMBER_PUBLIC + else + switch(href_list["preference"]) + if("publicity") + if(unlock_content) + toggles ^= MEMBER_PUBLIC - if("gender") - if(gender == MALE) - gender = FEMALE - else - gender = MALE - underwear = random_underwear(gender) - - if("hear_adminhelps") - sound ^= SOUND_ADMINHELP - - if("ui") - switch(UI_style) - if("Midnight") - UI_style = "White" - else - UI_style = "Midnight" - - if("UIcolor") - var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null - if(!UI_style_color_new) return - 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 - if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return - UI_style_alpha = UI_style_alpha_new - - if("be_special") - var/num = text2num(href_list["num"]) - be_special ^= (1<= 50)) return + UI_style_alpha = UI_style_alpha_new - if(backbag > 4 || backbag < 1) - backbag = 1 //Same as above - character.backbag = backbag + if("be_special") + var/r = href_list["role"] + if(!(r in special_roles)) + var/cleaned_r = sql_sanitize_text(r) + if(r != cleaned_r) // up to no good + message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") + user << "Stop right there, criminal scum" + else + be_special ^= r - //Debugging report to track down a bug, which randomly assigned the plural gender to people. - if(character.gender in list(PLURAL, NEUTER)) - if(isliving(src)) //Ghosts get neuter by default - message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.") - character.gender = MALE + if("name") + be_random_name = !be_random_name - proc/open_load_dialog(mob/user) + if("randomslot") + randomslot = !randomslot - var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot") + if("hear_midis") + sound ^= SOUND_MIDI - var/dat = "" - dat += "
    " - dat += "Select a character slot to load
    " - var/name + if("lobby_music") + sound ^= SOUND_LOBBY + if(sound & SOUND_LOBBY) + user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) + else + user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) - for(var/i=1, i<=max_save_slots, i++) - if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") - message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n") - return - while(query.NextRow()) - if(i==text2num(query.item[1])) - name = query.item[2] - if(!name) name = "Character[i]" - if(i==default_slot) - name = "[name]" - dat += "[name]
    " - name = null + if("ghost_ears") + toggles ^= CHAT_GHOSTEARS - dat += "
    " - dat += "Close
    " - dat += "
    " + if("ghost_sight") + toggles ^= CHAT_GHOSTSIGHT + + if("ghost_radio") + toggles ^= CHAT_GHOSTRADIO + + if("ghost_radio") + toggles ^= CHAT_GHOSTRADIO + + if("save") + save_preferences(user) + save_character(user) + + if("reload") + load_preferences(user) + load_character(user) + + if("open_load_dialog") + if(!IsGuestKey(user.key)) + open_load_dialog(user) + + if("close_load_dialog") + close_load_dialog(user) + + if("changeslot") + if(!load_character(user,text2num(href_list["num"]))) + random_character() + real_name = random_name(gender) + save_character(user) + close_load_dialog(user) + + if("tab") + if (href_list["tab"]) + current_tab = text2num(href_list["tab"]) + + ShowChoices(user) + return 1 + +/datum/preferences/proc/copy_to(mob/living/carbon/human/character) + if(be_random_name) + real_name = random_name(gender,species) + + if(config.humans_need_surnames) + var/firstspace = findtext(real_name, " ") + var/name_length = length(real_name) + if(!firstspace) //we need a surname + real_name += " [pick(last_names)]" + else if(firstspace == name_length) + real_name += "[pick(last_names)]" + + character.real_name = real_name + character.name = character.real_name + if(character.dna) + character.dna.real_name = character.real_name + + character.flavor_text = flavor_text + character.med_record = med_record + character.sec_record = sec_record + character.gen_record = gen_record + + character.gender = gender + character.age = age + character.b_type = b_type + + character.r_eyes = r_eyes + character.g_eyes = g_eyes + character.b_eyes = b_eyes + + character.r_hair = r_hair + character.g_hair = g_hair + character.b_hair = b_hair + + character.r_facial = r_facial + character.g_facial = g_facial + character.b_facial = b_facial + + character.r_skin = r_skin + character.g_skin = g_skin + character.b_skin = b_skin + + character.s_tone = s_tone + + character.h_style = h_style + character.f_style = f_style + + + // Destroy/cyborgize organs + + for(var/name in organ_data) + + var/status = organ_data[name] + var/obj/item/organ/external/O = character.organs_by_name[name] + if(O) + if(status == "amputated") + character.organs_by_name[O.limb_name] = null + character.organs -= O + if(O.children) // This might need to become recursive. + for(var/obj/item/organ/external/child in O.children) + character.organs_by_name[child.limb_name] = null + character.organs -= child + + else if(status == "cyborg") + if(rlimb_data[name]) + O.robotize(rlimb_data[name]) + else + O.robotize() + else + var/obj/item/organ/I = character.internal_organs_by_name[name] + if(I) + if(status == "assisted") + I.mechassist() + else if(status == "mechanical") + I.robotize() + + if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)//character.species.flags & CAN_BE_FAT) + character.mutations += FAT + character.mutations += OBESITY + if(disabilities & DISABILITY_FLAG_NEARSIGHTED) + character.disabilities|=NEARSIGHTED + if(disabilities & DISABILITY_FLAG_EPILEPTIC) + character.disabilities|=EPILEPSY + if(disabilities & DISABILITY_FLAG_DEAF) + character.sdisabilities|=DEAF + + // Wheelchair necessary? + var/obj/item/organ/external/l_foot = character.get_organ("l_foot") + var/obj/item/organ/external/r_foot = character.get_organ("r_foot") + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc) + character.buckled = W + character.update_canmove() + W.dir = character.dir + W.buckled_mob = character + W.add_fingerprint(character) + + character.underwear = underwear + character.undershirt = undershirt + character.socks = socks + + if(character.species.bodyflags & HAS_HEAD_ACCESSORY) + character.r_headacc = r_headacc + character.g_headacc = g_headacc + character.b_headacc = b_headacc + character.ha_style = ha_style + if(character.species.bodyflags & HAS_MARKINGS) + character.r_markings = r_markings + character.g_markings = g_markings + character.b_markings = b_markings + character.m_style = m_style + if(body_accessory) + character.body_accessory = body_accessory_by_name["[body_accessory]"] + + if(backbag > 4 || backbag < 1) + backbag = 1 //Same as above + character.backbag = backbag + + //Debugging report to track down a bug, which randomly assigned the plural gender to people. + if(character.gender in list(PLURAL, NEUTER)) + if(isliving(src)) //Ghosts get neuter by default + message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.") + character.gender = MALE + +/datum/preferences/proc/open_load_dialog(mob/user) + + var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot") + + var/dat = "" + dat += "
    " + dat += "Select a character slot to load
    " + var/name + + for(var/i=1, i<=max_save_slots, i++) + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") + message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n") + return + while(query.NextRow()) + if(i==text2num(query.item[1])) + name = query.item[2] + if(!name) name = "Character[i]" + if(i==default_slot) + name = "[name]" + dat += "[name]
    " + name = null + + dat += "
    " + dat += "Close
    " + dat += "
    " // user << browse(dat, "window=saves;size=300x390") - var/datum/browser/popup = new(user, "saves", "
    Character Saves
    ", 300, 390) - popup.set_content(dat) - popup.open(0) - proc/close_load_dialog(mob/user) - user << browse(null, "window=saves") + var/datum/browser/popup = new(user, "saves", "
    Character Saves
    ", 300, 390) + popup.set_content(dat) + popup.open(0) + +/datum/preferences/proc/close_load_dialog(mob/user) + user << browse(null, "window=saves") From 5d816d943d257517c406563fca950c01b8c5f3cd Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Mon, 28 Dec 2015 20:57:07 -0500 Subject: [PATCH 17/20] Cleans up the tiniest bit. --- code/modules/client/preferences.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ead55fa663c..f37b8dd2e24 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -354,6 +354,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "
    [headaccessoryname]
    " dat += "Change Color
    __
    " dat += "Style: [ha_style]
    " + dat += "
    Body Markings
    " dat += "Change Color
    __
    " dat += "
    Style: [m_style]
    " @@ -411,7 +412,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "" dat += "

    Special Role Settings

    " -// dat += "

    " +// dat += "

    " if(jobban_isbanned(user, "Syndicate")) dat += "You are banned from special roles." src.be_special = list() @@ -433,7 +434,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Reset Setup" dat += "
    " -// user << browse(dat, "window=preferences;size=560x580") +// user << browse(dat, "window=preferences;size=560x580") var/datum/browser/popup = new(user, "preferences", "
    Character Setup
    ", 640, 810) popup.set_content(dat) popup.open(0) @@ -1686,7 +1687,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts character.gender = MALE /datum/preferences/proc/open_load_dialog(mob/user) - var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot") var/dat = "" From 8d1eeb58dab9b242f37c6e1a1f31563d05b21125 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Tue, 29 Dec 2015 07:50:06 -0500 Subject: [PATCH 18/20] Cloning Support for Markings & Head Accessories --- code/game/dna/dna2.dm | 102 +++++++++++++++++++++++----------- code/game/dna/dna2_helpers.dm | 46 +++++++++++---- 2 files changed, 103 insertions(+), 45 deletions(-) diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index 0687b41e691..4ca8ece26e0 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -17,23 +17,32 @@ #define DNA_HARD_BOUNDS list(1,3490,3500,4095) // UI Indices (can change to mutblock style, if desired) -#define DNA_UI_HAIR_R 1 -#define DNA_UI_HAIR_G 2 -#define DNA_UI_HAIR_B 3 -#define DNA_UI_BEARD_R 4 -#define DNA_UI_BEARD_G 5 -#define DNA_UI_BEARD_B 6 -#define DNA_UI_SKIN_TONE 7 -#define DNA_UI_SKIN_R 8 -#define DNA_UI_SKIN_G 9 -#define DNA_UI_SKIN_B 10 -#define DNA_UI_EYES_R 11 -#define DNA_UI_EYES_G 12 -#define DNA_UI_EYES_B 13 -#define DNA_UI_GENDER 14 -#define DNA_UI_BEARD_STYLE 15 -#define DNA_UI_HAIR_STYLE 16 -#define DNA_UI_LENGTH 16 // Update this when you add something, or you WILL break shit. +#define DNA_UI_HAIR_R 1 +#define DNA_UI_HAIR_G 2 +#define DNA_UI_HAIR_B 3 +#define DNA_UI_BEARD_R 4 +#define DNA_UI_BEARD_G 5 +#define DNA_UI_BEARD_B 6 +#define DNA_UI_SKIN_TONE 7 +#define DNA_UI_SKIN_R 8 +#define DNA_UI_SKIN_G 9 +#define DNA_UI_SKIN_B 10 +#define DNA_UI_HACC_R 11 +#define DNA_UI_HACC_G 12 +#define DNA_UI_HACC_B 13 +#define DNA_UI_MARK_R 14 +#define DNA_UI_MARK_G 15 +#define DNA_UI_MARK_B 16 +#define DNA_UI_EYES_R 17 +#define DNA_UI_EYES_G 18 +#define DNA_UI_EYES_B 19 +#define DNA_UI_GENDER 20 +#define DNA_UI_BEARD_STYLE 21 +#define DNA_UI_HAIR_STYLE 22 +/*#define DNA_UI_BACC_STYLE 23*/ +#define DNA_UI_HACC_STYLE 23 +#define DNA_UI_MARK_STYLE 24 +#define DNA_UI_LENGTH 24 // Update this when you add something, or you WILL break shit. #define DNA_SE_LENGTH 55 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow. @@ -133,28 +142,55 @@ var/global/list/bad_blocks[0] character.f_style = "Shaved" var/beard = facial_hair_styles_list.Find(character.f_style) - SetUIValueRange(DNA_UI_HAIR_R, character.r_hair, 255, 1) - SetUIValueRange(DNA_UI_HAIR_G, character.g_hair, 255, 1) - SetUIValueRange(DNA_UI_HAIR_B, character.b_hair, 255, 1) + // Head Accessory + if(!character.ha_style) + character.ha_style = "None" + var/headacc = head_accessory_styles_list.Find(character.ha_style) - SetUIValueRange(DNA_UI_BEARD_R, character.r_facial, 255, 1) - SetUIValueRange(DNA_UI_BEARD_G, character.g_facial, 255, 1) - SetUIValueRange(DNA_UI_BEARD_B, character.b_facial, 255, 1) + /*// Body Accessory + if(!character.body_accessory) + character.body_accessory = null + var/bodyacc = character.body_accessory*/ - SetUIValueRange(DNA_UI_EYES_R, character.r_eyes, 255, 1) - SetUIValueRange(DNA_UI_EYES_G, character.g_eyes, 255, 1) - SetUIValueRange(DNA_UI_EYES_B, character.b_eyes, 255, 1) + // Markings + if(!character.m_style) + character.m_style = "None" + var/marks = marking_styles_list.Find(character.m_style) - SetUIValueRange(DNA_UI_SKIN_R, character.r_skin, 255, 1) - SetUIValueRange(DNA_UI_SKIN_G, character.g_skin, 255, 1) - SetUIValueRange(DNA_UI_SKIN_B, character.b_skin, 255, 1) + SetUIValueRange(DNA_UI_HAIR_R, character.r_hair, 255, 1) + SetUIValueRange(DNA_UI_HAIR_G, character.g_hair, 255, 1) + SetUIValueRange(DNA_UI_HAIR_B, character.b_hair, 255, 1) - SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative. + SetUIValueRange(DNA_UI_BEARD_R, character.r_facial, 255, 1) + SetUIValueRange(DNA_UI_BEARD_G, character.g_facial, 255, 1) + SetUIValueRange(DNA_UI_BEARD_B, character.b_facial, 255, 1) - SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1) + SetUIValueRange(DNA_UI_EYES_R, character.r_eyes, 255, 1) + SetUIValueRange(DNA_UI_EYES_G, character.g_eyes, 255, 1) + SetUIValueRange(DNA_UI_EYES_B, character.b_eyes, 255, 1) + + SetUIValueRange(DNA_UI_SKIN_R, character.r_skin, 255, 1) + SetUIValueRange(DNA_UI_SKIN_G, character.g_skin, 255, 1) + SetUIValueRange(DNA_UI_SKIN_B, character.b_skin, 255, 1) + + SetUIValueRange(DNA_UI_HACC_R, character.r_headacc, 255, 1) + SetUIValueRange(DNA_UI_HACC_G, character.g_headacc, 255, 1) + SetUIValueRange(DNA_UI_HACC_B, character.b_headacc, 255, 1) + + SetUIValueRange(DNA_UI_MARK_R, character.r_markings, 255, 1) + SetUIValueRange(DNA_UI_MARK_G, character.g_markings, 255, 1) + SetUIValueRange(DNA_UI_MARK_B, character.b_markings, 255, 1) + + SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative. + + SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1) + + SetUIValueRange(DNA_UI_HAIR_STYLE, hair, hair_styles_list.len, 1) + SetUIValueRange(DNA_UI_BEARD_STYLE, beard, facial_hair_styles_list.len, 1) + /*SetUIValueRange(DNA_UI_BACC_STYLE, bodyacc, facial_hair_styles_list.len, 1)*/ + SetUIValueRange(DNA_UI_HACC_STYLE, headacc, head_accessory_styles_list.len, 1) + SetUIValueRange(DNA_UI_MARK_STYLE, marks, marking_styles_list.len, 1) - SetUIValueRange(DNA_UI_HAIR_STYLE, hair, hair_styles_list.len, 1) - SetUIValueRange(DNA_UI_BEARD_STYLE, beard, facial_hair_styles_list.len,1) UpdateUI() diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index f909a241805..4aa0453a52d 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -131,21 +131,31 @@ src.dna.UpdateUI() dna.check_integrity() var/mob/living/carbon/human/H = src - H.r_hair = dna.GetUIValueRange(DNA_UI_HAIR_R, 255) - H.g_hair = dna.GetUIValueRange(DNA_UI_HAIR_G, 255) - H.b_hair = dna.GetUIValueRange(DNA_UI_HAIR_B, 255) + H.r_hair = dna.GetUIValueRange(DNA_UI_HAIR_R, 255) + H.g_hair = dna.GetUIValueRange(DNA_UI_HAIR_G, 255) + H.b_hair = dna.GetUIValueRange(DNA_UI_HAIR_B, 255) - H.r_facial = dna.GetUIValueRange(DNA_UI_BEARD_R, 255) - H.g_facial = dna.GetUIValueRange(DNA_UI_BEARD_G, 255) - H.b_facial = dna.GetUIValueRange(DNA_UI_BEARD_B, 255) + H.r_facial = dna.GetUIValueRange(DNA_UI_BEARD_R, 255) + H.g_facial = dna.GetUIValueRange(DNA_UI_BEARD_G, 255) + H.b_facial = dna.GetUIValueRange(DNA_UI_BEARD_B, 255) + + H.r_skin = dna.GetUIValueRange(DNA_UI_SKIN_R, 255) + H.g_skin = dna.GetUIValueRange(DNA_UI_SKIN_G, 255) + H.b_skin = dna.GetUIValueRange(DNA_UI_SKIN_B, 255) + + H.r_eyes = dna.GetUIValueRange(DNA_UI_EYES_R, 255) + H.g_eyes = dna.GetUIValueRange(DNA_UI_EYES_G, 255) + H.b_eyes = dna.GetUIValueRange(DNA_UI_EYES_B, 255) + + H.r_headacc = dna.GetUIValueRange(DNA_UI_HACC_R, 255) + H.g_headacc = dna.GetUIValueRange(DNA_UI_HACC_G, 255) + H.b_headacc = dna.GetUIValueRange(DNA_UI_HACC_B, 255) + + H.r_markings = dna.GetUIValueRange(DNA_UI_MARK_R, 255) + H.g_markings = dna.GetUIValueRange(DNA_UI_MARK_G, 255) + H.b_markings = dna.GetUIValueRange(DNA_UI_MARK_B, 255) - H.r_skin = dna.GetUIValueRange(DNA_UI_SKIN_R, 255) - H.g_skin = dna.GetUIValueRange(DNA_UI_SKIN_G, 255) - H.b_skin = dna.GetUIValueRange(DNA_UI_SKIN_B, 255) - H.r_eyes = dna.GetUIValueRange(DNA_UI_EYES_R, 255) - H.g_eyes = dna.GetUIValueRange(DNA_UI_EYES_G, 255) - H.b_eyes = dna.GetUIValueRange(DNA_UI_EYES_B, 255) H.update_eyes() H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative. @@ -165,10 +175,22 @@ if((0 < beard) && (beard <= facial_hair_styles_list.len)) H.f_style = facial_hair_styles_list[beard] + //Head Accessories + var/headacc = dna.GetUIValueRange(DNA_UI_HACC_STYLE,head_accessory_styles_list.len) + if((0 < headacc) && (headacc <= head_accessory_styles_list.len)) + H.ha_style = head_accessory_styles_list[headacc] + + //Markings + var/marks = dna.GetUIValueRange(DNA_UI_MARK_STYLE,marking_styles_list.len) + if((0 < marks) && (marks <= marking_styles_list.len)) + H.m_style = marking_styles_list[marks] + H.force_update_limbs() H.update_eyes() H.update_hair() H.update_fhair() + H.update_markings() + H.update_head_accessory() return 1 else From a1d0e5a0dff11a693d5a361ee5baab0db6d6e5cc Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Tue, 29 Dec 2015 19:36:14 -0500 Subject: [PATCH 19/20] Keeping Up-to-date with 3025 --- code/modules/client/preferences_mysql.dm | 124 ++++++++++++----------- 1 file changed, 63 insertions(+), 61 deletions(-) diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index c19d22de569..8f763ac4edb 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -35,6 +35,8 @@ randomslot = text2num(query.item[9]) volume = text2num(query.item[10]) + old_roles_to_new(C) + //Sanitize ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) // lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) @@ -89,66 +91,66 @@ // Let's not have this explode if you sneeze on the DB var/DBQuery/query = dbcon.NewQuery({"SELECT - OOC_Notes, - real_name, - name_is_always_random, - gender, - age, - species, - language, - hair_red, - hair_green, - hair_blue, - facial_red, - facial_green, - facial_blue, - skin_tone, - skin_red, - skin_green, - skin_blue, - markings_red, - markings_green, - markings_blue, - head_accessory_red, - head_accessory_green, - head_accessory_blue, - hair_style_name, - facial_style_name, - marking_style_name, - head_accessory_style_name, - eyes_red, - eyes_green, - eyes_blue, - underwear, - undershirt, - backbag, - b_type, - alternate_option, - job_support_high, - job_support_med, - job_support_low, - job_medsci_high, - job_medsci_med, - job_medsci_low, - job_engsec_high, - job_engsec_med, - job_engsec_low, - job_karma_high, - job_karma_med, - job_karma_low, - flavor_text, - med_record, - sec_record, - gen_record, - disabilities, - player_alt_titles, - organ_data, - rlimb_data, - nanotrasen_relation, - speciesprefs, - socks, - body_accessory - FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"}) + OOC_Notes, + real_name, + name_is_always_random, + gender, + age, + species, + language, + hair_red, + hair_green, + hair_blue, + facial_red, + facial_green, + facial_blue, + skin_tone, + skin_red, + skin_green, + skin_blue, + markings_red, + markings_green, + markings_blue, + head_accessory_red, + head_accessory_green, + head_accessory_blue, + hair_style_name, + facial_style_name, + marking_style_name, + head_accessory_style_name, + eyes_red, + eyes_green, + eyes_blue, + underwear, + undershirt, + backbag, + b_type, + alternate_option, + job_support_high, + job_support_med, + job_support_low, + job_medsci_high, + job_medsci_med, + job_medsci_low, + job_engsec_high, + job_engsec_med, + job_engsec_low, + job_karma_high, + job_karma_med, + job_karma_low, + flavor_text, + med_record, + sec_record, + gen_record, + disabilities, + player_alt_titles, + organ_data, + rlimb_data, + nanotrasen_relation, + speciesprefs, + socks, + body_accessory + FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"}) if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") @@ -534,4 +536,4 @@ load_character(C) return 0 load_character(C,pick(saves)) - return 1*/ \ No newline at end of file + return 1*/ From f18c04ed0eddc24e3e07d365f47414fdf52dde82 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Sat, 2 Jan 2016 01:13:14 -0500 Subject: [PATCH 20/20] Adds Vulpkanin head markings to Head Accessory Tested and it turns out it looks pretty good. The purpose of this commit is that most of the facial markings work quite well together in pairs given proper colouring and can look pretty sweet, so why not --- .../mob/new_player/sprite_accessories.dm | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 562e4edeba9..3043d929555 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1577,6 +1577,48 @@ icon_state = "vulp_facial_earfluff" species_allowed = list("Vulpkanin") +/datum/sprite_accessory/head_accessory/vulp_blaze + icon = 'icons/mob/human_face.dmi' + name = "Blaze" + icon_state = "vulp_facial_blaze" + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/head_accessory/vulp_vulpine + icon = 'icons/mob/human_face.dmi' + name = "Vulpine" + icon_state = "vulp_facial_vulpine" + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/head_accessory/vulp_mask + icon = 'icons/mob/human_face.dmi' + name = "Mask" + icon_state = "vulp_facial_mask" + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/head_accessory/vulp_patch + icon = 'icons/mob/human_face.dmi' + name = "Patch" + icon_state = "vulp_facial_patch" + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/head_accessory/vulp_ruff + icon = 'icons/mob/human_face.dmi' + name = "Ruff" + icon_state = "vulp_facial_ruff" + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/head_accessory/vulp_kita + icon = 'icons/mob/human_face.dmi' + name = "Kita" + icon_state = "vulp_facial_kita" + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/head_accessory/vulp_swift + icon = 'icons/mob/human_face.dmi' + name = "Swift" + icon_state = "vulp_facial_swift" + species_allowed = list("Vulpkanin") + /datum/sprite_accessory/head_accessory/taj_ears icon = 'icons/mob/human_face.dmi' name = "Tajaran Ears"