diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index 3208179b916..518e74be934 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -37,7 +37,6 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["synth_green"] >> pref.g_synth
S["synth_blue"] >> pref.b_synth
S["synth_markings"] >> pref.synth_markings
- pref.preview_icon = null
S["bgstate"] >> pref.bgstate
S["body_descriptors"] >> pref.body_descriptors
@@ -188,9 +187,6 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
/datum/category_item/player_setup_item/general/body/content(var/mob/user)
. = list()
- if(!pref.preview_icon)
- pref.update_preview_icon()
- user << browse_rsc(pref.preview_icon, "previewicon.png")
var/datum/species/mob_species = GLOB.all_species[pref.species]
. += "
| Body "
@@ -313,7 +309,6 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += " |
"
. += "Preview "
- . += ""
. += " Cycle background"
. += " [pref.equip_preview_mob & EQUIP_PREVIEW_LOADOUT ? "Hide loadout" : "Show loadout"]"
. += " [pref.equip_preview_mob & EQUIP_PREVIEW_JOB ? "Hide job gear" : "Show job gear"]"
diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm
index 01a0d75fec2..c99af02ea06 100644
--- a/code/modules/client/preference_setup/preference_setup.dm
+++ b/code/modules/client/preference_setup/preference_setup.dm
@@ -232,7 +232,7 @@
. = OnTopic(href, href_list, usr)
if(. & TOPIC_UPDATE_PREVIEW)
- pref_mob.client.prefs.preview_icon = null
+ pref_mob.client.prefs.update_preview_icon()
if(. & TOPIC_REFRESH)
pref_mob.client.prefs.ShowChoices(usr)
diff --git a/code/modules/client/preference_setup/vore/01_ears.dm b/code/modules/client/preference_setup/vore/01_ears.dm
index 9098c36a96d..dbd4653fbc3 100644
--- a/code/modules/client/preference_setup/vore/01_ears.dm
+++ b/code/modules/client/preference_setup/vore/01_ears.dm
@@ -27,7 +27,6 @@
var/r_wing2 = 30 // Wing extra color
var/g_wing2 = 30 // Wing extra color
var/b_wing2 = 30 // Wing extra color
- var/dress_mob = TRUE
// Definition of the stuff for Ears
/datum/category_item/player_setup_item/vore/ears
@@ -143,14 +142,6 @@
/datum/category_item/player_setup_item/vore/ears/content(var/mob/user)
. += "VORE Station Settings"
- if(!pref.preview_icon)
- pref.update_preview_icon()
- user << browse_rsc(pref.preview_icon, "previewicon.png")
-
- . += "Preview "
- . += ""
- . += " [pref.dress_mob ? "Hide equipment" : "Show equipment"] "
-
var/ear_display = "Normal"
if(pref.ear_style && (pref.ear_style in ear_styles_list))
var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style]
@@ -302,8 +293,4 @@
pref.b_wing2 = hex2num(copytext(new_wingc2, 6, 8))
return TOPIC_REFRESH_UPDATE_PREVIEW
- else if(href_list["toggle_clothing"])
- pref.dress_mob = !pref.dress_mob
- return TOPIC_REFRESH_UPDATE_PREVIEW
-
return ..()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index de149d80ee4..cae4865724d 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -71,7 +71,14 @@ datum/preferences
var/antag_vis = "Hidden" //How visible antag association is to others.
//Mob preview
- var/icon/preview_icon = null
+ var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen.
+ var/static/list/preview_screen_locs = list(
+ "1" = "character_preview_map:1,5:-12",
+ "2" = "character_preview_map:1,3:15",
+ "4" = "character_preview_map:1:7,2:10",
+ "8" = "character_preview_map:1:-7,1:5",
+ "BG" = "character_preview_map:1,1 to 1,5"
+ )
//Jobs, uses bitflags
var/job_civilian_high = 0
@@ -154,6 +161,10 @@ datum/preferences
if(load_character())
return
+/datum/preferences/Destroy()
+ . = ..()
+ QDEL_LIST_ASSOC_VAL(char_render_holders)
+
/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)
@@ -213,6 +224,10 @@ datum/preferences
to_chat(user, "No mob exists for the given client!")
close_load_dialog(user)
return
+
+ if(!char_render_holders)
+ update_preview_icon()
+ show_character_previews()
var/dat = ""
@@ -234,9 +249,48 @@ datum/preferences
dat += ""
//user << browse(dat, "window=preferences;size=635x736")
- var/datum/browser/popup = new(user, "Character Setup","Character Setup", 800, 800, src)
+ winshow(user, "preferences_window", TRUE)
+ var/datum/browser/popup = new(user, "preferences_browser", "Character Setup", 800, 800)
popup.set_content(dat)
- popup.open()
+ popup.open(FALSE) // Skip registring onclose on the browser pane
+ onclose(user, "preferences_window", src) // We want to register on the window itself
+
+/datum/preferences/proc/update_character_previews(mutable_appearance/MA)
+ if(!client)
+ return
+
+ var/obj/screen/BG= LAZYACCESS(char_render_holders, "BG")
+ if(!BG)
+ BG = new
+ BG.plane = TURF_PLANE
+ BG.icon = 'icons/effects/128x48.dmi'
+ LAZYSET(char_render_holders, "BG", BG)
+ client.screen |= BG
+ BG.icon_state = bgstate
+ BG.screen_loc = preview_screen_locs["BG"]
+
+ for(var/D in global.cardinal)
+ var/obj/screen/O = LAZYACCESS(char_render_holders, "[D]")
+ if(!O)
+ O = new
+ LAZYSET(char_render_holders, "[D]", O)
+ client.screen |= O
+ O.appearance = MA
+ O.dir = D
+ O.screen_loc = preview_screen_locs["[D]"]
+
+/datum/preferences/proc/show_character_previews()
+ if(!client || !char_render_holders)
+ return
+ for(var/render_holder in char_render_holders)
+ client.screen |= char_render_holders[render_holder]
+
+/datum/preferences/proc/clear_character_previews()
+ for(var/index in char_render_holders)
+ var/obj/screen/S = char_render_holders[index]
+ client?.screen -= S
+ qdel(S)
+ char_render_holders = null
/datum/preferences/proc/process_link(mob/user, list/href_list)
if(!user) return
@@ -286,6 +340,10 @@ datum/preferences
overwrite_character(text2num(href_list["overwrite"]))
sanitize_preferences()
close_load_dialog(usr)
+ else if(href_list["close"])
+ // User closed preferences window, cleanup anything we need to.
+ clear_character_previews()
+ return 1
else
return 0
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index efa91fc8601..cb25e733967 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -85,6 +85,7 @@
sanitize_preferences()
player_setup.load_character(S)
+ clear_character_previews() // Recalculate them on next show
return 1
/datum/preferences/proc/save_character()
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 7c5b354d42b..30f58535242 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -578,7 +578,7 @@
/mob/new_player/proc/close_spawn_windows()
src << browse(null, "window=latechoices") //closes late choices window
- //src << browse(null, "window=playersetup") //closes the player setup window
+ src << browse(null, "window=preferences_window") //closes the player setup window
panel.close()
/mob/new_player/proc/has_admin_rights()
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 81475ff2abe..6464642a3bf 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -255,19 +255,7 @@
dress_preview_mob(mannequin)
COMPILE_OVERLAYS(mannequin)
- preview_icon = icon('icons/effects/128x48.dmi', bgstate)
- preview_icon.Scale(48+32, 16+32)
-
- var/icon/stamp = getFlatIcon(mannequin, defdir=NORTH)
- preview_icon.Blend(stamp, ICON_OVERLAY, 25, 17)
-
- stamp = getFlatIcon(mannequin, defdir=WEST)
- preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9)
-
- stamp = getFlatIcon(mannequin, defdir=SOUTH)
- preview_icon.Blend(stamp, ICON_OVERLAY, 49, 1)
-
- preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser.
+ update_character_previews(new /mutable_appearance(mannequin))
/datum/preferences/proc/get_highest_job()
var/datum/job/highJob
diff --git a/code/modules/mob/new_player/preferences_setup_vr.dm b/code/modules/mob/new_player/preferences_setup_vr.dm
index 04910731c1c..134fdb77da8 100644
--- a/code/modules/mob/new_player/preferences_setup_vr.dm
+++ b/code/modules/mob/new_player/preferences_setup_vr.dm
@@ -4,27 +4,11 @@
mannequin.dna = new /datum/dna(null)
mannequin.delete_inventory(TRUE)
dress_preview_mob(mannequin)
+ mannequin.toggle_tail_vr(setting = TRUE)
+ mannequin.toggle_wing_vr(setting = TRUE)
COMPILE_OVERLAYS(mannequin)
- preview_icon = icon('icons/effects/128x72_vr.dmi', bgstate)
- preview_icon.Scale(128, 72)
-
- mannequin.dir = NORTH
- var/icon/stamp = getFlatIcon(mannequin)
- stamp.Scale(stamp.Width()*size_multiplier,stamp.Height()*size_multiplier)
- preview_icon.Blend(stamp, ICON_OVERLAY, 64-stamp.Width()/2, 5)
-
- mannequin.dir = WEST
- stamp = getFlatIcon(mannequin)
- stamp.Scale(stamp.Width()*size_multiplier,stamp.Height()*size_multiplier)
- preview_icon.Blend(stamp, ICON_OVERLAY, 16-stamp.Width()/2, 5)
-
- mannequin.dir = SOUTH
- stamp = getFlatIcon(mannequin)
- stamp.Scale(stamp.Width()*size_multiplier,stamp.Height()*size_multiplier)
- preview_icon.Blend(stamp, ICON_OVERLAY, 112-stamp.Width()/2, 5)
-
- preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser.
+ update_character_previews(new /mutable_appearance(mannequin))
//TFF 5/8/19 - add randomised sensor setting for random button clicking
/datum/preferences/randomize_appearance_and_body_for(var/mob/living/carbon/human/H)
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 2892676bcab..9f6d10936d8 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -1399,6 +1399,31 @@ window "browserwindow"
on-show = ".winset\"rpane.infob.is-visible=true?rpane.infob.pos=130,0;rpane.textb.is-visible=true;rpane.browseb.is-visible=true;rpane.browseb.is-checked=true;rpane.rpanewindow.pos=0,30;rpane.rpanewindow.size=0x0;rpane.rpanewindow.left=browserwindow\""
on-hide = ".winset\"rpane.infob.is-visible=true?rpane.infob.is-checked=true rpane.infob.pos=65,0 rpane.rpanewindow.left=infowindow:rpane.rpanewindow.left=textwindow rpane.textb.is-visible=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0\""
+window "preferences_window"
+ elem "preferences_window"
+ type = MAIN
+ pos = 281,0
+ size = 1000x800
+ anchor1 = none
+ anchor2 = none
+ is-visible = false
+ saved-params = "pos;size;is-minimized;is-maximized"
+ statusbar = false
+ elem "preferences_browser"
+ type = BROWSER
+ pos = 0,0
+ size = 800x800
+ anchor1 = 0,0
+ anchor2 = 80,100
+ saved-params = ""
+ elem "character_preview_map"
+ type = MAP
+ pos = 800,0
+ size = 200x800
+ anchor1 = 80,0
+ anchor2 = 100,100
+ right-click = false
+
window "infowindow"
elem "infowindow"
type = MAIN
|