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/arena.ling
# ════════════════════════════════════════════════════════════════════════════
# arena.ling — สนามบอสวงกลมใหญ่ (พื้นเติม + กำแพงวงแหวน + ชนขอบเป็นวงกลม)
# ════════════════════════════════════════════════════════════════════════════
bind ARENA_R = 240.0
bind ARENA_FLOOR = 6.0
bind ARENA_CEIL = 0.0 - 160.0
ฟังก์ชัน ความสูงอารีนา(x, z) { คืน ARENA_FLOOR }
# ชนขอบวงกลม → [pen, qx, qz] (รูปแบบเดียวกับ หากล่อง)
ฟังก์ชัน หากล่องอารีนา(x, z, R) {
bind d = รากที่สอง(x*x + z*z)
bind lim = ARENA_R - R
ถ้า d > lim { ถ้า d > 0.01 {
คืน [1.0, x/d*lim, z/d*lim]
} }
คืน [0.0, x, z]
}
# วาดสนาม: พื้นเช็คเกอร์บอร์ดเชิงรัศมี (วงซ้อน × เสี้ยว) + เอดจ์ลูปเรืองแสง + กำแพงวงแหวน
ฟังก์ชัน วาดอารีนา(t, lvl, hue) {
โหมดผสม(0)
bind N = 28
bind RINGS = 6
bind tr = ไซน์(hue*6.2832)*0.5+0.5; bind tg = ไซน์(hue*6.2832+2.094)*0.5+0.5; bind tb = ไซน์(hue*6.2832+4.189)*0.5+0.5 # สีสเตจ
# ── พื้น: เช็คเกอร์บอร์ดเชิงรัศมี (วงซ้อน ri × เสี้ยว k) ย้อมตามสเตจ ──
bind ri = 0
ขณะที่ ri < RINGS {
bind r0 = ri * ARENA_R / RINGS; bind r1 = (ri+1) * ARENA_R / RINGS
bind k = 0
ขณะที่ k < N {
bind a0 = k * 6.2832 / N; bind a1 = (k+1) * 6.2832 / N
bind c0=โคไซน์(a0); bind s0=ไซน์(a0); bind c1=โคไซน์(a1); bind s1=ไซน์(a1)
ถ้า (ri+k) - ปัดลง((ri+k)/2.0)*2.0 == 0.0 { สีดินสอ(floor(16+tr*26), floor(20+tg*26), floor(36+tb*40)) } มิฉะนั้น { สีดินสอ(floor(34+tr*58), floor(40+tg*58), floor(64+tb*80)) }
draw_quad_3d(c0*r0, ARENA_FLOOR, s0*r0, c1*r0, ARENA_FLOOR, s1*r0, c1*r1, ARENA_FLOOR, s1*r1, c0*r1, ARENA_FLOOR, s0*r1)
bind k = k + 1
}
bind ri = ri + 1
}
flush_3d()
# ── เอดจ์ลูป: เส้นวงซ้อน + เส้นรัศมี เรืองแสง (เน้นกริด) ย้อมตามสเตจ ──
โหมดผสม(1); สีดินสอ(floor(45+tr*150), floor(80+tg*140), floor(120+tb*120))
bind ri = 1
ขณะที่ ri < RINGS + 1 {
bind rr = ri * ARENA_R / RINGS
bind k = 0
ขณะที่ k < N {
bind a0 = k * 6.2832 / N; bind a1 = (k+1) * 6.2832 / N
วาดเส้น3มิติ(โคไซน์(a0)*rr, ARENA_FLOOR-0.06, ไซน์(a0)*rr, โคไซน์(a1)*rr, ARENA_FLOOR-0.06, ไซน์(a1)*rr)
bind k = k + 1
}
bind ri = ri + 1
}
bind k = 0
ขณะที่ k < N {
bind a0 = k * 6.2832 / N; bind ca=โคไซน์(a0); bind sa=ไซน์(a0)
วาดเส้น3มิติ(0.0, ARENA_FLOOR-0.06, 0.0, ca*ARENA_R, ARENA_FLOOR-0.06, sa*ARENA_R)
bind k = k + 1
}
flush_3d(); โหมดผสม(0)
# ── กำแพงวงแหวน (จากพื้น → เพดาน) สีเปลี่ยนตามเลเวล ──
bind k = 0
ขณะที่ k < N {
bind a0 = k * 6.2832 / N; bind a1 = (k+1) * 6.2832 / N
bind c0=โคไซน์(a0); bind s0=ไซน์(a0); bind c1=โคไซน์(a1); bind s1=ไซน์(a1)
bind wr = floor((ไซน์(lvl*1.1+k*0.2)*0.5+0.5)*55+25)
สีดินสอ(floor(wr*(0.5+tr*1.1)), floor(wr*(0.4+tg*1.1)), floor(wr*(0.5+tb*1.1))) # ย้อมกำแพงตามสเตจ
draw_quad_3d(c0*ARENA_R, ARENA_FLOOR, s0*ARENA_R, c1*ARENA_R, ARENA_FLOOR, s1*ARENA_R, c1*ARENA_R, ARENA_CEIL, s1*ARENA_R, c0*ARENA_R, ARENA_CEIL, s0*ARENA_R)
bind k = k + 1
}
flush_3d()
}
ฟังก์ชัน ตั้งแสงอารีนา(t, lvl) {
ล้างแสง()
เพิ่มแสง(0.0, ARENA_CEIL+30.0, 0.0,
0.6+ไซน์(lvl*1.1)*0.4, 0.6+ไซน์(lvl*1.1+2.0)*0.4, 0.6+ไซน์(lvl*1.1+4.0)*0.4, 1.8, 600.0)
เพิ่มแสง(0.0, 0.0-40.0, 0.0, 1.0, 0.4, 0.7, 1.2, 420.0)
}