fogón

← Medieval3D assetfogon/taberna

Taberna

by fogonCC041119 blocks
TabernaDrag to turn it
// «Taberna» · gpt-6-sol (medium)
// A two-storey medieval tavern: grey stone ground floor, an overhanging upper floor of cream plaster with dark brown timber beams, a steep dark slate roof with a chimney, a wide arched wooden door with iron bands, small warm-lit windows (yellow-orange panes), and a wooden sign shaped like a foaming beer mug hanging from an iron bracket beside the door. Two small barrels next to the door.

const stone = "#89877e", stoneLight = "#aaa79a", stoneDark = "#686961";
const plaster = "#e6d8b5", plasterLight = "#f2e6c8";
const timber = "#493024", timberLight = "#684332", iron = "#252a2c";
const slate = ["#343d48", "#404a55", "#4a5660", "#303943"];

// Solid stone ground floor.
box(8, 10, 0, 39, 38, 17, stone);
for (let x = 8; x <= 39; x++)
  for (let z = 0; z <= 17; z++)
    if (rand() < 0.20) set(x, 10, z, rand() < 0.55 ? stoneLight : stoneDark);
for (let y = 11; y <= 38; y++)
  for (let z = 0; z <= 17; z++)
    if (rand() < 0.16) {
      const c = rand() < 0.5 ? stoneLight : stoneDark;
      set(8, y, z, c);
      set(39, y, z, c);
    }

// Uneven masonry courses and a few mossy joints.
for (let z = 3; z <= 16; z += 4)
  for (let x = 9; x <= 38; x++)
    if (rand() > 0.20) set(x, 9, z, stoneDark);
for (let i = 0; i < 80; i++) {
  const x = 9 + Math.floor(rand() * 30);
  const z = Math.floor(rand() * 7);
  if (rand() < 0.55) set(x, 9, z, "#666f58");
}

// Projecting upper storey: plaster, with exposed dark timber framing.
box(5, 7, 18, 42, 40, 30, plaster);
for (let x = 5; x <= 42; x++)
  for (let z = 18; z <= 30; z++)
    if (rand() < 0.13) {
      set(x, 7, z, plasterLight);
      set(x, 40, z, plasterLight);
    }
for (let y = 8; y <= 39; y++)
  for (let z = 18; z <= 30; z++)
    if (rand() < 0.11) {
      set(5, y, z, plasterLight);
      set(42, y, z, plasterLight);
    }

box(4, 6, 17, 43, 41, 18, timber);
box(5, 6, 29, 42, 41, 30, timber);
box(5, 6, 18, 42, 7, 19, timberLight);
box(5, 6, 29, 42, 7, 30, timber);
for (const x of [5, 19, 28, 42]) box(x, 6, 19, x + 1, 7, 29, timber);
for (const y of [7, 20, 40]) {
  box(5, y, 19, 6, y + 1, 29, timber);
  box(41, y, 19, 42, y + 1, 29, timber);
}
line(7, 6, 20, 11, 6, 24, 0, timberLight);
line(17, 6, 25, 19, 6, 28, 0, timberLight);
line(29, 6, 27, 32, 6, 24, 0, timberLight);
line(38, 6, 24, 41, 6, 20, 0, timberLight);

// Warm leaded windows, recessed behind stone or wooden frames.
function windowFront(x0, z0, y, w, h, frame) {
  box(x0, y + 1, z0, x0 + w - 1, y + 1, z0 + h - 1, "#b96329");
  box(x0 + 1, y, z0 + 1, x0 + w - 2, y, z0 + h - 2, "#f7bd59");
  box(x0, y - 1, z0, x0 + w - 1, y - 1, z0, frame);
  box(x0, y - 1, z0 + h - 1, x0 + w - 1, y - 1, z0 + h - 1, frame);
  box(x0, y - 1, z0, x0, y - 1, z0 + h - 1, frame);
  box(x0 + w - 1, y - 1, z0, x0 + w - 1, y - 1, z0 + h - 1, frame);
  const mid = x0 + Math.floor(w / 2);
  box(mid, y - 1, z0 + 1, mid, y - 1, z0 + h - 2, frame);
  box(x0 + 1, y - 1, z0 + Math.floor(h / 2),
      x0 + w - 2, y - 1, z0 + Math.floor(h / 2), frame);
}
windowFront(11, 8, 9, 6, 6, stoneDark);
windowFront(32, 8, 9, 6, 6, stoneDark);
windowFront(11, 22, 6, 7, 6, timber);
windowFront(21, 22, 6, 6, 6, timber);
windowFront(31, 22, 6, 7, 6, timber);
box(10, 8, 7, 17, 9, 7, stoneLight);
box(31, 8, 7, 38, 9, 7, stoneLight);

// Broad arched plank door and chunky stone arch.
box(19, 9, 0, 29, 10, 10, stoneDark);
box(20, 8, 0, 28, 9, 10, "#75492c");
box(21, 8, 11, 27, 9, 12, "#75492c");
box(22, 8, 13, 26, 9, 13, "#75492c");
for (const x of [22, 25, 28])
  box(x, 7, 1, x, 7, x === 28 ? 10 : 12, "#503322");
for (const z of [3, 8]) {
  box(20, 7, z, 28, 7, z, iron);
  for (const x of [21, 24, 27]) set(x, 6, z, "#81817b");
}
set(26, 6, 5, "#d3aa55");
box(18, 8, 0, 19, 9, 10, stoneLight);
box(29, 8, 0, 30, 9, 10, stoneLight);
box(19, 8, 11, 20, 9, 12, stoneLight);
box(28, 8, 11, 29, 9, 12, stoneLight);
box(20, 8, 13, 21, 9, 13, stoneLight);
box(27, 8, 13, 28, 9, 13, stoneLight);
box(22, 8, 14, 26, 9, 14, stoneLight);
box(18, 7, 0, 30, 8, 0, stoneDark);

// Timber gable beneath the pitched roof.
for (let x = 6; x <= 41; x++) {
  const roofZ = 31 + Math.floor((19.5 - Math.abs(x - 23.5)) * 0.61);
  if (roofZ > 31) box(x, 7, 31, x, 8, roofZ - 1, plaster);
}
box(23, 6, 31, 24, 7, 39, timber);
windowFront(21, 33, 6, 6, 5, timber);

// Deep slate roof, with staggered lighter tile faces.
box(4, 5, 30, 43, 42, 30, timber);
for (let x = 4; x <= 43; x++) {
  const top = 31 + Math.floor((19.5 - Math.abs(x - 23.5)) * 0.61);
  for (let y = 5; y <= 42; y++) {
    const tile = slate[Math.floor(rand() * slate.length)];
    for (let z = Math.max(31, top - 2); z <= top; z++)
      set(x, y, z, z === top ? tile : "#303741");
    if (y % 5 === (Math.floor(x / 3) % 2 ? 2 : 0))
      set(x, y, top, "#242d36");
  }
}
box(22, 5, 42, 25, 42, 43, "#29313b");
for (let y = 6; y <= 41; y += 4)
  box(22, y, 43, 25, y, 43, "#505a63");
box(4, 4, 30, 43, 4, 31, "#252d34");
box(4, 42, 30, 43, 43, 31, "#252d34");

// Stone chimney rising through the rear roof.
box(32, 31, 36, 37, 36, 44, stoneDark);
for (let z = 37; z <= 43; z++)
  for (let y = 31; y <= 36; y++)
    if (rand() < 0.23) set(32, y, z, stoneLight);
box(31, 30, 44, 38, 37, 45, stoneLight);
box(33, 32, 45, 36, 35, 45, iron);
box(34, 33, 45, 35, 34, 45, "#171d20");

// Two stout barrels beside the entrance.
function barrel(cx, cy) {
  cylinder(cx, cy, 1, 2.6, 5, "#865333");
  cylinder(cx, cy, 0, 2.4, 1, "#553725");
  cylinder(cx, cy, 5, 2.4, 1, "#ad7745");
  for (const z of [1, 4]) {
    for (let x = cx - 2; x <= cx + 2; x++) {
      set(x, cy - 2, z, iron);
      set(x, cy + 2, z, iron);
    }
  }
  set(cx, cy - 3, 2, "#c39653");
}
barrel(13, 6);
barrel(17, 5);

// Wrought-iron bracket. Only the hanging mug sign swings.
box(34, 3, 22, 34, 7, 22, iron);
box(33, 3, 22, 36, 3, 22, iron);
line(34, 7, 25, 34, 3, 22, 0, iron);
set(34, 3, 21, "#a9a49a");

part("mug sign", [34, 3, 21]);
for (const x of [33, 36]) box(x, 3, 20, x, 3, 21, iron);
box(31, 2, 14, 38, 3, 20, timber);
box(32, 1, 15, 37, 1, 19, "#c4893d");
box(33, 0, 16, 36, 0, 18, "#e2ab51");
box(31, 1, 14, 38, 1, 14, "#d0a45e");
box(31, 1, 20, 38, 1, 20, "#d0a45e");
box(31, 1, 15, 31, 1, 19, "#d0a45e");
box(38, 1, 15, 38, 1, 19, "#d0a45e");
// Carved handle, open in its middle.
box(39, 1, 16, 40, 2, 16, "#a8743c");
box(40, 1, 17, 40, 2, 19, "#a8743c");
box(39, 1, 19, 40, 2, 19, "#a8743c");
// A generous white foam cap spilling over the rim.
box(32, 0, 20, 37, 1, 21, "#f4ead0");
box(33, 0, 22, 35, 1, 22, "#fff4dc");
box(32, 0, 19, 33, 0, 20, "#f4ead0");
set(36, 0, 19, "#fff4dc");
animate("mug sign", { type: "swing", axis: "x", speed: 2, amplitude: 0.25 });
part("body", [24, 24, 0]);