灵符lingfu

soul-symphony-ling

↓ 0 downloads

Soul 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-ling
AuthorsLing Lin <taellinglin@gmail.com>
READMECode / FilesVersionsDependency GraphDependentsSecurityBuildsSettings

Code / Files (1947)

game/scenes/chapter7.ling
# Chapter 7 cutscene module — "the river of sleeping stars"
# Returns [state, shouldExit] · state = lineIdx*1000 + letterIdx (ตัวอักษรที่เก็บ/โน้ตที่ดัง)
#
# บินตามเดมอนข้ามทะเลดาวหลับ — มิยาซากิ/Spirited Away:
#   ทะเลดาวเรียบเป็นกระจก (ดาวสะท้อนใต้เส้นน้ำ) · ทุ่นโคมไฟลอยเรียงเป็นแถวรับทาง
#   รถไฟแสงวิ่งข้ามขอบฟ้าเงียบ ๆ (บรรทัด 5) · กาแล็กซีล้อใหญ่หมุนช้าเหมือนกล่องดนตรี
#   คู่สหายบินท่าเอนลม เสื้อคลุมปลิว หางแสงตาม · เดมอน (จากบทหก) นำทางข้างหน้า
# ธีมดนตรี: ตัวอักษรที่หายไปเกาะตามแม่น้ำดาว — เก็บทีละตัว = โน้ตเพนทาโทนิก
#   ดังสะสมเป็นเพลงกล่อม (เมโลดี้สร้างตัวเองกลับมา) ระหว่างบรรทัด 6-11
# สกอร์: Swing.wav (แกว่งไปกับดาว) · ใช้ ฉากบทหก_วาดเดมอน จากบทหก (กราฟรวม main)

