soul-symphony-ling
↓ 0 downloadsSoul Symphony — Ling Edition. A spiritual 3D adventure in the soul realm: collect the letters of the world-song, clear the monster lattice, and duel in the arcade arena. Wind Waker-style toon renderer with volumetric light pools, SSAO, bloom and oil-slick tilt-shift — all ling-lang vectors.
Keywords game, 3d, toon, music, soul-symphony
lingfu install soul-symphony-lingCode / Files (1947)
game/scenes/post_level1.ling
# ════════════════════════════════════════════════════════════════════════════
# post_level1.ling — บทโหมโรง: งานเทศกาลโน้ตแรก (prelude, ต่อจากอินโทร)
# ════════════════════════════════════════════════════════════════════════════
# ลำดับเรื่อง: อินโทร → ด่านทิวทอเรียล → บอส → ฉากนี้ → ด่านโปรซีเจน+บทที่ 1-8
# จึงเป็นฉากแรกสุดของชุดคัตซีน — วางโลก/กติกาหลิงให้ทุกบทที่ตามมา
#
# สกอร์: music/Festival.wav (โคมลอย 24 ดวงวางตามกลุ่มโน้ตจริงของ Festival.mid)
# อารมณ์: งานวัดสนธยาแบบ Napple Tale — โคมกระดาษ ริบบิ้น ใบไม้ร่วง ภูตกลมจิ๋ว
# กำกับเป็น 5 ช็อตตัดสลับ (เดินเข้างาน → หลักการหลิง → ห้าธาตุ → เพลงที่ยังไม่ครบ → ส่งตัวออกเดินทาง)
# บทพูด/กลิฟ/เสียงพากย์/ตารางเวลา คงของเดิมทุกตัว (ไฟล์เสียงพากย์ 102 ไฟล์อ้างอยู่)
# ── Character Mesh Loading: handles passed in as kMeshIn / qMeshIn from main ──
# ── Dialog Data ──────────────────────────────────────────────────────────────
ฟังก์ชัน โพสต์เลเวล1_บทพูดกลิฟ(ภาษา) {
ถ้า ภาษา == 0 {
คืน [
[8, 20, 8, 25, 8, -1, 23, 16, 25, 8, 20, -1, 24, 15, 16, 25, 8, 5, -1, 18, 21, 20, 21, -1, 19, 12, 11, 21, 3, -1, 19, 8, 11, 8, -1, 8, 20, 8, 25, 8, 4, 20, 21, -1, 13, 8, 24, 26, 25, 21, -1, 24, 26, 25, 12, 22, 22, 26, -1, 12, 18, 21, 5],
[18, 26, 23, 12, 16, 11, 21, 23, 26, -1, 23, 16, 11, 21, 5, 5, 5, -1, 24, 21, 23, 12, 3, -1, 22, 26, 23, 8, 16, 19, 21, 11, 16, 8, 23, 26, -1, 24, 21, 20, 14, 26, -1, 20, 21, -1, 13, 26, 23, 8, 14, 26, 19, 12, 20, 25, 21, -1, 18, 29, 8, 23, 16, 5],
[18, 26, 23, 21, 30, 26, 4, 20, 16, -1, 23, 16, 24, 26, 20, 5, -1, 23, 16, 8, 23, 16, 25, 16, -1, 17, 16, 25, 8, 16, 3, -1, 13, 8, 16, 9, 26, -1, 12, 23, 12, 19, 12, 20, 25, 8, 23, 26, -1, 25, 21, 20, -1, 18, 8, 23, 8, -1, 28, 21, 9, 26, 20, 5],
[8, 20, 8, 25, 8, -1, 19, 29, 26, 17, 16, 18, 18, 26, -1, 25, 21, -1, 29, 21, 9, 26, -1, 19, 21, 20, 21, 3, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 23, 16, 20, 14, 26, -1, 25, 21, -1, 29, 21, 9, 26, 5, -1, 21, 11, 8, 23, 16, 20, 14, 26, -1, 22, 26, 23, 16, 20, 24, 16, 22, 26, 23, 26, 5],
[13, 21, 19, 26, -1, 19, 8, 12, 3, -1, 9, 8, 16, 9, 26, 23, 12, 16, 24, 15, 21, 20, -1, 8, 25, 25, 8, 5, -1, 9, 8, 16, 9, 26, 23, 12, 16, 24, 15, 21, 20, -1, 19, 8, 12, 3, -1, 16, 20, 25, 12, 20, 24, 15, 21, 20, 5],
[22, 12, 20, 25, 8, 25, 21, 20, 16, 18, 18, 26, -1, 24, 26, 18, 12, 23, 26, 3, -1, 13, 8, 16, 9, 26, -1, 13, 12, 30, 26, -1, 21, 9, 26, -1, 25, 21, 23, 8, 20, 24, 26, 13, 21, 19, 12, 24, 15, 21, 20, -1, 19, 16, 23, 8, 8, 6],
[26, 11, 11, 21, 3, -1, 13, 8, 16, 8, 3, -1, 8, 24, 26, 3, -1, 19, 12, 25, 8, 23, 26, 3, -1, 28, 21, 25, 8, 5, -1, 18, 8, 18, 26, 4, 28, 8, 20, 3, -1, 18, 21, 24, 26, 19, 16, 18, 18, 26, -1, 23, 8, 25, 16, 24, 26, -1, 20, 21, -1, 13, 26, 23, 16, 18, 26, 12, 20, 24, 16, 5],
[15, 21, 28, 8, 16, 25, 21, -1, 24, 8, 16, 23, 12, 20, 24, 26, -1, 24, 15, 8, 25, 25, 8, -1, 24, 26, 23, 26, -1, 25, 21, 18, 16, 3, -1, 24, 21, 20, 14, 26, -1, 13, 26, 23, 8, 14, 26, 19, 12, 20, 25, 21, 4, 20, 16, -1, 24, 26, 18, 29, 8, 25, 25, 8, 5],
[18, 8, 18, 26, -1, 14, 8, 18, 18, 16, 3, -1, 15, 8, 19, 21, 20, 16, 18, 18, 26, -1, 15, 21, 23, 26, 11, 21, 5, -1, 18, 8, 18, 26, -1, 19, 12, 23, 21, 11, 16, 3, -1, 24, 26, 25, 8, 9, 16, 23, 16, 25, 16, -1, 20, 21, -1, 24, 26, 23, 12, 11, 21, 5],
[25, 21, 20, 16, 18, 18, 26, 3, -1, 23, 16, 8, 23, 16, 25, 16, -1, 8, 20, 18, 8, 5, -1, 11, 21, 19, 12, 20, 8, 20, 25, 21, 3, -1, 22, 21, 24, 24, 15, 16, 9, 16, 23, 16, 25, 16, -1, 21, 22, 26, 20, 5],
[24, 8, 9, 26, 11, 21, 19, 12, 20, 8, 20, 25, 21, 3, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 24, 21, 24, 26, 4, 20, 16, -1, 23, 16, 25, 8, 20, 5, -1, 18, 21, 23, 12, 3, -1, 15, 8, 19, 21, 20, 16, -1, 20, 21, -1, 11, 8, 21, 5],
[11, 12, 19, 21, -1, 24, 21, 20, 14, 26, 3, -1, 16, 20, 18, 21, 20, 22, 26, 23, 16, 25, 21, 5, -1, 21, 23, 26, -1, 13, 8, 16, 9, 26, -1, 14, 8, 18, 18, 16, -1, 20, 8, 24, 15, 16, 4, 11, 12, 5, 5, 5],
[24, 26, 25, 21, 23, 8, 18, 26, 10, 15, 8, 3, -1, 28, 16, 18, 26, 20, 5, -1, 17, 16, 19, 12, 20, 24, 15, 21, 20, 3, -1, 21, 25, 8, 14, 8, 16, 4, 20, 16, -1, 9, 26, 23, 16, 11, 21, 5],
[8, 20, 8, 25, 8, 3, -1, 13, 8, 16, 20, 8, 23, 26, -1, 24, 8, 16, 23, 12, 20, 24, 26, -1, 19, 8, 12, 3, -1, 23, 16, 19, 12, 16, 20, 16, 20, 14, 26, -1, 14, 8, 18, 18, 16, -1, 14, 29, 8, 30, 8, 4, 24, 26, 9, 12, 18, 16, 5],
[24, 21, 20, 21, -1, 25, 21, 18, 16, -1, 11, 8, 18, 12, 3, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 23, 16, 24, 26, 25, 21, 23, 12, 24, 15, 21, 20, -1, 24, 15, 16, 20, 13, 21, 20, 16, -1, 22, 8, 13, 21, 19, 26, -1, 11, 12, 18, 16, 23, 26, 5],
[23, 16, 19, 12, 19, 9, 8, 6, -1, 8, 20, 8, 25, 8, -1, 22, 26, 23, 12, 16, -1, 24, 26, 23, 26, -1, 18, 8, 18, 26, -1, 20, 21, 25, 21, 3, -1, 12, 14, 26, 17, 16, 24, 26, 25, 12, 20, 24, 26, -1, 20, 21, -1, 13, 8, 9, 23, 16, 18, 18, 26, -1, 23, 16, 16, 20, 13, 21, 24, 26, 5],
[16, 19, 8, -1, 14, 21, 21, 5, -1, 18, 26, 23, 16, 24, 26, 25, 8, 23, 26, -1, 18, 8, 9, 8, 20, 3, -1, 8, 28, 12, 16, 25, 21, 5, -1, 24, 12, 18, 8, 20, 11, 21, -1, 15, 8, 19, 21, 20, 16, 18, 18, 26, -1, 20, 21, -1, 25, 8, 19, 12, -1, 23, 16, 24, 26, 20, 5],
]
}
ถ้า ภาษา == 1 {
คืน [
[37, 27, 33, -1, 20, 13, 34, 17, -1, 30, 17, 32, 33, 30, 26, 17, 16, 6, -1, 32, 20, 17, -1, 25, 17, 13, 16, 27, 35, -1, 31, 32, 21, 24, 24, -1, 17, 15, 20, 27, 17, 31, -1, 35, 21, 32, 20, -1, 37, 27, 33, 30, -1, 18, 21, 30, 31, 32, -1, 31, 32, 17, 28, 31, 6],
[32, 20, 17, -1, 15, 30, 13, 16, 24, 17, -1, 30, 17, 17, 16, 6, 6, 6, -1, 21, 32, -1, 15, 13, 30, 30, 21, 17, 31, -1, 13, -1, 18, 30, 13, 19, 25, 17, 26, 32, -1, 27, 18, -1, 32, 20, 17, -1, 28, 30, 21, 25, 27, 30, 16, 21, 13, 24, -1, 31, 27, 26, 19, 6],
[24, 21, 31, 32, 17, 26, -1, 15, 24, 27, 31, 17, 24, 37, 6, -1, 30, 17, 13, 24, 21, 32, 37, -1, 21, 32, 31, 17, 24, 18, -1, 21, 31, -1, 35, 27, 34, 17, 26, -1, 18, 30, 27, 25, -1, 18, 21, 34, 17, -1, 17, 24, 17, 25, 17, 26, 32, 13, 24, -1, 32, 27, 26, 17, 31, 6],
[35, 20, 13, 32, -1, 37, 27, 33, -1, 15, 13, 24, 24, -1, 25, 33, 31, 21, 15, 4, -1, 35, 17, -1, 15, 13, 24, 24, -1, 24, 21, 26, 19, 6, -1, 32, 20, 17, -1, 27, 30, 16, 17, 30, 21, 26, 19, -1, 28, 30, 21, 26, 15, 21, 28, 24, 17, 6],
[14, 17, 18, 27, 30, 17, -1, 18, 27, 30, 25, 4, -1, 32, 20, 17, 30, 17, -1, 35, 13, 31, -1, 34, 21, 14, 30, 13, 32, 21, 27, 26, 6, -1, 14, 17, 18, 27, 30, 17, -1, 34, 21, 14, 30, 13, 32, 21, 27, 26, 4, -1, 21, 26, 32, 17, 26, 32, 21, 27, 26, 6],
[32, 20, 17, -1, 28, 17, 26, 32, 13, 32, 27, 26, 21, 15, -1, 31, 15, 13, 24, 17, -1, 25, 21, 30, 30, 27, 30, 31, -1, 32, 20, 17, -1, 18, 21, 34, 17, -1, 28, 20, 13, 31, 17, 31, -1, 27, 18, -1, 32, 30, 13, 26, 31, 18, 27, 30, 25, 13, 32, 21, 27, 26, 7],
[35, 27, 27, 16, 4, -1, 18, 21, 30, 17, 4, -1, 17, 13, 30, 32, 20, 4, -1, 25, 17, 32, 13, 24, 4, -1, 35, 13, 32, 17, 30, 6, -1, 17, 13, 15, 20, -1, 13, -1, 18, 30, 17, 29, 33, 17, 26, 15, 37, -1, 21, 26, -1, 32, 20, 17, -1, 15, 27, 31, 25, 21, 15, -1, 24, 13, 32, 32, 21, 15, 17, 6],
[35, 20, 17, 26, -1, 32, 20, 17, -1, 35, 20, 21, 32, 17, -1, 31, 21, 24, 17, 26, 15, 17, -1, 31, 20, 13, 32, 32, 17, 30, 17, 16, 4, -1, 32, 20, 17, -1, 31, 27, 26, 19, -1, 31, 15, 13, 32, 32, 17, 30, 17, 16, -1, 21, 26, 32, 27, -1, 18, 30, 13, 19, 25, 17, 26, 32, 31, 6],
[17, 13, 15, 20, -1, 21, 26, 31, 32, 30, 33, 25, 17, 26, 32, -1, 20, 27, 24, 16, 31, -1, 13, -1, 20, 13, 30, 25, 27, 26, 21, 15, 6, -1, 17, 13, 15, 20, -1, 25, 17, 24, 27, 16, 37, 4, -1, 13, -1, 32, 20, 30, 17, 13, 16, -1, 27, 18, -1, 31, 32, 13, 14, 21, 24, 21, 32, 37, 6],
[32, 20, 17, -1, 32, 27, 26, 21, 15, -1, 13, 26, 15, 20, 27, 30, 31, -1, 30, 17, 13, 24, 21, 32, 37, 6, -1, 32, 20, 17, -1, 16, 27, 25, 21, 26, 13, 26, 32, -1, 27, 28, 17, 26, 31, -1, 28, 27, 31, 31, 21, 14, 21, 24, 21, 32, 21, 17, 31, 6],
[32, 20, 17, -1, 31, 33, 14, 16, 27, 25, 21, 26, 13, 26, 32, -1, 30, 17, 32, 33, 30, 26, 31, -1, 33, 31, -1, 32, 27, -1, 32, 20, 17, -1, 31, 27, 33, 30, 15, 17, 6, -1, 32, 20, 21, 31, -1, 21, 31, -1, 32, 20, 17, -1, 16, 13, 27, -1, 27, 18, -1, 20, 13, 30, 25, 27, 26, 37, 6],
[14, 33, 32, -1, 32, 20, 17, -1, 31, 27, 26, 19, -1, 21, 31, -1, 21, 26, 15, 27, 25, 28, 24, 17, 32, 17, 6, -1, 35, 21, 32, 20, 27, 33, 32, -1, 13, 24, 24, -1, 18, 21, 34, 17, -1, 21, 26, 31, 32, 30, 33, 25, 17, 26, 32, 31, 6, 6, 6],
[32, 20, 17, -1, 31, 32, 30, 33, 15, 32, 33, 30, 17, -1, 35, 17, 13, 23, 17, 26, 31, 6, -1, 16, 21, 25, 17, 26, 31, 21, 27, 26, 31, -1, 14, 24, 17, 17, 16, -1, 21, 26, 32, 27, -1, 27, 26, 17, -1, 13, 26, 27, 32, 20, 17, 30, 6],
[37, 27, 33, -1, 25, 33, 31, 32, -1, 19, 13, 32, 20, 17, 30, -1, 32, 20, 17, -1, 30, 17, 25, 13, 21, 26, 21, 26, 19, -1, 21, 26, 31, 32, 30, 33, 25, 17, 26, 32, 31, -1, 14, 17, 18, 27, 30, 17, -1, 32, 20, 17, -1, 18, 21, 26, 13, 24, -1, 31, 21, 24, 17, 26, 15, 17, 6],
[27, 26, 24, 37, -1, 32, 20, 17, 26, -1, 15, 13, 26, -1, 35, 17, -1, 28, 17, 30, 18, 27, 30, 25, -1, 32, 20, 17, -1, 30, 17, 31, 32, 27, 30, 13, 32, 21, 27, 26, -1, 31, 37, 25, 28, 20, 27, 26, 37, 6],
[30, 17, 25, 17, 25, 14, 17, 30, 7, -1, 17, 13, 15, 20, -1, 26, 27, 32, 17, -1, 37, 27, 33, -1, 28, 24, 13, 37, -1, 30, 17, 21, 26, 18, 27, 30, 15, 17, 31, -1, 32, 20, 17, -1, 18, 13, 14, 30, 21, 15, -1, 27, 18, -1, 17, 36, 21, 31, 32, 17, 26, 15, 17, 6],
[19, 27, -1, 26, 27, 35, 6, -1, 32, 20, 17, -1, 15, 30, 37, 31, 32, 13, 24, -1, 15, 13, 34, 17, 30, 26, 31, -1, 13, 35, 13, 21, 32, 6, -1, 24, 21, 31, 32, 17, 26, -1, 18, 27, 30, -1, 32, 20, 17, -1, 31, 17, 15, 27, 26, 16, -1, 20, 13, 30, 25, 27, 26, 21, 15, 6],
]
}
ถ้า ภาษา == 2 {
คืน [
[149, 25, 133, 153, 41, 6, 101, 130, 62, 84, 133, 150, 106, 107, -1, 53, 20, 119, 34, 133, 88, 130, 20, 13, 20, 9, 123, 20, 113, 129, 55, 123, 57, 41, 107, 88, 9, 133, 107, 150, 93, 6, 10, 123, 20, 149, 25, 133, 123, 90, 149, 101, 88],
[65, 139, 149, 65, 101, 6, 105, 123, 84, 4, 4, 4, 84, 130, 57, 62, 93, 93, 52, 6, 149, 110, 112, 149, 113, 140, 88, 107, 119, 57, 144, 20, 10, 123, 20, 62, 51, 149, 76, 101, 20, 65, 36, 84, 6, 133, 101, 153, 109],
[21, 20, 79, 130, 20, 152, 121, 38, 138, -1, 13, 107, 133, 84, 149, 65, 155, 57, 21, 93, 135, 20, 149, 123, 20, 48, 6, 47, 130, 6, 51, 123, 10, 145, 57, 21, 133, 6, 149, 113, 138, 88, 20, 56, 133, 43, 51, 132, 20, 121, 133],
[113, 136, 20, 51, 139, 76, 107, 6, 149, 25, 133, 149, 93, 138, 88, 6, 108, 133, 38, 57, 42, 93, 138, -1, 76, 107, 6, 149, 93, 133, 149, 93, 138, 88, 6, 84, 130, 57, 108, 133, 119, 101, 135, 20, -1, 119, 101, 130, 6, 6, 133, 93, 150, 120, 20, 93, 129, 149, 62, 138, 88, 62],
[8, 123, 57, 21, 129, 84, 138, 96, 65, 51, 93, 20, -1, 84, 138, 6, 133, 93, 113, 131, 57, 113, 129, 149, 51, 146, 123, 57, -1, 8, 123, 57, 21, 129, 84, 138, 6, 133, 93, 113, 131, 57, 113, 129, 149, 51, 146, 123, 57, -1, 84, 138, 149, 21, 42, 21, 134, 57, 20],
[62, 130, 57, 153, 38, 149, 113, 138, 88, 20, 149, 76, 57, 51, 133, 151, 51, 57, 135, 6, 113, 129, 55, 123, 57, 121, 133, 93, 129, 88, 129, 150, 120, 20, 6, 133, 93, 149, 65, 101, 139, 88, 57, 150, 65, 101, 20],
[153, 87, -1, 153, 79, -1, 38, 135, 57, -1, 151, 101, 119, 129, -1, 61, 134, -1, 150, 45, 101, 129, 123, 91, 133, 20, 13, 146, 123, 13, 107, 133, 84, 47, 139, 119, 57, 144, 20, 152, 57, 151, 13, 93, 20, 42, 133, 11, 133, 88, 21, 130, 6, 93, 107, 133, 101],
[149, 84, 147, 123, 13, 107, 133, 84, 149, 20, 138, 88, 62, 113, 138, 10, 133, 107, 150, 42, 6, 113, 101, 133, 88, -1, 62, 51, 149, 76, 101, 20, 6, 155, 6, 93, 129, 21, 130, 38, 6, 93, 129, 21, 133, 88, 149, 65, 155, 57, 149, 110, 112, 149, 113, 140, 88, 107],
[149, 13, 93, 147, 123, 20, 38, 57, 42, 93, 138, 150, 45, 101, 129, 27, 137, 57, 47, 146, 123, 128, 133, 93, 156, 84, 123, 57, 135, 6, 153, 109, 119, 57, 144, 20, 149, 113, 138, 88, 20, -1, 51, 134, 57, 123, 20, 150, 45, 101, 129, 149, 76, 101, 20, 13, 146, 123, 149, 118, 57, 41, 133, 88, 150, 120, 20, 13, 107, 133, 84, 84, 131, 57, 13, 20],
[151, 51, 57, 135, 6, 88, 143, 38, 151, 88, 20, 13, 107, 133, 84, 149, 65, 155, 57, 21, 93, 135, 20, 153, 109, -1, 151, 38, 84, 135, 150, 57, 57, 42, 156, 149, 65, 135, 38, 13, 107, 133, 84, 149, 65, 155, 57, 153, 65, 153, 41, 45, 133, 20, 154],
[30, 130, 62, 151, 38, 84, 135, 150, 57, 57, 42, 156, 57, 134, 149, 93, 133, 6, 101, 130, 62, 13, 146, 57, 116, 46, 57, 6, 134, 149, 57, 135, 38, -1, 57, 139, 13, 146, 123, 107, 135, 47, 138, 150, 120, 20, 13, 107, 133, 84, 6, 101, 84, 6, 101, 146, 57],
[150, 45, 62, 51, 149, 76, 101, 20, 57, 140, 88, 130, 20, 153, 86, 113, 84, 63, 93, 37, 156, -1, 119, 133, 6, 65, 93, 133, 110, 21, 133, 6, 149, 13, 93, 147, 123, 20, 38, 57, 42, 93, 138, 51, 132, 20, 121, 133, 27, 137, 57, 4, 4, 4],
[151, 13, 93, 20, 113, 99, 133, 20, 21, 129, 125, 123, 57, 150, 123, 101, 20, -1, 84, 135, 42, 135, 45, 133, 20, 154, -1, 21, 129, 153, 119, 101, 65, 129, 65, 57, 149, 12, 133, 119, 133, 6, 130, 57],
[149, 25, 133, 46, 123, 20, 93, 107, 62, 93, 107, 84, 149, 13, 93, 147, 123, 20, 38, 57, 42, 93, 138, 51, 139, 149, 119, 101, 146, 123, 123, 90, 152, 121, 153, 41, 8, 123, 57, 13, 107, 133, 84, 149, 20, 138, 88, 62, 13, 93, 132, 20, 114, 38, 55, 133, 88, 21, 129, 84, 133, 47, 143, 20],
[149, 84, 147, 123, 57, 132, 57, 149, 54, 133, 57, 132, 57, 149, 93, 133, 21, 143, 20, 21, 129, 113, 133, 84, 133, 93, 47, 62, 93, 93, 149, 101, 20, 30, 135, 84, 151, 79, 57, 138, 150, 120, 20, 6, 133, 93, 79, 148, 57, 80, 153, 41],
[21, 20, 21, 134, 153, 109, 108, 133, -1, 52, 6, 151, 61, 42, 51, 139, 149, 25, 133, 62, 93, 93, 149, 101, 20, 21, 129, 149, 113, 93, 135, 84, 13, 107, 133, 84, 150, 10, 155, 20, 150, 6, 98, 20, 152, 121, 68, 146, 57, 73, 133, 150, 120, 20, 6, 133, 93, 38, 134, 93, 20, 123, 90],
[153, 65, 149, 47, 135, 38, 152, 57, 62, 130, 38, 57, 140, -1, 50, 134, 150, 9, 107, 68, 101, 143, 6, 6, 134, 101, 130, 20, 93, 123, 13, 123, 88, 123, 90, -1, 21, 20, 79, 130, 20, 119, 133, 128, 133, 93, 156, 84, 123, 57, 135, 6, 51, 139, 113, 123, 20],
]
}
ถ้า ภาษา == 3 {
คืน [
[60, 127, 17, -1, 136, 327, 364, 54, 367, 6, -1, 453, 375, 382, -1, 351, 406, 537, -1, 60, 127, 385, -1, 448, 30, 384, 381, 197, -1, 371, 206, 43, -1, 393, 340, 367],
[367, 176, -1, 20, 127, 115, 6, 6, 6, -1, 479, 453, 385, -1, 105, 179, 385, -1, 503, -1, 414, 18, 383, -1, 427, 118, 43, -1, 393, 340, 367],
[399, -1, 153, 340, 261, 298, 367, 6, -1, 515, 319, -1, 60, -1, 396, 450, 17, -1, 120, 295, -1, 375, 302, 385, -1, 384, 381, 197, -1, 434, 351, -1, 393, 340, 367],
[60, 127, 153, 386, -1, 384, 328, 386, 174, -1, 267, 201, 115, -1, 32, 383, 4, -1, 369, 206, 115, -1, 210, 386, 174, -1, 267, 205, 118, 120, 6, -1, 430, 292, 385, -1, 375, 206, 386, 427, 367],
[517, 479, 17, -1, 393, 65, -1, 406, 349, 4, -1, 429, 137, 386, -1, 393, 348, 340, 367, 6, -1, 429, 137, 386, -1, 393, 65, -1, 406, 349, 4, -1, 385, 134, 17, -1, 393, 348, 427, 367],
[359, 384, 42, 115, -1, 259, 523, 385, -1, 120, 295, -1, 122, 42, 203, -1, 272, 455, 340, 367, 15],
[86, 236, 4, -1, 270, 4, -1, 532, 4, -1, 64, 303, 4, -1, 240, 6, -1, 18, 18, 382, -1, 369, 420, -1, 36, 396, -1, 303, 385, -1, 502, 86, 385, -1, 420, 489, 307, 357, 367],
[502, 338, -1, 463, 237, 386, -1, 285, 285, 386, -1, 267, 292, 413, 383, -1, 164, 4, -1, 105, 179, 115, -1, 414, 18, 414, 18, -1, 535, 340, 413, 340, 367],
[18, -1, 328, 65, 115, -1, 253, 384, -1, 502, 86, 203, -1, 497, 43, -1, 393, 340, 367, 6, -1, 18, -1, 294, 380, 382, 4, -1, 329, 410, 385, -1, 503, -1, 17, 121, 386, 427, 367],
[381, 172, 384, 382, -1, 515, 319, 383, -1, 43, 410, 317, 467, 367, 6, -1, 161, 209, 384, 382, -1, 17, 117, 297, 383, -1, 353, 427, 367],
[254, 64, 161, 209, 384, 382, -1, 369, 206, 203, -1, 62, 375, 381, 197, -1, 140, 136, 192, 367, 6, -1, 386, 32, 386, -1, 414, 523, 385, -1, 134, 357, 367],
[502, 427, 213, -1, 105, 179, 115, -1, 243, 363, 297, 386, 349, 367, 6, -1, 120, 295, -1, 328, 65, 17, -1, 229, 143, -1, 346, 120, 226, 6, 6, 6],
[53, 414, 17, -1, 337, 508, 427, 43, 4, -1, 439, 375, 153, 386, -1, 292, 197, -1, 148, 293, 386, 33, -1, 138, 367],
[211, 427, 212, -1, 463, 237, 386, -1, 359, 65, -1, 406, 349, -1, 89, 382, -1, 328, 65, 153, 383, -1, 229, 327, 336, -1, 508, 367],
[60, 179, 336, 213, -1, 369, 206, 115, -1, 262, 375, 385, -1, 52, 511, 44, 383, -1, 352, 420, 504, -1, 307, -1, 393, 340, 367],
[65, 341, 502, 298, 367, 15, -1, 60, 127, 17, -1, 352, 420, 502, 115, -1, 229, 151, -1, 384, 495, 115, -1, 416, 403, 385, -1, 428, 240, 383, -1, 23, 523, 508, 367],
[386, 411, -1, 17, 298, 367, 6, -1, 307, 410, -1, 137, 55, 386, -1, 65, 120, 206, 43, -1, 393, 340, 367, 6, -1, 143, -1, 255, 436, -1, 253, 384, 383, -1, 153, 340, 261, 298, 367],
]
}
ถ้า ภาษา == 4 {
คืน [
[323, 38, 35, 16, 7, 516, 191, 50, 59, 36, 6, 15, 182, 49, 372, 181, 49, 123, 396, 75, 607, 16, 31, 41, 12, 71],
[66, 70, 16, 25, 49, 518, 474, 5, 5, 33, 72, 50, 191, 181, 49, 393, 49, 391, 429, 75, 263, 27, 41, 12, 71, 49, 42, 29],
[68, 20, 503, 22, 7, 435, 259, 33, 49, 63, 49, 17, 6, 139, 39, 49, 165, 485, 49, 605, 16, 69, 497, 69, 72, 41, 12, 71, 49, 36],
[11, 45, 35, 359, 17, 605, 386, 43, 205, 54, 63, 49, 75, 6, 462, 35, 37, 50, 9, 600, 1, 115, 120, 2, 10, 43, 205, 53, 59, 29, 7, 464, 287, 49, 191, 437, 42, 29],
[297, 49, 182, 46, 50, 339, 184, 17, 11, 38, 35, 7, 339, 184, 49, 182, 46, 50, 318, 308, 17, 11, 38, 35],
[139, 605, 605, 592, 50, 6, 233, 187, 49, 139, 39, 49, 398, 592, 75, 365, 27, 41, 12, 59, 29],
[376, 6, 421, 6, 221, 6, 576, 6, 401, 7, 33, 72, 34, 72, 17, 253, 257, 49, 384, 249, 49, 134, 49, 123, 39, 49, 203, 405, 353, 42, 29],
[445, 12, 402, 624, 17, 456, 22, 35, 366, 6, 393, 63, 59, 35, 391, 429, 43, 45, 38, 41, 352, 69, 51, 38, 35],
[33, 72, 34, 72, 49, 386, 213, 50, 155, 605, 75, 123, 39, 263, 27, 41, 12, 59, 29, 7, 33, 72, 34, 72, 49, 360, 301, 50, 6, 255, 258, 49, 123, 378, 49, 483, 42, 29],
[135, 605, 50, 435, 259, 75, 496, 19, 43, 62, 6, 275, 605, 50, 196, 505, 313, 75, 586, 20],
[129, 275, 605, 50, 462, 35, 37, 75, 414, 55, 43, 566, 72, 323, 27, 59, 29, 7, 24, 72, 17, 538, 206, 49, 570, 1, 95, 83, 2, 42, 29],
[36, 17, 393, 50, 59, 36, 130, 256, 169, 36, 7, 139, 39, 49, 386, 213, 29, 56, 41, 17, 343, 74, 45, 22, 72, 51, 5, 5],
[388, 565, 17, 292, 59, 70, 6, 392, 165, 198, 231, 17, 417, 60, 197, 38, 41, 27, 59, 12, 59, 29],
[372, 302, 49, 402, 624, 17, 534, 72, 71, 182, 46, 6, 397, 70, 49, 386, 213, 75, 595, 62, 48, 51, 45, 69, 47],
[33, 49, 366, 181, 62, 41, 6, 462, 35, 37, 50, 304, 165, 49, 141, 607, 370, 75, 242, 42, 71, 24, 43, 17, 42, 18, 71, 49, 42, 29],
[528, 14, 41, 15, 20, 17, 12, 12, 7, 15, 182, 17, 242, 42, 71, 123, 605, 123, 605, 17, 6, 251, 222, 49, 497, 430, 75, 294, 62, 71, 49, 36],
[26, 11, 521, 18, 45, 26, 12, 7, 401, 367, 49, 407, 470, 17, 300, 38, 41, 12, 59, 29, 7, 476, 138, 155, 605, 46, 501, 75, 419, 59, 31, 41],
]
}
ถ้า ภาษา == 5 {
คืน [
[78, 205, 457, 38, 8, 755, 548, 691, 145, 51, 205, 692, 582, 78, 447, 120, 573, 675, 484, 228],
[773, 412, 408, 624, 686, 615, 6, 6, 255, 379, 747, 582, 145, 120, 32, 480, 573, 11, 24, 548, 486],
[53, 637, 171, 8, 556, 263, 454, 739, 850, 482, 436, 565, 43, 599, 91, 630, 32, 819, 653, 638, 664, 366, 573],
[78, 57, 370, 602, 573, 819, 34, 850, 367, 57, 602, 32, 27, 9, 535, 10, 8, 773, 436, 600, 307, 573, 145, 561],
[216, 325, 342, 32, 126, 850, 449, 397, 133, 8, 216, 397, 133, 32, 126, 850, 449, 361, 341],
[43, 228, 819, 800, 435, 544, 582, 152, 137, 573, 43, 24, 800, 486, 851],
[451, 7, 532, 7, 215, 7, 782, 7, 493, 8, 489, 11, 663, 850, 775, 436, 256, 260, 469, 657, 25, 573, 11, 24, 825, 553],
[323, 773, 548, 572, 683, 573, 270, 815, 590, 591, 432, 850, 773, 833, 480, 36, 805, 32, 418, 77, 38, 591, 548],
[489, 58, 34, 202, 775, 379, 747, 582, 11, 24, 505, 819, 8, 489, 486, 426, 332, 850, 775, 436, 11, 468, 604, 261, 32, 635],
[28, 819, 790, 261, 556, 263, 850, 285, 819, 315, 172, 158, 673],
[16, 285, 819, 296, 367, 57, 205, 322, 454, 522, 8, 755, 80, 436, 179, 726, 32, 769],
[69, 755, 833, 480, 277, 452, 259, 421, 8, 689, 500, 449, 95, 774, 43, 58, 34, 202, 6, 6],
[641, 460, 278, 65, 125, 320, 850, 647, 310, 80, 65, 328, 483, 518, 762, 45, 700],
[78, 337, 822, 216, 447, 639, 573, 270, 815, 802, 26, 32, 126, 850, 413, 809, 845, 128, 75, 573, 34, 202],
[189, 449, 773, 432, 850, 367, 57, 373, 673, 528, 245, 773, 833, 231, 145, 45, 185, 443],
[715, 72, 851, 78, 321, 245, 573, 489, 11, 24, 819, 616, 850, 775, 216, 132, 210, 253, 216, 32, 638],
[556, 216, 278, 146, 170, 8, 493, 439, 508, 605, 482, 619, 330, 582, 78, 8, 53, 637, 667, 171, 617, 40, 505, 819],
]
}
คืน []
}
ฟังก์ชัน โพสต์เลเวล1_บทพูด(ภาษา) {
ถ้า ภาษา == 0 {
คืน [
"anata ritan shita. kono medo, mada anata-no fasuto suteppu eko.",
"kureidoru rido... sore, puraimodiaru songu no furagumento kyari.",
"kurozu-ni risun. riariti jitai, faibu erementaru ton kara wobun.",
"anata myujikku to yobu mono, wareware ringu to yobu. odaringu purinsipuru.",
"fomu mae, baibureishon atta. baibureishon mae, intenshon.",
"pentatonikku sukeru, faibu fezu obu toransufomeshon miraa:",
"uddo, faia, asu, metaru, wota. kaku-wan, kosumikku ratisu no furikuensi.",
"howaito sairensu shatta suru toki, songu furagumento-ni sukyatta.",
"kaku gakki, hamonikku horudo. kaku merodi, sutabiriti no suredo.",
"tonikku, riariti anka. domenanto, posshibiriti opun.",
"sabudomenanto, wareware sosu-ni ritan. kore, hamoni no dao.",
"demo songu, inkonpurito. oru faibu gakki nashi-de...",
"sutorakucha, wikun. jimenshon, otagai-ni burido.",
"anata, fainaru sairensu mae, rimeiningu gakki gyaza-subeki.",
"sono toki dake, wareware risutoreshon shinfoni pafomu dekiru.",
"rimemba: anata purei suru kaku noto, egujisutensu no fabrikku riinfosu.",
"ima goo. kurisutaru kaban, aweito. sekando hamonikku no tame risun."
]
}
ถ้า ภาษา == 2 {
คืน [
"เจ้าได้กลับมาแล้ว ทุ่งหญ้ายังคงก้องสะท้อนด้วยก้าวแรกของเจ้าอยู่เลย",
"ปี่เปลกล่อม...มันบรรทุกเศษเสี้ยวหนึ่งของบทเพลงปฐมกาลไว้",
"จงฟังให้ดี ความเป็นจริงเองถูกถักทอขึ้นจากเสียงธาตุทั้งห้า",
"สิ่งที่พวกเจ้าเรียกว่าดนตรี พวกเราเรียกมันว่าหลิง หลักการแห่งระเบียบ",
"ก่อนจะมีรูปทรง มีการสั่นสะเทือน ก่อนจะมีการสั่นสะเทือน มีเจตจำนง",
"บันไดเสียงเพนทาโทนิกสะท้อนห้าระยะแห่งการเปลี่ยนแปลง",
"ไม้ ไฟ ดิน โลหะ น้ำ แต่ละอย่างคือความถี่หนึ่งในโครงตาข่ายจักรวาล",
"เมื่อความเงียบสีขาวแตกสลาย บทเพลงก็กระจัดกระจายเป็นเศษเสี้ยว",
"เครื่องดนตรีแต่ละชิ้นถือฮาร์มอนิกไว้หนึ่งเสียง ทำนองแต่ละเพลงคือเส้นด้ายแห่งความมั่นคง",
"โทนิกยึดโยงความเป็นจริงไว้ โดมิแนนต์เปิดความเป็นไปได้ต่างๆ",
"ซับโดมิแนนต์นำเรากลับคืนสู่ต้นกำเนิด นี่คือวิถีแห่งความกลมกลืน",
"แต่บทเพลงนี้ยังไม่สมบูรณ์ หากปราศจากเครื่องดนตรีทั้งห้าชิ้น...",
"โครงสร้างจะอ่อนแอลง มิติต่างๆ จะไหลปะปนเข้าหากัน",
"เจ้าต้องรวบรวมเครื่องดนตรีที่เหลืออยู่ให้ได้ก่อนความเงียบครั้งสุดท้ายจะมาถึง",
"เมื่อนั้นเท่านั้นเราจึงจะสามารถบรรเลงซิมโฟนีแห่งการฟื้นฟูได้",
"จงจำไว้ว่า ทุกโน้ตที่เจ้าบรรเลงจะเสริมความแข็งแกร่งให้ผืนผ้าแห่งการดำรงอยู่",
"ไปเถิดในบัดนี้ ถ้ำแก้วผลึกกำลังรอคอยอยู่ จงฟังหาฮาร์มอนิกที่สอง"
]
}
ถ้า ภาษา == 3 {
คืน [
"그대가 돌아왔군요. 초원은 여전히 그대의 첫걸음으로 울리고 있어요",
"요람 갈대는... 태초의 노래의 한 조각을 지니고 있어요",
"잘 들어보세요. 현실 그 자체가 다섯 원소의 음으로 짜여 있어요",
"그대들이 음악이라 부르는 것을, 우리는 링이라 부릅니다. 질서의 원리이지요",
"형태가 있기 전에, 진동이 있었어요. 진동이 있기 전에, 의도가 있었지요",
"오음계는 변화의 다섯 단계를 비추어요:",
"나무, 불, 흙, 금속, 물. 각각은 우주 격자 속의 하나의 주파수예요",
"하얀 침묵이 산산이 부서졌을 때, 노래는 조각조각 흩어졌어요",
"각 악기는 배음 하나를 품고 있어요. 각 선율은, 안정의 한 가닥이지요",
"으뜸음은 현실을 고정시켜요. 딸림음은 가능성을 열지요",
"버금딸림음은 우리를 근원으로 되돌려요. 이것이 조화의 도예요",
"하지만 노래는 미완성이에요. 다섯 악기가 모두 없다면...",
"구조가 약해지고, 차원들이 서로 뒤섞이게 돼요",
"마지막 침묵이 오기 전에 남은 악기들을 모아야 해요",
"그래야만 우리는 복원의 교향곡을 연주할 수 있어요",
"기억하세요: 그대가 연주하는 모든 음표는 존재의 직물을 강화해요",
"이제 가세요. 수정 동굴이 기다리고 있어요. 두 번째 배음을 들어보세요"
]
}
ถ้า ภาษา == 4 {
คืน [
"戻ったか。草原はまだ、お前の最初の一歩を響かせている",
"ゆりかごの葦笛……それは原初の歌の欠片を宿しているのです",
"よく聞け。現実そのものが、五つの元素の音から織られているのだ",
"あなた方が音楽と呼ぶものを、私たちは『霊(リン)』と呼びます。秩序の原理です",
"形の前には振動があった。振動の前には意志があった",
"五音音階は、変化の五つの段階を映しています",
"木、火、土、金、水。それぞれが宇宙の格子の中の一つの周波数です",
"白い沈黙が砕けた時、歌もまた欠片となって散らばった",
"それぞれの楽器は倍音を一つ宿しています。それぞれの旋律は、安定の一本の糸です",
"主音は現実を繋ぎとめ、属音は可能性を開く",
"下属音は私たちを源へと連れ戻します。これが調和の道(タオ)です",
"だが歌はまだ不完全だ。五つの楽器すべてが揃わなければ……",
"構造が弱まり、次元同士が滲み合ってしまいます",
"最後の沈黙が訪れる前に、残りの楽器を集めねばならぬ",
"その時初めて、私たちは復元の交響曲を奏でることができるのです",
"覚えておくがいい。お前が奏でる一音一音が、存在の織物を強めるのだ",
"さあ行きなさい。水晶の洞窟が待っています。第二倍音に耳を澄ませて"
]
}
ถ้า ภาษา == 5 {
คืน [
"你回来了。这片草原仍回荡着你最初的脚步声",
"那支摇篮芦笛……它承载着原初之歌的一个片段",
"仔细听。现实本身,正是由五种元素之音编织而成的",
"你们所称的音乐,我们称之为「灵」。那是秩序的原理",
"在形态之前,有振动。在振动之前,有意念",
"五声音阶映照着变化的五个阶段:",
"木、火、土、金、水。每一者,都是宇宙格网中的一个频率",
"当那片白色的寂静破碎时,那首歌也随之散作了碎片",
"每件乐器都承载着一个泛音。每段旋律,都是一根稳定之线",
"主音锚定现实,属音开启可能",
"下属音带我们回归本源。这便是和谐之道",
"但这首歌尚未完整。若没有全部五件乐器……",
"结构就会削弱,维度便会彼此渗透交融",
"你必须在最终的寂静降临之前,收集齐剩余的乐器",
"唯有那时,我们才能演奏那首复原交响曲",
"记住:你弹奏的每一个音符,都在加固存在之织",
"现在就去吧。水晶洞穴正等待着你。仔细聆听第二泛音"
]
}
คืน [
"you have returned. the meadow still echoes with your first steps.",
"the cradle reed... it carries a fragment of the primordial song.",
"listen closely. reality itself is woven from five elemental tones.",
"what you call music, we call ling. the ordering principle.",
"before form, there was vibration. before vibration, intention.",
"the pentatonic scale mirrors the five phases of transformation:",
"wood, fire, earth, metal, water. each a frequency in the cosmic lattice.",
"when the white silence shattered, the song scattered into fragments.",
"each instrument holds a harmonic. each melody, a thread of stability.",
"the tonic anchors reality. the dominant opens possibilities.",
"the subdominant returns us to the source. this is the dao of harmony.",
"but the song is incomplete. without all five instruments...",
"the structure weakens. dimensions bleed into one another.",
"you must gather the remaining instruments before the final silence.",
"only then can we perform the restoration symphony.",
"remember: each note you play reinforces the fabric of existence.",
"go now. the crystal caverns await. listen for the second harmonic."
]
}
# Speaker index: 0 = King, 1 = Queen
ฟังก์ชัน โพสต์เลเวล1_ผู้พูด() {
คืน [0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
}
# รหัสผู้พูดสำหรับพากย์เสียง (ต้องตรงกับ tools/voiceover/manifest.py ทุกตัวอักษร)
ฟังก์ชัน โพสต์เลเวล1_ผู้พูดรหัส() {
คืน ["king", "queen", "king", "queen", "king", "queen", "queen", "king", "queen", "king", "queen", "king", "queen", "king", "queen", "king", "queen"]
}
# ระยะเวลาเล่นต่อบรรทัด (วิ) ตามภาษาพากย์เสียงจริง — ให้ฉากรอเสียงพากย์จบก่อนตัด
# บรรทัด แทนจังหวะตายตัว 4.5 วิ/บรรทัดเดิม ภาษาที่ยังไม่มีเสียงพากย์ใช้จังหวะเดิมไปก่อน
ฟังก์ชัน โพสต์เลเวล1_ระยะเวลา(lang) {
ถ้า lang == "ko" { คืน [8.10, 5.62, 5.30, 8.98, 7.38, 3.62, 8.42, 8.18, 7.38, 8.26, 7.22, 4.98, 5.22, 4.18, 6.98, 6.58, 8.26] }
ถ้า lang == "ja" { คืน [6.74, 6.42, 6.34, 7.38, 6.50, 4.82, 8.90, 5.62, 8.74, 6.18, 8.66, 4.98, 5.30, 5.78, 6.82, 8.74, 7.70] }
ถ้า lang == "zh" { คืน [5.86, 4.02, 5.86, 6.10, 6.82, 2.42, 7.78, 6.26, 6.26, 4.74, 5.14, 4.02, 4.18, 7.62, 3.94, 5.06, 6.74] }
ถ้า lang == "daemon" { คืน [6.02, 4.82, 6.02, 6.82, 4.66, 5.38, 9.22, 5.30, 5.94, 6.10, 6.26, 6.74, 4.50, 6.82, 4.98, 10.34, 6.42] }
ถ้า lang == "th" { คืน [4.64, 4.68, 4.40, 4.64, 5.00, 4.28, 4.78, 4.66, 5.68, 4.60, 5.08, 4.48, 4.54, 5.04, 4.80, 5.48, 5.20] }
ถ้า lang == "en" { คืน [4.42, 4.50, 5.14, 3.94, 6.58, 4.74, 7.62, 4.02, 7.22, 5.38, 5.22, 5.46, 4.58, 5.06, 3.14, 4.82, 5.46] }
bind d = 4.5; bind out = []
bind i = 0
ขณะที่ i < 17 { bind out = list_push(out, d); bind i = i + 1 }
คืน out
}
# Musical notes for typewriter sound (pentatonic scale, tuned to dialog)
# C D E G A pattern - the five elemental tones
ฟังก์ชัน โพสต์เลเวล1_โน้ต() {
คืน [
261.63, # C - Wood (King intro)
293.66, # D - Fire (Queen intro)
329.63, # E - Earth
392.00, # G - Metal
440.00, # A - Water
392.00, # G - Metal (return)
329.63, # E - Earth (cycle)
261.63, # C - Wood
293.66, # D - Fire
392.00, # G - Metal (dominant)
440.00, # A - Water (subdominant)
261.63, # C - Wood (tonic anchor)
293.66, # D - Fire
329.63, # E - Earth
392.00, # G - Metal
261.63, # C - Wood (return to source)
440.00 # A - Water (opening)
]
}
# ── สีสัน ────────────────────────────────────────────────────────────────────
# สีรุ้งวน (hue h เรเดียน) → [r,g,b] 0-255 (สูตรเดียวกับ ฉากบทหนึ่ง_สีวน)
ฟังก์ชัน โพสต์เลเวล1_สีวน(h) {
คืน [floor((ไซน์(h)*0.5+0.5)*205+50), floor((ไซน์(h+2.094)*0.5+0.5)*205+50), floor((ไซน์(h+4.189)*0.5+0.5)*205+50)]
}
# ห้าธาตุ ไม้-ไฟ-ดิน-โลหะ-น้ำ — สีโคมประจำธาตุ เรียงตรงกับ โพสต์เลเวล1_โน้ต
ฟังก์ชัน โพสต์เลเวล1_สีธาตุ(i) {
ถ้า i < 0.5 { คืน [125, 220, 135] } # ไม้ — เขียวใบอ่อน
ถ้า i < 1.5 { คืน [255, 125, 70] } # ไฟ — ส้มพลับ
ถ้า i < 2.5 { คืน [235, 190, 110] } # ดิน — เหลืองดินเผา
ถ้า i < 3.5 { คืน [226, 232, 245] } # โลหะ — ขาวเงิน
คืน [110, 175, 255] # น้ำ — ฟ้าคราม
}
# ── แนปเปิล: ภูตกลมจิ๋วประจำงานเทศกาล (ทรงกลมแบน + ตาสามเหลี่ยม + ก้านใบ) ──
# หน้า "หันตามกล้อง" เสมอ: คำนวณเวกเตอร์ระนาบพื้นจากตัวไปหากล้อง (nx,nz) แล้ววาง
# ตา/แก้มบนระนาบนั้น (rx,rz = เวกเตอร์ขวาตั้งฉาก) — ตรึงหน้าไว้ที่ -z ตายตัวไม่พอ
# เพราะช็อตเครน/ช็อตส่งตัวกล้องเหวี่ยงไปอีกฝั่ง แล้วหน้าจะหันหนีจนไม่เห็นตา
# y ติดลบ = ขึ้นบน (เหมือนทุกฉาก) — ตา/ก้านใบจึงใช้ค่า y ที่ลบลงไป
# สามเหลี่ยมสองหน้า: วาดซ้ำสลับลำดับจุด เพื่อไม่ให้ backface culling กินหน้าตาแนปเปิล
# ไม่ว่าเวกเตอร์ขวา (rx,rz) จะกลับด้านตามมุมกล้องช็อตไหน
ฟังก์ชัน โพสต์เลเวล1_สองหน้า(ax, ay, az, bx, by, bz, cx, cy, cz) {
วาดสามเหลี่ยม3มิติ(ax, ay, az, bx, by, bz, cx, cy, cz)
วาดสามเหลี่ยม3มิติ(bx, by, bz, ax, ay, az, cx, cy, cz)
}
ฟังก์ชัน โพสต์เลเวล1_แนปเปิล(x, y, z, r, กระพริบ, cr, cg, cb, camX, camZ) {
set_flat_shade(1.0)
สีดินสอ(floor(cr*0.58), floor(cg*0.58), floor(cb*0.58)) # หรี่ตัวลง ไม่ให้บลูมกลืนเป็นก้อนขาว
sphere(x, y, z, r, r*0.92, r, 0.0, 0.0, 0.0, 0, 12, 9)
bind dx = camX - x; bind dz = camZ - z
bind dl = รากที่สอง(dx*dx + dz*dz)
ถ้า dl < 0.001 { bind dl = 0.001 }
bind nx = dx/dl; bind nz = dz/dl # หน่วยเวกเตอร์ชี้เข้าหากล้อง
bind rx = 0.0 - nz; bind rz = nx # เวกเตอร์ขวาบนระนาบหน้า
bind fx = x + nx*r*0.86; bind fz = z + nz*r*0.86 # ระนาบใบหน้า (ยกออกมาหน้าตัว)
สีดินสอ(22, 18, 26)
ถ้า กระพริบ < 0.5 {
โพสต์เลเวล1_สองหน้า(fx - rx*r*0.60, y + r*0.02, fz - rz*r*0.60, fx - rx*r*0.22, y + r*0.02, fz - rz*r*0.22, fx - rx*r*0.41, y - r*0.52, fz - rz*r*0.41)
โพสต์เลเวล1_สองหน้า(fx + rx*r*0.22, y + r*0.02, fz + rz*r*0.22, fx + rx*r*0.60, y + r*0.02, fz + rz*r*0.60, fx + rx*r*0.41, y - r*0.52, fz + rz*r*0.41)
}
มิฉะนั้น {
โพสต์เลเวล1_สองหน้า(fx - rx*r*0.60, y - r*0.20, fz - rz*r*0.60, fx - rx*r*0.22, y - r*0.20, fz - rz*r*0.22, fx - rx*r*0.41, y - r*0.32, fz - rz*r*0.41)
โพสต์เลเวล1_สองหน้า(fx + rx*r*0.22, y - r*0.20, fz + rz*r*0.22, fx + rx*r*0.60, y - r*0.20, fz + rz*r*0.60, fx + rx*r*0.41, y - r*0.32, fz + rz*r*0.41)
}
สีดินสอ(floor(cr*0.34), floor(cg*0.30), floor(cb*0.30)) # แก้มจิ๋ม
โพสต์เลเวล1_สองหน้า(fx - rx*r*0.74, y + r*0.20, fz - rz*r*0.74, fx - rx*r*0.46, y + r*0.20, fz - rz*r*0.46, fx - rx*r*0.60, y + r*0.34, fz - rz*r*0.60)
โพสต์เลเวล1_สองหน้า(fx + rx*r*0.46, y + r*0.20, fz + rz*r*0.46, fx + rx*r*0.74, y + r*0.20, fz + rz*r*0.74, fx + rx*r*0.60, y + r*0.34, fz + rz*r*0.60)
flush_3d()
set_flat_shade(0.0)
สีดินสอ(70, 130, 78)
วาดเส้น3มิติ(x, y - r*0.92, z, x + r*0.34, y - r*1.58, z) # ก้านใบบนหัว
วาดเส้น3มิติ(x + r*0.34, y - r*1.58, z, x + r*0.78, y - r*1.34, z)
}
# ── โคมกระดาษบนเสา: เสาไม้ + ตัวโคม + ไส้เรืองแสง ──
ฟังก์ชัน โพสต์เลเวล1_เสาโคม(x, z, สูงเสา, r, cr, cg, cb, สว่าง, มืด) {
set_flat_shade(0.0)
สีดินสอ(floor(74*มืด), floor(56*มืด), floor(44*มืด))
cylinder(x, 0.2 - สูงเสา*0.5, z, 0.16, สูงเสา*0.5, 0.16, 0.0, 0.0, 0.0, 0, 8)
flush_3d()
# ตัวโคม: ทึบ + หรี่ไว้ใต้จุดบลูม สีกระดาษจึงไม่ถูกกลืนเป็นขาว
set_flat_shade(1.0)
bind ตัวสว่าง = (0.34 + 0.42*สว่าง) * มืด
สีดินสอ(floor(cr*ตัวสว่าง), floor(cg*ตัวสว่าง*0.80), floor(cb*ตัวสว่าง*0.54))
cylinder(x, 0.2 - สูงเสา - r*0.85, z, r, r*1.15, r, 0.0, 0.0, 0.0, 0, 12)
flush_3d()
set_flat_shade(0.0)
# ไส้เรืองแสงจาง ๆ (แอดดิทีฟเบา ๆ ให้รู้สึกว่ามีไฟอยู่ข้างใน)
โหมดผสม(1)
สีดินสอ(floor(cr*0.30*สว่าง*มืด), floor(cg*0.24*สว่าง*มืด), floor(cb*0.14*สว่าง*มืด))
set_flat_shade(1.0)
sphere(x, 0.2 - สูงเสา - r*0.85, z, r*0.55, r*0.62, r*0.55, 0.0, 0.0, 0.0, 0, 8, 6)
flush_3d(); set_flat_shade(0.0); โหมดผสม(0)
}
# ── ริบบิ้นระบายพาดระหว่างเสา: เส้นโค้งตกท้องช้าง 8 ท่อน ──
ฟังก์ชัน โพสต์เลเวล1_ริบบิ้น(x0, y0, z0, x1, y1, z1, ตก, กระเพื่อม) {
bind rs = 0
ขณะที่ rs < 8 {
bind u0 = rs / 8.0
bind u1 = (rs + 1) / 8.0
bind s0 = ไซน์(u0 * 3.1416)
bind s1 = ไซน์(u1 * 3.1416)
วาดเส้น3มิติ(
x0 + (x1-x0)*u0, y0 + (y1-y0)*u0 + ตก*s0 + ไซน์(กระเพื่อม + u0*6.0)*0.35, z0 + (z1-z0)*u0,
x0 + (x1-x0)*u1, y0 + (y1-y0)*u1 + ตก*s1 + ไซน์(กระเพื่อม + u1*6.0)*0.35, z0 + (z1-z0)*u1
)
bind rs = rs + 1
}
}
# ── ฉากหลัก ─────────────────────────────────────────────────────────────────
# ฟังก์ชันมองไม่เห็น local ใน do-block ของ main → รับทุกอย่างเป็นพารามิเตอร์
# (แพตเทิร์นเดียวกับ เล่นฉากบทหนึ่ง) — บท/โน้ต/ผู้พูดดึงจากฟังก์ชันของโมดูลเอง
#
# บรรทัดก่อน = ดัชนีบรรทัดที่ยิงเสียงไปแล้ว · ธาตุจุดแล้ว = จำนวนโคมธาตุที่จุดเสียงไปแล้ว
# คืน [บรรทัดก่อน, ธาตุจุดแล้ว, ออก]
ฟังก์ชัน เล่นโพสต์เลเวล1(t, เริ่มฉาก, บรรทัดก่อน, ธาตุจุดแล้ว, musicOn, ปริมาณBGM, ปริมาณSFX, เพลงฉาก, ยาวเพลงฉาก, kCutMesh, qCutMesh, liq, ภาษา, แสดงบทพูด, ภาษาบทพูด, ระยะเวลาไดนามิก) {
bind พูด = โพสต์เลเวล1_บทพูด(ภาษาแสดงผล(ภาษา))
bind พูดกลิฟ = โพสต์เลเวล1_บทพูดกลิฟ(ภาษาบทพูด)
bind โน้ต = โพสต์เลเวล1_โน้ต()
bind ผู้พูด = โพสต์เลเวล1_ผู้พูด()
bind ผู้พูดรหัส = โพสต์เลเวล1_ผู้พูดรหัส()
bind ระยะเวลา = ระยะเวลาไดนามิก
bind pt = t - เริ่มฉาก
bind PN = ความยาว(พูด)
# ── ตารางเวลาสะสม: pcum[i] = เวลาเริ่มบรรทัด i (ตามความยาวเสียงพากย์จริง) ──
bind pcum = [0.0]
bind pci = 0
ขณะที่ pci < PN {
bind pcum = list_push(pcum, list_get(pcum, pci) + list_get(ระยะเวลา, pci))
bind pci = pci + 1
}
bind PTOTAL = list_get(pcum, PN)
bind PEND = PTOTAL + 3.0 # หาง 3 วิ: ค้างภาพ + เฟดดำ + กล้องถอย
bind PFADE = 0.0
ถ้า pt > PEND - 3.2 { bind PFADE = (pt - (PEND - 3.2)) / 3.2 }
ถ้า PFADE > 1.0 { bind PFADE = 1.0 }
bind ดำ = 1.0 - PFADE # ตัวคูณความสว่างรวมของทั้งฉาก
bind pi = 0
bind pscan = 1
ขณะที่ pscan == 1 {
ถ้า pi >= PN - 1 { bind pscan = 0 }
มิฉะนั้น { ถ้า pt < list_get(pcum, pi + 1) { bind pscan = 0 }
มิฉะนั้น { bind pi = pi + 1 } }
}
bind PSEC = list_get(ระยะเวลา, pi) # ระยะเวลาบรรทัดปัจจุบัน
# ── BGM: Festival.wav วนลูป + เฟดลงจนเงียบตอนจบ ──
ถ้า musicOn == 1 {
ถ้า ยาวเพลงฉาก > 1.0 {
ถ้า ตำแหน่งเพลง() >= ยาวเพลงฉาก - 0.5 { ค้นหาเพลง(0); เล่นเพลง(เพลงฉาก) }
}
ระดับเพลง(ปริมาณBGM * 0.33 * ดำ) # หรี่ BGM เหลือ 1/3 — เสียงพากย์ต้องเด่นกว่า
}
# ── จังหวะฉาก 5 ช็อต ตามเวลาสะสมจริง ──────────────────────────────────────
# A 0-2 ผู้เล่นเดินเข้างาน · B 3-5 หลักการหลิง · C 6-8 ห้าธาตุ + ความเงียบสีขาว
# D 9-12 เพลงที่ยังไม่ครบ · E 13-16 ส่งตัวออกเดินทาง
bind tB = list_get(pcum, 3)
bind tC = list_get(pcum, 6)
bind tD = list_get(pcum, 9)
bind tE = list_get(pcum, 13)
# ความเงียบสีขาวแตกสลาย (บรรทัด 7) — วูบขาวกลางฉาก แล้วคืนสู่ค่ำ
bind tเงียบ0 = list_get(pcum, 7)
bind tเงียบ1 = list_get(pcum, 8)
bind ขาว = 0.0
ถ้า pt > tเงียบ0 { ถ้า pt < tเงียบ1 {
bind ขw = (pt - tเงียบ0) / (tเงียบ1 - tเงียบ0)
bind ขาว = ไซน์(ขw * 3.1416)
bind ขาว = ขาว * ขาว
} }
# โคมธาตุจุดทีละดวงตลอดบรรทัด 5-6 (บันไดเสียงเพนทาโทนิก → ไม้ไฟดินโลหะน้ำ)
bind tธาตุ0 = list_get(pcum, 5)
bind tธาตุ1 = list_get(pcum, 7)
bind ธาตุคืบ = 0.0
ถ้า pt > tธาตุ0 { bind ธาตุคืบ = (pt - tธาตุ0) / (tธาตุ1 - tธาตุ0) * 5.0 }
ถ้า ธาตุคืบ > 5.0 { bind ธาตุคืบ = 5.0 }
# "แต่บทเพลงนี้ยังไม่สมบูรณ์" (บรรทัด 11-12) → โคมธาตุ 1-4 หรี่ เหลือไม้ดวงเดียว
bind ไม่ครบ = 0.0
ถ้า pt > list_get(pcum, 11) { bind ไม่ครบ = (pt - list_get(pcum, 11)) / (list_get(pcum, 13) - list_get(pcum, 11)) }
ถ้า ไม่ครบ > 1.0 { bind ไม่ครบ = 1.0 }
# "เมื่อนั้นเราจึงจะบรรเลงซิมโฟนีแห่งการฟื้นฟูได้" (บรรทัด 14) → นิมิตห้าดวงลุกพร้อมกัน
bind นิมิต = 0.0
ถ้า pt > list_get(pcum, 14) { ถ้า pt < list_get(pcum, 15) {
bind นw = (pt - list_get(pcum, 14)) / (list_get(pcum, 15) - list_get(pcum, 14))
bind นิมิต = ไซน์(นw * 3.1416)
} }
# "ไปเถิดในบัดนี้" (บรรทัด 16) → ปล่อยโคมลอยทั้งงานขึ้นฟ้า ชี้ทางออกเดินทาง
bind ปล่อยโคม = 0.0
ถ้า pt > list_get(pcum, 16) { bind ปล่อยโคม = (pt - list_get(pcum, 16)) / 5.5 }
ถ้า ปล่อยโคม > 1.0 { bind ปล่อยโคม = 1.0 }
# ── พื้นหลัง: ฟ้าสนธยา หายใจช้า ๆ → วูบขาว → เฟดดำตอนจบ ──
bind bgR = (20.0 + ไซน์(pt*0.17)*7.0) * ดำ
bind bgG = (24.0 + ไซน์(pt*0.21 + 1.1)*8.0) * ดำ
bind bgB = (44.0 + ไซน์(pt*0.15 + 2.4)*11.0) * ดำ
bind bgR = bgR + (245.0*ดำ - bgR) * ขาว
bind bgG = bgG + (246.0*ดำ - bgG) * ขาว
bind bgB = bgB + (250.0*ดำ - bgB) * ขาว
เบลอเฟรม(0.958) # หางแสงค้าง ~1.25 วิ (decay+max)
เติม(floor(bgR), floor(bgG), floor(bgB))
# ── ตำแหน่งตัวละคร + บล็อกกิ้ง ────────────────────────────────────────────
# A ยืนรับอยู่กลางลานหันหากล้อง · B ราชินีก้าวออกมาอธิบาย · C หันหาโคมธาตุ
# D เข้าหากันหน้าวงล้อ · E หันหาถนนออกงาน แล้วยกมือส่ง
bind กายสูง = 6.4
bind kx = 0.0 - 7.0; bind kz = 1.0; bind ky = 0.0
bind qx = 7.0; bind qz = 1.0; bind qy = 0.0
# ยอว์: 0 = หันหา +z (ถนนออกงาน) ตามคอนเวนชันเดียวกับ ฉากบทหนึ่ง ฉะนั้น "หันเข้า
# หากล้อง" (ผู้เล่นยืนฝั่ง -z) คือ ~pi ไม่ใช่ ~0 — ค่าเดิม -0.30/+0.30 ทำให้ทั้งคู่
# หันหลังให้กล้องตลอดช็อต A-C ลำดับยอว์ตอนนี้ไล่ต่อเนื่อง:
# 2.80 (หันหากล้อง เอียงเข้าหากัน) → 1.5708 (หันหน้าเข้าหากัน) → 0 (หันหาถนน)
bind kyaw = 2.80; bind qyaw = 0.0 - 2.80
bind kเดิน = 0.0; bind qเดิน = 0.0
ถ้า pt >= tB { ถ้า pt < tC {
# ราชินีก้าวออกมาข้างหน้าเล็กน้อยตอนอธิบายหลักการหลิง
bind wq = (pt - tB) / (tC - tB)
bind wqs = wq * wq * (3.0 - 2.0*wq)
bind qx = 7.0 - 2.6 * wqs
bind qz = 1.0 - 2.2 * wqs
bind qเดิน = wqs * (1.0 - wqs) * 4.0; ถ้า qเดิน > 1.0 { bind qเดิน = 1.0 }
bind qyaw = (0.0 - 2.80) + wqs*0.30 # ก้าวออกมาแล้วหันเข้ากล้องตรงขึ้น
} }
ถ้า pt >= tC { ถ้า pt < tD {
# ทั้งคู่หันเข้าหาแนวโคมธาตุที่ +z (ไม้ไฟดินโลหะน้ำจุดทีละดวง)
bind qx = 4.4; bind qz = 0.0 - 1.2
bind fp = (pt - tC) / PSEC; ถ้า fp > 1.0 { bind fp = 1.0 }
bind fs2 = fp * fp * (3.0 - 2.0*fp)
bind kyaw = 2.80 - fs2*0.70 # เหลือบไปทางโคมธาตุ แต่ยังเห็นหน้า 3/4
bind qyaw = (0.0 - 2.80) + fs2*0.70
} }
ถ้า pt >= tD { ถ้า pt < tE {
# เดินเข้าหากันช้า ๆ หน้าวงล้อตัวอักษร แล้วยืนประจันหน้า
bind cvp = (pt - tD) / (tE - tD)
bind cv = cvp * cvp * (3.0 - 2.0*cvp)
bind kx = (0.0 - 7.0) + 3.1 * cv
bind qx = 4.4 - 0.8 * cv
bind qz = (0.0 - 1.2) + 2.2 * cv
bind kเดิน = 1.0 - cv; bind qเดิน = 1.0 - cv
ถ้า cvp > 0.85 { bind kเดิน = 0.0; bind qเดิน = 0.0 }
bind kyaw = 2.10 - cv*0.53 # หันเข้าหากัน (→ 1.5708)
bind qyaw = (0.0 - 2.10) + cv*0.53
} }
ถ้า pt >= tE {
# หันหาถนนออกงานที่ +z แล้วยกมือส่ง — ปิดฉากด้วยการส่งผู้เล่นออกเดินทาง
bind kx = 0.0 - 3.9; bind qx = 3.6; bind qz = 1.0
bind gp = (pt - tE) / PSEC; ถ้า gp > 1.0 { bind gp = 1.0 }
bind gs = gp * gp * (3.0 - 2.0*gp)
bind kyaw = 1.5708 * (1.0 - gs) # → 0 = หันหา +z (ถนน)
bind qyaw = (0.0 - 1.5708) * (1.0 - gs)
}
# ── แสงจริง: คีย์อุ่นจากโคม + ฟิลเย็นจากฟ้าค่ำ + ไฟประจำตัว + ไฟถนนออกงาน ──
ล้างแสง()
ตั้งแสงรอบข้าง((0.26 + ขาว*0.45) * ดำ)
เพิ่มแสง(0.0 - 11.0, 0.0 - 15.0, 6.0, 1.0, 0.78, 0.48, (1.25 + ขาว*0.8) * ดำ, 105.0) # คีย์อุ่น (แนวโคม)
เพิ่มแสง(13.0, 0.0 - 24.0, 0.0 - 9.0, 0.46, 0.60, 1.0, 0.80 * ดำ, 95.0) # ฟิลเย็นจากฟ้าค่ำ
เพิ่มแสง(kx, 0.0 - 7.2, kz, 0.38, 0.56, 1.0, 1.05 * ดำ, 40.0) # ราชา: น้ำเงิน
เพิ่มแสง(qx, 0.0 - 7.2, qz, 1.0, 0.48, 0.66, 1.05 * ดำ, 40.0) # ราชินี: กุหลาบ
ถ้า ปล่อยโคม > 0.0 {
เพิ่มแสง(0.0, 0.0 - 6.0, 34.0, 1.0, 0.85, 0.55, 1.5*ปล่อยโคม*ดำ, 120.0) # ปลายถนนสว่างขึ้น
}
# ── กล้อง 5 ช็อต ตัดสลับ (แต่ละช็อตมีการเคลื่อนของตัวเอง) ──────────────────
bind camX = 0.0; bind camY = 0.0 - 6.2; bind camZ = 0.0 - 14.0
bind lookX = 0.0; bind lookY = 0.0 - 4.6; bind lookZ = 0.0
ถ้า pt < tB {
# ช็อต A: ดอลลี่เข้าระดับสายตา — มุมมองผู้เล่นเดินเข้ามาในงาน
bind sp1 = pt / tB
bind se1 = sp1 * sp1 * (3.0 - 2.0*sp1)
bind camX = ไซน์(pt*0.35) * 1.4
bind camY = (0.0 - 4.9) - se1 * 1.2
bind camZ = (0.0 - 27.0) + 13.0 * se1
bind lookX = ไซน์(pt*0.22) * 1.2
bind lookY = 0.0 - 4.9
bind lookZ = 1.0
}
ถ้า pt >= tB { ถ้า pt < tC {
# ช็อต B: แพนโค้งรอบราชินีที่ก้าวออกมา (ราชายืนฟังอยู่ฉากหลัง)
bind sp2 = (pt - tB) / (tC - tB)
bind ag = 2.42 - sp2 * 1.05
bind camX = 3.0 + โคไซน์(ag) * 12.5
bind camZ = (0.0 - 1.5) - ไซน์(ag) * 10.5
bind camY = (0.0 - 6.0) - ไซน์(sp2*3.1416) * 1.1
bind lookX = 3.4 - sp2 * 4.2 # กวาดสายตาราชินี → ราชา
bind lookY = 0.0 - 4.8
bind lookZ = 0.0
} }
ถ้า pt >= tC { ถ้า pt < tD {
# ช็อต C: ดันต่ำลอดแนวโคมธาตุ เงยหาห้าดวง · ตอนวูบขาวกล้องถอยลอยขึ้น
bind sp3 = (pt - tC) / (tD - tC)
bind se3 = sp3 * sp3 * (3.0 - 2.0*sp3)
bind camX = (0.0 - 2.0) + ไซน์(pt*0.20) * 2.6
bind camY = (0.0 - 5.4) - se3 * 1.0
bind camZ = (0.0 - 12.5) + se3 * 5.2
bind lookX = 0.0; bind lookY = (0.0 - 7.4) - se3 * 0.8; bind lookZ = 7.0
bind camY = camY - ขาว * 3.4
bind camZ = camZ - ขาว * 5.0
} }
ถ้า pt >= tD { ถ้า pt < tE {
# ช็อต D: เครนสูงกดลง เห็นวงล้อตัวอักษรหมุนอยู่ฉากหลังทั้งคู่
bind sp4 = (pt - tD) / (tE - tD)
bind se4 = sp4 * sp4 * (3.0 - 2.0*sp4)
bind camX = โคไซน์(1.15 + sp4*0.45) * (15.5 - 4.0*se4)
bind camY = (0.0 - 14.0) + se4 * 7.4
bind camZ = (0.0 - 12.0) + se4 * 2.6
bind lookX = 0.0; bind lookY = 0.0 - 5.2; bind lookZ = 0.6
} }
ถ้า pt >= tE {
# ช็อต E: จากหลังทั้งคู่ มองไปตามถนนออกงาน · ถอยกว้างตอนโคมลอยขึ้นพร้อมกัน
bind sp5 = (pt - tE) / (PTOTAL - tE); ถ้า sp5 > 1.0 { bind sp5 = 1.0 }
bind camX = ไซน์(pt*0.13) * 3.2
bind camY = (0.0 - 6.4) - sp5 * 4.6
bind camZ = (0.0 - 11.0) - ปล่อยโคม * 5.0
bind lookX = 0.0
bind lookY = (0.0 - 5.0) - ปล่อยโคม * 4.0
bind lookZ = 6.0 + sp5 * 14.0
}
ถ้า pt > PTOTAL { # หางเฟด: กล้องลอยขึ้น-ถอยช้า
bind หลังฉาก = pt - PTOTAL
bind camY = camY - หลังฉาก*0.6; bind camZ = camZ - หลังฉาก*1.4
}
ตั้งกล้องมอง(camX, camY, camZ, lookX, lookY, lookZ)
ตั้งระยะห่าง(1.85)
# ── ลานหิน: จานพัดเช็คเกอร์อุ่น (ให้เงา/แอ่งแสงมีที่เกาะ) ──────────────────
โหมดผสม(0)
set_flat_shade(0.0)
bind fs = 0
ขณะที่ fs < 28 {
bind fa0 = fs * 0.2244; bind fa1 = (fs + 1) * 0.2244
ถ้า fs - ปัดลง(fs/2.0)*2.0 == 0 { สีดินสอ(floor(40*ดำ), floor(34*ดำ), floor(44*ดำ)) }
มิฉะนั้น { สีดินสอ(floor(33*ดำ), floor(28*ดำ), floor(38*ดำ)) }
วาดสามเหลี่ยม3มิติ(0.0, 0.2, 1.0, โคไซน์(fa0)*34.0, 0.2, 1.0+ไซน์(fa0)*34.0, โคไซน์(fa1)*34.0, 0.2, 1.0+ไซน์(fa1)*34.0)
bind fs = fs + 1
}
flush_3d()
# ── ถนนออกงาน: ทางเดินผายออกหายไปทาง +z + โคมรายทาง สว่างขึ้นตอนส่งตัว ─────
bind ถส = 0
ขณะที่ ถส < 10 {
bind ถz0 = 12.0 + ถส * 4.6
bind ถz1 = ถz0 + 4.6
bind ถก0 = 3.4 + ถส * 0.42 # ผายกว้างขึ้นเรื่อย ๆ (เพอร์สเปกทีฟช่วยเล่าว่าไกล)
bind ถก1 = ถก0 + 0.42
bind ถจ = (0.34 + 0.66*ปล่อยโคม) * (1.0 - ถส*0.062) * ดำ
สีดินสอ(floor(96*ถจ), floor(78*ถจ), floor(56*ถจ))
วาดสามเหลี่ยม3มิติ(0.0 - ถก0, 0.16, ถz0, ถก0, 0.16, ถz0, 0.0 - ถก1, 0.16, ถz1)
วาดสามเหลี่ยม3มิติ(ถก0, 0.16, ถz0, ถก1, 0.16, ถz1, 0.0 - ถก1, 0.16, ถz1)
bind ถส = ถส + 1
}
flush_3d()
bind ถล = 0
ขณะที่ ถล < 4 {
bind ถลz = 17.0 + ถล * 9.5
bind ถลx = 5.0 + ถล * 1.7
bind ถลจ = (0.45 + 0.55*ปล่อยโคม) * ดำ
แอ่งแสง(0.0 - ถลx, 0.2, ถลz, 5.5, 255, 186, 110, 0.10*ถลจ)
แอ่งแสง(ถลx, 0.2, ถลz, 5.5, 255, 186, 110, 0.10*ถลจ)
bind ถล = ถล + 1
}
# ── เสาโคมกระดาษล้อมลาน 8 ต้น + ริบบิ้นพาดระหว่างเสา ──────────────────────
bind สค = 0
ขณะที่ สค < 8 {
bind สa = สค * 0.7854 + 0.3927
bind สx = โคไซน์(สa) * 19.5
bind สz = 1.0 + ไซน์(สa) * 19.5
bind สจ = 0.70 + ไซน์(pt*1.9 + สค*1.7)*0.30
bind สc = โพสต์เลเวล1_สีวน(สค*0.42 + 0.9)
โพสต์เลเวล1_เสาโคม(สx, สz, 5.6, 0.72, list_get(สc,0), list_get(สc,1), list_get(สc,2), สจ, ดำ)
แอ่งแสง(สx, 0.2, สz, 5.0, list_get(สc,0), list_get(สc,1), list_get(สc,2), 0.16*สจ*ดำ)
bind สค = สค + 1
}
โหมดผสม(1)
bind รบ = 0
ขณะที่ รบ < 8 {
bind รa0 = รบ * 0.7854 + 0.3927
bind รa1 = (รบ + 1) * 0.7854 + 0.3927
bind รc = โพสต์เลเวล1_สีวน(รบ*0.42 + pt*0.30)
สีดินสอ(floor(list_get(รc,0)*0.34*ดำ), floor(list_get(รc,1)*0.30*ดำ), floor(list_get(รc,2)*0.22*ดำ))
โพสต์เลเวล1_ริบบิ้น(
โคไซน์(รa0)*19.5, 0.2 - 5.6, 1.0 + ไซน์(รa0)*19.5,
โคไซน์(รa1)*19.5, 0.2 - 5.6, 1.0 + ไซน์(รa1)*19.5,
1.8, pt*1.6 + รบ
)
bind รบ = รบ + 1
}
flush_3d(); โหมดผสม(0)
# ── วงล้อตัวอักษร: กงล้อหมุนช้าฉากหลังซ้าย มีกลิฟขี่อยู่ 6 ตัว ──────────────
bind ล้อมุม = pt * 0.16
bind ลx = 0.0 - 21.0; bind ลy = 0.0 - 12.0; bind ลz = 30.0
set_flat_shade(1.0)
bind ลค = โพสต์เลเวล1_สีวน(pt*0.4 + 2.0)
สีดินสอ(floor(list_get(ลค,0)*0.55*ดำ), floor(list_get(ลค,1)*0.55*ดำ), floor(list_get(ลค,2)*0.55*ดำ))
torus(ลx, ลy, ลz, 7.0, 7.0, 7.0, 0.0, ล้อมุม, 0.0, 0, 24, 9, 0.42)
flush_3d()
set_flat_shade(0.0)
โหมดผสม(1)
bind ลก = 0
ขณะที่ ลก < 6 {
bind ลa = ลก * 1.047 + ล้อมุม
bind ลค2 = โพสต์เลเวล1_สีวน(ลก*1.1 + pt*0.7)
สีดินสอ(floor(list_get(ลค2,0)*0.62*ดำ), floor(list_get(ลค2,1)*0.62*ดำ), floor(list_get(ลค2,2)*0.62*ดำ))
วาดกลิฟ3มิติ((ลก*4 + 3) - ปัดลง((ลก*4 + 3)/26.0)*26.0, ลx + โคไซน์(ลa)*7.0, ลy + ไซน์(ลa)*7.0, ลz - 0.6, ลa + 1.5708, 1.15)
bind ลก = ลก + 1
}
flush_3d(); โหมดผสม(0)
# ── โคมลอย 24 ดวง วางตามกลุ่มโน้ตจริงของ Festival.mid (x/z จากไฟล์ข้อมูล) ──
# เรืองตามความถี่โน้ตของตัวเอง · ตอน "ไปเถิดในบัดนี้" ลอยขึ้นพร้อมกันทั้งงาน
bind fesข้อมูล = ข้อมูลเพลง_Festival()
bind fesN = list_get(fesข้อมูล, 0)
bind fesF = list_get(fesข้อมูล, 2)
bind fesX = list_get(fesข้อมูล, 3)
bind fesZ = list_get(fesข้อมูล, 4)
โหมดผสม(1)
set_flat_shade(1.0)
bind ลอย = 0
ขณะที่ ลอย < fesN {
bind ลf = list_get(fesF, ลอย)
bind ลอยx = list_get(fesX, ลอย) * 1.40
bind ลอยzดิบ = list_get(fesZ, ลอย)
ถ้า ลอยzดิบ < 0.0 { bind ลอยzดิบ = 0.0 - ลอยzดิบ } # พับมาไว้ครึ่งไกลเสมอ ไม่งั้นบางดวงเกิดคาหน้ากล้อง
bind ลอยz = ลอยzดิบ * 1.15 + 17.0
bind ลph = pt*0.10 + ลอย*0.41
bind ลph = ลph - ปัดลง(ลph)
bind ลอยy = (0.0 - 6.0) - ลph*20.0 - ปล่อยโคม*8.0
bind ลกระพริบ = 0.62 + ไซน์(pt*(1.4 + ลf*0.002) + ลอย)*0.38
bind ลจ = ลกระพริบ * (1.0 - ลph*0.45) * (0.34 + 0.34*ปล่อยโคม) * ดำ
# เอียงไปทางสีกระดาษอุ่น (ส้ม/ชมพู/เหลือง) แทนรุ้งเต็มสเกล — ไม่งั้นแอดดิทีฟรวมกันเป็นจุดขาว
bind ลอยc = โพสต์เลเวล1_สีวน(ลอย*0.33 + 0.7)
สีดินสอ(floor(list_get(ลอยc,0)*ลจ), floor(list_get(ลอยc,1)*ลจ*0.62), floor(list_get(ลอยc,2)*ลจ*0.34))
sphere(ลอยx, ลอยy, ลอยz, 0.62, 0.86, 0.62, 0.0, 0.0, 0.0, 0, 8, 6)
bind ลอย = ลอย + 1
}
flush_3d(); set_flat_shade(0.0); โหมดผสม(0)
# ── ใบไม้โน้ตร่วง: หมุนตกช้า ๆ ทั่วลาน (ลมงานเทศกาล) ──────────────────────
โหมดผสม(1)
bind บม = 0
ขณะที่ บม < 22 {
bind บph = pt*0.14 + บม*0.29
bind บph = บph - ปัดลง(บph)
bind บx = ไซน์(บม*2.7)*22.0 + ไซน์(pt*0.6 + บม)*2.4
bind บz = 2.0 + โคไซน์(บม*1.9)*20.0
bind บy = (0.0 - 20.0) + บph*20.0
bind บr = 0.42
bind บa = pt*1.7 + บม
bind บจ = (0.5 + ไซน์(บph*3.1416)*0.5) * ดำ
bind บc = โพสต์เลเวล1_สีธาตุ(บม - ปัดลง(บม/5.0)*5.0)
bind บcc = วนสีอ่อน(list_get(บc,0)*บจ*0.85, list_get(บc,1)*บจ*0.75, list_get(บc,2)*บจ*0.55, pt*1.2 + บม*0.5, 0.38)
สีดินสอ(list_get(บcc,0), list_get(บcc,1), list_get(บcc,2))
วาดสามเหลี่ยม3มิติ(
บx + โคไซน์(บa)*บr, บy, บz + ไซน์(บa)*บr,
บx - โคไซน์(บa)*บr, บy, บz - ไซน์(บa)*บr,
บx, บy - บr*1.6, บz
)
bind บม = บม + 1
}
flush_3d(); โหมดผสม(0)
# ── โคมห้าธาตุ: ไม้ ไฟ ดิน โลหะ น้ำ — จุดทีละดวงตามบันไดเสียงเพนทาโทนิก ──
bind ธค = 0
ขณะที่ ธค < 5 {
bind ธจุด = ธาตุคืบ - ธค; ถ้า ธจุด > 1.0 { bind ธจุด = 1.0 }
ถ้า ธจุด < 0.0 { bind ธจุด = 0.0 }
ถ้า ธค > 0.5 { bind ธจุด = ธจุด * (1.0 - ไม่ครบ*0.88) } # เหลือ "ไม้" ดวงเดียวตอนพูดถึงเพลงที่ไม่ครบ
bind ธจุด = ธจุด + (1.0 - ธจุด) * นิมิต # นิมิตซิมโฟนีฟื้นฟู: ลุกครบห้าดวงชั่วครู่
bind ธa = (ธค - 2.0) * 0.42
bind ธx = ไซน์(ธa) * 11.5 + ขาว*ไซน์(ธa)*9.0 # ความเงียบสีขาว → กระจายออก
bind ธz = 5.2 + (1.0 - โคไซน์(ธa))*4.0 + ขาว*4.0
bind ธy = (0.0 - 6.6) + ไซน์(pt*1.1 + ธค*1.3)*0.45 - ขาว*2.5
bind ธc = โพสต์เลเวล1_สีธาตุ(ธค)
bind ธจ = ธจุด * (1.0 - ขาว*0.55) * ดำ
ถ้า ธจ > 0.02 {
# โคมธาตุใช้ "ตัวโคมทรงกระบอก" แบบเดียวกับเสาโคม ไม่ใช่ทรงกลม:
# set_flat_shade มีผลเฉพาะ .lmesh (draw_color_mesh) — พรีมิทีฟ sphere/torus/
# cylinder ถูกจัดแสงเสมอใน emit_mesh ทรงกลมเล็ก ๆ จึงโดนขอบนุ่ม+บลูมกินจน
# ขาวล้วน ทรงกระบอกหน้าตัดกว้างกว่ารับแสงสม่ำเสมอ สีธาตุเลยรอด
โหมดผสม(0)
สีดินสอ(floor(list_get(ธc,0)*ธจ*0.62), floor(list_get(ธc,1)*ธจ*0.56), floor(list_get(ธc,2)*ธจ*0.42))
cylinder(ธx, ธy, ธz, 0.74, 0.98, 0.74, 0.0, 0.0, 0.0, 0, 12)
flush_3d()
# ห่วงบน-ล่างของโคม (เส้น ไม่ใช่พรีมิทีฟ — ไม่โดนจัดแสง)
สีดินสอ(floor(list_get(ธc,0)*ธจ*0.75), floor(list_get(ธc,1)*ธจ*0.68), floor(list_get(ธc,2)*ธจ*0.50))
วาดเส้น3มิติ(ธx, ธy - 1.05, ธz, ธx, ธy - 1.85, ธz)
flush_3d()
# ไฟส่องออกจากโคม: วางห่างจากตัวโคมเอง (ถ้าวางทับ ระยะ~0 = ความเข้มสูงสุด = ขาว)
เพิ่มแสง(ธx*0.55, 0.0 - 2.4, ธz - 7.0, list_get(ธc,0)/255.0, list_get(ธc,1)/255.0, list_get(ธc,2)/255.0, 0.55*ธจ, 26.0)
แอ่งแสง(ธx, 0.2, ธz, 5.0, list_get(ธc,0), list_get(ธc,1), list_get(ธc,2), 0.20*ธจ)
}
bind ธค = ธค + 1
}
# เสียงจุดโคมธาตุ: ครั้งเดียวต่อดวง (นับสะสมผ่านค่าคืน ธาตุจุดแล้ว)
ถ้า ปัดลง(ธาตุคืบ) > ธาตุจุดแล้ว {
ถ้า ธาตุจุดแล้ว < 5 {
เล่นฆ้อง(0.0, 0.0 - 8.0, 6.5, list_get(โน้ต, ธาตุจุดแล้ว) * 2.0, 0.24 * ปริมาณSFX)
เล่นไชม์ใหญ่(0.0, 0.0 - 8.0, 6.5, list_get(โน้ต, ธาตุจุดแล้ว) * 4.0, 0.16 * ปริมาณSFX)
}
bind ธาตุจุดแล้ว = ธาตุจุดแล้ว + 1
}
# ── แนปเปิล 5 ตัว: นั่งฟังอยู่ขอบลาน · ตอนส่งตัวออกก็วิ่งนำไปตามถนน ─────────
bind นป = 0
ขณะที่ นป < 5 {
bind นเด้ง = ไซน์(pt*2.6 + นป*1.25)
ถ้า นเด้ง < 0.0 { bind นเด้ง = 0.0 - นเด้ง }
bind นx = (นป - 2.0) * 6.4 + ไซน์(pt*0.5 + นป)*0.4
bind นz = (0.0 - 4.6) + ไซน์(นป*2.1)*1.8
ถ้า ปล่อยโคม > 0.0 {
bind นx = นx * (1.0 - ปล่อยโคม*0.55)
bind นz = นz + ปล่อยโคม * (24.0 + นป*2.4)
}
bind นy = (0.0 - 0.86) - นเด้ง*0.50
bind นกระพริบ = 0.0
bind นb = pt*0.37 + นป*0.21
ถ้า นb - ปัดลง(นb) < 0.055 { bind นกระพริบ = 1.0 }
bind นc = โพสต์เลเวล1_สีธาตุ(นป)
โพสต์เลเวล1_แนปเปิล(นx, นy, นz, 0.86, นกระพริบ,
floor(list_get(นc,0)*ดำ), floor(list_get(นc,1)*ดำ), floor(list_get(นc,2)*ดำ), camX, camZ)
แอ่งแสง(นx, 0.2, นz, 2.2, list_get(นc,0), list_get(นc,1), list_get(นc,2), 0.16*ดำ)
bind นป = นป + 1
}
flush_3d()
# ── ท่าทาง: เดิน = สวิงแขนขา · ผู้พูดโบกแขน/โน้มตัว · ตอนส่งตัวยกมือค้าง ────
bind who = list_get(ผู้พูด, pi)
bind หายใจ0 = ไซน์(pt*1.35)*0.05
bind kArm = ไซน์(pt*1.1)*0.06 + ไซน์(pt*7.2)*0.38*kเดิน
bind kLeg = ไซน์(pt*7.2)*0.30*kเดิน
bind kSway = หายใจ0 + ไซน์(pt*3.6)*0.10*kเดิน
bind kLean = 0.10*kเดิน; bind kTuck = 0.0
bind qArm = ไซน์(pt*1.2+1.0)*0.06 + ไซน์(pt*7.0+2.0)*0.36*qเดิน
bind qLeg = ไซน์(pt*7.0+2.0)*0.28*qเดิน
bind qSway = (0.0-หายใจ0) + ไซน์(pt*3.5+1.0)*0.10*qเดิน
bind qLean = 0.10*qเดิน; bind qTuck = 0.0
ถ้า who < 0.5 { ถ้า kเดิน < 0.4 {
bind kArm = ไซน์(pt*3.1)*0.45 # ราชาพูด: โบกแขน
bind kSway = ไซน์(pt*1.7)*0.12
bind kLean = 0.14
bind kLeg = ไซน์(pt*1.55)*0.08
} }
ถ้า who > 0.5 { ถ้า qเดิน < 0.4 {
bind qArm = ไซน์(pt*2.9)*0.42 # ราชินีพูด
bind qSway = ไซน์(pt*1.6)*0.11
bind qLean = 0.14
bind qLeg = ไซน์(pt*1.5)*0.07
} }
ถ้า ปล่อยโคม > 0.0 { # ส่งตัว: ยกมือค้างทั้งคู่
bind kArm = 0.30 + ปล่อยโคม*0.48
bind qArm = 0.30 + ปล่อยโคม*0.48
bind kLean = 0.06; bind qLean = 0.06
}
# ── ราชา/ราชินี: โมเดลไฮเรส + ริกเนทีฟ + วัสดุผิวจริง + ลูกของเหลวหุ้มตัว ──
set_flat_shade(0.0)
set_material("roughness", 0.55)
set_material("specular", 0.35)
set_material("subsurface", 0.28)
set_material("sheen", 0.15)
set_material("clearcoat", 0.20)
mesh_hue(0.0, ดำ * (1.0 + ขาว*0.9)) # เฟดดำท้ายฉาก + วูบขาวตอนความเงียบแตก
mesh_draw(kCutMesh, kx, ky, kz, กายสูง, kyaw, kSway, kArm, kLean, kLeg, kTuck)
mesh_draw(qCutMesh, qx, qy, qz, กายสูง, qyaw, qSway, qArm, qLean, qLeg, qTuck)
flush_3d()
mesh_hue(0.0, 1.0)
reset_material()
แอ่งแสง(kx, 0.2, kz, 7.0, 90, 140, 255, 0.20*ดำ)
แอ่งแสง(qx, 0.2, qz, 7.0, 255, 115, 165, 0.20*ดำ)
# ลูกของเหลวหุ้มตัว (แบบสหาย) — ศูนย์กลางลำตัว
# สัดส่วน 0.62 ของความสูงตัวละคร ตรงกับทุกฉาก (บท 1-4/ไฟนอล 1,3 ใช้ 0.62,
# บท 5,6,8/ไฟนอล 2 ใช้ 0.6, บท 7 ใช้ 0.58) — อย่าย่อลงเวลาจูนภาพ ลูกจะเล็กผิดชุด
โหมดผสม(1)
liquid_step(liq, 0.016)
liquid_splat(liq, 28.0 + ไซน์(pt*1.7)*13.0, 28.0 + โคไซน์(pt*1.2)*13.0, 1.0, 0.18, 3.4)
liquid_splat(liq, 28.0 + โคไซน์(pt*1.1)*11.0, 28.0 + ไซน์(pt*1.5)*11.0, 0.0, 0.19, 3.0)
liquid_draw_surface(liq, 1.0, kx, ky - กายสูง*0.52, kz, กายสูง*0.62, กายสูง*0.62)
liquid_draw_surface(liq, 1.0, qx, qy - กายสูง*0.52, qz, กายสูง*0.62, กายสูง*0.62)
flush_3d(); โหมดผสม(0)
# ── หิ่งห้อยงานเทศกาล: ละอองแสงลอยรอบลาน ──────────────────────────────────
โหมดผสม(1)
bind หห = 0
ขณะที่ หห < 7 {
bind หa = pt*0.33 + หห*0.897
bind หx = ไซน์(หa*1.3 + หห)*13.0
bind หy = (0.0 - 4.0) - ไซน์(หa*0.8 + หห*2.0)*4.5
bind หz = 2.0 + โคไซน์(หa*1.1 + หห)*11.0
bind หc = โพสต์เลเวล1_สีวน(หห*0.9 + pt*0.5)
อนุภาคทรงกลม(หx, หy, หz, 1.1, 5, pt*2.2 + หห,
floor(list_get(หc,0)*0.42*ดำ), floor(list_get(หc,1)*0.42*ดำ), floor(list_get(หc,2)*0.30*ดำ))
bind หห = หห + 1
}
flush_3d(); โหมดผสม(0)
# ── โน้ตประกอบบรรทัด + เสียงพากย์ (ครั้งเดียวต่อบรรทัด) ────────────────────
ถ้า pi > บรรทัดก่อน {
ถ้า pi < PN {
bind n = list_get(โน้ต, pi)
bind whoN = list_get(ผู้พูด, pi)
เล่นเสียงพากย์("post_level1", pi, list_get(ผู้พูดรหัส, pi), ภาษา, ปริมาณSFX)
ถ้า whoN < 0.5 {
เล่นกาเมลัน(0.0, 0.0, 0.0, n, 0.34 * ปริมาณSFX) # ราชา
เล่นฮังแพน(0.0, 0.0, 0.0, n*0.5, 0.16 * ปริมาณSFX)
}
มิฉะนั้น {
เล่นแฟนแฟร์(0.0, 0.0, 0.0, n*0.75, 0.26 * ปริมาณSFX) # ราชินี
เล่นฮังแพน(0.0, 0.0, 0.0, n*0.62, 0.14 * ปริมาณSFX)
}
}
bind บรรทัดก่อน = pi
}
# ── ตัวหนังสือ ────────────────────────────────────────────────────────────
ตั้งกล้องมอง(0.0, 0.0, -22.0, 0.0, 0.0, 0.0)
ตั้งระยะห่าง(2.8)
สีดินสอ(floor(255*ดำ), floor(206*ดำ), floor(120*ดำ))
วาดสตริง("prelude : the festival of first notes", 0.0, 10.0, 0.0, 0.72, 1)
ถ้า pi < PN {
bind plineกลิฟ = list_get(พูดกลิฟ, pi)
bind who2 = list_get(ผู้พูด, pi)
bind lt = pt - list_get(pcum, pi)
bind laf = 1.0
ถ้า lt < 0.6 { bind laf = lt / 0.6 }
ถ้า lt > PSEC - 0.7 { bind laf = (PSEC - lt) / 0.7 }
ถ้า laf < 0.0 { bind laf = 0.0 }
bind laf = laf * ดำ
bind lr = floor(255.0*laf); bind lg = floor(218.0*laf); bind lb = floor(128.0*laf) # ราชา: ทอง
ถ้า who2 > 0.5 { bind lr = floor(212.0*laf); bind lg = floor(222.0*laf); bind lb = floor(255.0*laf) } # ราชินี: ฟ้าอ่อน
ถ้า แสดงบทพูด == 1 {
วาดสตริงบทพูดบากขอบ(plineกลิฟ, ภาษาบทพูด, 0.0, 8.3, 0.0, 0.62)
สีดินสอ(lr, lg, lb)
วาดสตริงบทพูดบาก(plineกลิฟ, ภาษาบทพูด, 0.0, 8.3, 0.0, 0.62)
}
}
สีดินสอ(floor(170*ดำ), floor(180*ดำ), floor(205*ดำ))
วาดสตริง("[enter/space] continue [esc] skip", 0.0, 10.9, 0.0, 0.42, 1)
flush_3d()
แสดงผล()
# ── เงื่อนไขออก ───────────────────────────────────────────────────────────
bind ออก = 0.0
ถ้า pt >= PEND { bind ออก = 1.0 }
# กันข้ามโดยไม่ตั้งใจ: ไม่รับปุ่มข้าม (คีย์บอร์ด+จอย) ช่วง 5 วิแรกของฉาก
ถ้า pt > 5.0 {
ถ้า กดปุ่ม("enter") { bind ออก = 1.0 }
ถ้า กดปุ่ม("space") { bind ออก = 1.0 }
ถ้า กดปุ่ม("escape") { bind ออก = 1.0 }
ถ้า จอยปุ่ม("a") { bind ออก = 1.0 }
ถ้า จอยปุ่ม("start") { bind ออก = 1.0 }
}
ถ้า ออก > 0.5 { เบลอเฟรม(0.0); mesh_hue(0.0, 1.0) }
คืน [บรรทัดก่อน, ธาตุจุดแล้ว, ออก]
}