public/lib/wardrobe.js

分割 6 / 7 · 元ファイル 784〜952行付近

原文の連続部分です。長い圧縮行は行の途中で分割する場合があります。全分割を順に連結するとファイル全文になります。

    { id: 'helmet', nm: 'ヘルメット', price: 150, draw: function (g, x, yHead, r) {
      dome(g, x, yHead - r * 0.40, r * 1.28, r * 1.10, '#e0b24a');
      brim(g, x, yHead - r * 0.44, r * 1.40, r * 0.16, '#c9982f');
      g.fillStyle = '#c9982f';
      g.fillRect(x - r * 0.10, yHead - r * 1.48, r * 0.20, r * 1.04);
      g.strokeStyle = '#8d7327'; g.lineWidth = 1;
      g.beginPath(); g.ellipse(x, yHead - r * 0.48, r * 1.24, r * 0.30, 0, Math.PI, Math.PI * 2); g.stroke();
    } },
    { id: 'bucket', nm: 'バケットハット', price: 120, draw: function (g, x, yHead, r) {
      dome(g, x, yHead - r * 0.40, r * 1.18, r * 1.04, '#8a8256');
      g.fillStyle = '#77704a';
      g.beginPath();
      g.moveTo(x - r * 1.18, yHead - r * 0.44); g.lineTo(x + r * 1.18, yHead - r * 0.44);
      g.lineTo(x + r * 1.42, yHead - r * 0.06); g.lineTo(x - r * 1.42, yHead - r * 0.06);
      g.closePath(); g.fill();
      g.strokeStyle = '#5f5a3a'; g.lineWidth = 1;
      g.beginPath(); g.moveTo(x - r * 1.00, yHead - r * 0.66); g.lineTo(x + r * 1.00, yHead - r * 0.66); g.stroke();
    } },
    { id: 'cowboy', nm: 'つば広帽', price: 190, draw: function (g, x, yHead, r) {
      g.fillStyle = '#7a5a3c';
      g.beginPath();
      g.moveTo(x - r * 1.52, yHead - r * 0.54);
      g.quadraticCurveTo(x, yHead - r * 0.22, x + r * 1.52, yHead - r * 0.54);
      g.quadraticCurveTo(x, yHead - r * 0.86, x - r * 1.52, yHead - r * 0.54);
      g.closePath(); g.fill();
      dome(g, x, yHead - r * 0.56, r * 0.94, r * 1.14, '#8f6b47');
      g.fillStyle = '#5d4630';
      g.fillRect(x - r * 0.94, yHead - r * 0.84, r * 1.88, r * 0.22);
      g.strokeStyle = '#6d5136'; g.lineWidth = 1.4;
      g.beginPath(); g.moveTo(x, yHead - r * 1.70); g.lineTo(x, yHead - r * 1.30); g.stroke();
    } },
    { id: 'witch', nm: 'とんがり帽子', price: 200, draw: function (g, x, yHead, r, dir) {
      brim(g, x, yHead - r * 0.52, r * 1.50, r * 0.28, '#3a3450');
      g.fillStyle = '#4a4368';
      g.beginPath(); g.moveTo(x - r * 0.90, yHead - r * 0.56);
      g.lineTo(x + r * 0.90, yHead - r * 0.56);
      g.lineTo(x + dir * r * 0.34, yHead - r * 2.16); g.closePath(); g.fill();
      g.fillStyle = GD;
      g.fillRect(x - r * 0.84, yHead - r * 0.80, r * 1.68, r * 0.20);
      g.beginPath(); g.arc(x + dir * r * 0.34, yHead - r * 2.10, r * 0.10, 0, 7); g.fill();
    } },
    { id: 'nightcap', nm: 'ナイトキャップ', price: 100, draw: function (g, x, yHead, r, dir) {
      dome(g, x, yHead - r * 0.32, r * 1.24, r * 1.06, '#cfd6e2');
      /* てっぺんから後ろへ垂れる先っぽ */
      g.fillStyle = '#cfd6e2';
      g.beginPath();
      g.moveTo(x - dir * r * 0.10, yHead - r * 1.36);
      g.quadraticCurveTo(x - dir * r * 1.10, yHead - r * 1.52, x - dir * r * 1.34, yHead - r * 0.94);
      g.quadraticCurveTo(x - dir * r * 0.90, yHead - r * 1.02, x - dir * r * 0.66, yHead - r * 1.14);
      g.closePath(); g.fill();
      g.fillStyle = WH;
      g.beginPath(); g.arc(x - dir * r * 1.34, yHead - r * 0.92, r * 0.22, 0, 7); g.fill();
      g.fillStyle = '#b6bfd0';
      g.fillRect(x - r * 1.24, yHead - r * 0.48, r * 2.48, r * 0.16);
    } },
    { id: 'hachimaki', nm: 'はちまき', price: 70, draw: function (g, x, yHead, r, dir) {
      dome(g, x, yHead - r * 0.36, r * 1.22, r * 1.02, '#e8e3d6');
      g.fillStyle = WH;
      g.fillRect(x - r * 1.24, yHead - r * 0.58, r * 2.48, r * 0.26);
      g.fillStyle = RD;
      g.beginPath(); g.arc(x + dir * r * 0.30, yHead - r * 0.45, r * 0.13, 0, 7); g.fill();
      g.strokeStyle = WH; g.lineWidth = r * 0.12;
      g.beginPath(); g.moveTo(x - dir * r * 1.08, yHead - r * 0.50);
      g.lineTo(x - dir * r * 1.46, yHead - r * 0.02); g.stroke();
    } },
    { id: 'bandana', nm: 'バンダナ', price: 80, draw: function (g, x, yHead, r, dir) {
      dome(g, x, yHead - r * 0.34, r * 1.24, r * 1.04, '#c4443a');
      g.fillStyle = WH;
      for (var i = -2; i <= 2; i++) {
        g.beginPath(); g.arc(x + i * r * 0.42, yHead - r * (0.72 + (i % 2 ? 0.22 : 0)), r * 0.08, 0, 7); g.fill();
      }
      g.fillStyle = '#a3362e';
      g.beginPath(); g.moveTo(x - dir * r * 1.00, yHead - r * 0.52);
      g.lineTo(x - dir * r * 1.50, yHead - r * 0.18); g.lineTo(x - dir * r * 1.00, yHead - r * 0.10);
      g.closePath(); g.fill();
    } },
    { id: 'mobcap', nm: 'ふんわり帽', price: 140, draw: function (g, x, yHead, r) {
      dome(g, x, yHead - r * 0.26, r * 1.22, r * 1.16, WH);
      frill(g, x, yHead - r * 0.34, r * 1.24, r * 0.19, CR, 6);
      dome(g, x, yHead - r * 0.44, r * 1.14, r * 0.98, WH);
      g.fillStyle = PK;
      g.beginPath(); g.arc(x, yHead - r * 1.26, r * 0.12, 0, 7); g.fill();
    } },
    { id: 'usagi', nm: 'うさ耳風', price: 170, draw: function (g, x, yHead, r) {
      dome(g, x, yHead - r * 0.34, r * 1.24, r * 1.02, '#f0ece2');
      var ear = function (sx) {
        g.fillStyle = '#f0ece2';
        g.beginPath(); g.ellipse(x + sx * r * 0.48, yHead - r * 1.42, r * 0.32, r * 0.72, sx * 0.16, 0, 7); g.fill();
        g.strokeStyle = '#d6cfbe'; g.lineWidth = 1;
        g.beginPath(); g.ellipse(x + sx * r * 0.48, yHead - r * 1.42, r * 0.32, r * 0.72, sx * 0.16, 0, 7); g.stroke();
        g.fillStyle = PK;
        g.beginPath(); g.ellipse(x + sx * r * 0.48, yHead - r * 1.44, r * 0.13, r * 0.42, sx * 0.16, 0, 7); g.fill();
      };
      ear(-1); ear(1);
    } },
    { id: 'casquette', nm: 'ハンチング', price: 120, draw: function (g, x, yHead, r, dir) {
      peak(g, x + dir * r * 0.40, yHead - r * 0.44, r, dir, '#6a6350', 0.50);
      g.fillStyle = '#7d7560';
      g.beginPath(); g.ellipse(x - dir * r * 0.08, yHead - r * 0.56, r * 1.12, r * 0.80, -dir * 0.10, Math.PI, Math.PI * 2); g.closePath(); g.fill();
      g.fillRect(x - r * 1.04, yHead - r * 0.60, r * 2.08, r * 0.24);
      g.strokeStyle = '#5e5849'; g.lineWidth = 1;
      g.beginPath(); g.moveTo(x - r * 0.58, yHead - r * 1.24); g.lineTo(x + r * 0.68, yHead - r * 0.86); g.stroke();
    } },
    { id: 'chefhat', nm: 'コック帽', price: 130, draw: function (g, x, yHead, r) {
      g.fillStyle = WH;
      g.fillRect(x - r * 1.00, yHead - r * 1.20, r * 2.00, r * 0.86);
      g.beginPath(); g.ellipse(x, yHead - r * 1.52, r * 1.12, r * 0.60, 0, 0, 7); g.fill();
      g.beginPath(); g.ellipse(x - r * 0.54, yHead - r * 1.72, r * 0.50, r * 0.44, 0, 0, 7); g.fill();
      g.beginPath(); g.ellipse(x + r * 0.54, yHead - r * 1.72, r * 0.50, r * 0.44, 0, 0, 7); g.fill();
      g.fillStyle = '#dcd6c6';
      g.fillRect(x - r * 1.00, yHead - r * 0.60, r * 2.00, r * 0.26);
    } },
    { id: 'hood', nm: 'フード', price: 110, draw: function (g, x, yHead, r, dir) {
      g.fillStyle = '#4f5a68';
      g.beginPath(); g.ellipse(x - dir * r * 0.10, yHead - r * 0.06, r * 1.32, r * 1.34, 0, Math.PI, Math.PI * 2); g.closePath(); g.fill();
      g.fillStyle = '#5d6a7a';
      g.beginPath(); g.ellipse(x + dir * r * 0.14, yHead - r * 0.34, r * 1.02, r * 1.06, 0, Math.PI, Math.PI * 2); g.closePath(); g.fill();
      g.fillStyle = '#3f4854';
      g.beginPath(); g.ellipse(x - dir * r * 0.78, yHead - r * 0.34, r * 0.40, r * 0.60, 0, 0, 7); g.fill();
    } }
  ];

  /* ================= 石の見た目 10種 ================= */
  /* でこぼこの多角形(今の石と同じ作り) */
  function chunk(g, r, n, lo, hi, col) {
    g.fillStyle = col;
    g.beginPath();
    for (var i = 0; i < n; i++) {
      var a = i / n * Math.PI * 2, rr = r * (lo + ((i * 5) % 3) * hi);
      if (i === 0) g.moveTo(Math.cos(a) * rr, Math.sin(a) * rr); else g.lineTo(Math.cos(a) * rr, Math.sin(a) * rr);
    }
    g.closePath(); g.fill();
  }
  /* 左上の照り返し */
  function gloss(g, r, col, sz) {
    g.fillStyle = col;
    g.beginPath(); g.arc(-r * 0.28, -r * 0.30, r * (sz || 0.34), 0, 7); g.fill();
  }

  var STONES = [
    /* 今の石そのまま(本編の drawStoneAt と同じ形・同じ色) */
    { id: 'plain', nm: 'ふつうの石', price: 0, draw: function (g, r) {
      chunk(g, r, 7, 0.82, 0.13, '#8d8e86');
      gloss(g, r, 'rgba(255,255,240,.30)');
    } },
    { id: 'blue', nm: '青い石', price: 30, draw: function (g, r) {
      chunk(g, r, 7, 0.82, 0.13, '#5f7f9e');
      gloss(g, r, 'rgba(230,245,255,.40)');
    } },
    { id: 'heart', nm: 'ハートの石', price: 120, draw: function (g, r) {
      g.fillStyle = '#d4607e';
      g.beginPath();
      g.moveTo(0, r * 1.05);
      g.bezierCurveTo(-r * 1.30, r * 0.10, -r * 0.62, -r * 1.10, 0, -r * 0.34);
      g.bezierCurveTo(r * 0.62, -r * 1.10, r * 1.30, r * 0.10, 0, r * 1.05);
      g.closePath(); g.fill();
      gloss(g, r, 'rgba(255,255,255,.35)', 0.24);
    } },
    { id: 'shiny', nm: '光る石', price: 150, draw: function (g, r) {
      g.fillStyle = 'rgba(255,240,170,.28)';
      g.beginPath(); g.arc(0, 0, r * 1.28, 0, 7); g.fill();
      chunk(g, r, 7, 0.80, 0.14, '#c8b465');
      gloss(g, r, 'rgba(255,255,220,.70)', 0.30);
      g.strokeStyle = 'rgba(255,250,200,.85)'; g.lineWidth = Math.max(0.6, r * 0.10);
      g.beginPath(); g.moveTo(-r * 0.9, -r * 0.9); g.lineTo(-r * 0.5, -r * 0.5); g.stroke();
    } },
    { id: 'round', nm: 'つるつるの丸石', price: 60, draw: function (g, r) {
      g.fillStyle = '#9a958c';
      g.beginPath(); g.arc(0, 0, r * 1.00, 0, 7); g.fill();