From 5a69499927a9f257fd91c5b8fec4c115b645943a Mon Sep 17 00:00:00 2001 From: Ghommie Date: Fri, 7 Jun 2019 01:32:15 +0200 Subject: [PATCH 1/2] Hol up, unrelated PR time, atomization. --- code/_onclick/hud/radial.dm | 75 ++++++++--- code/_onclick/hud/radial_persistent.dm | 76 ++++++++++++ code/datums/action.dm | 7 +- code/game/objects/items/RCD.dm | 165 ++++++++++++++++++------- code/game/objects/items/RCL.dm | 134 ++++++++++++++++++-- code/game/turfs/turf.dm | 2 + code/modules/power/cable.dm | 10 +- icons/mob/actions/actions_items.dmi | Bin 8842 -> 9131 bytes icons/mob/radial.dmi | Bin 3303 -> 15818 bytes 9 files changed, 393 insertions(+), 76 deletions(-) create mode 100644 code/_onclick/hud/radial_persistent.dm diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 03b951e6bb..df91223ed1 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -1,4 +1,7 @@ #define NEXT_PAGE_ID "__next__" +#define DEFAULT_CHECK_DELAY 20 + +GLOBAL_LIST_EMPTY(radial_menus) /obj/screen/radial icon = 'icons/mob/radial.dmi' @@ -10,14 +13,19 @@ icon_state = "radial_slice" var/choice var/next_page = FALSE + var/tooltips = FALSE /obj/screen/radial/slice/MouseEntered(location, control, params) . = ..() icon_state = "radial_slice_focus" + if(tooltips) + openToolTip(usr, src, params, title = name) /obj/screen/radial/slice/MouseExited(location, control, params) . = ..() icon_state = "radial_slice" + if(tooltips) + closeToolTip(usr) /obj/screen/radial/slice/Click(location, control, params) if(usr.client == parent.current_user) @@ -30,6 +38,14 @@ name = "Close Menu" icon_state = "radial_center" +/obj/screen/radial/center/MouseEntered(location, control, params) + . = ..() + icon_state = "radial_center_focus" + +/obj/screen/radial/center/MouseExited(location, control, params) + . = ..() + icon_state = "radial_center" + /obj/screen/radial/center/Click(location, control, params) if(usr.client == parent.current_user) parent.finished = TRUE @@ -48,6 +64,9 @@ var/atom/anchor var/image/menu_holder var/finished = FALSE + var/datum/callback/custom_check_callback + var/next_check = 0 + var/check_delay = DEFAULT_CHECK_DELAY var/radius = 32 var/starting_angle = 0 @@ -57,7 +76,7 @@ var/max_elements var/pages = 1 var/current_page = 1 - + var/hudfix_method = TRUE //TRUE to change anchor to user, FALSE to shift by py_shift var/py_shift = 0 var/entry_animation = TRUE @@ -75,7 +94,7 @@ restrict_to_dir(NORTH) //I was going to parse screen loc here but that's more effort than it's worth. //Sets defaults -//These assume 45 deg min_angle +//These assume 45 deg min_angle /datum/radial_menu/proc/restrict_to_dir(dir) switch(dir) if(NORTH) @@ -91,18 +110,19 @@ starting_angle = 180 ending_angle = 45 -/datum/radial_menu/proc/setup_menu() +/datum/radial_menu/proc/setup_menu(use_tooltips) if(ending_angle > starting_angle) zone = ending_angle - starting_angle else zone = 360 - starting_angle + ending_angle - + max_elements = round(zone / min_angle) var/paged = max_elements < choices.len if(elements.len < max_elements) var/elements_to_add = max_elements - elements.len for(var/i in 1 to elements_to_add) //Create all elements - var/obj/screen/radial/new_element = new /obj/screen/radial/slice + var/obj/screen/radial/slice/new_element = new /obj/screen/radial/slice + new_element.tooltips = use_tooltips new_element.parent = src elements += new_element @@ -163,7 +183,7 @@ else E.pixel_y = py E.pixel_x = px - + //Visuals E.alpha = 255 E.mouse_opacity = MOUSE_OPACITY_ICON @@ -183,7 +203,7 @@ E.next_page = FALSE if(choices_icons[choice_id]) E.add_overlay(choices_icons[choice_id]) - + /datum/radial_menu/New() close_button = new close_button.parent = src @@ -200,7 +220,7 @@ /datum/radial_menu/proc/get_next_id() return "c_[choices.len]" -/datum/radial_menu/proc/set_choices(list/new_choices) +/datum/radial_menu/proc/set_choices(list/new_choices, use_tooltips) if(choices.len) Reset() for(var/E in new_choices) @@ -211,7 +231,7 @@ var/I = extract_image(new_choices[E]) if(I) choices_icons[id] = I - setup_menu() + setup_menu(use_tooltips) /datum/radial_menu/proc/extract_image(E) @@ -220,7 +240,7 @@ MA.layer = ABOVE_HUD_LAYER MA.appearance_flags |= RESET_TRANSFORM return MA - + /datum/radial_menu/proc/next_page() if(pages > 1) @@ -243,28 +263,49 @@ if(current_user) current_user.images -= menu_holder -/datum/radial_menu/proc/wait() +/datum/radial_menu/proc/wait(atom/user, atom/anchor, require_near = FALSE) while (current_user && !finished && !selected_choice) + if(require_near && !in_range(anchor, user)) + return + if(custom_check_callback && next_check < world.time) + if(!custom_check_callback.Invoke()) + return + else + next_check = world.time + check_delay stoplag(1) /datum/radial_menu/Destroy() Reset() hide() + QDEL_NULL(custom_check_callback) . = ..() + /* - Presents radial menu to user anchored to anchor (or user if the anchor is currently in users screen) + Presents radial menu to user anchored to anchor (or user if the anchor is currently in users screen) Choices should be a list where list keys are movables or text used for element names and return value and list values are movables/icons/images used for element icons */ -/proc/show_radial_menu(mob/user,atom/anchor,list/choices) +/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE) + if(!user || !anchor || !length(choices)) + return + if(!uniqueid) + uniqueid = "defmenu_[REF(user)]_[REF(anchor)]" + + if(GLOB.radial_menus[uniqueid]) + return + var/datum/radial_menu/menu = new - if(!user) - user = usr + GLOB.radial_menus[uniqueid] = menu + if(radius) + menu.radius = radius + if(istype(custom_check)) + menu.custom_check_callback = custom_check menu.anchor = anchor menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud - menu.set_choices(choices) + menu.set_choices(choices, tooltips) menu.show_to(user) - menu.wait() + menu.wait(user, anchor, require_near) var/answer = menu.selected_choice qdel(menu) + GLOB.radial_menus -= uniqueid return answer \ No newline at end of file diff --git a/code/_onclick/hud/radial_persistent.dm b/code/_onclick/hud/radial_persistent.dm new file mode 100644 index 0000000000..0b5e8dc356 --- /dev/null +++ b/code/_onclick/hud/radial_persistent.dm @@ -0,0 +1,76 @@ +/* + A derivative of radial menu which persists onscreen until closed and invokes a callback each time an element is clicked +*/ + +/obj/screen/radial/persistent/center + name = "Close Menu" + icon_state = "radial_center" + +/obj/screen/radial/persistent/center/Click(location, control, params) + if(usr.client == parent.current_user) + parent.element_chosen(null,usr) + +/obj/screen/radial/persistent/center/MouseEntered(location, control, params) + . = ..() + icon_state = "radial_center_focus" + +/obj/screen/radial/persistent/center/MouseExited(location, control, params) + . = ..() + icon_state = "radial_center" + + + +/datum/radial_menu/persistent + var/uniqueid + var/datum/callback/select_proc_callback + +/datum/radial_menu/persistent/New() + close_button = new /obj/screen/radial/persistent/center + close_button.parent = src + + +/datum/radial_menu/persistent/element_chosen(choice_id,mob/user) + select_proc_callback.Invoke(choices_values[choice_id]) + + +/datum/radial_menu/persistent/proc/change_choices(list/newchoices, tooltips) + if(!newchoices.len) + return + Reset() + set_choices(newchoices,tooltips) + +/datum/radial_menu/persistent/Destroy() + QDEL_NULL(select_proc_callback) + GLOB.radial_menus -= uniqueid + Reset() + hide() + . = ..() + +/* + Creates a persistent radial menu and shows it to the user, anchored to anchor (or user if the anchor is currently in users screen). + Choices should be a list where list keys are movables or text used for element names and return value + and list values are movables/icons/images used for element icons + Select_proc is the proc to be called each time an element on the menu is clicked, and should accept the chosen element as its final argument + Clicking the center button will return a choice of null +*/ +/proc/show_radial_menu_persistent(mob/user, atom/anchor, list/choices, datum/callback/select_proc, uniqueid, radius, tooltips = FALSE) + if(!user || !anchor || !length(choices) || !select_proc) + return + if(!uniqueid) + uniqueid = "defmenu_[REF(user)]_[REF(anchor)]" + + if(GLOB.radial_menus[uniqueid]) + return + + var/datum/radial_menu/persistent/menu = new + menu.uniqueid = uniqueid + GLOB.radial_menus[uniqueid] = menu + if(radius) + menu.radius = radius + menu.select_proc_callback = select_proc + menu.anchor = anchor + menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud + menu.set_choices(choices, tooltips) + menu.show_to(user) + return menu + diff --git a/code/datums/action.dm b/code/datums/action.dm index b7089279cb..f64a549b29 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -195,11 +195,16 @@ /datum/action/item_action/toggle_firemode name = "Toggle Firemode" -/datum/action/item_action/rcl +/datum/action/item_action/rcl_col name = "Change Cable Color" icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "rcl_rainbow" +/datum/action/item_action/rcl_gui + name = "Toggle Fast Wiring Gui" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "rcl_gui" + /datum/action/item_action/startchainsaw name = "Pull The Starting Cord" diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 7881c277ff..3eafb0fc85 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -161,13 +161,8 @@ RLD user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..") return (BRUTELOSS) -/obj/item/construction/rcd/verb/toggle_window_type() - set name = "Toggle Window Type" - set category = "Object" - set src in usr // What does this do? - +/obj/item/construction/rcd/verb/toggle_window_type(mob/user) var/window_type_name - if (window_type == /obj/structure/window/fulltile) window_type = /obj/structure/window/reinforced/fulltile window_type_name = "reinforced glass" @@ -175,17 +170,14 @@ RLD window_type = /obj/structure/window/fulltile window_type_name = "glass" - to_chat(usr, "You change \the [src]'s window mode to [window_type_name].") + to_chat(user, "You change \the [src]'s window mode to [window_type_name].") -/obj/item/construction/rcd/verb/change_airlock_access() - set name = "Change Airlock Access" - set category = "Object" - set src in usr +/obj/item/construction/rcd/verb/change_airlock_access(mob/user) - if (!ishuman(usr) && !usr.has_unlimited_silicon_privilege) - return ..(usr) + if (!ishuman(user) && !user.has_unlimited_silicon_privilege) + return - var/t1 = text("") + var/t1 = "" if(use_one_access) @@ -216,24 +208,23 @@ RLD t1 += "

