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/chapter2.ling
# Chapter 2 cutscene module — "the terrible eye"
# Returns [updatedPrevLine, shouldExit] · same parameter pattern as chapter 1
#
# กำกับภาพแนว Majora's Mask: ดวงจันทร์มีหน้าย้อยต่ำน่ากลัว · มุมกล้องต่ำกดตัวละครให้เล็ก ·
# ช็อตเงยเผยดวงจันทร์ · วงนาฬิกาหมุน (เวลาใกล้หมด) · "three dawns remain"
# ฉาก: วังเก่า (palace.lmesh มาพร้อมรุ้ง+เมฆ) + เนินเงา + ต้นอ้อ + หิ่งห้อย + ประตูขาเข้า
# เสียง: โดรนต่ำสองชั้น (สั่นจังหวะหลอน) · นาฬิกาติ๊กหลังไขลาน · ระฆังทุ้ม "three dawns" ·
# โคมวังจุดวูบ · จันทร์โน้ม = รัมเบิลต่ำ — เพลงประกอบ: MoonTime
# ท่ามือ: ผู้พูดสลับท่า ชูมือปฏิญาณ/โบก/แบมือ/กุมมือ ตามบรรทัด · ราชาชี้ทางทะเลตอนสั่งเควสต์
ฟังก์ชัน ฉากบทสอง_บทพูดไฮไลท์(ภาษา) {
ถ้า ภาษา == 0 {
คืน [
[-1, -1, 0, 0, 0],
[18, 28, 225, 55, 60],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[31, 39, 70, 130, 240],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
]
}
ถ้า ภาษา == 1 {
คืน [
[-1, -1, 0, 0, 0],
[17, 27, 225, 55, 60],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[27, 34, 70, 130, 240],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
]
}
ถ้า ภาษา == 2 {
คืน [
[-1, -1, 0, 0, 0],
[17, 19, 225, 55, 60],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[21, 32, 70, 130, 240],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
]
}
ถ้า ภาษา == 3 {
คืน [
[-1, -1, 0, 0, 0],
[12, 15, 225, 55, 60],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[13, 19, 70, 130, 240],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
]
}
ถ้า ภาษา == 4 {
คืน [
[-1, -1, 0, 0, 0],
[10, 15, 225, 55, 60],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[15, 18, 70, 130, 240],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
]
}
ถ้า ภาษา == 5 {
คืน [
[-1, -1, 0, 0, 0],
[6, 9, 225, 55, 60],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[7, 11, 70, 130, 240],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
[-1, -1, 0, 0, 0],
]
}
คืน [[-1,-1,0,0,0], [-1,-1,0,0,0], [-1,-1,0,0,0], [-1,-1,0,0,0], [-1,-1,0,0,0], [-1,-1,0,0,0], [-1,-1,0,0,0], [-1,-1,0,0,0], [-1,-1,0,0,0], [-1,-1,0,0,0], [-1,-1,0,0,0], [-1,-1,0,0,0]]
}
ฟังก์ชัน ฉากบทสอง_บทพูดกลิฟ(ภาษา) {
ถ้า ภาษา == 0 {
คืน [
[10, 15, 8, 22, 26, 25, 8, -1, 25, 24, 26, 5, -1, 19, 12, 11, 21, -1, 20, 21, -1, 26, 12, 3, -1, 24, 26, 18, 8, 16, -1, 28, 8, 20, -1, 25, 12, 23, 16, 9, 26, 23, 26, -1, 8, 16, -1, 21, 22, 26, 20, 5],
[24, 21, 23, 12, -1, 24, 26, 25, 8, -1, 17, 8, -1, 20, 8, 16, 3, -1, 23, 16, 25, 21, 23, 26, -1, 28, 8, 20, 5, -1, 24, 21, 23, 12, 3, -1, 24, 26, 18, 8, 16, -1, 14, 26, 23, 16, 13, 26, -1, 20, 21, -1, 13, 12, 24, 26, -1, 14, 26, 23, 21, 5],
[24, 21, 23, 12, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 14, 12, 25, 21, -1, 18, 26, 23, 21, 24, 26, -1, 28, 21, 25, 10, 15, 16, 5, -1, 24, 21, 23, 12, -1, 24, 21, 20, 14, 26, -1, 20, 21, -1, 25, 8, 19, 12, -1, 30, 26, 25, 25, 21, -1, 28, 12, 16, 25, 21, 5],
[24, 21, 23, 12, 3, -1, 12, 9, 26, 23, 16, -1, 20, 8, 16, 25, 21, -1, 23, 8, 23, 8, 9, 8, 16, -1, 8, 20, 24, 8, 20, 14, 26, -1, 20, 21, -1, 19, 8, 19, 8, 3, -1, 23, 16, 25, 21, 23, 26, -1, 18, 26, 23, 21, 30, 8, -1, 13, 21, 23, 26, 5],
[21, 23, 26, 11, 21, -1, 22, 8, 23, 8, 24, 26, 3, -1, 23, 8, 20, 25, 8, 20, -1, 23, 8, 16, 25, 21, 3, -1, 9, 21, 23, 21, -1, 11, 21, 20, -1, 11, 12, -1, 11, 8, 18, 26, -1, 9, 26, 23, 12, 24, 26, 5],
[28, 8, 23, 12, 28, 8, 23, 12, -1, 14, 12, 25, 21, -1, 15, 21, 23, 26, 11, 21, 3, -1, 24, 21, 24, 15, 16, 25, 12, -1, 14, 26, 23, 12, 16, 25, 21, -1, 18, 26, 23, 21, 18, 18, 26, -1, 28, 8, 20, -1, 19, 21, 8, -1, 25, 8, 20, -1, 28, 8, 16, 20, 11, 21, 5],
[24, 21, 24, 15, 16, 25, 12, -1, 19, 21, 24, 16, -1, 18, 26, 23, 21, 18, 18, 26, -1, 23, 8, 20, 4, 8, 26, 25, 21, 3, -1, 19, 8, 16, -1, 23, 8, 9, 26, 3, -1, 24, 21, 20, 21, -1, 25, 21, 18, 16, -1, 20, 8, 20, 16, -1, 14, 8, -1, 24, 26, 18, 8, 16, -1, 15, 21, 23, 26, 11, 21, 5],
[24, 21, 23, 12, 18, 8, 23, 8, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 17, 16, 9, 26, 20, 4, 11, 12, -1, 15, 21, 23, 26, 11, 21, 3, -1, 28, 8, 23, 26, 11, 21, -1, 29, 8, 20, 14, 26, -1, 20, 21, -1, 25, 21, 18, 16, -1, 20, 21, -1, 29, 21, 4, 20, 16, 5],
[24, 26, 23, 16, -1, 11, 21, 20, -1, 23, 16, 19, 12, 16, 20, 5, -1, 24, 21, 20, 21, -1, 8, 25, 21, 3, -1, 24, 26, 23, 16, 22, 26, -1, 24, 8, 12, -1, 24, 26, 18, 8, 16, -1, 24, 12, 9, 26, -1, 11, 12, 18, 16, 20, 8, 16, 5],
[11, 16, 22, 26, -1, 14, 8, 18, 18, 16, -1, 24, 16, 18, 26, 3, -1, 25, 8, 16, 11, 21, -1, 15, 21, 20, 3, -1, 11, 21, 23, 8, 26, 20, 11, 21, -1, 9, 12, 23, 26, -1, 20, 21, -1, 24, 15, 16, 25, 8, 5],
[23, 21, -1, 25, 8, 16, 11, 21, -1, 11, 12, -1, 9, 12, 23, 26, -1, 23, 16, 24, 26, 20, 5, -1, 11, 21, 23, 8, 26, 20, 11, 21, 3, -1, 23, 21, 24, 26, 25, 21, -1, 20, 21, -1, 25, 8, 19, 12, -1, 19, 8, 11, 8, -1, 23, 16, 20, 14, 26, 5],
[24, 21, 24, 15, 16, 25, 12, -1, 19, 26, 20, 3, -1, 23, 16, 24, 26, 20, -1, 24, 26, 23, 26, -1, 25, 8, 19, 12, -1, 18, 26, 23, 21, 30, 8, -1, 23, 16, 20, 3, -1, 14, 26, 23, 16, 20, 3, -1, 12, 20, 11, 21, -1, 20, 21, -1, 29, 21, 4, 20, 16, -1, 22, 12, 24, 15, 12, 20, 25, 21, 5],
]
}
ถ้า ภาษา == 1 {
คืน [
[15, 20, 13, 28, 32, 17, 30, -1, 32, 35, 27, 6, -1, 13, 14, 27, 34, 17, -1, 32, 20, 17, -1, 25, 17, 13, 16, 27, 35, 4, -1, 32, 20, 17, -1, 31, 23, 37, -1, 27, 28, 17, 26, 17, 16, -1, 27, 26, 17, -1, 32, 17, 30, 30, 21, 14, 24, 17, -1, 17, 37, 17, 6],
[32, 20, 13, 32, -1, 21, 31, -1, 26, 27, -1, 31, 32, 13, 30, 4, -1, 24, 21, 32, 32, 24, 17, -1, 27, 26, 17, 6, -1, 32, 20, 17, -1, 31, 23, 37, -1, 19, 30, 21, 17, 18, -1, 20, 13, 31, -1, 19, 30, 27, 35, 26, -1, 13, -1, 18, 13, 15, 17, 6],
[21, 32, -1, 35, 13, 32, 15, 20, 17, 16, -1, 33, 31, -1, 15, 30, 27, 31, 31, -1, 32, 20, 17, -1, 19, 13, 32, 17, 6, -1, 21, 32, -1, 20, 13, 31, -1, 14, 17, 17, 26, -1, 35, 13, 21, 32, 21, 26, 19, -1, 18, 27, 30, -1, 32, 20, 17, -1, 31, 27, 26, 19, 6],
[21, 32, -1, 18, 13, 24, 24, 31, -1, 13, -1, 24, 21, 32, 32, 24, 17, -1, 15, 24, 27, 31, 17, 30, -1, 17, 34, 17, 30, 37, -1, 26, 21, 19, 20, 32, -1, 32, 20, 17, -1, 24, 33, 24, 24, 13, 14, 37, -1, 31, 32, 13, 37, 31, -1, 33, 26, 31, 33, 26, 19, 6],
[32, 20, 17, -1, 27, 24, 16, -1, 28, 13, 24, 13, 15, 17, -1, 24, 21, 32, -1, 21, 32, 31, -1, 24, 13, 26, 32, 17, 30, 26, 31, 4, -1, 14, 30, 13, 15, 21, 26, 19, -1, 32, 20, 17, -1, 16, 13, 30, 23, -1, 35, 21, 32, 20, -1, 14, 27, 30, 30, 27, 35, 17, 16, -1, 16, 13, 35, 26, 6],
[35, 17, -1, 35, 21, 24, 24, -1, 20, 27, 24, 16, -1, 32, 20, 17, -1, 19, 13, 32, 17, -1, 13, 26, 16, -1, 35, 21, 26, 16, -1, 32, 20, 17, -1, 19, 30, 17, 13, 32, -1, 15, 24, 27, 15, 23, -1, 27, 26, 17, -1, 25, 27, 30, 17, -1, 32, 33, 30, 26, 6],
[13, 26, 16, -1, 21, 18, -1, 32, 20, 17, -1, 15, 24, 27, 15, 23, -1, 30, 33, 26, 31, -1, 27, 33, 32, 4, -1, 25, 37, -1, 24, 27, 34, 17, 4, -1, 35, 20, 13, 32, -1, 32, 20, 17, 26, -1, 35, 21, 24, 24, -1, 20, 27, 24, 16, -1, 32, 20, 17, -1, 31, 23, 37, 6],
[32, 20, 17, 26, -1, 35, 17, -1, 35, 21, 24, 24, -1, 20, 27, 24, 16, -1, 21, 32, -1, 27, 33, 30, 31, 17, 24, 34, 17, 31, 4, -1, 13, 31, -1, 35, 17, -1, 16, 21, 16, -1, 35, 20, 17, 26, -1, 32, 20, 17, -1, 35, 27, 30, 24, 16, -1, 35, 13, 31, -1, 37, 27, 33, 26, 19, 6],
[32, 20, 30, 17, 17, -1, 16, 13, 35, 26, 31, -1, 30, 17, 25, 13, 21, 26, 6, -1, 13, 18, 32, 17, 30, -1, 32, 20, 13, 32, 4, -1, 26, 27, 32, -1, 17, 34, 17, 26, -1, 31, 24, 17, 17, 28, -1, 35, 21, 24, 24, -1, 31, 13, 34, 17, -1, 32, 20, 17, -1, 31, 23, 37, 6],
[31, 17, 17, 23, -1, 32, 20, 17, -1, 16, 17, 17, 28, -1, 21, 26, 31, 32, 30, 33, 25, 17, 26, 32, 4, -1, 32, 20, 17, -1, 32, 21, 16, 17, -1, 20, 27, 30, 26, 4, -1, 33, 26, 16, 17, 30, -1, 32, 20, 17, -1, 16, 30, 27, 35, 26, 17, 16, -1, 14, 17, 24, 24, 6],
[24, 21, 31, 32, 17, 26, -1, 18, 27, 30, -1, 32, 20, 17, -1, 14, 17, 24, 24, -1, 13, 32, -1, 24, 27, 35, -1, 32, 21, 16, 17, 6, -1, 32, 20, 17, -1, 16, 30, 27, 35, 26, 17, 16, -1, 31, 32, 21, 24, 24, -1, 30, 21, 26, 19, -1, 21, 32, -1, 18, 27, 30, -1, 32, 20, 17, -1, 24, 27, 31, 32, 6],
[13, 26, 16, -1, 32, 20, 17, -1, 25, 27, 27, 26, -1, 24, 17, 13, 26, 17, 16, -1, 15, 24, 27, 31, 17, 30, -1, 32, 27, -1, 24, 21, 31, 32, 17, 26, 4, -1, 19, 30, 21, 26, 26, 21, 26, 19, 4, -1, 28, 13, 32, 21, 17, 26, 32, -1, 13, 31, -1, 32, 20, 17, -1, 17, 26, 16, 6],
]
}
ถ้า ภาษา == 2 {
คืน [
[62, 51, 51, 139, 113, 123, 20, -1, 149, 119, 57, 146, 123, 53, 20, 119, 34, 133, -1, 55, 123, 20, 81, 133, 153, 41, 149, 65, 135, 38, 38, 107, 20, 42, 133, 123, 130, 57, 60, 133, 113, 129, 76, 93, 143, 20, 6, 101, 130, 107, 38, 107, 20, 119, 57, 144, 20],
[57, 131, 57, 153, 86, 152, 28, 38, 107, 20, 38, 133, 107, 119, 93, 123, 6, 104, 6, -1, 84, 130, 57, 13, 146, 123, 13, 107, 133, 84, 149, 110, 99, 133, 10, 123, 20, 55, 123, 20, 81, 133, 51, 139, 20, 123, 6, 152, 62, 119, 61, 133, 10, 145, 57, 84, 133],
[84, 130, 57, 21, 130, 62, 42, 133, 40, 149, 93, 133, 12, 133, 84, 65, 93, 129, 44, 84, 133, -1, 84, 130, 57, 93, 123, 13, 123, 88, 62, 51, 149, 76, 101, 20, 57, 140, 84, 133, 57, 133, 57, 150, 106, 107],
[84, 130, 57, 98, 107, 20, 101, 20, 152, 6, 106, 10, 145, 57, 52, 6, 13, 146, 57, 51, 139, 149, 76, 101, 20, 6, 105, 123, 84, 88, 130, 20, 153, 86, 48, 6, 10, 130, 62, 10, 133, 57],
[65, 93, 133, 113, 133, 51, 149, 8, 133, 22, 38, 42, 129, 149, 6, 138, 88, 20, 10, 145, 57, -1, 46, 133, 57, 13, 107, 133, 84, 84, 146, 38, 41, 107, 88, 95, 20, 123, 94, 37, 51, 139, 88, 146, 84, 84, 133],
[149, 93, 133, 21, 129, 65, 6, 66, 123, 20, 65, 93, 129, 44, 150, 101, 129, 153, 10, 57, 133, 122, 135, 6, 133, 152, 119, 33, 153, 65, 123, 138, 6, 93, 123, 62, 119, 57, 144, 20],
[150, 101, 129, 50, 133, 57, 133, 122, 135, 6, 133, 119, 89, 38, 149, 38, 135, 57, 101, 20, -1, 51, 139, 93, 130, 6, 10, 123, 20, 26, 130, 57, -1, 150, 106, 107, 123, 129, 153, 93, 21, 129, 76, 89, 20, 55, 123, 20, 81, 133, 153, 109, 153, 41],
[150, 106, 107, 149, 93, 133, 21, 129, 76, 89, 20, 84, 130, 57, 153, 109, 41, 107, 88, 42, 130, 107, 149, 93, 133, 149, 123, 20, -1, 149, 119, 84, 146, 123, 57, 51, 139, 149, 93, 133, 149, 13, 88, 51, 134, 42, 123, 57, 151, 101, 6, 88, 130, 20, 149, 88, 133, 107, 156, 107, 130, 88],
[149, 119, 101, 146, 123, 123, 138, 6, 113, 133, 84, 95, 20, 123, 94, 37, -1, 119, 101, 130, 20, 21, 133, 6, 57, 132, 57, 150, 87, 150, 45, 6, 133, 93, 119, 101, 130, 62, 152, 119, 101, 6, 155, 28, 107, 88, 55, 123, 20, 81, 133, 153, 109, 153, 86, 153, 41],
[21, 20, 42, 133, 84, 119, 133, 149, 13, 93, 147, 123, 20, 38, 57, 42, 93, 138, 150, 120, 20, 121, 107, 20, 101, 143, 6, -1, 150, 42, 93, 150, 120, 20, 6, 93, 129, 150, 113, 61, 134, -1, 152, 46, 93, 129, 19, 130, 20, 51, 139, 21, 84, 61, 134],
[79, 130, 20, 149, 113, 138, 88, 20, 93, 129, 19, 130, 20, 88, 133, 84, 61, 134, 101, 38, -1, 71, 21, 84, 61, 134, 88, 130, 20, 13, 20, 42, 138, 84, 130, 57, 149, 76, 147, 123, 71, 115, 32, 119, 133, 88],
[150, 101, 129, 38, 107, 20, 21, 130, 57, 51, 93, 156, 6, 155, 149, 123, 57, 149, 12, 133, 84, 133, 79, 130, 20, -1, 88, 137, 84, 6, 93, 136, 84, -1, 123, 38, 51, 57, 93, 123, 93, 133, 107, 6, 130, 62, 22, 38, 21, 62],
]
}
ถ้า ภาษา == 3 {
คืน [
[8, 402, 6, -1, 453, 375, -1, 378, 197, 4, -1, 502, 116, 386, -1, 83, 437, 503, -1, 111, -1, 502, 86, 203, -1, 168, 120],
[404, 29, -1, 260, 386, -1, 327, 118, 175, 120, 4, -1, 77, 211, 336, 6, -1, 502, 116, 385, -1, 315, 499, 386, -1, 344, 55, 383, -1, 24, 33, -1, 141, -1, 32, 386, 120],
[60, 32, 382, -1, 369, 206, 17, -1, 239, 383, -1, 29, 98, 115, -1, 32, 383, -1, 427, 467, 261, 333, 120, 6, -1, 60, 32, 382, -1, 60, -1, 105, 179, 203, -1, 65, 120, 192, 364, 120],
[396, 402, 17, 17, -1, 270, 206, 427, -1, 331, 115, -1, 251, 211, 120, -1, 60, 32, 382, -1, 414, 64, 326, -1, 128, -1, 17, 70, 386, -1, 167, 340, 429, 120],
[358, -1, 57, 406, 382, -1, 156, 270, 383, -1, 250, 514, 4, -1, 274, 192, 360, -1, 289, 258, 381, 197, -1, 340, 146, 349, -1, 217, 296, 120],
[369, 206, 115, -1, 239, 383, -1, 427, 474, 43, -1, 472, -1, 317, 42, 203, -1, 503, -1, 245, 470, -1, 128, -1, 21, 383, -1, 32, 386, 120],
[60, 206, 43, -1, 317, 42, 17, -1, 222, 455, 226, 4, -1, 93, -1, 283, 178, 386, 351, 4, -1, 60, 164, 115, -1, 236, 347, 386, -1, 502, 116, 383, -1, 271, 153, 34, 115, 17],
[60, 190, 120, 226, -1, 369, 206, 17, -1, 428, 409, -1, 271, 153, 34, 120, 4, -1, 298, 288, 386, -1, 408, 348, 383, -1, 164, -1, 60, 182, 130, -1, 32, 446, 187],
[298, -1, 255, 385, -1, 289, 258, 386, -1, 89, 333, 120, 6, -1, 60, -1, 526, 349, 115, -1, 400, 414, 439, 134, -1, 502, 116, 383, -1, 53, 502, 427, -1, 234, 504, -1, 32, 386, 120],
[69, 382, -1, 328, 65, 203, -1, 444, 327, 174, 4, -1, 240, 349, -1, 400, 66, -1, 418, -1, 327, 179, 349, -1, 393, 115, -1, 414, 307, 385, -1, 280, 500, 206, 203],
[324, 240, -1, 164, -1, 418, 302, 206, 203, -1, 153, 340, 174, 6, -1, 240, 349, -1, 277, 429, -1, 386, 153, 382, -1, 351, 406, 537, -1, 67, -1, 390, 382, -1, 396, 153, 383, -1, 378, 508, -1, 60, 32, 383, -1, 371, 207, 120],
[60, 206, 43, -1, 124, 382, -1, 128, -1, 17, 70, 386, -1, 65, 371, 340, -1, 58, 203, -1, 65, 371, 355, 120, 4, -1, 326, -1, 373, 381, 225, 4, -1, 418, 215, 446, 187, -1, 442, 383, 297, -1, 393, 33],
]
}
ถ้า ภาษา == 4 {
คืน [
[476, 138, 472, 7, 516, 191, 49, 128, 42, 6, 468, 50, 123, 39, 49, 314, 73, 27, 12, 448, 75, 586, 12, 35],
[11, 72, 50, 364, 42, 50, 45, 12, 68, 6, 268, 26, 18, 500, 68, 7, 468, 49, 317, 27, 60, 17, 612, 75, 337, 38, 35, 49, 36],
[33, 72, 50, 462, 35, 37, 17, 584, 75, 541, 14, 71, 49, 75, 527, 41, 12, 59, 27, 35, 7, 30, 38, 43, 11, 49, 393, 75, 300, 38, 41, 12, 35, 49, 42, 29],
[249, 254, 209, 17, 393, 74, 72, 45, 12, 59, 59, 235, 75, 575, 48, 71, 35, 53, 6, 33, 72, 50, 269, 27, 30, 39, 556, 40, 12, 41, 18, 59, 29],
[195, 12, 261, 399, 50, 422, 481, 75, 422, 27, 6, 156, 70, 430, 49, 235, 363, 22, 42, 588, 46, 471, 37, 201, 16, 38, 35],
[322, 8, 50, 584, 75, 254, 70, 6, 237, 366, 532, 75, 63, 13, 123, 288, 280, 24, 13],
[63, 27, 366, 532, 17, 394, 59, 38, 41, 27, 59, 38, 35, 69, 6, 11, 45, 35, 6, 33, 49, 366, 151, 17, 468, 75, 347, 14, 71, 49, 42, 27, 67, 13],
[45, 69, 51, 322, 8, 508, 547, 49, 326, 42, 347, 14, 68, 13, 6, 132, 441, 17, 59, 36, 514, 16, 38, 35, 608, 49, 68, 13, 46],
[397, 26, 72, 35, 235, 363, 22, 50, 11, 43, 127, 39, 7, 33, 49, 302, 50, 6, 450, 70, 26, 14, 63, 468, 75, 350, 14, 59, 31, 76],
[411, 18, 386, 213, 75, 341, 31, 6, 418, 49, 529, 474, 75, 6, 402, 76, 36, 582, 49, 129, 46],
[290, 18, 418, 49, 582, 49, 605, 46, 501, 75, 419, 59, 31, 41, 7, 416, 72, 35, 500, 35, 37, 50, 143, 63, 6, 558, 14, 71, 500, 49, 35, 62, 46, 33, 72, 75, 621, 69, 27, 41, 12, 59, 29],
[33, 27, 41, 373, 50, 26, 69, 46, 547, 75, 265, 31, 41, 501, 75, 162, 22, 35, 6, 46, 65, 70, 43, 473, 12, 45, 17, 69, 6, 486, 74, 70, 49, 68, 13, 46, 553, 332, 294, 20],
]
}
ถ้า ภาษา == 5 {
คืน [
[617, 40, 612, 8, 216, 691, 145, 15, 424, 850, 237, 607, 583, 315, 38, 11, 157, 158, 344, 573, 581, 584],
[773, 17, 436, 434, 434, 850, 276, 267, 64, 8, 773, 436, 237, 607, 573, 357, 67, 792, 111, 38, 11, 318, 676],
[255, 579, 582, 367, 57, 608, 752, 773, 769, 793, 8, 255, 11, 577, 216, 619, 330, 582, 773, 833, 480],
[408, 624, 443, 489, 11, 234, 452, 703, 168, 190, 850, 255, 80, 147, 817, 753, 11, 537],
[155, 662, 573, 265, 487, 537, 46, 38, 533, 618, 850, 564, 85, 457, 573, 442, 93, 385, 334, 842, 441],
[367, 57, 275, 257, 72, 755, 769, 793, 850, 380, 773, 311, 236, 783, 104, 233, 15, 11, 214, 150, 456],
[248, 461, 432, 783, 88, 38, 850, 367, 573, 547, 48, 850, 773, 432, 147, 436, 49, 31, 409, 72, 237, 607, 176],
[773, 367, 57, 278, 47, 677, 409, 72, 255, 850, 278, 90, 20, 567, 754, 302, 746, 573, 432, 84, 773, 467],
[754, 128, 14, 24, 841, 433, 8, 483, 163, 850, 143, 80, 436, 499, 585, 36, 428, 504, 393, 415, 237, 607, 38],
[146, 274, 378, 773, 514, 511, 573, 34, 202, 850, 530, 496, 32, 710, 850, 278, 216, 773, 499, 500, 573, 783, 16],
[216, 759, 530, 432, 86, 171, 773, 783, 228, 8, 524, 493, 663, 51, 27, 758, 763, 32, 48, 420, 185, 582, 255],
[448, 46, 444, 817, 753, 38, 44, 850, 86, 739, 667, 171, 850, 181, 200, 614, 582, 850, 248, 453, 430, 682, 665, 336],
]
}
คืน []
}
ฟังก์ชัน ฉากบทสอง_บทพูด(ภาษา) {
ถ้า ภาษา == 0 {
คืน [
"chaputa tsu. medo no ue, sukai wan teriburu ai opun.",
"sore suta ja nai, ritoru wan. sore, sukai gurifu no fesu guro.",
"sore wareware geto kurosu wotchi. sore songu no tame zutto weito.",
"sore, eburi naito rarabai ansangu no mama, ritoru kuroza foru.",
"orudo parasu, rantan raito, boro don de daku buresu.",
"wareware geto horudo, soshite gureito kurokku wan moa tan waindo.",
"soshite mosi kurokku ran-auto, mai rabu, sono toki nani ga sukai horudo.",
"sorekara wareware jibun-de horudo, warudo yangu no toki no yo-ni.",
"suri don rimein. sono ato, suripu sae sukai sebu dekinai.",
"dipu gakki siku, taido hon, doraundo beru no shita.",
"ro taido de beru risun. doraundo, rosuto no tame mada ringu.",
"soshite mun, risun suru tame kuroza rin, gurin, endo no yo-ni peshento."
]
}
ถ้า ภาษา == 2 {
คืน [
"บทที่สอง เหนือทุ่งหญ้า ท้องฟ้าได้เปิดดวงตาอันน่าสะพรึงกลัวดวงหนึ่ง",
"นั่นไม่ใช่ดวงดาวหรอกลูก มันคือความเศร้าของท้องฟ้าที่งอกใบหน้าขึ้นมา",
"มันจับตาดูเราข้ามประตูมา มันรอคอยบทเพลงนี้มานานแล้ว",
"มันร่วงลงใกล้ขึ้นทุกคืนที่เพลงกล่อมยังไม่ถูกขับขาน",
"ปราสาทเก่าจุดตะเกียงขึ้น ต้านความมืดด้วยรุ่งอรุณที่ยืมมา",
"เราจะปกป้องประตูและไขนาฬิกาใหญ่ไปอีกรอบหนึ่ง",
"และถ้านาฬิกาหยุดเดินลง ที่รักของฉัน แล้วอะไรจะพยุงท้องฟ้าไว้ได้",
"แล้วเราจะพยุงมันไว้ด้วยตัวเราเอง เหมือนที่เราเคยทำตอนโลกยังเยาว์วัย",
"เหลืออีกสามรุ่งอรุณ หลังจากนั้นแม้แต่การหลับใหลก็ช่วยท้องฟ้าไว้ไม่ได้",
"จงตามหาเครื่องดนตรีแห่งห้วงลึก แตรแห่งกระแสน้ำ ใต้ระฆังที่จมน้ำ",
"ฟังเสียงระฆังยามน้ำลด ผู้จมน้ำยังคงตีมันเพื่อผู้สูญหาย",
"และดวงจันทร์ก็เอนเข้ามาฟัง ยิ้มกริ่ม อดทนรอราวกับจุดจบ"
]
}
ถ้า ภาษา == 3 {
คืน [
"2장. 초원 위로, 하늘이 끔찍한 눈 하나를 떴다",
"저건 별이 아니란다, 꼬마야. 하늘의 슬픔이 얼굴을 갖게 된 것이다",
"그것은 우리가 문을 건너는 것을 지켜보았다. 그것은 그 노래를 기다려왔다",
"자장가가 불리지 않는 밤마다 그것은 조금씩 더 가까이 떨어진다",
"옛 궁전은 등불을 밝혀, 빌려온 새벽으로 어둠에 맞섰다",
"우리는 문을 지키고 큰 시계를 한 바퀴 더 감을 것이다",
"그리고 시계가 멈추면, 내 사랑이여, 그때는 무엇이 하늘을 붙들겠는가",
"그렇다면 우리가 직접 붙들겠다, 세상이 젊었을 때 그랬던 것처럼",
"세 번의 새벽이 남았다. 그 후에는 잠조차도 하늘을 구하지 못할 것이다",
"깊은 악기를 찾아라, 물에 잠긴 종 아래에 있는 조수의 뿔피리를",
"썰물 때 종소리를 들어라. 물에 빠진 이들은 여전히 길 잃은 자들을 위해 그것을 울린다",
"그리고 달은 더 가까이 기울어 귀를 기울였다, 씩 웃으며, 종말처럼 참을성 있게"
]
}
ถ้า ภาษา == 4 {
คืน [
"第二章。草原の上で、空は一つの恐ろしい目を開いた",
"あれは星ではないよ、小さき者よ。空の悲しみが顔を持ったのだ",
"それは私たちが門を越えるのを見ていました。ずっとあの歌を待っていたのです",
"子守唄が歌われないまま夜を重ねるたび、それは少しずつ近づいてきます",
"古い宮殿は灯籠を灯し、借り物の夜明けで闇に立ち向かった",
"我々は門を守り、大時計をもう一度巻こう",
"もし時計が止まってしまったら、あなた、その時何が空を支えるのでしょう",
"ならば我々自身の手で支えよう、世界がまだ若かった頃のように",
"残された夜明けはあと三つ。その後は、眠りさえも空を救えません",
"深き楽器を探せ、潮の角笛を、沈んだ鐘の下に",
"引き潮の鐘の音に耳を澄ませて。溺れた者たちは今も、迷える者のためにそれを鳴らしています",
"そして月はさらに身を寄せて耳を傾けた、にやりと笑いながら、終わりのように辛抱強く"
]
}
ถ้า ภาษา == 5 {
คืน [
"第二章。在草原上方,天空睁开了一只可怕的眼睛",
"那不是星星,小家伙。那是天空的悲伤长出了一张脸",
"它看着我们穿过那道门。它一直在等待着那首歌",
"摇篮曲每一夜未被吟唱,它便又靠近一点",
"古老的宫殿点亮了灯笼,用借来的曙光抵御黑暗",
"我们将守住这道门,把那座大钟再多上一圈发条",
"如果时钟停了,我的爱人,那时又是什么撑住天空呢",
"那我们就亲自撑住它,就像世界还年轻的时候那样",
"还剩三个黎明。此后,即便是沉睡也无法拯救天空了",
"去寻找那深海的乐器,潮汐之角,就在那沉没的钟下",
"在退潮时倾听那钟声。溺水者仍为迷途之人敲响着它",
"月亮更靠近了些,倾身聆听,咧嘴笑着,如末日般耐心"
]
}
คืน [
"chapter two. above the meadow, the sky opened one terrible eye.",
"that is no star, little one. the sky grief has grown a face.",
"it watched us cross the gate. it has been waiting for the song.",
"it falls a little closer every night the lullaby stays unsung.",
"the old palace lit its lanterns, bracing the dark with borrowed dawn.",
"we will hold the gate and wind the great clock one more turn.",
"and if the clock runs out, my love, what then will hold the sky.",
"then we will hold it ourselves, as we did when the world was young.",
"three dawns remain. after that, not even sleep will save the sky.",
"seek the deep instrument, the tide horn, under the drowned bell.",
"listen for the bell at low tide. the drowned still ring it for the lost.",
"and the moon leaned closer to listen, grinning, patient as the end."
]
}
ฟังก์ชัน ฉากบทสอง_โน้ต() {
คืน [246.94, 220.00, 261.63, 246.94, 196.00, 293.66, 233.08, 220.00, 233.08, 174.61, 164.81, 155.56]
}
ฟังก์ชัน ฉากบทสอง_ผู้พูด() {
คืน [0, 1, 2, 2, 0, 1, 2, 1, 2, 1, 2, 0] # 0 narrator, 1 king, 2 queen
}
# รหัสผู้พูดสำหรับพากย์เสียง (ต้องตรงกับ tools/voiceover/manifest.py ทุกตัวอักษร)
ฟังก์ชัน ฉากบทสอง_ผู้พูดรหัส() {
คืน ["narrator", "king", "queen", "queen", "narrator", "king", "queen", "king", "queen", "king", "queen", "narrator"]
}
# ระยะเวลาเล่นต่อบรรทัด (วิ) ตามภาษาพากย์เสียงจริง (วัดจาก tools/voiceover/
# progress.json ตอนอัด) — ให้ฉากรอเสียงพากย์จบก่อนตัดบรรทัด แทนจังหวะตายตัว
# 3.55 วิ/บรรทัด เดิม ภาษาที่ยังไม่มีเสียงพากย์ (ทุกภาษายกเว้น en ตอนนี้) ใช้
# จังหวะเดิมไปก่อน — คงพฤติกรรมเดิมทุกอย่างจนกว่าจะอัดเสียงภาษานั้นเสร็จ
ฟังก์ชัน ฉากบทสอง_ระยะเวลา(lang) {
ถ้า lang == "ko" { คืน [5.54, 8.18, 8.42, 5.30, 5.06, 6.74, 6.18, 6.82, 6.74, 6.02, 8.10, 8.82] }
ถ้า lang == "ja" { คืน [7.30, 5.94, 7.22, 6.10, 6.34, 6.26, 6.66, 6.58, 6.02, 5.86, 9.22, 7.14] }
ถ้า lang == "zh" { คืน [5.78, 5.94, 4.50, 4.10, 6.42, 4.42, 4.82, 5.38, 5.62, 7.22, 6.66, 6.50] }
ถ้า lang == "daemon" { คืน [4.18, 5.78, 4.98, 5.78, 4.66, 5.94, 5.78, 5.46, 6.34, 4.26, 6.66, 6.82] }
ถ้า lang == "th" { คืน [4.88, 5.14, 4.54, 4.20, 4.36, 3.96, 5.12, 4.72, 4.94, 5.00, 4.80, 4.16] }
ถ้า lang == "en" { คืน [5.38, 5.38, 3.94, 4.42, 4.98, 4.66, 4.26, 4.26, 5.14, 4.26, 5.62, 4.42] }
คืน [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)]
}
# พารามิเตอร์ทั้งหมดส่งจาก main (ฟังก์ชันมองไม่เห็น local ของ do-block)
ฟังก์ชัน เล่นฉากบทสอง(t, บทสองเริ่ม, บทสองบรรทัดก่อน, musicOn, ปริมาณBGM, ปริมาณSFX, เพลงฉาก, ยาวเพลงฉาก, kCutMesh, qCutMesh, palaceMesh, palaceDecoMesh, liq, ภาษา, แสดงบทพูด, ภาษาบทพูด, ระยะเวลาไดนามิก) {
bind บทพูด = ฉากบทสอง_บทพูด(ภาษาแสดงผล(ภาษา))
bind บทพูดกลิฟ = ฉากบทสอง_บทพูดกลิฟ(ภาษาบทพูด)
bind ไฮไลท์c2i = ฉากบทสอง_บทพูดไฮไลท์(ภาษาบทพูด)
bind โน้ต = ฉากบทสอง_โน้ต()
bind ผู้พูด = ฉากบทสอง_ผู้พูด()
bind ผู้พูดรหัส = ฉากบทสอง_ผู้พูดรหัส()
bind ระยะเวลา = ระยะเวลาไดนามิก
bind c2t = t - บทสองเริ่ม
bind C2N = ความยาว(บทพูด)
# ── ตารางเวลาสะสม: c2cum[i] = เวลาเริ่มบรรทัด i (แทนสูตร i*C2SEC ตายตัวเดิม) ──
bind c2cum = [0.0]
bind ccj = 0
ขณะที่ ccj < C2N {
bind c2cum = list_push(c2cum, list_get(c2cum, ccj) + list_get(ระยะเวลา, ccj))
bind ccj = ccj + 1
}
bind C2TOTAL = list_get(c2cum, C2N)
bind C2END = C2TOTAL + 3.0 # หาง 3 วิ: เล่นค้าง + เฟดดำ + กล้องถอย
bind C2FADE = 0.0
ถ้า c2t > C2END - 3.2 { bind C2FADE = (c2t - (C2END - 3.2)) / 3.2 }
ถ้า C2FADE > 1.0 { bind C2FADE = 1.0 }
bind c2i = 0
bind c2scan = 1
ขณะที่ c2scan == 1 {
ถ้า c2i >= C2N - 1 { bind c2scan = 0 }
มิฉะนั้น { ถ้า c2t < list_get(c2cum, c2i + 1) { bind c2scan = 0 }
มิฉะนั้น { bind c2i = c2i + 1 } }
}
bind C2SEC = list_get(ระยะเวลา, c2i) # ระยะเวลาบรรทัดปัจจุบัน (ยังใช้เป็นค่าประมาณจังหวะทั่วไปด้านล่าง)
ถ้า musicOn == 1 {
ถ้า ยาวเพลงฉาก > 1.0 {
ถ้า ตำแหน่งเพลง() >= ยาวเพลงฉาก - 0.5 { ค้นหาเพลง(0); เล่นเพลง(เพลงฉาก) }
}
ระดับเพลง(ปริมาณBGM * 0.33 * (1.0 - C2FADE)) # หรี่ BGM เหลือ 1/3 ระหว่างคัตซีน — เสียงพากย์ต้องเด่นกว่า
}
# ── โดรนหลอนสองชั้น (สั่นบีตช้า ๆ) — ตั้งซ้ำทุกเฟรมได้ (idempotent) ──
bind droneV = 0.085 * ปริมาณSFX * (1.0 - C2FADE)
เสียงโทน(15, 0.0, 0.0, 0.0, 1.0, 55.0, droneV, 0.0, 0.0)
เสียงโทน(14, 0.0, 0.0, 0.0, 1.0, 55.7, droneV*0.8, 0.0, 0.0)
# ค่ำมืดอมม่วง-เขียว (ทไวไลต์เทอร์มินา)
bind cR = floor(10.0 + ไซน์(c2t*0.23)*6.0)
bind cG = floor(12.0 + ไซน์(c2t*0.19 + 1.1)*7.0)
bind cB = floor(22.0 + ไซน์(c2t*0.16 + 2.4)*10.0)
เบลอเฟรม(0.958) # หางแสงค้าง ~1.25 วิ (decay+max)
เติม(cR, cG, cB)
# ── จังหวะเรื่อง (12 บรรทัด): โคมวัง=บรรทัด 4 · ไขลาน=5 · จันทร์โน้ม=บรรทัด 11 ──
bind tA = list_get(c2cum, 3); bind tB = list_get(c2cum, 6); bind tC = list_get(c2cum, 9); bind tD = list_get(c2cum, 11)
# ── ดวงจันทร์: ย้อยลงช้า ๆ ทั้งฉาก · ท้ายเรื่องโน้มเข้าใกล้ ("leaned closer") ──
bind mprog = c2t / C2TOTAL; ถ้า mprog > 1.0 { bind mprog = 1.0 }
bind mr = 12.0
bind mx = 8.0; bind my = 0.0 - 36.0 + mprog * 6.0; bind mz = 44.0
bind leanP = 0.0
ถ้า c2t > tD { bind leanP = (c2t - tD) / (C2SEC * 1.2) }
ถ้า leanP > 1.0 { bind leanP = 1.0 }
bind leanS = leanP * leanP * (3.0 - 2.0*leanP)
bind mr = mr + leanS * 3.0
bind my = my + leanS * 3.0
bind mz = mz - leanS * 7.0
bind mx = mx - leanS * 4.0
# ── ตำแหน่ง/บล็อกกิ้ง: ราชินีเดินออกมาเฝ้าดู (บรรทัด 3) · ราชาตามมาเคียง (บรรทัด 6-7) ──
bind กายสูง = 6.4
bind kx = 0.0 - 3.2; bind kz = 0.0 - 2.0; bind ky = 0.0
bind qx = 3.2; bind qz = 0.0 - 2.0; bind qy = 0.0
bind kyaw = 1.5708; bind qyaw = 0.0 - 1.5708
bind kเดิน = 0.0; bind qเดิน = 0.0
ถ้า c2t >= tA { ถ้า c2t < tA + 2.6 {
bind wq = (c2t - tA) / 2.6
bind wqs = wq * wq * (3.0 - 2.0*wq)
bind qz = 0.0 - 2.0 + 2.7 * wqs
bind qx = 3.2 - 1.0 * wqs
bind qyaw = (0.0 - 1.5708) * (1.0 - wqs)
bind qเดิน = wqs * (1.0 - wqs) * 4.0; ถ้า qเดิน > 1.0 { bind qเดิน = 1.0 }
} }
ถ้า c2t >= tA + 2.6 { bind qx = 2.2; bind qz = 0.7; bind qyaw = 0.0 }
ถ้า c2t >= tB {
bind wk = (c2t - tB) / 2.6; ถ้า wk > 1.0 { bind wk = 1.0 }
bind wks = wk * wk * (3.0 - 2.0*wk)
bind kx = 0.0 - 3.2 + 1.0 * wks
bind kz = 0.0 - 2.0 + 2.7 * wks
bind kyaw = 1.5708 * (1.0 - wks)
bind kเดิน = wks * (1.0 - wks) * 4.0; ถ้า kเดิน > 1.0 { bind kเดิน = 1.0 }
ถ้า wk > 0.98 { bind kเดิน = 0.0 }
}
ถ้า c2t >= tC { ถ้า c2t < tC + C2SEC {
bind kyaw = 0.0 - 0.5 # "seek the tide horn": หันครึ่งตัวชี้ไปไกล
} }
# ── แสง (สไตล์บทหนึ่ง): คีย์จันทร์เย็นเขียว + ฟิลอุ่นขอบฟ้า + ไฟตัวละคร + โคมวัง ──
ล้างแสง()
ตั้งแสงรอบข้าง(0.28)
เพิ่มแสง(mx, my - 6.0, mz - 10.0, 0.72, 0.85, 0.62, 1.3 + leanS*0.5, 150.0) # แสงจันทร์เขียวซีด
เพิ่มแสง(0.0-18.0, 0.0-4.0, 0.0-20.0, 1.0, 0.62, 0.30, 0.8, 90.0) # ฟิลอุ่นหลังกล้อง
เพิ่มแสง(kx, ky - 7.0, kz, 0.35, 0.55, 1.0, 1.1, 40.0) # ราชา: น้ำเงิน
เพิ่มแสง(qx, qy - 7.0, qz, 1.0, 0.45, 0.65, 1.1, 40.0) # ราชินี: กุหลาบ
bind lanOn = 0.0
ถ้า c2t > list_get(c2cum, 4) { bind lanOn = (c2t - list_get(c2cum, 4)) / 1.6 }
ถ้า lanOn > 1.0 { bind lanOn = 1.0 }
ถ้า lanOn > 0.0 { # โคมวังอุ่นสองดวง (บรรทัด 4)
เพิ่มแสง(0.0-6.0, 0.0-9.0, 48.0, 1.0, 0.72, 0.35, 1.1*lanOn, 55.0)
เพิ่มแสง(6.0, 0.0-9.0, 48.0, 1.0, 0.72, 0.35, 1.1*lanOn, 55.0)
}
# ── กล้อง 4 ช็อต (ภาษา MM · ช็อตละ ~3 บรรทัด แพนช้ากว่าเดิม) ──
bind camX = 0.0; bind camY = 0.0 - 6.5; bind camZ = 0.0 - 14.0
bind lookX = 0.0; bind lookY = 0.0 - 4.5; bind lookZ = 0.0
ถ้า c2t < tA {
# ช็อต A: มุมต่ำติดพื้นหญ้า มองเงย — คนตัวเล็ก จันทร์ยักษ์ค้ำหัว (dread เปิดเรื่อง)
bind s1 = c2t / tA; bind e1 = s1 * s1 * (3.0 - 2.0*s1)
bind camX = 0.0 - 10.0 + 6.0 * e1
bind camY = 0.0 - 1.4
bind camZ = 0.0 - 17.0 + 3.0 * e1
bind lookX = 2.0
bind lookY = 0.0 - 9.5
bind lookZ = 12.0
}
ถ้า c2t >= tA { ถ้า c2t < tB {
# ช็อต B: เกาะหลังราชินี แล้วเงยจากแอ่งแสงพื้น → เผยหน้าดวงจันทร์ (reveal tilt)
bind s2 = (c2t - tA) / (tB - tA); bind e2 = s2 * s2 * (3.0 - 2.0*s2)
bind camX = qx + 3.6
bind camY = 0.0 - 4.6 - e2 * 1.6
bind camZ = qz - 6.8
bind lookX = qx * (1.0 - e2) + mx * 0.8 * e2
bind lookY = (0.0 - 1.0) * (1.0 - e2) + (my + 2.0) * e2
bind lookZ = 2.0 * (1.0 - e2) + mz * e2
} }
ถ้า c2t >= tB { ถ้า c2t < tC {
# ช็อต C: ออร์บิตแคบรอบคู่ (จันทร์ค้างฉากหลัง) — วงนาฬิกาเร่งหมุน
bind s3 = (c2t - tB) / (tC - tB)
bind ag = 2.6 - s3 * 1.35
bind camX = 0.0 - 0.5 + โคไซน์(ag) * 10.0
bind camZ = 0.0 - 0.4 - ไซน์(ag) * 8.4
bind camY = 0.0 - 5.6 - ไซน์(s3*3.1416)*0.8
bind lookX = 0.0 - 0.5; bind lookY = 0.0 - 4.4; bind lookZ = 0.6
} }
ถ้า c2t >= tC {
# ช็อต D: ดอลลี่ข้างผ่านต้นอ้อ → พุ่งเข้าหน้าจันทร์ที่ย้อยลง (จบแบบจ้องตา)
bind s4 = (c2t - tC) / (C2TOTAL - tC); ถ้า s4 > 1.0 { bind s4 = 1.0 }
bind e4 = s4 * s4 * (3.0 - 2.0*s4)
bind camX = 12.5 - e4 * 9.0
bind camY = 0.0 - 4.8 - e4 * 4.4
bind camZ = 0.0 - 8.5 + e4 * 9.0
bind lookX = mx; bind lookY = my + 1.0; bind lookZ = mz - 3.0
}
ถ้า c2t > C2TOTAL { # หางเฟด: กล้องลอยขึ้น-ถอยช้า
bind หลังฉาก = c2t - C2TOTAL
bind camY = camY - หลังฉาก*0.6; bind camZ = camZ - หลังฉาก*1.4
}
ตั้งกล้องมอง(camX, camY, camZ, lookX, lookY, lookZ)
ตั้งระยะห่าง(1.85)
# ── ฉากหลัง: เนินเงาไกล + วังเก่า + ดวงจันทร์หน้าย้อย + วงนาฬิกา ──
โหมดผสม(0)
set_flat_shade(1.0)
bind hh = 0
ขณะที่ hh < 5 {
bind ha = 0.6283 + hh * 1.1
bind hx = โคไซน์(ha) * 62.0; bind hz = 20.0 + ไซน์(ha) * 40.0
ถ้า hz > 8.0 {
สีดินสอ(9, 12, 20)
วาดสามเหลี่ยม3มิติ(hx - 26.0, 0.2, hz, hx + 26.0, 0.2, hz, hx, 0.0 - 11.0 - hh*1.7, hz)
}
bind hh = hh + 1
}
flush_3d()
set_flat_shade(0.0)
# วังเก่าแยกสองส่วน: รุ้ง+เมฆ (ไกลสุด) · วิหารใหญ่ (กลางฉาก สว่างโคม) — ใต้เงาจันทร์
mesh_draw(palaceDecoMesh, 0.0, 0.2, 58.0, 18.0, 3.1416, 0.0, 0.0, 0.0, 0.0, 0.0)
mesh_draw(palaceMesh, 0.0, 0.2, 48.0, 26.0, 3.1416, ไซน์(c2t*0.4)*0.01, 0.0, 0.0, 0.0, 0.0)
flush_3d()
# ส่องวิหาร: ลำอัปไลต์อุ่นสี่มุม + เฮโลทองหลังหลังคา (เมชเป็น unlit — ให้แสงด้วยองค์บวก)
ลำแสงไฟ(0.0-8.0, 0.0, 45.0, 0.0-14.0, 5.0, 255, 196, 120, 0.34 + 0.30*lanOn)
ลำแสงไฟ(8.0, 0.0, 45.0, 0.0-14.0, 5.0, 255, 196, 120, 0.34 + 0.30*lanOn)
ลำแสงไฟ(0.0-3.5, 0.0, 43.0, 0.0-18.0, 3.6, 255, 210, 140, 0.28 + 0.25*lanOn)
ลำแสงไฟ(3.5, 0.0, 43.0, 0.0-18.0, 3.6, 255, 210, 140, 0.28 + 0.25*lanOn)
โหมดผสม(1)
bind ดวงCol = วนสีอ่อน(235, 180, 95, c2t*0.9, 0.30)
อนุภาคทรงกลม(0.0, 0.0-15.0, 50.0, 7.5, 16, c2t*0.5, list_get(ดวงCol,0), list_get(ดวงCol,1), list_get(ดวงCol,2))
flush_3d(); โหมดผสม(0)
แอ่งแสง(0.0, 0.2, 44.0, 16.0, 255, 200, 120, 0.4 + 0.3*lanOn)
# พื้นทุ่งกลางคืน: จานเช็คเกอร์เขียวมืด
bind fs = 0
ขณะที่ fs < 16 {
bind fa0 = fs * 0.3927; bind fa1 = (fs + 1) * 0.3927
ถ้า fs - ปัดลง(fs/2.0)*2.0 == 0 { สีดินสอ(14, 26, 20) } มิฉะนั้น { สีดินสอ(10, 19, 15) }
วาดสามเหลี่ยม3มิติ(0.0, 0.2, 2.0, โคไซน์(fa0)*38.0, 0.2, 2.0+ไซน์(fa0)*38.0, โคไซน์(fa1)*38.0, 0.2, 2.0+ไซน์(fa1)*38.0)
bind fs = fs + 1
}
flush_3d()
# ดวงจันทร์หน้าย้อย: หมึกแบนทั้งดวง (แท็ก UNLIT — สีตรงเป๊ะ ไม่โดนแรมป์/บลูมเป่าขาว)
set_flat_shade(1.0)
สีดินสอ(168, 172, 124)
sphere(mx, my, mz, mr, mr, mr, 0.0, c2t*0.03, 0.0, 0, 22, 16)
flush_3d()
# หน้า MM บนผิวหน้าดวง (กันพารัลแลกซ์: จุดอยู่ตื้นกว่า 0.82r และย่อระยะบนหน้า)
bind fz = mz - mr*0.82
สีดินสอ(158, 40, 22) # ตาเอียงโกรธ
วาดสามเหลี่ยม3มิติ(mx - mr*0.34, my - mr*0.20, fz, mx - mr*0.09, my - mr*0.11, fz, mx - mr*0.22, my - mr*0.01, fz)
วาดสามเหลี่ยม3มิติ(mx + mr*0.34, my - mr*0.20, fz, mx + mr*0.09, my - mr*0.11, fz, mx + mr*0.22, my - mr*0.01, fz)
flush_3d()
สีดินสอ(96, 30, 14) # ยิ้มกว้าง (มุมปากยกขึ้น)
bind gp = 0.0 - 0.66
ขณะที่ gp < 0.65 {
bind g1 = gp + 0.132
วาดเส้น3มิติ(mx + gp*mr*0.45, my + mr*0.30 - gp*gp*mr*0.16, fz, mx + g1*mr*0.45, my + mr*0.30 - g1*g1*mr*0.16, fz)
bind gp = g1
}
flush_3d()
set_flat_shade(0.0)
# วงนาฬิกา: แหวนขีดเวลาล้อมดวงจันทร์ หมุนช้า → เร่งหลัง "wind the great clock" (บรรทัด 5)
bind ckSpd = 0.12
ถ้า c2t > list_get(c2cum, 5) { bind ckSpd = 0.7 }
bind ckAng = c2t * ckSpd
โหมดผสม(1)
สีดินสอ(190, 168, 96)
bind ck = 0
ขณะที่ ck < 24 {
bind ca = ck * 0.2618 + ckAng
bind cr0 = mr*1.42; bind cr1 = mr*1.58
ถ้า ck - ปัดลง(ck/6.0)*6.0 == 0 { bind cr0 = mr*1.30 }
bind ccx = mx + โคไซน์(ca)*cr0; bind ccx1 = mx + โคไซน์(ca)*cr1
bind ccy = my + ไซน์(ca)*cr0*0.42; bind ccy1 = my + ไซน์(ca)*cr1*0.42
วาดเส้น3มิติ(ccx, ccy, mz - 2.0 - ไซน์(ca)*3.0, ccx1, ccy1, mz - 2.0 - ไซน์(ca)*3.0)
bind ck = ck + 1
}
flush_3d(); โหมดผสม(0)
# นาฬิกาติ๊กหลังไขลาน (หน้าต่างแคบ ~1 เฟรม ทุก 0.95 วิ)
ถ้า c2t > list_get(c2cum, 5) {
bind tkf = c2t / 0.95
bind tkr = tkf - ปัดลง(tkf)
ถ้า tkr < 0.018 {
เสียงเอฟเฟกต์(mx, my, mz, 1.0, 1560.0, 0.10*ปริมาณSFX, 0.03, "square")
}
}
# ── ประตูมิติขาเข้า: จางหายใน ~3 วิแรก (สองคนเพิ่งพามาถึง) ──
bind arr = 1.0 - c2t / 3.0
ถ้า arr > 0.0 {
bind aCol = ฉากบทสอง_สีวน(c2t*2.4)
โหมดผสม(1)
bind ag2 = 0
ขณะที่ ag2 < 18 {
bind aa0 = ag2*0.3491 + c2t*1.4; bind aa1 = (ag2+1)*0.3491 + c2t*1.4
สีดินสอ(floor(list_get(aCol,0)*arr), floor(list_get(aCol,1)*arr), floor(list_get(aCol,2)*arr))
วาดเส้น3มิติ(โคไซน์(aa0)*4.2, 0.0-5.0+ไซน์(aa0)*4.2, 0.0-6.0, โคไซน์(aa1)*4.2, 0.0-5.0+ไซน์(aa1)*4.2, 0.0-6.0)
bind ag2 = ag2 + 1
}
flush_3d(); โหมดผสม(0)
แอ่งแสง(0.0, 0.2, 0.0-6.0, 8.0*arr, list_get(aCol,0), list_get(aCol,1), list_get(aCol,2), 0.5*arr)
}
# ── แอ่งแสง/ลำแสง: ใต้ตัวละคร + โคมวัง + จันทร์สอดส่อง (ท้ายเรื่อง) ──
แอ่งแสง(kx, 0.2, kz, 9.5, 90, 140, 255, 0.5)
แอ่งแสง(qx, 0.2, qz, 9.5, 255, 115, 165, 0.5)
ถ้า lanOn > 0.0 {
แอ่งแสง(0.0-6.0, 0.2, 46.0, 11.0, 255, 185, 90, 0.45*lanOn)
แอ่งแสง(6.0, 0.2, 46.0, 11.0, 255, 185, 90, 0.45*lanOn)
ลำแสงไฟ(0.0-6.0, 0.0-10.0, 48.0, 0.2, 5.0, 255, 185, 90, 0.3*lanOn)
ลำแสงไฟ(6.0, 0.0-10.0, 48.0, 0.2, 5.0, 255, 185, 90, 0.3*lanOn)
}
ถ้า leanS > 0.0 { # จันทร์โน้มลงมาฟัง: ลำสปอตเขียวซีดจับตัวละคร
ลำแสงไฟ(mx, my + mr*0.6, mz, 0.2, 10.0*leanS, 190, 220, 140, 0.55*leanS)
แอ่งแสง(0.0, 0.2, 0.7, 13.0*leanS, 190, 220, 140, 0.5*leanS)
}
# ── ต้นอ้อไหวลม + หิ่งห้อย ──
โหมดผสม(1)
bind rd = 0
ขณะที่ rd < 12 {
bind ra = rd * 0.5236 + 0.3
bind rx = โคไซน์(ra) * (13.0 + rd*0.9); bind rz = 4.0 + ไซน์(ra) * (10.0 + rd*0.7)
bind sway2 = ไซน์(c2t*1.3 + rd*0.9) * 0.7
สีดินสอ(46, 92, 52)
วาดเส้น3มิติ(rx, 0.2, rz, rx + sway2, 0.0 - 3.4 - (rd - ปัดลง(rd/3.0)*3.0)*0.5, rz + sway2*0.4)
bind rd = rd + 1
}
bind ff = 0
ขณะที่ ff < 5 {
bind fx2 = ไซน์(c2t*0.5 + ff*2.1) * (9.0 + ff*2.0)
bind fy2 = 0.0 - 2.2 - ไซน์(c2t*0.8 + ff*1.3)*1.6
bind fz2 = 3.0 + โคไซน์(c2t*0.45 + ff*1.8) * 8.0
bind ffCol = วนสีอ่อน(190, 235, 120, c2t*1.6 + ff*0.6, 0.42)
อนุภาคทรงกลม(fx2, fy2, fz2, 0.24, 3, c2t*3.0+ff, list_get(ffCol,0), list_get(ffCol,1), list_get(ffCol,2))
bind ff = ff + 1
}
flush_3d(); โหมดผสม(0)
# ── ท่าทาง: เดิน = สวิงแขนขา · ผู้พูดมีท่ามือสลับตามบรรทัด · ราชาชี้ทางทะเล ──
bind who = 0.0
ถ้า c2i < C2N { bind who = list_get(ผู้พูด, c2i) }
bind ท่าคู่ = c2i - ปัดลง(c2i/2.0)*2.0 # สลับท่า ท่าคู่/คี่
bind หายใจ0 = ไซน์(c2t*1.35)*0.05
bind kArm = ไซน์(c2t*1.1)*0.06 + ไซน์(c2t*7.2)*0.38*kเดิน
bind kLeg = ไซน์(c2t*7.2)*0.30*kเดิน
bind kSway = หายใจ0 + ไซน์(c2t*3.6)*0.10*kเดิน
bind kLean = 0.10*kเดิน; bind kTuck = 0.0
bind qArm = ไซน์(c2t*1.2+1.0)*0.06 + ไซน์(c2t*7.0+2.0)*0.36*qเดิน
bind qLeg = ไซน์(c2t*7.0+2.0)*0.28*qเดิน
bind qSway = (0.0-หายใจ0) + ไซน์(c2t*3.5+1.0)*0.10*qเดิน
bind qLean = 0.10*qเดิน; bind qTuck = 0.0
ถ้า who > 0.5 { ถ้า who < 1.5 { ถ้า kเดิน < 0.4 {
ถ้า ท่าคู่ < 0.5 {
bind kArm = 0.34 + ไซน์(c2t*3.0)*0.18 # ชูมือปฏิญาณ (ยกค้าง + สั่นเน้นคำ)
}
มิฉะนั้น {
bind kArm = ไซน์(c2t*2.6)*0.48 # โบกมือกว้าง (อธิบาย)
}
bind kSway = ไซน์(c2t*1.7)*0.11
bind kLean = 0.14
} } }
ถ้า c2i == 9 { bind kArm = 0.58 + ไซน์(c2t*1.2)*0.05 } # "seek the tide horn": ชี้ค้างไปไกล
ถ้า who > 1.5 { ถ้า qเดิน < 0.4 {
ถ้า ท่าคู่ < 0.5 {
bind qArm = 0.26 + ไซน์(c2t*2.4)*0.14 # แบมือวิงวอน
}
มิฉะนั้น {
bind qArm = 0.0 - 0.14 + ไซน์(c2t*1.8)*0.07 # กุมมือแนบตัว (กังวล)
}
bind qSway = ไซน์(c2t*1.6)*0.10
bind qLean = 0.12
} }
ถ้า c2i == 6 { ถ้า who > 1.5 { bind qLean = 0.2 } } # "what then will hold the sky": โน้มถาม
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 + ไซน์(c2t*1.7)*13.0, 28.0 + โคไซน์(c2t*1.2)*13.0, 1.0, 0.18, 3.4)
liquid_splat(liq, 28.0 + โคไซน์(c2t*1.1)*11.0, 28.0 + ไซน์(c2t*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)
# ── โน้ต + เอฟเฟกต์เสียงประกอบบรรทัด (ครั้งเดียวต่อบรรทัด) ──
ถ้า c2i > บทสองบรรทัดก่อน {
ถ้า c2i < C2N {
bind n = list_get(โน้ต, c2i)
bind whoN = list_get(ผู้พูด, c2i)
เล่นเสียงพากย์("chapter2", c2i, list_get(ผู้พูดรหัส, c2i), ภาษา, ปริมาณSFX)
ถ้า whoN < 0.5 {
เล่นไชม์ใหญ่(0.0, 0.0, 0.0, n, 0.33 * ปริมาณSFX)
}
ถ้า whoN > 0.5 { ถ้า whoN < 1.5 {
เล่นกาเมลัน(0.0, 0.0, 0.0, n, 0.42 * ปริมาณSFX)
เล่นฮังแพน(0.0, 0.0, 0.0, n*0.5, 0.20 * ปริมาณSFX)
} }
ถ้า whoN > 1.5 {
เล่นแฟนแฟร์(0.0, 0.0, 0.0, n*0.75, 0.30 * ปริมาณSFX)
เล่นฮังแพน(0.0, 0.0, 0.0, n*0.62, 0.16 * ปริมาณSFX)
}
ถ้า c2i == 4 { # โคมวังจุดวูบ
เสียงเอฟเฟกต์(0.0, 0.0-9.0, 46.0, 1.0, 620.0, 0.30*ปริมาณSFX, 0.35, "sine")
เสียงเอฟเฟกต์(0.0, 0.0-9.0, 46.0, 1.0, 985.0, 0.18*ปริมาณSFX, 0.12, "sine")
}
ถ้า c2i == 8 { # "three dawns": ระฆังทุ้มลึก
เล่นไชม์ใหญ่(0.0, 0.0, 0.0, 98.0, 0.5 * ปริมาณSFX)
เสียงเอฟเฟกต์(0.0, 0.0, 0.0, 1.0, 49.0, 0.35*ปริมาณSFX, 1.6, "triangle")
}
ถ้า c2i == 11 { # จันทร์โน้มลง: รัมเบิลต่ำ + ฆ้อง
เสียงเอฟเฟกต์(mx, my, mz, 1.0, 38.0, 0.5*ปริมาณSFX, 2.6, "saw")
เล่นฆ้อง(0.0, 0.0, 0.0, 65.4, 0.4 * ปริมาณSFX)
}
}
bind บทสองบรรทัดก่อน = c2i
}
# ── ตัวหนังสือ ──
ตั้งกล้องมอง(0.0, 0.0, -22.0, 0.0, 0.0, 0.0)
ตั้งระยะห่าง(2.8)
สีดินสอ(210, 235, 170)
วาดสตริง("chapter 2 : the terrible eye", 0.0, 10.0, 0.0, 0.72, 1)
ถ้า c2i < C2N {
bind line2 = list_get(บทพูด, c2i)
bind line2กลิฟ = list_get(บทพูดกลิฟ, c2i)
bind hlc2i = list_get(ไฮไลท์c2i, c2i)
bind who2 = list_get(ผู้พูด, c2i)
bind lt = c2t - list_get(c2cum, c2i)
bind laf = 1.0
ถ้า lt < 0.6 { bind laf = lt / 0.6 }
ถ้า lt > C2SEC - 0.7 { bind laf = (C2SEC - 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)
ถ้า who2 > 0.5 { ถ้า who2 < 1.5 { bind lr = floor(255.0*laf); bind lg = floor(218.0*laf); bind lb = floor(128.0*laf) } }
ถ้า who2 > 1.5 { bind lr = floor(212.0*laf); bind lg = floor(222.0*laf); bind lb = floor(255.0*laf) }
ถ้า แสดงบทพูด == 1 {
วาดสตริงบทพูดบากขอบ(line2กลิฟ, ภาษาบทพูด, 0.0, 8.3, 0.0, 0.62)
วาดสตริงบทพูดบากสี(line2กลิฟ, ภาษาบทพูด, 0.0, 8.3, 0.0, 0.62, lr, lg, lb, list_get(hlc2i,0), list_get(hlc2i,1), list_get(hlc2i,2), list_get(hlc2i,3), list_get(hlc2i,4))
}
}
สีดินสอ(170, 180, 205)
วาดสตริง("[enter/space] continue [esc] skip", 0.0, 10.9, 0.0, 0.42, 1)
flush_3d()
แสดงผล()
bind outC2 = 0.0
ถ้า c2t >= C2END { bind outC2 = 1.0 }
# กันข้ามโดยไม่ตั้งใจ: ไม่รับปุ่มข้าม (คีย์บอร์ด+จอย) ช่วง 5 วิแรกของฉาก
ถ้า c2t > 5.0 {
ถ้า กดปุ่ม("enter") { bind outC2 = 1.0 }
ถ้า กดปุ่ม("space") { bind outC2 = 1.0 }
ถ้า กดปุ่ม("escape") { bind outC2 = 1.0 }
ถ้า จอยปุ่ม("a") { bind outC2 = 1.0 }
ถ้า จอยปุ่ม("start") { bind outC2 = 1.0 }
}
ถ้า outC2 > 0.5 { # ปิดโดรนก่อนออกฉาก
เบลอเฟรม(0.0)
เสียงโทน(15, 0.0, 0.0, 0.0, 1.0, 55.0, 0.0, 0.0, 0.0)
เสียงโทน(14, 0.0, 0.0, 0.0, 1.0, 55.7, 0.0, 0.0, 0.0)
}
คืน [บทสองบรรทัดก่อน, outC2]
}