Commit Graph

2 Commits

Author SHA1 Message Date
aevgarik
8e49e088b0 Post-codex-review fixes: build, telemetry, last-touch, tests
- Fix #1 (Critical): rename private `data` → `sceneData` in Match/Setup/Result
  scenes (collided с Phaser.Scene.data DataManager, ломало TS build).
  Убран unused `game` var в main.ts. typecheck + build теперь зелёные.
- Fix #3: matchId генерируется один раз в MatchScene.create() и
  переиспользуется в match_start, match_end, MatchResult — telemetry funnel
  теперь связывается.
- Fix #4: AI setup сохраняется в `aiSetupConfig` и кладётся в MatchResult.aiSetup
  (раньше всегда пустой). Также убрана двойная инстанциация AI
  (createAIPlayer() вызывался дважды).
- Fix #5: last-touch меняется на ЛЮБОМ касании флиппера (активном или
  пассивном). Раньше owner не обновлялся при пассивном отскоке → ломалась
  autogoal-логика.
- Lint: убран unused `oldOwner` параметр в spawnBall callback.
- Tests: добавлены 16 unit-тестов для calculateScores
  (`src/scoring/calculateScores.test.ts`) — покрытие baseline, mode/difficulty
  multipliers, penalty стэкинг, double-points (local-only), Anti-A2W
  invariant (base ≤ local при penalty без double-points).
- package-lock.json закоммичен для reproducible build.

Codex findings #2 (Phase 2 DoD: drag-and-drop setup, curve bumper physics,
Share button, Easy/Medium delta) — отдельным заходом.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 03:43:59 +03:00
dc53623001 Phase 0-2: Vite/Phaser 4/TS boilerplate + Platform Adapter + core match (vs 4 AI personalities)
Phase 0 (foundation):
- package.json, tsconfig.json (strict), vite.config.ts (base: './'), .eslintrc.cjs
- index.html, src/main.ts (Phaser game init + platform detection)
- src/config/defaults.ts (Remote Config defaults, palette, constants)
- src/types/index.ts (все schemas из data-contracts: SaveState, MatchResult, RemoteConfig, etc.)
- src/platform/: PlatformAdapter interface + MockPlatformAdapter + YgPlatformAdapter

Phase 1 (core mechanics):
- src/scenes/: Boot, Preload, MainMenu (Quick Match selector), Setup, Match, Result
- src/game/: Table (геометрия + walls + ворота), Ball (last-touch + color tracking), Flipper (player + AI, swing + cooldown), Bumper (4 типа: standard/slingshot/curve/turbo)
- src/scoring/: MatchTracker (last-touch + bumper points), calculateScores (unified scoring pipeline per data-contracts v3.8 requirement)
- src/ai/: AIPlayer interface + DefensiveAI Easy/Medium

Phase 2 (setup + AI personalities):
- src/scenes/SetupScene (5 active slots, click-cycle bumper types, 30s timer)
- src/ai/personalities/: AggressiveAI, TricksterAI, GhostAI (Easy/Medium; Hard cradle-aim = Phase 3)
- src/ai/factory.ts (createAIPlayer)
- MainMenuScene: выбор AI-личности + сложности
- MatchScene использует factory вместо хардкода

Anti-A2W enforcement: calculateScores применяет penalty per v3.5 model
(Continue × 0.5, Campaign Skip × 0.7, +1 заряд × 0.9, реролл × 0.85,
Boost active × 0.7; ×2 sezon очки только в local).

Что НЕ в этом commit'е (следующие фазы):
- Phase 3: бустер «Захват» (cradle + slow-mo), Hard AI (cradle-aim solver), Ghost adaptation, YG Player API cloud-save, achievements
- Phase 4: Campaign (12 матчей), Tournament (8/16 bracket), шейдеры (CRT + bloom + chromatic aberration), 29 AI-арт ассетов, музыка
- Phase 5: реальная YG SDK интеграция (ads + payments), Remote Config Nakama RPC
- Phase 6: YG submission

Pre-greenlit concept-пакет — ~/Knowledge/Projects/pinball-duel/ (19 файлов, 10 audit-раундов).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 03:25:17 +03:00