diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index dbe94cb8..d68930d6 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -17,30 +17,34 @@ * Metal */ GLOBAL_LIST_INIT(metal_recipes, list ( \ - new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \ - //CIT CHANGE - adds sofas to metal recipe list - new/datum/stack_recipe_list("sofas", list( \ - new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \ - new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, one_per_turf = TRUE, on_floor = TRUE), \ - new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, one_per_turf = TRUE, on_floor = TRUE), \ - new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, one_per_turf = TRUE, on_floor = TRUE), \ - )), \ - //END OF CIT CHANGES - null, \ - new/datum/stack_recipe_list("office chairs", list( \ + new/datum/stack_recipe_list("seats", \ + list( \ + new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = TRUE, on_floor = TRUE), \ + null, \ new/datum/stack_recipe("dark office chair", /obj/structure/chair/office/dark, 5, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("light office chair", /obj/structure/chair/office/light, 5, one_per_turf = TRUE, on_floor = TRUE), \ - )), \ - new/datum/stack_recipe_list("comfy chairs", list( \ + null, \ new/datum/stack_recipe("beige comfy chair", /obj/structure/chair/comfy/beige, 2, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("black comfy chair", /obj/structure/chair/comfy/black, 2, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brown comfy chair", /obj/structure/chair/comfy/brown, 2, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("lime comfy chair", /obj/structure/chair/comfy/lime, 2, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("teal comfy chair", /obj/structure/chair/comfy/teal, 2, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("teal comfy chair", /obj/structure/chair/comfy/teal, 2, one_per_turf = TRUE, on_floor = TRUE) \ )), \ + //CIT CHANGE - adds sofas to metal recipe list + new/datum/stack_recipe_list("sofas", \ + list( \ + new/datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, one_per_turf = TRUE, on_floor = TRUE) \ + )), \ + //END OF CIT CHANGES + new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \ + null, \ + //add this when I can find a way to make them easily constructible > new/datum/stack_recipe("sink", /obj/structure/sink, 2, one_per_turf = TRUE, on_floor = TRUE), + new/datum/stack_recipe("shower", /obj/machinery/shower/crafted, 2, one_per_turf = TRUE, on_floor = TRUE), \ null, \ new/datum/stack_recipe("rack parts", /obj/item/rack_parts), \ new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ @@ -56,7 +60,8 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ null, \ - new /datum/stack_recipe_list("airlock assemblies", list( \ + new /datum/stack_recipe_list("airlock assemblies", \ + list( \ new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \ new /datum/stack_recipe("public airlock assembly", /obj/structure/door_assembly/door_assembly_public, 4, time = 50, one_per_turf = 1, on_floor = 1), \ new /datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \ @@ -74,7 +79,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new /datum/stack_recipe("external maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_extmai, 4, time = 50, one_per_turf = 1, on_floor = 1), \ new /datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \ new /datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - )), \ + )), \ null, \ new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm index 29826eb2..5e1cc79a 100644 --- a/code/game/objects/structures/loom.dm +++ b/code/game/objects/structures/loom.dm @@ -8,14 +8,48 @@ density = TRUE anchored = TRUE -/obj/structure/loom/attackby(obj/item/stack/sheet/W, mob/user) - if(W.is_fabric && W.amount > 1) - user.show_message("You start weaving the [W.name] through the loom..", 1) - if(W.use_tool(src, user, W.pull_effort)) - new W.loom_result(drop_location()) - user.show_message("You weave the [W.name] into a workable fabric.", 1) - W.amount = (W.amount - 2) - if(W.amount < 1) - qdel(W) +/obj/structure/loom/attackby(obj/item/I, mob/user) + if (user.a_intent != INTENT_HELP) + return ..() + if (istype(I, /obj/item/stack/sheet)) + if (!anchored) + return to_chat(user, "You have to anchor [src] first!") + + var/obj/item/stack/sheet/W = I + if(W.is_fabric && W.amount > 1) + user.visible_message("", + "You start weaving the [W.name] through the loom.") + + if(W.use_tool(src, user, W.pull_effort)) + new W.loom_result(drop_location()) + to_chat(user, "You weave the [W.name] into a workable fabric.") + W.amount = (W.amount - 2) + if(W.amount < 1) + qdel(W) + else + to_chat("You need at least 2 [W.name] to loom into fabric!") else - user.show_message("You need a valid fabric and at least 2 of said fabric before using this.", 1) \ No newline at end of file + switch (I.tool_behaviour) + if (TOOL_SCREWDRIVER) + user.visible_message("[user] starts disassembling [src]...", + "You start disassembling [src]...") + I.play_tool_sound(src) + if(I.use_tool(src, user, 60)) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) + deconstruct(TRUE) + return + if (TOOL_WRENCH) + if (anchored) + to_chat(user, "You unsecure the [src].") + I.play_tool_sound(src) + anchored = FALSE + else + to_chat(user, "You secure the [src].") + I.play_tool_sound(src) + anchored = TRUE + return + return ..() + +/obj/structure/loom/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/mineral/wood (get_turf(src), 10) + qdel(src) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index a43c5a47..9036d8dc 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -219,6 +219,9 @@ var/watertemp = "normal" //freezing, normal, or boiling var/datum/looping_sound/showering/soundloop +/obj/machinery/shower/crafted //When created from sheets of metal + anchored = FALSE + /obj/machinery/shower/Initialize() . = ..() soundloop = new(list(src), FALSE) @@ -227,6 +230,29 @@ QDEL_NULL(soundloop) return ..() +/obj/machinery/shower/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/metal (get_turf(src), 2) + Destroy() + +//Copy from /obj/structure/chair +/obj/machinery/shower/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE, CALLBACK(src, .proc/can_user_rotate),CALLBACK(src, .proc/can_be_rotated),null) + +/obj/machinery/shower/proc/can_be_rotated(mob/user) + return !anchored + +/obj/machinery/shower/proc/can_user_rotate(mob/user) + if(istype(user, /mob/living)) + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return FALSE + else + return TRUE + else if(isobserver(user) && CONFIG_GET(flag/ghost_interaction)) + return TRUE + return FALSE +//// + /obj/effect/mist name = "mist" icon = 'icons/obj/watercloset.dmi' @@ -236,6 +262,8 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/machinery/shower/interact(mob/M) + if (!anchored) + return to_chat(M, "You have to connect [src] to the floor first!") on = !on update_icon() add_fingerprint(M) @@ -258,25 +286,56 @@ /obj/machinery/shower/attackby(obj/item/I, mob/user, params) if(I.type == /obj/item/analyzer) - to_chat(user, "The water temperature seems to be [watertemp].") - else + to_chat(user, "The water temperature seems to be [watertemp].") + return + + if (user.a_intent != INTENT_HELP) return ..() -/obj/machinery/shower/wrench_act(mob/living/user, obj/item/I) - to_chat(user, "You begin to adjust the temperature valve with \the [I]...") - if(I.use_tool(src, user, 50)) - switch(watertemp) - if("normal") - watertemp = "freezing" - if("freezing") - watertemp = "boiling" - if("boiling") - watertemp = "normal" - user.visible_message("[user] adjusts the shower with \the [I].", "You adjust the shower with \the [I] to [watertemp] temperature.") - log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])") - add_hiddenprint(user) - return TRUE + switch (I.tool_behaviour) + if (TOOL_WRENCH) + if (!anchored) + user.visible_message("[user] starts to take apart [src]...", "You start dismantling [src]...") + I.play_tool_sound(src) + if(I.use_tool(src, user, 20)) + deconstruct(TRUE) + else + to_chat(user, "You begin to adjust the temperature valve with \the [I]...") + if(I.use_tool(src, user, 50)) + switch(watertemp) + if("normal") + watertemp = "freezing" + if("freezing") + watertemp = "boiling" + if("boiling") + watertemp = "normal" + user.visible_message("[user] adjusts the shower with \the [I].", "You adjust the shower with \the [I] to [watertemp] temperature.") + log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])") + add_hiddenprint(user) + if (TOOL_SCREWDRIVER) + if (!anchored) + to_chat(user, "You begin screwing in [src] to the floor...") + I.play_tool_sound(src) + if(I.use_tool(src, user, 30)) + user.visible_message("[user] connects [src] to the floor.", "You connect [src] to the floor.") + anchored = TRUE + else + to_chat(user, "You start to take out [src]'s screws...") + on = FALSE + soundloop.stop() + update_icon() + I.play_tool_sound(src) + if(I.use_tool(src, user, 20)) + user.visible_message("[user] disconnects [src] from the floor.", "You disconnect [src] from the floor.") + anchored = FALSE + +/obj/machinery/shower/examine() + . += ..() + if (anchored) + . += "It looks like it can be taken apart with a screwdriver..." + else + . += "Its screws are out of place, allowing it to be dismantled with a wrench." /obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up cut_overlays() //once it's been on for a while, in addition to handling the water overlay. @@ -463,6 +522,27 @@ anchored = TRUE var/busy = FALSE //Something's being washed at the moment var/dispensedreagent = /datum/reagent/water // for whenever plumbing happens + layer = WALL_OBJ_LAYER + +/*/obj/structure/sink/Initialize() //This doesn't work in the slightest. It used to at some point through development, but that made it so you cant interact with the object whatsoever. I hate this. + . = ..() + switch (dir) //Thinking about moving this into its own construction sequence so it can actually work, like using a screwdriver will set its pixel offset, but I feel like that's too much + if (NORTH) //Or maybe putting it in lateinit... but that's sloppy and I feel like it wont work when spawning it in after the round starts + pixel_x = pixel_y = 0 + layer = WALL_OBJ_LAYER + if (EAST) + pixel_x = 12 + pixel_y = 3 + layer = WALL_OBJ_LAYER + if (SOUTH) + pixel_y = 24 + pixel_x = 0 + layer = ABOVE_OBJ_LAYER + if (WEST) + pixel_x = -12 + pixel_y = 3 + layer = WALL_OBJ_LAYER +*/ /obj/structure/sink/attack_hand(mob/living/user) @@ -509,7 +589,16 @@ /obj/structure/sink/attackby(obj/item/O, mob/living/user, params) if(busy) - to_chat(user, "Someone's already washing here!") + to_chat(user, "Someone's already washing here.") + return + + if (istype(O, /obj/item/wrench) && user.a_intent == INTENT_HELP) + to_chat(user, "You start deconstructing [src]...") + O.play_tool_sound(src) + + if(O.use_tool(src, user, 20)) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) + deconstruct(TRUE) return if(istype(O, /obj/item/reagent_containers)) @@ -574,16 +663,13 @@ return ..() /obj/structure/sink/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/metal (loc, 3) + new /obj/item/stack/sheet/metal (loc, 2) qdel(src) - - /obj/structure/sink/kitchen name = "kitchen sink" icon_state = "sink_alt" - /obj/structure/sink/puddle //splishy splashy ^_^ name = "puddle" desc = "A puddle used for washing one's hands and face." diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index ab6625b4..cc1326c3 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -38,8 +38,10 @@ playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) /obj/structure/fermenting_barrel/attackby(obj/item/I, mob/user, params) - var/obj/item/reagent_containers/food/snacks/grown/fruit = I - if(istype(fruit)) + if (user.a_intent != INTENT_HELP) + return ..() + if (istype(I, /obj/item/reagent_containers/food/snacks/grown)) + var/obj/item/reagent_containers/food/snacks/grown/fruit = I if(!fruit.can_distill) to_chat(user, "You can't distill this into anything...") return TRUE @@ -50,7 +52,32 @@ addtimer(CALLBACK(src, .proc/makeWine, fruit), rand(80, 120) * speed_multiplier) return TRUE else - return ..() + switch (I.tool_behaviour) + if (TOOL_SCREWDRIVER) + user.visible_message("[user] starts disassembling [src]...", + "You start disassembling [src]...") + var/reagent_calculation = 1 + if (reagents.total_volume) + user.visible_message("Liquid starts pouring out [src] as [user] starts disassembling it!", + "Liquid starts pouring out [src], maybe you should think about this...") + reagent_calculation += 2+round(reagents.total_volume/100)/2 + I.play_tool_sound(src) + if(I.use_tool(src, user, 30*reagent_calculation)) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) + if (reagents.total_volume) + chem_splash(loc, round(reagent_calculation*0.75), list(reagents)) + deconstruct(TRUE) + else if (reagents.total_volume) + visible_message("[user] stops disassembling [src].") + if (TOOL_WRENCH) + if (anchored) //Imaginary bolts on the ground, just like anything else that can get wrenched + to_chat(user, "You unsecure [src].") + I.play_tool_sound(src) + anchored = FALSE + else + to_chat(user, "You secure [src].") + I.play_tool_sound(src) + anchored = TRUE /obj/structure/fermenting_barrel/attack_hand(mob/user) open = !open @@ -69,3 +96,7 @@ icon_state = "barrel_open" else icon_state = "barrel" + +/obj/structure/fermenting_barrel/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/mineral/wood (get_turf(src), 10) + qdel(src)