From 37884962049e7d61514cc2d14030d791acd999bc Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Fri, 10 Apr 2020 12:42:50 -0700
Subject: [PATCH] multiline support
---
code/_globalvars/bitfields.dm | 6 +++
code/datums/components/storage/storage.dm | 5 +-
code/datums/components/storage/ui.dm | 60 +++++++++++++----------
3 files changed, 41 insertions(+), 30 deletions(-)
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 5367322d8e..488926e078 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -249,5 +249,11 @@ GLOBAL_LIST_INIT(bitfields, list(
"COMBAT_FLAG_SOFT_STAMCRIT" = COMBAT_FLAG_SOFT_STAMCRIT,
"COMBAT_FLAG_INTENTIONALLY_RESTING" = COMBAT_FLAG_INTENTIONALLY_RESTING,
"COMBAT_FLAG_RESISTING_REST" = COMBAT_FLAG_RESISTING_REST
+ ),
+ "storage_flags" = list(
+ "STORAGE_LIMIT_MAX_ITEMS" = STORAGE_LIMIT_MAX_ITEMS,
+ "STORAGE_LIMIT_MAX_W_CLASS" = STORAGE_LIMIT_MAX_W_CLASS,
+ "STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS
+ "STORAGE_LIMIT_VOLUME" = STORAGE_LIMIT_VOLUME
)
))
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index 0efdc96600..7cd43ccece 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -50,11 +50,9 @@
var/obj/screen/storage/boxes/ui_boxes
/// New volumetric storage display mode's left side
var/obj/screen/storage/left/ui_left
- /// New volumetric storage display mode's right side
- var/obj/screen/storage/right/ui_right
/// New volumetric storage display mode's center 'blocks'
var/obj/screen/storage/continuous/ui_continuous
- /// The close button, used in all modes.
+ /// The close button, used in all modes. Frames right side in volumetric mode.
var/obj/screen/storage/close/ui_close
/// Associative list of list(item = screen object) for volumetric storage item screen blocks
var/list/ui_item_blocks
@@ -130,7 +128,6 @@
QDEL_NULL(ui_close)
QDEL_NULL(ui_continuous)
QDEL_NULL(ui_left)
- QDEL_NULL(ui_right)
// DO NOT USE QDEL_LIST_ASSOC.
if(ui_item_blocks)
for(var/i in ui_item_blocks)
diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm
index 7e9355a665..23fabf76e8 100644
--- a/code/datums/components/storage/ui.dm
+++ b/code/datums/components/storage/ui.dm
@@ -84,6 +84,7 @@
// our volume
var/our_volume = get_max_volume()
var/horizontal_pixels = (maxcolumns * world.icon_size) - (VOLUMETRIC_STORAGE_EDGE_PADDING * 2)
+ var/max_horizontal_pixels = horizontal_pixels * screen_max_rows
// sigh loopmania time
var/used = 0
// define outside for performance
@@ -95,25 +96,34 @@
used += volume
volume_by_item[I] = volume
percentage_by_item[I] = volume / get_max_volume()
+ var/padding_pixels = ((length(percentage_by_item) - 1) * VOLUMETRIC_STORAGE_ITEM_PADDING) + VOLUMETRIC_STORAGE_EDGE_PADDING * 2
+ var/min_pixels = (MINIMUM_PIXELS_PER_ITEM * length(percentage_by_item)) + padding_pixels
+ // do the check for fallback for when someone has too much gamer gear
+ if((min_pixels) > (max_horizontal_pixels + 4)) // 4 pixel grace zone
+ to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!")
+ return orient2hud_legacy(user, maxcolumns)
+ // after this point we are sure we can somehow fit all items into our max number of rows.
+
+ // determine rows
+ var/rows = CLAMP(CEILING(min_pixels / horizontal_pixels, 1), 1, screen_max_rows)
+
var/overrun = FALSE
if(used > our_volume)
// congratulations we are now in overrun mode. everything will be crammed to minimum storage pixels.
to_chat(user, "[parent] rendered in overrun mode due to more items inside than the maximum volume supports.")
overrun = TRUE
- // item padding
- horizontal_pixels -= ((length(percentage_by_item) - 1) * VOLUMETRIC_STORAGE_ITEM_PADDING)
+ // how much we are using
+ var/using_horizontal_pixels = horizontal_pixels * rows
- // do the check for fallback for when someone has too much gamer gear
- if((MINIMUM_PIXELS_PER_ITEM * length(percentage_by_item)) > horizontal_pixels)
- to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!")
- return orient2hud_legacy(user, maxcolumns)
- // after this point we are sure we can somehow fit all items with 8 pixels or more into our one row.
+ // item padding
+ using_horizontal_pixels -= padding_pixels
// define outside for marginal performance boost
var/obj/item/I
// start at this pixel from screen_start_x.
var/current_pixel = VOLUMETRIC_STORAGE_EDGE_PADDING
+ var/row = 1
LAZYINITLIST(ui_item_blocks)
@@ -123,11 +133,15 @@
if(!ui_item_blocks[I])
ui_item_blocks[I] = new /obj/screen/storage/volumetric_box/center(null, src, I)
var/obj/screen/storage/volumetric_box/center/B = ui_item_blocks[I]
- var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, horizontal_pixels * percent)
+ var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(using_horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM)
+ var/addrow = FALSE
+ if(CEILING(pixels_to_use, 1) >= FLOOR(horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING, 1))
+ pixels_to_use = horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING
+ addrow = TRUE
// now that we have pixels_to_use, place our thing and add it to the returned list.
- B.screen_loc = I.screen_loc = "[screen_start_x]:[round(current_pixel + (pixels_to_use * 0.5) + VOLUMETRIC_STORAGE_ITEM_PADDING, 1)],[screen_start_y]:[screen_pixel_y]"
+ B.screen_loc = I.screen_loc = "[screen_start_x]:[round(current_pixel + (pixels_to_use * 0.5) + VOLUMETRIC_STORAGE_ITEM_PADDING, 1)],[screen_start_y+row-1]:[screen_pixel_y]"
// add the used pixels to pixel after we place the object
current_pixel += pixels_to_use + VOLUMETRIC_STORAGE_ITEM_PADDING
@@ -146,20 +160,22 @@
. += B.on_screen_objects()
. += I
+ // go up a row if needed
+ if(addrow)
+ row++
+ current_pixel = VOLUMETRIC_STORAGE_EDGE_PADDING
+
// Then, continuous section.
ui_continuous = get_ui_continuous()
- ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]"
+ ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]"
. += ui_continuous
- // Then, left and right.
+ // Then, left.
ui_left = get_ui_left()
- ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y]"
+ ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x]:[screen_pixel_x - 2],[screen_start_y+rows-1]:[screen_pixel_y]"
. += ui_left
- ui_right = get_ui_right()
- ui_right.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]"
- . += ui_right
- // Then, closer.
+ // Then, closer, which is also our right element.
ui_close = get_ui_close()
- ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x + 2],[screen_start_y]:[screen_pixel_y]"
+ ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y + row - 1]:[screen_pixel_y]"
. += ui_close
/**
@@ -217,7 +233,7 @@
if(!M.client)
return TRUE
UnregisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT)
- M.client.screen -= list(ui_boxes, ui_close, ui_left, ui_right, ui_continuous) + get_ui_item_objects_hide()
+ M.client.screen -= list(ui_boxes, ui_close, ui_left, ui_continuous) + get_ui_item_objects_hide()
if(M.active_storage == src)
M.active_storage = null
LAZYREMOVE(is_using, M)
@@ -260,14 +276,6 @@
ui_left = new(null, src)
return ui_left
-/**
- * Gets our ui_right, making it if it doesn't exist.
- */
-/datum/component/storage/proc/get_ui_right()
- if(!ui_right)
- ui_right = new(null, src)
- return ui_right
-
/**
* Gets our ui_close, making it if it doesn't exist.
*/