Files
Bubberstation/code/datums/elements/voucher_redeemer.dm
FlufflesTheDog 5a8b766beb Fix mining vendors treating ALL items as mining vouchers (#90521)
## About The Pull Request
yeah, fixes that thing
Also shuffles some of this redeem_voucher_async code into multiple
procs, no change in behavior there.
## Why It's Good For The Game
the economy will never recover from this


https://github.com/user-attachments/assets/83a0acef-4de0-42c3-8012-7f5d960de70d
## Changelog
🆑
fix: Mining vendors will no longer mistake non-voucher items as
authentic mining vouchers
/🆑
2025-04-29 17:49:25 -06:00

84 lines
3.0 KiB
Plaintext

/**
* Accepts a [voucher_type] and a [set_type] and allows the user to redeem the voucher for items from a set.
*/
/datum/element/voucher_redeemer
element_flags = ELEMENT_BESPOKE
argument_hash_start_idx = 2
/// Typepath to what voucher sets are available to us
var/set_type
/// Typepath to what item must be redeemed
var/voucher_type
/// Cached set of radial options for redeeming a voucher
var/list/cached_options
/// Cached set of voucher sets
var/list/set_instances
/datum/element/voucher_redeemer/Attach(datum/target, voucher_type = /obj/item/coin, set_type = /datum/voucher_set)
. = ..()
if(!ismovable(target))
return ELEMENT_INCOMPATIBLE
if(!ispath(voucher_type, /obj/item))
stack_trace("Invalid voucher type for voucher_redeemer [voucher_type || "null"]")
return ELEMENT_INCOMPATIBLE
if(!ispath(set_type, /datum/voucher_set))
stack_trace("Invalid set type for voucher_redeemer [set_type || "null"]")
return ELEMENT_INCOMPATIBLE
src.voucher_type = voucher_type
src.set_type = set_type
RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(redeem_voucher))
/datum/element/voucher_redeemer/Detach(datum/target)
. = ..()
UnregisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION)
/datum/element/voucher_redeemer/proc/redeem_voucher(atom/source, mob/living/redeemer, obj/item/voucher, list/modifiers)
SIGNAL_HANDLER
if(!istype(voucher, voucher_type))
return NONE
INVOKE_ASYNC(src, PROC_REF(redeem_voucher_async), source, redeemer, voucher)
return ITEM_INTERACT_SUCCESS
/datum/element/voucher_redeemer/proc/generate_sets()
set_instances = list()
for(var/datum/voucher_set/static_set as anything in subtypesof(set_type))
set_instances[static_set::name] = new static_set
/datum/element/voucher_redeemer/proc/generate_options()
cached_options = list()
for(var/set_name in set_instances)
var/datum/voucher_set/current_set = set_instances[set_name]
var/datum/radial_menu_choice/option = new
option.image = image(icon = current_set.icon, icon_state = current_set.icon_state)
if(current_set.description)
option.info = span_boldnotice(current_set.description)
cached_options[set_name] = option
/datum/element/voucher_redeemer/proc/redeem_voucher_async(atom/source, mob/living/redeemer, obj/item/voucher)
if(!set_instances)
generate_sets()
generate_options()
var/selection = show_radial_menu(redeemer, source, cached_options, custom_check = CALLBACK(src, PROC_REF(check_menu), voucher, redeemer), radius = 38, require_near = TRUE, tooltips = TRUE)
if(!selection)
return
var/datum/voucher_set/chosen_set = set_instances[selection]
chosen_set.spawn_set(source.drop_location())
if(chosen_set.blackbox_key)
SSblackbox.record_feedback("tally", chosen_set.blackbox_key, 1, selection)
source.balloon_alert(redeemer, "redeemed [LOWER_TEXT(selection)]")
qdel(voucher)
/datum/element/voucher_redeemer/proc/check_menu(obj/item/voucher, mob/living/redeemer)
if(!istype(redeemer))
return FALSE
if(redeemer.incapacitated)
return FALSE
if(QDELETED(voucher))
return FALSE
if(!redeemer.is_holding(voucher))
return FALSE
return TRUE