//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. // TODO: Update to new antagonist system. "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 "positronic brain" = 1, // 7 "cultist" = IS_MODE_COMPILED("cult"), // 8 "infested monkey" = IS_MODE_COMPILED("monkey"), // 9 "ninja" = "true", // 10 "raider" = IS_MODE_COMPILED("heist"), // 11 "diona" = 1, // 12 "mutineer" = IS_MODE_COMPILED("mutiny"), // 13 "pAI candidate" = 1, // -- TLE // 14 ) //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 = "#010000" //Whatever this is set to acts as 'reset' color and is thus unusable as an actual custom color var/be_special = 0 //Special role selection var/UI_style = "Midnight" var/toggles = TOGGLES_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/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2). var/b_type = "A+" //blood type (not-chooseable) var/underwear //underwear type var/undershirt //undershirt 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 tone var/r_skin = 0 //Skin color var/g_skin = 0 //Skin color var/b_skin = 0 //Skin color var/r_eyes = 0 //Eye color var/g_eyes = 0 //Eye color var/b_eyes = 0 //Eye color var/species = "Human" //Species datum to use. var/species_preview //Used for the species selection window. var/language = "None" //Secondary language var/list/gear //Custom/fluff item loadout. //Some faction information. var/home_system = "Unset" //System of birth. var/citizenship = "None" //Current home system. var/faction = "None" //Antag faction/general associated faction. var/religion = "None" //Religious association. //Mob preview var/mob/living/carbon/human/dummy //the mannequin 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 //Keeps track of preferrence for not getting any wanted jobs var/alternate_option = 0 var/used_skillpoints = 0 var/skill_specialization = null var/list/skills = list() // skills can range from 0 to 3 // 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/rlimb_data = list() var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor" var/list/flavor_texts = list() var/list/flavour_texts_robot = list() var/med_record = "" var/sec_record = "" var/gen_record = "" var/exploit_record = "" var/disabilities = 0 var/nanotrasen_relation = "Neutral" var/uplinklocation = "PDA" // OOC Metadata: var/metadata = "" var/slot_name = "" /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,species) gear = list() /datum/preferences/proc/ZeroSkills(var/forced = 0) for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V]) if(!skills.Find(S.ID) || forced) skills[S.ID] = SKILL_NONE /datum/preferences/proc/CalculateSkillPoints() used_skillpoints = 0 for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V]) var/multiplier = 1 switch(skills[S.ID]) if(SKILL_NONE) used_skillpoints += 0 * multiplier if(SKILL_BASIC) used_skillpoints += 1 * multiplier if(SKILL_ADEPT) // secondary skills cost less if(S.secondary) used_skillpoints += 1 * multiplier else used_skillpoints += 3 * multiplier if(SKILL_EXPERT) // secondary skills cost less if(S.secondary) used_skillpoints += 3 * multiplier else used_skillpoints += 6 * multiplier /datum/preferences/proc/GetSkillClass(points) return CalculateSkillClass(points, age) /proc/CalculateSkillClass(points, age) if(points <= 0) return "Unconfigured" // skill classes describe how your character compares in total points points -= min(round((age - 20) / 2.5), 4) // every 2.5 years after 20, one extra skillpoint if(age > 30) points -= round((age - 30) / 5) // every 5 years after 30, one extra skillpoint switch(points) if(-1000 to 3) return "Terrifying" if(4 to 6) return "Below Average" if(7 to 10) return "Average" if(11 to 14) return "Above Average" if(15 to 18) return "Exceptional" if(19 to 24) return "Genius" if(24 to 1000) return "God" /datum/preferences/proc/SetSkills(mob/user) if(SKILLS == null) setup_skills() if(skills.len == 0) ZeroSkills() var/HTML = "" HTML += "Select your Skills
" HTML += "Current skill level: [GetSkillClass(used_skillpoints)] ([used_skillpoints])
" HTML += "Use preconfigured skillset
" HTML += "" for(var/V in SKILLS) HTML += "" for(var/datum/skill/S in SKILLS[V]) var/level = skills[S.ID] HTML += "" HTML += "" HTML += "" // secondary skills don't have an amateur level if(S.secondary) HTML += "" else HTML += "" HTML += "" HTML += "" HTML += "" HTML += "
[V]" HTML += "
[S.name]\[Untrained\]\[Amateur\]\[Trained\]\[Professional\]
" HTML += "\[Done\]" user << browse(null, "window=preferences") user << browse(HTML, "window=show_skills;size=600x800") return /datum/preferences/proc/ShowChoices(mob/user) if(!user || !user.client) return update_preview_icon() if(preview_icon_front && preview_icon_side) user << browse_rsc(preview_icon_front, "previewicon.png") user << browse_rsc(preview_icon_side, "previewicon2.png") var/dat = "
" if(path) dat += "
" dat += "Slot [slot_name] - " dat += "Load slot - " dat += "Save slot - " dat += "Reload slot" dat += "
" else dat += "Please create an account to save your preferences." dat += "

" 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 += "
" dat += "UI Style: [UI_style]
" dat += "Custom UI(recommended for White UI):
" dat += "-Color: [UI_style_color]
__

" dat += "-Alpha(transparency): [UI_style_alpha]
" dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
" dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" if(config.allow_Metadata) dat += "OOC Notes: Edit
" dat += "
Custom Loadout: " var/total_cost = 0 if(!islist(gear)) gear = list() if(gear && gear.len) dat += "
" for(var/i = 1; i <= gear.len; i++) var/datum/gear/G = gear_datums[gear[i]] if(G) total_cost += G.cost dat += "[gear[i]] ([G.cost] points) \[remove\]
" dat += "Used: [total_cost] points." else dat += "none." if(total_cost < MAX_GEAR_COST) dat += " \[add\]" if(gear && gear.len) dat += " \[clear\]" dat += "

Occupation Choices
" dat += "\tSet Preferences
" dat += "
Body " dat += "(®)" dat += "
" dat += "Species: [species]
" dat += "Secondary Language:
[language]
" dat += "Blood Type: [b_type]
" dat += "Skin Tone: [-s_tone + 35]/220
" //dat += "Skin pattern: Adjust
" dat += "Needs Glasses: [disabilities == 0 ? "No" : "Yes"]
" 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 += ", " 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 += "

" var/list/undies = gender == MALE ? underwear_m : underwear_f dat += "Underwear: [get_key_by_value(undies,underwear)]
" dat += "Undershirt: [get_key_by_value(undershirt_t,undershirt)]
" 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 Antag Options
" dat += "\tSet Skills ([GetSkillClass(used_skillpoints)] [used_skillpoints > 0 ? "[used_skillpoints]" : "0"])
" dat += "Set Flavor Text
" dat += "Set Robot Flavour Text
" dat += "pAI Configuration
" 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 += "
Body Color
" dat += "Change Color
__
" dat += "

Background Information
" dat += "Home system: [home_system]
" dat += "Citizenship: [citizenship]
" dat += "Faction: [faction]
" dat += "Religion: [religion]
" 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) || (i == "positronic brain" && jobban_isbanned(user, "AI") && jobban_isbanned(user, "Cyborg")) || (i == "pAI candidate" && 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=560x736") /datum/preferences/proc/SetChoices(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer"), width = 550, height = 660) 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 += "Choose occupation chances
Unavailable occupations are crossed out.

" HTML += "
\[Done\]

" // Easier to press up here. 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 += "
  
" 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 += "" 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]" if(job.alt_titles) HTML += "" HTML += "" HTML += "
" var/rank = job.title lastJob = job if(jobban_isbanned(user, rank)) HTML += "[rank] \[BANNED]
\[IN [(available_in_days)] DAYS]
" HTML += "" if(rank == "Assistant")//Assistant is special if(job_civilian_low & ASSISTANT) HTML += " \[Yes]" else HTML += " \[No]" if(job.alt_titles) //Blatantly cloned from a few lines down. HTML += "
 \[[GetPlayerAltTitle(job)]\]
 \[[GetPlayerAltTitle(job)]\]
" 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]") return /datum/preferences/proc/SetDisabilities(mob/user) var/HTML = "" HTML += "
" HTML += "Choose disabilities
" HTML += "Need Glasses? [disabilities & (1<<0) ? "Yes" : "No"]
" HTML += "Seizures? [disabilities & (1<<1) ? "Yes" : "No"]
" HTML += "Coughing? [disabilities & (1<<2) ? "Yes" : "No"]
" HTML += "Tourettes/Twitching? [disabilities & (1<<3) ? "Yes" : "No"]
" HTML += "Nervousness? [disabilities & (1<<4) ? "Yes" : "No"]
" HTML += "Deafness? [disabilities & (1<<5) ? "Yes" : "No"]
" HTML += "
" HTML += "\[Done\]" HTML += "
" 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
" HTML += TextPreview(med_record,40) HTML += "

Employment Records
" HTML += TextPreview(gen_record,40) HTML += "

