fix: скролл лицензии, отец лицом к игроку, банка-цилиндр, экран
Some checks failed
Godot CI / Import + smoke test (push) Failing after 13s

АКТ 2 СКРОЛЛ:
- Body RichTextLabel: fit_content=true → false, теперь label
  остаётся в фиксированном размере 540×220 и скроллит контент
  внутри. Раньше label расширялся по тексту и обрезался панелью.
- scroll_following=false (не следить за концом).
- mouse_filter=STOP — теперь mouse wheel над label скроллит.
- font_size снижен с дефолта на 11 — больше пунктов помещается
  на экране, читается комфортно.
- Window custom_minimum_size = 580×348 (было 560×320) — больше
  места под лицензию.

ОТЕЦ:
- FatherNPC initial transform теперь rotation_y = +π/2
  (Transform3D(0,0,-1,0,1,0,1,0,0,1.7,0,0)) — лицом к игроку
  на запад. Игрок видит лицо отца, а не профиль.
- В _walk_father_out tween поворачивает rotation_y → -π/2
  (180° поворот через 0/север). Шагает на восток к двери
  с правильно повёрнутым корпусом.

МОНИТОР:
- К Desk/OldPC добавлен child Screen — BoxMesh 0.21×0.15×0.005
  с эмиссивной материалом mat_screen (тёмный с голубым свечением).
- Стоит на передней грани монитора, имитирует тёмный экран
  с легким bluish-glow CRT-вибом.

ADRENALINE BANK → ЦИЛИНДР:
- mesh_can: BoxMesh → CylinderMesh top=bottom=0.03 height=0.13.
  Теперь это реально банка по форме, а не куб.

ТЕКСТУРЫ ПРЕДМЕТОВ (TextureGen новые):
- adrenaline_label: синий с тёмно-синими диагональными штрихами +
  жёлтая молния по центру + тёмные верхняя/нижняя кромки.
- lays_wrapper: жёлтый с красной волнистой лентой посередине
  (синус) + коричневая чипса-клякса внизу + тёмные уголки.
- sock_fabric: тёмно-синий с горизонтальными светлыми полосками
  каждые 6 пикселей + тёмный шов.
- monitor_screen: тёмное стекло с edge-glow + scanlines каждые
  2 строки (CRT-вайб).
- Применены в act1.gd._apply_textures на AdrenalineCan,
  LaysWrapper, Sock1/Sock2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dmitrii Bykov 2026-05-24 18:36:19 +03:00
parent f8040fb399
commit 579df43289
4 changed files with 166 additions and 7 deletions

View file

@ -532,6 +532,128 @@ func book_color(color_idx: int) -> ImageTexture:
)
# Этикетка Adrenaline Rush — синий со штрихами + молния
func adrenaline_label() -> ImageTexture:
return _get_or_create("adrenaline_label", func() -> ImageTexture:
var w: int = 64
var h: int = 64
var blue_dark: Color = Color(0.08, 0.18, 0.45)
var blue: Color = Color(0.13, 0.32, 0.68)
var blue_light: Color = Color(0.3, 0.5, 0.85)
var yellow: Color = Color(0.95, 0.85, 0.2)
var img: Image = _make_image(w, h, blue)
# Диагональные полосы
for y in range(h):
for x in range(w):
var d: int = (x + y) % 12
if d < 2:
img.set_pixel(x, y, blue_dark)
elif d < 4:
img.set_pixel(x, y, blue_light)
# Молния по центру
var bolt: Array = [
[32, 10], [32, 12], [31, 14], [31, 16], [30, 18], [33, 20],
[33, 22], [32, 24], [32, 26], [31, 28], [34, 30], [34, 32],
[33, 34], [33, 36], [32, 38], [35, 40], [34, 42], [33, 44],
[32, 46], [31, 48], [30, 50], [29, 52]
]
for p in bolt:
img.set_pixel(p[0], p[1], yellow)
if p[0] + 1 < w:
img.set_pixel(p[0] + 1, p[1], yellow)
if p[0] - 1 >= 0:
img.set_pixel(p[0] - 1, p[1], yellow)
# Верх/низ — тёмные полосы
for x in range(w):
img.set_pixel(x, 0, blue_dark)
img.set_pixel(x, 1, blue_dark)
img.set_pixel(x, h - 1, blue_dark)
img.set_pixel(x, h - 2, blue_dark)
return _to_texture(img)
)
# Обёртка Lay's — жёлтая с красной волной
func lays_wrapper() -> ImageTexture:
return _get_or_create("lays_wrapper", func() -> ImageTexture:
var w: int = 64
var h: int = 48
var yellow: Color = Color(0.96, 0.84, 0.18)
var red: Color = Color(0.78, 0.12, 0.12)
var red_dark: Color = Color(0.55, 0.08, 0.08)
var brown: Color = Color(0.35, 0.22, 0.1)
var img: Image = _make_image(w, h, yellow)
# Красная волнистая лента посередине
for x in range(w):
var wave: int = int(sin(x * 0.3) * 4.0)
var band_y: int = 20 + wave
for dy in range(-4, 5):
var y: int = band_y + dy
if y >= 0 and y < h:
if dy == -4 or dy == 4:
img.set_pixel(x, y, red_dark)
else:
img.set_pixel(x, y, red)
# Силуэт чипса (овальная коричневая клякса)
for ang in range(20):
var a: float = float(ang) * PI / 10.0
var px: int = 16 + int(cos(a) * 6.0)
var py: int = 38 + int(sin(a) * 3.0)
if px >= 0 and px < w and py >= 0 and py < h:
img.set_pixel(px, py, brown)
# Уголки обёртки темнее
for i in range(3):
img.set_pixel(i, h - 1 - i, red_dark)
img.set_pixel(w - 1 - i, h - 1 - i, red_dark)
return _to_texture(img)
)
# Носок — тёмно-серый со светлыми полосками
func sock_fabric() -> ImageTexture:
return _get_or_create("sock_fabric", func() -> ImageTexture:
var w: int = 32
var h: int = 32
var base: Color = Color(0.18, 0.22, 0.32)
var stripe: Color = Color(0.28, 0.32, 0.42)
var dark: Color = Color(0.1, 0.13, 0.2)
var img: Image = _make_image(w, h, base)
for y in range(h):
if y % 6 == 0 or y % 6 == 1:
for x in range(w):
img.set_pixel(x, y, stripe)
elif y % 6 == 3:
for x in range(w):
img.set_pixel(x, y, dark)
return _to_texture(img)
)
# Экран монитора — тёмное стекло с легким bluish свечением
func monitor_screen() -> ImageTexture:
return _get_or_create("monitor_screen", func() -> ImageTexture:
var w: int = 64
var h: int = 48
var dark: Color = Color(0.04, 0.05, 0.08)
var glow: Color = Color(0.15, 0.2, 0.3)
var scan: Color = Color(0.08, 0.1, 0.14)
var img: Image = _make_image(w, h, dark)
# Боковые градиенты к свечению
for y in range(h):
for x in range(w):
var dx: float = abs(float(x) - float(w) / 2.0) / (float(w) / 2.0)
var dy: float = abs(float(y) - float(h) / 2.0) / (float(h) / 2.0)
var edge: float = max(dx, dy)
var c: Color = dark.lerp(glow, (1.0 - edge) * 0.4)
img.set_pixel(x, y, c)
# Горизонтальные scanlines каждые 2 строки
for y in range(0, h, 2):
for x in range(w):
img.set_pixel(x, y, img.get_pixel(x, y).lerp(scan, 0.4))
return _to_texture(img)
)
# Применить текстуру к материалу с заданным uv-scale + nearest filter
func apply_to_material(mat: BaseMaterial3D, texture: ImageTexture, scale: Vector3 = Vector3.ONE) -> void:
if mat == null: