From 0d968d78038d37b41ecd2886a1d77d13f43c19a5 Mon Sep 17 00:00:00 2001
From: Tojo <32783144+Alecksohs@users.noreply.github.com>
Date: Wed, 26 Feb 2025 03:58:51 -0600
Subject: [PATCH] Reworks Curtains (#28163)
* Reworks Curtains
* Update code/game/objects/structures/curtains.dm
Co-authored-by: CRUNCH <143041327+Fordoxia@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* New Overlay Code
* THE BEGINNING OF HELL
* Interact with Atom on mountable
* Fixes return, looks mergable.
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update code/game/objects/structures/curtains.dm
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
* Update Overlays Refactor
---------
Signed-off-by: Tojo <32783144+Alecksohs@users.noreply.github.com>
Co-authored-by: CRUNCH <143041327+Fordoxia@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
---
.../items/mountable_frames/mountables.dm | 16 +-
code/game/objects/items/stacks/rods.dm | 1 +
code/game/objects/structures/curtains.dm | 149 ++++++++++++++++--
code/modules/crafting/recipes.dm | 9 --
icons/obj/curtain.dmi | Bin 422 -> 928 bytes
5 files changed, 146 insertions(+), 29 deletions(-)
diff --git a/code/game/objects/items/mountable_frames/mountables.dm b/code/game/objects/items/mountable_frames/mountables.dm
index 99b2a7f55d8..5d3d811f405 100644
--- a/code/game/objects/items/mountable_frames/mountables.dm
+++ b/code/game/objects/items/mountable_frames/mountables.dm
@@ -4,19 +4,19 @@
/turf/simulated/wall
)
var/allow_floor_mounting = FALSE
+ new_attack_chain = TRUE
-
-/obj/item/mounted/afterattack__legacy__attackchain(atom/A, mob/user, proximity_flag)
- if(is_type_in_list(A, buildon_types))
- if(try_build(A, user, proximity_flag))
- return do_build(A, user)
+/obj/item/mounted/interact_with_atom(atom/target, mob/living/user, list/modifiers)
+ . = ..()
+ if(is_type_in_list(target, buildon_types))
+ if(try_build(target, user))
+ do_build(target, user)
+ return ITEM_INTERACT_COMPLETE
..()
-/obj/item/mounted/proc/try_build(turf/on_wall, mob/user, proximity_flag) //checks
+/obj/item/mounted/proc/try_build(turf/on_wall, mob/user) //checks
if(!on_wall || !user)
return FALSE
- if(!proximity_flag) //if we aren't next to the turf
- return FALSE
if(!allow_floor_mounting)
if(!(get_dir(on_wall, user) in GLOB.cardinal))
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index 11b9dfc1af2..092369e489e 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -2,6 +2,7 @@ GLOBAL_LIST_INIT(rod_recipes, list (
new /datum/stack_recipe("grille", /obj/structure/grille, 2, time = 1 SECONDS, one_per_turf = TRUE, on_floor_or_lattice = TRUE),
new /datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("catwalk tile", /obj/item/stack/tile/catwalk, 2, 4, 20),
+ new /datum/stack_recipe("curtain rod", /obj/item/mounted/curtain/curtain_fixture, 2, 1, 20),
null,
new /datum/stack_recipe_list("railings...", list(
new /datum/stack_recipe("railing", /obj/structure/railing, 3, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index 31262011e56..5c0821ad87a 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -9,17 +9,122 @@
layer = SHOWER_CLOSED_LAYER
opacity = TRUE
density = FALSE
+ var/image/overlay = null
new_attack_chain = TRUE
+ var/assembled = FALSE
+ var/overlay_color = "#ffffff"
+ var/overlay_alpha = 255
+
+
+/obj/structure/curtain/Initialize(mapload)
+ . = ..()
+ if(opacity)
+ icon_state = "closed"
+ overlay = image("closed_overlay")
+ overlay.color = overlay_color
+ overlay.alpha = overlay_alpha
+ add_overlay(overlay)
+ layer = SHOWER_CLOSED_LAYER
+ else
+ icon_state = "open"
+ overlay = image("open_overlay")
+ overlay.color = overlay_color
+ overlay.alpha = overlay_alpha
+ add_overlay(overlay)
+ layer = SHOWER_OPEN_LAYER
/obj/structure/curtain/open
icon_state = "open"
layer = SHOWER_OPEN_LAYER
opacity = FALSE
+/obj/item/mounted/curtain/curtain_fixture
+ icon_state = "handheld"
+ icon = 'icons/obj/curtain.dmi'
+ name = "\improper curtain rod assembly"
+ new_attack_chain = TRUE
+
+/obj/item/mounted/curtain/curtain_fixture/interact_with_atom(atom/target, mob/living/user, list/modifiers)
+ . = ..()
+ if(!istype(target ,/obj/structure/window) && !istype(target, /turf/simulated/wall/))
+ return
+ var/on_wall = get_turf(target)
+ to_chat(user, "You begin attaching [src] to [on_wall].")
+ playsound(get_turf(src), 'sound/machines/click.ogg', 75, TRUE)
+ if(!do_after(user, 3 SECONDS, target = on_wall))
+ return
+ var/obj/structure/curtain/assembly/new_curtain = new /obj/structure/curtain/assembly(on_wall)
+ new_curtain.fingerprints = src.fingerprints
+ new_curtain.fingerprintshidden = src.fingerprintshidden
+ new_curtain.fingerprintslast = src.fingerprintslast
+
+ user.visible_message("[user] attaches the [src] to [on_wall].", \
+ "You attach the [src] to [on_wall].")
+ qdel(src)
+
+/obj/item/mounted/curtain/curtain_fixture/activate_self(mob/user)
+ . = ..()
+ to_chat(user, "You begin attaching [src] to the ceiling.")
+ playsound(get_turf(src), 'sound/machines/click.ogg', 75, TRUE)
+ if(!do_after(user, 3 SECONDS, target = get_turf(user)))
+ return
+ var/obj/structure/curtain/assembly/new_curtain = new /obj/structure/curtain/assembly(get_turf(user))
+ new_curtain.fingerprints = src.fingerprints
+ new_curtain.fingerprintshidden = src.fingerprintshidden
+ new_curtain.fingerprintslast = src.fingerprintslast
+
+ user.visible_message("[user] attaches the [src] to the ceiling.", \
+ "You attach the [src] to the ceiling.")
+ qdel(src)
+
+
+
+/obj/structure/curtain/assembly
+ icon_state = "assembly0"
+ name = "Curtain Rod"
+ opacity = FALSE
+ density = FALSE
+ desc = "A curtain assembly! It needs a material."
+
+/obj/structure/curtain/assembly/examine(mob/user)
+ . = ..()
+ . += "Alt-Click to take it down."
+
+/obj/structure/curtain/assembly/AltClick(mob/user)
+ if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!Adjacent(user))
+ return
+ // TODO: turn back into assembly item
+ new /obj/item/mounted/curtain/curtain_fixture(get_turf(user))
+ playsound(loc, 'sound/effects/salute.ogg' , 75, TRUE)
+ qdel(src)
+
+/obj/structure/curtain/assembly/item_interaction(mob/living/user, obj/item/used, list/modifiers)
+ if(istype(used, /obj/item/stack/sheet/cloth)) // Are we putting the cloth onto the assembly on the wall?
+ var/obj/item/stack/sheet/cloth/cloth_used = used
+ if(!cloth_used.use(2))
+ to_chat(user, " You need two sheets of cloth to hang the curtains.")
+ return ITEM_INTERACT_COMPLETE
+
+ var/obj/structure/curtain/new_curtain = new /obj/structure/curtain/(loc, 1)
+ new_curtain.assembled = TRUE
+ playsound(loc, used.drop_sound, 75, TRUE) // Play a generic cloth sound.
+ qdel(src)
+
+ return ITEM_INTERACT_COMPLETE
+
/obj/structure/curtain/attack_hand(mob/user)
playsound(get_turf(loc), "rustle", 15, TRUE, -5)
- toggle()
+ update_icon(UPDATE_OVERLAYS)
..()
+/obj/structure/curtain/attack_robot(mob/living/user)
+ . = ..()
+ playsound(get_turf(loc), "rustle", 15, TRUE, -5)
+ update_icon(UPDATE_OVERLAYS)
+ ..()
+
/obj/structure/curtain/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
@@ -31,13 +136,23 @@
if(BURN)
playsound(loc, 'sound/items/welder.ogg', 80, TRUE)
-/obj/structure/curtain/proc/toggle()
+/obj/structure/curtain/update_overlays()
+ . = ..()
set_opacity(!opacity)
+ cut_overlays()
if(opacity)
icon_state = "closed"
+ overlay = image("closed_overlay")
+ overlay.color = overlay_color
+ overlay.alpha = overlay_alpha
+ add_overlay(overlay)
layer = SHOWER_CLOSED_LAYER
else
icon_state = "open"
+ overlay = image("open_overlay")
+ overlay.color = overlay_color
+ overlay.alpha = overlay_alpha
+ add_overlay(overlay)
layer = SHOWER_OPEN_LAYER
/obj/structure/curtain/item_interaction(mob/living/user, obj/item/used, list/modifiers)
@@ -68,39 +183,49 @@
. = TRUE
if(!I.tool_start_check(src, user, 0))
return
+ if(assembled)
+ WIRECUTTER_ATTEMPT_DISMANTLE_MESSAGE
+ if(I.use_tool(src,user, 5 SECONDS, volume = I.tool_volume))
+ WIRECUTTER_DISMANTLE_SUCCESS_MESSAGE
+ var/obj/structure/curtain/assembly/new_assembly = new /obj/structure/curtain/assembly(loc, 1)
+ new_assembly.assembled = TRUE
+ var/obj/item/stack/sheet/cloth/dropped_cloth = new /obj/item/stack/sheet/cloth(loc, 2)
+ qdel(src)
+ return
+ return
+
WIRECUTTER_ATTEMPT_DISMANTLE_MESSAGE
- if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ if(I.use_tool(src, user, 5 SECONDS, volume = I.tool_volume))
WIRECUTTER_DISMANTLE_SUCCESS_MESSAGE
deconstruct()
/obj/structure/curtain/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/cloth(loc, 2)
- new /obj/item/stack/sheet/plastic(loc, 2)
new /obj/item/stack/rods(loc, 1)
qdel(src)
/obj/structure/curtain/black
name = "black curtain"
- color = "#222222"
+ overlay_color = "#222222"
/obj/structure/curtain/medical
name = "plastic curtain"
- color = "#B8F5E3"
- alpha = 200
+ overlay_color = "#B8F5E3"
+ overlay_alpha = 200
/obj/structure/curtain/open/shower
name = "shower curtain"
- color = "#ACD1E9"
- alpha = 200
+ overlay_color = "#7aa6c4"
+ overlay_alpha = 200
/obj/structure/curtain/open/shower/engineering
- color = "#FFA500"
+ overlay_color = "#FFA500"
/obj/structure/curtain/open/shower/security
- color = "#AA0000"
+ overlay_color = "#AA0000"
/obj/structure/curtain/open/shower/centcom
- color = "#000066"
+ overlay_color = "#000066"
#undef SHOWER_OPEN_LAYER
#undef SHOWER_CLOSED_LAYER
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 92bd619396c..14f5d5c6734 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -689,15 +689,6 @@
/obj/item/stack/sheet/mineral/gold = 1)
category = CAT_MISC
-/datum/crafting_recipe/showercurtain
- name = "Shower Curtains"
- result = list(/obj/structure/curtain)
- time = 20
- reqs = list(/obj/item/stack/sheet/cloth = 2,
- /obj/item/stack/sheet/plastic = 2,
- /obj/item/stack/rods = 1)
- category = CAT_MISC
-
/datum/crafting_recipe/chemical_payload
name = "Chemical Payload (C4)"
result = list(/obj/item/bombcore/chemical)
diff --git a/icons/obj/curtain.dmi b/icons/obj/curtain.dmi
index 9556717d24451def0bb5f4d6dc8363f35d9d3f73..882b5aa7e436b9bc266a334a0edb28a0a2b2ab33 100644
GIT binary patch
literal 928
zcmV;R17G}!P)V=-0C)j~ki8DVFbss}_$i`xN99LsET|RgKwkj`VsNB1L2(4?+mlkMtG7Gr
zlYPEgpSw#x==R#f2NSy(^hqB!4XCfPnTpx(KoPnZ<=Gs8v&mRw_3)9=R-mj)Tn1ZE
z&tyhi^oqqd1`#sMINtr#h$NX{3B7!GiFb?TEpH}q?;KNtYuyd)zpEerKv@TwN`?sl
z00O{CL_t(|+U=anN*qBHhO4(BySzXM#3X1SGSNjgd4Vi)fsjQ&1Q%WqH-ZZ8-FO8>
zSKgLB#kg^y4hkyXKzspr;(uo5s%vJtiw>&QsseHZ
zzyACWKYVI$Y&btXQD!|$cx(R?*38O
z{q=JYx16L6Z_nenUeg>;R7`OJ^E2z=x9^pDd1t$(UQ%9~URIr5-70B&DigYHgZBAS
zd7CItYb#r!`T5M4x?gbtG#a`p9rf~F?O45}yfC{_KZvC5sm!7G^mbjoyS+&)U}$u}
zDHZ|@0Xo@yzcd04Yu91a+2zF)c(cd1t?+S{1fIM8UhL?z||fCRJ=plpy%IUWARenE90nr6cn41)Z70z)yg=E;o=@(Lv0J8E8=_r00005_N=
literal 422
zcmV;X0a^ZuP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+
z(=$pSoZ^zil2jm5DLE&7o_IlQlzZl>gNKs
z8~_=cB-IHIXkY*U03J|GR7K_G<)fpcaBpz{003}raigQ7wY9aBw&~B({Qv*|(|6)E
z00006bW%=J|Ns90dZ?4$*M