// choreography.jsx
// Character scripts. Total dur per character must = LOOP_DUR (30s).
// Walking is fast (~2x previous). 18 characters total.

const W = window.WAYPOINTS;

function buildScript(segs) {
  const total = segs.reduce((a, s) => a + s.dur, 0);
  const remainder = LOOP_DUR - total;
  if (Math.abs(remainder) < 0.001) return segs;
  if (remainder < 0) {
    console.warn('script too long:', total);
    return segs;
  }
  // Stretch every segment uniformly to fill the loop — no idle filler, no extra wandering.
  const scale = LOOP_DUR / total;
  return segs.map(s => ({ ...s, dur: s.dur * scale }));
}

const walk = (from, to, dur) => ({ type: 'walk', from: [from.x, from.y], to: [to.x, to.y], dur });
const wait = (at, dur, facing) => ({ type: 'wait', at: [at.x, at.y], dur, facing });
const chat = (at, text, dur, side, facing) => ({
  type: 'chat', at: [at.x, at.y], text, dur, side, facing,
});

// Meeting points
const meetA = { x: 510, y: 720 };
const meetB = { x: 570, y: 720 };
const meetC = { x: 530, y: 480 };
const meetD = { x: 590, y: 480 };
const meetE = { x: 740, y: 800 };
const meetF = { x: 800, y: 800 };
const meetG = { x: 290, y: 800 };
const meetH = { x: 350, y: 800 };
const meetI = { x: 540, y: 870 };  // gate path lower
const meetJ = { x: 540, y: 920 };
const meetK = { x: 820, y: 270 };  // field
const meetL = { x: 820, y: 220 };
const meetM = { x: 250, y: 320 };  // pond
const meetN = { x: 290, y: 360 };
const meetO = { x: 760, y: 600 };  // east mid path
const meetP = { x: 760, y: 650 };

// ── C1: Dorm → Plaza meet → Library, repeat
const c1 = buildScript([
  walk(W.dorm_door, W.dorm_path, 0.9),
  walk(W.dorm_path, W.jct_sw, 0.2),
  walk(W.jct_sw, W.plaza_w, 0.9),
  walk(W.plaza_w, meetA, 0.35),
  chat(meetA, '안녕! 어디가?', 1.6, 'left', 'right'),
  chat(meetA, '도서관 가려고 ✨', 1.5, 'left', 'right'),
  walk(meetA, W.plaza_c, 0.3),
  walk(W.plaza_c, W.plaza_n, 0.35),
  walk(W.plaza_n, W.lib_path, 0.7),
  walk(W.lib_path, W.lib_door, 0.7),
  wait(W.lib_door, 1.5, 'up'),
  walk(W.lib_door, W.lib_path, 0.7),
  walk(W.lib_path, W.plaza_n, 0.7),
  walk(W.plaza_n, W.plaza_c, 0.35),
  walk(W.plaza_c, W.plaza_s, 0.4),
  walk(W.plaza_s, W.gate_in, 0.85),
  wait(W.gate_in, 1.0, 'down'),
  walk(W.gate_in, W.plaza_s, 0.85),
  walk(W.plaza_s, W.plaza_w, 0.4),
  walk(W.plaza_w, W.jct_sw, 0.9),
  walk(W.jct_sw, W.dorm_path, 0.2),
  walk(W.dorm_path, W.dorm_door, 0.9),
  wait(W.dorm_door, 1.0, 'up'),
  walk(W.dorm_door, W.dorm_path, 0.9),
  walk(W.dorm_path, W.jct_sw, 0.2),
  walk(W.jct_sw, W.plaza_w, 0.9),
  walk(W.plaza_w, meetA, 0.35),
  chat(meetA, '또 만났네 ㅋㅋ', 1.4, 'left', 'right'),
  walk(meetA, W.plaza_w, 0.35),
  walk(W.plaza_w, W.jct_sw, 0.9),
  walk(W.jct_sw, W.dorm_path, 0.2),
  walk(W.dorm_path, W.dorm_door, 0.9),
]);