Security Records
" HTML += TextPreview(sec_record,40) HTML += "
" HTML += "\[Done\]" HTML += "
" user << browse(null, "window=preferences") user << browse(HTML, "window=records;size=350x300") return /datum/preferences/proc/SetSpecies(mob/user) if(!species_preview || !(species_preview in all_species)) species_preview = "Human" var/datum/species/current_species = all_species[species_preview] var/dat = "" dat += "

[current_species.name] \[change\]


" dat += "" dat += "" dat += "" dat += "" dat += "" dat += "
[current_species.blurb]" if("preview" in icon_states(current_species.icobase)) usr << browse_rsc(icon(current_species.icobase,"preview"), "species_preview_[current_species.name].png") dat += "

" dat += "Language: [current_species.language]
" dat += "" if(current_species.flags & CAN_JOIN) dat += "
Often present on human stations." if(current_species.flags & IS_WHITELISTED) dat += "
Whitelist restricted." if(current_species.flags & NO_BLOOD) dat += "
Does not have blood." if(current_species.flags & NO_BREATHE) dat += "
Does not breathe." if(current_species.flags & NO_SCAN) dat += "
Does not have DNA." if(current_species.flags & NO_PAIN) dat += "
Does not feel pain." if(current_species.flags & NO_SLIP) dat += "
Has excellent traction." if(current_species.flags & NO_POISON) dat += "
Immune to most poisons." if(current_species.flags & HAS_SKIN_TONE) dat += "
Has a variety of skin tones." if(current_species.flags & HAS_SKIN_COLOR) dat += "
Has a variety of skin colours." if(current_species.flags & HAS_EYE_COLOR) dat += "
Has a variety of eye colours." if(current_species.flags & IS_PLANT) dat += "
Has a plantlike physiology." dat += "

" var/restricted = 0 if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! if(!(current_species.flags & CAN_JOIN)) restricted = 2 else if((current_species.flags & IS_WHITELISTED) && !is_alien_whitelisted(user,current_species)) restricted = 1 if(restricted) if(restricted == 1) dat += "You cannot play as this species.
If you wish to be whitelisted, you can make an application post on the forums.

" else if(restricted == 2) dat += "You cannot play as this species.
This species is not available for play as a station race..

