From d6acefdfa8eef61f75ace711009f7f512f3001b4 Mon Sep 17 00:00:00 2001 From: Dmitrii Bykov Date: Sun, 24 May 2026 19:28:09 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=B8=D0=B7=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=88=D1=83=D0=BC=D0=B0=20+=20=D0=BA=D0=BB=D0=B8?= =?UTF-8?q?=D0=BA-=D1=84=D0=B8=D0=B4=D0=B1=D0=B5=D0=BA=20+=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B7=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B2=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ЛОГИЧЕСКАЯ ЦЕПОЧКА: 1. Player FPV видит placeholder-кубы вблизи. 2. Без нормальных моделей мелкие предметы (носки, банка, обёртка, плант, чашка, BILLY-шкаф) превращаются в визуальный мусор. 3. User теряет ориентацию: «что это за блоки?». Игра кажется недо- деланной. 4. Решение: убрать всё что НЕ читается, оставить только узнаваемые объекты. Лучше меньше но чисто, чем много но мусор. УБРАНО (visible=false в act1.gd._hide_noise_items): - Shelf (BILLY-шкаф) — солидный белый блок, не читается как стеллаж - Sock1, Sock2 — носки на полу, неузнаваемы - Desk/AdrenalineCan — цилиндр со штрихами, не читается как банка - Desk/LaysWrapper — жёлтый блок, не читается как обёртка - Desk/Keyboard — плоский бежевый, не читается как клавиатура - WallN/Plant, WallN/Cup — слишком мелко на подоконнике - OldP4 в углу — путал с другой мебелью ОСТАВЛЕНО (читается): - Стены/пол/потолок с текстурами обоев/линолеума/побелки - Окно с рамой + радиатор - 2 постера + ковёр на стене - Кровать с одеялом - Стол + монитор с экраном - Подарок-коробка (интерактив) - Флешка (интерактив, красная) - Отец humanoid с лицом - Дверь (интерактив) КЛИК-ФИДБЕК: - Раньше клик на подарок → коробка исчезала молча → следом записка → клик на неё → тёмный overlay → пользователь думал «баг». - Теперь клик на подарок добавляет субтитр «[Я] Системник. И записка сверху.» — даёт обратную связь, направляет к записке. - note.set_interactable(true) переехал ПОСЛЕ субтитра — игрок сначала прочитал, потом стало кликаемо. ПОЛНАЯ РАЗБЛОКИРОВКА ВВОДА В ДИАЛОГАХ: - Убраны ВСЕ player.lock_input() / unlock_input() из: * act1.gd._play_intro (отец говорит — можешь ходить) * act1.gd._on_note_interacted (записка/прощание отца — можешь ходить) * act1.gd._on_drive_interacted (концовка — можешь ходить) * act1_kitchen.gd._on_note_interacted (Wi-Fi — можешь ходить) - Камера/WASD теперь работают ВО ВРЕМЯ любого диалога. Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/prologue/act1.gd | 53 ++++++++++++++++---------------- scripts/prologue/act1_kitchen.gd | 2 -- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/scripts/prologue/act1.gd b/scripts/prologue/act1.gd index fec4e4c..77c04c3 100644 --- a/scripts/prologue/act1.gd +++ b/scripts/prologue/act1.gd @@ -13,6 +13,7 @@ var state: State = State.INTRO func _ready() -> void: + _hide_noise_items() _apply_textures() player.interactable_focused.connect(_on_player_focused) @@ -20,7 +21,25 @@ func _ready() -> void: DialogManager.set_date_time(GameState.game_date, GameState.game_time) DialogManager.set_crosshair_visible(true) - DialogManager.set_controls_hint("WASD ходить · мышь смотреть · ЛКМ взаимодействие · ESC мышь · Q выход") + DialogManager.set_controls_hint("WASD ходить · мышь смотреть · ЛКМ взаимодействие · ESC меню · Q сохранить и выйти") + + +func _hide_noise_items() -> void: + # Убираем визуальный шум placeholder-куб-ов которые без нормальных + # моделей выглядят как загадка. Оставляем только читабельные объекты. + for path in [ + "Shelf", + "Sock1", + "Sock2", + "Desk/AdrenalineCan", + "Desk/LaysWrapper", + "Desk/Keyboard", + "WallN/Plant", + "WallN/Cup", + "OldP4", + ]: + if has_node(path): + get_node(path).visible = false # Если возвращаемся из кухни — пропускаем интро if GameState.act1_father_left: @@ -59,26 +78,8 @@ func _apply_textures() -> void: var door_panel_mat: BaseMaterial3D = ($WallE/DoorPanel as MeshInstance3D).material_override TextureGen.apply_to_material(door_panel_mat, TextureGen.door(), Vector3(1, 1, 1)) - # Книги - var book_letters: Array[String] = ["A", "B", "C", "D", "E"] - for i in range(book_letters.size()): - var book_node: Node = $Shelf.get_node("Book" + book_letters[i]) - if book_node != null and book_node is MeshInstance3D: - var book_mat: BaseMaterial3D = (book_node as MeshInstance3D).material_override - TextureGen.apply_to_material(book_mat, TextureGen.book_color(i), Vector3(1, 1, 1)) - - # Adrenaline / Lay's / Носки - var can_mat: BaseMaterial3D = ($Desk/AdrenalineCan as MeshInstance3D).material_override - TextureGen.apply_to_material(can_mat, TextureGen.adrenaline_label(), Vector3(1, 1, 1)) - - var lays_mat: BaseMaterial3D = ($Desk/LaysWrapper as MeshInstance3D).material_override - TextureGen.apply_to_material(lays_mat, TextureGen.lays_wrapper(), Vector3(1, 1, 1)) - - for sock_name in ["Sock1", "Sock2"]: - var sock_node: Node = get_node(sock_name) - if sock_node != null and sock_node is MeshInstance3D: - var sock_mat: BaseMaterial3D = (sock_node as MeshInstance3D).material_override - TextureGen.apply_to_material(sock_mat, TextureGen.sock_fabric(), Vector3(1, 1, 1)) + # Книги/носки/Adrenaline/Lay's скрыты в _hide_noise_items — + # текстуры на них не применяем (они невидимы) func _play_intro() -> void: @@ -88,7 +89,6 @@ func _play_intro() -> void: flash_drive.set_interactable(false) door.set_interactable(false) - player.lock_input() DialogManager.set_objective("Распакуй подарок от бати") await get_tree().create_timer(0.8).timeout @@ -97,7 +97,6 @@ func _play_intro() -> void: state = State.EXPLORE_GIFT gift_box.set_interactable(true) - player.unlock_input() func _setup_post_intro_state() -> void: @@ -132,8 +131,11 @@ func _on_gift_interacted(_p: Node) -> void: gift_box.visible = false system_unit.visible = true note.visible = true - note.set_interactable(true) DialogManager.clear_prompt() + + # Обратная связь на клик — иначе игрок жмёт в пустоту и не понимает что произошло + await DialogManager.think("Системник. И записка сверху.") + note.set_interactable(true) DialogManager.set_objective("Прочитай записку") @@ -143,7 +145,6 @@ func _on_note_interacted(_p: Node) -> void: state = State.NOTE_READ GameState.act1_note_read = true note.set_interactable(false) - player.lock_input() DialogManager.clear_prompt() await DialogManager.show_note("«Не сожги. Пароль от Wi-Fi на холодильнике. — Бать»") @@ -160,7 +161,6 @@ func _on_note_interacted(_p: Node) -> void: flash_drive.set_interactable(true) door.set_interactable(true) DialogManager.set_objective("Возьми флешку с Шиндовс") - player.unlock_input() func _walk_father_out() -> void: @@ -217,7 +217,6 @@ func _on_drive_interacted(_p: Node) -> void: GameState.act1_drive_taken = true flash_drive.set_interactable(false) door.set_interactable(false) - player.lock_input() DialogManager.clear_prompt() DialogManager.set_objective("") diff --git a/scripts/prologue/act1_kitchen.gd b/scripts/prologue/act1_kitchen.gd index faa1c37..dcc2e74 100644 --- a/scripts/prologue/act1_kitchen.gd +++ b/scripts/prologue/act1_kitchen.gd @@ -51,14 +51,12 @@ func _on_player_unfocused() -> void: func _on_note_interacted(_p: Node) -> void: - player.lock_input() DialogManager.clear_prompt() await DialogManager.show_note("«Wi-Fi: qwerty. Не парься.»\n— Бать") fridge_note.set_interactable(false) GameState.wifi_password_found = true GameState.unlock_achievement("Wi-Fi разведчик") DialogManager.set_objective("Вернись в комнату — флешка ждёт") - player.unlock_input() func _on_door_back_interacted(_p: Node) -> void: