diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm new file mode 100644 index 00000000000..f4763a74ed8 --- /dev/null +++ b/code/controllers/subsystem/input.dm @@ -0,0 +1,12 @@ +SUBSYSTEM_DEF(input) + name = "Input" + wait = 1 //SS_TICKER means this runs every tick + flags = SS_TICKER | SS_NO_INIT | SS_KEEP_TIMING + priority = 151 + runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY + +/datum/controller/subsystem/input/fire() + var/list/clients = GLOB.clients // Let's sing the list cache song + for(var/i in 1 to clients.len) + var/client/C = clients[i] + C.keyLoop() \ No newline at end of file diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 4c08b1000de..6a3ad57878e 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -17,6 +17,7 @@ /datum/proc/Destroy(force=FALSE, ...) tag = null weak_reference = null //ensure prompt GCing of weakref. + var/list/timers = active_timers active_timers = null for(var/thing in timers) @@ -24,6 +25,7 @@ if (timer.spent) continue qdel(timer) + var/list/dc = datum_components if(dc) var/all_components = dc[/datum/component] @@ -35,4 +37,11 @@ var/datum/component/C = all_components qdel(C, FALSE, TRUE) dc.Cut() + + var/list/focusers = src.focusers + if(focusers) + for(var/i in 1 to focusers.len) + var/mob/M = focusers[i] + M.set_focus(M) + return QDEL_HINT_QUEUE diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index e8d0bb45e06..9e0c9652715 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -105,7 +105,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/Move() if(z != z_original || loc == dest) qdel(src) - return + return FALSE . = ..() //process movement... diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 30ae436289e..0b3a51466d3 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -96,7 +96,7 @@ /obj/machinery/door/Move() var/turf/T = loc - ..() + . = ..() move_update_air(T) /obj/machinery/door/CanPass(atom/movable/mover, turf/target) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 014044fd06a..900413a2b5d 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -22,7 +22,7 @@ /obj/structure/emergency_shield/Move() var/turf/T = loc - ..() + . = ..() move_update_air(T) /obj/structure/emergency_shield/emp_act(severity) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 3459bfc9549..a2900492496 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -236,7 +236,7 @@ /obj/structure/foamedmetal/Move() var/turf/T = loc - ..() + . = ..() move_update_air(T) /obj/structure/foamedmetal/attack_paw(mob/user) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 6803d6bb7b1..94605906445 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -21,7 +21,7 @@ cut_overlays() /obj/item/target/Move() - ..() + . = ..() if(pinnedLoc) pinnedLoc.loc = loc diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index ae79c7e86d4..b053b987ca9 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -70,7 +70,7 @@ /obj/structure/alien/resin/Move() var/turf/T = loc - ..() + . = ..() move_update_air(T) /obj/structure/alien/resin/wall diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 39fbbe33356..c748115c73f 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -30,7 +30,7 @@ //Stick to the easel like glue /obj/structure/easel/Move() var/turf/T = get_turf(src) - ..() + . = ..() if(painting && painting.loc == T) //Only move if it's near us. painting.loc = get_turf(src) else diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index c124540d7d0..259c72647d1 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -37,7 +37,7 @@ /obj/structure/mineral_door/Move() var/turf/T = loc - ..() + . = ..() move_update_air(T) /obj/structure/mineral_door/CollidedWith(atom/movable/AM) diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index ece2d2cf443..f33283ae03f 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -16,7 +16,7 @@ pinned_target = null /obj/structure/target_stake/Move() - ..() + . = ..() if(pinned_target) pinned_target.loc = loc diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index b29df0aaf40..14aeefba9fe 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -47,7 +47,7 @@ /obj/structure/windoor_assembly/Move() var/turf/T = loc - ..() + . = ..() setDir(ini_dir) move_update_air(T) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 2b9494c535e..266be021d61 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -358,7 +358,7 @@ /obj/structure/window/Move() var/turf/T = loc - ..() + . = ..() setDir(ini_dir) move_update_air(T) diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index fc81ca3a02f..a9b5093e994 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -21,25 +21,26 @@ usr.loc = O usr.real_name = O.name usr.name = O.name - usr.client.eye = O + usr.reset_perspective(O) usr.control_object = O SSblackbox.record_feedback("tally", "admin_verb", 1, "Possess Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/proc/release(obj/O in world) +/proc/release() set name = "Release Obj" set category = "Object" //usr.loc = get_turf(usr) if(usr.control_object && usr.name_archive) //if you have a name archived and if you are actually relassing an object usr.real_name = usr.name_archive + usr.name_archive = "" usr.name = usr.real_name if(ishuman(usr)) var/mob/living/carbon/human/H = usr H.name = H.get_visible_name() -// usr.regenerate_icons() //So the name is updated properly - usr.loc = O.loc - usr.client.eye = usr + + usr.loc = get_turf(usr.control_object) + usr.reset_perspective() usr.control_object = null SSblackbox.record_feedback("tally", "admin_verb", 1, "Release Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index b929e83ada8..fd08e4cd5db 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -68,11 +68,10 @@ a_right.on_found(finder) /obj/item/device/assembly_holder/Move() - ..() + . = ..() if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() - return /obj/item/device/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess if(a_left && a_right) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 0b9d42e42e4..565465ec6d1 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -83,10 +83,9 @@ /obj/item/device/assembly/infra/Move() var/t = dir - ..() + . = ..() setDir(t) qdel(first) - return /obj/item/device/assembly/infra/holder_movement() if(!holder) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 1e79afa6ada..5407108c205 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -195,7 +195,6 @@ GLOBAL_LIST(external_rsc_urls) prefs.last_id = computer_id //these are gonna be used for banning if(world.byond_version >= 511 && byond_version >= 511 && prefs.clientfps) vars["fps"] = prefs.clientfps - sethotkeys(1) //set hoykeys from preferences (from_pref = 1) log_access("Login: [key_name(src)] from [address ? address : "localhost"]-[computer_id] || BYOND v[byond_version]") var/alert_mob_dupe_login = FALSE @@ -223,6 +222,8 @@ GLOBAL_LIST(external_rsc_urls) . = ..() //calls mob.Login() + set_macros() + chatOutput.start() // Starts the chat if(alert_mob_dupe_login) diff --git a/code/modules/client/verbs/sethotkeys.dm b/code/modules/client/verbs/sethotkeys.dm deleted file mode 100644 index ee147870117..00000000000 --- a/code/modules/client/verbs/sethotkeys.dm +++ /dev/null @@ -1,25 +0,0 @@ -/client/verb/sethotkeys(from_pref = 0 as num) - set name = "Set Hotkeys" - set hidden = TRUE - set waitfor = FALSE - set desc = "Used to set mob-specific hotkeys or load hoykey mode from preferences" - - var/hotkey_default = "default" - var/hotkey_macro = "hotkeys" - var/current_setting - - var/list/default_macros = list("default", "robot-default") - - if(from_pref) - current_setting = (prefs.hotkeys ? hotkey_macro : hotkey_default) - else - current_setting = winget(src, "mainwindow", "macro") - - if(mob) - hotkey_macro = mob.macro_hotkeys - hotkey_default = mob.macro_default - - if(current_setting in default_macros) - winset(src, null, "mainwindow.macro=[hotkey_default] input.focus=true input.background-color=#d3b5b5") - else - winset(src, null, "mainwindow.macro=[hotkey_macro] mapwindow.map.focus=true input.background-color=#e0e0e0") diff --git a/code/modules/keybindings/bindings_admin.dm b/code/modules/keybindings/bindings_admin.dm new file mode 100644 index 00000000000..d29f15f8568 --- /dev/null +++ b/code/modules/keybindings/bindings_admin.dm @@ -0,0 +1,15 @@ +/datum/admins/key_down(_key, client/user) + switch(_key) + if("F5") + user.admin_ghost() + return + if("F6") + player_panel_new() + return + if("F7") + user.cmd_admin_pm_panel() + return + if("F8") + user.invisimin() + return + ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm new file mode 100644 index 00000000000..7bc2ff98fe8 --- /dev/null +++ b/code/modules/keybindings/bindings_atom.dm @@ -0,0 +1,18 @@ +// You might be wondering why this isn't client level. If focus is null, we don't want you to move. +// Only way to do that is to tie the behavior into the focus's keyLoop(). + +/atom/movable/keyLoop(client/user) + if(!user.keys_held["Ctrl"]) + var/movement_dir = NONE + for(var/_key in user.keys_held) + movement_dir |= GLOB.movement_keys[_key] + if(user.next_move_dir_add) + movement_dir |= user.next_move_dir_add + if(user.next_move_dir_sub) + movement_dir &= ~user.next_move_dir_sub + // Sanity checks in case you hold left and right and up to make sure you only go up + if((movement_dir & NORTH) && (movement_dir & SOUTH)) + movement_dir &= ~(NORTH|SOUTH) + if((movement_dir & EAST) && (movement_dir & WEST)) + movement_dir &= ~(EAST|WEST) + user.Move(get_step(src, movement_dir), movement_dir) \ No newline at end of file diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm new file mode 100644 index 00000000000..d17f10e963f --- /dev/null +++ b/code/modules/keybindings/bindings_carbon.dm @@ -0,0 +1,18 @@ +/mob/living/carbon/key_down(_key, client/user) + switch(_key) + if("R", "Southwest") // Southwest is End + toggle_throw_mode() + return + if("1") + a_intent_change("help") + return + if("2") + a_intent_change("disarm") + return + if("3") + a_intent_change("grab") + return + if("4") + a_intent_change("harm") + return + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm new file mode 100644 index 00000000000..6bfaedf39d5 --- /dev/null +++ b/code/modules/keybindings/bindings_client.dm @@ -0,0 +1,50 @@ +// Clients aren't datums so we have to define these procs indpendently. +// These verbs are called for all key press and release events +/client/verb/keyDown(_key as text) + set instant = TRUE + set hidden = TRUE + + keys_held[_key] = world.time + var/movement = GLOB.movement_keys[_key] + if(!(next_move_dir_sub & movement)) + next_move_dir_add |= movement + + // Client-level keybindings are ones anyone should be able to do at any time + // Things like taking screenshots, hitting tab, and adminhelps. + + switch(_key) + if("F1") + if(keys_held["Ctrl"] && keys_held["Shift"]) // Is this command ever used? + winset(src, null, "command=.options") + else + adminhelp() + if("F2") // Screenshot. Hold shift to choose a name and location to save in + winset(src, null, "command=.screenshot [!keys_held["shift"] ? "auto" : ""]") + if("F12") // Toggles minimal HUD + mob.button_pressed_F12() + + if(holder) + holder.key_down(_key, src) + if(mob.focus) + mob.focus.key_down(_key, src) + +/client/verb/keyUp(_key as text) + set instant = TRUE + set hidden = TRUE + + keys_held -= _key + var/movement = GLOB.movement_keys[_key] + if(!(next_move_dir_add & movement)) + next_move_dir_sub |= movement + + if(holder) + holder.key_up(_key, src) + if(mob.focus) + mob.focus.key_up(_key, src) + +// Called every game tick +/client/keyLoop() + if(holder) + holder.keyLoop(src) + if(mob.focus) + mob.focus.keyLoop(src) \ No newline at end of file diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm new file mode 100644 index 00000000000..10d035305f0 --- /dev/null +++ b/code/modules/keybindings/bindings_human.dm @@ -0,0 +1,6 @@ +/mob/living/carbon/human/key_down(_key, client/user) + switch(_key) + if("E") + quick_equip() + return + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_living.dm b/code/modules/keybindings/bindings_living.dm new file mode 100644 index 00000000000..241bc15b608 --- /dev/null +++ b/code/modules/keybindings/bindings_living.dm @@ -0,0 +1,7 @@ +/mob/living/key_down(_key, client/user) + switch(_key) + if("B") + resist() + return + + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm new file mode 100644 index 00000000000..1d35694e5fc --- /dev/null +++ b/code/modules/keybindings/bindings_mob.dm @@ -0,0 +1,79 @@ +// Technically the client argument is unncessary here since that SHOULD be src.client but let's not assume things +// All it takes is one badmin setting their focus to someone else's client to mess things up +// Or we can have NPC's send actual keypresses and detect that by seeing no client + +/mob/key_down(_key, client/user) + switch(_key) + if("Delete", "H") + if(!pulling) + to_chat(src, "You are not pulling anything.") + else + stop_pulling() + return + if("Insert", "G") + a_intent_change(INTENT_HOTKEY_RIGHT) + return + if("F") + a_intent_change(INTENT_HOTKEY_LEFT) + return + if("X", "Northeast") // Northeast is Page-up + swap_hand() + return + if("Y", "Z", "Southeast") // Southeast is Page-down + mode() // attack_self(). No idea who came up with "mode()" + return + if("Q", "Northwest") // Northwest is Home + var/obj/item/I = get_active_held_item() + if(!I) + to_chat(src, "You have nothing to drop in your hand!") + else + dropItemToGround(I) + return + if("Alt") + toggle_move_intent() + return + //Bodypart selections + if("Numpad8") + user.body_toggle_head() + return + if("Numpad4") + user.body_r_arm() + return + if("Numpad5") + user.body_chest() + return + if("Numpad6") + user.body_l_arm() + return + if("Numpad1") + user.body_r_leg() + return + if("Numpad2") + user.body_groin() + return + if("Numpad3") + user.body_l_leg() + return + + if(client.keys_held["Ctrl"]) + switch(GLOB.movement_keys[_key]) + if(NORTH) + northface() + return + if(SOUTH) + southface() + return + if(WEST) + westface() + return + if(EAST) + eastface() + return + return ..() + +/mob/key_up(_key, client/user) + switch(_key) + if("Alt") + toggle_move_intent() + return + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_robot.dm b/code/modules/keybindings/bindings_robot.dm new file mode 100644 index 00000000000..2354f33c9e9 --- /dev/null +++ b/code/modules/keybindings/bindings_robot.dm @@ -0,0 +1,12 @@ +/mob/living/silicon/robot/key_down(_key, client/user) + switch(_key) + if("1", "2", "3") + toggle_module(text2num(_key)) + return + if("4") + a_intent_change(INTENT_HOTKEY_LEFT) + return + if("Q") + uneq_active() + return + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/focus.dm b/code/modules/keybindings/focus.dm new file mode 100644 index 00000000000..9d3e44f0594 --- /dev/null +++ b/code/modules/keybindings/focus.dm @@ -0,0 +1,20 @@ +/datum + var/list/focusers //Only initialized when needed. Contains a list of mobs focusing on this. + +/mob + var/datum/focus //What receives our keyboard inputs. src by default + +/mob/proc/set_focus(datum/new_focus) + if(focus == new_focus) + return + + if(new_focus) + if(!new_focus.focusers) //Set up the new focus + new_focus.focusers = list() + new_focus.focusers += src + + if(focus) + focus.focusers -= src //Tell the old focus we're done with it + + focus = new_focus + reset_perspective(focus) //Maybe this should be done manually? You figure it out, reader \ No newline at end of file diff --git a/code/modules/keybindings/readme.md b/code/modules/keybindings/readme.md new file mode 100644 index 00000000000..11708044361 --- /dev/null +++ b/code/modules/keybindings/readme.md @@ -0,0 +1,40 @@ +# In-code keypress handling system + +This whole system is heavily based off of forum_account's keyboard library. +Thanks to forum_account for saving the day, the library can be found [here](http://www.byond.com/developer/Forum_account/Keyboard)! + +.dmf macros have some very serious shortcomings. For example, they do not allow reusing parts +of one macro in another, so giving cyborgs their own shortcuts to swap active module couldn't +inherit the movement that all mobs should have anyways. The webclient only supports one macro, +so having more than one was problematic. Additionally each keybind has to call an actual +verb, which meant a lot of hidden verbs that just call one other proc. Also our existing +macro was really bad and tied unrelated behavior into `Northeast()`, `Southeast()`, `Northwest()`, +and `Southwest()`. + +The basic premise of this system is to not screw with .dmf macro setup at all and handle +pressing those keys in the code instead. We have every key call `client.keyDown()` +or `client.keyUp()` with the pressed key as an argument. Certain keys get processed +directly by the client because they should be doable at any time, then we call +`keyDown()` or `keyUp()` on the client's holder and the client's mob's focus. +By default `mob.focus` is the mob itself, but you can set it to any datum to give control of a +client's keypresses to another object. This would be a good way to handle a menu or driving +a mech. You can also set it to null to disregard input from a certain user. + +Movement is handled by having each client call `client.keyLoop()` every game tick. +As above, this calls holder and `focus.keyLoop()`. `atom/movable/keyLoop()` handles movement +Try to keep the calculations in this proc light. It runs every tick for every client after all! + +You can also tell which keys are being held down now. Each client a list of keys pressed called +`keys_held`. Each entry is a key as a text string associated with the world.time when it was +pressed. + +No client-set keybindings at this time, but it shouldn't be too hard if someone wants. + +Notes about certain keys +`Tab` has client-sided behavior but acts normally +`T`, `O`, and `M` move focus to the input when pressed. This fires the keyUp macro right away. +`\` needs to be escaped in the dmf so any usage is `\\` + +You cannot `TICK_CHECK` or check `world.tick_usage` inside of procs called by key down and up +events. They happen outside of a byond tick and have no meaning there. Key looping +works correctly since it's part of a subsystem, not direct input. \ No newline at end of file diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm new file mode 100644 index 00000000000..bd7490abaa5 --- /dev/null +++ b/code/modules/keybindings/setup.dm @@ -0,0 +1,62 @@ +/client + var/list/keys_held = list() // A list of any keys held currently + // These next two vars are to apply movement for keypresses and releases made while move delayed. + // Because discarding that input makes the game less responsive. + var/next_move_dir_add // On next move, add this dir to the move that would otherwise be done + var/next_move_dir_sub // On next move, subtract this dir from the move that would otherwise be done + +// Set a client's focus to an object and override these procs on that object to let it handle keypresses + +/datum/proc/key_down(key, client/user) // Called when a key is pressed down initially + return +/datum/proc/key_up(key, client/user) // Called when a key is released + return +/datum/proc/keyLoop(client/user) // Called once every frame + return + +// Keys used for movement +GLOBAL_LIST_INIT(movement_keys, list( + "W" = NORTH, "A" = WEST, "S" = SOUTH, "D" = EAST, // WASD + "North" = NORTH, "West" = WEST, "South" = SOUTH, "East" = EAST, // Arrow keys & Numpad + )) + +/* +A horrific battle against shitcode was fought here to find out some use details of winset +Aparently you need to wrap the entire proc + args in quotes if you intend on using args +But you don't need the quote wrappings to just call on a proc with no args +ex. winset(src, "default-Any", "command=keyDown \[\[*\]\]") fail: command = keyDown +ex. winset(src, "default-Any", "command=keyDown \"\[\[*\]\]\"") fail: same +ex. winset(src, "default-T", "command=say") works fine +ex. winset(src, "default-Any", "command=\"keyDown \[\[*\]\]\"") works fine +Thanks for the useful errors lummox ~ninjanomnom +*/ +GLOBAL_LIST_INIT(default_macros, list( + "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=#F0F0F0:input.focus=true input.background-color=#D3B5B5\\\"\"", + "O" = "ooc", + "T" = "say", + "M" = "me", + "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs + "Any" = "\"KeyDown \[\[*\]\]\"", + "Any+UP" = "\"KeyUp \[\[*\]\]\"", + )) + +/client/proc/set_macros() + set waitfor = FALSE + + winset(src, null, "reset=true") + winset(src, null, "mainwindow.macro=default") + var/list/default = params2list(winget(src, "default.*", "command")) + for(var/i in 1 to length(default)) + var/id = default[i] + winset(src, id, "parent=none") + + var/list/default_macros = GLOB.default_macros + for(var/i in 1 to length(default_macros)) + var/input = default_macros[i] + var/output = default_macros[input] + winset(src, "default-[input]", "parent=default;name=[input];command=[output]") + + if(prefs.hotkeys) + winset(src, null, "mapwindow.map.focus=true input.background-color=#e0e0e0") + else + winset(src, null, "input.focus=true input.background-color=#d3b5b5") \ No newline at end of file diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index c7c4ede9070..d9cdc03659a 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -16,6 +16,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) if(CONFIG_GET(string/cross_server_address)) verbs += /mob/dead/proc/server_hop + set_focus(src) return INITIALIZE_HINT_NORMAL /mob/dead/dust() //ghosts can't be vaporised. diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index e93fed311c0..2462242e257 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -11,7 +11,7 @@ ..() /mob/living/carbon/alien/humanoid/hunter/movement_delay() - . = -1 //hunters are sanic + . = -1 //hunters are sanic . += ..() //but they still need to slow down on stun diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index f573677faff..f9c023e89d0 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -5,8 +5,6 @@ icon_state = "robot" maxHealth = 100 health = 100 - macro_default = "robot-default" - macro_hotkeys = "robot-hotkeys" bubble_icon = "robot" designation = "Default" //used for displaying the prefix & getting the current module of cyborg has_limbs = 1 @@ -247,17 +245,6 @@ return //won't work if dead robot_alerts() -//for borg hotkeys, here module refers to borg inv slot, not core module -/mob/living/silicon/robot/verb/cmd_toggle_module(module as num) - set name = "Toggle Module" - set hidden = 1 - toggle_module(module) - -/mob/living/silicon/robot/verb/cmd_unequip_module() - set name = "Unequip Module" - set hidden = 1 - uneq_active() - /mob/living/silicon/robot/proc/robot_alerts() var/dat = "" for (var/cat in alarms) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 7e1a75c4494..39209f6ca60 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -64,7 +64,7 @@ src.visible_message("[src] gets an evil-looking gleam in [p_their()] eye.") /mob/living/simple_animal/hostile/retaliate/goat/Move() - ..() + . = ..() if(!stat) eat_plants() diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index f9868771ac0..a1cb61c115c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -283,9 +283,8 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0) if(mecha && loc == mecha) - mecha.relaymove(src, Dir) - return - ..() + return mecha.relaymove(src, Dir) + return ..() /mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index bed14bdff42..71d834e0e06 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -33,8 +33,6 @@ sync_mind() - client.sethotkeys() //set mob specific hotkeys - update_client_colour() if(client) client.click_intercept = null diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 13d5fb057ad..b5dd3f1934c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -30,6 +30,7 @@ GLOB.dead_mob_list += src else GLOB.alive_mob_list += src + set_focus(src) prepare_huds() for(var/v in GLOB.active_alternate_appearances) if(!v) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 1f2abf4eb50..ba740254137 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -21,9 +21,6 @@ */ var/zone_selected = null - var/macro_default = "default" - var/macro_hotkeys = "hotkeys" - var/damageoverlaytemp = 0 var/computer_id = null var/lastattacker = null diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 9885d1c4d67..b3881a11a18 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -11,94 +11,12 @@ return (!mover.density || !density || lying) -//The byond version of these verbs wait for the next tick before acting. -// instant verbs however can run mid tick or even during the time between ticks. -/client/verb/moveup() - set name = ".moveup" - set instant = 1 - Move(get_step(mob, NORTH), NORTH) - -/client/verb/movedown() - set name = ".movedown" - set instant = 1 - Move(get_step(mob, SOUTH), SOUTH) - -/client/verb/moveright() - set name = ".moveright" - set instant = 1 - Move(get_step(mob, EAST), EAST) - -/client/verb/moveleft() - set name = ".moveleft" - set instant = 1 - Move(get_step(mob, WEST), WEST) - -/client/Northeast() - swap_hand() - return - - -/client/Southeast() - attack_self() - return - - -/client/Southwest() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.toggle_throw_mode() - else - to_chat(usr, "This mob type cannot throw items.") - return - - -/client/Northwest() - var/obj/item/I = usr.get_active_held_item() - if(!I) - to_chat(usr, "You have nothing to drop in your hand!") - return - usr.dropItemToGround(I) - -//This gets called when you press the delete button. -/client/verb/delete_key_pressed() - set hidden = 1 - - if(!isliving(usr)) - return - if(!usr.pulling) - to_chat(usr, "You are not pulling anything.") - return - usr.stop_pulling() - -/client/verb/swap_hand() - set category = "IC" - set name = "Swap hands" - - if(mob) - mob.swap_hand() - -/client/verb/attack_self() - set hidden = 1 - if(mob) - mob.mode() - return - - /client/verb/drop_item() set hidden = 1 if(!iscyborg(mob) && mob.stat == CONSCIOUS) mob.dropItemToGround(mob.get_active_held_item()) return - -/client/Center() - if(isobj(mob.loc)) - var/obj/O = mob.loc - if(mob.canmove) - return O.relaymove(mob, 0) - return - - /client/proc/Move_object(direct) if(mob && mob.control_object) if(mob.control_object.density) @@ -114,19 +32,23 @@ #define MOVEMENT_DELAY_BUFFER_DELTA 1.25 /client/Move(n, direct) - if(world.time < move_delay) + if(world.time < move_delay) //do not move anything ahead of this check please return FALSE + else + next_move_dir_add = 0 + next_move_dir_sub = 0 var/old_move_delay = move_delay move_delay = world.time+world.tick_lag //this is here because Move() can now be called mutiple times per tick if(!mob || !mob.loc) return FALSE - var/oldloc = mob.loc + if(!n || !direct) + return FALSE if(mob.notransform) return FALSE //This is sota the goto stop mobs from moving var if(mob.control_object) return Move_object(direct) if(!isliving(mob)) - return mob.Move(n,direct) + return mob.Move(n, direct) if(mob.stat == DEAD) mob.ghostize() return FALSE @@ -159,26 +81,32 @@ if(!mob.Process_Spacemove(direct)) return FALSE - //We are now going to move - var/delay = mob.movement_delay() - if(old_move_delay + (delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time) - move_delay = old_move_delay + delay + var/add_delay = mob.movement_delay() + if(old_move_delay + (add_delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time) + move_delay = old_move_delay else - move_delay = delay + world.time + move_delay = world.time + var/oldloc = mob.loc if(mob.confused) + var/newdir = 0 if(mob.confused > 40) - step(mob, pick(GLOB.cardinals)) + newdir = pick(GLOB.alldirs) else if(prob(mob.confused * 1.5)) - step(mob, angle2dir(dir2angle(direct) + pick(90, -90))) + newdir = angle2dir(dir2angle(direct) + pick(90, -90)) else if(prob(mob.confused * 3)) - step(mob, angle2dir(dir2angle(direct) + pick(45, -45))) - else - step(mob, direct) - else - . = ..() + newdir = angle2dir(dir2angle(direct) + pick(45, -45)) + if(newdir) + direct = newdir + n = get_step(mob, direct) + . = ..() + + if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully + add_delay *= 2 + if(mob.loc != oldloc) + move_delay += add_delay if(.) // If mob is null here, we deserve the runtime if(mob.throwing) mob.throwing.finalize(FALSE) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 7ffa7f8ed0e..598d5aa6b8f 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -5,7 +5,10 @@ if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return - usr.say(message) + if(!message) + message = input(src, "What do you want to say?", "Speech") as null|text + if(message) + say(message) /mob/verb/whisper_verb(message as text) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 65e6d4c0e4a..1c4ce4a5c1e 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -53,7 +53,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // You aren't allowed to move. /obj/machinery/gravity_generator/Move() - ..() + . = ..() qdel(src) /obj/machinery/gravity_generator/proc/set_broken() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index c2610ebc441..70772f74f90 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -76,6 +76,7 @@ /obj/machinery/field/containment/Move() qdel(src) + return FALSE // Abstract Field Class diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index eebe4ef8c09..33c8a199827 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -152,7 +152,7 @@ qdel(src) /obj/structure/particle_accelerator/Move() - ..() + . = ..() if(master && master.active) master.toggle_power() investigate_log("was moved whilst active; it powered down.", INVESTIGATE_SINGULO) diff --git a/interface/skin.dmf b/interface/skin.dmf index 1dbebc524f6..24a4376d3ae 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,1085 +1,48 @@ macro "default" - elem - name = "TAB" - command = ".winset \"mainwindow.macro=hotkeys mapwindow.map.focus=true input.background-color=#e0e0e0\"" - is-disabled = false - elem - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem - name = "SOUTHWEST" - command = ".southwest" - is-disabled = false - elem - name = "NORTHWEST" - command = ".northwest" - is-disabled = false - elem - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem - name = "CTRL+H" - command = "delete-key-pressed" - is-disabled = false - elem - name = "CTRL+1" - command = "a-intent help" - is-disabled = false - elem - name = "CTRL+2" - command = "a-intent disarm" - is-disabled = false - elem - name = "CTRL+3" - command = "a-intent grab" - is-disabled = false - elem - name = "CTRL+4" - command = "a-intent harm" - is-disabled = false - elem - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem - name = "CTRL+B" - command = "resist" - is-disabled = false - elem - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem - name = "CTRL+E" - command = "quick-equip" - is-disabled = false - elem - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem - name = "CTRL+O" - command = "ooc" - is-disabled = false - elem - name = "CTRL+Q" - command = ".northwest" - is-disabled = false - elem - name = "CTRL+R" - command = ".southwest" - is-disabled = false - elem - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "CTRL+NUMPAD1" - command = "body-r-leg" - is-disabled = false - elem - name = "CTRL+NUMPAD2" - command = "body-groin" - is-disabled = false - elem - name = "CTRL+NUMPAD3" - command = "body-l-leg" - is-disabled = false - elem - name = "CTRL+NUMPAD4" - command = "body-r-arm" - is-disabled = false - elem - name = "CTRL+NUMPAD5" - command = "body-chest" - is-disabled = false - elem - name = "CTRL+NUMPAD6" - command = "body-l-arm" - is-disabled = false - elem - name = "CTRL+NUMPAD8" - command = "body-toggle-head" - is-disabled = false - elem - name = "CTRL+ADD" - command = "Add-View-Range 1" - is-disabled = false - elem - name = "CTRL+SUBTRACT" - command = "Add-View-Range -1" - is_disabled = false - elem - name = "F1" - command = "adminhelp" - is-disabled = false - elem - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem - name = "F5" - command = "Aghost" - is-disabled = false - elem - name = "F6" - command = "Player-Panel" - is-disabled = false - elem - name = "F7" - command = "Toggle-Build-Mode-Self" - is-disabled = false - elem - name = "CTRL+F7" - command = "Stealth-Mode" - is-disabled = false - elem - name = "F8" - command = "Invisimin" - is-disabled = false - elem - name = "F12" - command = "F12" - is-disabled = false - elem - name = "ALT" - command = "toggle-walk-run" - is-disabled = false - elem - name = "ALT+UP" - command = "toggle-walk-run" - is-disabled = false - -macro "hotkeys" - elem - name = "TAB" - command = ".winset \"mainwindow.macro=default input.focus=true input.background-color=#d3b5b5\"" - is-disabled = false - elem - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem - name = "SOUTHWEST" - command = ".southwest" - is-disabled = false - elem - name = "NORTHWEST" - command = ".northwest" - is-disabled = false - elem - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem - name = "H" - command = "delete-key-pressed" - is-disabled = false - elem - name = "1" - command = "a-intent help" - is-disabled = false - elem - name = "CTRL+1" - command = "a-intent help" - is-disabled = false - elem - name = "2" - command = "a-intent disarm" - is-disabled = false - elem - name = "CTRL+2" - command = "a-intent disarm" - is-disabled = false - elem - name = "3" - command = "a-intent grab" - is-disabled = false - elem - name = "CTRL+3" - command = "a-intent grab" - is-disabled = false - elem - name = "4" - command = "a-intent harm" - is-disabled = false - elem - name = "CTRL+4" - command = "a-intent harm" - is-disabled = false - elem - name = "A+REP" - command = ".moveleft" - is-disabled = false - elem - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem - name = "B" - command = "resist" - is-disabled = false - elem - name = "CTRL+B" - command = "resist" - is-disabled = false - elem - name = "D+REP" - command = ".moveright" - is-disabled = false - elem - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem - name = "E" - command = "quick-equip" - is-disabled = false - elem - name = "CTRL+E" - command = "quick-equip" - is-disabled = false - elem - name = "F" - command = "a-intent left" - is-disabled = false - elem - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem - name = "G" - command = "a-intent right" - is-disabled = false - elem - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem - name = "M" - command = "me" - is-disabled = false - elem - name = "O" - command = "ooc" - is-disabled = false - elem - name = "CTRL+O" - command = "ooc" - is-disabled = false - elem - name = "Q" - command = ".northwest" - is-disabled = false - elem - name = "CTRL+Q" - command = ".northwest" - is-disabled = false - elem - name = "R" - command = ".southwest" - is-disabled = false - elem - name = "CTRL+R" - command = ".southwest" - is-disabled = false - elem "s_key" - name = "S+REP" - command = ".movedown" - is-disabled = false - elem - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem - name = "T" - command = "say" - is-disabled = false - elem "w_key" - name = "W+REP" - command = ".moveup" - is-disabled = false - elem - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem - name = "X" - command = ".northeast" - is-disabled = false - elem - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem - name = "Y" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "Z" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "NUMPAD1" - command = "body-r-leg" - is-disabled = false - elem - name = "NUMPAD2" - command = "body-groin" - is-disabled = false - elem - name = "NUMPAD3" - command = "body-l-leg" - is-disabled = false - elem - name = "NUMPAD4" - command = "body-r-arm" - is-disabled = false - elem - name = "NUMPAD5" - command = "body-chest" - is-disabled = false - elem - name = "NUMPAD6" - command = "body-l-arm" - is-disabled = false - elem - name = "NUMPAD8" - command = "body-toggle-head" - is-disabled = false - elem - name = "CTRL+ADD" - command = "Add-View-Range 1" - is-disabled = false - elem - name = "CTRL+SUBTRACT" - command = "Add-View-Range -1" - is_disabled = false - elem - name = "F1" - command = "adminhelp" - is-disabled = false - elem - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem - name = "F5" - command = "Aghost" - is-disabled = false - elem - name = "F6" - command = "Player-Panel" - is-disabled = false - elem - name = "F7" - command = "Stealth-Mode" - is-disabled = false - elem - name = "CTRL+F7" - command = "Stealth-Mode" - is-disabled = false - elem - name = "F8" - command = "Toggle-Build-Mode-Self" - is-disabled = false - elem - name = "F12" - command = "F12" - is-disabled = false - elem - name = "ALT" - command = "toggle-walk-run" - is-disabled = false - elem - name = "ALT+UP" - command = "toggle-walk-run" - is-disabled = false - -macro "robot-default" - elem - name = "TAB" - command = ".winset \"mainwindow.macro=robot-hotkeys mapwindow.map.focus=true input.background-color=#e0e0e0\"" - is-disabled = false - elem - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem - name = "NORTHWEST" - command = "unequip-module" - is-disabled = false - elem - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem - name = "CTRL+H" - command = "delete-key-pressed" - is-disabled = false - elem - name = "CTRL+1" - command = "toggle-module 1" - is-disabled = false - elem - name = "CTRL+2" - command = "toggle-module 2" - is-disabled = false - elem - name = "CTRL+3" - command = "toggle-module 3" - is-disabled = false - elem - name = "CTRL+4" - command = "a-intent left" - is-disabled = false - elem - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem - name = "CTRL+B" - command = "resist" - is-disabled = false - elem - name = "CTRL+O" - command = "ooc" - is-disabled = false - elem - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem - name = "CTRL+Q" - command = "unequip-module" - is-disabled = false - elem - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "CTRL+NUMPAD1" - command = "body-r-leg" - is-disabled = false - elem - name = "CTRL+NUMPAD2" - command = "body-groin" - is-disabled = false - elem - name = "CTRL+NUMPAD3" - command = "body-l-leg" - is-disabled = false - elem - name = "CTRL+NUMPAD4" - command = "body-r-arm" - is-disabled = false - elem - name = "CTRL+NUMPAD5" - command = "body-chest" - is-disabled = false - elem - name = "CTRL+NUMPAD6" - command = "body-l-arm" - is-disabled = false - elem - name = "CTRL+NUMPAD8" - command = "body-toggle-head" - is-disabled = false - elem - name = "F1" - command = "adminhelp" - is-disabled = false - elem - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem - name = "F5" - command = "Aghost" - is-disabled = false - elem - name = "F6" - command = "Player-Panel" - is-disabled = false - elem - name = "F7" - command = "Toggle-Build-Mode-Self" - is-disabled = false - elem - name = "CTRL+F7" - command = "Stealth-Mode" - is-disabled = false - elem - name = "F8" - command = "Invisimin" - is-disabled = false - elem - name = "F12" - command = "F12" - is-disabled = false - -macro "robot-hotkeys" - elem - name = "TAB" - command = ".winset \"mainwindow.macro=robot-default input.focus=true input.background-color=#d3b5b5\"" - is-disabled = false - elem - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem - name = "NORTHWEST" - command = "unequip-module" - is-disabled = false - elem - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem - name = "H" - command = "delete-key-pressed" - is-disabled = false - elem - name = "1" - command = "toggle-module 1" - is-disabled = false - elem - name = "CTRL+1" - command = "toggle-module 1" - is-disabled = false - elem - name = "2" - command = "toggle-module 2" - is-disabled = false - elem - name = "CTRL+2" - command = "toggle-module 2" - is-disabled = false - elem - name = "3" - command = "toggle-module 3" - is-disabled = false - elem - name = "CTRL+3" - command = "toggle-module 3" - is-disabled = false - elem - name = "4" - command = "a-intent left" - is-disabled = false - elem - name = "CTRL+4" - command = "a-intent left" - is-disabled = false - elem - name = "A+REP" - command = ".moveleft" - is-disabled = false - elem - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem - name = "B" - command = "resist" - is-disabled = false - elem - name = "CTRL+B" - command = "resist" - is-disabled = false - elem - name = "M" - command = "me" - is-disabled = false - elem - name = "O" - command = "ooc" - is-disabled = false - elem - name = "CTRL+O" - command = "ooc" - is-disabled = false - elem - name = "D+REP" - command = ".moveright" - is-disabled = false - elem - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem - name = "F" - command = "a-intent left" - is-disabled = false - elem - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem - name = "G" - command = "a-intent right" - is-disabled = false - elem - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem - name = "Q" - command = "unequip-module" - is-disabled = false - elem - name = "CTRL+Q" - command = "unequip-module" - is-disabled = false - elem "s_key" - name = "S+REP" - command = ".movedown" - is-disabled = false - elem - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem - name = "T" - command = "say" - is-disabled = false - elem "w_key" - name = "W+REP" - command = ".moveup" - is-disabled = false - elem - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem - name = "X" - command = ".northeast" - is-disabled = false - elem - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem - name = "Y" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "Z" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem - name = "NUMPAD1" - command = "body-r-leg" - is-disabled = false - elem - name = "NUMPAD2" - command = "body-groin" - is-disabled = false - elem - name = "NUMPAD3" - command = "body-l-leg" - is-disabled = false - elem - name = "NUMPAD4" - command = "body-r-arm" - is-disabled = false - elem - name = "NUMPAD5" - command = "body-chest" - is-disabled = false - elem - name = "NUMPAD6" - command = "body-l-arm" - is-disabled = false - elem - name = "NUMPAD8" - command = "body-toggle-head" - is-disabled = false - elem - name = "F1" - command = "adminhelp" - is-disabled = false - elem - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem - name = "F5" - command = "Aghost" - is-disabled = false - elem - name = "F6" - command = "Player-Panel" - is-disabled = false - elem - name = "F7" - command = "Toggle-Build-Mode-Self" - is-disabled = false - elem - name = "CTRL+F7" - command = "Stealth-Mode" - is-disabled = false - elem - name = "F8" - command = "Invisimin" - is-disabled = false - elem - name = "F12" - command = "F12" - is-disabled = false - menu "menu" elem name = "&File" command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" elem name = "&Quick screenshot\tF2" command = ".screenshot auto" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" elem name = "&Save screenshot as...\tShift+F2" command = ".screenshot" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" elem name = "" command = "" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" elem "reconnectbutton" name = "&Reconnect" command = ".reconnect" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" elem name = "&Quit\tAlt-F4" command = ".quit" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" elem name = "&Help" command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" elem name = "&Admin Help\tF1" command = "adminhelp" category = "&Help" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" elem name = "&Hotkeys" command = "hotkeys-help" category = "&Help" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" @@ -1090,116 +53,41 @@ window "mainwindow" size = 640x440 anchor1 = none anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false is-default = true - border = none - drop-zone = false - right-click = false saved-params = "pos;size;is-minimized;is-maximized" - on-size = "" - title = "" - titlebar = true - statusbar = true - can-close = true - can-minimize = true - can-resize = true - is-pane = false - is-minimized = false - is-maximized = false - can-scroll = none icon = 'icons\\ss13_64.png' - image = "" - image-mode = stretch - keep-aspect = false - transparent-color = none - alpha = 255 - macro = "macro" + macro = "default" menu = "menu" - on-close = "" elem "split" type = CHILD pos = 3,0 size = 634x417 anchor1 = 0,0 anchor2 = 100,100 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "splitter" - on-size = "" left = "mapwindow" right = "infowindow" is-vert = true - splitter = 50 - show-splitter = true - lock = none elem "input" type = INPUT pos = 5,420 size = 595x20 anchor1 = 0,100 anchor2 = 100,100 - font-family = "" font-size = 10 - font-style = "" - text-color = #000000 background-color = #d3b5b5 - is-visible = true - is-disabled = false - is-transparent = false is-default = true - border = none - drop-zone = false - right-click = false saved-params = "command" - on-size = "" - command = "" - multi-line = false - is-password = false - no-command = false elem "say" type = BUTTON pos = 600,420 size = 37x20 anchor1 = 100,100 anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "is-checked" - on-size = "" text = "Chat" - image = "" command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"" is-flat = true - stretch = false - is-checked = false - group = "" button-type = pushbox elem "asset_cache_browser" type = BROWSER @@ -1207,52 +95,16 @@ window "mainwindow" size = 200x200 anchor1 = none anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none is-visible = false - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "" - on-size = "" - show-history = false - show-url = false - auto-format = true - use-title = false - on-show = "" - on-hide = "" elem "tooltip" type = BROWSER pos = 0,0 size = 999x999 anchor1 = none anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none is-visible = false - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "" - on-size = "" - show-history = false - show-url = false - auto-format = true - use-title = false - on-show = "" - on-hide = "" window "mapwindow" elem "mapwindow" @@ -1261,39 +113,8 @@ window "mapwindow" size = 640x480 anchor1 = none anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "pos;size;is-minimized;is-maximized" - on-size = "" - title = "" - titlebar = true - statusbar = true - can-close = true - can-minimize = true - can-resize = true is-pane = true - is-minimized = false - is-maximized = false - can-scroll = none - icon = "" - image = "" - image-mode = stretch - keep-aspect = false - transparent-color = none - alpha = 255 - macro = "" - menu = "" - on-close = "" elem "map" type = MAP pos = 0,0 @@ -1302,26 +123,10 @@ window "mapwindow" anchor2 = 100,100 font-family = "Arial" font-size = 7 - font-style = "" text-color = none - background-color = none - is-visible = true - is-disabled = false - is-transparent = false is-default = true - border = none - drop-zone = true - right-click = false saved-params = "icon-size" - on-size = "" - icon-size = 0 - text-mode = false - letterbox = true - zoom = 0 - on-show = "" - on-hide = "" - style = "" - zoom-mode = "distort" + zoom-mode = distort window "infowindow" elem "infowindow" @@ -1330,233 +135,72 @@ window "infowindow" size = 640x480 anchor1 = none anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "pos;size;is-minimized;is-maximized" - on-size = "" - title = "" - titlebar = true - statusbar = true - can-close = true - can-minimize = true - can-resize = true is-pane = true - is-minimized = false - is-maximized = false - can-scroll = none - icon = "" - image = "" - image-mode = stretch - keep-aspect = false - transparent-color = none - alpha = 255 - macro = "" - menu = "" - on-close = "" elem "info" type = CHILD pos = 0,30 size = 640x445 anchor1 = 0,0 anchor2 = 100,100 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "splitter" - on-size = "" left = "statwindow" right = "outputwindow" is-vert = false - splitter = 50 - show-splitter = true - lock = none elem "changelog" type = BUTTON pos = 16,5 size = 104x20 anchor1 = 3,0 anchor2 = 19,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "is-checked" - on-size = "" text = "Changelog" - image = "" command = "changelog" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton elem "rules" type = BUTTON pos = 120,5 size = 100x20 anchor1 = 19,0 anchor2 = 34,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "is-checked" - on-size = "" text = "Rules" - image = "" command = "rules" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton elem "wiki" type = BUTTON pos = 220,5 size = 100x20 anchor1 = 34,0 anchor2 = 50,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "is-checked" - on-size = "" text = "Wiki" - image = "" command = "wiki" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton elem "forum" type = BUTTON pos = 320,5 size = 100x20 anchor1 = 50,0 anchor2 = 66,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "is-checked" - on-size = "" text = "Forum" - image = "" command = "forum" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton elem "github" type = BUTTON pos = 420,5 size = 100x20 anchor1 = 66,0 anchor2 = 81,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "is-checked" - on-size = "" text = "Github" - image = "" command = "github" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton elem "report-issue" type = BUTTON pos = 520,5 size = 100x20 anchor1 = 81,0 anchor2 = 97,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "is-checked" - on-size = "" text = "Report Issue" - image = "" command = "report-issue" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton window "outputwindow" elem "outputwindow" @@ -1565,91 +209,27 @@ window "outputwindow" size = 640x480 anchor1 = none anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "pos;size;is-minimized;is-maximized" - on-size = "" - title = "" - titlebar = true - statusbar = true - can-close = true - can-minimize = true - can-resize = true is-pane = true - is-minimized = false - is-maximized = false - can-scroll = none - icon = "" - image = "" - image-mode = stretch - keep-aspect = false - transparent-color = none - alpha = 255 - macro = "" - menu = "" - on-close = "" elem "browseroutput" type = BROWSER pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 background-color = #ffffff is-visible = false is-disabled = true - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "" - on-size = "" - show-history = false - show-url = false auto-format = false - use-title = false - on_show = "" - on_hide = "" elem "output" type = OUTPUT pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = #ffffff - is-visible = true - is-disabled = false - is-transparent = false is-default = true - border = none - drop-zone = false - right-click = false saved-params = "" - on-size = "" - show-history = false - show-url = false - auto-format = false - use-title = false - on_show = "" - on_hide = "" window "statwindow" elem "statwindow" @@ -1658,69 +238,14 @@ window "statwindow" size = 640x480 anchor1 = none anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false saved-params = "pos;size;is-minimized;is-maximized" - on-size = "" - title = "" - titlebar = true - statusbar = true - can-close = true - can-minimize = true - can-resize = true is-pane = true - is-minimized = false - is-maximized = false - can-scroll = none - icon = "" - image = "" - image-mode = stretch - keep-aspect = false - transparent-color = none - alpha = 255 - macro = "" - menu = "" - on-close = "" elem "stat" type = INFO pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = #ffffff - is-visible = true - is-disabled = false - is-transparent = false is-default = true - border = none - drop-zone = true - right-click = false saved-params = "" - on-size = "" - highlight-color = #00ff00 - tab-text-color = #000000 - tab-background-color = none - tab-font-family = "" - tab-font-size = 0 - tab-font-style = "" - allow-html = true - multi-line = true - on-show = "" - on-hide = "" - on-tab = "" - prefix-color = none - suffix-color = none + diff --git a/tgstation.dme b/tgstation.dme index c26b15fbd4e..c732ace2dc9 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -198,6 +198,7 @@ #include "code\controllers\subsystem\icon_smooth.dm" #include "code\controllers\subsystem\idlenpcpool.dm" #include "code\controllers\subsystem\inbounds.dm" +#include "code\controllers\subsystem\input.dm" #include "code\controllers\subsystem\ipintel.dm" #include "code\controllers\subsystem\job.dm" #include "code\controllers\subsystem\language.dm" @@ -1237,7 +1238,6 @@ #include "code\modules\client\verbs\etips.dm" #include "code\modules\client\verbs\ooc.dm" #include "code\modules\client\verbs\ping.dm" -#include "code\modules\client\verbs\sethotkeys.dm" #include "code\modules\client\verbs\suicide.dm" #include "code\modules\client\verbs\who.dm" #include "code\modules\clothing\chameleon.dm" @@ -1539,6 +1539,16 @@ #include "code\modules\jobs\job_types\security.dm" #include "code\modules\jobs\job_types\silicon.dm" #include "code\modules\jobs\map_changes\map_changes.dm" +#include "code\modules\keybindings\bindings_admin.dm" +#include "code\modules\keybindings\bindings_atom.dm" +#include "code\modules\keybindings\bindings_carbon.dm" +#include "code\modules\keybindings\bindings_client.dm" +#include "code\modules\keybindings\bindings_human.dm" +#include "code\modules\keybindings\bindings_living.dm" +#include "code\modules\keybindings\bindings_mob.dm" +#include "code\modules\keybindings\bindings_robot.dm" +#include "code\modules\keybindings\focus.dm" +#include "code\modules\keybindings\setup.dm" #include "code\modules\language\beachbum.dm" #include "code\modules\language\codespeak.dm" #include "code\modules\language\common.dm"