// ── C2: Hall A → meet C1 at plaza → cafe meet C3 → loop
const c2 = buildScript([
  walk(W.hall_a_door, W.hall_a_path, 0.8),
  walk(W.hall_a_path, W.jct_nw, 0.2),
  walk(W.jct_nw, W.plaza_w, 1.2),
  walk(W.plaza_w, meetB, 0.45),
  chat(meetB, '오 안녕!', 1.6, 'right', 'left'),
  chat(meetB, '나 카페 갈 건데 ☕', 1.5, 'right', 'left'),
  walk(meetB, W.plaza_e, 0.35),
  walk(W.plaza_e, W.jct_se, 0.8),
  walk(W.jct_se, meetE, 0.4),
  chat(meetE, '뭐해? 🌸', 1.6, 'right', 'right'),
  walk(meetE, W.cafe_path, 0.3),
  walk(W.cafe_path, W.cafe_door, 0.7),
  wait(W.cafe_door, 1.5, 'up'),
  walk(W.cafe_door, W.cafe_path, 0.7),
  walk(W.cafe_path, W.jct_se, 0.3),
  walk(W.jct_se, W.jct_ne, 0.7),
  walk(W.jct_ne, W.hall_b_path, 0.2),
  walk(W.hall_b_path, W.hall_b_door, 0.8),
  wait(W.hall_b_door, 1.2, 'up'),
  walk(W.hall_b_door, W.hall_b_path, 0.8),
  walk(W.hall_b_path, W.jct_ne, 0.2),
  walk(W.jct_ne, W.jct_nw, 1.3),
  walk(W.jct_nw, W.hall_a_path, 0.2),
  walk(W.hall_a_path, W.hall_a_door, 0.8),
  wait(W.hall_a_door, 1.0, 'up'),
  walk(W.hall_a_door, W.hall_a_path, 0.8),
  walk(W.hall_a_path, W.jct_nw, 0.2),
  walk(W.jct_nw, W.plaza_w, 1.2),
  walk(W.plaza_w, W.jct_nw, 1.2),
  walk(W.jct_nw, W.hall_a_path, 0.2),
  walk(W.hall_a_path, W.hall_a_door, 0.8),
]);

// ── C3: Cafe → meet C2 → field → loop
const c3 = buildScript([
  walk(W.cafe_door, W.cafe_path, 0.8),
  walk(W.cafe_path, W.jct_se, 0.35),
  walk(W.jct_se, meetF, 0.35),
  wait(meetF, 1.0, 'left'),
  chat(meetF, '같이 갈래? 🌳', 1.6, 'left', 'left'),
  chat(meetF, '운동장 갈 거야!', 1.5, 'left', 'left'),
  walk(meetF, W.jct_se, 0.35),
  walk(W.jct_se, W.jct_ne, 0.7),
  walk(W.jct_ne, W.field_path, 0.35),
  walk(W.field_path, W.field_c, 0.7),
  wait(W.field_c, 1.5, 'down'),
  walk(W.field_c, W.field_path, 0.7),
  walk(W.field_path, W.jct_ne, 0.35),
  walk(W.jct_ne, W.jct_se, 0.7),
  walk(W.jct_se, meetO, 1.0),
  chat(meetO, '벌써 다 돌았네 😅', 1.5, 'right', 'down'),
  walk(meetO, W.jct_se, 1.0),
  walk(W.jct_se, W.cafe_path, 0.35),
  walk(W.cafe_path, W.cafe_door, 0.8),
  wait(W.cafe_door, 1.0, 'up'),
  walk(W.cafe_door, W.cafe_path, 0.8),
  walk(W.cafe_path, W.jct_se, 0.35),
  walk(W.jct_se, W.plaza_e, 0.8),
  walk(W.plaza_e, W.plaza_c, 0.25),
  walk(W.plaza_c, W.plaza_e, 0.25),
  walk(W.plaza_e, W.jct_se, 0.8),
  walk(W.jct_se, W.cafe_path, 0.35),
  walk(W.cafe_path, W.cafe_door, 0.8),
]);

// ── C4: Hall B → meet C5 → Hall A → loop
const c4 = buildScript([
  walk(W.hall_b_door, W.hall_b_path, 0.8),
  walk(W.hall_b_path, W.jct_ne, 0.2),
  walk(W.jct_ne, meetD, 0.9),
  chat(meetD, '시험 잘 봤어?', 1.7, 'left', 'left'),
  chat(meetD, '망했어 ㅠㅠ', 1.6, 'left', 'left'),
  walk(meetD, W.jct_nw, 0.8),
  walk(W.jct_nw, W.hall_a_path, 0.2),
  walk(W.hall_a_path, W.hall_a_door, 0.8),
  wait(W.hall_a_door, 1.4, 'up'),
  walk(W.hall_a_door, W.hall_a_path, 0.8),
  walk(W.hall_a_path, W.jct_nw, 0.2),
  walk(W.jct_nw, W.jct_ne, 1.3),
  walk(W.jct_ne, W.hall_b_path, 0.2),
  walk(W.hall_b_path, W.hall_b_door, 0.8),
  wait(W.hall_b_door, 1.4, 'up'),
  walk(W.hall_b_door, W.hall_b_path, 0.8),
  walk(W.hall_b_path, W.jct_ne, 0.2),
  walk(W.jct_ne, W.field_path, 0.35),
  walk(W.field_path, W.field_c, 0.7),
  wait(W.field_c, 1.0, 'down'),
  walk(W.field_c, W.field_path, 0.7),
  walk(W.field_path, W.jct_ne, 0.35),
  walk(W.jct_ne, meetD, 0.9),
  chat(meetD, '한 잔 할까?', 1.5, 'left', 'left'),
  walk(meetD, W.jct_nw, 0.8),
  walk(W.jct_nw, W.jct_ne, 1.3),
  walk(W.jct_ne, W.hall_b_path, 0.2),
  walk(W.hall_b_path, W.hall_b_door, 0.8),
]);

// ── C5: Library → meet C4 → pond → back
const c5 = buildScript([
  walk(W.lib_door, W.lib_path, 0.8),
  walk(W.lib_path, W.plaza_n, 0.7),
  walk(W.plaza_n, W.plaza_c, 0.3),
  walk(W.plaza_c, meetC, 0.8),
  walk(meetC, meetD, 0.25),
  chat(meetD, '도서관 갔다왔어!', 1.7, 'right', 'right'),
  chat(meetD, '커피 한잔? ☕', 1.6, 'right', 'right'),
  walk(meetD, W.jct_nw, 0.8),
  walk(W.jct_nw, W.pond_path, 0.5),
  walk(W.pond_path, W.pond_bench, 0.45),
  wait(W.pond_bench, 2.0, 'down'),
  walk(W.pond_bench, W.pond_path, 0.45),
  walk(W.pond_path, W.jct_nw, 0.5),
  walk(W.jct_nw, W.plaza_w, 0.85),
  walk(W.plaza_w, W.plaza_c, 0.25),
  walk(W.plaza_c, W.plaza_n, 0.35),
  walk(W.plaza_n, W.lib_path, 0.7),
  walk(W.lib_path, W.lib_door, 0.8),
  wait(W.lib_door, 1.0, 'up'),
  walk(W.lib_door, W.lib_path, 0.8),
  walk(W.lib_path, W.plaza_n, 0.7),
  walk(W.plaza_n, W.plaza_c, 0.3),
  walk(W.plaza_c, W.plaza_e, 0.5),
  walk(W.plaza_e, W.jct_se, 0.8),
  walk(W.jct_se, W.plaza_e, 0.8),
  walk(W.plaza_e, W.plaza_c, 0.5),
  walk(W.plaza_c, W.plaza_n, 0.35),
  walk(W.plaza_n, W.lib_path, 0.7),
  walk(W.lib_path, W.lib_door, 0.8),
]);

// ── C6: Gate ↔ Dorm with meet (C7)
const c6 = buildScript([
  walk(W.gate, W.gate_in, 0.5),
  walk(W.gate_in, W.plaza_s, 0.85),
  walk(W.plaza_s, W.plaza_w, 0.4),
  walk(W.plaza_w, W.jct_sw, 0.9),
  walk(W.jct_sw, meetG, 0.2),
  chat(meetG, '오랜만이야! 💕', 1.7, 'right', 'right'),
  chat(meetG, '같이 기숙사 갈래?', 1.6, 'right', 'right'),
  walk(meetG, meetH, 0.25),
  walk(meetH, W.dorm_path, 0.2),
  walk(W.dorm_path, W.dorm_door, 0.85),
  wait(W.dorm_door, 1.4, 'up'),
  walk(W.dorm_door, W.dorm_path, 0.85),
  walk(W.dorm_path, W.jct_sw, 0.2),
  walk(W.jct_sw, W.plaza_w, 0.9),
  walk(W.plaza_w, W.plaza_c, 0.25),
  walk(W.plaza_c, W.plaza_n, 0.35),
  walk(W.plaza_n, W.lib_path, 0.7),
  walk(W.lib_path, W.lib_door, 0.7),
  wait(W.lib_door, 1.0, 'up'),
  walk(W.lib_door, W.lib_path, 0.7),
  walk(W.lib_path, W.plaza_n, 0.7),
  walk(W.plaza_n, W.plaza_c, 0.35),
  walk(W.plaza_c, W.plaza_s, 0.4),
  walk(W.plaza_s, W.gate_in, 0.85),
  walk(W.gate_in, W.gate, 0.5),
  wait(W.gate, 1.0, 'down'),
  walk(W.gate, W.gate_in, 0.5),
  walk(W.gate_in, W.plaza_s, 0.85),
  walk(W.plaza_s, W.gate_in, 0.85),
  walk(W.gate_in, W.gate, 0.5),
]);

// ── C7: Cafe → meet C6 → loop
const c7 = buildScript([
  walk(W.cafe_door, W.cafe_path, 0.85),
  walk(W.cafe_path, W.jct_se, 0.35),
  walk(W.jct_se, W.plaza_e, 0.8),
  walk(W.plaza_e, W.plaza_c, 0.25),
  walk(W.plaza_c, W.plaza_w, 0.25),
  walk(W.plaza_w, W.jct_sw, 0.9),
  walk(W.jct_sw, meetH, 0.2),
  chat(meetH, '안녕!! 어디 있었어 🌸', 1.7, 'left', 'left'),
  chat(meetH, '응응 가자~', 1.6, 'left', 'left'),
  walk(meetH, W.jct_sw, 0.2),
  walk(W.jct_sw, W.dorm_path, 0.2),
  walk(W.dorm_path, W.dorm_door, 0.85),
  wait(W.dorm_door, 1.0, 'up'),
  walk(W.dorm_door, W.dorm_path, 0.85),
  walk(W.dorm_path, W.jct_sw, 0.2),
  walk(W.jct_sw, W.plaza_w, 0.9),
  walk(W.plaza_w, W.plaza_c, 0.25),
  walk(W.plaza_c, W.plaza_e, 0.25),
  walk(W.plaza_e, W.jct_se, 0.8),
  walk(W.jct_se, W.cafe_path, 0.35),
  walk(W.cafe_path, W.cafe_door, 0.85),
  wait(W.cafe_door, 1.5, 'up'),
  walk(W.cafe_door, W.cafe_path, 0.85),
  walk(W.cafe_path, W.jct_se, 0.35),
  walk(W.jct_se, W.cafe_path, 0.35),
  walk(W.cafe_path, W.cafe_door, 0.85),
  walk(W.cafe_door, W.cafe_path, 0.85),
  walk(W.cafe_path, W.cafe_door, 0.85),
]);

// ── C8: field wanderer
const c8 = buildScript([
  walk(W.field_c, { x: 720, y: 200 }, 1.25),
  walk({ x: 720, y: 200 }, { x: 920, y: 280 }, 1.25),
  walk({ x: 920, y: 280 }, W.field_c, 1.25),
  walk(W.field_c, { x: 760, y: 320 }, 1.0),
  walk({ x: 760, y: 320 }, W.field_path, 0.75),
  walk(W.field_path, W.jct_ne, 0.5),
  walk(W.jct_ne, W.hall_b_path, 0.2),
  walk(W.hall_b_path, W.hall_b_door, 0.8),
  wait(W.hall_b_door, 1.0, 'up'),
  walk(W.hall_b_door, W.hall_b_path, 0.8),
  walk(W.hall_b_path, W.jct_ne, 0.2),
  walk(W.jct_ne, W.field_path, 0.5),
  walk(W.field_path, W.field_c, 0.75),
  walk(W.field_c, { x: 920, y: 220 }, 1.25),
  walk({ x: 920, y: 220 }, { x: 720, y: 250 }, 1.25),
  walk({ x: 720, y: 250 }, W.field_c, 1.0),
  walk(W.field_c, meetK, 0.4),
  chat(meetK, '한 판 더? 🏃', 1.5, 'right', 'right'),
  walk(meetK, { x: 920, y: 240 }, 1.0),
  walk({ x: 920, y: 240 }, W.field_c, 1.0),
  walk(W.field_c, W.field_path, 0.75),
  walk(W.field_path, W.field_c, 0.75),
  walk(W.field_c, { x: 720, y: 200 }, 1.25),
  walk({ x: 720, y: 200 }, W.field_c, 1.25),
]);

// ── C9: gate path stroller, meets C10 mid-path
const c9 = buildScript([
  walk(W.gate, W.gate_in, 0.5),
  walk(W.gate_in, meetJ, 0.4),
  walk(meetJ, meetI, 0.3),
  chat(meetI, '오 너도 등교 중? ☀️', 1.6, 'right', 'up'),
  chat(meetI, '나 1교시야 ㅠ', 1.5, 'right', 'up'),
  walk(meetI, W.plaza_s, 0.3),
  walk(W.plaza_s, W.plaza_c, 0.4),
  walk(W.plaza_c, W.plaza_e, 0.3),
  walk(W.plaza_e, W.jct_se, 0.8),
  walk(W.jct_se, W.cafe_path, 0.35),
  walk(W.cafe_path, W.cafe_door, 0.85),
  wait(W.cafe_door, 1.4, 'up'),
  walk(W.cafe_door, W.cafe_path, 0.85),
  walk(W.cafe_path, W.jct_se, 0.35),
  walk(W.jct_se, W.plaza_e, 0.8),
  walk(W.plaza_e, W.plaza_c, 0.3),
  walk(W.plaza_c, W.plaza_n, 0.4),
  walk(W.plaza_n, W.lib_path, 0.7),
  walk(W.lib_path, W.lib_door, 0.7),
  wait(W.lib_door, 1.5, 'up'),
  walk(W.lib_door, W.lib_path, 0.7),
  walk(W.lib_path, W.plaza_n, 0.7),
  walk(W.plaza_n, W.plaza_c, 0.4),
  walk(W.plaza_c, W.plaza_s, 0.4),
  walk(W.plaza_s, meetI, 0.3),
  walk(meetI, meetJ, 0.3),
  walk(meetJ, W.gate_in, 0.4),
  walk(W.gate_in, W.gate, 0.5),
]);

// ── C10: gate path counterpart, meets C9
const c10 = buildScript([
  walk(W.dorm_door, W.dorm_path, 0.85),
  walk(W.dorm_path, W.jct_sw, 0.2),
  walk(W.jct_sw, W.plaza_w, 0.9),
  walk(W.plaza_w, W.plaza_s, 0.4),
  walk(W.plaza_s, meetI, 0.3),
  chat(meetI, '오 너도 등교 중? ☀️', 1.6, 'left', 'down'),
  chat(meetI, '나 1교시야 ㅠ', 1.5, 'left', 'down'),
  walk(meetI, meetJ, 0.3),
  walk(meetJ, W.gate_in, 0.4),
  walk(W.gate_in, W.gate, 0.5),
  wait(W.gate, 1.5, 'down'),
  walk(W.gate, W.gate_in, 0.5),
  walk(W.gate_in, W.plaza_s, 0.85),
  walk(W.plaza_s, W.plaza_c, 0.4),
  walk(W.plaza_c, W.plaza_w, 0.3),
  walk(W.plaza_w, W.jct_nw, 0.85),
  walk(W.jct_nw, W.hall_a_path, 0.2),
  walk(W.hall_a_path, W.hall_a_door, 0.8),
  wait(W.hall_a_door, 1.5, 'up'),
  walk(W.hall_a_door, W.hall_a_path, 0.8),
  walk(W.hall_a_path, W.jct_nw, 0.2),
  walk(W.jct_nw, W.plaza_w, 0.85),
  walk(W.plaza_w, W.jct_sw, 0.9),
  walk(W.jct_sw, W.dorm_path, 0.2),
  walk(W.dorm_path, W.dorm_door, 0.85),
  wait(W.dorm_door, 1.0, 'up'),
  walk(W.dorm_door, W.dorm_path, 0.85),
  walk(W.dorm_path, W.dorm_door, 0.85),
  walk(W.dorm_door, W.dorm_path, 0.85),
  walk(W.dorm_path, W.dorm_door, 0.85),
]);

// ── C11: pond bench rester, meets C12
const c11 = buildScript([
  walk(W.pond_bench, W.pond_path, 0.5),
  walk(W.pond_path, W.jct_nw, 0.5),
  walk(W.jct_nw, meetN, 0.5),
  chat(meetN, '연못 산책 중? 🌸', 1.6, 'right', 'up'),
  chat(meetN, '응 잠깐만 쉬자', 1.5, 'right', 'up'),
  walk(meetN, W.pond_path, 0.4),
  walk(W.pond_path, W.pond_bench, 0.45),
  wait(W.pond_bench, 2.5, 'down'),
  walk(W.pond_bench, meetM, 0.4),
  chat(meetM, '날씨 좋다 ☀️', 1.5, 'right', 'right'),
  walk(meetM, W.pond_bench, 0.4),
  wait(W.pond_bench, 1.5, 'down'),
  walk(W.pond_bench, W.pond_path, 0.45),
  walk(W.pond_path, W.jct_nw, 0.5),
  walk(W.jct_nw, W.plaza_w, 0.85),
  walk(W.plaza_w, W.jct_nw, 0.85),
  walk(W.jct_nw, W.pond_path, 0.5),
  walk(W.pond_path, W.pond_bench, 0.45),
  wait(W.pond_bench, 2.0, 'down'),
  walk(W.pond_bench, W.pond_path, 0.45),
  walk(W.pond_path, W.pond_bench, 0.45),
  walk(W.pond_bench, W.pond_path, 0.45),
  walk(W.pond_path, W.pond_bench, 0.45),
]);

