Files
WebFactory/js/terrain.js
2026-01-13 18:32:46 +00:00

93 lines
2.8 KiB
JavaScript

// Terrain Management
const Terrain = {
// Map data
tiles: [],
// Initialize terrain
init() {
this.generate();
},
// Generate new map
generate() {
this.tiles = [];
for (let y = 0; y < CONFIG.MAP_HEIGHT; y++) {
this.tiles[y] = [];
for (let x = 0; x < CONFIG.MAP_WIDTH; x++) {
this.tiles[y][x] = {
type: 'grass',
resource: null,
amount: 0
};
}
}
// Generate resource patches
this.generatePatch(20, 20, 8, 'iron', 5000);
this.generatePatch(35, 15, 6, 'iron', 4000);
this.generatePatch(60, 30, 7, 'iron', 4500);
this.generatePatch(15, 35, 7, 'copper', 4500);
this.generatePatch(40, 45, 6, 'copper', 4000);
this.generatePatch(70, 50, 6, 'copper', 4000);
this.generatePatch(50, 25, 5, 'coal', 3000);
this.generatePatch(25, 55, 5, 'coal', 3000);
this.generatePatch(65, 15, 4, 'coal', 2500);
},
// Generate a resource patch
generatePatch(cx, cy, radius, type, amount) {
for (let dy = -radius; dy <= radius; dy++) {
for (let dx = -radius; dx <= radius; dx++) {
const dist = Math.sqrt(dx * dx + dy * dy);
if (dist <= radius && Math.random() > dist / radius * 0.5) {
const x = cx + dx;
const y = cy + dy;
if (Utils.inBounds(x, y)) {
this.tiles[y][x].resource = type;
this.tiles[y][x].amount = Math.floor(amount * (1 - dist / radius * 0.5));
}
}
}
}
},
// Get tile at position
getTile(x, y) {
if (!Utils.inBounds(x, y)) return null;
return this.tiles[y][x];
},
// Mine from a tile (returns resource type or null)
mine(x, y, amount = 1) {
const tile = this.getTile(x, y);
if (!tile || !tile.resource || tile.amount <= 0) return null;
const resourceType = tile.resource;
const mined = Math.min(amount, tile.amount);
tile.amount -= mined;
if (tile.amount <= 0) {
tile.resource = null;
tile.amount = 0;
}
return { type: resourceType, amount: mined };
},
// Check if tile has resource
hasResource(x, y) {
const tile = this.getTile(x, y);
return tile && tile.resource && tile.amount > 0;
},
// Get all tiles data for saving
getData() {
return this.tiles.map(row => row.map(t => ({ ...t })));
},
// Load tiles data
setData(data) {
this.tiles = data.map(row => row.map(t => ({ ...t })));
}
};