fix(client): resolve WASD freezes, warnings, and chime spam
- bug_report_dialog: release_focus() before queue_free() prevents stale focus on ModalLayer blocking input to lower layers - dialogue_box: clear dialogue_active immediately on conversation end instead of holding for entry_lifetime - main.gd: permanent entity ID tracking per room stops recognition chime re-triggering when NPCs oscillate in/out of fog queue - audio_manager: correct path res://audio/ to res://assets/audio/ - world_radial.tscn: anchors_preset 15 to 0 (script sets size) - bug_report_dialog: push_warning to print (informational) - debug_overlay: max() to maxi() for integer line count - monologue_display: remove unnecessary Tween cast Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -44,7 +44,7 @@ const FILTER_CUTOFF_DEFAULT := 20500.0
|
|||||||
# --- D-073: Zone crossfade constants ---
|
# --- D-073: Zone crossfade constants ---
|
||||||
const CROSSFADE_DURATION := 1.8 # D-073: 1.5-2s spec, mid-range
|
const CROSSFADE_DURATION := 1.8 # D-073: 1.5-2s spec, mid-range
|
||||||
|
|
||||||
# Maps server zone_id strings to ambient asset keys (filenames in res://audio/).
|
# Maps server zone_id strings to ambient asset keys (filenames in res://assets/audio/).
|
||||||
# Hub and Workplace intentionally share the same ambient layer (amb_hub_layer) —
|
# Hub and Workplace intentionally share the same ambient layer (amb_hub_layer) —
|
||||||
# they are the same location type, so hub→workplace transition is a same-asset no-op
|
# they are the same location type, so hub→workplace transition is a same-asset no-op
|
||||||
# (old_asset != new_asset guard skips the fade-out). Sprint brief consolidates
|
# (old_asset != new_asset guard skips the fade-out). Sprint brief consolidates
|
||||||
@@ -112,15 +112,15 @@ func _setup_buses() -> void:
|
|||||||
# --- Asset registry (D-068 directory-scan pattern) ---
|
# --- Asset registry (D-068 directory-scan pattern) ---
|
||||||
|
|
||||||
func _scan_registry() -> void:
|
func _scan_registry() -> void:
|
||||||
_scan_dir("res://audio/")
|
_scan_dir("res://assets/audio/")
|
||||||
print("AudioManager: %d assets registered" % _registry.size())
|
print("AudioManager: %d assets registered" % _registry.size())
|
||||||
|
|
||||||
|
|
||||||
func _scan_dir(path: String) -> void:
|
func _scan_dir(path: String) -> void:
|
||||||
var dir := DirAccess.open(path)
|
var dir := DirAccess.open(path)
|
||||||
if dir == null:
|
if dir == null:
|
||||||
if path == "res://audio/":
|
if path == "res://assets/audio/":
|
||||||
print("AudioManager: res://audio/ not found — all play methods no-op")
|
print("AudioManager: res://assets/audio/ not found — all play methods no-op")
|
||||||
return
|
return
|
||||||
dir.list_dir_begin()
|
dir.list_dir_begin()
|
||||||
var file_name := dir.get_next()
|
var file_name := dir.get_next()
|
||||||
@@ -197,7 +197,7 @@ func stop_all_loops() -> void:
|
|||||||
|
|
||||||
# --- Audio asset registry: event type → asset key (D-018, #125) ---
|
# --- Audio asset registry: event type → asset key (D-018, #125) ---
|
||||||
# Maps server-sent sound event_type strings to audio asset keys.
|
# Maps server-sent sound event_type strings to audio asset keys.
|
||||||
# Keys match filename stems in res://audio/ (scanned by _scan_registry).
|
# Keys match filename stems in res://assets/audio/ (scanned by _scan_registry).
|
||||||
# Audio assets per D-038: footstep variants (walk / run), NPC murmur (D-072, #532).
|
# Audio assets per D-038: footstep variants (walk / run), NPC murmur (D-072, #532).
|
||||||
# Missing assets no-op gracefully (D-038 fallback pattern).
|
# Missing assets no-op gracefully (D-038 fallback pattern).
|
||||||
const SOUND_EVENT_ASSETS: Dictionary = {
|
const SOUND_EVENT_ASSETS: Dictionary = {
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ func _draw() -> void:
|
|||||||
var header_w := font.get_string_size(header_text, HORIZONTAL_ALIGNMENT_LEFT, -1, FONT_SIZE + 1).x
|
var header_w := font.get_string_size(header_text, HORIZONTAL_ALIGNMENT_LEFT, -1, FONT_SIZE + 1).x
|
||||||
var content_w := left_label_w + left_value_w + COL_GAP + right_label_w + right_value_w
|
var content_w := left_label_w + left_value_w + COL_GAP + right_label_w + right_value_w
|
||||||
var box_w: float = max(header_w, content_w) + PADDING.x * 2
|
var box_w: float = max(header_w, content_w) + PADDING.x * 2
|
||||||
var line_count := max(left_lines.size(), right_lines.size())
|
var line_count: int = maxi(left_lines.size(), right_lines.size())
|
||||||
var box_h: float = PADDING.y * 2 + LINE_HEIGHT + LINE_HEIGHT * line_count # header + data lines
|
var box_h: float = PADDING.y * 2 + LINE_HEIGHT + LINE_HEIGHT * line_count # header + data lines
|
||||||
|
|
||||||
# Background
|
# Background
|
||||||
|
|||||||
@@ -243,6 +243,7 @@ func _close() -> void:
|
|||||||
_active = false
|
_active = false
|
||||||
visible = false
|
visible = false
|
||||||
if _line_edit:
|
if _line_edit:
|
||||||
|
_line_edit.release_focus()
|
||||||
_line_edit.queue_free()
|
_line_edit.queue_free()
|
||||||
_line_edit = null
|
_line_edit = null
|
||||||
|
|
||||||
@@ -344,7 +345,7 @@ func _save_report(description: String) -> void:
|
|||||||
else:
|
else:
|
||||||
push_error("BugReport: failed to write %s" % seed_path)
|
push_error("BugReport: failed to write %s" % seed_path)
|
||||||
|
|
||||||
push_warning("BugReport: saved %d/6 files to %s (ring: %d ticks)" % [
|
print("BugReport: saved %d/6 files to %s (ring: %d ticks)" % [
|
||||||
files_saved, base_path, _input_count])
|
files_saved, base_path, _input_count])
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ func _show_line(text: String, duration: float, priority: int, is_urgent: bool, l
|
|||||||
node = line_node,
|
node = line_node,
|
||||||
expire_timer = maxf(duration, MIN_DURATION), # clamp: survives own fade-in
|
expire_timer = maxf(duration, MIN_DURATION), # clamp: survives own fade-in
|
||||||
priority = priority,
|
priority = priority,
|
||||||
tween = null as Tween,
|
tween = null,
|
||||||
}
|
}
|
||||||
_visible.append(slot)
|
_visible.append(slot)
|
||||||
_next_fade_in_msec = float(Time.get_ticks_msec()) + STAGGER_SEC * 1000.0
|
_next_fade_in_msec = float(Time.get_ticks_msec()) + STAGGER_SEC * 1000.0
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
; D-058: World radial menu — right-click, 2 spokes (Observe + Insert)
|
; D-058: World radial menu — right-click, 2 spokes (Observe + Insert)
|
||||||
[node name="WorldRadial" type="Control"]
|
[node name="WorldRadial" type="Control"]
|
||||||
layout_mode = 3
|
layout_mode = 3
|
||||||
anchors_preset = 15
|
anchors_preset = 0
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
grow_horizontal = 2
|
grow_horizontal = 2
|
||||||
|
|||||||
Reference in New Issue
Block a user