diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 93cdcf133f..c9f08cdfd4 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -57,7 +57,7 @@ //DNA - Because fuck you and your magic numbers being all over the codebase. #define DNA_BLOCK_SIZE 3 -#define DNA_UNI_IDENTITY_BLOCKS 7 +#define DNA_UNI_IDENTITY_BLOCKS 18 #define DNA_HAIR_COLOR_BLOCK 1 #define DNA_FACIAL_HAIR_COLOR_BLOCK 2 #define DNA_SKIN_TONE_BLOCK 3 @@ -65,6 +65,17 @@ #define DNA_GENDER_BLOCK 5 #define DNA_FACIAL_HAIR_STYLE_BLOCK 6 #define DNA_HAIR_STYLE_BLOCK 7 +#define DNA_COLOR_ONE_BLOCK 8 +#define DNA_COLOR_TWO_BLOCK 9 +#define DNA_COLOR_THR_BLOCK 10 +#define DNA_COLOR_SWITCH_BLOCK 11 +#define DNA_COLOR_SWITCH_MAX 7 //must be (2^(n+1))-1 +#define DNA_COCK_BLOCK 12 +#define DNA_MUTANTRACE_BLOCK 13 +#define DNA_MUTANTTAIL_BLOCK 14 +#define DNA_MUTANTWING_BLOCK 15 +#define DNA_WINGCOLOR_BLOCK 16 +#define DNA_TAUR_BLOCK 17 #define DNA_STRUC_ENZYMES_BLOCKS 19 #define DNA_UNIQUE_ENZYMES_LEN 32 diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 33e8cd5bd2..a7c412c348 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -76,6 +76,51 @@ L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color) L[DNA_SKIN_TONE_BLOCK] = construct_block(skin_tones.Find(H.skin_tone), skin_tones.len) L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color) + if(H.heterochromia) + L[DNA_EYE_COLOR_TWO_BLOCK] = sanitize_hexcolor(H.heterochromia) + L[DNA_EYE_COLOR_SWITCH_BLOCK] = construct_block(2,2) + else + L[DNA_EYE_COLOR_TWO_BLOCK] = sanitize_hexcolor(H.eye_color) + L[DNA_EYE_COLOR_SWITCH_BLOCK] = construct_block(1,2) + var/colour_switch=0 + if(special_color[1]) + L[DNA_COLOR_ONE_BLOCK] = sanitize_hexcolor(special_color[1]) + colour_switch+=1 + else + L[DNA_COLOR_ONE_BLOCK] = random_string(DNA_BLOCK_SIZE,hex_characters) + if(special_color[2]) + L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(special_color[2]) + colour_switch+=2 + else + L[DNA_COLOR_TWO_BLOCK] = random_string(DNA_BLOCK_SIZE,hex_characters) + if(special_color[3]) + L[DNA_COLOR_THR_BLOCK] = sanitize_hexcolor(special_color[3]) + colour_switch+=4 + else + L[DNA_COLOR_THR_BLOCK] = random_string(DNA_BLOCK_SIZE,hex_characters) + L[DNA_COLOR_SWITCH_BLOCK] = construct_block(colour_switch+1,DNA_COLOR_SWITCH_MAX+1) + /*if(species_list[mutantrace]) + L[DNA_MUTANTRACE_BLOCK] = construct_block(species_list.Find(mutantrace), species_list.len+1) + else + L[DNA_MUTANTRACE_BLOCK] = construct_block(species_list.len+1, species_list.len+1)*/ + L[DNA_MUTANTRACE_BLOCK] = generate_race_block() + if(mutant_tails.Find(mutanttail)) + L[DNA_MUTANTTAIL_BLOCK] = construct_block(mutant_tails.Find(mutanttail), mutant_tails.len+1) + else + L[DNA_MUTANTTAIL_BLOCK] = construct_block(mutant_tails.len+1, mutant_tails.len+1) + if(mutant_wings.Find(mutantwing)) + L[DNA_MUTANTWING_BLOCK] = construct_block(mutant_wings.Find(mutantwing), mutant_wings.len+1) + else + L[DNA_MUTANTWING_BLOCK] = construct_block(mutant_wings.len+1, mutant_wings.len+1) + L[DNA_WINGCOLOR_BLOCK] = sanitize_hexcolor(wingcolor) + L[DNA_TAUR_BLOCK] = construct_block(taur+1, 2) + + var/cock_block=0 + if(cock["has"]) + cock_block+=1 + if(vagina) + cock_block+=2 + L[DNA_COCK_BLOCK] = construct_block(cock_block+1, 4) for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) if(L[i]) @@ -249,6 +294,49 @@ mob/living/carbon/human/updateappearance(icon_update=1, mutcolor_update=0, mutat eye_color = sanitize_hexcolor(getblock(structure, DNA_EYE_COLOR_BLOCK)) facial_hair_style = facial_hair_styles_list[deconstruct_block(getblock(structure, DNA_FACIAL_HAIR_STYLE_BLOCK), facial_hair_styles_list.len)] hair_style = hair_styles_list[deconstruct_block(getblock(structure, DNA_HAIR_STYLE_BLOCK), hair_styles_list.len)] + var/mutantrace_c = deconstruct_block(getblock(structure, DNA_MUTANTRACE_BLOCK), species_list.len+1) + if(mutantrace_c<=species_list.len && kpcode_race_restricted(species_list[mutantrace_c])!=2) + dna.species=kpcode_race_get(species_list[mutantrace_c]) + var/mutanttail_c = deconstruct_block(getblock(structure, DNA_MUTANTTAIL_BLOCK), mutant_tails.len+1) + if(mutanttail_c<=mutant_tails.len) + dna.mutanttail=mutant_tails[mutanttail_c] + else + dna.mutanttail=null + var/mutantwing_c = deconstruct_block(getblock(structure, DNA_MUTANTWING_BLOCK), mutant_wings.len+1) + if(mutantwing_c<=mutant_wings.len) + dna.mutantwing=mutant_wings[mutantwing_c] + else + dna.mutantwing=null + + dna.wingcolor = sanitize_hexcolor(getblock(structure, DNA_WINGCOLOR_BLOCK)) + var/colour_switch=deconstruct_block(getblock(structure, DNA_COLOR_SWITCH_BLOCK), DNA_COLOR_SWITCH_MAX+1) + colour_switch-=1 + if(colour_switch&1) + dna.special_color[1]=sanitize_hexcolor(getblock(structure, DNA_COLOR_ONE_BLOCK)) + else + dna.special_color[1]=null + if(colour_switch&2) + dna.special_color[2]=sanitize_hexcolor(getblock(structure, DNA_COLOR_TWO_BLOCK)) + else + dna.special_color[2]=null + if(colour_switch&4) + dna.special_color[3]=sanitize_hexcolor(getblock(structure, DNA_COLOR_THR_BLOCK)) + else + dna.special_color[3]=null + + var/cock_block=deconstruct_block(getblock(structure, DNA_COCK_BLOCK), 4) + cock_block-=1 + if(!(cock_block&1)) + dna.cock["has"]=0 + else if(!dna.cock["has"]&&(cock_block&1)) + dna.cock["has"]=1 + + if(cock_block&2) + dna.vagina=1 + else + dna.vagina=0 + + dna.taur=deconstruct_block(getblock(structure, DNA_TAUR_BLOCK), 2)-1 if(icon_update) update_body() update_hair() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index da703aeff5..15fca32e5d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -41,6 +41,31 @@ var/list/preferences_datums = list() var/allow_midround_antag = 1 var/preferred_map = null + //vore code + var/mutant_tail = "none" + var/mutant_wing = "none" + var/wingcolor = "FFF" + var/special_color[COLOUR_LIST_SIZE] + //var/special_color_one = null + //var/special_color_two = null + var/vore_banned_methods = 0 + var/vore_extra_bans = 65535 + var/list/vore_ability = list( + "1"=2, + "2"=0, + "4"=0, + "8"=0, + "16"=0, + "32"=0, + "64"=1, + "128"=0, + "256"=2) //BAAAAD way to do this + var/character_size="normal" + var/be_taur=0 + + var/list/p_cock=list("has"=0,"type"="human","color"="900","sheath"="FFF") + var/p_vagina=0 + //character preferences var/real_name //our character's name var/be_random_name = 0 //whether we'll have a random name every round @@ -184,14 +209,43 @@ var/list/preferences_datums = list() dat += "" + dat += "Size:[character_size]
" + dat += "Vore Preferences:Open
" + dat += "

