66 lines
No EOL
2.8 KiB
JavaScript
66 lines
No EOL
2.8 KiB
JavaScript
import { grid, cols, rows } from './state.js';
|
|
import { config } from './config.js';
|
|
import { move, swap } from './actions.js';
|
|
import { explode } from './explosive.js';
|
|
|
|
export function updateAcid(x, y, cell) {
|
|
// Dissolve neighbors
|
|
const neighbors = [[0, 1], [0, -1], [1, 0], [-1, 0]];
|
|
for (let n of neighbors) {
|
|
const nx = x + n[0], ny = y + n[1];
|
|
if (nx >= 0 && nx < cols && ny >= 0 && ny < rows && grid[nx][ny]) {
|
|
const t = grid[nx][ny].type;
|
|
if (t === 'rock' || t === 'wood' || t === 'dirt' || t === 'plant') {
|
|
if (config.acid.dissolve[t] && Math.random() < config.acid.dissolveChance) {
|
|
grid[nx][ny] = { type: 'steam', color: '#E0FFFF', updated: true }; // Turn dissolved block into steam
|
|
grid[x][y] = null; // Consume acid
|
|
return;
|
|
}
|
|
} else if (t === 'explosive') {
|
|
if (config.acid.explodeTNT) {
|
|
explode(nx, ny);
|
|
grid[x][y] = null;
|
|
return;
|
|
}
|
|
} else if (t === 'water') {
|
|
if (config.acid.dissolve.water && Math.random() < 0.01) {
|
|
grid[nx][ny].type = 'acid'; // Convert water
|
|
grid[nx][ny].color = '#32CD32';
|
|
grid[nx][ny].updated = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Movement (same as water)
|
|
const below = y + 1;
|
|
if (below >= rows) return;
|
|
|
|
const belowCell = grid[x][below];
|
|
if (!belowCell) {
|
|
move(x, y, x, below);
|
|
} else if (belowCell.type === 'water' && !config.acid.dissolve.water) {
|
|
// Sink through water if not infecting (Acid is denser)
|
|
if (Math.random() < config.acid.sinkChance) {
|
|
swap(x, y, x, below);
|
|
}
|
|
} else {
|
|
// Slide sideways (can displace water if not dissolving it)
|
|
const canMoveLeft = x > 0 && (!grid[x - 1][y] || (grid[x - 1][y].type === 'water' && !config.acid.dissolve.water));
|
|
const canMoveRight = x < cols - 1 && (!grid[x + 1][y] || (grid[x + 1][y].type === 'water' && !config.acid.dissolve.water));
|
|
|
|
if (canMoveLeft && canMoveRight) {
|
|
const dir = Math.random() < 0.5 ? -1 : 1;
|
|
const target = grid[x + dir][y];
|
|
if (target && target.type === 'water') swap(x, y, x + dir, y);
|
|
else move(x, y, x + dir, y);
|
|
} else if (canMoveLeft) {
|
|
const target = grid[x - 1][y];
|
|
if (target && target.type === 'water') swap(x, y, x - 1, y);
|
|
else move(x, y, x - 1, y);
|
|
} else if (canMoveRight) {
|
|
const target = grid[x + 1][y];
|
|
if (target && target.type === 'water') swap(x, y, x + 1, y);
|
|
else move(x, y, x + 1, y);
|
|
}
|
|
}
|
|
} |