← Gear3D assetfogon/daga
Daga
Drag to turn it// «Daga» · gpt-6-sol (medium)
// A dagger: a short pointed double-edged steel blade, a curved brass crossguard, a black grip with silver wire wrap and a small round silver pommel. Make it chunky so it is not too thin. It LIES FLAT horizontally on the ground (z=0), as a chunky toy-like item seen from above: tip/front toward -y, handle/back toward +y, centered on x, using most of the grid along y, at least 4-5 blocks thick so it reads at small size. No hands, no stand, no base plate.
const steelDark = "#687580";
const steelMid = "#a9b6bf";
const steelLight = "#dce5e9";
const steelEdge = "#eef2f0";
const brassDark = "#86602b";
const brassMid = "#be8a39";
const brassLight = "#edbf61";
const black = "#202329";
// Blade: broad near the guard, tapering to a short, sharp point.
for (let y = 3; y <= 29; y++) {
let w;
if (y <= 13) w = Math.max(0, Math.round((y - 3) * 0.65));
else if (y <= 22) w = 7;
else w = Math.max(4, 7 - Math.floor((y - 22) / 2));
for (let x = 24 - w; x <= 24 + w; x++) {
const d = Math.abs(x - 24);
const top = d <= 1 ? 6 : d <= w - 3 ? 5 : d < w ? 4 : 3;
for (let z = 0; z <= top; z++) {
let color = z <= 1 ? steelDark : x < 24 ? steelLight : steelMid;
if (d === w && w > 1) color = z >= 2 ? steelEdge : steelDark;
if (d <= 1 && z >= 5) color = steelEdge;
if (z >= 3 && d > 1 && d < w && rand() < 0.07) {
color = x < 24 ? steelMid : steelLight;
}
set(x, y, z, color);
}
}
}
// Squared-off ricasso disappears beneath the crossguard.
box(21, 27, 0, 27, 31, 5, steelDark);
box(22, 27, 5, 26, 29, 6, steelMid);
line(24, 7, 6, 24, 26, 6, 0, steelLight);
// Curved brass arms sweep toward the blade at their outer tips.
for (let x = 13; x <= 35; x++) {
const reach = Math.abs(x - 24);
const cy = 30 - Math.floor(Math.max(0, reach - 3) * 0.43);
const end = reach >= 10;
for (let y = cy - (end ? 2 : 1); y <= cy + 1; y++) {
for (let z = 0; z <= (end ? 7 : 6); z++) {
let color = z <= 1 || y === cy + 1 ? brassDark : brassMid;
if (z >= 5 || y === cy - (end ? 2 : 1)) color = brassLight;
if (z >= 3 && z < 5 && rand() < 0.06) color = brassLight;
set(x, y, z, color);
}
}
}
// Raised guard boss and its dark inset.
box(21, 29, 5, 27, 32, 7, brassDark);
box(22, 29, 7, 26, 31, 7, brassLight);
box(23, 30, 8, 25, 30, 8, brassMid);
set(24, 30, 8, "#f5d788");
// Rounded black grip, with a subtly faceted top.
for (let y = 33; y <= 42; y++) {
for (let x = 21; x <= 27; x++) {
const side = Math.abs(x - 24);
const top = side === 3 ? 3 : side === 2 ? 4 : 5;
for (let z = 0; z <= top; z++) {
let color = side === 3 || z <= 1 ? "#11161b" : black;
if (z === top && side <= 1) color = "#343940";
if (z === top && rand() < 0.08) color = "#42474b";
set(x, y, z, color);
}
}
}
// Diagonal silver wire bands wrap over the grip and down its sides.
for (let band = 0; band < 4; band++) {
const baseY = 34 + band * 2;
for (let x = 21; x <= 27; x++) {
const y = baseY + (x >= 25 ? 1 : 0);
const side = Math.abs(x - 24);
const z = side === 3 ? 3 : side === 2 ? 4 : 5;
set(x, y, z, side === 3 ? "#89949b" : "#cbd4d7");
if (side === 3) set(x, y, 2, "#89949b");
}
}
// Narrow collar and chunky, round silver pommel.
box(21, 42, 0, 27, 43, 5, "#78838a");
box(22, 42, 5, 26, 43, 6, "#d5dce0");
ellipsoid(24, 44, 3, 4, 2.5, 3, "#89969f");
for (let y = 42; y <= 46; y++) {
for (let x = 20; x <= 28; x++) {
for (let z = 0; z <= 6; z++) {
if (get(x, y, z) === "#89969f") {
if (z >= 4 && y <= 45) set(x, y, z, steelLight);
else if (z <= 1 || y === 46) set(x, y, z, steelDark);
}
}
}
}
box(23, 44, 6, 25, 45, 6, steelEdge);import { draw } from "./assets/voxel";
import { daga } from "./assets/daga";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, daga, 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 daga
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["daga"] })
# It lands in client/assets/daga.ts
# https://fogon.page/object/daga