Some checks failed
Godot CI / Import + smoke test (push) Failing after 14s
БАГ-ФИКСЫ: - Трясёт у двери: Interactable теперь extends Area3D (не StaticBody3D). RayCast3D детектит Area3D через collide_with_areas=true. Игрок физически проходит через интерактивы (gift box, флешка, записка, дверь) — не толкается в узких местах. Бампается только в стены/мебель/пол. - Все 6 интерактивов в act1_room.tscn и act1_kitchen.tscn переведены на type="Area3D". UI: - Crosshair в центре экрана: 8×8 точка с тёмной рамкой и белой центральной 2×2 точкой. set_crosshair_visible() для 2D-сцен (Акт 2 прячет его). - SubtitlePanel расширен: 16-624 × 240-354 (было 24-616 × 270-350). Text-лейбл заменён на RichTextLabel с fit_content + bbcode. Длинные реплики отца теперь нормально влезают. - NoteOverlay аналогично RichTextLabel. - ControlsHint перенесён сверху (под HUD-датой), 14px меньше. ТЕКСТУРЫ через FastNoiseLite + 128×128 разрешалка: - wallpaper: шумная бежевая база + растительный крест-цветок каждые 22px, шахматное смещение, тонкая горизонтальная полоса каждые 32px (стык обоев). - linoleum: настоящая паркетная доска 16×64px со смещением между рядами, тонкие швы, волокно через шум. - ceiling: побелка с пятном протёчки в углу (canon-деталь). - wall_carpet: бордовая база + двойная золотая рамка + ромб- медальон с золотыми углами + декоративные уголки. - blanket: 30 звёздочек (белые/жёлтые) разного размера на шумной тёмно-синей базе. - poster_csgo: диагональная штриховка + силуэт AWP по центру + пиксельный «CS:GO» текст внизу. - poster_morgen: круг с лицом, глаза-щели, рот + пиксельный «MS». - door: вертикальное волокно Perlin + 3 горизонтальных шва (панели) + 4 сучка разного размера. - desk_white: чистый белый + жёлтый Steam-стикер в углу + царапина. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
548 B
GDScript
33 lines
548 B
GDScript
class_name Interactable extends Area3D
|
|
|
|
@export var prompt: String = "Взаимодействовать"
|
|
@export var enabled: bool = false
|
|
|
|
signal interacted(player: Node)
|
|
|
|
|
|
func _ready() -> void:
|
|
monitoring = false
|
|
_apply_collision()
|
|
|
|
|
|
func set_interactable(v: bool) -> void:
|
|
enabled = v
|
|
_apply_collision()
|
|
|
|
|
|
func _apply_collision() -> void:
|
|
if enabled:
|
|
collision_layer = 1
|
|
else:
|
|
collision_layer = 0
|
|
|
|
|
|
func get_prompt() -> String:
|
|
return prompt
|
|
|
|
|
|
func interact(player: Node) -> void:
|
|
if not enabled:
|
|
return
|
|
interacted.emit(player)
|