← Fantasy3D assetfogon/altar-magico
Altar mágico
Drag to turn it// «Altar mágico» · gpt-6-sol (medium)
// A stone magic altar: a wide rectangular block of carved grey stone with glowing teal runes on its front (-y), two lit candles on top, an open old book in the center and a small glowing gem floating above it.
// Stone plinth and the altar's broad, overhanging top.
box(5, 12, 0, 42, 37, 2, "#555e59");
box(6, 12, 2, 41, 37, 3, "#87918a");
box(7, 13, 4, 40, 36, 15, "#69736d");
box(8, 14, 5, 39, 35, 14, "#77817a");
box(5, 11, 16, 42, 38, 17, "#525e59");
box(5, 11, 18, 42, 38, 18, "#9ca69c");
box(7, 13, 19, 40, 36, 19, "#7e8980");
// Chunky carved corners and a recessed front panel.
for (const x of [8, 37]) {
box(x, 12, 4, x + 3, 15, 15, "#505b56");
box(x, 11, 5, x + 3, 12, 6, "#919a90");
box(x, 11, 13, x + 3, 12, 14, "#89948a");
box(x + 1, 11, 7, x + 2, 11, 12, "#77847a");
}
box(13, 13, 5, 35, 13, 14, "#46514e");
box(14, 12, 6, 34, 12, 13, "#344b4c");
box(13, 11, 5, 35, 11, 5, "#a3a99a");
box(13, 11, 14, 35, 11, 14, "#a3a99a");
for (const x of [13, 35]) box(x, 11, 6, x, 11, 13, "#919d91");
box(14, 10, 16, 34, 10, 16, "#7a8680");
// Broad, angular runes, bright against the dark stone.
const rune = "#37e9df";
const light = "#a4fff0";
for (const cx of [18, 24, 30]) {
line(cx, 11, 12, cx - 2, 11, 10, 0, rune);
line(cx - 2, 11, 10, cx, 11, 7, 0, rune);
line(cx, 11, 7, cx + 2, 11, 10, 0, rune);
line(cx + 2, 11, 10, cx, 11, 12, 0, rune);
set(cx, 10, 10, light);
}
line(20, 11, 10, 22, 11, 10, 0, "#279f9e");
line(26, 11, 10, 28, 11, 10, 0, "#279f9e");
for (const x of [15, 33]) {
set(x, 10, 10, "#91fff0");
set(x, 10, 9, "#218d89");
}
// Weathering, chips, and moss on the top and front corners.
for (let i = 0; i < 115; i++) {
const x = 6 + Math.floor(rand() * 36);
const y = 12 + Math.floor(rand() * 26);
if (get(x, y, 18) && (x < 11 || x > 37 || y < 15 || y > 34))
set(x, y, 19, rand() < 0.45 ? "#627e62" : "#82966e");
}
for (let i = 0; i < 32; i++) {
const x = 6 + Math.floor(rand() * 36);
const z = 2 + Math.floor(rand() * 13);
if (x < 12 || x > 36)
set(x, 11, z, rand() < 0.65 ? "#60795f" : "#8b9875");
}
line(7, 11, 17, 10, 11, 17, 0, "#466a55");
line(38, 11, 17, 41, 11, 17, 0, "#466a55");
// A couple of tiny storybook mushrooms in the moss.
for (const x of [7, 40]) {
box(x, 16, 19, x, 16, 21, "#eee0b7");
box(x - 1, 15, 22, x + 1, 17, 22, "#ad6a83");
set(x, 15, 23, "#d99aae");
}
// Brass holders, wax candles, and warm flames.
for (const x of [11, 37]) {
cylinder(x, 25, 20, 3, 1, "#735b38");
cylinder(x, 25, 21, 2, 1, "#d4ad62");
cylinder(x, 25, 22, 2, 4, "#e9d9ad");
box(x - 1, 23, 25, x + 1, 25, 25, "#fff0c9");
set(x - 2, 25, 24, "#fff0c9");
set(x, 25, 26, "#473b34");
ellipsoid(x, 25, 28, 1, 1, 2, "#ffad42");
set(x, 24, 28, "#fff0a0");
set(x, 25, 29, "#fff5ae");
set(x, 25, 30, "#ffe7a0");
}
// Open old book: dark covers, stacked page edges, and a low spine.
box(15, 18, 20, 23, 30, 21, "#503b36");
box(25, 18, 20, 33, 30, 21, "#503b36");
box(23, 18, 20, 25, 30, 20, "#9d754d");
box(16, 18, 21, 22, 29, 22, "#c7ae82");
box(26, 18, 21, 32, 29, 22, "#c7ae82");
box(16, 19, 23, 19, 28, 23, "#f2dfae");
box(20, 19, 22, 23, 28, 22, "#eed7a2");
box(25, 19, 22, 29, 28, 22, "#eed7a2");
box(30, 19, 23, 32, 28, 23, "#f2dfae");
box(23, 19, 21, 25, 29, 21, "#72513c");
// Page borders, little lines of writing, and illuminated initials.
for (const y of [20, 22, 24, 26]) {
line(17, y, 24, 19, y, 24, 0, "#ad8b64");
line(30, y, 24, 32, y, 24, 0, "#ad8b64");
}
for (const y of [21, 23, 25, 27]) {
line(20, y, 23, 22, y, 23, 0, "#987b65");
line(26, y, 23, 29, y, 23, 0, "#987b65");
}
set(18, 20, 24, "#9b5799");
set(31, 20, 24, "#399e9b");
line(16, 18, 21, 22, 18, 21, 0, "#ad8553");
line(26, 18, 21, 32, 18, 21, 0, "#ad8553");
// The gem is the only moving piece, hovering above the open book.
part("gem", [24, 24, 32]);
box(23, 23, 29, 25, 25, 29, "#29bcb8");
box(22, 22, 30, 26, 26, 32, "#38dcd8");
box(23, 23, 33, 25, 25, 33, "#8ffff0");
set(24, 24, 34, "#e4fffa");
set(23, 22, 31, "#e4fffa");
set(24, 22, 32, "#aafff3");
animate("gem", { type: "bob", axis: "z", speed: 2, amplitude: 1 });
animate("gem", {
type: "colors",
palette: ["#20c9c4", "#70fff0", "#f0ffff"],
pattern: "pulse",
glow: 0.9
});import { draw } from "./assets/voxel";
import { altarMagico } from "./assets/altar-magico";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, altarMagico, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: its longest side, in px
// angle: turn on the floor, in radians
// t: seconds; if it moves, that animates it# In a terminal, in the game's folder
fogon assets add altar-magico
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["altar-magico"] })
# It lands in client/assets/altar-magico.ts
# https://fogon.page/object/altar-magico