← Ancient and prehistory3D assetfogon/casco-espartano
Casco espartano
Drag to turn it// «Casco espartano» · gpt-6-sol (medium)
// A big Spartan bronze helmet (Corinthian style) resting on a small wooden stand: shiny bronze with T-shaped face opening, cheek guards, and a tall red horsehair crest running front to back on top.
const bronzeDark = "#805026";
const bronze = "#b67a34";
const bronzeLight = "#d69a49";
const bronzeShine = "#f2c56f";
const bronzeShadow = "#673f26";
const redDark = "#842c2b";
const red = "#b83b35";
const redLight = "#dc6250";
// Small wooden display stand.
box(15, 17, 0, 33, 31, 2, "#684328");
box(16, 18, 3, 32, 30, 3, "#a3703e");
box(17, 19, 4, 31, 29, 4, "#543923");
box(22, 22, 5, 26, 26, 17, "#80532e");
box(23, 22, 5, 24, 22, 16, "#ae7840");
box(20, 20, 16, 28, 28, 18, "#76502c");
box(21, 21, 19, 27, 27, 19, "#b58148");
for (let x = 17; x <= 31; x += 3) {
set(x, 17, 1, "#b17b44");
set(x, 18, 3, "#d09a59");
}
// Deep, shaded interior, visible through the open face.
ellipsoid(24, 24, 25, 12, 10, 11, "#493b30");
box(14, 17, 24, 34, 18, 28, "#382e2a");
box(20, 17, 14, 28, 18, 25, "#382e2a");
// Hollow, rounded bronze skull. The lower edge is open.
for (let x = 8; x <= 40; x++)
for (let y = 9; y <= 39; y++)
for (let z = 19; z <= 40; z++) {
const a = ((x - 24) / 16) ** 2 +
((y - 24) / 14) ** 2 +
((z - 24) / 15) ** 2;
const inner = ((x - 24) / 13.7) ** 2 +
((y - 24) / 11.7) ** 2 +
((z - 24) / 12.6) ** 2;
if (a > 1 || inner < 1) continue;
// The long eye slit and the opening between the cheek guards.
if (y <= 18 && (
(z >= 25 && z <= 28 && x >= 14 && x <= 34) ||
(z < 25 && x >= 21 && x <= 27)
)) continue;
let c = z >= 33 ? bronzeLight : z >= 25 ? bronze : bronzeDark;
if (y <= 16 && z >= 28) c = bronzeLight;
if (rand() < 0.055) c = z > 29 ? bronzeShine : bronzeLight;
set(x, y, z, c);
}
// Broad cheek guards, narrowing gracefully toward the chin.
for (let z = 12; z <= 25; z++) {
const outer = z < 16 ? 17 : z < 20 ? 15 : 13;
for (let x = outer; x <= 20; x++) {
const front = Math.round(11 + (20 - x) * 0.48);
for (let y = front; y <= front + 3; y++) {
const c = y === front
? (z >= 20 ? bronzeLight : bronze)
: (z < 17 ? bronzeDark : bronze);
set(x, y, z, c);
}
}
for (let x = 28; x <= 48 - outer; x++) {
const front = Math.round(11 + (x - 28) * 0.48);
for (let y = front; y <= front + 3; y++) {
const c = y === front
? (z >= 20 ? bronzeLight : bronze)
: (z < 17 ? bronzeDark : bronze);
set(x, y, z, c);
}
}
}
// Low side flanges and the rounded rear edge.
for (let z = 17; z <= 21; z++) {
for (let y = 18; y <= 32; y++) {
for (let x = 9; x <= 14; x++) {
if (((x - 24) / 16) ** 2 + ((y - 24) / 14) ** 2 < 1.12)
set(x, y, z, z === 17 ? bronzeDark : bronze);
}
for (let x = 34; x <= 39; x++) {
if (((x - 24) / 16) ** 2 + ((y - 24) / 14) ** 2 < 1.12)
set(x, y, z, z === 17 ? bronzeDark : bronze);
}
}
}
for (let x = 15; x <= 33; x++)
for (let y = 35; y <= 37; y++)
for (let z = 19; z <= 21; z++) {
if (((x - 24) / 16) ** 2 + ((y - 24) / 14) ** 2 < 1.1)
set(x, y, z, z === 21 ? bronzeLight : bronzeDark);
}
// Dark recesses keep the T-shaped face opening legible.
box(15, 17, 25, 21, 18, 28, "#302d2a");
box(27, 17, 25, 33, 18, 28, "#302d2a");
box(21, 17, 15, 27, 18, 24, "#302d2a");
// Strong projecting brow and central nose guard.
box(15, 11, 29, 33, 13, 30, bronze);
box(17, 10, 30, 31, 10, 30, bronzeShine);
box(22, 10, 26, 26, 12, 29, bronzeLight);
box(23, 10, 19, 25, 12, 26, bronze);
box(23, 9, 22, 25, 9, 25, bronzeShine);
box(23, 10, 18, 25, 11, 19, bronzeDark);
// Bright borders around the openings and cheek plates.
line(15, 12, 29, 21, 11, 29, 0, bronzeShine);
line(27, 11, 29, 33, 12, 29, 0, bronzeShine);
line(14, 14, 24, 19, 12, 24, 0, bronzeLight);
line(29, 12, 24, 34, 14, 24, 0, bronzeLight);
line(20, 12, 22, 20, 12, 15, 0, bronzeShine);
line(28, 12, 22, 28, 12, 15, 0, bronzeShine);
line(17, 13, 13, 20, 12, 13, 0, bronzeLight);
line(28, 12, 13, 31, 13, 13, 0, bronzeLight);
// Raised decorative band, rivets, and warm specular glints.
for (let y = 18; y <= 32; y++) {
set(9, y, 24, bronzeLight);
set(39, y, 24, bronzeLight);
}
for (const x of [12, 17, 31, 36]) {
const y = x < 24 ? (x < 15 ? 16 : 13) : (x > 33 ? 16 : 13);
set(x, y, 23, bronzeShine);
set(x, y, 22, bronzeDark);
}
line(14, 15, 32, 19, 11, 35, 0, bronzeShine);
line(29, 11, 35, 34, 15, 32, 0, bronzeShine);
line(18, 12, 36, 22, 11, 38, 0, "#ffdc86");
set(17, 13, 19, bronzeShine);
set(31, 13, 19, bronzeShine);
// Bronze crest mount following the curvature of the helmet.
for (let y = 10; y <= 38; y++) {
const t = (y - 24) / 15;
const domeTop = 24 + 15 * Math.sqrt(Math.max(0, 1 - t * t));
const base = Math.round(domeTop);
for (let x = 21; x <= 27; x++)
for (let z = base; z <= base + 2; z++)
set(x, y, z, z === base + 2 ? bronzeShine : bronzeDark);
}
// Tall, dense horsehair plume: a chunky, arched red silhouette.
for (let y = 8; y <= 40; y++) {
const t = (y - 24) / 17;
const arch = Math.sqrt(Math.max(0, 1 - t * t));
const bottom = Math.round(27 + 12 * arch);
const top = Math.min(47, Math.round(34 + 12 * arch +
(rand() < 0.22 ? 1 : 0)));
const halfWidth = y < 11 || y > 38 ? 2 : 3;
for (let x = 24 - halfWidth; x <= 24 + halfWidth; x++) {
const edgeDrop = Math.abs(x - 24) >= 3 ? 1 : 0;
for (let z = bottom; z <= top - edgeDrop; z++) {
let c = z <= bottom + 1 ? redDark : red;
if (x <= 22 && z > bottom + 2) c = redLight;
if (rand() < 0.13) c = rand() < 0.5 ? redDark : redLight;
set(x, y, z, c);
}
}
}
for (let y = 12; y <= 36; y += 4) {
const arch = Math.sqrt(Math.max(0, 1 - ((y - 24) / 17) ** 2));
const z = Math.min(47, Math.round(32 + 12 * arch));
set(21, y, z, "#ed7860");
set(22, y + 1, z - 1, "#e46a52");
}import { draw } from "./assets/voxel";
import { cascoEspartano } from "./assets/casco-espartano";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, cascoEspartano, 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 casco-espartano
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["casco-espartano"] })
# It lands in client/assets/casco-espartano.ts
# https://fogon.page/object/casco-espartano