mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 11:05:03 +01:00
cf86c755d6
-Made a 'default' save slot (D), and whenever you connect it automatically selects the default slot to load from, but manually selecting a different slot will allow you to play on that one before it returns to default. -Added the ability to name your save slots with the '*'. Names can be up to 16 characters and contain letters, numbers, and basic symbols -The preview icon on the preference screen now takes into account any job you have set on high, and dresses up the icon accordingly. If assistant is set to 'yes', or AI/Cyborg are on high it will put the icon in a grey suit (So you can still customize). Solves Issue 667 as well I tested a good bit with other people's saves, so I'm pretty confident it won't bork savefiles. And before anyone asks, the icon blending didn't make any noticeable lag, since icon procs are client-side. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4159 316c924e-a436-60f5-8080-3fe189b3f50e
824 lines
28 KiB
Plaintext
824 lines
28 KiB
Plaintext
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
|
|
|
|
#define UI_OLD 0
|
|
#define UI_NEW 1
|
|
|
|
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
|
|
)
|
|
|
|
var/const/BE_TRAITOR =(1<<0)
|
|
var/const/BE_OPERATIVE =(1<<1)
|
|
var/const/BE_CHANGELING=(1<<2)
|
|
var/const/BE_WIZARD =(1<<3)
|
|
var/const/BE_MALF =(1<<4)
|
|
var/const/BE_REV =(1<<5)
|
|
var/const/BE_ALIEN =(1<<6)
|
|
var/const/BE_PAI =(1<<7)
|
|
var/const/BE_CULTIST =(1<<8)
|
|
var/const/BE_MONKEY =(1<<9)
|
|
|
|
|
|
var/const/MAX_SAVE_SLOTS = 3
|
|
|
|
|
|
datum/preferences
|
|
|
|
var/real_name
|
|
var/be_random_name = 0
|
|
var/gender = MALE
|
|
var/age = 30.0
|
|
var/b_type = "A+"
|
|
|
|
//Special role selection
|
|
var/be_special = 0
|
|
//Play admin midis
|
|
var/midis = 1
|
|
//Toggle ghost ears
|
|
var/ghost_ears = 1
|
|
var/ghost_sight = 1
|
|
//Saved changlog filesize to detect if there was a change
|
|
var/lastchangelog = 0
|
|
|
|
//Just like it sounds
|
|
var/ooccolor = "#b82e00"
|
|
var/underwear = 1
|
|
var/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "Love-Hearts", "Black2", "Grey2", "Stripey", "Kinky", "None") //Curse whoever made male/female underwear diffrent colours
|
|
var/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "Babydoll", "Baby-Blue", "Green", "Pink", "Kinky", "None")
|
|
var/backbag = 2
|
|
var/list/backbaglist = list("Nothing", "Backpack", "Satchel")
|
|
|
|
//Hair type
|
|
var/h_style = "Short Hair"
|
|
var/datum/sprite_accessory/hair/hair_style
|
|
//Hair color
|
|
var/r_hair = 0
|
|
var/g_hair = 0
|
|
var/b_hair = 0
|
|
|
|
//Face hair type
|
|
var/f_style = "Shaved"
|
|
var/datum/sprite_accessory/facial_hair/facial_hair_style
|
|
//Face hair color
|
|
var/r_facial = 0
|
|
var/g_facial = 0
|
|
var/b_facial = 0
|
|
|
|
//Skin color
|
|
var/s_tone = 0
|
|
|
|
//Eye color
|
|
var/r_eyes = 0
|
|
var/g_eyes = 0
|
|
var/b_eyes = 0
|
|
|
|
//UI style
|
|
//UI = UI_OLD
|
|
var/UI_style = "Midnight"
|
|
|
|
//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 less assistants!
|
|
var/default_slot = 1//Holder so it doesn't default to slot 1, rather the last one used
|
|
var/slot_name = ""
|
|
|
|
// OOC Metadata:
|
|
var/metadata = ""
|
|
|
|
var/sound_adminhelp = 0
|
|
|
|
|
|
|
|
New()
|
|
hair_style = new/datum/sprite_accessory/hair/short
|
|
facial_hair_style = new/datum/sprite_accessory/facial_hair/shaved
|
|
randomize_name()
|
|
..()
|
|
|
|
|
|
proc/ShowChoices(mob/user)
|
|
update_preview_icon()
|
|
user << browse_rsc(preview_icon_front, "previewicon.png")
|
|
user << browse_rsc(preview_icon_side, "previewicon2.png")
|
|
var/dat = "<html><body><center>"
|
|
|
|
|
|
if(!IsGuestKey(user.key))
|
|
var/list/saves = list()
|
|
var/n = null
|
|
for(var/i = 1; i <= MAX_SAVE_SLOTS; i += 1)
|
|
var/savefile/F = new /savefile("data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/preferences[i].sav")
|
|
F["slotname"] >> n
|
|
if((n == "") || !n)
|
|
saves += "<a href=\"byond://?src=\ref[user];preferences=1;changeslot=[i]\">Save Slot [i]</a>"
|
|
else
|
|
saves += "<a href=\"byond://?src=\ref[user];preferences=1;changeslot=[i]\">[n]</a>"
|
|
|
|
for(var/i = 1; i <= MAX_SAVE_SLOTS; i += 1)
|
|
if(i == user.client.activeslot)
|
|
if((slot_name == "") || (!slot_name))
|
|
dat += "Save Slot [i]"
|
|
else
|
|
dat += "[slot_name]"
|
|
else
|
|
dat += "[saves[i]]"
|
|
if(i == default_slot)
|
|
dat += "(D)"
|
|
else
|
|
dat += "<a href=\"byond://?src=\ref[user];preferences=1;defaultslot=[i]\">(D)</a>"
|
|
|
|
if(i != MAX_SAVE_SLOTS)
|
|
dat += " / "
|
|
dat += "<br>"
|
|
dat += "<a href=\"byond://?src=\ref[user];preferences=1;slotname=input\">*</a>"
|
|
|
|
else
|
|
dat += "Please create an account to save your preferences."
|
|
|
|
dat += "</center><hr><table><tr><td width='300px' height='300px'>"
|
|
|
|
dat += "<b>Name:</b> "
|
|
dat += "<a href=\"byond://?src=\ref[user];preferences=1;real_name=input\"><b>[real_name]</b></a> "
|
|
dat += "(<a href=\"byond://?src=\ref[user];preferences=1;real_name=random\">®</A>) "
|
|
dat += "(® = <a href=\"byond://?src=\ref[user];preferences=1;b_random_name=1\">[be_random_name ? "Yes" : "No"]</a>)"
|
|
dat += "<br>"
|
|
|
|
dat += "<b>Gender:</b> <a href=\"byond://?src=\ref[user];preferences=1;gender=input\"><b>[gender == MALE ? "Male" : "Female"]</b></a><br>"
|
|
dat += "<b>Age:</b> <a href='byond://?src=\ref[user];preferences=1;age=input'>[age]</a>"
|
|
|
|
dat += "<br>"
|
|
dat += "<b>UI Style:</b> <a href=\"byond://?src=\ref[user];preferences=1;UI=input\"><b>[UI_style]</b></a><br>"
|
|
dat += "<b>Play admin midis:</b> <a href=\"byond://?src=\ref[user];preferences=1;midis=input\"><b>[midis == 1 ? "Yes" : "No"]</b></a><br>"
|
|
dat += "<b>Ghost ears:</b> <a href=\"byond://?src=\ref[user];preferences=1;ghost_ears=input\"><b>[ghost_ears == 0 ? "Nearest Creatures" : "All Speech"]</b></a><br>"
|
|
dat += "<b>Ghost sight:</b> <a href=\"byond://?src=\ref[user];preferences=1;ghost_sight=input\"><b>[ghost_sight == 0 ? "Nearest Creatures" : "All Emotes"]</b></a><br>"
|
|
|
|
if(config.allow_Metadata)
|
|
dat += "<b>OOC Notes:</b> <a href='byond://?src=\ref[user];preferences=1;OOC=input'> Edit </a><br>"
|
|
|
|
if((user.client) && (user.client.holder) && (user.client.holder.rank))
|
|
dat += "<b>Adminhelp sound</b>: "
|
|
dat += "[(sound_adminhelp)?"On":"Off"] <a href='byond://?src=\ref[user];preferences=1;toggleadminhelpsound=1'>toggle</a><br>"
|
|
|
|
if(user.client.holder.level >= 5)
|
|
dat += "<br><b>OOC</b><br>"
|
|
dat += "<a href='byond://?src=\ref[user];preferences=1;ooccolor=input'>Change color</a> <font face=\"fixedsys\" size=\"3\" color=\"[ooccolor]\"><table style='display:inline;' bgcolor=\"[ooccolor]\"><tr><td>__</td></tr></table></font><br>"
|
|
|
|
dat += "<br><b>Occupation Choices</b><br>"
|
|
dat += "\t<a href=\"byond://?src=\ref[user];preferences=1;occ=1\"><b>Set Preferences</b></a><br>"
|
|
|
|
dat += "<br><table><tr><td><b>Body</b> "
|
|
dat += "(<a href=\"byond://?src=\ref[user];preferences=1;s_tone=random;underwear=random;backbag_type=random;age=random;b_type=random;hair=random;h_style=random;facial=random;f_style=random;eyes=random\">®</A>)" // Random look
|
|
dat += "<br>"
|
|
dat += "Blood Type: <a href='byond://?src=\ref[user];preferences=1;b_type=input'>[b_type]</a><br>"
|
|
dat += "Skin Tone: <a href='byond://?src=\ref[user];preferences=1;s_tone=input'>[-s_tone + 35]/220<br></a>"
|
|
|
|
// if(!IsGuestKey(user.key))//Seeing as it doesn't do anything, it may as well not show up.
|
|
if(gender == MALE)
|
|
dat += "Underwear: <a href =\"byond://?src=\ref[user];preferences=1;underwear=inputmale\"><b>[underwear_m[underwear]]</b></a><br>"
|
|
else
|
|
dat += "Underwear: <a href =\"byond://?src=\ref[user];preferences=1;underwear=inputfemale\"><b>[underwear_f[underwear]]</b></a><br>"
|
|
|
|
dat += "Backpack Type:<br><a href =\"byond://?src=\ref[user];preferences=1;backbag_type=input\"><b>[backbaglist[backbag]]</b></a><br>"
|
|
|
|
dat += "</td><td><b>Preview</b><br><img src=previewicon.png height=64 width=64><img src=previewicon2.png height=64 width=64></td></tr></table>" //Carn: Now with profile!
|
|
|
|
dat += "</td><td width='300px' height='300px'>"
|
|
|
|
dat += "<br><b>Hair</b><br>"
|
|
|
|
dat += "<a href='byond://?src=\ref[user];preferences=1;hair=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair, 2)]\"><table style='display:inline;' bgcolor=\"#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair)]\"><tr><td>__</td></tr></table></font> "
|
|
|
|
dat += "Style: <a href='byond://?src=\ref[user];preferences=1;h_style=input'>[h_style]</a><br>"
|
|
|
|
dat += "<br><b>Facial</b><br>"
|
|
|
|
dat += "<a href='byond://?src=\ref[user];preferences=1;facial=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_facial, 2)][num2hex(g_facial, 2)][num2hex(b_facial, 2)]\"><table style='display:inline;' bgcolor=\"#[num2hex(r_facial, 2)][num2hex(g_facial, 2)][num2hex(b_facial)]\"><tr><td>__</td></tr></table></font> "
|
|
|
|
dat += "Style: <a href='byond://?src=\ref[user];preferences=1;f_style=input'>[f_style]</a><br>"
|
|
|
|
dat += "<br><b>Eyes</b><br>"
|
|
dat += "<a href='byond://?src=\ref[user];preferences=1;eyes=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes, 2)]\"><table style='display:inline;' bgcolor=\"#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes)]\"><tr><td>__</td></tr></table></font>"
|
|
|
|
dat += "<br><br>"
|
|
if(jobban_isbanned(user, "Syndicate"))
|
|
dat += "<b>You are banned from antagonist roles.</b>"
|
|
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 += "<b>Be [i]:</b> <font color=red><b> \[BANNED]</b></font><br>"
|
|
else if(i == "pai candidate")
|
|
if(jobban_isbanned(user, "pAI"))
|
|
dat += "<b>Be [i]:</b> <font color=red><b> \[BANNED]</b></font><br>"
|
|
else
|
|
dat += "<b>Be [i]:</b> <a href=\"byond://?src=\ref[user];preferences=1;be_special=[n]\"><b>[src.be_special&(1<<n) ? "Yes" : "No"]</b></a><br>"
|
|
n++
|
|
dat += "</td></tr></table><hr><center>"
|
|
|
|
if(!IsGuestKey(user.key))
|
|
dat += "<a href='byond://?src=\ref[user];preferences=1;load=1'>Undo</a> - "
|
|
dat += "<a href='byond://?src=\ref[user];preferences=1;save=1'>Save Setup</a> - "
|
|
|
|
dat += "<a href='byond://?src=\ref[user];preferences=1;reset_all=1'>Reset Setup</a>"
|
|
dat += "</center></body></html>"
|
|
|
|
user << browse(dat, "window=preferences;size=550x545")
|
|
|
|
proc/SetChoices(mob/user, limit = 17, list/splitJobs = list("Chief Engineer"), width = 550, height = 500)
|
|
//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 = "<body>"
|
|
HTML += "<tt><center>"
|
|
HTML += "<b>Choose occupation chances</b><br>Unavailable occupations are in red.<br><br>"
|
|
HTML += "<a align='center' href=\"byond://?src=\ref[user];preferences=1;occ=0;job=cancel\">\[Done\]</a><br><br>" // Easier to press up here.
|
|
HTML += "<table width='100%' cellpadding='1' cellspacing='0'><tr><td width='20%'>" // Table within a table for alignment, also allows you to easily add more colomns.
|
|
HTML += "<table width='100%' cellpadding='1' cellspacing='0'>"
|
|
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))
|
|
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 += "<tr bgcolor='[lastJob.selection_color]'><td width='60%' align='right'><a> </a></td><td><a> </a></td></tr>"
|
|
HTML += "</table></td><td width='20%'><table width='100%' cellpadding='1' cellspacing='0'>"
|
|
index = 0
|
|
|
|
HTML += "<tr bgcolor='[job.selection_color]'><td width='60%' align='right'>"
|
|
var/rank = job.title
|
|
lastJob = job
|
|
if(jobban_isbanned(user, rank))
|
|
HTML += "<font color=red>[rank]</font></td><td><font color=red><b> \[BANNED]</b></font></td></tr>"
|
|
continue
|
|
if((job_civilian_low & ASSISTANT) && (rank != "Assistant"))
|
|
HTML += "<font color=orange>[rank]</font></td><td></td></tr>"
|
|
continue
|
|
if((rank in command_positions) || (rank == "AI"))//Bold head jobs
|
|
HTML += "<b>[rank]</b>"
|
|
else
|
|
HTML += "[rank]"
|
|
|
|
HTML += "</td><td width='40%'>"
|
|
|
|
HTML += "<a href=\"byond://?src=\ref[user];preferences=1;occ=1;job=[rank]\">"
|
|
|
|
if(rank == "Assistant")//Assistant is special
|
|
if(job_civilian_low & ASSISTANT)
|
|
HTML += " <font color=green>\[Yes]</font>"
|
|
else
|
|
HTML += " <font color=red>\[No]</font>"
|
|
HTML += "</a></td></tr>"
|
|
continue
|
|
|
|
if(GetJobDepartment(job, 1) & job.flag)
|
|
HTML += " <font color=blue>\[High]</font>"
|
|
else if(GetJobDepartment(job, 2) & job.flag)
|
|
HTML += " <font color=green>\[Medium]</font>"
|
|
else if(GetJobDepartment(job, 3) & job.flag)
|
|
HTML += " <font color=orange>\[Low]</font>"
|
|
else
|
|
HTML += " <font color=red>\[NEVER]</font>"
|
|
HTML += "</a></td></tr>"
|
|
|
|
HTML += "</td'></tr></table>"
|
|
|
|
HTML += "</center></table>"
|
|
|
|
HTML += "<center><br><u><a href=\"byond://?src=\ref[user];preferences=1;togglerandjob=1\"><font color=[userandomjob ? "green>Get random job if preferences unavailable" : "red>Be assistant if preference unavailable"]</font></a></u></center>"
|
|
|
|
HTML += "</tt>"
|
|
|
|
user << browse(null, "window=preferences")
|
|
user << browse(HTML, "window=mob_occupation;size=[width]x[height]")
|
|
return
|
|
|
|
|
|
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/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/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
|
|
|
|
|
|
proc/process_link(mob/user, list/link_tags)
|
|
if(!usr)
|
|
return
|
|
|
|
if(link_tags["togglerandjob"])
|
|
userandomjob = !userandomjob
|
|
SetChoices(user)
|
|
return 1
|
|
|
|
if(link_tags["occ"])
|
|
if(link_tags["cancel"])
|
|
user << browse(null, "window=\ref[user]occupation")
|
|
return
|
|
else if(link_tags["job"])
|
|
SetJob(user, link_tags["job"])
|
|
else
|
|
if(job_master)
|
|
SetChoices(user)
|
|
|
|
return 1
|
|
|
|
|
|
if(link_tags["real_name"])
|
|
var/new_name
|
|
|
|
switch(link_tags["real_name"])
|
|
if("input")
|
|
new_name = reject_bad_name( input(user, "Please select a name:", "Character Generation") as text|null )
|
|
if(new_name)
|
|
real_name = new_name
|
|
else
|
|
user << "<font color='red'>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 .</font>"
|
|
|
|
if("random")
|
|
randomize_name()
|
|
|
|
if(link_tags["age"])
|
|
switch(link_tags["age"])
|
|
if("input")
|
|
var/new_age = input(user, "Please select type in age: 17-45", "Character Generation") as num
|
|
if(new_age)
|
|
age = max(min(round(text2num(new_age)), 45), 17)
|
|
if("random")
|
|
age = rand (17, 45)
|
|
|
|
if(link_tags["OOC"])
|
|
var/tempnote = ""
|
|
tempnote = copytext(sanitize(input(user, "Please enter your OOC Notes!:", "OOC notes" , metadata) as text),1,MAX_MESSAGE_LEN)
|
|
if(tempnote)
|
|
metadata = tempnote
|
|
return
|
|
|
|
|
|
|
|
|
|
if(link_tags["b_type"])
|
|
switch(link_tags["b_type"])
|
|
if("input")
|
|
var/new_b_type = input(user, "Please select a blood type:", "Character Generation") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" )
|
|
if(new_b_type)
|
|
b_type = new_b_type
|
|
if("random")
|
|
b_type = pickweight ( list ("A+" = 31, "A-" = 7, "B+" = 8, "B-" = 2, "AB+" = 2, "AB-" = 1, "O+" = 40, "O-" = 9))
|
|
|
|
|
|
if(link_tags["hair"])
|
|
switch(link_tags["hair"])
|
|
if("input")
|
|
var/new_hair = input(user, "Please select hair color.", "Character Generation") as color
|
|
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("random")
|
|
randomize_hair_color("hair")
|
|
|
|
if(link_tags["facial"])
|
|
switch(link_tags["facial"])
|
|
if("input")
|
|
var/new_facial = input(user, "Please select facial hair color.", "Character Generation") as color
|
|
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("random")
|
|
randomize_hair_color("facial")
|
|
|
|
if(link_tags["eyes"])
|
|
switch(link_tags["eyes"])
|
|
if("input")
|
|
var/new_eyes = input(user, "Please select eye color.", "Character Generation") as color
|
|
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("random")
|
|
randomize_eyes_color()
|
|
|
|
if(link_tags["s_tone"])
|
|
switch(link_tags["s_tone"])
|
|
if("random")
|
|
randomize_skin_tone()
|
|
if("input")
|
|
var/new_tone = input(user, "Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as num
|
|
if(new_tone)
|
|
s_tone = max(min(round(new_tone), 220), 1)
|
|
s_tone = -s_tone + 35
|
|
|
|
if(link_tags["h_style"])
|
|
switch(link_tags["h_style"])
|
|
|
|
// New and improved hair selection code, by Doohl
|
|
if("random") // random hair selection
|
|
|
|
randomize_hair(gender) // call randomize_hair() proc with var/gender parameter
|
|
// see preferences_setup.dm for proc
|
|
|
|
if("input") // input hair selection
|
|
|
|
// Generate list of hairs via typesof()
|
|
var/list/all_hairs = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair
|
|
|
|
// List of hair names
|
|
var/list/hairs = list()
|
|
|
|
// loop through potential hairs
|
|
for(var/x in all_hairs)
|
|
var/datum/sprite_accessory/hair/H = new x // create new hair datum based on type x
|
|
hairs.Add(H.name) // add hair name to hairs
|
|
del(H) // delete the hair after it's all done
|
|
|
|
// prompt the user for a hair selection, the selection being anything in list hairs
|
|
var/new_style = input(user, "Select a hair style", "Character Generation") as null|anything in hairs
|
|
|
|
// if new style selected (not cancel)
|
|
if(new_style)
|
|
h_style = new_style
|
|
|
|
for(var/x in all_hairs) // loop through all_hairs again. Might be slightly CPU expensive, but not significantly.
|
|
var/datum/sprite_accessory/hair/H = new x // create new hair datum
|
|
if(H.name == new_style)
|
|
hair_style = H // assign the hair_style variable a new hair datum
|
|
break
|
|
else
|
|
del(H) // if hair H not used, delete. BYOND can garbage collect, but better safe than sorry
|
|
|
|
if(link_tags["ooccolor"])
|
|
var/ooccolor = input(user, "Please select OOC colour.", "OOC colour") as color
|
|
|
|
if(ooccolor)
|
|
src.ooccolor = ooccolor
|
|
|
|
if(link_tags["toggleadminhelpsound"])
|
|
src.sound_adminhelp = !src.sound_adminhelp
|
|
|
|
if(link_tags["f_style"])
|
|
switch(link_tags["f_style"])
|
|
|
|
// see above for commentation. This is just a slight modification of the hair code for facial hairs
|
|
if("random")
|
|
|
|
randomize_facial(gender)
|
|
|
|
if("input")
|
|
|
|
var/list/all_fhairs = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair
|
|
var/list/fhairs = list()
|
|
for(var/x in all_fhairs)
|
|
var/datum/sprite_accessory/facial_hair/H = new x
|
|
fhairs.Add(H.name)
|
|
del(H)
|
|
|
|
var/new_style = input(user, "Select a facial hair style", "Character Generation") as null|anything in fhairs
|
|
if(new_style)
|
|
f_style = new_style
|
|
for(var/x in all_fhairs)
|
|
var/datum/sprite_accessory/facial_hair/H = new x
|
|
if(H.name == new_style)
|
|
facial_hair_style = H
|
|
break
|
|
else
|
|
del(H)
|
|
|
|
if(link_tags["gender"])
|
|
if(gender == MALE)
|
|
gender = FEMALE
|
|
else
|
|
gender = MALE
|
|
|
|
if(link_tags["UI"])
|
|
switch(UI_style)
|
|
if("Midnight")
|
|
UI_style = "Orange"
|
|
if("Orange")
|
|
UI_style = "old"
|
|
if("old")
|
|
UI_style = "Midnight"
|
|
else
|
|
UI_style = "Midnight"
|
|
|
|
if(link_tags["midis"])
|
|
midis = !midis
|
|
|
|
if(link_tags["ghost_ears"])
|
|
ghost_ears = !ghost_ears
|
|
|
|
if(link_tags["ghost_sight"])
|
|
ghost_sight = !ghost_sight
|
|
|
|
if(link_tags["underwear"])
|
|
switch(link_tags["underwear"])
|
|
if("inputmale")
|
|
var/tempUnderwear = input(user, "Please select your underwear colour:", "Character Generation") as null|anything in underwear_m
|
|
if(tempUnderwear)
|
|
underwear = underwear_m.Find(tempUnderwear)
|
|
if("inputfemale")
|
|
var/tempUnderwear = input(user, "Please select your underwear colour:", "Character Generation") as null|anything in underwear_f
|
|
if(tempUnderwear)
|
|
underwear = underwear_f.Find(tempUnderwear)
|
|
if("random")
|
|
underwear = rand(1,12)
|
|
|
|
if(link_tags["backbag_type"])
|
|
switch(link_tags["backbag_type"])
|
|
if("input")
|
|
var/tempBag = input(user, "Please pick a backpack type:", "Character Generation") as null|anything in backbaglist
|
|
if(tempBag)
|
|
backbag = backbaglist.Find(tempBag)
|
|
if("random")
|
|
backbag = pick(1,2,3)
|
|
|
|
|
|
if(link_tags["be_special"])
|
|
src.be_special^=(1<<text2num(link_tags["be_special"])) //bitwize magic, sorry for that. --rastaf0
|
|
|
|
if(link_tags["b_random_name"])
|
|
be_random_name = !be_random_name
|
|
|
|
if(!IsGuestKey(user.key))
|
|
if(link_tags["save"])
|
|
savefile_save(user)
|
|
|
|
else if(link_tags["load"])
|
|
if(!savefile_load(user))
|
|
alert(user, "You do not have a savefile or a convertable savefile.")
|
|
|
|
else if(link_tags["changeslot"])
|
|
savefile_save(user)
|
|
user.client.activeslot = min(max(text2num(link_tags["changeslot"]), 1), MAX_SAVE_SLOTS)
|
|
savefile_load(user)
|
|
|
|
else if(link_tags["defaultslot"])
|
|
default_slot = min(max(text2num(link_tags["defaultslot"]), 1), MAX_SAVE_SLOTS)//Changes the last used slot to be the temp default one
|
|
savefile_saveslot(user,default_slot)//Mirrors choice across all saves
|
|
|
|
else if(link_tags["slotname"])
|
|
var/sname = ""
|
|
switch(link_tags["slotname"])
|
|
if("input")
|
|
sname = reject_bad_slotname( (input(user, "Please select a name:", "Save Slot Name") as text|null), 16 )
|
|
slot_name = sname
|
|
|
|
if(link_tags["reset_all"])
|
|
gender = MALE
|
|
randomize_name()
|
|
|
|
age = 30
|
|
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
|
|
underwear = 1
|
|
backbag = 2
|
|
be_special = 0
|
|
be_random_name = 0
|
|
r_hair = 0.0
|
|
g_hair = 0.0
|
|
b_hair = 0.0
|
|
r_facial = 0.0
|
|
g_facial = 0.0
|
|
b_facial = 0.0
|
|
h_style = "Short Hair"
|
|
f_style = "Shaved"
|
|
r_eyes = 0.0
|
|
g_eyes = 0.0
|
|
b_eyes = 0.0
|
|
s_tone = 0.0
|
|
b_type = "A+"
|
|
//UI = UI_OLD
|
|
UI_style = "Midnight"
|
|
midis = 1
|
|
ghost_ears = 1
|
|
userandomjob = 1
|
|
|
|
ShowChoices(user)
|
|
|
|
proc/copy_to(mob/living/carbon/human/character, safety = 0)
|
|
if(be_random_name)
|
|
randomize_name()
|
|
|
|
if(config.humans_need_surnames)
|
|
var/firstspace = findtext(real_name, " ")
|
|
var/name_length = length(real_name)
|
|
if(!firstspace) //we need a surname
|
|
real_name += " [pick(last_names)]"
|
|
else if(firstspace == name_length)
|
|
real_name += "[pick(last_names)]"
|
|
|
|
character.real_name = real_name
|
|
character.original_name = real_name //Original name is only used in ghost chat! It is not to be edited by anything!
|
|
|
|
character.gender = gender
|
|
|
|
character.age = age
|
|
|
|
character.r_eyes = r_eyes
|
|
character.g_eyes = g_eyes
|
|
character.b_eyes = b_eyes
|
|
|
|
character.r_hair = r_hair
|
|
character.g_hair = g_hair
|
|
character.b_hair = b_hair
|
|
|
|
character.r_facial = r_facial
|
|
character.g_facial = g_facial
|
|
character.b_facial = b_facial
|
|
|
|
character.s_tone = s_tone
|
|
|
|
character.h_style = h_style
|
|
character.f_style = f_style
|
|
|
|
switch(UI_style)
|
|
if("Midnight")
|
|
character.UI = 'icons/mob/screen1_Midnight.dmi'
|
|
if("Orange")
|
|
character.UI = 'icons/mob/screen1_Orange.dmi'
|
|
if("old")
|
|
character.UI = 'icons/mob/screen1_old.dmi'
|
|
else
|
|
character.UI = 'icons/mob/screen1_Midnight.dmi'
|
|
|
|
character.hair_style = hair_style
|
|
character.facial_hair_style = facial_hair_style
|
|
|
|
if(underwear > 12 || underwear < 1)
|
|
underwear = 1 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me.
|
|
character.underwear = underwear
|
|
|
|
if(backbag > 3 || backbag < 1)
|
|
backbag = 1 //Same as above
|
|
character.backbag = backbag
|
|
|
|
if(!safety)//To prevent run-time errors due to null datum when using randomize_appearance_for()
|
|
spawn(10)
|
|
if(character&&character.client)
|
|
setup_client(character.client)
|
|
|
|
proc/copy_to_observer(mob/dead/observer/character)
|
|
spawn(10)
|
|
if(character && character.client)
|
|
setup_client(character.client)
|
|
|
|
proc/setup_client(var/client/C)
|
|
if(C)
|
|
C.sound_adminhelp = src.sound_adminhelp
|
|
C.midis = src.midis
|
|
C.ooccolor = src.ooccolor
|
|
C.be_alien = be_special & BE_ALIEN
|
|
C.be_pai = be_special & BE_PAI
|
|
if(isnull(src.ghost_ears)) src.ghost_ears = 1 //There were problems where the default was null before someone saved their profile.
|
|
C.ghost_ears = src.ghost_ears
|
|
C.ghost_sight = src.ghost_sight
|
|
|
|
|
|
#undef UI_OLD
|
|
#undef UI_NEW
|