← BásicoObjeto 3Dfogon/piramide-escalonada
Pirámide escalonada
Arrastrá para girarlo// «Pirámide escalonada» · gpt-6-sol (medium)
// Stepped pyramid («Pirámide escalonada»).
const stone = "#d5ad70";
const light = "#edc783";
const sunlit = "#f6d692";
const shadow = "#a47d4d";
const edge = "#bc925b";
// Broad, low foundation.
box(2, 2, 0, 45, 45, 0, shadow);
box(3, 3, 1, 44, 44, 1, light);
// Eight solid, receding terraces.
for (let tier = 0; tier < 8; tier++) {
const lo = 3 + tier * 2;
const hi = 44 - tier * 2;
const z = 1 + tier * 3;
box(lo, lo, z, hi, hi, z + 1, stone);
box(lo, lo, z + 2, hi, hi, z + 2, light);
// Dark lower course and a bright, projecting lip.
box(lo, lo, z, hi, lo, z, shadow);
box(hi, lo, z, hi, hi, z, shadow);
box(lo, lo, z + 2, hi, lo, z + 2, sunlit);
box(hi, lo, z + 2, hi, hi, z + 2, edge);
}
// Small variations in the exposed sandstone faces.
forEach((x, y, z, color) => {
if (z < 2 || z > 23 || rand() > 0.075) return;
if (get(x, y - 1, z) === undefined || get(x + 1, y, z) === undefined) {
set(x, y, z, rand() < 0.55 ? "#dfb778" : "#c49a60");
}
});
// Two narrow flights climbing the visible faces of the pyramid.
for (let t = 0; t < 8; t++) {
const front = 3 + 2 * t;
const right = 44 - 2 * t;
const level = 3 + 3 * t;
for (let step = 0; step < 2; step++) {
const height = level + step;
box(20, front + step, 0, 27, front + step, height - 1, stone);
box(20, front + step, height, 27, front + step, height, sunlit);
box(right - step, 20, 0, right - step, 27, height - 1, stone);
box(right - step, 20, height, right - step, 27, height, light);
}
// Raised, blocky edges make the stair flights legible from afar.
for (const x of [19, 28]) {
box(x, front, level, x, front + 1, level, edge);
set(x, front + 1, level + 1, light);
}
for (const y of [19, 28]) {
box(right - 1, y, level, right, y, level, edge);
set(right - 1, y, level + 1, light);
}
}
// Entrance landing and the shaded, open-sided shrine.
box(17, 17, 25, 30, 30, 25, light);
box(20, 17, 25, 27, 19, 25, sunlit);
box(28, 20, 25, 30, 27, 25, light);
// Rear walls, with dark recesses behind the open colonnade.
box(19, 29, 26, 28, 30, 31, "#b58c57");
box(20, 28, 26, 27, 28, 30, "#80633f");
box(29, 20, 26, 30, 28, 31, "#b58c57");
box(28, 21, 26, 28, 27, 30, "#866743");
// Square corner pillars and narrow intermediate columns.
for (const [x, y] of [[18, 18], [29, 18], [18, 29], [29, 29]]) {
box(x, y, 26, x + 1, y + 1, 31, stone);
box(x, y, 26, x + 1, y + 1, 26, shadow);
box(x, y, 30, x + 1, y + 1, 31, light);
}
for (const x of [22, 26]) {
box(x, 18, 26, x, 18, 30, edge);
set(x, 18, 31, light);
}
for (const y of [22, 26]) {
box(29, y, 26, 29, y, 30, edge);
set(29, y, 31, light);
}
// Heavy lintels and the distinctive layered, tapering roof.
box(17, 17, 31, 31, 18, 31, shadow);
box(29, 17, 31, 31, 30, 31, shadow);
box(16, 16, 32, 32, 32, 32, edge);
box(16, 16, 33, 32, 32, 33, sunlit);
box(18, 18, 34, 30, 30, 34, shadow);
box(18, 18, 35, 30, 30, 35, light);
box(20, 20, 36, 28, 28, 36, edge);
box(20, 20, 37, 28, 28, 37, sunlit);import { draw } from "./assets/voxel";
import { piramideEscalonada } from "./assets/piramide-escalonada";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, piramideEscalonada, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: lo que mide en px su lado más largo
// angle: giro sobre el piso, en radianes
// t: segundos; si se mueve, se anima solo con eso# En una terminal, en la carpeta del juego
fogon assets add piramide-escalonada
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["piramide-escalonada"] })
# Queda en client/assets/piramide-escalonada.ts
# https://fogon.page/object/piramide-escalonada