fogón

← Fantasy3D assetfogon/paladin

Paladín

by fogonCC012490 blocks
PaladínDrag to turn it
// «Paladín» · gpt-6-sol (medium)
// A chunky cartoon paladin knight facing front (-y): shiny silver plate armor with gold edges, a white tabard with a gold sun emblem on the chest, a round-topped helmet with an open face and a small blue plume, a big kite shield with a gold sun on the left arm and a glowing sword in the right hand.

const silverDark = "#728999";
const silver = "#aabdc7";
const silverLight = "#e2edf0";
const goldDark = "#986527";
const gold = "#dba944";
const goldLight = "#ffe49a";
const white = "#f4f1e5";
const whiteShade = "#d4dce0";

part("body");

function armorBox(x0, y0, z0, x1, y1, z1) {
  box(x0, y0, z0, x1, y1, z1, silverDark);
  box(x0 + 1, y0, z0 + 1, x1 - 1, y0, z1, silverLight);
  box(x0 + 1, y0 + 1, z0 + 1, x1 - 1, y1, z1, silver);
}

// Broad chest and narrow waist.
ellipsoid(24, 24, 26, 10, 8, 9, silverDark);
box(17, 18, 21, 31, 30, 32, silver);
box(18, 17, 27, 30, 18, 32, silverLight);
box(19, 19, 17, 29, 29, 22, silverDark);
box(18, 17, 19, 30, 29, 20, goldDark);
box(19, 16, 20, 29, 17, 20, goldLight);

// Plate seams and gilded edges beside the tabard.
for (const x of [17, 31]) {
  box(x, 17, 22, x, 18, 32, gold);
  box(x, 17, 25, x, 17, 29, goldLight);
}
box(19, 16, 32, 29, 17, 33, gold);
box(20, 16, 33, 28, 17, 33, goldLight);

// Separate walking legs.
function leg(name, cx, speed) {
  part(name, [cx, 24, 18]);
  ellipsoid(cx, 24, 14, 4, 5, 6, silverDark);
  box(cx - 3, 19, 11, cx + 3, 28, 17, silver);
  box(cx - 2, 18, 12, cx + 2, 18, 16, silverLight);
  box(cx - 3, 18, 10, cx + 3, 28, 11, goldDark);
  box(cx - 2, 17, 11, cx + 2, 17, 11, goldLight);

  ellipsoid(cx, 23, 8, 4, 5, 3, silverLight);
  box(cx - 3, 19, 4, cx + 3, 27, 8, silver);
  box(cx - 2, 18, 5, cx + 2, 18, 8, silverLight);
  box(cx - 3, 18, 3, cx + 3, 28, 4, gold);
  box(cx - 3, 16, 0, cx + 3, 29, 3, silverDark);
  box(cx - 3, 15, 1, cx + 3, 23, 3, silver);
  box(cx - 2, 15, 3, cx + 2, 19, 3, silverLight);
  box(cx - 3, 15, 0, cx + 3, 28, 0, goldDark);
  animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
leg("leftLeg", 19, 5);
leg("rightLeg", 29, -5);
part("body");

// White cloth hangs over the breastplate and between the legs.
box(21, 15, 23, 27, 16, 31, whiteShade);
box(21, 14, 24, 27, 14, 30, white);
box(20, 15, 17, 28, 17, 23, whiteShade);
box(19, 15, 12, 29, 17, 18, whiteShade);
box(20, 14, 13, 28, 14, 23, white);
box(21, 14, 12, 27, 14, 13, white);
for (const x of [19, 29]) box(x, 14, 13, x, 15, 19, gold);
box(20, 14, 12, 28, 14, 12, goldDark);
box(22, 13, 14, 22, 13, 20, "#ffffff");

// Sun embroidered on the chest.
for (let dx = -2; dx <= 2; dx++) {
  for (let dz = -2; dz <= 2; dz++) {
    if (dx * dx + dz * dz <= 5) set(24 + dx, 13, 27 + dz, gold);
  }
}
box(23, 12, 27, 25, 12, 28, goldLight);
for (const [dx, dz] of [
  [0, 4], [0, -4], [4, 0], [-4, 0],
  [3, 3], [-3, 3], [3, -3], [-3, -3]
]) {
  set(24 + dx, 13, 27 + dz, goldLight);
  if (Math.abs(dx) === 4 || Math.abs(dz) === 4)
    set(24 + dx, 13, 27 + dz + (dz > 0 ? 1 : dz < 0 ? -1 : 0), gold);
}

// Shield-side shoulder and arm.
ellipsoid(14, 23, 30, 6, 6, 5, silverDark);
ellipsoid(14, 21, 31, 6, 5, 4, silver);
box(10, 17, 32, 17, 20, 33, silverLight);
box(9, 18, 30, 10, 24, 32, gold);
ellipsoid(12, 21, 24, 4, 4, 6, silver);
box(9, 17, 19, 13, 21, 25, silverDark);
box(9, 16, 20, 12, 17, 24, silverLight);
box(9, 15, 18, 13, 19, 21, gold);

// Big kite shield: rounded shoulders, tapering to a point.
function shieldWidth(z) {
  if (z <= 17) return Math.min(6, Math.floor((z - 9) * 0.75));
  if (z >= 28) return z === 31 ? 3 : z === 30 ? 4 : 5;
  return 6;
}
for (let z = 9; z <= 31; z++) {
  const w = shieldWidth(z);
  for (let x = 11 - w; x <= 11 + w; x++) {
    const rim = Math.abs(x - 11) >= w - 1 || z === 9 || z === 31;
    box(x, 10, z, x, 13, z, rim ? goldDark : "#426a80");
    set(x, 9, z, rim ? gold : (x < 11 ? "#6797a5" : "#385a70"));
    if (Math.abs(x - 11) === w && z > 10 && z < 30)
      set(x, 8, z, goldLight);
  }
}
box(8, 8, 29, 14, 8, 29, goldLight);
for (let z = 13; z <= 27; z += 3) {
  const w = shieldWidth(z);
  set(11 - w + 2, 8, z, "#91b5b8");
}

// Raised golden sun on the shield.
for (let dx = -2; dx <= 2; dx++) {
  for (let dz = -2; dz <= 2; dz++) {
    if (dx * dx + dz * dz <= 5) set(11 + dx, 8, 22 + dz, gold);
  }
}
box(10, 7, 22, 12, 7, 23, goldLight);
for (const [dx, dz] of [
  [0, 4], [0, -4], [4, 0], [-4, 0],
  [3, 3], [-3, 3], [3, -3], [-3, -3]
]) {
  set(11 + dx, 8, 22 + dz, goldLight);
}

// Friendly open-faced helmet.
ellipsoid(24, 23, 38, 8, 8, 5, silverDark);
ellipsoid(24, 22, 39, 7, 7, 4, silver);
box(19, 16, 35, 29, 19, 40, "#e6af88");
box(20, 15, 36, 28, 15, 39, "#f3c5a0");
box(20, 15, 35, 28, 16, 35, "#d89478");
box(17, 16, 35, 19, 23, 41, silverLight);
box(29, 16, 35, 31, 23, 41, silverLight);
box(18, 15, 40, 30, 19, 42, silver);
box(19, 14, 40, 29, 15, 41, gold);
box(20, 14, 41, 28, 14, 41, goldLight);
box(18, 15, 34, 20, 19, 35, goldDark);
box(28, 15, 34, 30, 19, 35, goldDark);

// Big, bright eyes and a little smile.
for (const x of [22, 26]) {
  box(x - 1, 14, 38, x + 1, 14, 39, "#fff9e9");
  set(x, 13, 38, "#395e79");
  set(x, 13, 39, "#263c52");
  set(x - 1, 13, 39, "#ffffff");
}
set(24, 14, 36, "#d58c72");
set(23, 14, 35, "#884f50");
set(24, 14, 35, "#884f50");
set(25, 14, 35, "#884f50");

// Small swept-back blue plume.
box(23, 21, 43, 25, 24, 43, goldDark);
ellipsoid(24, 23, 44, 3, 3, 1, "#227caa");
box(23, 23, 44, 26, 26, 45, "#36add1");
box(25, 24, 45, 28, 27, 45, "#19729f");
box(24, 22, 45, 25, 25, 45, "#88e3eb");

// Sword arm, including its pauldron and held weapon.
part("swordArm", [34, 23, 32]);
ellipsoid(35, 23, 31, 6, 6, 5, silverDark);
ellipsoid(35, 21, 32, 5, 5, 4, silver);
box(32, 17, 33, 38, 19, 34, silverLight);
box(38, 19, 30, 39, 24, 33, gold);
ellipsoid(36, 21, 26, 4, 4, 6, silver);
box(34, 17, 25, 38, 18, 29, silverLight);
box(35, 17, 20, 39, 22, 25, silverDark);
box(36, 16, 21, 39, 17, 25, silverLight);
box(35, 16, 20, 39, 21, 21, gold);
box(37, 15, 17, 40, 19, 20, silver);
box(38, 14, 18, 40, 15, 19, silverLight);

// Warm brass grip and wide curled crossguard.
box(40, 15, 16, 41, 17, 24, goldDark);
box(40, 14, 17, 40, 14, 23, goldLight);
ellipsoid(40, 16, 16, 2, 2, 2, gold);
box(36, 14, 23, 44, 17, 24, gold);
box(36, 13, 24, 38, 14, 25, goldLight);
box(43, 13, 24, 44, 14, 25, goldLight);
box(39, 13, 23, 42, 13, 24, goldDark);
set(40, 12, 23, "#8d42bb");
set(41, 12, 23, "#da78ed");

// A broad silver blade with a saturated cyan magical edge.
for (let z = 25; z <= 40; z++) {
  const cx = z < 33 ? 41 : 42;
  box(cx - 1, 15, z, cx + 1, 17, z, "#62dce9");
  set(cx, 14, z, silverLight);
  set(cx - 1, 14, z, "#9afaff");
  set(cx + 1, 14, z, "#15b8d4");
  if (z % 4 === 0) set(cx, 13, z, "#ffffff");
}
box(42, 15, 41, 43, 16, 42, "#6cf0fa");
set(42, 14, 41, "#ffffff");
set(43, 14, 41, "#25c9e4");
set(43, 14, 43, "#b9ffff");
animate("swordArm", { type: "swing", axis: "x", speed: 3, amplitude: 0.4 });