mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-14 17:45:02 +01:00
5a8b766beb
## 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 /🆑
84 lines
3.0 KiB
Plaintext
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
|