Wings

" + + dat += "[mutant_wing]
" + dat += "   Change
" + + dat += "Set Flavor Text
" + if(lentext(flavor_text) <= 40) + if(!lentext(flavor_text)) + dat += "\[...\]" + else + dat += "[flavor_text]" + else + dat += "[TextPreview(flavor_text)]...
" + dat += "
" if(pref_species.use_skintones) @@ -234,7 +288,7 @@ var/list/preferences_datums = list() dat += "" - if(config.mutant_races) //We don't allow mutant bodyparts for humans either unless this is true. + /*if(config.mutant_races) //We don't allow mutant bodyparts for humans either unless this is true. if((MUTCOLORS in pref_species.specflags) || (MUTCOLORS_PARTSONLY in pref_species.specflags)) @@ -329,7 +383,7 @@ var/list/preferences_datums = list() dat += "" - dat += "
" if(config.mutant_races) - dat += "Species:
[pref_species.name]
" + dat += "Species:
[pref_species.id]
" + dat += "Human Tail:[mutant_tail]
" + dat += "Taur:[be_taur ? "Yes" : "No"]" + if(!kpcode_cantaur(pref_species.id)) + dat += " (not available for [pref_species.id])" + dat += "
" + if(special_color[1]) + dat += "    Primary
" + else + dat += "Primary?
" + if(special_color[2]) + dat += "    Secondary
" + else + dat += "Secondary?
" + if(special_color[3]) + dat += "    Tertiary
" + else + dat += "Tertiary?
" else dat += "Species: Human
" - dat += "Underwear:
[underwear]
" - dat += "Undershirt:
[undershirt]
" - dat += "Socks:
[socks]
" - dat += "Backpack:
[backbag]
" + dat += ""*/ if (1) // Game Preferences @@ -812,10 +866,18 @@ var/list/preferences_datums = list() if(new_age) age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) - if("metadata") + /*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)) + metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN))*/ + + 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) + + flavor_text = msg if("hair") var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as null|color @@ -900,16 +962,13 @@ var/list/preferences_datums = list() eye_color = sanitize_hexcolor(new_eyes) if("species") - - var/result = input(user, "Select a species", "Species Selection") as null|anything in roundstart_species - + var/result = input(user, "Select a species", "Species Selection") as null|anything in kpcode_race_getlist(ckey) if(result) - var/newtype = roundstart_species[result] + var/newtype = species_list[result] pref_species = new newtype() - //Now that we changed our species, we must verify that the mutant colour is still allowed. - var/temp_hsv = RGBtoHSV(features["mcolor"]) - if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3])) - features["mcolor"] = pref_species.default_color + //if(mutant_color == "#000") + // mutant_color = pref_species.default_color + if("mutant_color") var/new_mutantcolor = input(user, "Choose your character's alien/mutant color:", "Character Preference") as color|null if(new_mutantcolor) @@ -921,7 +980,45 @@ var/list/preferences_datums = list() else user << "Invalid color. Your color is not bright enough." - if("tail_lizard") + if("mutant_tail") + var/new_mutant_tail = input(user, "Choose your character's tail for when they are human:", "Character Preference") as null|anything in mutant_tails + if(new_mutant_tail) + mutant_tail = new_mutant_tail + + if("mutant_wing") + var/new_mutant_wing = input(user, "Choose your character's wings:", "Character Preference") as null|anything in mutant_wings + if(new_mutant_wing) + mutant_wing = new_mutant_wing + + if("wingcolor") + var/new_wingcolor = input(user, "Choose your character's wing colour:", "Character Preference") as color|null + if(new_wingcolor) + wingcolor = sanitize_hexcolor(new_wingcolor) + + if("special_color") + var/index_tc=href_list["which"] + switch(alert("Use a special colour for #[index_tc]?","Character Preference","Yes","No","Cancel")) + if("Yes") + var/new_color = input(user, "Choose colour #[index_tc]:", "Character Preference") as null|color + if(new_color) + special_color[text2num(index_tc)] = sanitize_hexcolor(new_color) + if("No") + special_color[text2num(index_tc)]=null + + if("character_size") + var/new_size = input(user, "Choose your character's size:", "Character Preference") in list("huge", "large", "normal", "small", "tiny") + if(new_size) + character_size=new_size + + if("vore_panel") + var/obj/vore_preferences/VP=new() + VP.target=src + VP.ShowChoices(user) + + if("be_taur") + be_taur = !be_taur + + /*if("tail_lizard") var/new_tail new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list_lizard if(new_tail) @@ -973,7 +1070,7 @@ var/list/preferences_datums = list() var/new_body_markings new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in body_markings_list if(new_body_markings) - features["body_markings"] = new_body_markings + features["body_markings"] = new_body_markings*/ if("s_tone") var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones @@ -1176,6 +1273,30 @@ var/list/preferences_datums = list() character.gender = gender character.age = age + if(mutant_tail != "none" && config.mutant_races) + character.dna.mutanttail = mutant_tail + if(mutant_wing != "none" && config.mutant_races) + character.dna.mutantwing = mutant_wing + character.dna.wingcolor=wingcolor + if(be_taur) + character.dna.taur=1 + character.dna.special_color = special_color + character.dna.cock=p_cock + character.dna.vagina=p_vagina + + character.vore_banned_methods=vore_banned_methods + character.vore_extra_bans=vore_extra_bans + character.vore_ability=vore_ability + if(character_size!="normal") + if(character_size=="small") + character.sizeplay_set(SIZEPLAY_MICRO) + else if(character_size=="tiny") + character.sizeplay_set(SIZEPLAY_TINY) + else if(character_size=="large") + character.sizeplay_set(SIZEPLAY_MACRO) + else + character.sizeplay_set(SIZEPLAY_HUGE) + character.eye_color = eye_color character.hair_color = hair_color character.facial_hair_color = facial_hair_color diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index bfeb855ce2..523c524f23 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,6 +1,9 @@ +/mob/living/ + var/list/stomach_contents = list() + /mob/living/carbon gender = MALE - var/list/stomach_contents = list() + //var/list/stomach_contents = list() var/list/internal_organs = list() //List of /obj/item/organ in the mob. They don't go in the contents for some reason I don't want to know. var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.