diff --git a/code/game/objects/items/rcd/RDD.dm b/code/game/objects/items/rcd/RDD.dm
new file mode 100644
index 00000000000..b3b65931fe1
--- /dev/null
+++ b/code/game/objects/items/rcd/RDD.dm
@@ -0,0 +1,344 @@
+//RAPID DECORATION DEVICE
+
+/// Multiplier applied to cost when using RDD — each decoration costs this many matter units
+#define RDD_COST_MULTIPLIER 2
+
+/// All decoration designs available in the RDD
+GLOBAL_LIST_INIT(rdd_designs, list(
+ "Grasses" = list(
+ list("name" = "Plastic Grass Patch", "path" = /obj/structure/decoration/grass/first),
+ list("name" = "Plastic Grass Patch (Alt)", "path" = /obj/structure/decoration/grass/second),
+ list("name" = "Plastic Grass Patch (Alt 2)", "path" = /obj/structure/decoration/grass/third),
+ list("name" = "Plastic Grass Patch (Random)", "path" = /obj/structure/decoration/grass/style_random),
+ list("name" = "Plastic Brown Grass", "path" = /obj/structure/decoration/grass/brown/first),
+ list("name" = "Plastic Brown Grass (Alt)", "path" = /obj/structure/decoration/grass/brown/second),
+ list("name" = "Plastic Brown Grass (Alt 2)", "path" = /obj/structure/decoration/grass/brown/third),
+ list("name" = "Plastic Brown Grass (Random)", "path" = /obj/structure/decoration/grass/brown/style_random),
+ list("name" = "Plastic Jungle Grass", "path" = /obj/structure/decoration/jungle_grass/first),
+ list("name" = "Plastic Jungle Grass (Alt)", "path" = /obj/structure/decoration/jungle_grass/second),
+ list("name" = "Plastic Jungle Grass (Alt 2)", "path" = /obj/structure/decoration/jungle_grass/third),
+ list("name" = "Plastic Jungle Grass (Alt 3)", "path" = /obj/structure/decoration/jungle_grass/fourth),
+ list("name" = "Plastic Jungle Grass (Alt 4)", "path" = /obj/structure/decoration/jungle_grass/fifth),
+ list("name" = "Plastic Jungle Grass (Random)", "path" = /obj/structure/decoration/jungle_grass/style_random),
+ list("name" = "Plastic Jungle Grass B", "path" = /obj/structure/decoration/jungle_grass/b/first),
+ list("name" = "Plastic Jungle Grass B (Alt)", "path" = /obj/structure/decoration/jungle_grass/b/second),
+ list("name" = "Plastic Jungle Grass B (Alt 2)", "path" = /obj/structure/decoration/jungle_grass/b/third),
+ list("name" = "Plastic Jungle Grass B (Alt 3)", "path" = /obj/structure/decoration/jungle_grass/b/fourth),
+ list("name" = "Plastic Jungle Grass B (Alt 4)", "path" = /obj/structure/decoration/jungle_grass/b/fifth),
+ list("name" = "Plastic Jungle Grass B (Random)", "path" = /obj/structure/decoration/jungle_grass/b/style_random),
+ ),
+ "Bushes" = list(
+ list("name" = "Plastic Bush", "path" = /obj/structure/decoration/bush/first),
+ list("name" = "Plastic Bush (Alt)", "path" = /obj/structure/decoration/bush/second),
+ list("name" = "Plastic Bush (Alt 2)", "path" = /obj/structure/decoration/bush/third),
+ list("name" = "Plastic Bush (Alt 3)", "path" = /obj/structure/decoration/bush/fourth),
+ list("name" = "Plastic Bush (Random)", "path" = /obj/structure/decoration/bush/style_random),
+ list("name" = "Plastic Reeds", "path" = /obj/structure/decoration/bush/reed/first),
+ list("name" = "Plastic Reeds (Alt)", "path" = /obj/structure/decoration/bush/reed/second),
+ list("name" = "Plastic Reeds (Alt 2)", "path" = /obj/structure/decoration/bush/reed/third),
+ list("name" = "Plastic Reeds (Alt 3)", "path" = /obj/structure/decoration/bush/reed/fourth),
+ list("name" = "Plastic Reeds (Random)", "path" = /obj/structure/decoration/bush/reed/style_random),
+ list("name" = "Plastic Leafy Bush", "path" = /obj/structure/decoration/bush/leafy/first),
+ list("name" = "Plastic Leafy Bush (Alt)", "path" = /obj/structure/decoration/bush/leafy/second),
+ list("name" = "Plastic Leafy Bush (Alt 2)", "path" = /obj/structure/decoration/bush/leafy/third),
+ list("name" = "Plastic Leafy Bush (Random)", "path" = /obj/structure/decoration/bush/leafy/style_random),
+ list("name" = "Plastic Pale Bush", "path" = /obj/structure/decoration/bush/pale/first),
+ list("name" = "Plastic Pale Bush (Alt)", "path" = /obj/structure/decoration/bush/pale/second),
+ list("name" = "Plastic Pale Bush (Alt 2)", "path" = /obj/structure/decoration/bush/pale/third),
+ list("name" = "Plastic Pale Bush (Alt 3)", "path" = /obj/structure/decoration/bush/pale/fourth),
+ list("name" = "Plastic Pale Bush (Random)", "path" = /obj/structure/decoration/bush/pale/style_random),
+ list("name" = "Plastic Stalky Bush", "path" = /obj/structure/decoration/bush/stalky/first),
+ list("name" = "Plastic Stalky Bush (Alt)", "path" = /obj/structure/decoration/bush/stalky/second),
+ list("name" = "Plastic Stalky Bush (Alt 2)", "path" = /obj/structure/decoration/bush/stalky/third),
+ list("name" = "Plastic Stalky Bush (Random)", "path" = /obj/structure/decoration/bush/stalky/style_random),
+ list("name" = "Plastic Grassy Bush", "path" = /obj/structure/decoration/bush/grassy/first),
+ list("name" = "Plastic Grassy Bush (Alt)", "path" = /obj/structure/decoration/bush/grassy/second),
+ list("name" = "Plastic Grassy Bush (Alt 2)", "path" = /obj/structure/decoration/bush/grassy/third),
+ list("name" = "Plastic Grassy Bush (Alt 3)", "path" = /obj/structure/decoration/bush/grassy/fourth),
+ list("name" = "Plastic Grassy Bush (Random)", "path" = /obj/structure/decoration/bush/grassy/style_random),
+ list("name" = "Plastic Sparse Grass", "path" = /obj/structure/decoration/bush/sparsegrass/first),
+ list("name" = "Plastic Sparse Grass (Alt)", "path" = /obj/structure/decoration/bush/sparsegrass/second),
+ list("name" = "Plastic Sparse Grass (Alt 2)", "path" = /obj/structure/decoration/bush/sparsegrass/third),
+ list("name" = "Plastic Sparse Grass (Random)", "path" = /obj/structure/decoration/bush/sparsegrass/style_random),
+ list("name" = "Plastic Full Grass", "path" = /obj/structure/decoration/bush/fullgrass/first),
+ list("name" = "Plastic Full Grass (Alt)", "path" = /obj/structure/decoration/bush/fullgrass/second),
+ list("name" = "Plastic Full Grass (Alt 2)", "path" = /obj/structure/decoration/bush/fullgrass/third),
+ list("name" = "Plastic Full Grass (Random)", "path" = /obj/structure/decoration/bush/fullgrass/style_random),
+ list("name" = "Plastic Ferny Bush", "path" = /obj/structure/decoration/bush/ferny/first),
+ list("name" = "Plastic Ferny Bush (Alt)", "path" = /obj/structure/decoration/bush/ferny/second),
+ list("name" = "Plastic Ferny Bush (Alt 2)", "path" = /obj/structure/decoration/bush/ferny/third),
+ list("name" = "Plastic Ferny Bush (Random)", "path" = /obj/structure/decoration/bush/ferny/style_random),
+ list("name" = "Plastic Sunny Bush", "path" = /obj/structure/decoration/bush/sunny/first),
+ list("name" = "Plastic Sunny Bush (Alt)", "path" = /obj/structure/decoration/bush/sunny/second),
+ list("name" = "Plastic Sunny Bush (Alt 2)", "path" = /obj/structure/decoration/bush/sunny/third),
+ list("name" = "Plastic Sunny Bush (Random)", "path" = /obj/structure/decoration/bush/sunny/style_random),
+ list("name" = "Plastic Generic Bush", "path" = /obj/structure/decoration/bush/generic/first),
+ list("name" = "Plastic Generic Bush (Alt)", "path" = /obj/structure/decoration/bush/generic/second),
+ list("name" = "Plastic Generic Bush (Alt 2)", "path" = /obj/structure/decoration/bush/generic/third),
+ list("name" = "Plastic Generic Bush (Alt 3)", "path" = /obj/structure/decoration/bush/generic/fourth),
+ list("name" = "Plastic Generic Bush (Random)", "path" = /obj/structure/decoration/bush/generic/style_random),
+ list("name" = "Plastic Pointy Bush", "path" = /obj/structure/decoration/bush/pointy/first),
+ list("name" = "Plastic Pointy Bush (Alt)", "path" = /obj/structure/decoration/bush/pointy/second),
+ list("name" = "Plastic Pointy Bush (Alt 2)", "path" = /obj/structure/decoration/bush/pointy/third),
+ list("name" = "Plastic Pointy Bush (Alt 3)", "path" = /obj/structure/decoration/bush/pointy/fourth),
+ list("name" = "Plastic Pointy Bush (Random)", "path" = /obj/structure/decoration/bush/pointy/style_random),
+ list("name" = "Plastic Lavender Grass", "path" = /obj/structure/decoration/bush/lavendergrass/first),
+ list("name" = "Plastic Lavender Grass (Alt)", "path" = /obj/structure/decoration/bush/lavendergrass/second),
+ list("name" = "Plastic Lavender Grass (Alt 2)", "path" = /obj/structure/decoration/bush/lavendergrass/third),
+ list("name" = "Plastic Lavender Grass (Alt 3)", "path" = /obj/structure/decoration/bush/lavendergrass/fourth),
+ list("name" = "Plastic Lavender Grass (Random)", "path" = /obj/structure/decoration/bush/lavendergrass/style_random),
+ ),
+ "Flowers" = list(
+ list("name" = "Plastic Yellow-White Flowers", "path" = /obj/structure/decoration/bush/flowers_yw/first),
+ list("name" = "Plastic Yellow-White Flowers (Alt)", "path" = /obj/structure/decoration/bush/flowers_yw/second),
+ list("name" = "Plastic Yellow-White Flowers (Alt 2)", "path" = /obj/structure/decoration/bush/flowers_yw/third),
+ list("name" = "Plastic Yellow-White Flowers (Random)", "path" = /obj/structure/decoration/bush/flowers_yw/style_random),
+ list("name" = "Plastic Blue-Red Flowers", "path" = /obj/structure/decoration/bush/flowers_br/first),
+ list("name" = "Plastic Blue-Red Flowers (Alt)", "path" = /obj/structure/decoration/bush/flowers_br/second),
+ list("name" = "Plastic Blue-Red Flowers (Alt 2)", "path" = /obj/structure/decoration/bush/flowers_br/third),
+ list("name" = "Plastic Blue-Red Flowers (Random)", "path" = /obj/structure/decoration/bush/flowers_br/style_random),
+ list("name" = "Plastic Purple Flowers", "path" = /obj/structure/decoration/bush/flowers_pp/first),
+ list("name" = "Plastic Purple Flowers (Alt)", "path" = /obj/structure/decoration/bush/flowers_pp/second),
+ list("name" = "Plastic Purple Flowers (Alt 2)", "path" = /obj/structure/decoration/bush/flowers_pp/third),
+ list("name" = "Plastic Purple Flowers (Random)", "path" = /obj/structure/decoration/bush/flowers_pp/style_random),
+ ),
+ "Snow" = list(
+ list("name" = "Plastic Snowy Bush", "path" = /obj/structure/decoration/bush/snow/first),
+ list("name" = "Plastic Snowy Bush (Alt)", "path" = /obj/structure/decoration/bush/snow/second),
+ list("name" = "Plastic Snowy Bush (Alt 2)", "path" = /obj/structure/decoration/bush/snow/third),
+ list("name" = "Plastic Snowy Bush (Alt 3)", "path" = /obj/structure/decoration/bush/snow/fourth),
+ list("name" = "Plastic Snowy Bush (Alt 4)", "path" = /obj/structure/decoration/bush/snow/fifth),
+ list("name" = "Plastic Snowy Bush (Alt 5)", "path" = /obj/structure/decoration/bush/snow/sixth),
+ list("name" = "Plastic Snowy Bush (Random)", "path" = /obj/structure/decoration/bush/snow/style_random),
+ ),
+ "Jungle" = list(
+ list("name" = "Plastic Jungle Bush", "path" = /obj/structure/decoration/bush/jungle/first),
+ list("name" = "Plastic Jungle Bush (Alt)", "path" = /obj/structure/decoration/bush/jungle/second),
+ list("name" = "Plastic Jungle Bush (Alt 2)", "path" = /obj/structure/decoration/bush/jungle/third),
+ list("name" = "Plastic Jungle Bush (Random)", "path" = /obj/structure/decoration/bush/jungle/style_random),
+ list("name" = "Plastic Jungle Bush B", "path" = /obj/structure/decoration/bush/jungle/b/first),
+ list("name" = "Plastic Jungle Bush B (Alt)", "path" = /obj/structure/decoration/bush/jungle/b/second),
+ list("name" = "Plastic Jungle Bush B (Alt 2)", "path" = /obj/structure/decoration/bush/jungle/b/third),
+ list("name" = "Plastic Jungle Bush B (Random)", "path" = /obj/structure/decoration/bush/jungle/b/style_random),
+ list("name" = "Plastic Jungle Bush C", "path" = /obj/structure/decoration/bush/jungle/c/first),
+ list("name" = "Plastic Jungle Bush C (Alt)", "path" = /obj/structure/decoration/bush/jungle/c/second),
+ list("name" = "Plastic Jungle Bush C (Alt 2)", "path" = /obj/structure/decoration/bush/jungle/c/third),
+ list("name" = "Plastic Jungle Bush C (Random)", "path" = /obj/structure/decoration/bush/jungle/c/style_random),
+ list("name" = "Large Plastic Bush", "path" = /obj/structure/decoration/bush/large/first),
+ list("name" = "Large Plastic Bush (Alt)", "path" = /obj/structure/decoration/bush/large/second),
+ list("name" = "Large Plastic Bush (Alt 2)", "path" = /obj/structure/decoration/bush/large/third),
+ list("name" = "Large Plastic Bush (Random)", "path" = /obj/structure/decoration/bush/large/style_random),
+ ),
+ "Rocks" = list(
+ list("name" = "Plastic Rock", "path" = /obj/structure/decoration/rock/first),
+ list("name" = "Plastic Rock (Alt)", "path" = /obj/structure/decoration/rock/second),
+ list("name" = "Plastic Rock (Alt 2)", "path" = /obj/structure/decoration/rock/third),
+ list("name" = "Plastic Rock (Alt 3)", "path" = /obj/structure/decoration/rock/fourth),
+ list("name" = "Plastic Rock (Random)", "path" = /obj/structure/decoration/rock/style_random),
+ list("name" = "Plastic Rock Pile", "path" = /obj/structure/decoration/rock/pile/first),
+ list("name" = "Plastic Rock Pile (Alt)", "path" = /obj/structure/decoration/rock/pile/second),
+ list("name" = "Plastic Rock Pile (Alt 2)", "path" = /obj/structure/decoration/rock/pile/third),
+ list("name" = "Plastic Rock Pile (Random)", "path" = /obj/structure/decoration/rock/pile/style_random),
+ list("name" = "Plastic Jungle Rocks", "path" = /obj/structure/decoration/rock/pile/jungle/first),
+ list("name" = "Plastic Jungle Rocks (Alt)", "path" = /obj/structure/decoration/rock/pile/jungle/second),
+ list("name" = "Plastic Jungle Rocks (Alt 2)", "path" = /obj/structure/decoration/rock/pile/jungle/third),
+ list("name" = "Plastic Jungle Rocks (Alt 3)", "path" = /obj/structure/decoration/rock/pile/jungle/fourth),
+ list("name" = "Plastic Jungle Rocks (Alt 4)", "path" = /obj/structure/decoration/rock/pile/jungle/fifth),
+ list("name" = "Plastic Jungle Rocks (Random)", "path" = /obj/structure/decoration/rock/pile/jungle/style_random),
+ list("name" = "Large Plastic Rocks", "path" = /obj/structure/decoration/rock/pile/jungle/large/first),
+ list("name" = "Large Plastic Rocks (Alt)", "path" = /obj/structure/decoration/rock/pile/jungle/large/second),
+ list("name" = "Large Plastic Rocks (Alt 2)", "path" = /obj/structure/decoration/rock/pile/jungle/large/third),
+ list("name" = "Large Plastic Rocks (Random)", "path" = /obj/structure/decoration/rock/pile/jungle/large/style_random),
+ ),
+))
+
+/obj/item/construction/rdd
+ name = "rapid-decoration-device (RDD)"
+ desc = "A device used to rapidly deploy plastic decorative flora. \
+ Internally synthesizes cheap plastic replicas of natural scenery."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "rdd"
+ worn_icon_state = "RCD"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
+ custom_premium_price = PAYCHECK_COMMAND * 1
+ max_matter = 200
+ slot_flags = ITEM_SLOT_BELT
+ item_flags = NO_MAT_REDEMPTION | NOBLUDGEON
+ has_ammobar = TRUE
+ banned_upgrades = RCD_ALL_UPGRADES & ~RCD_UPGRADE_SILO_LINK
+ charge_icon_state = "rtd"
+ drop_sound = 'sound/items/handling/tools/rcd_drop.ogg'
+ pickup_sound = 'sound/items/handling/tools/rcd_pickup.ogg'
+ sound_vary = TRUE
+
+ /// Currently selected decoration path
+ var/obj/structure/decoration/selected_decoration
+ /// Currently selected category name (for UI)
+ var/selected_category
+ /// Currently selected design name (for UI)
+ var/selected_design_name
+
+/obj/item/construction/rdd/Initialize(mapload)
+ . = ..()
+ selected_category = GLOB.rdd_designs[1]
+ var/list/category_designs = GLOB.rdd_designs[selected_category]
+ if(length(category_designs))
+ var/list/first_design = category_designs[1]
+ selected_decoration = first_design["path"]
+ selected_design_name = first_design["name"]
+
+/obj/item/construction/rdd/examine(mob/user)
+ . = ..()
+ . += span_info("Currently set to produce: [span_bold(initial(selected_decoration.name))].")
+
+/obj/item/construction/rdd/attack_self(mob/user)
+ . = ..()
+ ui_interact(user)
+
+/obj/item/construction/rdd/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "RapidDecorationDevice", name)
+ ui.open()
+
+/obj/item/construction/rdd/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/spritesheet_batched/rdd),
+ )
+
+/obj/item/construction/rdd/ui_static_data(mob/user)
+ var/list/data = ..()
+
+ data["categories"] = list()
+ for(var/category in GLOB.rdd_designs)
+ var/list/cat_entry = list("cat_name" = category, "designs" = list())
+ for(var/list/design in GLOB.rdd_designs[category])
+ cat_entry["designs"] += list(list(
+ "name" = design["name"],
+ "icon" = sanitize_css_class_name(design["name"]),
+ ))
+ data["categories"] += list(cat_entry)
+
+ return data
+
+/obj/item/construction/rdd/ui_data(mob/user)
+ var/list/data = ..()
+
+ var/total_matter = get_matter(user)
+ data["matter"] = isnum(total_matter) ? total_matter : 0
+ data["max_matter"] = max_matter
+ data["selected_category"] = selected_category
+ data["selected_design"] = selected_design_name
+
+ return data
+
+/obj/item/construction/rdd/handle_ui_act(action, params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("design")
+ var/category = params["category"]
+ var/design_name = params["name"]
+ for(var/list/design as anything in GLOB.rdd_designs[category])
+ if(design["name"] == design_name)
+ selected_decoration = design["path"]
+ selected_category = category
+ selected_design_name = design_name
+ playsound(src, SFX_TOOL_SWITCH, 20, TRUE)
+ return TRUE
+
+ return TRUE
+
+/obj/item/construction/rdd/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
+ . = ..()
+ if(. & ITEM_INTERACT_ANY_BLOCKER)
+ return .
+
+ var/turf/target_turf = get_turf(interacting_with)
+ if(!target_turf)
+ return ITEM_INTERACT_BLOCKING
+
+ if(target_turf.is_blocked_turf(exclude_mobs = TRUE))
+ balloon_alert(user, "tile is blocked!")
+ return ITEM_INTERACT_BLOCKING
+
+ var/decoration_count = 0
+ for(var/obj/structure/decoration/existing in target_turf.contents)
+ decoration_count++
+ if(decoration_count >= 3)
+ balloon_alert(user, "too many decorations here!")
+ return ITEM_INTERACT_BLOCKING
+
+ var/cost = RDD_COST_MULTIPLIER
+ if(!useResource(cost, user, TRUE))
+ return ITEM_INTERACT_BLOCKING
+
+ playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
+ if(!do_after(user, 0.5 SECONDS, target_turf))
+ return ITEM_INTERACT_BLOCKING
+ if(!useResource(cost, user, TRUE))
+ return ITEM_INTERACT_BLOCKING
+
+ playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE)
+ new selected_decoration(target_turf)
+ useResource(cost, user)
+
+ log_tool("[key_name(user)] used [src] to create [initial(selected_decoration.name)] at [AREACOORD(target_turf)]")
+ return ITEM_INTERACT_SUCCESS
+
+/obj/item/construction/rdd/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers)
+ var/turf/target_turf = get_turf(interacting_with)
+ if(!target_turf)
+ return NONE
+
+ var/obj/structure/decoration/found = locate() in target_turf
+
+ if(!found)
+ return NONE
+
+ playsound(target_turf, 'sound/machines/click.ogg', 50, TRUE)
+ if(!do_after(user, 0.5 SECONDS, target_turf))
+ return ITEM_INTERACT_BLOCKING
+
+ playsound(target_turf, 'sound/items/deconstruct.ogg', 50, TRUE)
+ qdel(found)
+
+ log_tool("[key_name(user)] used [src] to deconstruct [found] at [AREACOORD(target_turf)]")
+ return ITEM_INTERACT_SUCCESS
+
+/obj/item/construction/rdd/borg
+ desc = "A device used to rapidly deploy plastic decorative flora. Uses the cyborg's internal cell."
+ /// energy usage per decoration
+ var/energyfactor = 0.05 * STANDARD_CELL_CHARGE
+
+/obj/item/construction/rdd/borg/get_matter(mob/user)
+ if(!iscyborg(user))
+ return 0
+ var/mob/living/silicon/robot/borgy = user
+ if(!borgy.cell)
+ return 0
+ max_matter = borgy.cell.maxcharge
+ return borgy.cell.charge
+
+/obj/item/construction/rdd/borg/useResource(amount, mob/user, dry_run)
+ var/mob/living/silicon/robot/borgy = user
+ if(!iscyborg(borgy))
+ return FALSE
+ if(!borgy.cell)
+ balloon_alert(user, "no cell found!")
+ return FALSE
+ if(borgy.cell.charge < amount * energyfactor)
+ balloon_alert(user, "insufficient charge!")
+ return FALSE
+ if(!dry_run)
+ playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE)
+ return borgy.cell.use(amount * energyfactor)
+ return TRUE
+
+/obj/item/construction/rdd/loaded
+ matter = 200
+
+#undef RDD_COST_MULTIPLIER
diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm
index 40f989ee088..93663639a9c 100644
--- a/code/game/objects/items/rcd/RHD.dm
+++ b/code/game/objects/items/rcd/RHD.dm
@@ -30,6 +30,8 @@
var/has_ammobar = FALSE
/// amount of divisions in the ammo indicator overlay/number of ammo indicator states
var/ammo_sections = 10
+ /// icon_state prefix used for charge overlays — defaults to icon_state if not set
+ var/charge_icon_state
/// bitflags for upgrades
var/construction_upgrades = NONE
/// bitflags for banned upgrades
@@ -179,7 +181,7 @@
if(has_ammobar)
var/ratio = ceil((matter / max_matter) * ammo_sections)
if(ratio > 0)
- . += "[icon_state]_charge[ratio]"
+ . += "[charge_icon_state || icon_state]_charge[ratio]"
/**
* Uses resource to do some action. Returns amount of resource used or TRUE/FALSE if only an dry run is required
@@ -193,7 +195,7 @@
if(!silo_mats || !silo_link)
if(matter < amount)
if(has_ammobar)
- flick("[icon_state]_empty", src)
+ flick("[charge_icon_state || icon_state]_empty", src)
if(user)
balloon_alert(user, "not enough matter!")
return FALSE
diff --git a/code/game/objects/structures/decorations.dm b/code/game/objects/structures/decorations.dm
new file mode 100644
index 00000000000..fb05b6478e2
--- /dev/null
+++ b/code/game/objects/structures/decorations.dm
@@ -0,0 +1,609 @@
+/obj/structure/decoration
+ name = "plastic decoration"
+ desc = "A cheap plastic imitation of nature. At least it doesn't need watering."
+ icon = 'icons/obj/fluff/flora/ausflora.dmi'
+ resistance_flags = FLAMMABLE
+ max_integrity = 20
+ anchored = TRUE
+ alpha = 210
+ /// No material refund on deconstruction, it's cheap plastic
+ custom_materials = null
+
+/obj/structure/decoration/Initialize(mapload)
+ . = ..()
+
+/obj/structure/decoration/atom_deconstruct(disassembled = TRUE)
+ if(!disassembled)
+ new /obj/effect/decal/cleanable/plastic(loc)
+ return
+
+/obj/structure/decoration/examine(mob/user)
+ . = ..()
+ . += span_notice("It's made of cheap, hollow plastic.")
+
+/obj/structure/decoration/grass
+ name = "plastic grass patch"
+ desc = "Fake grass. Feels like a brillo pad."
+ icon = /obj/structure/flora/grass/green::icon
+ icon_state = /obj/structure/flora/grass/green::icon_state
+
+/obj/structure/decoration/grass/first
+ // inherits from parent
+
+/obj/structure/decoration/grass/second
+ icon_state = /obj/structure/flora/grass/green/style_2::icon_state
+
+/obj/structure/decoration/grass/third
+ icon_state = /obj/structure/flora/grass/green/style_3::icon_state
+
+/obj/structure/decoration/grass/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "snowgrass[rand(1, 3)]gb"
+ update_appearance()
+
+/obj/structure/decoration/grass/brown
+ icon = /obj/structure/flora/grass/brown::icon
+ icon_state = /obj/structure/flora/grass/brown::icon_state
+
+/obj/structure/decoration/grass/brown/first
+
+/obj/structure/decoration/grass/brown/second
+ icon_state = /obj/structure/flora/grass/brown/style_2::icon_state
+
+/obj/structure/decoration/grass/brown/third
+ icon_state = /obj/structure/flora/grass/brown/style_3::icon_state
+
+/obj/structure/decoration/grass/brown/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "snowgrass[rand(1, 3)]bb"
+ update_appearance()
+
+/obj/structure/decoration/jungle_grass
+ name = "plastic jungle grass"
+ desc = "Plastic alien-looking grass. The jungle vibe without the jungle bugs."
+ icon = /obj/structure/flora/grass/jungle::icon
+ icon_state = /obj/structure/flora/grass/jungle::icon_state
+
+/obj/structure/decoration/jungle_grass/first
+
+/obj/structure/decoration/jungle_grass/second
+ icon_state = /obj/structure/flora/grass/jungle/a/style_2::icon_state
+
+/obj/structure/decoration/jungle_grass/third
+ icon_state = /obj/structure/flora/grass/jungle/a/style_3::icon_state
+
+/obj/structure/decoration/jungle_grass/fourth
+ icon_state = /obj/structure/flora/grass/jungle/a/style_4::icon_state
+
+/obj/structure/decoration/jungle_grass/fifth
+ icon_state = /obj/structure/flora/grass/jungle/a/style_5::icon_state
+
+/obj/structure/decoration/jungle_grass/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "grassa[rand(1, 5)]"
+ update_appearance()
+
+/obj/structure/decoration/jungle_grass/b
+ icon = /obj/structure/flora/grass/jungle/b::icon
+ icon_state = /obj/structure/flora/grass/jungle/b::icon_state
+
+/obj/structure/decoration/jungle_grass/b/first
+
+/obj/structure/decoration/jungle_grass/b/second
+ icon_state = /obj/structure/flora/grass/jungle/b/style_2::icon_state
+
+/obj/structure/decoration/jungle_grass/b/third
+ icon_state = /obj/structure/flora/grass/jungle/b/style_3::icon_state
+
+/obj/structure/decoration/jungle_grass/b/fourth
+ icon_state = /obj/structure/flora/grass/jungle/b/style_4::icon_state
+
+/obj/structure/decoration/jungle_grass/b/fifth
+ icon_state = /obj/structure/flora/grass/jungle/b/style_5::icon_state
+
+/obj/structure/decoration/jungle_grass/b/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "grassb[rand(1, 5)]"
+ update_appearance()
+
+/obj/structure/decoration/bush
+ name = "plastic bush"
+ desc = "A plastic shrub. Bristly to the touch and slightly off-color."
+ icon = /obj/structure/flora/bush::icon
+ icon_state = /obj/structure/flora/bush::icon_state
+
+/obj/structure/decoration/bush/first
+
+/obj/structure/decoration/bush/second
+ icon_state = /obj/structure/flora/bush/style_2::icon_state
+
+/obj/structure/decoration/bush/third
+ icon_state = /obj/structure/flora/bush/style_3::icon_state
+
+/obj/structure/decoration/bush/fourth
+ icon_state = /obj/structure/flora/bush/style_4::icon_state
+
+/obj/structure/decoration/bush/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "firstbush_[rand(1, 4)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/reed
+ name = "plastic reeds"
+ icon = /obj/structure/flora/bush/reed::icon
+ icon_state = /obj/structure/flora/bush/reed::icon_state
+
+/obj/structure/decoration/bush/reed/first
+
+/obj/structure/decoration/bush/reed/second
+ icon_state = /obj/structure/flora/bush/reed/style_2::icon_state
+
+/obj/structure/decoration/bush/reed/third
+ icon_state = /obj/structure/flora/bush/reed/style_3::icon_state
+
+/obj/structure/decoration/bush/reed/fourth
+ icon_state = /obj/structure/flora/bush/reed/style_4::icon_state
+
+/obj/structure/decoration/bush/reed/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "reedbush_[rand(1, 4)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/leafy
+ name = "plastic leafy bush"
+ icon = /obj/structure/flora/bush/leafy::icon
+ icon_state = /obj/structure/flora/bush/leafy::icon_state
+
+/obj/structure/decoration/bush/leafy/first
+
+/obj/structure/decoration/bush/leafy/second
+ icon_state = /obj/structure/flora/bush/leavy/style_2::icon_state
+
+/obj/structure/decoration/bush/leafy/third
+ icon_state = /obj/structure/flora/bush/leavy/style_3::icon_state
+
+/obj/structure/decoration/bush/leafy/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "leafybush_[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/pale
+ name = "plastic pale bush"
+ icon = /obj/structure/flora/bush/pale::icon
+ icon_state = /obj/structure/flora/bush/pale::icon_state
+
+/obj/structure/decoration/bush/pale/first
+
+/obj/structure/decoration/bush/pale/second
+ icon_state = /obj/structure/flora/bush/pale/style_2::icon_state
+
+/obj/structure/decoration/bush/pale/third
+ icon_state = /obj/structure/flora/bush/pale/style_3::icon_state
+
+/obj/structure/decoration/bush/pale/fourth
+ icon_state = /obj/structure/flora/bush/pale/style_4::icon_state
+
+/obj/structure/decoration/bush/pale/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "palebush_[rand(1, 4)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/stalky
+ name = "plastic stalky bush"
+ icon = /obj/structure/flora/bush/stalky::icon
+ icon_state = /obj/structure/flora/bush/stalky::icon_state
+
+/obj/structure/decoration/bush/stalky/first
+
+/obj/structure/decoration/bush/stalky/second
+ icon_state = /obj/structure/flora/bush/stalky/style_2::icon_state
+
+/obj/structure/decoration/bush/stalky/third
+ icon_state = /obj/structure/flora/bush/stalky/style_3::icon_state
+
+/obj/structure/decoration/bush/stalky/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "stalkybush_[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/grassy
+ name = "plastic grassy bush"
+ icon = /obj/structure/flora/bush/grassy::icon
+ icon_state = /obj/structure/flora/bush/grassy::icon_state
+
+/obj/structure/decoration/bush/grassy/first
+
+/obj/structure/decoration/bush/grassy/second
+ icon_state = /obj/structure/flora/bush/grassy/style_2::icon_state
+
+/obj/structure/decoration/bush/grassy/third
+ icon_state = /obj/structure/flora/bush/grassy/style_3::icon_state
+
+/obj/structure/decoration/bush/grassy/fourth
+ icon_state = /obj/structure/flora/bush/grassy/style_4::icon_state
+
+/obj/structure/decoration/bush/grassy/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "grassybush_[rand(1, 4)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/sparsegrass
+ name = "plastic sparse grass"
+ icon = /obj/structure/flora/bush/sparsegrass::icon
+ icon_state = /obj/structure/flora/bush/sparsegrass::icon_state
+
+/obj/structure/decoration/bush/sparsegrass/first
+
+/obj/structure/decoration/bush/sparsegrass/second
+ icon_state = /obj/structure/flora/bush/sparsegrass/style_2::icon_state
+
+/obj/structure/decoration/bush/sparsegrass/third
+ icon_state = /obj/structure/flora/bush/sparsegrass/style_3::icon_state
+
+/obj/structure/decoration/bush/sparsegrass/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "sparsegrass_[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/fullgrass
+ name = "plastic full grass"
+ icon = /obj/structure/flora/bush/fullgrass::icon
+ icon_state = /obj/structure/flora/bush/fullgrass::icon_state
+
+/obj/structure/decoration/bush/fullgrass/first
+
+/obj/structure/decoration/bush/fullgrass/second
+ icon_state = /obj/structure/flora/bush/fullgrass/style_2::icon_state
+
+/obj/structure/decoration/bush/fullgrass/third
+ icon_state = /obj/structure/flora/bush/fullgrass/style_3::icon_state
+
+/obj/structure/decoration/bush/fullgrass/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "fullgrass_[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/ferny
+ name = "plastic ferny bush"
+ icon = /obj/structure/flora/bush/ferny::icon
+ icon_state = /obj/structure/flora/bush/ferny::icon_state
+
+/obj/structure/decoration/bush/ferny/first
+
+/obj/structure/decoration/bush/ferny/second
+ icon_state = /obj/structure/flora/bush/ferny/style_2::icon_state
+
+/obj/structure/decoration/bush/ferny/third
+ icon_state = /obj/structure/flora/bush/ferny/style_3::icon_state
+
+/obj/structure/decoration/bush/ferny/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "fernybush_[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/sunny
+ name = "plastic sunny bush"
+ icon = /obj/structure/flora/bush/sunny::icon
+ icon_state = /obj/structure/flora/bush/sunny::icon_state
+
+/obj/structure/decoration/bush/sunny/first
+
+/obj/structure/decoration/bush/sunny/second
+ icon_state = /obj/structure/flora/bush/sunny/style_2::icon_state
+
+/obj/structure/decoration/bush/sunny/third
+ icon_state = /obj/structure/flora/bush/sunny/style_3::icon_state
+
+/obj/structure/decoration/bush/sunny/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "sunnybush_[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/generic
+ name = "plastic generic bush"
+ icon = /obj/structure/flora/bush/generic::icon
+ icon_state = /obj/structure/flora/bush/generic::icon_state
+
+/obj/structure/decoration/bush/generic/first
+
+/obj/structure/decoration/bush/generic/second
+ icon_state = /obj/structure/flora/bush/generic/style_2::icon_state
+
+/obj/structure/decoration/bush/generic/third
+ icon_state = /obj/structure/flora/bush/generic/style_3::icon_state
+
+/obj/structure/decoration/bush/generic/fourth
+ icon_state = /obj/structure/flora/bush/generic/style_4::icon_state
+
+/obj/structure/decoration/bush/generic/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "genericbush_[rand(1, 4)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/pointy
+ name = "plastic pointy bush"
+ icon = /obj/structure/flora/bush/pointy::icon
+ icon_state = /obj/structure/flora/bush/pointy::icon_state
+
+/obj/structure/decoration/bush/pointy/first
+
+/obj/structure/decoration/bush/pointy/second
+ icon_state = /obj/structure/flora/bush/pointy/style_2::icon_state
+
+/obj/structure/decoration/bush/pointy/third
+ icon_state = /obj/structure/flora/bush/pointy/style_3::icon_state
+
+/obj/structure/decoration/bush/pointy/fourth
+ icon_state = /obj/structure/flora/bush/pointy/style_4::icon_state
+
+/obj/structure/decoration/bush/pointy/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "pointybush_[rand(1, 4)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/lavendergrass
+ name = "plastic lavender grass"
+ icon = /obj/structure/flora/bush/lavendergrass::icon
+ icon_state = /obj/structure/flora/bush/lavendergrass::icon_state
+
+/obj/structure/decoration/bush/lavendergrass/first
+
+/obj/structure/decoration/bush/lavendergrass/second
+ icon_state = /obj/structure/flora/bush/lavendergrass/style_2::icon_state
+
+/obj/structure/decoration/bush/lavendergrass/third
+ icon_state = /obj/structure/flora/bush/lavendergrass/style_3::icon_state
+
+/obj/structure/decoration/bush/lavendergrass/fourth
+ icon_state = /obj/structure/flora/bush/lavendergrass/style_4::icon_state
+
+/obj/structure/decoration/bush/lavendergrass/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "lavendergrass_[rand(1, 4)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/flowers_yw
+ name = "plastic yellow-white flowers"
+ icon = /obj/structure/flora/bush/flowers_yw::icon
+ icon_state = /obj/structure/flora/bush/flowers_yw::icon_state
+
+/obj/structure/decoration/bush/flowers_yw/first
+
+/obj/structure/decoration/bush/flowers_yw/second
+ icon_state = /obj/structure/flora/bush/flowers_yw/style_2::icon_state
+
+/obj/structure/decoration/bush/flowers_yw/third
+ icon_state = /obj/structure/flora/bush/flowers_yw/style_3::icon_state
+
+/obj/structure/decoration/bush/flowers_yw/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "ywflowers_[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/flowers_br
+ name = "plastic blue-red flowers"
+ icon = /obj/structure/flora/bush/flowers_br::icon
+ icon_state = /obj/structure/flora/bush/flowers_br::icon_state
+
+/obj/structure/decoration/bush/flowers_br/first
+
+/obj/structure/decoration/bush/flowers_br/second
+ icon_state = /obj/structure/flora/bush/flowers_br/style_2::icon_state
+
+/obj/structure/decoration/bush/flowers_br/third
+ icon_state = /obj/structure/flora/bush/flowers_br/style_3::icon_state
+
+/obj/structure/decoration/bush/flowers_br/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "brflowers_[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/flowers_pp
+ name = "plastic purple flowers"
+ icon = /obj/structure/flora/bush/flowers_pp::icon
+ icon_state = /obj/structure/flora/bush/flowers_pp::icon_state
+
+/obj/structure/decoration/bush/flowers_pp/first
+
+/obj/structure/decoration/bush/flowers_pp/second
+ icon_state = /obj/structure/flora/bush/flowers_pp/style_2::icon_state
+
+/obj/structure/decoration/bush/flowers_pp/third
+ icon_state = /obj/structure/flora/bush/flowers_pp/style_3::icon_state
+
+/obj/structure/decoration/bush/flowers_pp/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "ppflowers_[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/snow
+ name = "plastic snowy bush"
+ desc = "A plastic bush dusted with fake snow. Year-round winter cheer."
+ icon = /obj/structure/flora/bush/snow::icon
+ icon_state = /obj/structure/flora/bush/snow::icon_state
+
+/obj/structure/decoration/bush/snow/first
+
+/obj/structure/decoration/bush/snow/second
+ icon_state = /obj/structure/flora/bush/snow/style_2::icon_state
+
+/obj/structure/decoration/bush/snow/third
+ icon_state = /obj/structure/flora/bush/snow/style_3::icon_state
+
+/obj/structure/decoration/bush/snow/fourth
+ icon_state = /obj/structure/flora/bush/snow/style_4::icon_state
+
+/obj/structure/decoration/bush/snow/fifth
+ icon_state = /obj/structure/flora/bush/snow/style_5::icon_state
+
+/obj/structure/decoration/bush/snow/sixth
+ icon_state = /obj/structure/flora/bush/snow/style_6::icon_state
+
+/obj/structure/decoration/bush/snow/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "snowbush[rand(1, 6)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/jungle
+ name = "plastic jungle bush"
+ desc = "Plastic jungle foliage. All the looks, none of the allergens."
+ icon = /obj/structure/flora/bush/jungle::icon
+ icon_state = /obj/structure/flora/bush/jungle::icon_state
+
+/obj/structure/decoration/bush/jungle/first
+
+/obj/structure/decoration/bush/jungle/second
+ icon_state = /obj/structure/flora/bush/jungle/a/style_2::icon_state
+
+/obj/structure/decoration/bush/jungle/third
+ icon_state = /obj/structure/flora/bush/jungle/a/style_3::icon_state
+
+/obj/structure/decoration/bush/jungle/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "busha[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/jungle/b
+ icon = /obj/structure/flora/bush/jungle/b::icon
+ icon_state = /obj/structure/flora/bush/jungle/b::icon_state
+
+/obj/structure/decoration/bush/jungle/b/first
+
+/obj/structure/decoration/bush/jungle/b/second
+ icon_state = /obj/structure/flora/bush/jungle/b/style_2::icon_state
+
+/obj/structure/decoration/bush/jungle/b/third
+ icon_state = /obj/structure/flora/bush/jungle/b/style_3::icon_state
+
+/obj/structure/decoration/bush/jungle/b/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "bushb[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/jungle/c
+ icon = /obj/structure/flora/bush/jungle/c::icon
+ icon_state = /obj/structure/flora/bush/jungle/c::icon_state
+
+/obj/structure/decoration/bush/jungle/c/first
+
+/obj/structure/decoration/bush/jungle/c/second
+ icon_state = /obj/structure/flora/bush/jungle/c/style_2::icon_state
+
+/obj/structure/decoration/bush/jungle/c/third
+ icon_state = /obj/structure/flora/bush/jungle/c/style_3::icon_state
+
+/obj/structure/decoration/bush/jungle/c/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "bushc[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/bush/large
+ name = "large plastic bush"
+ desc = "A large plastic bush. Dominates the room with its hollow presence."
+ icon = /obj/structure/flora/bush/large::icon
+ icon_state = /obj/structure/flora/bush/large::icon_state
+ pixel_x = /obj/structure/flora/bush/large::pixel_x
+ pixel_y = /obj/structure/flora/bush/large::pixel_y
+ layer = /obj/structure/flora/bush/large::layer
+ plane = /obj/structure/flora/bush/large::plane
+ density = /obj/structure/flora/bush/large::density
+
+/obj/structure/decoration/bush/large/first
+
+/obj/structure/decoration/bush/large/second
+ icon_state = /obj/structure/flora/bush/large/style_2::icon_state
+
+/obj/structure/decoration/bush/large/third
+ icon_state = /obj/structure/flora/bush/large/style_3::icon_state
+
+/obj/structure/decoration/bush/large/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "bush[rand(1, 3)]"
+ update_appearance()
+
+/obj/structure/decoration/rock
+ name = "plastic rock"
+ desc = "A hollow plastic boulder. Surprisingly convincing from a distance."
+ icon = /obj/structure/flora/rock::icon
+ icon_state = /obj/structure/flora/rock::icon_state
+
+/obj/structure/decoration/rock/first
+
+/obj/structure/decoration/rock/second
+ icon_state = /obj/structure/flora/rock/style_2::icon_state
+
+/obj/structure/decoration/rock/third
+ icon_state = /obj/structure/flora/rock/style_3::icon_state
+
+/obj/structure/decoration/rock/fourth
+ icon_state = /obj/structure/flora/rock/style_4::icon_state
+
+/obj/structure/decoration/rock/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "basalt[rand(1, 4)]"
+ update_appearance()
+
+/obj/structure/decoration/rock/pile
+ name = "plastic rock pile"
+ desc = "A pile of hollow plastic rocks. Light enough to kick over."
+ icon = /obj/structure/flora/rock/pile::icon
+ icon_state = /obj/structure/flora/rock/pile::icon_state
+
+/obj/structure/decoration/rock/pile/first
+
+/obj/structure/decoration/rock/pile/second
+ icon_state = /obj/structure/flora/rock/pile/style_2::icon_state
+
+/obj/structure/decoration/rock/pile/third
+ icon_state = /obj/structure/flora/rock/pile/style_3::icon_state
+
+/obj/structure/decoration/rock/pile/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "lavarocks[pick(3;1,3;2,1;3)]"
+ update_appearance()
+
+/obj/structure/decoration/rock/pile/jungle
+ name = "plastic jungle rocks"
+ desc = "Fake rocks with a jungle theme. No actual geological history."
+ icon = /obj/structure/flora/rock/pile/jungle::icon
+ icon_state = /obj/structure/flora/rock/pile/jungle::icon_state
+
+/obj/structure/decoration/rock/pile/jungle/first
+
+/obj/structure/decoration/rock/pile/jungle/second
+ icon_state = /obj/structure/flora/rock/pile/jungle/style_2::icon_state
+
+/obj/structure/decoration/rock/pile/jungle/third
+ icon_state = /obj/structure/flora/rock/pile/jungle/style_3::icon_state
+
+/obj/structure/decoration/rock/pile/jungle/fourth
+ icon_state = /obj/structure/flora/rock/pile/jungle/style_4::icon_state
+
+/obj/structure/decoration/rock/pile/jungle/fifth
+ icon_state = /obj/structure/flora/rock/pile/jungle/style_5::icon_state
+
+/obj/structure/decoration/rock/pile/jungle/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "rock[rand(1, 5)]"
+ update_appearance()
+
+/obj/structure/decoration/rock/pile/jungle/large
+ name = "plastic large rocks"
+ desc = "A pile of large fake jungle rocks. Surprisingly light."
+ icon = /obj/structure/flora/rock/pile/jungle/large::icon
+ icon_state = /obj/structure/flora/rock/pile/jungle/large::icon_state
+ pixel_x = /obj/structure/flora/rock/pile/jungle/large::pixel_x
+ pixel_y = /obj/structure/flora/rock/pile/jungle/large::pixel_y
+
+/obj/structure/decoration/rock/pile/jungle/large/first
+
+/obj/structure/decoration/rock/pile/jungle/large/second
+ icon_state = /obj/structure/flora/rock/pile/jungle/large/style_2::icon_state
+
+/obj/structure/decoration/rock/pile/jungle/large/third
+ icon_state = /obj/structure/flora/rock/pile/jungle/large/style_3::icon_state
+
+/obj/structure/decoration/rock/pile/jungle/large/style_random/Initialize(mapload)
+ . = ..()
+ icon_state = "rocks[rand(1, 3)]"
+ update_appearance()
diff --git a/code/modules/asset_cache/assets/rdd.dm b/code/modules/asset_cache/assets/rdd.dm
new file mode 100644
index 00000000000..a5f422b420b
--- /dev/null
+++ b/code/modules/asset_cache/assets/rdd.dm
@@ -0,0 +1,11 @@
+/datum/asset/spritesheet_batched/rdd
+ name = "rdd"
+
+/datum/asset/spritesheet_batched/rdd/create_spritesheets()
+ for(var/category in GLOB.rdd_designs)
+ for(var/list/design in GLOB.rdd_designs[category])
+ var/obj/structure/decoration/dec_path = design["path"]
+ var/sprite_name = sanitize_css_class_name(design["name"])
+ var/datum/universal_icon/icon = uni_icon(initial(dec_path.icon), initial(dec_path.icon_state))
+ icon.scale(32, 32)
+ insert_icon(sprite_name, icon)
diff --git a/code/modules/research/designs/autolathe/service_designs.dm b/code/modules/research/designs/autolathe/service_designs.dm
index 784cc5688b8..316feffcd93 100644
--- a/code/modules/research/designs/autolathe/service_designs.dm
+++ b/code/modules/research/designs/autolathe/service_designs.dm
@@ -661,3 +661,20 @@
RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE,
)
departmental_flags = DEPARTMENT_BITFLAG_SERVICE
+
+/datum/design/rdd
+ name = "Rapid Decoration Device (RDD)"
+ id = "rdd"
+ build_type = PROTOLATHE | AWAY_LATHE
+ materials = list(
+ /datum/material/iron = SHEET_MATERIAL_AMOUNT * 8,
+ /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 4,
+ /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2,
+ )
+ build_path = /obj/item/construction/rdd/loaded
+ category = list(
+ RND_CATEGORY_INITIAL,
+ RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE,
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SERVICE
+
diff --git a/code/modules/research/techweb/nodes/service_nodes.dm b/code/modules/research/techweb/nodes/service_nodes.dm
index c0a07e72c68..c1e5abb7bd1 100644
--- a/code/modules/research/techweb/nodes/service_nodes.dm
+++ b/code/modules/research/techweb/nodes/service_nodes.dm
@@ -38,6 +38,7 @@
"water_balloon",
"ticket_machine",
"radio_entertainment",
+ "rdd",
"photocopier",
)
diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi
index adaedb6483f..5c0cf513166 100644
Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi
index 454a225c82a..e96f9fa959b 100644
Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 0f1f57eb860..4c820902199 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index fd48e58b266..7575b8fdc36 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2830,6 +2830,7 @@
#include "code\game\objects\items\kirby_plants\synthetic_plants.dm"
#include "code\game\objects\items\rcd\RCD.dm"
#include "code\game\objects\items\rcd\RCL.dm"
+#include "code\game\objects\items\rcd\RDD.dm"
#include "code\game\objects\items\rcd\RHD.dm"
#include "code\game\objects\items\rcd\RLD.dm"
#include "code\game\objects\items\rcd\RPD.dm"
@@ -2969,6 +2970,7 @@
#include "code\game\objects\structures\chess.dm"
#include "code\game\objects\structures\containers.dm"
#include "code\game\objects\structures\curtains.dm"
+#include "code\game\objects\structures\decorations.dm"
#include "code\game\objects\structures\deployable_turret.dm"
#include "code\game\objects\structures\destructible_structures.dm"
#include "code\game\objects\structures\detectiveboard.dm"
@@ -3744,6 +3746,7 @@
#include "code\modules\asset_cache\assets\portraits.dm"
#include "code\modules\asset_cache\assets\radar.dm"
#include "code\modules\asset_cache\assets\rcd.dm"
+#include "code\modules\asset_cache\assets\rdd.dm"
#include "code\modules\asset_cache\assets\research_designs.dm"
#include "code\modules\asset_cache\assets\rtd.dm"
#include "code\modules\asset_cache\assets\safe.dm"
diff --git a/tgui/packages/tgui/interfaces/RapidDecorationDevice.tsx b/tgui/packages/tgui/interfaces/RapidDecorationDevice.tsx
new file mode 100644
index 00000000000..60baf422efa
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/RapidDecorationDevice.tsx
@@ -0,0 +1,102 @@
+import { ImageButton, LabeledList, Section, Stack } from 'tgui-core/components';
+import { capitalizeAll } from 'tgui-core/string';
+
+import { useBackend } from '../backend';
+import { Window } from '../layouts';
+
+type Design = {
+ name: string;
+ icon: string;
+};
+
+type Category = {
+ cat_name: string;
+ designs: Design[];
+};
+
+type Data = {
+ selected_category: string;
+ selected_design: string;
+ categories: Category[];
+ matter: number;
+ max_matter: number;
+};
+
+const DecorationCard = (props: {
+ design: Design;
+ selected: boolean;
+ onClick: () => void;
+}) => {
+ const { design, selected, onClick } = props;
+
+ return (
+
+ );
+};
+
+export const RapidDecorationDevice = () => {
+ const { act, data } = useBackend();
+ const {
+ categories = [],
+ selected_category,
+ selected_design,
+ matter,
+ max_matter,
+ } = data;
+
+ return (
+
+
+
+
+
+
+
+ {matter}/{max_matter} Units
+
+
+ {selected_design ? capitalizeAll(selected_design) : 'None'}
+
+
+
+
+
+
+ {categories.map((category) => (
+
+
+ {category.designs.map((design) => (
+
+
+ act('design', {
+ category: category.cat_name,
+ name: design.name,
+ })
+ }
+ />
+
+ ))}
+
+
+ ))}
+
+
+
+
+
+ );
+};