//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 var/list/preferences_datums = list() #define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE)))) var/global/list/special_roles = list( //keep synced with the defines BE_* in setup.dm //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" = 1, //always show // 6 "pAI candidate" = 1, // 7 "cultist" = IS_MODE_COMPILED("cult"), // 8 "blob" = IS_MODE_COMPILED("blob"), // 9 "monkey" = IS_MODE_COMPILED("monkey") // 10 ) 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/max_save_slots = 3 //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 = "#002eb8" var/be_special = 0 //Special role selection var/UI_style = "Midnight" var/toggles = TOGGLES_DEFAULT var/ghost_form = "ghost" //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/blood_type = "A+" //blood type (not-chooseable) var/underwear = "Nude" //underwear type var/backbag = 2 //backpack type var/hair_style = "Bald" //Hair type var/hair_color = "000" //Hair color var/facial_hair_style = "Shaved" //Face hair type var/facial_hair_color = "000" //Facial hair color var/skin_tone = "caucasian1" //Skin color var/eye_color = "000" //Eye color var/datum/species/pref_species = new /datum/species/human() //Mutant race var/mutant_color = "FFF" //Mutant race skin color //Mob preview 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 // Want randomjob if preferences already filled - Donkie var/userandomjob = 1 //defaults to 1 for fewer assistants // 0 = character settings, 1 = game preferences var/current_tab = 0 // OOC Metadata: var/metadata = "" var/unlock_content = 0 /datum/preferences/New(client/C) blood_type = random_blood_type() ooccolor = normal_ooc_colour if(istype(C)) if(!IsGuestKey(C.key)) load_path(C.ckey) unlock_content = C.IsByondMember() if(unlock_content) max_save_slots = 8 var/loaded_preferences_successfully = load_preferences() if(loaded_preferences_successfully) if(load_character()) return //we couldn't load character data so just randomize the character appearance + name random_character() //let's create a random character then - rather than a fat, bald and naked man. real_name = random_name(gender) if(!loaded_preferences_successfully) save_preferences() save_character() //let's save this new random character so it doesn't keep generating new ones. return /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) var/savefile/S = new /savefile(path) if(S) dat += "
" 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!=1) dat += " | " dat += "[name] " 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 += "Random Name " dat += "Always Random Name: [be_random_name ? "Yes" : "No"]
" dat += "Name: " dat += "[real_name]
" dat += "Gender: [gender == MALE ? "Male" : "Female"]
" dat += "Age: [age]" dat += "
" dat += "
" dat += "
" dat += "

Body

" dat += "Random Body
" dat += "
" if(config.mutant_races) dat += "Species:
[pref_species.name]
" else dat += "Species: Human
" dat += "Blood Type: [blood_type]
" dat += "Skin Tone:
[skin_tone]
" dat += "Underwear:
[underwear]
" dat += "Backpack:
[backbaglist[backbag]]
" dat += "
" dat += "

Hair Style

" dat += "[hair_style]
" dat += "    Change
" dat += "
" dat += "

Facial Hair Style

" dat += "[facial_hair_style]
" dat += "    Change
" dat += "
" dat += "

Eye Color

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

Alien Color

" // even if choosing your mutantrace is off, this is here in case you gain one during a round dat += "    Change
" dat += "
" if (1) // Game Preferences dat += "
" dat += "

General Settings

" dat += "UI Style: [UI_style]
" dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
" dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
" dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
" dat += "Pull requests: [(toggles & CHAT_PULLR) ? "Yes" : "No"]
" if(config.allow_Metadata) dat += "OOC Notes: Edit
" if(user.client) if(user.client.holder) dat += "Adminhelp Sound: " dat += "[(toggles & SOUND_ADMINHELP)?"On":"Off"]
" if(unlock_content || check_rights_for(user.client, R_ADMIN)) dat += "OOC:     Change
" if(unlock_content) dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
" dat += "Ghost Form: [ghost_form]
" dat += "
" dat += "

Antagonist Settings

" 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 += "
" dat += "
" if(!IsGuestKey(user.key)) dat += "Undo " dat += "Save Setup " dat += "Reset Setup" dat += "
" //user << browse(dat, "window=preferences;size=560x560") var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 580, 600) popup.set_content(dat) popup.open(0) proc/SetChoices(mob/user, limit = 17, list/splitJobs = list("Chief Engineer"), widthPerColumn = 295, height = 620) 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. //widthPerColumn - Screen's width for every column. //height - Screen's height. var/width = widthPerColumn var/HTML = "
" HTML += "Choose occupation chances
" HTML += "
Left-click to raise an occupation preference, right-click to lower it.
" HTML += "
Done

