feat: Hex Wars - Kettenexplosionen, Felder werden zu Felsen

This commit is contained in:
2026-06-28 16:57:05 +02:00
parent 631a0f86b7
commit 3afffdec03
2 changed files with 37 additions and 8 deletions

View File

@@ -126,20 +126,49 @@ function calcScore(grid, terrain, playerId) {
// ── Minenexplosion: alle 8 Nachbarn der Mine werden zerstört ─────────────────
// Gibt zurück: { grid, destroyedByOwner, destroyedByOpp, blastCells }
function explodeMine(grid, terrain, row, col, ownerId, oppId) {
// Kettenexplosion: Mine explodiert, alle 8 Nachbarn werden zu Felsen.
// Wenn ein Nachbar auch eine Mine ist, explodiert diese ebenfalls (rekursiv).
// exploded = Set von bereits gezündeten Minen-Positionen (verhindert Endlosschleife)
function explodeMine(grid, terrain, row, col, ownerId, oppId, exploded = new Set()) {
const key = `${row},${col}`;
if (exploded.has(key)) return { destroyedByOwner:0, destroyedByOpp:0, blastCells:[] };
exploded.add(key);
let destroyedByOwner = 0;
let destroyedByOpp = 0;
const blastCells = [];
const chainMines = []; // Nachbar-Minen die ebenfalls zünden
for (const [dr,dc] of DIRS8) {
const r=row+dr, c=col+dc;
if (r<0||r>=GRID||c<0||c>=GRID) continue;
const cell = grid[r][c];
if (cell === ownerId) { destroyedByOwner++; grid[r][c] = 0; blastCells.push([r,c]); }
else if (cell === oppId) { destroyedByOpp++; grid[r][c] = 0; blastCells.push([r,c]); }
else if (cell === 0 && terrain[r][c] !== T_ROCK) { blastCells.push([r,c]); }
if (terrain[r][c] === T_ROCK) continue; // bereits Felsen, überspringen
// Merke ob da eine Mine lag (BEVOR wir terrain ändern)
if (terrain[r][c] === T_MINE && !exploded.has(`${r},${c}`)) {
chainMines.push([r,c]);
}
// Mine selbst wird neutral (bereits besetzt durch Spieler, bleibt als besetztes Mine-Feld)
// Punktabzug für besetzte Felder
if (grid[r][c] === ownerId) destroyedByOwner++;
else if (grid[r][c] === oppId) destroyedByOpp++;
// Feld wird zu Felsen
grid[r][c] = 0;
terrain[r][c] = T_ROCK;
blastCells.push([r,c]);
}
// Kettenexplosionen zünden
for (const [mr,mc] of chainMines) {
// terrain[mr][mc] ist jetzt bereits T_ROCK (oben gesetzt),
// aber die Mine war dort — wir zünden sie trotzdem
const chain = explodeMine(grid, terrain, mr, mc, ownerId, oppId, exploded);
destroyedByOwner += chain.destroyedByOwner;
destroyedByOpp += chain.destroyedByOpp;
blastCells.push(...chain.blastCells);
}
return { destroyedByOwner, destroyedByOpp, blastCells };
}

View File

@@ -48,7 +48,7 @@ function HelpModal({ onClose }) {
<div style={{ display:'grid', gridTemplateColumns:'28px 1fr', gap:'6px 10px', alignItems:'center' }}>
<span style={{ fontSize:16, textAlign:'center' }}></span><span><strong style={{ color:'rgba(255,255,255,0.9)' }}>Normales Feld</strong> +1 Punkt</span>
<span style={{ fontSize:16, textAlign:'center' }}></span><span><strong style={{ color:'#ffe66d' }}>Goldfeld</strong> +3 Punkte, sehr wertvoll!</span>
<span style={{ fontSize:16, textAlign:'center' }}>💣</span><span><strong style={{ color:'#ff6b9d' }}>Sprengmine</strong> Betreten zündet eine Explosion: alle 8 umliegenden Felder werden zerstört und besetzte Felder gehen verloren. Außerdem verlierst du deinen nächsten Zug.</span>
<span style={{ fontSize:16, textAlign:'center' }}>💣</span><span><strong style={{ color:'#ff6b9d' }}>Sprengmine</strong> Betreten zündet eine Explosion: alle 8 umliegenden Felder werden zu Felsen (auch Gold!). Besetzte Felder gehen verloren. Liegt eine weitere Mine im Umkreis, explodiert auch diese (Kettenreaktion!). Du verlierst deinen nächsten Zug.</span>
<span style={{ fontSize:16, textAlign:'center' }}>🪨</span><span><strong style={{ color:'rgba(255,255,255,0.4)' }}>Felsen</strong> unbesetzbar, blockiert Wege</span>
</div>
</div>