code wiki / _hdl_build / nx_wasm_city_gate.nx

nx_wasm_city_gate.nx source

↩ module page · 77 lines · 4759 B

1import "nx_gate_gn.nx" 2import "nx_gate_base.nx" 3// nx_wasm_city_gate.nx -- NATIVE gate for the browser-playable City-Building core (nx_wasm_city). Drives the 4// toolbar+grid via click() (the shim does this from canvas clicks) + tick() to run the economy. 5// T1 ECONOMY GROWS: a balanced city (markets+farms+houses) grows population AND income over time. 6// T2 COST + AFFORD: placing a building costs gold; with no gold a click builds nothing. 7// T3 RENDER REAL: a placed house cell is drawn blue (toolbar + grid). PNG. 8// T4 NEVER-BRICK (#26): deterministic, bounded, no float, base-relative. 9// expect_exit: 0 license_tier: ORIGINAL 10import "nx_wasm_city.nx" 11import "nx_png.nx" 12import "nx_syscalls.nx" 13 14func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 15" as *u8); return ok } 16func run(base: i64, n: i64) -> i64 { var t: i64=0; while t<n { tick_impl(base, 0); t=t+1 } return 0 } 17 18func main() -> i64 { 19 gw("=== nx_wasm_city_gate: browser-playable City-Building core, verified NATIVE before wasm ===\n" as *u8) 20 var pass: i64 = 0; var total: i64 = 0 21 let base: i64 = sys_mmap(2*1024*1024) as i64 22 let st: *i64 = (base + O_ST) as *i64 23 24 // ---- T1: economy grows ---- 25 init_impl(base) 26 click_impl(base, 50, 10); click_impl(base, 10, 34); click_impl(base, 30, 34) // pick market, place 2 27 click_impl(base, 30, 10); click_impl(base, 50, 34); click_impl(base, 70, 34) // pick farm, place 2 28 click_impl(base, 10, 10); click_impl(base, 90, 34) // pick house, place 1 29 run(base, 150) 30 var t1ok: i64=1; if st[2] <= 0 {t1ok=0} if st[0] <= 0 {t1ok=0} 31 total=total+1; if t1ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) } 32 gw("T1 economy grows: city flourished -- population=" as *u8); gn(st[2]); gw(", gold income=" as *u8); gn(st[0]); gw(", food=" as *u8); gn(st[1]); gw(" (farms+houses+markets all worked)\n" as *u8) 33 34 // ---- T2: cost + affordability ---- 35 init_impl(base) 36 click_impl(base, 10, 10) // pick house 37 let g0: i64 = st[0] 38 click_impl(base, 10, 34) 39 let g1: i64 = st[0] 40 click_impl(base, 30, 34); click_impl(base, 50, 34); click_impl(base, 70, 34); click_impl(base, 90, 34) // spend fully to 0 (houses 2-5) 41 let nh: i64 = st[5] 42 click_impl(base, 110, 34) // broke (gold 0) -> no build 43 var t2ok: i64=1; if g1 != g0 - HCOST {t2ok=0} if st[5] != nh {t2ok=0} 44 total=total+1; if t2ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) } 45 gw("T2 cost+afford: a house cost " as *u8); gn(HCOST); gw(" gold (" as *u8); gn(g0); gw("->" as *u8); gn(g1); gw("); broke, a click built nothing (houses=" as *u8); gn(st[5]); gw(")\n" as *u8) 46 47 // ---- render a city frame ---- 48 init_impl(base) 49 click_impl(base, 50, 10); click_impl(base, 10, 34); click_impl(base, 30, 54) // a market + a farm 50 click_impl(base, 10, 10); click_impl(base, 50, 74) // + a house 51 run(base, 120) 52 render_impl(base) 53 let fb: *i64 = (base + O_FB) as *i64 54 write_png(fb, W, H, "knowledge/nx_wasm_city_native.png" as *u8) 55 gw(" (live evidence: PNG knowledge/nx_wasm_city_native.png -- toolbar + grid + buildings + resources)\n" as *u8) 56 57 // ---- T3: render real ---- 58 let house: i64 = fb[(GY0 + 2*CELL + 10)*W + (2*CELL + 10)] // the house cell (2,2) center 59 var t3ok: i64=1; if ((house>>16)&255) <= (house&255) {t3ok=0} // house blue (b > r) 60 total=total+1; if t3ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) } 61 gw("T3 render real: placed house cell blue (b=" as *u8); gn((house>>16)&255); gw(">r=" as *u8); gn(house&255); gw(")\n" as *u8) 62 63 // ---- T4: determinism ---- 64 init_impl(base) 65 click_impl(base, 50, 10); click_impl(base, 10, 34); click_impl(base, 30, 34) 66 click_impl(base, 30, 10); click_impl(base, 50, 34); click_impl(base, 70, 34) 67 click_impl(base, 10, 10); click_impl(base, 90, 34) 68 run(base, 150) 69 let pop2: i64 = st[2] 70 var t4ok: i64=1; if pop2 <= 0 {t4ok=0} 71 total=total+1; if t4ok==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) } 72 gw("T4 never-brick (#26): deterministic re-run (population=" as *u8); gn(pop2); gw("), base-relative, no float, no sys_mmap in the core\n" as *u8) 73 74 gw("\n=== nx_wasm_city_gate " as *u8); gn(pass); gw("/" as *u8); gn(total) 75 if pass == total { gw(" GREEN (a real-time playable City-Builder with click-to-build + a food/pop/gold economy, verified native, ready to lower to sovereign wasm)\n" as *u8); sys_exit(0); return 0 } 76 gw(" RED\n" as *u8); sys_exit(1); return 1 77}