灵符lingfu

soul-symphony-ling

↓ 0 downloads

Soul Symphony — Ling Edition. A spiritual 3D adventure in the soul realm: collect the letters of the world-song, clear the monster lattice, and duel in the arcade arena. Wind Waker-style toon renderer with volumetric light pools, SSAO, bloom and oil-slick tilt-shift — all ling-lang vectors.

Keywords game, 3d, toon, music, soul-symphony
lingfu install soul-symphony-ling
AuthorsLing Lin <taellinglin@gmail.com>
READMECode / FilesVersionsDependency GraphDependentsSecurityBuildsSettings

Code / Files (1947)

game/voice.ling
# game/voice.ling — cutscene VO playback rails.
#
# Layout matches tools/voiceover/manifest.py + generate.py exactly:
#   game/voice/<scene_id>/<NN>_<role>_<lang>.wav   (NN = 2-digit line index)
#
# Plays the line in the player's selected language if that file has been
# recorded; if not (most scenes only have English so far), โหลดตัวอย่างเสียง
# returns -1 and เล่นเสียงพากย์ silently does nothing — the scene continues
# normally with just its subtitle, no error/hitch.

# ภาษา (0 Daemon, 1 English, 2 Thai, 3 Korean, 4 Japanese, 5 Chinese) → VO
# language code. Daemon has its own dub: tools/voiceover/translations_daemon.py
# (the linglin.art-documented conlang — English vocab, Japanese-phonetic
# transliteration, Chinese SVO grammar) voiced through the Japanese TTS
# language setting (closest phonetic match — see voices.py ROLES[*]['language']).
ฟังก์ชัน รหัสภาษาเสียง(ภาษา) {
    ถ้า ภาษา == 0 { คืน "daemon" }
    ถ้า ภาษา == 2 { คืน "th" }
    ถ้า ภาษา == 3 { คืน "ko" }
    ถ้า ภาษา == 4 { คืน "ja" }
    ถ้า ภาษา == 5 { คืน "zh" }
    คืน "en"
}

# ภาษาแสดงผลบทพูด (ต่างจากภาษาพากย์เสียงข้างบน): เครื่องมือวาดตัวอักษรของเกม
# (game/title.ling วาดสตริง/วาดกลิฟ/ตัวอักษรเป็นดัชนี) มีกลิฟที่อบไว้แค่ a-z/0-9/
# เครื่องหมายวรรคตอนพื้นฐาน (48 ตัว) + กลิฟเดมอนแยกต่างหาก (26 ตัว, ชุดเดียวกันแต่
# ไม่มีเลข/วรรคตอน) — ยังไม่มีกลิฟภาษาไทย/เกาหลี/ญี่ปุ่น/จีนสำหรับบทพูดยาว ๆ (ตัว
# เลือกเมนูใช้ระบบกลิฟคนละชุดที่อบเฉพาะคำเมนู ไม่ใช่ประโยคบทพูดอิสระ) ดังนั้นเวลา
# แสดงข้อความบนจอ ภาษาไทย/เกาหลี/ญี่ปุ่น/จีน ต้อง fallback เป็นอังกฤษไปก่อน (เสียง
# พากย์ยังคงเล่นภาษาที่เลือกจริงตามปกติ ไม่กระทบ) จนกว่าจะอบกลิฟชุดใหญ่ให้ครบ
# (ดู tools/phrasebake — อบได้ทีละประโยค ยังไม่มีตัวจัดการหลายบทพูดอัตโนมัติ)
ฟังก์ชัน ภาษาแสดงผล(ภาษา) {
    ถ้า ภาษา == 0 { คืน 0 }   # เดมอน: กลิฟของตัวเองอบไว้แล้ว (ข้อความแปลงเป็น a-z ล้วนแล้ว)
    คืน 1                      # อังกฤษ/ไทย/เกาหลี/ญี่ปุ่น/จีน → แสดงอังกฤษจนกว่าจะมีกลิฟ
}

ฟังก์ชัน เลขสองหลักพากย์(n) {
    ถ้า n < 10 { คืน "0" + to_str(floor(n)) }
    คืน to_str(floor(n))
}

