fogón

← Gear3D assetfogon/escudo-torre

Escudo torre

by fogonCC018629 blocks
Escudo torreDrag to turn it
// «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");
}