mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-25 08:34:23 +00:00
* 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
161 lines
4.3 KiB
Plaintext
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)
|