<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<title>polycity v4 — สร้างเมืองแบบชิ้นส่วน</title>
<style>
  :root{
    --ink:#0e141b; --panel:rgba(13,18,26,.84); --line:rgba(255,255,255,.15);
    --cream:#f2efe6; --ok:#3fa9ff; --bad:#ff5b5b; --text:#eef3f8; --safe:env(safe-area-inset-bottom);
    --palh:152px;
  }
  *{box-sizing:border-box}
  html,body{margin:0;height:100%;overflow:hidden;background:#0e141b;color:var(--text);
    font-family:system-ui,-apple-system,"Segoe UI","Noto Sans Thai",Roboto,sans-serif;
    -webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;overscroll-behavior:none}
  #c{position:fixed;inset:0;width:100%;height:100%;display:block;touch-action:none;background:#cfe0ee}

  .card{background:var(--panel);backdrop-filter:blur(10px);border:1px solid var(--line);border-radius:14px;
    padding:9px 12px;box-shadow:0 10px 26px rgba(0,0,0,.38)}

  .hud{position:fixed;left:10px;top:10px;z-index:6;display:flex;flex-direction:column;gap:6px;
    max-width:min(66vw,330px);pointer-events:none}
  h1{font-size:13.5px;margin:0;font-weight:700;letter-spacing:.1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .sub{font-size:11px;opacity:.64;margin-top:3px;line-height:1.55}
  .stats{font-size:11.5px;margin-top:6px;font-variant-numeric:tabular-nums;line-height:1.6}
  .stats b{color:#cfe6ff;font-weight:700}
  .stats .warn{color:#c9a4ff;font-weight:700}
  .exp{display:flex;gap:6px;padding:6px;pointer-events:auto}
  .exp button{flex:1;min-height:44px;border-radius:10px;border:1px solid var(--line);
    background:rgba(255,255,255,.06);color:#fff;font:600 12.5px/1.2 inherit;padding:0 6px}
  .exp button:active{transform:translateY(1px);background:rgba(255,255,255,.14)}

  .ops{position:fixed;right:10px;top:10px;z-index:6;display:flex;flex-direction:column;gap:6px}
  .ops button{width:46px;height:46px;border-radius:13px;border:1px solid var(--line);background:var(--panel);
    color:#fff;font:700 19px/1 inherit;backdrop-filter:blur(8px)}
  .ops button:active{transform:translateY(1px)}
  .ops button.on{background:var(--cream);color:#14171d;border-color:var(--cream)}

  .menu{position:fixed;right:10px;top:calc(10px + 3 * 52px);z-index:8;width:224px;padding:6px;
    display:none;flex-direction:column;gap:4px}
  .menu.show{display:flex}
  .menu button{min-height:44px;display:flex;align-items:center;gap:9px;padding:0 11px;
    border-radius:9px;border:1px solid var(--line);background:rgba(255,255,255,.05);
    color:#fff;font:600 13px/1.3 inherit;text-align:left}
  .menu button:active{background:rgba(255,255,255,.14)}

  .zoom{position:fixed;left:10px;bottom:calc(var(--palh) + var(--safe));z-index:6;
    display:flex;flex-direction:column;gap:6px}
  .zoom button{width:46px;height:46px;border-radius:13px;border:1px solid var(--line);background:var(--panel);
    color:#fff;font:700 20px/1 inherit;backdrop-filter:blur(8px)}
  .zoom button:active{transform:translateY(1px)}

  .insp{position:fixed;right:10px;bottom:calc(var(--palh) + var(--safe));z-index:7;width:200px;
    padding:8px 9px;display:none}
  .insp.show{display:block}
  .row1{display:flex;align-items:center;justify-content:space-between;gap:6px}
  .row1 b{font-size:13px;line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .x{width:30px;height:30px;border-radius:8px;border:1px solid var(--line);background:rgba(255,255,255,.06);
    color:#fff;font:700 13px/1 inherit}
  .meta{font-size:11.5px;opacity:.75;margin:4px 0 7px;line-height:1.5}
  .btns{display:grid;grid-template-columns:repeat(3,1fr);gap:5px}
  .btns button{min-height:44px;border-radius:9px;border:1px solid var(--line);background:rgba(255,255,255,.06);
    color:#fff;font:600 11.5px/1.2 inherit;padding:0 2px}
  .btns button:active{background:rgba(255,255,255,.16)}
  .btns button.on{background:var(--cream);color:#14171d;border-color:var(--cream)}
  .st{font:600 11px/1.45 inherit;margin:0 0 7px;padding:4px 7px;border-radius:7px;
    border:1px solid var(--line);background:rgba(255,255,255,.05);color:#dbe6f1}
  .st.ok{border-color:rgba(96,220,150,.5);color:#a7efc4}
  .st.bad{border-color:rgba(255,110,110,.55);color:#ffc2c2}
  .tip{font:500 10px/1.4 inherit;opacity:.5;margin-top:6px;text-align:center}

  .pal{position:fixed;left:0;right:0;bottom:0;z-index:7;padding:6px 8px calc(8px + var(--safe));
    display:flex;flex-direction:column;gap:7px;
    background:linear-gradient(to top,rgba(8,12,18,.94),rgba(8,12,18,.72) 62%,rgba(8,12,18,0))}
  .tabs{display:flex;gap:6px;width:100%;max-width:560px;margin:0 auto}
  .tab{flex:1;min-height:44px;border-radius:11px;border:1px solid var(--line);background:var(--panel);
    color:#fff;font:600 12.5px/1.25 inherit;backdrop-filter:blur(8px)}
  .tab.on{background:var(--cream);color:#14171d;border-color:var(--cream)}
  .rail{display:flex;gap:6px;overflow-x:auto;overflow-y:hidden;padding:2px 2px 5px;
    scrollbar-width:none;max-width:760px;width:100%;margin:0 auto}
  .rail::-webkit-scrollbar{display:none}
  .item{flex:0 0 auto;width:94px;min-height:74px;border-radius:11px;border:1px solid var(--line);
    background:var(--panel);color:#fff;display:flex;flex-direction:column;align-items:center;
    justify-content:center;gap:1px;padding:5px 4px;backdrop-filter:blur(8px)}
  .item .ico{font-size:18px;line-height:1.1}
  .item .nm{font:600 10.5px/1.25 inherit;text-align:center;width:100%;max-width:100%;overflow:hidden;
    white-space:normal;word-break:break-word;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}
  .item .sz{font:500 9.5px/1.3 inherit;opacity:.62;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
  .item.on{background:var(--cream);color:#12161c;border-color:var(--cream);box-shadow:0 0 0 2px rgba(63,169,255,.5)}
  .item.on .sz{opacity:.7}

  #toast{position:fixed;left:50%;bottom:calc(var(--palh) + 168px + var(--safe));transform:translate(-50%,8px);
    z-index:8;background:rgba(10,14,20,.94);border:1px solid var(--line);color:#fff;
    font:600 12px/1.5 inherit;padding:9px 13px;border-radius:11px;opacity:0;transition:.18s;
    pointer-events:none;max-width:86vw;text-align:center}
  #toast.show{opacity:1;transform:translate(-50%,0)}
  #toast.bad{border-color:rgba(255,91,91,.6);color:#ffd9d9}
  #toast.ok{border-color:rgba(90,180,255,.55);color:#d8ecff}

  #selftest{position:fixed;left:8px;right:8px;bottom:calc(var(--palh) + var(--safe));z-index:9;
    background:rgba(6,10,15,.95);border:1px solid var(--line);border-radius:12px;padding:9px 11px;
    font:11px/1.5 ui-monospace,Menlo,monospace;white-space:pre-wrap;max-height:60vh;overflow:auto;display:none}
  .pass{color:#7ee0a0}.fail{color:#ff8d8d}
  /* โหมดภาพ: ซ่อน UI ทั้งหมด เหลือแค่เมือง */
  body.shot .hud,body.shot .ops,body.shot .menu,body.shot .zoom,body.shot .insp,
  body.shot .pal,body.shot #rail,body.shot #toast,body.shot #selftest{display:none!important}
  @media (min-width:768px){
    .hud{max-width:360px}
    .insp{width:230px}
  }
</style>
</head>
<body>
<canvas id="c"></canvas>

<div class="hud">
  <div class="card">
    <h1>polycity · เมืองจำลอง</h1>
    <div class="sub">แตะ=วาง · ลาก=ต่อเนื่อง · สองนิ้ว=ซูม/หมุน<br>แตะของ=เลือก · แตะไอคอนซ้ำ=ยกเลิก</div>
    <div class="stats" id="stats">—</div>
  </div>
  <div class="exp card">
    <button id="btnRow">＋ แถว</button>
    <button id="btnCol">＋ คอลัมน์</button>
  </div>
</div>

<div class="ops">
  <button id="btnUndo" title="ย้อนกลับ (Ctrl+Z)" aria-label="ย้อนกลับ">↶</button>
  <button id="btnView" title="สลับมุมกล้อง" aria-label="มุมกล้อง">⌂</button>
  <button id="btnMenu" title="เมนู" aria-label="เมนู">⋯</button>
</div>

<div class="menu card" id="menu">
  <button id="btnSave">💾 บันทึกในเครื่อง</button>
  <button id="btnLoad">📂 โหลดจากเครื่อง</button>
  <button id="btnExport">⬇ ส่งออก JSON</button>
  <button id="btnImport">⬆ นำเข้า JSON</button>
  <button id="btnSvc">🔦 ไฮไลต์ของขาดบริการ</button>
  <button id="btnTheme">🌇 ธีมเวลา</button>
  <button id="btnShot">📷 โหมดภาพ</button>
  <button id="btnClear">🧹 ล้างเมือง</button>
  <input type="file" id="fileIn" accept="application/json,.json" hidden>
</div>

<div class="zoom">
  <button id="zin" aria-label="ซูมเข้า">＋</button>
  <button id="zout" aria-label="ซูมออก">−</button>
  <button id="zfit" aria-label="พอดีจอ">⤢</button>
</div>

<div class="insp card" id="insp">
  <div class="row1"><b id="iName">—</b><button class="x" id="iClose" aria-label="ปิด">✕</button></div>
  <div class="meta" id="iMeta">—</div>
  <div class="st" id="iSt">—</div>
  <div class="btns">
    <button id="iRot">↻ หมุน</button>
    <button id="iMove">✥ ย้าย</button>
    <button id="iDel">🗑 ลบ</button>
  </div>
  <div class="tip">ลากชิ้นของบนพื้นเพื่อย้าย · ลูกศรเลื่อน 1 ช่อง · R หมุน</div>
</div>

<div class="pal">
  <div class="tabs">
    <button class="tab on" data-tab="build">🏠 อาคาร</button>
    <button class="tab" data-tab="equip">💡 อุปกรณ์/ธรรมชาติ</button>
  </div>
  <div class="rail" id="rail"></div>
</div>

<div id="toast"></div>
<div id="selftest"></div>

<script type="module">
const $ = s => document.querySelector(s);
addEventListener('error', e => {
  const d = document.createElement('div');
  d.style.cssText = 'position:fixed;left:10px;right:10px;bottom:140px;z-index:99;background:#3b0d12;color:#ffdada;font:11px/1.4 ui-monospace,monospace;padding:8px 10px;border-radius:8px;white-space:pre-wrap';
  d.textContent = 'ERR: ' + (e.message || e.type) + ' @' + (e.lineno || '?') + ':' + (e.colno || '?');
  document.body.appendChild(d);
  document.body.dataset.error = '1';
});
const logEl = $('#selftest'), toastEl = $('#toast');
const params = new URLSearchParams(location.search);
const SNAP = params.get('snap') === '1';

let THREE;
try { THREE = await import('https://unpkg.com/three@0.160.0/build/three.module.js'); }
catch (e) {
  try { THREE = await import('https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js'); }
  catch (e2) { $('#stats').textContent = 'โหลด three.js ไม่ได้ (เช็กเน็ต)'; throw e2; }
}

/* ==CORE-START== */
/* ---------- ค่าคงที่ + สถานะเมือง (object-based) ---------- */
/* 1 ช่อง = 1 เมตร · บล็อกเมือง = 50 ม. · เพดาน 400×400 ม. */
const CELL = 1, CELLS_PER_BLOCK = 50, CAP = 400;
let cols = 200, rows = 250;
const objects = new Map();   // id -> {id,type,x,y,w,h,rot,floors,on}
let nextId = 1;

const NB4 = [[1, 0], [-1, 0], [0, 1], [0, -1]];
const roadLike = t => t === 'road' || t === 'road2' || t === 'bridge';
const keyOf = (x, y) => y * cols + x;
const inBounds = (x, y) => x >= 0 && y >= 0 && x < cols && y < rows;
const normRot = r => (((r || 0) % 360) + 360) % 360 % 360;
const swapped = r => ((((r || 0) % 360) + 360) % 360) % 180 === 90;

/* ---- footprint: ฟังก์ชันเดียวที่ทุกอย่างใช้ (occupancy / preview / render / กติกา) ---- */
function dimsOf(o) {
  const p = PARTS[o.type] || {};
  const w = o.w || p.w || 1, h = o.h || p.h || 1;
  return swapped(o.rot) ? { cw: h, ch: w } : { cw: w, ch: h };
}
function cellsOf(o) {
  const d = dimsOf(o), out = [];
  for (let j = 0; j < d.ch; j++) for (let i = 0; i < d.cw; i++) out.push({ x: o.x + i, y: o.y + j });
  return out;
}

/* ---- occupancy แบบ "กรอบ" + spatial hash 50 ม. (1 ช่อง = 1 ม. แล้ว จึงไม่ไล่ทีละช่อง) ---- */
const BUCKET = 50;
let _occ = null, _sim = null, _net = null;
function rectOf(o) { const d = dimsOf(o); return { id: o.id, x: o.x, y: o.y, w: d.cw, h: d.ch }; }
const rectHit = (a, b) => a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h;
const bkey = (bx, by) => bx + ',' + by;
function occ() {
  if (_occ) return _occ;
  const all = new Map(), road = new Map(), rects = [];
  let used = 0;
  const push = (map, r) => {
    const x0 = Math.floor(r.x / BUCKET), y0 = Math.floor(r.y / BUCKET);
    const x1 = Math.floor((r.x + r.w - 1) / BUCKET), y1 = Math.floor((r.y + r.h - 1) / BUCKET);
    for (let by = y0; by <= y1; by++) for (let bx = x0; bx <= x1; bx++) {
      const k = bkey(bx, by); let a = map.get(k); if (!a) map.set(k, a = []); a.push(r);
    }
  };
  for (const o of objects.values()) {
    const r = rectOf(o); rects.push(r); used += r.w * r.h;
    push(all, r); if (roadLike(o.type)) push(road, r);
  }
  return (_occ = { all, road, rects, used });
}
const reindex = () => { _occ = null; _sim = null; _net = null; };
const usedArea = () => occ().used;
/* ของที่อยู่ในช่อง (x,y) — แทน occ().get(keyOf(x,y)) เดิม */
function atCell(x, y) {
  const a = occ().all.get(bkey(Math.floor(x / BUCKET), Math.floor(y / BUCKET)));
  if (!a) return null;
  for (let i = a.length - 1; i >= 0; i--) { const r = a[i]; if (x >= r.x && y >= r.y && x < r.x + r.w && y < r.y + r.h) return r.id; }
  return null;
}
/* ของที่ทับกรอบของ o (ไม่รวมตัวเอง) */
function overlapAny(o) {
  const r = rectOf(o), out = new Map();
  const x0 = Math.floor(r.x / BUCKET), y0 = Math.floor(r.y / BUCKET);
  const x1 = Math.floor((r.x + r.w - 1) / BUCKET), y1 = Math.floor((r.y + r.h - 1) / BUCKET);
  for (let by = y0; by <= y1; by++) for (let bx = x0; bx <= x1; bx++) {
    const a = occ().all.get(bkey(bx, by)); if (!a) continue;
    for (const q of a) if (q.id !== o.id && !out.has(q.id) && rectHit(r, q)) out.set(q.id, q);
  }
  return out;
}

/* ---------- กติกากลาง ---------- */
function baseOK(city, o) {
  const d = dimsOf(o);
  if (o.x < 0 || o.y < 0 || o.x + d.cw > cols || o.y + d.ch > rows) return { ok: false, why: 'เกินขอบเขตเมือง' };
  if (overlapAny(o).size) return { ok: false, why: 'ทับของเดิม' };
  return { ok: true };
}
/* ติดถนน = กรอบของ o ชนกับกรอบถนน (ชนด้านข้าง ไม่นับมุม) */
function roadAdj(o) {
  const r = rectOf(o), oc = occ();
  const sides = [
    { x: r.x - 1, y: r.y, w: 1, h: r.h },
    { x: r.x + r.w, y: r.y, w: 1, h: r.h },
    { x: r.x, y: r.y - 1, w: r.w, h: 1 },
    { x: r.x, y: r.y + r.h, w: r.w, h: 1 },
  ];
  for (const s of sides) {
    const x0 = Math.floor(s.x / BUCKET), y0 = Math.floor(s.y / BUCKET);
    const x1 = Math.floor((s.x + s.w - 1) / BUCKET), y1 = Math.floor((s.y + s.h - 1) / BUCKET);
    for (let by = y0; by <= y1; by++) for (let bx = x0; bx <= x1; bx++) {
      const a = oc.road.get(bkey(bx, by)); if (!a) continue;
      for (const q of a) if (q.id !== o.id && rectHit(s, q)) return true;
    }
  }
  return false;
}
function nearType(o, type, radius) {
  const d = dimsOf(o), cx = o.x + d.cw / 2, cy = o.y + d.ch / 2;
  for (const p of objects.values()) {
    if (p.type !== type) continue;
    const q = dimsOf(p), px = p.x + q.cw / 2, py = p.y + q.ch / 2;
    if (Math.hypot(px - cx, py - cy) <= radius) return true;
  }
  return false;
}
const R_FREE = (city, o) => baseOK(city, o);
const R_ROAD = (city, o) => {
  const b = baseOK(city, o); if (!b.ok) return b;
  return roadAdj(o) ? { ok: true } : { ok: false, why: 'ต้องติดถนน (วางถนนข้างๆ ก่อน)' };
};
const R_ROAD_POWER = (city, o) => {
  const b = R_ROAD(city, o); if (!b.ok) return b;
  return nearType(o, 'plant', 130) ? { ok: true } : { ok: false, why: 'ต้องมีไฟฟ้า (วางโรงไฟฟ้าใกล้ๆ)' };
};
const R_BRIDGE = (city, o) => {
  const b = baseOK(city, o); if (!b.ok) return b;
  return nearType(o, 'water', 9) ? { ok: true } : { ok: false, why: 'สะพานต้องมีน้ำอยู่ข้างๆ' };
};
const R_EQUIP = (city, o) => {
  const b = baseOK(city, o); if (!b.ok) return b;
  return roadAdj(o) ? { ok: true } : { ok: false, why: 'ต้องวางติดถนน' };
};
/* คำใบ้กติกาสั้น ๆ ใน inspector (ผูกกับฟังก์ชัน rule) */
const RULE_TEXT = new Map([
  [R_FREE, 'วางได้ทุกที่'],
  [R_ROAD, 'ต้องติดถนน (วางถนนข้าง ๆ ก่อน)'],
  [R_ROAD_POWER, 'ต้องติดถนน + มีโรงไฟฟ้าอยู่ใกล้'],
  [R_BRIDGE, 'ต้องมีน้ำอยู่ข้าง ๆ'],
  [R_EQUIP, 'ต้องวางติดถนน'],
]);
const hintOf = P => (P && RULE_TEXT.get(P.rule)) || 'วางได้ทุกที่';

/* ---------- แคตตาล็อกชิ้นส่วน (24 ชนิด) ---------- */
const PARTS = {};
function def(id, p) { PARTS[id] = Object.assign({ id, w: 1, h: 1, floors: 1, cat: 'build', icon: '🏠', color: 0xd8c39d, kind: 'house', rule: R_FREE }, p); }

def('road',      { name: 'ถนน',        cat: 'equip', icon: '🛣️', kind: 'flat',  color: 0x41454d, w: 5, h: 5, tile: true, rule: R_FREE });
def('road2',     { name: 'ถนน 2 เลน',  cat: 'equip', icon: '🛤️', kind: 'flat',  color: 0x343840, w: 5, h: 5, tile: true, rule: R_FREE });
def('path',      { name: 'ทางเดิน',     cat: 'equip', icon: '🚶', kind: 'flat',  color: 0xc6b78c, w: 2, h: 2, tile: true, rule: R_FREE });
def('bridge',    { name: 'สะพาน',      cat: 'equip', icon: '🌉', kind: 'bridge', color: 0x9d9280, w: 5, h: 5, tile: true, rule: R_BRIDGE });
def('house',     { name: 'บ้าน',        cat: 'build', icon: '🏠', kind: 'house', color: 0xdfc8a0, floors: 2, w: 10, h: 9, rule: R_ROAD });
def('townhouse', { name: 'ทาวน์เฮาส์',  cat: 'build', icon: '🏘️', kind: 'townhouse', color: 0xd3b38c, floors: 3, w: 6, h: 12, rule: R_ROAD });
def('apartment', { name: 'อพาร์ตเมนต์', cat: 'build', icon: '🏢', kind: 'tower', color: 0xb7c6d1, floors: 6, w: 18, h: 18, rule: R_ROAD });
def('shop',      { name: 'ร้านค้า',     cat: 'build', icon: '🏪', kind: 'shop',  color: 0xe4bd8e, floors: 2, w: 8, h: 10, rule: R_ROAD });
def('market',    { name: 'ตลาด',       cat: 'build', icon: '🛒', kind: 'market', color: 0xd7a46c, w: 24, h: 24, rule: R_ROAD });
def('office',    { name: 'ออฟฟิศ',     cat: 'build', icon: '🏬', kind: 'tower', color: 0x9fb8c8, floors: 8, w: 20, h: 20, rule: R_ROAD });
def('mall',      { name: 'ห้าง',       cat: 'build', icon: '🛍️', kind: 'mall',  color: 0xd9cfbb, floors: 4, w: 36, h: 36, rule: R_ROAD });
def('factory',   { name: 'โรงงาน',     cat: 'build', icon: '🏭', kind: 'factory', color: 0xb2a99b, floors: 2, w: 28, h: 24, rule: R_ROAD_POWER });
def('warehouse', { name: 'โกดัง',      cat: 'build', icon: '📦', kind: 'warehouse', color: 0xc3c9cd, floors: 1, w: 24, h: 18, rule: R_ROAD_POWER });
def('plant',     { name: 'โรงไฟฟ้า',   cat: 'equip', icon: '⚡', kind: 'plant', color: 0x9aa4ae, w: 20, h: 20, rule: R_FREE });
def('watertower',{ name: 'หอเก็บน้ำ',   cat: 'equip', icon: '🚰', kind: 'watertower', color: 0xa9c0c8, w: 10, h: 10, rule: R_FREE });
def('park',      { name: 'สวน',        cat: 'nature', icon: '🌳', kind: 'park', color: 0x6f9450, w: 12, h: 12, rule: R_FREE });
def('tree',      { name: 'ต้นไม้',     cat: 'nature', icon: '🌲', kind: 'tree', color: 0x4f7c46, w: 4, h: 4, rule: R_FREE });
def('water',     { name: 'น้ำ',        cat: 'nature', icon: '💧', kind: 'water', color: 0x3478a0, w: 10, h: 10, rule: R_FREE });
def('plaza',     { name: 'ลานกว้าง',   cat: 'nature', icon: '⛲', kind: 'plaza', color: 0xcfc3a4, w: 16, h: 16, rule: R_FREE });
def('lamp',      { name: 'โคมไฟ',      cat: 'equip', icon: '💡', kind: 'lamp', color: 0xfff3c8, w: 2, h: 2, rule: R_EQUIP });
def('car',       { name: 'รถยนต์',     cat: 'equip', icon: '🚗', kind: 'car', color: 0xcf4a3f, w: 5, h: 2, rule: R_EQUIP });
def('bus',       { name: 'รถเมล์',     cat: 'equip', icon: '🚌', kind: 'bus', color: 0xd8a33a, w: 12, h: 3, rule: R_EQUIP });
def('busstop',   { name: 'ป้ายรถเมล์', cat: 'equip', icon: '🚏', kind: 'busstop', color: 0x6fa3c8, w: 3, h: 2, rule: R_EQUIP });
def('sign',      { name: 'ป้ายบอกทาง', cat: 'equip', icon: '🪧', kind: 'sign', color: 0x4e8a5e, w: 2, h: 2, rule: R_EQUIP });

/* ---------- กำลังประชากร/งาน ต่อชั้น (ใช้ใน sim v1) ---------- */
const CAPS = {
  house: ['res', 5], townhouse: ['res', 4], apartment: ['res', 10],
  shop: ['jobs', 4], market: ['jobs', 8], office: ['jobs', 10], mall: ['jobs', 12],
  factory: ['jobs', 15], warehouse: ['jobs', 6],
};
for (const t in CAPS) { const [k, v] = CAPS[t]; if (PARTS[t]) PARTS[t][k] = v; }

/* ---------- ตรวจ/วาง/ย้าย/หมุน/ลบ ---------- */
function evaluate(type, x, y, rot, ignoreId, floors) {
  const P = PARTS[type];
  if (!P) return { ok: false, why: 'ไม่รู้จักชนิดนี้', cells: [], d: { cw: 1, ch: 1 } };
  const o = { id: ignoreId || '__tmp', type, x, y, w: P.w, h: P.h, rot: normRot(rot), floors: floors || P.floors || 1 };
  const d = dimsOf(o);
  if (x < 0 || y < 0 || x + d.cw > cols || y + d.ch > rows) return { ok: false, why: 'เกินขอบเขตเมือง', cells: [], d };
  const blocked = [...overlapAny(o).values()];
  if (blocked.length) return { ok: false, why: 'ทับของเดิม', cells: [], d, blocked };
  const r = P.rule(City, o) || { ok: true };
  return { ok: !!r.ok, why: r.why || '', cells: [], d };
}
function place(type, x, y, opt) {
  opt = opt || {};
  const P = PARTS[type];
  if (!P) return { ok: false, why: 'ไม่รู้จักชนิดนี้' };
  const rot = normRot(opt.rot || 0);
  const ev = evaluate(type, x, y, rot, null, opt.floors);
  if (!ev.ok) return { ok: false, why: ev.why };
  const o = { id: 'o' + (nextId++), type, x, y, w: P.w, h: P.h, rot, floors: opt.floors || P.floors || 1, on: true };
  objects.set(o.id, o); reindex();
  return { ok: true, id: o.id, obj: o, d: ev.d };
}
function move(id, x, y, rot) {
  const o = objects.get(id);
  if (!o) return { ok: false, why: 'ไม่พบชิ้นนี้' };
  const nr = rot === undefined ? o.rot : normRot(rot);
  const ev = evaluate(o.type, x, y, nr, id, o.floors);
  if (!ev.ok) return { ok: false, why: ev.why };
  o.x = x; o.y = y; o.rot = nr; reindex();
  return { ok: true, d: ev.d };
}
function moveTo(id, cx, cy) {
  const o = objects.get(id);
  if (!o) return { ok: false, why: 'ไม่พบชิ้นนี้' };
  const d = dimsOf(o);
  return move(id, cx - Math.floor((d.cw - 1) / 2), cy - Math.floor((d.ch - 1) / 2));
}
function rotate(id) {
  const o = objects.get(id);
  if (!o) return { ok: false, why: 'ไม่พบชิ้นนี้' };
  const d0 = dimsOf(o), nr = normRot(o.rot + 90);
  const dd = dimsOf({ type: o.type, w: o.w, h: o.h, rot: nr });
  const cx = o.x + d0.cw / 2, cy = o.y + d0.ch / 2;
  const nx = Math.round(cx - dd.cw / 2), ny = Math.round(cy - dd.ch / 2);
  const ev = evaluate(o.type, nx, ny, nr, id, o.floors);
  if (!ev.ok) return { ok: false, why: ev.why };
  o.rot = nr; o.x = nx; o.y = ny; reindex();
  return { ok: true, rot: nr, d: ev.d };
}
function remove(id) {
  if (!objects.has(id)) return { ok: false, why: 'ไม่พบชิ้นนี้' };
  objects.delete(id); reindex(); return { ok: true };
}
function expand(kind) {
  if (kind === 'row') {
    if (rows >= CAP) return { ok: false, why: 'ถึงเพดาน ' + CAP + '×' + CAP + ' ม. แล้ว' };
    rows += CELLS_PER_BLOCK; reindex(); return { ok: true, rows };
  }
  if (cols >= CAP) return { ok: false, why: 'ถึงเพดาน ' + CAP + '×' + CAP + ' ม. แล้ว' };
  cols += CELLS_PER_BLOCK; reindex(); return { ok: true, cols };
}
function reset(nc, nr) {
  cols = nc || 200; rows = nr || 250; objects.clear(); nextId = 1; reindex();
}
function serialize() {
  return {
    v: 5, unit: 'm', grid: { cols, rows, cell: CELL },
    objects: [...objects.values()].map(o => ({ id: o.id, type: o.type, x: o.x, y: o.y, w: o.w, h: o.h, rot: o.rot, floors: o.floors, on: o.on !== false }))
  };
}
function load(data) {
  let d = data;
  if (typeof data === 'string') { try { d = JSON.parse(data); } catch (e) { return { ok: false, why: 'JSON เสียรูป' }; } }
  if (!d || typeof d !== 'object') return { ok: false, why: 'ข้อมูลว่าง' };
  const g = d.grid || {};
  const nc = Math.min(CAP, Math.max(20, Math.floor(g.cols || 200)));
  const nr = Math.min(CAP, Math.max(20, Math.floor(g.rows || 250)));
  const k = (Number.isFinite(g.cell) && g.cell > 0 ? g.cell : CELL) / CELL;   // ไฟล์เก่า (ช่องละ 10 ม.) → คูณพิกัดเป็นเมตร
  const list = Array.isArray(d.objects) ? d.objects : [];
  cols = nc; rows = nr; objects.clear(); nextId = 1; reindex();
  const placed = []; let skipped = 0;
  for (const it of list) {
    const P = PARTS[it && it.type];
    if (!P || !Number.isFinite(it.x) || !Number.isFinite(it.y)) { skipped++; continue; }
    const rot = normRot(it.rot || 0);
    const o = {
      id: String(it.id || ('o' + (nextId++))), type: it.type,
      x: Math.round(it.x * k), y: Math.round(it.y * k),
      w: P.w, h: P.h, rot, floors: Math.max(1, Math.floor(it.floors || P.floors || 1)), on: it.on !== false
    };
    const dd = dimsOf(o), r = { x: o.x, y: o.y, w: dd.cw, h: dd.ch };
    if (r.x < 0 || r.y < 0 || r.x + r.w > cols || r.y + r.h > rows || placed.some(q => rectHit(q, r))) { skipped++; continue; }
    placed.push(r);
    objects.set(o.id, o);
  }
  let maxId = 0;
  for (const o of objects.values()) { const m = /^o(\d+)$/.exec(o.id); if (m) maxId = Math.max(maxId, +m[1]); }
  nextId = maxId + 1;
  reindex();
  return { ok: true, count: objects.size, skipped };
}
/* ---------- จำลองบริการ: ไฟ / น้ำ / ถนน → ประชากร · งาน (v1 = coverage รัศมี) ---------- */
const SIM = { powerR: 130, waterR: 110 };        // รัศมีหน่วยเป็น "ช่อง" (1 ช่อง = 10 ม.)
function centerOf(o) { const d = dimsOf(o); return { x: o.x + d.cw / 2, y: o.y + d.ch / 2 }; }
function simCity() {
  const plants = [], towers = [];
  for (const o of objects.values()) {
    if (o.type === 'plant') plants.push(centerOf(o));
    else if (o.type === 'watertower') towers.push(centerOf(o));
  }
  const svc = new Map(), unserved = [];
  let pop = 0, jobs = 0, need = 0, served = 0, noPower = 0, noWater = 0, noRoad = 0;
  for (const o of objects.values()) {
    const P = PARTS[o.type] || {};
    const isRes = (P.res || 0) > 0, isJob = (P.jobs || 0) > 0;
    if (!isRes && !isJob) continue;
    const c = centerOf(o), f = o.floors || 1;
    const power = plants.some(p => Math.hypot(p.x - c.x, p.y - c.y) <= SIM.powerR);
    const water = towers.some(t => Math.hypot(t.x - c.x, t.y - c.y) <= SIM.waterR);
    const road = roadAdj(o);
    need++;
    if (!power) noPower++;
    if (!water) noWater++;
    if (!road) noRoad++;
    const ok = power && water && road;
    svc.set(o.id, { power, water, road, ok });
    if (ok) { served++; if (isRes) pop += (P.res || 0) * f; else jobs += (P.jobs || 0) * f; }
    else unserved.push(o.id);
  }
  const pct = n => (need ? Math.round(((need - n) / need) * 100) : 100);
  return { pop, jobs, need, served, unserved, svc, noPower, noWater, noRoad, powerPct: pct(noPower), waterPct: pct(noWater), roadPct: pct(noRoad) };
}
const sim = () => _sim || (_sim = simCity());          // cache; ล้างใน reindex()
function serviceOf(id) { return sim().svc.get(id) || null; }

/* ---------- เครือข่ายถนน (road graph) + รถวิ่ง v1 ---------- */
const DIRS = [[1, 0], [0, 1], [-1, 0], [0, -1]];        // E S W N
const LANE = 1.2;                                        // เมตรจากกึ่งกลางถนน (ขับซ้าย)
const TRAFFIC = { max: 240, speed: 9 };                  // 9 ม./วิ ≈ 32 กม./ชม.
function roadNet() {
  if (_net) return _net;
  const tiles = [];
  for (const o of objects.values()) if (roadLike(o.type)) tiles.push(rectOf(o));
  const byKey = new Map();
  for (const t of tiles) byKey.set(Math.round(t.x + t.w / 2) + ',' + Math.round(t.y + t.h / 2), t);
  const links = new Map();
  let junction = 0, deadEnd = 0;
  for (const t of tiles) {
    const cx = t.x + t.w / 2, cy = t.y + t.h / 2, arr = [null, null, null, null];
    for (let d = 0; d < 4; d++) arr[d] = byKey.get(Math.round(cx + DIRS[d][0] * t.w) + ',' + Math.round(cy + DIRS[d][1] * t.h)) || null;
    links.set(t.id, arr);
    const n = arr.filter(Boolean).length;
    if (n >= 3) junction++; else if (n === 1) deadEnd++;
  }
  const seen = new Set(); let groups = 0;
  for (const t of tiles) {
    if (seen.has(t.id)) continue;
    groups++; const st = [t]; seen.add(t.id);
    while (st.length) {
      const c = st.pop();
      for (const q of links.get(c.id) || []) if (q && !seen.has(q.id)) { seen.add(q.id); st.push(q); }
    }
  }
  return (_net = { tiles, links, junction, deadEnd, groups });
}
const carRnd = c => (c.seed = (c.seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff;
function trafficCars(n) {
  const net = roadNet(), out = [];
  if (!net.tiles.length) return out;
  const max = Math.min(n === undefined ? TRAFFIC.max : n, net.tiles.length);
  for (let i = 0; i < max; i++) {
    const tile = net.tiles[Math.floor(i * net.tiles.length / max)];
    const links = net.links.get(tile.id) || [];
    let dir = links.findIndex(Boolean); if (dir < 0) dir = 0;
    out.push({
      id: 'c' + i, tile, dir, t: ((i * 0.37) % 1), seed: 7 + i * 7919,
      speed: TRAFFIC.speed * (0.85 + 0.3 * (((i * 37) % 11) / 10)),
    });
  }
  return out;
}
/* เดินรถ 1 สเต็ป (วินาที) — ตรงไปก่อน ถ้าตรงไม่ได้ให้เลี้ยว/กลับรถ อยู่บนถนนเสมอ */
function stepCars(cars, dt) {
  const net = roadNet();
  for (const c of cars) {
    if (!c.tile) continue;
    c.t += (c.speed * dt) / c.tile.w;
    let guard = 0;
    while (c.t >= 1 && guard++ < 4) {
      c.t -= 1;
      const links = net.links.get(c.tile.id) || [];
      const lft = (c.dir + 3) % 4, rgt = (c.dir + 1) % 4, back = (c.dir + 2) % 4;
      let nd;
      if (links[c.dir] && (carRnd(c) < 0.72 || (!links[lft] && !links[rgt]))) nd = c.dir;
      else {
        const turns = [lft, rgt].filter(d => links[d]);
        nd = turns.length ? turns[Math.floor(carRnd(c) * turns.length)] : (links[back] ? back : -1);
      }
      if (nd < 0) { c.t = 0; break; }                    // ถนนโดด ไม่มีเพื่อน
      c.dir = nd; c.tile = links[nd] || c.tile;
    }
  }
  return cars;
}
/* ตำแหน่ง/มุมของรถ (เมตร + เรเดียน) — ชิดซ้ายเสมอ (เมืองไทย) */
function carPose(c) {
  const t = c.tile, cx = t.x + t.w / 2, cy = t.y + t.h / 2;
  const dx = DIRS[c.dir][0], dy = DIRS[c.dir][1];
  const along = (c.t - 0.5) * t.w;
  return { x: cx + dx * along + dy * LANE, y: cy + dy * along - dx * LANE, rot: Math.atan2(dy, dx), tile: t };
}
function carOnRoad(c) {
  const p = carPose(c), net = roadNet();
  for (const q of net.tiles) if (p.x >= q.x - 3 && p.x <= q.x + q.w + 3 && p.y >= q.y - 3 && p.y <= q.y + q.h + 3) return true;
  return false;
}
/* ---------- ทางม้าลาย: วาดที่ไทล์ "ก่อนถึงทางแยก" (ทางแยก = ไทล์ที่มีถนน ≥3 ด้าน) ---------- */
function crosswalkBars() {
  const net = roadNet(), out = [];
  for (const t of net.tiles) {
    const links = net.links.get(t.id) || [];
    if (links.filter(Boolean).length < 3) continue;
    for (let d = 0; d < 4; d++) {
      const a = links[d];
      if (!a) continue;
      const back = (d + 2) % 4;                             // จากไทล์ a มองกลับมาที่ทางแยก
      const cx = a.x + a.w / 2, cy = a.y + a.h / 2;
      const ex = cx + DIRS[back][0] * (a.w / 2 - 0.9);
      const ey = cy + DIRS[back][1] * (a.h / 2 - 0.9);
      const alongX = (d % 2) === 0;                          // เดินทางตามแกน x หรือไม่
      for (let i = -2; i <= 2; i++) {                        // 5 แถบ พาดขวางความกว้างถนน
        const o = i * 0.9;
        out.push({
          x: ex + (alongX ? 0 : o), y: ey + (alongX ? o : 0),
          sx: alongX ? 3.2 : 0.45, sz: alongX ? 0.45 : 3.2,
        });
      }
    }
  }
  return out;
}

/* ---------- ไฟจราจร: เฟสสัญญาณ + จุดวางที่ทางแยก ---------- */
const SIGNAL_CYCLE = { green: 8, yellow: 2, red: 2 };
function signalPhase(tSec) {
  const total = SIGNAL_CYCLE.green + SIGNAL_CYCLE.yellow + SIGNAL_CYCLE.red;
  const t = ((tSec % total) + total) % total;
  if (t < SIGNAL_CYCLE.green) return 'green';
  if (t < SIGNAL_CYCLE.green + SIGNAL_CYCLE.yellow) return 'yellow';
  return 'red';
}
function signalSpots() {
  const net = roadNet(), out = [];
  for (const t of net.tiles) {
    const links = net.links.get(t.id) || [];
    if (links.filter(Boolean).length < 3) continue;              // เฉพาะทางแยก
    const cx = t.x + t.w / 2, cy = t.y + t.h / 2;
    for (let d = 0; d < 4; d++) {
      if (!links[d]) continue;
      const dx = DIRS[d][0], dy = DIRS[d][1];
      out.push({                                             // มุมขวาของทางเข้า
        x: cx + dx * (t.w / 2 - 0.7) + dy * (t.w / 2 - 0.7),
        y: cy + dy * (t.h / 2 - 0.7) - dx * (t.h / 2 - 0.7),
      });
    }
  }
  return out;
}
/* ป้ายร้าน: อาคารค้าขาย (ร้านค้า/ตลาด/ห้าง) */
function shopSignSpots() {
  const out = [];
  for (const o of objects.values()) {
    if (o.type !== 'shop' && o.type !== 'market' && o.type !== 'mall') continue;
    const P = PARTS[o.type]; if (!P) continue;
    const d = dimsOf(o), W = d.cw * CELL, D = d.ch * CELL;
    const h = visualHeight(o), f = o.floors || P.floors || 1;
    const th = normRot(o.rot) * Math.PI / 180, co = Math.cos(th), si = Math.sin(th);
    const cx = (o.x + d.cw / 2) * CELL, cz = (o.y + d.ch / 2) * CELL, oz = D / 2 + 0.2;
    out.push({
      x: cx + oz * si, z: cz + oz * co,
      y: Math.max(1.6, Math.min(h - 0.3, (h / f) * 0.95)),
      w: W * 0.86, hh: Math.min(1.5, (h / f) * 0.4), rot: normRot(o.rot),
      color: o.type === 'mall' ? 0xd9a13b : (o.type === 'market' ? 0xc9743c : 0xc8503f),
    });
  }
  return out;
}

const City = {
  get cols() { return cols; }, get rows() { return rows; }, get cell() { return CELL; },
  get objects() { return objects; },
  PARTS, cellsOf, dimsOf, occ, evaluate, place, move, moveTo, rotate, remove, expand, reset, serialize, load,
  sim: () => simCity(), serviceOf, SIM, CAPS,
  roads: () => roadNet(), trafficCars, stepCars, carPose, DIRS, LANE, TRAFFIC, crosswalkBars,
  stats() {
    const s = sim();
    return {
      cols, rows, objects: objects.size, cells: usedArea(),
      pop: s.pop, jobs: s.jobs, served: s.served, need: s.need,
      unserved: s.unserved.length, powerPct: s.powerPct, waterPct: s.waterPct, roadPct: s.roadPct,
    };
  }
};
/* ==CORE-END== */

/* ================== three.js ================== */
const canvas = $('#c');
const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, preserveDrawingBuffer: true });
renderer.setPixelRatio(Math.min(devicePixelRatio || 1, 2));
renderer.setSize(innerWidth, innerHeight, false);
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
renderer.shadowMap.autoUpdate = false;

const scene = new THREE.Scene();
scene.background = new THREE.Color(0xd3e3f0);
scene.fog = new THREE.Fog(0xd3e3f0, 500, 1200);

const camera = new THREE.PerspectiveCamera(42, innerWidth / innerHeight, 1, 4000);
const hemi = new THREE.HemisphereLight(0xeaf4ff, 0x8d8f7c, 1.25);
scene.add(hemi);
const sun = new THREE.DirectionalLight(0xfff6e4, 1.9);
sun.castShadow = true;
sun.shadow.mapSize.set(2048, 2048);
sun.shadow.bias = -0.0006; sun.shadow.normalBias = 1.4;
scene.add(sun, sun.target);
const fill = new THREE.DirectionalLight(0xcfe0f5, 0.5);
scene.add(fill);

/* ---------- พื้น + กริด (สร้างใหม่เมื่อขนาดเปลี่ยน) ---------- */
const worldGrp = new THREE.Group(); scene.add(worldGrp);
const groundMesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshLambertMaterial({ color: 0x8fae74 }));
groundMesh.receiveShadow = true; worldGrp.add(groundMesh);
const gridGrp = new THREE.Group(); worldGrp.add(gridGrp);
/* ---------- ธีมเวลา 4 แบบ + โหมดภาพ ---------- */
const THEMES = {
  dawn:  { name: 'เช้า',     bg: 0xf6dcc4, fog: 0xf6dcc4, sun: 0xffd7a8, sunI: 1.45, hemiSky: 0xffead8, hemiGnd: 0x9a9078, hemiI: 1.1,  fill: 0xffe0c4, fillI: 0.45, ground: 0x9fb583 },
  day:   { name: 'กลางวัน',  bg: 0xd3e3f0, fog: 0xd3e3f0, sun: 0xfff6e4, sunI: 1.9,  hemiSky: 0xeaf4ff, hemiGnd: 0x8d8f7c, hemiI: 1.25, fill: 0xcfe0f5, fillI: 0.5,  ground: 0x8fae74 },
  dusk:  { name: 'เย็น',     bg: 0xf0b184, fog: 0xe5a377, sun: 0xffab61, sunI: 1.3,  hemiSky: 0xffcfae, hemiGnd: 0x7d7466, hemiI: 0.95, fill: 0xffc39b, fillI: 0.4,  ground: 0x8a9a6a },
  night: { name: 'กลางคืน', bg: 0x131d2a, fog: 0x131d2a, sun: 0x9fb6d8, sunI: 0.32, hemiSky: 0x2b3d52, hemiGnd: 0x1a2330, hemiI: 0.55, fill: 0x2f4a66, fillI: 0.3,  ground: 0x39463a },
};
const THEME_ORDER = ['day', 'dusk', 'night', 'dawn'];
let themeKey = 'day', shotMode = false;
function setTheme(key) {
  const k = THEMES[key] ? key : 'day', t = THEMES[k];
  themeKey = k;
  scene.background.set(t.bg);
  scene.fog.color.set(t.fog);
  sun.color.set(t.sun); sun.intensity = t.sunI;
  fill.color.set(t.fill); fill.intensity = t.fillI;
  hemi.color.set(t.hemiSky); hemi.groundColor.set(t.hemiGnd); hemi.intensity = t.hemiI;
  if (groundMesh) groundMesh.material.color.set(t.ground);
  document.body.dataset.theme = k;
  renderer.shadowMap.needsUpdate = true;
  return { key: k, name: t.name, sun: t.sunI };
}
function nextTheme() { return THEME_ORDER[(THEME_ORDER.indexOf(themeKey) + 1) % THEME_ORDER.length]; }
function setShot(on) {
  shotMode = on === undefined ? !shotMode : !!on;
  document.body.classList.toggle('shot', shotMode);
  document.body.dataset.shot = shotMode ? '1' : '0';
  return shotMode;
}
/* กริดรวมเป็น 2 mesh (เส้นช่อง + เส้นบล็อก) → 2 draw calls */
const cellLineMat = new THREE.MeshBasicMaterial({ color: 0xffffff, transparent: true, opacity: 0.32, side: THREE.DoubleSide, depthWrite: false });
const blockLineMat = new THREE.MeshBasicMaterial({ color: 0xffffff, transparent: true, opacity: 0.9, side: THREE.DoubleSide, depthWrite: false });
const midLineMat = new THREE.MeshBasicMaterial({ color: 0xffffff, transparent: true, opacity: 0.42, side: THREE.DoubleSide, depthWrite: false });
function lineMesh(pos, idx, mat, y) {
  const geo = new THREE.BufferGeometry();
  geo.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3));
  geo.setIndex(idx);
  const m = new THREE.Mesh(geo, mat);
  m.position.y = y;
  return m;
}
function worldSize() { const W = cols * CELL, D = rows * CELL; return { W, D, span: Math.max(W, D), cx: W / 2, cz: D / 2 }; }
let lastSpan = 0;
function buildWorld() {
  const s = worldSize();
  groundMesh.scale.set(s.W + 140, 2, s.D + 140);
  groundMesh.position.set(s.cx, -1.06, s.cz);
  while (gridGrp.children.length) { const c = gridGrp.children.pop(); c.geometry && c.geometry.dispose(); gridGrp.remove(c); }
  const cellP = [], cellI = [], midP = [], midI = [], blockP = [], blockI = [];
  const quad = (pos, idx, x1, z1, x2, z2, w) => {
    const dx = x2 - x1, dz = z2 - z1, len = Math.hypot(dx, dz) || 1;
    const nx = (-dz / len) * w / 2, nz = (dx / len) * w / 2;
    const b = pos.length / 3;
    pos.push(x1 + nx, 0, z1 + nz, x2 + nx, 0, z2 + nz, x2 - nx, 0, z2 - nz, x1 - nx, 0, z1 - nz);
    idx.push(b, b + 1, b + 2, b, b + 2, b + 3);
  };
  for (let x = 0; x <= cols; x++) {
    const px = x * CELL;
    if (x % CELLS_PER_BLOCK === 0) quad(blockP, blockI, px, 0, px, s.D, 0.9);
    else if (x % 5 === 0) quad(midP, midI, px, 0, px, s.D, 0.3);
    else quad(cellP, cellI, px, 0, px, s.D, 0.14);
  }
  for (let y = 0; y <= rows; y++) {
    const pz = y * CELL;
    if (y % CELLS_PER_BLOCK === 0) quad(blockP, blockI, 0, pz, s.W, pz, 0.9);
    else if (y % 5 === 0) quad(midP, midI, 0, pz, s.W, pz, 0.3);
    else quad(cellP, cellI, 0, pz, s.W, pz, 0.14);
  }
  gridGrp.add(lineMesh(cellP, cellI, cellLineMat, 0.04));
  gridGrp.add(lineMesh(midP, midI, midLineMat, 0.05));
  gridGrp.add(lineMesh(blockP, blockI, blockLineMat, 0.06));
}

/* ---------- กล้อง ---------- */
const cam = { az: -0.92, polar: 0.92, dist: 300, px: 0, pz: 0 };
const target = new THREE.Vector3();
const clampD = d => { const s = worldSize(); return Math.min(s.span * 3.2, Math.max(50, d)); };
function applyCam() {
  const s = worldSize();
  const sp = Math.sin(cam.polar), y = Math.cos(cam.polar);
  const tx = s.cx + cam.px, tz = s.cz + cam.pz;
  camera.position.set(tx + Math.sin(cam.az) * sp * cam.dist, Math.max(20, y * cam.dist), tz + Math.cos(cam.az) * sp * cam.dist);
  target.set(tx, 0, tz);
  camera.lookAt(target);
}
function zoomTo(d) { cam.dist = clampD(d); applyCam(); }
applyCam();

/* ---------- วัสดุ/เรขาคณิตที่ใช้ร่วม ---------- */
const GEOS = {}, MATS = new Map();
function geoOf(g) {
  if (GEOS[g]) return GEOS[g];
  let geo;
  if (g === 'cyl') geo = new THREE.CylinderGeometry(0.5, 0.5, 1, 10, 1);
  else if (g === 'cone') geo = new THREE.ConeGeometry(0.5, 1, 4, 1);
  else if (g === 'ico') geo = new THREE.IcosahedronGeometry(0.5, 0);
  else geo = new THREE.BoxGeometry(1, 1, 1);
  return (GEOS[g] = geo);
}
const matVary = new THREE.MeshLambertMaterial({ color: 0xffffff });
function matOf(c) {
  let m = MATS.get(c);
  if (!m) { m = new THREE.MeshLambertMaterial({ color: c }); MATS.set(c, m); }
  return m;
}

/* ---------- ชิ้นส่วนของแต่ละชนิด (สำหรับ InstancedMesh) ---------- */
function piecesFor(o) {
  const P = PARTS[o.type] || PARTS.house;
  const d = dimsOf(o), W = d.cw * CELL, D = d.ch * CELL, f = o.floors || P.floors || 1;
  const out = [];
  const add = (g, p, s, c, vary) => out.push({ g, p, s, c, vary: !!vary });
  switch (P.kind) {
    case 'flat': add('box', [0, 0.09, 0], [W * 0.98, 0.18, D * 0.98], P.color); break;
    case 'bridge':
      add('box', [0, 0.3, 0], [W * 0.96, 0.55, D * 0.96], P.color);
      add('box', [0, 0.75, 0], [W * 0.98, 0.14, D * 0.98], 0x6f6555); break;
    case 'house': {
      const h = f * 3.2, w = W * 0.84, dd = D * 0.72;
      add('box', [0, 0.1 + h / 2, 0], [w, h, dd], P.color, true);
      add('cone', [0, 0.1 + h + 0.55, 0], [w * 1.24, 1.1, dd * 1.3], 0x8c5844);
      break;
    }
    case 'townhouse': {
      const h = f * 3.1, w = W * 0.92, dd = D * 0.62;
      add('box', [0, 0.1 + h / 2, 0], [w, h, dd], P.color, true);
      add('box', [0, 0.1 + h + 0.25, 0], [w * 0.98, 0.5, dd * 1.04], 0x7d5a49);
      break;
    }
    case 'tower': {
      const h = f * 3.1, w = W * 0.86, dd = D * 0.86;
      add('box', [0, 0.1 + h / 2, 0], [w, h, dd], P.color, true);
      add('box', [0, 0.1 + h + 0.2, 0], [w * 0.92, 0.4, dd * 0.92], 0x8d9aa3);
      add('box', [0, 0.1 + h * 0.6, 0], [w * 1.02, h * 0.05, dd * 1.02], 0xe9f2f7);
      break;
    }
    case 'shop': {
      const h = f * 3.2, w = W * 0.88, dd = D * 0.7;
      add('box', [0, 0.1 + h / 2, 0], [w, h, dd], P.color, true);
      add('box', [0, 0.1 + h + 0.15, 0], [w * 0.95, 0.3, dd * 0.95], 0x9a6b4a);
      add('box', [0, 1.9, dd / 2 + 0.35], [w * 0.9, 0.16, 0.7], 0xc8503f);
      break;
    }
    case 'market': {
      const h = 2.4;
      add('box', [0, 0.1 + h / 2, 0], [W * 0.9, h, D * 0.9], P.color, true);
      add('cone', [0, 0.1 + h + 0.85, 0], [W * 1.04, 1.7, D * 1.04], 0xb9762f);
      break;
    }
    case 'mall': {
      const h = f * 3.2;
      add('box', [0, 0.1 + h / 2, 0], [W * 0.94, h, D * 0.94], P.color, true);
      add('box', [0, 0.1 + h + 0.25, 0], [W * 0.98, 0.5, D * 0.98], 0x9c9384);
      add('box', [0, 1.4, D * 0.42], [W * 0.5, 2.4, 0.6], 0x7f8f7a);
      break;
    }
    case 'factory': {
      const h = f * 4;
      add('box', [0, 0.1 + h / 2, 0], [W * 0.92, h, D * 0.92], P.color, true);
      add('box', [0, 0.1 + h + 0.15, 0], [W * 0.94, 0.3, D * 0.94], 0x8b8579);
      add('cyl', [W * 0.26, 0.1 + h + 3, 0], [1.8, 6, 1.8], 0x8b9096);
      add('cyl', [-W * 0.26, 0.1 + h + 2, 0], [1.4, 4, 1.4], 0x8b9096);
      break;
    }
    case 'warehouse': {
      const h = 6;
      add('box', [0, 0.1 + h / 2, 0], [W * 0.92, h, D * 0.92], P.color, true);
      add('box', [0, 0.1 + h + 0.2, 0], [W * 0.96, 0.4, D * 0.96], 0x93a0a8);
      break;
    }
    case 'plant': {
      const h = 7;
      add('box', [0, 0.1 + h / 2, 0], [W * 0.88, h, D * 0.88], P.color, true);
      add('box', [0, 0.1 + h + 0.15, 0], [W * 0.9, 0.3, D * 0.9], 0x788089);
      add('cyl', [W * 0.2, 0.1 + h + 4, 0], [2.6, 8, 2.6], 0xa8aeb4);
      add('cyl', [-W * 0.2, 0.1 + h + 2.5, 0], [1.9, 5, 1.9], 0xa8aeb4);
      break;
    }
    case 'watertower':
      add('cyl', [0, 11, 0], [8.4, 8, 8.4], P.color);
      add('cyl', [0, 4.5, 0], [1.5, 9, 1.5], 0x8f9aa2);
      add('cone', [0, 16.4, 0], [8.8, 1.8, 8.8], 0x7d8b93); break;
    case 'park':
      add('box', [0, 0.1, 0], [W * 0.95, 0.2, D * 0.95], P.color);
      add('ico', [0, 1.3, 0], [4, 2.6, 4], 0x6f9450); break;
    case 'tree':
      add('cyl', [0, 2, 0], [1.1, 4, 1.1], 0x7a5c3e);
      add('ico', [0, 5.6, 0], [5.2, 7.2, 5.2], P.color, true); break;
    case 'water': add('box', [0, 0.07, 0], [W * 0.98, 0.14, D * 0.98], P.color); break;
    case 'plaza':
      add('box', [0, 0.12, 0], [W * 0.96, 0.24, D * 0.96], P.color);
      add('cyl', [0, 1.3, 0], [3.4, 2.2, 3.4], 0xa9c3cf); break;
    case 'lamp':
      add('cyl', [0, 3, 0], [0.5, 6, 0.5], 0x5b6169);
      add('box', [0, 6.3, 0], [2.2, 0.32, 0.9], P.color); break;
    case 'car':
      add('box', [0, 0.75, 0], [W * 0.5, 1.5, D * 0.78], P.color, true);
      add('box', [0, 1.6, 0], [W * 0.42, 0.7, D * 0.5], 0xdfe9f2); break;
    case 'bus':
      add('box', [0, 1.5, 0], [W * 0.88, 2.8, D * 0.62], P.color, true);
      add('box', [0, 2.1, 0], [W * 0.9, 0.9, D * 0.66], 0x35404a); break;
    case 'busstop':
      add('cyl', [0, 1.6, 0], [0.35, 3.2, 0.35], 0x6b7178);
      add('box', [0, 3.4, 0], [2.6, 0.2, 1.6], P.color); break;
    case 'sign':
      add('cyl', [0, 1.5, 0], [0.35, 3, 0.35], 0x6b7178);
      add('box', [0, 3.2, 0], [2.8, 1.6, 0.3], P.color); break;
    default: add('box', [0, 2, 0], [W * 0.8, 4, D * 0.8], P.color, true);
  }
  return out;
}
function visualHeight(o) { let m = 1; for (const p of piecesFor(o)) m = Math.max(m, p.p[1] + p.s[1] / 2); return m; }

/* ---------- InstancedMesh ต่อชนิด (ของ 2×2/3×3 scale ตามขนาด) ---------- */
const instGrp = new THREE.Group(); scene.add(instGrp);
let instMeshes = [];
const dummy = new THREE.Object3D(), tmpColor = new THREE.Color();
function rebuildRender() {
  for (const m of instMeshes) { instGrp.remove(m); m.dispose(); }
  instMeshes = [];
  const byType = new Map();
  for (const o of objects.values()) {
    if (o.on === false || !PARTS[o.type]) continue;
    let a = byType.get(o.type); if (!a) byType.set(o.type, a = []); a.push(o);
  }
  for (const [type, list] of byType) {
    const pieces = piecesFor(list[0]);
    const meshes = pieces.map(p => {
      const m = new THREE.InstancedMesh(geoOf(p.g), p.vary ? matVary : matOf(p.c), list.length);
      m.castShadow = true; m.receiveShadow = true; m.frustumCulled = false;
      instGrp.add(m); instMeshes.push(m); return m;
    });
    list.forEach((o, i) => {
      const d = dimsOf(o);
      const cx = (o.x + d.cw / 2) * CELL, cz = (o.y + d.ch / 2) * CELL;
      const th = normRot(o.rot) * Math.PI / 180, co = Math.cos(th), si = Math.sin(th);
      const ps = piecesFor(o);
      ps.forEach((p, pi) => {
        const ox = p.p[0], oz = p.p[2];
        dummy.position.set(cx + ox * co + oz * si, p.p[1], cz - ox * si + oz * co);
        dummy.scale.set(p.s[0], p.s[1], p.s[2]);
        dummy.rotation.set(0, 0, 0);
        dummy.updateMatrix();
        meshes[pi].setMatrixAt(i, dummy.matrix);
        if (p.vary) {
          const seed = (o.id.charCodeAt(1) || 0) + o.y * 3 + o.x * 7;
          tmpColor.set(p.c).offsetHSL(0, 0, ((seed % 11) - 5) * 0.013);
          meshes[pi].setColorAt(i, tmpColor);
        }
      });
    });
    meshes.forEach(m => { m.instanceMatrix.needsUpdate = true; if (m.instanceColor) m.instanceColor.needsUpdate = true; });
  }
  rebuildDecor();
  rebuildSigns();
  renderer.shadowMap.needsUpdate = true;
  updateStats();
}

/* ---------- รายละเอียดอาคาร (หน้าต่าง + ของบนดาดฟ้า) — รวมเป็น Mesh เดียวต่อชนิด (2 draw call) ---------- */
const DECOR_KINDS = { house: 1, townhouse: 1, tower: 1, shop: 1, market: 1, mall: 1, factory: 1, warehouse: 1 };
let winMesh = null, roofMesh = null, decorStats = { windows: 0, roofs: 0 };
function rebuildDecor() {
  if (winMesh) { instGrp.remove(winMesh); winMesh.dispose(); winMesh = null; }
  if (roofMesh) { instGrp.remove(roofMesh); roofMesh.dispose(); roofMesh = null; }
  const blds = [];
  for (const o of objects.values()) if (o.on !== false && DECOR_KINDS[(PARTS[o.type] || {}).kind]) blds.push(o);
  winMesh = new THREE.InstancedMesh(geoOf('box'), matOf(0x18242e), Math.max(1, blds.length * 3));
  winMesh.frustumCulled = false; winMesh.receiveShadow = true;
  instGrp.add(winMesh);
  roofMesh = new THREE.InstancedMesh(geoOf('box'), matOf(0x8d949b), Math.max(1, blds.length));
  roofMesh.frustumCulled = false; roofMesh.castShadow = true;
  instGrp.add(roofMesh);
  let w = 0, r = 0;
  for (const o of blds) {
    const P = PARTS[o.type], d = dimsOf(o);
    const W = d.cw * CELL, D = d.ch * CELL, f = o.floors || P.floors || 1;
    const h = visualHeight(o);
    const cx = (o.x + d.cw / 2) * CELL, cz = (o.y + d.ch / 2) * CELL;
    const th = normRot(o.rot) * Math.PI / 180, co = Math.cos(th), si = Math.sin(th);
    const rowH = h / f, rows = Math.min(3, f);
    for (let i = 0; i < rows; i++) {                        // หน้าต่างด้านหน้า สูงสุด 3 แถว
      const oz = D / 2 + 0.16;
      dummy.position.set(cx + oz * si, (i + 0.55) * rowH * 0.95, cz + oz * co);
      dummy.rotation.set(0, th, 0);
      dummy.scale.set(W * 0.8, Math.min(1.6, rowH * 0.5), 0.3);
      dummy.updateMatrix();
      winMesh.setMatrixAt(w++, dummy.matrix);
    }
    const ox = W * 0.18, oz2 = D * 0.12;                    // ของบนดาดฟ้า (แทงก์น้ำ/แอร์)
    dummy.position.set(cx + ox * co + oz2 * si, h + 0.7, cz - ox * si + oz2 * co);
    dummy.rotation.set(0, th, 0);
    dummy.scale.set(Math.min(4, W * 0.22), 1.4, Math.min(3, D * 0.22));
    dummy.updateMatrix();
    roofMesh.setMatrixAt(r++, dummy.matrix);
  }
  winMesh.count = w; roofMesh.count = r;
  winMesh.instanceMatrix.needsUpdate = true; roofMesh.instanceMatrix.needsUpdate = true;
  decorStats = { windows: w, roofs: r };
  document.body.dataset.windows = String(w);
  document.body.dataset.roofs = String(r);
  return decorStats;
}

/* ---------- รถวิ่งบนถนน (InstancedMesh ก้อนเดียว, อัปเดตทุกเฟรม) ---------- */
const TRAFFIC_MAX = 240;
const trafficMesh = new THREE.InstancedMesh(new THREE.BoxGeometry(1, 1, 1),
  new THREE.MeshLambertMaterial({ color: 0xffffff }), TRAFFIC_MAX);
trafficMesh.frustumCulled = false;
trafficMesh.count = 0;
scene.add(trafficMesh);
const CAR_COLORS = [0xd8463c, 0xe8e6df, 0x3f4a56, 0x2f6ea8, 0xd9a13b, 0x4f7c46, 0xb7bcc2];
let cars = [], _trafficTiles = -1;
const carDummy = new THREE.Object3D();
function syncTraffic() {
  for (let i = 0; i < cars.length; i++) {
    const p = carPose(cars[i]);
    carDummy.position.set(p.x, 0.75, p.y);
    carDummy.rotation.set(0, -p.rot, 0);
    carDummy.scale.set(4.4, 1.4, 2.0);
    carDummy.updateMatrix();
    trafficMesh.setMatrixAt(i, carDummy.matrix);
  }
  trafficMesh.instanceMatrix.needsUpdate = true;
}
function spawnTraffic(n) {
  cars = trafficCars(n);
  cars.forEach((c, i) => trafficMesh.setColorAt(i, tmpColor.set(CAR_COLORS[i % CAR_COLORS.length])));
  if (trafficMesh.instanceColor) trafficMesh.instanceColor.needsUpdate = true;
  trafficMesh.count = cars.length;
  document.body.dataset.cars = String(cars.length);
  syncTraffic();
  return cars.length;
}
/* ถ้าจำนวนไทล์ถนนเปลี่ยน → สร้างรถใหม่ (ไม่ทำทุกครั้งที่วางของ) */
function syncTrafficCount() {
  const n = roadNet().tiles.length;
  if (n === _trafficTiles) return cars.length;
  _trafficTiles = n;
  rebuildCrosswalks();
  rebuildSignals();
  return spawnTraffic(Math.min(TRAFFIC.max, n));
}

/* ---------- ทางม้าลาย (InstancedMesh, สร้างใหม่เมื่อเครือข่ายถนนเปลี่ยน) ---------- */
const CW_MAX = 600;
const cwMesh = new THREE.InstancedMesh(new THREE.BoxGeometry(1, 1, 1),
  new THREE.MeshBasicMaterial({ color: 0xf4f5ef }), CW_MAX);
cwMesh.frustumCulled = false;
cwMesh.count = 0;
scene.add(cwMesh);
const cwDummy = new THREE.Object3D();
function rebuildCrosswalks() {
  const bars = crosswalkBars();
  const n = Math.min(bars.length, CW_MAX);
  for (let i = 0; i < n; i++) {
    const b = bars[i];
    cwDummy.position.set(b.x, 0.215, b.y);
    cwDummy.rotation.set(0, 0, 0);
    cwDummy.scale.set(b.sx, 0.04, b.sz);
    cwDummy.updateMatrix();
    cwMesh.setMatrixAt(i, cwDummy.matrix);
  }
  cwMesh.count = n;
  cwMesh.instanceMatrix.needsUpdate = true;
  document.body.dataset.crosswalk = String(n);
  return n;
}

/* ---------- ป้ายร้าน + ไฟจราจร ---------- */
let signMesh = null, poleMesh = null, lampMesh = null, signalPhaseNow = '';
const signDummy = new THREE.Object3D();
function rebuildSigns() {
  if (signMesh) { instGrp.remove(signMesh); signMesh.dispose(); signMesh = null; }
  const spots = shopSignSpots();
  signMesh = new THREE.InstancedMesh(geoOf('box'), new THREE.MeshLambertMaterial({ color: 0xffffff }), Math.max(1, spots.length));
  signMesh.frustumCulled = false;
  instGrp.add(signMesh);
  spots.forEach((s, i) => {
    signDummy.position.set(s.x, s.y, s.z);
    signDummy.rotation.set(0, s.rot * Math.PI / 180, 0);
    signDummy.scale.set(s.w, s.hh, 0.24);
    signDummy.updateMatrix();
    signMesh.setMatrixAt(i, signDummy.matrix);
    signMesh.setColorAt(i, tmpColor.set(s.color));
  });
  signMesh.count = spots.length;
  signMesh.instanceMatrix.needsUpdate = true;
  if (signMesh.instanceColor) signMesh.instanceColor.needsUpdate = true;
  document.body.dataset.signs = String(spots.length);
  return spots.length;
}
function rebuildSignals() {
  if (poleMesh) { instGrp.remove(poleMesh); poleMesh.dispose(); poleMesh = null; }
  if (lampMesh) { instGrp.remove(lampMesh); lampMesh.dispose(); lampMesh = null; }
  const spots = signalSpots();
  poleMesh = new THREE.InstancedMesh(geoOf('box'), matOf(0x4a5058), Math.max(1, spots.length));
  lampMesh = new THREE.InstancedMesh(geoOf('box'), new THREE.MeshLambertMaterial({ color: 0xffffff }), Math.max(1, spots.length));
  poleMesh.frustumCulled = false; lampMesh.frustumCulled = false;
  instGrp.add(poleMesh, lampMesh);
  spots.forEach((s, i) => {
    signDummy.position.set(s.x, 1.6, s.y); signDummy.rotation.set(0, 0, 0);
    signDummy.scale.set(0.28, 3.2, 0.28); signDummy.updateMatrix();
    poleMesh.setMatrixAt(i, signDummy.matrix);
    signDummy.position.set(s.x, 3.35, s.y);
    signDummy.scale.set(0.5, 0.8, 0.5); signDummy.updateMatrix();
    lampMesh.setMatrixAt(i, signDummy.matrix);
    lampMesh.setColorAt(i, tmpColor.set(0x35c05a));
  });
  poleMesh.count = spots.length; lampMesh.count = spots.length;
  poleMesh.instanceMatrix.needsUpdate = true; lampMesh.instanceMatrix.needsUpdate = true;
  if (lampMesh.instanceColor) lampMesh.instanceColor.needsUpdate = true;
  signalPhaseNow = '';
  document.body.dataset.signals = String(spots.length);
  return spots.length;
}
function updateSignals(tSec) {
  if (!lampMesh || !lampMesh.count) return signalPhaseNow;
  const ph = signalPhase(tSec);
  if (ph === signalPhaseNow) return ph;
  signalPhaseNow = ph;
  const c = ph === 'green' ? 0x35c05a : ph === 'yellow' ? 0xe8b63a : 0xd8463c;
  for (let i = 0; i < lampMesh.count; i++) lampMesh.setColorAt(i, tmpColor.set(c));
  if (lampMesh.instanceColor) lampMesh.instanceColor.needsUpdate = true;
  document.body.dataset.signal = ph;
  return ph;
}

/* ---------- กรอบเลือก + preview ---------- */
const selGrp = new THREE.Group(); scene.add(selGrp); selGrp.visible = false;
const selMat = new THREE.MeshBasicMaterial({ color: 0x4fb6ff, transparent: true, opacity: 0.34, depthWrite: false });
const selPlate = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), selMat);
const selTop = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), selMat);
const selEdge = new THREE.LineSegments(new THREE.EdgesGeometry(new THREE.BoxGeometry(1, 1, 1)),
  new THREE.LineBasicMaterial({ color: 0x62c6ff, depthTest: false, transparent: true, opacity: 0.95 }));
selEdge.renderOrder = 20;
selGrp.add(selPlate, selTop, selEdge);
function updateSel() {
  const o = selected && objects.get(selected);
  if (!o) { selGrp.visible = false; return; }
  const d = dimsOf(o), h = visualHeight(o);
  const cx = (o.x + d.cw / 2) * CELL, cz = (o.y + d.ch / 2) * CELL;
  selGrp.visible = true;
  selPlate.position.set(cx, 0.2, cz);
  selPlate.scale.set(d.cw * CELL * 0.97, 0.3, d.ch * CELL * 0.97);
  selTop.position.set(cx, h + 0.3, cz);
  selTop.scale.set(d.cw * CELL * 0.97, 0.2, d.ch * CELL * 0.97);
  selEdge.position.set(cx, h / 2, cz);
  selEdge.scale.set(d.cw * CELL * 0.97, h, d.ch * CELL * 0.97);
}

const prevGrp = new THREE.Group(); scene.add(prevGrp);
const prevGeo = new THREE.BoxGeometry(1, 1, 1);
const prevOK = new THREE.MeshBasicMaterial({ color: 0x3fa9ff, transparent: true, opacity: 0.5, depthWrite: false });
const prevBAD = new THREE.MeshBasicMaterial({ color: 0xff4d4d, transparent: true, opacity: 0.62, depthWrite: false });
function clearPreview() { while (prevGrp.children.length) { const c = prevGrp.children.pop(); prevGrp.remove(c); } }
/* groups: [{ r:{x,y,w,h}, ok }] — 1 กรอบ = 1 กล่อง (1 ช่อง = 1 ม. จึงไม่วาดทีละช่อง) */
function showPreview(groups) {
  clearPreview();
  for (const g of groups) {
    if (!g || !g.r) continue;
    const m = new THREE.Mesh(prevGeo, g.ok ? prevOK : prevBAD);
    m.position.set((g.r.x + g.r.w / 2) * CELL, 0.24, (g.r.y + g.r.h / 2) * CELL);
    m.scale.set(g.r.w * CELL * 0.97, 0.22, g.r.h * CELL * 0.97);
    prevGrp.add(m);
  }
}

/* ---------- ไฮไลต์ของที่ขาดบริการ (ม่วง) ---------- */
const svcGrp = new THREE.Group(); scene.add(svcGrp);
const SVC_MAX = 1200;
const svcMesh = new THREE.InstancedMesh(new THREE.BoxGeometry(1, 1, 1),
  new THREE.MeshBasicMaterial({ color: 0x9b5cff, transparent: true, opacity: 0.5, depthWrite: false }), SVC_MAX);
svcMesh.frustumCulled = false; svcMesh.count = 0; svcGrp.add(svcMesh);
let showSvc = true;
const svcDummy = new THREE.Object3D();
function updateSvc() {
  const list = sim().unserved;
  let n = 0;
  for (const id of list) {
    const o = objects.get(id);
    if (!o) continue;
    if (n >= SVC_MAX) break;
    const d = dimsOf(o), cx = (o.x + d.cw / 2) * CELL, cz = (o.y + d.ch / 2) * CELL;
    svcDummy.position.set(cx, 0.28, cz);
    svcDummy.scale.set(d.cw * CELL * 0.96, 0.3, d.ch * CELL * 0.96);
    svcDummy.updateMatrix();
    svcMesh.setMatrixAt(n++, svcDummy.matrix);
  }
  svcMesh.count = n;
  svcMesh.instanceMatrix.needsUpdate = true;
  svcGrp.visible = showSvc && n > 0;
  document.body.dataset.unserved = String(n);
  return n;
}

/* ---------- ชี้ช่องจากนิ้ว ---------- */
const ray = new THREE.Raycaster();
const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), -0.1);
const ndc = new THREE.Vector2();
function cellAt(cx0, cy0) {
  const r = canvas.getBoundingClientRect();
  ndc.x = ((cx0 - r.left) / r.width) * 2 - 1;
  ndc.y = -((cy0 - r.top) / r.height) * 2 + 1;
  ray.setFromCamera(ndc, camera);
  const p = new THREE.Vector3();
  if (!ray.ray.intersectPlane(plane, p)) return null;
  const x = Math.floor(p.x / CELL), y = Math.floor(p.z / CELL);
  return inBounds(x, y) ? { x, y } : null;
}
/* ช่อง → พิกัดจอบน canvas (ใช้ใน self-test และปุ่มเลื่อน) */
function screenOfCell(cx, cy) {
  const v = new THREE.Vector3(cx * CELL + CELL / 2, 0.4, cy * CELL + CELL / 2).project(camera);
  const r = canvas.getBoundingClientRect();
  return { x: r.left + (v.x * 0.5 + 0.5) * r.width, y: r.top + (-v.y * 0.5 + 0.5) * r.height };
}

/* ================== สถานะ UI ================== */
let tool = null, selected = null, moveMode = false, rotDraft = 0;
const history = [];
let lastSpanSize = 250;
let tab = 'build';
const railEl = $('#rail'), inspEl = $('#insp');

function snapshot() { return { cols, rows, nextId, objects: [...objects.values()].map(o => Object.assign({}, o)) }; }
function pushHist() { history.push(snapshot()); if (history.length > 40) history.shift(); }
function restore(s) {
  cols = s.cols; rows = s.rows; nextId = s.nextId;
  objects.clear(); s.objects.forEach(o => objects.set(o.id, Object.assign({}, o)));
  reindex(); selected = null; moveMode = false;
  relayout();
}
function undo() {
  const s = history.pop();
  if (!s) return toast('ไม่มีอะไรให้ย้อน', '');
  restore(s);
  toast('ย้อน 1 ก้าว', 'ok');
}

let toastT = 0;
function toast(msg, kind) {
  toastEl.textContent = msg;
  toastEl.className = 'show ' + (kind || '');
  clearTimeout(toastT);
  toastT = setTimeout(() => { toastEl.className = ''; }, 2100);
}
function blocksX() { return Math.ceil(cols / CELLS_PER_BLOCK); }
function blocksY() { return Math.ceil(rows / CELLS_PER_BLOCK); }
function updateStats() {
  const n = objects.size, by = {};
  for (const o of objects.values()) by[o.type] = (by[o.type] || 0) + 1;
  const bld = ['house', 'townhouse', 'apartment', 'shop', 'market', 'office', 'mall', 'factory', 'warehouse']
    .reduce((a, t) => a + (by[t] || 0), 0);
  const road = (by.road || 0) + (by.road2 || 0) + (by.bridge || 0);
  const floors = [...objects.values()].reduce((a, o) => a + (o.floors || 1), 0);
  const s = sim();
  const usedM2 = usedArea(), totalM2 = cols * rows;
  $('#stats').innerHTML =
    `ตาราง <b>${cols}×${rows}</b> ม. · ${blocksX()}×${blocksY()} บล็อก (บล็อกละ ${CELLS_PER_BLOCK} ม.)<br>` +
    `<b>${n}</b> ชิ้น · อาคาร ${bld} · ถนน ${road} · รวม ${floors} ชั้น` +
    `<br>ใช้ที่ ${Math.round(usedM2).toLocaleString()} / ${totalM2.toLocaleString()} ตร.ม. (${Math.round(usedM2 / totalM2 * 100)}%)` +
    `<br>👥 คน <b>${s.pop}</b> · 💼 งาน <b>${s.jobs}</b> · 🚗 <b>${cars.length}</b> · ⚡ ${s.powerPct}% · 💧 ${s.waterPct}%` +
    (s.unserved.length ? ` · <span class="warn">⚠ ขาด ${s.unserved.length}</span>` : '');
  updateSvc();
}
function syncPalette() {
  railEl.querySelectorAll('.item').forEach(b => b.classList.toggle('on', b.dataset.type === tool));
}
function setTool(t) {
  tool = t;
  if (t) { selected = null; moveMode = false; }
  clearPreview(); syncPalette(); updateSel(); updateInspector();
  canvas.style.cursor = tool ? 'crosshair' : 'grab';
}
function toggleTool(t) {
  const same = tool === t;
  setTool(same ? null : t);
  toast(tool ? `เลือก ${PARTS[tool].name} (${PARTS[tool].w}×${PARTS[tool].h})` : 'ยกเลิกการเลือก — แตะของเพื่อแก้ไข / ซูมได้', tool ? 'ok' : '');
}
function renderRail() {
  const items = Object.values(PARTS).filter(p => (tab === 'build' ? p.cat === 'build' : p.cat !== 'build'));
  railEl.innerHTML = items.map(p =>
    `<button class="item" data-type="${p.id}" title="${p.name} · ${p.w}×${p.h} ม.${p.floors > 1 ? ' · ' + p.floors + ' ชั้น' : ''}" aria-label="${p.name}"><span class="ico">${p.icon}</span>` +
    `<span class="nm">${p.name}</span><span class="sz">${p.w}×${p.h}</span></button>`
  ).join('');
  railEl.querySelectorAll('.item').forEach(b => { b.onclick = () => toggleTool(b.dataset.type); });
  syncPalette();
}
function updateInspector() {
  const o = selected && objects.get(selected);
  if (!o) { inspEl.classList.remove('show'); return; }
  const P = PARTS[o.type], d = dimsOf(o);
  $('#iName').textContent = P.icon + ' ' + P.name;
  $('#iMeta').textContent = `${d.cw}×${d.ch} ช่อง · ${o.floors} ชั้น · ${o.rot}° · ที่ (${o.x},${o.y})` + (moveMode ? ' · กำลังย้าย' : '');
  const ev = evaluate(o.type, o.x, o.y, o.rot, o.id, o.floors);
  const st = $('#iSt');
  if (ev.ok) { st.className = 'st ok'; st.textContent = '✓ ผ่านกฎ · ' + hintOf(P); }
  else { st.className = 'st bad'; st.textContent = '⚠ ' + (ev.why || 'ไม่ผ่านกฎ') + ' — ย้าย/หมุน/ลบเพื่อแก้'; }
  const sv = serviceOf(o.id);
  if (sv) st.textContent += ` · ⚡${sv.power ? '✓' : '✗'} 💧${sv.water ? '✓' : '✗'} 🛣${sv.road ? '✓' : '✗'}`;
  st.dataset.ok = ev.ok ? '1' : '0';
  st.dataset.svc = sv ? (sv.ok ? '1' : '0') : '';
  inspEl.classList.add('show');
  $('#iMove').classList.toggle('on', moveMode);
}
function select(id) { selected = id; moveMode = false; updateSel(); updateInspector(); }
function afterChange() { rebuildRender(); updateStats(); updateSel(); updateInspector(); syncPalette(); syncTrafficCount(); }
function relayout() {
  const s = worldSize();
  const oldSpan = lastSpanSize || s.span;
  lastSpanSize = s.span;
  buildWorld();
  sun.position.set(s.cx - s.span * 0.95, s.span * 1.4, s.cz - s.span * 0.6);
  sun.target.position.set(s.cx, 0, s.cz);
  const ext = s.span * 0.85;
  Object.assign(sun.shadow.camera, { left: -ext, right: ext, top: ext, bottom: -ext, near: 10, far: s.span * 5 + 400 });
  sun.shadow.camera.updateProjectionMatrix();
  scene.fog = new THREE.Fog(0xd3e3f0, s.span * 1.8, s.span * 4.2);
  fill.position.set(s.cx + s.span, s.span * 0.8, s.cz + s.span);
  cam.dist = clampD(cam.dist * (s.span / oldSpan));
  applyCam();
  afterChange();
}

/* ---------- palette tabs ---------- */
document.querySelectorAll('.tab').forEach(b => {
  b.onclick = () => {
    tab = b.dataset.tab;
    document.querySelectorAll('.tab').forEach(x => x.classList.toggle('on', x === b));
    renderRail(); syncPalHeight(); clearPreview();
  };
});

/* ---------- inspector ---------- */
function rotSelected() {
  const o = objects.get(selected); if (!o) return;
  pushHist();
  const r = rotate(selected);
  if (!r.ok) { history.pop(); return toast('หมุนไม่ได้: ' + r.why, 'bad'); }
  afterChange(); toast(`หมุน ${o.rot}°`, 'ok');
}
function delSelected() {
  if (!selected) return;
  pushHist();
  const r = remove(selected);
  if (!r.ok) { history.pop(); return toast(r.why, 'bad'); }
  const nm = PARTS[objects.get(selected) ? objects.get(selected).type : 'road'];
  selected = null; moveMode = false; afterChange(); toast('ลบแล้ว', 'ok');
}
function moveAnchor(id, c) {
  const d = dimsOf(objects.get(id));
  return { x: c.x - Math.floor((d.cw - 1) / 2), y: c.y - Math.floor((d.ch - 1) / 2) };
}
/* เงาตัวอย่างตอนจะย้าย (ใช้ทั้งโหมดย้ายด้วยปุ่ม และลากชิ้นของ) */
function movePreview(id, c) {
  const o = objects.get(id); if (!o || !c) return;
  const a = moveAnchor(id, c);
  const ev = evaluate(o.type, a.x, a.y, o.rot, id, o.floors);
  showPreview([{ r: { x: a.x, y: a.y, w: ev.d.cw, h: ev.d.ch }, ok: ev.ok }]);
}
/* เลื่อนชิ้นที่เลือก 1 ช่อง (ลูกศร / ปุ่ม) */
function nudge(dx, dy) {
  const o = objects.get(selected); if (!o) return;
  const ev = evaluate(o.type, o.x + dx, o.y + dy, o.rot, o.id, o.floors);
  if (!ev.ok) return toast('เลื่อนไม่ได้: ' + ev.why, 'bad');
  pushHist();
  const r = move(o.id, o.x + dx, o.y + dy, o.rot);
  if (!r.ok) { history.pop(); return toast('เลื่อนไม่ได้: ' + r.why, 'bad'); }
  moveMode = false; afterChange(); clearPreview(); toast(`เลื่อนไป (${o.x},${o.y})`, 'ok');
}
function doMove(id, c) {
  const o = objects.get(id); if (!o) return;
  const a = moveAnchor(id, c);
  const ev = evaluate(o.type, a.x, a.y, o.rot, id, o.floors);
  if (!ev.ok) return toast('ย้ายไม่ได้: ' + ev.why, 'bad');
  pushHist();
  const r = move(id, a.x, a.y, o.rot);
  if (!r.ok) { history.pop(); return toast('ย้ายไม่ได้: ' + r.why, 'bad'); }
  moveMode = false; afterChange(); clearPreview(); toast('ย้ายแล้ว', 'ok');
}
$('#iRot').onclick = rotSelected;
$('#iDel').onclick = delSelected;
$('#iClose').onclick = () => { select(null); clearPreview(); };
$('#iMove').onclick = () => {
  if (!selected) return;
  moveMode = !moveMode;
  updateInspector();
  toast(moveMode ? 'โหมดย้าย — แตะตำแหน่งใหม่บนพื้น' : 'ยกเลิกโหมดย้าย', moveMode ? 'ok' : '');
};

/* ---------- ปุ่มขยายพื้นที่ ---------- */
function doExpand(kind) {
  if (kind === 'row' && rows >= CAP) return toast('ถึงเพดาน 60×60 ช่องแล้ว', 'bad');
  if (kind === 'col' && cols >= CAP) return toast('ถึงเพดาน 60×60 ช่องแล้ว', 'bad');
  pushHist();
  expand(kind);
  relayout();
  toast(`${kind === 'row' ? 'เพิ่ม 5 แถว' : 'เพิ่ม 5 คอลัมน์'} → ${cols}×${rows} ช่อง (${blocksX()}×${blocksY()} บล็อก)`, 'ok');
}
$('#btnRow').onclick = () => doExpand('row');
$('#btnCol').onclick = () => doExpand('col');
$('#btnSvc').onclick = () => {
  showSvc = !showSvc; updateSvc();
  toast(showSvc ? 'แสดงไฮไลต์ของที่ขาดบริการ (ม่วง)' : 'ซ่อนไฮไลต์ของที่ขาดบริการ', showSvc ? 'ok' : '');
};
$('#btnTheme').onclick = () => {
  const r = setTheme(nextTheme());
  toast('ธีม: ' + r.name + ' (แตะซ้ำเพื่อเปลี่ยน)', 'ok');
};
$('#btnShot').onclick = () => {
  const on = setShot();
  toast(on ? 'โหมดภาพ: ซ่อน UI — กด Esc เพื่อกลับ' : 'กลับมาโหมดแก้ไข', on ? 'ok' : '');
};
addEventListener('keydown', e => { if (e.key === 'Escape' && shotMode) { setShot(false); toast('กลับมาโหมดแก้ไข', 'ok'); } });

/* ---------- บันทึก / โหลด / ส่งออก / นำเข้า ---------- */
const LS_KEY = 'polycity.v4.save';
function applyLoad(json, label) {
  const r = load(json);
  if (!r.ok) return toast('โหลดไม่ได้: ' + r.why, 'bad');
  history.length = 0; selected = null; moveMode = false;
  relayout();
  toast(`${label} · ${r.count} ชิ้น${r.skipped ? ` (ข้าม ${r.skipped})` : ''}`, 'ok');
}
function saveLS() {
  try {
    localStorage.setItem(LS_KEY, JSON.stringify(serialize()));
    toast(`บันทึกแล้ว · ${objects.size} ชิ้น (${cols}×${rows})`, 'ok');
  } catch (e) { toast('บันทึกไม่ได้: ' + e.message, 'bad'); }
}
function loadLS() {
  let s = null;
  try { s = localStorage.getItem(LS_KEY); } catch (e) { }
  if (!s) return toast('ยังไม่มีเซฟในเครื่อง — กดบันทึกก่อน', 'bad');
  applyLoad(s, 'โหลดจากเครื่อง');
}
function exportJSON() {
  const data = JSON.stringify(serialize(), null, 1);
  try {
    const blob = new Blob([data], { type: 'application/json' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url; a.download = 'polycity-city.json';
    document.body.appendChild(a); a.click();
    setTimeout(() => { a.remove(); URL.revokeObjectURL(url); }, 1500);
    toast(`ส่งออก ${objects.size} ชิ้น (${Math.round(data.length / 1024)} KB)`, 'ok');
  } catch (e) { toast('ส่งออกไม่ได้: ' + e.message, 'bad'); }
}
$('#btnSave').onclick = saveLS;
$('#btnLoad').onclick = loadLS;
$('#btnExport').onclick = exportJSON;
$('#btnImport').onclick = () => $('#fileIn').click();
$('#fileIn').onchange = e => {
  const f = e.target.files && e.target.files[0];
  if (!f) return;
  const rd = new FileReader();
  rd.onload = () => applyLoad(String(rd.result), 'นำเข้า ' + f.name);
  rd.onerror = () => toast('อ่านไฟล์ไม่ได้', 'bad');
  rd.readAsText(f);
  e.target.value = '';
};
$('#btnClear').onclick = () => {
  if (!objects.size) return toast('ว่างอยู่แล้ว', '');
  pushHist();
  objects.clear(); reindex(); selected = null; moveMode = false;
  afterChange(); toast('ล้างเมืองแล้ว (กด ↶ ย้อนได้)', 'ok');
};
$('#btnUndo').onclick = undo;
$('#btnMenu').onclick = () => {
  const m = $('#menu');
  m.classList.toggle('show');
  $('#btnMenu').classList.toggle('on', m.classList.contains('show'));
};
canvas.addEventListener('pointerdown', () => $('#menu').classList.remove('show'), { passive: true });

/* ---------- มุมกล้อง / ซูม ---------- */
$('#zin').onclick = () => zoomTo(cam.dist * 0.78);
$('#zout').onclick = () => zoomTo(cam.dist * 1.28);
$('#zfit').onclick = () => { cam.az = -0.92; cam.polar = 0.92; cam.px = 0; cam.pz = 0; zoomTo(worldSize().span * 1.28); };
$('#btnView').onclick = e => {
  const top = cam.polar > 0.5;
  cam.polar = top ? 0.16 : 0.92;
  cam.dist = clampD(worldSize().span * (top ? 1.05 : 1.28));
  e.currentTarget.classList.toggle('on', top);
  applyCam();
};

/* ---------- วางของ: แตะ = 1 ชิ้น · ลาก = ต่อเนื่อง ---------- */
function anchorFor(type, c) {
  const d = dimsOf({ type, w: PARTS[type].w, h: PARTS[type].h, rot: rotDraft });
  return { x: c.x - Math.floor((d.cw - 1) / 2), y: c.y - Math.floor((d.ch - 1) / 2) };
}
function hoverPreview(c) {
  if (!tool) { clearPreview(); return; }
  const a = anchorFor(tool, c);
  const ev = evaluate(tool, a.x, a.y, rotDraft);
  showPreview([{ r: { x: a.x, y: a.y, w: ev.d.cw, h: ev.d.ch }, ok: ev.ok }]);
}
function tapPlace(c) {
  if (!tool) return;
  const a = anchorFor(tool, c);
  const ev = evaluate(tool, a.x, a.y, rotDraft);
  if (!ev.ok) return toast('วางไม่ได้: ' + ev.why, 'bad');
  pushHist();
  const r = place(tool, a.x, a.y, { rot: rotDraft });
  if (!r.ok) { history.pop(); return toast('วางไม่ได้: ' + r.why, 'bad'); }
  afterChange();
  const big = ev.d.cw > 1 || ev.d.ch > 1;
  toast(`วาง ${PARTS[tool].name}${big ? ` ${ev.d.cw}×${ev.d.ch}` : ''}`, 'ok');
  try { navigator.vibrate && navigator.vibrate(12); } catch (e) { }
}
let stroke = null;
function startStroke(c) {
  if (!c || !tool) return;
  const d = dimsOf({ type: tool, w: PARTS[tool].w, h: PARTS[tool].h, rot: rotDraft });
  const tile = !!PARTS[tool].tile;                       // ของปูพื้น (ถนน/ทางเดิน) ลากต่อเนื่องได้
  stroke = { type: tool, rot: rotDraft, multi: !tile && (d.cw > 1 || d.ch > 1), cells: new Map() };
  addToStroke(c);
}
function addToStroke(c) {
  if (!stroke || !c) return;
  const a = anchorFor(stroke.type, c);
  if (stroke.multi) stroke.cells.clear();
  const k = `${a.x},${a.y}`;
  if (stroke.cells.has(k)) return;
  const ev = evaluate(stroke.type, a.x, a.y, stroke.rot);
  stroke.cells.set(k, { x: a.x, y: a.y, ok: ev.ok, why: ev.why, r: { x: a.x, y: a.y, w: ev.d.cw, h: ev.d.ch } });
  showPreview([...stroke.cells.values()]);
}
function commitStroke() {
  if (!stroke) { clearPreview(); return; }
  const list = [...stroke.cells.values()];
  const good = list.filter(v => v.ok), bad = list.find(v => !v.ok);
  if (!good.length) {
    toast('วางไม่ได้: ' + (bad ? bad.why : 'ไม่อยู่ในพื้นที่'), 'bad');
    stroke = null; clearPreview(); return;
  }
  pushHist();
  let n = 0;
  good.forEach(v => { if (place(stroke.type, v.x, v.y, { rot: stroke.rot }).ok) n++; });
  afterChange();
  toast(`วาง ${PARTS[stroke.type].name} ${n} ชิ้น` + (bad ? ' (ข้ามช่องที่วางไม่ได้)' : ''), 'ok');
  stroke = null; clearPreview();
}
function tapSelect(c) {
  const id = atCell(c.x, c.y);
  if (id) { select(id); toast(`${PARTS[objects.get(id).type].name} — ใช้ปุ่มมุมขวาแก้ไข`, ''); }
  else { select(null); clearPreview(); }
}

/* ---------- อินพุต ---------- */
const pointers = new Map();
let mode = 'idle', startPt = null, lastCell = null, pressId = null;
let pinchStart = 0, pinchBase = 0, pinchPrev = null;
const d2 = (a, b) => Math.hypot(a.x - b.x, a.y - b.y);
canvas.style.cursor = 'grab';

canvas.addEventListener('pointerdown', e => {
  try { canvas.setPointerCapture && canvas.setPointerCapture(e.pointerId); } catch (_) { }
  pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });
  if (pointers.size === 2) {                       // สองนิ้ว = ซูม/เลื่อน (ห้ามวางของ)
    if (stroke) { stroke = null; clearPreview(); }
    const p = [...pointers.values()];
    mode = 'pinch'; pinchStart = Math.max(20, d2(p[0], p[1])); pinchBase = cam.dist;
    pinchPrev = { x: (p[0].x + p[1].x) / 2, y: (p[0].y + p[1].y) / 2 };
    return;
  }
  if (pointers.size > 2) { mode = 'pinch'; return; }
  if (e.button === 2 || e.shiftKey || e.altKey) { mode = 'orbit'; startPt = { x: e.clientX, y: e.clientY }; return; }
  mode = 'pending'; startPt = { x: e.clientX, y: e.clientY }; lastCell = null;
  pressId = null;
  if (!tool) {                                    // กดบนชิ้นของ → เลือก + ลากย้ายได้เลย
    const c0 = cellAt(e.clientX, e.clientY);
    if (c0) pressId = atCell(c0.x, c0.y) || null;
  }
});

canvas.addEventListener('pointermove', e => {
  if (pointers.has(e.pointerId)) pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });

  if (mode === 'pinch') {
    const p = [...pointers.values()];
    if (p.length < 2) return;
    const d = Math.max(20, d2(p[0], p[1]));
    cam.dist = clampD(pinchBase * (pinchStart / d));
    const mx = (p[0].x + p[1].x) / 2, my = (p[0].y + p[1].y) / 2;
    const k = cam.dist / 900;
    cam.px -= (mx - pinchPrev.x) * k;
    cam.pz -= (my - pinchPrev.y) * k;
    pinchPrev = { x: mx, y: my };
    applyCam(); return;
  }
  if (mode === 'orbit') {
    cam.az -= (e.clientX - startPt.x) * 0.008;
    cam.polar = Math.min(1.45, Math.max(0.16, cam.polar - (e.clientY - startPt.y) * 0.006));
    startPt = { x: e.clientX, y: e.clientY }; applyCam(); return;
  }
  if (mode === 'pending') {
    if (d2(startPt, { x: e.clientX, y: e.clientY }) < 9) return;   // กันนิ้วสั่น
    if (tool) { mode = 'paint'; startStroke(cellAt(startPt.x, startPt.y)); }
    else if (pressId) { mode = 'dragmove'; if (selected !== pressId) select(pressId); movePreview(pressId, cellAt(e.clientX, e.clientY)); }
    else { mode = 'orbit'; startPt = { x: e.clientX, y: e.clientY }; }
    return;
  }
  if (mode === 'dragmove') {
    const c = cellAt(e.clientX, e.clientY);
    if (c) movePreview(pressId, c); else clearPreview();
    return;
  }
  if (mode === 'paint') {
    const c = cellAt(e.clientX, e.clientY);
    if (c && (!lastCell || c.x !== lastCell.x || c.y !== lastCell.y)) { addToStroke(c); lastCell = c; }
    return;
  }
  // hover (เมาส์/นิ้วลอย)
  const c = cellAt(e.clientX, e.clientY);
  if (!c) { clearPreview(); return; }
  if (tool) { hoverPreview(c); return; }
  if (moveMode && selected) movePreview(selected, c);
  else clearPreview();
});

function pointerEnd(e) {
  pointers.delete(e.pointerId);
  if (mode === 'pinch') { if (!pointers.size) mode = 'idle'; return; }
  if (mode === 'dragmove') {
    const pid = pressId, c = cellAt(e.clientX, e.clientY);
    pressId = null;
    if (pid && c) {
      const o = objects.get(pid), a = o ? moveAnchor(pid, c) : null;
      if (o && a && a.x === o.x && a.y === o.y) { clearPreview(); toast('ชิ้นนี้อยู่ตรงนี้แล้ว', ''); }
      else doMove(pid, c);
    } else clearPreview();
    mode = 'idle'; startPt = null; lastCell = null; return;
  }
  if (mode === 'pending') {
    const c = cellAt(e.clientX, e.clientY);
    if (tool && c) tapPlace(c);
    else if (!tool && c) { if (moveMode && selected) doMove(selected, c); else tapSelect(c); }
    else if (!tool && !c) { select(null); clearPreview(); }
    mode = 'idle'; startPt = null; lastCell = null; return;
  }
  if (mode === 'paint') { commitStroke(); mode = 'idle'; startPt = null; lastCell = null; return; }
  mode = 'idle'; startPt = null;
}
canvas.addEventListener('pointerup', pointerEnd);
canvas.addEventListener('pointercancel', e => {
  pointers.delete(e.pointerId);
  if (mode === 'paint' || mode === 'dragmove') { stroke = null; clearPreview(); }
  pressId = null;
  mode = pointers.size ? mode : 'idle'; lastCell = null;
});
canvas.addEventListener('contextmenu', e => e.preventDefault());
canvas.addEventListener('wheel', e => {
  e.preventDefault();
  zoomTo(cam.dist * (1 + Math.sign(e.deltaY) * 0.1));
}, { passive: false });

/* ---------- คีย์บอร์ด ---------- */
addEventListener('keydown', e => {
  const tag = (e.target && e.target.tagName) || '';
  if (tag === 'INPUT' || tag === 'TEXTAREA') return;
  if (e.key === 'Escape') { if (tool) toggleTool(tool); else { select(null); clearPreview(); } return; }
  if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'z') { e.preventDefault(); undo(); return; }
  if (e.key === 'Delete' || e.key === 'Backspace') { e.preventDefault(); delSelected(); return; }
  if (e.key === 'r' || e.key === 'R') {
    if (selected) rotSelected();
    else { rotDraft = normRot(rotDraft + 90); clearPreview(); toast(`ชิ้นใหม่หัน ${rotDraft}°`, ''); }
    return;
  }
  if (e.key === '+' || e.key === '=') { zoomTo(cam.dist * 0.85); return; }
  if (e.key === '-' || e.key === '_') { zoomTo(cam.dist * 1.18); return; }
  if (selected && e.key.indexOf('Arrow') === 0) {
    e.preventDefault();
    const dx = e.key === 'ArrowLeft' ? -1 : e.key === 'ArrowRight' ? 1 : 0;
    const dy = e.key === 'ArrowUp' ? -1 : e.key === 'ArrowDown' ? 1 : 0;
    nudge(dx, dy); return;
  }
  const n = parseInt(e.key, 10);
  if (n >= 1 && n <= 8) {
    const items = railEl.querySelectorAll('.item');
    if (items[n - 1]) items[n - 1].click();
  }
});

function resize() {
  camera.aspect = innerWidth / innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(innerWidth, innerHeight, false);
}
addEventListener('resize', resize);

/* ---------- loop + snap ---------- */
let snapImg = null, snapSrc = null;
if (SNAP) {
  snapImg = document.createElement('img');
  snapImg.style.cssText = 'position:fixed;inset:0;width:100%;height:100%;z-index:3;object-fit:cover;background:#cfe0ee';
  document.body.appendChild(snapImg);
  snapSrc = document.createElement('canvas');
  canvas.style.visibility = 'hidden';
}
function snapNow() {
  if (!SNAP || !snapImg) return;
  renderer.render(scene, camera);
  snapSrc.width = renderer.domElement.width; snapSrc.height = renderer.domElement.height;
  snapSrc.getContext('2d').drawImage(renderer.domElement, 0, 0);
  snapImg.src = snapSrc.toDataURL('image/jpeg', 0.9);
}
let lastT = 0, fSum = 0, fCount = 0, frameNo = 0;
function renderLoop(t) {
  const dt = lastT ? Math.min(0.05, (t - lastT) / 1000) : 0;
  if (dt > 0 && cars.length) { stepCars(cars, dt); syncTraffic(); }
  if (t) updateSignals(t / 1000);
  renderer.render(scene, camera);
  frameNo++;
  if (lastT) {
    fSum += Math.min(300, t - lastT); fCount++;
    if (fCount >= 30) {
      document.body.dataset.fps = String(Math.round(30000 / Math.max(1, fSum)));
      document.body.dataset.calls = String(renderer.info.render.calls);
      document.body.dataset.tris = String(renderer.info.render.triangles);
      document.body.dataset.objects = String(objects.size);
      fSum = 0; fCount = 0;
    }
  }
  lastT = t;
  requestAnimationFrame(renderLoop);
}

/* ================== demo / perf ================== */
/* demo: เมือง 200×250 ม. — ถนน 5 ม. ทุก 50 ม. · ในบล็อกเหลือ 45×45 ม. · อาคารขนาดจริง */
function demo() {
  reset(200, 250); relayout(); history.length = 0;
  let seed = 7;
  const rnd = () => (seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff;
  const B = CELLS_PER_BLOCK, RW = PARTS.road.w;
  const tryAt = (list, x, y, rot) => {
    for (const t of list) if (evaluate(t, x, y, rot || 0).ok) return place(t, x, y, { rot: rot || 0 }).ok;
    return false;
  };
  // 1) ถนน 5 ม. ทุก 50 ม.
  for (let X = 0; X + RW <= cols; X += B) for (let y = 0; y + RW <= rows; y += RW) place('road', X, y);
  for (let Y = 0; Y + RW <= rows; Y += B) for (let x = 0; x + RW <= cols; x += RW) place('road', x, Y);
  // 2) สวนน้ำ + สะพานบนถนนเส้น x=50
  for (let i = 0; i < 3; i++) for (let j = 0; j < 3; j++) place('water', 55 + i * 10, 55 + j * 10);
  place('bridge', 50, 55);
  // 3) โรงไฟฟ้า/หอเก็บน้ำ: สลับบล็อก (รัศมี 130/110 ม. → ทุกบล็อกมีครบ)
  const util = (bx, by) => ((bx + by) / CELLS_PER_BLOCK) % 2 === 0;
  // 4) อาคารริมถนนในแต่ละบล็อก + ใจกลางบล็อกเป็นสวน
  const curbSets = [
    ['house', 'townhouse', 'shop', 'apartment', 'office'],
    ['shop', 'townhouse', 'house', 'office', 'market'],
    ['apartment', 'house', 'townhouse', 'shop', 'mall'],
    ['townhouse', 'shop', 'house', 'apartment', 'warehouse'],
  ];
  const inner = ['park', 'tree', 'plaza', 'tree'];
  for (let by = 0; by + B <= rows; by += B) for (let bx = 0; bx + B <= cols; bx += B) {
    const x0 = bx + RW, y0 = by + RW, x1 = bx + B - RW, y1 = by + B - RW;
    if (util(bx, by)) tryAt(['plant'], bx + 10, by + 10); else tryAt(['watertower'], bx + 30, by + 30);
    const curb = curbSets[((bx + by) / B) % 4];
    for (let x = x0; x < x1 - 6; x += 10) { tryAt(curb, x, y0); tryAt(curb, x, y1 - 12); }
    for (let y = y0 + 12; y < y1 - 6; y += 12) { tryAt(curb, x0, y); tryAt(curb, x1 - 10, y); }
    for (let y = y0 + 2; y < y1 - 4; y += 8) for (let x = x0 + 2; x < x1 - 4; x += 8) {
      if (atCell(x, y)) continue;
      tryAt(inner, x, y);
    }
  }
  // 5) ของริมถนน: โคม / รถจอด / ป้าย / ป้ายรถเมล์
  for (let y = 0; y + 4 <= rows; y += 5) for (let x = 0; x + 4 <= cols; x += 5) {
    if (atCell(x, y) || rnd() < 0.55) continue;
    const r = rnd();
    const t = r < 0.35 ? 'lamp' : r < 0.6 ? 'car' : r < 0.72 ? 'sign' : r < 0.84 ? 'busstop' : 'bus';
    tryAt([t], x, y, r < 0.5 ? 0 : 90);
  }
  afterChange(); clearPreview();
  return objects.size;
}
function perfFill(n) {
  reset(300, 300); relayout(); history.length = 0;
  const ones = ['road', 'tree', 'lamp', 'car', 'house', 'sign', 'busstop', 'park', 'shop'];
  let i = 0;
  for (let y = 0; y < 300 && i < n; y += 4) for (let x = 0; x < 300 && i < n; x += 4) {
    const t = ones[i % ones.length];
    const o = { id: 'o' + (nextId++), type: t, x, y, w: PARTS[t].w, h: PARTS[t].h, rot: (i % 4) * 90, floors: PARTS[t].floors || 1, on: true };
    objects.set(o.id, o); i++;
  }
  reindex(); afterChange();
  return objects.size;
}

/* ================== self-test ================== */
window.__b = {
  PARTS, City, place, evaluate, serialize, load, reset, move, moveTo, rotate, remove, expand, select,
  screenOfCell, nudge, movePreview, hintOf, sim, simCity, serviceOf, SIM, CAPS, svcMesh, svcGrp,
  get showSvc() { return showSvc; },
  get objects() { return objects; }, get cols() { return cols; }, get rows() { return rows; },
  demo, perfFill, undo,
  selftest() {
    const out = [];
    const ok = (name, cond, extra) => out.push((cond ? 'PASS' : 'FAIL') + ' · ' + name + (extra ? ' — ' + extra : ''));
    const area = id => { const o = objects.get(id); if (!o) return 0; const d = dimsOf(o); return d.cw * d.ch; };
    const tev = (type, id, x, y) => canvas.dispatchEvent(new PointerEvent(type, {
      pointerId: id, clientX: x, clientY: y, bubbles: true, cancelable: true, pointerType: 'touch', isPrimary: id === 1
    }));

    /* --- 1) แคตตาล็อก --- */
    reset(); relayout(); setTool(null);
    ok('แคตตาล็อก ≥18 ชนิด', Object.keys(PARTS).length >= 18, Object.keys(PARTS).length + ' ชนิด');
    ok('ทุกชนิดมีชื่อไทย + ขนาด + rule()', Object.values(PARTS).every(p => p.name && p.w > 0 && p.h > 0 && typeof p.rule === 'function'));
    const sizes = [...new Set(Object.values(PARTS).map(p => p.w + '×' + p.h))];
    ok('มีขนาดหลากหลาย ≥8 แบบ (หน่วยเมตร)', sizes.length >= 8, sizes.join(', '));
    ok('สเกลจริง: รถ 5×2 · รถเมล์ 12×3 · ถนนกว้าง 5 ม.', PARTS.car.w === 5 && PARTS.car.h === 2 && PARTS.bus.w === 12 && PARTS.bus.h === 3 && PARTS.road.w === 5);
    ok('สเกลจริง: บ้าน 10×9 · ตึกแถว 6×12 · ห้าง 36×36 ม.', PARTS.house.w === 10 && PARTS.house.h === 9 && PARTS.townhouse.w === 6 && PARTS.townhouse.h === 12 && PARTS.mall.w === 36);
    ok('1 ช่อง = 1 ม. · บล็อก 50 ม.', CELL === 1 && CELLS_PER_BLOCK === 50);
    ok('มี 3 หมวด (อาคาร/อุปกรณ์/ธรรมชาติ)', ['build', 'equip', 'nature'].every(c => Object.values(PARTS).some(p => p.cat === c)));

    /* --- 2) กติกา (1 ช่อง = 1 ม.) --- */
    reset(); relayout();
    ok('ถนนวางได้ทุกที่', evaluate('road', 10, 10, 0).ok);
    place('road', 0, 10);                                            // ถนน 5×5 อยู่ที่ x=0..4
    ok('บ้านไม่ติดถนน → ไม่ผ่าน', !evaluate('house', 30, 10, 0).ok, evaluate('house', 30, 10, 0).why);
    ok('บ้านติดถนน → ผ่าน', evaluate('house', 5, 10, 0).ok, evaluate('house', 5, 10, 0).why);
    ok('สะพานไม่มีน้ำ → ไม่ผ่าน', !evaluate('bridge', 60, 60, 0).ok, evaluate('bridge', 60, 60, 0).why);
    place('water', 70, 60);
    ok('สะพานมีน้ำข้างๆ → ผ่าน', evaluate('bridge', 80, 60, 0).ok, evaluate('bridge', 80, 60, 0).why || 'ok');
    place('road', 100, 100);
    ok('โรงงานติดถนนแต่ไม่มีไฟ → ไม่ผ่าน', !evaluate('factory', 105, 100, 0).ok, evaluate('factory', 105, 100, 0).why);
    place('plant', 140, 100);
    ok('มีโรงไฟฟ้าใกล้ๆ → โรงงานผ่าน', evaluate('factory', 105, 100, 0).ok, evaluate('factory', 105, 100, 0).why);
    ok('รถยนต์ไม่ติดถนน → ไม่ผ่าน', !evaluate('car', 150, 200, 0).ok, evaluate('car', 150, 200, 0).why);

    /* --- 3) พื้นที่ (occupancy แบบกรอบ) --- */
    reset(); relayout();
    place('road', 0, 10);
    const ap = place('apartment', 5, 10, { rot: 0 });
    ok('วางอพาร์ตเมนต์ติดถนนได้', ap.ok, ap.why || 'ok');
    ok('อพาร์ตเมนต์ 18×18 = 324 ตร.ม.', area(ap.id) === 324, area(ap.id) + ' ตร.ม.');
    ok('วางทับ 1 ม. ของอพาร์ตเมนต์ → ไม่ผ่าน', !evaluate('tree', 6, 11, 0).ok, evaluate('tree', 6, 11, 0).why);
    ok('วางทับทั้งผืน → ไม่ผ่าน', !evaluate('apartment', 5, 10, 0).ok, evaluate('apartment', 5, 10, 0).why);
    ok('ห้าง 36×36 = 1,296 ตร.ม.', (() => {
      reset(); relayout(); place('road', 0, 5);
      const m = place('mall', 5, 5, { rot: 0 }); return m.ok && area(m.id) === 1296;
    })(), 'mall');
    ok('ถนน 5×5 = 25 ตร.ม.', (() => { reset(); relayout(); place('road', 0, 0); return usedArea() === 25; })(), usedArea() + ' ตร.ม.');
    ok('ลบแล้วคืนพื้นที่ครบ', (() => {
      reset(); relayout(); place('road', 0, 10);
      const a = place('apartment', 5, 10, { rot: 0 });
      const before = usedArea(); remove(a.id);
      return area(a.id) === 0 && usedArea() === before - 324;
    })(), 'apartment');

    /* --- 4) หมุน / ย้าย --- */
    reset(); relayout();
    place('road', 0, 11);
    const bus = place('bus', 5, 12, { rot: 0 });
    ok('รถเมล์ 12×3 ม.', bus.ok && dimsOf(objects.get(bus.id)).cw === 12 && dimsOf(objects.get(bus.id)).ch === 3, dimsOf(objects.get(bus.id)).cw + '×' + dimsOf(objects.get(bus.id)).ch);
    const busD = dimsOf({ type: 'bus', w: 12, h: 3, rot: 90 });
    ok('rot 90° → footprint สลับเป็น 3×12', busD.cw === 3 && busD.ch === 12, busD.cw + '×' + busD.ch);
    place('road', 0, 50); const ap2 = place('apartment', 5, 50);
    const rt = rotate(ap2.id);
    ok('ปุ่มหมุน 90° (ของจตุรัส) → ผ่าน + rot=90', !!rt.ok && objects.get(ap2.id).rot === 90, rt.ok ? '' : 'why=' + rt.why);
    const t1 = place('tree', 100, 100), t2 = place('tree', 120, 120);
    ok('ย้ายไปทับของเดิม → ไม่ผ่าน', !moveTo(t1.id, 121, 121).ok, moveTo(t1.id, 121, 121).why);
    ok('ย้ายไปที่ว่าง → ผ่าน', moveTo(t1.id, 140, 100).ok);
    ok('ย้ายของหลายช่องไปชิดขอบ → ไม่ผ่าน', !moveTo(bus.id, cols - 1, 0).ok, moveTo(bus.id, cols - 1, 0).why);

    /* --- 5) ขยายพื้นที่ --- */
    reset(); relayout();
    place('tree', 1, 1);
    const r0 = rows, c0 = cols;
    expand('row');
    ok('ขยายแถวแล้ว rows +50 จริง', rows === r0 + CELLS_PER_BLOCK, `${r0}→${rows}`);
    expand('col');
    ok('ขยายคอลัมน์แล้ว cols +50 จริง', cols === c0 + CELLS_PER_BLOCK, `${c0}→${cols}`);
    ok('ขยายแล้วของเดิมยังอยู่', objects.size === 1 && [...objects.values()][0].x === 1);
    ok('เพดาน 400×400 ม.', (() => { let g = 0; while (expand('row').ok && g++ < 40) { } return rows === CAP; })(), `${cols}×${rows}`);
    expand('row');
    ok('ขยายเกินเพดาน → ถูกปฏิเสธ', rows === CAP);

    /* --- 6) save → load --- */
    reset(); relayout();
    place('road', 2, 2); place('house', 7, 2); place('tree', 20, 20);
    const sig = () => [...objects.values()].map(o => [o.id, o.type, o.x, o.y, o.rot].join(',')).sort().join('|');
    const before = sig(), beforeN = objects.size;
    const js = JSON.stringify(serialize());
    load(js);
    ok('save→load จำนวน object เท่าเดิม', objects.size === beforeN, `${beforeN}→${objects.size}`);
    ok('save→load id/type/x/y/rot ตรงกัน', sig() === before, sig() === before ? '' : 'ไม่ตรง');
    ok('localStorage บันทึกได้', (() => { try { localStorage.setItem('polycity.test', js); localStorage.removeItem('polycity.test'); return true; } catch (e) { return false; } })());

    /* --- 7) ท่าทางเดิม (แตะ / ลาก / สองนิ้ว / ปุ่มซ้ำ / ย้อน) --- */
    reset(); relayout(); setTool('road'); history.length = 0;
    const rc = canvas.getBoundingClientRect(), mx = rc.left + rc.width / 2, my = rc.top + rc.height / 2;
    tev('pointerdown', 1, mx, my); tev('pointerup', 1, mx, my);
    ok('แตะ 1 ครั้ง = วาง 1 ชิ้น', objects.size === 1, 'placed=' + objects.size);
    reset(); relayout(); setTool('road');
    tev('pointerdown', 1, mx - 50, my);
    tev('pointermove', 1, mx - 20, my); tev('pointermove', 1, mx + 20, my); tev('pointermove', 1, mx + 50, my);
    tev('pointerup', 1, mx + 50, my);
    ok('ลาก = วางต่อเนื่อง ≥2 ชิ้น', objects.size >= 2, objects.size + ' ชิ้น');
    reset(); relayout(); setTool('road'); history.length = 0;
    tev('pointerdown', 1, mx, my); tev('pointerup', 1, mx, my);
    const placedOne = objects.size;
    undo();
    ok('แตะถนนแล้วกด ↶ ย้อนได้', placedOne === 1 && objects.size === 0, `placed=${placedOne} → ${objects.size}`);
    reset(); relayout(); setTool(null);
    ok('กดไอคอนซ้ำ = ยกเลิกการเลือก', (() => {
      const btn = railEl.querySelector('.item[data-type="house"]');
      if (!btn) return false;
      btn.click(); const on = tool === 'house'; btn.click(); return on && tool === null;
    })());
    ok('Esc = ยกเลิกการเลือก', (() => {
      setTool('tree');
      dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
      return tool === null;
    })());

    /* --- 8) แตะชิ้นของ = เลือก + inspector + ลบ --- */
    reset(); relayout();
    place('road', 0, 10); const hs = place('apartment', 5, 10);
    setTool(null); select(hs.id);
    ok('แตะชิ้นของ = เลือก + inspector โผล่', selected === hs.id && inspEl.classList.contains('show'));
    ok('inspector แสดงชื่อ/ขนาด/ชั้น', $('#iName').textContent.includes('อพาร์ตเมนต์') && $('#iMeta').textContent.includes('18×18') && $('#iMeta').textContent.includes('ชั้น'), $('#iMeta').textContent);
    const ro = rotate(selected);
    ok('ปุ่มหมุน 90° ทำงาน', ro.ok && objects.get(hs.id).rot === 90, 'rot=' + objects.get(hs.id).rot);
    delSelected();
    ok('ปุ่มลบใน inspector ลบชิ้นที่เลือก', objects.size === 1 && !inspEl.classList.contains('show'), objects.size + ' ชิ้น');

    /* --- 9) T2: inspector ครบ (ตำแหน่ง + สถานะกฎ) --- */
    reset(); relayout(); setTool(null);
    place('road', 0, 10); const h2 = place('house', 5, 10);
    select(h2.id);
    ok('T2 inspector แสดงตำแหน่ง (x,y)', $('#iMeta').textContent.includes('(5,10)'), $('#iMeta').textContent);
    ok('T2 inspector แสดง ✓ ผ่านกฎ + คำใบ้กติกา', $('#iSt').dataset.ok === '1' && $('#iSt').textContent.includes('ติดถนน'), $('#iSt').textContent);
    remove(atCell(1, 11)); afterChange();
    ok('T2 ถนนหาย → inspector ขึ้น ⚠ ทันที', $('#iSt').dataset.ok === '0' && $('#iSt').textContent.includes('ติดถนน'), $('#iSt').textContent);

    /* --- 10) T2: ลากชิ้นของบนพื้น = ย้าย (พร้อมเงาตัวอย่าง) --- */
    reset(); relayout(); setTool(null);
    [0, 5, 10, 15].forEach(x => place('road', x, 10));
    const hd = place('house', 5, 15);
    const p1 = screenOfCell(7, 17), p2 = screenOfCell(13, 19);
    tev('pointerdown', 1, p1.x, p1.y);
    tev('pointermove', 1, p1.x + 8, p1.y + 8);
    tev('pointermove', 1, p2.x, p2.y);
    ok('T2 ลากชิ้นของ → มีเงาตัวอย่างให้เห็นก่อนปล่อย', prevGrp.children.length > 0, prevGrp.children.length + ' กล่อง');
    tev('pointerup', 1, p2.x, p2.y);
    ok('T2 ลากแล้วย้ายไปที่ใหม่จริง', objects.get(hd.id).x !== 5, `${objects.get(hd.id).x},${objects.get(hd.id).y}`);
    ok('T2 ย้ายแล้วยังเลือกชิ้นเดิม + inspector อัปเดตตำแหน่ง', selected === hd.id && $('#iMeta').textContent.includes('(' + objects.get(hd.id).x + ',' + objects.get(hd.id).y + ')'), $('#iMeta').textContent);
    const bx0 = objects.get(hd.id).x, by0 = objects.get(hd.id).y;
    const p3 = screenOfCell(1, 11);                     // ช่องถนน → ต้องไม่ย้าย
    tev('pointerdown', 1, p2.x, p2.y); tev('pointermove', 1, p2.x + 8, p2.y + 8); tev('pointermove', 1, p3.x, p3.y); tev('pointerup', 1, p3.x, p3.y);
    ok('T2 ลากไปทับถนน → ไม่ย้าย (ของอยู่ที่เดิม)', objects.get(hd.id).x === bx0 && objects.get(hd.id).y === by0, `${objects.get(hd.id).x},${objects.get(hd.id).y}`);

    /* --- 11) T2: ลูกศรเลื่อนชิ้นที่เลือกทีละช่อง --- */
    reset(); relayout(); setTool(null);
    const tr = place('tree', 8, 8); select(tr.id);
    dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight' }));
    ok('T2 ลูกศรขวาเลื่อน 1 ช่อง', objects.get(tr.id).x === 9 && objects.get(tr.id).y === 8, `${objects.get(tr.id).x},${objects.get(tr.id).y}`);
    dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown' }));
    ok('T2 ลูกศรลงเลื่อน 1 ช่อง', objects.get(tr.id).x === 9 && objects.get(tr.id).y === 9, `${objects.get(tr.id).x},${objects.get(tr.id).y}`);
    const edge = place('tree', cols - 4, 3); select(edge.id);
    const ex0 = objects.get(edge.id).x;
    dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight' }));
    ok('T2 เลื่อนออกนอกขอบ → ถูกปฏิเสธ ไม่พัง', objects.get(edge.id).x === ex0 && objects.size > 0, 'x=' + objects.get(edge.id).x);

    /* --- 12) T4: sim ไฟ/น้ำ/ถนน → คน/งาน + ไฮไลต์ม่วง --- */
    reset(); relayout(); setTool(null);
    place('road', 0, 10); const hS = place('house', 5, 10);
    afterChange();
    const s0 = sim();
    ok('T4 บ้านเดียว ไม่มีไฟ/น้ำ → คน 0 · ต้องบริการ 1 · ไฮไลต์ 1',
      s0.pop === 0 && s0.need === 1 && s0.noPower === 1 && s0.noWater === 1 && svcMesh.count === 1,
      `pop=${s0.pop} need=${s0.need} hl=${svcMesh.count}`);
    place('plant', 30, 10);
    const s1 = sim();
    ok('T4 โรงไฟฟ้าใกล้ (≤130 ม.) → ไฟผ่าน แต่ยังไม่มีน้ำ', s1.noPower === 0 && s1.noWater === 1 && s1.pop === 0, `noPower=${s1.noPower} noWater=${s1.noWater}`);
    place('watertower', 30, 40); afterChange();
    const s2 = sim();
    ok('T4 ครบ ไฟ+น้ำ+ถนน → คน 10 (5 คน/ชั้น × 2 ชั้น)', s2.pop === 10 && s2.served === 1, `pop=${s2.pop} served=${s2.served}`);
    ok('T4 coverage ไฟ/น้ำ = 100%', s2.powerPct === 100 && s2.waterPct === 100, `${s2.powerPct}/${s2.waterPct}`);
    ok('T4 ไม่มีของขาดบริการ → ไฮไลต์หาย', svcMesh.count === 0 && svcGrp.visible === false, 'hl=' + svcMesh.count);
    ok('T4 HUD แสดง คน/งาน/ไฟ/น้ำ', /คน/.test($('#stats').textContent) && /งาน/.test($('#stats').textContent) && /⚡/.test($('#stats').textContent));
    const pl4 = [...objects.values()].find(o => o.type === 'plant');
    remove(pl4.id); afterChange();
    const s3 = sim();
    ok('T4 เอาโรงไฟฟ้าออก → คนหาย + ขึ้นไฮไลต์ม่วง', s3.pop === 0 && svcMesh.count === 1, `pop=${s3.pop} hl=${svcMesh.count}`);
    ok('T4 inspector โชว์สถานะบริการ ⚡/💧/🛣', (() => {
      select(hS.id); const t = $('#iSt').textContent;
      return t.includes('⚡') && t.includes('✗') && $('#iSt').dataset.svc === '0';
    })(), $('#iSt').textContent);
    reset(); relayout();
    place('road', 0, 10); place('shop', 5, 10); place('plant', 40, 40); place('watertower', 40, 60);
    const s4 = sim();
    ok('T4 ร้านค้าให้งาน 8 (4/ชั้น × 2 ชั้น) ไม่ใช่คน', s4.jobs === 8 && s4.pop === 0, `jobs=${s4.jobs} pop=${s4.pop}`);
    reset(); relayout();
    place('road', 0, 0); place('house', 5, 0); place('plant', 300, 300); place('watertower', 330, 330);
    const s5 = sim();
    ok('T4 โรงไฟฟ้าไกลเกินรัศมี 130 ม. → ไม่มีไฟ', s5.noPower === 1 && s5.pop === 0, `noPower=${s5.noPower}`);
    ok('T4 ปุ่มไฮไลต์ในเมนูซ่อน/โชว์ได้', (() => {
      const b = $('#btnSvc'), b0 = showSvc;
      b.click(); const b1 = showSvc; b.click();
      return b1 !== b0 && showSvc === b0;
    })());
    ok('T4 City.stats() ให้ AI อ่าน pop/ไฟ/น้ำ ได้', (() => {
      const st = City.stats();
      return typeof st.pop === 'number' && typeof st.powerPct === 'number' && 'unserved' in st;
    })());
    demo(); const sd = sim();
    ok('T4 demo → มีคน/งาน/บริการครบ', sd.pop > 0 && sd.jobs > 0 && sd.served > 0, `pop=${sd.pop} jobs=${sd.jobs} served=${sd.served}/${sd.need}`);

    /* --- 13) T5b: เครือข่ายถนน + รถวิ่งบนถนน --- */
    reset(); relayout(); setTool(null);
    [0, 5, 10].forEach(x => place('road', x, 10));
    const net1 = roadNet();
    ok('ถนนตรง 3 ไทล์ → 1 กลุ่ม · 0 ทางแยก · 2 ทางตัน',
      net1.tiles.length === 3 && net1.groups === 1 && net1.junction === 0 && net1.deadEnd === 2,
      `tiles=${net1.tiles.length} groups=${net1.groups} j=${net1.junction} d=${net1.deadEnd}`);
    reset(); relayout();
    [5, 10, 15].forEach(x => place('road', x, 10));
    [5, 10, 15].forEach(y => place('road', 10, y));
    const net2 = roadNet();
    ok('ถนนกากบาท → 1 กลุ่ม 4 ทางตัน · มีทางแยก', net2.groups === 1 && net2.deadEnd === 4 && net2.junction >= 1,
      `j=${net2.junction} d=${net2.deadEnd} g=${net2.groups}`);
    const cars1 = trafficCars(4);
    ok('สร้างรถได้ตามจำนวนที่ขอ (บนไทล์ถนน)', cars1.length === 4 && cars1.every(c => c.tile && c.tile.id), cars1.length + ' คัน');
    const lane = Math.abs(carPose({ tile: net2.tiles[0], dir: 0, t: 0.5 }).y - (net2.tiles[0].y + net2.tiles[0].h / 2));
    ok('รถวิ่งชิดซ้าย 1.2 ม. จากกึ่งกลางถนน', Math.abs(lane - LANE) < 0.01 && LANE < net2.tiles[0].w / 2, 'lane=' + lane.toFixed(2));
    const beforeT = cars1.map(c => c.tile.id);
    for (let i = 0; i < 400; i++) stepCars(cars1, 0.1);
    ok('รถ 400 สเต็ป → ยังอยู่บนถนน ไม่หลุดขอบ', cars1.every(c => carOnRoad(c) && c.tile), 'ok');
    ok('รถเปลี่ยนไทล์จริง (ไม่ได้หยุดอยู่ที่เดิม)', cars1.some((c, i) => c.tile.id !== beforeT[i]), 'moved');
    reset(); relayout();
    place('road', 0, 0);
    const de = trafficCars(1);
    for (let i = 0; i < 60; i++) stepCars(de, 0.2);
    ok('ถนนไทล์เดียว (ทางตัน) → รถไม่หลุด ไม่พัง', de.length === 1 && carOnRoad(de[0]), 'ok');
    reset(); relayout();
    ok('ไม่มีถนน → ไม่มีรถ', trafficCars().length === 0 && spawnTraffic(0) === 0 && cars.length === 0);
    demo();
    const dNet = roadNet();
    ok('demo มีรถวิ่งจริงบนถนน', cars.length > 0 && dNet.tiles.length > 50 && dNet.groups >= 1 && cars.every(c => carOnRoad(c)),
      `cars=${cars.length} tiles=${dNet.tiles.length} groups=${dNet.groups} j=${dNet.junction}`);

    /* --- 14) T5c: ทางม้าลาย (zebra) ที่ทางแยก --- */
    reset(); relayout();
    [0, 5, 10].forEach(x => place('road', x, 10));
    ok('ถนนตรง (ไม่มีทางแยก) → ไม่มีทางม้าลาย', crosswalkBars().length === 0, crosswalkBars().length + ' แถบ');
    reset(); relayout();
    [5, 10, 15].forEach(x => place('road', x, 10));
    [5, 10, 15].forEach(y => place('road', 10, y));
    const cw = crosswalkBars();
    ok('ทางแยก 4 แขน → ทางม้าลาย 20 แถบ (4 ทาง × 5)', cw.length === 20, cw.length + ' แถบ');
    const tilesNow = roadNet().tiles;
    ok('แถบทางม้าลายอยู่ในไทล์ถนน (ไม่ลอยออกนอก)', cw.every(b => tilesNow.some(t => b.x >= t.x - 1 && b.x <= t.x + t.w + 1 && b.y >= t.y - 1 && b.y <= t.y + t.h + 1)), 'ok');
    rebuildCrosswalks();
    ok('สร้าง mesh ทางม้าลายจริง (count ตรงจำนวนแถบ)', cwMesh.count === 20 && document.body.dataset.crosswalk === '20', 'count=' + cwMesh.count);
    demo();
    ok('demo มีทางม้าลายที่ทางแยกจริง', cwMesh.count > 0 && cwMesh.count === Math.min(crosswalkBars().length, CW_MAX), 'cw=' + cwMesh.count);

    /* --- 15) T5d: หน้าต่าง + ของบนดาดฟ้า --- */
    reset(); relayout();
    place('road', 0, 10); place('house', 5, 10); afterChange();
    ok('บ้าน 2 ชั้น → หน้าต่าง 2 แถว + ดาดฟ้า 1', decorStats.windows === 2 && decorStats.roofs === 1, `win=${decorStats.windows} roof=${decorStats.roofs}`);
    reset(); relayout(); place('road', 0, 10); afterChange();
    ok('ไม่มีอาคาร → ไม่มีหน้าต่าง/ดาดฟ้า', decorStats.windows === 0 && decorStats.roofs === 0, `win=${decorStats.windows}`);
    reset(); relayout(); place('road', 0, 10); place('office', 5, 10); afterChange();
    ok('ออฟฟิศ 8 ชั้น → หน้าต่าง 3 แถว (จำกัดที่ 3)', decorStats.windows === 3 && decorStats.roofs === 1, `win=${decorStats.windows}`);
    reset(); relayout(); place('road', 0, 10); place('house', 5, 10); afterChange();
    const w0 = decorStats.windows; place('road', 15, 10); place('townhouse', 20, 10); afterChange();
    ok('วางอาคารเพิ่ม → หน้าต่างเพิ่มขึ้นจริง', decorStats.windows === w0 + 3, `win ${w0} → ${decorStats.windows}`);
    demo();
    const nb = [...objects.values()].filter(o => DECOR_KINDS[(PARTS[o.type] || {}).kind]).length;
    ok('demo: ทุกอาคารมีดาดฟ้า + หน้าต่างครบช่วง', decorStats.roofs === nb && decorStats.windows >= nb && decorStats.windows <= nb * 3,
      `win=${decorStats.windows} roof=${decorStats.roofs} blds=${nb}`);

    /* --- 16) T5e: ป้ายร้าน + ไฟจราจร --- */
    ok('เฟสไฟจราจร: 0s เขียว · 9s เหลือง · 11s แดง · 12s กลับเขียว',
      signalPhase(0) === 'green' && signalPhase(9) === 'yellow' && signalPhase(11) === 'red' && signalPhase(12) === 'green',
      [0, 9, 11, 12].map(t => signalPhase(t)).join('/'));
    reset(); relayout();
    [0, 5, 10].forEach(x => place('road', x, 10));
    ok('ถนนตรง → ไม่มีไฟจราจร', signalSpots().length === 0, signalSpots().length + ' จุด');
    reset(); relayout();
    [5, 10, 15].forEach(x => place('road', x, 10));
    [5, 10, 15].forEach(y => place('road', 10, y));
    ok('ทางแยก 4 แขน → ไฟจราจร 4 จุด', signalSpots().length === 4, signalSpots().length + ' จุด');
    rebuildSignals();
    ok('สร้าง mesh ไฟจราจรจริง (เสา+โคม 4)', poleMesh.count === 4 && lampMesh.count === 4 && document.body.dataset.signals === '4', `pole=${poleMesh.count} lamp=${lampMesh.count}`);
    updateSignals(0);
    ok('โคมไฟเปลี่ยนเป็นเขียวที่ t=0', document.body.dataset.signal === 'green', document.body.dataset.signal);
    updateSignals(11);
    ok('โคมไฟเปลี่ยนเป็นแดงที่ t=11', document.body.dataset.signal === 'red', document.body.dataset.signal);
    reset(); relayout(); place('road', 0, 10); place('shop', 5, 10); afterChange();
    ok('ร้านค้า 1 หลัง → ป้ายร้าน 1 ป้าย', signMesh.count === 1 && document.body.dataset.signs === '1', signMesh.count + ' ป้าย');
    reset(); relayout(); place('road', 0, 10); place('house', 5, 10); afterChange();
    ok('บ้านไม่มีป้ายร้าน', signMesh.count === 0, signMesh.count + ' ป้าย');
    demo();
    ok('demo มีป้ายร้าน + ไฟจราจรจริง', signMesh.count > 0 && lampMesh.count > 0 && lampMesh.count === signalSpots().length,
      `signs=${signMesh.count} signals=${lampMesh.count}`);

    /* --- 17) T6: ธีมเวลา 4 แบบ + โหมดภาพ --- */
    const th = setTheme('night');
    ok('ธีมกลางคืน: ตั้งค่าได้ + แสงหรี่ลง', th.key === 'night' && sun.intensity < 1 && scene.background.getHex() === THEMES.night.bg && document.body.dataset.theme === 'night', `sun=${sun.intensity}`);
    setTheme('day');
    ok('ธีมกลางวัน: กลับมาสว่าง', Math.abs(sun.intensity - THEMES.day.sunI) < 0.01 && scene.background.getHex() === THEMES.day.bg, 'sun=' + sun.intensity);
    ok('มี 4 ธีม + ชื่อครบ', THEME_ORDER.length === 4 && THEME_ORDER.every(k => THEMES[k] && THEMES[k].name), THEME_ORDER.join(','));
    ok('ปุ่มธีมวน 4 แบบแล้วกลับจุดเดิม', (() => {
      setTheme('day'); const seen = [];
      for (let i = 0; i < 4; i++) { setTheme(nextTheme()); seen.push(themeKey); }
      return seen.join(',') === 'dusk,night,dawn,day';
    })(), 'cycle');
    setShot(true);
    ok('โหมดภาพ: ซ่อน UI (HUD ไม่แสดง)', document.body.classList.contains('shot') && document.body.dataset.shot === '1' && getComputedStyle(document.querySelector('.hud')).display === 'none', 'shot=1');
    setShot(false);
    ok('ปิดโหมดภาพ: UI กลับมา', !document.body.classList.contains('shot') && getComputedStyle(document.querySelector('.hud')).display !== 'none', 'shot=0');
    ok('ธีมไม่หลุดตอนวางของ/ล้างเมือง', (() => {
      setTheme('dusk'); reset(); relayout(); place('road', 0, 0); afterChange();
      return document.body.dataset.theme === 'dusk' && scene.background.getHex() === THEMES.dusk.bg;
    })(), 'ok');
    setTheme('day');

    /* --- 18) UI: ชื่อชิ้นใน palette อ่านเต็มทุกชิ้น --- */
    const railOverflow = () => {
      const bad = [];
      railEl.querySelectorAll('.item').forEach(b => {
        ['nm', 'sz'].forEach(cls => {
          const el = b.querySelector('.' + cls);
          if (el && (el.scrollWidth > el.clientWidth + 1 || el.scrollHeight > el.clientHeight + 1)) bad.push(b.dataset.type + ':' + cls);
        });
      });
      return bad;
    };
    tab = 'build'; renderRail(); syncPalHeight();
    const badA = railOverflow();
    tab = 'equip'; renderRail(); syncPalHeight();
    const badB = railOverflow();
    tab = 'build'; renderRail(); syncPalHeight();
    ok('T-UI ชื่อชิ้นใน palette อ่านเต็มทั้ง 2 แท็บ (ไม่ถูกตัด)', badA.length === 0 && badB.length === 0, 'ตัด: ' + (badA.concat(badB).join(',') || 'ไม่มี'));
    ok('T-UI มี title อ่านชื่อเต็มเมื่อ hover/กดค้าง', Array.from(railEl.querySelectorAll('.item')).every(b => (b.getAttribute('title') || '').includes('ม.')), 'title ok');

    const pass = out.every(s => s.startsWith('PASS'));
    logEl.style.display = 'block';
    logEl.innerHTML = out.map(s => `<span class="${s.startsWith('PASS') ? 'pass' : 'fail'}">${s}</span>`).join('\n') +
      `\n<div class="${pass ? 'pass' : 'fail'}">== ${out.filter(s => s.startsWith('PASS')).length}/${out.length} ${pass ? 'ALL PASS' : 'FAILED'} ==</div>`;
    document.body.dataset.selftest = pass ? 'pass' : 'fail';
    document.body.dataset.tests = String(out.length);
    document.body.dataset.passed = String(out.filter(s => s.startsWith('PASS')).length);
    reset(); relayout(); setTool(null);
    return { pass, total: out.length, passed: out.filter(s => s.startsWith('PASS')).length };
  }
};

/* ================== start ================== */
function syncPalHeight() {
  const p = document.querySelector('.pal');
  if (p) document.documentElement.style.setProperty('--palh', Math.round(p.offsetHeight + 8) + 'px');
}
if (window.ResizeObserver) new ResizeObserver(syncPalHeight).observe(document.querySelector('.pal'));
addEventListener('resize', syncPalHeight);
syncPalHeight();

renderRail();
buildWorld();
lastSpanSize = worldSize().span;
relayout();
setTool(null);
syncTrafficCount();
if (params.get('perf')) { perfFill(Math.min(3000, parseInt(params.get('perf'), 10) || 2000)); }
if (params.get('demo') === '1') demo();
if (params.get('theme')) setTheme(params.get('theme'));
if (params.get('shot') === '1') setShot(true);
if (params.get('pick')) setTimeout(() => {
  const o = [...objects.values()].find(v => (PARTS[v.type] || {}).cat === 'build') || [...objects.values()][0];
  if (o) select(o.id);
}, 150);
if (params.get('selftest') === '1') setTimeout(() => window.__b.selftest(), 60);
if (params.get('hash') === '1') setTimeout(() => {           // save/load round-trip hash (ใช้ตรวจซ้ำได้)
  const s1 = JSON.stringify(serialize());
  const r = load(s1);
  const s2 = JSON.stringify(serialize());
  let h = 0; for (let i = 0; i < s1.length; i++) h = (h * 31 + s1.charCodeAt(i)) >>> 0;
  document.body.dataset.hash = String(h);
  document.body.dataset.hashok = (r.ok && s1 === s2) ? '1' : '0';
  document.body.dataset.hashlen = String(s1.length);
}, 200);
if (params.get('info') === '1') setTimeout(() => {           // draw calls / tris (fps วัดไม่ได้ใน headless)
  renderer.render(scene, camera);
  document.body.dataset.calls = String(renderer.info.render.calls);
  document.body.dataset.tris = String(renderer.info.render.triangles);
  document.body.dataset.objects = String(objects.size);
}, 300);
if (SNAP) { snapNow(); setInterval(snapNow, 700); }
document.body.dataset.ready = '1';
requestAnimationFrame(renderLoop);
</script>
</body>
</html>
