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/chapter6.ling
# Chapter 6 cutscene module — "the room between worlds"
# Returns [state, shouldExit] · state = lineIdx*1000
#
# พักหายใจ — ช้า ลอย ทริปข้ามมิติ (DMT trip in a castle):
# ห้องประกอบจากชิ้นวังของเรา: พื้น p0 หายใจ · ยอด p3 ลอยหมุนเหนือหัว
# เศษวังเล็ก (p1/p2/p4 ×2) โคจรเป็นกำแพงวง · ทุกชิ้น หมุนสีเมช คนละเฟส เกนหายใจ
# วงแหวนอักขระเดมอนลอยวน ("ตัวอักษรที่เราทำหล่น") · โมทแสงลิสซาจู + แอ่งแสงสีวน
# แล้วแนะนำ "เดมอน" ประจำห้อง — ปีศาจน้อยใจดี: ตัวกลมสีพลัมเข้ม เขาเล็ก
# ตาทองโต ยิ้มโค้งขึ้น ปีกกระพือ ออร่าอุ่น โผล่บรรทัด 6 พร้อมป๊อป+ประกาย
# สกอร์: HealthyHell.wav (วนตลอด — นรกที่เป็นมิตร)
ฟังก์ชัน ฉากบทหก_บทพูดไฮไลท์(ภาษา) {
ถ้า ภาษา == 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],
[20, 37, 175, 90, 230],
[63, 74, 175, 90, 230],
[-1, -1, 0, 0, 0],
]
}
ถ้า ภาษา == 1 {
คืน [
[-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, 11, 175, 90, 230],
[48, 61, 175, 90, 230],
[-1, -1, 0, 0, 0],
]
}
ถ้า ภาษา == 2 {
คืน [
[-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, 12, 175, 90, 230],
[45, 55, 175, 90, 230],
[-1, -1, 0, 0, 0],
]
}
ถ้า ภาษา == 3 {
คืน [
[-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],
[13, 18, 175, 90, 230],
[27, 34, 175, 90, 230],
[-1, -1, 0, 0, 0],
]
}
ถ้า ภาษา == 4 {
คืน [
[-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],
[5, 10, 175, 90, 230],
[30, 37, 175, 90, 230],
[-1, -1, 0, 0, 0],
]
}
ถ้า ภาษา == 5 {
คืน [
[-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],
[6, 9, 175, 90, 230],
[24, 30, 175, 90, 230],
[-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, 24, 15, 16, 18, 18, 26, 24, 26, 5, -1, 23, 8, 16, 25, 21, -1, 18, 8, 23, 12, 23, 8, -1, 13, 21, 14, 12, 25, 25, 21, -1, 20, 21, -1, 8, 25, 21, 3, -1, 23, 21, 11, 21, -1, 23, 12, 24, 26, 25, 21, 5],
[18, 29, 8, 24, 24, 26, 23, 26, -1, 22, 16, 24, 26, 3, -1, 18, 8, 23, 12, 23, 8, -1, 23, 21, 24, 26, 25, 21, -1, 24, 15, 16, 25, 8, -1, 19, 21, 20, 21, 3, -1, 19, 8, 25, 8, -1, 18, 8, 23, 12, 23, 8, -1, 13, 8, 26, 20, 11, 21, 3, -1, 24, 21, 24, 15, 16, 25, 12, -1, 28, 8, 23, 26, 11, 21, -1, 8, 16, 11, 8, -1, 23, 26, 19, 26, -1, 9, 16, 23, 26, 11, 21, 5],
[11, 21, 18, 21, 5, 5, 5, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 16, 23, 26, 7, -1, 18, 8, 9, 12, 3, -1, 9, 26, 23, 12, 24, 26, -1, 24, 15, 16, 25, 12, -1, 16, 23, 26, 5],
[13, 26, 23, 21, 8, 3, -1, 18, 8, 23, 8, 4, 11, 12, -1, 24, 15, 16, 20, 14, 26, 5, -1, 28, 8, 23, 12, 28, 8, 23, 12, 3, -1, 11, 21, 18, 21, -1, 18, 8, 23, 8, -1, 18, 8, -1, 18, 21, 20, 21, -1, 24, 21, 20, 14, 26, -1, 24, 15, 16, 25, 25, 12, -1, 16, 23, 26, 5],
[23, 12, 25, 8, 3, -1, 24, 26, 23, 16, -1, 28, 8, 23, 26, 11, 21, 4, 11, 12, -1, 11, 21, 23, 21, 22, 22, 26, -1, 24, 15, 16, 25, 8, -1, 19, 21, 20, 21, 3, -1, 18, 8, 23, 12, 4, 20, 21, -1, 19, 8, 28, 8, 23, 16, 4, 21, -1, 22, 12, 24, 15, 12, 20, 25, 21, -1, 19, 26, 20, -1, 20, 21, -1, 29, 21, 4, 20, 16, -1, 21, 23, 26, 9, 16, 25, 25, 21, 5],
[24, 21, 23, 12, 18, 8, 23, 8, 3, -1, 28, 21, 19, 26, -1, 11, 8, 18, 26, -1, 18, 8, 23, 8, 3, -1, 10, 15, 16, 24, 8, 20, 8, -1, 19, 21, 20, 21, -1, 22, 21, 23, 8, 16, 25, 4, 20, 16, -1, 18, 21, 13, 26, 5],
[21, 0, -1, 14, 12, 24, 26, 25, 21, 0, -1, 28, 8, 23, 12, 28, 8, 23, 12, 3, -1, 16, 20, 4, 9, 16, 25, 28, 16, 20, -1, 20, 21, -1, 11, 16, 19, 21, 20, 5, -1, 8, 20, 8, 25, 8, -1, 11, 21, 23, 21, 22, 22, 26, -1, 24, 26, 23, 26, -1, 23, 12, 25, 8, 3, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 18, 16, 22, 26, 5],
[22, 26, 23, 16, 30, 26, 3, -1, 8, 13, 26, 23, 12, 16, 11, 21, 4, 20, 16, -1, 20, 8, 23, 8, 20, 8, 16, -1, 11, 12, 5, -1, 13, 16, 8, 3, -1, 25, 16, -1, 25, 21, -1, 16, 24, 24, 15, 21, 4, 11, 12, -1, 25, 12, 23, 16, 9, 26, 23, 26, -1, 25, 12, 16, 24, 26, 25, 21, 5],
[11, 16, 19, 21, 20, 7, 5, 5, 5, 13, 26, 23, 12, 20, 11, 21, 23, 16, -1, 28, 8, 20, 7],
[16, 23, 12, 9, 26, 20, -1, 17, 16, 19, 12, 20, 24, 15, 21, 20, -1, 11, 12, -1, 19, 21, 25, 25, 21, 19, 21, -1, 13, 26, 23, 12, 20, 11, 21, 23, 16, 5, -1, 8, 20, 8, 25, 8, 4, 20, 21, -1, 8, 23, 26, 13, 8, 9, 12, 25, 25, 21, 3, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 24, 21, 25, 21, -1, 24, 15, 16, 25, 8, 5, -1, 8, 20, 8, 25, 8, 3, -1, 24, 26, 18, 21, 24, 15, 16, -1, 19, 16, 24, 24, 15, 16, 20, 14, 26, 5],
[24, 21, 23, 12, 18, 8, 23, 8, -1, 28, 8, 23, 12, 28, 8, 23, 12, -1, 18, 8, 23, 12, 23, 8, -1, 13, 8, 16, 20, 11, 21, 5, -1, 8, 20, 8, 25, 8, -1, 28, 12, 16, -1, 23, 8, 16, 25, 21, -1, 24, 15, 16, 25, 12, -1, 18, 26, 23, 12, 23, 26, 3, -1, 23, 16, 25, 21, 23, 26, -1, 18, 16, 22, 8, 7],
[8, 20, 8, 25, 8, -1, 20, 12, 9, 8, -1, 8, 24, 26, 18, 26, -1, 25, 21, -1, 21, 19, 21, 25, 25, 8, 5, -1, 24, 15, 16, 23, 16, 20, 14, 26, 4, 20, 16, -1, 18, 16, 4, 21, -1, 25, 24, 26, 18, 12, 25, 12, 5, -1, 24, 21, 23, 12, -1, 14, 16, 14, 14, 26, 23, 26, 5],
]
}
ถ้า ภาษา == 1 {
คืน [
[15, 20, 13, 28, 32, 17, 30, -1, 31, 21, 36, 6, -1, 13, 18, 32, 17, 30, -1, 32, 20, 17, -1, 24, 21, 19, 20, 32, -1, 18, 27, 30, 19, 27, 32, -1, 32, 20, 17, 25, 4, -1, 32, 20, 17, -1, 30, 27, 13, 16, -1, 30, 17, 31, 32, 17, 16, 6],
[32, 20, 17, -1, 15, 13, 31, 32, 24, 17, -1, 28, 21, 17, 15, 17, 31, -1, 32, 20, 17, 37, -1, 20, 13, 16, -1, 24, 27, 31, 32, -1, 18, 27, 33, 26, 16, -1, 32, 20, 17, 25, -1, 13, 19, 13, 21, 26, 4, -1, 13, 26, 16, -1, 14, 33, 21, 24, 32, -1, 13, -1, 30, 27, 27, 25, -1, 14, 17, 32, 35, 17, 17, 26, -1, 35, 27, 30, 24, 16, 31, 6],
[35, 20, 17, 30, 17, 6, 6, 6, -1, 13, 30, 17, -1, 35, 17, 8, -1, 32, 20, 17, -1, 35, 13, 24, 24, 31, -1, 13, 30, 17, -1, 14, 30, 17, 13, 32, 20, 21, 26, 19, 6],
[32, 20, 17, -1, 18, 24, 27, 27, 30, -1, 21, 31, -1, 31, 21, 26, 19, 21, 26, 19, -1, 21, 26, -1, 15, 27, 24, 27, 30, 31, 6, -1, 21, -1, 23, 26, 27, 35, -1, 32, 20, 21, 31, -1, 31, 27, 26, 19, -1, 18, 30, 27, 25, -1, 31, 27, 25, 17, 35, 20, 17, 30, 17, 6],
[32, 20, 17, -1, 24, 17, 32, 32, 17, 30, 31, -1, 32, 20, 17, 37, -1, 20, 13, 16, -1, 16, 30, 27, 28, 28, 17, 16, -1, 21, 26, -1, 32, 20, 30, 17, 17, -1, 35, 27, 30, 24, 16, 31, -1, 27, 30, 14, 21, 32, 17, 16, -1, 32, 20, 17, 25, -1, 24, 21, 23, 17, -1, 28, 13, 32, 21, 17, 26, 32, -1, 25, 27, 27, 26, 31, 6],
[13, 26, 16, -1, 32, 20, 17, 26, 4, -1, 27, 33, 32, -1, 27, 18, -1, 32, 20, 17, -1, 35, 13, 30, 25, -1, 16, 13, 30, 23, 4, -1, 31, 27, 25, 17, 32, 20, 21, 26, 19, -1, 31, 25, 13, 24, 24, -1, 28, 27, 24, 21, 32, 17, 24, 37, -1, 15, 27, 33, 19, 20, 17, 16, 6],
[27, 20, 0, -1, 19, 33, 17, 31, 32, 31, 0, -1, 21, -1, 13, 25, -1, 32, 20, 17, -1, 16, 13, 17, 25, 27, 26, -1, 27, 18, -1, 32, 20, 17, -1, 21, 26, 5, 14, 17, 32, 35, 17, 17, 26, 6, -1, 21, -1, 23, 17, 17, 28, -1, 32, 20, 17, -1, 24, 17, 32, 32, 17, 30, 31, -1, 37, 27, 33, -1, 16, 30, 27, 28, 6],
[28, 24, 17, 13, 31, 17, -1, 16, 27, -1, 26, 27, 32, -1, 14, 17, -1, 13, 18, 30, 13, 21, 16, 6, -1, 18, 17, 13, 30, -1, 32, 13, 31, 32, 17, 31, -1, 32, 17, 30, 30, 21, 14, 24, 17, -1, 35, 21, 32, 20, -1, 32, 17, 13, 6],
[13, -1, 16, 17, 25, 27, 26, 8, -1, 6, 6, 6, 13, -1, 18, 30, 21, 17, 26, 16, 24, 37, -1, 27, 26, 17, 8],
[18, 30, 21, 17, 26, 16, 24, 21, 17, 31, 32, -1, 21, 26, -1, 17, 24, 17, 34, 17, 26, -1, 16, 21, 25, 17, 26, 31, 21, 27, 26, 31, 6, -1, 21, -1, 31, 27, 30, 32, 17, 16, -1, 37, 27, 33, 30, -1, 13, 24, 28, 20, 13, 14, 17, 32, 6, -1, 37, 27, 33, -1, 13, 30, 17, -1, 25, 21, 31, 31, 21, 26, 19, -1, 13, -1, 18, 17, 35, 6],
[32, 20, 17, 26, -1, 35, 17, -1, 35, 21, 24, 24, -1, 18, 21, 26, 16, -1, 32, 20, 17, 25, 6, -1, 35, 21, 24, 24, -1, 37, 27, 33, -1, 24, 21, 19, 20, 32, -1, 32, 20, 17, -1, 35, 13, 37, 4, -1, 24, 21, 32, 32, 24, 17, -1, 23, 17, 17, 28, 17, 30, 8],
[21, -1, 32, 20, 27, 33, 19, 20, 32, -1, 37, 27, 33, -1, 35, 27, 33, 24, 16, -1, 26, 17, 34, 17, 30, -1, 13, 31, 23, 6, -1, 25, 21, 26, 16, -1, 32, 20, 17, -1, 15, 17, 21, 24, 21, 26, 19, 6, -1, 21, 32, -1, 19, 21, 19, 19, 24, 17, 31, 6],
]
}
ถ้า ภาษา == 2 {
คืน [
[62, 51, 51, 139, 119, 6, -1, 119, 101, 130, 20, 21, 133, 6, 150, 113, 20, 101, 146, 84, 76, 107, 6, 149, 10, 133, 153, 65, 150, 106, 107, -1, 47, 57, 57, 6, 155, 153, 41, 76, 130, 6, 72, 123, 57],
[27, 137, 57, 117, 107, 57, 65, 93, 133, 113, 133, 51, 51, 139, 76, 107, 6, 149, 10, 133, 51, 134, 119, 133, 88, 153, 65, 76, 62, 76, 107, 6, 149, 10, 133, 123, 138, 6, 13, 93, 132, 20, -1, 150, 101, 129, 113, 99, 133, 20, 121, 123, 20, 119, 57, 144, 20, 10, 145, 57, 93, 129, 119, 108, 133, 20, 151, 101, 6, 51, 132, 20, 119, 101, 133, 88],
[149, 93, 133, 4, 4, 4, 123, 90, 51, 139, 153, 119, 57, 6, 130, 57, 57, 139, -1, 6, 134, 150, 76, 20, 6, 134, 101, 130, 20, 119, 133, 88, 152, 21],
[76, 148, 57, 6, 134, 101, 130, 20, 10, 130, 62, 10, 133, 57, 149, 65, 155, 57, 113, 138, 113, 130, 57, -1, 26, 130, 57, 97, 21, 130, 6, 149, 76, 101, 20, 57, 140, 21, 133, 6, 51, 139, 153, 119, 57, 113, 130, 6, 150, 120, 20],
[42, 130, 107, 123, 130, 6, 112, 93, 51, 139, 76, 107, 6, 149, 10, 133, 51, 134, 42, 6, 153, 109, 152, 57, 113, 133, 84, 151, 101, 6, 151, 13, 21, 93, 93, 123, 62, 76, 107, 6, 149, 10, 133, 38, 131, 20, 38, 107, 20, 21, 130, 57, 51, 93, 156, 71, 123, 38, 51, 57],
[150, 106, 107, 21, 133, 6, 13, 107, 133, 84, 84, 146, 38, 123, 130, 57, 123, 62, 124, 57, -1, 113, 136, 20, 149, 101, 155, 6, 154, -1, 123, 91, 133, 20, 119, 57, 144, 20, 6, 155, 153, 123, 123, 123, 6, 84, 133, 123, 91, 133, 20, 114, 82, 133, 76],
[151, 126, 0, -1, 150, 10, 6, 71, 84, 133, 149, 88, 146, 123, 57, 0, -1, 12, 133, 13, 146, 123, 65, 138, 110, 133, 21, 150, 120, 20, 28, 123, 20, 108, 133, 20, 93, 129, 119, 108, 133, 20, 151, 101, 6, -1, 12, 133, 149, 6, 155, 62, 93, 130, 6, 112, 133, 42, 130, 107, 123, 130, 6, 112, 93, 51, 139, 76, 107, 6, 54, 133, 57, 51, 134, 42, 6],
[151, 65, 93, 38, 123, 91, 133, 6, 101, 130, 107, 12, 133, 153, 65, 149, 101, 88, -1, 13, 107, 133, 84, 6, 101, 130, 107, 84, 130, 57, 84, 138, 93, 113, 27, 133, 42, 135, 150, 91, 84, 133, 6, 149, 107, 101, 133, 38, 147, 84, 16, 6, 130, 62, 27, 133],
[65, 138, 110, 133, 21, 20, 132, 57, 119, 93, 146, 123, 4, 4, 4, 51, 139, 149, 65, 155, 57, 84, 135, 42, 93, 60, 129, 149, 119, 93, 123, 5],
[149, 65, 155, 57, 84, 135, 42, 93, 51, 139, 114, 38, 152, 57, 113, 135, 62, 149, 123, 155, 38, 84, 135, 42, 135, 149, 101, 88, 105, 129, -1, 12, 133, 21, 130, 38, 149, 93, 138, 88, 20, 42, 130, 107, 123, 130, 6, 112, 93, 10, 123, 20, 76, 107, 6, 54, 133, 57, 152, 121, 150, 106, 107, -1, 76, 107, 6, 54, 133, 57, 88, 130, 20, 10, 133, 38, 123, 90, 153, 86, 6, 139, 42, 130, 107],
[20, 132, 57, 149, 93, 133, 21, 129, 153, 65, 42, 133, 84, 119, 133, 84, 130, 57, 6, 130, 57, -1, 149, 25, 133, 21, 129, 28, 107, 88, 117, 123, 20, 51, 133, 20, 152, 121, 149, 93, 133, 153, 119, 84, -1, 71, 40, 150, 101, 42, 130, 107, 61, 123, 88],
[12, 133, 57, 143, 6, 108, 133, 54, 133, 57, 21, 129, 153, 86, 47, 133, 84, 30, 129, 150, 106, 107, -1, 93, 129, 107, 130, 20, 149, 76, 38, 133, 57, 41, 107, 88, 57, 129, -1, 84, 130, 57, 27, 123, 62, 119, 130, 107, 149, 93, 133, 129, 13, 135, 6, 13, 130, 6],
]
}
ถ้า ภาษา == 3 {
คืน [
[12, 402, 6, -1, 276, 386, -1, 60, 153, 383, -1, 395, 382, -1, 526, 4, -1, 67, 382, -1, 310, 348, 120],
[60, 153, 386, -1, 390, 340, 254, 195, 130, -1, 297, 385, -1, 414, 18, 153, 386, -1, 60, 153, 383, -1, 120, 317, -1, 444, 327, 93, 340, 4, -1, 298, 42, 153, -1, 283, 386, 349, -1, 252, 383, -1, 502, 86, -1, 427, 348, 120],
[351, 65, 17, 6, 6, 6, -1, 340, 157, 427, 16, -1, 258, 386, -1, 309, 383, -1, 310, 43, -1, 393, 340],
[245, 121, 386, -1, 290, 381, 197, -1, 105, 179, 502, 43, -1, 393, 340, 6, -1, 386, -1, 105, 179, 203, -1, 340, 157, 294, 17, -1, 327, 115, 132],
[60, 153, 386, -1, 298, -1, 298, 42, 349, -1, 167, 340, 171, 207, -1, 63, 396, 153, 386, -1, 388, 93, 320, -1, 214, 382, -1, 124, 153, 446, 187, -1, 60, 153, -1, 420, 378, 203, -1, 136, 333, 120],
[60, 206, 43, -1, 60, 164, 4, -1, 159, 173, 503, -1, 340, 146, -1, 303, 349, 292, 4, -1, 397, 382, -1, 236, 342, 17, 17, -1, 410, 423, 502, 33, -1, 512, 65, 463, 383, -1, 509, 120],
[359, 0, -1, 304, 119, 153, 386, 317, 54, 367, 0, -1, 404, 115, -1, 283, 386, 385, -1, 120, 386, 231, 386, 349, 367, 6, -1, 351, 184, 269, 386, -1, 167, 340, 171, 207, -1, 63, 396, 153, 383, -1, 411, 17, -1, 261, 50, 502, 419],
[267, 157, -1, 236, 292, 374, 502, 427, -1, 211, 298, 367, 6, -1, 143, 192, 372, 382, -1, 439, 362, -1, 505, 75, -1, 219, 381, 226, -1, 410, 215, -1, 216, 386, -1, 346, 28, 151, 367],
[328, 211, 174, 43, 16, -1, 6, 6, 6, 462, 407, 503, -1, 328, 211, 16],
[353, 503, -1, 27, 385, -1, 439, 375, -1, 423, 349, 292, -1, 17, 402, -1, 462, 407, 502, 125, 118, 120, 6, -1, 351, 184, 269, 385, -1, 332, 489, 257, 383, -1, 410, 206, 508, -1, 143, 348, 340, 367, 6, -1, 228, -1, 27, 17, -1, 277, 412, 393, 128, 54, 367],
[60, 187, -1, 369, 206, 17, -1, 60, 32, 153, 383, -1, 444, 34, 120, 6, -1, 67, 383, -1, 250, 514, 420, 34, 118, 4, -1, 397, 382, -1, 307, 519, 396, 336, 16],
[240, 340, 261, 427, -1, 331, 381, 319, -1, 422, -1, 332, 333, 340, 367, 6, -1, 447, 402, 383, -1, 414, 320, 502, 298, 367, 6, -1, 475, 475, 28, 206, 28, 151, 367],
]
}
ถ้า ภาษา == 4 {
คืน [
[476, 171, 472, 7, 167, 17, 299, 69, 75, 309, 72, 35, 302, 6, 570, 50, 147, 76, 36],
[299, 69, 17, 240, 38, 41, 12, 35, 225, 49, 391, 429, 17, 173, 53, 299, 69, 75, 527, 39, 22, 6, 132, 441, 43, 132, 441, 49, 587, 46, 123, 39, 49, 573, 274, 75, 480, 12, 35],
[24, 24, 50, 5, 5, 44, 24, 36, 3, -1, 229, 17, 205, 202, 27, 41, 12, 71],
[286, 17, 512, 42, 393, 38, 41, 12, 59, 29, 7, 24, 49, 393, 6, 44, 24, 16, 42, 453, 38, 41, 12, 71, 400, 17, 27, 59, 29],
[299, 69, 17, 127, 39, 49, 132, 441, 46, 517, 43, 27, 41, 18, 35, 355, 250, 35, 37, 17, 6, 553, 332, 294, 12, 373, 49, 68, 13, 46, 299, 69, 49, 203, 70, 75, 278, 38, 35],
[33, 27, 41, 33, 49, 366, 6, 413, 16, 45, 588, 49, 134, 16, 69, 6, 268, 26, 45, 151, 16, 17, 124, 267, 46, 207, 328, 12, 75, 27, 35],
[15, 15, 0, -1, 15, 260, 389, 42, 29, 48, 0, -1, 462, 50, 432, 587, 49, 99, 122, 112, 120, 42, 29, 7, 11, 45, 35, 359, 17, 517, 43, 27, 35, 355, 250, 75, 462, 17, 154, 477, 27, 41, 12, 71, 76, 42, 29, 68],
[44, 13, 16, 311, 17, 69, 45, 12, 42, 20, 36, 26, 12, 7, 314, 311, 50, 15, 515, 43, 123, 492, 36, 43, 6, 43, 41, 63, 59, 30, 12, 204, 17, 27, 59, 29, 16, 69],
[316, 620, 36, 43, 3, 5, 5, 192, 245, 446, 45, 316, 620, 43, 12, 13, 24, 43, 16, 3],
[189, 123, 392, 165, 42, 123, 442, 192, 245, 446, 42, 29, 43, 63, 7, 11, 45, 35, 359, 49, 78, 116, 104, 77, 105, 98, 100, 75, 354, 437, 27, 41, 15, 18, 59, 27, 35, 7, 12, 20, 39, 16, 542, 70, 59, 31, 76, 42, 27, 35, 22, 44, 48],
[33, 72, 42, 50, 462, 35, 37, 17, 527, 39, 22, 59, 27, 67, 13, 7, 570, 75, 425, 69, 27, 41, 20, 36, 26, 12, 59, 29, 16, 6, 268, 26, 45, 442, 142, 26, 76, 3],
[503, 12, 41, 20, 36, 26, 69, 45, 12, 16, 43, 312, 38, 41, 12, 59, 27, 35, 68, 7, 238, 140, 46, 50, 15, 400, 75, 39, 22, 41, 7, 20, 29, 20, 29, 473, 12, 59, 29, 16, 69],
]
}
ถ้า ภาษา == 5 {
คืน [
[617, 97, 612, 8, 216, 773, 769, 93, 770, 339, 38, 54, 57, 32, 163, 850, 769, 736, 639, 41, 333, 56, 479, 349],
[54, 57, 445, 240, 146, 573, 222, 224, 591, 548, 104, 478, 378, 123, 38, 54, 57, 850, 303, 216, 20, 567, 32, 797, 620, 732, 38, 11, 797, 369],
[367, 57, 6, 6, 755, 436, 216, 187, 779, 852, 226, 227, 216, 178, 174],
[217, 458, 482, 56, 683, 326, 480, 190, 582, 8, 367, 68, 33, 216, 187, 779, 171, 752, 755, 833, 480],
[54, 57, 216, 14, 24, 20, 567, 25, 770, 695, 573, 252, 488, 850, 248, 665, 336, 573, 448, 46, 682, 642, 582, 54, 57, 426, 742],
[805, 163, 850, 52, 519, 440, 573, 842, 441, 25, 850, 11, 24, 276, 276, 573, 21, 705, 594, 728, 217, 183, 38, 11, 228],
[186, 847, 264, 48, 457, 38, 847, 367, 436, 242, 654, 32, 797, 573, 626, 535, 8, 78, 57, 402, 695, 573, 252, 488, 850, 775, 565, 367, 81, 622, 582, 176],
[723, 17, 706, 266, 344, 8, 348, 359, 776, 690, 197, 732, 457, 850, 177, 769, 628, 627, 459, 38],
[11, 24, 351, 839, 852, 6, 6, 11, 24, 149, 194, 573, 351, 839, 166, 852],
[138, 11, 24, 647, 310, 779, 447, 149, 194, 573, 773, 24, 8, 367, 294, 640, 380, 78, 57, 573, 252, 488, 421, 561, 247, 38, 850, 754, 292, 773, 31, 110, 24, 176],
[773, 367, 57, 278, 146, 380, 255, 57, 378, 205, 457, 8, 78, 363, 361, 27, 367, 57, 544, 46, 126, 736, 166, 850, 276, 276, 573, 257, 384, 663, 852],
[367, 754, 56, 27, 78, 57, 17, 65, 796, 38, 176, 8, 276, 336, 237, 687, 458, 850, 255, 65, 182, 182, 614, 573],
]
}
คืน []
}
ฟังก์ชัน ฉากบทหก_บทพูด(ภาษา) {
ถ้า ภาษา == 0 {
คืน [
"chaputa shikkusu. raito karera fogetto no ato, rodo resuto.",
"kyassuru pisu, karera rosuto shita mono, mata karera faundo, soshite warudo aida rumu birudo.",
"doko... wareware iru? kabe, buresu shite iru.",
"furoa, kara-de shingu. wareware, doko kara ka kono songu shitte iru.",
"reta, suri warudo-de doroppu shita mono, kare-no mawari-o peshento mun no yo-ni orubitto.",
"sorekara, womu daku kara, chisana mono porait-ni kofu.",
"o! gesuto! wareware, in-bitwin no dimon. anata doroppu suru reta, wareware kipu.",
"purizu, afureido-ni naranai de. fia, ti to issho-de teriburu teisuto.",
"dimon?...furendori wan?",
"irebun jimenshon de mottomo furendori. anata-no arufabetto, wareware soto shita. anata, sukoshi misshingu.",
"sorekara wareware karera faindo. anata wei raito shite kureru, ritoru kipa?",
"anata neba asuku to omotta. shiringu-ni ki-o tsukete. sore gigguru."
]
}
ถ้า ภาษา == 2 {
คืน [
"บทที่หก หลังจากแสงลืมพวกเขาไปแล้ว ถนนก็ได้พักผ่อน",
"ชิ้นส่วนปราสาทที่พวกเขาทำหายไปพบพวกเขาอีกครั้ง และสร้างห้องหนึ่งขึ้นระหว่างโลกทั้งหลาย",
"เรา...อยู่ที่ไหนกันนี่ กำแพงกำลังหายใจ",
"พื้นกำลังขับขานเป็นสีสัน ฉันรู้จักเพลงนี้จากที่ไหนสักแห่ง",
"ตัวอักษรที่พวกเขาทำตกไว้ในสามโลกโคจรรอบพวกเขาดั่งดวงจันทร์ผู้อดทน",
"แล้วจากความมืดอันอบอุ่น สิ่งเล็กๆ อย่างหนึ่งก็ไอออกมาอย่างสุภาพ",
"โอ้! แขกผู้มาเยือน! ข้าคือปีศาจแห่งช่องว่างระหว่างโลก ข้าเก็บรักษาตัวอักษรที่พวกท่านทำตก",
"โปรดอย่ากลัวข้าไปเลย ความกลัวมันมีรสชาติแย่มากเวลาดื่มคู่กับชา",
"ปีศาจงั้นหรือ...ที่เป็นมิตรน่ะเหรอ?",
"เป็นมิตรที่สุดในสิบเอ็ดมิติเลยล่ะ ข้าจัดเรียงตัวอักษรของพวกท่านให้แล้ว พวกท่านยังขาดอยู่ไม่กี่ตัว",
"งั้นเราจะไปตามหามันกัน เจ้าจะช่วยส่องทางให้เราไหม ผู้ดูแลตัวน้อย",
"ข้านึกว่าท่านจะไม่ถามซะแล้ว ระวังเพดานด้วยนะ มันชอบหัวเราะคิกคัก"
]
}
ถ้า ภาษา == 3 {
คืน [
"6장. 빛이 그들을 잊은 후, 길은 쉬었다",
"그들이 잃어버렸던 성의 조각들이 그들을 다시 찾아내어, 세계들 사이에 방을 하나 지었다",
"여기가... 어디지? 벽이 숨을 쉬고 있어",
"바닥이 색으로 노래하고 있어. 이 노래를 어디선가 아는데",
"그들이 세 세계에 떨어뜨린 글자들이 인내심 많은 달들처럼 그들 주위를 돌았다",
"그리고 그때, 따뜻한 어둠 속에서, 작은 무언가가 정중하게 헛기침을 했다",
"오! 손님들이시군요! 저는 사이의 다이몬이에요. 여러분이 떨어뜨린 글자들을 제가 보관하죠",
"부디 무서워하지 마세요. 두려움은 차와 함께 먹으면 정말 맛이 없거든요",
"악마라고? ...친절한 악마?",
"열한 개의 차원 중에서 가장 친절하답니다. 여러분의 알파벳을 정리해 두었어요. 몇 개가 빠져있더군요",
"그럼 우리가 그것들을 찾겠다. 길을 밝혀주겠니, 작은 수호자야?",
"물어보지 않으실 줄 알았어요. 천장을 조심하세요. 킥킥거리거든요"
]
}
ถ้า ภาษา == 4 {
คืน [
"第六章。光が彼らを忘れた後、道は休んだ",
"彼らが失っていた城の欠片が再び彼らを見つけ、世界と世界の間に一つの部屋を築いた",
"ここは……どこだ? 壁が呼吸している",
"床が色で歌っています。この歌、どこかで知っている気がします",
"彼らが三つの世界に落としてきた文字たちが、辛抱強い月のように彼らの周りを巡った",
"そしてその時、温かな闇の中から、小さな何かが丁寧に咳払いをした",
"おお! お客様ですね! 私は狭間のデーモンです。あなた方が落とした文字を私が保管しているんですよ",
"どうか怖がらないでください。恐怖はお茶と一緒だと、とてもまずい味がしますから",
"悪魔だと?……友好的な悪魔ということか?",
"十一次元で一番友好的ですとも。あなた方のアルファベットを整理しておきました。いくつか足りませんでしたけどね",
"それでは私たちが見つけましょう。道を照らしてくださいますか、小さな番人さん?",
"聞いてくださらないかと思っていましたよ。天井にはお気をつけて。くすくす笑いますから"
]
}
ถ้า ภาษา == 5 {
คืน [
"第六章。在那道光遗忘了他们之后,道路终于得以歇息",
"他们曾失去的城堡碎片再次找到了他们,并在世界之间筑起了一间房",
"我们……这是在哪里?墙壁在呼吸",
"地板正以色彩歌唱着。我似乎在哪里听过这首歌",
"他们在三个世界中遗落的字母,如耐心的月亮般绕着他们旋转",
"随后,从温暖的黑暗中,一个小小的东西礼貌地咳了一声",
"哦!客人来了!我是夹缝之间的精灵。你们掉落的字母,都由我保管着呢",
"请不要害怕。恐惧配茶喝起来,味道糟糕极了",
"一个恶魔?……一个友善的恶魔吗?",
"十一个维度里最友善的那个。我已经把你们的字母整理好了,还差那么几个呢",
"那我们就去把它们找回来。你愿意为我们照亮前路吗,小小的守护者?",
"我还以为你们不会问了呢。小心天花板,它会咯咯笑的"
]
}
คืน [
"chapter six. after the light forgot them, the road rested.",
"the castle pieces they had lost found them again, and built a room between worlds.",
"where... are we? the walls are breathing.",
"the floor is singing in colors. i know this song from somewhere.",
"the letters they had dropped in three worlds orbited them like patient moons.",
"and then, out of the warm dark, something small politely coughed.",
"oh! guests! i am the daemon of the in-between. i keep the letters you drop.",
"please do not be afraid. fear tastes terrible with tea.",
"a demon? ...a friendly one?",
"friendliest in eleven dimensions. i sorted your alphabet. you are missing a few.",
"then we will find them. will you light the way, little keeper?",
"i thought you would never ask. mind the ceiling. it giggles."
]
}
ฟังก์ชัน ฉากบทหก_ผู้พูด() {
คืน [0, 0, 1, 2, 0, 0, 3, 3, 1, 3, 2, 3] # 3 = เดมอนใจดี (สีทองอุ่น)
}
# รหัสผู้พูดสำหรับพากย์เสียง (ต้องตรงกับ tools/voiceover/manifest.py ทุกตัวอักษร)
ฟังก์ชัน ฉากบทหก_ผู้พูดรหัส() {
คืน ["narrator", "narrator", "king", "queen", "narrator", "narrator", "daemon", "daemon", "king", "daemon", "queen", "daemon"]
}
# ระยะเวลาเล่นต่อบรรทัด (วิ) ตามภาษาพากย์เสียงจริง (วัดจาก tools/voiceover/
# progress.json ตอนอัด) — ให้ฉากรอเสียงพากย์จบก่อนตัดบรรทัด แทนจังหวะตายตัว
# 4.4 วิ/บรรทัด เดิม ภาษาที่ยังไม่มีเสียงพากย์ (ทุกภาษายกเว้น en ตอนนี้) ใช้
# จังหวะเดิมไปก่อน — คงพฤติกรรมเดิมทุกอย่างจนกว่าจะอัดเสียงภาษานั้นเสร็จ
ฟังก์ชัน ฉากบทหก_ระยะเวลา(lang) {
ถ้า lang == "ko" { คืน [5.30, 8.10, 5.30, 6.26, 7.14, 7.14, 9.86, 5.70, 3.62, 11.06, 7.22, 6.82] }
ถ้า lang == "ja" { คืน [5.70, 9.14, 6.50, 6.34, 7.78, 8.42, 10.02, 7.30, 4.50, 10.42, 7.30, 7.70] }
ถ้า lang == "zh" { คืน [5.78, 6.98, 3.94, 5.30, 5.86, 5.38, 7.94, 3.78, 3.78, 6.82, 5.94, 5.46] }
ถ้า lang == "daemon" { คืน [4.34, 12.50, 5.78, 5.78, 8.18, 4.74, 11.86, 7.86, 3.22, 8.58, 6.82, 7.14] }
ถ้า lang == "th" { คืน [4.36, 6.12, 3.50, 4.82, 5.44, 4.64, 7.10, 5.04, 3.14, 6.48, 6.14, 4.54] }
ถ้า lang == "en" { คืน [4.74, 4.82, 3.46, 4.98, 4.58, 4.42, 6.02, 3.38, 2.10, 5.54, 6.26, 5.30] }
คืน [4.40, 4.40, 4.40, 4.40, 4.40, 4.40, 4.40, 4.40, 4.40, 4.40, 4.40, 4.40]
}
ฟังก์ชัน ฉากบทหก_สีวน(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)]
}
# เดมอนน้อยใจดี (โฉม DMT): ตัวกลมสีวนรุ้ง + เปลือกเงาซ้อน + วงมันดาลาหมุนสวนทาง
# + ตาที่สาม + เขา/ปีกไล่เฟสสี — ตาทอง+ยิ้มอุ่นคงไว้ (ให้ยังอ่านว่า "ใจดี")
# ⚠ ลำดับวาดสำคัญ (z-buffer เปิด): ของทึบก่อน → เปลือกเรือง/ออร่าทีหลังสุด
# ปรากฏ = 0..1 (สเกลป๊อปเข้า) · ทัก = 1.0 → โบกมือเส้นเล็ก
# สามเหลี่ยมสองหน้า — เวกเตอร์ขวาของระนาบหน้าพลิกเครื่องหมายเมื่อกล้องข้ามไปอีกฝั่ง
# วาดซ้ำสลับลำดับจุดไว้ backface culling จึงกินหน้าเดมอนไม่ได้ไม่ว่ามุมไหน
ฟังก์ชัน ฉากบทหก_สองหน้า(ax, ay, az, bx, by, bz, cx, cy, cz) {
วาดสามเหลี่ยม3มิติ(ax, ay, az, bx, by, bz, cx, cy, cz)
วาดสามเหลี่ยม3มิติ(bx, by, bz, ax, ay, az, cx, cy, cz)
}
# camX/camZ = ตำแหน่งกล้องของเฟรมนั้น — ใช้กางระนาบใบหน้าให้หันตามกล้องเสมอ
ฟังก์ชัน ฉากบทหก_วาดเดมอน(dx, dy, dz, ปรากฏ, ทัก, t, camX, camZ) {
ถ้า ปรากฏ <= 0.02 { คืน 0 }
bind ds = 2.4 * ปรากฏ
bind bob = ไซน์(t*1.6) * 0.5
bind ยิ้มเอียง = ไซน์(t*0.9) * 0.12 # เอียงหัวน่ารัก
bind y = dy + bob
# ── มันดาลาหลังตัว: วงเส้น 2 ชั้นหมุนสวนทาง สีวน (เรขาศักดิ์สิทธิ์ DMT) ──
โหมดผสม(1)
bind มด = 0
ขณะที่ มด < 12 {
bind ma0 = มด * 0.5236 + t*0.9; bind ma1 = (มด+1) * 0.5236 + t*0.9
bind mc1 = ฉากบทหก_สีวน(มด*0.52 + t*2.2)
สีดินสอ(list_get(mc1,0), list_get(mc1,1), list_get(mc1,2))
วาดเส้น3มิติ(dx + โคไซน์(ma0)*ds*2.3, y + ไซน์(ma0)*ds*2.3, dz + 1.2,
dx + โคไซน์(ma1)*ds*2.3, y + ไซน์(ma1)*ds*2.3, dz + 1.2)
bind mb0 = 0.0 - มด * 0.5236 - t*0.6; bind mb1 = 0.0 - (มด+1) * 0.5236 - t*0.6
bind mc2 = ฉากบทหก_สีวน(มด*0.52 + t*2.2 + 3.1)
สีดินสอ(floor(list_get(mc2,0)*0.7), floor(list_get(mc2,1)*0.7), floor(list_get(mc2,2)*0.7))
วาดเส้น3มิติ(dx + โคไซน์(mb0)*ds*3.1, y + ไซน์(mb0)*ds*3.1, dz + 1.6,
dx + โคไซน์(mb1)*ds*3.1, y + ไซน์(mb1)*ds*3.1, dz + 1.6)
bind มด = มด + 1
}
flush_3d(); โหมดผสม(0)
# ── ตัว (ทึบก่อน): ทรงกลมหมึกแบน สีวนรุ้งสด ──
set_flat_shade(1.0)
bind ตค = ฉากบทหก_สีวน(t*1.4)
สีดินสอ(floor(list_get(ตค,0)*0.72), floor(list_get(ตค,1)*0.62), floor(list_get(ตค,2)*0.78))
sphere(dx, y, dz, ds, ds*1.08, ds, 0.0, ยิ้มเอียง, 0.0, 0, 14, 11)
flush_3d()
# เขาเล็กสองข้าง (โค้งเข้า) — ไล่เฟสสีตาม
bind ขค = ฉากบทหก_สีวน(t*1.4 + 1.3)
สีดินสอ(list_get(ขค,0), list_get(ขค,1), list_get(ขค,2))
cylinder(dx - ds*0.55, y - ds*0.95, dz, ds*0.13, ds*0.5, ds*0.13, 0.0-0.4, 0.0, 0.3, 0, 8)
cylinder(dx + ds*0.55, y - ds*0.95, dz, ds*0.13, ds*0.5, ds*0.13, 0.4, 0.0, 0.0-0.3, 0, 8)
flush_3d()
# หน้า: ตาทองโตสองดวง + ยิ้มพาราโบลาโค้ง "ขึ้น"
# ── ระนาบใบหน้าหันตามกล้องเสมอ ─────────────────────────────────────────────
# เดิมตรึงไว้ที่ fz = dz - ds*0.85 (หันไป -z ตายตัว) ซึ่งถูกเฉพาะฉากบทหกที่กล้อง
# อยู่ฝั่ง -z ตลอด แต่ฟังก์ชันนี้ถูกใช้ซ้ำโดยบท 7/8 และไฟนอล 1-3 ที่กล้องวนไป
# อีกฝั่ง หน้าเดมอนจึงหันหนีกล้อง (บท 7 ช็อตบินเข้าหน้าตรง ~19 วิ, บท 8 ~21 วิ)
# และฉากที่เปิด set_depth_test หน้าถูกบังมิดไปเลย ไม่ใช่แค่กลับด้าน
bind ดวx = camX - dx; bind ดวz = camZ - dz
bind ดวl = รากที่สอง(ดวx*ดวx + ดวz*ดวz); ถ้า ดวl < 0.001 { bind ดวl = 0.001 }
bind nfx = ดวx/ดวl; bind nfz = ดวz/ดวl # หน่วยเวกเตอร์ชี้เข้าหากล้อง
bind rfx = 0.0 - nfz; bind rfz = nfx # เวกเตอร์ขวาบนระนาบหน้า
bind fbx = dx + nfx*ds*0.85; bind fbz = dz + nfz*ds*0.85 # ศูนย์กลางระนาบหน้า
bind กะพริบ = 1.0
bind bl = (t*0.31) - ปัดลง(t*0.31)
ถ้า bl > 0.94 { bind กะพริบ = 0.15 } # กะพริบตานาน ๆ ครั้ง
สีดินสอ(255, 208, 90)
ฉากบทหก_สองหน้า(fbx - rfx*ds*0.42, y - ds*0.30, fbz - rfz*ds*0.42,
fbx - rfx*ds*0.12, y - ds*0.30, fbz - rfz*ds*0.12,
fbx - rfx*ds*0.27, y - ds*(0.30 + 0.34*กะพริบ), fbz - rfz*ds*0.27)
ฉากบทหก_สองหน้า(fbx + rfx*ds*0.42, y - ds*0.30, fbz + rfz*ds*0.42,
fbx + rfx*ds*0.12, y - ds*0.30, fbz + rfz*ds*0.12,
fbx + rfx*ds*0.27, y - ds*(0.30 + 0.34*กะพริบ), fbz + rfz*ds*0.27)
# ตาที่สาม (หน้าผาก): สามเหลี่ยมเล็กสีวน
bind ตส = ฉากบทหก_สีวน(t*3.0)
bind ตสข = 0.10 + ไซน์(t*2.6)*0.035
สีดินสอ(list_get(ตส,0), list_get(ตส,1), list_get(ตส,2))
ฉากบทหก_สองหน้า(fbx - rfx*ds*ตสข, y - ds*0.72, fbz - rfz*ds*ตสข,
fbx + rfx*ds*ตสข, y - ds*0.72, fbz + rfz*ds*ตสข,
fbx, y - ds*(0.72 + 0.22), fbz)
flush_3d()
bind sm = 0
ขณะที่ sm < 8 {
bind sx0 = (sm/8.0 - 0.5) * ds * 0.9
bind sx1 = ((sm+1)/8.0 - 0.5) * ds * 0.9
สีดินสอ(255, 170, 120)
วาดเส้น3มิติ(fbx + rfx*sx0, y + ds*0.28 - (sx0*sx0)/(ds*0.9), fbz + rfz*sx0,
fbx + rfx*sx1, y + ds*0.28 - (sx1*sx1)/(ds*0.9), fbz + rfz*sx1)
bind sm = sm + 1
}
# ปีกจิ๋วกระพือ — ไล่เฟสสีวน
bind แฟลบ = ไซน์(t*7.0) * 0.5 + 0.6
bind ปค = ฉากบทหก_สีวน(t*1.4 + 2.7)
สีดินสอ(floor(list_get(ปค,0)*0.8), floor(list_get(ปค,1)*0.8), floor(list_get(ปค,2)*0.8))
วาดสามเหลี่ยม3มิติ(dx - ds*0.9, y, dz + 0.3, dx - ds*(0.9 + 0.75*แฟลบ), y - ds*0.55*แฟลบ, dz + 0.5, dx - ds*0.9, y - ds*0.4, dz + 0.3)
วาดสามเหลี่ยม3มิติ(dx + ds*0.9, y, dz + 0.3, dx + ds*(0.9 + 0.75*แฟลบ), y - ds*0.55*แฟลบ, dz + 0.5, dx + ds*0.9, y - ds*0.4, dz + 0.3)
flush_3d()
set_flat_shade(0.0)
# โบกมือ (ตอนแนะนำตัว): แขนเส้นเล็กแกว่ง
ถ้า ทัก > 0.5 {
bind wv = ไซน์(t*6.5) * 0.6
สีดินสอ(220, 190, 240)
วาดเส้น3มิติ(dx + ds*0.8, y + ds*0.15, dz, dx + ds*(1.3 + wv*0.2), y - ds*(0.4 + wv*0.3), dz)
flush_3d()
}
# ── เปลือกเงา + ออร่า "ทีหลังสุด" (additive บนตัวทึบ — ห้ามวาดก่อน ไม่งั้น z บังตัวจริง) ──
โหมดผสม(1)
set_flat_shade(1.0)
bind ชล1 = ฉากบทหก_สีวน(t*1.4 + 2.1)
สีดินสอ(floor(list_get(ชล1,0)*0.20), floor(list_get(ชล1,1)*0.20), floor(list_get(ชล1,2)*0.20))
sphere(dx, y, dz + ds*0.55, ds*1.24, ds*1.32, ds*1.24, 0.0, 0.0-ยิ้มเอียง, 0.0, 0, 12, 9)
bind ชล2 = ฉากบทหก_สีวน(t*1.4 + 4.2)
สีดินสอ(floor(list_get(ชล2,0)*0.11), floor(list_get(ชล2,1)*0.11), floor(list_get(ชล2,2)*0.11))
sphere(dx, y, dz + ds*0.7, ds*1.5, ds*1.6, ds*1.5, 0.0, ยิ้มเอียง*1.6, 0.0, 0, 12, 9)
flush_3d()
set_flat_shade(0.0)
bind auCol = วนสีอ่อน(190, 140, 90, t*1.5, 0.40)
อนุภาคทรงกลม(dx, y, dz + ds*0.8, ds*1.45, 8, t*2.2, list_get(auCol,0), list_get(auCol,1), list_get(auCol,2))
flush_3d(); โหมดผสม(0)
แอ่งแสง(dx, 0.5, dz, ds*2.6, 255, 180, 110, 0.4*ปรากฏ)
คืน 0
}
# พารามิเตอร์จาก main · p0..p4 = ชิ้นวัง (ห้องทริป) · เพลงฉาก = HealthyHell
ฟังก์ชัน เล่นฉากบทหก(t, บทหกเริ่ม, บทหกสถานะ, musicOn, ปริมาณBGM, ปริมาณSFX, เพลงฉาก, ยาวเพลงฉาก, kCutMesh, qCutMesh, p0, p1, p2, p3, p4, liq, ภาษา, แสดงบทพูด, ภาษาบทพูด, ระยะเวลาไดนามิก) {
bind บทพูด = ฉากบทหก_บทพูด(ภาษาแสดงผล(ภาษา))
bind บทพูดกลิฟ = ฉากบทหก_บทพูดกลิฟ(ภาษาบทพูด)
bind ไฮไลท์c6i = ฉากบทหก_บทพูดไฮไลท์(ภาษาบทพูด)
bind ผู้พูด = ฉากบทหก_ผู้พูด()
bind ผู้พูดรหัส = ฉากบทหก_ผู้พูดรหัส()
bind บทหกระยะเวลา = ระยะเวลาไดนามิก
bind c6t = t - บทหกเริ่ม
bind C6N = ความยาว(บทพูด)
# ── ตารางเวลาสะสม: c6cum[i] = เวลาเริ่มบรรทัด i (แทนสูตร i*C6SEC ตายตัวเดิม) ──
bind c6cum = [0.0]
bind cci = 0
ขณะที่ cci < C6N {
bind c6cum = list_push(c6cum, list_get(c6cum, cci) + list_get(บทหกระยะเวลา, cci))
bind cci = cci + 1
}
bind C6TOTAL = list_get(c6cum, C6N)
bind C6END = C6TOTAL + 3.0 # หาง 3 วิ: เล่นค้าง + เฟดดำ + กล้องถอย
bind C6FADE = 0.0
ถ้า c6t > C6END - 3.2 { bind C6FADE = (c6t - (C6END - 3.2)) / 3.2 }
ถ้า C6FADE > 1.0 { bind C6FADE = 1.0 }
bind c6i = 0
bind c6scan = 1
ขณะที่ c6scan == 1 {
ถ้า c6i >= C6N - 1 { bind c6scan = 0 }
มิฉะนั้น { ถ้า c6t < list_get(c6cum, c6i + 1) { bind c6scan = 0 }
มิฉะนั้น { bind c6i = c6i + 1 } }
}
bind C6SEC = list_get(บทหกระยะเวลา, c6i) # ระยะเวลาบรรทัดปัจจุบัน (ยังใช้เป็นค่าประมาณจังหวะทั่วไปด้านล่าง)
bind ดำ = 1.0 - C6FADE
bind บรรทัดก่อน = 0.0 - 1.0
ถ้า บทหกสถานะ >= 0.0 { bind บรรทัดก่อน = ปัดลง(บทหกสถานะ / 1000.0) }
ถ้า musicOn == 1 {
ถ้า ยาวเพลงฉาก > 1.0 {
ถ้า ตำแหน่งเพลง() >= ยาวเพลงฉาก - 0.5 { ค้นหาเพลง(0); เล่นเพลง(เพลงฉาก) }
}
ระดับเพลง(ปริมาณBGM * 0.8 * 0.33 * ดำ) # หรี่ BGM เหลือ 1/3 ระหว่างคัตซีน — เสียงพากย์ต้องเด่นกว่า
}
# โดรนอุ่นต่ำ (ห้องหายใจ)
bind humW = 0.045 * ปริมาณSFX * ดำ * (1.0 + ไซน์(c6t*0.55)*0.3)
เสียงโทน(15, 0.0, 0.0, 0.0, 1.0, 55.0, humW, 0.0, 0.0)
เบลอเฟรม(0.958) # หางแสงค้าง ~1.25 วิ (decay+max)
set_depth_test(1) # z-buffer จริง: เดมอน/ตัวละคร/ฉากบังกันถูกต้อง
เติม(floor(10.0*ดำ), floor(4.0*ดำ), floor(16.0*ดำ))
# ── เดมอนปรากฏ (บรรทัด 6): ป๊อปสเกลเด้ง ──
bind t6 = list_get(c6cum, 6)
bind t4 = list_get(c6cum, 4)
bind ปรากฏ = 0.0
ถ้า c6t > t6 - 0.6 {
bind ปรากฏ = (c6t - (t6 - 0.6)) / 0.9
ถ้า ปรากฏ > 1.0 { bind ปรากฏ = 1.0 }
bind ปรากฏ = ปรากฏ * (1.0 + ไซน์(ปรากฏ*3.1416)*0.25) # เด้ง overshoot
}
bind ทัก = 0.0; ถ้า c6i == 6 { bind ทัก = 1.0 }; ถ้า c6i == 9 { bind ทัก = 1.0 }
# ── ตำแหน่งคู่ + เดมอน ──
bind กายสูง = 6.2
bind kx = 0.0 - 2.8; bind ky = 0.0 - 1.5 + ไซน์(c6t*0.7)*0.6; bind kz = 0.0 - 2.0
bind qx = 2.8; bind qy = 0.0 - 1.5 + ไซน์(c6t*0.7 + 1.5)*0.6; bind qz = 0.0 - 2.0
bind dmx = 0.0; bind dmy = 0.0 - 7.2; bind dmz = 7.0
bind kyaw = 0.35; bind qyaw = 0.0 - 0.35 # หันเฉียงเข้าหากัน
ถ้า c6t > t6 { bind kyaw = 0.12; bind qyaw = 0.0 - 0.12 } # หันหาเดมอน
# ── แสง: อุ่นกลางห้อง + ไฟคู่ + เดมอนทอง ──
ล้างแสง()
ตั้งแสงรอบข้าง(0.26 * ดำ + 0.05)
เพิ่มแสง(0.0, 0.0-16.0, 2.0, 0.9, 0.7, 1.0, 1.1*ดำ, 80.0)
เพิ่มแสง(kx, ky - 6.0, kz, 0.35, 0.55, 1.0, 0.9*ดำ, 30.0)
เพิ่มแสง(qx, qy - 6.0, qz, 1.0, 0.45, 0.65, 0.9*ดำ, 30.0)
ถ้า ปรากฏ > 0.0 { เพิ่มแสง(dmx, dmy - 2.0, dmz, 1.0, 0.75, 0.4, 1.3*ปรากฏ*ดำ, 40.0) }
# ── กล้องดริฟต์ช้ามาก: วง → เข้าใกล้ → หันหาเดมอน → ทูช็อตท้าย ──
bind camX = ไซน์(c6t*0.11)*7.0
bind camY = 0.0 - 6.5 + โคไซน์(c6t*0.13)*1.4
bind camZ = 0.0 - 13.0
bind lookX = 0.0; bind lookY = 0.0 - 4.5; bind lookZ = 2.0
ถ้า c6t > t4 { ถ้า c6t <= t6 {
bind s2 = (c6t - t4) / (t6 - t4)
bind camZ = 0.0 - 13.0 + s2*2.5
bind camY = 0.0 - 6.5 + s2*1.0
} }
ถ้า c6t > t6 { ถ้า c6i < 9 {
bind camX = 0.0 - 4.5; bind camY = 0.0 - 8.2; bind camZ = 0.0 - 4.5 # มุมเฉียงระดับตา — ไม่ให้ราชา/ยอดวังบังเลนส์ (z-buffer)
bind lookX = dmx; bind lookY = dmy - 0.3; bind lookZ = dmz
} }
ถ้า c6i >= 9 {
bind camX = ไซน์(c6t*0.09)*3.0; bind camY = 0.0 - 7.5; bind camZ = 0.0 - 11.5
bind lookX = 0.0; bind lookY = 0.0 - 5.0; bind lookZ = 3.5
}
ถ้า c6t > C6TOTAL { # หางเฟด: กล้องลอยขึ้น-ถอยช้า
bind หลังฉาก = c6t - C6TOTAL
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)
# ── ห้องทริปจากชิ้นวัง: พื้น p0 หายใจ · ยอด p3 หมุนกลับทางเหนือหัว · เศษเล็กโคจร ──
bind หายใจห้อง = 1.0 + ไซน์(c6t*0.7)*0.05
หมุนสีเมช(c6t*0.5, 0.9 + ไซน์(c6t*0.7)*0.3)
mesh_draw(p0, 0.0, 2.4, 18.0, 15.0*หายใจห้อง, 3.1416 + ไซน์(c6t*0.15)*0.1, 0.0, 0.0, 0.0, 0.0, 0.0)
หมุนสีเมช(c6t*0.5 + 2.1, 0.85 + โคไซน์(c6t*0.6)*0.3)
mesh_draw(p3, 0.0, 0.0 - 21.0 + ไซน์(c6t*0.4)*1.2, 13.0, 10.0, 0.0 - c6t*0.1, 0.0, 0.0, 0.0, 0.0, 0.0)
bind ชด = 0
ขณะที่ ชด < 6 {
bind ชม = p1
ถ้า ชด == 1 { bind ชม = p2 }; ถ้า ชด == 2 { bind ชม = p4 }
ถ้า ชด == 4 { bind ชม = p2 }; ถ้า ชด == 5 { bind ชม = p4 }
bind ชa = ชด * 1.047 + c6t*0.07
bind ชร = 20.0 + ไซน์(c6t*0.3 + ชด)*1.5
หมุนสีเมช(c6t*0.5 + ชด*1.05, 0.9 + ไซน์(c6t*0.8 + ชด)*0.35)
mesh_draw(ชม, โคไซน์(ชa)*ชร, 0.0 - 4.0 + ไซน์(c6t*0.5 + ชด*1.3)*2.5, 6.0 + ไซน์(ชa)*ชร*0.6, 9.0, ชa + c6t*0.12, 0.0, 0.0, 0.0, 0.0, 0.0)
bind ชด = ชด + 1
}
หมุนสีเมช(0.0, 1.0)
flush_3d()
# ── วงแหวนอักขระเดมอน: ตัวอักษรที่ทำหล่นโคจรเหมือนดวงจันทร์ ──
โหมดผสม(1)
bind อก = 0
ขณะที่ อก < 10 {
bind อa = อก * 0.6283 + c6t*0.16
bind อร = 10.5 + ไซน์(c6t*0.4 + อก)*0.8
bind อCol = ฉากบทหก_สีวน(อก*0.63 + c6t*0.9)
สีดินสอ(list_get(อCol,0), list_get(อCol,1), list_get(อCol,2))
วาดกลิฟ3มิติ((อก*3 + 1) - ปัดลง((อก*3 + 1)/26.0)*26.0, โคไซน์(อa)*อร, 0.0 - 5.0 + ไซน์(c6t*0.6 + อก*0.8)*1.8, 5.0 + ไซน์(อa)*อร*0.55, c6t*0.5 + อก, 1.15)
bind อก = อก + 1
}
# โมทแสงลิสซาจู (สิ่งมีชีวิตแสงของห้อง)
bind มท = 0
ขณะที่ มท < 8 {
bind มCol = ฉากบทหก_สีวน(มท*1.1 + c6t*1.3)
อนุภาคทรงกลม(ไซน์(c6t*0.5 + มท*1.4)*8.5, 0.0 - 6.0 + ไซน์(c6t*0.9 + มท*2.2)*3.5, 5.0 + ไซน์(c6t*0.7 + มท*0.9 + 1.5)*6.0, 0.8, 5, c6t*3.0 + มท, list_get(มCol,0), list_get(มCol,1), list_get(มCol,2))
bind มท = มท + 1
}
flush_3d(); โหมดผสม(0)
# แอ่งแสงพื้นสีวน (พื้นร้องเพลงเป็นสี)
bind พCol = ฉากบทหก_สีวน(c6t*0.8)
แอ่งแสง(0.0, 2.2, 4.0, 12.0 + ไซน์(c6t*0.7)*2.0, list_get(พCol,0), list_get(พCol,1), list_get(พCol,2), 0.35*ดำ)
แอ่งแสง(kx, 2.2, kz, 6.5, 90, 140, 255, 0.4*ดำ)
แอ่งแสง(qx, 2.2, qz, 6.5, 255, 115, 165, 0.4*ดำ)
# ── คู่สหาย: ลอยช้า ท่าพัก + ลูกของเหลว ──
bind หายใจ0 = ไซน์(c6t*1.0)*0.05
bind kArm = ไซน์(c6t*0.8)*0.07; bind qArm = ไซน์(c6t*0.85 + 1.2)*0.07
ถ้า c6i == 10 { bind qArm = 0.4 + ไซน์(c6t*1.2)*0.08 } # ราชินีเอื้อมถามเดมอน
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, กายสูง, kyaw, หายใจ0, kArm, 0.04, 0.0, 0.12)
mesh_draw(qCutMesh, qx, qy, qz, กายสูง, qyaw, 0.0-หายใจ0, qArm, 0.04, 0.0, 0.12)
flush_3d()
reset_material()
โหมดผสม(1)
liquid_step(liq, 0.016)
liquid_splat(liq, 28.0 + ไซน์(c6t*1.3)*13.0, 28.0 + โคไซน์(c6t*1.0)*13.0, 1.0, 0.17, 3.2)
liquid_splat(liq, 28.0 + โคไซน์(c6t*0.9)*11.0, 28.0 + ไซน์(c6t*1.2)*11.0, 0.0, 0.18, 3.0)
liquid_draw_surface(liq, 1.0, kx, ky - กายสูง*0.52, kz, กายสูง*0.6, กายสูง*0.6)
liquid_draw_surface(liq, 1.0, qx, qy - กายสูง*0.52, qz, กายสูง*0.6, กายสูง*0.6)
flush_3d(); โหมดผสม(0)
# ── เดมอนน้อยใจดี ──
ฉากบทหก_วาดเดมอน(dmx, dmy, dmz, ปรากฏ, ทัก, c6t, camX, camZ)
# ── เหตุการณ์ครั้งเดียวต่อบรรทัด ──
ถ้า c6i > บรรทัดก่อน {
ถ้า c6i < C6N {
bind whoN = list_get(ผู้พูด, c6i)
เล่นเสียงพากย์("chapter6", c6i, list_get(ผู้พูดรหัส, c6i), ภาษา, ปริมาณSFX)
ถ้า whoN < 0.5 { เล่นไชม์ใหญ่(0.0, 0.0, 0.0, 220.0, 0.18 * ปริมาณSFX) }
ถ้า whoN > 0.5 { ถ้า whoN < 1.5 { เล่นกาเมลัน(0.0, 0.0, 0.0, 196.0, 0.26 * ปริมาณSFX) } }
ถ้า whoN > 1.5 { ถ้า whoN < 2.5 { เล่นแฟนแฟร์(0.0, 0.0, 0.0, 174.6, 0.2 * ปริมาณSFX) } }
ถ้า whoN > 2.5 { # เดมอน: ฮังแพนอุ่น + ไชม์หัวเราะจิ๋ว
เล่นฮังแพน(dmx, dmy, dmz, 330.0, 0.24 * ปริมาณSFX)
เล่นไชม์ใหญ่(dmx, dmy - 1.0, dmz, 1046.5, 0.10 * ปริมาณSFX)
}
ถ้า c6i == 6 { # เดมอนโผล่: ป๊อป + ประกาย + ฆ้องนุ่ม
เสียงเอฟเฟกต์(dmx, dmy, dmz, 1.0, 520.0, 0.22*ปริมาณSFX, 0.12, "sine")
เสียงเอฟเฟกต์(dmx, dmy, dmz, 1.0, 1560.0, 0.14*ปริมาณSFX, 0.4, "triangle")
เล่นฆ้อง(dmx, dmy, dmz, 130.8, 0.2 * ปริมาณSFX)
}
ถ้า c6i == 11 { # เพดานหัวเราะคิก ๆ
เล่นไชม์ใหญ่(0.0, 0.0-14.0, 8.0, 1318.5, 0.12 * ปริมาณSFX)
เล่นไชม์ใหญ่(0.0, 0.0-14.0, 8.0, 1568.0, 0.10 * ปริมาณSFX)
}
}
bind บรรทัดก่อน = c6i
}
# ── ตัวหนังสือ (เดมอน = ทองอุ่น) ──
set_depth_test(0) # ข้อความ overlay ไม่ใช้ z ฉากโลก
ตั้งกล้องมอง(0.0, 0.0, -22.0, 0.0, 0.0, 0.0)
ตั้งระยะห่าง(2.8)
สีดินสอ(floor(210*ดำ+18), floor(185*ดำ+16), floor(240*ดำ+20))
วาดสตริง("chapter 6 : the room between worlds", 0.0, 10.0, 0.0, 0.62, 1)
ถ้า c6i < C6N {
bind line6 = list_get(บทพูด, c6i)
bind line6กลิฟ = list_get(บทพูดกลิฟ, c6i)
bind hlc6i = list_get(ไฮไลท์c6i, c6i)
bind who6 = list_get(ผู้พูด, c6i)
bind lt = c6t - list_get(c6cum, c6i)
bind laf = 1.0
ถ้า lt < 0.7 { bind laf = lt / 0.7 }
ถ้า lt > C6SEC - 0.8 { bind laf = (C6SEC - lt) / 0.8 }
ถ้า 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)
ถ้า who6 > 0.5 { ถ้า who6 < 1.5 { bind lr = floor(255.0*laf); bind lg = floor(218.0*laf); bind lb = floor(128.0*laf) } }
ถ้า who6 > 1.5 { ถ้า who6 < 2.5 { bind lr = floor(212.0*laf); bind lg = floor(222.0*laf); bind lb = floor(255.0*laf) } }
ถ้า who6 > 2.5 { bind lr = floor(255.0*laf); bind lg = floor(196.0*laf); bind lb = floor(96.0*laf) }
ถ้า แสดงบทพูด == 1 {
วาดสตริงบทพูดบากขอบ(line6กลิฟ, ภาษาบทพูด, 0.0, 8.3, 0.0, 0.61)
วาดสตริงบทพูดบากสี(line6กลิฟ, ภาษาบทพูด, 0.0, 8.3, 0.0, 0.61, lr, lg, lb, list_get(hlc6i,0), list_get(hlc6i,1), list_get(hlc6i,2), list_get(hlc6i,3), list_get(hlc6i,4))
}
}
สีดินสอ(floor(170*ดำ), floor(180*ดำ), floor(205*ดำ))
วาดสตริง("[enter/space] continue [esc] skip", 0.0, 10.9, 0.0, 0.42, 1)
flush_3d()
แสดงผล()
bind outC6 = 0.0
ถ้า c6t >= C6END { bind outC6 = 1.0 }
# กันข้ามโดยไม่ตั้งใจ: ไม่รับปุ่มข้าม (คีย์บอร์ด+จอย) ช่วง 5 วิแรกของฉาก
ถ้า c6t > 5.0 {
ถ้า กดปุ่ม("enter") { bind outC6 = 1.0 }
ถ้า กดปุ่ม("space") { bind outC6 = 1.0 }
ถ้า กดปุ่ม("escape") { bind outC6 = 1.0 }
ถ้า จอยปุ่ม("a") { bind outC6 = 1.0 }
ถ้า จอยปุ่ม("start") { bind outC6 = 1.0 }
}
ถ้า outC6 > 0.5 {
เบลอเฟรม(0.0)
เสียงโทน(15, 0.0, 0.0, 0.0, 1.0, 55.0, 0.0, 0.0, 0.0)
}
คืน [บรรทัดก่อน*1000.0, outC6]
}