# เล่นบรรทัด idx ของฉาก scene (ผู้พูด role: narrator/king/queen/daemon/
# water_spirit/fire_spirit — ต้องตรงกับ tools/voiceover/manifest.py) ในภาษา
# ที่เลือกไว้ (ภาษา) ด้วยระดับเสียง vol. เรียกครั้งเดียวตอนบรรทัดเริ่ม (เกตด้วย
# ...บรรทัดก่อน ที่ทุกฉากมีอยู่แล้ว) ไม่ใช่ทุกเฟรม — โหลดไฟล์จากดิสก์ทุกครั้งที่เรียก
#
# บวกเสียงพากย์ให้ดังกว่าระดับ SFX ปกติ (คำพูดต้องได้ยินชัดเหนือ BGM ที่หรี่ไว้
# ระหว่างฉากคัตซีนแล้ว — ดู ระดับเพลง(...*0.33) ในแต่ละไฟล์ฉาก) แต่หนีบไว้ไม่เกิน
# 1.0 กัน clipping (เล่นตัวอย่างเสียงเรียบ ไม่หนีบ vol ให้เอง)
#
# ใช้ "เรียบ" (flat/non-positional) ไม่ใช่ เล่นตัวอย่างเสียง ธรรมดา — คำพูดต้องดัง
# สม่ำเสมอไม่ว่ากล้องคัตซีนจะอยู่ไกลจุด (0,0,0) แค่ไหน ต่างจาก SFX โลก 3 มิติที่ควร
# เบาลงตามระยะทาง (เล่นตัวอย่างเสียง ธรรมดา ลดเสียงตามระยะจากกล้องเสมอ — ถ้าใช้ตัว
# นั้นกับเสียงพากย์ กล้องคัตซีนที่มักอยู่ไกลจุดกำเนิดหลายสิบหน่วยจะทำให้เสียงพากย์
# แผ่วเกือบไม่ได้ยิน ในขณะที่ BGM ซึ่งเป็นคนละบัสไม่ถูกลดตามระยะเลย)
ฟังก์ชัน เล่นเสียงพากย์(scene, idx, role, ภาษา, vol) {
    bind lang = รหัสภาษาเสียง(ภาษา)
    bind path = "game/voice/" + scene + "/" + เลขสองหลักพากย์(idx) + "_" + role + "_" + lang + ".wav"
    bind sid = โหลดตัวอย่างเสียง(path)
    bind voVol = vol * 1.6
    ถ้า voVol > 1.0 { bind voVol = 1.0 }
    ถ้า sid >= 0 { เล่นตัวอย่างเสียงเรียบ(sid, voVol, 0.0) }
    คืน 0
}

# ── ระยะเวลาไดนามิกต่อบรรทัด (ตามภาษาที่เลือกจริง) ──────────────────────────────
# คืนลิสต์ N ค่า (วิ/บรรทัด) จากความยาวไฟล์เสียงพากย์จริงของภาษาที่เลือก — ไม่ใช่
# ตัวเลขตายตัวที่วัดมือครั้งเดียวสำหรับ en เท่านั้น ภาพ/กล้อง/จังหวะตัดฉากในแต่ละ
# ไฟล์ scenes/chapterN.ling สร้างจากตารางเวลาสะสมของลิสต์นี้อยู่แล้ว (ดู c1cum ฯลฯ)
# ดังนั้นแค่ให้ลิสต์นี้ตรงกับภาษาจริง กล้อง/บล็อกกิ้งก็ยืด-หดตามเสียงพากย์เองอัตโนมัติ
# — ไม่แตะความเร็ว/ระดับเสียงของตัวไฟล์เสียงเลย (โน้ตเพลง/เสียงพูดเล่นตามธรรมชาติ
# เท่ากับไฟล์ต้นฉบับเสมอ, เปลี่ยนแค่ "จังหวะภาพ" ให้พอดีกับที่เสียงพูดจริงกินเวลา)
#
# เรียกครั้งเดียวตอนเข้าฉาก/ตอนเปลี่ยนภาษา (โหลดไฟล์จากดิสก์ N ครั้ง) ไม่ใช่ทุกเฟรม
# บรรทัดที่ยังไม่มีไฟล์เสียงภาษานั้น (หรือไฟล์สั้นผิดปกติ <0.05 วิ) ใช้ค่าเริ่มต้น
# จาก ค่าเริ่มต้น[i] แทน (จังหวะเดิมของฉากนั้น) — ต่อบรรทัด ไม่ใช่ทั้งฉากพร้อมกัน
ฟังก์ชัน ระยะเวลาเสียงพากย์ฉาก(scene, ผู้พูดรหัส, ภาษา, ค่าเริ่มต้น) {
    bind lang = รหัสภาษาเสียง(ภาษา)
    bind n = ความยาว(ผู้พูดรหัส)
    bind out = []
    bind i = 0
    ขณะที่ i < n {
        bind role = list_get(ผู้พูดรหัส, i)
        bind path = "game/voice/" + scene + "/" + เลขสองหลักพากย์(i) + "_" + role + "_" + lang + ".wav"
        bind sid = โหลดตัวอย่างเสียง(path)
        bind d = list_get(ค่าเริ่มต้น, i)
        ถ้า sid >= 0 {
            bind real = ความยาวตัวอย่างเสียง(sid)
            ถ้า real > 0.05 { bind d = real }
        }
        bind out = list_push(out, d)
        bind i = i + 1
    }
    คืน out
}

← Back to index