From 0e217eab7bef1709e6c0ba3bbcc9e9ca9d86b60c Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 14 Mar 2024 00:35:59 +0100 Subject: [PATCH] [MIRROR] Sticker resprite and rewrite (#26853) * Sticker resprite and rewrite (#81893) Stealing from Goon is bad, but stickers are actually a good feature, and loosing those will be a disappointment. This project aims to recreate 'em from scratch without using Jimmyl's and Goon's code. Also, suspicious icons were resprited and renamed. * Sticker resprite and rewrite --------- Co-authored-by: Interception&? <137328283+intercepti0n@users.noreply.github.com> --- code/datums/components/attached_sticker.dm | 78 ------- code/datums/components/sticker.dm | 111 ++++++++++ code/datums/elements/sticker.dm | 53 ----- code/game/atom/atom_tool_acts.dm | 10 +- code/game/objects/items/sticker.dm | 131 ------------ code/game/objects/items/stickers.dm | 195 ++++++++++++++++++ .../items/storage/boxes/service_boxes.dm | 17 +- .../game/objects/items/storage/uplink_kits.dm | 1 + code/modules/cargo/packs/costumes_toys.dm | 3 +- icons/obj/toys/stickers.dmi | Bin 7392 -> 7280 bytes tgstation.dme | 5 +- 11 files changed, 327 insertions(+), 277 deletions(-) delete mode 100644 code/datums/components/attached_sticker.dm create mode 100644 code/datums/components/sticker.dm delete mode 100644 code/datums/elements/sticker.dm delete mode 100644 code/game/objects/items/sticker.dm create mode 100644 code/game/objects/items/stickers.dm diff --git a/code/datums/components/attached_sticker.dm b/code/datums/components/attached_sticker.dm deleted file mode 100644 index 49541a6b37c..00000000000 --- a/code/datums/components/attached_sticker.dm +++ /dev/null @@ -1,78 +0,0 @@ -// The attached sticker - -/datum/component/attached_sticker - dupe_mode = COMPONENT_DUPE_ALLOWED - ///The overlay we apply to things we stick to - var/mutable_appearance/sticker_overlay - ///The turf our COMSIG_TURF_EXPOSE is registered to, so we can unregister it later. - var/turf/signal_turf - ///Our physical sticker to drop - var/obj/item/sticker - ///Can we be washed off? - var/washable = TRUE - -/datum/component/attached_sticker/Initialize(px, py, obj/stick, mob/living/user, cleanable=TRUE) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - washable = cleanable - var/atom/atom_parent = parent - sticker = stick - sticker_overlay = mutable_appearance(stick.icon, stick.icon_state , layer = atom_parent.layer + 1, appearance_flags = RESET_COLOR | PIXEL_SCALE) - sticker_overlay.pixel_x = px - sticker_overlay.pixel_y = py - atom_parent.add_overlay(sticker_overlay) - if(isliving(parent) && user) - var/mob/living/victim = parent - if(victim.client) - user.log_message("stuck [sticker] to [key_name(victim)]", LOG_ATTACK) - victim.log_message("had [sticker] stuck to them by [key_name(user)]", LOG_ATTACK) - else if(isturf(parent) && (sticker.resistance_flags & FLAMMABLE)) - //register signals on the users turf instead because we can assume they are on flooring sticking it to a wall so it should burn (otherwise it would fruitlessly check wall temperature) - signal_turf = (user && isclosedturf(parent)) ? get_turf(user) : parent - RegisterSignal(signal_turf, COMSIG_TURF_EXPOSE, PROC_REF(on_turf_expose)) - sticker.moveToNullspace() - RegisterSignal(sticker, COMSIG_QDELETING, PROC_REF(peel)) - -/datum/component/attached_sticker/Destroy() - var/atom/as_atom = parent - as_atom.cut_overlay(sticker_overlay) - sticker_overlay = null - if(sticker) - QDEL_NULL(sticker) - return ..() - -///Move sticker item from nullspace, delete this component, cut overlay -/datum/component/attached_sticker/proc/peel(atom/source) - SIGNAL_HANDLER - if(!QDELETED(sticker)) - var/atom/as_atom = parent - sticker.forceMove(isturf(as_atom) ? as_atom : as_atom.drop_location()) - sticker.pixel_y = rand(-4,1) - sticker.pixel_x = rand(-3,3) - sticker = null - if(!QDELETED(src)) - qdel(src) - -/datum/component/attached_sticker/RegisterWithParent() - if(sticker.resistance_flags & FLAMMABLE) - RegisterSignal(parent, COMSIG_LIVING_IGNITED, PROC_REF(peel)) - if(washable) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(peel)) - RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(peel)) - ADD_TRAIT(parent, TRAIT_STICKERED, REF(sticker)) - -/datum/component/attached_sticker/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_LIVING_IGNITED, COMSIG_QDELETING)) - if(signal_turf) - UnregisterSignal(signal_turf, COMSIG_TURF_EXPOSE) - signal_turf = null - if(washable) - UnregisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT) - REMOVE_TRAIT(parent, TRAIT_STICKERED, REF(sticker)) - -///Signal handler for COMSIG_TURF_EXPOSE, deletes this sticker if the temperature is above 100C and it is flammable -/datum/component/attached_sticker/proc/on_turf_expose(datum/source, datum/gas_mixture/air, exposed_temperature) - SIGNAL_HANDLER - if(exposed_temperature <= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - return - peel() diff --git a/code/datums/components/sticker.dm b/code/datums/components/sticker.dm new file mode 100644 index 00000000000..0562f604807 --- /dev/null +++ b/code/datums/components/sticker.dm @@ -0,0 +1,111 @@ +/** + * ### Sticker component + * + * Component that draws supplied atom's icon over parent object with specified offset, + * icon centering is handled inside. + */ +/datum/component/sticker + dupe_mode = COMPONENT_DUPE_ALLOWED + + /// Either `turf` or `null`, used to connect to `COMSIG_TURF_EXPOSE` signal when parent is a turf. + var/turf/listening_turf + /// Refernce to a "stickered" atom. + var/atom/movable/our_sticker + /// Reference to the created overlay, used during component deletion. + var/mutable_appearance/sticker_overlay + +/datum/component/sticker/Initialize(atom/stickering_atom, mob/user, dir = NORTH, px = 0, py = 0) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + src.our_sticker = our_sticker + + if(isliving(parent) && !isnull(user)) + var/mob/living/victim = parent + + if(!isnull(victim.client)) + user.log_message("stuck [stickering_atom] to [key_name(victim)]", LOG_ATTACK) + victim.log_message("had [stickering_atom] stuck to them by [key_name(user)]", LOG_ATTACK) + + stick(stickering_atom, px, py) + register_turf_signals(dir) + +/datum/component/sticker/Destroy(force) + var/atom/parent_atom = parent + parent_atom.cut_overlay(sticker_overlay) + + unregister_turf_signals() + + REMOVE_TRAIT(parent, TRAIT_STICKERED, REF(src)) + + QDEL_NULL(our_sticker) + QDEL_NULL(sticker_overlay) + return ..() + +/datum/component/sticker/RegisterWithParent() + if(isliving(parent)) + RegisterSignal(parent, COMSIG_LIVING_IGNITED, PROC_REF(on_ignite)) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_clean)) + +/datum/component/sticker/UnregisterFromParent() + if(isliving(parent)) + UnregisterSignal(parent, COMSIG_LIVING_IGNITED) + UnregisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT) + +/// Subscribes to `COMSIG_TURF_EXPOSE` if parent atom is a turf. If turf is closed - subscribes to signal +/datum/component/sticker/proc/register_turf_signals(dir) + if(!isturf(parent)) + return + + listening_turf = isclosedturf(parent) ? get_step(parent, dir) : parent + RegisterSignal(listening_turf, COMSIG_TURF_EXPOSE, PROC_REF(on_turf_expose)) + +/// Unsubscribes from `COMSIG_TURF_EXPOSE` if `listening_turf` is not `null`. +/datum/component/sticker/proc/unregister_turf_signals() + if(isnull(listening_turf)) + return + + UnregisterSignal(listening_turf, COMSIG_TURF_EXPOSE) + +/// Handles overlay creation from supplied atom, adds created icon to the parent object, moves source atom to the nullspace. +/datum/component/sticker/proc/stick(atom/movable/stickering_atom, px, py) + our_sticker = stickering_atom + our_sticker.moveToNullspace() + + var/atom/parent_atom = parent + + sticker_overlay = mutable_appearance(icon = our_sticker.icon, icon_state = our_sticker.icon_state, layer = parent_atom.layer + 0.01, appearance_flags = RESET_COLOR) + sticker_overlay.pixel_w = px - world.icon_size / 2 + sticker_overlay.pixel_z = py - world.icon_size / 2 + + parent_atom.add_overlay(sticker_overlay) + + ADD_TRAIT(parent, TRAIT_STICKERED, REF(src)) + +/// Moves stickered atom from the nullspace, deletes component. +/datum/component/sticker/proc/peel() + var/atom/parent_atom = parent + var/turf/drop_location = isnull(listening_turf) ? parent_atom.drop_location() : listening_turf + + our_sticker.forceMove(drop_location) + our_sticker = null + + qdel(src) + +/datum/component/sticker/proc/on_ignite(datum/source) + SIGNAL_HANDLER + + qdel(src) + +/datum/component/sticker/proc/on_clean(datum/source, clean_types) + SIGNAL_HANDLER + + peel() + + return COMPONENT_CLEANED + +/datum/component/sticker/proc/on_turf_expose(datum/source, datum/gas_mixture/air, exposed_temperature) + SIGNAL_HANDLER + + if(exposed_temperature >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + qdel(src) diff --git a/code/datums/elements/sticker.dm b/code/datums/elements/sticker.dm deleted file mode 100644 index 3cc8e977daf..00000000000 --- a/code/datums/elements/sticker.dm +++ /dev/null @@ -1,53 +0,0 @@ -#define MAX_ALLOWED_STICKERS 12 - -/datum/element/sticker - ///The typepath for our attached sticker component - var/stick_type = /datum/component/attached_sticker - ///If TRUE, our attached_sticker can be washed off - var/washable = TRUE - -/datum/element/sticker/Attach(datum/target, sticker_type, cleanable=TRUE) - . = ..() - if(!isitem(target)) - return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) - RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(on_throw_impact)) - if(sticker_type) - stick_type = sticker_type - washable = cleanable - -/datum/element/sticker/Detach(datum/source) - . = ..() - UnregisterSignal(source, list(COMSIG_ITEM_AFTERATTACK, COMSIG_MOVABLE_IMPACT)) - -/datum/element/sticker/proc/on_afterattack(obj/item/source, atom/target, mob/living/user, prox, params) - SIGNAL_HANDLER - if(!prox) - return - if(!isatom(target)) - return - var/list/parameters = params2list(params) - if(!LAZYACCESS(parameters, ICON_X) || !LAZYACCESS(parameters, ICON_Y)) - return - var/divided_size = world.icon_size / 2 - var/px = text2num(LAZYACCESS(parameters, ICON_X)) - divided_size - var/py = text2num(LAZYACCESS(parameters, ICON_Y)) - divided_size - - user.do_attack_animation(target) - if(do_stick(source, target, user, px, py)) - target.balloon_alert_to_viewers("sticker sticked") - -///Add our stick_type to the target with px and py as pixel x and pixel y respectively -/datum/element/sticker/proc/do_stick(obj/item/source, atom/target, mob/living/user, px, py) - if(COUNT_TRAIT_SOURCES(target, TRAIT_STICKERED) >= MAX_ALLOWED_STICKERS) - source.balloon_alert_to_viewers("sticker won't stick!") - return FALSE - target.AddComponent(stick_type, px, py, source, user, washable) - return TRUE - -/datum/element/sticker/proc/on_throw_impact(obj/item/source, atom/hit_atom, datum/thrownthing/throwingdatum) - SIGNAL_HANDLER - if(prob(50) && do_stick(source, hit_atom, null, rand(-7,7), rand(-7,7))) - hit_atom.balloon_alert_to_viewers("sticker landed on sticky side!") - -#undef MAX_ALLOWED_STICKERS diff --git a/code/game/atom/atom_tool_acts.dm b/code/game/atom/atom_tool_acts.dm index 078615dba75..4b91f396095 100644 --- a/code/game/atom/atom_tool_acts.dm +++ b/code/game/atom/atom_tool_acts.dm @@ -25,8 +25,8 @@ return early_sig_return var/interact_return = is_left_clicking \ - ? tool.interact_with_atom(src, user) \ - : tool.interact_with_atom_secondary(src, user) + ? tool.interact_with_atom(src, user, modifiers) \ + : tool.interact_with_atom_secondary(src, user, modifiers) if(interact_return) return interact_return @@ -92,7 +92,7 @@ * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. * Return NONE to allow default interaction / tool handling. */ -/obj/item/proc/interact_with_atom(atom/interacting_with, mob/living/user) +/obj/item/proc/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) return NONE /** @@ -104,8 +104,8 @@ * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. * Return NONE to allow default interaction / tool handling. */ -/obj/item/proc/interact_with_atom_secondary(atom/interacting_with, mob/living/user) - return interact_with_atom(interacting_with, user) +/obj/item/proc/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) /* * Tool-specific behavior procs. diff --git a/code/game/objects/items/sticker.dm b/code/game/objects/items/sticker.dm deleted file mode 100644 index 459c8d211e4..00000000000 --- a/code/game/objects/items/sticker.dm +++ /dev/null @@ -1,131 +0,0 @@ -/// parent type for all other stickers. do not spawn directly -/obj/item/sticker - name = "sticker" - desc = "A sticker with some strong adhesive on the back, sticks to stuff!" - item_flags = NOBLUDGEON | XENOMORPH_HOLDABLE //funny - resistance_flags = FLAMMABLE - icon = 'icons/obj/toys/stickers.dmi' - w_class = WEIGHT_CLASS_TINY - throw_range = 3 - vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE | VIS_INHERIT_LAYER - ///If not null, pick an icon_state from this list - var/icon_states - /// If the sticker should be disincluded from normal sticker boxes. - var/contraband = FALSE - -/obj/item/sticker/Initialize(mapload) - . = ..() - if(icon_states) - icon_state = pick(icon_states) - pixel_y = rand(-3,3) - pixel_x = rand(-3,3) - AddElement(/datum/element/sticker) - -/obj/item/sticker/smile - name = "smiley sticker" - icon_state = "smile" - -/obj/item/sticker/frown - name = "frowny sticker" - icon_state = "frown" - -/obj/item/sticker/left_arrow - name = "left arrow sticker" - icon_state = "larrow" - -/obj/item/sticker/right_arrow - name = "right arrow sticker" - icon_state = "rarrow" - -/obj/item/sticker/star - name = "star sticker" - icon_state = "star1" - icon_states = list("star1","star2") - -/obj/item/sticker/heart - name = "heart sticker" - icon_state = "heart" - -/obj/item/sticker/googly - name = "googly eye sticker" - icon_state = "googly1" - icon_states = list("googly1","googly2") - -/obj/item/sticker/rev - name = "blue R sticker" - desc = "A sticker of FUCK THE SYSTEM, the galaxy's premiere hardcore punk band." - icon_state = "revhead" - -/obj/item/sticker/pslime - name = "slime plushie sticker" - icon_state = "pslime" - -/obj/item/sticker/pliz - name = "lizard plushie sticker" - icon_state = "plizard" - -/obj/item/sticker/pbee - name = "bee plushie sticker" - icon_state = "pbee" - -/obj/item/sticker/psnake - name = "snake plushie sticker" - icon_state = "psnake" - -/obj/item/sticker/robot - name = "bot sticker" - icon_state = "tile" - icon_states = list("tile","medbot","clean") - -/obj/item/sticker/toolbox - name = "toolbox sticker" - icon_state = "toolbox" - -/obj/item/sticker/clown - name = "clown sticker" - icon_state = "honkman" - -/obj/item/sticker/mime - name = "mime sticker" - icon_state = "silentman" - -/obj/item/sticker/assistant - name = "assistant sticker" - icon_state = "tider" - -/obj/item/sticker/syndicate - name = "syndicate sticker" - icon_state = "synd" - contraband = TRUE - -/obj/item/sticker/syndicate/c4 - name = "C-4 sticker" - icon_state = "c4" - -/obj/item/sticker/syndicate/bomb - name = "syndicate bomb sticker" - icon_state = "sbomb" - -/obj/item/sticker/syndicate/apc - name = "broken APC sticker" - icon_state = "milf" - -/obj/item/sticker/syndicate/larva - name = "larva sticker" - icon_state = "larva" - -/obj/item/sticker/syndicate/cult - name = "bloody paper sticker" - icon_state = "cult" - -/obj/item/sticker/syndicate/flash - name = "flash sticker" - icon_state = "flash" - -/obj/item/sticker/syndicate/op - name = "operative sticker" - icon_state = "newcop" - -/obj/item/sticker/syndicate/trap - name = "bear trap sticker" - icon_state = "trap" diff --git a/code/game/objects/items/stickers.dm b/code/game/objects/items/stickers.dm new file mode 100644 index 00000000000..c7288bed2dd --- /dev/null +++ b/code/game/objects/items/stickers.dm @@ -0,0 +1,195 @@ +#define MAX_STICKER_COUNT 15 + +/** + * What stickers can do? + * + * - They can be attached to any object. + * - They inherit cursor position when attached. + * - They are unclickable by mouse, I suppose? + * - They can be washed off. + * - They can be burnt off. + * - They can be attached to the object they collided with. + * - They play "attack" animation when attached. + * + */ + +/obj/item/sticker + name = "sticker" + desc = "A sticker with some strong adhesive on the back, sticks to stuff!" + + icon = 'icons/obj/toys/stickers.dmi' + + max_integrity = 50 + resistance_flags = FLAMMABLE + + throw_range = 3 + pressure_resistance = 0 + + item_flags = NOBLUDGEON | XENOMORPH_HOLDABLE //funny ~Jimmyl + w_class = WEIGHT_CLASS_TINY + + /// `list` or `null`, contains possible alternate `icon_states`. + var/list/icon_states + /// Whether sticker is legal and allowed to generate inside non-syndicate boxes. + var/contraband = FALSE + +/obj/item/sticker/Initialize(mapload) + . = ..() + + if(length(icon_states)) + icon_state = pick(icon_states) + +/obj/item/sticker/Bump(atom/bumped_atom) + if(prob(50) && attempt_attach(bumped_atom)) + bumped_atom.balloon_alert_to_viewers("sticker landed on sticky side!") + +/obj/item/sticker/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isatom(interacting_with)) + return NONE + + var/cursor_x = text2num(LAZYACCESS(modifiers, ICON_X)) + var/cursor_y = text2num(LAZYACCESS(modifiers, ICON_Y)) + + if(isnull(cursor_x) || isnull(cursor_y)) + return NONE + + if(attempt_attach(interacting_with, user, cursor_x, cursor_y)) + return ITEM_INTERACT_SUCCESS + + return NONE + +/** + * Attempts to attach sticker to an object. Returns `FALSE` if atom has more than + * `MAX_STICKER_COUNT` stickers, `TRUE` otherwise. If no `px` or `py` were passed + * picks random coordinates based on a `target`'s icon. + */ +/obj/item/sticker/proc/attempt_attach(atom/target, mob/user, px, py) + if(COUNT_TRAIT_SOURCES(target, TRAIT_STICKERED) >= MAX_STICKER_COUNT) + balloon_alert_to_viewers("sticker won't stick!") + return FALSE + + if(isnull(px) || isnull(py)) + var/icon/target_mask = icon(target.icon, target.icon_state) + + if(isnull(px)) + px = rand(1, target_mask.Width()) + + if(isnull(py)) + py = rand(1, target_mask.Height()) + + if(!isnull(user)) + user.do_attack_animation(target, used_item = src) + target.balloon_alert(user, "sticker sticked") + + target.AddComponent(/datum/component/sticker, src, user, get_dir(target, src), px, py) + return TRUE + +#undef MAX_STICKER_COUNT + +/obj/item/sticker/smile + name = "smiley sticker" + icon_state = "smile" + +/obj/item/sticker/frown + name = "frowny sticker" + icon_state = "frown" + +/obj/item/sticker/left_arrow + name = "left arrow sticker" + icon_state = "arrow-left" + +/obj/item/sticker/right_arrow + name = "right arrow sticker" + icon_state = "arrow-right" + +/obj/item/sticker/star + name = "star sticker" + icon_state = "star" + +/obj/item/sticker/heart + name = "heart sticker" + icon_state = "heart" + +/obj/item/sticker/googly + name = "googly eye sticker" + icon_state = "googly" + icon_states = list("googly", "googly-alt") + +/obj/item/sticker/rev + name = "blue R sticker" + desc = "A sticker of FUCK THE SYSTEM, the galaxy's premiere hardcore punk band." + icon_state = "revhead" + +/obj/item/sticker/pslime + name = "slime plushie sticker" + icon_state = "pslime" + +/obj/item/sticker/pliz + name = "lizard plushie sticker" + icon_state = "plizard" + +/obj/item/sticker/pbee + name = "bee plushie sticker" + icon_state = "pbee" + +/obj/item/sticker/psnake + name = "snake plushie sticker" + icon_state = "psnake" + +/obj/item/sticker/robot + name = "bot sticker" + icon_state = "tile" + icon_states = list("tile", "medbot", "clean") + +/obj/item/sticker/toolbox + name = "toolbox sticker" + icon_state = "soul" + +/obj/item/sticker/clown + name = "clown sticker" + icon_state = "honkman" + +/obj/item/sticker/mime + name = "mime sticker" + icon_state = "silentman" + +/obj/item/sticker/assistant + name = "assistant sticker" + icon_state = "tider" + +/obj/item/sticker/syndicate + name = "syndicate sticker" + icon_state = "synd" + contraband = TRUE + +/obj/item/sticker/syndicate/c4 + name = "C-4 sticker" + icon_state = "c4" + +/obj/item/sticker/syndicate/bomb + name = "syndicate bomb sticker" + icon_state = "sbomb" + +/obj/item/sticker/syndicate/apc + name = "broken APC sticker" + icon_state = "milf" + +/obj/item/sticker/syndicate/larva + name = "larva sticker" + icon_state = "larva" + +/obj/item/sticker/syndicate/cult + name = "bloody paper sticker" + icon_state = "cult" + +/obj/item/sticker/syndicate/flash + name = "flash sticker" + icon_state = "flash" + +/obj/item/sticker/syndicate/op + name = "operative sticker" + icon_state = "newcop" + +/obj/item/sticker/syndicate/trap + name = "bear trap sticker" + icon_state = "trap" diff --git a/code/game/objects/items/storage/boxes/service_boxes.dm b/code/game/objects/items/storage/boxes/service_boxes.dm index 14656f0f5f7..8dcc1f4f6b6 100644 --- a/code/game/objects/items/storage/boxes/service_boxes.dm +++ b/code/game/objects/items/storage/boxes/service_boxes.dm @@ -209,16 +209,21 @@ desc = "A box full of random stickers. Do give to the clown." /obj/item/storage/box/stickers/proc/generate_non_contraband_stickers_list() - . = list() + var/list/allowed_stickers = list() + for(var/obj/item/sticker/sticker_type as anything in subtypesof(/obj/item/sticker)) - if(!initial(sticker_type.contraband)) - . += sticker_type - return . + if(!sticker_type::contraband) + allowed_stickers += sticker_type + + return allowed_stickers + /obj/item/storage/box/stickers/PopulateContents() var/static/list/non_contraband - if(!non_contraband) + + if(isnull(non_contraband)) non_contraband = generate_non_contraband_stickers_list() - for(var/i in 1 to rand(4,8)) + + for(var/i in 1 to rand(4, 8)) var/type = pick(non_contraband) new type(src) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index d0d52486bc0..f61aaeb7472 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -674,6 +674,7 @@ /obj/item/storage/box/syndie_kit/stickers/PopulateContents() var/list/types = subtypesof(/obj/item/sticker/syndicate) + for(var/i in 1 to atom_storage.max_slots) var/type = pick(types) new type(src) diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index 51fb4686038..e23e6112a4b 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -250,8 +250,9 @@ discountable = SUPPLY_PACK_STD_DISCOUNTABLE /datum/supply_pack/costumes_toys/stickers/fill(obj/structure/closet/crate/crate) - for(var/i in 1 to rand(1,2)) + for(var/i in 1 to rand(1, 2)) new /obj/item/storage/box/stickers(crate) + if(prob(30)) // a pair of googly eyes because funny new /obj/item/storage/box/stickers/googly(crate) diff --git a/icons/obj/toys/stickers.dmi b/icons/obj/toys/stickers.dmi index ddc759fe0e3ddbf04fe443c48c6d6d0d48500539..8189890ecbd330369b96b661565ebf760830c4fa 100644 GIT binary patch literal 7280 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 literal 7392 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 Ang9R* diff --git a/tgstation.dme b/tgstation.dme index 6927d619992..5b32823d9ed 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1100,7 +1100,6 @@ #include "code\datums\components\areabound.dm" #include "code\datums\components\armor_plate.dm" #include "code\datums\components\atmos_reaction_recorder.dm" -#include "code\datums\components\attached_sticker.dm" #include "code\datums\components\aura_healing.dm" #include "code\datums\components\bakeable.dm" #include "code\datums\components\basic_inhands.dm" @@ -1283,6 +1282,7 @@ #include "code\datums\components\squeak.dm" #include "code\datums\components\stationloving.dm" #include "code\datums\components\stationstuck.dm" +#include "code\datums\components\sticker.dm" #include "code\datums\components\storm_hating.dm" #include "code\datums\components\strong_pull.dm" #include "code\datums\components\subtype_picker.dm" @@ -1565,7 +1565,6 @@ #include "code\datums\elements\spooky.dm" #include "code\datums\elements\squish.dm" #include "code\datums\elements\squish_sound.dm" -#include "code\datums\elements\sticker.dm" #include "code\datums\elements\strippable.dm" #include "code\datums\elements\structure_repair.dm" #include "code\datums\elements\swabbable.dm" @@ -2383,7 +2382,7 @@ #include "code\game\objects\items\signs.dm" #include "code\game\objects\items\skub.dm" #include "code\game\objects\items\spear.dm" -#include "code\game\objects\items\sticker.dm" +#include "code\game\objects\items\stickers.dm" #include "code\game\objects\items\surgery_tray.dm" #include "code\game\objects\items\syndie_spraycan.dm" #include "code\game\objects\items\tail_pin.dm"