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"