Symmetric 5-bumper fixed center layout

3 → 5 fixed bumpers: 2 верхних (AI side) + 1 центр + 2 нижних (player
side). Раскладка зеркальна относительно centerY и vertical centerline.

- Все source = 'fixed_last_touch' (defensive scoring v3.10 без изменений)
- Type остаётся standard
- Зона y ∈ 560..720 при centerY=640 — не пересекается с AI setup (y≤300),
  player setup (y≥980), флипперами (y=100, 1180) или touch zones (y≥1060)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
aevgarik
2026-05-24 08:17:36 +03:00
parent 32b894ec08
commit 048f9ebdee

View File

@@ -117,13 +117,18 @@ export class MatchScene extends Phaser.Scene {
{ onHit: (_f, ballBody) => this.handleFlipperHit('ai', ballBody) },
);
// === Fixed bumpers (3 в центральной зоне, симметрично) ===
// === Fixed bumpers (5, симметрично относительно центра по обеим осям) ===
// source = 'fixed_last_touch' → очки last-touch'еру (см. v3.10).
// Раскладка: 2 верхних + 1 центр + 2 нижних, зеркал относительно centerY.
// Зона y ∈ {centerY-80, centerY, centerY+80} = 560..720 при centerY=640.
// Не пересекается с AI setup (y≤300), player setup (y≥980), флипперами или touch zones.
const cy = g.centerY;
const fixedPositions: Array<[number, number]> = [
[GAME_WIDTH * 0.25, cy - 80],
[GAME_WIDTH * 0.75, cy - 80],
[GAME_WIDTH * 0.5, cy + 80],
[GAME_WIDTH * 0.5, cy],
[GAME_WIDTH * 0.25, cy + 80],
[GAME_WIDTH * 0.75, cy + 80],
];
for (const [fx, fy] of fixedPositions) {
this.fixedBumpers.push(