diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 157a3a77fbe..f3b43e07caa 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -10,7 +10,6 @@ . = ..() AddComponent(/datum/component/simple_rotation) register_context() - update_appearance(UPDATE_ICON_STATE) /obj/structure/frame/computer/deconstruct(disassembled = TRUE) if(!(obj_flags & NO_DECONSTRUCTION)) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index e624e3f33d7..b3c1e055679 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -13,6 +13,10 @@ /// The current (de/con)struction state of the frame var/state = FRAME_STATE_EMPTY +/obj/structure/frame/Initialize(mapload) + . = ..() + update_appearance(UPDATE_ICON_STATE) + /obj/structure/frame/examine(user) . = ..() if(circuit) diff --git a/code/game/machinery/machine_frame.dm b/code/game/machinery/machine_frame.dm index a3c074937f0..5a6ff12c3d1 100644 --- a/code/game/machinery/machine_frame.dm +++ b/code/game/machinery/machine_frame.dm @@ -12,7 +12,6 @@ /obj/structure/frame/machine/Initialize(mapload) . = ..() register_context() - update_appearance(UPDATE_ICON_STATE) /obj/structure/frame/machine/Destroy() QDEL_LIST(components) @@ -26,8 +25,8 @@ return ..() /obj/structure/frame/machine/try_dissassemble(mob/living/user, obj/item/tool, disassemble_time) - if(anchored) - balloon_alert(user, "must be unsecured first!") + if(anchored && state == FRAME_STATE_EMPTY) //when using a screwdriver on an incomplete frame(missing components) no point checking for this + balloon_alert(user, "must be unanchored first!") return FALSE return ..() @@ -36,14 +35,15 @@ if(isnull(held_item)) return + if(held_item.tool_behaviour == TOOL_WRENCH && !circuit?.needs_anchored) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" + return CONTEXTUAL_SCREENTIP_SET + switch(state) if(FRAME_STATE_EMPTY) if(istype(held_item, /obj/item/stack/cable_coil)) context[SCREENTIP_CONTEXT_LMB] = "Wire Frame" return CONTEXTUAL_SCREENTIP_SET - else if(held_item.tool_behaviour == TOOL_WRENCH) - context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" - return CONTEXTUAL_SCREENTIP_SET else if(held_item.tool_behaviour == TOOL_WELDER) context[SCREENTIP_CONTEXT_LMB] = "Unweld frame" return CONTEXTUAL_SCREENTIP_SET @@ -61,11 +61,6 @@ if(held_item.tool_behaviour == TOOL_CROWBAR) context[SCREENTIP_CONTEXT_LMB] = "Pry out components" return CONTEXTUAL_SCREENTIP_SET - else if(held_item.tool_behaviour == TOOL_WRENCH) - if(!circuit.needs_anchored) - context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" - return CONTEXTUAL_SCREENTIP_SET - return NONE else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) var/needs_components = FALSE for(var/component in req_components) @@ -470,5 +465,6 @@ return TRUE /obj/structure/frame/machine/secured + icon_state = "box_1" state = FRAME_STATE_WIRED anchored = TRUE diff --git a/code/modules/mining/boulder_processing/_boulder_processing.dm b/code/modules/mining/boulder_processing/_boulder_processing.dm index e7f599f5092..b79bfe36dc6 100644 --- a/code/modules/mining/boulder_processing/_boulder_processing.dm +++ b/code/modules/mining/boulder_processing/_boulder_processing.dm @@ -66,9 +66,9 @@ else if(istype(held_item, /obj/item/card/id) && points_held > 0) context[SCREENTIP_CONTEXT_LMB] = "Claim mining points" else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) - context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" else if(held_item.tool_behaviour == TOOL_WRENCH) - context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "" : "Un"] Anchor" + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]Anchor" else if(panel_open && held_item.tool_behaviour == TOOL_CROWBAR) context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" @@ -96,39 +96,17 @@ /obj/machinery/bouldertech/update_icon_state() . = ..() var/suffix = "" - if(!anchored || !is_operational || (machine_stat & (BROKEN | NOPOWER)) || panel_open) + if(!anchored || panel_open || !is_operational || (machine_stat & (BROKEN | NOPOWER))) suffix = "-off" icon_state ="[initial(icon_state)][suffix]" -/obj/machinery/bouldertech/wrench_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_BLOCKING - if(default_unfasten_wrench(user, tool, time = 1.5 SECONDS) == SUCCESSFUL_UNFASTEN) - if(anchored) - begin_processing() - else - end_processing() - update_appearance(UPDATE_ICON_STATE) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/bouldertech/screwdriver_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_BLOCKING - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-off", initial(icon_state), tool)) - update_appearance(UPDATE_ICON_STATE) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/bouldertech/crowbar_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_BLOCKING - if(default_deconstruction_crowbar(tool)) - return ITEM_INTERACT_SUCCESS - /obj/machinery/bouldertech/CanAllowThrough(atom/movable/mover, border_dir) if(!anchored) return FALSE if(istype(mover, /obj/item/boulder)) return can_process_boulder(mover) if(isgolem(mover)) - var/mob/living/carbon/human/rockman = mover - return rockman.body_position == LYING_DOWN + return can_process_golem(mover) return ..() /** @@ -142,7 +120,7 @@ SHOULD_BE_PURE(TRUE) //machine not operational - if(!anchored || panel_open || !is_operational) + if(!anchored || panel_open || !is_operational || (machine_stat & (BROKEN | NOPOWER))) return FALSE //not a valid boulder @@ -170,6 +148,8 @@ * * obj/item/boulder/new_boulder - the boulder to accept */ /obj/machinery/bouldertech/proc/accept_boulder(obj/item/boulder/new_boulder) + PRIVATE_PROC(TRUE) + if(!can_process_boulder(new_boulder)) return FALSE @@ -180,28 +160,55 @@ return TRUE /** - * Accepts a golem to be processed, mainly for memes + * Can we maim this golem + * Arguments + * + * * [rockman][mob/living/carbon/human] - the golem we are trying to main */ -/obj/machinery/bouldertech/proc/accept_golem(mob/living/carbon/human/rockman) - if(!is_operational || !anchored) +/obj/machinery/bouldertech/proc/can_process_golem(mob/living/carbon/human/rockman) + PRIVATE_PROC(TRUE) + SHOULD_BE_PURE(TRUE) + + //not operatinal + if(!anchored || panel_open || !is_operational || (machine_stat & (BROKEN | NOPOWER))) return FALSE + + //still in cooldown if(!COOLDOWN_FINISHED(src, accept_cooldown)) return FALSE - if(rockman.body_position != LYING_DOWN) + + //not processable + if(!istype(rockman) || QDELETED(rockman) || rockman.body_position != LYING_DOWN) return FALSE - if(!maim_golem(rockman)) - return FALSE - playsound(src, usage_sound, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - COOLDOWN_START(src, accept_cooldown, 3 SECONDS) + return TRUE +/** + * Accepts a golem to be processed, mainly for memes + * Arguments + * + * * [rockman][mob/living/carbon/human] - the golem we are trying to main + */ +/obj/machinery/bouldertech/proc/accept_golem(mob/living/carbon/human/rockman) + PRIVATE_PROC(TRUE) + + if(!can_process_golem(rockman)) + return + + maim_golem(rockman) + use_power(active_power_usage * 1.5) + playsound(src, usage_sound, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + + COOLDOWN_START(src, accept_cooldown, 3 SECONDS) + /// What effects actually happens to a golem when it is "processed" /obj/machinery/bouldertech/proc/maim_golem(mob/living/carbon/human/rockman) + PROTECTED_PROC(TRUE) + Shake(duration = 1 SECONDS) rockman.visible_message(span_warning("[rockman] is processed by [src]!"), span_userdanger("You get processed into bits by [src]!")) rockman.investigate_log("was gibbed by [src] for being a golem", INVESTIGATE_DEATHS) rockman.gib(DROP_ALL_REMAINS) - return TRUE /obj/machinery/bouldertech/proc/on_entered(datum/source, atom/movable/atom_movable) SIGNAL_HANDLER @@ -234,42 +241,61 @@ return FALSE -/obj/machinery/bouldertech/attackby(obj/item/attacking_item, mob/user, params) - if(panel_open) +/obj/machinery/bouldertech/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + if(panel_open || user.combat_mode) return ..() - if(istype(attacking_item, /obj/item/boulder)) - . = TRUE - var/obj/item/boulder/my_boulder = attacking_item + if(istype(tool, /obj/item/boulder)) + var/obj/item/boulder/my_boulder = tool if(!accept_boulder(my_boulder)) balloon_alert_to_viewers("cannot accept!") - return + return ITEM_INTERACT_BLOCKING balloon_alert_to_viewers("accepted") - return + return ITEM_INTERACT_SUCCESS - if(istype(attacking_item, /obj/item/card/id)) - . = TRUE + if(istype(tool, /obj/item/card/id)) if(points_held <= 0) balloon_alert_to_viewers("no points to claim!") if(!COOLDOWN_FINISHED(src, sound_cooldown)) - return + return ITEM_INTERACT_BLOCKING COOLDOWN_START(src, sound_cooldown, 1.5 SECONDS) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, FALSE) - return + return ITEM_INTERACT_BLOCKING - var/obj/item/card/id/id_card = attacking_item + var/obj/item/card/id/id_card = tool var/amount = tgui_input_number(user, "How many mining points do you wish to claim? ID Balance: [id_card.registered_account.mining_points], stored mining points: [points_held]", "Transfer Points", max_value = points_held, min_value = 0, round_value = 1) if(!amount) - return + return ITEM_INTERACT_BLOCKING if(amount > points_held) amount = points_held id_card.registered_account.mining_points += amount points_held = round(points_held - amount) to_chat(user, span_notice("You claim [amount] mining points from \the [src] to [id_card].")) - return + return ITEM_INTERACT_SUCCESS return ..() +/obj/machinery/bouldertech/wrench_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_unfasten_wrench(user, tool, time = 1.5 SECONDS) == SUCCESSFUL_UNFASTEN) + if(anchored) + begin_processing() + else + end_processing() + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/bouldertech/screwdriver_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-off", initial(icon_state), tool)) + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/bouldertech/crowbar_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + /obj/machinery/bouldertech/attack_hand_secondary(mob/user, list/modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) @@ -295,15 +321,17 @@ * Accepts a boulder into the machinery, then converts it into minerals. * If the boulder can be fully processed by this machine, we take the materials, insert it into the silo, and destroy the boulder. * If the boulder has materials left, we make a copy of the boulder to hold the processable materials, take the processable parts, and eject the original boulder. - * @param chosen_boulder The boulder to being breaking down into minerals. + * Arguments + * + * * obj/item/boulder/chosen_boulder - The boulder to being breaking down into minerals. */ /obj/machinery/bouldertech/proc/breakdown_boulder(obj/item/boulder/chosen_boulder) PRIVATE_PROC(TRUE) if(QDELETED(chosen_boulder)) - return FALSE + return if(chosen_boulder.loc != src) - return FALSE + return //if boulders are kept inside because there is no space to eject them, then they could be reprocessed, lets avoid that if(!chosen_boulder.processed_by) @@ -330,7 +358,7 @@ if(istype(chosen_boulder, /obj/item/boulder/artifact)) points_held = round((points_held + MINER_POINT_MULTIPLIER) * MINING_POINT_MACHINE_MULTIPLIER) /// Artifacts give bonus points! chosen_boulder.break_apart() - return TRUE //We've processed all the materials in the boulder, so we can just destroy it in break_apart. + return//We've processed all the materials in the boulder, so we can just destroy it in break_apart. chosen_boulder.processed_by = src @@ -338,7 +366,7 @@ remove_boulder(chosen_boulder) /obj/machinery/bouldertech/process() - if(!anchored || panel_open || !is_operational || machine_stat & (BROKEN | NOPOWER)) + if(!anchored || panel_open || !is_operational || (machine_stat & (BROKEN | NOPOWER))) return var/boulders_found = FALSE diff --git a/code/modules/mining/boulder_processing/brm.dm b/code/modules/mining/boulder_processing/brm.dm index e4d525bff05..592ade5b757 100644 --- a/code/modules/mining/boulder_processing/brm.dm +++ b/code/modules/mining/boulder_processing/brm.dm @@ -37,26 +37,23 @@ register_context() /obj/machinery/brm/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = CONTEXTUAL_SCREENTIP_SET + . = NONE if(isnull(held_item)) context[SCREENTIP_CONTEXT_LMB] = "Teleport single boulder" context[SCREENTIP_CONTEXT_RMB] = "Toggle [toggled_on ? "Off" : "On"] automatic boulder retrieval" - return + return CONTEXTUAL_SCREENTIP_SET if(!isnull(held_item)) if(held_item.tool_behaviour == TOOL_WRENCH) - context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "" : "Un"] Anchor" - return - if(held_item.tool_behaviour == TOOL_SCREWDRIVER) - context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" - return - - if(panel_open) - if(held_item.tool_behaviour == TOOL_CROWBAR) - context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" - - return CONTEXTUAL_SCREENTIP_SET + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]Anchor" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" + return CONTEXTUAL_SCREENTIP_SET + else if(panel_open && held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET /obj/machinery/brm/examine(mob/user) . = ..() @@ -131,8 +128,6 @@ var/result = pre_collect_boulder() if(result == TURF_BLOCKED_BY_BOULDER) balloon_alert(user, "no space") - else if(result) - balloon_alert(user, "teleporting") COOLDOWN_START(src, manual_teleport_cooldown, TELEPORTATION_TIME) return TRUE diff --git a/code/modules/mining/boulder_processing/refinery.dm b/code/modules/mining/boulder_processing/refinery.dm index 1e27bad1f0c..a751566efa1 100644 --- a/code/modules/mining/boulder_processing/refinery.dm +++ b/code/modules/mining/boulder_processing/refinery.dm @@ -89,5 +89,3 @@ rockman.visible_message(span_warning("[rockman] is processed by [src]!"), span_userdanger("You get melted into rock by [src]!")) rockman.investigate_log("was melted by [src] for being a golem", INVESTIGATE_DEATHS) rockman.dust() - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), src, 'sound/machines/ding.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE), 2.5 SECONDS) - return TRUE