mystery_box_item is now a type of /obj/effect/abstract (#90258)

## About The Pull Request

Retypes the object, attaches it to the crate as a vis_overlay, and gives
it the correct vis_flag to share the plane.

This also means it now layers correctly on multiz, when previously it
would show up on the lowest level.

## Why It's Good For The Game

/obj/ is not meant to be bloated with stuff that can easily be an
effect. Also fixes a bug

## Changelog
🆑
fix: Mystery box items no longer layer on the lowest z_level when in
multiz
code: mystery_box_item is now a type of /obj/effect/abstract
/🆑
This commit is contained in:
Waterpig
2025-03-28 18:32:03 +01:00
committed by GitHub
parent 7488adfb7e
commit 3256f65a9e
+17 -14
View File
@@ -128,7 +128,7 @@ GLOBAL_LIST_INIT(mystery_fishing, list(
/// The box's current state, and whether it can be interacted with in different ways
var/box_state = MYSTERY_BOX_STANDBY
/// The object that represents the rapidly changing item that will be granted upon being claimed. Is not, itself, an item.
var/obj/mystery_box_item/presented_item
var/obj/effect/abstract/mystery_box_item/presented_item
/// A timer for how long it takes for the box to start its expire animation
var/box_expire_timer
/// A timer for how long it takes for the box to close itself
@@ -187,7 +187,10 @@ GLOBAL_LIST_INIT(mystery_fishing, list(
/obj/structure/mystery_box/proc/activate(mob/living/user)
box_state = MYSTERY_BOX_CHOOSING
update_icon_state()
presented_item = new(loc)
presented_item = new(src)
presented_item.vis_flags = VIS_INHERIT_PLANE
presented_item.flags_1 |= IS_ONTOP_1
vis_contents += presented_item
presented_item.start_animation(src)
current_sound_channel = SSsounds.reserve_sound_channel(src)
playsound(src, open_sound, 70, FALSE, channel = current_sound_channel, falloff_exponent = 10)
@@ -297,12 +300,12 @@ GLOBAL_LIST_INIT(mystery_fishing, list(
return ..()
/// This represents the item that comes out of the box and is constantly changing before the box finishes deciding. Can probably be just an /atom or /movable.
/obj/mystery_box_item
/obj/effect/abstract/mystery_box_item
name = "???"
desc = "Who knows what it'll be??"
icon = 'icons/obj/weapons/guns/ballistic.dmi'
icon_state = "revolver"
pixel_y = -8
pixel_z = -4
uses_integrity = FALSE
/// The currently selected item. Constantly changes while choosing, determines what is spawned if the prize is claimed, and its current icon
@@ -313,36 +316,36 @@ GLOBAL_LIST_INIT(mystery_fishing, list(
var/claimable = FALSE
/obj/mystery_box_item/Initialize(mapload)
/obj/effect/abstract/mystery_box_item/Initialize(mapload)
. = ..()
var/matrix/starting = matrix()
starting.Scale(0.5,0.5)
transform = starting
add_filter("weapon_rays", 3, list("type" = "rays", "size" = 28, "color" = COLOR_VIVID_YELLOW))
/obj/mystery_box_item/Destroy(force)
/obj/effect/abstract/mystery_box_item/Destroy(force)
parent_box = null
return ..()
// this way, clicking on the prize will work the same as clicking on the box
/obj/mystery_box_item/attack_hand(mob/living/user, list/modifiers)
/obj/effect/abstract/mystery_box_item/attack_hand(mob/living/user, list/modifiers)
. = ..()
if(claimable)
parent_box.grant_weapon(user)
/// Start pushing the prize up
/obj/mystery_box_item/proc/start_animation(atom/parent)
/obj/effect/abstract/mystery_box_item/proc/start_animation(atom/parent)
parent_box = parent
loop_icon_changes()
/// Keep changing the icon and selected path
/obj/mystery_box_item/proc/loop_icon_changes()
/obj/effect/abstract/mystery_box_item/proc/loop_icon_changes()
var/change_delay = 1 // the running count of the delay
var/change_delay_delta = 1 // How much to increment the delay per step so the changing slows down
var/change_counter = 0 // The running count of the running count
var/matrix/starting = matrix()
animate(src, pixel_y = 6, transform = starting, time = MBOX_DURATION_CHOOSING, easing = QUAD_EASING | EASE_OUT)
animate(src, pixel_z = 10, transform = starting, time = MBOX_DURATION_CHOOSING, easing = QUAD_EASING | EASE_OUT)
while((change_counter + change_delay_delta + change_delay) < MBOX_DURATION_CHOOSING)
change_delay += change_delay_delta
@@ -353,12 +356,12 @@ GLOBAL_LIST_INIT(mystery_fishing, list(
addtimer(CALLBACK(src, PROC_REF(present_item)), MBOX_DURATION_CHOOSING)
/// animate() isn't up to the task for queueing up icon changes, so this is the proc we call with timers to update our icon
/obj/mystery_box_item/proc/update_random_icon(new_item_type)
/obj/effect/abstract/mystery_box_item/proc/update_random_icon(new_item_type)
var/atom/movable/new_item = new_item_type
icon = new_item::icon
icon_state = new_item::icon_state
/obj/mystery_box_item/proc/present_item()
/obj/effect/abstract/mystery_box_item/proc/present_item()
var/atom/movable/selected_item = selected_path
add_filter("ready_outline", 2, list("type" = "outline", "color" = COLOR_VIVID_YELLOW, "size" = 0.2))
name = selected_item::name
@@ -366,10 +369,10 @@ GLOBAL_LIST_INIT(mystery_fishing, list(
claimable = TRUE
/// Sink back into the box
/obj/mystery_box_item/proc/expire_animation()
/obj/effect/abstract/mystery_box_item/proc/expire_animation()
var/matrix/shrink_back = matrix()
shrink_back.Scale(0.5,0.5)
animate(src, pixel_y = -8, transform = shrink_back, time = MBOX_DURATION_EXPIRING)
animate(src, pixel_z = -4, transform = shrink_back, time = MBOX_DURATION_EXPIRING)
#undef MYSTERY_BOX_COOLING_DOWN
#undef MYSTERY_BOX_STANDBY