Close

\n" - var/datum/browser/popup = new(usr, "airlock_electronics", "Access Control", 900, 500) + var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500) popup.set_content(t1) - popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.open() - onclose(usr, "airlock") + onclose(user, "rcd_access") /obj/item/construction/rcd/Topic(href, href_list) ..() if (usr.stat || usr.restrained()) return if (href_list["close"]) - usr << browse(null, "window=airlock") + usr << browse(null, "window=rcd_access") return if (href_list["access"]) toggle_access(href_list["access"]) - - change_airlock_access() + change_airlock_access(usr) /obj/item/construction/rcd/proc/toggle_access(acc) if (acc == "all") @@ -253,16 +244,77 @@ RLD if (!conf_access.len) conf_access = null -/obj/item/construction/rcd/verb/change_airlock_setting() - set name = "Change Airlock Setting" - set category = "Object" - set src in usr +/obj/item/construction/rcd/proc/get_airlock_image(airlock_type) + var/obj/machinery/door/airlock/proto = airlock_type + var/ic = initial(proto.icon) + var/mutable_appearance/MA = mutable_appearance(ic, "closed") + if(!initial(proto.glass)) + MA.overlays += "fill_closed" + //Not scaling these down to button size because they look horrible then, instead just bumping up radius. + return MA - var/airlockcat = input(usr, "Select whether the airlock is solid or glass.") in list("Solid", "Glass") +/obj/item/construction/rcd/proc/check_menu(mob/living/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + +/obj/item/construction/rcd/proc/change_airlock_setting(mob/user) + if(!user) + return + + var/list/solid_or_glass_choices = list( + "Solid" = get_airlock_image(/obj/machinery/door/airlock), + "Glass" = get_airlock_image(/obj/machinery/door/airlock/glass) + ) + + var/list/solid_choices = list( + "Standard" = get_airlock_image(/obj/machinery/door/airlock), + "Public" = get_airlock_image(/obj/machinery/door/airlock/public), + "Engineering" = get_airlock_image(/obj/machinery/door/airlock/engineering), + "Atmospherics" = get_airlock_image(/obj/machinery/door/airlock/atmos), + "Security" = get_airlock_image(/obj/machinery/door/airlock/security), + "Command" = get_airlock_image(/obj/machinery/door/airlock/command), + "Medical" = get_airlock_image(/obj/machinery/door/airlock/medical), + "Research" = get_airlock_image(/obj/machinery/door/airlock/research), + "Freezer" = get_airlock_image(/obj/machinery/door/airlock/freezer), + "Science" = get_airlock_image(/obj/machinery/door/airlock/science), + "Virology" = get_airlock_image(/obj/machinery/door/airlock/virology), + "Mining" = get_airlock_image(/obj/machinery/door/airlock/mining), + "Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance), + "External" = get_airlock_image(/obj/machinery/door/airlock/external), + "External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external), + "Airtight Hatch" = get_airlock_image(/obj/machinery/door/airlock/hatch), + "Maintenance Hatch" = get_airlock_image(/obj/machinery/door/airlock/maintenance_hatch) + ) + + var/list/glass_choices = list( + "Standard" = get_airlock_image(/obj/machinery/door/airlock/glass), + "Public" = get_airlock_image(/obj/machinery/door/airlock/public/glass), + "Engineering" = get_airlock_image(/obj/machinery/door/airlock/engineering/glass), + "Atmospherics" = get_airlock_image(/obj/machinery/door/airlock/atmos/glass), + "Security" = get_airlock_image(/obj/machinery/door/airlock/security/glass), + "Command" = get_airlock_image(/obj/machinery/door/airlock/command/glass), + "Medical" = get_airlock_image(/obj/machinery/door/airlock/medical/glass), + "Research" = get_airlock_image(/obj/machinery/door/airlock/research/glass), + "Science" = get_airlock_image(/obj/machinery/door/airlock/science/glass), + "Virology" = get_airlock_image(/obj/machinery/door/airlock/virology/glass), + "Mining" = get_airlock_image(/obj/machinery/door/airlock/mining/glass), + "Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/glass), + "External" = get_airlock_image(/obj/machinery/door/airlock/external/glass), + "External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external/glass) + ) + + var/airlockcat = show_radial_menu(user, src , solid_or_glass_choices, custom_check = CALLBACK(src,.proc/check_menu,user)) + if(!check_menu(user)) + return switch(airlockcat) if("Solid") if(advanced_airlock_setting == 1) - var/airlockpaint = input(usr, "Select the type of the airlock.") in list("Standard", "Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Freezer", "Science", "Virology", "Mining", "Maintenance", "External", "External Maintenance", "Airtight Hatch", "Maintenance Hatch") + var/airlockpaint = show_radial_menu(user, src , solid_choices, radius = 42, custom_check = CALLBACK(src,.proc/check_menu,user)) + if(!check_menu(user)) + return switch(airlockpaint) if("Standard") airlock_type = /obj/machinery/door/airlock @@ -305,7 +357,9 @@ RLD if("Glass") if(advanced_airlock_setting == 1) - var/airlockpaint = input(usr, "Select the type of the airlock.") in list("Standard", "Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Science", "Virology", "Mining", "Maintenance", "External", "External Maintenance") + var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src,.proc/check_menu,user)) + if(!check_menu(user)) + return switch(airlockpaint) if("Standard") airlock_type = /obj/machinery/door/airlock/glass @@ -356,8 +410,8 @@ RLD playsound(src.loc, 'sound/machines/click.ogg', 50, 1) return TRUE -/obj/item/construction/rcd/New() - ..() +/obj/item/construction/rcd/Initialize() + . = ..() GLOB.rcd_list += src /obj/item/construction/rcd/Destroy() @@ -366,19 +420,46 @@ RLD /obj/item/construction/rcd/attack_self(mob/user) ..() - switch(mode) - if(1) - mode = 2 - to_chat(user, "You change RCD's mode to 'Airlock'.") - if(2) - mode = 3 - to_chat(user, "You change RCD's mode to 'Deconstruct'.") - if(3) - mode = 4 - to_chat(user, "You change RCD's mode to 'Grilles & Windows'.") - if(4) - mode = 1 - to_chat(user, "You change RCD's mode to 'Floor & Walls'.") + var/list/choices = list( + "Airlock" = image(icon = 'icons/obj/interface.dmi', icon_state = "airlock"), + "Deconstruct" = image(icon= 'icons/obj/interface.dmi', icon_state = "delete"), + "Grilles & Windows" = image(icon = 'icons/obj/interface.dmi', icon_state = "grillewindow"), + "Floors & Walls" = image(icon = 'icons/obj/interface.dmi', icon_state = "wallfloor") + ) + if(mode == RCD_AIRLOCK) + choices += list( + "Change Access" = image(icon = 'icons/obj/interface.dmi', icon_state = "access"), + "Change Airlock Type" = image(icon = 'icons/obj/interface.dmi', icon_state = "airlocktype") + ) + else if(mode == RCD_WINDOWGRILLE) + choices += list( + "Change Window Type" = image(icon = 'icons/obj/interface.dmi', icon_state = "windowtype") + ) + var/choice = show_radial_menu(user,src,choices, custom_check = CALLBACK(src,.proc/check_menu,user)) + if(!check_menu(user)) + return + switch(choice) + if("Floors & Walls") + mode = RCD_FLOORWALL + if("Airlock") + mode = RCD_AIRLOCK + if("Deconstruct") + mode = RCD_DECONSTRUCT + if("Grilles & Windows") + mode = RCD_WINDOWGRILLE + if("Change Access") + change_airlock_access(user) + return + if("Change Airlock Type") + change_airlock_setting(user) + return + if("Change Window Type") + toggle_window_type(user) + return + else + return + playsound(src, 'sound/effects/pop.ogg', 50, 0) + to_chat(user, "You change RCD's mode to '[choice]'.") /obj/item/construction/rcd/proc/target_check(atom/A, mob/user) // only returns true for stuff the device can actually work with if((isturf(A) && A.density && mode==RCD_DECONSTRUCT) || (isturf(A) && !A.density) || (istype(A, /obj/machinery/door/airlock) && mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/grille) || (istype(A, /obj/structure/window) && mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/girder)) diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index bc1b128c69..18be9e7c63 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -14,13 +14,14 @@ w_class = WEIGHT_CLASS_NORMAL var/max_amount = 90 var/active = FALSE - actions_types = list(/datum/action/item_action/rcl) + actions_types = list(/datum/action/item_action/rcl_col,/datum/action/item_action/rcl_gui) var/list/colors = list("red", "yellow", "green", "blue", "pink", "orange", "cyan", "white") var/current_color_index = 1 var/ghetto = FALSE lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' var/datum/component/mobhook + var/datum/radial_menu/persistent/wiring_gui_menu /obj/item/twohanded/rcl/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/stack/cable_coil)) @@ -85,6 +86,8 @@ /obj/item/twohanded/rcl/Destroy() QDEL_NULL(loaded) last = null + QDEL_NULL(mobhook) + QDEL_NULL(wiring_gui_menu) setActive(FALSE, null) // setactive(FALSE) removes mobhook return ..() @@ -115,20 +118,28 @@ if(loaded) QDEL_NULL(loaded) loaded = null + QDEL_NULL(wiring_gui_menu) unwield(user) - setActive(wielded, user) + active = wielded return TRUE return FALSE +/obj/item/twohanded/rcl/pickup(mob/user) + ..() + getMobhook(user) + + + /obj/item/twohanded/rcl/dropped(mob/wearer) ..() if(mobhook) - setActive(FALSE, mobhook.parent) + active = FALSE + QDEL_NULL(mobhook) last = null /obj/item/twohanded/rcl/attack_self(mob/user) ..() - setActive(wielded, user) + active = wielded if(!active) last = null else if(!last) @@ -137,17 +148,24 @@ last = C break -/obj/item/twohanded/rcl/proc/setActive(toggle, mob/user) - active = toggle - if (active && user) - if (mobhook && mobhook.parent != user) +obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook) + if(to_hook) + if(mobhook && mobhook.parent != to_hook) QDEL_NULL(mobhook) if (!mobhook) - mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/trigger))) + mobhook = to_hook.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/trigger))) else QDEL_NULL(mobhook) /obj/item/twohanded/rcl/proc/trigger(mob/user) + if(active) + layCable(user) + if(wiring_gui_menu) //update the wire options as you move + wiringGuiUpdate(user) + + +//previous contents of trigger(), lays cable each time the player moves +/obj/item/twohanded/rcl/proc/layCable(mob/user) if(!isturf(user.loc)) return if(is_empty(user, 0)) @@ -156,7 +174,7 @@ if(prob(2) && ghetto) //Give ghetto RCLs a 2% chance to jam, requiring it to be reactviated manually. to_chat(user, "[src]'s wires jam!") - setActive(FALSE, user) + active = FALSE return else if(last) @@ -179,6 +197,91 @@ is_empty(user) //If we've run out, display message update_icon() +//searches the current tile for a stub cable of the same colour +/obj/item/twohanded/rcl/proc/findLinkingCable(mob/user) + var/turf/T + if(!isturf(user.loc)) + return + + T = get_turf(user) + if(T.intact || !T.can_have_cabling()) + return + + for(var/obj/structure/cable/C in T) + if(!C) + continue + if(C.cable_color != GLOB.cable_colors[colors[current_color_index]]) + continue + if(C.d1 == 0) + return C + break + return + + +/obj/item/twohanded/rcl/proc/wiringGuiGenerateChoices(mob/user) + var/fromdir = 0 + var/obj/structure/cable/linkingCable = findLinkingCable(user) + if(linkingCable) + fromdir = linkingCable.d2 + + var/list/wiredirs = list("1","5","4","6","2","10","8","9") + for(var/icondir in wiredirs) + var/dirnum = text2num(icondir) + var/cablesuffix = "[min(fromdir,dirnum)]-[max(fromdir,dirnum)]" + if(fromdir == dirnum) //cables can't loop back on themselves + cablesuffix = "invalid" + var/image/img = image(icon = 'icons/mob/radial.dmi', icon_state = "cable_[cablesuffix]") + img.color = GLOB.cable_colors[colors[current_color_index]] + wiredirs[icondir] = img + return wiredirs + +/obj/item/twohanded/rcl/proc/showWiringGui(mob/user) + var/list/choices = wiringGuiGenerateChoices(user) + + wiring_gui_menu = show_radial_menu_persistent(user, src , choices, select_proc = CALLBACK(src, .proc/wiringGuiReact, user), radius = 42) + +/obj/item/twohanded/rcl/proc/wiringGuiUpdate(mob/user) + if(!wiring_gui_menu) + return + + wiring_gui_menu.entry_animation = FALSE //stop the open anim from playing each time we update + var/list/choices = wiringGuiGenerateChoices(user) + + wiring_gui_menu.change_choices(choices,FALSE) + + +//Callback used to respond to interactions with the wiring menu +/obj/item/twohanded/rcl/proc/wiringGuiReact(mob/living/user,choice) + if(!choice) //close on a null choice (the center button) + QDEL_NULL(wiring_gui_menu) + return + + choice = text2num(choice) + + if(!isturf(user.loc)) + return + if(is_empty(user, 0)) + to_chat(user, "\The [src] is empty!") + return + + var/turf/T = get_turf(user) + if(T.intact || !T.can_have_cabling()) + return + + loaded.item_color = colors[current_color_index] + + var/obj/structure/cable/linkingCable = findLinkingCable(user) + if(linkingCable) + if(choice != linkingCable.d2) + loaded.cable_join(linkingCable, user, FALSE, choice) + last = null + else + last = loaded.place_turf(get_turf(src), user, choice) + + is_empty(user) //If we've run out, display message + + wiringGuiUpdate(user) + /obj/item/twohanded/rcl/pre_loaded/Initialize() //Comes preloaded with cable, for testing stuff . = ..() @@ -192,12 +295,21 @@ update_icon() /obj/item/twohanded/rcl/ui_action_click(mob/user, action) - if(istype(action, /datum/action/item_action/rcl)) + if(istype(action, /datum/action/item_action/rcl_col)) current_color_index++; if (current_color_index > colors.len) current_color_index = 1 var/cwname = colors[current_color_index] to_chat(user, "Color changed to [cwname]!") + if(loaded) + loaded.item_color= colors[current_color_index] + if(wiring_gui_menu) + wiringGuiUpdate(user) + else if(istype(action, /datum/action/item_action/rcl_gui)) + if(wiring_gui_menu) //The menu is already open, close it + QDEL_NULL(wiring_gui_menu) + else //open the menu + showWiringGui(user) /obj/item/twohanded/rcl/ghetto actions_types = list() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index afe275f9b9..032c5b6511 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -112,6 +112,8 @@ LC.handlecable(C, user) return C.loaded.place_turf(src, user) + if(C.wiring_gui_menu) + C.wiringGuiUpdate(user) C.is_empty(user) /turf/attackby(obj/item/C, mob/user, params) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 7b3b2ba7bd..80e05f698f 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -639,7 +639,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai // called when cable_coil is click on an installed obj/cable // or click on a turf that already contains a "node" cable -/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user, var/showerror = TRUE) +/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user, showerror = TRUE, forceddir)) var/turf/U = user.loc if(!isturf(U)) return @@ -654,14 +654,14 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai return - if(U == T) //if clicked on the turf we're standing on, try to put a cable in the direction we're facing + if(U == T && !forceddir) //if clicked on the turf we're standing on and a direction wasn't supplied, try to put a cable in the direction we're facing place_turf(T,user) return var/dirn = get_dir(C, user) - // one end of the clicked cable is pointing towards us - if(C.d1 == dirn || C.d2 == dirn) + // one end of the clicked cable is pointing towards us and no direction was supplied + if((C.d1 == dirn || C.d2 == dirn) && !forceddir) if(!U.can_have_cabling()) //checking if it's a plating or catwalk if (showerror) to_chat(user, "You can only lay cables on catwalks and plating!") @@ -706,7 +706,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai return - // exisiting cable doesn't point at our position, so see if it's a stub + // exisiting cable doesn't point at our position or we have a supplied direction, so see if it's a stub else if(C.d1 == 0) // if so, make it a full cable pointing from it's old direction to our dirn var/nd1 = C.d2 // these will be the new directions diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi index ca380a5376e57388c4bcce2153b8b9be6b432b35..39e2ea05841ff315803975587345cbc9d77ed745 100644 GIT binary patch literal 9131 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

