← MedievalObjeto 3Dfogon/soporte-espada-escudo
Soporte con espada y escudo
Arrastrá para girarlo// «Soporte con espada y escudo» · gpt-6-sol (medium)
// A wooden weapon display stand: a dark wooden base and an upright post with a crossbar, holding a big kite-shaped heater shield divided into royal blue and deep red with a gold lion or cross emblem and a grey iron rim, and in front of it a long straight silver sword with a gold cross guard, brown leather grip and round pommel, standing point down, plus a steel helmet on top of the post.
const wood = "#3b241b", woodLight = "#60402a", woodDark = "#291a17";
const iron = "#636b70", ironLight = "#a2a9aa", ironDark = "#41494f";
const gold = "#d6a943", goldLight = "#f2ce70", goldDark = "#987029";
const blue = "#23448b", blueLight = "#3057a0";
const red = "#892c3b", redLight = "#a83b49";
// Broad, low timber plinth.
box(7, 12, 0, 41, 36, 2, woodDark);
box(8, 13, 2, 40, 35, 3, wood);
box(10, 15, 4, 38, 33, 4, woodLight);
for (let x = 10; x <= 38; x += 7) {
box(x, 13, 3, x, 35, 3, woodDark);
}
for (let x of [8, 39]) {
for (let y of [13, 34]) {
box(x, y, 1, x + 1, y + 1, 3, ironDark);
set(x, y, 3, ironLight);
}
}
for (let x = 12; x <= 36; x += 6) {
set(x, 12, 2, goldDark);
set(x, 36, 2, iron);
}
// Upright, feet, and the exposed ends of its crossbar.
box(21, 26, 4, 27, 31, 38, wood);
box(22, 26, 5, 22, 26, 37, woodLight);
box(26, 26, 5, 26, 26, 37, woodDark);
box(16, 23, 4, 20, 34, 7, wood);
box(28, 23, 4, 32, 34, 7, wood);
line(16, 29, 5, 22, 28, 23, 1, woodLight);
line(32, 29, 5, 26, 28, 23, 1, woodDark);
box(9, 26, 29, 39, 30, 32, wood);
box(9, 25, 29, 11, 31, 33, ironDark);
box(37, 25, 29, 39, 31, 33, ironDark);
for (let x of [10, 38]) {
set(x, 25, 31, ironLight);
set(x, 25, 29, ironLight);
}
// Steel helm perched above the shield: domed crown, projecting brow and visor.
for (let z = 38; z <= 44; z++) {
const width = [6, 6, 6, 5, 4, 3, 1][z - 38];
for (let x = 24 - width; x <= 24 + width; x++) {
for (let y = 22; y <= 30; y++) {
const dy = (y - 26) / 5;
const dx = (x - 24) / (width + 0.5);
if (dx * dx + dy * dy <= 1.15)
set(x, y, z, x < 22 ? ironDark : z >= 42 ? ironLight : iron);
}
}
}
box(17, 20, 37, 31, 30, 38, ironDark);
box(18, 20, 38, 30, 21, 39, ironLight);
box(19, 19, 38, 29, 19, 38, iron);
box(20, 19, 39, 22, 19, 39, woodDark);
box(26, 19, 39, 28, 19, 39, woodDark);
box(23, 18, 37, 25, 20, 40, ironLight);
box(23, 21, 42, 25, 29, 44, ironLight);
for (let x of [18, 30]) set(x, 20, 38, goldDark);
// Kite shield. Its shoulders are wide and its lower half draws to a point.
function shieldSpan(z) {
if (z === 7) return [24, 24];
if (z === 8) return [22, 26];
if (z <= 12) return [22 - (z - 8), 26 + (z - 8)];
if (z <= 19) return [18 - Math.floor((z - 12) * 0.72),
30 + Math.floor((z - 12) * 0.72)];
if (z <= 27) return [12, 36];
if (z <= 30) return [11, 37];
if (z <= 32) return [12, 36];
if (z === 33) return [14, 34];
return [17, 31];
}
for (let z = 7; z <= 34; z++) {
const [lo, hi] = shieldSpan(z);
for (let x = lo; x <= hi; x++) {
const edge = Math.min(x - lo, hi - x);
const field = x < 24 ? (rand() < 0.08 ? blueLight : blue)
: (rand() < 0.08 ? redLight : red);
box(x, 19, z, x, 23, z, woodDark);
set(x, 18, z, field);
set(x, 17, z, field);
if (edge <= 1 || z === 34) {
set(x, 16, z, edge === 0 ? ironDark : ironLight);
if (edge === 0) set(x, 17, z, iron);
} else if (edge === 2) {
set(x, 16, z, goldDark);
}
}
}
// Raised gilded cross, with broad arms and pointed heraldic ends.
box(23, 15, 15, 25, 15, 30, gold);
box(17, 15, 22, 31, 15, 24, gold);
box(22, 15, 27, 26, 15, 29, gold);
box(22, 15, 16, 26, 15, 17, gold);
box(16, 15, 23, 18, 15, 25, gold);
box(30, 15, 23, 32, 15, 25, gold);
box(24, 14, 18, 24, 14, 29, goldLight);
box(18, 14, 24, 30, 14, 24, goldLight);
for (let z of [20, 27, 31]) {
const [lo, hi] = shieldSpan(z);
for (let x of [lo + 1, hi - 1]) {
set(x, 15, z, goldLight);
set(x, 14, z, goldDark);
}
}
// Sword in the foreground: a tapered, straight blade with a bright central ridge.
for (let z = 7; z <= 33; z++) {
const half = z <= 9 ? Math.floor((z - 7) / 2) : z <= 14 ? 1 : 2;
for (let x = 24 - half; x <= 24 + half; x++) {
box(x, 11, z, x, 14, z, x === 24 ? "#e2e5df" : "#9faab1");
set(x, 10, z, x === 24 ? "#f4f0df" :
x < 24 ? "#c0cbd0" : "#74838d");
}
}
box(23, 9, 32, 25, 10, 34, ironDark);
box(16, 9, 34, 32, 13, 35, goldDark);
box(18, 8, 35, 30, 9, 35, goldLight);
box(15, 9, 35, 18, 12, 37, gold);
box(30, 9, 35, 33, 12, 37, gold);
box(16, 8, 36, 17, 9, 37, goldLight);
box(31, 8, 36, 32, 9, 37, goldLight);
box(22, 9, 36, 26, 13, 40, "#69432d");
for (let z = 36; z <= 40; z++) {
box(22, 8, z, 26, 8, z, z % 2 ? "#a37548" : "#493024");
set(23, 7, z, z % 2 ? "#c09258" : "#70492e");
}
box(22, 9, 41, 26, 12, 41, goldDark);
sphere(24, 10, 43, 3, gold);
set(23, 7, 43, goldLight);
set(24, 7, 44, goldLight);import { draw } from "./assets/voxel";
import { soporteEspadaEscudo } from "./assets/soporte-espada-escudo";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, soporteEspadaEscudo, 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 soporte-espada-escudo
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["soporte-espada-escudo"] })
# Queda en client/assets/soporte-espada-escudo.ts
# https://fogon.page/object/soporte-espada-escudo