diff --git a/apps/game/assets/tiles/ash.png b/apps/game/assets/tiles/ash.png index 2255c06..64299da 100644 --- a/apps/game/assets/tiles/ash.png +++ b/apps/game/assets/tiles/ash.png Binary files differ diff --git a/apps/game/assets/tiles/ash_2.png b/apps/game/assets/tiles/ash_2.png index 7bbc216..9108d44 100644 --- a/apps/game/assets/tiles/ash_2.png +++ b/apps/game/assets/tiles/ash_2.png Binary files differ diff --git a/apps/game/tools/pixelart/gen.mjs b/apps/game/tools/pixelart/gen.mjs index 1dcbf26..143832f 100644 --- a/apps/game/tools/pixelart/gen.mjs +++ b/apps/game/tools/pixelart/gen.mjs @@ -84,7 +84,7 @@ return c; } -function ashTile(seed = 9, stems = 4) { +function ashTile(seed = 9, stems = 10) { // Пепельный бугор: чуть светлее травы, тоже без обводки. const c = new Canvas(SIZES.tile.w, SIZES.tile.h); fillDiamond(c, SIZES.tile.w / 2, SIZES.tile.h / 2, SIZES.tile.w, SIZES.tile.h, 'P3'); @@ -94,13 +94,25 @@ const y = 4 + Math.floor(r() * 9); if (c.get(x, y)) c.set(x, y, 'P5'); } - // Проглядывающая трава: стебли сквозь пепел (жизнь пробивается). + // Проглядывающая трава: стебли 2–3 px и пучки, жизнь заметно пробивается, + // но пепел остаётся пеплом (растительность ~треть площади ромба). for (let i = 0; i < stems; i++) { const x = 3 + Math.floor(r() * 26); - const y = 3 + Math.floor(r() * 10); + const y = 5 + Math.floor(r() * 8); if (!c.get(x, y)) continue; - c.set(x, y, r() < 0.4 ? 'G1' : r() < 0.5 ? 'G2H' : 'G0'); - if (c.get(x, y - 1)) c.set(x, y - 1, 'G0'); // второй пиксель стебля + // Пучок: с шансом 1/3 из точки растут 2–3 стебля вразброс. + const extra = r() < 0.33 ? 2 : 1; + for (let j = 0; j < extra; j++) { + const sx = Math.min(28, Math.max(3, x + (extra > 1 ? Math.floor(r() * 5) - 2 : 0))); + const sy = Math.min(12, Math.max(3, y + (extra > 1 ? Math.floor(r() * 3) - 1 : 0))); + if (!c.get(sx, sy)) continue; + const tip = r() < 0.5 ? 'G2H' : 'G2'; // сухая верхушка + const h = 1 + Math.floor(r() * 2); // высота стебля 2–3 px + for (let k = 0; k <= h; k++) { + if (!c.get(sx, sy - k)) break; + c.set(sx, sy - k, k === h ? tip : k === 0 ? 'G0' : r() < 0.5 ? 'G1' : 'G2'); + } + } } return c; } @@ -985,7 +997,7 @@ save(waterTile(0), 'tiles/water_1.png'); save(waterTile(1), 'tiles/water_2.png'); save(ashTile(), 'tiles/ash.png'); -save(ashTile(41, 2), 'tiles/ash_2.png'); // реже трава — редкий второй оттенок +save(ashTile(41, 5), 'tiles/ash_2.png'); // реже трава — редкий второй оттенок save(decorTuft(), 'tiles/decor_tuft.png'); save(decorStone(), 'tiles/decor_stone.png'); save(decorBald(), 'tiles/decor_bald.png');