code wiki / _hdl_build / nx_wire_crawl_gate.nx
nx_wire_crawl_gate.nx source
↩ module page · 1087 lines · 42427 B
1// nx_wire_crawl_gate.nx -- TITLE WIRING #4: Dungeon Crawl Stone Soup (roguelike). 2026-08-23.
2// Composes the SAME certified parts as the proven NetHack wiring (nx_wire_nethack_gate, 12/12 GREEN)
3// plus the LOOT part exactly as the proven Diablo II wiring exercises it (nx_wire_diablo2_gate 14/14):
4// every kill rolls an item through nx_loottable's lt_roll, audited in-loop (no duplicate affixes,
5// values in declared range), and the loot is CAUSAL in the economy -- tier>=2 drops grant a ration
6// that the inventory conservation ledger must then balance exactly.
7//
8// CAPS EXERCISED (bit = nx_gamebench capability index, set ONLY if its tooth passes; the mask is
9// written into knowledge/nx_wire_crawl.sav payload[0] so nx_gamebench_gate can cross-check):
10// bit 3 procgen-world bit 7 pathfinding-ai bit 6 entity-component-sim
11// bit 9 rpg-stats-progression bit 11 inventory-crafting bit 14 text-render-typography
12// bit 15 save-load-persistence bit 18 ui-menus-hud bit 25 asset-pipeline-import
13// bit 10 loot-item-tables (the crawl-specific addition; Diablo II lt_roll pattern)
14// Full mask when all teeth pass = 33868488 (NetHack's proven set) + 1024 (bit 10) = 33869512,
15// which EQUALS the board's required vector ttmk[8] -- readiness 1000 permil is reachable, measured.
16//
17// DIALECT (inherited from the donor, which found these traps): no else-if chains with declarations,
18// no ||, flag variables instead of else branches in game code; ASCII-only comments (the 08-22
19// non-ASCII-reached-codegen landmine); per-kill sys_mmap in the loot block mirrors the proven d2
20// wiring (about 18 kills per run -- not a hot loop).
21// license_tier: ORIGINAL expect_exit: 0
22import "nx_syscalls.nx"
23import "nx_gamesave.nx"
24import "nx_rpgstats.nx"
25import "nx_entity_store.nx"
26import "nx_pathfind.nx"
27import "nx_loottable.nx"
28import "nx_gamehud.nx"
29import "nx_wire_harness.nx"
30import "nx_gate_verdict.nx"
31import "nx_trimesh.nx"
32import "nx_objload.nx"
33
34// ---- world shape (donor values: the NetHack loop's calibration, reused not re-picked) ----
35const CR_W: i64 = 24
36const CR_H: i64 = 12
37const CR_DEPTH: i64 = 3
38const CR_NMON: i64 = 6
39const CR_NITEM: i64 = 5
40const CR_CAP: i64 = 16
41const CR_NCOMP: i64 = 4
42const CR_CARVE: i64 = 140
43const CR_AGGRO: i64 = 8
44const CR_MAXT: i64 = 600
45const CR_XB: i64 = 20
46const CR_XQ: i64 = 10
47const CR_HPB: i64 = 10
48const CR_HPC: i64 = 2
49const CR_HPL: i64 = 3
50const CR_CON: i64 = 14
51const CR_BITE: i64 = 2
52const CR_MHPB: i64 = 12
53const CR_HEAL_R: i64 = 10
54const CR_HEAL_F: i64 = 25
55// loot shape (the d2 wiring's table dimensions, reused)
56const CR_NTIER: i64 = 4
57const CR_NAFF: i64 = 5
58// save shape: donor's 26 header fields + 8 loot fields = 34
59const CR_HDRN: i64 = 34
60const CR_HDRZ: i64 = 48 // header region zeroed on new/restore (grid starts at word 48)
61const CR_NSV: i64 = 114 // 34 hdr + 1 nmon + 16*4 monsters + 5*3 items
62const CR_SCHEMA: i64 = 7339 // next in the x9 wire series (nethack 7307, d2 7338)
63const CR_ART_SCHEMA: i64 = 7319 // wiring-evidence artifact schema (nethack 7317, d2 7318)
64const CR_T1W: i64 = 20 // transparency window: donor's calibration, win lands ~turn 62
65const CR_T2W: i64 = 45
66// ---- arena offsets: donor layout shifted +16 words for the 8 loot header fields ----
67const CG_O_GRID: i64 = 48
68const CG_O_ITEM: i64 = 336
69const CG_O_ENT: i64 = 352
70const CG_O_PATH: i64 = 512
71const CG_O_G: i64 = 808
72const CG_O_F: i64 = 1104
73const CG_O_CAME: i64 = 1400
74const CG_O_OPENF: i64 = 1696
75const CG_O_CLOSED: i64 = 1992
76const CG_O_CARVE: i64 = 2288
77const CG_O_HUD: i64 = 2592
78const CG_WORDS: i64 = 2656
79const CR_HUDINK: i64 = 50
80// header field indices
81const F_WS: i64 = 0
82const F_DEPTH: i64 = 1
83const F_TURN: i64 = 2
84const F_PX: i64 = 3
85const F_PY: i64 = 4
86const F_XP: i64 = 5
87const F_LVL: i64 = 6
88const F_HP: i64 = 7
89const F_KILLS: i64 = 8
90const F_RATION: i64 = 9
91const F_FEAST: i64 = 10
92const F_PICKED: i64 = 11
93const F_USED: i64 = 12
94const F_WIN: i64 = 13
95const F_COMB: i64 = 14
96const F_EATR: i64 = 15
97const F_EATF: i64 = 16
98const F_PSTEPS: i64 = 17
99const F_ATT: i64 = 18
100const F_BITES: i64 = 19
101const F_SPAWNED: i64 = 20
102const F_SX: i64 = 21
103const F_SY: i64 = 22
104const F_NCARVE: i64 = 23
105const F_GENRNG: i64 = 24
106const F_ABAND: i64 = 25
107// loot header fields (crawl addition; ALL serialized, so save/load transparency covers loot state)
108const F_DROPS: i64 = 26
109const F_T0: i64 = 27
110const F_T1: i64 = 28
111const F_T2: i64 = 29
112const F_T3: i64 = 30
113const F_DUPAFF: i64 = 31
114const F_AFFBAD: i64 = 32
115const F_LOOTR: i64 = 33 // rations gained FROM LOOT (tier>=2) -- balances the ledger tooth
116
117func ww(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
118func wn(v: i64) -> i64 {
119 if v==0 { sys_write(1,"0" as *u8,1); return 0 }
120 var m: i64=v; if m<0 { sys_write(1,"-" as *u8,1); m=0-m }
121 let t: *u8=sys_mmap(32); var k: i64=0
122 while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 }
123 let o: *u8=sys_mmap(32); var q: i64=k-1; var i: i64=0
124 while q>=0 { o[i]=t[q]; i=i+1; q=q-1 }
125 sys_write(1,o,i); return 0
126}
127func cbit(i: i64) -> i64 { var v: i64=1; var k: i64=0; while k<i { v=v*2; k=k+1 } return v }
128func crng(g: *i64) -> i64 {
129 var x: i64 = g[F_GENRNG]
130 x = x ^ (x << 13)
131 x = x ^ (x >> 7)
132 x = x ^ (x << 17)
133 g[F_GENRNG] = x
134 if x < 0 { return 0 - x }
135 return x
136}
137func cabs(v: i64) -> i64 { if v<0 { return 0-v } return v }
138// loot tables: the PROVEN d2 wiring calibration, composed not re-picked
139func cr_tables(tw: *i64, ta: *i64, aw: *i64, alo: *i64, ahi: *i64) -> i64 {
140 tw[0]=600; tw[1]=300; tw[2]=80; tw[3]=20
141 ta[0]=0; ta[1]=1; ta[2]=2; ta[3]=3
142 aw[0]=30; aw[1]=25; aw[2]=20; aw[3]=15; aw[4]=10
143 alo[0]=2; ahi[0]=9
144 alo[1]=5; ahi[1]=20
145 alo[2]=5; ahi[2]=25
146 alo[3]=4; ahi[3]=15
147 alo[4]=1; ahi[4]=8
148 return 0
149}
150// ---- level structure: PURE function of (worldseed, depth). Restore regenerates it exactly. ----
151func cr_genstruct(g: *i64) -> i64 {
152 g[F_GENRNG] = g[F_WS]*1000 + g[F_DEPTH]*7919
153 if g[F_GENRNG]==0 { g[F_GENRNG]=1 }
154 let grid: *i64 = (g as i64 + CG_O_GRID*8) as *i64
155 let carve: *i64 = (g as i64 + CG_O_CARVE*8) as *i64
156 var i: i64=0
157 while i<CR_W*CR_H { grid[i]=1; i=i+1 }
158 var cx: i64=1
159 var cy: i64=1
160 grid[cy*CR_W+cx]=0
161 carve[0]=cy*CR_W+cx
162 var nc: i64=1
163 var steps: i64=0
164 while steps<CR_CARVE {
165 let d: i64 = crng(g)%4
166 var tx: i64=cx
167 var ty: i64=cy
168 if d==0 { tx=cx+1 }
169 if d==1 { tx=cx-1 }
170 if d==2 { ty=cy+1 }
171 if d==3 { ty=cy-1 }
172 if tx>=1 { if tx<=CR_W-2 { if ty>=1 { if ty<=CR_H-2 {
173 cx=tx; cy=ty
174 if grid[cy*CR_W+cx]==1 { grid[cy*CR_W+cx]=0; carve[nc]=cy*CR_W+cx; nc=nc+1 }
175 } } } }
176 steps=steps+1
177 }
178 g[F_SX]=cx
179 g[F_SY]=cy
180 g[F_NCARVE]=nc
181 return nc
182}
183func cr_populate(g: *i64) -> i64 {
184 let carve: *i64 = (g as i64 + CG_O_CARVE*8) as *i64
185 let item: *i64 = (g as i64 + CG_O_ITEM*8) as *i64
186 let a: *i64 = (g as i64 + CG_O_ENT*8) as *i64
187 en_init(a, CR_CAP, CR_NCOMP)
188 let nc: i64 = g[F_NCARVE]
189 let d: i64 = g[F_DEPTH]
190 var m: i64=0
191 while m<CR_NMON {
192 var placed: i64=0
193 var guard: i64=0
194 while placed==0 {
195 guard=guard+1
196 if guard>200 { placed=1 }
197 let pick: i64 = 1 + (crng(g) % (nc-1))
198 let cell: i64 = carve[pick]
199 let mx: i64 = cell % CR_W
200 let my: i64 = cell / CR_W
201 var clash: i64=0
202 var k: i64=0
203 while k<en_count(a) {
204 let h: i64 = en_nth(a,k)
205 let ox: i64 = en_get(a,h,0)
206 let oy: i64 = en_get(a,h,1)
207 if ox==mx { if oy==my { clash=1 } }
208 k=k+1
209 }
210 if clash==0 { if placed==0 {
211 let h2: i64 = en_spawn(a)
212 if h2!=EN_NULL {
213 en_set(a,h2,0,mx)
214 en_set(a,h2,1,my)
215 let mhp: i64 = CR_MHPB + d*2
216 en_set(a,h2,2,mhp)
217 let mxp: i64 = 15*d
218 en_set(a,h2,3,mxp)
219 g[F_SPAWNED]=g[F_SPAWNED]+1
220 placed=1
221 }
222 } }
223 }
224 m=m+1
225 }
226 var it: i64=0
227 while it<CR_NITEM {
228 var placed2: i64=0
229 var guard2: i64=0
230 while placed2==0 {
231 guard2=guard2+1
232 if guard2>200 { placed2=1 }
233 let pick2: i64 = 1 + (crng(g) % (nc-1))
234 let cell2: i64 = carve[pick2]
235 let ix: i64 = cell2 % CR_W
236 let iy: i64 = cell2 / CR_W
237 var clash2: i64=0
238 var q: i64=0
239 while q<it { if item[q*3]==ix { if item[q*3+1]==iy { clash2=1 } } q=q+1 }
240 if ix==g[F_SX] { if iy==g[F_SY] { clash2=1 } }
241 if clash2==0 { if placed2==0 {
242 item[it*3]=ix
243 item[it*3+1]=iy
244 item[it*3+2]=0
245 placed2=1
246 } }
247 }
248 it=it+1
249 }
250 g[F_PX]=1
251 g[F_PY]=1
252 return 0
253}
254func cr_new(g: *i64, ws: i64) -> i64 {
255 var i: i64=0
256 while i<CR_HDRZ { g[i]=0; i=i+1 }
257 g[F_WS]=ws
258 g[F_DEPTH]=1
259 let l1: i64 = rs_level_for_xp(0, CR_XB, CR_XQ)
260 g[F_LVL]=l1
261 let hp0: i64 = rs_derived_hp(CR_CON, l1, CR_HPB, CR_HPC, CR_HPL)
262 g[F_HP]=hp0
263 cr_genstruct(g)
264 cr_populate(g)
265 let hud: *i64 = (g as i64 + CG_O_HUD*8) as *i64
266 gh_init(hud, 5)
267 return 0
268}
269func cr_serialize(g: *i64, S: *i64) -> i64 {
270 var i: i64=0
271 while i<CR_HDRN { S[i]=g[i]; i=i+1 }
272 let a: *i64 = (g as i64 + CG_O_ENT*8) as *i64
273 let n: i64 = en_count(a)
274 S[CR_HDRN]=n
275 var k: i64=0
276 while k<CR_CAP*4 { S[CR_HDRN+1+k]=0; k=k+1 }
277 k=0
278 while k<n {
279 let h: i64 = en_nth(a,k)
280 let b: i64 = CR_HDRN+1+k*4
281 let v0: i64 = en_get(a,h,0)
282 let v1: i64 = en_get(a,h,1)
283 let v2: i64 = en_get(a,h,2)
284 let v3: i64 = en_get(a,h,3)
285 S[b]=v0
286 S[b+1]=v1
287 S[b+2]=v2
288 S[b+3]=v3
289 k=k+1
290 }
291 let item: *i64 = (g as i64 + CG_O_ITEM*8) as *i64
292 let ib: i64 = CR_HDRN+1+CR_CAP*4
293 var q: i64=0
294 while q<CR_NITEM*3 { S[ib+q]=item[q]; q=q+1 }
295 return CR_NSV
296}
297func cr_restore(g: *i64, S: *i64) -> i64 {
298 var i: i64=0
299 while i<CR_HDRZ { g[i]=0; i=i+1 }
300 g[F_WS]=S[F_WS]
301 g[F_DEPTH]=S[F_DEPTH]
302 cr_genstruct(g)
303 i=0
304 while i<CR_HDRN { g[i]=S[i]; i=i+1 }
305 let a: *i64 = (g as i64 + CG_O_ENT*8) as *i64
306 en_init(a, CR_CAP, CR_NCOMP)
307 let n: i64 = S[CR_HDRN]
308 var k: i64=0
309 while k<n {
310 let b: i64 = CR_HDRN+1+k*4
311 let h: i64 = en_spawn(a)
312 en_set(a,h,0,S[b])
313 en_set(a,h,1,S[b+1])
314 en_set(a,h,2,S[b+2])
315 en_set(a,h,3,S[b+3])
316 k=k+1
317 }
318 let item: *i64 = (g as i64 + CG_O_ITEM*8) as *i64
319 let ib: i64 = CR_HDRN+1+CR_CAP*4
320 var q: i64=0
321 while q<CR_NITEM*3 { item[q]=S[ib+q]; q=q+1 }
322 let hud: *i64 = (g as i64 + CG_O_HUD*8) as *i64
323 gh_init(hud, 5)
324 return 0
325}
326func cr_ckv(ck: i64, v0: i64) -> i64 {
327 var v: i64 = v0
328 if v<0 { v = (0-v)*2+1 } else { v = v*2 }
329 return (ck*131 + v) & 0x7FFFFFFFFFFFFFFF
330}
331func cr_ck(g: *i64) -> i64 {
332 var ck: i64 = 1469598103
333 var i: i64=0
334 while i<CR_HDRN { ck = cr_ckv(ck, g[i]); i=i+1 }
335 let a: *i64 = (g as i64 + CG_O_ENT*8) as *i64
336 let n: i64 = en_count(a)
337 ck = cr_ckv(ck, n)
338 var k: i64=0
339 while k<n {
340 let h: i64 = en_nth(a,k)
341 var c: i64=0
342 while c<4 {
343 let v: i64 = en_get(a,h,c)
344 ck = cr_ckv(ck, v)
345 c=c+1
346 }
347 k=k+1
348 }
349 let item: *i64 = (g as i64 + CG_O_ITEM*8) as *i64
350 var q: i64=0
351 while q<CR_NITEM*3 { ck = cr_ckv(ck, item[q]); q=q+1 }
352 return ck
353}
354func cr_moncell(a: *i64, x: i64, y: i64, skip: i64) -> i64 {
355 var k: i64=0
356 while k<en_count(a) {
357 let h: i64 = en_nth(a,k)
358 if h!=skip {
359 let ox: i64 = en_get(a,h,0)
360 let oy: i64 = en_get(a,h,1)
361 if ox==x { if oy==y { return 1 } }
362 }
363 k=k+1
364 }
365 return 0
366}
367// one game turn. returns the handle of a monster KILLED this turn (0 if none) -- the stale-handle witness.
368func cr_tick(g: *i64) -> i64 {
369 if g[F_WIN]==1 { return 0 }
370 let grid: *i64 = (g as i64 + CG_O_GRID*8) as *i64
371 let a: *i64 = (g as i64 + CG_O_ENT*8) as *i64
372 let item: *i64 = (g as i64 + CG_O_ITEM*8) as *i64
373 var killed: i64 = 0
374 let px: i64 = g[F_PX]
375 let py: i64 = g[F_PY]
376 var adj: i64 = 0
377 var k: i64=0
378 while k<en_count(a) {
379 if adj==0 {
380 let h: i64 = en_nth(a,k)
381 let mx: i64 = en_get(a,h,0)
382 let my: i64 = en_get(a,h,1)
383 let dd: i64 = cabs(mx-px)+cabs(my-py)
384 if dd==1 { adj=h }
385 }
386 k=k+1
387 }
388 // DIALECT: flag vars, no else chains (donor's parser-trap law)
389 var acted: i64=0
390 if adj!=0 {
391 acted=1
392 g[F_ATT]=g[F_ATT]+1
393 let dmg: i64 = 4 + g[F_LVL]*2
394 let mhp: i64 = en_get(a,adj,2) - dmg
395 if mhp<=0 {
396 let reward: i64 = en_get(a,adj,3)
397 let kmx: i64 = en_get(a,adj,0)
398 let kmy: i64 = en_get(a,adj,1)
399 en_destroy(a,adj)
400 killed=adj
401 g[F_KILLS]=g[F_KILLS]+1
402 g[F_XP]=g[F_XP]+reward
403 let nl: i64 = rs_level_for_xp(g[F_XP], CR_XB, CR_XQ)
404 if nl>g[F_LVL] {
405 g[F_LVL]=nl
406 let mh: i64 = rs_derived_hp(CR_CON, nl, CR_HPB, CR_HPC, CR_HPL)
407 g[F_HP]=mh
408 }
409 // ---- THE LOOT WIRING (bit 10, the d2 pattern): every kill rolls through the certified
410 // lt_roll; the killed monster's position feeds the seed; the item is audited in-loop
411 // (duplicate affixes and out-of-range values are VIOLATION COUNTERS the tooth pins to 0);
412 // tier>=2 drops are CAUSAL: they grant a ration the conservation ledger must balance. ----
413 let ltw: *i64 = sys_mmap(8*8) as *i64
414 let lta: *i64 = sys_mmap(8*8) as *i64
415 let law: *i64 = sys_mmap(8*8) as *i64
416 let lalo: *i64 = sys_mmap(8*8) as *i64
417 let lahi: *i64 = sys_mmap(8*8) as *i64
418 cr_tables(ltw,lta,law,lalo,lahi)
419 let oaff: *i64 = sys_mmap(8*8) as *i64
420 let oval: *i64 = sys_mmap(8*8) as *i64
421 let onm: *i64 = sys_mmap(8) as *i64
422 let lseed: i64 = g[F_WS]*1000003 + g[F_KILLS]*8009 + (kmy*CR_W+kmx)*127
423 let tier: i64 = lt_roll(lseed, ltw, lta, CR_NTIER, law, lalo, lahi, CR_NAFF, oaff, oval, onm)
424 if tier>=0 {
425 g[F_DROPS]=g[F_DROPS]+1
426 if tier==0 { g[F_T0]=g[F_T0]+1 }
427 if tier==1 { g[F_T1]=g[F_T1]+1 }
428 if tier==2 { g[F_T2]=g[F_T2]+1 }
429 if tier==3 { g[F_T3]=g[F_T3]+1 }
430 let got: i64 = onm[0]
431 var x: i64=0
432 while x<got {
433 var y: i64=x+1
434 while y<got {
435 if oaff[x]==oaff[y] { g[F_DUPAFF]=g[F_DUPAFF]+1 }
436 y=y+1
437 }
438 let av: i64 = oval[x]
439 let ai: i64 = oaff[x]
440 if av<lalo[ai] { g[F_AFFBAD]=g[F_AFFBAD]+1 }
441 if av>lahi[ai] { g[F_AFFBAD]=g[F_AFFBAD]+1 }
442 x=x+1
443 }
444 if tier>=2 {
445 g[F_RATION]=g[F_RATION]+1
446 g[F_LOOTR]=g[F_LOOTR]+1
447 }
448 }
449 }
450 if mhp>0 { en_set(a,adj,2,mhp) }
451 }
452 if acted==0 { if px==g[F_SX] { if py==g[F_SY] {
453 acted=1
454 g[F_DEPTH]=g[F_DEPTH]+1
455 if g[F_DEPTH]>CR_DEPTH { g[F_WIN]=1 }
456 if g[F_DEPTH]<=CR_DEPTH {
457 let leftover: i64 = en_count(a)
458 g[F_ABAND]=g[F_ABAND]+leftover
459 cr_genstruct(g)
460 cr_populate(g)
461 }
462 } } }
463 if acted==0 { if g[F_WIN]==0 {
464 let pg: *i64 = (g as i64 + CG_O_G*8) as *i64
465 let pf: *i64 = (g as i64 + CG_O_F*8) as *i64
466 let pc: *i64 = (g as i64 + CG_O_CAME*8) as *i64
467 let po: *i64 = (g as i64 + CG_O_OPENF*8) as *i64
468 let pz: *i64 = (g as i64 + CG_O_CLOSED*8) as *i64
469 let pp: *i64 = (g as i64 + CG_O_PATH*8) as *i64
470 let plen: i64 = pf_astar(grid, CR_W, CR_H, px, py, g[F_SX], g[F_SY], pg, pf, pc, po, pz, pp)
471 if plen>=1 {
472 let nxt: i64 = pp[1]
473 let nx: i64 = nxt % CR_W
474 let ny: i64 = nxt / CR_W
475 let occ: i64 = cr_moncell(a, nx, ny, 0)
476 if occ==0 { g[F_PX]=nx; g[F_PY]=ny; g[F_PSTEPS]=g[F_PSTEPS]+1 }
477 }
478 } }
479 let qx: i64 = g[F_PX]
480 let qy: i64 = g[F_PY]
481 var q: i64=0
482 while q<CR_NITEM {
483 if item[q*3+2]==0 { if item[q*3]==qx { if item[q*3+1]==qy {
484 item[q*3+2]=1
485 g[F_RATION]=g[F_RATION]+1
486 g[F_PICKED]=g[F_PICKED]+1
487 } } }
488 q=q+1
489 }
490 if g[F_RATION]>=2 {
491 g[F_RATION]=g[F_RATION]-2
492 g[F_FEAST]=g[F_FEAST]+1
493 g[F_COMB]=g[F_COMB]+1
494 }
495 let maxhp: i64 = rs_derived_hp(CR_CON, g[F_LVL], CR_HPB, CR_HPC, CR_HPL)
496 let hud: *i64 = (g as i64 + CG_O_HUD*8) as *i64
497 if g[F_HP] < maxhp {
498 var edible: i64=0
499 if g[F_FEAST]>0 { edible=edible+1 }
500 if g[F_RATION]>0 { edible=edible+1 }
501 if edible>0 {
502 gh_menu_open(hud, edible)
503 var slot: i64=0
504 if g[F_FEAST]>0 { gh_menu_item(hud, slot, 1, g[F_FEAST]); slot=slot+1 }
505 if g[F_RATION]>0 { gh_menu_item(hud, slot, 2, g[F_RATION]); slot=slot+1 }
506 let choice: i64 = wh_menu_wrapsel(hud, edible)
507 if choice==1 {
508 g[F_FEAST]=g[F_FEAST]-1
509 g[F_HP]=g[F_HP]+CR_HEAL_F
510 g[F_USED]=g[F_USED]+1
511 g[F_EATF]=g[F_EATF]+1
512 }
513 if choice==2 {
514 g[F_RATION]=g[F_RATION]-1
515 g[F_HP]=g[F_HP]+CR_HEAL_R
516 g[F_USED]=g[F_USED]+1
517 g[F_EATR]=g[F_EATR]+1
518 }
519 }
520 if g[F_HP]>maxhp { g[F_HP]=maxhp }
521 }
522 var mI: i64=0
523 var msx: i64=0
524 var msy: i64=0
525 var mtx: i64=0
526 var mty: i64=0
527 var moved: i64=0
528 var occ2: i64=0
529 var occ3: i64=0
530 let mtot: i64 = en_count(a)
531 while mI<mtot {
532 let h2: i64 = en_nth(a,mI)
533 let mx2: i64 = en_get(a,h2,0)
534 let my2: i64 = en_get(a,h2,1)
535 let da: i64 = cabs(mx2-g[F_PX])
536 let db: i64 = cabs(my2-g[F_PY])
537 let d2: i64 = da+db
538 if d2==1 {
539 g[F_HP]=g[F_HP]-CR_BITE
540 g[F_BITES]=g[F_BITES]+1
541 }
542 if d2>1 { if d2<=CR_AGGRO {
543 msx=0
544 if g[F_PX]>mx2 { msx=1 }
545 if g[F_PX]<mx2 { msx=0-1 }
546 moved=0
547 if msx!=0 {
548 mtx=mx2+msx
549 if grid[my2*CR_W+mtx]==0 {
550 occ2 = cr_moncell(a,mtx,my2,h2)
551 var onp: i64=0
552 if mtx==g[F_PX] { if my2==g[F_PY] { onp=1 } }
553 if occ2==0 { if onp==0 { en_set(a,h2,0,mtx); moved=1 } }
554 }
555 }
556 if moved==0 {
557 msy=0
558 if g[F_PY]>my2 { msy=1 }
559 if g[F_PY]<my2 { msy=0-1 }
560 if msy!=0 {
561 mty=my2+msy
562 if grid[mty*CR_W+mx2]==0 {
563 occ3 = cr_moncell(a,mx2,mty,h2)
564 var onp2: i64=0
565 if mx2==g[F_PX] { if mty==g[F_PY] { onp2=1 } }
566 if occ3==0 { if onp2==0 { en_set(a,h2,1,mty) } }
567 }
568 }
569 }
570 } }
571 mI=mI+1
572 }
573 g[F_TURN]=g[F_TURN]+1
574 return killed
575}
576func cr_hudchain(seed: i64, turns: i64, out: *i64) -> i64 {
577 let g: *i64 = sys_mmap(CG_WORDS*8) as *i64
578 cr_new(g, seed)
579 let font: *u8 = font8x8_table()
580 let labels: *i64 = sys_mmap(8*8) as *i64
581 labels[0]="HP" as i64
582 labels[1]="LVL" as i64
583 labels[2]="DEPTH" as i64
584 labels[3]="KILLS" as i64
585 labels[4]="FOOD" as i64
586 let mlabels: *i64 = sys_mmap(8*8) as *i64
587 mlabels[0]="feast" as i64
588 mlabels[1]="ration" as i64
589 let fb: *u8 = sys_mmap(72000)
590 let hud: *i64 = (g as i64 + CG_O_HUD*8) as *i64
591 var chain: i64 = 1469598103
592 var prev: i64 = 0
593 var moved: i64 = 0
594 var t: i64 = 0
595 while t < turns {
596 cr_tick(g)
597 gh_slot_set(hud, 0, g[F_HP])
598 gh_slot_set(hud, 1, g[F_LVL])
599 gh_slot_set(hud, 2, g[F_DEPTH])
600 gh_slot_set(hud, 3, g[F_KILLS])
601 gh_slot_set(hud, 4, g[F_RATION]+g[F_FEAST])
602 var z: i64=0
603 while z<72000 { fb[z]=0 as u8; z=z+1 }
604 gh_render(hud, fb, 200, 120, font, labels, mlabels)
605 let fk: i64 = gh_frame_ck(fb, 200, 120)
606 if t>0 { if fk!=prev { moved=moved+1 } }
607 prev=fk
608 chain = (chain*131 + (fk & 0xFFFFFFFF)) & 0x7FFFFFFFFFFFFFFF
609 t=t+1
610 }
611 out[0]=moved
612 out[1]=gh_ink(fb, 200, 120)
613 out[2]=hud[GH_F_NSEL]
614 return chain
615}
616func cr_decint(b: *u8, at: i64, v0: i64) -> i64 {
617 var a: i64 = at
618 var v: i64 = v0
619 if v < 0 { b[a]=45 as u8; a=a+1; v=0-v }
620 let t: *u8 = sys_mmap(24)
621 var k: i64 = 0
622 if v == 0 { t[0]=48 as u8; k=1 }
623 while v > 0 { t[k]=(48+(v%10)) as u8; v=v/10; k=k+1 }
624 var q: i64 = k-1
625 while q >= 0 { b[a]=t[q]; a=a+1; q=q-1 }
626 return a
627}
628func cr_clearfb(fb: *i64, n: i64, c: i64) -> i64 { var i: i64=0; while i<n { fb[i]=c; i=i+1 } return 0 }
629func cr_filled(fb: *i64, n: i64, bg: i64) -> i64 { var c: i64=0; var i: i64=0; while i<n { if fb[i]!=bg { c=c+1 } i=i+1 } return c }
630func cr_fbck(fb: *i64, n: i64) -> i64 { var ck: i64=1469598103; var i: i64=0; while i<n { ck = cr_ckv(ck, fb[i]); i=i+1 } return ck }
631func cr_run_full(g: *i64) -> i64 {
632 var firstkill: i64=0
633 var go: i64=1
634 while go==1 {
635 if g[F_WIN]==1 { go=0 }
636 if g[F_TURN]>=CR_MAXT { go=0 }
637 if g[F_HP]<=0 { go=0 }
638 if go==1 {
639 let kh: i64 = cr_tick(g)
640 if kh!=0 { if firstkill==0 { firstkill=kh } }
641 }
642 }
643 return firstkill
644}
645func main() -> i64 {
646 ww("=== nx_wire_crawl_gate: does Dungeon Crawl's genre loop actually run on the certified parts? ===\n\n")
647 var pass: i64 = 0
648 var checks: i64 = 0
649 var mask: i64 = 0
650 let SEED: i64 = 5151
651 let g1: *i64 = sys_mmap(CG_WORDS*8) as *i64
652 let g2: *i64 = sys_mmap(CG_WORDS*8) as *i64
653 let S: *i64 = sys_mmap(CR_NSV*8+64) as *i64
654 let S2: *i64 = sys_mmap(CR_NSV*8+64) as *i64
655
656 // ---------- T1 procgen-world (bit 3): deterministic, seed-diverse, stairs reachable ----------
657 checks=checks+1
658 cr_new(g1, SEED)
659 cr_new(g2, SEED)
660 let cka: i64 = cr_ck(g1)
661 let ckb: i64 = cr_ck(g2)
662 cr_new(g2, SEED+1)
663 let grid1: *i64 = (g1 as i64 + CG_O_GRID*8) as *i64
664 let grid2: *i64 = (g2 as i64 + CG_O_GRID*8) as *i64
665 var diff: i64=0
666 var i: i64=0
667 while i<CR_W*CR_H { if grid1[i]!=grid2[i] { diff=diff+1 } i=i+1 }
668 let pg1: *i64 = (g1 as i64 + CG_O_G*8) as *i64
669 let pf1: *i64 = (g1 as i64 + CG_O_F*8) as *i64
670 let pc1: *i64 = (g1 as i64 + CG_O_CAME*8) as *i64
671 let po1: *i64 = (g1 as i64 + CG_O_OPENF*8) as *i64
672 let pz1: *i64 = (g1 as i64 + CG_O_CLOSED*8) as *i64
673 let pp1: *i64 = (g1 as i64 + CG_O_PATH*8) as *i64
674 let plen0: i64 = pf_astar(grid1, CR_W, CR_H, 1, 1, g1[F_SX], g1[F_SY], pg1, pf1, pc1, po1, pz1, pp1)
675 let a1: *i64 = (g1 as i64 + CG_O_ENT*8) as *i64
676 let item1: *i64 = (g1 as i64 + CG_O_ITEM*8) as *i64
677 var badcell: i64=0
678 var k: i64=0
679 while k<en_count(a1) {
680 let h: i64 = en_nth(a1,k)
681 let mx: i64 = en_get(a1,h,0)
682 let my: i64 = en_get(a1,h,1)
683 if grid1[my*CR_W+mx]!=0 { badcell=badcell+1 }
684 k=k+1
685 }
686 k=0
687 while k<CR_NITEM {
688 let ix: i64=item1[k*3]
689 let iy: i64=item1[k*3+1]
690 if grid1[iy*CR_W+ix]!=0 { badcell=badcell+1 }
691 k=k+1
692 }
693 var t1: i64=0
694 if cka==ckb { if diff>=30 { if plen0>=1 { if badcell==0 {
695 ww("T1 GREEN procgen: same seed identical (ck "); wn(cka)
696 ww("), seed+1 differs in "); wn(diff); ww(" cells, stairs reachable (path "); wn(plen0)
697 ww("), 0 off-floor placements\n")
698 t1=1; pass=pass+1
699 mask=mask+cbit(3)
700 } } } }
701 if t1==0 {
702 ww("T1 RED procgen: ckA="); wn(cka); ww(" ckB="); wn(ckb)
703 ww(" diff="); wn(diff); ww(" plen="); wn(plen0); ww(" badcell="); wn(badcell); ww("\n")
704 }
705
706 // ---------- T2 pathfinding-ai (bit 7): the A* path is valid cell-by-cell ----------
707 checks=checks+1
708 var pathok: i64=1
709 i=1
710 while i<=plen0 {
711 let c0: i64 = pp1[i-1]
712 let c1: i64 = pp1[i]
713 let x0: i64 = c0 % CR_W
714 let y0: i64 = c0 / CR_W
715 let x1: i64 = c1 % CR_W
716 let y1: i64 = c1 / CR_W
717 let ad: i64 = cabs(x1-x0)+cabs(y1-y0)
718 if ad!=1 { pathok=0 }
719 if grid1[c1]!=0 { pathok=0 }
720 i=i+1
721 }
722 var t2: i64=0
723 if plen0>=1 { if pathok==1 {
724 ww("T2 GREEN pathfinding: pf_astar path of "); wn(plen0)
725 ww(" steps is 4-adjacent floor cell-by-cell (the part drives every player move)\n")
726 t2=1; pass=pass+1
727 mask=mask+cbit(7)
728 } }
729 if t2==0 { ww("T2 RED pathfinding: plen="); wn(plen0); ww(" pathok="); wn(pathok); ww("\n") }
730
731 // ---------- full deterministic run (the actual game) ----------
732 cr_new(g1, SEED)
733 let fk: i64 = cr_run_full(g1)
734 let a1b: *i64 = (g1 as i64 + CG_O_ENT*8) as *i64
735 let fck: i64 = cr_ck(g1)
736 let runwin: i64 = g1[F_WIN]
737 let runturn: i64 = g1[F_TURN]
738 let runkills: i64 = g1[F_KILLS]
739 let runxp: i64 = g1[F_XP]
740 let runlvl: i64 = g1[F_LVL]
741 ww(" [run] turns="); wn(g1[F_TURN]); ww(" depth="); wn(g1[F_DEPTH]); ww(" win="); wn(g1[F_WIN])
742 ww(" kills="); wn(g1[F_KILLS]); ww(" xp="); wn(g1[F_XP]); ww(" level="); wn(g1[F_LVL])
743 ww(" hp="); wn(g1[F_HP]); ww(" picked="); wn(g1[F_PICKED]); ww(" lootr="); wn(g1[F_LOOTR])
744 ww(" drops="); wn(g1[F_DROPS]); ww(" used="); wn(g1[F_USED]); ww(" combines="); wn(g1[F_COMB])
745 ww(" psteps="); wn(g1[F_PSTEPS]); ww(" ck="); wn(fck); ww("\n")
746
747 // ---------- T3 entity-component-sim (bit 6): stale handle refused, census exact ----------
748 checks=checks+1
749 var t3: i64=0
750 var stale: i64=0-1
751 if fk!=0 { stale = en_valid(a1b, fk) }
752 let alive: i64 = en_count(a1b)
753 let census: i64 = g1[F_SPAWNED] - g1[F_KILLS] - g1[F_ABAND]
754 if fk!=0 { if stale==0 { if alive==census {
755 ww("T3 GREEN entity store: first-killed monster's handle "); wn(fk)
756 ww(" is DETECTABLY STALE (en_valid=0); census exact: spawned "); wn(g1[F_SPAWNED])
757 ww(" - kills "); wn(g1[F_KILLS]); ww(" - abandoned-on-descend "); wn(g1[F_ABAND])
758 ww(" = alive "); wn(alive); ww("\n")
759 t3=1; pass=pass+1
760 mask=mask+cbit(6)
761 } } }
762 if t3==0 {
763 ww("T3 RED entity: firstkill="); wn(fk); ww(" stale-valid="); wn(stale)
764 ww(" alive="); wn(alive); ww(" census="); wn(census); ww("\n")
765 }
766
767 // ---------- T4 rpg-stats-progression (bit 9) ----------
768 checks=checks+1
769 let wantlvl: i64 = rs_level_for_xp(g1[F_XP], CR_XB, CR_XQ)
770 let maxhp: i64 = rs_derived_hp(CR_CON, g1[F_LVL], CR_HPB, CR_HPC, CR_HPL)
771 let thresh: i64 = rs_xp_for_level(g1[F_LVL], CR_XB, CR_XQ)
772 var t4: i64=0
773 if g1[F_XP]>0 { if g1[F_LVL]>1 { if g1[F_LVL]==wantlvl { if g1[F_HP]<=maxhp { if g1[F_XP]>=thresh {
774 ww("T4 GREEN rpgstats: xp "); wn(g1[F_XP]); ww(" -> level "); wn(g1[F_LVL])
775 ww(" == rs_level_for_xp EXACT (threshold "); wn(thresh); ww(" <= xp), hp "); wn(g1[F_HP])
776 ww(" <= derived max "); wn(maxhp); ww("\n")
777 t4=1; pass=pass+1
778 mask=mask+cbit(9)
779 } } } } }
780 if t4==0 {
781 ww("T4 RED rpgstats: xp="); wn(g1[F_XP]); ww(" lvl="); wn(g1[F_LVL])
782 ww(" want="); wn(wantlvl); ww(" hp="); wn(g1[F_HP]); ww(" maxhp="); wn(maxhp); ww("\n")
783 }
784
785 // ---------- T5 inventory-crafting (bit 11): ledger conserves exactly, LOOT INCLUDED ----------
786 checks=checks+1
787 // rations entering the economy = picked up + granted by loot; every one is held, eaten, or crafted
788 let led1: i64 = g1[F_RATION] + g1[F_EATR] + 2*g1[F_COMB]
789 let led2: i64 = g1[F_FEAST] + g1[F_EATF]
790 var t5: i64=0
791 // Floors DERIVED for the loot economy (first live run, seed 5151: picked=1 lootr=5 and both
792 // conservation equalities EXACT): the pickup MECHANISM needs one witness (>=1), and the donor's
793 // volume bar -- 3 rations entering the economy -- is now fed by BOTH inflows (picked + loot).
794 // Weakening would be keeping >=3 on picked alone and calling 6 total insufficient.
795 if g1[F_PICKED]>=1 { if g1[F_PICKED]+g1[F_LOOTR]>=3 { if g1[F_USED]>=1 { if g1[F_COMB]>=1 {
796 if g1[F_PICKED]+g1[F_LOOTR]==led1 { if g1[F_COMB]==led2 {
797 ww("T5 GREEN inventory-crafting: picked "); wn(g1[F_PICKED]); ww(" + loot-granted ")
798 wn(g1[F_LOOTR]); ww(" == held "); wn(g1[F_RATION]); ww(" + eaten "); wn(g1[F_EATR])
799 ww(" + 2*crafted "); wn(g1[F_COMB]); ww("; feasts "); wn(g1[F_COMB]); ww(" == held ")
800 wn(g1[F_FEAST]); ww(" + eaten "); wn(g1[F_EATF]); ww(" (conserved WITH the loot inflow)\n")
801 t5=1; pass=pass+1
802 mask=mask+cbit(11)
803 } }
804 } } } }
805 if t5==0 {
806 ww("T5 RED inventory: picked="); wn(g1[F_PICKED]); ww(" lootr="); wn(g1[F_LOOTR])
807 ww(" led1="); wn(led1); ww(" comb="); wn(g1[F_COMB]); ww(" led2="); wn(led2)
808 ww(" used="); wn(g1[F_USED]); ww("\n")
809 }
810
811 // ---------- T6 save-load TRANSPARENCY (bit 15, FLAGSHIP) ----------
812 checks=checks+1
813 let bank: *i64 = sys_mmap((CR_T2W-CR_T1W+2)*8) as *i64
814 cr_new(g1, SEED)
815 var t: i64=0
816 while t<CR_T1W { cr_tick(g1); t=t+1 }
817 let g1a: *i64 = (g1 as i64 + CG_O_ENT*8) as *i64
818 let nv_alive: i64 = en_count(g1a)
819 let nv_xp: i64 = g1[F_XP]
820 let nv_picked: i64 = g1[F_PICKED]
821 let nv_drops: i64 = g1[F_DROPS]
822 let ckt1: i64 = cr_ck(g1)
823 bank[0]=ckt1
824 t=CR_T1W
825 while t<CR_T2W { cr_tick(g1); t=t+1; let c: i64 = cr_ck(g1); bank[t-CR_T1W]=c }
826 let contwin: i64 = g1[F_WIN]
827 cr_new(g2, SEED)
828 t=0
829 while t<CR_T1W { cr_tick(g2); t=t+1 }
830 cr_serialize(g2,S2)
831 let sr: i64 = gs_save("knowledge/nx_wire_crawl_mid.sav" as *u8, CR_SCHEMA, S2, CR_NSV, 20260823)
832 var zi: i64=0
833 while zi<CG_WORDS { g2[zi]=0; zi=zi+1 }
834 let Sl: *i64 = sys_mmap(CR_NSV*8+64) as *i64
835 let lr: i64 = gs_load("knowledge/nx_wire_crawl_mid.sav" as *u8, Sl, CR_NSV, 0 as *i64)
836 cr_restore(g2, Sl)
837 let ckr: i64 = cr_ck(g2)
838 var mismatch: i64=0
839 if ckr!=bank[0] { mismatch=mismatch+1 }
840 t=CR_T1W
841 while t<CR_T2W {
842 cr_tick(g2)
843 t=t+1
844 let c2: i64 = cr_ck(g2)
845 if c2!=bank[t-CR_T1W] { mismatch=mismatch+1 }
846 }
847 cr_serialize(g1,S)
848 cr_serialize(g2,S2)
849 var fdiff: i64=0
850 i=0
851 while i<CR_NSV { if S[i]!=S2[i] { fdiff=fdiff+1 } i=i+1 }
852 var t6: i64=0
853 if sr>0 { if lr==CR_NSV { if mismatch==0 { if fdiff==0 { if nv_alive>=1 { if nv_xp>0 { if nv_picked+nv_drops>=1 { if contwin==0 {
854 ww("T6 GREEN save/load TRANSPARENT: save at turn "); wn(CR_T1W)
855 ww(" -> load into ZEROED arena -> resume to "); wn(CR_T2W)
856 ww(": all "); wn(CR_T2W-CR_T1W+1); ww(" per-turn checksums identical, 0/"); wn(CR_NSV)
857 ww(" state fields differ (loot counters INSIDE the save; non-trivial world: alive="); wn(nv_alive)
858 ww(" xp="); wn(nv_xp); ww(" picked="); wn(nv_picked); ww(")\n")
859 t6=1; pass=pass+1
860 mask=mask+cbit(15)
861 } } } } } } } }
862 if t6==0 {
863 ww("T6 RED transparency: save="); wn(sr); ww(" load="); wn(lr)
864 ww(" ck-mismatches="); wn(mismatch); ww(" field-diffs="); wn(fdiff)
865 ww(" alive="); wn(nv_alive); ww(" xp="); wn(nv_xp); ww(" picked="); wn(nv_picked)
866 ww(" contwin="); wn(contwin); ww("\n")
867 }
868
869 // ---------- T7 corruption refused, state untouched ----------
870 checks=checks+1
871 let lenp: *i64 = sys_mmap(8) as *i64
872 lenp[0]=0
873 let raw: *u8 = sys_read_file("knowledge/nx_wire_crawl_mid.sav" as *u8, lenp)
874 var t7: i64=0
875 if (raw as i64)!=0 {
876 let rl: i64 = lenp[0]
877 let flip: i64 = 48+24
878 raw[flip] = (raw[flip] as i64 ^ 255) as u8
879 let cfd: i64 = sys_openat_wr("knowledge/nx_wire_crawl_corrupt.sav" as *u8, 0x1a4)
880 if cfd>=0 {
881 sys_write(cfd, raw, rl)
882 sys_close(cfd)
883 let Sc: *i64 = sys_mmap(CR_NSV*8+64) as *i64
884 Sc[0]=777777
885 let cr: i64 = gs_load("knowledge/nx_wire_crawl_corrupt.sav" as *u8, Sc, CR_NSV, 0 as *i64)
886 if cr==(0-6) { if Sc[0]==777777 { t7=1 } }
887 if t7==1 {
888 ww("T7 GREEN corruption refused LOUD (rc=-6 CHECKSUM-CORRUPT) and caller state untouched\n")
889 pass=pass+1
890 } else {
891 ww("T7 RED corrupt load rc="); wn(cr); ww(" sentinel="); wn(Sc[0]); ww("\n")
892 }
893 } else { ww("T7 RED cannot write corrupt copy\n") }
894 } else { ww("T7 RED cannot read the mid-save back\n") }
895
896 // ---------- T8 determinism: two independent full runs, bit-identical ----------
897 checks=checks+1
898 cr_new(g2, SEED)
899 cr_run_full(g2)
900 let fck2: i64 = cr_ck(g2)
901 var t8: i64=0
902 if fck==fck2 { if runwin==g2[F_WIN] {
903 ww("T8 GREEN deterministic: two independent full runs -> identical final checksum "); wn(fck)
904 ww(" at turn "); wn(g2[F_TURN]); ww("\n")
905 t8=1; pass=pass+1
906 } }
907 if t8==0 { ww("T8 RED run1 ck="); wn(fck); ww(" run2 ck="); wn(fck2); ww("\n") }
908
909 // ---------- T9 anti-vacuity: the LOOP is a real game that was actually played and WON ----------
910 checks=checks+1
911 var t9: i64=0
912 if g2[F_WIN]==1 { if g2[F_TURN]>20 { if g2[F_TURN]<CR_MAXT { if g2[F_KILLS]>=4 { if g2[F_DEPTH]==CR_DEPTH+1 { if g2[F_HP]>0 {
913 ww("T9 GREEN the game was PLAYED and WON: "); wn(CR_DEPTH); ww(" dungeon levels cleared in ")
914 wn(g2[F_TURN]); ww(" turns, "); wn(g2[F_KILLS]); ww(" kills, survived at hp "); wn(g2[F_HP]); ww("\n")
915 t9=1; pass=pass+1
916 } } } } } }
917 if t9==0 {
918 ww("T9 RED loop hollow: win="); wn(g2[F_WIN]); ww(" turns="); wn(g2[F_TURN])
919 ww(" kills="); wn(g2[F_KILLS]); ww(" depth="); wn(g2[F_DEPTH]); ww(" hp="); wn(g2[F_HP]); ww("\n")
920 }
921
922 // ---------- T10 ui-menus-hud (bit 18): menu CAUSES the eats; HUD binds live state per turn ----------
923 checks=checks+1
924 let hud2: *i64 = (g2 as i64 + CG_O_HUD*8) as *i64
925 let menusel: i64 = hud2[GH_F_NSEL]
926 let o10a: *i64 = sys_mmap(4*8) as *i64
927 let o10b: *i64 = sys_mmap(4*8) as *i64
928 let ch10a: i64 = cr_hudchain(SEED, CR_T2W, o10a)
929 let ch10b: i64 = cr_hudchain(SEED, CR_T2W, o10b)
930 var t10: i64=0
931 if ch10a==ch10b { if o10a[0]>=2 { if o10a[1]>=CR_HUDINK { if menusel>=1 { if menusel==g2[F_USED] {
932 ww("T10 GREEN ui-menus-hud: "); wn(menusel); ww(" eats ALL caused by menu selections (nsel==used), HUD ")
933 ww("render chain deterministic over "); wn(CR_T2W); ww(" turns ("); wn(o10a[0])
934 ww(" frame changes, "); wn(o10a[1]); ww(" ink px)\n")
935 t10=1; pass=pass+1
936 mask=mask+cbit(18)
937 } } } } }
938 if t10==0 {
939 ww("T10 RED ui-menus-hud: chA="); wn(ch10a); ww(" chB="); wn(ch10b)
940 ww(" changes="); wn(o10a[0]); ww(" ink="); wn(o10a[1])
941 ww(" nsel="); wn(menusel); ww(" used="); wn(g2[F_USED]); ww("\n")
942 }
943
944 // ---------- T11 text-render-typography (bit 14): state-bound glyph status line, ink EXACT ----------
945 checks=checks+1
946 let font11: *u8 = font8x8_table()
947 let fb11: *u8 = sys_mmap(72000)
948 let fb11b: *u8 = sys_mmap(72000)
949 let fb11c: *u8 = sys_mmap(72000)
950 let s11: *u8 = sys_mmap(64)
951 var sl: i64 = 0
952 s11[sl]=84 as u8; sl=sl+1
953 sl = cr_decint(s11, sl, g2[F_TURN])
954 s11[sl]=88 as u8; sl=sl+1
955 sl = cr_decint(s11, sl, g2[F_XP])
956 s11[sl]=75 as u8; sl=sl+1
957 sl = cr_decint(s11, sl, g2[F_KILLS])
958 s11[sl]=0 as u8
959 let s11c: *u8 = sys_mmap(64)
960 var slc: i64 = 0
961 s11c[slc]=84 as u8; slc=slc+1
962 slc = cr_decint(s11c, slc, CR_T1W)
963 s11c[slc]=88 as u8; slc=slc+1
964 slc = cr_decint(s11c, slc, nv_xp)
965 s11c[slc]=0 as u8
966 var exp11: i64 = 0
967 var ci11: i64 = 0
968 while s11[ci11]!=(0 as u8) {
969 let ch11: i64 = s11[ci11] & 0xff
970 let go11: i64 = (ch11-0x20)*8
971 var r11: i64 = 0
972 while r11<8 {
973 var b11: i64 = font11[go11+r11] & 0xff
974 while b11>0 { exp11 = exp11 + (b11%2); b11=b11/2 }
975 r11=r11+1
976 }
977 gh_glyph(fb11, 200, 120, font11, ch11, 4+ci11*9, 8)
978 gh_glyph(fb11b, 200, 120, font11, ch11, 4+ci11*9, 8)
979 ci11=ci11+1
980 }
981 var cc11: i64 = 0
982 while s11c[cc11]!=(0 as u8) {
983 gh_glyph(fb11c, 200, 120, font11, s11c[cc11] & 0xff, 4+cc11*9, 8)
984 cc11=cc11+1
985 }
986 let ink11: i64 = gh_ink(fb11, 200, 120)
987 let cka11: i64 = gh_frame_ck(fb11, 200, 120)
988 let ckb11: i64 = gh_frame_ck(fb11b, 200, 120)
989 let ckc11: i64 = gh_frame_ck(fb11c, 200, 120)
990 var t11: i64=0
991 if exp11>0 { if ink11==exp11 { if cka11==ckb11 { if ckc11!=cka11 { if sl>=6 { if slc>=4 {
992 ww("T11 GREEN text-render: status line "); ww(s11); ww(" drawn as "); wn(sl)
993 ww(" glyphs, ink "); wn(ink11); ww(" px == font-table-derived expectation EXACT, deterministic, ")
994 ww("and the mid-save state renders a DIFFERENT frame (state-bound, not a cached bitmap)\n")
995 t11=1; pass=pass+1
996 mask=mask+cbit(14)
997 } } } } } }
998 if t11==0 {
999 ww("T11 RED text-render: exp="); wn(exp11); ww(" ink="); wn(ink11)
1000 ww(" ckA="); wn(cka11); ww(" ckB="); wn(ckb11); ww(" ckC="); wn(ckc11)
1001 ww(" sl="); wn(sl); ww(" slc="); wn(slc); ww("\n")
1002 }
1003
1004 // ---------- T12 asset-pipeline-import (bit 25): WON run's victory screen renders the canonical
1005 // Stanford mesh through the certified OBJ chain (nx_bunny_gate's own calibrated view, reused) ----------
1006 checks=checks+1
1007 let tw12: i64 = 300
1008 let th12: i64 = 300
1009 let npx12: i64 = tw12*th12
1010 let bg12: i64 = 24 + 26*256 + 34*65536
1011 let fb12: *i64 = sys_mmap(npx12*8) as *i64
1012 let zb12: *i64 = sys_mmap(npx12*8) as *i64
1013 tm_set_spec(0)
1014 tm_set_tex(0)
1015 let ok12: i64 = obj_load("knowledge/stdassets/bunny.obj" as *u8, 1300, 205+200*256+195*65536)
1016 let nv12: i64 = tm_nv()
1017 let nt12: i64 = tm_nt()
1018 cr_clearfb(fb12, npx12, bg12)
1019 trimesh_zclear(zb12, npx12)
1020 trimesh_render(fb12, zb12, tw12, th12, 1300, 0-250, 2300, 520, 2)
1021 let fil12: i64 = cr_filled(fb12, npx12, bg12)
1022 let rck12: i64 = cr_fbck(fb12, npx12)
1023 cr_clearfb(fb12, npx12, bg12)
1024 trimesh_zclear(zb12, npx12)
1025 trimesh_render(fb12, zb12, tw12, th12, 1300, 0-250, 2300, 520, 2)
1026 let rck12b: i64 = cr_fbck(fb12, npx12)
1027 var t12: i64=0
1028 if g2[F_WIN]==1 { if ok12==1 { if nv12==35947 { if nt12==69451 { if tm_ovf()==0 { if fil12>npx12/12 { if rck12==rck12b {
1029 ww("T12 GREEN asset-import: WON run's victory screen renders the imported standard mesh -- ")
1030 ww("EXACT canonical Stanford counts (35947/69451, provenance by the numbers), ")
1031 wn(fil12); ww(" px rasterized (floor npx/12 = the part's own gate calibration), deterministic\n")
1032 t12=1; pass=pass+1
1033 mask=mask+cbit(25)
1034 } } } } } } }
1035 if t12==0 {
1036 ww("T12 RED asset-import: win="); wn(g2[F_WIN]); ww(" ok="); wn(ok12)
1037 ww(" nv="); wn(nv12); ww(" nt="); wn(nt12); ww(" ovf="); wn(tm_ovf())
1038 ww(" filled="); wn(fil12); ww(" ckA="); wn(rck12); ww(" ckB="); wn(rck12b); ww("\n")
1039 }
1040
1041 // ---------- T13 loot-item-tables (bit 10, THE CRAWL ADDITION): every kill rolls through the
1042 // certified lt_roll; the histogram partition must SUM; the in-loop audits must be clean; and the
1043 // loot inflow must equal what the ledger absorbed (t2+t3 == lootr, the causal coupling). ----------
1044 checks=checks+1
1045 let histsum: i64 = g2[F_T0]+g2[F_T1]+g2[F_T2]+g2[F_T3]
1046 var t13: i64=0
1047 if g2[F_DROPS]==g2[F_KILLS] { if g2[F_KILLS]>=4 { if histsum==g2[F_DROPS] {
1048 if g2[F_DUPAFF]==0 { if g2[F_AFFBAD]==0 { if g2[F_LOOTR]==g2[F_T2]+g2[F_T3] {
1049 ww("T13 GREEN loot: "); wn(g2[F_DROPS]); ww(" drops == "); wn(g2[F_KILLS])
1050 ww(" kills (every kill rolled); tier histogram "); wn(g2[F_T0]); ww("/"); wn(g2[F_T1])
1051 ww("/"); wn(g2[F_T2]); ww("/"); wn(g2[F_T3]); ww(" SUMS to drops; 0 duplicate-affix and 0 ")
1052 ww("out-of-range violations across the campaign; loot-granted rations "); wn(g2[F_LOOTR])
1053 ww(" == tier2+tier3 drops EXACT (the loot is causal in the economy)\n")
1054 t13=1; pass=pass+1
1055 mask=mask+cbit(10)
1056 } } }
1057 } } }
1058 if t13==0 {
1059 ww("T13 RED loot: drops="); wn(g2[F_DROPS]); ww(" kills="); wn(g2[F_KILLS])
1060 ww(" hist="); wn(g2[F_T0]); ww("/"); wn(g2[F_T1]); ww("/"); wn(g2[F_T2]); ww("/"); wn(g2[F_T3])
1061 ww(" dupaff="); wn(g2[F_DUPAFF]); ww(" affbad="); wn(g2[F_AFFBAD])
1062 ww(" lootr="); wn(g2[F_LOOTR]); ww("\n")
1063 }
1064
1065 // ---------- wiring evidence artifact: measured mask + run summary (board cross-checks payload[0]) ----------
1066 let art: *i64 = sys_mmap(16*8) as *i64
1067 art[0]=mask
1068 art[1]=fck
1069 art[2]=runturn
1070 art[3]=runkills
1071 art[4]=runxp
1072 art[5]=runlvl
1073 art[6]=CR_DEPTH
1074 art[7]=runwin
1075 let aw: i64 = gs_save("knowledge/nx_wire_crawl.sav" as *u8, CR_ART_SCHEMA, art, 8, 20260823)
1076 ww("\nwiring artifact knowledge/nx_wire_crawl.sav bytes="); wn(aw)
1077 ww(" exercised_mask="); wn(mask); ww(" (bits 3,6,7,9,10,11,14,15,18,25 when all their teeth pass)\n")
1078
1079 ww("\n=== nx_wire_crawl_gate "); wn(pass); ww("/"); wn(checks)
1080 if pass == checks { ww(" GREEN ===\n") } else { ww(" RED ===\n") }
1081 let ctr__v: *i64 = gv_ctr()
1082 ctr__v[0] = pass
1083 ctr__v[1] = checks
1084 let rc__v: i64 = gv_verdict("WIRE-CRAWL-GATE" as *u8, ctr__v, "the 4th wired title: NetHack's proven loop + the d2 loot pattern, mask measured not asserted" as *u8)
1085 sys_exit(rc__v)
1086 return rc__v
1087}