diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm index f68b0840205..86381d4ec22 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm @@ -15,3 +15,5 @@ #define COMSIG_SILICON_AI_VACATE_APC "AI_vacate_apc" ///called when an AI's control is toggled #define COMSIG_SILICON_AI_SET_CONTROL_DISABLED "AI_set_control_disabled" +///called when borg module is activated/deactivated +#define COMSIG_SILICON_MODULE_ACTIVATION "borg_module_select" diff --git a/code/game/objects/items/robot/items/tools.dm b/code/game/objects/items/robot/items/tools.dm index 41e73a1bf79..23fe0c97edf 100644 --- a/code/game/objects/items/robot/items/tools.dm +++ b/code/game/objects/items/robot/items/tools.dm @@ -187,13 +187,20 @@ return ..() /obj/item/borg/cyborg_omnitool/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() + . = NONE if (!issilicon(user)) return + var/mob/living/silicon/robot/as_cyborg = user if (!(src in as_cyborg.held_items)) context[SCREENTIP_CONTEXT_RMB] = "Select Tool" - return CONTEXTUAL_SCREENTIP_SET + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/borg/cyborg_omnitool/examine(mob/user) + . = ..() + if(reference) + var/obj/item/tool = get_proxy_attacker_for(src, usr) + . += tool.examine(user) /** * Sets the new internal tool to be used @@ -202,8 +209,6 @@ * * obj/item/ref - typepath for the new internal omnitool */ /obj/item/borg/cyborg_omnitool/proc/set_internal_tool(obj/item/tool) - SHOULD_NOT_OVERRIDE(TRUE) - for(var/obj/item/internal_tool as anything in omni_toolkit) if(internal_tool == tool) reference = internal_tool @@ -237,11 +242,14 @@ //if all else fails just make a new one from scratch tool = new reference(user) + //assign the upgraded toolspeed, if engi omnitool upgrade was applied. + tool.toolspeed = initial(tool.toolspeed) - upgraded * 0.3 //the internal tool is considered part of the tool itself, so don't let it be dropped. tool.item_flags |= ABSTRACT ADD_TRAIT(tool, TRAIT_NODROP, INNATE_TRAIT) + //store tool for future use atoms[reference] = tool - tool.toolspeed = initial(tool.toolspeed) - upgraded * 0.3 //and finally assign the upgraded toolspeed, if any. + return tool /obj/item/borg/cyborg_omnitool/attack_self(mob/user) @@ -270,7 +278,8 @@ var/mob/living/silicon/robot/user = usr if (!(src in user.held_items)) attack_self(user) - return ..() + . = ..() + user.select_module(user.held_items.Find(src)) /obj/item/borg/cyborg_omnitool/update_icon_state() if (reference) @@ -318,15 +327,77 @@ /obj/item/screwdriver/cyborg, /obj/item/crowbar/cyborg, /obj/item/multitool/cyborg, + /obj/item/weldingtool/largetank/cyborg, ) +/obj/item/borg/cyborg_omnitool/engineering/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_SILICON_MODULE_ACTIVATION, PROC_REF(welder_toggle)) + +/obj/item/borg/cyborg_omnitool/engineering/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if (!issilicon(user) || tool_behaviour != TOOL_WELDER) + return + + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Toggle welder" + return CONTEXTUAL_SCREENTIP_SET + /obj/item/borg/cyborg_omnitool/engineering/examine(mob/user) . = ..() + if(tool_behaviour == TOOL_WELDER) + . += span_notice("Use [EXAMINE_HINT("Ctrl Click")] to toggle welder") - if(tool_behaviour == TOOL_MULTITOOL) - for(var/obj/item/multitool/tool in atoms) - . += "Its multitool buffer contains [tool.buffer]" - break +/obj/item/borg/cyborg_omnitool/engineering/update_overlays() + . = ..() + if(tool_behaviour == TOOL_WELDER) + var/obj/item/weldingtool/tool = atoms[/obj/item/weldingtool/largetank/cyborg] + if(tool?.welding) + . |= tool.update_overlays() + +/obj/item/borg/cyborg_omnitool/engineering/set_internal_tool(obj/item/tool) + if(tool_behaviour == TOOL_WELDER) + welder_toggle(src, FALSE) + + . = ..() + + if(tool_behaviour == TOOL_WELDER) + welder_toggle(src, TRUE) + +/obj/item/borg/cyborg_omnitool/engineering/item_ctrl_click(mob/user) + . = NONE + if(tool_behaviour == TOOL_WELDER) + var/mob/living/silicon/robot/borgy = loc + if(!istype(borgy) || borgy.module_active != src) + return + + welder_toggle(src, null) + return CLICK_ACTION_SUCCESS + +///Reflects internal welder icon onto the omnitool +/obj/item/borg/cyborg_omnitool/engineering/proc/welder_update(source) + PRIVATE_PROC(TRUE) + SIGNAL_HANDLER + + update_appearance(UPDATE_OVERLAYS) + +///Toggles welder on/off when module slot is selected/deselected +/obj/item/borg/cyborg_omnitool/engineering/proc/welder_toggle(datum/omnitool, state) + PRIVATE_PROC(TRUE) + SIGNAL_HANDLER + + if(tool_behaviour == TOOL_WELDER) + var/obj/item/weldingtool/tool = get_proxy_attacker_for(src, usr) + if(isnull(state)) + state = !tool.welding + if(state == tool.welding) + return + + if(state) + RegisterSignal(tool, COMSIG_ATOM_UPDATE_APPEARANCE, PROC_REF(welder_update)) + tool.switched_on(usr) + else + tool.switched_off() + UnregisterSignal(tool, COMSIG_ATOM_UPDATE_APPEARANCE) /obj/item/borg/cyborg_omnitool/botany name = "botanical omni-toolset" diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index b5f2d7b78ce..3d9e29418a1 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -459,10 +459,6 @@ if(!.) return . ADD_TRAIT(cyborg, TRAIT_FASTMED, REF(src)) - for(var/obj/item/borg/cyborg_omnitool/medical/omnitool_upgrade in cyborg.model.modules) - if(omnitool_upgrade.upgraded) - to_chat(user, span_warning("This unit is already equipped with an omnitool upgrade!")) - return FALSE for(var/obj/item/borg/cyborg_omnitool/medical/omnitool in cyborg.model.modules) omnitool.set_upgraded(TRUE) @@ -471,7 +467,7 @@ if(!.) return . REMOVE_TRAIT(cyborg, TRAIT_FASTMED, REF(src)) - for(var/obj/item/borg/cyborg_omnitool/omnitool in cyborg.model.modules) + for(var/obj/item/borg/cyborg_omnitool/medical/omnitool in cyborg.model.modules) omnitool.set_upgraded(FALSE) /obj/item/borg/upgrade/engineering_omnitool @@ -486,24 +482,16 @@ /obj/item/borg/upgrade/engineering_omnitool/action(mob/living/silicon/robot/cyborg, mob/living/user = usr) . = ..() if(!.) - return . - for(var/obj/item/borg/cyborg_omnitool/engineering/omnitool_upgrade in cyborg.model.modules) - if(omnitool_upgrade.upgraded) - to_chat(user, span_warning("This unit is already equipped with an omnitool upgrade!")) - return FALSE + return for(var/obj/item/borg/cyborg_omnitool/engineering/omnitool in cyborg.model.modules) omnitool.set_upgraded(TRUE) - for(var/obj/item/weldingtool/largetank/cyborg/welder in cyborg.model.modules) - welder.toolspeed = initial(welder.toolspeed) - 0.3 /obj/item/borg/upgrade/engineering_omnitool/deactivate(mob/living/silicon/robot/cyborg, mob/living/user = usr) . = ..() if(!.) - return . - for(var/obj/item/borg/cyborg_omnitool/omnitool in cyborg.model.modules) + return + for(var/obj/item/borg/cyborg_omnitool/engineering/omnitool in cyborg.model.modules) omnitool.set_upgraded(FALSE) - for(var/obj/item/weldingtool/largetank/cyborg/welder in cyborg.model.modules) - welder.toolspeed = initial(welder.toolspeed) /obj/item/borg/upgrade/defib name = "medical cyborg defibrillator" diff --git a/code/game/objects/items/tools/engineering/weldingtool.dm b/code/game/objects/items/tools/engineering/weldingtool.dm index e61fc068e21..35cdccdce8b 100644 --- a/code/game/objects/items/tools/engineering/weldingtool.dm +++ b/code/game/objects/items/tools/engineering/weldingtool.dm @@ -261,13 +261,13 @@ START_PROCESSING(SSobj, src) else balloon_alert(user, "no fuel!") - switched_off(user) + switched_off() else playsound(loc, deactivation_sound, 50, TRUE) - switched_off(user) + switched_off() /// Switches the welder off -/obj/item/weldingtool/proc/switched_off(mob/user) +/obj/item/weldingtool/proc/switched_off() set_welding(FALSE) force = 3 diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 30790c176b5..ecab5e952ce 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -274,6 +274,7 @@ if(module && module_active != held_items[module_num]) module.icon_state = "[module.base_icon_state] +a" module_active = held_items[module_num] + SEND_SIGNAL(module_active, COMSIG_SILICON_MODULE_ACTIVATION, TRUE) return TRUE /** @@ -285,6 +286,8 @@ var/atom/movable/screen/robot/module_slot/module = hud_used?.screen_objects[HUD_KEY_CYBORG_MODULE(module_num)] if(module) module.icon_state = module.base_icon_state + if(module_active) + SEND_SIGNAL(module_active, COMSIG_SILICON_MODULE_ACTIVATION, FALSE) module_active = null return TRUE diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 72032c2104a..deee0d54305 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -389,7 +389,6 @@ /obj/item/construction/rcd/borg, /obj/item/pipe_dispenser, /obj/item/extinguisher, - /obj/item/weldingtool/largetank/cyborg, /obj/item/borg/cyborg_omnitool/engineering, /obj/item/borg/cyborg_omnitool/engineering, /obj/item/t_scanner, @@ -961,7 +960,6 @@ /obj/item/pipe_dispenser, /obj/item/restraints/handcuffs/cable/zipties, /obj/item/extinguisher, - /obj/item/weldingtool/largetank/cyborg, /obj/item/analyzer, /obj/item/borg/cyborg_omnitool/engineering, /obj/item/borg/cyborg_omnitool/engineering,