Files
Bubberstation/code/game/objects/items/storage/wallets.dm
LemonInTheDark 72a5b79555 Removes overlay queuing, saves 6/7 seconds of initialize. Lightly modifies stat tracking macros (#69696)
* Removes overlay queuing, saves 6/7 seconds of initialize. Lightly modifies stat tracking macros

So we have this overlay queuing system right? It's build with the assumption
that the "add to overlay list" operation is real expensive, and is
thus useful to queue removals or additions.

It turns out that it just isn't, at least during init. In my testing the
operation of queuing took LONGER then the actual overlay add/remove did.

That's ignoring the cost of the subsystem's work.

I've also modified part of the stat tracking macro, since it took a good
bit of cpu time, and didn't seem to well, do anything. So far as I can
tell it always evaluates to 1
2022-09-26 08:46:46 -07:00

161 lines
4.3 KiB
Plaintext

/obj/item/storage/wallet
name = "wallet"
desc = "It can hold a few small and personal things."
icon_state = "wallet"
w_class = WEIGHT_CLASS_SMALL
resistance_flags = FLAMMABLE
slot_flags = ITEM_SLOT_ID
var/obj/item/card/id/front_id = null
var/list/combined_access
var/cached_flat_icon
/obj/item/storage/wallet/Initialize(mapload)
. = ..()
atom_storage.max_slots = 4
atom_storage.set_holdable(list(
/obj/item/stack/spacecash,
/obj/item/holochip,
/obj/item/card,
/obj/item/clothing/mask/cigarette,
/obj/item/flashlight/pen,
/obj/item/seeds,
/obj/item/stack/medical,
/obj/item/toy/crayon,
/obj/item/coin,
/obj/item/dice,
/obj/item/disk,
/obj/item/implanter,
/obj/item/lighter,
/obj/item/lipstick,
/obj/item/match,
/obj/item/paper,
/obj/item/pen,
/obj/item/photo,
/obj/item/reagent_containers/dropper,
/obj/item/reagent_containers/syringe,
/obj/item/reagent_containers/pill,
/obj/item/screwdriver,
/obj/item/stamp),
list(/obj/item/screwdriver/power))
/obj/item/storage/wallet/Exited(atom/movable/gone, direction)
. = ..()
if(isidcard(gone))
refreshID()
/**
* Calculates the new front ID.
*
* Picks the ID card that has the most combined command or higher tier accesses.
*/
/obj/item/storage/wallet/proc/refreshID()
LAZYCLEARLIST(combined_access)
front_id = null
var/winning_tally = 0
var/is_magnetic_found = FALSE
for(var/obj/item/card/id/id_card in contents)
// Certain IDs can forcibly jump to the front so they can disguise other cards in wallets. Chameleon/Agent ID cards are an example of this.
if(!is_magnetic_found && HAS_TRAIT(id_card, TRAIT_MAGNETIC_ID_CARD))
front_id = id_card
is_magnetic_found = TRUE
if(!is_magnetic_found)
var/card_tally = SSid_access.tally_access(id_card, ACCESS_FLAG_COMMAND)
if(card_tally > winning_tally)
winning_tally = card_tally
front_id = id_card
LAZYINITLIST(combined_access)
combined_access |= id_card.access
// If we didn't pick a front ID - Maybe none of our cards have any command accesses? Just grab the first card (if we even have one).
// We could also have no ID card in the wallet at all, which will mean we end up with a null front_id and that's fine too.
if(!front_id)
front_id = (locate(/obj/item/card/id) in contents)
if(ishuman(loc))
var/mob/living/carbon/human/wearing_human = loc
if(wearing_human.wear_id == src)
wearing_human.sec_hud_set_ID()
update_label()
update_appearance(UPDATE_ICON)
update_slot_icon()
/obj/item/storage/wallet/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
. = ..()
if(isidcard(arrived))
refreshID()
/obj/item/storage/wallet/update_overlays()
. = ..()
cached_flat_icon = null
if(!front_id)
return
. += mutable_appearance(front_id.icon, front_id.icon_state)
. += front_id.overlays
. += mutable_appearance(icon, "wallet_overlay")
/obj/item/storage/wallet/proc/get_cached_flat_icon()
if(!cached_flat_icon)
cached_flat_icon = getFlatIcon(src)
return cached_flat_icon
/obj/item/storage/wallet/get_examine_string(mob/user, thats = FALSE)
if(front_id)
return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" //displays all overlays in chat
return ..()
/obj/item/storage/wallet/proc/update_label()
if(front_id)
name = "wallet displaying [front_id]"
else
name = "wallet"
/obj/item/storage/wallet/examine()
. = ..()
if(front_id)
. += span_notice("Alt-click to remove the id.")
/obj/item/storage/wallet/get_id_examine_strings(mob/user)
. = ..()
if(front_id)
. += front_id.get_id_examine_strings(user)
/obj/item/storage/wallet/GetID()
return front_id
/obj/item/storage/wallet/RemoveID()
if(!front_id)
return
. = front_id
front_id.forceMove(get_turf(src))
/obj/item/storage/wallet/InsertID(obj/item/inserting_item)
var/obj/item/card/inserting_id = inserting_item.RemoveID()
if(!inserting_id)
return FALSE
attackby(inserting_id)
if(inserting_id in contents)
return TRUE
return FALSE
/obj/item/storage/wallet/GetAccess()
if(LAZYLEN(combined_access))
return combined_access
else
return ..()
/obj/item/storage/wallet/random
icon_state = "random_wallet" // for mapping purposes
/obj/item/storage/wallet/random/Initialize(mapload)
. = ..()
icon_state = "wallet"
/obj/item/storage/wallet/random/PopulateContents()
new /obj/item/holochip(src, rand(5, 30))
new /obj/effect/spawner/random/entertainment/wallet_storage(src)