From d4a435f740504e6b1b13cefad279c18bda89fdad Mon Sep 17 00:00:00 2001 From: Christer2222 <25958019+Christer2222@users.noreply.github.com> Date: Fri, 28 Nov 2025 04:51:46 +0100 Subject: [PATCH] You can now color boxes using crayons (#30977) * Americanized spelling * more spelling * spelling + alt click * recoloring box, put it in hand and in bag * in backpack now * remove old comments * updates inventory if backpack is open * place in bags even on floor * null check + checks actual type * added the color tables * added empty subtypes. Fixed movign away bug * lint * mapload + as mob removal * early returning * removed type checks. Added more checks for coloring * added a description + early return on color tables * lint * documentation, formatting, HAS_TRAIT * formatting --- code/datums/components/paintable.dm | 2 +- code/game/objects/items/crayons.dm | 62 +-- code/game/objects/items/disks.dm | 3 + code/game/objects/items/random_items.dm | 3 + .../objects/items/weapons/storage/boxes.dm | 483 ++++++++++++++++++ .../structures/stool_bed_chair_nest/chairs.dm | 4 +- code/modules/power/lights.dm | 2 +- .../surgery/organs/augments_internal.dm | 3 + icons/obj/boxes.dmi | Bin 13004 -> 14336 bytes 9 files changed, 527 insertions(+), 35 deletions(-) diff --git a/code/datums/components/paintable.dm b/code/datums/components/paintable.dm index f0a7187149a..6450033d9ac 100644 --- a/code/datums/components/paintable.dm +++ b/code/datums/components/paintable.dm @@ -23,7 +23,7 @@ to_chat(user, "There is not enough paint in the can!") return RemoveCurrentCoat() - var/colour = spraycan.colour + var/colour = spraycan.crayon_color current_paint = colour var/atom/A = parent A.add_atom_colour(colour, FIXED_COLOUR_PRIORITY) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index ce92f86f5e8..aee47d3fb05 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -7,13 +7,13 @@ */ /obj/item/toy/crayon name = "crayon" - desc = "A colourful crayon. Looks tasty. Mmmm..." + desc = "A colorful crayon. Looks tasty. Mmmm..." icon = 'icons/obj/crayons.dmi' icon_state = "crayonred" w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BOTH_EARS - attack_verb = list("attacked", "coloured") - var/colour = COLOR_RED + attack_verb = list("attacked", "colored") + var/crayon_color = COLOR_RED var/drawtype = "rune" var/list/graffiti = list("body","amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","up","down","left","right","heart","borgsrogue","voxpox","shitcurity","catbeast","hieroglyphs1","hieroglyphs2","hieroglyphs3","security","syndicate1","syndicate2","nanotrasen","lie","valid","arrowleft","arrowright","arrowup","arrowdown","chicken","hailcrab","brokenheart","peace","scribble","scribble2","scribble3","skrek","squish","tunnelsnake","yip","youaredead") var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") @@ -126,7 +126,7 @@ to_chat(user, "You start drawing a [temp] on the [target.name].") busy = TRUE if(instant || do_after(user, 50 * toolspeed, target = target)) - var/obj/effect/decal/cleanable/crayon/C = new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp) + var/obj/effect/decal/cleanable/crayon/C = new /obj/effect/decal/cleanable/crayon(target, crayon_color, drawtype, temp) C.add_hiddenprint(user) to_chat(user, "You finish drawing [temp].") @@ -176,31 +176,31 @@ /obj/item/toy/crayon/orange name = "orange crayon" icon_state = "crayonorange" - colour = COLOR_ORANGE + crayon_color = COLOR_ORANGE dye_color = DYE_ORANGE /obj/item/toy/crayon/yellow name = "yellow crayon" icon_state = "crayonyellow" - colour = COLOR_YELLOW + crayon_color = COLOR_YELLOW dye_color = DYE_YELLOW /obj/item/toy/crayon/green name = "green crayon" icon_state = "crayongreen" - colour = COLOR_GREEN + crayon_color = COLOR_GREEN dye_color = DYE_GREEN /obj/item/toy/crayon/blue name = "blue crayon" icon_state = "crayonblue" - colour = COLOR_BLUE + crayon_color = COLOR_BLUE dye_color = DYE_BLUE /obj/item/toy/crayon/purple name = "purple crayon" icon_state = "crayonpurple" - colour = COLOR_PURPLE + crayon_color = COLOR_PURPLE dye_color = DYE_PURPLE /obj/item/toy/crayon/random/Initialize(mapload) @@ -209,39 +209,39 @@ switch(icon_state) if("crayonred") name = "red crayon" - colour = COLOR_RED + crayon_color = COLOR_RED dye_color = DYE_RED if("crayonorange") name = "orange crayon" - colour = COLOR_ORANGE + crayon_color = COLOR_ORANGE dye_color = DYE_ORANGE if("crayonyellow") name = "yellow crayon" - colour = COLOR_YELLOW + crayon_color = COLOR_YELLOW dye_color = DYE_YELLOW if("crayongreen") name = "green crayon" - colour = COLOR_GREEN + crayon_color = COLOR_GREEN dye_color = DYE_GREEN if("crayonblue") name = "blue crayon" - colour = COLOR_BLUE + crayon_color = COLOR_BLUE dye_color = DYE_BLUE if("crayonpurple") name = "purple crayon" - colour = COLOR_PURPLE + crayon_color = COLOR_PURPLE dye_color = DYE_PURPLE /obj/item/toy/crayon/black name = "black crayon" icon_state = "crayonblack" - colour = "#000000" + crayon_color = "#000000" dye_color = DYE_BLACK /obj/item/toy/crayon/white name = "white crayon" icon_state = "crayonwhite" - colour = "#FFFFFF" + crayon_color = "#FFFFFF" dye_color = DYE_WHITE /obj/item/toy/crayon/white/chalk @@ -254,22 +254,22 @@ name = "mime crayon" desc = "A very sad-looking crayon." icon_state = "crayonmime" - colour = "#FFFFFF" + crayon_color = "#FFFFFF" dye_color = DYE_MIME uses = 0 -/obj/item/toy/crayon/mime/update_window(mob/living/user as mob) - dat += "
   Change color
" +/obj/item/toy/crayon/mime/update_window(mob/living/user) + dat += "
   Change color
" ..() /obj/item/toy/crayon/mime/Topic(href,href_list) if(!Adjacent(usr) || usr.incapacitated()) return if(href_list["color"]) - if(colour != COLOR_WHITE) - colour = COLOR_WHITE + if(crayon_color != COLOR_WHITE) + crayon_color = COLOR_WHITE else - colour = COLOR_BLACK + crayon_color = COLOR_BLACK update_window(usr) else ..() @@ -277,12 +277,12 @@ /obj/item/toy/crayon/rainbow name = "rainbow crayon" icon_state = "crayonrainbow" - colour = "#FFF000" + crayon_color = "#FFF000" dye_color = DYE_RAINBOW uses = 0 -/obj/item/toy/crayon/rainbow/update_window(mob/living/user as mob) - dat += "
   Change color
" +/obj/item/toy/crayon/rainbow/update_window(mob/living/user) + dat += "
   Change color
" ..() /obj/item/toy/crayon/rainbow/Topic(href,href_list[]) @@ -292,7 +292,7 @@ var/temp = tgui_input_color(usr, "Please select crayon color.", "Crayon color") if(isnull(temp)) return - colour = temp + crayon_color = temp update_window(usr) else ..() @@ -328,8 +328,8 @@ if("Change Drawing") update_window(user) if("Change Color") - colour = tgui_input_color(user,"Please select a paint color.","Spray Can Color") - if(isnull(colour)) + crayon_color = tgui_input_color(user,"Please select a paint color.","Spray Can Color") + if(isnull(crayon_color)) return update_icon() @@ -358,7 +358,7 @@ attackee.EyeBlind(2 SECONDS) attackee.lip_style = "spray_face" - attackee.lip_color = colour + attackee.lip_color = crayon_color attackee.update_body() play_spray_sound(user) @@ -372,7 +372,7 @@ /obj/item/toy/crayon/spraycan/update_overlays() . = ..() var/image/I = image('icons/obj/crayons.dmi',icon_state = "[capped ? "spraycan_cap_colors" : "spraycan_colors"]") - I.color = colour + I.color = crayon_color . += I /obj/item/toy/crayon/spraycan/proc/cardborg_recolor(obj/target, mob/user) diff --git a/code/game/objects/items/disks.dm b/code/game/objects/items/disks.dm index ace9e2bdc6b..b26e0b84249 100644 --- a/code/game/objects/items/disks.dm +++ b/code/game/objects/items/disks.dm @@ -71,3 +71,6 @@ /obj/item/storage/box/disks/populate_contents() for(var/i in 1 to 7) new /obj/item/disk/data(src) + +/obj/item/storage/box/disks/empty/populate_contents() + return diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm index b5fd094b169..d3fcc301cf3 100644 --- a/code/game/objects/items/random_items.dm +++ b/code/game/objects/items/random_items.dm @@ -102,3 +102,6 @@ for(var/i in 1 to 6) var/nade = pick(grenadelist) new nade(src) + +/obj/item/storage/box/grenades/empty/populate_contents() + return diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 2e78e02d67c..cd8b5b0d1fc 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -30,6 +30,347 @@ pickup_sound = 'sound/items/handling/cardboardbox_pickup.ogg' foldable = /obj/item/stack/sheet/cardboard foldable_amt = 1 + /// list containing a list of what this box can change into when colored, probably don't want to manually edit this, use `add_to_colorable_lists()` + var/colorable_to + + /// list containing a list of what this box can change into when colored, used in the radial menu popup. Probably don't want to manually edit this, use `add_to_colorable_lists()` + var/colorable_to_radial + + /// state that determines what this can be colored to + var/color_state + +/obj/item/storage/box/red_trim + icon_state = "sec_box" + color_state = "red_trim" + +/obj/item/storage/box/red_trim/empty/populate_contents() + return + +/obj/item/storage/box/red_trim/Initialize(mapload) + . = ..() + if(color_state != "red_trim") + return + + add_to_colorable_lists("red box", COLOR_RED, /obj/item/storage/box/red_full/empty) + + add_to_colorable_lists("prisoner ID box", COLOR_BLACK, /obj/item/storage/box/prisoner/empty) + add_to_colorable_lists("evidence bag box", COLOR_BLACK, /obj/item/storage/box/evidence/empty) + add_to_colorable_lists("holobadge box", COLOR_BLACK, /obj/item/storage/box/holobadge/empty) + add_to_colorable_lists("handcuffs box", COLOR_BLACK, /obj/item/storage/box/handcuffs/empty) + add_to_colorable_lists("ziptie box", COLOR_BLACK, /obj/item/storage/box/zipties/empty) + add_to_colorable_lists("grenade box", COLOR_BLACK, /obj/item/storage/box/grenades/empty) + add_to_colorable_lists("flashbang box", COLOR_BLACK, /obj/item/storage/box/flashbangs/empty) + add_to_colorable_lists("teargas grenade box", COLOR_BLACK, /obj/item/storage/box/teargas/empty) + add_to_colorable_lists("emp grenade box", COLOR_BLACK, /obj/item/storage/box/emps/empty) + add_to_colorable_lists("flashbulb box", COLOR_BLACK, /obj/item/storage/box/flashes/empty) + +/obj/item/storage/box/red_full + icon_state = "red_full" + color_state = "red_full" + +/obj/item/storage/box/red_full/empty/populate_contents() + return + +/obj/item/storage/box/red_full/Initialize(mapload) + . = ..() + if(color_state != "red_full") + return + + add_to_colorable_lists("N2 box", COLOR_RED, /obj/item/storage/box/survival_vox/empty) + + add_to_colorable_lists("monkey cube box", COLOR_BLACK, /obj/item/storage/box/monkeycubes/empty) + add_to_colorable_lists("naera cube box", COLOR_BLACK, /obj/item/storage/box/monkeycubes/neaeracubes/empty) + add_to_colorable_lists("stok cube box", COLOR_BLACK, /obj/item/storage/box/monkeycubes/stokcubes/empty) + add_to_colorable_lists("farwa cube box", COLOR_BLACK, /obj/item/storage/box/monkeycubes/farwacubes/empty) + add_to_colorable_lists("wolpin cube box", COLOR_BLACK, /obj/item/storage/box/monkeycubes/wolpincubes/empty) + add_to_colorable_lists("nian worme cube box", COLOR_BLACK, /obj/item/storage/box/monkeycubes/nian_worme_cubes/empty) + add_to_colorable_lists("suspicious ID box", COLOR_BLACK, /obj/item/storage/box/id_syndie_box/empty) + +/obj/item/storage/box/id_syndie_box + name = "Suspicious ID box" + desc = "A dusty box meant for IDs." + icon_state = "id_syndie_box" + +/obj/item/storage/box/id_syndie_box/empty/populate_contents() + return + +/obj/item/storage/box/blue_trim + icon_state = "med_box" + color_state = "blue_trim" + +/obj/item/storage/box/blue_trim/empty/populate_contents() + return + +/obj/item/storage/box/blue_trim/Initialize(mapload) + . = ..() + if(color_state != "blue_trim") + return + + add_to_colorable_lists("syringe box", COLOR_BLACK, /obj/item/storage/box/syringes/empty) + add_to_colorable_lists("injector box", COLOR_BLACK, /obj/item/storage/box/injectors/empty) + add_to_colorable_lists("mask box", COLOR_BLACK, /obj/item/storage/box/masks/empty) + add_to_colorable_lists("pill bottle box", COLOR_BLACK, /obj/item/storage/box/pillbottles/empty) + add_to_colorable_lists("patch pack box", COLOR_BLACK, /obj/item/storage/box/patch_packs/empty) + add_to_colorable_lists("bodybag box", COLOR_BLACK, /obj/item/storage/box/bodybags/empty) + add_to_colorable_lists("glasses box", COLOR_BLACK, /obj/item/storage/box/rxglasses/empty) + add_to_colorable_lists("latex gloves box", COLOR_BLACK, /obj/item/storage/box/gloves/empty) + add_to_colorable_lists("iv bag box", COLOR_BLACK, /obj/item/storage/box/iv_bags/empty) + add_to_colorable_lists("beaker box", COLOR_BLACK, /obj/item/storage/box/beakers/empty) + add_to_colorable_lists("bluespace beaker box", COLOR_BLACK, /obj/item/storage/box/beakers/bluespace/empty) + + add_to_colorable_lists("blue box", COLOR_BLUE, /obj/item/storage/box/blue_full/empty) + + +/obj/item/storage/box/blue_full + icon_state = "blue_full" + color_state = "blue_full" + +/obj/item/storage/box/blue_full/empty/populate_contents() + return + +/obj/item/storage/box/blue_full/Initialize(mapload) + . = ..() + if(color_state != "blue_full") + return + + add_to_colorable_lists("blue O2 box", COLOR_BLUE, /obj/item/storage/box/survival/empty) + add_to_colorable_lists("yellow O2 box", COLOR_YELLOW, /obj/item/storage/box/engineer/empty) + add_to_colorable_lists("purple O2 box", COLOR_PURPLE, /obj/item/storage/box/survival_mining/empty) + + +/obj/item/storage/box/yellow_full + icon_state = "yellow_full" + color_state = "yellow_full" + +/obj/item/storage/box/yellow_full/empty/populate_contents() + return + +/obj/item/storage/box/yellow_full/Initialize(mapload) + . = ..() + if(color_state != "yellow_full") + return + + add_to_colorable_lists("toy box", COLOR_BLACK, /obj/item/storage/box/characters/empty) + +/obj/item/storage/box/green_full + icon_state = "green_full" + color_state = "green_full" + +/obj/item/storage/box/green_full/empty/populate_contents() + return + +/obj/item/storage/box/green_full/Initialize(mapload) + . = ..() + if(color_state != "green_full") + return + + add_to_colorable_lists("soviet box", COLOR_RED, /obj/item/storage/box/soviet/empty) + + +/obj/item/storage/box/orange_full + icon_state = "orange_full" + color_state = "orange_full" + +/obj/item/storage/box/orange_full/empty/populate_contents() + return + +/obj/item/storage/box/orange_full/Initialize(mapload) + . = ..() + if(color_state != "orange_full") + return + + add_to_colorable_lists("plasma box", COLOR_BLACK, /obj/item/storage/box/survival_plasmaman/empty) + + +/obj/item/storage/box/black_full + icon_state = "black_full" + color_state = "black_full" + +/obj/item/storage/box/black_full/empty/populate_contents() + return + +/obj/item/storage/box/black_full/Initialize(mapload) + . = ..() + if(color_state != "black_full") + return + + add_to_colorable_lists("nanotrasen box", COLOR_BLUE, /obj/item/storage/box/responseteam/empty) + add_to_colorable_lists("cybernetic Implants box", COLOR_BLUE, /obj/item/storage/box/cyber_implants/empty) + + add_to_colorable_lists("suspicious box", COLOR_RED, /obj/item/storage/box/fakesyndiesuit/empty) + add_to_colorable_lists("black O2 box", COLOR_RED, /obj/item/storage/box/survival_syndie/empty) + +/obj/item/storage/box/purple_full + icon_state = "purple_full" + color_state = "purple_full" + +/obj/item/storage/box/purple_full/empty/populate_contents() + return + +/obj/item/storage/box/purple_full/Initialize(mapload) + . = ..() + if(color_state != "purple_full") + return + + add_to_colorable_lists("purple handcuffs box", COLOR_GREEN, /obj/item/storage/box/alienhandcuffs/empty) + add_to_colorable_lists("purple and green box", COLOR_GREEN, /obj/item/storage/box/alien_box/empty) + + add_to_colorable_lists("wizard box", COLOR_YELLOW, /obj/item/storage/box/wizard/empty) + + add_to_colorable_lists("hug box", COLOR_RED, /obj/item/storage/box/hug/empty) + +/obj/item/storage/box/alien_box + icon_state = "alien_box" + color_state = "alien_box" + +/obj/item/storage/box/alien_box/empty/populate_contents() + return + +/obj/item/storage/box/alien_box/Initialize(mapload) + . = ..() + if(color_state != "alien_box") + return + + add_to_colorable_lists("purple handcuffs box", COLOR_GREEN, /obj/item/storage/box/alienhandcuffs/empty) + + +/obj/item/storage/box/AltClick(mob/user, modifiers) + var/active_hand = user.get_active_hand() + if(!istype(active_hand, /obj/item/toy/crayon)) // any other item than a crayon will trigger normal behavior + ..() + return + + if(colorable_to == null) // if the player is holding a crayon, but no available color exists, also trigger normal behaviour + ..() + return + + if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + return + + if(user.incapacitated()) + return + + var/obj/item/toy/crayon/crayon = active_hand + var/color_list = colorable_to_radial[crayon.crayon_color] + var/new_box + + // if we don't have a fitting color for the box, just open it + if(color_list == null) + . = ..() + return + + // some inventories might be of different sizes or accept different items, + // for consistency, we dissalow painting with items inside + if(length(contents)) + to_chat(usr, "\The [src] is too unstable to be painted, empty it first.") + return + + if(crayon.crayon_color == COLOR_WHITE) //if the box can be recolored, also allow clearing of color + to_chat(usr, "You clear [src] of its color.") + new_box = make_new_box(/obj/item/storage/box) + else + var/selected_icon = show_radial_menu(user, user, color_list) + + if(selected_icon == null) + return + + // check again in case the player moved after selecting the box, or put an item back into the box + if(!in_range(user, src) || user.incapacitated() || length(contents)) + return + + // check if the player dropped their crayon, or swapped to a different one + if(crayon != user.get_active_hand()) + return + + //make a new box from the color table with the selected id + new_box = make_new_box(colorable_to[crayon.crayon_color][selected_icon]) + + if(new_box != null) + var/place_in_hand = (user.get_inactive_hand() == src) //the active hand should have a crayon + + var/obj/item/storage/previous_bag + if(isstorage(src.loc)) + previous_bag = src.loc + + qdel(src) + // add to a bag if it was in one + if(previous_bag != null) + if(previous_bag.can_be_inserted(new_box)) + previous_bag.contents += new_box + // try to equip it in this hand first, without the sound playing + else if(place_in_hand) + if(!user.equip_to_slot_if_possible(new_box, ITEM_SLOT_RIGHT_HAND, 0, 1, 1)) + user.equip_to_slot_if_possible(new_box, ITEM_SLOT_LEFT_HAND, 0, 1, 1) + + // check if the box being deleted is open, if its not update the open inventory (prevents runtime) + if(user.s_active != null && user.s_active != src) + user.s_active.show_to(user) + + // if we don't place it in hand or in a bag, leave the box on the ground + +/obj/item/storage/box/proc/make_new_box(type) + var/turf = get_turf(src) + var/new_box = new type(turf) + return new_box + +/obj/item/storage/box/Initialize(mapload) + . = ..() + if(icon_state != "box") + return + + add_to_colorable_lists("red trimmed box", COLOR_RED, /obj/item/storage/box/red_trim/empty) + add_to_colorable_lists("mousetrap box", COLOR_RED, /obj/item/storage/box/mousetraps/empty) + add_to_colorable_lists("red box", COLOR_RED, /obj/item/storage/box/red_full/empty) + + add_to_colorable_lists("blue trimmed box", COLOR_BLUE, /obj/item/storage/box/blue_trim/empty) + add_to_colorable_lists("blue box", COLOR_BLUE, /obj/item/storage/box/blue_full/empty) + + add_to_colorable_lists("purple box", COLOR_PURPLE, /obj/item/storage/box/purple_full/empty) + + add_to_colorable_lists("yellow box", COLOR_YELLOW, /obj/item/storage/box/yellow_full/empty) + + add_to_colorable_lists("green box", COLOR_GREEN, /obj/item/storage/box/green_full/empty) + + add_to_colorable_lists("orange box", COLOR_ORANGE, /obj/item/storage/box/orange_full/empty) + + add_to_colorable_lists("cup box", COLOR_BLACK, /obj/item/storage/box/cups/empty) + add_to_colorable_lists("tape box", COLOR_BLACK, /obj/item/storage/box/tapes/empty) + add_to_colorable_lists("ID box", COLOR_BLACK, /obj/item/storage/box/ids/empty) + add_to_colorable_lists("pda box", COLOR_BLACK, /obj/item/storage/box/pdas/empty) + add_to_colorable_lists("disk box", COLOR_BLACK, /obj/item/storage/box/disks/empty) + add_to_colorable_lists("circuit box", COLOR_BLACK, /obj/item/storage/box/rndboards/empty) + add_to_colorable_lists("implants box", COLOR_BLACK, /obj/item/storage/box/trackimp/empty) + add_to_colorable_lists("black box", COLOR_BLACK, /obj/item/storage/box/black_full/empty) + +/obj/item/storage/box/examine(mob/user) + . = ..() + if(color_state != null || icon_state == "box") + . += "Alt-Click [src] with an appropriate crayon in hand to color it." + +/// helper function to add to the colors a box can turn into +/// * name - the name of the new box in the radial menu +/// * color - what color of crayon caused the box to change +/// * object - the new item to create when you recolor a box +/obj/item/storage/box/proc/add_to_colorable_lists(name, color, object) + if(colorable_to == null) + colorable_to = list() + + if(colorable_to[color] == null) + colorable_to[color] = list() + + if(colorable_to_radial == null) + colorable_to_radial = list() + + if(colorable_to_radial[color] == null) + colorable_to_radial[color] = list() + + colorable_to[color][name] = object + colorable_to_radial[color][name] = image_from_obj(object) + + +/obj/item/storage/box/proc/image_from_obj(obj/object) + return image(object.icon, object.icon_state) + /obj/item/storage/box/large name = "large box" @@ -57,6 +398,8 @@ new /obj/item/reagent_containers/hypospray/autoinjector/epinephrine(src) new /obj/item/flashlight/flare/glowstick/emergency(src) +/obj/item/storage/box/survival/empty/populate_contents() + return /obj/item/storage/box/survival_vox icon_state = "vox_box" @@ -71,6 +414,9 @@ new /obj/item/reagent_containers/hypospray/autoinjector/epinephrine(src) new /obj/item/flashlight/flare/glowstick/emergency(src) +/obj/item/storage/box/survival_vox/empty/populate_contents() + return + /obj/item/storage/box/survival_plasmaman icon_state = "plasma_box" @@ -84,6 +430,9 @@ new /obj/item/reagent_containers/hypospray/autoinjector/epinephrine(src) new /obj/item/flashlight/flare/glowstick/emergency(src) +/obj/item/storage/box/survival_plasmaman/empty/populate_contents() + return + /obj/item/storage/box/engineer icon_state = "eng_box" @@ -98,6 +447,9 @@ new /obj/item/reagent_containers/hypospray/autoinjector/epinephrine(src) new /obj/item/flashlight/flare/glowstick/emergency(src) +/obj/item/storage/box/engineer/empty/populate_contents() + return + /obj/item/storage/box/survival_mining icon_state = "min_box" @@ -112,6 +464,9 @@ new /obj/item/reagent_containers/hypospray/autoinjector/epinephrine(src) new /obj/item/flashlight/flare/glowstick/emergency(src) +/obj/item/storage/box/survival_mining/empty/populate_contents() + return + /obj/item/storage/box/survival_syndie icon_state = "syndie_box" desc = "A sleek, sturdy box." @@ -124,6 +479,9 @@ new /obj/item/reagent_containers/pill/initropidril(src) new /obj/item/flashlight/flare/glowstick/red(src) +/obj/item/storage/box/survival_syndie/empty/populate_contents() + return + /obj/item/storage/box/survival_syndie/traitor/populate_contents() new /obj/item/clothing/mask/gas/syndicate(src) new /obj/item/tank/internals/emergency_oxygen/engi/syndi(src) @@ -155,6 +513,9 @@ for(var/I in 1 to 6) new /obj/item/tape/random(src) +/obj/item/storage/box/tapes/empty/populate_contents() + return + /obj/item/storage/box/cups name = "box of paper cups" desc = "It has pictures of paper cups on the front." @@ -164,6 +525,9 @@ for(var/I in 1 to 7) new /obj/item/reagent_containers/drinks/sillycup(src) +/obj/item/storage/box/cups/empty/populate_contents() + return + /obj/item/storage/box/drinkingglasses name = "box of drinking glasses" desc = "It has a picture of drinking glasses on it." @@ -172,6 +536,9 @@ for(var/I in 1 to 6) new /obj/item/reagent_containers/drinks/drinkingglass(src) +/obj/item/storage/box/drinkingglasses/empty/populate_contents() + return + /obj/item/storage/box/condimentbottles name = "box of condiment bottles" desc = "It has a large ketchup smear on it." @@ -189,6 +556,9 @@ for(var/I in 1 to 6) new /obj/item/assembly/mousetrap(src) +/obj/item/storage/box/mousetraps/empty/populate_contents() + return + /obj/item/storage/box/ids name = "spare IDs" desc = "Has so many empty IDs." @@ -198,6 +568,9 @@ for(var/I in 1 to 7) new /obj/item/card/id(src) +/obj/item/storage/box/ids/empty/populate_contents() + return + /obj/item/storage/box/lights name = "replacement bulbs" desc = "This box is shaped on the inside so that only light tubes and bulbs fit." @@ -257,6 +630,9 @@ new /obj/item/cartridge/head(src) new newcart(src) +/obj/item/storage/box/pdas/empty/populate_contents() + return + /////////////////// /* Special Boxes */ /////////////////// @@ -334,6 +710,9 @@ new /obj/item/toy/character/cthulhu(src) new /obj/item/toy/character/lich(src) +/obj/item/storage/box/characters/empty/populate_contents() + return + /obj/item/storage/box/large/rnd_parts name = "\improper R&D components box" desc = "A full set of labelled components for assembling an R&D setup with. There are wordless picrographs of how to assemble everything on the back." @@ -403,6 +782,9 @@ for(var/I in 1 to 5) new monkey_cube_type(src) +/obj/item/storage/box/monkeycubes/empty/populate_contents() + return + /obj/item/storage/box/monkeycubes/obj_destruction(damage_flag) if(damage_flag == ACID || damage_flag == FIRE) for(var/obj/item/food/monkeycube/mkc in contents) @@ -419,30 +801,45 @@ icon_state = "farwa_box" monkey_cube_type = /obj/item/food/monkeycube/farwacube +/obj/item/storage/box/monkeycubes/farwacubes/empty/populate_contents() + return + /obj/item/storage/box/monkeycubes/stokcubes name = "stok cube box" desc = "Drymate brand stok cubes. Just add water!" icon_state = "stok_box" monkey_cube_type = /obj/item/food/monkeycube/stokcube +/obj/item/storage/box/monkeycubes/stokcubes/empty/populate_contents() + return + /obj/item/storage/box/monkeycubes/neaeracubes name = "neaera cube box" desc = "Drymate brand neaera cubes. Just add water!" icon_state = "neaera_box" monkey_cube_type = /obj/item/food/monkeycube/neaeracube +/obj/item/storage/box/monkeycubes/neaeracubes/empty/populate_contents() + return + /obj/item/storage/box/monkeycubes/wolpincubes name = "wolpin cube box" desc = "Drymate brand wolpin cubes. Just add water!" icon_state = "wolpin_box" monkey_cube_type = /obj/item/food/monkeycube/wolpincube +/obj/item/storage/box/monkeycubes/wolpincubes/empty/populate_contents() + return + /obj/item/storage/box/monkeycubes/nian_worme_cubes name = "nian worme cube box" desc = "Nian Trade Guild brand worme cubes. Just add water!" icon_state = "nian_worme_box" monkey_cube_type = /obj/item/food/monkeycube/nian_wormecube +/obj/item/storage/box/monkeycubes/nian_worme_cubes/empty/populate_contents() + return + /////////////////// /* Medical Boxes */ /////////////////// @@ -455,6 +852,9 @@ for(var/I in 1 to 7) new /obj/item/clothing/gloves/color/latex(src) +/obj/item/storage/box/gloves/empty/populate_contents() + return + /obj/item/storage/box/masks name = "sterile masks" desc = "This box contains masks of sterility." @@ -464,6 +864,9 @@ for(var/I in 1 to 7) new /obj/item/clothing/mask/surgical(src) +/obj/item/storage/box/masks/empty/populate_contents() + return + /obj/item/storage/box/syringes name = "syringes" desc = "A box full of syringes." @@ -473,6 +876,9 @@ for(var/I in 1 to 7) new /obj/item/reagent_containers/syringe(src) +/obj/item/storage/box/syringes/empty/populate_contents() + return + /obj/item/storage/box/beakers name = "beaker box" icon_state = "beaker_box" @@ -481,6 +887,9 @@ for(var/I in 1 to 7) new /obj/item/reagent_containers/glass/beaker(src) +/obj/item/storage/box/beakers/empty/populate_contents() + return + /obj/item/storage/box/beakers/bluespace name = "box of bluespace beakers" icon_state = "beaker_bs_box" @@ -489,6 +898,9 @@ for(var/I in 1 to 7) new /obj/item/reagent_containers/glass/beaker/bluespace(src) +/obj/item/storage/box/beakers/bluespace/empty/populate_contents() + return + /obj/item/storage/box/iv_bags name = "IV Bags" desc = "A box full of empty IV bags." @@ -498,6 +910,9 @@ for(var/I in 1 to 7) new /obj/item/reagent_containers/iv_bag(src) +/obj/item/storage/box/iv_bags/empty/populate_contents() + return + /obj/item/storage/box/autoinjectors name = "box of injectors" desc = "Contains autoinjectors." @@ -507,6 +922,9 @@ for(var/I in 1 to storage_slots) new /obj/item/reagent_containers/hypospray/autoinjector/epinephrine(src) +/obj/item/storage/box/autoinjectors/empty/populate_contents() + return + /obj/item/storage/box/autoinjectors/utility name = "autoinjector kit" desc = "A box with several utility autoinjectors for the economical miner." @@ -528,6 +946,9 @@ var/obj/item/storage/pill_bottle/P = new /obj/item/storage/pill_bottle(src) P.apply_wrapper_color(I) +/obj/item/storage/box/pillbottles/empty/populate_contents() + return + /obj/item/storage/box/patch_packs name = "box of patch packs" desc = "It has pictures of patch packs on its front." @@ -538,6 +959,9 @@ var/obj/item/storage/pill_bottle/P = new /obj/item/storage/pill_bottle/patch_pack(src) P.apply_wrapper_color(I) +/obj/item/storage/box/patch_packs/empty/populate_contents() + return + /obj/item/storage/box/bodybags name = "body bags" desc = "This box contains body bags." @@ -547,6 +971,9 @@ for(var/I in 1 to 7) new /obj/item/bodybag(src) +/obj/item/storage/box/bodybags/empty/populate_contents() + return + /obj/item/storage/box/rxglasses name = "prescription glasses" desc = "This box contains nerd glasses." @@ -556,6 +983,9 @@ for(var/I in 1 to 7) new /obj/item/clothing/glasses/regular(src) +/obj/item/storage/box/rxglasses/empty/populate_contents() + return + //////////////////// /* Security Boxes */ //////////////////// @@ -568,6 +998,9 @@ for(var/I in 1 to 7) new /obj/item/grenade/flashbang(src) +/obj/item/storage/box/flashbangs/empty/populate_contents() + return + /obj/item/storage/box/stingers name = "box of stinger grenades (WARNING)" desc = "WARNING: These devices are dangerous and can cause significant physical harm with repeated use." @@ -595,6 +1028,9 @@ for(var/I in 1 to 6) new /obj/item/flash(src) +/obj/item/storage/box/flashes/empty/populate_contents() + return + /obj/item/storage/box/teargas name = "box of tear gas grenades (WARNING)" desc = "WARNING: These devices are extremely dangerous and can cause blindness and skin irritation." @@ -604,6 +1040,9 @@ for(var/I in 1 to 7) new /obj/item/grenade/chem_grenade/teargas(src) +/obj/item/storage/box/teargas/empty/populate_contents() + return + /obj/item/storage/box/emps name = "emp grenades" desc = "A box with 5 emp grenades." @@ -613,6 +1052,9 @@ for(var/I in 1 to 5) new /obj/item/grenade/empgrenade(src) +/obj/item/storage/box/emps/empty/populate_contents() + return + /obj/item/storage/box/prisoner name = "prisoner IDs" desc = "Take away their last shred of dignity, their name." @@ -627,6 +1069,9 @@ new /obj/item/card/id/prisoner/six(src) new /obj/item/card/id/prisoner/seven(src) +/obj/item/storage/box/prisoner/empty/populate_contents() + return + /obj/item/storage/box/seccarts name = "spare R.O.B.U.S.T. Cartridges" desc = "A box full of R.O.B.U.S.T. Cartridges, used by Security." @@ -649,6 +1094,9 @@ new /obj/item/clothing/accessory/holobadge/cord(src) new /obj/item/clothing/accessory/holobadge/cord(src) +/obj/item/storage/box/holobadge/empty/populate_contents() + return + /obj/item/storage/box/evidence name = "evidence bag box" desc = "A box claiming to contain evidence bags." @@ -658,6 +1106,9 @@ for(var/I in 1 to 6) new /obj/item/evidencebag(src) +/obj/item/storage/box/evidence/empty/populate_contents() + return + /obj/item/storage/box/handcuffs name = "spare handcuffs" desc = "A box full of handcuffs." @@ -667,6 +1118,9 @@ for(var/I in 1 to 7) new /obj/item/restraints/handcuffs(src) +/obj/item/storage/box/handcuffs/empty/populate_contents() + return + /obj/item/storage/box/zipties name = "box of spare zipties" desc = "A box full of zipties." @@ -676,6 +1130,9 @@ for(var/I in 1 to 7) new /obj/item/restraints/handcuffs/cable/zipties(src) +/obj/item/storage/box/zipties/empty/populate_contents() + return + //////////////////// /* Implants Boxes */ //////////////////// @@ -693,6 +1150,9 @@ new /obj/item/bio_chip_pad(src) new /obj/item/gps/security(src) +/obj/item/storage/box/trackimp/empty/populate_contents() + return + /obj/item/storage/box/minertracker name = "boxed tracking bio-chip kit" desc = "For finding those who have died on the accursed lavaworld." @@ -1041,6 +1501,9 @@ for(var/I in 1 to 7) new /obj/item/restraints/handcuffs/alien(src) +/obj/item/storage/box/alienhandcuffs/empty/populate_contents() + return + /obj/item/storage/box/fakesyndiesuit name = "boxed space suit and helmet" desc = "A sleek, sturdy box used to hold replica spacesuits." @@ -1050,6 +1513,9 @@ new /obj/item/clothing/head/syndicatefake(src) new /obj/item/clothing/suit/syndicatefake(src) +/obj/item/storage/box/fakesyndiesuit/empty/populate_contents() + return + /obj/item/storage/box/enforcer_rubber name = "\improper Enforcer pistol kit (rubber)" desc = "A box marked with pictures of an Enforcer pistol, two ammo clips, and the word 'NON-LETHAL'." @@ -1179,6 +1645,8 @@ for(var/I in 1 to 6) new /obj/item/dnainjector/h2m(src) +/obj/item/storage/box/injectors/empty/populate_contents() + return #define NODESIGN "None" #define NANOTRASEN "NanotrasenStandard" @@ -1297,6 +1765,9 @@ new /obj/item/radio/centcom(src) new /obj/item/reagent_containers/hypospray/autoinjector/survival(src) +/obj/item/storage/box/responseteam/empty/populate_contents() + return + /obj/item/storage/box/deathsquad name = "boxed death kit" icon_state = "doom_box" @@ -1325,6 +1796,9 @@ new /obj/item/reagent_containers/patch/synthflesh(src) new /obj/item/reagent_containers/patch/synthflesh(src) +/obj/item/storage/box/soviet/empty/populate_contents() + return + /obj/item/storage/box/clown name = "clown box" desc = "A colorful cardboard box for the clown." @@ -1350,6 +1824,9 @@ new /obj/item/circuitboard/rdconsole/public(src) new /obj/item/circuitboard/rnd_network_controller(src) +/obj/item/storage/box/rndboards/empty/populate_contents() + return + /obj/item/storage/box/stockparts display_contents_with_number = TRUE @@ -1409,12 +1886,18 @@ playsound(loc, "rustle", 50, TRUE, -5) user.visible_message("[user] hugs \the [src].","You hug \the [src].") +/obj/item/storage/box/hug/empty/populate_contents() + return + /obj/item/storage/box/wizard name = "magical box" desc = "It's just an ordinary magical box." icon_state = "wizard_box" w_class = WEIGHT_CLASS_GIGANTIC +/obj/item/storage/box/wizard/empty/populate_contents() + return + /obj/item/storage/box/wizard/hardsuit name = "battlemage armour bundle" desc = "This box contains a bundle of Battlemage Armour." diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 1523fa3547b..429ab14f3f2 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -323,7 +323,7 @@ return if(istype(I, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = I - var/new_color = C.colour + var/new_color = C.crayon_color var/list/hsl = rgb2hsl(hex2num(copytext(new_color, 2, 4)), hex2num(copytext(new_color, 4, 6)), hex2num(copytext(new_color, 6, 8))) hsl[3] = max(hsl[3], 0.4) var/list/rgb = hsl2rgb(arglist(hsl)) @@ -441,7 +441,7 @@ /obj/structure/chair/sofa/bench/item_interaction(mob/living/user, obj/item/I, list/modifiers) if(istype(I, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = I - set_cover_color(C.colour) + set_cover_color(C.crayon_color) return ITEM_INTERACT_COMPLETE /obj/structure/chair/sofa/bench/proc/set_cover_color(new_color) diff --git a/code/modules/power/lights.dm b/code/modules/power/lights.dm index 9ef6334f372..018ccebce89 100644 --- a/code/modules/power/lights.dm +++ b/code/modules/power/lights.dm @@ -613,7 +613,7 @@ if(spraycan.capped) to_chat(user, "You can't spraypaint [src] with the cap still on!") return ITEM_INTERACT_COMPLETE - var/list/hsl = rgb2hsl(hex2num(copytext(spraycan.colour, 2, 4)), hex2num(copytext(spraycan.colour, 4, 6)), hex2num(copytext(spraycan.colour, 6, 8))) + var/list/hsl = rgb2hsl(hex2num(copytext(spraycan.crayon_color, 2, 4)), hex2num(copytext(spraycan.crayon_color, 4, 6)), hex2num(copytext(spraycan.crayon_color, 6, 8))) hsl[3] = max(hsl[3], 0.4) var/list/rgb = hsl2rgb(arglist(hsl)) var/new_color = "#[num2hex(rgb[1], 2)][num2hex(rgb[2], 2)][num2hex(rgb[3], 2)]" diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 5af55a58f4a..6480cafc523 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -1068,3 +1068,6 @@ while(length(contents) <= amount) implant = pick(boxed) new implant(src) + +/obj/item/storage/box/cyber_implants/empty/populate_contents() + return diff --git a/icons/obj/boxes.dmi b/icons/obj/boxes.dmi index 502423c891a19e16e0dc52be760c6ed4fe71717f..c49136f1b88eee92c1b2fa64ac4455ea8beff05e 100644 GIT binary patch literal 14336 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