MbcemB 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 literal 8842 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 M07*qoM6N<$f^em4Qvd(} diff --git a/icons/mob/radial.dmi b/icons/mob/radial.dmi index ba3179a42141d35eb72c47da7b30837da5ce09b3..cfdd0e549a04e9de6df56b619c29afb9220831d4 100644 GIT binary patch literal 15818 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 Date: Fri, 7 Jun 2019 04:05:27 +0200 Subject: [PATCH 2/2] Makes it compile. --- code/game/objects/items/RCD.dm | 32 +++++++++++++++++++++----------- code/game/objects/items/RCL.dm | 1 - code/modules/power/cable.dm | 2 +- tgstation.dme | 1 + 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 3eafb0fc85..38d64be99c 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -161,7 +161,17 @@ RLD user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..") return (BRUTELOSS) -/obj/item/construction/rcd/verb/toggle_window_type(mob/user) +/obj/item/construction/rcd/verb/toggle_window_type_verb() + set name = "RCD : Toggle Window Type" + set category = "Object" + set src in view(1) + + if(!usr.canUseTopic(src, BE_CLOSE)) + return + + toggle_window_type(usr) + +/obj/item/construction/rcd/proc/toggle_window_type(mob/user) var/window_type_name if (window_type == /obj/structure/window/fulltile) window_type = /obj/structure/window/reinforced/fulltile @@ -306,13 +316,13 @@ RLD "External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external/glass) ) - var/airlockcat = show_radial_menu(user, src , solid_or_glass_choices, custom_check = CALLBACK(src,.proc/check_menu,user)) + var/airlockcat = show_radial_menu(user, src, solid_or_glass_choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE) if(!check_menu(user)) return switch(airlockcat) if("Solid") if(advanced_airlock_setting == 1) - var/airlockpaint = show_radial_menu(user, src , solid_choices, radius = 42, custom_check = CALLBACK(src,.proc/check_menu,user)) + var/airlockpaint = show_radial_menu(user, src, solid_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE) if(!check_menu(user)) return switch(airlockpaint) @@ -357,7 +367,7 @@ RLD if("Glass") if(advanced_airlock_setting == 1) - var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src,.proc/check_menu,user)) + var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE) if(!check_menu(user)) return switch(airlockpaint) @@ -421,19 +431,19 @@ RLD /obj/item/construction/rcd/attack_self(mob/user) ..() var/list/choices = list( - "Airlock" = image(icon = 'icons/obj/interface.dmi', icon_state = "airlock"), - "Deconstruct" = image(icon= 'icons/obj/interface.dmi', icon_state = "delete"), - "Grilles & Windows" = image(icon = 'icons/obj/interface.dmi', icon_state = "grillewindow"), - "Floors & Walls" = image(icon = 'icons/obj/interface.dmi', icon_state = "wallfloor") + "Airlock" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlock"), + "Deconstruct" = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"), + "Grilles & Windows" = image(icon = 'icons/mob/radial.dmi', icon_state = "grillewindow"), + "Floors & Walls" = image(icon = 'icons/mob/radial.dmi', icon_state = "wallfloor") ) if(mode == RCD_AIRLOCK) choices += list( - "Change Access" = image(icon = 'icons/obj/interface.dmi', icon_state = "access"), - "Change Airlock Type" = image(icon = 'icons/obj/interface.dmi', icon_state = "airlocktype") + "Change Access" = image(icon = 'icons/mob/radial.dmi', icon_state = "access"), + "Change Airlock Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlocktype") ) else if(mode == RCD_WINDOWGRILLE) choices += list( - "Change Window Type" = image(icon = 'icons/obj/interface.dmi', icon_state = "windowtype") + "Change Window Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "windowtype") ) var/choice = show_radial_menu(user,src,choices, custom_check = CALLBACK(src,.proc/check_menu,user)) if(!check_menu(user)) diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 18be9e7c63..cea8165e02 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -88,7 +88,6 @@ last = null QDEL_NULL(mobhook) QDEL_NULL(wiring_gui_menu) - setActive(FALSE, null) // setactive(FALSE) removes mobhook return ..() /obj/item/twohanded/rcl/update_icon() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 80e05f698f..a3dc6e7394 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -639,7 +639,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai // called when cable_coil is click on an installed obj/cable // or click on a turf that already contains a "node" cable -/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user, showerror = TRUE, forceddir)) +/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user, showerror = TRUE, forceddir) var/turf/U = user.loc if(!isturf(U)) return diff --git a/tgstation.dme b/tgstation.dme index 739176a457..bc38804f79 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -199,6 +199,7 @@ #include "code\_onclick\hud\picture_in_picture.dm" #include "code\_onclick\hud\plane_master.dm" #include "code\_onclick\hud\radial.dm" +#include "code\_onclick\hud\radial_persistent.dm" #include "code\_onclick\hud\revenanthud.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm"