//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 var/list/preferences_datums = list() var/global/list/special_roles = list( //keep synced with the defines BE_* in setup.dm --rastaf //some autodetection here. "traitor" = IS_MODE_COMPILED("traitor"), // 0 "operative" = IS_MODE_COMPILED("nuclear"), // 1 "changeling" = IS_MODE_COMPILED("changeling"), // 2 "wizard" = IS_MODE_COMPILED("wizard"), // 3 "malf AI" = IS_MODE_COMPILED("malfunction"), // 4 "revolutionary" = IS_MODE_COMPILED("revolution"), // 5 "alien candidate" = 1, //always show // 6 "pAI candidate" = 1, // -- TLE // 7 "cultist" = IS_MODE_COMPILED("cult"), // 8 "infested monkey" = IS_MODE_COMPILED("monkey"), // 9 "ninja" = "true", // 10 "vox raider" = IS_MODE_COMPILED("heist"), // 11 "slime" = 1, // 12 "vampire" = IS_MODE_COMPILED("vampire") // 13 ) var/const/MAX_SAVE_SLOTS = 10 //used for alternate_option #define GET_RANDOM_JOB 0 #define BE_ASSISTANT 1 #define RETURN_TO_LOBBY 2 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 var/savefile_version = 0 //non-preference stuff var/warns = 0 var/muted = 0 var/last_ip var/last_id //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/UI_style = "Midnight" var/toggles = TOGGLES_DEFAULT var/sound = SOUND_DEFAULT var/UI_style_color = "#ffffff" var/UI_style_alpha = 255 //character preferences var/real_name //our character's name var/be_random_name = 0 //whether we are a random name every round var/gender = MALE //gender of character (well duh) var/age = 30 //age of character var/b_type = "A+" //blood type (not-chooseable) var/underwear = 1 //underwear type var/backbag = 2 //backpack type var/h_style = "Bald" //Hair type var/r_hair = 0 //Hair color var/g_hair = 0 //Hair color var/b_hair = 0 //Hair color var/f_style = "Shaved" //Face hair type var/r_facial = 0 //Face hair color var/g_facial = 0 //Face hair color var/b_facial = 0 //Face hair color var/s_tone = 0 //Skin color var/r_eyes = 0 //Eye color var/g_eyes = 0 //Eye color var/b_eyes = 0 //Eye color var/species = "Human" var/language = "None" //Secondary language //Mob preview var/icon/preview_icon = null var/icon/preview_icon_front = null var/icon/preview_icon_side = null //Jobs, uses bitflags var/job_civilian_high = 0 var/job_civilian_med = 0 var/job_civilian_low = 0 var/job_medsci_high = 0 var/job_medsci_med = 0 var/job_medsci_low = 0 var/job_engsec_high = 0 var/job_engsec_med = 0 var/job_engsec_low = 0 var/job_karma_high = 0 var/job_karma_med = 0 var/job_karma_low = 0 //Keeps track of preferrence for not getting any wanted jobs var/alternate_option = 0 // maps each organ to either null(intact), "cyborg" or "amputated" // will probably not be able to do this for head and torso ;) var/list/organ_data = list() var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor" var/accent = "en-us" var/voice = "m1" var/pitch = 50 var/talkspeed = 175 var/flavor_text = "" var/med_record = "" var/sec_record = "" var/gen_record = "" var/disabilities = 0 var/nanotrasen_relation = "Neutral" // 0 = character settings, 1 = game preferences var/current_tab = 0 // OOC Metadata: var/metadata = "" var/slot_name = "" // Whether or not to use randomized character slots var/randomslot = 0 /datum/preferences/New(client/C) b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") if(istype(C)) if(!IsGuestKey(C.key)) load_path(C.ckey) if(load_preferences()) if(load_character()) return gender = pick(MALE, FEMALE) real_name = random_name(gender) /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" if(!path) dat += "Please create an account to save your preferences." dat += "
" dat += "
" switch(current_tab) if (0) // Character Settings# if(path) 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 += "
Body " dat += "(®)" dat += "
" dat += "Species: [species]
" dat += "Secondary Language:
[language]
" dat += "Accent: [accent]
" dat += "Voice: [voice]
" dat += "Pitch: [pitch]
" dat += "Talking Speed: [talkspeed]
" dat += "Blood Type: [b_type]
" dat += "Skin Tone: [-s_tone + 35]/220
" // dat += "Skin pattern: Adjust
" dat += "
Handicaps
" dat += "\t\[Set Disabilities\]
" dat += "Limbs: Adjust
" 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" if(status == "cyborg") ++ind if(ind > 1) dat += ", " dat += "\tMechanical [organ_name] prothesis" else if(status == "peg") ++ind if(ind > 1) dat += ", " dat += "\tWooden [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 += "

