feat(game): add persistent bush-wall breakthroughs
This commit is contained in:
+19
-6
@@ -258,7 +258,7 @@
|
||||
return false;
|
||||
}
|
||||
const cellLimit = snapshot.width * snapshot.height;
|
||||
return snapshot.cells.every(cell => Array.isArray(cell) && cell.length === 2 && Number.isInteger(cell[0]) && cell[0] >= 0 && cell[0] < cellLimit && Number.isInteger(cell[1]) && cell[1] >= 0 && cell[1] <= 15) && snapshot.objects.every(object => Array.isArray(object) && object.length === 4 && Number.isInteger(object[3]) && object[3] >= 0 && object[3] < cellLimit);
|
||||
return snapshot.cells.every(cell => Array.isArray(cell) && cell.length === 3 && Number.isInteger(cell[0]) && cell[0] >= 0 && cell[0] < cellLimit && Number.isInteger(cell[1]) && cell[1] >= 0 && cell[1] <= 15 && Number.isInteger(cell[2]) && cell[2] >= 0 && cell[2] <= 15) && snapshot.objects.every(object => Array.isArray(object) && object.length === 4 && Number.isInteger(object[3]) && object[3] >= 0 && object[3] < cellLimit);
|
||||
}
|
||||
|
||||
class SnapshotAssembler {
|
||||
@@ -336,9 +336,10 @@
|
||||
state.effects.rateTimer = null;
|
||||
byId("maze").classList.remove("impact-north", "impact-east", "impact-south", "impact-west", "rate-limited");
|
||||
byId("wall-bump").classList.remove("show", "impact-north", "impact-east", "impact-south", "impact-west");
|
||||
documentObject.querySelectorAll(".cell.bush-impact").forEach(cell => cell.classList.remove("bush-impact", "bush-stage-1", "bush-stage-2", "bush-stage-3", "bush-stage-4"));
|
||||
}
|
||||
|
||||
function showImpact(direction) {
|
||||
function showImpact(direction, hits) {
|
||||
if (!direction) return;
|
||||
const maze = byId("maze");
|
||||
const bump = byId("wall-bump");
|
||||
@@ -349,7 +350,10 @@
|
||||
bump.classList.remove("impact-north", "impact-east", "impact-south", "impact-west");
|
||||
bump.classList.add(`impact-${direction}`);
|
||||
bump.classList.add("show");
|
||||
state.effects.impactTimer = windowObject.setTimeout(() => { maze.classList.remove("impact-north", "impact-east", "impact-south", "impact-west"); bump.classList.remove("show", "impact-north", "impact-east", "impact-south", "impact-west"); }, 340);
|
||||
const stage = Math.min(4, Math.max(1, Number.isInteger(hits) ? hits : 1));
|
||||
const target = state.snapshot && documentObject.querySelector(`.cell[data-cell-index="${state.snapshot.self}"]`);
|
||||
if (target && Number.isInteger(hits) && hits > 0) target.classList.add("bush-impact", `bush-stage-${stage}`);
|
||||
state.effects.impactTimer = windowObject.setTimeout(() => { maze.classList.remove("impact-north", "impact-east", "impact-south", "impact-west"); bump.classList.remove("show", "impact-north", "impact-east", "impact-south", "impact-west"); if (target) target.classList.remove("bush-impact", `bush-stage-${stage}`); }, 340);
|
||||
}
|
||||
|
||||
function showRateLimit() {
|
||||
@@ -500,7 +504,7 @@
|
||||
byId("map-placeholder").hidden = false;
|
||||
return;
|
||||
}
|
||||
const coordinates = snapshot.cells.map(cell => ({index: cell[0], x: cell[0] % snapshot.width, y: Math.floor(cell[0] / snapshot.width), passages: cell[1]}));
|
||||
const coordinates = snapshot.cells.map(cell => ({index: cell[0], x: cell[0] % snapshot.width, y: Math.floor(cell[0] / snapshot.width), passages: cell[1], opened: cell[2]}));
|
||||
const minX = Math.min(...coordinates.map(cell => cell.x)); const maxX = Math.max(...coordinates.map(cell => cell.x));
|
||||
const minY = Math.min(...coordinates.map(cell => cell.y)); const maxY = Math.max(...coordinates.map(cell => cell.y));
|
||||
const columns = maxX - minX + 1;
|
||||
@@ -521,11 +525,16 @@
|
||||
coordinates.forEach(data => {
|
||||
const cell = documentObject.createElement("span");
|
||||
cell.className = "cell";
|
||||
cell.dataset.cellIndex = String(data.index);
|
||||
cell.style.gridColumn = String(data.x - minX + 1); cell.style.gridRow = String(data.y - minY + 1);
|
||||
if (!(data.passages & 1)) cell.classList.add("wall-n");
|
||||
if (!(data.passages & 2)) cell.classList.add("wall-e");
|
||||
if (!(data.passages & 4)) cell.classList.add("wall-s");
|
||||
if (!(data.passages & 8)) cell.classList.add("wall-w");
|
||||
if (data.opened & 1) cell.classList.add("trampled-n");
|
||||
if (data.opened & 2) cell.classList.add("trampled-e");
|
||||
if (data.opened & 4) cell.classList.add("trampled-s");
|
||||
if (data.opened & 8) cell.classList.add("trampled-w");
|
||||
(objects.get(data.index) || []).forEach(object => addObject(cell, object));
|
||||
const slot = state.session ? state.session.slot : 1;
|
||||
if (data.index === snapshot.opponent) addPawn(cell, slot === 1 ? 2 : 1, true);
|
||||
@@ -598,7 +607,7 @@
|
||||
snapshot.objects.forEach(object => { const list = objects.get(object[3]) || []; list.push(object); objects.set(object[3], list); });
|
||||
const players = Array.isArray(snapshot.players) ? snapshot.players : [];
|
||||
snapshot.cells.forEach(data => {
|
||||
const index = data[0]; const passages = data[1];
|
||||
const index = data[0]; const passages = data[1]; const opened = data[2];
|
||||
const cell = documentObject.createElement("span");
|
||||
cell.className = "cell";
|
||||
cell.style.gridColumn = String(index % snapshot.width + 1);
|
||||
@@ -607,6 +616,10 @@
|
||||
if (!(passages & 2)) cell.classList.add("wall-e");
|
||||
if (!(passages & 4)) cell.classList.add("wall-s");
|
||||
if (!(passages & 8)) cell.classList.add("wall-w");
|
||||
if (opened & 1) cell.classList.add("trampled-n");
|
||||
if (opened & 2) cell.classList.add("trampled-e");
|
||||
if (opened & 4) cell.classList.add("trampled-s");
|
||||
if (opened & 8) cell.classList.add("trampled-w");
|
||||
(objects.get(index) || []).forEach(object => addObject(cell, object));
|
||||
players.forEach((player, playerIndex) => {
|
||||
if (player.cell === index && !player.exited) {
|
||||
@@ -708,7 +721,7 @@
|
||||
state.moveDirections.delete(message.requestId);
|
||||
state.moveFlow.complete(message.requestId);
|
||||
if (message.payload.code === "invalid_token") { windowObject.localStorage.removeItem(TOKEN_KEY); state.session = null; setScreen("welcome"); }
|
||||
if (message.payload.code === "blocked") { showImpact(direction); feedback(false); return; }
|
||||
if (message.payload.code === "blocked") { showImpact(direction, message.payload.breakthroughHits); feedback(false); return; }
|
||||
if (message.payload.code === "rate_limited") { showRateLimit(); feedback(false); return; }
|
||||
showNotice(localError(message.payload.code), "error"); feedback(false);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user