Fog of war: underground is black until the bot has seen it (t8)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
// Exploration only: never changes grains or the random stream.
|
||||
const FOG = 2;
|
||||
let fog, FW, FH;
|
||||
function fogAlloc() { FW = Math.ceil(W / FOG); FH = Math.ceil(H / FOG); fog = new Uint8Array(FW * FH); }
|
||||
function fogMark(x, y, v) {
|
||||
if (x < 0 || y < 0 || x >= W || y >= H) return;
|
||||
const i = Math.floor(y / FOG) * FW + Math.floor(x / FOG);
|
||||
if (v > fog[i]) fog[i] = v;
|
||||
}
|
||||
function fogSeen(x, y) {
|
||||
if (x < 0 || y < 0 || x >= W || y >= H) return 255;
|
||||
return fog[Math.floor(y / FOG) * FW + Math.floor(x / FOG)];
|
||||
}
|
||||
function fogInit() {
|
||||
for (let x = 0; x < W; x++) for (let y = 0; y < Math.min(H, surfY[x] + 8); y++) fogMark(x, y, y <= surfY[x] ? 255 : (surfY[x] + 8 - y) * 255 / 8);
|
||||
}
|
||||
function fogLook(cx, cy) {
|
||||
for (let a = 0; a < 256; a++) {
|
||||
const dx = Math.cos(a * Math.PI / 128), dy = Math.sin(a * Math.PI / 128);
|
||||
let hit = -1;
|
||||
for (let d = 0; d < 48; d++) {
|
||||
const x = Math.floor(cx + dx * d), y = Math.floor(cy + dy * d);
|
||||
if (x < 0 || y < 0 || x >= W || y >= H) break;
|
||||
const ph = PH[mat[y * W + x]];
|
||||
if (hit < 0 && (ph === PH_SOLID || ph === PH_POWDER)) hit = d;
|
||||
const v = Math.min(255, (48 - d) * 255 / 8, hit < 0 ? 255 : (4 - d + hit) * 255 / 4);
|
||||
if (v <= 0) break;
|
||||
fogMark(x, y, v);
|
||||
}
|
||||
}
|
||||
}
|
||||
function fogRevealAround(x, y, r) {
|
||||
for (let yy = Math.max(0, Math.floor(y - r)); yy <= Math.min(H - 1, y + r); yy++) for (let xx = Math.max(0, Math.floor(x - r)); xx <= Math.min(W - 1, x + r); xx++) if ((xx - x) ** 2 + (yy - y) ** 2 <= r * r) fogMark(xx, yy, 255);
|
||||
}
|
||||
function fogRevealAll() { fog.fill(255); }
|
||||
Reference in New Issue
Block a user