fogón

← EquipamientoObjeto 3Dfogon/mapa-enrollado

Mapa enrollado

de fogonCC06668 bloques
Mapa enrolladoArrastrá para girarlo
// «Mapa enrollado» · gpt-6-sol (medium)
// A treasure map half unrolled on the floor: a parchment sheet in cream and tan with a rolled curl at each end, a little drawn island, a dotted red path and a red X, and a compass rose in a corner.

// Half-unrolled treasure map, resting on the floor at z = 0.
const parchment = ["#ead3a2", "#efd9ac", "#e5ca93", "#f3dfb6"];
const red = "#b93330";

function paperColor() {
  const n = rand();
  return n < 0.12 ? parchment[2] : n < 0.30 ? parchment[1] : parchment[0];
}

// Solid sheet, with its edges lifting toward the rolls.
for (let x = 10; x <= 38; x++) {
  let top = 2;
  if (x === 10 || x === 38) top = 5;
  else if (x === 11 || x === 37) top = 4;
  else if (x === 12 || x === 36) top = 3;

  for (let y = 9; y <= 39; y++) {
    for (let z = 0; z <= top; z++) {
      let color = z === top ? paperColor() : "#c9a977";
      if (y === 9 || y === 39) {
        color = z === top ? "#b99462" : "#a88155";
      }
      set(x, y, z, color);
    }
  }
}

// Thick curled ends, also touching the floor.
for (const cx of [8, 40]) {
  for (let y = 9; y <= 39; y++) {
    for (let x = cx - 4; x <= cx + 4; x++) {
      for (let z = 0; z <= 8; z++) {
        const d = Math.hypot(x - cx, z - 4);
        if (d > 4.3) continue;

        let color = paperColor();
        if (d > 3.45) color = z <= 4 ? "#af8759" : "#e2c38c";
        else if (d < 2.35) color = "#cda976";
        if ((y === 12 || y === 36) && d > 3.35) {
          color = z >= 4 ? "#bb9150" : "#805d3c";
        }
        set(x, y, z, color);
      }
    }
  }

  // Visible winding on the front end of each roll.
  for (let x = cx - 4; x <= cx + 4; x++) {
    for (let z = 0; z <= 8; z++) {
      const d = Math.hypot(x - cx, z - 4);
      if (d > 4.3) continue;

      let color = "#a67d51";
      if (d > 3.25) color = "#e4c995";
      else if (d > 2.35) color = "#76573d";
      else if (d > 1.25) color = "#dbc08f";
      else color = "#8a6947";
      set(x, 8, z, color);
    }
  }
  set(cx, 8, 4, "#f0d8a8");
  set(cx + 1, 8, 4, "#f0d8a8");
  set(cx + 1, 8, 3, "#f0d8a8");
  set(cx, 8, 3, "#795a3e");
}

// Inked border inside the raised edges.
for (let x = 13; x <= 35; x++) {
  set(x, 11, 3, x % 5 === 0 ? "#927249" : "#aa8958");
  set(x, 37, 3, x % 6 === 0 ? "#927249" : "#aa8958");
}
for (let y = 12; y <= 36; y++) {
  set(13, y, 3, "#aa8958");
  set(35, y, 3, "#aa8958");
}

// Hand-drawn island, with a sandy shore and green interior.
for (let x = 17; x <= 30; x++) {
  for (let y = 21; y <= 33; y++) {
    const wobble = 0.11 * Math.sin(x * 2.7 + y) +
                   0.07 * Math.cos(y * 2.3 - x);
    const d = ((x - 23.5) / 6.3) ** 2 + ((y - 27) / 5.6) ** 2;
    if (d < 1 + wobble) {
      let color;
      if (d > 0.73 + wobble) color = "#826a46";
      else if (d > 0.48 + wobble) color = "#cfab70";
      else color = rand() < 0.24 ? "#779052" : "#688348";
      set(x, y, 3, color);
    }
  }
}

// Chunky tree marks.
for (const [x, y] of [[21, 26], [25, 25], [24, 29]]) {
  set(x, y, 4, "#405c3b");
  set(x + 1, y, 4, "#527044");
  set(x, y + 1, 4, "#527044");
}

// Blue ink waves around the island.
for (const [x, y] of [[16, 23], [29, 34], [30, 29], [17, 30]]) {
  for (let i = 0; i < 3; i++) {
    set(x + i, y, 3, i === 1 ? "#638c9a" : "#789eaa");
  }
}

// Compass rose in one corner.
const ccx = 18, ccy = 16;
for (let k = -4; k <= 4; k++) {
  set(ccx, ccy + k, 3, "#66543e");
  set(ccx + k, ccy, 3, "#66543e");
}
for (const [dx, dy] of [[-2, -2], [2, -2], [-2, 2], [2, 2]]) {
  set(ccx + dx, ccy + dy, 3, "#9a7548");
}
set(ccx, ccy, 4, "#d1a652");
set(ccx, ccy - 4, 4, red);
set(ccx - 1, ccy - 3, 4, red);
set(ccx + 1, ccy - 3, 4, red);
set(ccx, ccy + 4, 4, "#50483b");

// Dotted red trail winding toward the treasure.
const dots = [
  [15, 35], [18, 35], [20, 34], [23, 34],
  [26, 33], [29, 31], [31, 28], [32, 25], [32, 22]
];
for (const [x, y] of dots) {
  for (let dx = 0; dx < 2; dx++) {
    for (let dy = 0; dy < 2; dy++) {
      set(x + dx, y + dy, 4, dx === 0 ? red : "#d44b3c");
    }
  }
}

// Bold ruby-red treasure X.
for (let i = -3; i <= 3; i++) {
  set(32 + i, 17 + i, 4, "#9e292c");
  set(32 + i, 17 - i, 4, "#9e292c");
  if (Math.abs(i) < 3) {
    set(32 + i, 18 + i, 4, "#d4463b");
    set(32 + i, 18 - i, 4, "#d4463b");
  }
}
set(32, 17, 5, "#e15945");