/* ===== ショップの品を描く部品(絵は1枚も使わない) ===== ここに入っているのは3つの棚。 COSTUMES … 特別衣装 51種(1つ目は「そのまま」=何も描かない) HATS … 帽子・頭装備 21種(1つ目は「なし」=何も描かない) STONES … 石の見た目 10種(1つ目は今の石そのもの) 全部見た目だけ。強さ・当たり判定は一切変わらない。 衣装の描き方: draw(g, x, shY, bot, r, col, dir) x … 体の真ん中の横位置 shY … 肩の高さ / bot … 体の下端 r … 頭の半径(大きさは全部これ基準。r を変えれば丸ごと伸び縮みする) col … その人の服の色 / dir … 向き(+1で右・-1で左) 人の胴は上が狭く下が広い台形。その上から描くので、台形が透けないよう必ず塗りつぶす。 裾は下へ r*0.9、横へ r*1.7 まで出してよい。 帽子の描き方: draw(g, x, yHead, r, dir, hairCol) 髪はもう描かれているので、頭のてっぺんをきちんと隠す形にする。上へは r*2.2 まで。 石の描き方: draw(g, r, rot) 原点(0,0)が石の真ん中。r*1.3 の外へはみ出さない。 */ (function () { /* ---- 色を作る小道具(その人の服の色から明るい色・暗い色を作る) ---- */ function hx(c) { c = String(c).replace('#', ''); if (c.length === 3) c = c[0] + c[0] + c[1] + c[1] + c[2] + c[2]; return [parseInt(c.slice(0, 2), 16), parseInt(c.slice(2, 4), 16), parseInt(c.slice(4, 6), 16)]; } function rgb(a) { return 'rgb(' + (a[0] | 0) + ',' + (a[1] | 0) + ',' + (a[2] | 0) + ')'; } function lite(c, f) { var a = hx(c); return rgb([a[0] + (255 - a[0]) * f, a[1] + (255 - a[1]) * f, a[2] + (255 - a[2]) * f]); } function dark(c, f) { var a = hx(c); return rgb([a[0] * (1 - f), a[1] * (1 - f), a[2] * (1 - f)]); } /* ---- 決め打ちの差し色(人ごとに変わらない) ---- */ var WH = '#f3f0e7', CR = '#e7e0cc', BK = '#2b2b31', GD = '#e0b24a', PK = '#e58aa8', RD = '#c4443a', DN = '#4a6f9a', KH = '#8a8256', SV = '#b9bcc2', BR = '#8a6240', GR = '#5f8f63'; /* ---- 胴の形を測る小道具 ---- 台形の上辺は幅 0.74r、下辺は 1.16r。t=0で肩、t=1で下端。 */ function T(shY, bot, t) { return shY + (bot - shY) * t; } function HW(r, t) { return r * (0.74 + 0.42 * t); } /* 胴をまるごと塗る(下の服を完全に隠す。どの衣装も最初にこれを呼ぶ) */ function base(g, x, shY, bot, r, col) { g.fillStyle = col; g.beginPath(); g.moveTo(x - r * 0.74, shY); g.lineTo(x + r * 0.74, shY); g.lineTo(x + r * 1.16, bot); g.lineTo(x - r * 1.16, bot); g.closePath(); g.fill(); } /* 胴の横一段ぶんを別の色で塗る(胸の切り替え・帯・ベルトに使う) */ function panel(g, x, shY, bot, r, t0, t1, col) { var y0 = T(shY, bot, t0), y1 = T(shY, bot, t1), w0 = HW(r, t0), w1 = HW(r, t1); g.fillStyle = col; g.beginPath(); g.moveTo(x - w0, y0); g.lineTo(x + w0, y0); g.lineTo(x + w1, y1); g.lineTo(x - w1, y1); g.closePath(); g.fill(); } /* 腰から下を広がるスカートにする(flare=下辺の広さ・drop=下端より下へ出す量) */ function skirt(g, x, shY, bot, r, t, col, flare, drop) { var y0 = T(shY, bot, t), y1 = bot + r * (drop == null ? 0.5 : drop); var w0 = HW(r, t), w1 = r * (flare == null ? 1.45 : flare); g.fillStyle = col; g.beginPath(); g.moveTo(x - w0, y0); g.lineTo(x + w0, y0); g.lineTo(x + w1, y1); g.lineTo(x - w1, y1); g.closePath(); g.fill(); } /* ふわふわの縁(丸を横に並べる) */ function frill(g, x, y, halfW, rad, col, n) { g.fillStyle = col; for (var i = 0; i < n; i++) { g.beginPath(); g.arc(x - halfW + (i + 0.5) * (halfW * 2 / n), y, rad, 0, 7); g.fill(); } } /* たての筋(プリーツ) */ function pleat(g, x, y0, y1, hw0, hw1, n, col, w) { g.strokeStyle = col; g.lineWidth = w || 0.9; for (var i = 1; i < n; i++) { var f = i / n * 2 - 1; g.beginPath(); g.moveTo(x + hw0 * f, y0); g.lineTo(x + hw1 * f, y1); g.stroke(); } } /* よこの筋(編み目・ダウンの段) */ function rib(g, x, shY, bot, r, t0, t1, n, col, w) { g.strokeStyle = col; g.lineWidth = w || 0.9; for (var i = 0; i < n; i++) { var t = t0 + (t1 - t0) * (i + 0.5) / n, y = T(shY, bot, t), hw = HW(r, t); g.beginPath(); g.moveTo(x - hw, y); g.lineTo(x + hw, y); g.stroke(); } } /* リボン */ function bow(g, cx, cy, s, col) { g.fillStyle = col; g.beginPath(); g.moveTo(cx, cy); g.lineTo(cx - s, cy - s * 0.72); g.lineTo(cx - s, cy + s * 0.72); g.closePath(); g.fill(); g.beginPath(); g.moveTo(cx, cy); g.lineTo(cx + s, cy - s * 0.72); g.lineTo(cx + s, cy + s * 0.72); g.closePath(); g.fill(); g.beginPath(); g.arc(cx, cy, s * 0.36, 0, 7); g.fill(); } /* Vに開いた胸元 */ function vneck(g, x, shY, r, col, dep) { g.fillStyle = col; g.beginPath(); g.moveTo(x - r * 0.42, shY); g.lineTo(x + r * 0.42, shY); g.lineTo(x, shY + r * (dep || 0.62)); g.closePath(); g.fill(); } /* 丸い襟 */ function rcollar(g, x, shY, r, col) { g.fillStyle = col; g.beginPath(); g.arc(x - r * 0.30, shY + r * 0.02, r * 0.30, 0, 7); g.fill(); g.beginPath(); g.arc(x + r * 0.30, shY + r * 0.02, r * 0.30, 0, 7); g.fill(); } /* 合わせの襟(着物・道着) */ function xcollar(g, x, shY, bot, r, col) { var yb = T(shY, bot, 0.42); g.fillStyle = col; g.beginPath(); g.moveTo(x - r * 0.66, shY); g.lineTo(x - r * 0.34, shY); g.lineTo(x + r * 0.16, yb); g.lineTo(x - r * 0.10, yb); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.66, shY); g.lineTo(x + r * 0.34, shY); g.lineTo(x - r * 0.16, yb); g.lineTo(x + r * 0.10, yb); g.closePath(); g.fill(); } /* 前を留めるボタン */ function buttons(g, x, shY, bot, r, col, n, t0, t1) { g.fillStyle = col; for (var i = 0; i < n; i++) { var t = (t0 == null ? 0.28 : t0) + ((t1 == null ? 0.9 : t1) - (t0 == null ? 0.28 : t0)) * (n === 1 ? 0.5 : i / (n - 1)); g.beginPath(); g.arc(x, T(shY, bot, t), r * 0.075, 0, 7); g.fill(); } } /* ポケット */ function pocket(g, cx, cy, w, h, col) { g.fillStyle = col; g.fillRect(cx - w / 2, cy, w, h); } /* パーカーのフード(首の後ろのふくらみ) */ function hood(g, x, shY, r, col) { g.fillStyle = col; g.beginPath(); g.ellipse(x, shY + r * 0.24, r * 1.00, r * 0.66, 0, Math.PI, Math.PI * 2); g.closePath(); g.fill(); g.fillStyle = dark(col, 0.18); g.beginPath(); g.ellipse(x, shY + r * 0.26, r * 0.66, r * 0.44, 0, Math.PI, Math.PI * 2); g.closePath(); g.fill(); } /* 肩から吊る紐(サロペット・キャミ) */ function straps(g, x, shY, bot, r, col, w) { g.strokeStyle = col; g.lineWidth = w || r * 0.13; g.beginPath(); g.moveTo(x - r * 0.55, shY); g.lineTo(x - r * 0.34, T(shY, bot, 0.36)); g.stroke(); g.beginPath(); g.moveTo(x + r * 0.55, shY); g.lineTo(x + r * 0.34, T(shY, bot, 0.36)); g.stroke(); } /* 前を開けた上着(中が見える) */ function openFront(g, x, shY, bot, r, outer, inner) { base(g, x, shY, bot, r, inner); g.fillStyle = outer; g.beginPath(); g.moveTo(x - r * 0.74, shY); g.lineTo(x - r * 0.14, shY); g.lineTo(x - r * 0.30, bot); g.lineTo(x - r * 1.16, bot); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.74, shY); g.lineTo(x + r * 0.14, shY); g.lineTo(x + r * 0.30, bot); g.lineTo(x + r * 1.16, bot); g.closePath(); g.fill(); } /* ================= 特別衣装 51種 ================= */ var COSTUMES = [ /* 何も着せない(買う前の姿) */ { id: 'plain', nm: 'そのまま', price: 0, tone: 'neutral', draw: function () { } }, /* ---- かわいい・女性向け寄り(35種) ---- */ { id: 'frill', nm: 'フリル', price: 180, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); skirt(g, x, shY, bot, r, 0.44, col, 1.42, 0.42); var f = lite(col, 0.55); /* 下半分に明るい布を重ね、その縁を丸く波打たせる */ g.fillStyle = f; g.beginPath(); g.moveTo(x - r * 1.16, T(shY, bot, 0.74)); g.lineTo(x + r * 1.16, T(shY, bot, 0.74)); g.lineTo(x + r * 1.42, bot + r * 0.42); g.lineTo(x - r * 1.42, bot + r * 0.42); g.closePath(); g.fill(); frill(g, x, T(shY, bot, 0.74), r * 1.16, r * 0.15, f, 5); frill(g, x, bot + r * 0.42, r * 1.42, r * 0.17, f, 7); frill(g, x, T(shY, bot, 0.10), HW(r, 0.10), r * 0.11, lite(col, 0.78), 5); } }, { id: 'maid', nm: 'メイド服風', price: 320, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, dark(col, 0.62)); skirt(g, x, shY, bot, r, 0.50, dark(col, 0.62), 1.48, 0.46); /* 白いエプロン */ g.fillStyle = WH; g.beginPath(); g.moveTo(x - r * 0.34, T(shY, bot, 0.16)); g.lineTo(x + r * 0.34, T(shY, bot, 0.16)); g.lineTo(x + r * 0.86, bot + r * 0.36); g.lineTo(x - r * 0.86, bot + r * 0.36); g.closePath(); g.fill(); rcollar(g, x, shY, r, WH); frill(g, x, bot + r * 0.46, r * 1.44, r * 0.16, WH, 7); panel(g, x, shY, bot, r, 0.50, 0.58, WH); bow(g, x, T(shY, bot, 0.20), r * 0.26, PK); } }, { id: 'idol', nm: 'アイドル風', price: 360, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.42)); skirt(g, x, shY, bot, r, 0.52, WH, 1.52, 0.30); pleat(g, x, T(shY, bot, 0.52), bot + r * 0.30, HW(r, 0.52), r * 1.52, 6, '#c9c4b4', 1); panel(g, x, shY, bot, r, 0.48, 0.56, GD); /* 肩のふくらみ */ g.fillStyle = WH; g.beginPath(); g.arc(x - r * 0.72, shY + r * 0.06, r * 0.24, 0, 7); g.fill(); g.beginPath(); g.arc(x + r * 0.72, shY + r * 0.06, r * 0.24, 0, 7); g.fill(); /* 胸の星 */ g.fillStyle = GD; g.beginPath(); for (var i = 0; i < 10; i++) { var a = -Math.PI / 2 + i * Math.PI / 5, rr = r * (i % 2 ? 0.10 : 0.24); if (i === 0) g.moveTo(x + Math.cos(a) * rr, T(shY, bot, 0.26) + Math.sin(a) * rr); else g.lineTo(x + Math.cos(a) * rr, T(shY, bot, 0.26) + Math.sin(a) * rr); } g.closePath(); g.fill(); } }, { id: 'ribbondress', nm: 'リボンドレス', price: 240, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); skirt(g, x, shY, bot, r, 0.46, col, 1.50, 0.52); panel(g, x, shY, bot, r, 0.44, 0.52, WH); bow(g, x, T(shY, bot, 0.24), r * 0.40, WH); g.strokeStyle = WH; g.lineWidth = r * 0.09; g.beginPath(); g.moveTo(x - r * 1.46, bot + r * 0.42); g.lineTo(x + r * 1.46, bot + r * 0.42); g.stroke(); } }, { id: 'onepiece', nm: 'ワンピース風', price: 140, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); skirt(g, x, shY, bot, r, 0.38, col, 1.40, 0.55); panel(g, x, shY, bot, r, 0, 0.34, lite(col, 0.32)); g.strokeStyle = dark(col, 0.25); g.lineWidth = 1; var y = T(shY, bot, 0.36); g.beginPath(); g.moveTo(x - HW(r, 0.36), y); g.lineTo(x + HW(r, 0.36), y); g.stroke(); } }, { id: 'sailor', nm: 'セーラー風', price: 260, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, WH); skirt(g, x, shY, bot, r, 0.54, col, 1.46, 0.34); pleat(g, x, T(shY, bot, 0.54), bot + r * 0.34, HW(r, 0.54), r * 1.46, 6, dark(col, 0.25), 1); /* 大きな襟 */ g.fillStyle = col; g.beginPath(); g.moveTo(x - r * 0.74, shY); g.lineTo(x + r * 0.74, shY); g.lineTo(x + r * 0.66, T(shY, bot, 0.30)); g.lineTo(x - r * 0.66, T(shY, bot, 0.30)); g.closePath(); g.fill(); g.strokeStyle = WH; g.lineWidth = 1; g.beginPath(); g.moveTo(x - r * 0.70, T(shY, bot, 0.20)); g.lineTo(x + r * 0.70, T(shY, bot, 0.20)); g.stroke(); g.beginPath(); g.moveTo(x - r * 0.68, T(shY, bot, 0.26)); g.lineTo(x + r * 0.68, T(shY, bot, 0.26)); g.stroke(); /* 胸のスカーフ */ g.fillStyle = RD; g.beginPath(); g.moveTo(x, T(shY, bot, 0.14)); g.lineTo(x + r * 0.18, T(shY, bot, 0.42)); g.lineTo(x - r * 0.18, T(shY, bot, 0.42)); g.closePath(); g.fill(); } }, { id: 'blouse', nm: 'ブラウス', price: 120, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.74)); rcollar(g, x, shY, r, WH); buttons(g, x, shY, bot, r, dark(col, 0.4), 4, 0.28, 0.92); frill(g, x, bot, r * 1.16, r * 0.13, lite(col, 0.86), 6); } }, { id: 'sundress', nm: 'サンドレス', price: 150, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.30)); skirt(g, x, shY, bot, r, 0.42, lite(col, 0.30), 1.55, 0.56); panel(g, x, shY, bot, r, 0, 0.12, WH); straps(g, x, shY, bot, r, WH, r * 0.10); g.fillStyle = WH; for (var i = 0; i < 5; i++) { g.beginPath(); g.arc(x + (i - 2) * r * 0.46, T(shY, bot, 0.62 + (i % 2) * 0.22), r * 0.09, 0, 7); g.fill(); } } }, { id: 'camisole', nm: 'キャミソール', price: 100, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.52)); panel(g, x, shY, bot, r, 0, 0.10, lite(col, 0.80)); straps(g, x, shY, bot, r, lite(col, 0.52), r * 0.09); frill(g, x, T(shY, bot, 0.12), HW(r, 0.12), r * 0.10, WH, 5); } }, { id: 'knitdress', nm: 'ニットワンピ', price: 170, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.22)); skirt(g, x, shY, bot, r, 0.60, lite(col, 0.22), 1.24, 0.62); rib(g, x, shY, bot, r, 0.05, 0.95, 8, dark(col, 0.20), 1); panel(g, x, shY, bot, r, 0, 0.08, dark(col, 0.15)); } }, { id: 'cardigan', nm: 'カーディガン', price: 190, tone: 'cute', draw: function (g, x, shY, bot, r, col) { openFront(g, x, shY, bot, r, lite(col, 0.20), WH); buttons(g, x, shY, bot, r, GD, 3, 0.24, 0.70); rib(g, x, shY, bot, r, 0.92, 0.99, 2, dark(col, 0.3), 1); } }, { id: 'bolero', nm: 'ボレロ', price: 200, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, WH); skirt(g, x, shY, bot, r, 0.40, WH, 1.44, 0.54); /* 短い上着だけ肩に乗る */ g.fillStyle = col; g.beginPath(); g.moveTo(x - r * 0.74, shY); g.lineTo(x - r * 0.20, shY); g.lineTo(x - r * 0.40, T(shY, bot, 0.34)); g.lineTo(x - r * 0.90, T(shY, bot, 0.34)); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.74, shY); g.lineTo(x + r * 0.20, shY); g.lineTo(x + r * 0.40, T(shY, bot, 0.34)); g.lineTo(x + r * 0.90, T(shY, bot, 0.34)); g.closePath(); g.fill(); bow(g, x, T(shY, bot, 0.44), r * 0.24, col); } }, { id: 'tutu', nm: 'チュチュ', price: 260, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, dark(col, 0.15)); /* 腰から下を薄い布にして、その上に横へ張り出す層を重ねる (張り出しだけ描くと、盆を持っているように見えてしまう) */ var y = T(shY, bot, 0.54), f = lite(col, 0.70); g.fillStyle = lite(col, 0.42); g.beginPath(); g.moveTo(x - HW(r, 0.54), y); g.lineTo(x + HW(r, 0.54), y); g.lineTo(x + r * 1.30, bot + r * 0.24); g.lineTo(x - r * 1.30, bot + r * 0.24); g.closePath(); g.fill(); g.fillStyle = f; g.beginPath(); g.ellipse(x, y, r * 1.52, r * 0.60, 0, 0, Math.PI); g.closePath(); g.fill(); panel(g, x, shY, bot, r, 0.46, 0.54, PK); frill(g, x, T(shY, bot, 0.10), HW(r, 0.10), r * 0.11, f, 5); } }, { id: 'yukata', nm: '浴衣風', price: 300, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.55)); panel(g, x, shY, bot, r, 0.95, 1.16, lite(col, 0.55)); /* 裾を少し伸ばす */ xcollar(g, x, shY, bot, r, WH); panel(g, x, shY, bot, r, 0.50, 0.66, dark(col, 0.45)); /* 帯 */ g.strokeStyle = GD; g.lineWidth = 1; var y = T(shY, bot, 0.58); g.beginPath(); g.moveTo(x - HW(r, 0.58), y); g.lineTo(x + HW(r, 0.58), y); g.stroke(); g.fillStyle = WH; for (var i = 0; i < 4; i++) { g.beginPath(); g.arc(x + (i % 2 ? 0.5 : -0.6) * r, T(shY, bot, 0.74 + i * 0.10), r * 0.08, 0, 7); g.fill(); } } }, { id: 'hakama', nm: '袴風', price: 330, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.62)); xcollar(g, x, shY, bot, r, WH); /* 下は幅広の袴 */ skirt(g, x, shY, bot, r, 0.44, dark(col, 0.42), 1.34, 0.70); pleat(g, x, T(shY, bot, 0.46), bot + r * 0.70, HW(r, 0.46), r * 1.34, 5, dark(col, 0.62), 1); g.strokeStyle = WH; g.lineWidth = r * 0.10; g.beginPath(); g.moveTo(x - HW(r, 0.44), T(shY, bot, 0.44)); g.lineTo(x + HW(r, 0.44), T(shY, bot, 0.44)); g.stroke(); } }, { id: 'cheer', nm: 'チア風', price: 280, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); skirt(g, x, shY, bot, r, 0.56, col, 1.50, 0.26); pleat(g, x, T(shY, bot, 0.56), bot + r * 0.26, HW(r, 0.56), r * 1.50, 7, WH, 1.2); g.fillStyle = WH; g.beginPath(); g.moveTo(x - r * 0.74, shY); g.lineTo(x - r * 0.40, shY); g.lineTo(x, T(shY, bot, 0.34)); g.lineTo(x + r * 0.40, shY); g.lineTo(x + r * 0.74, shY); g.lineTo(x, T(shY, bot, 0.50)); g.closePath(); g.fill(); panel(g, x, shY, bot, r, 0.52, 0.58, WH); } }, { id: 'apron', nm: 'エプロン', price: 130, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); g.fillStyle = lite(col, 0.88); g.beginPath(); g.moveTo(x - r * 0.32, T(shY, bot, 0.14)); g.lineTo(x + r * 0.32, T(shY, bot, 0.14)); g.lineTo(x + r * 0.78, bot); g.lineTo(x - r * 0.78, bot); g.closePath(); g.fill(); g.strokeStyle = lite(col, 0.88); g.lineWidth = r * 0.09; g.beginPath(); g.moveTo(x - r * 0.30, T(shY, bot, 0.14)); g.lineTo(x - r * 0.52, shY); g.stroke(); g.beginPath(); g.moveTo(x + r * 0.30, T(shY, bot, 0.14)); g.lineTo(x + r * 0.52, shY); g.stroke(); pocket(g, x, T(shY, bot, 0.62), r * 0.44, r * 0.30, dark(col, 0.10)); } }, { id: 'lolita', nm: 'ロリータ風', price: 400, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, dark(col, 0.55)); skirt(g, x, shY, bot, r, 0.48, dark(col, 0.55), 1.48, 0.48); frill(g, x, T(shY, bot, 0.74), r * 1.24, r * 0.17, WH, 6); frill(g, x, bot + r * 0.46, r * 1.48, r * 0.19, WH, 8); frill(g, x, T(shY, bot, 0.12), HW(r, 0.12), r * 0.12, WH, 5); /* 胸の紐編み */ g.strokeStyle = WH; g.lineWidth = 1; for (var i = 0; i < 3; i++) { var y0 = T(shY, bot, 0.20 + i * 0.09), y1 = T(shY, bot, 0.29 + i * 0.09); g.beginPath(); g.moveTo(x - r * 0.22, y0); g.lineTo(x + r * 0.22, y1); g.stroke(); g.beginPath(); g.moveTo(x + r * 0.22, y0); g.lineTo(x - r * 0.22, y1); g.stroke(); } bow(g, x, T(shY, bot, 0.50), r * 0.30, PK); } }, { id: 'nurse', nm: 'ナース風', price: 210, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, WH); skirt(g, x, shY, bot, r, 0.62, WH, 1.30, 0.34); vneck(g, x, shY, r, lite(col, 0.30), 0.70); g.fillStyle = dark(col, 0.22); g.beginPath(); g.moveTo(x - r * 0.74, shY); g.lineTo(x - r * 0.42, shY); g.lineTo(x - r * 0.20, T(shY, bot, 0.26)); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.74, shY); g.lineTo(x + r * 0.42, shY); g.lineTo(x + r * 0.20, T(shY, bot, 0.26)); g.closePath(); g.fill(); pocket(g, x + r * 0.60, T(shY, bot, 0.56), r * 0.36, r * 0.26, lite(col, 0.55)); panel(g, x, shY, bot, r, 0.58, 0.64, lite(col, 0.35)); } }, { id: 'waitress', nm: 'ウェイトレス風', price: 250, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, dark(col, 0.50)); skirt(g, x, shY, bot, r, 0.54, dark(col, 0.50), 1.44, 0.40); rcollar(g, x, shY, r, WH); /* 腰の小さな白エプロン */ g.fillStyle = WH; g.beginPath(); g.moveTo(x - r * 0.62, T(shY, bot, 0.58)); g.lineTo(x + r * 0.62, T(shY, bot, 0.58)); g.lineTo(x + r * 0.78, bot + r * 0.30); g.lineTo(x - r * 0.78, bot + r * 0.30); g.closePath(); g.fill(); panel(g, x, shY, bot, r, 0.54, 0.60, WH); bow(g, x - r * 0.70, T(shY, bot, 0.58), r * 0.22, WH); } }, { id: 'pinafore', nm: 'ジャンパースカート', price: 220, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, WH); skirt(g, x, shY, bot, r, 0.40, dark(col, 0.25), 1.48, 0.50); g.fillStyle = dark(col, 0.25); g.beginPath(); g.moveTo(x - r * 0.40, T(shY, bot, 0.16)); g.lineTo(x + r * 0.40, T(shY, bot, 0.16)); g.lineTo(x + HW(r, 0.44), T(shY, bot, 0.44)); g.lineTo(x - HW(r, 0.44), T(shY, bot, 0.44)); g.closePath(); g.fill(); straps(g, x, shY, bot, r, dark(col, 0.25), r * 0.14); buttons(g, x - r * 0.30, shY, bot, r, GD, 1, 0.18, 0.18); buttons(g, x + r * 0.30, shY, bot, r, GD, 1, 0.18, 0.18); } }, { id: 'tiered', nm: '三段スカート', price: 230, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.35)); var y0 = T(shY, bot, 0.40); var cs = [lite(col, 0.35), lite(col, 0.18), col]; for (var i = 0; i < 3; i++) { var ya = y0 + (bot + r * 0.52 - y0) * (i / 3), yb = y0 + (bot + r * 0.52 - y0) * ((i + 1) / 3); var wa = r * (0.90 + i * 0.26), wb = r * (0.90 + (i + 1) * 0.26); g.fillStyle = cs[i]; g.beginPath(); g.moveTo(x - wa, ya); g.lineTo(x + wa, ya); g.lineTo(x + wb, yb); g.lineTo(x - wb, yb); g.closePath(); g.fill(); } panel(g, x, shY, bot, r, 0.36, 0.42, WH); } }, { id: 'wrap', nm: 'カシュクール', price: 200, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); skirt(g, x, shY, bot, r, 0.56, col, 1.34, 0.48); /* 斜めの合わせ */ g.fillStyle = lite(col, 0.28); g.beginPath(); g.moveTo(x - r * 0.74, shY); g.lineTo(x + r * 0.30, shY); g.lineTo(x + HW(r, 0.56), T(shY, bot, 0.56)); g.lineTo(x - HW(r, 0.56), T(shY, bot, 0.56)); g.closePath(); g.fill(); g.strokeStyle = dark(col, 0.35); g.lineWidth = 1.2; g.beginPath(); g.moveTo(x + r * 0.30, shY); g.lineTo(x - r * 0.30, T(shY, bot, 0.56)); g.stroke(); bow(g, x + r * 0.50, T(shY, bot, 0.54), r * 0.20, dark(col, 0.35)); } }, { id: 'peplum', nm: 'ペプラム', price: 240, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); panel(g, x, shY, bot, r, 0.46, 0.54, BK); /* 腰のひらひら */ g.fillStyle = lite(col, 0.35); g.beginPath(); g.moveTo(x - HW(r, 0.54), T(shY, bot, 0.54)); g.lineTo(x + HW(r, 0.54), T(shY, bot, 0.54)); g.lineTo(x + r * 1.46, T(shY, bot, 0.82)); g.lineTo(x - r * 1.46, T(shY, bot, 0.82)); g.closePath(); g.fill(); frill(g, x, T(shY, bot, 0.82), r * 1.46, r * 0.14, lite(col, 0.55), 7); vneck(g, x, shY, r, lite(col, 0.60), 0.58); } }, { id: 'hoodiedress', nm: 'パーカーワンピ', price: 190, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.20)); skirt(g, x, shY, bot, r, 0.66, lite(col, 0.20), 1.32, 0.66); hood(g, x, shY, r, dark(col, 0.10)); g.strokeStyle = WH; g.lineWidth = 1.4; g.beginPath(); g.moveTo(x - r * 0.16, T(shY, bot, 0.18)); g.lineTo(x - r * 0.20, T(shY, bot, 0.42)); g.stroke(); g.beginPath(); g.moveTo(x + r * 0.16, T(shY, bot, 0.18)); g.lineTo(x + r * 0.20, T(shY, bot, 0.42)); g.stroke(); pocket(g, x, T(shY, bot, 0.68), r * 0.90, r * 0.28, dark(col, 0.14)); } }, { id: 'blazer_f', nm: 'ブレザー', price: 290, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, WH); skirt(g, x, shY, bot, r, 0.58, dark(col, 0.40), 1.46, 0.32); pleat(g, x, T(shY, bot, 0.58), bot + r * 0.32, HW(r, 0.58), r * 1.46, 6, dark(col, 0.60), 1); g.fillStyle = dark(col, 0.55); g.beginPath(); g.moveTo(x - r * 0.74, shY); g.lineTo(x - r * 0.22, shY); g.lineTo(x - r * 0.34, T(shY, bot, 0.60)); g.lineTo(x - HW(r, 0.60), T(shY, bot, 0.60)); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.74, shY); g.lineTo(x + r * 0.22, shY); g.lineTo(x + r * 0.34, T(shY, bot, 0.60)); g.lineTo(x + HW(r, 0.60), T(shY, bot, 0.60)); g.closePath(); g.fill(); bow(g, x, T(shY, bot, 0.24), r * 0.26, RD); } }, { id: 'vestskirt', nm: 'ベストとスカート', price: 210, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, WH); skirt(g, x, shY, bot, r, 0.60, dark(col, 0.30), 1.36, 0.40); g.fillStyle = col; g.beginPath(); g.moveTo(x - r * 0.70, shY); g.lineTo(x - r * 0.26, shY); g.lineTo(x, T(shY, bot, 0.34)); g.lineTo(x + r * 0.26, shY); g.lineTo(x + r * 0.70, shY); g.lineTo(x + HW(r, 0.60), T(shY, bot, 0.60)); g.lineTo(x - HW(r, 0.60), T(shY, bot, 0.60)); g.closePath(); g.fill(); buttons(g, x, shY, bot, r, GD, 2, 0.42, 0.54); panel(g, x, shY, bot, r, 0.58, 0.64, BK); } }, { id: 'miko', nm: '巫女風', price: 310, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, WH); skirt(g, x, shY, bot, r, 0.42, RD, 1.36, 0.72); xcollar(g, x, shY, bot, r, CR); g.strokeStyle = WH; g.lineWidth = r * 0.11; g.beginPath(); g.moveTo(x - HW(r, 0.42), T(shY, bot, 0.42)); g.lineTo(x + HW(r, 0.42), T(shY, bot, 0.42)); g.stroke(); pleat(g, x, T(shY, bot, 0.46), bot + r * 0.70, HW(r, 0.46), r * 1.36, 4, '#a33429', 1); } }, { id: 'gothic', nm: 'ゴシック風', price: 380, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, dark(col, 0.78)); skirt(g, x, shY, bot, r, 0.44, dark(col, 0.78), 1.48, 0.62); frill(g, x, T(shY, bot, 0.06), HW(r, 0.06), r * 0.13, CR, 5); frill(g, x, bot + r * 0.60, r * 1.48, r * 0.16, CR, 8); /* 前で締める紐 */ g.strokeStyle = CR; g.lineWidth = 1; for (var i = 0; i < 4; i++) { var y0 = T(shY, bot, 0.16 + i * 0.08), y1 = T(shY, bot, 0.24 + i * 0.08); g.beginPath(); g.moveTo(x - r * 0.24, y0); g.lineTo(x + r * 0.24, y1); g.stroke(); g.beginPath(); g.moveTo(x + r * 0.24, y0); g.lineTo(x - r * 0.24, y1); g.stroke(); } panel(g, x, shY, bot, r, 0.46, 0.52, '#6b2f46'); } }, { id: 'leotard', nm: 'レオタード', price: 230, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, dark(col, 0.10)); /* 脚の付け根が高い形(切り抜くと下着に見えるので、線で示すだけ) */ g.strokeStyle = lite(col, 0.55); g.lineWidth = Math.max(1, r * 0.09); g.beginPath(); g.arc(x - r * 1.04, bot + r * 0.14, r * 0.58, Math.PI * 1.5, Math.PI * 2); g.stroke(); g.beginPath(); g.arc(x + r * 1.04, bot + r * 0.14, r * 0.58, Math.PI, Math.PI * 1.5); g.stroke(); panel(g, x, shY, bot, r, 0.44, 0.50, WH); vneck(g, x, shY, r, lite(col, 0.42), 0.52); } }, { id: 'poncho', nm: 'ポンチョ', price: 200, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, dark(col, 0.30)); /* 三角に広がる1枚布 */ g.fillStyle = col; g.beginPath(); g.moveTo(x - r * 0.50, shY - r * 0.04); g.lineTo(x + r * 0.50, shY - r * 0.04); g.lineTo(x + r * 1.56, T(shY, bot, 0.88)); g.lineTo(x - r * 1.56, T(shY, bot, 0.88)); g.closePath(); g.fill(); g.strokeStyle = lite(col, 0.55); g.lineWidth = 1; g.beginPath(); g.moveTo(x - r * 1.40, T(shY, bot, 0.70)); g.lineTo(x + r * 1.40, T(shY, bot, 0.70)); g.stroke(); /* 房 */ g.strokeStyle = lite(col, 0.70); g.lineWidth = 1.2; for (var i = 0; i < 7; i++) { var px = x - r * 1.44 + i * r * 0.48; g.beginPath(); g.moveTo(px, T(shY, bot, 0.88)); g.lineTo(px, T(shY, bot, 0.98)); g.stroke(); } } }, { id: 'highwaist', nm: 'ハイウエスト', price: 160, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.72)); skirt(g, x, shY, bot, r, 0.30, col, 1.44, 0.56); panel(g, x, shY, bot, r, 0.28, 0.36, dark(col, 0.40)); buttons(g, x, shY, bot, r, GD, 2, 0.30, 0.34); rcollar(g, x, shY, r, lite(col, 0.88)); } }, { id: 'kappougi', nm: '割烹着風', price: 170, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); g.fillStyle = lite(col, 0.90); g.beginPath(); g.moveTo(x - r * 0.64, shY + r * 0.10); g.lineTo(x + r * 0.64, shY + r * 0.10); g.lineTo(x + r * 1.06, bot + r * 0.20); g.lineTo(x - r * 1.06, bot + r * 0.20); g.closePath(); g.fill(); g.strokeStyle = lite(col, 0.60); g.lineWidth = r * 0.10; g.beginPath(); g.moveTo(x - r * 1.00, T(shY, bot, 0.60)); g.lineTo(x + r * 1.00, T(shY, bot, 0.60)); g.stroke(); bow(g, x, T(shY, bot, 0.60), r * 0.22, lite(col, 0.40)); } }, { id: 'cape', nm: 'ケープドレス', price: 300, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.40)); skirt(g, x, shY, bot, r, 0.48, lite(col, 0.40), 1.48, 0.62); /* 肩に丸いケープ */ g.fillStyle = dark(col, 0.30); g.beginPath(); g.ellipse(x, shY + r * 0.02, r * 1.00, r * 0.70, 0, 0, Math.PI); g.closePath(); g.fill(); g.fillStyle = GD; g.beginPath(); g.arc(x, shY + r * 0.06, r * 0.13, 0, 7); g.fill(); frill(g, x, bot + r * 0.58, r * 1.48, r * 0.15, WH, 7); } }, { id: 'whitedress', nm: '白いドレス', price: 400, tone: 'cute', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.86)); /* 長く引きずる裾 */ g.fillStyle = lite(col, 0.86); g.beginPath(); g.moveTo(x - HW(r, 0.40), T(shY, bot, 0.40)); g.lineTo(x + HW(r, 0.40), T(shY, bot, 0.40)); g.lineTo(x + r * 1.68, bot + r * 0.86); g.lineTo(x - r * 1.68, bot + r * 0.86); g.closePath(); g.fill(); frill(g, x, T(shY, bot, 0.10), HW(r, 0.10), r * 0.12, WH, 5); panel(g, x, shY, bot, r, 0.38, 0.44, lite(col, 0.55)); g.strokeStyle = lite(col, 0.60); g.lineWidth = 1; g.beginPath(); g.moveTo(x - r * 1.60, bot + r * 0.70); g.lineTo(x + r * 1.60, bot + r * 0.70); g.stroke(); } }, /* ---- 男性向け・中性的(15種) ---- */ { id: 'hoodie', nm: 'パーカー', price: 140, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); hood(g, x, shY, r, dark(col, 0.18)); g.strokeStyle = WH; g.lineWidth = 1.4; g.beginPath(); g.moveTo(x - r * 0.14, T(shY, bot, 0.20)); g.lineTo(x - r * 0.18, T(shY, bot, 0.46)); g.stroke(); g.beginPath(); g.moveTo(x + r * 0.14, T(shY, bot, 0.20)); g.lineTo(x + r * 0.18, T(shY, bot, 0.46)); g.stroke(); pocket(g, x, T(shY, bot, 0.62), r * 1.00, r * 0.30, dark(col, 0.14)); } }, { id: 'workwear', nm: '作業着', price: 160, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, dark(col, 0.20)); g.strokeStyle = dark(col, 0.50); g.lineWidth = 1.2; g.beginPath(); g.moveTo(x, shY); g.lineTo(x, bot); g.stroke(); pocket(g, x - r * 0.46, T(shY, bot, 0.22), r * 0.40, r * 0.26, dark(col, 0.38)); pocket(g, x + r * 0.46, T(shY, bot, 0.22), r * 0.40, r * 0.26, dark(col, 0.38)); panel(g, x, shY, bot, r, 0.56, 0.64, dark(col, 0.45)); g.fillStyle = GD; g.fillRect(x - r * 0.10, T(shY, bot, 0.57), r * 0.20, r * 0.11); } }, { id: 'suit', nm: 'スーツ', price: 340, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, WH); var d = dark(col, 0.68); g.fillStyle = d; g.beginPath(); g.moveTo(x - r * 0.74, shY); g.lineTo(x - r * 0.16, shY); g.lineTo(x - r * 0.34, bot); g.lineTo(x - r * 1.16, bot); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.74, shY); g.lineTo(x + r * 0.16, shY); g.lineTo(x + r * 0.34, bot); g.lineTo(x + r * 1.16, bot); g.closePath(); g.fill(); /* 襟 */ g.fillStyle = dark(col, 0.50); g.beginPath(); g.moveTo(x - r * 0.58, shY); g.lineTo(x - r * 0.16, shY); g.lineTo(x - r * 0.26, T(shY, bot, 0.40)); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.58, shY); g.lineTo(x + r * 0.16, shY); g.lineTo(x + r * 0.26, T(shY, bot, 0.40)); g.closePath(); g.fill(); /* ネクタイ */ g.fillStyle = RD; g.beginPath(); g.moveTo(x, shY + r * 0.04); g.lineTo(x + r * 0.11, T(shY, bot, 0.50)); g.lineTo(x, T(shY, bot, 0.58)); g.lineTo(x - r * 0.11, T(shY, bot, 0.50)); g.closePath(); g.fill(); buttons(g, x - r * 0.30, shY, bot, r, BK, 2, 0.58, 0.74); } }, { id: 'sports', nm: 'スポーツユニフォーム', price: 180, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); g.fillStyle = WH; g.fillRect(x - r * 0.74, shY, r * 0.18, (bot - shY) * 0.30); g.fillRect(x + r * 0.56, shY, r * 0.18, (bot - shY) * 0.30); vneck(g, x, shY, r, WH, 0.50); g.fillStyle = WH; g.beginPath(); g.arc(x, T(shY, bot, 0.48), r * 0.28, 0, 7); g.fill(); g.fillStyle = col; g.fillRect(x - r * 0.06, T(shY, bot, 0.36), r * 0.12, r * 0.36); panel(g, x, shY, bot, r, 0.82, 0.90, WH); } }, { id: 'overall', nm: 'オーバーオール', price: 200, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.66)); g.fillStyle = DN; g.beginPath(); g.moveTo(x - r * 0.44, T(shY, bot, 0.24)); g.lineTo(x + r * 0.44, T(shY, bot, 0.24)); g.lineTo(x + r * 1.16, bot); g.lineTo(x - r * 1.16, bot); g.closePath(); g.fill(); g.strokeStyle = DN; g.lineWidth = r * 0.16; g.beginPath(); g.moveTo(x - r * 0.58, shY); g.lineTo(x - r * 0.36, T(shY, bot, 0.26)); g.stroke(); g.beginPath(); g.moveTo(x + r * 0.58, shY); g.lineTo(x + r * 0.36, T(shY, bot, 0.26)); g.stroke(); g.fillStyle = GD; g.beginPath(); g.arc(x - r * 0.40, T(shY, bot, 0.26), r * 0.08, 0, 7); g.fill(); g.beginPath(); g.arc(x + r * 0.40, T(shY, bot, 0.26), r * 0.08, 0, 7); g.fill(); pocket(g, x, T(shY, bot, 0.42), r * 0.46, r * 0.30, '#3d5d82'); } }, { id: 'jacket', nm: 'ジャケット', price: 250, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { openFront(g, x, shY, bot, r, dark(col, 0.42), lite(col, 0.70)); g.fillStyle = dark(col, 0.60); g.beginPath(); g.moveTo(x - r * 0.62, shY); g.lineTo(x - r * 0.14, shY); g.lineTo(x - r * 0.30, T(shY, bot, 0.44)); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.62, shY); g.lineTo(x + r * 0.14, shY); g.lineTo(x + r * 0.30, T(shY, bot, 0.44)); g.closePath(); g.fill(); pocket(g, x - r * 0.66, T(shY, bot, 0.62), r * 0.34, r * 0.10, dark(col, 0.62)); pocket(g, x + r * 0.66, T(shY, bot, 0.62), r * 0.34, r * 0.10, dark(col, 0.62)); } }, { id: 'tshirt', nm: 'Tシャツ', price: 60, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.10)); g.strokeStyle = lite(col, 0.55); g.lineWidth = r * 0.10; g.beginPath(); g.arc(x, shY - r * 0.10, r * 0.32, 0.2, Math.PI - 0.2); g.stroke(); g.strokeStyle = dark(col, 0.20); g.lineWidth = 1; g.beginPath(); g.moveTo(x - r * 1.10, T(shY, bot, 0.92)); g.lineTo(x + r * 1.10, T(shY, bot, 0.92)); g.stroke(); } }, { id: 'jersey', nm: 'ジャージ', price: 150, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, dark(col, 0.25)); g.fillStyle = WH; g.beginPath(); g.moveTo(x - r * 0.70, shY); g.lineTo(x - r * 0.56, shY); g.lineTo(x - r * 0.96, bot); g.lineTo(x - r * 1.12, bot); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.70, shY); g.lineTo(x + r * 0.56, shY); g.lineTo(x + r * 0.96, bot); g.lineTo(x + r * 1.12, bot); g.closePath(); g.fill(); g.strokeStyle = SV; g.lineWidth = 1.2; g.beginPath(); g.moveTo(x, shY); g.lineTo(x, T(shY, bot, 0.90)); g.stroke(); panel(g, x, shY, bot, r, 0, 0.08, dark(col, 0.50)); } }, { id: 'tanktop', nm: 'タンクトップ', price: 90, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, lite(col, 0.14)); g.fillStyle = dark(col, 0.45); g.beginPath(); g.moveTo(x - r * 0.78, shY - r * 0.04); g.lineTo(x - r * 0.34, shY - r * 0.04); g.lineTo(x - r * 0.72, T(shY, bot, 0.42)); g.lineTo(x - r * 0.98, T(shY, bot, 0.42)); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.78, shY - r * 0.04); g.lineTo(x + r * 0.34, shY - r * 0.04); g.lineTo(x + r * 0.72, T(shY, bot, 0.42)); g.lineTo(x + r * 0.98, T(shY, bot, 0.42)); g.closePath(); g.fill(); g.strokeStyle = WH; g.lineWidth = 1.2; g.beginPath(); g.moveTo(x - r * 0.34, shY); g.lineTo(x + r * 0.34, shY); g.stroke(); } }, { id: 'shirttie', nm: 'ワイシャツ', price: 190, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, WH); g.fillStyle = CR; g.beginPath(); g.moveTo(x - r * 0.52, shY - r * 0.02); g.lineTo(x - r * 0.10, shY); g.lineTo(x - r * 0.22, T(shY, bot, 0.24)); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.52, shY - r * 0.02); g.lineTo(x + r * 0.10, shY); g.lineTo(x + r * 0.22, T(shY, bot, 0.24)); g.closePath(); g.fill(); g.fillStyle = dark(col, 0.30); g.beginPath(); g.moveTo(x, shY + r * 0.02); g.lineTo(x + r * 0.12, T(shY, bot, 0.56)); g.lineTo(x, T(shY, bot, 0.64)); g.lineTo(x - r * 0.12, T(shY, bot, 0.56)); g.closePath(); g.fill(); buttons(g, x, shY, bot, r, '#cdc8bb', 3, 0.70, 0.94); } }, { id: 'labcoat', nm: '白衣', price: 240, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, col); g.fillStyle = WH; g.beginPath(); g.moveTo(x - r * 0.74, shY); g.lineTo(x - r * 0.20, shY); g.lineTo(x - r * 0.24, bot + r * 0.34); g.lineTo(x - r * 1.24, bot + r * 0.34); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.74, shY); g.lineTo(x + r * 0.20, shY); g.lineTo(x + r * 0.24, bot + r * 0.34); g.lineTo(x + r * 1.24, bot + r * 0.34); g.closePath(); g.fill(); pocket(g, x - r * 0.72, T(shY, bot, 0.64), r * 0.38, r * 0.28, '#e2ddd0'); pocket(g, x + r * 0.72, T(shY, bot, 0.64), r * 0.38, r * 0.28, '#e2ddd0'); pocket(g, x - r * 0.48, T(shY, bot, 0.20), r * 0.30, r * 0.20, '#e2ddd0'); } }, { id: 'denim', nm: 'デニムジャケット', price: 260, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { openFront(g, x, shY, bot, r, DN, lite(col, 0.40)); g.strokeStyle = '#d9c9a2'; g.lineWidth = 1; g.beginPath(); g.moveTo(x - r * 1.02, T(shY, bot, 0.30)); g.lineTo(x - r * 0.28, T(shY, bot, 0.30)); g.stroke(); g.beginPath(); g.moveTo(x + r * 1.02, T(shY, bot, 0.30)); g.lineTo(x + r * 0.28, T(shY, bot, 0.30)); g.stroke(); g.fillStyle = '#d9c9a2'; g.beginPath(); g.arc(x - r * 0.56, T(shY, bot, 0.40), r * 0.07, 0, 7); g.fill(); g.beginPath(); g.arc(x + r * 0.56, T(shY, bot, 0.40), r * 0.07, 0, 7); g.fill(); panel(g, x, shY, bot, r, 0.92, 1.00, '#3b5c80'); } }, { id: 'downvest', nm: 'ダウンベスト', price: 220, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, BK); g.fillStyle = col; g.beginPath(); g.moveTo(x - r * 0.70, shY); g.lineTo(x - r * 0.20, shY); g.lineTo(x - r * 0.24, bot); g.lineTo(x - r * 1.16, bot); g.closePath(); g.fill(); g.beginPath(); g.moveTo(x + r * 0.70, shY); g.lineTo(x + r * 0.20, shY); g.lineTo(x + r * 0.24, bot); g.lineTo(x + r * 1.16, bot); g.closePath(); g.fill(); rib(g, x, shY, bot, r, 0.18, 0.92, 4, dark(col, 0.35), 1.2); g.strokeStyle = SV; g.lineWidth = 1.2; g.beginPath(); g.moveTo(x, shY); g.lineTo(x, bot); g.stroke(); } }, { id: 'dogi', nm: '道着', price: 230, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, CR); xcollar(g, x, shY, bot, r, lite(col, 0.30)); panel(g, x, shY, bot, r, 0.54, 0.66, BK); g.strokeStyle = BK; g.lineWidth = r * 0.08; g.beginPath(); g.moveTo(x - r * 0.10, T(shY, bot, 0.66)); g.lineTo(x - r * 0.16, T(shY, bot, 0.86)); g.stroke(); g.beginPath(); g.moveTo(x + r * 0.10, T(shY, bot, 0.66)); g.lineTo(x + r * 0.16, T(shY, bot, 0.86)); g.stroke(); } }, { id: 'chef', nm: 'コックコート', price: 250, tone: 'neutral', draw: function (g, x, shY, bot, r, col) { base(g, x, shY, bot, r, WH); g.fillStyle = CR; g.beginPath(); g.moveTo(x - r * 0.40, shY); g.lineTo(x + r * 0.40, shY); g.lineTo(x + r * 0.30, T(shY, bot, 0.18)); g.lineTo(x - r * 0.30, T(shY, bot, 0.18)); g.closePath(); g.fill(); buttons(g, x - r * 0.30, shY, bot, r, '#cdc8bb', 3, 0.28, 0.72); buttons(g, x + r * 0.30, shY, bot, r, '#cdc8bb', 3, 0.28, 0.72); /* 首元のスカーフ(白い服に埋もれないよう濃いめ) */ g.fillStyle = dark(col, 0.30); g.beginPath(); g.moveTo(x - r * 0.34, shY - r * 0.04); g.lineTo(x + r * 0.34, shY - r * 0.04); g.lineTo(x, T(shY, bot, 0.16)); g.closePath(); g.fill(); panel(g, x, shY, bot, r, 0.76, 0.84, '#5a5a60'); } } ]; /* ================= 帽子・頭装備 21種 ================= */ /* 頭のてっぺんを隠すお椀。y をずらして髪ごと覆う */ function dome(g, x, y, rx, ry, col) { g.fillStyle = col; g.beginPath(); g.ellipse(x, y, rx, ry, 0, Math.PI, Math.PI * 2); g.closePath(); g.fill(); } /* つば(横に長い楕円) */ function brim(g, x, y, rx, ry, col) { g.fillStyle = col; g.beginPath(); g.ellipse(x, y, rx, ry, 0, 0, 7); g.fill(); } /* 前に突き出すつば */ function peak(g, x, y, r, dir, col, len) { g.fillStyle = col; g.beginPath(); g.ellipse(x + dir * r * (len || 0.62), y, r * (len || 0.62), r * 0.18, 0, 0, 7); g.fill(); } /* どの帽子も、眉の少し上(yHead-0.34r あたり)を縁にして、 そこから上を丸ごと覆う。こうすると顔が隠れず、髪型が何であっても てっぺんが出てこない(アフロの膨らみまで入るよう上は 1.3r まで取る)。 */ var HATS = [ { id: 'none', nm: 'なし', price: 0, draw: function () { } }, { id: 'cap', nm: 'キャップ', price: 90, draw: function (g, x, yHead, r, dir) { peak(g, x + dir * r * 0.10, yHead - r * 0.46, r, dir, '#2f4f7a', 0.62); dome(g, x, yHead - r * 0.34, r * 1.24, r * 1.04, '#3f6fa8'); g.fillStyle = '#2f4f7a'; g.fillRect(x - r * 1.24, yHead - r * 0.50, r * 2.48, r * 0.16); g.fillStyle = WH; g.beginPath(); g.arc(x, yHead - r * 1.18, r * 0.10, 0, 7); g.fill(); } }, { id: 'knit', nm: 'ニット帽', price: 100, draw: function (g, x, yHead, r) { dome(g, x, yHead - r * 0.30, r * 1.26, r * 1.12, '#7a5aa0'); g.fillStyle = '#6a4b8e'; g.fillRect(x - r * 1.26, yHead - r * 0.52, r * 2.52, r * 0.26); g.strokeStyle = '#8d6cb5'; g.lineWidth = 1; for (var i = -2; i <= 2; i++) { /* 編み目の縦線。お椀の縁からはみ出さないよう端ほど短くする */ g.beginPath(); g.moveTo(x + i * r * 0.42, yHead - r * 0.52); g.lineTo(x + i * r * 0.46, yHead - r * (1.28 - Math.abs(i) * 0.18)); g.stroke(); } g.fillStyle = CR; g.beginPath(); g.arc(x, yHead - r * 1.56, r * 0.26, 0, 7); g.fill(); } }, { id: 'straw', nm: '麦わら帽子', price: 140, draw: function (g, x, yHead, r) { brim(g, x, yHead - r * 0.48, r * 1.48, r * 0.30, '#e3c67c'); dome(g, x, yHead - r * 0.50, r * 1.00, r * 0.92, '#d9b96a'); g.fillStyle = RD; g.fillRect(x - r * 1.00, yHead - r * 0.74, r * 2.00, r * 0.18); g.strokeStyle = '#c0a055'; g.lineWidth = 1; g.beginPath(); g.ellipse(x, yHead - r * 0.48, r * 1.26, r * 0.24, 0, 0, 7); g.stroke(); } }, { id: 'hat', nm: 'ハット', price: 170, draw: function (g, x, yHead, r) { brim(g, x, yHead - r * 0.54, r * 1.40, r * 0.26, '#4a4038'); dome(g, x, yHead - r * 0.52, r * 0.96, r * 1.14, '#5a4e44'); g.fillStyle = '#3b332d'; g.fillRect(x - r * 0.96, yHead - r * 0.78, r * 1.92, r * 0.22); g.strokeStyle = '#41382f'; g.lineWidth = 1.4; g.beginPath(); g.moveTo(x - r * 0.28, yHead - r * 1.60); g.lineTo(x + r * 0.28, yHead - r * 1.60); g.stroke(); } }, { id: 'beret', nm: 'ベレー帽', price: 110, draw: function (g, x, yHead, r, dir) { dome(g, x, yHead - r * 0.40, r * 1.18, r * 0.88, '#c4443a'); g.fillStyle = '#c4443a'; g.beginPath(); g.ellipse(x - dir * r * 0.10, yHead - r * 0.92, r * 1.20, r * 0.56, -dir * 0.18, 0, 7); g.fill(); g.fillStyle = '#a3362e'; g.beginPath(); g.arc(x + dir * r * 0.60, yHead - r * 1.28, r * 0.14, 0, 7); g.fill(); } }, { id: 'ribbon', nm: 'リボン帽', price: 130, draw: function (g, x, yHead, r, dir) { dome(g, x, yHead - r * 0.32, r * 1.24, r * 1.04, PK); g.fillStyle = '#d1769a'; g.fillRect(x - r * 1.24, yHead - r * 0.46, r * 2.48, r * 0.14); bow(g, x + dir * r * 1.06, yHead - r * 0.64, r * 0.40, '#f4b3c6'); } }, { id: 'catear', nm: '猫耳風', price: 160, draw: function (g, x, yHead, r) { dome(g, x, yHead - r * 0.34, r * 1.24, r * 1.04, '#3b3640'); var ear = function (sx) { g.fillStyle = '#3b3640'; g.beginPath(); g.moveTo(x + sx * r * 0.28, yHead - r * 1.06); g.lineTo(x + sx * r * 0.64, yHead - r * 1.96); g.lineTo(x + sx * r * 0.96, yHead - r * 0.96); g.closePath(); g.fill(); g.fillStyle = PK; g.beginPath(); g.moveTo(x + sx * r * 0.46, yHead - r * 1.10); g.lineTo(x + sx * r * 0.64, yHead - r * 1.62); g.lineTo(x + sx * r * 0.80, yHead - r * 1.04); g.closePath(); g.fill(); }; ear(-1); ear(1); } }, { id: 'crown', nm: '王冠風', price: 220, draw: function (g, x, yHead, r) { dome(g, x, yHead - r * 0.46, r * 1.16, r * 0.90, '#c99a34'); g.fillStyle = GD; g.beginPath(); g.moveTo(x - r * 1.04, yHead - r * 1.10); for (var i = 0; i < 3; i++) { var x0 = x - r * 1.04 + i * r * 0.693; g.lineTo(x0 + r * 0.346, yHead - r * 1.98); g.lineTo(x0 + r * 0.693, yHead - r * 1.10); } g.lineTo(x + r * 1.04, yHead - r * 0.64); g.lineTo(x - r * 1.04, yHead - r * 0.64); g.closePath(); g.fill(); g.fillStyle = RD; g.beginPath(); g.arc(x, yHead - r * 0.86, r * 0.14, 0, 7); g.fill(); g.fillStyle = '#5fa8c4'; g.beginPath(); g.arc(x - r * 0.60, yHead - r * 0.84, r * 0.09, 0, 7); g.fill(); g.beginPath(); g.arc(x + r * 0.60, yHead - r * 0.84, r * 0.09, 0, 7); g.fill(); } }, { 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(); gloss(g, r, 'rgba(255,255,250,.45)', 0.32); } }, { id: 'angular', nm: '角張った石', price: 70, draw: function (g, r) { g.fillStyle = '#79776f'; g.beginPath(); g.moveTo(-r * 1.10, -r * 0.30); g.lineTo(-r * 0.20, -r * 1.10); g.lineTo(r * 1.05, -r * 0.45); g.lineTo(r * 0.70, r * 0.95); g.lineTo(-r * 0.60, r * 1.05); g.closePath(); g.fill(); g.fillStyle = 'rgba(255,255,240,.22)'; g.beginPath(); g.moveTo(-r * 0.20, -r * 1.05); g.lineTo(r * 0.95, -r * 0.42); g.lineTo(r * 0.10, -r * 0.10); g.closePath(); g.fill(); } }, { id: 'striped', nm: '模様入りの石', price: 90, draw: function (g, r) { chunk(g, r, 7, 0.82, 0.13, '#8a7f6d'); g.save(); g.beginPath(); g.arc(0, 0, r * 0.98, 0, 7); g.clip(); g.strokeStyle = '#e6ddc6'; g.lineWidth = Math.max(0.8, r * 0.20); for (var i = -1; i <= 1; i++) { g.beginPath(); g.moveTo(-r * 1.2, i * r * 0.62 - r * 0.20); g.lineTo(r * 1.2, i * r * 0.62 + r * 0.20); g.stroke(); } g.restore(); } }, { id: 'brick', nm: 'レンガのかけら', price: 80, draw: function (g, r) { g.fillStyle = '#a85b46'; g.beginPath(); g.moveTo(-r * 1.15, -r * 0.72); g.lineTo(r * 1.10, -r * 0.80); g.lineTo(r * 1.15, r * 0.78); g.lineTo(-r * 1.05, r * 0.72); g.closePath(); g.fill(); g.fillStyle = 'rgba(255,240,230,.30)'; g.fillRect(-r * 1.05, -r * 0.70, r * 2.05, r * 0.26); g.fillStyle = 'rgba(60,30,20,.25)'; g.fillRect(-r * 1.00, r * 0.34, r * 2.00, r * 0.30); } }, { id: 'gold', nm: '金の石', price: 150, draw: function (g, r) { chunk(g, r, 8, 0.80, 0.15, '#d3a33c'); g.fillStyle = 'rgba(255,245,190,.55)'; g.beginPath(); g.moveTo(-r * 0.70, -r * 0.70); g.lineTo(r * 0.20, -r * 0.90); g.lineTo(-r * 0.10, -r * 0.05); g.closePath(); g.fill(); gloss(g, r, 'rgba(255,255,225,.50)', 0.22); } }, { id: 'star', nm: '星の石', price: 140, draw: function (g, r) { g.fillStyle = '#e6c84f'; g.beginPath(); for (var i = 0; i < 10; i++) { var a = -Math.PI / 2 + i * Math.PI / 5, rr = r * (i % 2 ? 0.50 : 1.22); 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(); gloss(g, r, 'rgba(255,255,220,.40)', 0.22); } } ]; window.WARDROBE = { COSTUMES: COSTUMES, HATS: HATS, STONES: STONES }; })();