code wiki / _hdl_build / nx_game_grow.nx

nx_game_grow.nx source

↩ module page · 44 lines · 3160 B

1// nx_game_grow.nx -- GROW the game domain of the LIVE universal Nishi-builder catalog, then CONSUME a grown 2// level on that same SSOT -- the build->teach->grow->consume loop run end-to-end on the real catalog. Teaches 3// new mechanics / entities / tilemaps / sprites / levels (idempotent, additive), then runs the deterministic 4// spec->runtime (nx_game_render) on a newly-taught level to prove growing the catalog grows what PLAYS with no 5// code change. Mirrors nx_ad_emitter_grow for the game domain. license_tier: ORIGINAL 6import "nx_nishi_builder.nx" 7import "nx_game_render.nx" 8import "nx_ad_serve.nx" 9import "nx_syscalls.nx" 10const K_MAGIC_4096: i64 = 4096 11 12func gg_p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 13func gg_i(v: i64) -> i64 { let t: *u8 = sys_mmap(24); var m: i64 = v; var k: i64 = 0; if m == 0 { t[0]=48 as u8; k=1 } while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 } let o: *u8=sys_mmap(24); var w: i64=0; var q: i64=k-1; while q>=0 { o[w]=t[q]; w=w+1; q=q-1 } sys_write(1,o,w); return 0 } 14func gg_reg(kind: *u8, id: *u8, label: *u8, tpl: *u8) -> i64 { 15 let r: i64 = nb_register(NB_PATH, "game" as *u8, kind, id, label, tpl) 16 if r == 1 { gg_p(" + game/" as *u8); gg_p(kind); gg_p("/" as *u8); gg_p(id); gg_p("\n" as *u8) } 17 return r 18} 19 20func main(argc: i64, argv: *i64) -> i64 { 21 gg_p("=== nx_game_grow: teach the LIVE Nishi-builder catalog new game emitters, then consume ===\n" as *u8) 22 gg_p("GROW (teach -- idempotent, additive):\n" as *u8) 23 gg_reg("mechanic" as *u8, "moon" as *u8, "Moon jump (low gravity)" as *u8, "impulse=12|gravity=0.3|coyote=90|jumpbuffer=120" as *u8) 24 gg_reg("mechanic" as *u8, "double-jump" as *u8, "Double jump" as *u8, "impulse=14|gravity=0.6|airjumps=1|coyote=80" as *u8) 25 gg_reg("entity" as *u8, "turret" as *u8, "Stationary turret" as *u8, "hp=2|speed=0|ai=shoot|drop=coin" as *u8) 26 gg_reg("entity" as *u8, "charger" as *u8, "Charging brute" as *u8, "hp=5|speed=4|ai=charge|drop=gem" as *u8) 27 gg_reg("tilemap" as *u8, "cavern" as *u8, "Cavern tiles" as *u8, "32x32|rock,lava,crystal|autotile" as *u8) 28 gg_reg("sprite" as *u8, "gem" as *u8, "Gem pickup" as *u8, "12x12|violet|diamond-shine|spin6" as *u8) 29 gg_reg("level" as *u8, "2-1" as *u8, "Second level" as *u8, "overworld|coin*20|patroller*5|exit-right" as *u8) 30 gg_reg("level" as *u8, "3-1" as *u8, "Cavern depths" as *u8, "cavern|coin*30|charger*8|exit-right" as *u8) 31 32 gg_p("game emitters in THE NISHI BUILDER (live) = " as *u8); gg_i(nb_count(NB_PATH, "game" as *u8, "*" as *u8)); gg_p("\n" as *u8) 33 34 gg_p("CONSUME on the LIVE catalog -- run a grown level (3-1, cavern, charger) through the runtime:\n" as *u8) 35 let st: *i64 = sys_mmap(512) as *i64 36 ng_sim_run(NB_PATH, "3-1" as *u8, "double-jump" as *u8, "charger" as *u8, st) 37 let buf: *u8 = sys_mmap(K_MAGIC_4096) 38 let n: i64 = ng_transcript(st, "3-1" as *u8, buf) 39 sys_write(1, buf, n) 40 if st[7] == 1 { gg_p("grow->consume on the live SSOT: GREEN (no code change)\n" as *u8); sys_exit(0); return 0 } 41 gg_p("grow->consume: RED\n" as *u8) 42 sys_exit(1) 43 return 1 44}