// ── C12: meets C11 by pond, then library
const c12 = buildScript([
  walk(W.hall_a_door, W.hall_a_path, 0.85),
  walk(W.hall_a_path, W.jct_nw, 0.2),
  walk(W.jct_nw, meetN, 0.5),
  chat(meetN, '연못 산책 중? 🌸', 1.6, 'left', 'left'),
  chat(meetN, '응 잠깐만 쉬자', 1.5, 'left', 'left'),
  walk(meetN, W.jct_nw, 0.5),
  walk(W.jct_nw, W.plaza_w, 0.85),
  walk(W.plaza_w, W.plaza_c, 0.25),
  walk(W.plaza_c, W.plaza_n, 0.35),
  walk(W.plaza_n, W.lib_path, 0.7),
  walk(W.lib_path, W.lib_door, 0.7),
  wait(W.lib_door, 2.0, 'up'),
  walk(W.lib_door, W.lib_path, 0.7),
  walk(W.lib_path, W.plaza_n, 0.7),
  walk(W.plaza_n, W.plaza_c, 0.35),
  walk(W.plaza_c, W.plaza_w, 0.25),
  walk(W.plaza_w, W.jct_nw, 0.85),
  walk(W.jct_nw, W.hall_a_path, 0.2),
  walk(W.hall_a_path, W.hall_a_door, 0.85),
  wait(W.hall_a_door, 1.0, 'up'),
  walk(W.hall_a_door, W.hall_a_path, 0.85),
  walk(W.hall_a_path, W.jct_nw, 0.2),
  walk(W.jct_nw, W.jct_ne, 1.3),
  walk(W.jct_ne, W.jct_nw, 1.3),
  walk(W.jct_nw, W.hall_a_path, 0.2),
  walk(W.hall_a_path, W.hall_a_door, 0.85),
]);

// ── C13: cafe regular, meets C14 mid-east-path
const c13 = buildScript([
  walk(W.cafe_door, W.cafe_path, 0.85),
  walk(W.cafe_path, W.jct_se, 0.35),
  walk(W.jct_se, meetP, 0.4),
  walk(meetP, meetO, 0.25),
  chat(meetO, '아 졸려 ☕', 1.6, 'left', 'up'),
  chat(meetO, '나도 ㅠㅠ', 1.5, 'left', 'up'),
  walk(meetO, W.jct_ne, 0.5),
  walk(W.jct_ne, W.hall_b_path, 0.2),
  walk(W.hall_b_path, W.hall_b_door, 0.85),
  wait(W.hall_b_door, 1.5, 'up'),
  walk(W.hall_b_door, W.hall_b_path, 0.85),
  walk(W.hall_b_path, W.jct_ne, 0.2),
  walk(W.jct_ne, meetO, 0.5),
  walk(meetO, meetP, 0.25),
  walk(meetP, W.jct_se, 0.4),
  walk(W.jct_se, W.cafe_path, 0.35),
  walk(W.cafe_path, W.cafe_door, 0.85),
  wait(W.cafe_door, 1.5, 'up'),
  walk(W.cafe_door, W.cafe_path, 0.85),
  walk(W.cafe_path, W.jct_se, 0.35),
  walk(W.jct_se, W.plaza_e, 0.8),
  walk(W.plaza_e, W.plaza_c, 0.25),
  walk(W.plaza_c, W.plaza_e, 0.25),
  walk(W.plaza_e, W.jct_se, 0.8),
  walk(W.jct_se, W.cafe_path, 0.35),
  walk(W.cafe_path, W.cafe_door, 0.85),
  walk(W.cafe_door, W.cafe_path, 0.85),
  walk(W.cafe_path, W.cafe_door, 0.85),
]);

// ── C14: hall B regular meeting C13
const c14 = buildScript([
  walk(W.hall_b_door, W.hall_b_path, 0.85),
  walk(W.hall_b_path, W.jct_ne, 0.2),
  walk(W.jct_ne, meetO, 0.5),
  chat(meetO, '아 졸려 ☕', 1.6, 'right', 'down'),
  chat(meetO, '나도 ㅠㅠ', 1.5, 'right', 'down'),
  walk(meetO, meetP, 0.25),
  walk(meetP, W.jct_se, 0.4),
  walk(W.jct_se, W.cafe_path, 0.35),
  walk(W.cafe_path, W.cafe_door, 0.85),
  wait(W.cafe_door, 1.8, 'up'),
  walk(W.cafe_door, W.cafe_path, 0.85),
  walk(W.cafe_path, W.jct_se, 0.35),
  walk(W.jct_se, W.jct_ne, 0.7),
  walk(W.jct_ne, W.hall_b_path, 0.2),
  walk(W.hall_b_path, W.hall_b_door, 0.85),
  wait(W.hall_b_door, 1.5, 'up'),
  walk(W.hall_b_door, W.hall_b_path, 0.85),
  walk(W.hall_b_path, W.jct_ne, 0.2),
  walk(W.jct_ne, W.field_path, 0.4),
  walk(W.field_path, W.field_c, 0.7),
  wait(W.field_c, 1.0, 'down'),
  walk(W.field_c, W.field_path, 0.7),
  walk(W.field_path, W.jct_ne, 0.4),
  walk(W.jct_ne, W.hall_b_path, 0.2),
  walk(W.hall_b_path, W.hall_b_door, 0.85),
  walk(W.hall_b_door, W.hall_b_path, 0.85),
  walk(W.hall_b_path, W.hall_b_door, 0.85),
  walk(W.hall_b_door, W.hall_b_path, 0.85),
  walk(W.hall_b_path, W.hall_b_door, 0.85),
]);

// ── C15: dorm exit, plaza wave
const c15 = buildScript([
  walk(W.dorm_door, W.dorm_path, 0.85),
  walk(W.dorm_path, W.jct_sw, 0.2),
  walk(W.jct_sw, W.plaza_w, 0.9),
  walk(W.plaza_w, W.plaza_c, 0.25),
  chat(W.plaza_c, '벚꽃 폈다 🌸', 1.6, 'right', 'down'),
  walk(W.plaza_c, W.plaza_e, 0.25),
  walk(W.plaza_e, W.jct_se, 0.8),
  walk(W.jct_se, W.cafe_path, 0.35),
  walk(W.cafe_path, W.cafe_door, 0.85),
  wait(W.cafe_door, 1.6, 'up'),
  walk(W.cafe_door, W.cafe_path, 0.85),
  walk(W.cafe_path, W.jct_se, 0.35),
  walk(W.jct_se, W.jct_ne, 0.7),
  walk(W.jct_ne, W.field_path, 0.4),
  walk(W.field_path, W.field_c, 0.7),
  wait(W.field_c, 1.0, 'down'),
  walk(W.field_c, W.field_path, 0.7),
  walk(W.field_path, W.jct_ne, 0.4),
  walk(W.jct_ne, W.jct_nw, 1.3),
  walk(W.jct_nw, W.plaza_w, 0.85),
  walk(W.plaza_w, W.jct_sw, 0.9),
  walk(W.jct_sw, W.dorm_path, 0.2),
  walk(W.dorm_path, W.dorm_door, 0.85),
  wait(W.dorm_door, 1.0, 'up'),
  walk(W.dorm_door, W.dorm_path, 0.85),
  walk(W.dorm_path, W.dorm_door, 0.85),
  walk(W.dorm_door, W.dorm_path, 0.85),
  walk(W.dorm_path, W.dorm_door, 0.85),
]);

// ── C16: gate visitor, plaza solo
const c16 = buildScript([
  walk(W.gate, W.gate_in, 0.5),
  walk(W.gate_in, W.plaza_s, 0.85),
  walk(W.plaza_s, W.plaza_c, 0.4),
  walk(W.plaza_c, W.plaza_w, 0.25),
  walk(W.plaza_w, W.jct_nw, 0.85),
  walk(W.jct_nw, W.pond_path, 0.5),
  walk(W.pond_path, W.pond_bench, 0.45),
  wait(W.pond_bench, 2.0, 'down'),
  walk(W.pond_bench, W.pond_path, 0.45),
  walk(W.pond_path, W.jct_nw, 0.5),
  walk(W.jct_nw, W.hall_a_path, 0.2),
  walk(W.hall_a_path, W.hall_a_door, 0.85),
  wait(W.hall_a_door, 1.5, 'up'),
  walk(W.hall_a_door, W.hall_a_path, 0.85),
  walk(W.hall_a_path, W.jct_nw, 0.2),
  walk(W.jct_nw, W.plaza_w, 0.85),
  walk(W.plaza_w, W.plaza_c, 0.25),
  walk(W.plaza_c, W.plaza_n, 0.35),
  walk(W.plaza_n, W.lib_path, 0.7),
  walk(W.lib_path, W.lib_door, 0.7),
  wait(W.lib_door, 1.0, 'up'),
  walk(W.lib_door, W.lib_path, 0.7),
  walk(W.lib_path, W.plaza_n, 0.7),
  walk(W.plaza_n, W.plaza_c, 0.35),
  walk(W.plaza_c, W.plaza_s, 0.4),
  walk(W.plaza_s, W.gate_in, 0.85),
  walk(W.gate_in, W.gate, 0.5),
  wait(W.gate, 1.0, 'down'),
  walk(W.gate, W.gate_in, 0.5),
  walk(W.gate_in, W.gate, 0.5),
]);

