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/chapter4.ling
# Chapter 4 cutscene module — "the long throat of the sky"
# Returns [state, shouldExit] · state = lineIdx*1000 + tollNoteIdx
#
# ทะลุรูหนอนตามรอยดาวหาง — โทน Majora's Mask: ของศักดิ์สิทธิ์จ้องกลับ เวลาบิดเบี้ยว
# ของขลังเวียดนาม: กลองสำริดด่งเซิน (วงแหวนซ้อน+ดาวกลาง) ลอยผ่าน · ยันต์กระดาษ (บู่อา)
# ห้อยรอบผนังอุโมงค์ อักขระเรืองแดง โค้งคำนับตอนทางเปิด
# วิญญาณจีน: เจ้าแม่น้ำ (งูน้ำมุกฟ้า สวมหน้ากากมุก) + เจ้ากองไฟ (งูเพลิงส้ม หน้ากากถ่าน)
# เลื้อยวนรอบราชินี/ราชา เรียก "ค่าผ่านทางหนึ่งโน้ตแท้" → ราชินีร้องโน้ต Seraph 8 ตัว
# → สองวิญญาณถักเกลียวหยินหยางเปิดทาง · ปากอุโมงค์ไกล: แสงเย็นรอเฉย ๆ (ลางบทต่อไป)
# สกอร์: Psyon.wav · โดรนลอย + หยดน้ำ/ถ่านแตกตามบีตช่วงวิญญาณ · ฆ้องกลองสำริดตอนลอยผ่าน
ฟังก์ชัน ฉากบทสี่_บทพูดกลิฟ(ภาษา) {
ถ้า ภาษา == 0 {
คืน [
[10, 15, 8, 22, 26, 25, 8, -1, 13, 21, 5, -1, 19, 8, 26, 20, 25, 12, 20, -1, 20, 21, -1, 26, 24, 15, 16, 23, 21, -1, 14, 12, 25, 21, 3, -1, 19, 8, 26, 20, 25, 12, 20, 4, 20, 16, -1, 23, 16, 11, 21, -1, 24, 15, 16, 20, 8, 18, 8, 25, 25, 8, 5],
[24, 21, 23, 12, -1, 18, 8, 23, 12, 23, 8, 4, 21, 3, -1, 24, 26, 18, 8, 16, -1, 20, 21, -1, 20, 8, 14, 8, 16, -1, 20, 21, 11, 21, 4, 20, 16, -1, 24, 26, 28, 8, 23, 21, 3, -1, 23, 8, 16, 25, 21, -1, 9, 8, 18, 18, 26, -1, 28, 21, 11, 21, -1, 23, 8, 20, -1, 25, 21, 18, 21, 23, 21, 5],
[19, 8, 16, -1, 15, 8, 20, 11, 21, -1, 15, 21, 23, 26, 11, 21, 5, -1, 21, 23, 26, 11, 21, -1, 10, 15, 8, 19, 26, 3, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 22, 8, 24, 26, -1, 28, 21, 25, 10, 15, 16, 5],
[9, 26, 23, 21, 20, 30, 26, -1, 11, 21, 23, 8, 19, 26, -1, 24, 15, 16, 25, 8, 3, -1, 22, 12, 22, 8, -1, 24, 15, 16, 23, 26, -1, 26, 12, 5, -1, 11, 8, 23, 12, 18, 8, -1, 18, 21, 20, 21, -1, 23, 21, 11, 21, -1, 9, 16, 16, 20, 14, 26, 4, 20, 16, -1, 22, 26, 23, 12, 16, 5],
[24, 21, 23, 12, 18, 8, 23, 8, -1, 28, 21, 25, 8, -1, 23, 8, 16, 30, 26, -1, 8, 22, 22, 26, -1, 24, 15, 16, 20, 14, 16, 20, 14, 26, 3, -1, 22, 8, 23, 26, -1, 25, 21, -1, 23, 12, 16, 20, -1, 20, 21, -1, 19, 8, 24, 26, 18, 26, -1, 28, 12, 8, 5],
[24, 21, 20, 14, 26, -1, 20, 21, -1, 23, 16, 25, 21, 23, 26, -1, 9, 12, 8, 23, 8, 3, -1, 11, 16, 22, 26, -1, 8, 20, 8, 25, 8, -1, 23, 16, 19, 12, 19, 9, 8, 5, -1, 28, 8, 20, -1, 25, 21, 23, 26, -1, 20, 21, 25, 21, -1, 20, 21, -1, 25, 21, 23, 26, -1, 22, 12, 16, 5],
[24, 21, 24, 15, 16, 25, 12, -1, 13, 26, 23, 12, 19, 26, -1, 8, 24, 24, 15, 26, -1, 23, 16, 19, 12, 19, 9, 8, 5, -1, 23, 21, 20, 14, 26, -1, 24, 15, 16, 20, 14, 26, 3, -1, 23, 21, 11, 21, -1, 24, 15, 21, 25, 21, -1, 9, 8, 20, 5],
[24, 21, 23, 12, 18, 8, 23, 8, -1, 23, 8, 23, 8, 9, 8, 16, -1, 18, 16, 18, 26, 3, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 18, 29, 8, 23, 16, -1, 24, 15, 16, 25, 8, -1, 15, 21, 11, 21, -1, 25, 21, 18, 26, 5],
[25, 24, 26, -1, 24, 26, 22, 16, 23, 16, 25, 25, 21, -1, 16, 24, 24, 15, 21, 20, 16, -1, 18, 21, 16, 23, 26, 3, -1, 28, 21, 25, 8, -1, 13, 8, 16, 8, -1, 25, 21, -1, 9, 26, 23, 12, 16, 11, 21, 3, -1, 24, 26, 25, 16, 19, 26, -1, 25, 21, -1, 12, 19, 9, 8, -1, 20, 21, -1, 15, 21, 16, 23, 26, 5],
[10, 15, 8, 19, 26, -1, 9, 8, 26, 3, -1, 23, 21, 11, 21, -1, 21, 22, 26, 20, 5, -1, 18, 8, 23, 12, 4, 20, 21, -1, 13, 12, 24, 26, -1, 23, 16, 19, 12, 19, 9, 8, 3, -1, 24, 26, 18, 8, 16, -1, 13, 26, -1, 15, 12, 23, 26, 22, 26, -1, 25, 8, 30, 26, 20, 12, 23, 26, -1, 25, 21, 18, 16, 5],
[11, 12, 19, 21, -1, 28, 8, 19, 26, 15, 21, 23, 26, -1, 20, 21, -1, 25, 21, 16, -1, 19, 8, 26, 24, -1, 11, 12, 3, -1, 18, 21, 23, 26, 11, 21, -1, 23, 8, 16, 25, 21, -1, 24, 26, 11, 12, 20, 16, -1, 28, 12, 16, 25, 21, 5],
[24, 21, 23, 12, -1, 11, 21, 23, 8, 19, 26, -1, 19, 8, 12, -1, 18, 8, 23, 8, -1, 30, 26, 25, 25, 21, -1, 28, 12, 16, 25, 21, 5, -1, 24, 21, 24, 15, 16, 25, 12, -1, 24, 21, 23, 12, -1, 18, 8, 23, 12, 4, 20, 21, -1, 20, 12, 19, 26, -1, 24, 15, 16, 25, 25, 12, -1, 16, 25, 8, 5],
]
}
ถ้า ภาษา == 1 {
คืน [
[15, 20, 13, 28, 32, 17, 30, -1, 18, 27, 33, 30, 6, -1, 32, 20, 17, -1, 19, 13, 32, 17, -1, 14, 17, 20, 21, 26, 16, -1, 32, 20, 17, -1, 25, 27, 33, 26, 32, 13, 21, 26, -1, 16, 21, 16, -1, 26, 27, 32, -1, 24, 17, 13, 16, -1, 32, 27, -1, 32, 20, 17, -1, 25, 27, 33, 26, 32, 13, 21, 26, 6],
[21, 32, -1, 31, 35, 13, 24, 24, 27, 35, 17, 16, -1, 32, 20, 17, 25, -1, 21, 26, 32, 27, -1, 32, 20, 17, -1, 24, 27, 26, 19, -1, 32, 20, 30, 27, 13, 32, -1, 27, 18, -1, 32, 20, 17, -1, 31, 23, 37, 4, -1, 35, 20, 17, 30, 17, -1, 24, 21, 19, 20, 32, -1, 30, 33, 26, 31, -1, 14, 13, 15, 23, 35, 13, 30, 16, 6],
[20, 27, 24, 16, -1, 25, 37, -1, 20, 13, 26, 16, 6, -1, 32, 20, 17, -1, 27, 24, 16, -1, 15, 20, 13, 30, 25, 31, -1, 13, 30, 17, -1, 35, 13, 32, 15, 20, 21, 26, 19, -1, 33, 31, -1, 28, 13, 31, 31, 6],
[14, 30, 27, 26, 38, 17, -1, 16, 30, 33, 25, 31, -1, 14, 17, 24, 27, 35, 4, -1, 28, 13, 28, 17, 30, -1, 31, 17, 13, 24, 31, -1, 13, 14, 27, 34, 17, 6, -1, 31, 27, 25, 17, 27, 26, 17, -1, 28, 30, 13, 37, 17, 16, -1, 32, 20, 21, 31, -1, 30, 27, 13, 16, -1, 21, 26, 32, 27, -1, 14, 17, 21, 26, 19, 6],
[32, 20, 17, 26, -1, 32, 20, 17, -1, 35, 13, 32, 17, 30, -1, 30, 27, 31, 17, -1, 33, 28, -1, 31, 21, 26, 19, 21, 26, 19, 4, -1, 35, 17, 13, 30, 21, 26, 19, -1, 13, -1, 25, 13, 31, 23, -1, 27, 18, -1, 28, 17, 13, 30, 24, -1, 13, 26, 16, -1, 30, 13, 21, 26, 6],
[24, 21, 32, 32, 24, 17, -1, 14, 17, 13, 30, 17, 30, 31, -1, 27, 18, -1, 32, 20, 17, -1, 31, 27, 26, 19, 4, -1, 32, 20, 17, -1, 16, 17, 17, 28, -1, 30, 17, 25, 17, 25, 14, 17, 30, 31, -1, 37, 27, 33, 6, -1, 28, 13, 37, -1, 32, 20, 17, -1, 32, 27, 24, 24, -1, 27, 18, -1, 27, 26, 17, -1, 32, 30, 33, 17, -1, 26, 27, 32, 17, 6],
[13, 26, 16, -1, 32, 20, 17, -1, 18, 24, 13, 25, 17, -1, 30, 17, 25, 17, 25, 14, 17, 30, 31, -1, 32, 20, 17, -1, 13, 31, 20, 6, -1, 31, 21, 26, 19, -1, 35, 30, 27, 26, 19, 4, -1, 13, 26, 16, -1, 32, 20, 17, -1, 30, 27, 13, 16, -1, 14, 33, 30, 26, 31, -1, 31, 20, 27, 30, 32, 6],
[32, 20, 17, 26, -1, 20, 17, 13, 30, -1, 32, 20, 17, -1, 24, 33, 24, 24, 13, 14, 37, -1, 13, 31, -1, 18, 13, 30, -1, 13, 31, -1, 35, 17, -1, 20, 13, 34, 17, -1, 15, 13, 30, 30, 21, 17, 16, -1, 21, 32, 6],
[32, 20, 17, -1, 31, 28, 21, 30, 21, 32, 31, -1, 15, 27, 21, 24, 17, 16, -1, 32, 27, 19, 17, 32, 20, 17, 30, 4, -1, 35, 13, 32, 17, 30, -1, 14, 30, 13, 21, 16, 21, 26, 19, -1, 18, 21, 30, 17, 4, -1, 13, -1, 35, 20, 17, 17, 24, -1, 27, 18, -1, 31, 32, 17, 13, 25, -1, 13, 26, 16, -1, 17, 25, 14, 17, 30, 31, 6],
[32, 20, 17, -1, 15, 20, 13, 30, 25, 31, -1, 14, 27, 35, 6, -1, 32, 20, 17, -1, 30, 27, 13, 16, -1, 27, 28, 17, 26, 31, 6, -1, 30, 17, 25, 17, 25, 14, 17, 30, -1, 32, 20, 17, 21, 30, -1, 18, 13, 15, 17, 31, -1, 35, 20, 17, 26, -1, 32, 20, 17, -1, 31, 23, 37, -1, 13, 31, 23, 31, -1, 35, 20, 27, -1, 20, 17, 24, 28, 17, 16, -1, 33, 31, 6],
[14, 33, 32, -1, 13, 32, -1, 32, 20, 17, -1, 18, 13, 30, -1, 25, 27, 33, 32, 20, -1, 27, 18, -1, 32, 20, 17, -1, 35, 27, 30, 25, 20, 27, 24, 17, 4, -1, 32, 20, 17, -1, 15, 27, 24, 16, -1, 24, 21, 19, 20, 32, -1, 35, 13, 31, -1, 13, 24, 30, 17, 13, 16, 37, -1, 35, 13, 21, 32, 21, 26, 19, 6],
[21, 32, -1, 20, 13, 16, -1, 14, 17, 17, 26, -1, 35, 13, 21, 32, 21, 26, 19, -1, 31, 21, 26, 15, 17, -1, 14, 17, 18, 27, 30, 17, -1, 32, 20, 17, -1, 16, 30, 33, 25, 31, 6, -1, 13, 26, 16, -1, 21, 32, -1, 23, 26, 17, 35, -1, 32, 20, 17, 21, 30, -1, 26, 13, 25, 17, 31, 6],
]
}
ถ้า ภาษา == 2 {
คืน [
[62, 51, 51, 139, 113, 139, -1, 65, 93, 129, 44, 119, 101, 130, 20, 83, 149, 10, 133, 57, 132, 57, 153, 86, 153, 41, 57, 134, 153, 65, 116, 83, 149, 10, 133, 149, 101, 88],
[84, 130, 57, 6, 101, 146, 57, 76, 107, 6, 149, 10, 133, 149, 12, 133, 153, 65, 152, 57, 101, 134, 13, 123, 123, 130, 57, 88, 133, 107, 153, 6, 101, 10, 123, 20, 55, 123, 20, 81, 133, -1, 51, 139, 30, 144, 20, 150, 113, 20, 153, 119, 101, 92, 123, 57, 6, 101, 130, 62],
[21, 130, 62, 84, 146, 123, 26, 130, 57, 153, 109, -1, 149, 13, 93, 147, 123, 20, 93, 133, 20, 151, 62, 93, 133, 37, 6, 134, 101, 130, 20, 21, 130, 62, 42, 133, 40, 149, 93, 133, 72, 133, 57, 153, 65],
[6, 101, 123, 20, 113, 130, 84, 100, 51, 56, 135, 156, 123, 90, 149, 62, 148, 123, 20, 105, 133, 20, -1, 88, 130, 57, 42, 156, 6, 93, 129, 38, 133, 112, 123, 90, 149, 62, 148, 123, 20, 62, 57, -1, 84, 138, 152, 13, 93, 62, 133, 20, 13, 57, 113, 107, 38, 126, 123, 57, 107, 123, 57, 152, 121, 47, 57, 57, 113, 133, 88, 57, 140, 47, 146, 123, 6, 134, 149, 57, 135, 38, 10, 145, 57],
[150, 106, 107, 113, 133, 88, 61, 134, 6, 155, 69, 38, 10, 145, 57, 76, 99, 123, 84, 149, 113, 138, 88, 20, 149, 76, 101, 20, -1, 113, 107, 84, 119, 61, 133, 6, 133, 6, 150, 120, 20, 153, 11, 85, 6, 150, 101, 129, 113, 133, 88, 74, 57],
[71, 150, 62, 6, 62, 51, 149, 76, 101, 20, 42, 130, 107, 61, 123, 88, 149, 127, 88, -1, 121, 107, 20, 101, 143, 6, 21, 38, 21, 134, 149, 25, 133, 153, 41, -1, 21, 20, 24, 133, 88, 17, 133, 72, 133, 57, 51, 133, 20, 41, 107, 88, 151, 61, 42, 150, 55, 119, 57, 144, 20, 42, 130, 107],
[150, 101, 129, 149, 65, 101, 107, 153, 79, 6, 155, 21, 38, 21, 134, 149, 50, 133, 49, 133, 57, 153, 41, -1, 119, 133, 6, 10, 130, 62, 10, 133, 57, 68, 135, 38, 76, 101, 133, 38, -1, 47, 57, 57, 21, 129, 84, 123, 38, 153, 119, 87, 113, 132, 57, 101, 20],
[20, 132, 57, 21, 20, 79, 130, 20, 149, 76, 101, 20, 6, 105, 123, 84, 149, 54, 133, 51, 139, 76, 107, 6, 149, 93, 133, 153, 41, 57, 134, 84, 130, 57, 84, 133, 153, 6, 101, 47, 143, 20, 149, 76, 138, 88, 20, 57, 140],
[149, 119, 105, 133, 107, 135, 32, 32, 133, 37, 10, 38, 42, 130, 107, 149, 12, 133, 41, 107, 88, 6, 130, 57, -1, 113, 133, 88, 61, 134, 113, 123, 38, 65, 93, 129, 113, 133, 57, 149, 65, 101, 107, 153, 79, -1, 149, 65, 155, 57, 107, 20, 106, 123, 150, 120, 20, 153, 123, 61, 134, 150, 101, 129, 49, 133, 57, 14],
[149, 13, 93, 147, 123, 20, 93, 133, 20, 151, 18, 20, 13, 134, 57, 130, 62, -1, 47, 57, 57, 149, 65, 135, 38, 123, 123, 6, -1, 21, 20, 21, 134, 152, 62, 119, 61, 133, 10, 123, 20, 76, 107, 6, 149, 10, 133, 153, 109, 149, 84, 147, 123, 55, 123, 20, 81, 133, 47, 133, 84, 108, 133, 152, 13, 93, 28, 107, 88, 149, 93, 133],
[150, 45, -1, 37, -1, 65, 133, 6, 123, 130, 57, 153, 6, 101, 151, 78, 57, 10, 123, 20, 96, 119, 57, 123, 57, -1, 150, 113, 20, 149, 88, 155, 57, 149, 88, 138, 88, 62, 57, 132, 57, 93, 123, 13, 123, 88, 123, 90, 150, 106, 107],
[84, 130, 57, 93, 123, 13, 123, 88, 84, 133, 42, 132, 20, 150, 45, 8, 123, 57, 149, 113, 138, 88, 20, 6, 101, 123, 20, 21, 129, 38, 130, 20, 10, 145, 57, 149, 113, 138, 88, 123, 138, 6, -1, 150, 101, 129, 84, 130, 57, 6, 155, 97, 21, 130, 6, 27, 147, 123, 10, 123, 20, 76, 107, 6, 149, 10, 133, 41, 107, 88],
]
}
ถ้า ภาษา == 3 {
คืน [
[10, 402, 6, -1, 285, -1, 148, 491, 385, -1, 239, 382, -1, 285, 381, 197, -1, 386, 340, 427, 427, -1, 331, 333, 120],
[60, 32, 382, -1, 60, 153, 383, -1, 502, 116, 385, -1, 66, -1, 230, 53, 223, -1, 303, 381, 197, -1, 287, 468, 120, 4, -1, 276, 386, -1, 28, 79, 197, -1, 530, 201, 115, -1, 47, 381, 197],
[93, -1, 304, 383, -1, 401, 327, 174, 6, -1, 359, 179, 141, -1, 267, 405, 153, 386, -1, 369, 206, 17, -1, 427, 86, 17, 115, -1, 32, 383, -1, 427, 467, 261, 43, -1, 393, 120],
[327, 179, 350, -1, 449, 137, -1, 268, 4, -1, 378, 350, -1, 418, 386, -1, 267, 405, 6, -1, 110, 54, 17, -1, 386, -1, 67, 386, -1, 291, 65, 134, 198, -1, 65, 134, 509, 120],
[60, 184, 396, -1, 240, 386, -1, 105, 179, 502, 225, -1, 305, 327, 361, 177, 120, 4, -1, 429, 420, 362, -1, 272, 385, -1, 17, 226, 383, -1, 325, 43],
[105, 179, 385, -1, 340, 207, -1, 406, 124, 396, 153, 386, 351, 4, -1, 69, 382, -1, 47, 382, -1, 60, 127, 153, 383, -1, 65, 341, 503, 120, 6, -1, 429, 410, 503, -1, 384, 495, -1, 502, 86, 197, -1, 483, 510, 200, 203, -1, 93, 174],
[60, 206, 43, -1, 270, 78, 382, -1, 403, 203, -1, 65, 341, 503, 120, 6, -1, 399, 234, -1, 105, 179, 502, 226, 4, -1, 67, 382, -1, 435, 33, -1, 477, 254, 208, -1, 32, 386, 120],
[60, 190, 120, 226, -1, 369, 206, 17, -1, 427, 64, 70, 427, -1, 427, 103, 360, -1, 396, 402, 17, 203, -1, 153, 340, 261, 174],
[410, 196, 153, 386, -1, 505, 75, -1, 527, 21, 39, 120, 4, -1, 240, 386, -1, 270, 383, -1, 163, 327, 17, 225, 4, -1, 426, 65, 362, -1, 394, 30, 270, 385, -1, 245, 470, 17, -1, 140, 348, 120],
[267, 405, 153, 386, -1, 407, 383, -1, 503, 120, 6, -1, 67, 386, -1, 353, 207, 120, 6, -1, 502, 116, 386, -1, 110, 17, -1, 369, 206, 203, -1, 134, 364, 115, 427, -1, 240, 383, -1, 164, -1, 60, 153, 385, -1, 344, 55, 383, -1, 65, 341, 502, 174],
[502, 427, 213, -1, 376, 521, 385, -1, 404, -1, 220, -1, 392, 53, 349, 292, 4, -1, 439, 17, 370, -1, 276, 382, -1, 386, 243, -1, 65, 120, 206, 43, -1, 393, 348, 120],
[60, 32, 382, -1, 268, 302, 206, 17, -1, 371, 206, 65, 134, -1, 406, 267, 480, -1, 65, 120, 206, 43, -1, 393, 348, 120, 6, -1, 60, 206, 43, -1, 60, 32, 382, -1, 60, 153, 385, -1, 386, 204, 383, -1, 332, 43, -1, 393, 348, 120],
]
}
ถ้า ภาษา == 4 {
คืน [
[476, 215, 472, 7, 276, 49, 525, 49, 584, 50, 6, 276, 55, 43, 50, 563, 28, 41, 12, 45, 16, 38, 35],
[33, 72, 50, 299, 69, 75, 6, 167, 17, 561, 26, 59, 46, 408, 72, 71, 468, 49, 583, 12, 211, 49, 134, 55, 43, 617, 60, 554, 76, 36],
[462, 49, 326, 75, 345, 72, 7, 195, 49, 15, 254, 70, 35, 37, 17, 6, 322, 8, 49, 563, 569, 75, 527, 254, 38, 41, 12, 71],
[129, 46, 50, 602, 578, 49, 239, 625, 6, 128, 46, 50, 484, 49, 15, 379, 7, 537, 16, 17, 24, 49, 570, 17, 438, 59, 72, 71, 68, 13, 460, 38, 35, 49, 42, 29, 48],
[29, 71, 43, 401, 50, 393, 12, 45, 17, 69, 471, 37, 128, 38, 35, 6, 449, 434, 43, 597, 49, 146, 604, 75, 59, 43, 38, 41],
[393, 75, 568, 54, 268, 26, 18, 500, 35, 37, 68, 6, 411, 18, 500, 50, 15, 182, 35, 37, 75, 528, 14, 41, 12, 71, 7, 123, 39, 49, 449, 49, 605, 49, 563, 521, 356, 75, 328, 14],
[33, 27, 41, 424, 50, 423, 75, 528, 14, 41, 12, 71, 7, 393, 12, 587, 571, 14, 72, 51, 6, 570, 50, 454, 20, 426, 14, 270, 18, 71, 36, 73, 13],
[33, 72, 42, 50, 6, 462, 35, 37, 17, 24, 24, 59, 42, 568, 76, 42, 18, 35, 249, 254, 209, 75, 15, 503, 18, 20, 36, 26, 12],
[482, 600, 35, 37, 50, 172, 46, 43, 21, 73, 75, 280, 12, 35, 6, 401, 17, 424, 43, 493, 60, 197, 12, 6, 519, 400, 43, 427, 421, 49, 551, 43, 45, 38, 41],
[15, 254, 70, 35, 37, 17, 610, 75, 129, 23, 71, 7, 570, 17, 586, 20, 7, 468, 17, 537, 17, 322, 8, 75, 183, 22, 35, 16, 43, 210, 13, 366, 6, 299, 69, 49, 612, 75, 528, 14, 41, 12, 68, 13],
[36, 17, 119, 122, 110, 106, 122, 116, 49, 572, 12, 176, 194, 42, 50, 6, 174, 35, 12, 167, 17, 29, 42, 46, 300, 37, 388, 14, 41, 12, 35],
[33, 72, 50, 239, 625, 49, 605, 17, 621, 71, 182, 16, 69, 300, 38, 41, 12, 35, 7, 33, 27, 41, 33, 72, 50, 6, 299, 69, 49, 199, 75, 453, 38, 41, 12, 35],
]
}
ถ้า ภาษา == 5 {
คืน [
[617, 204, 612, 8, 286, 163, 573, 773, 769, 793, 850, 764, 165, 573, 303, 816, 773, 311, 286],
[255, 275, 54, 57, 167, 94, 38, 237, 607, 773, 529, 792, 573, 195, 180, 850, 93, 216, 773, 779, 761, 509, 664, 701],
[388, 72, 367, 573, 372, 8, 155, 662, 573, 384, 616, 482, 507, 708, 582, 367, 57, 764, 752],
[675, 16, 436, 814, 784, 844, 850, 241, 821, 436, 633, 616, 8, 445, 449, 48, 595, 596, 850, 713, 755, 456, 736, 719, 563],
[805, 163, 493, 509, 480, 190, 582, 140, 732, 850, 368, 582, 558, 559, 18, 810, 493, 638, 366, 573, 818, 101],
[379, 747, 480, 443, 573, 276, 276, 701, 663, 191, 850, 514, 516, 715, 333, 78, 57, 8, 723, 56, 11, 24, 580, 819, 55, 752, 736, 32, 729],
[664, 532, 542, 715, 333, 534, 541, 8, 689, 190, 789, 38, 819, 850, 755, 456, 736, 80, 65, 546, 540, 485, 279],
[773, 31, 850, 723, 171, 171, 367, 57, 678, 50, 407, 296, 573, 755, 833, 408, 624, 443, 170],
[23, 70, 626, 535, 578, 42, 655, 642, 850, 493, 18, 532, 45, 638, 850, 137, 77, 11, 743, 696, 498, 18, 75, 541, 32, 743],
[384, 616, 71, 241, 679, 361, 850, 769, 736, 315, 172, 8, 323, 237, 607, 796, 732, 436, 724, 297, 134, 38, 367, 57, 432, 850, 706, 715, 72, 54, 57, 573, 818, 268],
[69, 216, 699, 508, 573, 757, 613, 111, 154, 850, 773, 769, 272, 93, 431, 294, 216, 619, 84],
[255, 431, 216, 844, 228, 185, 732, 32, 126, 80, 294, 619, 84, 8, 664, 255, 850, 588, 769, 54, 57, 573, 162, 252],
]
}
คืน []
}
ฟังก์ชัน ฉากบทสี่_บทพูด(ภาษา) {
ถ้า ภาษา == 0 {
คืน [
"chaputa fo. maunten no ushiro geto, maunten-ni rido shinakatta.",
"sore karera-o, sukai no nagai nodo-ni suwaro, raito bakku wodo ran tokoro.",
"mai hando horudo. orudo chamu, wareware pasu wotchi.",
"buronzu doramu shita, pepa shiru ue. dareka kono rodo biingu-ni purei.",
"sorekara wota raizu appu shingingu, paru to rein no masuku wea.",
"songu no ritoru beara, dipu anata rimemba. wan toru noto no toru pei.",
"soshite furemu asshu rimemba. rongu shingu, rodo shoto ban.",
"sorekara rarabai kiku, wareware kyari shita hodo toku.",
"tsu supiritto isshoni koiru, wota faia to bureido, sutimu to emba no hoiru.",
"chamu bau, rodo opun. kare-no fesu rimemba, sukai fu herupu tazuneru toki.",
"demo wamuhoru no toi maus de, korudo raito sudeni weito.",
"sore doramu mae kara zutto weito. soshite sore kare-no nemu shitte ita."
]
}
ถ้า ภาษา == 2 {
คืน [
"บทที่สี่ ประตูหลังภูเขานั้นไม่ได้นำไปสู่ภูเขาเลย",
"มันกลืนพวกเขาเข้าไปในลำคออันยาวไกลของท้องฟ้า ที่ซึ่งแสงไหลย้อนกลับ",
"จับมือฉันไว้ เครื่องรางโบราณกำลังจับตาดูเราผ่านไป",
"กลองสัมฤทธิ์อยู่เบื้องล่าง ยันต์กระดาษอยู่เบื้องบน มีใครบางคนสวดอ้อนวอนให้ถนนสายนี้ถือกำเนิดขึ้น",
"แล้วสายน้ำก็ผุดขึ้นพร้อมเสียงเพลง สวมหน้ากากแห่งไข่มุกและสายฝน",
"ผู้แบกบทเพลงตัวน้อยเอ๋ย ห้วงลึกจดจำเจ้าได้ จงจ่ายค่าผ่านทางด้วยโน้ตแท้หนึ่งตัว",
"และเปลวไฟก็จดจำเถ้าถ่านได้ หากขับขานผิดพลาด ถนนจะมอดไหม้สั้นลง",
"งั้นจงฟังเพลงกล่อมเท่าที่พวกเราได้นำมันมาไกลถึงเพียงนี้",
"เหล่าวิญญาณขดตัวเข้าด้วยกัน สายน้ำสอดประสานเปลวไฟ เป็นวงล้อแห่งไอน้ำและถ่านคุ",
"เครื่องรางโค้งคำนับ ถนนเปิดออก จงจำใบหน้าของพวกเขาไว้เมื่อท้องฟ้าถามว่าใครช่วยเรา",
"แต่ ณ ปากอันไกลโพ้นของรูหนอน แสงเย็นเยียบนั้นรอคอยอยู่แล้ว",
"มันรอคอยมาตั้งแต่ก่อนเสียงกลองจะดังขึ้นเสียอีก และมันก็รู้จักชื่อของพวกเขาด้วย"
]
}
ถ้า ภาษา == 3 {
คืน [
"4장. 산 뒤편의 문은 산으로 이어지지 않았다",
"그것은 그들을 하늘의 긴 목구멍 속으로 삼켰다, 빛이 거꾸로 흐르는 곳으로",
"내 손을 잡아라. 오래된 부적들이 우리가 지나가는 것을 지켜보고 있다",
"아래엔 청동 북, 위엔 종이 부적. 누군가 이 길이 생기도록 기도했다",
"그러자 물이 노래하며 솟아올랐다, 진주와 비의 가면을 쓰고",
"노래의 어린 전달자들이여, 깊은 곳은 그대들을 기억한다. 진정한 음표 하나로 통행료를 내라",
"그리고 불꽃은 재를 기억한다. 잘못 노래하면, 길은 짧게 타버릴 것이다",
"그렇다면 우리가 지금까지 지녀온 자장가를 들어보라",
"정령들이 함께 휘감겼다, 물이 불을 땋아가며, 증기와 잉걸불의 바퀴가 되었다",
"부적들이 절을 한다. 길이 열린다. 하늘이 누가 우리를 도왔는지 물을 때 그들의 얼굴을 기억하라",
"하지만 웜홀의 저 먼 입구에서, 차가운 빛은 이미 기다리고 있었다",
"그것은 북소리가 울리기도 전부터 기다리고 있었다. 그리고 그것은 그들의 이름을 알고 있었다"
]
}
ถ้า ภาษา == 4 {
คืน [
"第四章。山の裏の門は、山へとは通じていなかった",
"それは彼らを、光が逆さまに流れる空の長い喉の中へと飲み込んだ",
"私の手を握れ。古のお守りたちが、我々の通過を見守っている",
"下には青銅の太鼓、上には紙のお札。誰かがこの道が生まれるよう祈ったのですね",
"すると水は歌いながら立ち上った、真珠と雨の仮面をまとって",
"歌を運ぶ小さき者たちよ、深き者はお前たちを覚えている。一つの真の音の通行料を払え",
"そして炎は灰を覚えている。歌い間違えれば、道は短く燃え尽きるだろう",
"それでは、私たちがここまで運んできた子守唄をお聞きください",
"精霊たちは共にとぐろを巻いた、水が炎と編み合い、蒸気と燠火の輪となって",
"お守りたちが頭を下げる。道が開く。空が誰が我々を助けたかと問う時、彼らの顔を覚えていよう",
"だがワームホールの遠い出口では、冷たい光がすでに待ち構えていた",
"それは太鼓の音が鳴る前から待っていた。そしてそれは、彼らの名を知っていた"
]
}
ถ้า ภาษา == 5 {
คืน [
"第四章。山后的那道门,通向的并非那座山",
"它将他们吞入了天空那漫长的喉咙,光在那里逆流而行",
"拉住我的手。古老的护符正注视着我们通过",
"脚下是青铜鼓,头顶是纸符。曾有人祈祷,让这条路诞生",
"随后水流歌唱着升起,戴着珍珠与雨水织成的面具",
"承载歌曲的小小行者啊,深渊记得你们。请以一个真音付过路之费",
"而火焰记得灰烬。若唱错了音,这条路便会燃烧殆尽",
"那么,请听听我们至今携带的这首摇篮曲吧",
"两位精灵相互缠绕,水与火交织,化作一轮蒸汽与余烬之轮",
"护符低头致意,道路开启。当天空问起是谁帮助了我们时,要记住他们的面容",
"但在虫洞的远端出口,那道寒光早已在等候",
"它早在鼓声响起之前便已等候。而它,知道他们的名字"
]
}
คืน [
"chapter four. the gate behind the mountain did not lead to the mountain.",
"it swallowed them into the long throat of the sky, where light runs backward.",
"hold my hand. the old charms are watching us pass.",
"bronze drums below, paper seals above. someone prayed this road into being.",
"then the water rose up singing, wearing a mask of pearl and rain.",
"little bearers of the song, the deep remembers you. pay the toll of one true note.",
"and the flame remembers the ash. sing wrong, and the road burns short.",
"then hear the lullaby as far as we have carried it.",
"the spirits coiled together, water braiding fire, a wheel of steam and embers.",
"the charms bow. the road opens. remember their faces when the sky asks who helped us.",
"but at the far mouth of the wormhole, the cold light was already waiting.",
"it had been waiting since before the drums. and it knew their names."
]
}
ฟังก์ชัน ฉากบทสี่_ผู้พูด() {
คืน [0, 0, 1, 2, 0, 3, 4, 2, 0, 1, 0, 0] # 0 บรรยาย · 1 ราชา · 2 ราชินี · 3 เจ้าน้ำ · 4 เจ้าไฟ
}
# รหัสผู้พูดสำหรับพากย์เสียง (ต้องตรงกับ tools/voiceover/manifest.py ทุกตัวอักษร)
ฟังก์ชัน ฉากบทสี่_ผู้พูดรหัส() {
คืน ["narrator", "narrator", "king", "queen", "narrator", "water_spirit", "fire_spirit", "queen", "narrator", "king", "narrator", "narrator"]
}
# ระยะเวลาเล่นต่อบรรทัด (วิ) ตามภาษาพากย์เสียงจริง (วัดจาก tools/voiceover/
# progress.json ตอนอัด) — ให้ฉากรอเสียงพากย์จบก่อนตัดบรรทัด แทนจังหวะตายตัว
# 3.55 วิ/บรรทัด เดิม ภาษาที่ยังไม่มีเสียงพากย์ (ทุกภาษายกเว้น en ตอนนี้) ใช้
# จังหวะเดิมไปก่อน — คงพฤติกรรมเดิมทุกอย่างจนกว่าจะอัดเสียงภาษานั้นเสร็จ
ฟังก์ชัน ฉากบทสี่_ระยะเวลา(lang) {
ถ้า lang == "ko" { คืน [4.74, 9.30, 7.54, 9.38, 5.22, 9.06, 7.70, 5.62, 7.70, 12.98, 6.74, 9.78] }
ถ้า lang == "ja" { คืน [5.78, 6.66, 8.90, 7.94, 7.78, 10.82, 7.78, 4.26, 6.74, 10.42, 6.58, 8.26] }
ถ้า lang == "zh" { คืน [4.66, 4.66, 4.82, 6.82, 5.78, 7.78, 4.82, 2.98, 6.74, 8.98, 4.42, 5.46] }
ถ้า lang == "daemon" { คืน [4.66, 7.46, 4.74, 6.50, 4.58, 8.18, 6.50, 4.90, 5.54, 7.54, 4.50, 6.18] }
ถ้า lang == "th" { คืน [4.42, 4.92, 4.20, 6.58, 5.00, 5.78, 4.92, 4.32, 6.02, 6.10, 4.68, 5.54] }
ถ้า lang == "en" { คืน [4.82, 5.14, 5.06, 5.22, 5.70, 8.74, 4.34, 3.86, 5.86, 8.02, 5.46, 4.10] }
คืน [3.55, 3.55, 3.55, 3.55, 3.55, 3.55, 3.55, 3.55, 3.55, 3.55, 3.55, 3.55]
}
ฟังก์ชัน ฉากบทสี่_สีวน(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)]
}
# งูวิญญาณ: หัวที่ (cx,cy,cz) เลื้อยวนรัศมี rad เฟส a — วาด 9 ปล้อง + เส้นสัน + หน้ากาก
ฟังก์ชัน ฉากบทสี่_วาดงู(cx, cy, cz, rad, a, t, r, g, b, มุก, ไฟ) {
bind px = 0.0; bind py = 0.0; bind pz = 0.0
bind k = 0
ขณะที่ k < 9 {
bind ang = a - k * 0.30
bind rr = rad + ไซน์(t*0.9 + k*0.8) * 0.9
bind sx = cx + โคไซน์(ang) * rr
bind sy = cy + ไซน์(t*1.35 + k*0.55) * 2.1
bind sz = cz + ไซน์(ang) * rr * 0.55
bind ss = 2.3 - k * 0.17
อนุภาคทรงกลม(sx, sy, sz, ss, 10, t*3.0 + k, r, g, b)
ถ้า ไฟ > 0.5 { # เปลวลอยขึ้นจากปล้องไฟ
bind plCol = วนสีอ่อน(255, 200, 90, t*1.7 + k*0.5, 0.42)
อนุภาคทรงกลม(sx, sy - 1.5 - ไซน์(t*5.0+k)*0.6, sz, 0.7, 4, t*6.0+k, list_get(plCol,0), list_get(plCol,1), list_get(plCol,2))
}
ถ้า k > 0 { # สันหลังคู่ (เส้นสว่าง + เส้นเงาเยื้อง = ลำตัวหนา)
สีดินสอ(r, g, b); วาดเส้น3มิติ(px, py, pz, sx, sy, sz)
สีดินสอ(floor(r*0.55), floor(g*0.55), floor(b*0.55))
วาดเส้น3มิติ(px, py - 0.55, pz, sx, sy - 0.55, sz)
}
ถ้า k == 0 {
# หน้ากาก (โทน MM): แผ่นหน้าแบน + ตาเข้ม จ้องกลับผู้ชม
สีดินสอ(floor(มุก), floor(มุก), floor(มุก*0.92))
วาดสามเหลี่ยม3มิติ(sx-1.55, sy-1.9, sz-0.6, sx+1.55, sy-1.9, sz-0.6, sx, sy+0.85, sz-0.6)
สีดินสอ(30, 16, 24)
วาดสามเหลี่ยม3มิติ(sx-0.75, sy-1.05, sz-0.7, sx-0.2, sy-1.05, sz-0.7, sx-0.48, sy-0.5, sz-0.7)
วาดสามเหลี่ยม3มิติ(sx+0.75, sy-1.05, sz-0.7, sx+0.2, sy-1.05, sz-0.7, sx+0.48, sy-0.5, sz-0.7)
}
bind px = sx; bind py = sy; bind pz = sz
bind k = k + 1
}
}
# พารามิเตอร์ทั้งหมดส่งจาก main (แพตเทิร์นบท 1-3)
ฟังก์ชัน เล่นฉากบทสี่(t, บทสี่เริ่ม, บทสี่สถานะ, musicOn, ปริมาณBGM, ปริมาณSFX, เพลงฉาก, ยาวเพลงฉาก, kCutMesh, qCutMesh, liq, ภาษา, แสดงบทพูด, ภาษาบทพูด, ระยะเวลาไดนามิก) {
bind บทพูด = ฉากบทสี่_บทพูด(ภาษาแสดงผล(ภาษา))
bind บทพูดกลิฟ = ฉากบทสี่_บทพูดกลิฟ(ภาษาบทพูด)
bind ผู้พูด = ฉากบทสี่_ผู้พูด()
bind ผู้พูดรหัส = ฉากบทสี่_ผู้พูดรหัส()
bind ระยะเวลา = ระยะเวลาไดนามิก
bind c4t = t - บทสี่เริ่ม
bind C4N = ความยาว(บทพูด)
# ── ตารางเวลาสะสม: c4cum[i] = เวลาเริ่มบรรทัด i (แทนสูตร i*C4SEC ตายตัวเดิม) ──
bind c4cum = [0.0]
bind cci = 0
ขณะที่ cci < C4N {
bind c4cum = list_push(c4cum, list_get(c4cum, cci) + list_get(ระยะเวลา, cci))
bind cci = cci + 1
}
bind C4TOTAL = list_get(c4cum, C4N)
bind C4END = C4TOTAL + 3.0 # หาง 3 วิ: เล่นค้าง + เฟดดำ + กล้องถอย
bind C4FADE = 0.0
ถ้า c4t > C4END - 3.2 { bind C4FADE = (c4t - (C4END - 3.2)) / 3.2 }
ถ้า C4FADE > 1.0 { bind C4FADE = 1.0 }
bind c4i = 0
bind c4scan = 1
ขณะที่ c4scan == 1 {
ถ้า c4i >= C4N - 1 { bind c4scan = 0 }
มิฉะนั้น { ถ้า c4t < list_get(c4cum, c4i + 1) { bind c4scan = 0 }
มิฉะนั้น { bind c4i = c4i + 1 } }
}
bind C4SEC = list_get(ระยะเวลา, c4i) # ระยะเวลาบรรทัดปัจจุบัน (ยังใช้เป็นค่าประมาณจังหวะทั่วไปด้านล่าง)
bind ดำ = 1.0 - C4FADE
# ── ถอดสถานะ ──
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.8 * 0.33 * (1.0 - C4FADE)) # หรี่ BGM เหลือ 1/3 ระหว่างคัตซีน — เสียงพากย์ต้องเด่นกว่า
}
# โดรนลอยกลวง (คู่ห้าเสียง) — อุโมงค์หายใจ
bind humV = 0.06 * ปริมาณSFX * ดำ
เสียงโทน(15, 0.0, 0.0, 0.0, 1.0, 65.4, humV, 0.0, 0.0)
เสียงโทน(14, 0.0, 0.0, 0.0, 1.0, 98.0, humV*0.7, 0.0, 0.0)
เบลอเฟรม(0.958) # หางแสงค้าง ~1.25 วิ (decay+max)
เติม(floor(6.0*ดำ), floor(5.0*ดำ), floor(14.0*ดำ))
bind beat = c4t * 1.5
bind bf = beat - ปัดลง(beat)
# ── ไทม์ไลน์: ขอบเขตตามเวลาสะสมจริงของแต่ละบรรทัด (c4cum) ไม่ใช่ตัวคูณ C4SEC ตายตัวอีกต่อไป ──
bind t2 = list_get(c4cum, 2); bind t4 = list_get(c4cum, 4); bind t6 = list_get(c4cum, 6)
bind t7 = list_get(c4cum, 7); bind t8 = list_get(c4cum, 8); bind t9 = list_get(c4cum, 9); bind t10 = list_get(c4cum, 10)
# แสงเย็นปากอุโมงค์ (บรรทัด 10-11 สว่างขึ้น)
bind coldOn = 0.12
ถ้า c4t > t10 { bind coldOn = 0.12 + (c4t - t10) / (C4TOTAL - t10) * 0.88 }
ถ้า coldOn > 1.0 { bind coldOn = 1.0 }
# ── ตำแหน่งคู่: ลอยกลางอุโมงค์ เคลื่อนไปข้างหน้าช้า ๆ ──
bind กายสูง = 6.4
bind kx = 0.0 - 3.0; bind ky = 0.0 - 2.0 + ไซน์(c4t*0.9)*0.7; bind kz = 0.0 - 1.0
bind qx = 3.0; bind qy = 0.0 - 2.0 + ไซน์(c4t*0.9 + 1.4)*0.7; bind qz = 0.0 - 1.0
bind kyaw = 0.0; bind qyaw = 0.0
ถ้า c4t < t2 { bind kyaw = 0.9; bind qyaw = 0.0 - 0.9 } # เกาะกลุ่มมองหน้ากัน
ถ้า c4t >= t9 { ถ้า c4t < t10 { bind kyaw = 0.0 - 0.55 } } # ราชาหันมาสั่ง "remember their faces"
# ── แสง: คีย์ม่วงเหนือ + ไฟตัวละคร + วิญญาณ + แสงเย็นปลายทาง ──
ล้างแสง()
ตั้งแสงรอบข้าง(0.24 * ดำ + 0.05)
เพิ่มแสง(0.0, 0.0-22.0, 0.0-4.0, 0.62, 0.5, 1.0, 1.1*ดำ, 95.0)
เพิ่มแสง(kx, ky - 6.0, kz, 0.35, 0.55, 1.0, 1.0*ดำ, 34.0)
เพิ่มแสง(qx, qy - 6.0, qz, 1.0, 0.45, 0.65, 1.0*ดำ, 34.0)
bind น้ำOn = 0.0; ถ้า c4t > t4 { bind น้ำOn = (c4t - t4) / 1.4 }; ถ้า น้ำOn > 1.0 { bind น้ำOn = 1.0 }
bind ไฟOn = 0.0; ถ้า c4t > t6 { bind ไฟOn = (c4t - t6) / 1.4 }; ถ้า ไฟOn > 1.0 { bind ไฟOn = 1.0 }
ถ้า น้ำOn > 0.0 { เพิ่มแสง(qx + 4.0, 0.0-6.0, 3.0, 0.35, 0.8, 1.0, 1.2*น้ำOn, 55.0) }
ถ้า ไฟOn > 0.0 { เพิ่มแสง(kx - 4.0, 0.0-6.0, 3.0, 1.0, 0.5, 0.18, 1.2*ไฟOn, 55.0) }
เพิ่มแสง(0.0, 0.0-3.0, 68.0, 0.8, 0.9, 1.0, 1.8*coldOn, 150.0) # แสงเย็นรอปลายอุโมงค์
# ── กล้อง 4 ช็อต: บินตาม → ก้มดูกลองสำริด → ออร์บิตวิญญาณ → พุ่งหาปากแสงเย็น ──
bind camX = ไซน์(c4t*0.35)*1.8; bind camY = 0.0 - 5.2 + โคไซน์(c4t*0.28)*1.1; bind camZ = 0.0 - 13.0
bind lookX = 0.0; bind lookY = 0.0 - 3.6; bind lookZ = 12.0
ถ้า c4t >= t2 { ถ้า c4t < t4 {
bind s2 = (c4t - t2) / (t4 - t2)
bind camX = 0.0 - 5.5 + s2*2.0
bind camY = 0.0 - 8.5
bind camZ = 0.0 - 9.0
bind lookX = 4.0 - s2*3.0
bind lookY = 2.5 # ก้มลงหากลองสำริดที่ลอยผ่านด้านล่าง
bind lookZ = 20.0 - s2*14.0
} }
ถ้า c4t >= t4 { ถ้า c4t < t9 {
bind s3 = (c4t - t4) / (t9 - t4)
bind ag = 2.9 - s3 * 1.7
bind camX = โคไซน์(ag) * 12.0
bind camZ = 1.0 - ไซน์(ag) * 10.0
bind camY = 0.0 - 5.8 - ไซน์(s3*3.1416)*1.2
bind lookX = 0.0; bind lookY = 0.0 - 4.2; bind lookZ = 2.0
} }
ถ้า c4t >= t9 {
bind s4 = (c4t - t9) / (C4TOTAL - t9); ถ้า s4 > 1.0 { bind s4 = 1.0 }
bind camX = ไซน์(c4t*0.2)*2.2
bind camY = 0.0 - 5.2 - s4*4.2 # ลอยสูงข้ามไหล่คู่
bind camZ = 0.0 - 11.0 + s4*4.5 # ดันเข้าเบา ๆ ไปหาแสงเย็น
bind lookX = 0.0; bind lookY = 0.0 - 3.0; bind lookZ = 70.0
}
ถ้า c4t > C4TOTAL { # หางเฟด: กล้องลอยขึ้น-ถอยช้า
bind หลังฉาก = c4t - C4TOTAL
bind camY = camY - หลังฉาก*0.6; bind camZ = camZ - หลังฉาก*1.4
}
ตั้งกล้องมอง(camX, camY, camZ, lookX, lookY, lookZ)
ตั้งระยะห่าง(1.85)
# ── อุโมงค์รูหนอน: วงแหวนสีวนไหลเข้าหากล้อง + เส้นดาวยืด ──
โหมดผสม(1)
bind ริง = 0
ขณะที่ ริง < 12 {
bind rz0 = ริง * 9.0 - c4t * 8.0
bind rz = rz0 - ปัดลง(rz0 / 108.0) * 108.0
ถ้า rz < 0.0 { bind rz = rz + 108.0 }
bind rz = rz - 10.0
bind rr2 = 15.0 + ไซน์(c4t*0.7 + ริง)*1.2
bind rCol = ฉากบทสี่_สีวน(ริง*0.7 + c4t*0.8)
# ปลายอุโมงค์ขาวซีดตามแสงเย็น (desaturate ไกล ๆ)
bind wMix = coldOn * (rz / 98.0); ถ้า wMix > 0.9 { bind wMix = 0.9 }
bind rcr = floor(list_get(rCol,0)*(1.0-wMix) + 225.0*wMix)
bind rcg = floor(list_get(rCol,1)*(1.0-wMix) + 235.0*wMix)
bind rcb = floor(list_get(rCol,2)*(1.0-wMix) + 255.0*wMix)
สีดินสอ(rcr, rcg, rcb)
bind sg4 = 0
ขณะที่ sg4 < 20 {
bind a0 = sg4*0.3142 + c4t*0.4 + ริง*0.3; bind a1 = (sg4+1)*0.3142 + c4t*0.4 + ริง*0.3
วาดเส้น3มิติ(โคไซน์(a0)*rr2, 0.0-4.0+ไซน์(a0)*rr2*0.8, rz, โคไซน์(a1)*rr2, 0.0-4.0+ไซน์(a1)*rr2*0.8, rz)
bind sg4 = sg4 + 1
}
bind ริง = ริง + 1
}
# เส้นดาวยืด (บินเร็ว)
bind st4 = 0
ขณะที่ st4 < 9 {
bind sa4 = st4 * 0.698 + 0.4
bind srr = 9.5 + (st4 - ปัดลง(st4/3.0)*3.0) * 2.4
bind sx4 = โคไซน์(sa4) * srr; bind sy4 = 0.0-4.0 + ไซน์(sa4) * srr * 0.75
bind szz = 80.0 - ((c4t*26.0 + st4*13.0) - ปัดลง((c4t*26.0 + st4*13.0)/95.0)*95.0)
สีดินสอ(150, 170, 220)
วาดเส้น3มิติ(sx4, sy4, szz, sx4, sy4, szz + 3.4)
bind st4 = st4 + 1
}
# แสงเย็นรอที่ปากอุโมงค์ (บรรทัด 10-11 โตขึ้น — "already waiting")
ถ้า coldOn > 0.14 {
bind cdCol = วนสีอ่อน(235, 244, 255, c4t*1.2, 0.18) # แสงเย็น: เฉดขยับน้อย ๆ เท่านั้น
อนุภาคทรงกลม(0.0, 0.0-3.0, 66.0, 2.0 + coldOn*6.5, 14, c4t*0.6, list_get(cdCol,0), list_get(cdCol,1), list_get(cdCol,2))
อนุภาคทรงกลม(0.0, 0.0-3.0, 65.0, 0.8 + coldOn*2.2, 8, c4t*1.1, 255, 255, 255)
}
flush_3d(); โหมดผสม(0)
# ดวงตาแสงเย็น: จานหมึกแบน (UNLIT — ไม่เฟดตามฉาก: โลกมืดลงแต่แสงยังรอ)
ถ้า coldOn > 0.2 {
set_flat_shade(1.0)
สีดินสอ(226, 238, 250)
sphere(0.0, 0.0-3.0, 66.0, coldOn*4.2, coldOn*4.2, coldOn*4.2, 0.0, 0.0, 0.0, 0, 14, 10)
flush_3d()
set_flat_shade(0.0)
}
# ── กลองสำริดด่งเซิน: ลอยผ่านล่าง-ซ้าย (บรรทัด 2-4) — วงแหวนซ้อน + ดาวกลาง ──
ถ้า c4t > t2 - 1.0 { ถ้า c4t < t4 + 3.0 {
bind dprog = (c4t - (t2 - 1.0)) / (t4 + 4.0 - t2)
bind dz = 46.0 - dprog * 52.0
bind dx = 0.0 - 8.0; bind dy = 5.5
โหมดผสม(1)
bind วง4 = 0
ขณะที่ วง4 < 4 {
bind dr = 7.2 - วง4 * 1.55
สีดินสอ(198, 148, 74)
bind dsg = 0
ขณะที่ dsg < 16 {
bind b0 = dsg*0.3927 + c4t*0.15; bind b1 = (dsg+1)*0.3927 + c4t*0.15
วาดเส้น3มิติ(dx+โคไซน์(b0)*dr, dy, dz+ไซน์(b0)*dr, dx+โคไซน์(b1)*dr, dy, dz+ไซน์(b1)*dr)
bind dsg = dsg + 1
}
bind วง4 = วง4 + 1
}
bind ดาว = 0 # ดาว 8 แฉกกลางหน้ากลอง
ขณะที่ ดาว < 8 {
bind da4 = ดาว * 0.7854 + c4t*0.15
สีดินสอ(235, 190, 105)
วาดเส้น3มิติ(dx, dy, dz, dx+โคไซน์(da4)*2.8, dy, dz+ไซน์(da4)*2.8)
bind ดาว = ดาว + 1
}
flush_3d(); โหมดผสม(0)
# ฆ้องกลองสำริดต้นห้อง (ทุก 4 บีต) ขณะลอยผ่าน
ถ้า bf < 0.03 { ถ้า (ปัดลง(beat) - ปัดลง(ปัดลง(beat)/4.0)*4.0) == 0 {
เล่นฆ้อง(dx, dy, dz, 73.4, 0.30*ปริมาณSFX)
} }
} }
# ── ยันต์กระดาษรอบผนัง: แถบซีด + อักขระแดงเรือง · โค้งคำนับบรรทัด 9 ──
bind บว = 0.0
ถ้า c4t > t9 { bind บว = (c4t - t9) / 1.2 }; ถ้า บว > 1.0 { bind บว = 1.0 }
bind ยัน = 0
ขณะที่ ยัน < 6 {
bind ya = ยัน * 1.047 + c4t * 0.06
bind yx = โคไซน์(ya) * 11.5
bind yy = 0.0 - 4.0 + ไซน์(ya) * 8.6 - บว * 1.4 # คำนับ = ทรุดเข้าหาแกน
bind yz = 6.0 + ไซน์(c4t*0.8 + ยัน) * 1.1
set_flat_shade(1.0)
สีดินสอ(floor(232*ดำ), floor(222*ดำ), floor(178*ดำ))
วาดสามเหลี่ยม3มิติ(yx-0.9, yy-2.4, yz, yx+0.9, yy-2.4, yz, yx+0.9, yy+2.4, yz)
วาดสามเหลี่ยม3มิติ(yx-0.9, yy-2.4, yz, yx+0.9, yy+2.4, yz, yx-0.9, yy+2.4, yz)
set_flat_shade(0.0)
โหมดผสม(1)
สีดินสอ(215, 60, 40)
วาดกลิฟ3มิติ((ยัน * 4 + 2) - ปัดลง((ยัน * 4 + 2)/26.0)*26.0, yx, yy - 0.4, yz - 0.35, 0.0, 1.5)
flush_3d(); โหมดผสม(0)
bind ยัน = ยัน + 1
}
flush_3d()
# ── วิญญาณน้ำ (บรรทัด 4+) วนรอบราชินี · วิญญาณไฟ (บรรทัด 6+) วนรอบราชา ──
# บรรทัด 8+: ทั้งคู่ถักเกลียวหยินหยางกลางอุโมงค์
bind ผสาน = 0.0
ถ้า c4t > t8 { bind ผสาน = (c4t - t8) / 1.8 }; ถ้า ผสาน > 1.0 { bind ผสาน = 1.0 }
โหมดผสม(1)
ถ้า น้ำOn > 0.0 {
bind wcx = qx*(1.0-ผสาน); bind wcy = (0.0-5.0)*(1.0-ผสาน) + (0.0-7.0)*ผสาน; bind wcz = 2.0*(1.0-ผสาน) + 6.0*ผสาน
bind wrad = 6.2*(1.0-ผสาน) + 4.2*ผสาน
ฉากบทสี่_วาดงู(wcx, wcy, wcz, wrad, c4t*1.15, c4t, 90, 200, 255, 235.0, 0.0)
}
ถ้า ไฟOn > 0.0 {
bind fcx = kx*(1.0-ผสาน); bind fcy = (0.0-5.0)*(1.0-ผสาน) + (0.0-7.0)*ผสาน; bind fcz = 2.0*(1.0-ผสาน) + 6.0*ผสาน
bind frad = 6.2*(1.0-ผสาน) + 4.2*ผสาน
ฉากบทสี่_วาดงู(fcx, fcy, fcz, frad, c4t*1.15 + 3.1416, c4t, 255, 120, 40, 70.0, 1.0)
}
ถ้า ผสาน > 0.3 { # ไอน้ำจากล้อหยินหยาง
bind psCol = วนสีอ่อน(225, 235, 245, c4t*1.4, 0.30)
อนุภาคทรงกลม(0.0, 0.0-7.0, 6.0, 3.2*ผสาน, 12, c4t*2.5, list_get(psCol,0), list_get(psCol,1), list_get(psCol,2))
}
flush_3d(); โหมดผสม(0)
# หยดน้ำ/ถ่านแตกตามบีตช่วงวิญญาณคุย (บรรทัด 4-7)
ถ้า c4t > t4 { ถ้า c4t < t8 { ถ้า bf < 0.025 {
ถ้า (ปัดลง(beat) - ปัดลง(ปัดลง(beat)/2.0)*2.0) == 0 {
เสียงเอฟเฟกต์(qx, 0.0-6.0, 3.0, 1.0, 620.0 + ไซน์(beat)*180.0, 0.10*ปริมาณSFX*น้ำOn, 0.09, "sine")
}
มิฉะนั้น {
เสียงเอฟเฟกต์(kx, 0.0-6.0, 3.0, 1.0, 110.0 + ไซน์(beat*3.0)*30.0, 0.09*ปริมาณSFX*ไฟOn, 0.05, "saw")
}
} } }
# ── ราชา/ราชินี: ท่าลอย (ขดเล็กน้อย) + ริกเนทีฟ + ลูกของเหลว ──
bind หายใจ0 = ไซน์(c4t*1.35)*0.05
bind kArm = ไซน์(c4t*1.2)*0.09; bind kSway = หายใจ0; bind kLean = 0.08; bind kLeg = 0.0; bind kTuck = 0.26
bind qArm = ไซน์(c4t*1.25+1.1)*0.09; bind qSway = 0.0-หายใจ0; bind qLean = 0.08; bind qLeg = 0.0; bind qTuck = 0.26
ถ้า c4i == 2 { bind kArm = 0.30 + ไซน์(c4t*2.4)*0.10 } # "hold my hand" ยื่นมือ
ถ้า c4i == 7 { bind qArm = 0.52 + ไซน์(c4t*1.3)*0.06 } # ราชินีร้องค่าผ่านทาง: มือชูค้าง
ถ้า c4i == 9 { bind kArm = 0.34 + ไซน์(c4t*2.2)*0.12 } # ราชาชี้หน้ายันต์
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_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()
reset_material()
โหมดผสม(1)
liquid_step(liq, 0.016)
liquid_splat(liq, 28.0 + ไซน์(c4t*1.7)*13.0, 28.0 + โคไซน์(c4t*1.2)*13.0, 1.0, 0.18, 3.4)
liquid_splat(liq, 28.0 + โคไซน์(c4t*1.1)*11.0, 28.0 + ไซน์(c4t*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)
# ── ค่าผ่านทางหนึ่งโน้ตแท้ (บรรทัด 7): ราชินีร้องโน้ต Seraph 8 ตัว ทีละ 0.35 วิ ──
ถ้า c4t >= t7 { ถ้า c4i == 7 {
bind srF4 = ความถี่โน้ต_Seraph()
bind เป้า4 = ปัดลง((c4t - t7) / 0.35)
ถ้า เป้า4 > 8.0 { bind เป้า4 = 8.0 }
ถ้า ทอลล์แล้ว < เป้า4 {
bind tf4 = list_get(srF4, ทอลล์แล้ว)
เล่นไชม์ใหญ่(qx, qy - 6.0, qz, tf4, 0.34 * ปริมาณSFX)
เล่นฮังแพน(qx, qy - 6.0, qz, tf4 * 0.5, 0.16 * ปริมาณSFX)
bind ทอลล์แล้ว = ทอลล์แล้ว + 1.0
}
} }
# ── เหตุการณ์ครั้งเดียวต่อบรรทัด ──
ถ้า c4i > บรรทัดก่อน {
ถ้า c4i < C4N {
bind whoN = list_get(ผู้พูด, c4i)
เล่นเสียงพากย์("chapter4", c4i, list_get(ผู้พูดรหัส, c4i), ภาษา, ปริมาณSFX)
ถ้า whoN < 0.5 { เล่นไชม์ใหญ่(0.0, 0.0, 0.0, 196.0, 0.24 * ปริมาณSFX) }
ถ้า whoN > 0.5 { ถ้า whoN < 1.5 { เล่นกาเมลัน(0.0, 0.0, 0.0, 220.0, 0.32 * ปริมาณSFX) } }
ถ้า whoN > 1.5 { ถ้า whoN < 2.5 { เล่นแฟนแฟร์(0.0, 0.0, 0.0, 174.6, 0.24 * ปริมาณSFX) } }
ถ้า whoN > 2.5 { ถ้า whoN < 3.5 { # เจ้าน้ำ: กลิสซานโดเย็น
เสียงเอฟเฟกต์(qx+4.0, 0.0-6.0, 3.0, 1.0, 880.0, 0.24*ปริมาณSFX, 0.9, "sine")
เสียงเอฟเฟกต์(qx+4.0, 0.0-6.0, 3.0, 1.0, 440.0, 0.16*ปริมาณSFX, 1.4, "triangle")
} }
ถ้า whoN > 3.5 { # เจ้าไฟ: คำรามถ่าน
เสียงเอฟเฟกต์(kx-4.0, 0.0-6.0, 3.0, 1.0, 82.0, 0.30*ปริมาณSFX, 1.1, "saw")
เสียงเอฟเฟกต์(kx-4.0, 0.0-6.0, 3.0, 1.0, 164.0, 0.14*ปริมาณSFX, 0.5, "square")
}
ถ้า c4i == 8 { # ผสานหยินหยาง: ฉิ่งสูง + ฆ้อง
เล่นไชม์ใหญ่(0.0, 0.0-7.0, 6.0, 523.25, 0.30 * ปริมาณSFX)
เล่นฆ้อง(0.0, 0.0-7.0, 6.0, 98.0, 0.34 * ปริมาณSFX)
}
ถ้า c4i == 10 { # แสงเย็นปรากฏ: ลมเยือกบาง
เสียงเอฟเฟกต์(0.0, 0.0-3.0, 68.0, 1.0, 1760.0, 0.16*ปริมาณSFX, 2.4, "sine")
}
}
bind บรรทัดก่อน = c4i
}
# ── ตัวหนังสือ (เพิ่มสีผู้พูดวิญญาณ: น้ำ=ฟ้าน้ำแข็ง · ไฟ=ส้มถ่าน) ──
ตั้งกล้องมอง(0.0, 0.0, -22.0, 0.0, 0.0, 0.0)
ตั้งระยะห่าง(2.8)
สีดินสอ(floor(170*ดำ+20), floor(215*ดำ+18), floor(235*ดำ+20))
วาดสตริง("chapter 4 : the long throat of the sky", 0.0, 10.0, 0.0, 0.66, 1)
ถ้า c4i < C4N {
bind line4 = list_get(บทพูด, c4i)
bind line4กลิฟ = list_get(บทพูดกลิฟ, c4i)
bind who4 = list_get(ผู้พูด, c4i)
bind lt = c4t - list_get(c4cum, c4i)
bind laf = 1.0
ถ้า lt < 0.6 { bind laf = lt / 0.6 }
ถ้า lt > C4SEC - 0.7 { bind laf = (C4SEC - 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)
ถ้า who4 > 0.5 { ถ้า who4 < 1.5 { bind lr = floor(255.0*laf); bind lg = floor(218.0*laf); bind lb = floor(128.0*laf) } }
ถ้า who4 > 1.5 { ถ้า who4 < 2.5 { bind lr = floor(212.0*laf); bind lg = floor(222.0*laf); bind lb = floor(255.0*laf) } }
ถ้า who4 > 2.5 { ถ้า who4 < 3.5 { bind lr = floor(140.0*laf); bind lg = floor(230.0*laf); bind lb = floor(255.0*laf) } }
ถ้า who4 > 3.5 { bind lr = floor(255.0*laf); bind lg = floor(150.0*laf); bind lb = floor(70.0*laf) }
ถ้า แสดงบทพูด == 1 {
วาดสตริงบทพูดบากขอบ(line4กลิฟ, ภาษาบทพูด, 0.0, 8.3, 0.0, 0.62)
สีดินสอ(lr, lg, lb)
วาดสตริงบทพูดบาก(line4กลิฟ, ภาษาบทพูด, 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 outC4 = 0.0
ถ้า c4t >= C4END { bind outC4 = 1.0 }
# กันข้ามโดยไม่ตั้งใจ: ไม่รับปุ่มข้าม (คีย์บอร์ด+จอย) ช่วง 5 วิแรกของฉาก
ถ้า c4t > 5.0 {
ถ้า กดปุ่ม("enter") { bind outC4 = 1.0 }
ถ้า กดปุ่ม("space") { bind outC4 = 1.0 }
ถ้า กดปุ่ม("escape") { bind outC4 = 1.0 }
ถ้า จอยปุ่ม("a") { bind outC4 = 1.0 }
ถ้า จอยปุ่ม("start") { bind outC4 = 1.0 }
}
ถ้า outC4 > 0.5 {
เบลอเฟรม(0.0)
เสียงโทน(15, 0.0, 0.0, 0.0, 1.0, 65.4, 0.0, 0.0, 0.0)
เสียงโทน(14, 0.0, 0.0, 0.0, 1.0, 98.0, 0.0, 0.0, 0.0)
}
คืน [บรรทัดก่อน*1000.0 + ทอลล์แล้ว, outC4]
}