Skip to content

Commit 432f2a1

Browse files
committed
1 parent 2e7cf7f commit 432f2a1

File tree

4 files changed

+45
-11
lines changed

4 files changed

+45
-11
lines changed

code/modules/client/client_defines.dm

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,15 @@
248248
var/list/keys_held = list()
249249
/// A buffer for combinations such of modifiers + keys (ex: CtrlD, AltE, ShiftT). Format: `"key"` -> `"combo"` (ex: `"D"` -> `"CtrlD"`)
250250
var/list/key_combos_held = list()
251+
251252
/// The direction we WANT to move, based off our keybinds
252-
/// Will be udpated to be the actual direction later on
253+
/// It updates by client "move_key_(direction)" verbs and tells us exactly when client wants to move and when they don't
253254
var/intended_direction = NONE
255+
/// The direction we WANT to move, but another one, based off our keybinds too
256+
/// It sets by KeyUp and KeyDown verbs but using it alone can lead to key stucks
257+
/// It will be combined with intended_direction and used to set the actual direction later on
258+
/// We MIGHT be able to do without it, but BYOND does not handle more than 1 +REP command, so alas
259+
var/additional_intended_direction = NONE
254260
/*
255261
** These next two vars are to apply movement for keypresses and releases made while move delayed.
256262
** Because discarding that input makes the game less responsive.

code/modules/client/client_procs.dm

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,12 +1143,16 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
11431143
switch(kb_name)
11441144
if("North")
11451145
movement_keys[key] = NORTH
1146+
winset(src, "default-[REF(key)]", "parent=default;name=[key]+REP;command=move-key-north")
11461147
if("East")
11471148
movement_keys[key] = EAST
1149+
winset(src, "default-[REF(key)]", "parent=default;name=[key]+REP;command=move-key-east")
11481150
if("West")
11491151
movement_keys[key] = WEST
1152+
winset(src, "default-[REF(key)]", "parent=default;name=[key]+REP;command=move-key-west")
11501153
if("South")
11511154
movement_keys[key] = SOUTH
1155+
winset(src, "default-[REF(key)]", "parent=default;name=[key]+REP;command=move-key-south")
11521156
if(SAY_CHANNEL)
11531157
var/say = tgui_say_create_open_command(SAY_CHANNEL)
11541158
winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[say]")

code/modules/keybindings/bindings_atom.dm

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,18 @@
77
// But the move of one mob might poke the client of another, so we do this
88
if(!user)
99
return FALSE
10-
var/movement_dir = user.intended_direction | user.next_move_dir_add
11-
// If we're not movin anywhere, we aren't movin anywhere
12-
// Safe because nothing adds to movement_dir after this moment
13-
if(!movement_dir)
10+
11+
// Handle movement dir queued right after last movement
12+
user.intended_direction |= user.next_move_dir_add
13+
// We didn't recive any input so it's useless to proceed further
14+
if(!user.intended_direction)
1415
// No input == our removal would have done nothing
1516
// So we can safely forget about it
1617
user.next_move_dir_sub = NONE
17-
return FALSE
18+
return
19+
20+
var/movement_dir = user.intended_direction | user.additional_intended_direction
21+
user.intended_direction = NONE
1822

1923
if(user.next_move_dir_sub)
2024
movement_dir &= ~user.next_move_dir_sub
@@ -41,4 +45,24 @@
4145
var/movement_dir = NONE
4246
for(var/_key in keys_held)
4347
movement_dir |= movement_keys[_key]
44-
intended_direction = movement_dir
48+
additional_intended_direction = movement_dir
49+
50+
/client/verb/move_key_north()
51+
set instant = TRUE
52+
set hidden = TRUE
53+
intended_direction = NORTH
54+
55+
/client/verb/move_key_south()
56+
set instant = TRUE
57+
set hidden = TRUE
58+
intended_direction = SOUTH
59+
60+
/client/verb/move_key_west()
61+
set instant = TRUE
62+
set hidden = TRUE
63+
intended_direction = WEST
64+
65+
/client/verb/move_key_east()
66+
set instant = TRUE
67+
set hidden = TRUE
68+
intended_direction = EAST

code/modules/keybindings/bindings_client.dm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@
4848
//the time a key was pressed isn't actually used anywhere (as of 2019-9-10) but this allows easier access usage/checking
4949
keys_held[_key] = world.time
5050
var/movement = movement_keys[_key]
51-
if(movement)
51+
if(movement && !movement_locked)
5252
calculate_move_dir()
53-
if(!movement_locked && !(next_move_dir_sub & movement))
53+
if(!(next_move_dir_sub & movement))
5454
next_move_dir_add |= movement
5555

5656
// Client-level keybindings are ones anyone should be able to do at any time
@@ -96,9 +96,9 @@
9696
keys_held -= _key
9797

9898
var/movement = movement_keys[_key]
99-
if(movement)
99+
if(movement && !movement_locked)
100100
calculate_move_dir()
101-
if(!movement_locked && !(next_move_dir_add & movement))
101+
if(!(next_move_dir_add & movement))
102102
next_move_dir_sub |= movement
103103

104104
// We don't do full key for release, because for mod keys you

0 commit comments

Comments
 (0)