← Basics3D assetfogon/farol-v5
Farol
Drag to turn it// «Farol» · gpt-6-sol (medium)
// Lantern («Farol»). One of several variations of this object: follow the reference picture closely.
const iron = "#252d31";
const dark = "#171f23";
const edge = "#344149";
const light = "#53616a";
const gold = "#b77a2e";
const brightGold = "#e5ae50";
// Broad, tiered foot of the lantern.
box(6, 6, 0, 41, 41, 1, dark);
box(5, 5, 1, 42, 42, 2, edge);
box(6, 6, 3, 41, 41, 4, iron);
box(8, 8, 5, 39, 39, 5, "#654d2d");
box(9, 9, 6, 38, 38, 6, "#b58442");
for (let x = 10; x <= 37; x++)
for (let y = 10; y <= 37; y++)
set(x, y, 6, rand() < 0.13 ? "#c69a57" : "#ac783b");
// Crisp horizontal metal edges around the foot.
for (let z of [0, 3, 5]) {
let a = z === 0 ? 6 : 5, b = z === 0 ? 41 : 42;
box(a, a, z, b, a + 1, z, z === 3 ? dark : edge);
box(a, b - 1, z, b, b, z, dark);
box(a, a, z, a + 1, b, z, light);
box(b - 1, a, z, b, b, z, dark);
}
box(8, 8, 6, 39, 8, 7, "#624923");
box(8, 39, 6, 39, 39, 7, "#755329");
box(8, 8, 6, 8, 39, 7, gold);
box(39, 8, 6, 39, 39, 7, "#815a29");
// A small raised brass socket and the pale candle within.
box(19, 19, 7, 29, 29, 8, "#805723");
box(20, 20, 9, 28, 28, 9, "#d9a94c");
box(21, 21, 10, 27, 27, 10, "#f4cf76");
for (let x = 19; x <= 29; x++) {
for (let y of [19, 29]) {
if ((x + y) % 3 !== 0) set(x, y, 9, brightGold);
}
}
for (let y = 20; y <= 28; y++) {
for (let x of [19, 29]) {
if ((x + y) % 3 !== 0) set(x, y, 9, "#f0c769");
}
}
box(22, 22, 11, 26, 26, 19, "#e4d6a9");
box(22, 22, 11, 22, 26, 19, "#b8aa88");
box(26, 22, 11, 26, 26, 19, "#f5e4b5");
box(23, 22, 18, 25, 22, 19, "#fff0c6");
box(23, 23, 20, 25, 25, 21, "#e0a948");
set(24, 24, 22, "#ffe39a");
set(24, 24, 23, "#fff0ae");
set(24, 24, 24, "#e9a842");
// Four sturdy, open-frame corner uprights.
for (let x of [7, 39]) for (let y of [7, 39]) {
box(x - 1, y - 1, 6, x + 1, y + 1, 28, dark);
box(x - 1, y - 1, 9, x - 1, y - 1, 27, light);
box(x + 1, y - 1, 9, x + 1, y - 1, 27, edge);
box(x - 1, y - 1, 7, x + 1, y + 1, 8, "#374146");
box(x - 1, y - 1, 25, x + 1, y + 1, 27, "#313d42");
set(x - 1, y - 1, 8, gold);
set(x, y - 1, 26, "#9a682d");
}
// A few narrow blue-white glints suggest clear glass, without closing the windows.
for (let z = 12; z <= 24; z++) {
if (z !== 17 && z !== 18) {
set(11, 7, z, z % 4 === 0 ? "#9db6b9" : "#5d777e");
set(37, 7, z, z % 5 === 0 ? "#b3c4bf" : "#60767a");
set(7, 36, z, z % 4 === 1 ? "#a3b6b5" : "#536e75");
set(40, 35, z, z % 5 === 1 ? "#aebbbb" : "#657b7e");
}
}
set(12, 7, 23, "#b6c7c2");
set(36, 7, 15, "#c2d0c8");
set(7, 35, 20, "#bdcbc6");
// Deep overhanging eave and five stepped slate-metal roof courses.
const tiers = [
[4, 43, 28, 30],
[8, 39, 31, 32],
[12, 35, 33, 34],
[16, 31, 35, 36],
[20, 27, 37, 38]
];
for (let i = 0; i < tiers.length; i++) {
const [a, b, lo, hi] = tiers[i];
box(a, a, lo, b, b, hi, i === 0 ? "#263138" : "#303b41");
box(a + 1, a + 1, hi, b - 1, b - 1, hi,
i % 2 ? "#47535a" : "#435058");
box(a, a, lo, b, a, lo, dark);
box(a, b, lo, b, b, lo, dark);
box(a, a, hi, b, a, hi, "#58656b");
box(a, a, hi, a, b, hi, "#58646a");
box(a, b, hi, b, b, hi, "#28343a");
box(b, a, hi, b, b, hi, "#263137");
// Little warm rivets at the exposed corners of each course.
if (i < 4) {
for (let x of [a + 2, b - 2]) for (let y of [a + 2, b - 2]) {
set(x, y, hi + 1, gold);
set(x, y, hi + 2, "#e1a548");
}
}
}
box(5, 5, 27, 42, 6, 28, dark);
box(5, 41, 27, 42, 42, 28, dark);
box(5, 5, 27, 6, 42, 28, edge);
box(41, 5, 27, 42, 42, 28, dark);
// Small fitting beneath the upright hanging ring.
box(22, 22, 39, 26, 26, 39, dark);
box(23, 22, 40, 25, 25, 40, gold);
// Thick, hollow iron loop, standing vertically above the roof.
for (let x = 19; x <= 29; x++) {
for (let z = 40; z <= 47; z++) {
const d = ((x - 24) / 5.2) ** 2 + ((z - 43.4) / 4.1) ** 2;
const hole = ((x - 24) / 2.7) ** 2 + ((z - 43.4) / 2.0) ** 2;
if (d <= 1 && hole >= 1) {
for (let y = 22; y <= 25; y++)
set(x, y, z, y === 22 ? "#354147" : "#202a30");
if (z >= 44 && x <= 24) set(x, 22, z, "#56636a");
if (z <= 42 && x >= 25) set(x, 22, z, "#805d35");
}
}
}import { draw } from "./assets/voxel";
import { farolV5 } from "./assets/farol-v5";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, farolV5, 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 farol-v5
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["farol-v5"] })
# It lands in client/assets/farol-v5.ts
# https://fogon.page/object/farol-v5