diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index af77addeab..d29bb84bc9 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -303,4 +303,15 @@ proc/checkhtml(var/t)
var/new_text = ""
for(var/i = length(text); i > 0; i--)
new_text += copytext(text, i, i+1)
- return new_text
+ return new_text
+
+//Used in preferences' SetFlavorText and human's set_flavor verb
+//Previews a string of len or less length
+proc/TextPreview(var/string,var/len=40)
+ if(lentext(string) <= len)
+ if(!lentext(string))
+ return "\[...\]"
+ else
+ return string
+ else
+ return "[copytext(string, 1, 37)]..."
\ No newline at end of file
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 448662c451..cc532664a1 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -107,7 +107,8 @@ datum/preferences
var/list/organ_data = list()
var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor"
- var/flavor_text = ""
+ var/list/flavor_texts = list()
+
var/med_record = ""
var/sec_record = ""
var/gen_record = ""
@@ -386,14 +387,7 @@ datum/preferences
dat += "\tSet Skills ([GetSkillClass(used_skillpoints)][used_skillpoints > 0 ? " [used_skillpoints]" : "0"])
"
- dat += "Set Flavor Text
"
- if(lentext(flavor_text) <= 40)
- if(!lentext(flavor_text))
- dat += "\[...\]"
- else
- dat += "[flavor_text]"
- else
- dat += "[copytext(flavor_text, 1, 37)]...
"
+ dat += "Set Flavor Text
"
dat += "
"
dat += "
Hair
"
@@ -558,24 +552,15 @@ datum/preferences
HTML += "Medical Records
"
- if(lentext(med_record) <= 40)
- HTML += "[med_record]"
- else
- HTML += "[copytext(med_record, 1, 37)]..."
+ HTML += TextPreview(med_record,40)
HTML += "
Employment Records
"
- if(lentext(gen_record) <= 40)
- HTML += "[gen_record]"
- else
- HTML += "[copytext(gen_record, 1, 37)]..."
+ HTML += TextPreview(gen_record,40)
HTML += "
Security Records
"
- if(lentext(sec_record) <= 40)
- HTML += "[sec_record]
"
- else
- HTML += "[copytext(sec_record, 1, 37)]...
"
+ HTML += TextPreview(sec_record,40)
HTML += "
"
HTML += "\[Done\]"
@@ -603,7 +588,44 @@ datum/preferences
user << browse(HTML, "window=antagoptions")
return
-
+ 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
proc/GetPlayerAltTitle(datum/job/job)
return player_alt_titles.Find(job.title) > 0 \
@@ -805,6 +827,72 @@ datum/preferences
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 << "\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")
+ var/to_remove = href_list["gear"]
+ if(!to_remove) return
+ for(var/gear_name in gear)
+ if(gear_name == to_remove)
+ gear -= gear_name
+ break
+
+ 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 = 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
+ if(msg != null)
+ msg = copytext(msg, 1, MAX_MESSAGE_LEN)
+ msg = html_encode(msg)
+ flavor_texts[href_list["task"]] = msg
+ else
+ var/msg = input(usr,"Set the flavor text for your [href_list["task"]].","Flavor Text",html_decode(flavor_texts[href_list["task"]])) as message
+ if(msg != null)
+ msg = copytext(msg, 1, MAX_MESSAGE_LEN)
+ msg = html_encode(msg)
+ flavor_texts[href_list["task"]] = msg
+ SetFlavorText(user)
+ return
+
else if(href_list["preference"] == "records")
if(text2num(href_list["record"]) >= 1)
SetRecords(user)
@@ -857,48 +945,6 @@ datum/preferences
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")
- var/to_remove = href_list["gear"]
- if(!to_remove) return
- for(var/gear_name in gear)
- if(gear_name == to_remove)
- gear -= gear_name
- break
-
switch(href_list["task"])
if("random")
switch(href_list["preference"])
@@ -1159,15 +1205,6 @@ datum/preferences
if(new_relation)
nanotrasen_relation = new_relation
- if("flavor_text")
- var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message
-
- if(msg != null)
- msg = copytext(msg, 1, MAX_MESSAGE_LEN)
- msg = html_encode(msg)
-
- flavor_text = msg
-
if("disabilities")
if(text2num(href_list["disabilities"]) >= -1)
if(text2num(href_list["disabilities"]) >= 0)
@@ -1363,7 +1400,16 @@ datum/preferences
if(character.dna)
character.dna.real_name = character.real_name
- character.flavor_text = flavor_text
+ character.flavor_texts["general"] = flavor_texts["general"]
+ character.flavor_texts["head"] = flavor_texts["head"]
+ character.flavor_texts["face"] = flavor_texts["face"]
+ character.flavor_texts["eyes"] = flavor_texts["eyes"]
+ character.flavor_texts["torso"] = flavor_texts["torso"]
+ character.flavor_texts["arms"] = flavor_texts["arms"]
+ character.flavor_texts["hands"] = flavor_texts["hands"]
+ character.flavor_texts["legs"] = flavor_texts["legs"]
+ character.flavor_texts["feet"] = flavor_texts["feet"]
+
character.med_record = med_record
character.sec_record = sec_record
character.gen_record = gen_record
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index ef3b8e5c03..c61f87b23f 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -144,7 +144,7 @@
S["job_engsec_low"] >> job_engsec_low
//Miscellaneous
- S["flavor_text"] >> flavor_text
+ S["flavor_texts"] >> flavor_texts
S["med_record"] >> med_record
S["sec_record"] >> sec_record
S["gen_record"] >> gen_record
@@ -265,7 +265,7 @@
S["job_engsec_low"] << job_engsec_low
//Miscellaneous
- S["flavor_text"] << flavor_text
+ S["flavor_texts"] << flavor_texts
S["med_record"] << med_record
S["sec_record"] << sec_record
S["gen_record"] << gen_record
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index d4050c06b8..75eff694fa 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -584,4 +584,38 @@
set desc = "Sets an extended description of your character's features."
set category = "IC"
- flavor_text = copytext(sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text), 1)
+ var/HTML = ""
+ HTML += ""
+ HTML += "Update 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 += ""
+ src << browse(HTML, "window=flavor_changes;size=430x300")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index fca5ffa065..14d17bfd2a 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -74,6 +74,18 @@
prev_gender = gender // Debug for plural genders
make_blood()
+ /*
+ flavor_texts["general"] = flavor_general
+ flavor_texts["head"] = flavor_head
+ flavor_texts["face"] = flavor_face
+ flavor_texts["eyes"] = flavor_eyes
+ flavor_texts["torso"] = flavor_torso
+ flavor_texts["arms"] = flavor_arms
+ flavor_texts["hands"] = flavor_hands
+ flavor_texts["legs"] = flavor_legs
+ flavor_texts["feet"] = flavor_feet*/
+
+
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
if ((!( yes ) || now_pushing))
return
@@ -827,6 +839,27 @@
if (href_list["lookmob"])
var/mob/M = locate(href_list["lookmob"])
M.examine()
+
+ if (href_list["flavor_change"])
+ switch(href_list["flavor_change"])
+ if("done")
+ src << browse(null, "window=flavor_changes")
+ return
+ if("general")
+ var/msg = input(usr,"Update the 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["flavor_change"]])) as message
+ if(msg != null)
+ msg = copytext(msg, 1, MAX_MESSAGE_LEN)
+ msg = html_encode(msg)
+ flavor_texts[href_list["flavor_change"]] = msg
+ return
+ else
+ var/msg = input(usr,"Update the flavor text for your [href_list["flavor_change"]].","Flavor Text",html_decode(flavor_texts[href_list["flavor_change"]])) as message
+ if(msg != null)
+ msg = copytext(msg, 1, MAX_MESSAGE_LEN)
+ msg = html_encode(msg)
+ flavor_texts[href_list["flavor_change"]] = msg
+ set_flavor()
+ return
..()
return
@@ -1503,3 +1536,41 @@
return
H << "\red Your nose begins to bleed..."
H.drip(1)
+
+/mob/living/carbon/human/print_flavor_text()
+ var/list/equipment = list(src.head,src.wear_mask,src.glasses,src.w_uniform,src.wear_suit,src.gloves,src.shoes)
+ var/head_exposed = 1
+ var/face_exposed = 1
+ var/eyes_exposed = 1
+ var/torso_exposed = 1
+ var/arms_exposed = 1
+ var/legs_exposed = 1
+ var/hands_exposed = 1
+ var/feet_exposed = 1
+
+ for(var/obj/item/clothing/C in equipment)
+ if(C.body_parts_covered & HEAD)
+ head_exposed = 0
+ if(C.body_parts_covered & FACE)
+ face_exposed = 0
+ if(C.body_parts_covered & EYES)
+ eyes_exposed = 0
+ if(C.body_parts_covered & UPPER_TORSO)
+ torso_exposed = 0
+ if(C.body_parts_covered & ARMS)
+ arms_exposed = 0
+ if(C.body_parts_covered & HANDS)
+ hands_exposed = 0
+ if(C.body_parts_covered & LEGS)
+ legs_exposed = 0
+ if(C.body_parts_covered & FEET)
+ feet_exposed = 0
+
+ flavor_text = flavor_texts["general"]
+ flavor_text += "\n\n"
+ for (var/T in flavor_texts)
+ if(flavor_texts[T] != "")
+ if((T == "head" && head_exposed) || (T == "face" && face_exposed) || (T == "eyes" && eyes_exposed) || (T == "torso" && torso_exposed) || (T == "arms" && arms_exposed) || (T == "hands" && hands_exposed) || (T == "legs" && legs_exposed) || (T == "feet" && feet_exposed))
+ flavor_text += flavor_texts[T]
+ flavor_text += "\n\n"
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index d5db0fdbc7..818b9a9e7e 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -70,3 +70,5 @@
var/mob/remoteview_target = null
var/hand_blood_color
+
+ var/list/flavor_texts = list()
\ No newline at end of file