fogón

← Medieval3D assetfogon/ladron-encapuchado

Ladrón encapuchado

by fogonCC015454 blocks
Ladrón encapuchadoDrag to turn it
// «Ladrón encapuchado» · gpt-6-sol (medium)
// A chunky cartoon hooded thief: a dark green hooded cloak with the hood up shadowing the face (only two bright eyes and a grin visible), brown leather vest and boots, a dagger on the belt, carrying a bulging coin sack with a gold coin peeking out.

// Chunky hooded thief, facing -y.
const greenDark = "#182c25";
const green = "#294738";
const greenLight = "#3d6048";
const leather = "#68432d";
const leatherLight = "#91623c";
const gold = "#e9bc4d";

function flecks(x0, x1, y, z0, z1, color, chance) {
  for (let x = x0; x <= x1; x++)
    for (let z = z0; z <= z1; z++)
      if (get(x, y, z) && rand() < chance) set(x, y, z, color);
}

// Cloak: a broad shoulder mantle and a heavy, uneven back hem.
for (let z = 7; z <= 30; z++) {
  const width = z < 13 ? 10 : z < 19 ? 9 : 11;
  const back = z < 15 ? 32 : 34;
  box(24 - width, 26, z, 24 + width, back, z,
      z < 14 ? greenDark : green);
}
box(14, 29, 7, 20, 34, 9, greenDark);
box(27, 28, 9, 34, 34, 11, greenDark);
ellipsoid(24, 25, 27, 12, 10, 6, green);
box(14, 20, 23, 17, 30, 29, greenDark);
box(31, 20, 23, 34, 30, 29, greenDark);
flecks(15, 33, 34, 13, 27, greenLight, 0.12);

// Torso and brown leather vest, visible inside the cloak.
box(18, 18, 18, 30, 29, 30, leather);
box(19, 15, 21, 29, 19, 29, leather);
box(19, 14, 24, 22, 17, 29, leatherLight);
box(26, 14, 24, 29, 17, 29, leatherLight);
box(23, 14, 22, 25, 17, 29, "#4b3026");
for (let z of [23, 26, 29]) {
  set(24, 13, z, "#d4a64c");
}
box(17, 13, 19, 31, 20, 21, "#493126"); // belt
box(19, 12, 19, 29, 13, 20, "#785132");
box(23, 11, 19, 26, 12, 21, gold);       // buckle
box(24, 10, 19, 25, 11, 20, "#493126");
flecks(19, 29, 14, 24, 29, "#ab7548", 0.13);

// Dagger tucked diagonally into the belt, on the viewer's left.
line(19, 11, 21, 15, 11, 27, 1, "#493126");
line(19, 10, 21, 15, 10, 27, 0, "#b7bdba");
line(19, 9, 21, 15, 9, 27, 0, "#e1ddca");
line(16, 9, 25, 19, 9, 27, 0, gold);
line(14, 10, 27, 12, 10, 29, 1, leather);
set(12, 9, 29, gold);

// Hood, hollowed at the front so the face sits deep in shadow.
ellipsoid(24, 23, 36, 10, 11, 9, greenDark);
ellipsoid(24, 22, 37, 9, 10, 7, green);
box(19, 10, 31, 29, 20, 40, null);
box(19, 18, 32, 29, 20, 39, "#101b1b");
box(20, 17, 34, 28, 17, 38, "#101b1b");

// Thick, irregular hood opening and a highlighted upper fold.
for (let z = 32; z <= 39; z++) {
  box(17, 14, z, 18, 18, z, greenDark);
  box(30, 14, z, 31, 18, z, greenDark);
}
box(18, 13, 39, 30, 17, 40, greenDark);
box(20, 13, 41, 28, 16, 41, greenLight);
box(17, 13, 34, 18, 14, 38, greenLight);
box(30, 13, 34, 31, 14, 38, greenLight);
box(20, 14, 31, 28, 17, 32, greenDark);
for (let i = 0; i < 65; i++) {
  const x = 15 + Math.floor(rand() * 19);
  const z = 30 + Math.floor(rand() * 14);
  if (get(x, 22, z) === green)
    set(x, 22, z, rand() < 0.5 ? greenLight : greenDark);
}

// Nothing of the face shows but two bright eyes and a crooked grin.
box(20, 16, 36, 22, 17, 37, "#ffe9a0");
box(26, 16, 36, 28, 17, 37, "#ffe9a0");
set(22, 15, 36, "#f6c856");
set(26, 15, 36, "#f6c856");
for (let x = 21; x <= 27; x++) {
  const z = (x === 21 || x === 27) ? 34 : 33;
  set(x, 16, z, "#e9d5a0");
}
set(24, 15, 33, "#fff0c5");

// Separate walking legs, each hinged at its hip.
part("leftLeg", [20, 23, 18]);
box(17, 20, 6, 22, 27, 18, "#433b30");
box(17, 19, 7, 22, 22, 15, "#5c5545");
box(16, 17, 0, 23, 27, 7, "#493025");
box(16, 14, 0, 23, 20, 4, leather);
box(16, 14, 4, 23, 17, 5, leatherLight);
box(16, 13, 0, 23, 14, 1, "#2e2623");
box(17, 16, 7, 22, 19, 8, "#a87945");
animate("leftLeg", { type: "swing", axis: "x", speed: 5, amplitude: 0.3 });

part("rightLeg", [28, 23, 18]);
box(26, 20, 6, 31, 27, 18, "#433b30");
box(26, 19, 7, 31, 22, 15, "#5c5545");
box(25, 17, 0, 32, 27, 7, "#493025");
box(25, 14, 0, 32, 20, 4, leather);
box(25, 14, 4, 32, 17, 5, leatherLight);
box(25, 13, 0, 32, 14, 1, "#2e2623");
box(26, 16, 7, 31, 19, 8, "#a87945");
animate("rightLeg", { type: "swing", axis: "x", speed: -5, amplitude: 0.3 });

// Left arm swings opposite its leg.
part("leftArm", [15, 23, 28]);
ellipsoid(14, 22, 25, 4, 5, 5, green);
box(11, 18, 17, 16, 25, 26, green);
box(11, 17, 17, 16, 19, 20, greenDark);
box(12, 16, 15, 16, 20, 18, "#aa7650");
box(11, 16, 20, 15, 17, 25, greenLight);
animate("leftArm", { type: "swing", axis: "x", speed: -5, amplitude: 0.25 });

// Right arm, hand, and the sack it carries move together.
part("rightArm", [33, 23, 28]);
ellipsoid(34, 22, 25, 4, 5, 5, green);
box(33, 18, 18, 38, 25, 26, green);
box(34, 17, 18, 39, 19, 21, greenDark);
box(36, 15, 17, 40, 20, 20, "#ae7950");
box(36, 16, 21, 39, 17, 25, greenLight);

// Bulging, stitched coin sack.
ellipsoid(39, 21, 12, 6, 6, 7, "#8a6743");
ellipsoid(38, 19, 12, 5, 5, 6, "#a17a4b");
ellipsoid(40, 23, 10, 4, 3, 4, "#775337");
box(36, 17, 17, 42, 23, 19, "#9a7045");
box(37, 16, 18, 42, 22, 20, "#654a32");
box(37, 16, 19, 42, 22, 19, "#d1a15b"); // tied cord
box(37, 16, 20, 38, 19, 22, "#af8050");
box(42, 17, 20, 43, 20, 22, "#af8050");
for (let i = 0; i < 45; i++) {
  const x = 34 + Math.floor(rand() * 11);
  const z = 7 + Math.floor(rand() * 10);
  if (get(x, 16, z) === "#a17a4b")
    set(x, 16, z, rand() < 0.5 ? "#b48b57" : "#805d3c");
}
// A large gold coin protrudes from the open mouth.
cylinder(40, 13, 21, 3, 2, "#a97625", "y");
cylinder(40, 12, 21, 2, 2, gold, "y");
set(40, 11, 22, "#fff0a4");
set(39, 11, 20, "#f9d96a");
animate("rightArm", { type: "swing", axis: "x", speed: 5, amplitude: 0.25 });

part("body", [24, 24, 24]);