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)
cutscenes_all_preview.ling
# ─────────────────────────────────────────────────────────────────────────────
# cutscenes_all_preview.ling — เล่นคัตซีนทั้งเรื่องต่อเนื่องในหน้าต่างเดียว
# ลำดับ: อินโทร → บทโหมโรง (post_level1) → บท 1-8 → โบนัส → ไฟนอล 1-3
# รัน: ling run --interp cutscenes_all_preview.ling [--lang en|th|ko|ja|zh] [--sub en|th|ko|ja|zh|daemon]
# (ไม่ระบุ --lang = en. ถ้ายังไม่มีไฟล์เสียงพากย์ภาษานั้น ๆ ฉากจะเงียบเฉพาะเสียงพากย์
# แต่ยังเล่นต่อได้ปกติ — ดู game/voice/<scene>/ ว่ามีไฟล์ _<lang>.wav ครบหรือยัง)
# --sub เลือกภาษาบทพูดบนจอแยกจาก --lang (เสียงพากย์) — ใช้พรีวิวคู่ dub/sub ที่
# ไม่ตรงกันได้ (เช่น เสียงเกาหลี ซับไทย) ไม่ระบุ = ใช้ค่าเดียวกับ --lang
# ต่อฉาก: [enter/space/esc/จอย A/Start] ข้ามฉากปัจจุบันได้หลัง 5 วิ
# ⚠ บท 5/8 มีไฟกะพริบถี่ตามที่ออกแบบ
# ─────────────────────────────────────────────────────────────────────────────
ใช้ "music/songs"
ใช้ "music/Seraph_data"
ใช้ "instruments/gong"
ใช้ "instruments/yinyang"
ใช้ "instruments/chime"
ใช้ "instruments/gamelan"
ใช้ "instruments/fanfare"
ใช้ "game/queen_model"
ใช้ "game/title"
ใช้ "game/voice"
ใช้ "game/dialogue_font"
ใช้ "music/Festival_data"
ใช้ "game/scenes/intro"
ใช้ "game/scenes/post_level1"
ใช้ "game/scenes/chapter1"
ใช้ "game/scenes/chapter2"
ใช้ "game/scenes/chapter3"
ใช้ "game/scenes/chapter4"
ใช้ "game/scenes/chapter5"
ใช้ "game/scenes/chapter6"
ใช้ "game/scenes/chapter7"
ใช้ "game/scenes/chapter8"
ใช้ "game/scenes/bonus"
ใช้ "game/scenes/finale1"
ใช้ "game/scenes/finale2"
ใช้ "game/scenes/finale3"
# คำนวณระยะเวลาไดนามิกครั้งเดียวก่อนเข้าลูปเฟรม (โหลดไฟล์เสียงพากย์ N ครั้ง —
# แพงถ้าทำทุกเฟรม) ต่อบทตาม ผู้พูดรหัส/ระยะเวลา ของแต่ละไฟล์ scenes/chapterN.ling
ฟังก์ชัน ระยะเวลาไดนามิกของบท(บท, ภาษาพรีวิว) {
bind lang = รหัสภาษาเสียง(ภาษาพรีวิว)
ถ้า บท == 0 { คืน ระยะเวลาเสียงพากย์ฉาก("post_level1", โพสต์เลเวล1_ผู้พูดรหัส(), ภาษาพรีวิว, โพสต์เลเวล1_ระยะเวลา(lang)) }
ถ้า บท == 13 { คืน ระยะเวลาเสียงพากย์ฉาก("intro", บทกวี_ผู้พูดรหัส(), ภาษาพรีวิว, บทกวี_ระยะเวลา(lang)) }
ถ้า บท == 1 { คืน ระยะเวลาเสียงพากย์ฉาก("chapter1", ฉากบทหนึ่ง_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากบทหนึ่ง_ระยะเวลา(lang)) }
ถ้า บท == 2 { คืน ระยะเวลาเสียงพากย์ฉาก("chapter2", ฉากบทสอง_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากบทสอง_ระยะเวลา(lang)) }
ถ้า บท == 3 { คืน ระยะเวลาเสียงพากย์ฉาก("chapter3", ฉากบทสาม_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากบทสาม_ระยะเวลา(lang)) }
ถ้า บท == 4 { คืน ระยะเวลาเสียงพากย์ฉาก("chapter4", ฉากบทสี่_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากบทสี่_ระยะเวลา(lang)) }
ถ้า บท == 5 { คืน ระยะเวลาเสียงพากย์ฉาก("chapter5", ฉากบทห้า_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากบทห้า_ระยะเวลา(lang)) }
ถ้า บท == 6 { คืน ระยะเวลาเสียงพากย์ฉาก("chapter6", ฉากบทหก_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากบทหก_ระยะเวลา(lang)) }
ถ้า บท == 7 { คืน ระยะเวลาเสียงพากย์ฉาก("chapter7", ฉากบทเจ็ด_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากบทเจ็ด_ระยะเวลา(lang)) }
ถ้า บท == 8 { คืน ระยะเวลาเสียงพากย์ฉาก("chapter8", ฉากบทแปด_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากบทแปด_ระยะเวลา(lang)) }
ถ้า บท == 10 { คืน ระยะเวลาเสียงพากย์ฉาก("finale1", ฉากไฟนอล1_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากไฟนอล1_ระยะเวลา(lang)) }
ถ้า บท == 11 { คืน ระยะเวลาเสียงพากย์ฉาก("finale2", ฉากไฟนอล2_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากไฟนอล2_ระยะเวลา(lang)) }
ถ้า บท == 12 { คืน ระยะเวลาเสียงพากย์ฉาก("finale3", ฉากไฟนอล3_ผู้พูดรหัส(), ภาษาพรีวิว, ฉากไฟนอล3_ระยะเวลา(lang)) }
คืน [] # บท 9 (โบนัส): เล่นฉากโบนัส คำนวณระยะเวลาของตัวเองภายใน ไม่ใช้ค่านี้
}
# เล่นหนึ่งบท: วนเรียกฟังก์ชันฉากจนจบ/ข้าม · คืน 0
ฟังก์ชัน เล่นบทเดียว(บท, km, qm, w0, w1, w2, w3, w4, liq, เพลง, ยาวเพลง, เพลงพ่วง, ภาษาพรีวิว, ภาษาบทพูดพรีวิว) {
ถ้า musicOn_ทั้งชุด() == 1 { เล่นเพลง(เพลง); ระดับเพลง(0.6) }
bind ระยะเวลาไดนามิก = ระยะเวลาไดนามิกของบท(บท, ภาษาพรีวิว)
bind เริ่ม = เวลาปัจจุบัน()
bind สถ = 0.0 - 1.0
bind ธาตุนับ = 0 # บท 0: โคมธาตุที่จุดเสียงไปแล้ว
bind purified = 0; bind flashAmt = 0.0 # บท 13: สติง purify + แฟลชจังหวะ
bind จบ = 0.0
ขณะที่ จบ < 0.5 {
ถ้า หน้าต่างเปิดอยู่() {
bind tt = เวลาปัจจุบัน() - เริ่ม
bind ผล = [0.0, 1.0]
ถ้า บท == 0 { bind ผล = เล่นโพสต์เลเวล1(tt, 0.0, สถ, ธาตุนับ, 1, 0.6, 0.8, เพลง, ยาวเพลง, km, qm, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก)
bind ธาตุนับ = list_get(ผล, 1)
bind ผล = [list_get(ผล, 0), list_get(ผล, 2)]
}
ถ้า บท == 13 { bind ผล = เล่นฉากอินโทร(tt, 0.0, สถ, purified, flashAmt, 1, 0.6, 0.8, เพลง, 256.0, km, qm, liq, 1.0, [523.0, 587.0, 659.0, 784.0, 880.0], ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก)
bind purified = list_get(ผล, 1)
bind flashAmt = list_get(ผล, 2)
bind ผล = [list_get(ผล, 0), list_get(ผล, 3)]
}
ถ้า บท == 1 { bind ผล = เล่นฉากบทหนึ่ง(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, km, qm, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
ถ้า บท == 2 { bind ผล = เล่นฉากบทสอง(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, km, qm, w0, w3, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
ถ้า บท == 3 { bind ผล = เล่นฉากบทสาม(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, เพลงพ่วง, km, qm, w0, w1, w2, w3, w4, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
ถ้า บท == 4 { bind ผล = เล่นฉากบทสี่(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, km, qm, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
ถ้า บท == 5 { bind ผล = เล่นฉากบทห้า(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, เพลงพ่วง, km, qm, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
ถ้า บท == 6 { bind ผล = เล่นฉากบทหก(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, km, qm, w0, w1, w2, w3, w4, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
ถ้า บท == 7 { bind ผล = เล่นฉากบทเจ็ด(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, km, qm, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
ถ้า บท == 8 { bind ผล = เล่นฉากบทแปด(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, km, qm, w0, w1, w2, w3, w4, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
ถ้า บท == 9 { bind ผล = เล่นฉากโบนัส(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว) }
ถ้า บท == 10 { bind ผล = เล่นฉากไฟนอล1(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, km, qm, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
ถ้า บท == 11 { bind ผล = เล่นฉากไฟนอล2(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, km, qm, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
ถ้า บท == 12 { bind ผล = เล่นฉากไฟนอล3(tt, 0.0, สถ, 1, 0.6, 0.8, เพลง, ยาวเพลง, km, qm, liq, ภาษาพรีวิว, 1, ภาษาบทพูดพรีวิว, ระยะเวลาไดนามิก) }
bind สถ = list_get(ผล, 0)
ถ้า list_get(ผล, 1) > 0.5 { bind จบ = 1.0 }
}
มิฉะนั้น { bind จบ = 1.0 }
}
หยุดเพลง()
เบลอเฟรม(0.0)
คืน 0
}
# รหัสภาษา (ตาม รหัสภาษาเสียง ใน game/voice.ling): 0 daemon, 1 english (ค่าเริ่มต้น), 2 thai, 3 korean, 4 japanese, 5 chinese
ฟังก์ชัน รหัสจากคำ(lv) {
ถ้า lv == "daemon" { คืน 0 }
ถ้า lv == "th" { คืน 2 }
ถ้า lv == "ko" { คืน 3 }
ถ้า lv == "ja" { คืน 4 }
ถ้า lv == "zh" { คืน 5 }
คืน 1
}
# แปลงอาร์กิวเมนต์ --lang เป็นรหัสภาษา (เสียงพากย์)
ฟังก์ชัน ภาษาจากอาร์กิวเมนต์(args) {
bind ai = 0
ขณะที่ ai < ความยาว(args) {
bind a = list_get(args, ai)
ถ้า a == "--lang" { ถ้า ai + 1 < ความยาว(args) { คืน รหัสจากคำ(list_get(args, ai + 1)) } }
bind ai = ai + 1
}
คืน 1
}
# แปลงอาร์กิวเมนต์ --sub เป็นรหัสภาษาบทพูด (แยกจาก --lang) — ไม่ระบุ = ใช้ค่าเดียวกับ --lang
# (ให้พรีวิว dub/sub คู่ที่ไม่ตรงกันได้ เช่น --lang ko --sub th)
ฟังก์ชัน ภาษาบทพูดจากอาร์กิวเมนต์(args, ค่าเริ่มต้น) {
bind ai = 0
ขณะที่ ai < ความยาว(args) {
bind a = list_get(args, ai)
ถ้า a == "--sub" { ถ้า ai + 1 < ความยาว(args) { คืน รหัสจากคำ(list_get(args, ai + 1)) } }
bind ai = ai + 1
}
คืน ค่าเริ่มต้น
}
ฟังก์ชัน musicOn_ทั้งชุด() { คืน 1 }
bind เล่นทั้งหมด = do {
bind อาร์กิวเมนต์ = รับอาร์กิวเมนต์()
bind ภาษาพรีวิว = ภาษาจากอาร์กิวเมนต์(อาร์กิวเมนต์)
bind ภาษาบทพูดพรีวิว = ภาษาบทพูดจากอาร์กิวเมนต์(อาร์กิวเมนต์, ภาษาพรีวิว)
เปิดหน้าต่างเต็มจอ("Soul Symphony — All Cutscenes (Intro + Prelude + 1-8 + Bonus + Finale 1-3)")
tone_smooth(0); tone_bezier_off(); โทนขอบนุ่ม(0.32, 0.65)
ตั้งบลูม(0.5, 0.74)
ลบรอยหยัก(1)
bind liq = liquid_new(16.0, 16.0)
liquid_rainbow(liq, 1.0)
bind km = mesh_load("game/king.lmesh")
bind qm = mesh_load("game/queen.lmesh")
bind w0 = mesh_load("game/palace_p0.lmesh")
bind w1 = mesh_load("game/palace_p1.lmesh")
bind w2 = mesh_load("game/palace_p2.lmesh")
bind w3 = mesh_load("game/palace_p3.lmesh")
bind w4 = mesh_load("game/palace_p4.lmesh")
# หมายเหตุ: บท 2 ใช้ palace_temple/palace_deco — โหลดแยก
bind tm = mesh_load("game/palace_temple.lmesh")
bind dm = mesh_load("game/palace_deco.lmesh")
bind s0 = โหลดเพลง("music/Soul Symphony_Colors_Mix_Master.wav") # สกอร์อินโทร (FFT ขับภาพ)
bind s13 = โหลดเพลง("music/Festival.wav") # สกอร์บทโหมโรง
bind s1 = โหลดเพลง("music/Antartica.wav")
bind s2 = โหลดเพลง("music/MoonTime.wav")
bind s3 = โหลดเพลง("music/Progress.wav")
bind s4 = โหลดเพลง("music/Psyon.wav")
bind s5 = โหลดเพลง("music/Bassline.wav")
bind s6 = โหลดเพลง("music/HealthyHell.wav")
bind s7 = โหลดเพลง("music/Swing.wav")
bind s8 = โหลดเพลง("music/Main_Menu.wav")
bind s9 = โหลดเพลง("music/Seraph.wav")
bind s10 = โหลดเพลง("music/Intoro_Master.wav") # สกอร์ไฟนอล 1 (หลังด่าน 9) — witchhouse หลอน
bind s11 = โหลดเพลง("music/MedalionMaster.wav") # สกอร์ไฟนอล 2 (หลังด่าน 11)
เล่นบทเดียว(13, km, qm, w0, w1, w2, w3, w4, liq, s0, ความยาวเพลง(s0), s0, ภาษาพรีวิว, ภาษาบทพูดพรีวิว) # อินโทร
เล่นบทเดียว(0, km, qm, w0, w1, w2, w3, w4, liq, s13, ความยาวเพลง(s13), s13, ภาษาพรีวิว, ภาษาบทพูดพรีวิว) # บทโหมโรง
เล่นบทเดียว(1, km, qm, tm, w1, w2, dm, w4, liq, s1, ความยาวเพลง(s1), s1, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(2, km, qm, tm, w1, w2, dm, w4, liq, s2, ความยาวเพลง(s2), s2, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(3, km, qm, w0, w1, w2, w3, w4, liq, s3, ความยาวเพลง(s3), s1, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(4, km, qm, w0, w1, w2, w3, w4, liq, s4, ความยาวเพลง(s4), s4, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(5, km, qm, w0, w1, w2, w3, w4, liq, s5, ความยาวเพลง(s5), s1, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(6, km, qm, w0, w1, w2, w3, w4, liq, s6, ความยาวเพลง(s6), s6, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(7, km, qm, w0, w1, w2, w3, w4, liq, s7, ความยาวเพลง(s7), s7, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(8, km, qm, w0, w1, w2, w3, w4, liq, s8, ความยาวเพลง(s8), s8, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(9, km, qm, w0, w1, w2, w3, w4, liq, s9, ความยาวเพลง(s9), s9, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(10, km, qm, w0, w1, w2, w3, w4, liq, s10, ความยาวเพลง(s10), s10, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(11, km, qm, w0, w1, w2, w3, w4, liq, s11, ความยาวเพลง(s11), s11, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
เล่นบทเดียว(12, km, qm, w0, w1, w2, w3, w4, liq, s9, ความยาวเพลง(s9), s9, ภาษาพรีวิว, ภาษาบทพูดพรีวิว)
print_color(2, "all cutscenes finished")
}