" // Easier to press up here. 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 for(var/datum/job/job in job_master.occupations) index += 1 if((index >= limit) || (job.title in splitJobs)) width += widthPerColumn 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(!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 HTML += "[prefLevelLabel]" 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(jobban_isbanned(user, rank)) HTML += "[rank] \[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 += "" if(rank == "Assistant")//Assistant is special if(job_civilian_low & ASSISTANT) HTML += "Yes" else HTML += "No" HTML += "
  
" HTML += "
" HTML += "

[userandomjob ? "Get random job if preferences unavailable" : "Be an Assistant if preference unavailable"]
" HTML += "
Reset Preferences
" 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_civilian_high = 0 job_engsec_high = 0 job_medsci_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 return 0 proc/UpdateJobPreference(mob/user, role, desiredLvl) if(!job_master) return 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/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 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 return 0 proc/process_link(mob/user, list/href_list) 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") userandomjob = !userandomjob SetChoices(user) if("setJobLevel") UpdateJobPreference(user, href_list["text"], text2num(href_list["level"])) else SetChoices(user) return 1 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") hair_color = random_short_color() if("hair_style") hair_style = random_hair_style(gender) if("facial") facial_hair_color = random_short_color() if("facial_hair_style") facial_hair_style = random_facial_hair_style(gender) if("underwear") underwear = random_underwear(gender) if("eyes") eye_color = random_eye_color() if("s_tone") skin_tone = random_skin_tone() if("bag") backbag = rand(1,3) if("all") random_character() if("input") switch(href_list["preference"]) if("ghostform") if(unlock_content) var/new_form = input(user, "Thanks for supporting BYOND - Choose your ghostly form:","Thanks for supporting BYOND",null) as null|anything in ghost_forms if(new_form) ghost_form = new_form 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("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("hair") var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as null|color if(new_hair) hair_color = sanitize_hexcolor(new_hair) if("hair_style") var/new_hair_style if(gender == MALE) new_hair_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in hair_styles_male_list else new_hair_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in hair_styles_female_list if(new_hair_style) hair_style = new_hair_style if("facial") var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference") as null|color if(new_facial) facial_hair_color = sanitize_hexcolor(new_facial) if("facial_hair_style") var/new_facial_hair_style if(gender == MALE) new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in facial_hair_styles_male_list else new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in facial_hair_styles_female_list if(new_facial_hair_style) facial_hair_style = new_facial_hair_style if("underwear") var/new_underwear if(gender == MALE) new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_m else new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_f if(new_underwear) underwear = new_underwear if("eyes") var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") as color|null if(new_eyes) eye_color = sanitize_hexcolor(new_eyes) if("species") var/result = input(user, "Select a species", "Species Selection") as null|anything in roundstart_species if(result) var/newtype = roundstart_species[result] pref_species = new newtype() if(!config.mutant_colors || mutant_color == "#000") mutant_color = pref_species.default_color if("mutant_color") if(!config.mutant_colors) user << "Alien colors are disabled." return var/new_mutantcolor = input(user, "Choose your character's alien skin color:", "Character Preference") as color|null if(new_mutantcolor) var/temp_hsv = RGBtoHSV(new_mutantcolor) if(new_mutantcolor == "#000000") mutant_color = pref_species.default_color else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright mutant_color = sanitize_hexcolor(new_mutantcolor) else user << "Invalid color. Your color is not bright enough." if("s_tone") var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones if(new_s_tone) skin_tone = new_s_tone if("ooccolor") var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference") as color|null if(new_ooccolor) ooccolor = sanitize_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) 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) facial_hair_style = random_facial_hair_style(gender) hair_style = random_hair_style(gender) if("hear_adminhelps") toggles ^= SOUND_ADMINHELP if("ui") switch(UI_style) if("Midnight") UI_style = "Plasmafire" if("Plasmafire") UI_style = "Retro" else UI_style = "Midnight" if("be_special") var/num = text2num(href_list["num"]) be_special ^= (1< 3 || 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 */