" if(gender == MALE) dat += "Underwear: [underwear_m[underwear]]
" else dat += "Underwear: [underwear_f[underwear]]
" 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 += "[flavor_text]" else dat += "[copytext(flavor_text, 1, 37)]...
" dat += "
" dat += "
Hair
" dat += "Change Color
__
" dat += " Style: [h_style]
" dat += "
Facial
" dat += "Change Color
__
" dat += " Style: [f_style]
" dat += "
Eyes
" dat += "Change Color
__
" dat += "

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

General Settings

" dat += "UI Style: [UI_style]
" dat += "Custom UI(recommended for White UI):
" dat += "-Color: [UI_style_color]
__

" dat += "-Alpha(transparence): [UI_style_alpha]
" dat += "Play admin midis: [(sound & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Play lobby music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
" dat += "Hear player voices: [(sound & SOUND_VOICES) ? "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
" dat += "
" dat += "

Antagonist Settings

" // dat += "

" if(jobban_isbanned(user, "Syndicate")) dat += "You are banned from antagonist 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 if(jobban_isbanned(user, i)) dat += "Be [i]: \[BANNED]
" else if(i == "pai candidate") if(jobban_isbanned(user, "pAI")) dat += "Be [i]: \[BANNED]
" else dat += "Be [i]: [src.be_special&(1<
" n++ dat += "

" if(!IsGuestKey(user.key)) dat += "Undo - " dat += "Save Setup - " dat += "Reset Setup" dat += "
" // user << browse(dat, "window=preferences;size=560x580") var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 610, 650) popup.set_content(dat) popup.open(0) proc/SetChoices(mob/user, limit = 14, list/splitJobs = list("Chief Engineer","Head of Security"), width = 610, height = 650) 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. var/HTML = "" HTML += "
" 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) 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 += "
  
" 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_civilian_low & ASSISTANT) && (rank != "Assistant")) HTML += "[rank]" continue if((rank in command_positions) || (rank == "AI"))//Bold head jobs HTML += "[rank]" else HTML += "[rank]" 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]" if(job.alt_titles) HTML += "
\[[GetPlayerAltTitle(job)]\]" HTML += "" for(var/i = 1, i < (limit - index), i += 1) // Finish the column so it is even HTML += "" HTML += "
" var/rank = job.title lastJob = job if(!is_job_whitelisted(user, rank)) HTML += "[rank] \[KARMA]
\[BANNED]
\[IN [(available_in_days)] DAYS]
" 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 HTML += "" // HTML += "" if(rank == "Assistant")//Assistant is special if(job_civilian_low & ASSISTANT) HTML += " \[Yes]" else HTML += " \[No]" HTML += "
  
" HTML += "
" switch(alternate_option) if(GET_RANDOM_JOB) HTML += "

Get random job if preferences unavailable

" if(BE_ASSISTANT) HTML += "

Be assistant if preference unavailable

" if(RETURN_TO_LOBBY) HTML += "

Return to lobby if preference 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) return 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_civilian_med |= job_civilian_high job_engsec_med |= job_engsec_high job_medsci_med |= job_medsci_high job_karma_med |= job_karma_high job_civilian_high = 0 job_engsec_high = 0 job_medsci_high = 0 job_karma_high = 0 if (job.department_flag == CIVILIAN) job_civilian_low &= ~job.flag job_civilian_med &= ~job.flag job_civilian_high &= ~job.flag switch(level) if (1) job_civilian_high |= job.flag if (2) job_civilian_med |= job.flag if (3) job_civilian_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 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 == "Assistant") if(job_civilian_low & job.flag) job_civilian_low &= ~job.flag else job_civilian_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") // 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 == "Assistant") if(job_civilian_low & job.flag) job_civilian_low &= ~job.flag else job_civilian_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_civilian_high = 0 job_civilian_med = 0 job_civilian_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(CIVILIAN) switch(level) if(1) return job_civilian_high if(2) return job_civilian_med if(3) return job_civilian_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_civilian_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_civilian_med |= job_civilian_high job_medsci_med |= job_medsci_high job_engsec_med |= job_engsec_high job_karma_med |= job_karma_high job_civilian_high = 0 job_medsci_high = 0 job_engsec_high = 0 job_karma_high = 0 switch(job.department_flag) if(CIVILIAN) switch(level) if(2) job_civilian_high = job.flag job_civilian_med &= ~job.flag if(3) job_civilian_med |= job.flag job_civilian_low &= ~job.flag else job_civilian_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(!istype(user, /mob/new_player)) 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_ASSISTANT) 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"])) 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 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) switch(href_list["task"]) if("random") switch(href_list["preference"]) if("name") real_name = random_name(gender) if("age") age = rand(AGE_MIN, AGE_MAX) if("hair") 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 = rand(1,underwear_m.len) ShowChoices(user) if("eyes") r_eyes = rand(0,255) g_eyes = rand(0,255) b_eyes = rand(0,255) if("s_tone") s_tone = random_skin_tone() if("bag") backbag = rand(1,4) /*if("skin_style") h_style = random_skin_style(gender)*/ if("all") randomize_appearance_for() //no params needed if("input") switch(href_list["preference"]) if("name") var/new_name = reject_bad_name( input(user, "Choose your character's name:", "Character Preference") as text|null ) 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") 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 // 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 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"] //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 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") var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") 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("facial") var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference") 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") 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 = underwear_options.Find(new_underwear) ShowChoices(user) if("accent") var/new_accent = input(user, "Choose your accent. en-us:American, en:British, en-sc:Scottish, mb-de4-en:German, mb-fr1-en:French", "Character Preference") as null|anything in list("en-us", "en", "en-sc","mb-de4-en","mb-fr1-en") if(new_accent) accent = new_accent if("voice") var/new_voice = input(user, "Choose your voice. f:Female, m:Male", "Character Preference") as null|anything in list("f1","m1","f2","m2","f3","m3","f4","m4","f5","m5","m6","m7") if(new_voice) voice = new_voice if("pitch") var/new_pitch = input(user, "Choose your character's voice pitch:\n(0-99) Default is 50.", "Character Preference") as num|null if(new_pitch) pitch = max(min( round(text2num(new_pitch)), 99),0) if("talkspeed") var/new_talkspeed = input(user, "Choose your character's voice talk speed:\n(140-240) Default is 175.", "Character Preference") as num|null if(new_talkspeed) talkspeed = max(min( round(text2num(new_talkspeed)), 240),140) if("eyes") var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") 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("ooccolor") var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference") 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("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(msg != null) msg = copytext(msg, 1, MAX_MESSAGE_LEN) msg = html_encode(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 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" valid_limb_states += "Peg Leg" if("Right Leg") limb = "r_leg" second_limb = "r_foot" valid_limb_states += "Peg Leg" 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 switch(new_state) if("Normal") organ_data[limb] = null if(third_limb) organ_data[third_limb] = null if("Amputated") organ_data[limb] = "amputated" if(second_limb) organ_data[second_limb] = "amputated" if("Prothesis") organ_data[limb] = "cyborg" if(second_limb) organ_data[second_limb] = "cyborg" if("Peg Leg") organ_data[limb] = "peg" if(second_limb) organ_data[second_limb] = "amputated" 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/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" /* 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 */ else switch(href_list["preference"]) if("gender") if(gender == MALE) gender = FEMALE else gender = MALE 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!") 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< underwear_m.len || underwear < 1) underwear = 0 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. //HAH NOW NO MORE MAGIC CLONING UNDIES character.underwear = underwear 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("[character] ([character.ckey]) has spawned with their gender as plural or neuter. Please notify coders.") character.gender = MALE proc/open_load_dialog(mob/user) var/dat = "" dat += "
    " var/savefile/S = new /savefile(path) if(S) dat += "Select a character slot to load
    " var/name for(var/i=1, i<=MAX_SAVE_SLOTS, i++) S.cd = "/character[i]" S["real_name"] >> name if(!name) name = "Character[i]" if(i==default_slot) name = "[name]" dat += "[name]
    " dat += "
    " dat += "Close
    " dat += "
    " user << browse(dat, "window=saves;size=300x390") proc/close_load_dialog(mob/user) user << browse(null, "window=saves")