ฟังก์ชัน ฉากบทเจ็ด_บทพูดกลิฟ(ภาษา) {
    ถ้า ภาษา == 0 {
        คืน [
            [10, 15, 8, 22, 26, 25, 8, -1, 24, 12, 9, 26, 20, 5, -1, 11, 16, 19, 21, 20, 3, -1, 11, 21, 8, -1, 21, 22, 26, 20, 3, -1, 24, 15, 16, 23, 16, 20, 14, 26, -1, 14, 16, 14, 14, 26, 23, 26, -1, 24, 15, 16, 25, 8, -1, 25, 21, 18, 21, 23, 21, 5],
            [24, 21, 20, 21, -1, 19, 26, 18, 21, 3, -1, 24, 26, 23, 16, 22, 16, 20, 14, 26, -1, 24, 26, 25, 8, -1, 20, 21, -1, 24, 15, 16, 3, -1, 14, 8, 23, 8, 24, 26, -1, 20, 21, -1, 29, 21, 4, 20, 16, -1, 13, 26, 23, 8, 25, 25, 21, -1, 24, 21, 24, 15, 16, 25, 12, -1, 24, 26, 25, 16, 23, 26, 5],
            [28, 8, 23, 12, 28, 8, 23, 12, -1, 18, 21, 18, 21, -1, 18, 8, 23, 8, -1, 13, 26, 23, 8, 16, 3, -1, 23, 16, 25, 21, 23, 26, -1, 9, 12, 8, 23, 8, 5, -1, 8, 20, 8, 25, 8, 4, 20, 21, -1, 28, 12, 16, 18, 26, -1, 18, 16, 4, 21, -1, 25, 24, 26, 18, 12, 25, 12, -1, 4, -1, 24, 26, 25, 8, -1, 11, 21, 23, 16, 19, 26, 5],
            [24, 26, 18, 8, 16, 3, -1, 13, 26, 23, 21, 8, -1, 19, 21, 25, 24, 26, 5, 5, 5, -1, 24, 21, 24, 15, 16, 25, 12, -1, 28, 8, 23, 12, 28, 8, 23, 12, 4, 20, 21, -1, 24, 15, 8, 11, 21, 3, -1, 24, 21, 20, 21, -1, 20, 8, 18, 8, 4, 11, 12, -1, 24, 26, 16, 19, 16, 20, 14, 26, 5],
            [19, 16, 23, 21, -1, 4, -1, 23, 8, 20, 25, 8, 20, 5, -1, 11, 8, 23, 12, 18, 8, 3, -1, 20, 8, 16, 25, 21, -1, 21, -1, 18, 26, 23, 21, 24, 26, -1, 28, 12, 16, -1, 23, 8, 16, 25, 21, 5],
            [1, 25, 21, 18, 26, 3, -1, 23, 8, 16, 25, 21, -1, 20, 21, -1, 25, 21, 23, 12, 16, 20, 3, -1, 24, 8, 26, 20, 11, 21, -1, 20, 8, 24, 15, 16, 4, 11, 12, -1, 28, 21, 25, 8, -1, 18, 26, 23, 21, 24, 26, 5, 2],
            [8, 20, 8, 25, 8, 4, 20, 21, -1, 23, 21, 24, 26, 25, 21, -1, 23, 12, 25, 8, 3, -1, 24, 26, 25, 8, -1, 23, 16, 9, 8, -1, 30, 21, 16, 4, 20, 16, -1, 23, 26, 24, 26, 25, 21, 5, -1, 18, 29, 8, 10, 10, 15, 16, -1, 24, 15, 16, 20, 8, 14, 8, 23, 8, -1, 24, 15, 16, 20, 14, 26, 0],
            [1, 18, 8, 18, 26, -1, 23, 12, 25, 8, 3, -1, 18, 8, 23, 12, 23, 8, -1, 14, 29, 8, 30, 8, 3, -1, 28, 8, 20, 4, 11, 21, -1, 23, 16, 20, 14, 26, 3, -1, 24, 21, 24, 15, 16, 25, 12, -1, 24, 21, 20, 14, 26, -1, 20, 21, -1, 20, 8, 18, 8, -1, 23, 8, 16, 25, 21, -1, 20, 21, -1, 19, 8, 19, 8, 5, 2],
            [24, 21, 23, 12, -1, 23, 8, 23, 8, 9, 8, 16, 0, -1, 24, 21, 23, 12, -1, 17, 16, 9, 26, 20, 4, 21, -1, 28, 8, 23, 12, 28, 8, 23, 12, 4, 20, 16, -1, 25, 16, 10, 15, 16, 3, -1, 20, 21, 25, 21, -1, 9, 8, 16, -1, 20, 21, 25, 21, 0],
            [24, 21, 23, 12, 18, 8, 23, 8, -1, 21, 23, 26, -1, 24, 26, 18, 8, 16, 3, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 25, 21, -1, 16, 24, 24, 15, 21, 4, 20, 16, -1, 23, 8, 20, -1, 24, 8, 24, 12, 29, 21, 0],
            [1, 14, 29, 8, 23, 8, 18, 26, 24, 15, 16, 3, -1, 14, 26, 23, 12, 16, 25, 21, -1, 15, 21, 16, 23, 26, -1, 25, 8, 20, 3, -1, 19, 29, 26, 17, 16, 18, 18, 26, -1, 9, 21, 18, 18, 26, 24, 26, -1, 28, 8, 16, 20, 11, 16, 20, 14, 26, -1, 20, 21, -1, 29, 21, 4, 20, 16, -1, 24, 26, 23, 21, 5, 2],
            [18, 21, 11, 21, -1, 15, 21, 23, 26, 11, 21, 0, -1, 15, 21, 19, 26, -1, 11, 21, 8, 3, -1, 19, 29, 26, 17, 16, 18, 18, 26, -1, 20, 21, -1, 19, 16, 11, 11, 21, 23, 26, 4, 20, 16, 0],
            [1, 24, 21, 24, 15, 16, 25, 12, -1, 16, 24, 24, 15, 21, 4, 20, 16, -1, 18, 8, 23, 12, 23, 8, -1, 11, 8, 16, 9, 26, 3, -1, 23, 8, 13, 13, 16, 20, 14, 26, 3, -1, 15, 21, 16, 23, 26, -1, 20, 21, -1, 9, 26, 23, 8, 16, 25, 21, -1, 15, 8, 25, 21, -1, 20, 21, -1, 20, 8, 18, 8, 4, 20, 16, 5, 2],
            [1, 24, 26, 25, 8, 3, -1, 18, 8, 23, 12, 23, 8, -1, 20, 21, -1, 19, 8, 28, 8, 23, 16, 4, 21, -1, 28, 21, 19, 26, 4, 20, 16, -1, 18, 26, 23, 21, 30, 26, 3, -1, 28, 21, 25, 8, -1, 20, 21, -1, 29, 21, 4, 20, 16, 5, -1, 24, 21, 24, 15, 16, 25, 12, -1, 24, 21, 20, 14, 26, -1, 25, 24, 26, 30, 26, 18, 26, 5, 2],
        ]
    }
    ถ้า ภาษา == 1 {
        คืน [
            [15, 20, 13, 28, 32, 17, 30, -1, 31, 17, 34, 17, 26, 6, -1, 32, 20, 17, -1, 16, 13, 17, 25, 27, 26, -1, 27, 28, 17, 26, 17, 16, -1, 13, -1, 16, 27, 27, 30, -1, 35, 20, 17, 30, 17, -1, 32, 20, 17, -1, 15, 17, 21, 24, 21, 26, 19, -1, 33, 31, 17, 16, -1, 32, 27, -1, 19, 21, 19, 19, 24, 17, 6],
            [14, 17, 37, 27, 26, 16, -1, 21, 32, 4, -1, 13, -1, 31, 17, 13, -1, 27, 18, -1, 31, 24, 17, 17, 28, 21, 26, 19, -1, 31, 32, 13, 30, 31, -1, 24, 13, 37, -1, 18, 24, 13, 32, -1, 13, 26, 16, -1, 31, 32, 21, 24, 24, -1, 13, 31, -1, 19, 24, 13, 31, 31, 6],
            [35, 17, -1, 18, 24, 37, -1, 18, 30, 27, 25, -1, 20, 17, 30, 17, 4, -1, 24, 21, 32, 32, 24, 17, -1, 14, 17, 13, 30, 17, 30, 31, 6, -1, 25, 21, 26, 16, -1, 37, 27, 33, 30, -1, 35, 13, 23, 17, -1, 5, -1, 32, 20, 17, -1, 31, 32, 13, 30, 31, -1, 13, 30, 17, -1, 16, 30, 17, 13, 25, 21, 26, 19, 6],
            [32, 20, 17, -1, 31, 23, 37, -1, 20, 13, 31, -1, 13, -1, 18, 24, 27, 27, 30, 6, 6, 6, -1, 13, 26, 16, -1, 27, 33, 30, -1, 31, 20, 13, 16, 27, 35, 31, -1, 13, 30, 17, -1, 31, 35, 21, 25, 25, 21, 26, 19, -1, 21, 26, -1, 21, 32, 6],
            [24, 27, 27, 23, -1, 5, -1, 24, 13, 26, 32, 17, 30, 26, 31, 6, -1, 31, 27, 25, 17, 27, 26, 17, -1, 24, 21, 32, -1, 32, 20, 17, -1, 35, 13, 37, -1, 13, 15, 30, 27, 31, 31, -1, 32, 20, 17, -1, 26, 21, 19, 20, 32, 6],
            [2, 18, 13, 30, -1, 27, 18, 18, 4, -1, 13, -1, 32, 30, 13, 21, 26, -1, 27, 18, -1, 24, 21, 19, 20, 32, -1, 15, 30, 27, 31, 31, 17, 16, -1, 32, 20, 17, -1, 35, 13, 32, 17, 30, -1, 35, 21, 32, 20, 27, 33, 32, -1, 13, -1, 31, 27, 33, 26, 16, 6, 3],
            [37, 27, 33, 30, -1, 24, 27, 31, 32, -1, 24, 17, 32, 32, 17, 30, 31, -1, 30, 27, 27, 31, 32, -1, 13, 24, 27, 26, 19, -1, 32, 20, 17, -1, 30, 21, 34, 17, 30, -1, 27, 18, -1, 31, 32, 13, 30, 31, 6, -1, 31, 21, 26, 19, -1, 13, 31, -1, 37, 27, 33, -1, 15, 13, 32, 15, 20, -1, 32, 20, 17, 25, 0],
            [2, 17, 13, 15, 20, -1, 24, 17, 32, 32, 17, 30, -1, 32, 20, 17, 37, -1, 19, 13, 32, 20, 17, 30, 17, 16, -1, 30, 13, 26, 19, -1, 27, 26, 15, 17, 4, -1, 13, 26, 16, -1, 31, 32, 13, 37, 17, 16, -1, 24, 21, 32, -1, 21, 26, 31, 21, 16, 17, -1, 32, 20, 17, -1, 31, 27, 26, 19, 6, 3],
            [21, 32, -1, 21, 31, -1, 32, 20, 17, -1, 24, 33, 24, 24, 13, 14, 37, 0, -1, 21, 32, -1, 21, 31, -1, 32, 17, 13, 15, 20, 21, 26, 19, -1, 21, 32, 31, 17, 24, 18, -1, 14, 13, 15, 23, -1, 32, 27, -1, 33, 31, 4, -1, 26, 27, 32, 17, -1, 14, 37, -1, 26, 27, 32, 17, 0],
            [32, 20, 17, 26, -1, 24, 17, 32, -1, 32, 20, 17, -1, 35, 20, 27, 24, 17, -1, 31, 23, 37, -1, 24, 17, 13, 30, 26, -1, 21, 32, -1, 35, 21, 32, 20, -1, 33, 31, 0],
            [2, 32, 20, 17, -1, 19, 13, 24, 13, 36, 37, -1, 32, 33, 30, 26, 17, 16, -1, 21, 32, 31, -1, 19, 30, 17, 13, 32, -1, 35, 20, 17, 17, 24, 4, -1, 31, 24, 27, 35, -1, 13, 31, -1, 13, -1, 25, 33, 31, 21, 15, -1, 14, 27, 36, -1, 35, 21, 26, 16, 21, 26, 19, 6, 3],
            [20, 27, 24, 16, -1, 32, 20, 17, -1, 15, 20, 27, 30, 16, 0, -1, 32, 20, 17, -1, 16, 27, 27, 30, -1, 20, 27, 25, 17, -1, 21, 31, -1, 13, 32, -1, 32, 20, 17, -1, 25, 21, 16, 16, 24, 17, -1, 27, 18, -1, 32, 20, 17, -1, 25, 33, 31, 21, 15, 0],
            [2, 13, 26, 16, -1, 32, 27, 19, 17, 32, 20, 17, 30, -1, 32, 20, 17, 37, -1, 16, 27, 34, 17, 4, -1, 24, 13, 33, 19, 20, 21, 26, 19, 4, -1, 21, 26, 32, 27, -1, 32, 20, 17, -1, 14, 30, 21, 19, 20, 32, -1, 20, 17, 13, 30, 32, -1, 27, 18, -1, 32, 20, 17, -1, 35, 20, 17, 17, 24, 6, 3],
            [2, 32, 20, 17, -1, 31, 32, 13, 30, 31, -1, 15, 24, 27, 31, 17, 16, -1, 35, 13, 30, 25, -1, 13, 30, 27, 33, 26, 16, -1, 32, 20, 17, 25, -1, 24, 21, 23, 17, -1, 35, 13, 32, 17, 30, 6, -1, 13, 26, 16, -1, 32, 20, 17, -1, 31, 27, 26, 19, -1, 35, 17, 26, 32, -1, 27, 26, 6, 3],
        ]
    }
    ถ้า ภาษา == 2 {
        คืน [
            [62, 51, 51, 139, 149, 21, 155, 38, -1, 65, 138, 110, 133, 21, 149, 65, 135, 38, 65, 93, 129, 44, 62, 133, 57, 119, 57, 144, 20, 42, 93, 20, 51, 139, 149, 76, 38, 133, 57, 149, 13, 88, 119, 130, 107, 149, 93, 133, 129, 13, 135, 6, 13, 130, 6],
            [78, 57, 21, 133, 6, 57, 132, 57, 153, 65, -1, 51, 129, 149, 101, 150, 120, 20, 38, 107, 20, 38, 133, 107, 51, 139, 119, 101, 130, 62, 152, 119, 101, 51, 123, 38, 42, 130, 107, 93, 133, 62, 149, 93, 138, 88, 62, 150, 101, 129, 57, 136, 20, 20, 130, 57, 38, 131, 20, 6, 93, 129, 21, 6],
            [149, 93, 133, 21, 129, 62, 135, 57, 21, 133, 6, 51, 139, 57, 139, 6, 130, 57, 57, 129, -1, 71, 150, 62, 6, 62, 51, 149, 76, 101, 20, 42, 130, 107, 61, 123, 88, -1, 93, 129, 107, 130, 20, 13, 101, 147, 57, 51, 139, 54, 133, 57, 113, 99, 133, 20, 41, 107, 88, -1, 38, 107, 20, 38, 133, 107, 6, 134, 101, 130, 20, 74, 130, 57, 123, 90],
            [55, 123, 20, 81, 133, 84, 138, 76, 148, 57, 41, 107, 88, 119, 93, 146, 123, 57, 139, 4, 4, 4, -1, 150, 101, 129, 149, 20, 133, 10, 123, 20, 149, 93, 133, 6, 134, 101, 130, 20, 108, 133, 88, 123, 90, 152, 57, 57, 132, 57],
            [40, 113, 135, 4, 4, 4, 151, 13, 84, 153, 79, -1, 84, 138, 152, 13, 93, 62, 133, 20, 13, 57, 22, 38, 51, 133, 20, 12, 133, 84, 93, 133, 42, 93, 138, 153, 109, 152, 121],
            [2, 153, 6, 101, 123, 123, 6, 153, 65, -1, 10, 62, 107, 57, 150, 113, 20, 113, 108, 133, 20, 12, 133, 84, 68, 146, 57, 61, 134, 153, 65, 123, 91, 133, 20, 153, 99, 149, 113, 138, 88, 20, 3],
            [42, 130, 107, 123, 130, 6, 112, 93, 51, 139, 54, 133, 57, 51, 134, 119, 133, 88, 149, 6, 133, 129, 123, 90, 42, 133, 84, 150, 86, 61, 134, 150, 120, 20, 38, 107, 20, 38, 133, 107, -1, 21, 20, 10, 130, 62, 10, 133, 57, 153, 65, 76, 101, 133, 20, 21, 130, 62, 76, 107, 6, 84, 130, 57, 0],
            [2, 52, 6, 42, 130, 107, 123, 130, 6, 112, 93, 51, 139, 76, 107, 6, 149, 10, 133, 149, 6, 155, 62, 93, 107, 62, 93, 107, 84, 153, 41, 117, 20, 149, 113, 138, 88, 20, 6, 130, 20, 107, 133, 57, 119, 57, 144, 20, 13, 93, 132, 20, -1, 150, 106, 107, 6, 155, 113, 108, 133, 20, 153, 113, 107, 123, 90, 82, 133, 88, 152, 57, 62, 51, 149, 76, 101, 20, 3],
            [57, 139, 84, 130, 57, 149, 76, 101, 20, 6, 105, 123, 84, 57, 139, 57, 133, 0, -1, 84, 130, 57, 6, 134, 101, 130, 20, 113, 123, 57, 42, 130, 107, 84, 130, 57, 149, 123, 20, 6, 101, 130, 62, 13, 146, 57, 116, 149, 93, 133, 51, 138, 101, 129, 151, 61, 42, 0],
            [20, 132, 57, 6, 155, 152, 121, 55, 123, 20, 81, 133, 51, 132, 20, 68, 146, 57, 149, 93, 138, 88, 57, 97, 84, 130, 57, 153, 65, 76, 99, 123, 84, 6, 130, 62, 149, 93, 133, 0],
            [2, 38, 133, 93, 133, 21, 130, 6, 93, 119, 85, 57, 107, 20, 106, 123, 123, 130, 57, 88, 136, 20, 152, 119, 33, 10, 123, 20, 84, 130, 57, -1, 29, 133, 154, -1, 38, 131, 20, 153, 10, 101, 133, 57, 6, 105, 123, 20, 38, 57, 42, 93, 138, 3],
            [21, 130, 62, 13, 123, 93, 156, 38, 153, 109, 0, -1, 65, 93, 129, 44, 116, 64, 133, 57, 123, 90, 42, 93, 20, 152, 21, 6, 101, 133, 20, 10, 123, 20, 38, 57, 42, 93, 138, 57, 139, 150, 119, 101, 129, 0],
            [2, 150, 106, 107, 76, 107, 6, 149, 10, 133, 6, 155, 38, 134, 38, 136, 20, 101, 20, 153, 65, 41, 107, 88, 6, 130, 57, -1, 119, 130, 107, 149, 93, 133, 129, 98, 133, -1, 116, 150, 8, 57, 6, 101, 133, 20, 123, 130, 57, 114, 6, 113, 108, 133, 20, 10, 123, 20, 107, 20, 106, 123, 3],
            [2, 38, 107, 20, 38, 133, 107, 151, 123, 62, 106, 123, 84, 76, 107, 6, 149, 10, 133, 153, 109, 123, 91, 133, 20, 123, 62, 124, 57, 38, 131, 20, 113, 133, 88, 61, 134, -1, 150, 101, 129, 62, 51, 149, 76, 101, 20, 6, 155, 38, 134, 149, 57, 135, 57, 45, 123, 153, 65, 3],
        ]
    }
    ถ้า ภาษา == 3 {
        คืน [
            [13, 402, 6, -1, 120, 386, 231, 382, -1, 447, 402, 386, -1, 475, 475, 28, 206, 130, -1, 47, 349, -1, 239, 383, -1, 502, 86, -1, 353, 348, 120],
            [60, -1, 98, 218, 4, -1, 400, 151, -1, 260, 153, 385, -1, 245, 120, 17, -1, 379, 206, 446, 187, -1, 493, 493, 502, 43, -1, 43, 367, 502, 33, -1, 492, 451, 412, -1, 393, 348, 120],
            [351, 65, 292, 267, 480, -1, 369, 206, 115, -1, 87, 120, 4, -1, 340, 207, -1, 406, 124, 396, 153, 386, 351, 6, -1, 507, 405, 383, -1, 414, 320, 508, -1, 5, -1, 260, 153, 386, -1, 80, 383, -1, 79, 43, -1, 393, 381, 118],
            [502, 116, 349, 134, -1, 245, 121, 386, -1, 393, 53, 86, 6, 6, 6, -1, 60, 206, 43, -1, 369, 206, -1, 60, 209, 396, 17, -1, 60, -1, 329, 349, 292, -1, 513, 345, 461, 43, -1, 393, 340],
            [265, -1, 5, -1, 156, 270, 386, 336, 6, -1, 110, 54, 17, -1, 251, 383, -1, 17, 197, 427, 201, 115, -1, 67, 383, -1, 250, 514, 143, 348, 340],
            [2, 404, -1, 221, 206, 4, -1, 276, 385, -1, 510, 193, 386, -1, 302, 206, -1, 346, 386, -1, 240, 383, -1, 29, 101, 120, 3],
            [60, 127, 153, 386, -1, 390, 340, 254, 207, -1, 63, 396, 153, 386, -1, 260, 153, 385, -1, 23, 383, -1, 159, 174, -1, 68, 153, 340, -1, 393, 120, 6, -1, 60, 32, 153, 383, -1, 401, 381, 225, -1, 105, 179, 502, 174, 0],
            [2, 60, 153, 386, -1, 229, 382, -1, 63, 396, 211, 120, -1, 503, -1, 255, 326, -1, 371, 206, 43, 115, 4, -1, 105, 179, -1, 303, 349, 292, -1, 42, 303, -1, 276, 90, 120, 3],
            [386, 29, -1, 396, 402, 17, 336, 0, -1, 60, 32, 386, -1, 369, 206, 349, 33, -1, 503, -1, 384, 495, 326, -1, 313, 313, 197, 203, -1, 120, 317, -1, 17, 201, 451, 420, 43, -1, 393, 340, 0],
            [60, 190, 120, 226, -1, 360, -1, 502, 116, 386, -1, 369, 206, 362, -1, 505, 75, -1, 60, 32, 383, -1, 253, 369, 33, -1, 502, 396, 0],
            [2, 382, 502, 115, -1, 479, 354, 383, -1, 21, 115, -1, 359, 201, 46, 446, 187, -1, 114, 206, 33, -1, 28, 127, 503, -1, 245, 470, 203, -1, 136, 195, 120, 3],
            [523, 384, 383, -1, 379, 427, 508, 174, 0, -1, 433, 381, 197, -1, 17, 115, -1, 239, 382, -1, 384, 328, 385, -1, 503, 17, 370, 132, -1, 393, 120, 0],
            [2, 60, 206, 43, -1, 505, 75, -1, 373, 381, 225, 4, -1, 60, 153, 382, -1, 245, 470, 385, -1, 250, 382, -1, 423, 320, -1, 303, 381, 197, -1, 169, 340, 153, 348, 120, 3],
            [2, 260, 153, 386, -1, 240, 446, 187, -1, 159, 173, 502, 33, -1, 60, 153, -1, 420, 378, 203, -1, 21, 322, 120, 6, -1, 60, 206, 43, -1, 105, 179, 115, -1, 42, 303, 140, 348, 120, 3],
        ]
    }
    ถ้า ภาษา == 4 {
        คืน [
            [476, 125, 472, 7, 99, 122, 112, 120, 50, 6, 238, 140, 17, 16, 39, 41, 20, 29, 20, 29, 473, 38, 41, 12, 35, 226, 324, 46, 325, 75, 586, 12, 35],
            [33, 49, 201, 24, 13, 46, 50, 6, 450, 72, 71, 364, 8, 49, 409, 17, 6, 84, 114, 91, 49, 68, 13, 46, 283, 69, 42, 603, 16, 46, 285, 17, 38, 41, 12, 35],
            [24, 24, 16, 69, 615, 53, 59, 27, 67, 13, 6, 268, 26, 45, 568, 53, 326, 26, 76, 35, 37, 7, 511, 543, 46, 50, 15, 400, 75, 39, 22, 41, 6, 364, 35, 37, 50, 236, 75, 527, 41, 12, 59, 29, 16, 69, 48],
            [468, 46, 50, 286, 17, 11, 71, 49, 16, 5, 5, 33, 27, 41, 322, 8, 49, 298, 17, 33, 49, 134, 75, 406, 12, 42, 12, 71],
            [527, 41, 6, 422, 481, 42, 29, 7, 537, 16, 17, 235, 75, 412, 71, 570, 75, 425, 69, 27, 41, 20, 72, 35, 49, 42, 29, 48],
            [1, 572, 20, 42, 6, 167, 49, 180, 548, 17, 605, 63, 45, 20, 401, 604, 75, 412, 38, 41, 12, 38, 35, 2],
            [11, 45, 35, 359, 17, 240, 20, 27, 35, 355, 250, 50, 6, 364, 49, 277, 46, 404, 38, 41, 48, 21, 69, 75, 153, 38, 41, 12, 59, 29, 68, 7, 340, 59, 14, 45, 17, 69, 393, 38, 41, 20, 36, 26, 12, 0],
            [1, 299, 69, 17, 595, 62, 35, 355, 250, 50, 33, 72, 34, 72, 123, 288, 36, 22, 621, 70, 6, 393, 49, 134, 42, 167, 70, 490, 22, 35, 2],
            [11, 49, 249, 254, 209, 36, 0, -1, 33, 72, 17, 123, 605, 30, 39, 6, 508, 69, 75, 322, 8, 46, 351, 14, 557, 27, 41, 12, 71, 0],
            [33, 72, 42, 50, 468, 169, 150, 46, 6, 462, 35, 37, 43, 123, 492, 46, 33, 72, 75, 252, 76, 42, 63, 69, 12, 59, 27, 67, 13, 0],
            [1, 577, 403, 50, 33, 49, 237, 12, 45, 71, 548, 551, 75, 216, 27, 35, 6, 83, 116, 89, 122, 116, 49, 32, 76, 59, 12, 75, 280, 20, 68, 13, 46, 66, 38, 20, 70, 43, 2],
            [206, 605, 75, 154, 38, 41, 0, -1, 262, 55, 281, 71, 325, 50, 6, 605, 386, 49, 449, 76, 134, 46, 11, 70, 59, 29, 0],
            [1, 33, 27, 41, 172, 46, 6, 473, 12, 45, 17, 69, 6, 299, 69, 50, 548, 551, 49, 550, 20, 134, 306, 55, 43, 615, 53, 554, 76, 42, 12, 38, 35, 2],
            [1, 364, 8, 50, 401, 49, 68, 13, 46, 413, 16, 20, 299, 69, 75, 186, 60, 554, 76, 36, 7, 33, 27, 41, 393, 50, 490, 12, 41, 12, 38, 35, 2],
        ]
    }
    ถ้า ภาษา == 5 {
        คืน [
            [617, 12, 612, 8, 626, 535, 216, 237, 687, 458, 445, 640, 182, 182, 614, 573, 217, 424, 850, 374, 315, 38, 11, 371, 793],
            [793, 573, 773, 11, 751, 850, 11, 548, 499, 585, 573, 434, 511, 248, 557, 562, 682, 301, 221, 664, 270, 815, 217, 786, 284, 582],
            [367, 57, 52, 755, 779, 830, 732, 170, 850, 276, 276, 573, 701, 663, 57, 8, 276, 336, 78, 57, 531, 732, 573, 506, 634, 850, 434, 434, 57, 482, 216, 87, 471, 176],
            [237, 607, 611, 543, 449, 217, 458, 6, 6, 664, 367, 57, 573, 327, 251, 482, 216, 100, 25, 520, 133],
            [579, 850, 533, 618, 8, 449, 48, 27, 608, 733, 842, 234, 573, 736, 763, 537, 46, 38, 533, 532],
            [848, 757, 229, 850, 11, 117, 93, 32, 117, 741, 428, 228, 217, 835, 752, 38, 493, 818, 8, 849],
            [78, 57, 770, 240, 573, 252, 488, 466, 349, 216, 755, 456, 434, 501, 502, 288, 8, 11, 751, 400, 399, 255, 57, 850, 11, 751, 480, 190, 170, 847],
            [848, 54, 57, 413, 809, 123, 573, 489, 11, 24, 252, 488, 775, 185, 38, 11, 228, 850, 805, 163, 80, 216, 480, 25, 395, 646, 794, 661, 582, 8, 849],
            [436, 773, 833, 408, 624, 443, 847, 255, 482, 11, 24, 819, 616, 11, 24, 819, 616, 217, 850, 780, 423, 416, 643, 367, 57, 847],
            [773, 278, 713, 421, 548, 237, 607, 775, 18, 367, 57, 11, 732, 254, 65, 255, 170, 847],
            [848, 434, 629, 742, 133, 582, 255, 291, 236, 573, 743, 251, 850, 651, 364, 333, 248, 161, 96, 819, 575, 573, 15, 319, 8, 849],
            [81, 395, 72, 755, 24, 179, 319, 847, 205, 267, 573, 793, 278, 216, 819, 34, 573, 482, 25, 239, 847],
            [848, 41, 436, 54, 57, 11, 161, 236, 614, 582, 850, 82, 106, 756, 38, 773, 743, 251, 433, 46, 573, 25, 336, 8, 849],
            [848, 659, 434, 248, 493, 682, 519, 440, 217, 275, 54, 57, 160, 391, 136, 209, 8, 664, 773, 833, 480, 850, 51, 216, 645, 646, 8, 849],
        ]
    }
    คืน []
}

