From d2e8531ee578ef8ec2666d0474f668629cfc8410 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Tue, 8 Oct 2013 20:10:12 +0100 Subject: [PATCH] Made cyborg middle-clicks cycle through the list of selected modules, and added some new helper procs for selected modules. New procs: * module_selected(module) - Checks whether the module slot specified by "module" is currently selected. * module_active(module) - Checks whether there is a module active in the slot specified by "module". * get_selected_module() - Returns the slot number of the currently selected module. Returns 0 if no modules are selected. * select_module(module) - Selects the module slot specified by "module" * deselect_module(module) - Deselects the module slot specified by "module" * toggle_module(module) - Toggles the selection of the module slot specified by "module". * cycle_modules() - Cycles through the list of selected modules. Signed-off-by: Mloc-Argent --- code/_onclick/cyborg.dm | 8 +- code/_onclick/hud/screen_objects.dm | 33 +---- .../mob/living/silicon/robot/inventory.dm | 122 +++++++++++++++++- code/modules/mob/mob_movement.dm | 68 +--------- 4 files changed, 136 insertions(+), 95 deletions(-) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index a4877765634..640a09d045f 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -28,7 +28,7 @@ if(modifiers["ctrl"]) CtrlClickOn(A) return - + if(stat || lockcharge || weakened || stunned || paralysis) return @@ -94,6 +94,12 @@ W.afterattack(A, src, 0, params) return return + +//Middle click cycles through selected modules. +/mob/living/silicon/robot/MiddleClickOn(var/atom/A) + cycle_modules() + return + /* As with AI, these are not used in click code, because the code for robots is specific, not generic. diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 6f1b8481bad..1967b48f196 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -292,37 +292,16 @@ usr:uneq_active() if("module1") - if(usr:module_state_1) - if(usr:module_active != usr:module_state_1) - usr:inv1.icon_state = "inv1 +a" - usr:inv2.icon_state = "inv2" - usr:inv3.icon_state = "inv3" - usr:module_active = usr:module_state_1 - else - usr:inv1.icon_state = "inv1" - usr:module_active = null + if(istype(usr, /mob/living/silicon/robot)) + usr:toggle_module(1) if("module2") - if(usr:module_state_2) - if(usr:module_active != usr:module_state_2) - usr:inv1.icon_state = "inv1" - usr:inv2.icon_state = "inv2 +a" - usr:inv3.icon_state = "inv3" - usr:module_active = usr:module_state_2 - else - usr:inv2.icon_state = "inv2" - usr:module_active = null + if(istype(usr, /mob/living/silicon/robot)) + usr:toggle_module(2) if("module3") - if(usr:module_state_3) - if(usr:module_active != usr:module_state_3) - usr:inv1.icon_state = "inv1" - usr:inv2.icon_state = "inv2" - usr:inv3.icon_state = "inv3 +a" - usr:module_active = usr:module_state_3 - else - usr:inv3.icon_state = "inv3" - usr:module_active = null + if(istype(usr, /mob/living/silicon/robot)) + usr:toggle_module(3) else return 0 diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index e6557ff57ed..f3ae6c7e5de 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -53,4 +53,124 @@ else if(module_state_3 == O) return 1 else - return 0 \ No newline at end of file + return 0 + +//Helper procs for cyborg modules on the UI. +//These are hackish but they help clean up code elsewhere. + +//module_selected(module) - Checks whether the module slot specified by "module" is currently selected. +/mob/living/silicon/robot/proc/module_selected(var/module) //Module is 1-3 + return module == get_selected_module() + +//module_active(module) - Checks whether there is a module active in the slot specified by "module". +/mob/living/silicon/robot/proc/module_active(var/module) //Module is 1-3 + if(module < 1 || module > 3) return 0 + + switch(module) + if(1) + if(module_state_1) + return 1 + if(2) + if(module_state_2) + return 1 + if(3) + if(module_state_3) + return 1 + return 0 + +//get_selected_module() - Returns the slot number of the currently selected module. Returns 0 if no modules are selected. +/mob/living/silicon/robot/proc/get_selected_module() + if(module_state_1 && module_active == module_state_1) + return 1 + else if(module_state_2 && module_active == module_state_2) + return 2 + else if(module_state_3 && module_active == module_state_3) + return 3 + + return 0 + +//select_module(module) - Selects the module slot specified by "module" +/mob/living/silicon/robot/proc/select_module(var/module) //Module is 1-3 + if(module < 1 || module > 3) return + + if(!module_active(module)) return + + switch(module) + if(1) + if(module_active != module_state_1) + inv1.icon_state = "inv1 +a" + inv2.icon_state = "inv2" + inv3.icon_state = "inv3" + module_active = module_state_1 + return + if(2) + if(module_active != module_state_2) + inv1.icon_state = "inv1" + inv2.icon_state = "inv2 +a" + inv3.icon_state = "inv3" + module_active = module_state_2 + return + if(3) + if(module_active != module_state_3) + inv1.icon_state = "inv1" + inv2.icon_state = "inv2" + inv3.icon_state = "inv3 +a" + module_active = module_state_3 + return + return + +//deselect_module(module) - Deselects the module slot specified by "module" +/mob/living/silicon/robot/proc/deselect_module(var/module) //Module is 1-3 + if(module < 1 || module > 3) return + + switch(module) + if(1) + if(module_active == module_state_1) + inv1.icon_state = "inv1" + module_active = null + return + if(2) + if(module_active == module_state_2) + inv2.icon_state = "inv2" + module_active = null + return + if(3) + if(module_active == module_state_3) + inv3.icon_state = "inv3" + module_active = null + return + return + +//toggle_module(module) - Toggles the selection of the module slot specified by "module". +/mob/living/silicon/robot/proc/toggle_module(var/module) //Module is 1-3 + if(module < 1 || module > 3) return + + if(module_selected(module)) + deselect_module(module) + else + if(module_active(module)) + select_module(module) + else + deselect_module(get_selected_module()) //If we can't do select anything, at least deselect the current module. + return + +//cycle_modules() - Cycles through the list of selected modules. +/mob/living/silicon/robot/proc/cycle_modules() + var/slot_start = get_selected_module() + if(slot_start) deselect_module(slot_start) //Only deselect if we have a selected slot. + + var/slot_num + if(slot_start == 0) + slot_num = 1 + slot_start = 2 + else + slot_num = slot_start + 1 + + while(slot_start != slot_num) //If we wrap around without finding any free slots, just give up. + if(module_active(slot_num)) + select_module(slot_num) + return + slot_num++ + if(slot_num > 3) slot_num = 1 //Wrap around. + + return diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index b5b037519bb..eeef9836d1f 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -54,73 +54,9 @@ set hidden = 1 if(istype(mob, /mob/living/carbon)) mob:swap_hand() - if(istype(mob,/mob/living/silicon/robot))//Oh nested logic loops, is there anything you can't do? -Sieve + if(istype(mob,/mob/living/silicon/robot)) var/mob/living/silicon/robot/R = mob - if(!R.module_active) - if(!R.module_state_1) - if(!R.module_state_2) - if(!R.module_state_3) - return - else - R:inv1.icon_state = "inv1" - R:inv2.icon_state = "inv2" - R:inv3.icon_state = "inv3 +a" - R:module_active = R:module_state_3 - else - R:inv1.icon_state = "inv1" - R:inv2.icon_state = "inv2 +a" - R:inv3.icon_state = "inv3" - R:module_active = R:module_state_2 - else - R:inv1.icon_state = "inv1 +a" - R:inv2.icon_state = "inv2" - R:inv3.icon_state = "inv3" - R:module_active = R:module_state_1 - else - if(R.module_active == R.module_state_1) - if(!R.module_state_2) - if(!R.module_state_3) - return - else - R:inv1.icon_state = "inv1" - R:inv2.icon_state = "inv2" - R:inv3.icon_state = "inv3 +a" - R:module_active = R:module_state_3 - else - R:inv1.icon_state = "inv1" - R:inv2.icon_state = "inv2 +a" - R:inv3.icon_state = "inv3" - R:module_active = R:module_state_2 - else if(R.module_active == R.module_state_2) - if(!R.module_state_3) - if(!R.module_state_1) - return - else - R:inv1.icon_state = "inv1 +a" - R:inv2.icon_state = "inv2" - R:inv3.icon_state = "inv3" - R:module_active = R:module_state_1 - else - R:inv1.icon_state = "inv1" - R:inv2.icon_state = "inv2" - R:inv3.icon_state = "inv3 +a" - R:module_active = R:module_state_3 - else if(R.module_active == R.module_state_3) - if(!R.module_state_1) - if(!R.module_state_2) - return - else - R:inv1.icon_state = "inv1" - R:inv2.icon_state = "inv2 +a" - R:inv3.icon_state = "inv3" - R:module_active = R:module_state_2 - else - R:inv1.icon_state = "inv1 +a" - R:inv2.icon_state = "inv2" - R:inv3.icon_state = "inv3" - R:module_active = R:module_state_1 - else - return + R.cycle_modules() return