diff --git a/scenes/components/dialog_ui.tscn b/scenes/components/dialog_ui.tscn index 5e6aa2d..6b4991d 100644 --- a/scenes/components/dialog_ui.tscn +++ b/scenes/components/dialog_ui.tscn @@ -9,76 +9,87 @@ script = ExtResource("1_dlg") [node name="DateTimeLabel" type="Label" parent="."] offset_left = 8.0 offset_top = 6.0 -offset_right = 280.0 +offset_right = 300.0 offset_bottom = 22.0 mouse_filter = 2 +theme_override_font_sizes/font_size = 11 text = "" modulate = Color(0.92, 0.92, 0.92, 1) [node name="ObjectiveLabel" type="Label" parent="."] -offset_left = 340.0 +anchor_right = 1.0 +offset_left = -300.0 offset_top = 6.0 -offset_right = 632.0 +offset_right = -8.0 offset_bottom = 22.0 mouse_filter = 2 +theme_override_font_sizes/font_size = 11 text = "" horizontal_alignment = 2 modulate = Color(0.94, 0.71, 0.1, 1) [node name="MoneyLabel" type="Label" parent="."] -offset_left = 340.0 +anchor_right = 1.0 +offset_left = -300.0 offset_top = 24.0 -offset_right = 632.0 +offset_right = -8.0 offset_bottom = 40.0 mouse_filter = 2 +theme_override_font_sizes/font_size = 11 text = "" horizontal_alignment = 2 modulate = Color(0.75, 0.75, 0.75, 1) [node name="WeatherLabel" type="Label" parent="."] -offset_left = 340.0 -offset_top = 215.0 -offset_right = 632.0 -offset_bottom = 231.0 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 0.0 +offset_top = -160.0 +offset_right = -8.0 +offset_bottom = -144.0 mouse_filter = 2 +theme_override_font_sizes/font_size = 11 text = "" horizontal_alignment = 2 modulate = Color(0.7, 0.75, 0.85, 1) [node name="StatsLabel" type="Label" parent="."] +anchor_top = 1.0 +anchor_bottom = 1.0 offset_left = 8.0 -offset_top = 215.0 +offset_top = -160.0 offset_right = 300.0 -offset_bottom = 231.0 +offset_bottom = -144.0 mouse_filter = 2 +theme_override_font_sizes/font_size = 11 text = "" modulate = Color(0.94, 0.71, 0.1, 1) [node name="ControlsHint" type="Label" parent="."] +anchor_right = 1.0 offset_left = 0.0 offset_top = 28.0 -offset_right = 640.0 +offset_right = 0.0 offset_bottom = 42.0 mouse_filter = 2 +theme_override_font_sizes/font_size = 10 text = "WASD ходить · мышь смотреть · ЛКМ взаимодействие · ESC меню · Q сохранить и выйти" horizontal_alignment = 1 modulate = Color(0.45, 0.45, 0.45, 0.8) [node name="Crosshair" type="Control" parent="."] -offset_left = 316.0 -offset_top = 176.0 -offset_right = 324.0 -offset_bottom = 184.0 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -4.0 +offset_top = -4.0 +offset_right = 4.0 +offset_bottom = 4.0 mouse_filter = 2 -[node name="CenterDot" type="ColorRect" parent="Crosshair"] -offset_left = 3.0 -offset_top = 3.0 -offset_right = 5.0 -offset_bottom = 5.0 -mouse_filter = 2 -color = Color(1, 1, 1, 0.85) - [node name="OuterRing" type="ColorRect" parent="Crosshair"] offset_left = 0.0 offset_top = 0.0 @@ -87,54 +98,70 @@ offset_bottom = 8.0 mouse_filter = 2 color = Color(0, 0, 0, 0.4) -[node name="InnerHole" type="ColorRect" parent="Crosshair"] -offset_left = 1.0 -offset_top = 1.0 -offset_right = 7.0 -offset_bottom = 7.0 +[node name="CenterDot" type="ColorRect" parent="Crosshair"] +offset_left = 3.0 +offset_top = 3.0 +offset_right = 5.0 +offset_bottom = 5.0 mouse_filter = 2 -color = Color(0, 0, 0, 0) +color = Color(1, 1, 1, 0.85) [node name="PromptLabel" type="Label" parent="."] +anchor_left = 0.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 offset_left = 0.0 -offset_top = 192.0 -offset_right = 640.0 -offset_bottom = 212.0 +offset_top = 16.0 +offset_right = 0.0 +offset_bottom = 32.0 mouse_filter = 2 +theme_override_font_sizes/font_size = 12 text = "" horizontal_alignment = 1 modulate = Color(0.94, 0.71, 0.1, 1) [node name="SubtitlePanel" type="PanelContainer" parent="."] +anchor_left = 0.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 offset_left = 16.0 -offset_top = 240.0 -offset_right = 624.0 -offset_bottom = 354.0 +offset_top = -148.0 +offset_right = -16.0 +offset_bottom = -8.0 mouse_filter = 2 [node name="V" type="VBoxContainer" parent="SubtitlePanel"] layout_mode = 2 mouse_filter = 2 +theme_override_constants/separation = 4 [node name="Who" type="Label" parent="SubtitlePanel/V"] layout_mode = 2 mouse_filter = 2 +theme_override_font_sizes/font_size = 11 text = "[Я]" modulate = Color(0.94, 0.71, 0.1, 1) [node name="Text" type="RichTextLabel" parent="SubtitlePanel/V"] -custom_minimum_size = Vector2(590, 60) +custom_minimum_size = Vector2(580, 80) layout_mode = 2 +size_flags_vertical = 3 mouse_filter = 2 bbcode_enabled = true text = "" fit_content = true scroll_active = false autowrap_mode = 3 +theme_override_font_sizes/normal_font_size = 12 +theme_override_font_sizes/bold_font_size = 12 +theme_override_font_sizes/italics_font_size = 12 [node name="Hint" type="Label" parent="SubtitlePanel/V"] layout_mode = 2 mouse_filter = 2 +theme_override_font_sizes/font_size = 10 text = "ЛКМ или ПРОБЕЛ — дальше" horizontal_alignment = 2 modulate = Color(0.5, 0.5, 0.5, 1) @@ -142,46 +169,46 @@ modulate = Color(0.5, 0.5, 0.5, 1) [node name="NoteOverlay" type="Control" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -offset_right = 640.0 -offset_bottom = 360.0 mouse_filter = 0 [node name="DarkBG" type="ColorRect" parent="NoteOverlay"] anchor_right = 1.0 anchor_bottom = 1.0 -offset_right = 640.0 -offset_bottom = 360.0 color = Color(0, 0, 0, 0.78) [node name="Center" type="CenterContainer" parent="NoteOverlay"] anchor_right = 1.0 anchor_bottom = 1.0 -offset_right = 640.0 -offset_bottom = 360.0 [node name="P" type="PanelContainer" parent="NoteOverlay/Center"] -custom_minimum_size = Vector2(440, 200) +custom_minimum_size = Vector2(460, 200) layout_mode = 2 [node name="V2" type="VBoxContainer" parent="NoteOverlay/Center/P"] layout_mode = 2 +theme_override_constants/separation = 6 [node name="Title" type="Label" parent="NoteOverlay/Center/P/V2"] layout_mode = 2 +theme_override_font_sizes/font_size = 13 text = "Записка" horizontal_alignment = 1 modulate = Color(0.94, 0.71, 0.1, 1) [node name="Text" type="RichTextLabel" parent="NoteOverlay/Center/P/V2"] -custom_minimum_size = Vector2(420, 100) +custom_minimum_size = Vector2(440, 110) layout_mode = 2 +size_flags_vertical = 3 bbcode_enabled = true text = "" fit_content = true autowrap_mode = 3 +theme_override_font_sizes/normal_font_size = 13 +theme_override_font_sizes/bold_font_size = 13 [node name="Hint" type="Label" parent="NoteOverlay/Center/P/V2"] layout_mode = 2 +theme_override_font_sizes/font_size = 10 text = "ЛКМ или ПРОБЕЛ — закрыть" horizontal_alignment = 1 modulate = Color(0.5, 0.5, 0.5, 1) diff --git a/scenes/main_menu.tscn b/scenes/main_menu.tscn index e4ebfbe..a14f81c 100644 --- a/scenes/main_menu.tscn +++ b/scenes/main_menu.tscn @@ -59,15 +59,17 @@ theme_override_constants/separation = 6 [node name="Title" type="Label" parent="Center/V"] layout_mode = 2 -text = "FARMING SIMULATOR" +text = "ДРОП" horizontal_alignment = 1 modulate = Color(0.94, 0.71, 0.1, 1) +theme_override_font_sizes/font_size = 32 [node name="Tagline" type="Label" parent="Center/V"] layout_mode = 2 -text = "Подросток-фермер CS/TF2/PUBG кейсов · 2020-2026" +text = "Лето двадцатого года." horizontal_alignment = 1 modulate = Color(0.7, 0.7, 0.7, 1) +theme_override_font_sizes/font_size = 12 [node name="Spacer" type="Control" parent="Center/V"] custom_minimum_size = Vector2(0, 30) diff --git a/scenes/prologue/act1_kitchen.tscn b/scenes/prologue/act1_kitchen.tscn index 401fdb6..6e3dd3c 100644 --- a/scenes/prologue/act1_kitchen.tscn +++ b/scenes/prologue/act1_kitchen.tscn @@ -410,7 +410,20 @@ mesh = SubResource("mesh_chair_leg") material_override = SubResource("mat_chair") [node name="PlayerFPV" parent="." instance=ExtResource("3_player")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 1.0) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0, 1.2) + +[node name="HallwayDoor" type="MeshInstance3D" parent="WallN"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.9, -0.25, 0.06) +mesh = SubResource("mesh_door_panel") +material_override = SubResource("mat_door") + +[node name="HallwaySign" type="Label3D" parent="WallN"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.9, 0.85, 0.07) +pixel_size = 0.005 +text = "← прихожая" +modulate = Color(0.6, 0.6, 0.6, 1) +outline_size = 4 +font_size = 32 [connection signal="interacted" from="Fridge/WiFiNote" to="." method="_on_note_interacted"] [connection signal="interacted" from="WallS/DoorBack" to="." method="_on_door_back_interacted"] diff --git a/scenes/prologue/act1_room.tscn b/scenes/prologue/act1_room.tscn index e56c008..ea7b46e 100644 --- a/scenes/prologue/act1_room.tscn +++ b/scenes/prologue/act1_room.tscn @@ -655,7 +655,7 @@ material_override = SubResource("mat_note") shape = SubResource("shape_note") [node name="FatherNPC" type="Node3D" parent="."] -transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 1.7, 0, 0) +transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 1.7, 0, 0) [node name="Head" type="MeshInstance3D" parent="FatherNPC"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.55, 0) diff --git a/scripts/prologue/act1.gd b/scripts/prologue/act1.gd index 77c04c3..6bd3691 100644 --- a/scripts/prologue/act1.gd +++ b/scripts/prologue/act1.gd @@ -125,28 +125,20 @@ func _on_player_unfocused() -> void: func _on_gift_interacted(_p: Node) -> void: if state != State.EXPLORE_GIFT: return - state = State.INSIDE_GIFT + state = State.NOTE_READ GameState.act1_gift_opened = true + GameState.act1_note_read = true gift_box.set_interactable(false) gift_box.visible = false system_unit.visible = true note.visible = true - DialogManager.clear_prompt() - - # Обратная связь на клик — иначе игрок жмёт в пустоту и не понимает что произошло - await DialogManager.think("Системник. И записка сверху.") - note.set_interactable(true) - DialogManager.set_objective("Прочитай записку") - - -func _on_note_interacted(_p: Node) -> void: - if state != State.INSIDE_GIFT: - return - state = State.NOTE_READ - GameState.act1_note_read = true note.set_interactable(false) DialogManager.clear_prompt() + DialogManager.set_objective("Прочитай записку") + # Авто-цепочка: системник → записка → монолог → отец прощается → уходит + # Без отдельных кликов на записку — это путало игрока + await DialogManager.think("Системник. И записка сверху.") await DialogManager.show_note("«Не сожги. Пароль от Wi-Fi на холодильнике. — Бать»") await DialogManager.think("Бать ну ты красавчик конечно.") @@ -163,6 +155,12 @@ func _on_note_interacted(_p: Node) -> void: DialogManager.set_objective("Возьми флешку с Шиндовс") +func _on_note_interacted(_p: Node) -> void: + # Auto-flow в _on_gift_interacted делает записку автоматически. + # Эта callback оставлена для совместимости signal connections. + pass + + func _walk_father_out() -> void: # Отец поворачивается лицом к двери (восток = +X) и шагает в неё var leg_l: Node3D = father.get_node("LegL") @@ -170,9 +168,10 @@ func _walk_father_out() -> void: var arm_l: Node3D = father.get_node("ArmL") var arm_r: Node3D = father.get_node("ArmR") - # Поворот корпуса к двери (Y rotation -90° → лицом на восток) + # Поворот корпуса спиной к игроку (180° от текущего лица-к-игроку) + # Игрок видит как отец отворачивается и идёт к двери var turn_tween: Tween = create_tween() - turn_tween.tween_property(father, "rotation:y", -PI / 2.0, 0.3) + turn_tween.tween_property(father, "rotation:y", PI / 2.0, 0.3) await turn_tween.finished # Шагание: 4 шага по 0.35 сек, общий путь 1.0 м на восток diff --git a/scripts/prologue/act2_install.gd b/scripts/prologue/act2_install.gd index 6b4afd9..22f4f2a 100644 --- a/scripts/prologue/act2_install.gd +++ b/scripts/prologue/act2_install.gd @@ -42,7 +42,7 @@ const TIMEZONES: Array[String] = [ const LICENSE_SHORT: String = "[center][b]Лицензионное соглашение Шиндовс 9[/b][/center]\n\nНажимая «Принять», Вы соглашаетесь с условиями использования операционной системы Шиндовс-Корп.\n\nДля просмотра полного текста нажмите «Читать»." -const LICENSE_FULL: String = "[center][b]Лицензионное соглашение Шиндовс 9 (полная версия)[/b][/center]\n\n[i]п. 7.3.2[/i] Этот персональный компьютер, на который Вы устанавливаете ПО, формально остаётся собственностью корпорации Шиндовс-Корп до момента окончательной выплаты Вашей души (далее — Душа).\n\n[i]п. 11.4[/i] Корпорация оставляет за собой право в любой момент запустить процесс «svchost.exe» с приоритетом «realtime». Жалобы не принимаются.\n\n[i]п. 12.1[/i] Все ваши скриншоты могут быть использованы в обучении ИИ, который заменит Вас на работе к 2027 году. Согласие подразумевается.\n\n[i]п. 15.7[/i] Корпорация молча переустановит Защитник раз в сутки, если установлен сторонний антивирус.\n\n[i]п. 18.0[/i] Раз в год Ваш рабочий стол может быть перемещён в облако. Восстановление платное.\n\n[i]п. 21.3[/i] Корпорация не несёт ответственности за случаи, когда после обновления у Вас перестаёт работать звук, мышь или Wi-Fi. Это нормально. Перезагрузитесь.\n\n[i]п. 23.9[/i] Все приложения могут наблюдать друг за другом и отправлять телеметрию в Облако. Облако — это не место, а состояние ума.\n\n[i]п. 27.1[/i] Нажав «Принять», Вы соглашаетесь не читать это соглашение. Если Вы дочитали до этого пункта — Вы нарушили условия." +const LICENSE_FULL: String = "[center][b]Лицензионное соглашение Шиндовс 9 (полная версия)[/b][/center]\n\n[i]п. 1.1[/i] Настоящее Лицензионное соглашение является обязывающим юридическим документом между Вами (далее — Пользователь) и корпорацией Шиндовс-Корп (далее — Корпорация).\n\n[i]п. 1.2[/i] Установив, скопировав, загрузив или иным образом используя ПО Шиндовс 9, Пользователь подтверждает согласие с условиями настоящего соглашения в полном объёме.\n\n[i]п. 2.1[/i] Корпорация предоставляет Пользователю неисключительную, непередаваемую, отзываемую лицензию на использование ПО на одном персональном устройстве.\n\n[i]п. 3.4[/i] Запрещается дизассемблировать, декомпилировать или иным образом изучать внутреннюю работу ПО, кроме случаев, прямо разрешённых законодательством.\n\n[i]п. 4.2[/i] Корпорация оставляет за собой право обновлять, модифицировать или прекращать поддержку ПО в любое время без предварительного уведомления.\n\n[i]п. 5.1[/i] ПО предоставляется «как есть». Корпорация не несёт ответственности за любые прямые, косвенные или сопутствующие убытки, возникшие в результате использования ПО.\n\n[i]п. 6.8[/i] Пользователь обязуется не использовать ПО для деятельности, противоречащей законодательству страны проживания Пользователя.\n\n[i]п. 7.3.2[/i] Этот персональный компьютер, на который Вы устанавливаете ПО, формально остаётся собственностью корпорации Шиндовс-Корп до момента окончательной выплаты Вашей души (далее — Душа).\n\n[i]п. 11.4[/i] Корпорация оставляет за собой право в любой момент запустить процесс «svchost.exe» с приоритетом «realtime». Жалобы не принимаются.\n\n[i]п. 12.1[/i] Все ваши скриншоты могут быть использованы в обучении ИИ, который заменит Вас на работе к 2027 году. Согласие подразумевается.\n\n[i]п. 15.7[/i] Корпорация молча переустановит Защитник раз в сутки, если установлен сторонний антивирус.\n\n[i]п. 18.0[/i] Раз в год Ваш рабочий стол может быть перемещён в облако. Восстановление платное.\n\n[i]п. 21.3[/i] Корпорация не несёт ответственности за случаи, когда после обновления у Вас перестаёт работать звук, мышь или Wi-Fi. Это нормально. Перезагрузитесь.\n\n[i]п. 23.9[/i] Все приложения могут наблюдать друг за другом и отправлять телеметрию в Облако. Облако — это не место, а состояние ума.\n\n[i]п. 27.1[/i] Нажав «Принять», Вы соглашаетесь не читать это соглашение. Если Вы дочитали до этого пункта — Вы нарушили условия." func _ready() -> void: diff --git a/scripts/ui/dialog_manager.gd b/scripts/ui/dialog_manager.gd index f9fc4a4..79e5ba1 100644 --- a/scripts/ui/dialog_manager.gd +++ b/scripts/ui/dialog_manager.gd @@ -14,6 +14,8 @@ signal advanced @onready var controls_hint: Label = $ControlsHint @onready var crosshair: Control = $Crosshair +var _hint_timer: Timer + @onready var date_time_label: Label = $DateTimeLabel @onready var objective_label: Label = $ObjectiveLabel @onready var money_label: Label = $MoneyLabel @@ -33,11 +35,21 @@ func _ready() -> void: stats_label.visible = false crosshair.visible = true + _hint_timer = Timer.new() + _hint_timer.one_shot = true + add_child(_hint_timer) + _hint_timer.timeout.connect(_fade_hint) + func set_crosshair_visible(v: bool) -> void: crosshair.visible = v +func _fade_hint() -> void: + var t: Tween = create_tween() + t.tween_property(controls_hint, "modulate:a", 0.0, 1.5) + + func say(who: String, line: String) -> Signal: who_label.text = "[%s]" % who text_label.text = line @@ -120,12 +132,17 @@ func set_stat_alert(text: String) -> void: stats_label.visible = true -func set_controls_hint(text: String) -> void: +func set_controls_hint(text: String, auto_hide_after: float = 8.0) -> void: + if _hint_timer != null: + _hint_timer.stop() if text == "": controls_hint.visible = false return controls_hint.text = text controls_hint.visible = true + controls_hint.modulate = Color(0.45, 0.45, 0.45, 0.8) + if auto_hide_after > 0 and _hint_timer != null: + _hint_timer.start(auto_hide_after) func _input(event: InputEvent) -> void: