Проверено вживую в Chrome: лобби -> матч -> бот ходит -> результат -> статистика в лобби. Полный матч отыгран, оба исхода видел. Баги, которые собирались и типизировались, но падали только в рантайме: 1. Canvas не менял размер под экран. Своего cc.Widget у него не было, а alignCanvasWithScreen правит только камеру. Canvas оставался 1280x720, и все растянутые по нему дети — тоже. 2. [...map.values()] превращается сборкой в [].concat(map.values()), а concat не разворачивает итератор, а кладёт его одним элементом. Отсюда "view.cancelAnimations is not a function" на первой же уборке карт. Теперь Array.from. 3. Рубашка козыря рисовалась поверх колоды, а не под ней. Вёрстка переделана под требование UI.md (4:3 .. 21:9): - fitWidth даёт постоянную ширину, но не высоту: на 4:3 видно только ±720 юнитов. Кнопка "Leave" на y=840 и низ руки на -860 были за экраном именно там, где это важнее всего - рука и панель действий считаются от нижней границы экрана, "Leave" прибит виджетом к левому верхнему углу - стол — один ряд до шести карт вместо двух рядов по три: экономит ~215 юнитов высоты, которых на 4:3 нет. Ряд центрируется по тем картам, что реально на столе - затемнение под окном результата рисуется непрозрачным спрайтом: тонировать и без того полупрозрачный спрайт почти ничего не даёт Инструменты: - npm run serve — отдаёт сборку и роут /_aspects: игра в трёх фиксированных iframe-ах 4:3 / 16:9 / 21:9. Движок подгоняет себя под окно, поэтому iframe — единственный простой способ увидеть вёрстку в форме, которой окно не имеет - npm run check:spreads — ловит спред неитерируемого в массив - npm run check — чистота core, спреды, сцены, типы, тесты Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
28 lines
845 B
JSON
28 lines
845 B
JSON
{
|
|
"name": "fool-cardgame",
|
|
"uuid": "2d8862c1-33e6-4159-bb31-fc590692a1e5",
|
|
"creator": {
|
|
"version": "3.8.8"
|
|
},
|
|
"dependencies": {
|
|
"@utcp/code-mode": "^1.2.13",
|
|
"sharp": "^0.35.4"
|
|
},
|
|
"devDependencies": {
|
|
"typescript": "~5.6",
|
|
"vitest": "^3.2.7"
|
|
},
|
|
"scripts": {
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"typecheck": "tsc -p tsconfig.test.json",
|
|
"check:core-purity": "node scripts/check-core-purity.mjs",
|
|
"stats:bot": "vitest run --config vitest.stats.mts",
|
|
"build:art": "node scripts/build-art.mjs",
|
|
"check:scenes": "node scripts/check-scenes.mjs",
|
|
"check": "npm run check:core-purity && npm run check:spreads && npm run check:scenes && npm run typecheck && npm test",
|
|
"serve": "node scripts/serve-build.mjs",
|
|
"check:spreads": "node scripts/check-spreads.mjs"
|
|
}
|
|
}
|