// ── C17: library steady studier
const c17 = buildScript([
  walk(W.lib_door, W.lib_path, 0.7),
  walk(W.lib_path, W.plaza_n, 0.7),
  walk(W.plaza_n, W.plaza_c, 0.35),
  chat(W.plaza_c, '잠깐 산책 ✨', 1.5, 'right', 'down'),
  walk(W.plaza_c, W.plaza_w, 0.25),
  walk(W.plaza_w, W.jct_nw, 0.85),
  walk(W.jct_nw, W.pond_path, 0.5),
  walk(W.pond_path, W.pond_bench, 0.45),
  wait(W.pond_bench, 2.0, 'down'),
  walk(W.pond_bench, W.pond_path, 0.45),
  walk(W.pond_path, W.jct_nw, 0.5),
  walk(W.jct_nw, W.plaza_w, 0.85),
  walk(W.plaza_w, W.plaza_c, 0.25),
  walk(W.plaza_c, W.plaza_n, 0.35),
  walk(W.plaza_n, W.lib_path, 0.7),
  walk(W.lib_path, W.lib_door, 0.7),
  wait(W.lib_door, 2.0, 'up'),
  walk(W.lib_door, W.lib_path, 0.7),
  walk(W.lib_path, W.plaza_n, 0.7),
  walk(W.plaza_n, W.plaza_c, 0.35),
  walk(W.plaza_c, W.plaza_e, 0.25),
  walk(W.plaza_e, W.jct_se, 0.8),
  walk(W.jct_se, W.plaza_e, 0.8),
  walk(W.plaza_e, W.plaza_c, 0.25),
  walk(W.plaza_c, W.plaza_n, 0.35),
  walk(W.plaza_n, W.lib_path, 0.7),
  walk(W.lib_path, W.lib_door, 0.7),
]);

// ── C18: field side jogger, meets C8 implicitly
const c18 = buildScript([
  walk(W.field_c, meetL, 0.4),
  walk(meetL, { x: 920, y: 200 }, 0.85),
  walk({ x: 920, y: 200 }, { x: 920, y: 320 }, 0.85),
  walk({ x: 920, y: 320 }, { x: 720, y: 320 }, 0.85),
  walk({ x: 720, y: 320 }, W.field_c, 0.7),
  wait(W.field_c, 0.8, 'down'),
  walk(W.field_c, W.field_path, 0.7),
  walk(W.field_path, W.jct_ne, 0.4),
  walk(W.jct_ne, W.hall_b_path, 0.2),
  walk(W.hall_b_path, W.hall_b_door, 0.85),
  wait(W.hall_b_door, 1.0, 'up'),
  walk(W.hall_b_door, W.hall_b_path, 0.85),
  walk(W.hall_b_path, W.jct_ne, 0.2),
  walk(W.jct_ne, W.field_path, 0.4),
  walk(W.field_path, W.field_c, 0.7),
  walk(W.field_c, { x: 720, y: 240 }, 0.7),
  chat({ x: 720, y: 240 }, '한 바퀴 더! 🏃‍♀️', 1.5, 'right', 'right'),
  walk({ x: 720, y: 240 }, { x: 920, y: 220 }, 0.85),
  walk({ x: 920, y: 220 }, { x: 920, y: 340 }, 0.85),
  walk({ x: 920, y: 340 }, W.field_c, 0.85),
  walk(W.field_c, meetL, 0.4),
  walk(meetL, W.field_c, 0.4),
  walk(W.field_c, { x: 720, y: 200 }, 1.0),
  walk({ x: 720, y: 200 }, W.field_c, 1.0),
  walk(W.field_c, W.field_path, 0.7),
  walk(W.field_path, W.field_c, 0.7),
  walk(W.field_c, W.field_path, 0.7),
]);

// Heart pops at meet moments
const HEARTS = [
  { x: 540, y: 700, start: 3.7 },   // plaza C1+C2 meet
  { x: 770, y: 780, start: 7.5 },   // cafe C2+C3
  { x: 320, y: 780, start: 4.4 },   // dorm C6+C7
  { x: 565, y: 460, start: 4.9 },   // hall row C4+C5
  { x: 540, y: 855, start: 2.8 },   // gate path C9+C10
  { x: 285, y: 345, start: 2.4 },   // pond C11+C12
  { x: 760, y: 585, start: 3.0 },   // east path C13+C14
];

window.SCRIPTS = [c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18];
window.HEARTS = HEARTS;
