diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm index 3ec3e06961..bdcb638666 100644 --- a/code/__DEFINES/storage.dm +++ b/code/__DEFINES/storage.dm @@ -1,12 +1,17 @@ // storage_flags variable on /datum/component/storage -// Storage limits. These can be combined I guess but you really, really shouldn't (don't do it really) +// Storage limits. These can be combined (and usually are combined). /// Check max_items and contents.len when trying to insert #define STORAGE_LIMIT_MAX_ITEMS (1<<0) -/// Check w_class and max_combined_w_class, aka legacy behavior if you combine it with [STORAGE_LIMIT_MAX_ITEMS]. +/// Check max_combined_w_class. #define STORAGE_LIMIT_COMBINED_W_CLASS (1<<1) -/// Use max_w_class for maximum w_class but use the new volume system. Will automatically force rendering to use the new volume/baystation scaling UI so this is kind of incompatible with stuff like stack storage etc etc. +/// Use the new volume system. Will automatically force rendering to use the new volume/baystation scaling UI so this is kind of incompatible with stuff like stack storage etc etc. #define STORAGE_LIMIT_VOLUME (1<<2) +/// Use max_w_class +#define STORAGE_LIMIT_MAX_W_CLASS (1<<3) + +#define STORAGE_FLAGS_LEGACY_DEFAULT (STORAGE_LIMIT_MAX_ITEMS | STORAGE_LIMIT_COMBINED_W_CLASS | STORAGE_LIMIT_MAX_W_CLASS) +#define STORAGE_FLAGS_VOLUME_DEFAULT (STORAGE_LIMIT_MAX_ITEMS | STORAGE_LIMIT_VOLUME | STORAGE_LIMIT_MAX_W_CLASS) //ITEM INVENTORY WEIGHT, FOR w_class /// Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money @@ -28,7 +33,11 @@ #define AUTO_SCALE_STORAGE_VOLUME(w_class, max_combined_w_class) (AUTO_SCALE_VOLUME(w_class) * (max_combined_w_class / w_class)) // UI defines +/// Size of volumetric box icon +#define VOLUMETRIC_STORAGE_BOX_ICON_SIZE 32 +/// Size of EACH left/right border icon for volumetric boxes +#define VOLUMETRIC_STORAGE_BOX_BORDER_SIZE 1 /// Minimum pixels an item must have in volumetric scaled storage UI -#define MINIMUM_PIXELS_PER_ITEM 2 +#define MINIMUM_PIXELS_PER_ITEM 6 /// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups. #define MAXIMUM_VOLUMETRIC_ITEMS 256 diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index bf560841bb..5b73d8721a 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -55,40 +55,52 @@ /obj/screen/storage/volumetric_box icon_state = "stored_continue" var/obj/item/our_item - var/obj/screen/storage/stored_left/left - var/obj/screen/storage/stored_right/right - -/obj/screen/storage/volumetric_box/Destroy() - QDEL_NULL(left) - QDEL_NULL(right) - our_item = null - return ..() /obj/screen/storage/volumetric_box/Initialize(mapload, new_master, our_item) src.our_item = our_item - left = new(null, src, our_item) - right = new(null, src, our_item) + return ..() + +/obj/screen/storage/volumetric_box/Destroy() + our_item = null return ..() /obj/screen/storage/volumetric_box/Click(location, control, params) return our_item.Click(location, control, params) -/obj/screen/storage/volumetric_box/proc/on_screen_objects() +/obj/screen/storage/volumetric_box/center + icon_state = "stored_continue" + var/obj/screen/storage/stored_left/left + var/obj/screen/storage/stored_right/right + +/obj/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item) + left = new(null, src, our_item) + right = new(null, src, our_item) + return ..() + +/obj/screen/storage/volumetric_box/center/Destroy() + QDEL_NULL(lefT) + QDEL_NULL(right) + return ..() + +/obj/screen/storage/volumetric_box/center/proc/on_screen_objects() return list(src, left, right) -#define BOX_ICON_PIXELS 32 -/obj/screen/storage/volumetric_box/proc/set_pixel_size(pixels) +/** + * Sets the size of this box screen object and regenerates its left/right borders. This includes the actual border's size! + */ +/obj/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels) cut_overlays() //our icon size is 32 pixels. - transform = matrix(pixels / BOX_ICON_PIXELS, 0, 0, 0, 1, 0) - left.pixel_x = -((BOX_ICON_PIXELS - pixels) * 0.5) - 4 - right.pixel_x = ((BOX_ICON_PIXELS - pixels) * 0.5) + 4 + transform = matrix((pixels - (VOLUMETRIC_STORAGE_BOX_BORDER_SIZE * 2)) / VOLUMETRIC_STORAGE_BOX_ICON_SIZE, 0, 0, 0, 1, 0) + left.pixel_x = -((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) - VOLUMETRIC_STORAGE_BOX_BORDER_SIZE + right.pixel_x = ((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) + VOLUMETRIC_STORAGE_BOX_BORDER_SIZE add_overlay(left) add_overlay(right) -#undef BOX_ICON_PIXELS /obj/screen/storage/stored_left icon_state = "stored_start" + appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM // Yes I know RESET_TRANSFORM is in APPEARANCE_UI but we're hard-asserting this incase someone changes it. /obj/screen/storage/stored_right icon_state = "stored_end" + appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 25646598d3..7cf820239c 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -22,7 +22,7 @@ var/locked = FALSE //when locked nothing can see inside or use it. /// Storage flags, including what kinds of limiters we use for how many items we can hold - var/storage_flags = STORAGE_LIMIT_VOLUME + var/storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT /// Max w_class we can hold. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] and [STORAGE_LIMIT_VOLUME] var/max_w_class = WEIGHT_CLASS_SMALL /// Max combined w_class. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] @@ -496,10 +496,6 @@ if(M && !stop_messages) host.add_fingerprint(M) return FALSE - if(real_location.contents.len >= max_items) - if(!stop_messages) - to_chat(M, "[host] is full, make some space!") - return FALSE //Storage item is full if(length(can_hold)) if(!is_type_in_typecache(I, can_hold)) if(!stop_messages) @@ -509,17 +505,34 @@ if(!stop_messages) to_chat(M, "[host] cannot hold [I]!") return FALSE - if(I.w_class > max_w_class) - if(!stop_messages) - to_chat(M, "[I] is too big for [host]!") - return FALSE - var/sum_w_class = I.w_class - for(var/obj/item/_I in real_location) - sum_w_class += _I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it. - if(sum_w_class > max_combined_w_class) - if(!stop_messages) - to_chat(M, "[I] won't fit in [host], make some space!") - return FALSE + // STORAGE LIMITS + if(storage_flags & STORAGE_LIMIT_MAX_ITEMS) + if(real_location.contents.len >= max_items) + if(!stop_messages) + to_chat(M, "[host] has too many things in it, make some space!") + return FALSE //Storage item is full + if(storage_flags & STORAGE_LIMIT_MAX_W_CLASS) + if(I.w_class > max_w_class) + if(!stop_messages) + to_chat(M, "[I] is too long for [host]!") + return FALSE + if(storage_flags & STORAGE_LIMIT_COMBINED_W_CLASS) + var/sum_w_class = I.w_class + for(var/obj/item/_I in real_location) + sum_w_class += _I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it. + if(sum_w_class > max_combined_w_class) + if(!stop_messages) + to_chat(M, "[I] won't fit in [host], make some space!") + return FALSE + if(storage_flags & STORAGE_LIMIT_VOLUME) + var/sum_volume = I.get_w_volume() + for(var/obj/item/_I in real_location) + sum_volume += _I.get_w_volume() + if(sum_volume > get_max_volume()) + if(!stop_messages) + to_chat(M, "[I] is too spacious to fit in [host], make some space!") + return FALSE + ///////////////// if(isitem(host)) var/obj/item/IP = host var/datum/component/storage/STR_I = I.GetComponent(/datum/component/storage) diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index d00d0b079c..60c413c372 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