|
|
|
@@ -50,6 +50,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|
|
|
|
|
|
|
|
|
/// Custom Keybindings
|
|
|
|
|
var/list/key_bindings = list()
|
|
|
|
|
/// List with a key string associated to a list of keybindings. Unlike key_bindings, this one operates on raw key, allowing for binding a key that triggers regardless of if a modifier is depressed as long as the raw key is sent.
|
|
|
|
|
var/list/modless_key_bindings = list()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var/tgui_fancy = TRUE
|
|
|
|
@@ -1098,6 +1100,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|
|
|
|
Input mode is the closest thing to the old input system.<br>\
|
|
|
|
|
<b>IMPORTANT:</b> While in input mode's non hotkey setting (tab toggled), Ctrl + KEY will send KEY to the keybind system as the key itself, not as Ctrl + KEY. This means Ctrl + T/W/A/S/D/all your familiar stuff still works, but you \
|
|
|
|
|
won't be able to access any regular Ctrl binds.<br>"
|
|
|
|
|
dat += "<br><b>Modifier-Independent binding</b> - This is a singular bind that works regardless of if Ctrl/Shift/Alt are held down. For example, if combat mode is bound to C in modifier-independent binds, it'll trigger regardless of if you are \
|
|
|
|
|
holding down shift for sprint. <b>Each keybind can only have one independent binding, and each key can only have one keybind independently bound to it.</b>"
|
|
|
|
|
// Create an inverted list of keybindings -> key
|
|
|
|
|
var/list/user_binds = list()
|
|
|
|
|
for (var/key in key_bindings)
|
|
|
|
@@ -1110,21 +1114,23 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|
|
|
|
var/datum/keybinding/kb = GLOB.keybindings_by_name[name]
|
|
|
|
|
kb_categories[kb.category] += list(kb)
|
|
|
|
|
|
|
|
|
|
dat += "<style>label { display: inline-block; width: 200px; }</style><body>"
|
|
|
|
|
dat += "<style>span.bindings { display: inline-block; width: 200px; } span.independent { display: inline-block; width: 50px } </style><body>"
|
|
|
|
|
|
|
|
|
|
for (var/category in kb_categories)
|
|
|
|
|
dat += "<h3>[category]</h3>"
|
|
|
|
|
for (var/i in kb_categories[category])
|
|
|
|
|
var/datum/keybinding/kb = i
|
|
|
|
|
var/current_independent_binding = modless_key_bindings[kb.name] || "Unbound"
|
|
|
|
|
if(!length(user_binds[kb.name]))
|
|
|
|
|
dat += "<label>[kb.full_name]</label> <a href ='?_src_=prefs;preference=keybindings_capture;keybinding=[kb.name];old_key=["Unbound"]'>Unbound</a>"
|
|
|
|
|
dat += "<span class='bindings'>[kb.full_name]</span> <a href ='?_src_=prefs;preference=keybindings_capture;keybinding=[kb.name];old_key=["Unbound"]'>Unbound</a>"
|
|
|
|
|
var/list/default_keys = hotkeys ? kb.hotkey_keys : kb.classic_keys
|
|
|
|
|
if(LAZYLEN(default_keys))
|
|
|
|
|
dat += "| Default: [default_keys.Join(", ")]"
|
|
|
|
|
dat += "<span class='independent'>Independent Binding: </span> <a href='?_src_=prefs;preference=keybindings_capture;keybinding=[kb.name];old_key=[current_independent_binding];independent=1'>[current_independent_binding]</a>"
|
|
|
|
|
dat += "<br>"
|
|
|
|
|
else
|
|
|
|
|
var/bound_key = user_binds[kb.name][1]
|
|
|
|
|
dat += "<label>[kb.full_name]</label> <a href ='?_src_=prefs;preference=keybindings_capture;keybinding=[kb.name];old_key=[bound_key]'>[bound_key]</a>"
|
|
|
|
|
dat += "<span class='bindings'l>[kb.full_name]</span> <a href ='?_src_=prefs;preference=keybindings_capture;keybinding=[kb.name];old_key=[bound_key]'>[bound_key]</a>"
|
|
|
|
|
for(var/bound_key_index in 2 to length(user_binds[kb.name]))
|
|
|
|
|
bound_key = user_binds[kb.name][bound_key_index]
|
|
|
|
|
dat += " | <a href ='?_src_=prefs;preference=keybindings_capture;keybinding=[kb.name];old_key=[bound_key]'>[bound_key]</a>"
|
|
|
|
@@ -1133,6 +1139,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|
|
|
|
var/list/default_keys = hotkeys ? kb.classic_keys : kb.hotkey_keys
|
|
|
|
|
if(LAZYLEN(default_keys))
|
|
|
|
|
dat += "| Default: [default_keys.Join(", ")]"
|
|
|
|
|
dat += "<span class='independent'>Independent Binding: </span> <a href='?_src_=prefs;preference=keybindings_capture;keybinding=[kb.name];old_key=[current_independent_binding];independent=1'>[current_independent_binding]</a>"
|
|
|
|
|
dat += "<br>"
|
|
|
|
|
|
|
|
|
|
dat += "<br><br>"
|
|
|
|
@@ -1158,7 +1165,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|
|
|
|
#undef APPEARANCE_CATEGORY_COLUMN
|
|
|
|
|
#undef MAX_MUTANT_ROWS
|
|
|
|
|
|
|
|
|
|
/datum/preferences/proc/CaptureKeybinding(mob/user, datum/keybinding/kb, var/old_key)
|
|
|
|
|
/datum/preferences/proc/CaptureKeybinding(mob/user, datum/keybinding/kb, old_key, independent = FALSE)
|
|
|
|
|
var/HTML = {"
|
|
|
|
|
<div id='focus' style="outline: 0;" tabindex=0>Keybinding: [kb.full_name]<br>[kb.description]<br><br><b>Press any key to change<br>Press ESC to clear</b></div>
|
|
|
|
|
<script>
|
|
|
|
@@ -1170,7 +1177,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|
|
|
|
var shift = e.shiftKey ? 1 : 0;
|
|
|
|
|
var numpad = (95 < e.keyCode && e.keyCode < 112) ? 1 : 0;
|
|
|
|
|
var escPressed = e.keyCode == 27 ? 1 : 0;
|
|
|
|
|
var url = 'byond://?_src_=prefs;preference=keybindings_set;keybinding=[kb.name];old_key=[old_key];clear_key='+escPressed+';key='+e.key+';alt='+alt+';ctrl='+ctrl+';shift='+shift+';numpad='+numpad+';key_code='+e.keyCode;
|
|
|
|
|
var url = 'byond://?_src_=prefs;preference=keybindings_set;keybinding=[kb.name];old_key=[old_key];independent=[independent];clear_key='+escPressed+';key='+e.key+';alt='+alt+';ctrl='+ctrl+';shift='+shift+';numpad='+numpad+';key_code='+e.keyCode;
|
|
|
|
|
window.location=url;
|
|
|
|
|
deedDone = true;
|
|
|
|
|
}
|
|
|
|
@@ -1625,7 +1632,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|
|
|
|
var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], MAX_FLAVOR_LEN, TRUE)
|
|
|
|
|
if(!isnull(msg))
|
|
|
|
|
features["flavor_text"] = html_decode(msg)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if("silicon_flavor_text")
|
|
|
|
|
var/msg = stripped_multiline_input(usr, "Set the silicon flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Silicon Flavor Text", features["silicon_flavor_text"], MAX_FLAVOR_LEN, TRUE)
|
|
|
|
|
if(!isnull(msg))
|
|
|
|
@@ -2372,8 +2379,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|
|
|
|
|
|
|
|
|
if("keybindings_capture")
|
|
|
|
|
var/datum/keybinding/kb = GLOB.keybindings_by_name[href_list["keybinding"]]
|
|
|
|
|
var/old_key = href_list["old_key"]
|
|
|
|
|
CaptureKeybinding(user, kb, old_key)
|
|
|
|
|
CaptureKeybinding(user, kb, href_list["old_key"], href_list["independent"])
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if("keybindings_set")
|
|
|
|
@@ -2383,13 +2389,18 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|
|
|
|
ShowChoices(user)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
var/independent = href_list["independent"]
|
|
|
|
|
|
|
|
|
|
var/clear_key = text2num(href_list["clear_key"])
|
|
|
|
|
var/old_key = href_list["old_key"]
|
|
|
|
|
if(clear_key)
|
|
|
|
|
if(key_bindings[old_key])
|
|
|
|
|
key_bindings[old_key] -= kb_name
|
|
|
|
|
if(!length(key_bindings[old_key]))
|
|
|
|
|
key_bindings -= old_key
|
|
|
|
|
if(!independent)
|
|
|
|
|
if(key_bindings[old_key])
|
|
|
|
|
key_bindings[old_key] -= kb_name
|
|
|
|
|
if(!length(key_bindings[old_key]))
|
|
|
|
|
key_bindings -= old_key
|
|
|
|
|
else
|
|
|
|
|
modless_key_bindings -= old_key
|
|
|
|
|
user << browse(null, "window=capturekeypress")
|
|
|
|
|
save_preferences()
|
|
|
|
|
ShowChoices(user)
|
|
|
|
@@ -2415,15 +2426,18 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|
|
|
|
full_key = "[AltMod][CtrlMod][new_key]"
|
|
|
|
|
else
|
|
|
|
|
full_key = "[AltMod][CtrlMod][ShiftMod][numpad][new_key]"
|
|
|
|
|
if(key_bindings[old_key])
|
|
|
|
|
key_bindings[old_key] -= kb_name
|
|
|
|
|
if(!length(key_bindings[old_key]))
|
|
|
|
|
key_bindings -= old_key
|
|
|
|
|
key_bindings[full_key] += list(kb_name)
|
|
|
|
|
key_bindings[full_key] = sortList(key_bindings[full_key])
|
|
|
|
|
|
|
|
|
|
user << browse(null, "window=capturekeypress")
|
|
|
|
|
if(independent)
|
|
|
|
|
modless_key_bindings -= old_key
|
|
|
|
|
modless_key_bindings[full_key] = kb_name
|
|
|
|
|
else
|
|
|
|
|
if(key_bindings[old_key])
|
|
|
|
|
key_bindings[old_key] -= kb_name
|
|
|
|
|
if(!length(key_bindings[old_key]))
|
|
|
|
|
key_bindings -= old_key
|
|
|
|
|
key_bindings[full_key] += list(kb_name)
|
|
|
|
|
key_bindings[full_key] = sortList(key_bindings[full_key])
|
|
|
|
|
user.client.update_movement_keys()
|
|
|
|
|
user << browse(null, "window=capturekeypress")
|
|
|
|
|
save_preferences()
|
|
|
|
|
|
|
|
|
|
if("keybindings_reset")
|
|
|
|
|