feat: Hex Wars - zufällige Startecken
This commit is contained in:
@@ -45,10 +45,17 @@ const T_MINE = 2;
|
|||||||
const T_ROCK = 3;
|
const T_ROCK = 3;
|
||||||
|
|
||||||
// ── Terrain generieren ────────────────────────────────────────────────────────
|
// ── Terrain generieren ────────────────────────────────────────────────────────
|
||||||
function generateTerrain() {
|
function generateTerrain(ownerHead, oppHead) {
|
||||||
const t = Array(GRID).fill(null).map(() => Array(GRID).fill(T_NORMAL));
|
const t = Array(GRID).fill(null).map(() => Array(GRID).fill(T_NORMAL));
|
||||||
const safe = new Set();
|
const safe = new Set();
|
||||||
for (let r=0;r<3;r++) for (let c=0;c<3;c++) { safe.add(`${r},${c}`); safe.add(`${GRID-1-r},${GRID-1-c}`); }
|
// 3x3 Sicherheitszone um beide Startecken
|
||||||
|
for (const headStr of [ownerHead, oppHead]) {
|
||||||
|
const [hr,hc] = headStr.split(',').map(Number);
|
||||||
|
for (let dr=-2;dr<=2;dr++) for (let dc=-2;dc<=2;dc++) {
|
||||||
|
const r=hr+dr, c=hc+dc;
|
||||||
|
if (r>=0&&r<GRID&&c>=0&&c<GRID) safe.add(`${r},${c}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const cells = [];
|
const cells = [];
|
||||||
for (let r=0;r<GRID;r++) for (let c=0;c<GRID;c++) if (!safe.has(`${r},${c}`)) cells.push([r,c]);
|
for (let r=0;r<GRID;r++) for (let c=0;c<GRID;c++) if (!safe.has(`${r},${c}`)) cells.push([r,c]);
|
||||||
@@ -78,10 +85,17 @@ function computeFog(grid, playerId) {
|
|||||||
|
|
||||||
// ── Hilfsfunktionen ───────────────────────────────────────────────────────────
|
// ── Hilfsfunktionen ───────────────────────────────────────────────────────────
|
||||||
function createGrid(ownerId, oppId) {
|
function createGrid(ownerId, oppId) {
|
||||||
|
const corners = [[0,0],[0,GRID-1],[GRID-1,0],[GRID-1,GRID-1]];
|
||||||
|
for (let i=corners.length-1;i>0;i--) {
|
||||||
|
const j=Math.floor(Math.random()*(i+1));
|
||||||
|
[corners[i],corners[j]]=[corners[j],corners[i]];
|
||||||
|
}
|
||||||
|
const [or,oc] = corners[0];
|
||||||
|
const [pr,pc] = corners[1];
|
||||||
const g = Array(GRID).fill(null).map(() => Array(GRID).fill(0));
|
const g = Array(GRID).fill(null).map(() => Array(GRID).fill(0));
|
||||||
g[0][0] = ownerId;
|
g[or][oc] = ownerId;
|
||||||
g[GRID-1][GRID-1] = oppId;
|
g[pr][pc] = oppId;
|
||||||
return g;
|
return { grid:g, ownerHead:`${or},${oc}`, oppHead:`${pr},${pc}` };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prüft ob [row,col] an den Kopf [hr,hc] angrenzt (8 Richtungen)
|
// Prüft ob [row,col] an den Kopf [hr,hc] angrenzt (8 Richtungen)
|
||||||
@@ -294,13 +308,13 @@ router.post('/', authenticate, (req, res) => {
|
|||||||
const opp = db.prepare('SELECT id, username FROM users WHERE id=?').get(opponent_id);
|
const opp = db.prepare('SELECT id, username FROM users WHERE id=?').get(opponent_id);
|
||||||
if (!opp) return res.status(404).json({ error: 'Benutzer nicht gefunden' });
|
if (!opp) return res.status(404).json({ error: 'Benutzer nicht gefunden' });
|
||||||
|
|
||||||
const grid = createGrid(me, Number(opponent_id));
|
const { grid, ownerHead, oppHead } = createGrid(me, Number(opponent_id));
|
||||||
const terrain = generateTerrain();
|
const terrain = generateTerrain(ownerHead, oppHead);
|
||||||
|
|
||||||
const result = db.prepare(`
|
const result = db.prepare(`
|
||||||
INSERT INTO geo_games (owner_id, opponent_id, grid, terrain, current_turn, move_count, owner_head, opp_head)
|
INSERT INTO geo_games (owner_id, opponent_id, grid, terrain, current_turn, move_count, owner_head, opp_head)
|
||||||
VALUES (?, ?, ?, ?, ?, 0, ?, ?)
|
VALUES (?, ?, ?, ?, ?, 0, ?, ?)
|
||||||
`).run(me, Number(opponent_id), JSON.stringify(grid), JSON.stringify(terrain), me, '0,0', `${GRID-1},${GRID-1}`);
|
`).run(me, Number(opponent_id), JSON.stringify(grid), JSON.stringify(terrain), me, ownerHead, oppHead);
|
||||||
|
|
||||||
const myName = db.prepare('SELECT username FROM users WHERE id=?').get(me)?.username || 'Jemand';
|
const myName = db.prepare('SELECT username FROM users WHERE id=?').get(me)?.username || 'Jemand';
|
||||||
sendPush(Number(opponent_id), '⬡ Hex Wars', `${myName} hat dich zu einem Spiel eingeladen! Du bist zuerst dran.`);
|
sendPush(Number(opponent_id), '⬡ Hex Wars', `${myName} hat dich zu einem Spiel eingeladen! Du bist zuerst dran.`);
|
||||||
|
|||||||
Reference in New Issue
Block a user