diff --git a/code/__defines/tools.dm b/code/__defines/tools.dm
index 3caa322b023..05931f41a2f 100644
--- a/code/__defines/tools.dm
+++ b/code/__defines/tools.dm
@@ -62,6 +62,7 @@
#define IS_KNIFE(A) IS_TOOL(A, TOOL_KNIFE)
#define IS_HAMMER(A) IS_TOOL(A, TOOL_HAMMER)
#define IS_HOE(A) IS_TOOL(A, TOOL_HOE)
+#define IS_SHEARS(A) IS_TOOL(A, TOOL_SHEARS)
#define IS_HEMOSTAT(A) IS_TOOL(A, TOOL_HEMOSTAT)
#define IS_RETRACTOR(A) IS_TOOL(A, TOOL_RETRACTOR)
diff --git a/code/datums/extensions/extensions.dm b/code/datums/extensions/extensions.dm
index 196d396e30a..d8925181840 100644
--- a/code/datums/extensions/extensions.dm
+++ b/code/datums/extensions/extensions.dm
@@ -56,9 +56,13 @@
qdel(existing_extension)
if(initial(extension_base_type.flags) & EXTENSION_FLAG_IMMEDIATE)
- var/datum/extension/created = construct_extension_instance(extension_type, source, args.Copy(3))
+ var/list/construct_args = args.Copy(3)
+ var/datum/extension/created = construct_extension_instance(extension_type, source, construct_args)
source.extensions[extension_base_type] = created
- created.post_construction()
+ if(length(construct_args))
+ created.post_construction(arglist(construct_args))
+ else
+ created.post_construction()
return created
var/list/extension_data = list(extension_type, source)
@@ -89,9 +93,13 @@
return
if(islist(.)) //a list, so it's expecting to be lazy-loaded
var/list/extension_data = .
- var/datum/extension/created = construct_extension_instance(extension_data[1], extension_data[2], extension_data.Copy(3))
+ var/list/construct_args = extension_data.Copy(3)
+ var/datum/extension/created = construct_extension_instance(extension_data[1], extension_data[2], construct_args)
source.extensions[base_type] = created
- created.post_construction()
+ if(length(construct_args))
+ created.post_construction(arglist(construct_args))
+ else
+ created.post_construction()
return created
//Fast way to check if it has an extension, also doesn't trigger instantiation of lazy loaded extensions
diff --git a/code/datums/extensions/padding/padding.dm b/code/datums/extensions/padding/padding.dm
new file mode 100644
index 00000000000..f75445c9ae2
--- /dev/null
+++ b/code/datums/extensions/padding/padding.dm
@@ -0,0 +1,132 @@
+// TODO: Maybe generalize this to handle any sort of component-composition that can have a separate material and painting?
+/// An extension that unifies padding state and interactions.
+/datum/extension/padding
+ abstract_type = /datum/extension/padding
+ base_type = /datum/extension/padding
+ expected_type = /obj
+ flags = EXTENSION_FLAG_IMMEDIATE // logic must run on creation
+ /// The paint color for the padding represented by this extension.
+ /// '#FFFFFF' is treated as 'painted white', while 'null' is treated as 'unpainted'.
+ VAR_PROTECTED/padding_color
+ VAR_PROTECTED/decl/material/padding_material
+ // TODO: Add some better way of determining if a stack is usable, for more extensibility in modpacks.
+ /// What stack types can be used to add padding?
+ VAR_PRIVATE/static/padding_stack_types = list(
+ /obj/item/stack/material/skin, // leather, fur
+ /obj/item/stack/material/bolt, // cloth
+ )
+ /// An internal variable used to hold a typecache for the above list.
+ VAR_PRIVATE/static/_padding_stack_typecache
+
+/datum/extension/padding/New(datum/holder, _padding_material, _padding_color)
+ . = ..()
+ if(!_padding_stack_typecache)
+ _padding_stack_typecache = typecacheof(padding_stack_types)
+
+// Must be here so our holder's get_extension calls work.
+/datum/extension/padding/post_construction(_padding_material, _padding_color)
+ . = ..()
+ add_padding(_padding_material, _padding_color)
+
+/// Returns an object's padding material.
+/datum/extension/padding/proc/get_padding_material()
+ RETURN_TYPE(/decl/material)
+ return padding_material
+
+/// Returns the color of the padding, either the painted/dyed color or (optionally) the underlying material color.
+/datum/extension/padding/proc/get_padding_color(use_material_color = TRUE)
+ var/decl/material/padding_material = get_padding_material()
+ return padding_color || (use_material_color ? padding_material?.color : null)
+
+/// Used to change just the paint color on padding.
+/datum/extension/padding/proc/set_padding_color(new_color)
+ padding_color = new_color
+
+/datum/extension/padding/proc/handle_use_item(obj/item/used_item, mob/user)
+ if(isstack(used_item))
+ if(padding_material)
+ to_chat(user, SPAN_NOTICE("\The [holder] is already padded."))
+ return TRUE
+ var/decl/material/new_padding_material = used_item.material
+ if(!is_type_in_typecache(used_item, _padding_stack_typecache) || !(new_padding_material.flags & MAT_FLAG_PADDING))
+ to_chat(user, SPAN_NOTICE("You cannot pad \the [holder] with that."))
+ return TRUE
+ var/obj/item/stack/used_stack = used_item
+ if(!used_stack.can_use(1))
+ to_chat(user, SPAN_NOTICE("You need at least [used_stack.get_string_for_amount(1)] to pad \the [holder]."))
+ return TRUE
+ if(!used_item.user_can_attack_with(user, holder))
+ return TRUE
+ to_chat(user, SPAN_NOTICE("You pad \the [holder] with [used_stack.get_string_for_amount(1)]."))
+ used_stack.use(1)
+ if(new_padding_material.sound_manipulate)
+ playsound(get_turf(holder), new_padding_material.sound_manipulate, 50, TRUE)
+ add_padding(new_padding_material.type, used_stack.paint_color)
+ return TRUE
+ else if(IS_SHEARS(used_item)) // can use shears or wirecutters
+ if(!padding_material)
+ to_chat(user, SPAN_NOTICE("\The [holder] has no padding to remove."))
+ return TRUE
+ if(!used_item.user_can_attack_with(user, holder))
+ return TRUE
+ to_chat(user, SPAN_NOTICE("You remove \the [padding_material.adjective_name] padding from \the [holder]."))
+ var/use_tool_sound = used_item.get_tool_sound(TOOL_SHEARS)
+ if(use_tool_sound)
+ playsound(get_turf(holder), use_tool_sound, 100, TRUE)
+ remove_padding()
+ return TRUE
+ return FALSE
+
+// TODO: Unify this somewhere on /obj, maybe?
+/datum/extension/padding/proc/update_holder_name()
+ if(QDELETED(src) || QDELETED(holder))
+ return
+ if(istype(holder, /obj/structure))
+ var/obj/structure/structure_holder = holder
+ structure_holder.update_materials() // update name and description if needed
+ else if(isitem(holder))
+ var/obj/item/item_holder = holder
+ item_holder.update_name()
+
+/datum/extension/padding/proc/add_padding(padding_type, new_padding_color, do_icon_update = TRUE)
+ ASSERT(padding_type)
+ var/old_padding_material = padding_material
+ padding_material = ispath(padding_type) ? GET_DECL(padding_type) : padding_type
+ padding_color = new_padding_color
+ update_matter(old_padding_material, padding_material)
+ if(do_icon_update)
+ var/obj/obj_holder = holder
+ addtimer(CALLBACK(src, PROC_REF(update_holder_name)), 0, TIMER_UNIQUE) // Update at the end of the tick.
+ obj_holder.queue_icon_update()
+
+/datum/extension/padding/proc/remove_padding(do_icon_update = TRUE)
+ if(padding_material)
+ var/list/res = padding_material.create_object(get_turf(holder))
+ if(padding_color)
+ for(var/obj/item/thing in res)
+ thing.set_color(padding_color)
+ var/old_padding_material = padding_material
+ padding_material = null
+ padding_color = null
+ update_matter(old_padding_material, padding_material)
+ if(do_icon_update)
+ var/obj/obj_holder = holder
+ if(istype(obj_holder, /obj/structure))
+ var/obj/structure/structure_holder = obj_holder
+ structure_holder.update_materials() // update name and description if needed
+ else if(isitem(obj_holder))
+ var/obj/item/item_holder = obj_holder
+ item_holder.update_name()
+ obj_holder.queue_icon_update()
+
+/datum/extension/padding/proc/update_matter(decl/material/old_padding, decl/material/new_padding)
+ var/obj/obj_holder = holder
+ var/matter_mult = obj_holder.get_matter_amount_modifier()
+ if(LAZYLEN(obj_holder.matter) && old_padding)
+ obj_holder.matter[old_padding.type] -= MATTER_AMOUNT_TRACE * matter_mult
+ if(!obj_holder.matter[old_padding.type])
+ obj_holder.matter -= old_padding.type
+ if(new_padding)
+ LAZYINITLIST(obj_holder.matter)
+ obj_holder.matter[new_padding.type] += MATTER_AMOUNT_TRACE * matter_mult
+ UNSETEMPTY(obj_holder.matter)
\ No newline at end of file
diff --git a/code/game/objects/__objs.dm b/code/game/objects/__objs.dm
index d950aa3925c..23cf27f6002 100644
--- a/code/game/objects/__objs.dm
+++ b/code/game/objects/__objs.dm
@@ -136,6 +136,9 @@
wrench_floor_bolts(user, null, used_item)
update_icon()
return TRUE
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ if(padding_extension && padding_extension.handle_use_item(used_item, user))
+ return TRUE
return ..()
/obj/proc/wrench_floor_bolts(mob/user, delay = 2 SECONDS, obj/item/tool)
diff --git a/code/game/objects/items/crutches.dm b/code/game/objects/items/crutches.dm
index 5a9ac03b477..4f22b7a8f2c 100644
--- a/code/game/objects/items/crutches.dm
+++ b/code/game/objects/items/crutches.dm
@@ -8,21 +8,20 @@
material_alteration = MAT_FLAG_ALTERATION_ALL
w_class = ITEM_SIZE_LARGE
max_health = null // autoset from material
- /// The material used for the padding. If null, the crutch is unpadded. Initially a typepath, set to an instance in Initialize.
- var/decl/material/padding_material
- /// The color used for the padding, in the case of paint or dye. If null, falls back to padding material color.
- var/padding_color = null
+ /// The padding extension type for this item. If null, no extension is created and this item cannot be padded.
+ var/padding_extension_type = /datum/extension/padding
+ /// The initial material used when instantiating this item's padding extension.
+ /// Should not be modified at runtime.
+ var/decl/material/initial_padding_material
+ /// The initial color used for the padding, representing paint or dye.
+ /// If null, falls back to material color if we have MAT_FLAG_ALTERATION_COLOR.
+ /// COLOR_WHITE is treated differently than null color is.
+ var/initial_padding_color
/obj/item/crutch/Initialize(ml, material_key)
- padding_material = GET_DECL(padding_material)
- return ..()
-
-// potential todo: to avoid matter shenanigans make padding a separate item that can be removed via alt interaction and added via attackby?
-// add padding by clicking with sewing tools in active hand and fabric in offhand?
-/obj/item/crutch/create_matter()
. = ..()
- if(padding_material)
- matter[padding_material.type] += MATTER_AMOUNT_TRACE
+ if(padding_extension_type && initial_padding_material)
+ get_or_create_extension(src, padding_extension_type, initial_padding_material, initial_padding_color)
/obj/item/crutch/get_stance_support_value()
return LIMB_UNUSABLE
@@ -32,28 +31,35 @@
/obj/item/crutch/on_update_icon()
. = ..()
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/decl/material/padding_material = padding_extension?.get_padding_material()
if(padding_material)
- add_overlay(overlay_image(icon, "[icon_state]-padding", padding_color || padding_material.color, RESET_COLOR | RESET_ALPHA))
+ add_overlay(overlay_image(icon, "[icon_state]-padding", padding_extension.get_padding_color(material_alteration & MAT_FLAG_ALTERATION_COLOR), RESET_COLOR | RESET_ALPHA))
/obj/item/crutch/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE)
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/decl/material/padding_material = padding_extension?.get_padding_material()
if(padding_material)
- overlay.add_overlay(overlay_image(icon, "[overlay.icon_state]-padding", padding_color || padding_material.color, RESET_COLOR | RESET_ALPHA))
+ overlay.add_overlay(overlay_image(icon, "[overlay.icon_state]-padding", padding_extension.get_padding_color(material_alteration & MAT_FLAG_ALTERATION_COLOR), RESET_COLOR | RESET_ALPHA))
. = ..()
/obj/item/crutch/examine(mob/user, distance, infix, suffix)
. = ..()
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/decl/material/padding_material = padding_extension?.get_padding_material()
if(padding_material)
- to_chat(user, "It has been padded with [padding_color ? "[padding_material.paint_verb] " : null][padding_material.use_name].")
+ var/padding_paint_color = padding_extension.get_padding_color(FALSE) // do not include material color
+ to_chat(user, "It has been padded with [padding_paint_color ? "[padding_material.paint_verb] " : null][padding_material.use_name].")
/obj/item/crutch/aluminum
material = /decl/material/solid/metal/aluminium
/obj/item/crutch/aluminum/padded
- padding_material = /decl/material/solid/organic/plastic/foam
- padding_color = COLOR_GRAY20
+ initial_padding_material = /decl/material/solid/organic/plastic/foam
+ initial_padding_color = COLOR_GRAY20
/obj/item/crutch/wooden
material = /decl/material/solid/organic/wood/oak
/obj/item/crutch/wooden/padded
- padding_material = /decl/material/solid/organic/leather
\ No newline at end of file
+ initial_padding_material = /decl/material/solid/organic/leather
\ No newline at end of file
diff --git a/code/game/objects/items/stools.dm b/code/game/objects/items/stools.dm
index 07eeb6e2087..31c54d503a5 100644
--- a/code/game/objects/items/stools.dm
+++ b/code/game/objects/items/stools.dm
@@ -10,20 +10,22 @@
material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR
obj_flags = OBJ_FLAG_SUPPORT_MOB | OBJ_FLAG_ROTATABLE
_base_attack_force = 10
- var/padding_color
- var/decl/material/padding_material
+ /// The padding extension type for this stool. If null, no extension is created and this stool cannot be padded.
+ var/padding_extension_type = /datum/extension/padding
+ var/decl/material/initial_padding_material
+ var/initial_padding_color
/obj/item/stool/padded
icon_state = "stool_padded_preview" //set for the map
- padding_material = /decl/material/solid/organic/cloth
- padding_color = "#9d2300"
+ initial_padding_material = /decl/material/solid/organic/cloth
+ initial_padding_color = "#9d2300"
/obj/item/stool/Initialize()
. = ..()
if(!istype(material))
return INITIALIZE_HINT_QDEL
- if(ispath(padding_material, /decl/material))
- padding_material = GET_DECL(padding_material)
+ if(padding_extension_type && initial_padding_material)
+ get_or_create_extension(src, padding_extension_type, initial_padding_material, initial_padding_color)
update_icon()
/obj/item/stool/bar
@@ -32,16 +34,20 @@
/obj/item/stool/bar/padded
icon_state = "bar_stool_padded_preview"
- padding_material = /decl/material/solid/organic/cloth
- padding_color = "#9d2300"
+ initial_padding_material = /decl/material/solid/organic/cloth
+ initial_padding_color = "#9d2300"
/obj/item/stool/update_name()
..()
if(material_alteration & MAT_FLAG_ALTERATION_NAME)
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/decl/material/padding_material = padding_extension?.get_padding_material()
SetName("[padding_material?.adjective_name || material.adjective_name] [base_name || initial(name)]")
update_desc()
/obj/item/stool/proc/update_desc()
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/decl/material/padding_material = padding_extension?.get_padding_material()
if(padding_material)
desc = "A padded stool. Apply butt. It's made of [material.use_name] and covered with [padding_material.use_name]."
else
@@ -50,31 +56,19 @@
/obj/item/stool/on_update_icon()
. = ..()
icon_state = get_world_inventory_state()
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/decl/material/padding_material = padding_extension?.get_padding_material()
if(padding_material)
- add_overlay(overlay_image(icon, "[icon_state]-padding", padding_color || padding_material.color, RESET_COLOR|RESET_ALPHA))
+ add_overlay(overlay_image(icon, "[icon_state]-padding", padding_extension.get_padding_color(), RESET_COLOR|RESET_ALPHA))
// Strings.
update_name()
- update_desc()
/obj/item/stool/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing)
. = ..()
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/decl/material/padding_material = padding_extension?.get_padding_material()
if(padding_material)
- overlay.add_overlay(overlay_image(icon, "[overlay.icon_state]-padding", padding_color || padding_material.color, RESET_COLOR|RESET_ALPHA))
-
-/obj/item/stool/proc/add_padding(var/padding_type, var/new_padding_color)
- padding_material = GET_DECL(padding_type)
- padding_color = new_padding_color
- update_icon()
-
-/obj/item/stool/proc/remove_padding()
- if(padding_material)
- var/list/res = padding_material.create_object(get_turf(src))
- if(padding_color)
- for(var/obj/item/thing in res)
- thing.set_color(padding_color)
- padding_material = null
- padding_color = null
- update_icon()
+ overlay.add_overlay(overlay_image(icon, "[overlay.icon_state]-padding", padding_extension.get_padding_color(), RESET_COLOR|RESET_ALPHA))
/obj/item/stool/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
if (prob(5))
@@ -98,62 +92,15 @@
/obj/item/stool/proc/dismantle()
if(material)
material.create_object(get_turf(src))
- if(padding_material)
- padding_material.create_object(get_turf(src))
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ padding_extension?.remove_padding(do_icon_update = FALSE)
qdel(src)
-/// Return TRUE if the stool is capable of supporting padding.
-/// This should not check existing padding state, just whether
-/// the behavior is supported at all.
-/obj/item/stool/proc/can_be_padded()
- return TRUE
-
/obj/item/stool/attackby(obj/item/W, mob/user)
if(IS_WRENCH(W))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
dismantle()
return TRUE
- else if(can_be_padded())
- if(istype(W,/obj/item/stack))
- if(padding_material)
- to_chat(user, "\The [src] is already padded.")
- return TRUE
- var/obj/item/stack/C = W
- if(C.get_amount() < 1) // How??
- qdel(C)
- return TRUE
-
- var/padding_type
- var/new_padding_color
- if(istype(W, /obj/item/stack/tile) || istype(W, /obj/item/stack/material/bolt))
- padding_type = W.material?.type
- new_padding_color = W.paint_color
-
- if(padding_type)
- var/decl/material/padding_mat = GET_DECL(padding_type)
- if(!istype(padding_mat) || !(padding_mat.flags & MAT_FLAG_PADDING))
- padding_type = null
-
- if(!padding_type)
- to_chat(user, "You cannot pad \the [src] with that.")
- return TRUE
-
- C.use(1)
- if(!isturf(src.loc))
- user.drop_from_inventory(src)
- src.dropInto(loc)
- to_chat(user, "You add padding to \the [src].")
- add_padding(padding_type, new_padding_color)
- return TRUE
-
- else if(IS_WIRECUTTER(W))
- if(!padding_material)
- to_chat(user, "\The [src] has no padding to remove.")
- return TRUE
- to_chat(user, "You remove the padding from \the [src].")
- playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
- remove_padding()
- return TRUE
return ..()
/obj/item/stool/rustic
@@ -162,9 +109,8 @@
icon = 'icons/obj/stool_rustic.dmi'
material = /decl/material/solid/organic/wood/walnut
color = /decl/material/solid/organic/wood/walnut::color
-
-/obj/item/stool/rustic/can_be_padded()
- return FALSE
+ // Cannot be padded.
+ padding_extension_type = null
/obj/item/stool/rustic/update_desc()
desc = "A rustic stool carved from wood. It's a little rickety and wobbles under any weight, but it'll do."
diff --git a/code/game/objects/structures/beds/bed.dm b/code/game/objects/structures/beds/bed.dm
index d46f354729b..ad432669f7d 100644
--- a/code/game/objects/structures/beds/bed.dm
+++ b/code/game/objects/structures/beds/bed.dm
@@ -19,7 +19,15 @@
parts_type = /obj/item/stack/material/rods
user_comfort = 1
obj_flags = OBJ_FLAG_SUPPORT_MOB
- var/padding_color
+ /// The padding extension type for this bed. If null, no extension is created and this bed cannot be padded.
+ var/padding_extension_type = /datum/extension/padding
+ var/decl/material/initial_padding_material
+ var/initial_padding_color
+
+/obj/structure/bed/Initialize(ml, _mat, _reinf_mat)
+ . = ..()
+ if(padding_extension_type && initial_padding_material)
+ get_or_create_extension(src, padding_extension_type, initial_padding_material, initial_padding_color)
/obj/structure/bed/user_can_mousedrop_onto(mob/user, atom/being_dropped, incapacitation_flags, params)
if(user == being_dropped)
@@ -38,8 +46,10 @@
/obj/structure/bed/update_material_name(override_name)
var/base_name = override_name || initial(name)
var/new_name = base_name
- if(reinf_material)
- new_name = "[reinf_material.adjective_name] [base_name]"
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/decl/material/padding_material = padding_extension?.get_padding_material()
+ if(padding_material)
+ SetName("[padding_material.adjective_name] [base_name]")
else if(material)
new_name = "[material.adjective_name] [base_name]"
if(name_prefix)
@@ -47,8 +57,10 @@
SetName(new_name)
/obj/structure/bed/update_material_desc()
- if(reinf_material)
- desc = "[initial(desc)] It's made of [material.use_name] and covered with [reinf_material.use_name]."
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/decl/material/padding_material = padding_extension?.get_padding_material()
+ if(padding_material)
+ desc = "[initial(desc)] It's made of [material.use_name] and covered with [padding_material.use_name]."
else
desc = "[initial(desc)] It's made of [material.use_name]."
@@ -58,11 +70,10 @@
/obj/structure/bed/on_update_icon()
..()
icon_state = get_base_icon()
- if(istype(reinf_material))
- if(material_alteration & MAT_FLAG_ALTERATION_COLOR)
- add_overlay(overlay_image(icon, "[icon_state]_padding", padding_color || reinf_material.color, RESET_COLOR))
- else
- add_overlay(overlay_image(icon, "[icon_state]_padding"))
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/decl/material/padding_material = padding_extension?.get_padding_material()
+ if(padding_material)
+ add_overlay(overlay_image(icon, "[icon_state]_padding", material_alteration & MAT_FLAG_ALTERATION_COLOR ? padding_extension.get_padding_color() : null, RESET_COLOR|RESET_ALPHA))
/obj/structure/bed/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(istype(mover) && mover.checkpass(PASS_FLAG_TABLE))
@@ -74,72 +85,6 @@
if(. && !QDELETED(src) && (severity == 1 || (severity == 2 && prob(50)) || (severity == 3 && prob(5))))
physically_destroyed()
-/obj/structure/bed/proc/can_apply_padding()
- return TRUE
-
-/obj/structure/bed/attackby(obj/item/used_item, mob/user)
-
- if((. = ..()))
- return
-
- if(istype(used_item, /obj/item/stack) && can_apply_padding())
-
- if(reinf_material)
- to_chat(user, SPAN_WARNING("\The [src] is already padded."))
- return TRUE
-
- var/obj/item/stack/cloth = used_item
- if(cloth.get_amount() < 1)
- to_chat(user, SPAN_WARNING("You need at least one unit of material to pad \the [src]."))
- return TRUE
-
- var/padding_type
- var/new_padding_color
- if(istype(used_item, /obj/item/stack/tile) || istype(used_item, /obj/item/stack/material/bolt))
- padding_type = used_item.material?.type
- new_padding_color = used_item.paint_color
-
- if(padding_type)
- var/decl/material/padding_mat = GET_DECL(padding_type)
- if(!istype(padding_mat) || !(padding_mat.flags & MAT_FLAG_PADDING))
- padding_type = null
-
- if(!padding_type)
- to_chat(user, SPAN_WARNING("You cannot pad \the [src] with that."))
- return TRUE
-
- cloth.use(1)
- if(!isturf(src.loc))
- src.forceMove(get_turf(src))
- playsound(src.loc, 'sound/effects/rustle5.ogg', 50, 1)
- to_chat(user, SPAN_NOTICE("You add padding to \the [src]."))
- add_padding(padding_type, new_padding_color)
- return TRUE
-
- if(IS_WIRECUTTER(used_item))
- if(!reinf_material)
- to_chat(user, SPAN_WARNING("\The [src] has no padding to remove."))
- else
- to_chat(user, SPAN_NOTICE("You remove the padding from \the [src]."))
- playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
- remove_padding()
- return TRUE
-
-/obj/structure/bed/proc/add_padding(var/padding_type, var/new_padding_color)
- reinf_material = GET_DECL(padding_type)
- padding_color = new_padding_color
- update_icon()
-
-/obj/structure/bed/proc/remove_padding()
- if(reinf_material)
- var/list/res = reinf_material.create_object(get_turf(src))
- if(padding_color)
- for(var/obj/item/thing in res)
- thing.set_color(padding_color)
- reinf_material = null
- padding_color = null
- update_icon()
-
/obj/structure/bed/psych
name = "psychiatrist's couch"
desc = "For prime comfort during psychiatric evaluations."
@@ -147,8 +92,8 @@
material = /decl/material/solid/organic/wood/walnut
/obj/structure/bed/psych/leather
- reinf_material = /decl/material/solid/organic/leather
+ initial_padding_material = /decl/material/solid/organic/leather
/obj/structure/bed/padded
material = /decl/material/solid/metal/aluminium
- reinf_material = /decl/material/solid/organic/cloth
+ initial_padding_material = /decl/material/solid/organic/cloth
diff --git a/code/game/objects/structures/beds/rollerbed.dm b/code/game/objects/structures/beds/rollerbed.dm
index 4c0285d3b78..657d86c04c9 100644
--- a/code/game/objects/structures/beds/rollerbed.dm
+++ b/code/game/objects/structures/beds/rollerbed.dm
@@ -9,6 +9,7 @@
buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 6)
movable_flags = MOVABLE_FLAG_WHEELED
tool_interaction_flags = 0
+ padding_extension_type = null // Cannot be padded.
var/item_form_type = /obj/item/roller //The folded-up object path.
var/obj/item/chems/beaker
var/iv_attached = 0
@@ -32,9 +33,6 @@
iv.pixel_y = 6
add_overlay(iv)
-/obj/structure/bed/roller/can_apply_padding()
- return FALSE
-
/obj/structure/bed/roller/attackby(obj/item/I, mob/user)
if(iv_stand && !beaker && istype(I, /obj/item/chems))
if(!user.try_unequip(I, src))
diff --git a/code/game/objects/structures/beds/simple_bed.dm b/code/game/objects/structures/beds/simple_bed.dm
index b12a5d5201e..3092fc63a71 100644
--- a/code/game/objects/structures/beds/simple_bed.dm
+++ b/code/game/objects/structures/beds/simple_bed.dm
@@ -4,7 +4,7 @@
icon_state = "bed_padded_preview" // For map editor preview purposes
parts_type = /obj/item/stack/material/plank
material = /decl/material/solid/organic/wood/oak
- reinf_material = /decl/material/solid/organic/plantmatter/grass/dry
+ initial_padding_material = /decl/material/solid/organic/plantmatter/grass/dry
color = /decl/material/solid/organic/plantmatter/grass/dry::color
anchored = TRUE
user_comfort = 0.8
@@ -43,11 +43,11 @@
material = /decl/material/solid/organic/wood/ebony
/obj/structure/bed/simple/ebony/cloth
- reinf_material = /decl/material/solid/organic/cloth
+ initial_padding_material = /decl/material/solid/organic/cloth
color = /decl/material/solid/organic/cloth::color
/obj/structure/bed/simple/crafted
- reinf_material = null
+ initial_padding_material = null
icon_state = "bed"
color = /decl/material/solid/organic/wood/oak::color
diff --git a/code/game/objects/structures/benches/bench.dm b/code/game/objects/structures/benches/bench.dm
index 8e8ed2688a3..97be5c19b7f 100644
--- a/code/game/objects/structures/benches/bench.dm
+++ b/code/game/objects/structures/benches/bench.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/structures/furniture/bench.dmi'
icon_state = ICON_STATE_WORLD + "_standing"
color = WOOD_COLOR_GENERIC
- reinf_material = null
+ initial_padding_material = null
material = /decl/material/solid/organic/wood/oak
obj_flags = 0
anchored = TRUE
diff --git a/code/game/objects/structures/benches/lounge.dm b/code/game/objects/structures/benches/lounge.dm
index b426a84b3f7..38863dd68cf 100644
--- a/code/game/objects/structures/benches/lounge.dm
+++ b/code/game/objects/structures/benches/lounge.dm
@@ -10,5 +10,5 @@
/obj/structure/bed/chair/bench/lounge/mapped
color = /decl/material/solid/organic/wood/mahogany::color
material = /decl/material/solid/organic/wood/mahogany
- reinf_material = /decl/material/solid/organic/cloth
- padding_color = COLOR_RED_GRAY
+ initial_padding_material = /decl/material/solid/organic/cloth
+ initial_padding_color = COLOR_RED_GRAY
diff --git a/code/game/objects/structures/chairs/chairs.dm b/code/game/objects/structures/chairs/chairs.dm
index aa255dad7b9..f91dfcc4119 100644
--- a/code/game/objects/structures/chairs/chairs.dm
+++ b/code/game/objects/structures/chairs/chairs.dm
@@ -37,39 +37,26 @@
/obj/structure/bed/chair/on_update_icon()
..() // handles setting icon_state to get_base_icon(), and adds padding
var/base_color = get_color()
- var/reinf_color = padding_color || reinf_material?.color
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/use_padding_color = padding_extension?.get_padding_color(material_alteration & MAT_FLAG_ALTERATION_COLOR)
+ var/use_layer = buckled_mob ? ABOVE_HUMAN_LAYER : FLOAT_LAYER
- var/image/I = image(icon, "[icon_state]_over")
- I.layer = buckled_mob ? ABOVE_HUMAN_LAYER : FLOAT_LAYER
- if(material && (material_alteration & MAT_FLAG_ALTERATION_COLOR))
- I.appearance_flags |= RESET_COLOR
- I.color = base_color
+ var/image/I = overlay_image(icon, "[icon_state]_over", base_color, RESET_COLOR)
+ I.layer = use_layer
add_overlay(I)
- I = image(icon, "[icon_state]_armrest")
- I.layer = buckled_mob ? ABOVE_HUMAN_LAYER : FLOAT_LAYER
- if(material && (material_alteration & MAT_FLAG_ALTERATION_COLOR))
- I.appearance_flags |= RESET_COLOR
- I.color = base_color
+ I = overlay_image(icon, "[icon_state]_armrest", base_color, RESET_COLOR)
+ I.layer = use_layer
add_overlay(I)
- if(reinf_material)
- I = image(icon, "[icon_state]_padding_over")
- I.layer = buckled_mob ? ABOVE_HUMAN_LAYER : FLOAT_LAYER
- if(material_alteration & MAT_FLAG_ALTERATION_COLOR)
- I.appearance_flags |= RESET_COLOR
- I.color = reinf_color
+ if(padding_extension?.get_padding_material())
+ I = overlay_image(icon, "[icon_state]_padding_over", use_padding_color, RESET_COLOR)
+ I.layer = use_layer
add_overlay(I)
- I = image(icon, "[icon_state]_padding_armrest")
- I.layer = buckled_mob ? ABOVE_HUMAN_LAYER : FLOAT_LAYER
- if(material_alteration & MAT_FLAG_ALTERATION_COLOR)
- I.appearance_flags |= RESET_COLOR
- I.color = reinf_color
+ I = overlay_image(icon, "[icon_state]_padding_armrest", use_padding_color, RESET_COLOR)
+ I.layer = use_layer
add_overlay(I)
if(has_special_overlay)
- I = image(icon, "[icon_state]_special")
- I.layer = buckled_mob ? ABOVE_HUMAN_LAYER : FLOAT_LAYER
- if(material && (material_alteration & MAT_FLAG_ALTERATION_COLOR))
- I.appearance_flags |= RESET_COLOR
- I.color = base_color
+ I = overlay_image(icon, "[icon_state]_special", base_color, RESET_COLOR)
+ I.layer = use_layer
add_overlay(I)
/obj/structure/bed/chair/rotate(mob/user)
@@ -81,57 +68,57 @@
update_icon()
/obj/structure/bed/chair/padded
- reinf_material = /decl/material/solid/organic/cloth
+ initial_padding_material = /decl/material/solid/organic/cloth
/obj/structure/bed/chair/padded/red
- padding_color = "#9d2300"
+ initial_padding_color = "#9d2300"
/obj/structure/bed/chair/padded/brown
- reinf_material = /decl/material/solid/organic/leather
+ initial_padding_material = /decl/material/solid/organic/leather
/obj/structure/bed/chair/padded/teal
- padding_color = "#00e1ff"
+ initial_padding_color = "#00e1ff"
/obj/structure/bed/chair/padded/black
- padding_color = "#505050"
+ initial_padding_color = "#505050"
/obj/structure/bed/chair/padded/green
- padding_color = "#b7f27d"
+ initial_padding_color = "#b7f27d"
/obj/structure/bed/chair/padded/purple
- padding_color = "#9933ff"
+ initial_padding_color = "#9933ff"
/obj/structure/bed/chair/padded/blue
- padding_color = "#46698c"
+ initial_padding_color = "#46698c"
/obj/structure/bed/chair/padded/beige
- padding_color = "#ceb689"
+ initial_padding_color = "#ceb689"
/obj/structure/bed/chair/padded/lime
- padding_color = "#62e36c"
+ initial_padding_color = "#62e36c"
/obj/structure/bed/chair/padded/yellow
- padding_color = "#ffbf00"
+ initial_padding_color = "#ffbf00"
// Leaving this in for the sake of compilation.
/obj/structure/bed/chair/comfy
name = "comfy chair"
desc = "It's a chair. It looks comfy."
icon = 'icons/obj/structures/furniture/chair_comfy.dmi'
- reinf_material = /decl/material/solid/organic/cloth
+ initial_padding_material = /decl/material/solid/organic/cloth
/obj/structure/bed/chair/comfy/unpadded
- reinf_material = null
+ initial_padding_material = null
/obj/structure/bed/chair/comfy/brown
- reinf_material = /decl/material/solid/organic/leather
+ initial_padding_material = /decl/material/solid/organic/leather
/obj/structure/bed/chair/comfy/red
- padding_color = "#9d2300"
+ initial_padding_color = "#9d2300"
/obj/structure/bed/chair/comfy/teal
- padding_color = "#00e1ff"
+ initial_padding_color = "#00e1ff"
/obj/structure/bed/chair/comfy/black
- padding_color = "#505050"
+ initial_padding_color = "#505050"
/obj/structure/bed/chair/comfy/green
- padding_color = "#b7f27d"
+ initial_padding_color = "#b7f27d"
/obj/structure/bed/chair/comfy/purple
- padding_color = "#9933ff"
+ initial_padding_color = "#9933ff"
/obj/structure/bed/chair/comfy/blue
- padding_color = "#46698c"
+ initial_padding_color = "#46698c"
/obj/structure/bed/chair/comfy/beige
- padding_color = "#ceb689"
+ initial_padding_color = "#ceb689"
/obj/structure/bed/chair/comfy/lime
- padding_color = "#62e36c"
+ initial_padding_color = "#62e36c"
/obj/structure/bed/chair/comfy/yellow
- padding_color = "#ffbf00"
+ initial_padding_color = "#ffbf00"
/obj/structure/bed/chair/comfy/captain
name = "captain chair"
@@ -139,38 +126,38 @@
icon = 'icons/obj/structures/furniture/chair_captain.dmi'
buckle_movable = 1
material = /decl/material/solid/metal/steel
- reinf_material = /decl/material/solid/organic/cloth
- padding_color = "#46698c"
+ initial_padding_material = /decl/material/solid/organic/cloth
+ initial_padding_color = "#46698c"
has_special_overlay = TRUE
/obj/structure/bed/chair/armchair
name = "armchair"
desc = "It's an armchair. It looks comfy."
icon = 'icons/obj/structures/furniture/armchair.dmi'
- reinf_material = /decl/material/solid/organic/cloth
+ initial_padding_material = /decl/material/solid/organic/cloth
/obj/structure/bed/chair/armchair/unpadded
- reinf_material = null
+ initial_padding_material = null
/obj/structure/bed/chair/armchair/brown
- reinf_material = /decl/material/solid/organic/leather
+ initial_padding_material = /decl/material/solid/organic/leather
/obj/structure/bed/chair/armchair/red
- padding_color = "#9d2300"
+ initial_padding_color = "#9d2300"
/obj/structure/bed/chair/armchair/teal
- padding_color = "#00e1ff"
+ initial_padding_color = "#00e1ff"
/obj/structure/bed/chair/armchair/black
- padding_color = "#505050"
+ initial_padding_color = "#505050"
/obj/structure/bed/chair/armchair/green
- padding_color = "#b7f27d"
+ initial_padding_color = "#b7f27d"
/obj/structure/bed/chair/armchair/purple
- padding_color = "#9933ff"
+ initial_padding_color = "#9933ff"
/obj/structure/bed/chair/armchair/blue
- padding_color = "#46698c"
+ initial_padding_color = "#46698c"
/obj/structure/bed/chair/armchair/beige
- padding_color = "#ceb689"
+ initial_padding_color = "#ceb689"
/obj/structure/bed/chair/armchair/lime
- padding_color = "#62e36c"
+ initial_padding_color = "#62e36c"
/obj/structure/bed/chair/armchair/yellow
- padding_color = "#ffbf00"
+ initial_padding_color = "#ffbf00"
/obj/structure/bed/chair/office
name = "office chair"
@@ -178,7 +165,7 @@
anchored = FALSE
buckle_movable = 1
movable_flags = MOVABLE_FLAG_WHEELED
- reinf_material = /decl/material/solid/organic/cloth
+ initial_padding_material = /decl/material/solid/organic/cloth
/obj/structure/bed/chair/office/Move()
. = ..()
@@ -219,9 +206,9 @@
occupant.visible_message("[occupant] crashed into \the [A]!")
/obj/structure/bed/chair/office/light
- padding_color = "#f0f0f0"
+ initial_padding_color = "#f0f0f0"
/obj/structure/bed/chair/office/dark
- padding_color = "#505050"
+ initial_padding_color = "#505050"
/obj/structure/bed/chair/office/comfy
name = "comfy office chair"
@@ -229,27 +216,27 @@
icon = 'icons/obj/structures/furniture/chair_comfy_office.dmi'
/obj/structure/bed/chair/office/comfy/unpadded
- reinf_material = null
+ initial_padding_material = null
/obj/structure/bed/chair/office/comfy/brown
- reinf_material = /decl/material/solid/organic/leather
+ initial_padding_material = /decl/material/solid/organic/leather
/obj/structure/bed/chair/office/comfy/red
- padding_color = "#9d2300"
+ initial_padding_color = "#9d2300"
/obj/structure/bed/chair/office/comfy/teal
- padding_color = "#00e1ff"
+ initial_padding_color = "#00e1ff"
/obj/structure/bed/chair/office/comfy/black
- padding_color = "#505050"
+ initial_padding_color = "#505050"
/obj/structure/bed/chair/office/comfy/green
- padding_color = "#b7f27d"
+ initial_padding_color = "#b7f27d"
/obj/structure/bed/chair/office/comfy/purple
- padding_color = "#9933ff"
+ initial_padding_color = "#9933ff"
/obj/structure/bed/chair/office/comfy/blue
- padding_color = "#46698c"
+ initial_padding_color = "#46698c"
/obj/structure/bed/chair/office/comfy/beige
- padding_color = "#ceb689"
+ initial_padding_color = "#ceb689"
/obj/structure/bed/chair/office/comfy/lime
- padding_color = "#62e36c"
+ initial_padding_color = "#62e36c"
/obj/structure/bed/chair/office/comfy/yellow
- padding_color = "#ffbf00"
+ initial_padding_color = "#ffbf00"
/obj/structure/bed/chair/rounded
name = "rounded chair"
@@ -257,25 +244,25 @@
icon = 'icons/obj/structures/furniture/chair_rounded.dmi'
/obj/structure/bed/chair/rounded/brown
- reinf_material = /decl/material/solid/organic/leather
+ initial_padding_material = /decl/material/solid/organic/leather
/obj/structure/bed/chair/rounded/red
- padding_color = "#9d2300"
+ initial_padding_color = "#9d2300"
/obj/structure/bed/chair/rounded/teal
- padding_color = "#00e1ff"
+ initial_padding_color = "#00e1ff"
/obj/structure/bed/chair/rounded/black
- padding_color = "#505050"
+ initial_padding_color = "#505050"
/obj/structure/bed/chair/rounded/green
- padding_color = "#b7f27d"
+ initial_padding_color = "#b7f27d"
/obj/structure/bed/chair/rounded/purple
- padding_color = "#9933ff"
+ initial_padding_color = "#9933ff"
/obj/structure/bed/chair/rounded/blue
- padding_color = "#46698c"
+ initial_padding_color = "#46698c"
/obj/structure/bed/chair/rounded/beige
- padding_color = "#ceb689"
+ initial_padding_color = "#ceb689"
/obj/structure/bed/chair/rounded/lime
- padding_color = "#62e36c"
+ initial_padding_color = "#62e36c"
/obj/structure/bed/chair/rounded/yellow
- padding_color = "#ffbf00"
+ initial_padding_color = "#ffbf00"
/obj/structure/bed/chair/shuttle
name = "shuttle seat"
@@ -283,7 +270,7 @@
icon = 'icons/obj/structures/furniture/chair_shuttle.dmi'
buckle_sound = 'sound/effects/metal_close.ogg'
material = /decl/material/solid/metal/steel
- reinf_material = /decl/material/solid/organic/cloth
+ initial_padding_material = /decl/material/solid/organic/cloth
has_special_overlay = TRUE
/obj/structure/bed/chair/shuttle/get_base_icon()
@@ -292,11 +279,11 @@
. += "_buckled"
/obj/structure/bed/chair/shuttle/blue
- padding_color = "#46698c"
+ initial_padding_color = "#46698c"
/obj/structure/bed/chair/shuttle/black
- padding_color = "#505050"
+ initial_padding_color = "#505050"
/obj/structure/bed/chair/shuttle/white
- padding_color = "#f0f0f0"
+ initial_padding_color = "#f0f0f0"
/obj/structure/bed/chair/wood
name_prefix = "classic"
@@ -304,9 +291,7 @@
icon = 'icons/obj/structures/furniture/chair_wooden.dmi'
color = WOOD_COLOR_GENERIC
material = /decl/material/solid/organic/wood/oak
-
-/obj/structure/bed/chair/wood/can_apply_padding()
- return FALSE
+ padding_extension_type = null // Cannot be padded.
/obj/structure/bed/chair/wood/mahogany
color = WOOD_COLOR_RICH
diff --git a/code/game/objects/structures/chairs/rustic_chairs.dm b/code/game/objects/structures/chairs/rustic_chairs.dm
index 8ca7bef74df..fff98ecac55 100644
--- a/code/game/objects/structures/chairs/rustic_chairs.dm
+++ b/code/game/objects/structures/chairs/rustic_chairs.dm
@@ -12,8 +12,8 @@
icon = 'icons/obj/structures/furniture/chair_rustic_fancy.dmi'
material = /decl/material/solid/organic/wood/oak
color = COLOR_WHITE // preview state is precolored
- reinf_material = /decl/material/solid/organic/cloth
- padding_color = COLOR_CHERRY_RED
+ initial_padding_material = /decl/material/solid/organic/cloth
+ initial_padding_color = COLOR_CHERRY_RED
user_comfort = 1.25
/obj/structure/bed/chair/rustic_fancy/ebony
diff --git a/code/game/objects/structures/chairs/wheelchair.dm b/code/game/objects/structures/chairs/wheelchair.dm
index 46035193325..fa52fcb9b6e 100644
--- a/code/game/objects/structures/chairs/wheelchair.dm
+++ b/code/game/objects/structures/chairs/wheelchair.dm
@@ -11,6 +11,7 @@
)
tool_interaction_flags = TOOL_INTERACTION_NONE
material_alteration = MAT_FLAG_ALTERATION_NONE
+ padding_extension_type = null // Cannot be padded.
var/item_form_type = /obj/item/wheelchair_kit
// TODO: Replace with reagent holder? This doesn't even properly handle non-human bloodstains.
@@ -22,9 +23,6 @@
if(!item_form_type)
verbs -= .verb/collapse
-/obj/structure/bed/chair/wheelchair/can_apply_padding()
- return FALSE
-
/obj/structure/bed/chair/wheelchair/attack_hand(mob/user)
if(!user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE))
return ..()
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 9dab13138ec..cc5633a1eab 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -193,6 +193,7 @@
/datum/movement_handler/delay = list(1),
/datum/movement_handler/move_relay_self/janicart
)
+ padding_extension_type = null
var/obj/item/bag/trash/mybag = null
var/callme = "pimpin' ride" //how do people refer to it?
diff --git a/code/game/objects/structures/sofa.dm b/code/game/objects/structures/sofa.dm
index 05d544531d8..b12b1148f3a 100644
--- a/code/game/objects/structures/sofa.dm
+++ b/code/game/objects/structures/sofa.dm
@@ -7,8 +7,8 @@
buckle_lying = FALSE //force people to sit up in chairs when buckled
obj_flags = OBJ_FLAG_ROTATABLE | OBJ_FLAG_ANCHORABLE
material = /decl/material/solid/organic/wood/oak
- reinf_material = /decl/material/solid/organic/cloth
- material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC
+ initial_padding_material = /decl/material/solid/organic/cloth
+ material_alteration = MAT_FLAG_ALTERATION_ALL
var/has_special_overlay = FALSE
@@ -24,15 +24,16 @@
/obj/structure/bed/sofa/on_update_icon()
..()
var/use_base_color = get_color()
- var/use_reinf_color = padding_color || ((material_alteration & MAT_FLAG_ALTERATION_COLOR) ? reinf_material?.color : null)
+ var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__)
+ var/use_padding_color = padding_extension?.get_padding_color(material_alteration & MAT_FLAG_ALTERATION_COLOR)
var/list/overlays_to_add = list(
"_over" = use_base_color,
"_armrest" = use_base_color
)
- if(reinf_material)
- overlays_to_add["_padding_over"] = use_reinf_color
- overlays_to_add["_padding_armrest"] = use_reinf_color
+ if(padding_extension?.get_padding_material())
+ overlays_to_add["_padding_over"] = use_padding_color
+ overlays_to_add["_padding_armrest"] = use_padding_color
if(has_special_overlay && buckled_mob)
overlays_to_add["_special"] = use_base_color
@@ -62,76 +63,76 @@
set_dir(turn(dir, 45))
update_icon()
/obj/structure/bed/sofa/middle/unpadded
- reinf_material = null
+ initial_padding_material = null
/obj/structure/bed/sofa/middle/red
- padding_color = "#9d2300"
+ initial_padding_color = "#9d2300"
/obj/structure/bed/sofa/middle/brown
- reinf_material = /decl/material/solid/organic/leather
+ initial_padding_material = /decl/material/solid/organic/leather
/obj/structure/bed/sofa/middle/teal
- padding_color = "#00e1ff"
+ initial_padding_color = "#00e1ff"
/obj/structure/bed/sofa/middle/black
- padding_color = "#505050"
+ initial_padding_color = "#505050"
/obj/structure/bed/sofa/middle/green
- padding_color = "#b7f27d"
+ initial_padding_color = "#b7f27d"
/obj/structure/bed/sofa/middle/purple
- padding_color = "#9933ff"
+ initial_padding_color = "#9933ff"
/obj/structure/bed/sofa/middle/blue
- padding_color = "#46698c"
+ initial_padding_color = "#46698c"
/obj/structure/bed/sofa/middle/beige
- padding_color = "#ceb689"
+ initial_padding_color = "#ceb689"
/obj/structure/bed/sofa/middle/lime
- padding_color = "#62e36c"
+ initial_padding_color = "#62e36c"
/obj/structure/bed/sofa/middle/yellow
paint_color = "#ffbf00"
/obj/structure/bed/sofa/right
icon = 'icons/obj/structures/furniture/sofa_right.dmi'
/obj/structure/bed/sofa/right/unpadded
- reinf_material = null
+ initial_padding_material = null
/obj/structure/bed/sofa/right/red
- padding_color = "#9d2300"
+ initial_padding_color = "#9d2300"
/obj/structure/bed/sofa/right/brown
- reinf_material = /decl/material/solid/organic/leather
+ initial_padding_material = /decl/material/solid/organic/leather
/obj/structure/bed/sofa/right/teal
- padding_color = "#00e1ff"
+ initial_padding_color = "#00e1ff"
/obj/structure/bed/sofa/right/black
- padding_color = "#505050"
+ initial_padding_color = "#505050"
/obj/structure/bed/sofa/right/green
- padding_color = "#b7f27d"
+ initial_padding_color = "#b7f27d"
/obj/structure/bed/sofa/right/purple
- padding_color = "#9933ff"
+ initial_padding_color = "#9933ff"
/obj/structure/bed/sofa/right/blue
- padding_color = "#46698c"
+ initial_padding_color = "#46698c"
/obj/structure/bed/sofa/right/beige
- padding_color = "#ceb689"
+ initial_padding_color = "#ceb689"
/obj/structure/bed/sofa/right/lime
- padding_color = "#62e36c"
+ initial_padding_color = "#62e36c"
/obj/structure/bed/sofa/right/yellow
- padding_color = "#ffbf00"
+ initial_padding_color = "#ffbf00"
/obj/structure/bed/sofa/left
name = "sofa"
icon = 'icons/obj/structures/furniture/sofa_left.dmi'
/obj/structure/bed/sofa/left/unpadded
- reinf_material = null
+ initial_padding_material = null
/obj/structure/bed/sofa/left/red
- padding_color = "#9d2300"
+ initial_padding_color = "#9d2300"
/obj/structure/bed/sofa/left/brown
- reinf_material = /decl/material/solid/organic/leather
+ initial_padding_material = /decl/material/solid/organic/leather
/obj/structure/bed/sofa/left/teal
- padding_color = "#00e1ff"
+ initial_padding_color = "#00e1ff"
/obj/structure/bed/sofa/left/black
- padding_color = "#505050"
+ initial_padding_color = "#505050"
/obj/structure/bed/sofa/left/green
- padding_color = "#b7f27d"
+ initial_padding_color = "#b7f27d"
/obj/structure/bed/sofa/left/purple
- padding_color = "#9933ff"
+ initial_padding_color = "#9933ff"
/obj/structure/bed/sofa/left/blue
- padding_color = "#46698c"
+ initial_padding_color = "#46698c"
/obj/structure/bed/sofa/left/beige
- padding_color = "#ceb689"
+ initial_padding_color = "#ceb689"
/obj/structure/bed/sofa/left/lime
- padding_color = "#62e36c"
+ initial_padding_color = "#62e36c"
/obj/structure/bed/sofa/left/yellow
- padding_color = "#ffbf00"
\ No newline at end of file
+ initial_padding_color = "#ffbf00"
\ No newline at end of file
diff --git a/nebula.dme b/nebula.dme
index 34e663b2b29..5519d2e270c 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -485,6 +485,7 @@
#include "code\datums\extensions\multitool\items\items.dm"
#include "code\datums\extensions\multitool\items\stock_parts_radio.dm"
#include "code\datums\extensions\on_click\turf_hand.dm"
+#include "code\datums\extensions\padding\padding.dm"
#include "code\datums\extensions\resistable\resistable.dm"
#include "code\datums\extensions\shearable\shearable.dm"
#include "code\datums\genetics\genetic_conditions.dm"