← EquipamientoObjeto 3Dfogon/escudo-torre
Escudo torre
Arrastrá para girarlo// «Escudo torre» · gpt-6-sol (medium)
// A big rectangular tower shield standing upright facing -y, almost as tall as a person: thick steel plate with a slightly curved front, dark grey with a lighter rim, three horizontal iron bands with rivets and a narrow vertical slot window near the top. It stands upright on the floor (z=0), facing front (-y), centered, chunky and readable.
// Broad, slightly chamfered tower shield with a convex steel face.
const steel = ["#343a40", "#3b4248", "#424a50"];
const rimDark = "#606a70";
const rimLight = "#879197";
function edges(z) {
if (z === 0 || z === 42) return [11, 36];
if (z <= 2 || z >= 40) return [9, 38];
return [7, 40];
}
function front(x) {
const d = Math.abs(x - 23.5) / 16.5;
return 17 + Math.round(3 * d * d);
}
// Solid plate, with a narrow opening left near the top.
for (let z = 0; z <= 42; z++) {
const [left, right] = edges(z);
for (let x = left; x <= right; x++) {
const face = front(x);
const border = Math.min(x - left, right - x, z, 42 - z);
const slot = x >= 22 && x <= 25 && z >= 35 && z <= 39;
for (let y = face; y <= 29; y++) {
if (slot && y < 28) continue;
let color;
if (y === face) {
color = border < 3 ? rimDark : steel[rand() < 0.12 ? 2 : 1];
if (z > 29 && rand() < 0.08) color = "#4b5359";
} else if (y >= 27) {
color = "#30363b";
} else {
color = steel[0];
}
set(x, y, z, color);
}
// Raised, bright-edged perimeter.
if (border < 3) {
set(x, face - 1, z, border === 0 ? rimLight : rimDark);
if (border === 0 || (border === 1 && z >= 40))
set(x, face - 2, z, border === 0 ? "#969fa3" : "#747e83");
}
}
}
// Three broad horizontal iron bands, following the curved front.
for (const low of [7, 18, 29]) {
for (let z = low; z <= low + 3; z++) {
const [left, right] = edges(z);
for (let x = left + 2; x <= right - 2; x++) {
const y = front(x);
set(x, y - 2, z, z === low ? "#899398" :
z === low + 3 ? "#505a61" : "#68737a");
if (z === low + 1 || z === low + 2)
set(x, y - 3, z, "#727d83");
}
}
// Chunky round-headed rivets on each band.
for (const x of [12, 18, 24, 30, 36]) {
const y = front(x);
set(x, y - 4, low + 1, "#aeb8b8");
set(x + 1, y - 4, low + 1, "#889396");
set(x, y - 4, low + 2, "#768185");
set(x + 1, y - 4, low + 2, "#59646a");
set(x, y - 5, low + 1, "#d0d6d0");
}
}
// Thick bevel and deep shadow around the viewing slit.
for (let z = 33; z <= 41; z++) {
for (let x = 20; x <= 27; x++) {
const inner = x >= 22 && x <= 25 && z >= 35 && z <= 39;
if (inner) continue;
const edge = x === 21 || x === 26 || z === 34 || z === 40;
set(x, front(x) - 2, z, edge ? "#9ba5a5" : "#69747a");
}
}
for (let z = 35; z <= 39; z++) {
for (let x = 22; x <= 25; x++) {
set(x, 28, z, "#11191d");
// Dark interior jambs emphasize the plate's thickness.
if (x === 22 || x === 25) set(x, 25, z, "#252e33");
}
}
// Leather-covered grip and attachment bars on the back.
box(15, 30, 13, 32, 31, 15, "#555b5a");
box(15, 30, 25, 32, 31, 27, "#555b5a");
box(21, 31, 15, 26, 33, 25, "#714c32");
box(21, 33, 17, 26, 33, 23, "#946740");
for (const z of [14, 26]) {
for (const x of [17, 30]) set(x, 32, z, "#a8aeaa");
}import { draw } from "./assets/voxel";
import { escudoTorre } from "./assets/escudo-torre";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, escudoTorre, 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 escudo-torre
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["escudo-torre"] })
# Queda en client/assets/escudo-torre.ts
# https://fogon.page/object/escudo-torre