@satelliteoflove/godot-mcp 3.17.0 → 3.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/addon/commands/input_commands.gd +4 -9
- package/addon/game_bridge/key_names.gd +133 -0
- package/addon/game_bridge/key_names.gd.uid +1 -0
- package/addon/game_bridge/mcp_game_bridge.gd +175 -24
- package/addon/plugin.cfg +1 -1
- package/dist/__tests__/tools/game-time.test.js +70 -0
- package/dist/__tests__/tools/game-time.test.js.map +1 -1
- package/dist/__tests__/tools/input.test.js +180 -0
- package/dist/__tests__/tools/input.test.js.map +1 -1
- package/dist/tools/game-time.d.ts +18 -0
- package/dist/tools/game-time.d.ts.map +1 -1
- package/dist/tools/game-time.js +5 -5
- package/dist/tools/game-time.js.map +1 -1
- package/dist/tools/input.d.ts +19 -1
- package/dist/tools/input.d.ts.map +1 -1
- package/dist/tools/input.js +87 -23
- package/dist/tools/input.js.map +1 -1
- package/package.json +1 -1
|
@@ -115,15 +115,7 @@ func _get_editor_input_map() -> Dictionary:
|
|
|
115
115
|
|
|
116
116
|
func _event_to_string(event: InputEvent) -> String:
|
|
117
117
|
if event is InputEventKey:
|
|
118
|
-
|
|
119
|
-
var key_name := OS.get_keycode_string(key_event.keycode)
|
|
120
|
-
if key_event.ctrl_pressed:
|
|
121
|
-
key_name = "Ctrl+" + key_name
|
|
122
|
-
if key_event.alt_pressed:
|
|
123
|
-
key_name = "Alt+" + key_name
|
|
124
|
-
if key_event.shift_pressed:
|
|
125
|
-
key_name = "Shift+" + key_name
|
|
126
|
-
return key_name
|
|
118
|
+
return MCPKeyNames.event_string(event as InputEventKey)
|
|
127
119
|
elif event is InputEventMouseButton:
|
|
128
120
|
var mouse_event := event as InputEventMouseButton
|
|
129
121
|
match mouse_event.button_index:
|
|
@@ -143,6 +135,9 @@ func _event_to_string(event: InputEvent) -> String:
|
|
|
143
135
|
# binding straight into an injection (e.g. move_left = left_x, value -1.0).
|
|
144
136
|
var joy_motion := event as InputEventJoypadMotion
|
|
145
137
|
return "Joypad Axis %d (%s, value %+.1f)" % [joy_motion.axis, MCPJoyNames.axis_name(joy_motion.axis), joy_motion.axis_value]
|
|
138
|
+
elif event is InputEventMouseMotion:
|
|
139
|
+
var mouse_motion := event as InputEventMouseMotion
|
|
140
|
+
return "Mouse Motion (rel %+.1f, %+.1f)" % [mouse_motion.relative.x, mouse_motion.relative.y]
|
|
146
141
|
return event.as_text()
|
|
147
142
|
|
|
148
143
|
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
@tool
|
|
2
|
+
class_name MCPKeyNames
|
|
3
|
+
extends RefCounted
|
|
4
|
+
## Canonical keyboard name<->keycode parsing/formatting (#290), shared by the
|
|
5
|
+
## game bridge (raw InputEventKey injection) and the editor input commands
|
|
6
|
+
## (get_input_map display) so the wire vocabulary and the displayed names can
|
|
7
|
+
## never drift apart.
|
|
8
|
+
##
|
|
9
|
+
## Why this exists rather than calling OS.find_keycode_from_string directly:
|
|
10
|
+
## that engine helper parses Ctrl/Shift/Alt prefixes but SILENTLY DROPS Meta/Cmd
|
|
11
|
+
## (verified Godot 4.6 — "Meta+Q" returns a bare KEY_Q). We split modifiers here
|
|
12
|
+
## ourselves so meta round-trips, and only hand the base token to the engine.
|
|
13
|
+
|
|
14
|
+
## Modifier token -> key mask. Case-insensitive (callers lowercase first).
|
|
15
|
+
## Aliases cover the common cross-platform spellings agents reach for.
|
|
16
|
+
const MODIFIERS := {
|
|
17
|
+
"ctrl": KEY_MASK_CTRL,
|
|
18
|
+
"control": KEY_MASK_CTRL,
|
|
19
|
+
"shift": KEY_MASK_SHIFT,
|
|
20
|
+
"alt": KEY_MASK_ALT,
|
|
21
|
+
"option": KEY_MASK_ALT,
|
|
22
|
+
"opt": KEY_MASK_ALT,
|
|
23
|
+
"meta": KEY_MASK_META,
|
|
24
|
+
"cmd": KEY_MASK_META,
|
|
25
|
+
"command": KEY_MASK_META,
|
|
26
|
+
"super": KEY_MASK_META,
|
|
27
|
+
"win": KEY_MASK_META,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
## Key mask -> the modifier's own keycode, so a combo can press each modifier as
|
|
31
|
+
## a real key (the only way is_key_pressed(KEY_CTRL) ever reads true — the
|
|
32
|
+
## modifier FLAG on another event does not update the polled singleton).
|
|
33
|
+
const MODIFIER_KEYCODES := {
|
|
34
|
+
KEY_MASK_CTRL: KEY_CTRL,
|
|
35
|
+
KEY_MASK_SHIFT: KEY_SHIFT,
|
|
36
|
+
KEY_MASK_ALT: KEY_ALT,
|
|
37
|
+
KEY_MASK_META: KEY_META,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
# The four modifier masks, in canonical display/iteration order.
|
|
41
|
+
const _MOD_ORDER: Array = [KEY_MASK_CTRL, KEY_MASK_SHIFT, KEY_MASK_ALT, KEY_MASK_META]
|
|
42
|
+
const _MOD_TOKENS := {
|
|
43
|
+
KEY_MASK_CTRL: "Ctrl",
|
|
44
|
+
KEY_MASK_SHIFT: "Shift",
|
|
45
|
+
KEY_MASK_ALT: "Alt",
|
|
46
|
+
KEY_MASK_META: "Meta",
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
## Parse a wire key value into {code:int, mask:int}. Accepts a string with
|
|
51
|
+
## optional modifier prefixes ("a", "Escape", "ctrl+s", "shift+alt+f1") or a raw
|
|
52
|
+
## Godot Key enum int (which may carry modifier mask bits). Returns code = KEY_NONE
|
|
53
|
+
## (0) for anything that does not resolve to a base key, which the caller turns
|
|
54
|
+
## into an "Unknown key" error.
|
|
55
|
+
static func parse(value: Variant) -> Dictionary:
|
|
56
|
+
if value is int or value is float:
|
|
57
|
+
var raw := int(value)
|
|
58
|
+
return {"code": raw & ~int(KEY_MODIFIER_MASK), "mask": raw & int(KEY_MODIFIER_MASK)}
|
|
59
|
+
|
|
60
|
+
var s := str(value).strip_edges()
|
|
61
|
+
if s.is_empty():
|
|
62
|
+
return {"code": KEY_NONE, "mask": 0}
|
|
63
|
+
|
|
64
|
+
var mask := 0
|
|
65
|
+
var base := ""
|
|
66
|
+
for part in s.split("+", false):
|
|
67
|
+
var token := String(part).strip_edges()
|
|
68
|
+
if token.is_empty():
|
|
69
|
+
continue
|
|
70
|
+
var lower := token.to_lower()
|
|
71
|
+
if MODIFIERS.has(lower):
|
|
72
|
+
mask |= int(MODIFIERS[lower])
|
|
73
|
+
else:
|
|
74
|
+
# The last non-modifier token wins as the base (a stray extra base
|
|
75
|
+
# would just overwrite, which is fine — a malformed combo resolves to
|
|
76
|
+
# whatever its final base token is, or KEY_NONE if none resolves).
|
|
77
|
+
base = token
|
|
78
|
+
|
|
79
|
+
if base.is_empty():
|
|
80
|
+
# A lone modifier name ("shift", "ctrl", "cmd") means the modifier KEY
|
|
81
|
+
# itself — e.g. a game binding bare Shift, or polling is_key_pressed(KEY_CTRL).
|
|
82
|
+
# Exactly one modifier resolves to its keycode; a baseless multi-modifier
|
|
83
|
+
# combo ("ctrl+shift") is ambiguous and stays unknown.
|
|
84
|
+
for m in _MOD_ORDER:
|
|
85
|
+
if mask == int(m):
|
|
86
|
+
return {"code": int(MODIFIER_KEYCODES[m]), "mask": 0}
|
|
87
|
+
return {"code": KEY_NONE, "mask": mask}
|
|
88
|
+
|
|
89
|
+
# find_keycode_from_string handles Ctrl/Shift/Alt itself; strip any mask bits
|
|
90
|
+
# it folded in so `code` is always a bare base keycode.
|
|
91
|
+
var resolved := int(OS.find_keycode_from_string(base))
|
|
92
|
+
mask |= resolved & int(KEY_MODIFIER_MASK)
|
|
93
|
+
var code := resolved & ~int(KEY_MODIFIER_MASK)
|
|
94
|
+
return {"code": code, "mask": mask}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
## The modifier keycodes (KEY_CTRL, ...) present in a mask, in canonical order,
|
|
98
|
+
## so a combo can press each one as its own key event.
|
|
99
|
+
static func modifier_key_indices(mask: int) -> Array:
|
|
100
|
+
var out: Array = []
|
|
101
|
+
for m in _MOD_ORDER:
|
|
102
|
+
if mask & int(m):
|
|
103
|
+
out.append(int(MODIFIER_KEYCODES[m]))
|
|
104
|
+
return out
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
## Canonical display for a key binding (get_input_map). Modifier prefixes come
|
|
108
|
+
## from the event's own flags with fixed tokens (platform-stable, and re-parseable
|
|
109
|
+
## by parse() — unlike OS.get_keycode_string's mask spelling, which
|
|
110
|
+
## find_keycode_from_string cannot read back for Meta). A logical key + modifier
|
|
111
|
+
## combo round-trips through parse(); a physical-only binding (keycode unset)
|
|
112
|
+
## renders from physical_keycode with a "(physical)" marker that tells an agent to
|
|
113
|
+
## inject with physical:true — that marker is display-only, not re-parseable.
|
|
114
|
+
static func event_string(event: InputEventKey) -> String:
|
|
115
|
+
var prefix := ""
|
|
116
|
+
if event.ctrl_pressed:
|
|
117
|
+
prefix += _MOD_TOKENS[KEY_MASK_CTRL] + "+"
|
|
118
|
+
if event.shift_pressed:
|
|
119
|
+
prefix += _MOD_TOKENS[KEY_MASK_SHIFT] + "+"
|
|
120
|
+
if event.alt_pressed:
|
|
121
|
+
prefix += _MOD_TOKENS[KEY_MASK_ALT] + "+"
|
|
122
|
+
if event.meta_pressed:
|
|
123
|
+
prefix += _MOD_TOKENS[KEY_MASK_META] + "+"
|
|
124
|
+
|
|
125
|
+
if event.keycode != KEY_NONE:
|
|
126
|
+
var base := OS.get_keycode_string(event.keycode)
|
|
127
|
+
return prefix + (base if not base.is_empty() else "Key %d" % int(event.keycode))
|
|
128
|
+
if event.physical_keycode != KEY_NONE:
|
|
129
|
+
var pbase := OS.get_keycode_string(event.physical_keycode)
|
|
130
|
+
return prefix + (pbase if not pbase.is_empty() else "Key %d" % int(event.physical_keycode)) + " (physical)"
|
|
131
|
+
# Last resort: an event with neither keycode set (e.g. unicode-only).
|
|
132
|
+
var label := prefix.trim_suffix("+")
|
|
133
|
+
return label if not label.is_empty() else "(unset)"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
uid://blya2h0lff4ar
|
|
@@ -298,13 +298,19 @@ var _held_actions: Dictionary = {}
|
|
|
298
298
|
# Input singletons (is_joy_button_pressed / get_joy_axis) until game restart.
|
|
299
299
|
var _held_joy_buttons: Dictionary = {}
|
|
300
300
|
var _active_axes: Dictionary = {}
|
|
301
|
+
# Same guarantee for raw keys (#290), keyed by "physical:code". Refcounted: a
|
|
302
|
+
# combo presses each modifier as its own key, and overlapping entries can hold
|
|
303
|
+
# the same key more than once, so the entry tracks a press COUNT and the engine
|
|
304
|
+
# release only fires when it returns to zero. Stores primitives only ({count,
|
|
305
|
+
# physical, code, mask}) so the cleanup loop never touches a freed instance.
|
|
306
|
+
var _held_keys: Dictionary = {}
|
|
301
307
|
|
|
302
308
|
|
|
303
|
-
# Release any action/button still held and re-zero any active axis from an
|
|
309
|
+
# Release any action/button/key still held and re-zero any active axis from an
|
|
304
310
|
# interrupted sequence. A release here is a guaranteed cleanup, never a queued
|
|
305
311
|
# step that a clear could drop. Safe to call when nothing is held.
|
|
306
312
|
func _release_held_actions() -> void:
|
|
307
|
-
if _held_actions.is_empty() and _held_joy_buttons.is_empty() and _active_axes.is_empty():
|
|
313
|
+
if _held_actions.is_empty() and _held_joy_buttons.is_empty() and _active_axes.is_empty() and _held_keys.is_empty():
|
|
308
314
|
return
|
|
309
315
|
for action in _held_actions.keys():
|
|
310
316
|
var release := InputEventAction.new()
|
|
@@ -326,12 +332,16 @@ func _release_held_actions() -> void:
|
|
|
326
332
|
azero.axis = int(ainfo["axis"]) as JoyAxis
|
|
327
333
|
azero.axis_value = 0.0
|
|
328
334
|
Input.parse_input_event(azero)
|
|
335
|
+
for kkey in _held_keys.keys():
|
|
336
|
+
var kinfo = _held_keys[kkey]
|
|
337
|
+
Input.parse_input_event(_make_key_event(bool(kinfo["physical"]), int(kinfo["code"]), int(kinfo["mask"]), false))
|
|
329
338
|
# Flush so the release takes effect immediately — _exit_tree may not get
|
|
330
339
|
# another frame, and a cleanup should be deterministic, not deferred.
|
|
331
340
|
Input.flush_buffered_events()
|
|
332
341
|
_held_actions.clear()
|
|
333
342
|
_held_joy_buttons.clear()
|
|
334
343
|
_active_axes.clear()
|
|
344
|
+
_held_keys.clear()
|
|
335
345
|
|
|
336
346
|
|
|
337
347
|
func _on_debugger_message(message: String, data: Array) -> bool:
|
|
@@ -1166,15 +1176,7 @@ func _handle_get_input_map() -> void:
|
|
|
1166
1176
|
|
|
1167
1177
|
func _event_to_string(event: InputEvent) -> String:
|
|
1168
1178
|
if event is InputEventKey:
|
|
1169
|
-
|
|
1170
|
-
var key_name := OS.get_keycode_string(key_event.keycode)
|
|
1171
|
-
if key_event.ctrl_pressed:
|
|
1172
|
-
key_name = "Ctrl+" + key_name
|
|
1173
|
-
if key_event.alt_pressed:
|
|
1174
|
-
key_name = "Alt+" + key_name
|
|
1175
|
-
if key_event.shift_pressed:
|
|
1176
|
-
key_name = "Shift+" + key_name
|
|
1177
|
-
return key_name
|
|
1179
|
+
return MCPKeyNames.event_string(event as InputEventKey)
|
|
1178
1180
|
elif event is InputEventMouseButton:
|
|
1179
1181
|
var mouse_event := event as InputEventMouseButton
|
|
1180
1182
|
match mouse_event.button_index:
|
|
@@ -1194,6 +1196,9 @@ func _event_to_string(event: InputEvent) -> String:
|
|
|
1194
1196
|
# binding straight into an injection (e.g. move_left = left_x, value -1.0).
|
|
1195
1197
|
var joy_motion := event as InputEventJoypadMotion
|
|
1196
1198
|
return "Joypad Axis %d (%s, value %+.1f)" % [joy_motion.axis, MCPJoyNames.axis_name(joy_motion.axis), joy_motion.axis_value]
|
|
1199
|
+
elif event is InputEventMouseMotion:
|
|
1200
|
+
var mouse_motion := event as InputEventMouseMotion
|
|
1201
|
+
return "Mouse Motion (rel %+.1f, %+.1f)" % [mouse_motion.relative.x, mouse_motion.relative.y]
|
|
1197
1202
|
return event.as_text()
|
|
1198
1203
|
|
|
1199
1204
|
|
|
@@ -1206,7 +1211,7 @@ func _handle_execute_input_sequence(data: Array) -> void:
|
|
|
1206
1211
|
# Reset the skew echo up front: the result's input_kinds must reflect THIS
|
|
1207
1212
|
# call's compile, never a stale value from a prior sequence (its absence is
|
|
1208
1213
|
# how a new server detects an old bridge — a stale dict would mask that).
|
|
1209
|
-
_sequence_input_kinds =
|
|
1214
|
+
_sequence_input_kinds = _new_input_kinds()
|
|
1210
1215
|
|
|
1211
1216
|
if inputs.is_empty():
|
|
1212
1217
|
EngineDebugger.send_message("godot_mcp:input_sequence_result", [{
|
|
@@ -1378,6 +1383,12 @@ const STEP_MAX_FRAMES := 1200
|
|
|
1378
1383
|
const STEP_WALL_BUDGET_MS := 25000
|
|
1379
1384
|
const STEP_MAX_TRANSITIONS := 50
|
|
1380
1385
|
const FREEZE_CONTESTED_THRESHOLD := 10
|
|
1386
|
+
# Cap on the sub-events one mouse-look sweep entry expands into. Without it a
|
|
1387
|
+
# max-span sweep (duration_ms 40000) would emit ceil(40000/16) ~= 2500 events for
|
|
1388
|
+
# a single entry; 256 keeps ~16ms (60Hz) granularity up to ~4s and coarsens beyond
|
|
1389
|
+
# that. The last chunk absorbs the remainder regardless of n, so the summed delta
|
|
1390
|
+
# is unchanged — only temporal smoothness past the cap degrades.
|
|
1391
|
+
const LOOK_MAX_SUBEVENTS := 256
|
|
1381
1392
|
|
|
1382
1393
|
var _frozen := false
|
|
1383
1394
|
var _game_paused := false # the game layer's own pause intent, inferred by observation
|
|
@@ -1522,7 +1533,7 @@ func _handle_game_time_step(data: Array) -> void:
|
|
|
1522
1533
|
|
|
1523
1534
|
# Reset the skew echo up front (see _handle_execute_input_sequence): the
|
|
1524
1535
|
# step result's input_kinds must reflect this call, never a prior step's.
|
|
1525
|
-
_step_input_kinds =
|
|
1536
|
+
_step_input_kinds = _new_input_kinds()
|
|
1526
1537
|
|
|
1527
1538
|
var duration_ms: int = int(params.get("duration_ms", 0))
|
|
1528
1539
|
var frames: int = int(params.get("frames", 0))
|
|
@@ -1575,17 +1586,25 @@ func _handle_game_time_step(data: Array) -> void:
|
|
|
1575
1586
|
_update_processing()
|
|
1576
1587
|
|
|
1577
1588
|
|
|
1589
|
+
func _new_input_kinds() -> Dictionary:
|
|
1590
|
+
# One source of truth for the input_kinds shape so every reset/result site
|
|
1591
|
+
# carries the same keys (#290 added "key", #294 added "look"). A missing key
|
|
1592
|
+
# here would make the server's skew check misfire against our own bridge.
|
|
1593
|
+
return {"action": 0, "joy_button": 0, "axis": 0, "key": 0, "look": 0}
|
|
1594
|
+
|
|
1595
|
+
|
|
1578
1596
|
func _compile_input_events(inputs: Array) -> Dictionary:
|
|
1579
1597
|
# Builds the typed input timeline shared by input sequences and game-time
|
|
1580
|
-
# steps (#233). Each entry is discriminated by which key it carries:
|
|
1581
|
-
# `axis` (analog joypad axis), `joy_button`,
|
|
1582
|
-
# fractional `strength`). Returns
|
|
1583
|
-
# {"error": ...} on an unknown
|
|
1598
|
+
# steps (#233/#290). Each entry is discriminated by which key it carries:
|
|
1599
|
+
# `axis` (analog joypad axis), `joy_button`, `key` (raw keyboard / modifier
|
|
1600
|
+
# combo), or `action_name` (with optional fractional `strength`). Returns
|
|
1601
|
+
# {"events": [...], "kinds": {...}} or {"error": ...} on an unknown
|
|
1602
|
+
# action/button/axis/key. Every event carries:
|
|
1584
1603
|
# time - ms offset from sequence/window start
|
|
1585
1604
|
# phase - 0 = release/zero-set, 1 = press/set (the equal-time tie-break)
|
|
1586
1605
|
# complete - completion credit, counted when the event fires (1 on ends)
|
|
1587
1606
|
var events: Array = []
|
|
1588
|
-
var kinds :=
|
|
1607
|
+
var kinds := _new_input_kinds()
|
|
1589
1608
|
for input in inputs:
|
|
1590
1609
|
var start_ms: int = int(input.get("start_ms", 0))
|
|
1591
1610
|
var dur: int = int(input.get("duration_ms", 0))
|
|
@@ -1616,6 +1635,66 @@ func _compile_input_events(inputs: Array) -> Dictionary:
|
|
|
1616
1635
|
"kind": "joy_button", "button": button, "device": bdevice, "is_press": true})
|
|
1617
1636
|
events.append({"time": end_ms, "phase": 0, "complete": 1,
|
|
1618
1637
|
"kind": "joy_button", "button": button, "device": bdevice, "is_press": false})
|
|
1638
|
+
elif input.has("key"):
|
|
1639
|
+
var parsed := MCPKeyNames.parse(input["key"])
|
|
1640
|
+
var code: int = int(parsed["code"])
|
|
1641
|
+
if code == KEY_NONE:
|
|
1642
|
+
return {"error": "Unknown key: %s (e.g. \"a\", \"escape\", \"ctrl+s\", \"shift+f1\")" % str(input["key"])}
|
|
1643
|
+
var mask: int = int(parsed["mask"])
|
|
1644
|
+
var physical: bool = bool(input.get("physical", false))
|
|
1645
|
+
kinds["key"] += 1
|
|
1646
|
+
# Each modifier is pressed/released as its own real key so polled
|
|
1647
|
+
# is_key_pressed(KEY_CTRL) reads true (the modifier FLAG on another
|
|
1648
|
+
# event does not update that singleton). The base event also carries
|
|
1649
|
+
# the modifier flags so InputMap chords and _input handlers match.
|
|
1650
|
+
# Modifier keys are position-stable -> set both keycode+physical (mask
|
|
1651
|
+
# 0, an exact match for a bare-modifier binding); the base honors
|
|
1652
|
+
# `physical`. Completion credit (1) rides only the base release.
|
|
1653
|
+
var mod_keys := MCPKeyNames.modifier_key_indices(mask)
|
|
1654
|
+
for mk in mod_keys:
|
|
1655
|
+
events.append({"time": start_ms, "phase": 1, "complete": 0,
|
|
1656
|
+
"kind": "key", "code": int(mk), "physical": false, "mask": 0, "is_press": true})
|
|
1657
|
+
events.append({"time": start_ms, "phase": 1, "complete": 0,
|
|
1658
|
+
"kind": "key", "code": code, "physical": physical, "mask": mask, "is_press": true})
|
|
1659
|
+
events.append({"time": end_ms, "phase": 0, "complete": 1,
|
|
1660
|
+
"kind": "key", "code": code, "physical": physical, "mask": mask, "is_press": false})
|
|
1661
|
+
for mk in mod_keys:
|
|
1662
|
+
events.append({"time": end_ms, "phase": 0, "complete": 0,
|
|
1663
|
+
"kind": "key", "code": int(mk), "physical": false, "mask": 0, "is_press": false})
|
|
1664
|
+
elif input.has("look"):
|
|
1665
|
+
var look_val: Variant = input["look"]
|
|
1666
|
+
if not (look_val is Array) or (look_val as Array).size() != 2:
|
|
1667
|
+
return {"error": "look expects [dx, dy] (two numbers), got %s" % str(look_val)}
|
|
1668
|
+
# Validate element types before casting, matching every other kind's clean
|
|
1669
|
+
# error-dict contract: float() of a nested array throws an uncaught script
|
|
1670
|
+
# error, and float() of a bool/string would silently coerce to a wrong value.
|
|
1671
|
+
var lx: Variant = (look_val as Array)[0]
|
|
1672
|
+
var ly: Variant = (look_val as Array)[1]
|
|
1673
|
+
if not (lx is float or lx is int) or not (ly is float or ly is int):
|
|
1674
|
+
return {"error": "look expects [dx, dy] (two numbers), got %s" % str(look_val)}
|
|
1675
|
+
var dx: float = float(lx)
|
|
1676
|
+
var dy: float = float(ly)
|
|
1677
|
+
kinds["look"] += 1
|
|
1678
|
+
# Relative mouse-look is STATELESS (no hold/release/refcount): a snap-turn
|
|
1679
|
+
# (dur < 16) is ONE motion event carrying the whole delta; a longer sweep is
|
|
1680
|
+
# N = ceil(dur/16) motion events (~16ms/chunk = 60Hz, capped at
|
|
1681
|
+
# LOOK_MAX_SUBEVENTS) spaced across the window, each carrying delta/N. The
|
|
1682
|
+
# last chunk absorbs the float remainder so the chunks sum to the delta
|
|
1683
|
+
# (exact in float64; the delivered Vector2 is float32, so a very large sweep
|
|
1684
|
+
# drifts sub-pixel — imperceptible). Motion is additive, so if several
|
|
1685
|
+
# sub-events coalesce into one frame on a slow frame or a big step dt, the
|
|
1686
|
+
# summed delta is unchanged — only the temporal smoothness degrades.
|
|
1687
|
+
var n: int = clampi(int(ceil(float(dur) / 16.0)), 1, LOOK_MAX_SUBEVENTS)
|
|
1688
|
+
var chunk_x: float = dx / float(n)
|
|
1689
|
+
var chunk_y: float = dy / float(n)
|
|
1690
|
+
for i in n:
|
|
1691
|
+
var ex: float = chunk_x
|
|
1692
|
+
var ey: float = chunk_y
|
|
1693
|
+
if i == n - 1:
|
|
1694
|
+
ex = dx - chunk_x * float(n - 1)
|
|
1695
|
+
ey = dy - chunk_y * float(n - 1)
|
|
1696
|
+
events.append({"time": start_ms + (i * dur) / n, "phase": 1,
|
|
1697
|
+
"complete": (1 if i == n - 1 else 0), "kind": "look", "dx": ex, "dy": ey})
|
|
1619
1698
|
else:
|
|
1620
1699
|
var action_name: String = input.get("action_name", "")
|
|
1621
1700
|
if action_name.is_empty():
|
|
@@ -1667,10 +1746,10 @@ func _cancel_redundant_axis_zeroes(events: Array) -> void:
|
|
|
1667
1746
|
func _inject_timeline_event(ev: Dictionary) -> int:
|
|
1668
1747
|
# Build and parse the engine event for one timeline entry, maintaining the
|
|
1669
1748
|
# held-state registries that _release_held_actions uses for guaranteed
|
|
1670
|
-
# cleanup. Returns the event's completion credit. Joypad events drive
|
|
1671
|
-
# polled Input singletons too (get_joy_axis / is_joy_button_pressed
|
|
1672
|
-
# the mouse cursor, parse_input_event updates
|
|
1673
|
-
# with no physical pad required.
|
|
1749
|
+
# cleanup. Returns the event's completion credit. Joypad and key events drive
|
|
1750
|
+
# the polled Input singletons too (get_joy_axis / is_joy_button_pressed /
|
|
1751
|
+
# is_key_pressed): unlike the mouse cursor, parse_input_event updates that
|
|
1752
|
+
# state for any device id with no physical pad/keyboard required.
|
|
1674
1753
|
match str(ev.kind):
|
|
1675
1754
|
"action":
|
|
1676
1755
|
var ae := InputEventAction.new()
|
|
@@ -1704,9 +1783,81 @@ func _inject_timeline_event(ev: Dictionary) -> int:
|
|
|
1704
1783
|
_active_axes[akey] = {"device": ev.device, "axis": ev.axis}
|
|
1705
1784
|
else:
|
|
1706
1785
|
_active_axes.erase(akey)
|
|
1786
|
+
"key":
|
|
1787
|
+
var code: int = int(ev.code)
|
|
1788
|
+
var physical: bool = bool(ev.physical)
|
|
1789
|
+
var kkey := "%d:%d" % [int(physical), code]
|
|
1790
|
+
# Refcount: a combo presses each modifier as its own key, and
|
|
1791
|
+
# overlapping entries can hold the same key more than once. Drive the
|
|
1792
|
+
# engine only on the 0<->1 edge so an inner release never turns a
|
|
1793
|
+
# still-held key off (the early-release bug), and the registry mirrors
|
|
1794
|
+
# the real pressed state for guaranteed cleanup.
|
|
1795
|
+
# Keyed by (physical, code) only, NOT mask: two overlapping combos that
|
|
1796
|
+
# share a base key but differ in modifiers (e.g. ctrl+s and shift+s)
|
|
1797
|
+
# collapse to one entry, so the shared base event reflects the FIRST
|
|
1798
|
+
# combo's modifier flags. The polled key state stays correct (one key,
|
|
1799
|
+
# refcounted, no early release); only the base event's flags differ for
|
|
1800
|
+
# that exotic overlap. Keying by mask instead would split them and
|
|
1801
|
+
# reintroduce an early release of the shared base key — the worse bug.
|
|
1802
|
+
if ev.is_press:
|
|
1803
|
+
if _held_keys.has(kkey):
|
|
1804
|
+
_held_keys[kkey]["count"] = int(_held_keys[kkey]["count"]) + 1
|
|
1805
|
+
else:
|
|
1806
|
+
_held_keys[kkey] = {"count": 1, "physical": physical, "code": code, "mask": int(ev.mask)}
|
|
1807
|
+
Input.parse_input_event(_make_key_event(physical, code, int(ev.mask), true))
|
|
1808
|
+
elif _held_keys.has(kkey):
|
|
1809
|
+
var n := int(_held_keys[kkey]["count"]) - 1
|
|
1810
|
+
if n <= 0:
|
|
1811
|
+
_held_keys.erase(kkey)
|
|
1812
|
+
Input.parse_input_event(_make_key_event(physical, code, int(ev.mask), false))
|
|
1813
|
+
else:
|
|
1814
|
+
_held_keys[kkey]["count"] = n
|
|
1815
|
+
"look":
|
|
1816
|
+
# Relative mouse-look is stateless: each event delivers its delta to
|
|
1817
|
+
# _input/_unhandled_input and leaves NO held state to clean up (no
|
|
1818
|
+
# registry, no guaranteed release). Set both relative and screen_relative
|
|
1819
|
+
# to the delta — emulating a real mouse moving [dx,dy] SCREEN pixels: the
|
|
1820
|
+
# engine scales the DELIVERED event.relative by the viewport's input
|
|
1821
|
+
# transform on dispatch (identity for default/3D projects, so an FPS
|
|
1822
|
+
# camera integrates exactly [dx,dy]; a 2D content-scale stretch scales it,
|
|
1823
|
+
# as it would a physical mouse), while event.screen_relative stays the raw
|
|
1824
|
+
# delta. position is the current cursor spot for a well-formed event
|
|
1825
|
+
# (irrelevant under capture). The game owns mouse mode, not the bridge.
|
|
1826
|
+
var mm := InputEventMouseMotion.new()
|
|
1827
|
+
var delta := Vector2(float(ev.dx), float(ev.dy))
|
|
1828
|
+
mm.relative = delta
|
|
1829
|
+
mm.screen_relative = delta
|
|
1830
|
+
var vp := get_viewport()
|
|
1831
|
+
var pos := vp.get_mouse_position() if vp != null else Vector2.ZERO
|
|
1832
|
+
mm.position = pos
|
|
1833
|
+
mm.global_position = pos
|
|
1834
|
+
Input.parse_input_event(mm)
|
|
1707
1835
|
return int(ev.get("complete", 0))
|
|
1708
1836
|
|
|
1709
1837
|
|
|
1838
|
+
# Build an InputEventKey. A logical key sets both keycode and physical_keycode
|
|
1839
|
+
# (a realistic US-layout event that drives is_key_pressed AND is_physical_key_pressed
|
|
1840
|
+
# plus either binding kind); physical:true sends a physical-only event (keycode
|
|
1841
|
+
# unset) for layout-independent / physical-keycode-binding testing.
|
|
1842
|
+
func _make_key_event(physical: bool, code: int, mask: int, pressed: bool) -> InputEventKey:
|
|
1843
|
+
var ke := InputEventKey.new()
|
|
1844
|
+
if physical:
|
|
1845
|
+
ke.physical_keycode = code as Key
|
|
1846
|
+
else:
|
|
1847
|
+
ke.keycode = code as Key
|
|
1848
|
+
ke.physical_keycode = code as Key
|
|
1849
|
+
_apply_key_modifiers(ke, mask)
|
|
1850
|
+
ke.pressed = pressed
|
|
1851
|
+
return ke
|
|
1852
|
+
|
|
1853
|
+
|
|
1854
|
+
func _apply_key_modifiers(ke: InputEventKey, mask: int) -> void:
|
|
1855
|
+
ke.ctrl_pressed = (mask & int(KEY_MASK_CTRL)) != 0
|
|
1856
|
+
ke.shift_pressed = (mask & int(KEY_MASK_SHIFT)) != 0
|
|
1857
|
+
ke.alt_pressed = (mask & int(KEY_MASK_ALT)) != 0
|
|
1858
|
+
ke.meta_pressed = (mask & int(KEY_MASK_META)) != 0
|
|
1859
|
+
|
|
1860
|
+
|
|
1710
1861
|
func _build_predicate_context() -> Dictionary:
|
|
1711
1862
|
# Exposes the running game to a step_until predicate: every autoload by its
|
|
1712
1863
|
# own name (so `G.wave > 1` just works), plus `tree` (SceneTree) and `root`
|
|
@@ -1784,7 +1935,7 @@ func _handle_game_time_step_until(data: Array) -> void:
|
|
|
1784
1935
|
return
|
|
1785
1936
|
|
|
1786
1937
|
# Reset the skew echo up front (see _handle_execute_input_sequence).
|
|
1787
|
-
_step_input_kinds =
|
|
1938
|
+
_step_input_kinds = _new_input_kinds()
|
|
1788
1939
|
|
|
1789
1940
|
var src: String = str(params.get("until", "")).strip_edges()
|
|
1790
1941
|
if src.is_empty():
|
|
@@ -1944,7 +2095,7 @@ func _step_process(delta: float) -> void:
|
|
|
1944
2095
|
func _finish_step() -> void:
|
|
1945
2096
|
# Releases are guaranteed cleanup, never queued steps: no holds survive
|
|
1946
2097
|
# across the freeze boundary (cross-step holds are a deliberate non-goal).
|
|
1947
|
-
var forced := _held_actions.size() + _held_joy_buttons.size() + _active_axes.size()
|
|
2098
|
+
var forced := _held_actions.size() + _held_joy_buttons.size() + _active_axes.size() + _held_keys.size()
|
|
1948
2099
|
_release_held_actions()
|
|
1949
2100
|
var dropped := _step_events.size()
|
|
1950
2101
|
_step_events.clear()
|
package/addon/plugin.cfg
CHANGED
|
@@ -152,6 +152,76 @@ describe('game_time tool', () => {
|
|
|
152
152
|
expect(data.warnings).toHaveLength(1);
|
|
153
153
|
expect(data.warnings[0]).toContain('predates controller injection');
|
|
154
154
|
});
|
|
155
|
+
it('accepts raw key entries, passes them through verbatim, and surfaces a key count (#290)', async () => {
|
|
156
|
+
mock.mockResponse({
|
|
157
|
+
completed: true, frozen: true, elapsed_ms: 500, gameplay_ms: 500,
|
|
158
|
+
frames: 30, physics_ticks: 30, game_paused: false, events_fired: 2,
|
|
159
|
+
input_kinds: { action: 0, joy_button: 0, axis: 0, key: 1 },
|
|
160
|
+
});
|
|
161
|
+
const ctx = createToolContext(mock);
|
|
162
|
+
const result = await gameTime.execute({
|
|
163
|
+
action: 'step',
|
|
164
|
+
duration_ms: 500,
|
|
165
|
+
inputs: [{ key: 'ctrl+s', start_ms: 100, duration_ms: 50 }],
|
|
166
|
+
}, ctx);
|
|
167
|
+
expect(mock.calls[0].params.inputs).toEqual([
|
|
168
|
+
{ key: 'ctrl+s', start_ms: 100, duration_ms: 50 },
|
|
169
|
+
]);
|
|
170
|
+
const data = structuredOf(result);
|
|
171
|
+
expect(data.input_kinds).toEqual({ action: 0, joy_button: 0, axis: 0, key: 1 });
|
|
172
|
+
expect(data.warnings).toEqual([]);
|
|
173
|
+
});
|
|
174
|
+
it('warns in the structured result when key entries hit a bridge with no key count (#290)', async () => {
|
|
175
|
+
mock.mockResponse({
|
|
176
|
+
completed: true, frozen: true, elapsed_ms: 500, gameplay_ms: 500,
|
|
177
|
+
frames: 30, physics_ticks: 30, game_paused: false,
|
|
178
|
+
input_kinds: { action: 0, joy_button: 0, axis: 0 },
|
|
179
|
+
});
|
|
180
|
+
const ctx = createToolContext(mock);
|
|
181
|
+
const result = await gameTime.execute({
|
|
182
|
+
action: 'step',
|
|
183
|
+
duration_ms: 500,
|
|
184
|
+
inputs: [{ key: 'escape', start_ms: 0, duration_ms: 50 }],
|
|
185
|
+
}, ctx);
|
|
186
|
+
const data = structuredOf(result);
|
|
187
|
+
expect(data.warnings).toHaveLength(1);
|
|
188
|
+
expect(data.warnings[0]).toContain('predates raw-key injection');
|
|
189
|
+
});
|
|
190
|
+
it('accepts look entries, passes them through verbatim, and surfaces a look count (#294)', async () => {
|
|
191
|
+
mock.mockResponse({
|
|
192
|
+
completed: true, frozen: true, elapsed_ms: 500, gameplay_ms: 500,
|
|
193
|
+
frames: 30, physics_ticks: 30, game_paused: false, events_fired: 5,
|
|
194
|
+
input_kinds: { action: 0, joy_button: 0, axis: 0, key: 0, look: 1 },
|
|
195
|
+
});
|
|
196
|
+
const ctx = createToolContext(mock);
|
|
197
|
+
const result = await gameTime.execute({
|
|
198
|
+
action: 'step',
|
|
199
|
+
duration_ms: 500,
|
|
200
|
+
inputs: [{ look: [200, 0], start_ms: 0, duration_ms: 80 }],
|
|
201
|
+
}, ctx);
|
|
202
|
+
expect(mock.calls[0].params.inputs).toEqual([
|
|
203
|
+
{ look: [200, 0], start_ms: 0, duration_ms: 80 },
|
|
204
|
+
]);
|
|
205
|
+
const data = structuredOf(result);
|
|
206
|
+
expect(data.input_kinds).toEqual({ action: 0, joy_button: 0, axis: 0, key: 0, look: 1 });
|
|
207
|
+
expect(data.warnings).toEqual([]);
|
|
208
|
+
});
|
|
209
|
+
it('warns in the structured result when look entries hit a bridge with no look count (#294)', async () => {
|
|
210
|
+
mock.mockResponse({
|
|
211
|
+
completed: true, frozen: true, elapsed_ms: 500, gameplay_ms: 500,
|
|
212
|
+
frames: 30, physics_ticks: 30, game_paused: false,
|
|
213
|
+
input_kinds: { action: 0, joy_button: 0, axis: 0, key: 0 },
|
|
214
|
+
});
|
|
215
|
+
const ctx = createToolContext(mock);
|
|
216
|
+
const result = await gameTime.execute({
|
|
217
|
+
action: 'step',
|
|
218
|
+
duration_ms: 500,
|
|
219
|
+
inputs: [{ look: [100, 0], start_ms: 0, duration_ms: 50 }],
|
|
220
|
+
}, ctx);
|
|
221
|
+
const data = structuredOf(result);
|
|
222
|
+
expect(data.warnings).toHaveLength(1);
|
|
223
|
+
expect(data.warnings[0]).toContain('predates mouse-look injection');
|
|
224
|
+
});
|
|
155
225
|
it('derives the per-request timeout and pushes the relay/wall budgets to the bridge (#276)', async () => {
|
|
156
226
|
mock.mockResponse({
|
|
157
227
|
completed: true, frozen: true, elapsed_ms: 500, gameplay_ms: 500,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-time.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/game-time.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"game-time.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/game-time.test.ts"],"names":[],"mappings":"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"}
|