code wiki / _hdl_build / nx_vn_art.nx
nx_vn_art.nx source
↩ module page · 96 lines · 4677 B
1// nx_vn_art.nx -- the ecosystem GENERATES a VN background (the visuals gap, attacked honestly): a procedural
2// dusk-storm lighthouse scene, integer-rastered (NO float) into a packed-RGB framebuffer, then written as a
3// sovereign PNG (our own nx_png encoder). It is served as a same-origin static image (CSS background-image, NOT a
4// JS blit, NOT a third-party fetch) on the live VN. Honest scope: PROCEDURAL atmosphere, not hand-painted CG --
5// a real step from styled-text to generated art, the first rung of VN visuals. license_tier: ORIGINAL expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_shade.nx"
8import "nx_png.nx"
9
10func aw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
11func frect(fb: *i64, w: i64, h: i64, x0: i64, y0: i64, x1: i64, y1: i64, c: i64) -> i64 {
12 var yy: i64 = y0; if yy < 0 { yy = 0 }
13 var ye: i64 = y1; if ye > h { ye = h }
14 while yy < ye { var xx: i64 = x0; if xx < 0 { xx = 0 } var xe: i64 = x1; if xe > w { xe = w } while xx < xe { fb[yy*w + xx] = c; xx = xx + 1 } yy = yy + 1 }
15 return 0
16}
17
18func va_bg(fb: *i64, W: i64, H: i64) -> i64 {
19 let horizon: i64 = H*7/10
20 // sky gradient: dark navy top -> dusk-purple horizon
21 var y: i64 = 0
22 while y < horizon {
23 let t: i64 = y*256/horizon
24 let r: i64 = 12 + (84-12)*t/256; let g: i64 = 16 + (56-16)*t/256; let b: i64 = 38 + (92-38)*t/256
25 frect(fb, W, H, 0, y, W, y+1, sh_rgb(r, g, b)); y = y + 1
26 }
27 // moon (pale disc, upper-left)
28 let mx: i64 = W/5; let my: i64 = horizon*2/5; let mr: i64 = 26
29 var yy: i64 = my - mr
30 while yy <= my + mr {
31 var xx: i64 = mx - mr
32 while xx <= mx + mr { let dx: i64 = xx-mx; let dy: i64 = yy-my; if dx*dx + dy*dy <= mr*mr { if xx >= 0 { if xx < W { if yy >= 0 { if yy < horizon { fb[yy*W + xx] = sh_rgb(228, 224, 204) } } } } } xx = xx + 1 }
33 yy = yy + 1
34 }
35 // sea: dark teal, darkening downward
36 y = horizon
37 while y < H {
38 let t: i64 = (y-horizon)*256/(H-horizon)
39 let r: i64 = 12 - 6*t/256; let g: i64 = 28 - 12*t/256; let b: i64 = 46 - 18*t/256
40 frect(fb, W, H, 0, y, W, y+1, sh_rgb(r, g, b)); y = y + 1
41 }
42 frect(fb, W, H, 0, horizon-1, W, horizon+1, sh_rgb(132, 96, 120)) // horizon glow
43 // lighthouse tower (tapered, red banded)
44 let cx: i64 = W*62/100
45 let topY: i64 = horizon - H*44/100
46 let baseY: i64 = horizon + 8
47 let hBase: i64 = 21; let hTop: i64 = 12
48 y = topY
49 while y <= baseY {
50 let t: i64 = (y-topY)*256/(baseY-topY)
51 let half: i64 = hTop + (hBase-hTop)*t/256
52 let band: i64 = (y-topY)*6/(baseY-topY)
53 var col: i64 = sh_rgb(208, 210, 220)
54 if (band % 2) == 1 { col = sh_rgb(178, 58, 54) }
55 frect(fb, W, H, cx-half, y, cx+half, y+1, col); y = y + 1
56 }
57 // gallery + lamp room (bright) + glow halo
58 frect(fb, W, H, cx-13, topY-4, cx+13, topY+2, sh_rgb(58, 60, 74))
59 frect(fb, W, H, cx-8, topY-18, cx+8, topY-4, sh_rgb(255, 234, 140))
60 // soft glow halo around the lamp
61 let gx: i64 = cx; let gy: i64 = topY - 11; let gr: i64 = 30
62 yy = gy - gr
63 while yy <= gy + gr {
64 var xx: i64 = gx - gr
65 while xx <= gx + gr {
66 let dx: i64 = xx-gx; let dy: i64 = yy-gy; let d2: i64 = dx*dx + dy*dy
67 if d2 <= gr*gr { if d2 > 144 { if xx >= 0 { if xx < W { if yy >= 0 { if yy < horizon {
68 let cur: i64 = fb[yy*W + xx]; let k: i64 = (gr*gr - d2)*120/(gr*gr)
69 let nr: i64 = sh_r(cur) + k; let ng: i64 = sh_g(cur) + k*9/10; let nb: i64 = sh_b(cur) + k/2
70 var rr: i64 = nr; if rr > 255 { rr = 255 } var gg: i64 = ng; if gg > 255 { gg = 255 } var bb: i64 = nb; if bb > 255 { bb = 255 }
71 fb[yy*W + xx] = sh_rgb(rr, gg, bb)
72 } } } } } }
73 xx = xx + 1
74 }
75 yy = yy + 1
76 }
77 // rain: sparse diagonal streaks
78 var i: i64 = 0
79 while i < 320 {
80 let rx: i64 = (i*73 + 11) % W; let ry: i64 = (i*149 + 7) % horizon
81 var s: i64 = 0
82 while s < 6 { let px: i64 = rx + s; let py: i64 = ry + s*2; if px < W { if py < horizon { fb[py*W + px] = sh_rgb(150, 162, 188) } } s = s + 1 }
83 i = i + 1
84 }
85 return 0
86}
87
88func main(argc: i64, argv: *i64) -> i64 {
89 let W: i64 = 320; let H: i64 = 180
90 let fb: *i64 = sys_mmap(8*W*H) as *i64
91 va_bg(fb, W, H)
92 sys_mkdir("knowledge/staging/game" as *u8, 0x1ed)
93 write_png(fb, W, H, "knowledge/staging/game/vn_bg.png" as *u8)
94 aw("nx_vn_art: generated procedural lighthouse background -> knowledge/staging/game/vn_bg.png (640x360, integer raster, sovereign PNG)\n" as *u8)
95 sys_exit(0); return 0
96}