ฟังก์ชัน ฉากบทเจ็ด_บทพูด(ภาษา) {
    ถ้า ภาษา == 0 {
        คืน [
            "chaputa sebun. dimon, doa opun, shiringu gigguru shita tokoro.",
            "sono muko, suripingu suta no shi, garasu no yo-ni furatto soshite sutiru.",
            "wareware koko kara furai, ritoru beara. anata-no weiku ki-o tsukete - suta dorimu.",
            "sukai, furoa motsu... soshite wareware-no shado, sono naka-de suimingu.",
            "miro - rantan. dareka, naito o kurosu wei raito.",
            "(toku, raito no torein, saundo nashi-de wota kurosu.)",
            "anata-no rosuto reta, suta riba zoi-ni rusuto. kyacchi shinagara shingu!",
            "(kaku reta, karera gyaza, wan-do ringu, soshite songu no naka raito no mama.)",
            "sore rarabai! sore jibun-o wareware-ni tichi, noto bai noto!",
            "sorekara oru sukai, wareware to issho-ni ran saseyo!",
            "(gyarakushi, gureito hoiru tan, myujikku bokkusu waindingu no yo-ni suro.)",
            "kodo horudo! homu doa, myujikku no middoru-ni!",
            "(soshite issho-ni karera daibu, raffingu, hoiru no buraito hato no naka-ni.)",
            "(suta, karera no mawari-o womu-ni kurozu, wota no yo-ni. soshite songu tsuzuku.)"
        ]
    }
    ถ้า ภาษา == 2 {
        คืน [
            "บทที่เจ็ด ปีศาจเปิดประตูบานหนึ่งตรงที่เพดานเคยหัวเราะคิกคัก",
            "พ้นจากนั้นไป ทะเลแห่งดวงดาวที่หลับใหลทอดตัวราบเรียบและนิ่งงันดั่งกระจก",
            "เราจะบินจากที่นี่กันนะ ผู้แบกบทเพลงตัวน้อย ระวังคลื่นที่ท่านสร้างด้วย ดวงดาวกำลังฝันอยู่",
            "ท้องฟ้ามีพื้นด้วยหรือนี่... และเงาของเรากำลังว่ายอยู่ในนั้น",
            "ดูสิ...โคมไฟ มีใครบางคนจุดทางข้ามราตรีไว้ให้",
            "(ไกลออกไป ขบวนแสงสว่างข้ามผืนน้ำไปอย่างไร้เสียง)",
            "ตัวอักษรที่ท่านทำหายเกาะอยู่ตามแม่น้ำแห่งดวงดาว จงขับขานไปพลางจับพวกมัน!",
            "(ทุกตัวอักษรที่พวกเขาเก็บรวบรวมได้ส่งเสียงกังวานหนึ่งครั้ง แล้วก็สว่างไสวอยู่ภายในบทเพลง)",
            "นี่มันเพลงกล่อมนี่นา! มันกำลังสอนตัวมันเองกลับคืนสู่เราทีละโน้ต!",
            "งั้นก็ให้ท้องฟ้าทั้งผืนเรียนรู้มันไปพร้อมกับเรา!",
            "(ดาราจักรหมุนวงล้ออันยิ่งใหญ่ของมัน ช้าๆ ดั่งไขลานกล่องดนตรี)",
            "จับคอร์ดไว้! ประตูสู่บ้านอยู่ตรงใจกลางของดนตรีนี่แหละ!",
            "(แล้วพวกเขาก็ดำดิ่งลงไปด้วยกัน หัวเราะร่า สู่แก่นกลางอันสุกสว่างของวงล้อ)",
            "(ดวงดาวโอบล้อมพวกเขาไว้อย่างอบอุ่นดั่งสายน้ำ และบทเพลงก็ดำเนินต่อไป)"
        ]
    }
    ถ้า ภาษา == 3 {
        คืน [
            "7장. 다이몬은 천장이 킥킥거리던 곳에 문을 하나 열었다",
            "그 너머, 잠든 별들의 바다가 유리처럼 평평하고 고요하게 펼쳐져 있었다",
            "여기서부터 우리는 난다, 어린 전달자들이여. 항적을 조심해 - 별들이 꿈을 꾸고 있으니",
            "하늘에도 바닥이 있구나... 그리고 우리 그림자가 그 안에서 헤엄치고 있어",
            "봐 - 등불이야. 누군가 밤을 가로지르는 길을 밝혀두었어",
            "(저 멀리, 빛의 행렬이 소리 없이 물을 건넜다)",
            "그대들이 잃어버린 글자들이 별들의 강을 따라 깃들어 있다. 그것들을 잡으며 노래하라!",
            "(그들이 모은 글자마다 한 번씩 울리고는, 노래 속에서 계속 빛났다)",
            "이건 자장가야! 그것이 우리에게 한 음표씩 스스로를 다시 가르쳐주고 있어!",
            "그렇다면 온 하늘이 우리와 함께 그것을 배우게 하자!",
            "(은하는 태엽을 감는 오르골처럼 느리게 거대한 바퀴를 돌렸다)",
            "화음을 유지해라! 집으로 가는 문은 음악의 한가운데 있다!",
            "(그리고 함께 웃으며, 그들은 바퀴의 밝은 중심 속으로 뛰어들었다)",
            "(별들이 물처럼 따뜻하게 그들 주위를 감쌌다. 그리고 노래는 계속되었다)"
        ]
    }
    ถ้า ภาษา == 4 {
        คืน [
            "第七章。デーモンは、天井がかつてくすくす笑っていた場所に扉を開いた",
            "その向こうには、眠れる星々の海が、ガラスのように平らで静かに広がっていた",
            "ここから飛びましょう、小さな運び手さんたち。航跡にはお気をつけて、星たちは夢を見ていますからね",
            "空には床があるのか……そして我々の影がその中を泳いでいる",
            "見て、灯籠です。誰かが夜を渡る道を照らしてくれたのですね",
            "(遠くで、光の列車が音もなく水面を渡っていった)",
            "あなた方が失くした文字は、星の川に沿ってねぐらを作っていますよ。捕まえながら歌ってください!",
            "(彼らが集めた文字はそれぞれ一度だけ鳴り、歌の中で光り続けた)",
            "あの子守唄だ! それが一音ずつ、自らを我々に教え返している!",
            "それでは空全体に、私たちと一緒にそれを学んでもらいましょう!",
            "(銀河はその大いなる車輪を回した、オルゴールのぜんまいを巻くようにゆっくりと)",
            "和音を保って! 家へ帰る扉は、音楽の真ん中にあります!",
            "(そして共に、笑いながら、彼らは車輪の輝く中心へと飛び込んでいった)",
            "(星々は水のように温かく彼らを包み込んだ。そして歌は続いていった)"
        ]
    }
    ถ้า ภาษา == 5 {
        คืน [
            "第七章。精灵在天花板曾经咯咯笑的地方,打开了一扇门",
            "门的那一边,一片沉睡的星海如玻璃般平坦而寂静地铺展着",
            "我们从这里飞起吧,小小的行者们。小心你们激起的波纹,星星们正在做梦呢",
            "天空竟然有地板……而我们的影子正在其中游动",
            "看,灯笼。有人为穿越黑夜的路途点亮了灯火",
            "(远处,一列光之列车无声地驶过了水面。)",
            "你们遗失的字母栖息在这条星河沿岸。一边捕捉它们,一边歌唱吧!",
            "(他们收集到的每一个字母都响了一声,随后便在歌中持续闪耀着。)",
            "是那首摇篮曲!它正一个音符一个音符地,重新教给我们!",
            "那就让整片天空都与我们一起学会它吧!",
            "(星系转动着它巨大的轮子,缓慢得如同八音盒的上弦。)",
            "保持住这个和弦!回家的门就在音乐的正中央!",
            "(于是他们一同大笑着,俯冲进了那轮子明亮的中心。)",
            "(群星如水般温暖地将他们合拢包围。而那首歌,仍在继续。)"
        ]
    }
    คืน [
        "chapter seven. the daemon opened a door where the ceiling used to giggle.",
        "beyond it, a sea of sleeping stars lay flat and still as glass.",
        "we fly from here, little bearers. mind your wake - the stars are dreaming.",
        "the sky has a floor... and our shadows are swimming in it.",
        "look - lanterns. someone lit the way across the night.",
        "(far off, a train of light crossed the water without a sound.)",
        "your lost letters roost along the river of stars. sing as you catch them!",
        "(each letter they gathered rang once, and stayed lit inside the song.)",
        "it is the lullaby! it is teaching itself back to us, note by note!",
        "then let the whole sky learn it with us!",
        "(the galaxy turned its great wheel, slow as a music box winding.)",
        "hold the chord! the door home is at the middle of the music!",
        "(and together they dove, laughing, into the bright heart of the wheel.)",
        "(the stars closed warm around them like water. and the song went on.)"
    ]
}

