102 Commits

Author SHA1 Message Date
min
fe8b6b5b38 fix(studio): NPC-киты (robot→character-a), дверь по коду плавно распахивается
1) NPC-преследователь/торговец/волна: spawnNpc('robot') → 'character-a'
   (модели 'robot' не существует в ModelTypes → spawnNpc возвращал null → ошибка).
2) Дверь по коду: верный код → ПЛАВНОЕ открытие вокруг петли (как дверь по E),
   декор-панели вращаются вместе с полотном. Раньше полотно уезжало вниз,
   декор оставался.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 19:36:18 +03:00
min
3bf1e77230 fix(studio): self.setLabel, дверь по коду (красивая+радиус), счётчик механик, ссылка на скрипт в консоли
1) Дверь по коду: красивая составная дверь (полотно+рамка+кодовая панель),
   поле ввода появляется ТОЛЬКО когда игрок в радиусе 6м (onTick по дистанции).
2) game.self.setLabel/clearLabel добавлены (кит «Метка с именем» падал
   'setLabel is not a function').
3) Плитка «Готовые механики» в тулбоксе считает киты динамически
   (GAMEPLAY_KITS.length), а не хардкод «12».
4) Консоль: ошибки/логи скриптов привязаны к источнику — справа строки
   кликабельная ссылка «📄 имя скрипта», открывает скрипт в редакторе
   (_log прокидывает scriptId/scriptName).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 19:27:09 +03:00
min
045f892aaa fix(studio): светофор (obj.color по ref), грядка растёт+зреет (obj.scale), кит скрытия HP
1) scene.setColor теперь принимает {ref} (obj.color=hex), не только {id}.
   Светофор переключал цвета через obj.color, но ref игнорировался → не работал.
2) Грядка: добавлен obj.scale (scene.setScale → mesh.scaling). Урожай после
   сбора исчезает, растёт за 5с (scale 0→1) и зреет цветом красный→зелёный,
   при полном размере снова собирается.
3) Кит «HP-бар» теперь сам прячет стандартный HUD HP (setHpVisible false).
   Новый кит «Скрыть стандартный HUD HP» — отдельно прячет дефолтную полосу.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 19:13:02 +03:00
min
018fce474b fix(studio): объекты больше не вываливаются из папки после Play/Stop (folderId в serialize)
Корень: serialize примитивов/моделей/userModel НЕ сохранял folderId. При
Play→Stop сцена восстанавливалась из снапшота без группировки → все части
кита (светофор/шипы/дверь) вываливались из папки в общие «Примитивы».
Добавлен folderId в serialize всех 3 менеджеров + восстановление в loadFromArray
(model/userModel явно, primitive через opts.folderId).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 19:00:36 +03:00
min
6ece149924 fix(studio): камера 3-го лица не цепляется за проходимые зоны (canCollide в metadata)
Зона опасности / триггеры (canCollide:false) ловились camera-clamp, и камера
прыгала к игроку внутри зоны. Причина: metadata примитива НЕ содержал
canCollide, а PlayerController._clampCameraToWorld проверяет md.canCollide.
Добавлен canCollide в metadata меша (+ синк при updateInstance).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 18:49:17 +03:00
min
2d669a3ff3 fix(studio): выделение папки раскрывает дерево + Delete удаляет всю папку с содержимым
1) При выделении папки (клик по сцене / вставка кита) дерево авто-раскрывается:
   workspace + цепочка родителей + scrollIntoView к строке папки. Раньше папка
   выделялась на сцене, но в свёрнутом дереве её не было видно.
2) Delete на выделенной папке (type='folder') → removeFolder(id, true) удаляет
   всю папку со ВСЕМ содержимым + _cleanupOrphanScripts чистит осиротевшие
   скрипты привязанные к удалённым объектам.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 18:36:55 +03:00
min
46414d874b fix(studio): кит спавнится на поверхности в фокусе + многочастный в папку + снятие выделения при Play
1) Предметы кита из тулбокса спавнятся на ТВЁРДОЙ поверхности под центром
   экрана (getPlacementPointAtCenter: raycast в пол/объект), а не под камерой.
2) Многочастный кит (дверь) теперь реально попадает в папку: insertGameplayKit
   ставил folderId, но дерево не пересобиралось (markDirty не трогает
   hierarchyDirtyRef) — добавлен hierarchyDirtyRef.current=true.
3) enterPlayMode снимает любое выделение редактора (объект/папка) + убирает
   пивот папки и gizmo — в Play больше нет подсветки выбранного.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 18:30:41 +03:00
min
bf93219266 fix(studio): клик по части папки выделяет всю папку + free-drag папки + удаление обновляет дерево + затухание длинной тени
1) Длинная тень-полоса: csm.frustumEdgeFalloff=8 — тень персонажа больше не
   тянется на весь пол.
2) Удаление примитива/модели/блока через ПКМ теперь обновляет дерево
   (markDirty + hierarchyDirtyRef) — раньше объект удалялся, но не пропадал.
3) Клик по СЦЕНЕ по объекту в папке → выделяется ВСЯ папка (selectByMesh
   проверяет folderId). Отдельную часть — через раскрытие папки в дереве.
4) Free-drag папки: зажал ЛКМ на группе и тянешь — двигается вся папка
   (moveFolderBy по дельте центра).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 18:19:02 +03:00
min
ed7310a532 feat(studio): +25 готовых механик из Вики (вся партия 3 — все остальные)
Добавлены все оставшиеся механики из TOOLBOX_KITS_FROM_WIKI.md:
Мир: зона опасности, шипы, светофор, грядка-урожай, падающие предметы.
Интерфейс: счётчик очков, HP-бар, дверь по коду (textbox), метка с именем,
  обратный отсчёт, 3D-стрелка-указатель.
Эффекты: костёр (particles fire), магнит монет.
NPC и бой (новая категория): преследователь, торговец (modal.dialog),
  мишень, враг с HP, волна врагов, диалог/кат-сцена, машина (vehicle:car).
Экономика (новая категория): магазин-кнопка, кликер, ключ+замок.

+2 категории китов (NPC и бой, Экономика). Всего ~37 китов.
Опущены «Главное меню» и «Экран загрузки» — требуют целой сцены, не «1 клик».
Все 45 скриптов прошли синтаксис-проверку, билд зелёный.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 09:55:32 +03:00
min
f270854795 feat(studio): +5 готовых механик (цветная плитка/лава/лифт/финиш/звук)
Партия 2 из TOOLBOX_KITS_FROM_WIKI.md:
- Цветная плитка — onTouch → смена цвета (self.setColor).
- Лава — onTouch/onUntouch → урон 15 HP/сек пока стоишь (player.damage).
- Лифт — onTick синусоида, ездит вверх-вниз 8 единиц.
- Финиш (победа) — onTouch → экран «ПОБЕДА!» + setInputBlocked.
- Звуковая плитка — onTouch → sound.play('coin') + подсветка.

game.self расширен: setColor(hex). Все 22 кита прошли синтаксис-проверку.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 09:31:49 +03:00
min
6938f83a3c fix(studio): декор двери поворачивается в ту же сторону (левосторонняя СК Babylon)
Ручка/филёнки уезжали на обратную сторону двери: формула поворота смещения
была правосторонняя, а Babylon mesh.rotation.y — левосторонняя. Единая rotY()
(wx=lx·c+lz·s, wz=-lx·s+lz·c) для полотна И декора → всё открывается синхронно
в одну сторону.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 09:23:35 +03:00
min
0e4fa89f40 fix(studio): декор двери (филёнки+ручка) вращается вместе с полотном
Декор-части находятся по имени (findOne), их локальное смещение от центра
полотна поворачивается вокруг той же петли в place() — теперь филёнки и ручка
открываются вместе с дверью, а не висят в проёме.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 09:20:15 +03:00
min
9a58c34303 feat(studio): красивая дверь (рамка+филёнки+ручка) + плавная анимация открытия
- Дверь теперь многочастная: полотно из тёмного дерева + 2 филёнки + золотая
  ручка + косяк-рамка (2 стойки + перемычка). Уходит в общую папку.
- Плавное открытие: постоянный onTick ведёт угол cur→target со скоростью
  ~0.5с на 90° (вместо мгновенного скачка). Поворот вокруг петли сохранён.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 09:16:46 +03:00
min
32cbb7bbe9 fix(studio): дверь поворачивается вокруг петли (как настоящая), а не отскакивает
Было: дверь сдвигалась вбок. Стало: вращение вокруг левой грани (петли) на
90°. Центр двери пересчитывается по дуге вокруг hinge (p0.z - halfW), плюс
self.rotate(angle) — дверь распахивается, как в реальности.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 08:51:36 +03:00
min
4906c82792 fix(studio): портал ищет второй портал по имени, дверь уезжает вбок
- Портал: вместо хардкода +8 по X — findOne('Портал B') в момент касания и
  телепорт к реальной позиции второго портала (его можно двигать куда угодно).
  findOne на старте давал null (sceneSnapshot через rAF) → искать в onTouch.
- Дверь по E: сдвиг вбок (+3 по X) вместо ухода вниз (выглядело как исчезновение).
  Текст подсказки «Открыть / закрыть».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 08:46:34 +03:00
min
cfc79f325f feat(studio): +5 готовых механик из Вики (батут/ускорение/портал/исчезающая платформа/дверь)
Партия 1 из TOOLBOX_KITS_FROM_WIKI.md:
- Батут (пружина) — onTouch → setVy(20) подброс вверх.
- Лента ускорения — onTouch → x2 скорости на 3с.
- Портал-телепорт — пара порталов, onTouch → teleport ко второму.
- Исчезающая платформа — onTouch → через 1с пропадает, через 3с возвращается.
- Дверь по кнопке E — onInteract → дверь уезжает вниз/возвращается.

game.self расширен: setVisible(vis) / setCollide(can) (нужны для исчезающей
платформы). Все скрипты прошли синтаксис-проверку (new Function).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 07:41:25 +03:00
min
6b857636c3 fix(studio): крестик закрытия Toolbox прижат к правому краю шапки
После переработки header убрал .headerInfo (flex:1), который раздвигал
заголовок и крестик → крестик прилип к названию. Добавил margin-left:auto
кнопке закрытия.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 07:28:32 +03:00
min
c7b5f3645d fix(studio): групповые манипуляции папки в реальном времени (не телепорт)
Дельта пивота применялась только в dragEnd → объекты телепортировались в
конце. Теперь _onFolderGizmoDrag применяет инкрементальную дельту на каждом
тике (setOnDrag) — движение/вращение/масштаб группы видно в процессе, как
у одиночных объектов.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 02:53:35 +03:00
min
8b887e866a fix(studio): многочастные киты в папку + стартовая площадка задаёт спавн
- Кит из нескольких частей (сундук = тело+крышка) теперь кладётся в общую
  папку (folderManager.createFolder + assignToFolder), выделяется как группа.
  Раньше части лежали отдельно в корне.
- Кит «Стартовая площадка»: on-target скрипт телепортирует игрока НА площадку
  в начале игры (game.player.teleport через game.after 0.1с). Теперь игрок
  появляется на ней, а не в фолбэк-точке (0,0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 02:46:25 +03:00
min
4c8f8c99cb feat(studio): групповые манипуляции папки (выделение+move/rotate/scale всей группы)
Клик по папке в дереве → выделяется вся группа (подсветка всех объектов
внутри, рекурсивно по подпапкам) + групповой gizmo на пивоте в центре папки.
Манипуляторы двигают/вращают/масштабируют ВСЕ объекты папки сразу. Выбор
отдельной модели внутри — манипулирует только ей (как раньше).

- FolderManager: getFolderObjects (рекурсивный сбор + центр), moveFolderBy,
  scaleFolder (от центра, +размеры примитивов), rotateFolderY расширен на модели.
- SelectionManager.selectFolder → multi-подсветка + type:'folder' + пивот-gizmo.
- BabylonScene._attachFolderGizmo/_applyFolderGizmo: пивот-TransformNode,
  на dragEnd дельта (move/rotate/scale) применяется ко всей папке, пивот
  пересоздаётся в новом центре. Пивот убирается при смене выделения.
- Дерево: клик по строке папки = выделить группу; клик по шеврону = свернуть.

Многокомпонентные модели уже кладутся в авто-папку (ModelManager) — теперь
их можно двигать как единое целое.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 02:40:00 +03:00
min
7fc4ee94f6 fix(studio): удалённая точка спавна не появляется при Play + скрыта из дерева
Баг: после удаления точки спавна она всё равно появлялась при запуске.
Теперь _spawnEnabled синхронизируется в React (spawnEnabledUI) через
onSceneChange/load/setSpawn/deleteSpawn; пункт «Точка спавна» скрыт из дерева
когда удалён; player.start использует фолбэк (0,поверхность+2,0). Стартовая
площадка теперь срабатывает (игрок не телепортируется на старый спавн).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 02:33:15 +03:00
min
471af1cdeb fix(studio): сундук→счётчик монет через broadcast, удаление точки спавна + фолбэк 0,0
- Киты «Сундук» и «Счётчик монет» связаны через game.broadcast('coins',{add})
  + game.onMessage('coins') — раньше каждый кит в своём worker, счётчик не
  обновлялся (был globalThis, не работает между воркерами).
- Точку спавна теперь МОЖНО удалить: Delete (SelectionManager.deleteSelected
  обрабатывает type==='spawn' → scene.deleteSpawn) + ПКМ в дереве → контекст-
  меню «Навести камеру / Удалить точку спавна».
- Если точка спавна удалена (_spawnEnabled=false) — игрок появляется в
  (0, поверхность+2, 0). Постановка новой точки (setSpawnAtCamera) возвращает.
- spawnEnabled сериализуется в project_data.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 02:21:38 +03:00
min
7242e80602 fix(studio): кит «Конфетти» вылетает из позиции объекта, а не из центра сцены
Было: spawn кубиков в фикс. координатах (0,0.5,0) → конфетти сыпалось в
центре сцены, далеко от шара-источника (непонятно как связано). Стало:
кубики вылетают из game.self.position (позиции самого объекта-источника).
Описание кита уточнено: «фонтан конфетти из этого объекта».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 02:10:03 +03:00
min
df1647019d fix(studio): game.self.rotate + понятные имена скриптов китов
- game.self.rotate(ry)/rotateY(ry) добавлен в worker (слал scene.rotate с
  ref объекта-носителя). Кит «Вращающийся объект» падал 'game.self.rotate is
  not a function' каждый кадр в onTick — теперь крутится.
- upsertScript принимает name; вставка кита даёт скрипту имя = название кита
  (раньше в дереве был сырой id script_mq03...). Ручное создание скрипта тоже
  даёт «Скрипт N» / «Скрипт объекта N» вместо id.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 02:05:17 +03:00
min
781c3cf945 fix(studio): глобальные скрипты (target=game) видны в дереве и удаляемы
Баг: фильтр дерева был scripts.filter(s => !s.target) → скрипты с
target:'game' (главные скрипты игры) НЕ показывались в группе «Скрипты»
(дерево писало «Скрипты (0)»), хотя в Play исполнялись и удалить их было
нельзя. Теперь глобальный = нет target ИЛИ target==='game'.

- ПКМ по «Точка спавна» в дереве → выбирает её (открывает свойства).
- Кит «Точка спавна» → «Стартовая площадка» (точка спавна уже есть по
  умолчанию, дубль путал; её нельзя удалить — это by design).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 01:56:51 +03:00
min
4284fef704 fix(studio): F-фокус на выделенном объекте, автофокус при вставке кита, двойной прыжок
- F в редакторе теперь фокусирует камеру на ВЫДЕЛЕННОМ объекте (раньше всегда
  летел в центр 0,0,0). Если выделения нет — центр сцены. Только в edit-режиме.
- focusOnSelection поддерживает userModel + запасной путь по позиции меша.
- Вставка кита из Тулбокса: объект выделяется И камера наводится на него
  (видно, куда добавилось) + переключение на инструмент «Выделить».
- Кит «Двойной прыжок» чинён: был setJumpPower (высокий прыжок) →
  game.player.setDoubleJump(true) (настоящий второй прыжок в воздухе по Space).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 01:45:40 +03:00
min
b774f92d40 fix(studio): Toolbox UI — читаемый текст, крупнее шрифты, иконка+название в строку
Плитки категорий: убрал зависимость от CSS-переменных --text/--text-dim
(не заданы в модалке → текст был тёмный на тёмном). Явные светлые цвета.
Иконка теперь слева в одну линию с названием (grid 2 колонки), название 18px,
описание 13px. Верхние вкладки 15px. Советы/«скоро» крупнее. Trending-карточки
читаемее.
2026-06-05 01:38:34 +03:00
min
5e1a0edf9b feat(studio): задача 17 — Toolbox переработан под Roblox Creator Store
Единый Toolbox вместо отдельной кнопки «Модель» в панели «Создать»:
- 4 верхние вкладки как в Roblox: Магазин / Инвентарь / Недавние / Советы.
- Магазин: главный экран с 6 плитками-категориями (3D-объекты / Эффекты /
  2D-картинки / Готовые механики / Плагины / Аудио) + ряд «Популярное» (FREE).
- Клик по категории → детальный список с поиском и подкатегориями; «← Категории».
- 3D-объекты = 700+ моделей; Эффекты = эмиттер/луч/указатель/свет/триггер;
  Готовые механики = 12 китов; 2D/Плагины/Аудио = «Скоро будет».
- Инвентарь = мои воксельные модели; Недавние = модели сообщества; Советы = гайд.
- TopRibbon: кнопка «Модель» → «Toolbox» (открывает магазин); вкладка «Модель»
  переименована в «Редактор моделей» (создание своих воксельных ассетов).
- CSS: topTabs/catGrid/catTile/trendRow/breadcrumb/soon/tips/freeBadge.

Вся прежняя логика моделей (lazy-load, лайки, thumbnails) сохранена внутри
новой структуры. Esc в категории → назад к плиткам.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 01:33:39 +03:00
min
d62739d709 feat(studio): задача 17 — Toolbox «Готовые механики» (gameplay-киты)
Фаза T2: вкладка «Готовые механики» в Тулбоксе — 12 готовых китов
(Бег на Shift, Смена дня/ночи, Счётчик монет, Таймер, Приветствие, Сундук,
Чекпоинт, Конфетти, Парящая платформа, Вертушка, Двойной прыжок, Точка спавна).

- GameplayKits.js — каталог китов (scripts global/on-target + prims), getKit.
- ToolboxModal.jsx — section 'gameplay' + категории (Движение/Мир/Интерфейс/
  Эффекты) + карточки китов + поиск; клик → onPick('kit:<id>').
- KubikonEditor.jsx — insertGameplayKit: создаёт примитивы кита перед камерой,
  привязывает on-target скрипт к первому примитиву, global-скрипты добавляет в
  проект (upsertScript). Безопасность: киты наши, существующий sandbox.

Тест-игра «Игра за 5 минут» id=2544 (dev-режим is_test): town + применённые
киты (welcome/timer/coins/day-night/shift-run + сундук/чекпоинт/конфетти/
платформа). Проверено в плеере — все 5 скриптов исполняются без ошибок.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 01:16:35 +03:00
min
8a7ab9aadf docs(studio): вики задача 16 — карточка #62 + статья «Небесная демка»
Карточка g5 #62 guide-skybox (preview guide-skybox-scene.png, openProjectId
2541) + статья в docsLessons (что получится, API setSkybox/setClouds/setFog/
fadeTo, 3 шага, 4 скриншота день/ночь/космос) + иконка cloud в docsIcons.

Скрины в public/wiki (вне git) — на прод донести вручную при возврате CI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 00:56:50 +03:00
min
a4881ee5ce fix(studio): единая система неба — убрать второе (жёлтое) солнце
Environment больше НЕ рисует свою жёлтую сферу-солнце/луну/фон (флаг
_drawSkyBodies=false) — иначе на небе было два солнца. Единое небо рисует
SkyboxManager (купол + солнечный диск + облака + горы). SkyboxManager стал
единым источником освещения: каждый пресет выставляет direction/intensity/
color солнца и ambient (lights переданы в конструктор), fadeTo плавно ведёт
и свет. Environment оставлен только для day/night cycle совместимости.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 00:44:25 +03:00
min
71536668f2 feat(studio): задача 16 — кастомное небо (SkyboxManager)
Процедурный gradient-skybox без внешних текстур: купол-сфера с ShaderMaterial
(градиент верх→горизонт→низ + солнечный диск + дымка), low-poly горы на
горизонте, billboard-облака с дрейфом, атмосферный туман, звёзды.

Пресеты: clear-summer-day / lowpoly-roblox / cloudy / sunset / starry-night /
space. Плавный fadeTo между пресетами (анимация цветов купола в tick).

game-API (студия): game.scene.setSkybox/setClouds/setFog,
game.scene.skybox.fadeTo/setSunDirection. Сериализация неба в project_data.
Тик облаков/перехода работает и в редакторе (превью).

Плеер пока НЕ портирован (по указанию — сначала проверка в студии).
Тест-игра «Небесная демка» id=2541 (dev-режим is_test=true, не в ленте).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 00:17:23 +03:00
min
75e83a9f3b feat(studio): UX-правки редактора — выбор, копирование, userModels, free-drag
- Дерево «Объекты сцены»: авто-раскрытие ветки + скролл к объекту при
  выборе на сцене (HierarchyPanel useEffect на selection).
- Копирование/дублирование примитива сохраняет вращение rotationX/Y/Z
  (SelectionManager клал selection без rotation → копия теряла поворот).
- Копирование/дублирование переносит скрипты объекта на копию
  (_copyScriptsToNewObject + clip.scripts для Ctrl+C/V).
- userModels (воксельные модели) теперь видны в дереве в группе «Мои
  модели», можно выбрать/удалить/прикрепить скрипт (target kind userModel
  уже поддержан в GameRuntime).
- Free-drag: перетаскивание объекта ЛКМ как в Roblox Studio — скольжение
  по полу/поверх объектов с AABB-коллизией (скольжение вдоль преграды).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-06-04 23:54:30 +03:00
min
b7e3620a21 fix(wiki): cache-buster ?v на картинках вики (битый SPA-fallback в кэше)
All checks were successful
CI / Lint (pull_request) Successful in 1m9s
CI / Build (pull_request) Successful in 2m3s
CI / Secret scan (pull_request) Successful in 2m36s
CI / PR size check (pull_request) Successful in 8s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
У юзеров, открывавших статью/карточку ДО заливки PNG в build/wiki/,
браузер кэшировал SPA-fallback (HTML index.html вместо картинки) и
Ctrl+Shift+R не помогал (инцидент с guide-taxisim). Добавлен версионный
?v=N ко всем wiki-URL (Shot + карточки) — новый URL обходит битый кэш.
Бампать WIKI_ASSET_V при добавлении новых картинок.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 07:21:52 +03:00
min
d0ceb418ce feat(14): Vehicle System V1+V2 (#26)
All checks were successful
CI / Lint (push) Successful in 1m10s
CI / Build (push) Successful in 2m17s
CI / Secret scan (push) Successful in 2m31s
CI / PR size check (push) Has been skipped
CI / Deploy to S1 + S2 (push) Successful in 2m55s
2026-06-02 23:33:35 +00:00
min
2fda576e11 feat(14): Vehicle System V1+V2 — машины, на которых можно ездить
All checks were successful
CI / Lint (pull_request) Successful in 1m9s
CI / Build (pull_request) Successful in 2m2s
CI / Secret scan (pull_request) Successful in 2m36s
CI / PR size check (pull_request) Successful in 8s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Система транспорта для Рублокс-студии (задача 14 Недели 4):
- VehicleManager — аркадная физика (газ/руль/тормоз/реверс), коллизия
  через physics.moveAABB; GLB-кузов Kenney car-kit (колёса в модели).
- VehicleHud — графический спидометр-стрелка (SVG, 270° дуга) + передача D/R/N.
- Вход hold-F / выход E; камера follow/капот/кинематографичная (V циклит).
- game.scene.spawn(vehicle:car, opts) + onVehicleEnter/onVehicleExit.
- Звук мотора: низкочастотный рокот (бас-пила + шум + LFO-пульсация тактов),
  pitch/громкость ∝ скорости — не воющий тон.
- Авто оседает на землю при спавне (_settle + повторы при поздней готовности
  физики) — не висит/не тонет.
- Водитель скрывается за рулём; падение в бездну → выход + респавн.
- Производительность: addShadowCaster фильтрует мелкие/тонкие/огромный пол меши;
  InstancedMesh без receiveShadows (фикс тормозов 5→50 FPS).
- Вики: карточка #61 «Такси-симулятор» + статья + 2 скриншота.
- incrementPlay(id, userId) — передаём user_id для self/user-cooldown.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-06-03 02:24:43 +03:00
min
ba519eaaf8 Merge pull request 'feat(13): ������� ���� ���� (game.mainMenu)' (#25) from feat/main-menu-task13 into main
All checks were successful
CI / Lint (push) Successful in 1m9s
CI / Build (push) Successful in 2m6s
CI / Secret scan (push) Successful in 2m32s
CI / PR size check (push) Has been skipped
CI / Deploy to S1 + S2 (push) Successful in 3m12s
2026-06-02 21:21:50 +00:00
min
f0e284878e feat(13): главное меню игры (game.mainMenu)
All checks were successful
CI / Lint (pull_request) Successful in 1m19s
CI / Build (pull_request) Successful in 2m6s
CI / Secret scan (pull_request) Successful in 2m36s
CI / PR size check (pull_request) Successful in 8s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Живое 3D-меню как в топ-играх Roblox: cinematic-камера облетает витрину,
патч-ноуты, логотип, кнопка ИГРАТЬ, музыка, блок управления.
- game.mainMenu.show/hide/setCamera/setPatchNotes/onShow/onPlay/onHide
- 4 режима камеры: cinematic(waypoints)/orbit/static/preset-cuts поверх camera.cutscene
- зацикливание облёта через onCutsceneDone (камера не вылетает за сцену)
- game.player.setInputBlocked экспортирован в worker + handler в runtime
- passthrough scene.mainMenu в toJSON/load
- вики g5 #60 guide-garage, тест-игра «Гараж Босса» id 2434 (GLB-машина Kenney)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 00:07:33 +03:00
min
9c93582927 Merge pull request 'feat(12): ������������� Loading Screen (game.loading)' (#24) from feat/loading-screen-task12 into main
All checks were successful
CI / Lint (push) Successful in 1m18s
CI / Build (push) Successful in 2m11s
CI / Secret scan (push) Successful in 2m32s
CI / PR size check (push) Has been skipped
CI / Deploy to S1 + S2 (push) Successful in 2m25s
2026-06-02 20:10:49 +00:00
min
ef29c11473 docs(12): финал вики Такси-босс (3 локации) + короткие описания карточек
All checks were successful
CI / Lint (pull_request) Successful in 1m10s
CI / Build (pull_request) Successful in 2m7s
CI / Secret scan (pull_request) Successful in 2m37s
CI / PR size check (pull_request) Successful in 7s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Карточка guide-taxi: упоминание 3 локаций (гараж/город/магазин), описание
сжато до 1-2 предложений (как у соседних). Статья: триггер через GUI-кнопку,
интерьер магазина, Try на 4-ю локацию. Заодно сжато описание guide-zavod.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 22:53:51 +03:00
min
34060c90c3 feat(12): внутриигровой Loading Screen (game.loading)
All checks were successful
CI / Lint (pull_request) Successful in 1m13s
CI / Build (pull_request) Successful in 2m3s
CI / Secret scan (pull_request) Successful in 2m35s
CI / PR size check (pull_request) Successful in 8s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Программный экран загрузки для перехода между мирами:
- game.loading.show(opts) → хэндл (setProgress/setText/setCover/close/onSkip/onComplete)
- game.loading.transition(opts) → Promise (фейковый прогресс за duration)
- cover sceneSnapshot, прогресс-бар+процент, спиннер, кнопка Пропустить, логотип
- blockInput + пауза симуляции, fadeIn/Out; tick независим от paused
- настройки проекта «Экран загрузки» (логотип/акцент/дефолты) + 3 сниппета
- LoadingScreenOverlay.js (новый DOM-оверлей), worker namespace loading,
  cmd loading.* + _ensureLoadingScreen, serialize/load конфига в scene
- вики g5 #59 guide-taxi (карточка + урок), тест-игра «Такси-босс» id 2427

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 22:00:26 +03:00
min
5633762783 ci: verify-шаг не валится на недоступном root-мусоре в build/wiki
All checks were successful
CI / Lint (push) Successful in 1m8s
CI / Build (push) Successful in 1m56s
CI / Secret scan (push) Successful in 2m33s
CI / PR size check (push) Has been skipped
CI / Deploy to S1 + S2 (push) Successful in 2m17s
du -sh натыкался на systemd-private-* в build/wiki/tmp (Permission
denied) → exit 1 → deploy failure, хотя rsync долетел. Теперь verify
проверяет наличие index.html, а du неблокирующий (2>/dev/null||true).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 20:43:23 +03:00
min
153bba7c5b Merge pull request 'feat(11): placement mode + ����' (#23) from feat/placement-task11 into main
Some checks failed
CI / Lint (push) Successful in 1m9s
CI / Build (push) Successful in 1m56s
CI / Secret scan (push) Successful in 2m33s
CI / PR size check (push) Has been skipped
CI / Deploy to S1 + S2 (push) Failing after 2m24s
2026-06-02 17:24:19 +00:00
min
b2b545344a fix(11): guard от потери userModels/scripts при автосейве
All checks were successful
CI / Lint (pull_request) Successful in 1m7s
CI / Build (pull_request) Successful in 2m3s
CI / Secret scan (pull_request) Successful in 2m35s
CI / PR size check (pull_request) Successful in 8s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
При частичной загрузке сцены (terrain догрузился, модели/скрипты ещё
нет из-за таймаута) автосейв затирал scene нулями. Блокируем сейв если
ранее загружено >0 объектов, а сейчас 0 и пользователь не редактировал;
loadFailedRef в safety-timer блокирует автосейв при таймауте загрузки.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 20:09:36 +03:00
min
ee1b7352b7 feat(11): placement mode — расстановка предметов (tycoon)
Some checks failed
CI / Lint (pull_request) Successful in 1m15s
CI / Build (pull_request) Successful in 1m58s
CI / Secret scan (pull_request) Failing after 9s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Движок: PlacementManager (тень-превью формой воксельной модели за курсором,
снап к сетке, стопка, проверка зоны и баланса, поворот R/колесо, ПКМ/Esc),
ShopInventoryUi (магазин-слоты, авто-серые при нехватке валюты); проводка
game.placement.* и game.inventoryUi.* в worker/GameRuntime/BabylonScene.

Попутные фиксы:
- TerrainManager: backFaceCulling=false — воксели не просвечивают (видна была
  задняя грань сквозь переднюю);
- KubikonEditor: guard от потери userModels/scripts при частичной загрузке
  (terrain догрузился, модели/скрипт нет → автосейв затирал) — критичный
  фикс защиты данных для ВСЕХ игр;
- Hotbar: пустой инвентарь не показывает панель (глобальное правило);
- MinimapOverlay: миникарта только по флагу игры (не авто на больших картах);
- cleanup usermodel-инстансов при Stop.

Вики: карточка #58 + статья-урок «Мой завод» (g5 Разбор готовых игр),
openProjectId=2345, скриншоты залиты на прод.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 19:06:03 +03:00
71af96d171 ci: redeploy после restart runner (capacity 4->1, чистый кэш act)
All checks were successful
CI / Lint (push) Successful in 2m34s
CI / Build (push) Successful in 1m50s
CI / Secret scan (push) Successful in 2m33s
CI / PR size check (push) Has been skipped
CI / Deploy to S1 + S2 (push) Successful in 2m31s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 22:08:20 +03:00
min
e337abcbbc Merge pull request 'feat(10): ����� 3D-������� (attachFace) + �������-������� + ���� ������ 10' (#21) from feat/studs-material-09 into main
Some checks failed
CI / Lint (push) Failing after 7s
CI / PR size check (push) Has been skipped
CI / Secret scan (push) Failing after 14m41s
CI / Build (push) Failing after 14m48s
CI / Deploy to S1 + S2 (push) Has been cancelled
2026-06-01 19:07:01 +00:00
8a3936b9ce Merge remote-tracking branch 'origin/main' into feat/studs-material-09
Some checks failed
CI / Build (pull_request) Failing after 8s
CI / PR size check (pull_request) Successful in 14s
CI / Lint (pull_request) Successful in 1m8s
CI / Secret scan (pull_request) Successful in 3m4s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
2026-06-01 22:04:23 +03:00
3422ca2a03 ci: re-run после очистки битого кэша actions runner (/root/.cache/act non-fast-forward update ломал checkout dist)
All checks were successful
CI / PR size check (pull_request) Successful in 34s
CI / Lint (pull_request) Successful in 2m57s
CI / Secret scan (pull_request) Successful in 2m59s
CI / Build (pull_request) Successful in 3m46s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 21:59:28 +03:00
16f816a015 ci: свежий sha — Gitea не обновил статус Lint после ретрая (лог job=succeeded, но commit-status застрял на failure)
Some checks failed
CI / Lint (pull_request) Failing after 5s
CI / Build (pull_request) Failing after 7s
CI / PR size check (pull_request) Successful in 11s
CI / Secret scan (pull_request) Successful in 3m24s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 21:53:49 +03:00