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}