ฟังก์ชัน ฉากบทเจ็ด_ผู้พูด() {
    คืน [0, 0, 3, 1, 2, 0, 3, 0, 1, 2, 0, 3, 0, 0]   # 3 = เดมอนนำทาง
}

# รหัสผู้พูดสำหรับพากย์เสียง (ต้องตรงกับ tools/voiceover/manifest.py ทุกตัวอักษร)
ฟังก์ชัน ฉากบทเจ็ด_ผู้พูดรหัส() {
    คืน ["narrator", "narrator", "daemon", "king", "queen", "narrator", "daemon", "narrator", "king", "queen", "narrator", "daemon", "narrator", "narrator"]
}

# ระยะเวลาเล่นต่อบรรทัด (วิ) ตามภาษาพากย์เสียงจริง (วัดจาก tools/voiceover/
# progress.json ตอนอัด) — ภาษาที่ยังไม่มีเสียงพากย์ (ทุกภาษายกเว้น en ตอนนี้) ใช้
# จังหวะเดิม 3.8 วิ/บรรทัดไปก่อน
ฟังก์ชัน ฉากบทเจ็ด_ระยะเวลา(lang) {
    ถ้า lang == "ko" { คืน [6.34, 9.70, 8.50, 7.78, 6.66, 4.50, 6.18, 6.02, 6.58, 6.18, 8.02, 4.74, 6.18, 8.90] }
    ถ้า lang == "ja" { คืน [7.30, 8.26, 8.34, 6.10, 5.38, 3.86, 7.46, 6.98, 5.94, 4.26, 6.34, 6.66, 6.90, 7.86] }
    ถ้า lang == "zh" { คืน [5.38, 6.26, 9.22, 6.66, 5.78, 3.94, 7.22, 6.66, 5.94, 3.14, 4.74, 3.62, 4.66, 6.98] }
    ถ้า lang == "daemon" { คืน [6.74, 5.30, 6.82, 7.46, 4.90, 4.34, 7.62, 7.46, 5.22, 4.10, 5.14, 4.74, 6.66, 6.10] }
    ถ้า lang == "th" { คืน [4.66, 5.24, 6.04, 4.36, 4.22, 4.10, 5.62, 6.28, 5.32, 3.96, 4.66, 4.56, 5.30, 5.36] }
    ถ้า lang == "en" { คืน [5.38, 6.02, 5.06, 3.86, 4.58, 3.86, 5.22, 4.98, 7.30, 3.14, 4.26, 4.26, 5.54, 4.74] }
    คืน [3.80, 3.80, 3.80, 3.80, 3.80, 3.80, 3.80, 3.80, 3.80, 3.80, 3.80, 3.80, 3.80, 3.80]
}

ฟังก์ชัน ฉากบทเจ็ด_สีวน(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)]
}

ฟังก์ชัน ฉากบทเจ็ด_โน้ตกล่อม() {
    คืน [261.6, 293.7, 329.6, 392.0, 440.0, 523.3, 587.3, 659.3, 784.0, 880.0]   # เพนทาโทนิก+ออกเทฟ
}

# พารามิเตอร์จาก main · เพลงฉาก = Swing.wav
ฟังก์ชัน เล่นฉากบทเจ็ด(t, บทเจ็ดเริ่ม, บทเจ็ดสถานะ, musicOn, ปริมาณBGM, ปริมาณSFX, เพลงฉาก, ยาวเพลงฉาก, kCutMesh, qCutMesh, liq, ภาษา, แสดงบทพูด, ภาษาบทพูด, ระยะเวลาไดนามิก) {
    bind บทพูด = ฉากบทเจ็ด_บทพูด(ภาษาแสดงผล(ภาษา))
    bind บทพูดกลิฟ = ฉากบทเจ็ด_บทพูดกลิฟ(ภาษาบทพูด)
    bind ผู้พูด = ฉากบทเจ็ด_ผู้พูด()
    bind ผู้พูดรหัส = ฉากบทเจ็ด_ผู้พูดรหัส()
    bind ระยะเวลา = ระยะเวลาไดนามิก
    bind c7t = t - บทเจ็ดเริ่ม
    bind C7N = ความยาว(บทพูด)
    # ── ตารางเวลาสะสม: c7cum[i] = เวลาเริ่มบรรทัด i (แทนสูตร i*C7SEC ตายตัวเดิม) ──
    bind c7cum = [0.0]
    bind cci = 0
    ขณะที่ cci < C7N {
        bind c7cum = list_push(c7cum, list_get(c7cum, cci) + list_get(ระยะเวลา, cci))
        bind cci = cci + 1
    }
    bind C7TOTAL = list_get(c7cum, C7N)
    bind C7END = C7TOTAL + 3.0                                  # หาง 3 วิ: เล่นค้าง + เฟดดำ + กล้องถอย
    bind C7FADE = 0.0
    ถ้า c7t > C7END - 3.2 { bind C7FADE = (c7t - (C7END - 3.2)) / 3.2 }
    ถ้า C7FADE > 1.0 { bind C7FADE = 1.0 }
    bind c7i = 0
    bind c7scan = 1
    ขณะที่ c7scan == 1 {
        ถ้า c7i >= C7N - 1 { bind c7scan = 0 }
        มิฉะนั้น { ถ้า c7t < list_get(c7cum, c7i + 1) { bind c7scan = 0 }
        มิฉะนั้น { bind c7i = c7i + 1 } }
    }
    bind C7SEC = list_get(ระยะเวลา, c7i)                        # ระยะเวลาบรรทัดปัจจุบัน (ยังใช้เป็นค่าประมาณจังหวะทั่วไปด้านล่าง)
    bind ดำ = 1.0 - C7FADE

    # ── ถอดสถานะ ──
    bind บรรทัดก่อน = 0.0 - 1.0
    bind เก็บแล้ว = 0.0
    ถ้า บทเจ็ดสถานะ >= 0.0 {
        bind บรรทัดก่อน = ปัดลง(บทเจ็ดสถานะ / 1000.0)
        bind เก็บแล้ว = บทเจ็ดสถานะ - บรรทัดก่อน*1000.0
    }

    ถ้า musicOn == 1 {
        ถ้า ยาวเพลงฉาก > 1.0 {
            ถ้า ตำแหน่งเพลง() >= ยาวเพลงฉาก - 0.5 { ค้นหาเพลง(0);  เล่นเพลง(เพลงฉาก) }
        }
        ระดับเพลง(ปริมาณBGM * 0.85 * 0.33 * ดำ)   # หรี่ BGM เหลือ 1/3 ระหว่างคัตซีน — เสียงพากย์ต้องเด่นกว่า
    }

    # ลมบินเบา ๆ (แรงขึ้นตอนเอียงเลี้ยว)
    bind เอียง = ไซน์(c7t*0.42)                                   # เส้นทางบิน: แบงก์ซ้าย-ขวายาว ๆ
    bind ลม = 0.035 * ปริมาณSFX * ดำ * (1.0 + เอียง*เอียง*0.8)
    เสียงโทน(14, 0.0, 0.0, 0.0, 1.0, 220.0, ลม*0.4, 6.0, 0.4)

    เบลอเฟรม(0.958)                                             # หางแสงค้าง ~1.25 วิ (decay+max)
    set_depth_test(1)                                           # z-buffer จริง: เดมอน/ตัวละคร/ฉากบังกันถูกต้อง
    เติม(floor(5.0*ดำ), floor(6.0*ดำ), floor(16.0*ดำ))

    # ── ไทม์ไลน์: ขอบเขตตามเวลาสะสมจริงของแต่ละบรรทัด (c7cum) ไม่ใช่ตัวคูณ C7SEC ตายตัวอีกต่อไป ──
    bind t4 = list_get(c7cum, 4);  bind t5 = list_get(c7cum, 5);  bind t6 = list_get(c7cum, 6)
    bind t8 = list_get(c7cum, 8);  bind t12 = list_get(c7cum, 12)
    bind ดิ่ง = 0.0                                               # ดิ่งสู่ใจกลางล้อ (บรรทัด 12+)
    ถ้า c7t > t12 { bind ดิ่ง = (c7t - t12) / (C7TOTAL - t12) };  ถ้า ดิ่ง > 1.0 { bind ดิ่ง = 1.0 }

    # ── ตำแหน่งฝูงบิน: คู่เคียงกัน เดมอนนำหน้า · โยกตามแบงก์ · ท้ายเรื่องดิ่งลง ──
    bind กายสูง = 5.8
    bind ฐานY = 0.0 - 7.5 + ไซน์(c7t*0.8)*0.9 + ดิ่ง*4.0
    bind kx = 0.0 - 2.6 + เอียง*1.6;  bind ky = ฐานY + ไซน์(c7t*1.1)*0.5;        bind kz = 0.0
    bind qx = 2.6 + เอียง*1.6;        bind qy = ฐานY + ไซน์(c7t*1.1 + 1.3)*0.5;  bind qz = 0.6
    bind dmx = เอียง*2.4;  bind dmy = ฐานY - 2.6 + ไซน์(c7t*1.4)*0.7;  bind dmz = 7.5

    # ── แสง: จันทร์กาแล็กซีเย็น + โคมอุ่น + ไฟตัวละคร ──
    ล้างแสง()
    ตั้งแสงรอบข้าง(0.22 * ดำ + 0.06)
    เพิ่มแสง(0.0-20.0, 0.0-30.0, 30.0, 0.7, 0.75, 1.0, 1.2*ดำ, 130.0)
    เพิ่มแสง(kx, ky - 5.0, kz, 0.35, 0.55, 1.0, 0.9*ดำ, 28.0)
    เพิ่มแสง(qx, qy - 5.0, qz, 1.0, 0.45, 0.65, 0.9*ดำ, 28.0)
    เพิ่มแสง(dmx, dmy - 2.0, dmz, 1.0, 0.78, 0.42, 1.0*ดำ, 30.0)
    ถ้า ดิ่ง > 0.0 { เพิ่มแสง(0.0, 4.0, 60.0, 1.0, 0.95, 0.8, 2.2*ดิ่ง, 160.0) }   # ใจกลางล้อสว่างรับ

    # ── กล้อง: เทคยาวมิยาซากิ — แทร็กข้าง → เครนขึ้นเปิดกาแล็กซี → หน้าตรงแบงก์ → ตามดิ่ง ──
    bind camX = 0.0 - 13.0;  bind camY = ฐานY - 1.5;  bind camZ = 2.0
    bind lookX = 0.0;  bind lookY = ฐานY;  bind lookZ = 6.0
    ถ้า c7t >= t4 { ถ้า c7t < t8 {
        bind s2 = (c7t - t4) / (t8 - t4)
        bind camX = 0.0 - 13.0 + s2*10.0
        bind camY = ฐานY - 1.5 - s2*7.0                           # เครนขึ้นช้า เห็นล้อกาแล็กซี
        bind camZ = 2.0 - s2*8.0
        bind lookX = 0.0;  bind lookY = ฐานY + s2*2.0;  bind lookZ = 14.0
    } }
    ถ้า c7t >= t8 { ถ้า c7t < t12 {
        bind camX = ไซน์(c7t*0.2)*3.0
        bind camY = ฐานY - 0.8
        bind camZ = 11.0                                           # หน้าตรง: บินเข้าหากล้อง
        bind lookX = เอียง*1.5;  bind lookY = ฐานY;  bind lookZ = 0.0
    } }
    ถ้า c7t >= t12 {
        bind camX = ไซน์(c7t*0.15)*2.0
        bind camY = ฐานY - 6.0
        bind camZ = 0.0 - 12.0 + ดิ่ง*4.0                          # ตามหลังตอนดิ่งเข้าแสง
        bind lookX = 0.0;  bind lookY = ฐานY + 3.0;  bind lookZ = 60.0
    }
    ถ้า c7t > C7TOTAL {                                        # หางเฟด: กล้องลอยขึ้น-ถอยช้า
        bind หลังฉาก = c7t - C7TOTAL
        bind camY = camY - หลังฉาก*0.6;  bind camZ = camZ - หลังฉาก*1.4
    }
    # กันกล้องเสียบเข้าออร่าเดมอน (ทรงกลม additive รัศมีถึง ~6.2) — เตะออกถ้าใกล้เกิน 8
    bind ดมdx = camX - dmx;  bind ดมdy = camY - (dmy - 2.0);  bind ดมdz = camZ - dmz
    bind ดมd = รากที่สอง(ดมdx*ดมdx + ดมdy*ดมdy + ดมdz*ดมdz) + 0.0001
    ถ้า ดมd < 8.0 {
        bind camX = dmx + ดมdx/ดมd*8.0
        bind camY = (dmy - 2.0) + ดมdy/ดมd*8.0
        bind camZ = dmz + ดมdz/ดมd*8.0
    }
    ตั้งกล้องมอง(camX, camY, camZ, lookX, lookY, lookZ)
    ตั้งระยะห่าง(1.85)

    # ── ทะเลดาวกระจก: เส้นขอบฟ้าเรือง + ดาวบน/ดาวสะท้อนใต้ผิว y=+3 ──
    โหมดผสม(1)
    bind ผิวน้ำ = 3.0
    bind ดว = 0
    ขณะที่ ดว < 26 {
        bind dxs = ((ดว * 37.0 + 11.0) - ปัดลง((ดว * 37.0 + 11.0)/90.0)*90.0) - 45.0
        bind dzs = 12.0 + ((ดว * 53.0 + c7t*6.0) - ปัดลง((ดว * 53.0 + c7t*6.0)/70.0)*70.0)   # ไหลเข้าหากล้อง = บิน
        bind dys = 0.0 - 9.0 - ((ดว * 29.0) - ปัดลง((ดว * 29.0)/26.0)*26.0)
        bind ทว = 0.55 + ไซน์(c7t*2.0 + ดว)*0.3
        สีดินสอ(floor(200*ทว*ดำ), floor(210*ทว*ดำ), floor(255*ทว*ดำ))
        วาดเส้น3มิติ(dxs, dys, dzs, dxs, dys - 0.4, dzs)
        # เงาสะท้อนใต้ผิว (จางกว่า สั่นระริก)
        bind ry = ผิวน้ำ + (ผิวน้ำ - dys) * 0.35 + ไซน์(c7t*3.0 + ดว)*0.15
        สีดินสอ(floor(90*ทว*ดำ), floor(95*ทว*ดำ), floor(130*ทว*ดำ))
        วาดเส้น3มิติ(dxs, ry, dzs, dxs, ry + 0.3, dzs)
        bind ดว = ดว + 1
    }
    # เส้นขอบฟ้าเรืองบาง
    สีดินสอ(floor(60*ดำ), floor(80*ดำ), floor(140*ดำ))
    วาดเส้น3มิติ(0.0-60.0, ผิวน้ำ, 55.0,  60.0, ผิวน้ำ, 55.0)

    # ── ล้อกาแล็กซี: แขนเกลียว 3 แขนหมุนช้าเหมือนกล่องดนตรี (ไกลบนฟ้า) ──
    bind แขน = 0
    ขณะที่ แขน < 3 {
        bind จุด = 0
        ขณะที่ จุด < 9 {
            bind gr = 4.0 + จุด * 3.1
            bind ga = แขน * 2.094 + จุด * 0.42 + c7t * 0.06        # หมุนช้ามาก
            bind gx = โคไซน์(ga) * gr
            bind gy = 0.0 - 26.0 + ไซน์(ga) * gr * 0.42
            bind gz = 52.0 + จุด * 0.8
            bind gCol = ฉากบทเจ็ด_สีวน(แขน*1.5 + จุด*0.3 + c7t*0.25)
            bind gs = 1.6 - จุด*0.12 + ดิ่ง*0.8                   # ดิ่งเข้า = โตขึ้น
            อนุภาคทรงกลม(gx, gy, gz, gs, 6, c7t*1.2 + แขน*3.0 + จุด, list_get(gCol,0), list_get(gCol,1), list_get(gCol,2))
            bind จุด = จุด + 1
        }
        bind แขน = แขน + 1
    }
    bind ล้อCol = วนสีอ่อน(255, 240, 200, c7t*1.1, 0.38)                                # ใจกลางล้ออุ่น
    อนุภาคทรงกลม(0.0, 0.0-26.0, 52.0, 3.2 + ดิ่ง*5.0, 12, c7t*0.8, list_get(ล้อCol,0), list_get(ล้อCol,1), list_get(ล้อCol,2))

    # ── ทุ่นโคมไฟ: แถวรับทางลอยผ่าน (เสา+โคมอุ่น+เงาสะท้อน) ──
    bind คม = 0
    ขณะที่ คม < 7 {
        bind lz = 8.0 + ((คม * 16.0 + c7t*9.0) - ปัดลง((คม * 16.0 + c7t*9.0)/112.0)*112.0)
        bind lxx = 0.0 - 11.0 + (คม - ปัดลง(คม/2.0)*2.0) * 22.0   # สลับซ้าย-ขวาของเส้นทาง
        bind ไฟโคม = 0.75 + ไซน์(c7t*3.0 + คม*2.0)*0.25
        สีดินสอ(floor(120*ดำ), floor(90*ดำ), floor(70*ดำ))
        วาดเส้น3มิติ(lxx, ผิวน้ำ, lz,  lxx, ผิวน้ำ - 4.6, lz)
        อนุภาคทรงกลม(lxx, ผิวน้ำ - 5.2, lz, 0.9, 6, c7t*2.0 + คม, floor(255*ไฟโคม), floor(196*ไฟโคม), floor(110*ไฟโคม))
        แอ่งแสง(lxx, ผิวน้ำ, lz, 3.4, 255, 190, 110, 0.3*ไฟโคม*ดำ)
        bind คม = คม + 1
    }

    # ── รถไฟแสง (บรรทัด 5-6): ขบวนหน้าต่างสว่างวิ่งขวา→ซ้ายบนขอบฟ้า เงียบ ๆ ──
    ถ้า c7t > t5 - 1.0 { ถ้า c7t < t6 + C7SEC {
        bind รถ = (c7t - (t5 - 1.0)) / (C7SEC*2.0 + 1.0)
        bind trX = 52.0 - รถ * 104.0
        bind ตู = 0
        ขณะที่ ตู < 9 {
            bind wx = trX + ตู * 2.6
            สีดินสอ(floor(255*ดำ), floor(232*ดำ), floor(170*ดำ))
            วาดเส้น3มิติ(wx, ผิวน้ำ - 2.1, 50.0,  wx + 1.5, ผิวน้ำ - 2.1, 50.0)
            # สะท้อนบนผิวทะเลดาว
            สีดินสอ(floor(120*ดำ), floor(105*ดำ), floor(80*ดำ))
            วาดเส้น3มิติ(wx, ผิวน้ำ + 1.2, 50.0,  wx + 1.5, ผิวน้ำ + 1.2, 50.0)
            bind ตู = ตู + 1
        }
    } }

    # ── แม่น้ำดาว + ตัวอักษรหลงทาง: กลิฟเรืองลอยตามเส้นทาง (เก็บ = โน้ตดัง บรรทัด 6-11) ──
    bind กลอ = 0
    ขณะที่ กลอ < 10 {
        bind ลอยz = 6.0 + ((กลอ * 21.0 + c7t*9.0) - ปัดลง((กลอ * 21.0 + c7t*9.0)/150.0)*150.0)
        bind ลอยx = ไซน์(กลอ * 1.9) * 7.5
        bind ลอยy = 0.0 - 9.5 + ไซน์(c7t*1.1 + กลอ*1.7)*1.6
        bind สว = 0.5
        ถ้า กลอ < เก็บแล้ว { bind สว = 1.0 }                       # เก็บแล้ว = ติดสว่างค้างในเพลง
        bind กCol = ฉากบทเจ็ด_สีวน(กลอ*0.8 + c7t*1.1)
        โหมดผสม(1)
        สีดินสอ(floor(list_get(กCol,0)*สว), floor(list_get(กCol,1)*สว), floor(list_get(กCol,2)*สว))
        วาดกลิฟ3มิติ((กลอ*5 + 3) - ปัดลง((กลอ*5 + 3)/26.0)*26.0, ลอยx, ลอยy, ลอยz, c7t*0.7 + กลอ, 1.0 + สว*0.35)
        bind กลอ = กลอ + 1
    }
    flush_3d();  โหมดผสม(0)

    # ── เก็บตัวอักษร → โน้ตกล่อมสะสม (บรรทัด 6-11 ทุก ~2.2 วิ) ──
    ถ้า c7t >= t6 { ถ้า c7t < t12 {
        bind เป้า7 = ปัดลง((c7t - t6) / 2.2)
        ถ้า เป้า7 > 10.0 { bind เป้า7 = 10.0 }
        ถ้า เก็บแล้ว < เป้า7 {
            bind โน้ต7 = ฉากบทเจ็ด_โน้ตกล่อม()
            bind nf7 = list_get(โน้ต7, เก็บแล้ว)
            เล่นไชม์ใหญ่(0.0, 0.0-9.0, 12.0, nf7, 0.3 * ปริมาณSFX)
            เล่นฮังแพน(0.0, 0.0-9.0, 12.0, nf7 * 0.5, 0.12 * ปริมาณSFX)
            bind เก็บแล้ว = เก็บแล้ว + 1.0
        }
    } }

    # ── คู่สหายบิน: เอนลมแรง แขนพับหลัง ขาเหยียด · แบงก์ตามเส้นทาง ──
    bind บินเอน = 0.55 + ดิ่ง*0.25
    bind บินแขน = 0.0 - 0.28 + ไซน์(c7t*1.3)*0.06                 # แขนลู่หลัง
    bind บินทัค = 0.12
    set_flat_shade(0.0)
    set_material("roughness", 0.55)
    set_material("specular", 0.35)
    set_material("subsurface", 0.28)
    mesh_draw(kCutMesh, kx, ky, kz, กายสูง, เอียง*0.35, เอียง*0.22, บินแขน, บินเอน, 0.25, บินทัค)
    mesh_draw(qCutMesh, qx, qy, qz, กายสูง, เอียง*0.35, เอียง*0.22 + ไซน์(c7t*1.6)*0.05, บินแขน*0.9, บินเอน, 0.25, บินทัค)
    flush_3d()
    reset_material()

    # หางแสงดาวตก (คู่สหาย): เส้นสตรีคตามหลัง + ประกาย
    โหมดผสม(1)
    bind หc = ฉากบทเจ็ด_สีวน(c7t*1.5)
    bind หาง = 0
    ขณะที่ หาง < 4 {
        bind hf = หาง / 4.0
        สีดินสอ(floor(110*(1.0-hf)), floor(160*(1.0-hf)), floor(255*(1.0-hf)))
        วาดเส้น3มิติ(kx, ky - 2.0 + หาง*0.4, kz - 1.0 - หาง*2.2,  kx - เอียง*1.5, ky - 2.0 + หาง*0.4, kz - 3.2 - หาง*2.2)
        สีดินสอ(floor(255*(1.0-hf)), floor(130*(1.0-hf)), floor(190*(1.0-hf)))
        วาดเส้น3มิติ(qx, qy - 2.0 + หาง*0.4, qz - 1.0 - หาง*2.2,  qx - เอียง*1.5, qy - 2.0 + หาง*0.4, qz - 3.2 - หาง*2.2)
        bind หาง = หาง + 1
    }
    bind kAur = วนสีอ่อน(120, 170, 255, c7t*1.6, 0.22)        # ราชา: คุมให้ยังเป็นน้ำเงิน
    อนุภาคทรงกลม(kx, ky - 1.5, kz - 3.0, 1.1, 6, c7t*4.0, list_get(kAur,0), list_get(kAur,1), list_get(kAur,2))
    bind qAur = วนสีอ่อน(255, 140, 200, c7t*1.6 + 2.0, 0.22)  # ราชินี: คุมให้ยังเป็นกุหลาบ
    อนุภาคทรงกลม(qx, qy - 1.5, qz - 3.0, 1.1, 6, c7t*4.0 + 2.0, list_get(qAur,0), list_get(qAur,1), list_get(qAur,2))
    flush_3d();  โหมดผสม(0)

    # ลูกของเหลว (เบากว่าเดิม — ประกายรอบตัวตอนบิน)
    โหมดผสม(1)
    liquid_step(liq, 0.016)
    liquid_splat(liq, 28.0 + ไซน์(c7t*1.5)*13.0, 28.0 + โคไซน์(c7t*1.2)*13.0, 1.0, 0.16, 3.0)
    liquid_draw_surface(liq, 1.0, kx, ky - กายสูง*0.52, kz, กายสูง*0.58, กายสูง*0.58)
    liquid_draw_surface(liq, 1.0, qx, qy - กายสูง*0.52, qz, กายสูง*0.58, กายสูง*0.58)
    flush_3d();  โหมดผสม(0)

    # ── เดมอนนำทาง (จากบทหก) — โบกมือชวนตอนพูด ──
    bind ทัก7 = 0.0
    ถ้า c7i == 2 { bind ทัก7 = 1.0 };  ถ้า c7i == 6 { bind ทัก7 = 1.0 };  ถ้า c7i == 11 { bind ทัก7 = 1.0 }
    ฉากบทหก_วาดเดมอน(dmx, dmy, dmz, 1.0, ทัก7, c7t, camX, camZ)

    # ── เหตุการณ์ครั้งเดียวต่อบรรทัด ──
    ถ้า c7i > บรรทัดก่อน {
        ถ้า c7i < C7N {
            bind whoN = list_get(ผู้พูด, c7i)
            เล่นเสียงพากย์("chapter7", c7i, list_get(ผู้พูดรหัส, c7i), ภาษา, ปริมาณSFX)
            ถ้า whoN < 0.5 { เล่นไชม์ใหญ่(0.0, 0.0, 0.0, 261.6, 0.16 * ปริมาณSFX) }
            ถ้า whoN > 0.5 { ถ้า whoN < 1.5 { เล่นกาเมลัน(0.0, 0.0, 0.0, 220.0, 0.24 * ปริมาณSFX) } }
            ถ้า whoN > 1.5 { ถ้า whoN < 2.5 { เล่นแฟนแฟร์(0.0, 0.0, 0.0, 174.6, 0.18 * ปริมาณSFX) } }
            ถ้า whoN > 2.5 {
                เล่นฮังแพน(dmx, dmy, dmz, 330.0, 0.22 * ปริมาณSFX)
                เล่นไชม์ใหญ่(dmx, dmy - 1.0, dmz, 1046.5, 0.09 * ปริมาณSFX)
            }
            ถ้า c7i == 5 {                                        # รถไฟแสง: หวูดนุ่มไกล ๆ
                เสียงเอฟเฟกต์(30.0, 0.0, 50.0, 1.0, 196.0, 0.14*ปริมาณSFX, 1.2, "triangle")
                เสียงเอฟเฟกต์(30.0, 0.0, 50.0, 1.0, 147.0, 0.10*ปริมาณSFX, 1.4, "triangle")
            }
            ถ้า c7i == 12 {                                       # ดิ่งเข้าใจกลาง: ควอดฮาร์ปขึ้น
                เล่นไชม์ใหญ่(0.0, 0.0-9.0, 30.0, 523.3, 0.24 * ปริมาณSFX)
                เล่นไชม์ใหญ่(0.0, 0.0-9.0, 30.0, 659.3, 0.20 * ปริมาณSFX)
                เล่นไชม์ใหญ่(0.0, 0.0-9.0, 30.0, 784.0, 0.18 * ปริมาณSFX)
                เสียงเอฟเฟกต์(0.0, 0.0-9.0, 30.0, 1.0, 880.0, 0.12*ปริมาณSFX, 1.6, "sine")
            }
        }
        bind บรรทัดก่อน = c7i
    }

    # ── ตัวหนังสือ ──
    set_depth_test(0)                                           # ข้อความ overlay ไม่ใช้ z ฉากโลก
    ตั้งกล้องมอง(0.0, 0.0, -22.0, 0.0, 0.0, 0.0)
    ตั้งระยะห่าง(2.8)
    สีดินสอ(floor(185*ดำ+18), floor(205*ดำ+18), floor(245*ดำ+20))
    วาดสตริง("chapter 7 : the river of sleeping stars", 0.0, 10.0, 0.0, 0.6, 1)
    ถ้า c7i < C7N {
        bind line7 = list_get(บทพูด, c7i)
        bind line7กลิฟ = list_get(บทพูดกลิฟ, c7i)
        bind who7 = list_get(ผู้พูด, c7i)
        bind lt = c7t - list_get(c7cum, c7i)
        bind laf = 1.0
        ถ้า lt < 0.6 { bind laf = lt / 0.6 }
        ถ้า lt > C7SEC - 0.7 { bind laf = (C7SEC - lt) / 0.7 }
        ถ้า laf < 0.0 { bind laf = 0.0 }
        bind lr = floor(230.0 * laf);  bind lg = floor(240.0 * laf);  bind lb = floor(255.0 * laf)
        ถ้า who7 > 0.5 { ถ้า who7 < 1.5 { bind lr = floor(255.0*laf);  bind lg = floor(218.0*laf);  bind lb = floor(128.0*laf) } }
        ถ้า who7 > 1.5 { ถ้า who7 < 2.5 { bind lr = floor(212.0*laf);  bind lg = floor(222.0*laf);  bind lb = floor(255.0*laf) } }
        ถ้า who7 > 2.5 { bind lr = floor(255.0*laf);  bind lg = floor(196.0*laf);  bind lb = floor(96.0*laf) }
        ถ้า แสดงบทพูด == 1 {
            วาดสตริงบทพูดบากขอบ(line7กลิฟ, ภาษาบทพูด, 0.0, 8.3, 0.0, 0.61)
            สีดินสอ(lr, lg, lb)
            วาดสตริงบทพูดบาก(line7กลิฟ, ภาษาบทพูด, 0.0, 8.3, 0.0, 0.61)
        }
    }
    สีดินสอ(floor(170*ดำ), floor(180*ดำ), floor(205*ดำ))
    วาดสตริง("[enter/space] continue   [esc] skip", 0.0, 10.9, 0.0, 0.42, 1)
    flush_3d()

    แสดงผล()

    bind outC7 = 0.0
    ถ้า c7t >= C7END { bind outC7 = 1.0 }
    # กันข้ามโดยไม่ตั้งใจ: ไม่รับปุ่มข้าม (คีย์บอร์ด+จอย) ช่วง 5 วิแรกของฉาก
    ถ้า c7t > 5.0 {
        ถ้า กดปุ่ม("enter") { bind outC7 = 1.0 }
        ถ้า กดปุ่ม("space") { bind outC7 = 1.0 }
        ถ้า กดปุ่ม("escape") { bind outC7 = 1.0 }
        ถ้า จอยปุ่ม("a") { bind outC7 = 1.0 }
        ถ้า จอยปุ่ม("start") { bind outC7 = 1.0 }
    }
    ถ้า outC7 > 0.5 {
        เบลอเฟรม(0.0)
        เสียงโทน(14, 0.0, 0.0, 0.0, 1.0, 220.0, 0.0, 0.0, 0.0)
    }
    คืน [บรรทัดก่อน*1000.0 + เก็บแล้ว, outC7]
}

← Back to index