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}