" if(!restricted || check_rights(R_ADMIN, 0)) dat += "\[select\]" dat += "
" user << browse(null, "window=preferences") user << browse(dat, "window=species;size=700x400") /datum/preferences/proc/SetAntagoptions(mob/user) if(uplinklocation == "" || !uplinklocation) uplinklocation = "PDA" var/HTML = "" HTML += "
" HTML += "Antagonist Options
" HTML += "
" HTML +="Uplink Type : [uplinklocation]" HTML +="
" HTML +="Exploitable information about you : " HTML += "
" if(jobban_isbanned(user, "Records")) HTML += "You are banned from using character records.
" else HTML +="[TextPreview(exploit_record,40)]" HTML +="
" HTML +="
" HTML +="\[Done\]" HTML += "
" user << browse(null, "window=preferences") user << browse(HTML, "window=antagoptions") return /datum/preferences/proc/SetFlavorText(mob/user) var/HTML = "" HTML += "
" HTML += "Set Flavour Text
" HTML += "
" HTML += "General: " HTML += TextPreview(flavor_texts["general"]) HTML += "
" HTML += "Head: " HTML += TextPreview(flavor_texts["head"]) HTML += "
" HTML += "Face: " HTML += TextPreview(flavor_texts["face"]) HTML += "
" HTML += "Eyes: " HTML += TextPreview(flavor_texts["eyes"]) HTML += "
" HTML += "Body: " HTML += TextPreview(flavor_texts["torso"]) HTML += "
" HTML += "Arms: " HTML += TextPreview(flavor_texts["arms"]) HTML += "
" HTML += "Hands: " HTML += TextPreview(flavor_texts["hands"]) HTML += "
" HTML += "Legs: " HTML += TextPreview(flavor_texts["legs"]) HTML += "
" HTML += "Feet: " HTML += TextPreview(flavor_texts["feet"]) HTML += "
" HTML += "
" HTML +="\[Done\]" HTML += "" user << browse(null, "window=preferences") user << browse(HTML, "window=flavor_text;size=430x300") return /datum/preferences/proc/SetFlavourTextRobot(mob/user) var/HTML = "" HTML += "
" HTML += "Set Robot Flavour Text
" HTML += "
" HTML += "Default: " HTML += TextPreview(flavour_texts_robot["Default"]) HTML += "
" for(var/module in robot_module_types) HTML += "[module]: " HTML += TextPreview(flavour_texts_robot[module]) HTML += "
" HTML += "
" HTML +="\[Done\]" HTML += "" user << browse(null, "window=preferences") user << browse(HTML, "window=flavour_text_robot;size=430x300") 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 == "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 /datum/preferences/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 /datum/preferences/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 /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_civilian_high = 0 job_medsci_high = 0 job_engsec_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_civilian_high = 0 job_medsci_high = 0 job_engsec_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 return 1 /datum/preferences/proc/process_link(mob/user, list/href_list) if(!user) return if(!istype(user, /mob/new_player)) return if(href_list["preference"] == "open_whitelist_forum") if(config.forumurl) user << link(config.forumurl) else user << "The forum URL is not set in the server configuration." 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"]) else SetChoices(user) return 1 else if(href_list["preference"] == "skills") if(href_list["cancel"]) user << browse(null, "window=show_skills") ShowChoices(user) else if(href_list["skillinfo"]) var/datum/skill/S = locate(href_list["skillinfo"]) var/HTML = "[S.name]
[S.desc]" user << browse(HTML, "window=\ref[user]skillinfo") else if(href_list["setskill"]) var/datum/skill/S = locate(href_list["setskill"]) var/value = text2num(href_list["newvalue"]) skills[S.ID] = value CalculateSkillPoints() SetSkills(user) else if(href_list["preconfigured"]) var/selected = input(user, "Select a skillset", "Skillset") as null|anything in SKILL_PRE if(!selected) return ZeroSkills(1) for(var/V in SKILL_PRE[selected]) if(V == "field") skill_specialization = SKILL_PRE[selected]["field"] continue skills[V] = SKILL_PRE[selected][V] CalculateSkillPoints() SetSkills(user) else if(href_list["setspecialization"]) skill_specialization = href_list["setspecialization"] CalculateSkillPoints() SetSkills(user) else SetSkills(user) return 1 else if (href_list["preference"] == "loadout") if(href_list["task"] == "input") var/list/valid_gear_choices = list() for(var/gear_name in gear_datums) var/datum/gear/G = gear_datums[gear_name] if(G.whitelisted && !is_alien_whitelisted(user, G.whitelisted)) continue valid_gear_choices += gear_name var/choice = input(user, "Select gear to add: ") as null|anything in valid_gear_choices if(choice && gear_datums[choice]) var/total_cost = 0 if(isnull(gear) || !islist(gear)) gear = list() if(gear && gear.len) for(var/gear_name in gear) if(gear_datums[gear_name]) var/datum/gear/G = gear_datums[gear_name] total_cost += G.cost var/datum/gear/C = gear_datums[choice] total_cost += C.cost if(C && total_cost <= MAX_GEAR_COST) gear += choice user << "Added \the '[choice]' for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)." else user << "Adding \the '[choice]' will exceed the maximum loadout cost of [MAX_GEAR_COST] points." else if(href_list["task"] == "remove") var/i_remove = text2num(href_list["gear"]) if(i_remove < 1 || i_remove > gear.len) return gear.Cut(i_remove, i_remove + 1) else if(href_list["task"] == "clear") gear.Cut() else if(href_list["preference"] == "flavor_text") switch(href_list["task"]) if("open") SetFlavorText(user) return if("done") user << browse(null, "window=flavor_text") ShowChoices(user) return if("general") var/msg = sanitize(input(usr,"Give a general description of your character. This will be shown regardless of clothing, and may include OOC notes and preferences.","Flavor Text",html_decode(flavor_texts[href_list["task"]])) as message, extra = 0) flavor_texts[href_list["task"]] = msg else var/msg = sanitize(input(usr,"Set the flavor text for your [href_list["task"]].","Flavor Text",html_decode(flavor_texts[href_list["task"]])) as message, extra = 0) flavor_texts[href_list["task"]] = msg SetFlavorText(user) return else if(href_list["preference"] == "flavour_text_robot") switch(href_list["task"]) if("open") SetFlavourTextRobot(user) return if("done") user << browse(null, "window=flavour_text_robot") ShowChoices(user) return if("Default") var/msg = sanitize(input(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(flavour_texts_robot["Default"])) as message, extra = 0) flavour_texts_robot[href_list["task"]] = msg else var/msg = sanitize(input(usr,"Set the flavour text for your robot with [href_list["task"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(flavour_texts_robot[href_list["task"]])) as message, extra = 0) flavour_texts_robot[href_list["task"]] = msg SetFlavourTextRobot(user) return else if(href_list["preference"] == "pAI") paiController.recruitWindow(user, 0) 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 = sanitize(input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message, MAX_PAPER_MESSAGE_LEN, extra = 0) if(medmsg != null) med_record = medmsg SetRecords(user) if(href_list["task"] == "sec_record") var/secmsg = sanitize(input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message, MAX_PAPER_MESSAGE_LEN, extra = 0) if(secmsg != null) sec_record = secmsg SetRecords(user) if(href_list["task"] == "gen_record") var/genmsg = sanitize(input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message, MAX_PAPER_MESSAGE_LEN, extra = 0) if(genmsg != null) gen_record = genmsg SetRecords(user) if(href_list["task"] == "exploitable_record") var/exploitmsg = sanitize(input(usr,"Set exploitable information about you here.","Exploitable Information",html_decode(exploit_record)) as message, MAX_PAPER_MESSAGE_LEN, extra = 0) if(exploitmsg != null) exploit_record = exploitmsg SetAntagoptions(user) else if (href_list["preference"] == "antagoptions") if(text2num(href_list["active"]) == 0) SetAntagoptions(user) return if (href_list["antagtask"] == "uplinktype") if (uplinklocation == "PDA") uplinklocation = "Headset" else if(uplinklocation == "Headset") uplinklocation = "None" else uplinklocation = "PDA" SetAntagoptions(user) if (href_list["antagtask"] == "done") user << browse(null, "window=antagoptions") ShowChoices(user) return 1 else if (href_list["preference"] == "loadout") if(href_list["task"] == "input") var/list/valid_gear_choices = list() for(var/gear_name in gear_datums) var/datum/gear/G = gear_datums[gear_name] if(G.whitelisted && !is_alien_whitelisted(user, G.whitelisted)) continue valid_gear_choices += gear_name var/choice = input(user, "Select gear to add: ") as null|anything in valid_gear_choices if(choice && gear_datums[choice]) var/total_cost = 0 if(isnull(gear) || !islist(gear)) gear = list() if(gear && gear.len) for(var/gear_name in gear) if(gear_datums[gear_name]) var/datum/gear/G = gear_datums[gear_name] total_cost += G.cost var/datum/gear/C = gear_datums[choice] total_cost += C.cost if(C && total_cost <= MAX_GEAR_COST) gear += choice user << "\blue Added [choice] for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)." else user << "\red That item will exceed the maximum loadout cost of [MAX_GEAR_COST] points." else if(href_list["task"] == "remove") if(isnull(gear) || !islist(gear)) gear = list() if(!gear.len) return var/choice = input(user, "Select gear to remove: ") as null|anything in gear if(!choice) return for(var/gear_name in gear) if(gear_name == choice) gear -= gear_name break switch(href_list["task"]) if("change") if(href_list["preference"] == "species") // Actual whitelist checks are handled elsewhere, this is just for accessing the preview window. var/choice = input("Which species would you like to look at?") as null|anything in playable_species if(!choice) return species_preview = choice SetSpecies(user) if("random") switch(href_list["preference"]) if("name") real_name = random_name(gender,species) 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") var/r = pick(underwear_m) underwear = underwear_m[r] ShowChoices(user) if("undershirt") var/r = pick(undershirt_t) undershirt = undershirt_t[r] 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("s_color") 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") randomize_appearance_for() //no params needed 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 = sanitizeName(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") user << browse(null, "window=species") var/prev_species = species species = href_list["newspecies"] 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") var/datum/species/S = all_species[species] 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 ))||(S && (L in S.secondary_langs)))) 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(new_metadata) 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 == "Tajara" || species == "Skrell") var/new_hair = input(user, "Choose your character's hair colour:", "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("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") 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[new_underwear] ShowChoices(user) if("undershirt") var/list/undershirt_options undershirt_options = undershirt_t var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_options if (new_undershirt) undershirt = undershirt_options[new_undershirt] ShowChoices(user) 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 == "Unathi" || species == "Tajara" || species == "Skrell") 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") 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("disabilities") if(text2num(href_list["disabilities"]) >= -1) if(text2num(href_list["disabilities"]) >= 0) disabilities ^= (1<= 50)) return UI_style_alpha = UI_style_alpha_new if("be_special") var/num = text2num(href_list["num"]) be_special ^= (1< 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 /datum/preferences/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<= config.character_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") /datum/preferences/proc/close_load_dialog(mob/user) user << browse(null, "window=saves")