diff --git a/baystation12.dme b/baystation12.dme
index b4a5b034098..35b629deb00 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -835,7 +835,7 @@
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"
#include "code\modules\client\preferences.dm"
-#include "code\modules\client\preferences_savefile.dm"
+#include "code\modules\client\preferences_mysql.dm"
#include "code\modules\client\preferences_toggles.dm"
#include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\glasses\glasses.dm"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 5aca93796f5..8a0dee2abc7 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -136,7 +136,7 @@ datum/preferences
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)
+// load_path(C.ckey)
if(load_preferences())
if(load_character())
return
@@ -186,10 +186,6 @@ datum/preferences
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
"
@@ -316,7 +312,6 @@ datum/preferences
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"]
"
@@ -1124,23 +1119,6 @@ datum/preferences
undershirt = undershirt_options.Find(new_undershirt)
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)
@@ -1329,9 +1307,6 @@ datum/preferences
if("ghost_radio")
toggles ^= CHAT_GHOSTRADIO
- if("player_voices")
- sound ^= SOUND_VOICES
-
if("save")
save_preferences()
save_character()
@@ -1457,20 +1432,26 @@ datum/preferences
character.gender = MALE
proc/open_load_dialog(mob/user)
+ var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM character WHERE ckey='[user.key]' ORDER BY slot")
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n")
+ return
+
var/dat = "
"
dat += ""
+ dat += "Select a character slot to load
"
+ var/name
- 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]
"
+ for(var/i=1, i<=MAX_SAVE_SLOTS, i++)
+ if(i==query.item[1])
+ name = query.item[2]
+ query.NextRow()
+ if(!name) name = "Character[i]"
+ if(i==default_slot)
+ name = "[name]"
+ dat += "[name]
"
dat += "
"
dat += "Close
"
diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm
new file mode 100644
index 00000000000..ba8c4072d81
--- /dev/null
+++ b/code/modules/client/preferences_mysql.dm
@@ -0,0 +1,207 @@
+/datum/preferences/proc/load_preferences()
+
+ var/DBQuery/query = dbcon.NewQuery("SELECT ooccolor,UI_style,UI_style_color,UI_style_alpha,be_special,default_slot,toggles,sound,randomslot,volume FROM erro_player WHERE ckey='[usr.key]'")
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during loading player preferences. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during loading player preferences. Error : \[[err]\]\n")
+ return
+
+
+ //general preferences
+ ooccolor = query.item[1]
+ UI_style = query.item[2]
+ UI_style_color = query.item[3]
+ UI_style_alpha = query.item[4]
+ be_special = query.item[5]
+ default_slot = query.item[6]
+ toggles = query.item[7]
+ sound = query.item[8]
+ randomslot = query.item[9]
+ volume = query.item[10]
+
+ //Sanitize
+ ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
+ lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
+ UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style))
+ be_special = sanitize_integer(be_special, 0, 65535, initial(be_special))
+ default_slot = sanitize_integer(default_slot, 1, MAX_SAVE_SLOTS, initial(default_slot))
+ toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
+ sound = sanitize_integer(sound, 0, 65535, initial(toggles))
+ UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color))
+ UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha))
+ randomslot = sanitize_integer(randomslot, 0, 1, initial(randomslot))
+ volume = sanitize_integer(volume, 0, 100, initial(volume))
+ return 1
+
+/datum/preferences/proc/save_preferences()
+
+ var/DBQuery/query = dbcon.NewQuery("UPDATE error_player (ooccolor,UI_style,UI_style_color,UI_style_alpha,be_special,default_slot,toggles,sound,randomslot,volume) VALUES ('[ooccolor]','[UI_style]','[UI_style_color]','[UI_style_alpha]','[be_special]','[default_slot]','[toggles]','[sound]','[randomslot]','[volume]') WHERE ckey='[usr.key]'")
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during saving player preferences. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during saving player preferences. Error : \[[err]\]\n")
+ return
+ return 1
+
+/datum/preferences/proc/load_character(slot)
+
+ if(!slot) slot = default_slot
+ slot = sanitize_integer(slot, 1, MAX_SAVE_SLOTS, initial(default_slot))
+ if(slot != default_slot)
+ default_slot = slot
+ var/DBQuery/firstquery = dbcon.NewQuery("UPDATE error_player (default_slot) VALUES ('[slot]') WHERE ckey='[usr.key]'")
+ firstquery.Execute()
+
+ var/DBQuery/query = dbcon.NewQuery("SELECT * FROM character WHERE ckey='[usr.key]' AND slot='[slot]'")
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n")
+ return
+
+ //Character
+ metadata = query.item[4]
+ real_name = query.item[5]
+ be_random_name = query.item[6]
+ gender = query.item[7]
+ age = query.item[8]
+ species = query.item[9]
+ language = query.item[10]
+
+ //colors to be consolidated into hex strings (requires some work with dna code)
+ r_hair = query.item[11]
+ g_hair = query.item[12]
+ b_hair = query.item[13]
+ r_facial = query.item[14]
+ g_facial = query.item[15]
+ b_facial = query.item[16]
+ s_tone = query.item[17]
+ r_skin = query.item[18]
+ g_skin = query.item[19]
+ b_skin = query.item[20]
+ h_style = query.item[21]
+ f_style = query.item[22]
+ r_eyes = query.item[23]
+ g_eyes = query.item[24]
+ b_eyes = query.item[25]
+ underwear = query.item[26]
+ undershirt = query.item[27]
+ backbag = query.item[28]
+ b_type = query.item[29]
+
+
+ //Jobs
+ alternate_option = query.item[30]
+ job_civilian_high = query.item[31]
+ job_civilian_med = query.item[32]
+ job_civilian_low = query.item[33]
+ job_medsci_high = query.item[34]
+ job_medsci_med = query.item[35]
+ job_medsci_low = query.item[36]
+ job_engsec_high = query.item[37]
+ job_engsec_med = query.item[38]
+ job_engsec_low = query.item[39]
+ job_karma_high = query.item[40]
+ job_karma_med = query.item[41]
+ job_karma_low = query.item[42]
+
+ //Miscellaneous
+ flavor_text = query.item[43]
+ med_record = query.item[44]
+ sec_record = query.item[45]
+ gen_record = query.item[46]
+ be_special = query.item[47]
+ disabilities = query.item[48]
+ player_alt_titles = query.item[49]
+ organ_data = query.item[50]
+
+ nanotrasen_relation = query.item[51]
+
+ //Sanitize
+ metadata = sanitize_text(metadata, initial(metadata))
+ real_name = reject_bad_name(real_name)
+ if(isnull(species)) species = "Human"
+ if(isnull(language)) language = "None"
+ if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation)
+ if(!real_name) real_name = random_name(gender,species)
+ be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
+ gender = sanitize_gender(gender)
+ age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
+ r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair))
+ g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair))
+ b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair))
+ r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial))
+ g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial))
+ b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial))
+ s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone))
+ r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin))
+ g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin))
+ b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin))
+ h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style))
+ f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style))
+ r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes))
+ g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes))
+ b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
+ underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear))
+ undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt))
+ backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
+ b_type = sanitize_text(b_type, initial(b_type))
+
+ alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option))
+ job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
+ job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med))
+ job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low))
+ job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high))
+ job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med))
+ job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low))
+ job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high))
+ job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med))
+ job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low))
+ job_karma_high = sanitize_integer(job_karma_high, 0, 65535, initial(job_karma_high))
+ job_karma_med = sanitize_integer(job_karma_med, 0, 65535, initial(job_karma_med))
+ job_karma_low = sanitize_integer(job_karma_low, 0, 65535, initial(job_karma_low))
+
+ if(isnull(disabilities)) disabilities = 0
+ if(!player_alt_titles) player_alt_titles = new()
+ if(!organ_data) src.organ_data = list()
+
+ return 1
+
+/datum/preferences/proc/save_character()
+ var/DBQuery/firstquery = dbcon.NewQuery("SELECT slot FROM character WHERE ckey='[usr.key]' ORDER BY slot")
+ firstquery.Execute()
+ var/numRow = firstquery.RowsAffected()
+ if(numRow)
+ for(var/i = 1,i <= numRow, i++)
+ if(default_slot != firstquery.item[1])
+ firstquery.NextRow()
+ else
+ var/DBQuery/query = dbcon.NewQuery("UPDATE character (OOC_Notes,real_name,name_is_always_random,gender,age,species,language,hair_red,hair_green,hair_blue,facial_red,facial_green,facial_blue,skin_tone,skin_red,skin_green,skin_blue,hair_style_name,facial_style_name,eyes_red,eyes_green,eyes_blue,underwear,undershirt,backbag,b_type,alternate_option,job_civ_high,job_civ_med,job_civ_low,job_medsci_high,job_medsci_med,job_medsci_low,job_engsec_high,job_engsec_med,job_engsec_low,job_karma_high,job_karma_med,job_karma_low,flavor_text,med_record,sec_record,gen_record,player_alt_titles,be_special,disabilities,organ_data,nanotrasen_relation) VALUES ('[metadata]','[real_name]','[be_random_name]','[gender]','[age]','[species]','[language]','[r_hair]','[g_hair]','[b_hair]','[r_facial]','[g_facial]','[b_facial]','[s_tone]',[r_skin]','[g_skin]','[b_skin]','[h_style]','[f_style]','[r_eyes]','[g_eyes]','[b_eyes]','[underwear]','[undershirt]','[backbag]','[b_type]','[alternate_option]','[job_civilian_high]','[job_civilian_med]','[job_civilian_low]','[job_medsci_high]','[job_medsci_med]','[job_medsci_low]','[job_engsec_high]','[job_engsec_med]','[job_engsec_low]','[job_karma_high]','[job_karma_med]','[job_karma_low]','[flavor_text]','[med_record]','[sec_record]','[gen_record]','[player_alt_titles]','[be_special]','[disabilities]','[organ_data]','[nanotrasen_relation]') WHERE ckey='[usr.key]' AND slot='[default_slot]'")
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during character slot saving. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during character slot saving. Error : \[[err]\]\n")
+ return
+ return 1
+ var/DBQuery/query = dbcon.NewQuery("INSERT INTO character (ckey,slot,OOC_Notes,real_name,name_is_always_random,gender,age,species,language,hair_red,hair_green,hair_blue,facial_red,facial_green,facial_blue,skin_tone,skin_red,skin_green,skin_blue,hair_style_name,facial_style_name,eyes_red,eyes_green,eyes_blue,underwear,undershirt,backbag,b_type,alternate_option,job_civ_high,job_civ_med,job_civ_low,job_medsci_high,job_medsci_med,job_medsci_low,job_engsec_high,job_engsec_med,job_engsec_low,job_karma_high,job_karma_med,job_karma_low,flavor_text,med_record,sec_record,gen_record,player_alt_titles,be_special,disabilities,organ_data,nanotrasen_relation) VALUES ('[usr.key],'[default_slot]','[metadata]','[real_name]','[be_random_name]','[gender]','[age]','[species]','[language]','[r_hair]','[g_hair]','[b_hair]','[r_facial]','[g_facial]','[b_facial]','[s_tone]',[r_skin]','[g_skin]','[b_skin]','[h_style]','[f_style]','[r_eyes]','[g_eyes]','[b_eyes]','[underwear]','[undershirt]','[backbag]','[b_type]','[alternate_option]','[job_civilian_high]','[job_civilian_med]','[job_civilian_low]','[job_medsci_high]','[job_medsci_med]','[job_medsci_low]','[job_engsec_high]','[job_engsec_med]','[job_engsec_low]','[job_karma_high]','[job_karma_med]','[job_karma_low]','[flavor_text]','[med_record]','[sec_record]','[gen_record]','[player_alt_titles]','[be_special]','[disabilities]','[organ_data]','[nanotrasen_relation]')")
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during character slot saving. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during character slot saving. Error : \[[err]\]\n")
+ return
+ return 1
+
+/datum/preferences/proc/random_character()
+ var/DBQuery/query = dbcon.NewQuery("SELECT slot FROM character WHERE ckey='[usr.key]' ORDER BY slot")
+
+ var/list/saves = list()
+ for(var/i=1, i<=MAX_SAVE_SLOTS, i++)
+ if(i==query.item[1])
+ saves += i
+ query.NextRow()
+ if(!saves.len)
+ load_character()
+ return 0
+ load_character(pick(saves))
+ return 1
\ No newline at end of file
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index c79289fef07..367874fd8ad 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -31,6 +31,7 @@
path = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/[filename]"
savefile_version = SAVEFILE_VERSION_MAX
+/*
/datum/preferences/proc/load_preferences()
if(!path) return 0
if(!fexists(path)) return 0
@@ -95,6 +96,7 @@
S["volume"] << volume
return 1
+
//saving volume changes
/datum/preferences/proc/save_volume()
if(!path) return 0
@@ -104,6 +106,7 @@
S["volume"] << volume
return 1
+*/
/datum/preferences/proc/load_save(dir)
var/savefile/S = new /savefile(path)
@@ -244,7 +247,7 @@
S.cd = pick(saves)
load_save(S.cd)
return 1
-
+/*
/datum/preferences/proc/load_character(slot)
if(!path) return 0
if(!fexists(path)) return 0
@@ -258,7 +261,7 @@
S["default_slot"] << slot
S.cd = "/character[slot]"
load_save(S.cd)
-/* Now loaded by proc load_save(S.cd)
+ Now loaded by proc load_save(S.cd)
//Character
S["OOC_Notes"] >> metadata
S["real_name"] >> real_name
@@ -360,7 +363,7 @@
if(!player_alt_titles) player_alt_titles = new()
if(!organ_data) src.organ_data = list()
//if(!skin_style) skin_style = "Default"
-*/
+
return 1
/datum/preferences/proc/save_character()
@@ -430,7 +433,7 @@
//S["skin_style"] << skin_style
return 1
-
+*/
#undef SAVEFILE_VERSION_MAX
#undef SAVEFILE_VERSION_MIN
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 45bf1f8aae5..91694e4fc47 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -85,6 +85,7 @@
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jamsz
feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/*
/client/verb/togglevoices()
set name = "Toggle player voices"
set category = "Preferences"
@@ -93,6 +94,7 @@
prefs.save_preferences()
src << "You will [(prefs.sound & SOUND_VOICES) ? "now" : "no longer"] hear voices of players around you, or your own voice."
feedback_add_details("admin_verb","TVoice") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+*/
/client/verb/togglemidis()
set name = "Hear/Silence Midis"
diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm
index 925888ed0c1..b2bdfb20d7c 100644
--- a/code/modules/media/mediamanager.dm
+++ b/code/modules/media/mediamanager.dm
@@ -135,4 +135,4 @@ function SetMusic(url, time, volume) {
media.update_volume(value)
if(prefs)
prefs.volume = value
- prefs.save_volume()
+ prefs.save_preferences()
diff --git a/code/setup.dm b/code/setup.dm
index 5cbe6769042..bedcd606ed0 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -689,8 +689,7 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define SOUND_MIDI 2
#define SOUND_AMBIENCE 4
#define SOUND_LOBBY 8
-#define SOUND_VOICES 16
-#define SOUND_STREAMING 32
+#define SOUND_STREAMING 16
#define SOUND_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|SOUND_STREAMING)
#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC)