fix: auto-flow подарок, отец 180°, спавн кухни, лицензия, меню «ДРОП»
Some checks failed
Godot CI / Import + smoke test (push) Failing after 13s

1. ОТЕЦ (поворот по фидбеку):
   - Initial Transform3D повёрнут на 180° от предыдущего — теперь
     лицом к игроку во время диалога.
   - При уходе ещё +180° поворот → спиной к игроку → шагает к двери
     не пятясь.

2. AUTO-FLOW КЛИКА ПО ПОДАРКУ:
   - Раньше: клик подарок → молча появляется системник → клик
     записку → overlay → клик дальше → монолог → ... Игрок терялся
     между кликами, думал что баг (тёмный экран).
   - Теперь: ОДИН клик подарка запускает ЦЕПОЧКУ:
     «Системник. И записка сверху.» → overlay записки → «Бать ну
     ты красавчик» → отец прощается → отец уходит → флешка готова.
     Игрок просто кликает «дальше» на каждой реплике.
   - note.set_interactable(false) — клик отдельно не нужен.
   - _on_note_interacted остался как пустой callback для совместимости.

3. КУХНЯ — СПАВН:
   - Был (0.5, 0, 1.0) — попадал внутрь стола (z=0.35..1.05).
     Игрок застревал.
   - Теперь (-0.5, 0, 1.2) — у двери возврата в комнату, далеко от
     стола. Спавнится свободно.

4. КУХНЯ — 2-Я ДВЕРЬ:
   - User спросил «куда отец ушёл — нет других дверей». Добавил
     визуальную не-интерактивную дверь на северной стене
     (Label3D «← прихожая»). Логически отец вышел через коридор.

5. ЛИЦЕНЗИЯ — НАЧАЛО:
   - User: «начинается с п.7, а где 1-6». Добавил 7 нормально-
     юридических пунктов 1.1-6.8 (про лицензию, неисключительные
     права, дизассемблирование, «как есть», ответственность,
     обязательства Пользователя) — ПЕРЕД ШИЗО-пунктами.
   - Теперь читается как настоящее ЛС: нормальное-нормальное-
     нормальное-ШИЗО-ШИЗО-ШИЗО, нарастающий абсурд.

6. HUD-ПОДСКАЗКА АВТО-ФЕЙД:
   - Timer в DialogManager (one_shot, 8 сек по умолчанию).
   - set_controls_hint() запускает таймер.
   - По истечении — tween modulate.a 0.8 → 0.0 за 1.5 сек.
   - Подсказка управления больше не висит вечно.

7. ГЛАВНОЕ МЕНЮ — НАЗВАНИЕ:
   - Было: «FARMING SIMULATOR / Подросток-фермер CS/TF2/PUBG
     кейсов · 2020-2026» (рабочее, пресно).
   - Стало: «ДРОП» (32px, жёлтый акцент) / «Лето двадцатого года.»
     (12px, серый). Лаконично, поэтично.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dmitrii Bykov 2026-05-24 19:46:20 +03:00
parent d6acefdfa8
commit 7bda9c6ca1
7 changed files with 125 additions and 67 deletions

View file

@ -9,76 +9,87 @@ script = ExtResource("1_dlg")
[node name="DateTimeLabel" type="Label" parent="."] [node name="DateTimeLabel" type="Label" parent="."]
offset_left = 8.0 offset_left = 8.0
offset_top = 6.0 offset_top = 6.0
offset_right = 280.0 offset_right = 300.0
offset_bottom = 22.0 offset_bottom = 22.0
mouse_filter = 2 mouse_filter = 2
theme_override_font_sizes/font_size = 11
text = "" text = ""
modulate = Color(0.92, 0.92, 0.92, 1) modulate = Color(0.92, 0.92, 0.92, 1)
[node name="ObjectiveLabel" type="Label" parent="."] [node name="ObjectiveLabel" type="Label" parent="."]
offset_left = 340.0 anchor_right = 1.0
offset_left = -300.0
offset_top = 6.0 offset_top = 6.0
offset_right = 632.0 offset_right = -8.0
offset_bottom = 22.0 offset_bottom = 22.0
mouse_filter = 2 mouse_filter = 2
theme_override_font_sizes/font_size = 11
text = "" text = ""
horizontal_alignment = 2 horizontal_alignment = 2
modulate = Color(0.94, 0.71, 0.1, 1) modulate = Color(0.94, 0.71, 0.1, 1)
[node name="MoneyLabel" type="Label" parent="."] [node name="MoneyLabel" type="Label" parent="."]
offset_left = 340.0 anchor_right = 1.0
offset_left = -300.0
offset_top = 24.0 offset_top = 24.0
offset_right = 632.0 offset_right = -8.0
offset_bottom = 40.0 offset_bottom = 40.0
mouse_filter = 2 mouse_filter = 2
theme_override_font_sizes/font_size = 11
text = "" text = ""
horizontal_alignment = 2 horizontal_alignment = 2
modulate = Color(0.75, 0.75, 0.75, 1) modulate = Color(0.75, 0.75, 0.75, 1)
[node name="WeatherLabel" type="Label" parent="."] [node name="WeatherLabel" type="Label" parent="."]
offset_left = 340.0 anchor_left = 0.5
offset_top = 215.0 anchor_top = 1.0
offset_right = 632.0 anchor_right = 1.0
offset_bottom = 231.0 anchor_bottom = 1.0
offset_left = 0.0
offset_top = -160.0
offset_right = -8.0
offset_bottom = -144.0
mouse_filter = 2 mouse_filter = 2
theme_override_font_sizes/font_size = 11
text = "" text = ""
horizontal_alignment = 2 horizontal_alignment = 2
modulate = Color(0.7, 0.75, 0.85, 1) modulate = Color(0.7, 0.75, 0.85, 1)
[node name="StatsLabel" type="Label" parent="."] [node name="StatsLabel" type="Label" parent="."]
anchor_top = 1.0
anchor_bottom = 1.0
offset_left = 8.0 offset_left = 8.0
offset_top = 215.0 offset_top = -160.0
offset_right = 300.0 offset_right = 300.0
offset_bottom = 231.0 offset_bottom = -144.0
mouse_filter = 2 mouse_filter = 2
theme_override_font_sizes/font_size = 11
text = "" text = ""
modulate = Color(0.94, 0.71, 0.1, 1) modulate = Color(0.94, 0.71, 0.1, 1)
[node name="ControlsHint" type="Label" parent="."] [node name="ControlsHint" type="Label" parent="."]
anchor_right = 1.0
offset_left = 0.0 offset_left = 0.0
offset_top = 28.0 offset_top = 28.0
offset_right = 640.0 offset_right = 0.0
offset_bottom = 42.0 offset_bottom = 42.0
mouse_filter = 2 mouse_filter = 2
theme_override_font_sizes/font_size = 10
text = "WASD ходить · мышь смотреть · ЛКМ взаимодействие · ESC меню · Q сохранить и выйти" text = "WASD ходить · мышь смотреть · ЛКМ взаимодействие · ESC меню · Q сохранить и выйти"
horizontal_alignment = 1 horizontal_alignment = 1
modulate = Color(0.45, 0.45, 0.45, 0.8) modulate = Color(0.45, 0.45, 0.45, 0.8)
[node name="Crosshair" type="Control" parent="."] [node name="Crosshair" type="Control" parent="."]
offset_left = 316.0 anchor_left = 0.5
offset_top = 176.0 anchor_top = 0.5
offset_right = 324.0 anchor_right = 0.5
offset_bottom = 184.0 anchor_bottom = 0.5
offset_left = -4.0
offset_top = -4.0
offset_right = 4.0
offset_bottom = 4.0
mouse_filter = 2 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"] [node name="OuterRing" type="ColorRect" parent="Crosshair"]
offset_left = 0.0 offset_left = 0.0
offset_top = 0.0 offset_top = 0.0
@ -87,54 +98,70 @@ offset_bottom = 8.0
mouse_filter = 2 mouse_filter = 2
color = Color(0, 0, 0, 0.4) color = Color(0, 0, 0, 0.4)
[node name="InnerHole" type="ColorRect" parent="Crosshair"] [node name="CenterDot" type="ColorRect" parent="Crosshair"]
offset_left = 1.0 offset_left = 3.0
offset_top = 1.0 offset_top = 3.0
offset_right = 7.0 offset_right = 5.0
offset_bottom = 7.0 offset_bottom = 5.0
mouse_filter = 2 mouse_filter = 2
color = Color(0, 0, 0, 0) color = Color(1, 1, 1, 0.85)
[node name="PromptLabel" type="Label" parent="."] [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_left = 0.0
offset_top = 192.0 offset_top = 16.0
offset_right = 640.0 offset_right = 0.0
offset_bottom = 212.0 offset_bottom = 32.0
mouse_filter = 2 mouse_filter = 2
theme_override_font_sizes/font_size = 12
text = "" text = ""
horizontal_alignment = 1 horizontal_alignment = 1
modulate = Color(0.94, 0.71, 0.1, 1) modulate = Color(0.94, 0.71, 0.1, 1)
[node name="SubtitlePanel" type="PanelContainer" parent="."] [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_left = 16.0
offset_top = 240.0 offset_top = -148.0
offset_right = 624.0 offset_right = -16.0
offset_bottom = 354.0 offset_bottom = -8.0
mouse_filter = 2 mouse_filter = 2
[node name="V" type="VBoxContainer" parent="SubtitlePanel"] [node name="V" type="VBoxContainer" parent="SubtitlePanel"]
layout_mode = 2 layout_mode = 2
mouse_filter = 2 mouse_filter = 2
theme_override_constants/separation = 4
[node name="Who" type="Label" parent="SubtitlePanel/V"] [node name="Who" type="Label" parent="SubtitlePanel/V"]
layout_mode = 2 layout_mode = 2
mouse_filter = 2 mouse_filter = 2
theme_override_font_sizes/font_size = 11
text = "[Я]" text = "[Я]"
modulate = Color(0.94, 0.71, 0.1, 1) modulate = Color(0.94, 0.71, 0.1, 1)
[node name="Text" type="RichTextLabel" parent="SubtitlePanel/V"] [node name="Text" type="RichTextLabel" parent="SubtitlePanel/V"]
custom_minimum_size = Vector2(590, 60) custom_minimum_size = Vector2(580, 80)
layout_mode = 2 layout_mode = 2
size_flags_vertical = 3
mouse_filter = 2 mouse_filter = 2
bbcode_enabled = true bbcode_enabled = true
text = "" text = ""
fit_content = true fit_content = true
scroll_active = false scroll_active = false
autowrap_mode = 3 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"] [node name="Hint" type="Label" parent="SubtitlePanel/V"]
layout_mode = 2 layout_mode = 2
mouse_filter = 2 mouse_filter = 2
theme_override_font_sizes/font_size = 10
text = "ЛКМ или ПРОБЕЛ — дальше" text = "ЛКМ или ПРОБЕЛ — дальше"
horizontal_alignment = 2 horizontal_alignment = 2
modulate = Color(0.5, 0.5, 0.5, 1) 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="."] [node name="NoteOverlay" type="Control" parent="."]
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
offset_right = 640.0
offset_bottom = 360.0
mouse_filter = 0 mouse_filter = 0
[node name="DarkBG" type="ColorRect" parent="NoteOverlay"] [node name="DarkBG" type="ColorRect" parent="NoteOverlay"]
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
offset_right = 640.0
offset_bottom = 360.0
color = Color(0, 0, 0, 0.78) color = Color(0, 0, 0, 0.78)
[node name="Center" type="CenterContainer" parent="NoteOverlay"] [node name="Center" type="CenterContainer" parent="NoteOverlay"]
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
offset_right = 640.0
offset_bottom = 360.0
[node name="P" type="PanelContainer" parent="NoteOverlay/Center"] [node name="P" type="PanelContainer" parent="NoteOverlay/Center"]
custom_minimum_size = Vector2(440, 200) custom_minimum_size = Vector2(460, 200)
layout_mode = 2 layout_mode = 2
[node name="V2" type="VBoxContainer" parent="NoteOverlay/Center/P"] [node name="V2" type="VBoxContainer" parent="NoteOverlay/Center/P"]
layout_mode = 2 layout_mode = 2
theme_override_constants/separation = 6
[node name="Title" type="Label" parent="NoteOverlay/Center/P/V2"] [node name="Title" type="Label" parent="NoteOverlay/Center/P/V2"]
layout_mode = 2 layout_mode = 2
theme_override_font_sizes/font_size = 13
text = "Записка" text = "Записка"
horizontal_alignment = 1 horizontal_alignment = 1
modulate = Color(0.94, 0.71, 0.1, 1) modulate = Color(0.94, 0.71, 0.1, 1)
[node name="Text" type="RichTextLabel" parent="NoteOverlay/Center/P/V2"] [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 layout_mode = 2
size_flags_vertical = 3
bbcode_enabled = true bbcode_enabled = true
text = "" text = ""
fit_content = true fit_content = true
autowrap_mode = 3 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"] [node name="Hint" type="Label" parent="NoteOverlay/Center/P/V2"]
layout_mode = 2 layout_mode = 2
theme_override_font_sizes/font_size = 10
text = "ЛКМ или ПРОБЕЛ — закрыть" text = "ЛКМ или ПРОБЕЛ — закрыть"
horizontal_alignment = 1 horizontal_alignment = 1
modulate = Color(0.5, 0.5, 0.5, 1) modulate = Color(0.5, 0.5, 0.5, 1)

View file

@ -59,15 +59,17 @@ theme_override_constants/separation = 6
[node name="Title" type="Label" parent="Center/V"] [node name="Title" type="Label" parent="Center/V"]
layout_mode = 2 layout_mode = 2
text = "FARMING SIMULATOR" text = "ДРОП"
horizontal_alignment = 1 horizontal_alignment = 1
modulate = Color(0.94, 0.71, 0.1, 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"] [node name="Tagline" type="Label" parent="Center/V"]
layout_mode = 2 layout_mode = 2
text = "Подросток-фермер CS/TF2/PUBG кейсов · 2020-2026" text = "Лето двадцатого года."
horizontal_alignment = 1 horizontal_alignment = 1
modulate = Color(0.7, 0.7, 0.7, 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"] [node name="Spacer" type="Control" parent="Center/V"]
custom_minimum_size = Vector2(0, 30) custom_minimum_size = Vector2(0, 30)

View file

@ -410,7 +410,20 @@ mesh = SubResource("mesh_chair_leg")
material_override = SubResource("mat_chair") material_override = SubResource("mat_chair")
[node name="PlayerFPV" parent="." instance=ExtResource("3_player")] [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="Fridge/WiFiNote" to="." method="_on_note_interacted"]
[connection signal="interacted" from="WallS/DoorBack" to="." method="_on_door_back_interacted"] [connection signal="interacted" from="WallS/DoorBack" to="." method="_on_door_back_interacted"]

View file

@ -655,7 +655,7 @@ material_override = SubResource("mat_note")
shape = SubResource("shape_note") shape = SubResource("shape_note")
[node name="FatherNPC" type="Node3D" parent="."] [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"] [node name="Head" type="MeshInstance3D" parent="FatherNPC"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.55, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.55, 0)

View file

@ -125,28 +125,20 @@ func _on_player_unfocused() -> void:
func _on_gift_interacted(_p: Node) -> void: func _on_gift_interacted(_p: Node) -> void:
if state != State.EXPLORE_GIFT: if state != State.EXPLORE_GIFT:
return return
state = State.INSIDE_GIFT state = State.NOTE_READ
GameState.act1_gift_opened = true GameState.act1_gift_opened = true
GameState.act1_note_read = true
gift_box.set_interactable(false) gift_box.set_interactable(false)
gift_box.visible = false gift_box.visible = false
system_unit.visible = true system_unit.visible = true
note.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) note.set_interactable(false)
DialogManager.clear_prompt() DialogManager.clear_prompt()
DialogManager.set_objective("Прочитай записку")
# Авто-цепочка: системник → записка → монолог → отец прощается → уходит
# Без отдельных кликов на записку — это путало игрока
await DialogManager.think("Системник. И записка сверху.")
await DialogManager.show_note("«Не сожги. Пароль от Wi-Fi на холодильнике. — Бать»") await DialogManager.show_note("«Не сожги. Пароль от Wi-Fi на холодильнике. — Бать»")
await DialogManager.think("Бать ну ты красавчик конечно.") await DialogManager.think("Бать ну ты красавчик конечно.")
@ -163,6 +155,12 @@ func _on_note_interacted(_p: Node) -> void:
DialogManager.set_objective("Возьми флешку с Шиндовс") DialogManager.set_objective("Возьми флешку с Шиндовс")
func _on_note_interacted(_p: Node) -> void:
# Auto-flow в _on_gift_interacted делает записку автоматически.
# Эта callback оставлена для совместимости signal connections.
pass
func _walk_father_out() -> void: func _walk_father_out() -> void:
# Отец поворачивается лицом к двери (восток = +X) и шагает в неё # Отец поворачивается лицом к двери (восток = +X) и шагает в неё
var leg_l: Node3D = father.get_node("LegL") 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_l: Node3D = father.get_node("ArmL")
var arm_r: Node3D = father.get_node("ArmR") var arm_r: Node3D = father.get_node("ArmR")
# Поворот корпуса к двери (Y rotation -90° → лицом на восток) # Поворот корпуса спиной к игроку (180° от текущего лица-к-игроку)
# Игрок видит как отец отворачивается и идёт к двери
var turn_tween: Tween = create_tween() 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 await turn_tween.finished
# Шагание: 4 шага по 0.35 сек, общий путь 1.0 м на восток # Шагание: 4 шага по 0.35 сек, общий путь 1.0 м на восток

View file

@ -42,7 +42,7 @@ const TIMEZONES: Array[String] = [
const LICENSE_SHORT: String = "[center][b]Лицензионное соглашение Шиндовс 9[/b][/center]\n\nНажимая «Принять», Вы соглашаетесь с условиями использования операционной системы Шиндовс-Корп.\n\nДля просмотра полного текста нажмите «Читать»." 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: func _ready() -> void:

View file

@ -14,6 +14,8 @@ signal advanced
@onready var controls_hint: Label = $ControlsHint @onready var controls_hint: Label = $ControlsHint
@onready var crosshair: Control = $Crosshair @onready var crosshair: Control = $Crosshair
var _hint_timer: Timer
@onready var date_time_label: Label = $DateTimeLabel @onready var date_time_label: Label = $DateTimeLabel
@onready var objective_label: Label = $ObjectiveLabel @onready var objective_label: Label = $ObjectiveLabel
@onready var money_label: Label = $MoneyLabel @onready var money_label: Label = $MoneyLabel
@ -33,11 +35,21 @@ func _ready() -> void:
stats_label.visible = false stats_label.visible = false
crosshair.visible = true 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: func set_crosshair_visible(v: bool) -> void:
crosshair.visible = v 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: func say(who: String, line: String) -> Signal:
who_label.text = "[%s]" % who who_label.text = "[%s]" % who
text_label.text = line text_label.text = line
@ -120,12 +132,17 @@ func set_stat_alert(text: String) -> void:
stats_label.visible = true 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 == "": if text == "":
controls_hint.visible = false controls_hint.visible = false
return return
controls_hint.text = text controls_hint.text = text
controls_hint.visible = true 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: func _input(event: InputEvent) -> void: