refactor(Phase10Game): remove trailing whitespace and align object properties

- Remove trailing whitespace throughout the file.
- Align object properties and ternary operators for improved readability.
- Adjust button positioning offset in staging laydown UI.
This commit is contained in:
Brian Fertig 2026-05-17 14:53:01 -06:00
parent 238c744e93
commit 731937bb82
1 changed files with 61 additions and 61 deletions

View File

@ -41,10 +41,10 @@ const D = {
// Suit color tinting.
const SUIT = {
red: { fill: 0xfbe7e2, stroke: 0xc92a2a, num: '#c92a2a' },
blue: { fill: 0xe2ecfb, stroke: 0x2b7fbf, num: '#1c63a3' },
red: { fill: 0xfbe7e2, stroke: 0xc92a2a, num: '#c92a2a' },
blue: { fill: 0xe2ecfb, stroke: 0x2b7fbf, num: '#1c63a3' },
yellow: { fill: 0xfbf3d4, stroke: 0xc69a1f, num: '#a17a10' },
green: { fill: 0xdff3e3, stroke: 0x2f9e44, num: '#1c6b30' },
green: { fill: 0xdff3e3, stroke: 0x2f9e44, num: '#1c6b30' },
};
const WILD_FILL = 0xf2ead8;
const WILD_STRIPE = 0xc8a84b;
@ -63,54 +63,54 @@ function slotLayout(slot) {
case 'bottom':
return {
rotation: 0,
handStart: { x: 460, y: 990 },
handAxis: 'x',
handFaceUp: true,
laidStart: { x: 700, y: 720 },
laidAxis: 'x',
portrait: { x: 684, y: 846, r: 56 },
nameLabel: { x: 684, y: 916 },
chip: { x: 752, y: 870 },
handStart: { x: 460, y: 990 },
handAxis: 'x',
handFaceUp: true,
laidStart: { x: 700, y: 720 },
laidAxis: 'x',
portrait: { x: 684, y: 846, r: 56 },
nameLabel: { x: 684, y: 916 },
chip: { x: 752, y: 870 },
rotateCards: 0,
};
case 'top':
return {
rotation: 180,
handStart: { x: 460, y: 60 },
handAxis: 'x',
handFaceUp: false,
laidStart: { x: 700, y: 344 },
laidAxis: 'x',
portrait: { x: 1094, y: 198, r: 50 },
nameLabel: { x: 1094, y: 262 },
chip: { x: 752, y: 180 },
handStart: { x: 460, y: 60 },
handAxis: 'x',
handFaceUp: false,
laidStart: { x: 700, y: 344 },
laidAxis: 'x',
portrait: { x: 1094, y: 198, r: 50 },
nameLabel: { x: 1094, y: 262 },
chip: { x: 752, y: 180 },
rotateCards: 180,
};
case 'left':
return {
rotation: 90,
handStart: { x: 60, y: 900 },
handAxis: 'y-up',
handFaceUp: false,
laidStart: { x: 524, y: 340 },
laidAxis: 'y',
portrait: { x: 180, y: 266, r: 50 },
nameLabel: { x: 180, y: 202 },
chip: { x: 180, y: 328 },
handStart: { x: 60, y: 900 },
handAxis: 'y-up',
handFaceUp: false,
laidStart: { x: 524, y: 340 },
laidAxis: 'y',
portrait: { x: 180, y: 266, r: 50 },
nameLabel: { x: 180, y: 202 },
chip: { x: 180, y: 328 },
chipRotation: Math.PI / 2,
rotateCards: 90,
};
case 'right':
return {
rotation: 270,
handStart: { x: 1860, y: 900 },
handAxis: 'y-up',
handFaceUp: false,
laidStart: { x: 1396, y: 340 },
laidAxis: 'y',
portrait: { x: 1740, y: 670, r: 50 },
nameLabel: { x: 1740, y: 734 },
chip: { x: 1740, y: 608 },
handStart: { x: 1860, y: 900 },
handAxis: 'y-up',
handFaceUp: false,
laidStart: { x: 1396, y: 340 },
laidAxis: 'y',
portrait: { x: 1740, y: 670, r: 50 },
nameLabel: { x: 1740, y: 734 },
chip: { x: 1740, y: 608 },
chipRotation: -Math.PI / 2,
rotateCards: 270,
};
@ -119,7 +119,7 @@ function slotLayout(slot) {
}
}
const DRAW_POS = { x: CX - 80, y: CY };
const DRAW_POS = { x: CX - 80, y: CY };
const DISCARD_POS = { x: CX + 80, y: CY };
// ── Scene ───────────────────────────────────────────────────────────────────
@ -130,7 +130,7 @@ export default class Phase10Game extends Phaser.Scene {
this.gameDef = data.game;
this.opponents = data.opponents ?? [];
this.playfield = data.playfield ?? null;
this.cardBack = data.cardBack ?? null;
this.cardBack = data.cardBack ?? null;
this.gs = null;
this.animating = false;
@ -153,7 +153,7 @@ export default class Phase10Game extends Phaser.Scene {
this.potentialDrag = null;
this.stagingGroups = null;
this.submitBtn = null;
this.clearBtn = null;
this.clearBtn = null;
}
create() {
@ -254,10 +254,10 @@ export default class Phase10Game extends Phaser.Scene {
.setStrokeStyle(2, COLORS.accent).setDepth(D.pile)
.setInteractive({ useHandCursor: true });
drawRect.on('pointerdown', () => this.onDrawDeckClick());
this.add.text(DRAW_POS.x, DRAW_POS.y - CARD_H/2 - 18, 'DRAW', {
this.add.text(DRAW_POS.x, DRAW_POS.y - CARD_H / 2 - 18, 'DRAW', {
fontFamily: '"Julius Sans One"', fontSize: '14px', color: COLORS.mutedHex,
}).setOrigin(0.5).setDepth(D.ui);
this.drawPileText = this.add.text(DRAW_POS.x, DRAW_POS.y + CARD_H/2 + 16, '', {
this.drawPileText = this.add.text(DRAW_POS.x, DRAW_POS.y + CARD_H / 2 + 16, '', {
fontFamily: '"Julius Sans One"', fontSize: '14px', color: COLORS.accentHex,
}).setOrigin(0.5).setDepth(D.ui);
this.drawPileRect = drawRect;
@ -267,7 +267,7 @@ export default class Phase10Game extends Phaser.Scene {
.setStrokeStyle(2, COLORS.muted).setDepth(D.pile)
.setInteractive({ useHandCursor: true });
discRect.on('pointerdown', () => this.onDiscardPileClick());
this.add.text(DISCARD_POS.x, DISCARD_POS.y - CARD_H/2 - 18, 'DISCARD', {
this.add.text(DISCARD_POS.x, DISCARD_POS.y - CARD_H / 2 - 18, 'DISCARD', {
fontFamily: '"Julius Sans One"', fontSize: '14px', color: COLORS.mutedHex,
}).setOrigin(0.5).setDepth(D.ui);
this.discardPileRect = discRect;
@ -296,7 +296,7 @@ export default class Phase10Game extends Phaser.Scene {
tab.setInteractive(new Phaser.Geom.Rectangle(-18, -110, 36, 220), Phaser.Geom.Rectangle.Contains);
tab.input.cursor = 'pointer';
tab.on('pointerover', () => drawTab(COLORS.accent));
tab.on('pointerout', () => drawTab(this.playbookOpen ? COLORS.accent : COLORS.panel));
tab.on('pointerout', () => drawTab(this.playbookOpen ? COLORS.accent : COLORS.panel));
tab.on('pointerdown', () => this.togglePlaybook());
this.playbookTab = tab;
@ -357,7 +357,7 @@ export default class Phase10Game extends Phaser.Scene {
this.playbookPanel = panel;
this.playbookPanelW = panelW;
this.playbookClosedX = panelX;
this.playbookOpenX = GAME_WIDTH - panelW / 2 - 40;
this.playbookOpenX = GAME_WIDTH - panelW / 2 - 40;
}
togglePlaybook() {
@ -742,8 +742,8 @@ export default class Phase10Game extends Phaser.Scene {
const g = this.stagingGroups[gi];
const gw = g.count * (LAIDOWN_CARD_W * 0.75) + (LAIDOWN_CARD_W * 0.25);
const kindLabel = g.kind === 'set' ? `Set of ${g.count}`
: g.kind === 'run' ? `Run of ${g.count}`
: `${g.count} of one color`;
: g.kind === 'run' ? `Run of ${g.count}`
: `${g.count} of one color`;
const lbl = this.add.text(cx + gw / 2, panelY + PY + 2, kindLabel, {
fontFamily: 'Righteous', fontSize: '13px', color: COLORS.goldHex,
}).setOrigin(0.5, 0).setDepth(D.card - 1);
@ -848,7 +848,7 @@ export default class Phase10Game extends Phaser.Scene {
if (Math.abs(cardX - gc.x) < gc.w / 2 + 20 && Math.abs(cardY - gc.y) < gc.h / 2 + 20) {
if (groupTargets.length === 1) return { type: 'hit', ...groupTargets[0] };
// Run with both low and high: pick based on which side the card is on.
const low = groupTargets.find((t) => t.position === 'low');
const low = groupTargets.find((t) => t.position === 'low');
const high = groupTargets.find((t) => t.position === 'high');
const chosen = (low && cardX < gc.x) ? low : (high ?? low);
return { type: 'hit', ...chosen };
@ -881,7 +881,7 @@ export default class Phase10Game extends Phaser.Scene {
}
}
if (layout.laidAxis === 'x') cursorX += groupW + GROUP_GAP;
else cursorY += N * (LAIDOWN_CARD_H * 0.5) + GROUP_GAP;
else cursorY += N * (LAIDOWN_CARD_H * 0.5) + GROUP_GAP;
}
return null;
}
@ -1143,7 +1143,7 @@ export default class Phase10Game extends Phaser.Scene {
this.cardObjs.set(`hand-${seat}-${card.id}`, c);
if (seat === 0) {
this.localHandCards.push(c);
c.setInteractive(new Phaser.Geom.Rectangle(-CARD_W/2, -CARD_H/2, CARD_W, CARD_H), Phaser.Geom.Rectangle.Contains);
c.setInteractive(new Phaser.Geom.Rectangle(-CARD_W / 2, -CARD_H / 2, CARD_W, CARD_H), Phaser.Geom.Rectangle.Contains);
c.input.cursor = 'pointer';
c.on('pointerdown', (pointer) => this.onHandPointerDown(i, pointer));
}
@ -1197,7 +1197,7 @@ export default class Phase10Game extends Phaser.Scene {
// Advance cursor for next group
if (layout.laidAxis === 'x') cursorX += groupW + GROUP_GAP;
else cursorY += N * (LAIDOWN_CARD_H * 0.5) + GROUP_GAP;
else cursorY += N * (LAIDOWN_CARD_H * 0.5) + GROUP_GAP;
}
}
@ -1259,8 +1259,8 @@ export default class Phase10Game extends Phaser.Scene {
totalW += this.stagingGroups[i].count * (LAIDOWN_CARD_W * 0.75) + (LAIDOWN_CARD_W * 0.25);
}
const panelX = laidStart.x - 14;
const panelW = totalW + 28;
const btnX = panelX + panelW + 160;
const panelW = totalW + 28;
const btnX = panelX + panelW + 200;
this.submitBtn = new Button(this, btnX, laidStart.y - 18, 'Submit Phase', () => this.submitStagingLaydown(), {
width: 200, height: 44, fontSize: 18,
}).setDepth(D.ui);
@ -1271,7 +1271,7 @@ export default class Phase10Game extends Phaser.Scene {
_destroyStagingButtons() {
if (this.submitBtn) { this.submitBtn.destroy(); this.submitBtn = null; }
if (this.clearBtn) { this.clearBtn.destroy(); this.clearBtn = null; }
if (this.clearBtn) { this.clearBtn.destroy(); this.clearBtn = null; }
}
// ── Local input ─────────────────────────────────────────────────────────
@ -1400,7 +1400,7 @@ export default class Phase10Game extends Phaser.Scene {
const w = 560, h = 280;
const panel = this.add.rectangle(CX, CY, w, h, COLORS.panel, 1)
.setStrokeStyle(2, COLORS.accent).setDepth(D.modal);
const title = this.add.text(CX, CY - h/2 + 40, 'Skip which player?', {
const title = this.add.text(CX, CY - h / 2 + 40, 'Skip which player?', {
fontFamily: 'Righteous', fontSize: '28px', color: COLORS.goldHex,
}).setOrigin(0.5).setDepth(D.modal);
@ -1434,7 +1434,7 @@ export default class Phase10Game extends Phaser.Scene {
}, { width: 160, height: 56, fontSize: 18 }).setDepth(D.modal);
buttons.push(btn);
});
const cancelBtn = new Button(this, CX, CY + h/2 - 40, 'Cancel', () => {
const cancelBtn = new Button(this, CX, CY + h / 2 - 40, 'Cancel', () => {
overlay.destroy(); panel.destroy(); title.destroy();
for (const b of buttons) b.destroy();
cancelBtn.destroy();
@ -1549,16 +1549,16 @@ export default class Phase10Game extends Phaser.Scene {
const summary = this.gs.lastRoundSummary;
const winnerName = this.nameForSeat(summary.winnerSeat);
const title = this.add.text(CX, CY - h/2 + 40, `Round ${summary.roundNum}${winnerName} went out`, {
const title = this.add.text(CX, CY - h / 2 + 40, `Round ${summary.roundNum}${winnerName} went out`, {
fontFamily: 'Righteous', fontSize: '26px', color: COLORS.goldHex,
}).setOrigin(0.5).setDepth(D.modal);
items.push(title);
summary.rows.forEach((row, i) => {
const y = CY - h/2 + 100 + i * 50;
const y = CY - h / 2 + 100 + i * 50;
const name = this.nameForSeat(row.seat);
const status = row.cleared10 ? 'cleared phase 10!' : row.advanced ? `→ phase ${row.phaseNext}` : `still phase ${row.phaseNext}`;
const t = this.add.text(CX - w/2 + 36, y, `${name}`, {
const t = this.add.text(CX - w / 2 + 36, y, `${name}`, {
fontFamily: 'Righteous', fontSize: '20px', color: COLORS.textHex,
}).setDepth(D.modal);
const sc = this.add.text(CX - 100, y, `+${row.pointsThisRound} (total ${row.totalScore})`, {
@ -1573,12 +1573,12 @@ export default class Phase10Game extends Phaser.Scene {
const tieNote = this.gs.matchTied ? 'Tie among phase 10 finishers — extra round!' : null;
if (tieNote) {
items.push(this.add.text(CX, CY + h/2 - 90, tieNote, {
items.push(this.add.text(CX, CY + h / 2 - 90, tieNote, {
fontFamily: '"Julius Sans One"', fontSize: '16px', color: COLORS.dangerHex,
}).setOrigin(0.5).setDepth(D.modal));
}
const btn = new Button(this, CX, CY + h/2 - 50, 'Next round', () => {
const btn = new Button(this, CX, CY + h / 2 - 50, 'Next round', () => {
for (const o of items) o.destroy();
btn.destroy();
this.gs = startNextRound(this.gs);
@ -1599,7 +1599,7 @@ export default class Phase10Game extends Phaser.Scene {
const p = this.opponentPortraits[s];
if (!p) continue;
if (winner === s) p.playEmotion?.('win');
else p.playEmotion?.('loss');
else p.playEmotion?.('loss');
}
const overlay = this.add.rectangle(CX, CY, GAME_WIDTH, GAME_HEIGHT, 0x000000, 0.65)
@ -1607,7 +1607,7 @@ export default class Phase10Game extends Phaser.Scene {
const w = 720, h = 360;
this.add.rectangle(CX, CY, w, h, COLORS.panel, 1)
.setStrokeStyle(2, COLORS.accent).setDepth(D.modal);
this.add.text(CX, CY - h/2 + 56, msg, {
this.add.text(CX, CY - h / 2 + 56, msg, {
fontFamily: 'Righteous', fontSize: '42px',
color: youWon ? COLORS.goldHex : COLORS.textHex,
}).setOrigin(0.5).setDepth(D.modal);