code wiki / _hdl_build / nx_wasm_craft_inspection_distance_t218.nx
nx_wasm_craft_inspection_distance_t218.nx
buildroot/runtime/_hdl_build/nx_wasm_craft_inspection_distance_t218.nx
about
nx_wasm_craft.nx -- NISHI CRAFT: a GENERATED 3D VOXEL WORLD, playable first-person. The operator's
2026-05-19 vision ("build minecraft equivalent on the lowest possible hardware") finally EMITTING:
procedural terrain (integer value-noise heightmap, biome banding, water, trees) in a 64x32x64 block
grid, rendered by a per-pixel integer DDA raycast (true 3D: block faces, face shading, distance fog,
sky), walked in first person (collision, auto-step-up, water float), and EDITED live (break/place at
the crosshair). Every pixel and every world byte is NishiLang; base-relative so the identical code
runs natively (gate, PNG proof) and as wasm (browser page); input arrives through nx_input_abstract
(keyboard/gamepad/touch all work on day one).
Controls (via the input layer's semantic actions): W/S or Up/Down = walk, A/D or Left/Right = turn,
R/F = look up/down (bound to the MENU/PAUSE bits -- the 8-action mask is fully spent; widening it
to 16 actions is the filed follow-up), E = break block, B = place stone. Touch d-pad works: center
tap = break.
license_tier: ORIGINAL
dependencies 20 imports · 1 importers
diagram shows first 10 each side; +10 more imports, +0 more importers in the complete lists below.
imports: nx_syscalls.nxnx_itrig.nxnx_input_abstract.nxnx_atmosphere.nxnx_weather_lib.nxnx_softbind.nxnx_skeleton.nxnx_skin_ita.nxnx_nxa_rig_motion_context.nxnx_nxa_anim_lib.nxnx_morf_draw_core.nxnx_nxa_morf_draw_admit.nxnx_entity_store.nxnx_gamesave_core.nxnx_indoorgen_data.nxnx_worldpipe_core.nxnx_genp_allow_lib.nxnx_perf_lib.nxnx_beach_release_recipe_move_t72.nxnx_beach_contact_sweep.nx
imported by: nx_inspection_distance_gate_t218.nx
structs
| none |
consts
| 45 | const WATER_MAGIC_16777216: i64 = 16777216 |
| 46 | const EJRN_HASH_MUL: i64 = 40503 |
| 47 | const WATER_MAGIC_33554431: i64 = 33554431 |
| 48 | const TERRAIN_HASH_X: i64 = 374761393 |
| 49 | const TERRAIN_HASH_Z: i64 = 668265263 |
| 50 | const TERRAIN_HASH_SEED: i64 = 1442695041 |
| 51 | const SAVE_CK_MASK: i64 = 4611686018427387903 |
| 52 | const TERRAIN_HASH_MIX: i64 = 1274126177 |
| 53 | const RAY_HUGE: i64 = 1099511627776 |
| 54 | const WATER_MAGIC_65536: i64 = 65536 |
| 55 | const WATER_MAGIC_4096: i64 = 4096 |
| 56 | const WATER_MAGIC_1048576: i64 = 1048576 |
| 57 | const WATER_MAGIC_1536: i64 = 1536 |
| 58 | const WATER_MAGIC_6144: i64 = 6144 |
| 59 | const GENE_MASK_TEMPERAMENT: i64 = 57344 |
| 60 | const SAVE_CK_SEED: i64 = 1469598103 |
| 61 | const SAVE_CK_PRIME: i64 = 1099511 |
| 62 | const WATER_MAGIC_2400: i64 = 2400 |
| 63 | const WATER_MAGIC_2500: i64 = 2500 |
| 64 | const WATER_MAGIC_1400: i64 = 1400 |
| 65 | const CRAFT_DEFAULT_SEED: i64 = 20260728 |
| 106 | const W: i64 = 1920 |
| 107 | const H: i64 = 1200 |
| 108 | const WASM_PAGE_BYTES: i64 = 65536 |
| 114 | const WASM_PAGES: i64 = 364 |
| 115 | const WASM_MEM_BYTES: i64 = WASM_PAGES * WASM_PAGE_BYTES |
| 127 | const RES: i64 = 2 // ray per RESxRES pixel block (240x150 rays) |
| 128 | const RW: i64 = 240 |
| 129 | const RH: i64 = 150 |
| 130 | const FOC: i64 = 120 // ~90 degree fov at RW=240 |
| 135 | const Q_MAX: i64 = 24 |
| 136 | const Q_START: i64 = 5 |
| 153 | const FB_COLOR_MASK: i64 = 16777215 |
| 154 | const FB_DEPTH_SHIFT: i64 = 32 |
| 155 | const FB_DEPTH_MAX: i64 = 16777215 |
| 161 | const HUD_DESIGN_W: i64 = 480 |
| 162 | const HUD_PIP_MAX: i64 = 24 |
| 163 | const HUD_HOTBAR_N: i64 = 7 |
| 165 | const WX: i64 = 128 // world blocks (v2: 4x the area, taller) |
| 166 | const WY: i64 = 48 |
| 167 | const WZ: i64 = 128 |
| 168 | const WATER_H: i64 = 9 |
| 172 | const B_FARM: i64 = 12 // tilled farmland, dry |
| 173 | const B_CROP0: i64 = 13 // crop sprout (placed by SEEDS onto farmland) |
| 174 | const B_CROP1: i64 = 14 // crop growing |
| 175 | const B_CROP2: i64 = 15 // crop MATURE -- breaking it is the HARVEST |
| 176 | const B_FARMW: i64 = 16 // farmland, wet (rain or water within the 5x5 ring) |
| 182 | const O_FB: i64 = 3592832 // W*H i64 packed R|G<<8|B<<16 (at the arena tail; see CRAFT_TOTAL) |
| 183 | const O_ST: i64 = 1152000 // 64 state slots |
| 184 | const O_INPUT: i64 = 1152512 // nx_input_abstract arena (64 words) |
| 185 | const O_VOX: i64 = 1153024 // WX*WY*WZ u8 blocks |
| 186 | const O_MOBS: i64 = 1939456 // nx_entity_store arena (certified part): en_bytes(16,7)=1632 |
| 187 | const MOB_CAP: i64 = 16 |
| 188 | const MOB_NCOMP: i64 = 7 |
| 189 | const MOB_BYTES: i64 = 1632 |
| 190 | const O_SPEC: i64 = 1941120 // GAME SPEC block (64 words) -- AFTER the arena's 1632B end |
| 191 | const O_EJRN: i64 = 1941760 // EDIT JOURNAL: 8192 packed i64 hash slots at ABSOLUTE world |
| 193 | const EJRN_SLOTS: i64 = 8192 |
| 194 | const EJRN_BYTES: i64 = 65536 |
| 195 | const O_SAVE_LEGACY:i64=2730336 // retained old image region; live soft-body state starts after its v6 extent |
| 196 | const SAVE_HDR: i64 = 128 |
| 197 | const SAVE_RECIPE_COUNT:i64=17 |
| 198 | const SAVE_RECIPE_BYTES:i64=(SAVE_RECIPE_COUNT+1)*8 |
| 199 | const SAVE_BODY_V6: i64 = 853600 // legacy voxels + mobs + journal |
| 200 | const SAVE_BODY: i64 = SAVE_BODY_V6 + SAVE_RECIPE_BYTES |
| 201 | const SAVE_BODY_V5: i64 = 788064 // pre-streaming body (load-compat: v5 saves still open) |
| 202 | const SAVE_LEN: i64 = SAVE_HDR + SAVE_BODY |
| 203 | const O_MOBAUX: i64 = 2729952 // 16 mobs x (dx,dz,dy) last-applied step, i64 triples |
| 221 | const O_MOBHDG: i64 = 2729696 |
| 222 | const O_MOBVY: i64 = 2729824 // GE12: 16 mobs x 1 word VERTICAL VELOCITY Q8/tick (128B, the slack |
| 227 | const O_SOFT: i64 = 3584064 // A4 soft-body springs: 16 mobs x SB_PTS(6, R7 regions) x SD_STRIDE words. |
| 230 | const O_NEED: i64 = 3588672 // C1 needs: 16 mobs x 4 words (hunger, energy, social, spare). |
| 232 | const O_MIND: i64 = 3589184 // C3/C5 THE INNER LIFE: 16 girls x 24 words -- 8 THOUGHT |
| 237 | const O_PASS: i64 = 3592256 // THE TRAVELER'S PASSPORT (the isekai carry): the |
| 243 | const PASS_MAGIC: i64 = 20260802001 |
| 244 | const PASS_LEN: i64 = 192 // 24 wire words: [0]magic [1]ver [2]charseed [3]broken |
| 249 | const O_GENP: i64 = 3592640 // W1c GEN-TIME RECIPE OVERRIDES (192B): [0] magic, [1] n, |
| 255 | const GENP_MAGIC: i64 = 20260813001 |
| 256 | const GENP_MAXP: i64 = 11 |
| 266 | const O_RIG: i64 = O_FB + W*H*8 |
| 270 | const RIG_BYTES: i64 = 188736 |
| 271 | const O_PROJ: i64 = O_RIG + RIG_BYTES |
| 272 | const PROJ_MAXV: i64 = 211 // projected-vertex slots == RIG_VERT_TOTAL (declared beside the |
| 279 | const PROJ_BYTES: i64 = PROJ_MAXV * 24 |
| 280 | const O_SKIN3: i64 = O_PROJ + PROJ_BYTES // 3-word sRGB scratch for nx_skin_ita's out3 (wasm has no |
| 303 | const WC_CAST_N: i64 = 12 // the cast genmobs places (placed < WC_CAST_N); hair state is sized to it |
| 304 | const HG_MOBS: i64 = WC_CAST_N |
| 305 | const HG_NP: i64 = 8 // points per HSTR strand: the section contract (GR_PTS in nx_nxa_groom) |
| 306 | const HG_W: i64 = HG_NP*3 // words per strand (GR_WORDS) |
| 307 | const HG_NSEG: i64 = HG_NP - 1 |
| 308 | const HG_REND_MAX: i64 = 1200 // render strands: the page's shipped NXH_GUIDES budget, PRESERVED and moved here |
| 309 | const HG_SIM: i64 = 128 // simulated guides per girl. PICKED, named as picked: 1200/128 = 9.4 render |
| 313 | const HG_TEX_SR: i64 = 4 // strands per guide-texture row: rows = strands/4 keep every hair texture under |
| 315 | const HG_TAB_W: i64 = 8 // render-strand table row: [rest-idx nb1 nb2 w1 w2 lockw spanz 0] |
| 316 | const HG_CAP_MAX: i64 = 32 // collider slots (mask bits): head neck 2 shoulders 2 arms torso + DYNA anchors |
| 317 | const HG_CAP_W: i64 = 10 // ax ay az bx by bz r kind sx sy |
| 318 | const HG_KIND_CAP: i64 = 0 |
| 319 | const HG_KIND_ELL: i64 = 1 |
| 320 | const HG_Q12: i64 = WATER_MAGIC_4096 // ellipse-scale / segment-parameter fixed point: the engine's fx4096 |
| 321 | const HG_SKEL_W: i64 = 8 // words per SKEL joint: parent x y z + 4 (the 64-byte joint record the page reads) |
| 322 | const HG_DYNA_MINW: i64 = 8 // a DYNA row carries side x y z k c max infl before an anchor is readable |
| 323 | const HG_DYNA_MAXW: i64 = 64 // a row wider than this is not this format (nx_nxa_dyna writes 12); bounds the count check |
| 324 | const HG_DYNA_INFL: i64 = 7 // DYNA word: influence radius (nx_nxa_dyna payload layout) |
| 325 | const HG_HDR_BYTES: i64 = 512 |
| 326 | const HG_H_LOADED: i64 = 0 |
| 327 | const HG_H_NSTR: i64 = 1 |
| 328 | const HG_H_NREND: i64 = 2 |
| 329 | const HG_H_NSIM: i64 = 3 |
| 330 | const HG_H_SKIN: i64 = 4 |
| 331 | const HG_H_LOCKW: i64 = 5 |
| 332 | const HG_H_NCAP: i64 = 6 |
| 333 | const HG_H_SEGLEN: i64 = 7 |
| 334 | const HG_H_SPAN: i64 = 8 |
| 335 | const HG_H_TICKS: i64 = 9 |
| 336 | const HG_H_PUSHES: i64 = 10 |
| 337 | const HG_H_INSIDE: i64 = 11 |
| 338 | const HG_H_MAXDISP: i64 = 12 |
| 339 | const HG_H_H: i64 = 13 |
| 340 | const HG_H_ZMN: i64 = 14 |
| 341 | const HG_H_HJ: i64 = 15 |
| 342 | const HG_H_RC: i64 = 16 |
| 343 | const HG_H_NOCOLL: i64 = 17 // gate lever: 1 skips the push-out (the neg-control that proves it fires) |
| 344 | const HG_H_RESTIN: i64 = 18 // rest nodes inside a collider BODY at load: the clipping the operator sees at rest |
| 345 | const HG_H_WINDOFF: i64 = 19 // gate lever: 1 ignores the wind field |
| 346 | const HG_H_GUST: i64 = 20 |
| 347 | const HG_H_TICKED: i64 = 21 // girls ticked on the last hairtick |
| 348 | const HG_RC_NOSTR: i64 = 0 - 1 // load refusals, each naming its conjunct |
| 349 | const HG_RC_HSTRCAP: i64 = 0 - 2 |
| 350 | const HG_RC_NOVERT: i64 = 0 - 3 |
| 351 | const HG_RC_VERTCAP: i64 = 0 - 4 |
| 352 | const HG_RC_NOSKEL: i64 = 0 - 5 |
| 353 | const HG_RC_SKELCAP: i64 = 0 - 6 |
| 355 | const O_HGHDR: i64 = O_SKIN3 + 24 |
| 356 | const O_HGREST: i64 = O_HGHDR + HG_HDR_BYTES |
| 357 | const O_HGRL: i64 = O_HGREST + HG_REND_MAX*HG_W*8 |
| 358 | const O_HGCAP: i64 = O_HGRL + HG_SIM*HG_NSEG*8 |
| 359 | const O_HGMASK: i64 = O_HGCAP + HG_CAP_MAX*HG_CAP_W*8 |
| 360 | const O_HGSIMIDX: i64 = O_HGMASK + HG_SIM*8 |
| 361 | const O_HGTAB: i64 = O_HGSIMIDX + HG_SIM*8 |
| 362 | const HG_BLK_BYTES: i64 = HG_MOBS*HG_SIM*HG_W*8 |
| 363 | const O_HGX: i64 = O_HGTAB + HG_REND_MAX*HG_TAB_W*8 // positions |
| 364 | const O_HGP: i64 = O_HGX + HG_BLK_BYTES // previous positions (velocity = X - P) |
| 365 | const O_HGD: i64 = O_HGP + HG_BLK_BYTES // THE EXPORT: displacement from rest, the buffer the page copies per frame |
| 366 | const O_HGSCR: i64 = O_HGD + HG_BLK_BYTES // solver scratch: correction (HG_W) + collider probe (6) + point (3) |
| 367 | const HG_SCR_WORDS: i64 = HG_W + 9 |
| 370 | const O_PERF: i64 = O_HGSCR + HG_SCR_WORDS*8 |
| 377 | const O_TILE: i64 = O_PERF + PF_WORDS*8 |
| 378 | const TILE_W: i64 = 32 // i64 words per worker slot |
| 379 | const TILE_HOUT: i64 = 8 // word offset of the 5 wray outs inside a slot |
| 380 | const TILE_MAX: i64 = 32 // the most workers a band pass may be cut into; the thread ladder |
| 397 | const O_HQ: i64 = O_TILE + TILE_MAX*TILE_W*8 |
| 398 | const HQ_BYTES: i64 = WX*WZ*8 |
| 399 | const O_URAW: i64 = O_HQ + HQ_BYTES |
| 400 | const URAW_WORDS: i64 = 44 // GE53: 41 words (r_surf at 40) padded to the vec4u boundary |
| 401 | const URAW_BYTES: i64 = 176 // URAW_WORDS*4: a vec4u-aligned struct, so the 3-word tail pad is real (was 160 beside WORDS=44 -- pack_uniforms zeroed 176 B into a 160 B block; corrected 2026-09-06 when the GE53 shader shipped its 41-word struct) |
| 402 | const UR_CAMX: i64 = 0 // Q8 world units (the page used camx()/256) |
| 403 | const UR_CAMY: i64 = 1 |
| 404 | const UR_CAMZ: i64 = 2 |
| 405 | const UR_TNOW: i64 = 3 |
| 406 | const UR_YAW: i64 = 4 // Q12 radians (the page used yaw()/4096) |
| 407 | const UR_PITCH: i64 = 5 |
| 408 | const UR_SUNEL: i64 = 6 // Q12 sine of the sun elevation (cal_sunel) |
| 409 | const UR_DAYT: i64 = 7 |
| 410 | const UR_DLEN: i64 = 8 |
| 411 | const UR_RAIN: i64 = 9 |
| 412 | const UR_SKT: i64 = 10 // packed RGB (spec word 7) |
| 413 | const UR_SKH: i64 = 11 // packed RGB (spec word 8) |
| 414 | const UR_SUN: i64 = 12 // spec word 9 (the GPU applies the df>.04 daylight guard) |
| 415 | const UR_CLD: i64 = 13 // spec word 10 |
| 416 | const UR_WMAX: i64 = 14 |
| 417 | const UR_SELB: i64 = 15 // sel_block(S_SEL) |
| 418 | const UR_HOK: i64 = 16 |
| 419 | const UR_NPCT: i64 = 17 // npc target t, or -1 |
| 420 | const UR_BROKEN: i64 = 18 // edit counters (broken + placed): the bridge refreshes the voxel texture when their sum moves |
| 421 | const UR_PLACED: i64 = 19 |
| 422 | const UR_PAL: i64 = 20 // 12 packed RGB words (spec 16..27), vec4u-aligned at byte 80 |
| 423 | const UR_PALF: i64 = 32 // 5 packed RGB words (spec 34..38) at byte 128 |
| 424 | const UR_RESW: i64 = 37 // canvas width in px -- the door tells the sim through set_res (the sim has no window) |
| 425 | const UR_RESH: i64 = 38 |
| 426 | const UR_SURF: i64 = 40 // Continuous terrain representation. |
| 427 | const UR_WATER_Q8: i64 = 41 // Water surface from P_WATER, Q8 world units; words42..43 remain padding. |
| 428 | const UR_YFLIP: i64 = 39 // 1 on the WebGPU door (top-left fragment origin), 0 on WebGL2 -- set_yflip |
| 431 | const CONTACT_BOX_WORDS: i64 = 6 |
| 432 | const CONTACT_RESULT_WORDS: i64 = 3 |
| 433 | const CONTACT_STATE_WORDS: i64 = 3 |
| 434 | const O_CONTACT: i64 = O_URAW + URAW_BYTES |
| 436 | const EJ_INDEX_BUCKETS: i64 = EJRN_SLOTS*2 |
| 437 | const O_EJ_INDEX: i64 = O_CONTACT + (2*CONTACT_BOX_WORDS+CONTACT_RESULT_WORDS+CONTACT_STATE_WORDS)*8 |
| 438 | const O_EJ_NEXT: i64 = O_EJ_INDEX + EJ_INDEX_BUCKETS*8 |
| 439 | const CRAFT_TOTAL: i64 = O_EJ_NEXT + EJRN_SLOTS*8 |
| 454 | const NXA_NJ_CAP: i64 = 128 // ref9e 104 joints; the corpus tops out at 370 (nx_nxa_play) = the next rung |
| 455 | const NXA_ANIM_CAP_W: i64 = 131072 // 1 MiB of key words; ref9e ANIM measured 113,465 words |
| 456 | const NXA_POSE_CAP_W: i64 = 2048 // ref9e POSE measured 835 words (one frozen stand pose) |
| 457 | const NXA_HDR_W: i64 = 16 |
| 458 | const NXA_H_LOADED: i64 = 0 |
| 459 | const NXA_H_NJ: i64 = 1 |
| 460 | const NXA_H_DUR: i64 = 2 |
| 461 | const NXA_H_MPB: i64 = 3 |
| 462 | const NXA_H_RJ: i64 = 4 |
| 463 | const NXA_H_POSE: i64 = 5 |
| 464 | const NXA_H_RV: i64 = 6 // six words: x0 y0 vx16 vy16 t0 span (nx_nxa_anim_lib NA_RV_W) |
| 465 | const NXA_H_RC: i64 = 12 |
| 466 | const NXA_H_NAW: i64 = 13 |
| 468 | const NXA_H_NPW: i64 = 14 |
| 469 | const NXA_H_MORF_TOKEN: i64 = 15 |
| 470 | const NXA_MOB_W: i64 = 4 // per girl: idle weight q12, clip-time adjustment ms, two spare |
| 471 | const NXA_M_IW: i64 = 0 |
| 472 | const NXA_M_CTADJ: i64 = 1 |
| 476 | const NXA_IW_IN_TENTHS_PER_S: i64 = 50 |
| 477 | const NXA_IW_OUT_TENTHS_PER_S: i64 = 25 |
| 478 | const NXA_SNAP_TENTHS_PER_S: i64 = 60 |
| 479 | const NXA_SNAP_IW_MAX_Q12: i64 = 3891 |
| 480 | const NXA_IW_FLOOR_Q12: i64 = 16 |
| 481 | const NXA_DT_MS_MAX: i64 = 1000 // a tab that slept a minute eases one second, it does not slam |
| 482 | const NXA_RC_NOT_LOADED: i64 = 0 - 1 |
| 483 | const NXA_RC_NO_MOB: i64 = 0 - 2 |
| 484 | const NXA_RC_SLOT: i64 = 0 - 3 |
| 485 | const NXA_RC_NJ_ZERO: i64 = 0 - 11 |
| 486 | const NXA_RC_NJ_CAP: i64 = 0 - 12 |
| 487 | const NXA_RC_NAW_ZERO: i64 = 0 - 13 |
| 488 | const NXA_RC_NAW_CAP: i64 = 0 - 14 |
| 489 | const NXA_RC_NPW_CAP: i64 = 0 - 15 |
| 490 | const NXA_RC_POSE_OVERRUN: i64 = 0 - 16 |
| 491 | const NXA_RC_TRACKS: i64 = 0 - 20 // plus nx_nxa_anim_lib's own rc: -21 bad tracks, -22 overrun |
| 496 | const CRAFT_STATIC_RESERVE_PAGES: i64 = 1 |
| 497 | const CRAFT_STATIC_BASE_PAGES: i64 = WASM_PAGES |
| 498 | const CRAFT_STATIC_LIMIT_PAGES: i64 = CRAFT_STATIC_BASE_PAGES+CRAFT_STATIC_RESERVE_PAGES |
| 499 | const CRAFT_STATIC_BASE: i64 = CRAFT_STATIC_BASE_PAGES*WASM_PAGE_BYTES |
| 500 | const CRAFT_STATIC_LIMIT: i64 = CRAFT_STATIC_LIMIT_PAGES*WASM_PAGE_BYTES |
| 501 | const O_NXA: i64 = CRAFT_STATIC_LIMIT |
| 502 | const O_NXA_SKEL: i64 = O_NXA + NXA_HDR_W*8 |
| 503 | const O_NXA_TIDX: i64 = O_NXA_SKEL + NXA_NJ_CAP*NA_SKEL_W*8 |
| 504 | const O_NXA_PQ: i64 = O_NXA_TIDX + NXA_NJ_CAP*NA_IDX_W*8 |
| 505 | const O_NXA_PD: i64 = O_NXA_PQ + NXA_NJ_CAP*4*8 |
| 506 | const O_NXA_MOB: i64 = O_NXA_PD + NXA_NJ_CAP*3*8 |
| 507 | const O_NXA_SCR: i64 = O_NXA_MOB + WC_CAST_N*NXA_MOB_W*8 |
| 508 | const O_NXA_OUT: i64 = O_NXA_SCR + NA_SCR_W*8 |
| 509 | const O_NXA_POSE: i64 = O_NXA_OUT + WC_CAST_N*NXA_NJ_CAP*NA_ROW_W*8 |
| 510 | const O_NXA_ANIM: i64 = O_NXA_POSE + NXA_POSE_CAP_W*8 |
| 512 | const O_NXA_ORDER: i64 = O_NXA_ANIM + NXA_ANIM_CAP_W*8 |
| 516 | const O_NXA_GAIT: i64 = O_NXA_ORDER+NXA_NJ_CAP*8 |
| 517 | const NXA_GAIT_CAP: i64 = NXA_ANIM_CAP_W/NA_CH2_KEY_W |
| 518 | const O_NXA_GAIT_GENERATION: i64 = O_NXA_GAIT+NA_GAIT_INPUT_W*8 |
| 519 | const O_NXA_GAIT_HEADER: i64 = O_NXA_GAIT_GENERATION+8 |
| 520 | const O_NXA_GAIT_TABLE: i64 = O_NXA_GAIT_HEADER+NA_GAIT_HEADER_W*8 |
| 521 | const NXA_M_PATH_Q14: i64 = 2 |
| 522 | const NXA_M_MOVING: i64 = 3 |
| 523 | const NXA_PATH_Q14: i64 = NA_Q12*4 |
| 524 | const NXA_SCALE_BASE: i64 = 940 |
| 525 | const NXA_SCALE_STEP: i64 = 30 |
| 526 | const NXA_SCALE_DEN: i64 = 1000 |
| 528 | const WC_STEER_W: i64 = 5 |
| 529 | const O_MOB_STEER: i64 = O_NXA_GAIT_TABLE+NXA_GAIT_CAP*NA_GAIT_ROW_W*8 |
| 530 | const O_NXA_LOCOMOTION: i64 = O_MOB_STEER+MOB_CAP*WC_STEER_W*8 |
| 531 | const NXA_LOCOMOTION_RAW: i64 = 0 |
| 532 | const NXA_LOCOMOTION_FORWARD: i64 = 1 |
| 533 | const INSPECTION_WORDS: i64=18 |
| 534 | const O_INSPECTION: i64=O_NXA_LOCOMOTION+8 |
| 535 | const IC_MODE:i64=0 |
| 536 | const IC_HANDLE:i64=1 |
| 537 | const IC_GENERATION:i64=2 |
| 538 | const IC_ACTOR:i64=3 |
| 539 | const IC_X:i64=4 |
| 540 | const IC_Y:i64=5 |
| 541 | const IC_Z:i64=6 |
| 542 | const IC_YAW:i64=7 |
| 543 | const IC_PITCH:i64=8 |
| 544 | const IC_TX:i64=9 |
| 545 | const IC_TY:i64=10 |
| 546 | const IC_TZ:i64=11 |
| 547 | const IC_DISTANCE:i64=12 |
| 548 | const IC_ORBIT:i64=13 |
| 549 | const IC_ELEVATION:i64=14 |
| 550 | const IC_HW:i64=15 |
| 551 | const IC_HH:i64=16 |
| 552 | const IC_HD:i64=17 |
| 554 | const O_SAVE:i64=O_INSPECTION+INSPECTION_WORDS*8 |
| 555 | const CRAFT_BYTES:i64=O_SAVE+SAVE_LEN |
| 556 | const CRAFT_EXT_TOTAL:i64=CRAFT_BYTES |
| 558 | const WASM_PAGES_REQ: i64 = (CRAFT_EXT_TOTAL + WASM_PAGE_BYTES - 1)/WASM_PAGE_BYTES |
| 564 | const HG_MIB: i64 = 1048576 |
| 565 | const HG_SCR_HSTR: i64 = O_FB |
| 566 | const HG_SCR_HSTR_CAP: i64 = 4*HG_MIB |
| 567 | const HG_SCR_VERT: i64 = O_FB + 4*HG_MIB |
| 568 | const HG_SCR_VERT_CAP: i64 = 8*HG_MIB |
| 569 | const HG_SCR_SKEL: i64 = O_FB + 12*HG_MIB |
| 570 | const HG_SCR_SKEL_CAP: i64 = 2*HG_MIB |
| 571 | const HG_SCR_DYNA: i64 = O_FB + 14*HG_MIB |
| 572 | const HG_SCR_DYNA_CAP: i64 = HG_MIB |
| 574 | const HG_TPS: i64 = 60 // see the header: the page accumulator's 16.6667 ms, hd_ticks_per_s() |
| 575 | const HG_UNITS_PER_178CM: i64 = 171530 // the page's pairing (GPE_UNITS_PER_178CM), named as the same number |
| 576 | const HG_CM_178: i64 = 178 |
| 577 | const HG_CM_PER_M: i64 = 100 |
| 578 | const HG_UPB: i64 = HG_UNITS_PER_178CM*HG_CM_PER_M/HG_CM_178 // bind units per world block (1 block = 1 m): 96365 |
| 579 | const HG_G_CMS2: i64 = 981 // standard gravity, cm/s^2 |
| 580 | const HG_G: i64 = HG_G_CMS2*HG_UNITS_PER_178CM/(HG_CM_178*HG_TPS*HG_TPS) // 262 units/tick^2 -- the dress lane's NXGD_G derivation |
| 581 | const HG_FTL_S_PERMIL: i64 = 1000 - SB_C_HAIR*1000/SD_G // DFTL s_damping (Mueller 2012 "Fast Simulation of Inextensible Hair |
| 583 | const HG_FENCE_DIV: i64 = 4 // the chain's small-angle validity fence: seglen/4 (SD_Q8/4 in the retired page solver) |
| 584 | const HG_PROJ_ITERS: i64 = 3 // length/collision alternations per point; the LAST op is always the length projection |
| 585 | const HG_LOCK_W_MIN: i64 = 900 // the ribbon builder's lock half-width floor (w09 = max(900, span*.045)), PRESERVED |
| 586 | const HG_LOCK_W_PERMIL: i64 = 45 |
| 587 | const HG_SKIN_NUM: i64 = 16 // skin = lockw x 1.6: half-width + the .6 child scatter -- the farthest a render vertex sits off its guide |
| 588 | const HG_SKIN_DEN: i64 = 10 |
| 589 | const HG_REACH_DIV: i64 = 2 // collider mask reach = strand length / 2: twice the static fence (L/4), for overshoot |
| 590 | const HG_GUST_TICKS: i64 = 2*HG_TPS // gust envelope cadence 0.5 Hz: the incumbent shader sway (3.1 rad/s), PRESERVED |
| 591 | const HG_GUST_SALT: i64 = 3400 // whash seed offset (the weather lib salts with seed + 3300) |
| 592 | const HG_TORSO_GATE_X: i64 = 15000 // the MFS torso gate (axb < 15000.), the same half-width the paint bands use |
| 594 | const HG_R_HEADBAND: i64 = 885 |
| 595 | const HG_R_HEAD_J: i64 = 955 |
| 596 | const HG_R_ACROMION: i64 = 818 |
| 597 | const HG_R_CHEST: i64 = 720 |
| 598 | const HG_R_HIP: i64 = 520 |
| 599 | const HG_R_ELBOW: i64 = 630 |
| 600 | const HG_R_NECK_LO: i64 = 840 |
| 601 | const HG_R_SH_LO: i64 = 770 |
| 602 | const HG_R_SH_HI: i64 = 860 |
| 603 | const HG_R_ARM_LO: i64 = 600 |
| 604 | const HG_R_ARM_HI: i64 = 800 |
| 605 | const HG_R_ARM_XMIN: i64 = 60 |
| 606 | const HG_R_ELBOW_XMIN: i64 = 50 |
| 609 | const TH_RAIN: i64 = 1 |
| 610 | const TH_FEAR: i64 = 2 |
| 611 | const TH_MET: i64 = 3 |
| 612 | const TH_SLEPT: i64 = 4 |
| 613 | const TH_HUNGRY: i64 = 5 |
| 614 | const TH_SAWTAKEN: i64 = 6 |
| 615 | const TH_HEARD_TAKEN: i64 = 7 |
| 616 | const TH_HEARD_FRIEND: i64 = 8 |
| 617 | const TH_COMPANY: i64 = 9 |
| 619 | const GO_FRIEND: i64 = 1 |
| 620 | const GO_TAKEN: i64 = 2 |
| 621 | const SAVE_MAGIC: i64 = 20260728001 |
| 622 | const SAVE_VER: i64 = 7 // generation recipe trailer, existing body retained |
| 623 | const SAVE_VER6: i64 = 6 // streaming origin and edit journal |
| 625 | const SAVE_VER5: i64 = 5 |
| 627 | const MC_X: i64 = 0 |
| 628 | const MC_Y: i64 = 1 |
| 629 | const MC_Z: i64 = 2 |
| 630 | const MC_KIND: i64 = 3 |
| 631 | const MC_PH: i64 = 4 |
| 632 | const MC_DISG: i64 = 5 // 1 = a HUMAN girl disguised as a monster girl (the lore: |
| 635 | const MC_GENE: i64 = 6 // 20-bit APPEARANCE GENOME rolled at spawn -- every girl is |
| 641 | const S_SEED: i64 = 0 |
| 642 | const S_CX: i64 = 1 // camera pos Q8 (256 = one block) |
| 643 | const S_CY: i64 = 2 |
| 644 | const S_CZ: i64 = 3 |
| 645 | const S_YAW: i64 = 4 // it-units (IT_PI = half turn) |
| 646 | const S_PITCH: i64 = 5 |
| 647 | const S_T: i64 = 6 |
| 648 | const S_BROKEN: i64 = 7 |
| 649 | const S_PLACED: i64 = 8 |
| 650 | const S_HX: i64 = 9 // crosshair DDA hit cache |
| 651 | const S_HY: i64 = 10 |
| 652 | const S_HZ: i64 = 11 |
| 653 | const S_HFACE: i64 = 12 // 0 none, 1 +x, 2 -x, 3 +y, 4 -y, 5 +z, 6 -z |
| 654 | const S_HOK: i64 = 13 // 1 = in reach |
| 655 | const S_VY: i64 = 14 // vertical velocity Q8/tick (jump + gravity) |
| 656 | const S_GROUNDED: i64 = 15 // 1 = standing on a surface (jump allowed) |
| 657 | const S_SEL: i64 = 16 // hotbar slot 0..4 (Q cycles; sel_block maps to a block type) |
| 658 | const S_LBX: i64 = 17 // last-broken cell (probes/particles; the hit cache retargets |
| 659 | const S_LBY: i64 = 18 // every frame, so "what did I just break" needs its own slots) |
| 660 | const S_LBZ: i64 = 19 |
| 661 | const S_Q: i64 = 20 // ray pixel size 2..5 -- ADAPTIVE: the organ tunes itself from |
| 662 | const S_FMA: i64 = 21 // the surface's reported frame ms (EMA x16); shim only reports |
| 663 | const S_WMAX: i64 = 22 // highest solid y in the world -- rays above it heading up/flat |
| 665 | const S_SPX: i64 = 23 // spawn point (H key + void-fall auto-respawn return here) |
| 666 | const S_SPY: i64 = 24 |
| 667 | const S_SPZ: i64 = 25 |
| 668 | const S_NPCT: i64 = 26 // crosshair NPC target: dense index of the girl under the |
| 670 | const S_FOUND: i64 = 27 // disguised humans FOUND (met + identified = under protection) |
| 671 | const S_LOST: i64 = 28 // found humans TAKEN by wardens (the cost of not protecting) |
| 672 | const S_BCD: i64 = 29 // birth cooldown ticks (community pacing) |
| 673 | const S_WOX: i64 = 30 // WORLD ORIGIN of the window, in blocks (v6 streaming): the |
| 674 | const S_WOZ: i64 = 31 // arena is a 128x48x128 CACHE over unbounded absolute terrain |
| 675 | const S_EJDROP: i64 = 32 // edits REFUSED because the journal was full (loud, never silent) |
| 676 | const S_HARV: i64 = 33 // MATURE crops harvested (the farming loop's payoff counter) |
| 677 | const S_PLANT: i64 = 34 // seeds planted |
| 678 | const S_GROWN: i64 = 35 // crops that reached maturity (world truth, gate-readable) |
| 679 | const S_VAR: i64 = 36 // which world identity this arena runs (the passport's |
| 681 | const S_GENP: i64 = 37 |
| 682 | const S_TGT: i64 = 38 // DISPLAY-DERIVED frame budget, EMA-x16 units (0 = shipped |
| 687 | const S_BLDG: i64 = 39 // W3 settlements: buildings stamped into this arena (a |
| 692 | const S_BLDGX: i64 = 40 // last-stamped building anchor, arena-local (gate probe) |
| 693 | const S_BLDGY: i64 = 41 // its floor height |
| 694 | const S_BLDGZ: i64 = 42 |
| 695 | const S_RESW: i64 = 44 // GE55: canvas size and origin, written by the door (set_res / set_yflip) |
| 696 | const S_RESH: i64 = 45 |
| 697 | const S_YFLIP: i64 = 46 |
| 698 | const S_FACE_RADIUS: i64 = 49 |
| 699 | const S_FACE_GAIN: i64 = 50 |
| 700 | const FACING_RADIUS_MAX_Q8: i64 = 2147483647 |
| 701 | const S_AGEN: i64 = 47 |
| 702 | const S_DPAPPLIED: i64 = 48 // GE59: the P_DAYPHASE value last applied to S_T (0 = never) -- one re-base per distinct poke, never per tick // GE57: arena GENERATION -- +1 per wc_shift that moves. The GPU tiers key every voxel-texture upload on it: a 16-block re-base drawn against the previous texture is the transport/fall-through the operator sees (2026-09-05). |
| 703 | const S_GT_KEEP: i64 = 43 // ground-truth capture: when 1, render_impl leaves the depth plane in |
| 707 | const SHIFT_STRIDE: i64 = 16 // one window slide, in blocks |
| 708 | const SHIFT_MARGIN: i64 = 32 // player this close to a window edge -> the world slides under them |
| 711 | const P_TBASE: i64 = 0 // terrain base height |
| 712 | const P_TAMP1: i64 = 1 // large-noise amplitude |
| 713 | const P_TAMP2: i64 = 2 // detail-noise amplitude |
| 714 | const P_WATER: i64 = 3 // flood level |
| 715 | const P_SNOW: i64 = 4 // snow line (99 = never) |
| 716 | const P_TREE: i64 = 5 // tree sparsity modulus (0 = no trees) |
| 717 | const P_CAVETH: i64 = 6 // cave carve threshold (lower = more cavern) |
| 718 | const P_SKYTOP: i64 = 7 // packed zenith colour |
| 719 | const P_SKYHOR: i64 = 8 // packed horizon colour |
| 720 | const P_SUN: i64 = 9 // 1 = sun disc |
| 721 | const P_CLOUD: i64 = 10 // 1 = cloud deck |
| 725 | const P_WXCOV: i64 = 11 // cloud coverage Q12 (drives the cloud density band) |
| 726 | const P_WXWINDX: i64 = 12 // wind x component, Q12-scaled speed*cos(dir) |
| 727 | const P_WXWINDZ: i64 = 13 // wind z component |
| 728 | const P_WXTYPE: i64 = 14 // precip type this eighth: 0 none, 1 rain, 2 snow |
| 729 | const P_WXTEMP: i64 = 15 // temperature Q12 (relative scale, freezing=1024) |
| 730 | const P_PAL: i64 = 16 // +blocktype = packed base colour (0..11) |
| 731 | const P_MOBC: i64 = 28 // +kind*2+half = packed mob colours (3 kinds x 2 tones) |
| 732 | const P_PAL2: i64 = 34 // +b-12 = packed colour for farm blocks 12..16 (5 rows, 34-38) |
| 733 | const P_DAYLEN: i64 = 40 // A1 calendar: ticks per day (ALL timing is spec DATA) |
| 734 | const P_SEASD: i64 = 41 // days per season (4 seasons cycle) |
| 735 | const P_GROWE: i64 = 42 // farm-tick cadence: one grow/hydrate pass every N ticks |
| 736 | const P_GROWW: i64 = 43 // crop speed on WET farmland (Minecraft stencil speed) |
| 737 | const P_GROWD: i64 = 44 // crop speed on DRY farmland |
| 738 | const P_RAINS: i64 = 45 // +season = rain permil per day-eighth (4 rows, 45-48) |
| 761 | const P_STYLE: i64 = 49 |
| 762 | const P_DAYPHASE: i64 = 39 // GE59 (2026-09-05): the boot clock as DATA -- the OTHER dead hole (world_recipes.conf names 39 and 49). Post-boot band, so it cannot be read at init: apply2_impl re-bases S_T to it on the next tick, once per distinct value; 0 (the zeroing loop) leaves the DAYLEN/4 boot phase, so every existing world is byte-identical by construction. If P_PAL2 ever widens, this slot moves with the ONE named const. |
| 763 | const WC_STYLE_REAL: i64 = 0 // textured, smooth light -- the shipped look, unchanged |
| 764 | const WC_STYLE_TOON: i64 = 1 // banded light (anime/cel) |
| 765 | const WC_STYLE_FLAT: i64 = 2 // untextured facets (artsy low-poly) |
| 766 | const WC_STYLE_SOFT: i64 = 3 // SMOOTH TERRAIN: ground lit by a heightfield normal interpolated across the block (no grid bevel, no per-block facet) |
| 770 | const WC_SOFT_SCAN: i64 = 3 |
| 771 | const WC_STYLE_MAX: i64 = 3 // the highest id this engine owns; set_style REFUSES above it |
| 775 | const WC_TOON_CUT: i64 = 588 |
| 776 | const WC_TOON_LO: i64 = 412 |
| 777 | const WC_TOON_HI: i64 = 922 |
| 784 | const WC_TEX_NEUTRAL: i64 = 128 |
| 785 | const P_ADV: i64 = 50 // +i = smart-object ADVERTISEMENTS (C1): packed |
| 789 | const P_HISTAGE: i64 = 60 // DECLARED geomorphic stage (Strahler bands): 0 = mature/ |
| 796 | const P_TREEMAX: i64 = 59 // tree altitude ceiling (0 = the historic hardcoded 19) |
| 797 | const P_TREESPEC: i64 = 61 // W2 SPECIES GENOME (packed, 0 = legacy 4-block stamp): |
| 807 | const P_WARD: i64 = 58 // warden daytime hunt radius in BLOCKS (0 = the 12-block |
| 811 | const P_OUTFIT: i64 = 57 // outfit mode: 0 = identity keeps everyone clothed; |
| 816 | const P_CURI: i64 = 56 // curiosity threshold: a girl approaches the player only |
| 825 | const P_BLDG: i64 = 62 // W3 settlement density: site-cell modulus (0 = none; the |
| 827 | const P_BLDGSPEC: i64 = 63 // low 4 bits = archetype row in nx_indoorgen_data |
| 828 | const P_ERODE: i64 = 64 // E1 TALUS EROSION BUDGET in relaxation ticks (0 = OFF). |
| 834 | const P_ERTAL: i64 = 65 // DERIVED talus threshold, WC_ER_Q units. NEVER authored: |
| 862 | const P_GARM: i64 = 70 |
| 863 | const GAR_N: i64 = 9 |
| 864 | const GAR_BIKINI_TOP: i64 = 1 |
| 865 | const GAR_BIKINI_BOT: i64 = 2 |
| 866 | const GAR_ONEPIECE: i64 = 3 |
| 867 | const GAR_SARONG: i64 = 4 |
| 868 | const GAR_SUNDRESS: i64 = 5 |
| 869 | const GAR_TEE: i64 = 6 |
| 870 | const GAR_SHORTS: i64 = 7 |
| 871 | const GAR_SKIRT: i64 = 8 |
| 872 | const GAR_DRESS: i64 = 9 |
| 873 | const GAR_COV_TOP: i64 = 1 |
| 874 | const GAR_COV_BOT: i64 = 2 |
| 875 | const GAR_COV_FULL: i64 = 3 |
| 876 | const GAR_CAT_SWIM: i64 = 0 |
| 877 | const GAR_CAT_COVER: i64 = 1 |
| 878 | const GAR_CAT_CASUAL: i64 = 2 |
| 879 | const GAR_CAT_EVENING: i64 = 3 |
| 880 | const GAR_CAT_NONE: i64 = 4 // what mobgarc reports for a girl wearing nothing |
| 881 | const GAR_CAT_SH: i64 = 2 |
| 882 | const GAR_CAT_MASK: i64 = 7 |
| 883 | const GAR_HUE_SH: i64 = 8 |
| 884 | const GAR_HUE_MASK: i64 = 511 |
| 885 | const GAR_SPAN_SH: i64 = 17 |
| 886 | const GAR_SPAN_MASK: i64 = 63 |
| 887 | const GAR_SPAN_UNIT_DEG: i64 = 4 |
| 888 | const GAR_SAT_SH: i64 = 23 |
| 889 | const GAR_LIT_SH: i64 = 27 |
| 890 | const GAR_NIB_MASK: i64 = 15 |
| 891 | const GAR_TINT_STOPS: i64 = 4 // MG_OUTFIT_MASK + 1: two genome bits, four stops |
| 892 | const GAR_SLOT_SH: i64 = 8 // outfit word = upper id << GAR_SLOT_SH | lower id |
| 893 | const GAR_ID_MASK: i64 = 255 |
| 894 | const HSL_DEG_FULL: i64 = 360 |
| 895 | const HSL_SECTOR_DEG: i64 = 60 |
| 896 | const MG_BEACH_SH: i64 = 18 // the beachwear genome bits the MIXED beach breeds (P_OUTFIT) |
| 897 | const MG_BEACH_MASK: i64 = 3 |
| 898 | const MOB_POSE_SLEEP: i64 = 2 // mob_pose's published sleep id (the pose door's contract) |
| 899 | const B_WATER: i64 = 4 // the water block (wshade2's shimmer branch, the shore ramp) |
| 900 | const WC_SPECN: i64 = 80 // includes GA_DUNE at slot 79 within the existing 640-byte spec allocation |
| 911 | const P_OCEAN: i64 = 66 |
| 922 | const P_WPIPE: i64 = 67 |
| 933 | const P_WPSCALE: i64 = 68 |
| 934 | const P_SURF: i64 = 69 // GE53 SURFACE SOURCE: 0 = the cell grid (all voxel, byte-identical to |
| 941 | const WC_SURF_STEP_Q8: i64 = 64 |
| 942 | const WC_GAIT_BOB_Q8: i64 = 7 // thorax oscillation AMPLITUDE (~2.7cm, 5.5cm p2p -- |
| 951 | const WC_BREATH_TICKS: i64 = 257 |
| 962 | const WC_BREATH_Q8: i64 = 1 |
| 967 | const WC_BREATH_CUT_Q8: i64 = 24 |
| 968 | const WC_STEP_EASE_UP: i64 = 48 // mob Y climb rate Q8/tick (a 1-block rise ~ 5 ticks) |
| 969 | const WC_NIGHT_X8: i64 = 5 // night begins at this eighth of the day (5/8) |
| 971 | const EYE: i64 = 435 // eye height Q8 (~1.7 blocks) |
| 972 | const SPEED: i64 = 40 // walk Q8 per tick |
| 977 | const WC_PH_PER_TICK: i64 = 5 // the free-running advance MC_PH still uses for WANDER |
| 978 | const WC_PH_ANG: i64 = 214 // angle-units per phase unit (the incumbent's drive scaling) |
| 979 | const WC_NEED_GAIT: i64 = 3 // the needs row's spare slot, named now that it carries a value |
| 988 | const WC_DDEG_HALFTURN: i64 = 1800 // decidegrees in IT_PI (a half turn): the ddeg -> it-unit scale |
| 995 | const WC_STRIDE_Q8: i64 = 374 |
| 1001 | const WC_PELVIS_ROT_DDEG: i64 = 52 |
| 1010 | const WC_THORAX_ROT_DDEG: i64 = 146 |
| 1014 | const WC_ELBOW_ROM_DDEG: i64 = 297 |
| 1025 | const WC_TURN_PER_STRIDE: i64 = IT_PI/2 |
| 1026 | const TURN: i64 = 140 // yaw it-units per tick (keyboard turn / legacy dir path) |
| 1027 | const PITCHV: i64 = 90 // pitch it-units per tick (R/F keyboard look) |
| 1028 | const PITCH_MAX: i64 = 5000 |
| 1029 | const LOOKS: i64 = 6 // mouselook: it-units per accumulated look count |
| 1030 | const JUMPV: i64 = 66 // jump takeoff velocity Q8/tick |
| 1031 | const GRAV: i64 = 9 // gravity Q8/tick^2 |
| 1032 | const VTERM: i64 = 120 // terminal fall velocity Q8/tick -- ONE ruler for the player AND every mob |
| 1040 | const WC_IMP_SCALE: i64 = SD_Q8/4 |
| 1041 | const MAXSTEPS: i64 = 110 // DDA cells per ray (view distance) |
| 1042 | const REACH_STEPS: i64 = 20 // crosshair edit reach in DDA cells |
| 1083 | const EJRN_KEY_MAX: i64 = 72057594037927935 |
| 1084 | const EJRN_TAG_MASK: i64 = 0-256 |
| 1251 | const P_DUNE: i64 = GA_DUNE |
| 1302 | const WC_ER_Q: i64 = 256 // fixed point the pass runs in. World heights are |
| 1306 | const WC_ER_STABLE_Q: i64 = WC_ER_Q / 4 // DERIVED, not tasted: an explicit 4-neighbour |
| 1310 | const WC_ER_RATE_Q: i64 = WC_ER_STABLE_Q / 2 // WRITTEN AS THE ARITHMETIC: half the stability |
| 1315 | const WC_ER_MAXK: i64 = 3 // STRUCTURAL, not a clamp: three unrolled levels |
| 1320 | const WC_ER_FLAT: i64 = 0 - 1 // P_ERTAL sentinel: measured, and there is no relief |
| 1586 | const WC_REVIEW_ARC: i64 = IT_PI/2 |
| 1625 | const S_MOVE_MODE: i64 = 51 |
| 1626 | const S_MOVE_GRAV_MM: i64 = 52 |
| 1627 | const S_MOVE_JUMP_MM: i64 = 53 |
| 1628 | const S_MOVE_WALK_MM: i64 = 54 |
| 1629 | const S_MOVE_TERM_MM: i64 = 55 |
| 1630 | const S_MOVE_STEP_Q8: i64 = 56 |
| 1631 | const S_MOVE_REPEAT: i64 = 57 |
| 1632 | const S_MOVE_VNUM: i64 = 58 |
| 1633 | const S_MOVE_RY: i64 = 59 |
| 1634 | const S_MOVE_RX: i64 = 60 |
| 1635 | const S_MOVE_RZ: i64 = 61 |
| 1636 | const S_MOVE_LAST_JUMP: i64 = 62 |
| 1637 | const S_MOVE_REV: i64 = 63 |
| 1638 | const WC_MOVE_HZ: i64 = 60 |
| 1639 | const WC_MOVE_Q8: i64 = 256 |
| 1640 | const WC_MOVE_MM: i64 = 1000 |
| 1641 | const WC_MOVE_DEN: i64 = WC_MOVE_MM*WC_MOVE_HZ*WC_MOVE_HZ |
| 1642 | const WC_MOVE_HDEN: i64 = WATER_MAGIC_4096*WC_MOVE_MM*WC_MOVE_HZ |
| 1644 | const WC_MOVE_SPEED_MAX_MM: i64 = WY*WC_MOVE_MM*WC_MOVE_HZ |
| 1645 | const WC_MOVE_GRAV_MAX_MM: i64 = WC_MOVE_SPEED_MAX_MM*WC_MOVE_HZ |
| 1646 | const WC_MOVE_RC_PROFILE: i64 = 0 - 81 |
| 1647 | const WC_MOVE_RC_ACTIVE: i64 = 0 - 82 |
| 2082 | const BLDG_SITE: i64 = 40 // site-cell stride, blocks |
| 2083 | const IG_SCAN0: i64 = 10 // W3 solve: first candidate anchor offset inside the site cell |
| 2084 | const IG_SCANSTEP: i64 = 10 // candidate grid step: 3x3 covers offsets 10/20/30; footprint |
| 2088 | const IG_MAXSLOPE: i64 = 2 // pre-declared accept rule: corners may deviate <=2 blocks from |
| 2092 | const IG_FOUND: i64 = 3 // foundation skirt courses below the floor (IG_MAXSLOPE + 1) |
| 3201 | const WC_INIT_DUNE_INVALID: i64 = 0-79 |
| 3202 | const WC_INIT_DUNE_COMPOSITION: i64 = 0-80 |
| 3450 | const MOB_R_Q8: i64 = 90 |
functions
| 1044 | func wst(base: i64) -> *i64 { return (base + O_ST) as *i64 } |
| 1045 | func wsp(base: i64) -> *i64 { return (base + O_SPEC) as *i64 } |
| 1046 | func wgp(base: i64) -> *i64 { return (base + O_GENP) as *i64 } |
| 1047 | func mobp(base: i64) -> *i64 { return (base + O_MOBS) as *i64 } |
| 1048 | func wfb(base: i64) -> *i64 { return (base + O_FB) as *i64 } |
| 1049 | func wvx(base: i64) -> *u8 { return (base + O_VOX) as *u8 } |
| 1050 | func winp(base: i64) -> *i64 { return (base + O_INPUT) as *i64 } |
| 1051 | func wpack(r: i64, g: i64, b: i64) -> i64 { return r | (g << 8) | (b << 16) } |
| 1052 | func wclamp(v: i64, lo: i64, hi: i64) -> i64 { if v < lo { return lo } if v > hi { return hi } return v } |
| 1054 | func vin(x: i64, y: i64, z: i64) -> i64 |
| 1060 | func vget(base: i64, x: i64, y: i64, z: i64) -> i64 |
| 1065 | func vset(base: i64, x: i64, y: i64, z: i64, b: i64) -> i64 |
| 1078 | func ejp(base: i64) -> *i64 { return (base + O_EJRN) as *i64 } |
| 1079 | func ej_key(ax: i64, ay: i64, az: i64) -> i64 |
| 1085 | func ej_key_representable(ax: i64, ay: i64, az: i64) -> i64 |
| 1092 | func ej_tag_matches(cur: i64, key: i64) -> i64 |
| 1096 | func ej_index_bucket(tag: i64) -> i64 |
| 1104 | func ej_batch_begin(base: i64, available_bytes: i64) -> *i64 |
| 1124 | func ej_index_get(base: i64, heads: *i64, ax: i64, ay: i64, az: i64) -> i64 |
| 1141 | func ej_index_put(base: i64, heads: *i64, ax: i64, ay: i64, az: i64, b: i64) -> i64 |
| 1171 | func ej_put(base: i64, ax: i64, ay: i64, az: i64, b: i64) -> i64 |
| 1178 | func ej_get(base: i64, ax: i64, ay: i64, az: i64) -> i64 |
| 1185 | func ej_overlay(base: i64, lx0: i64, lx1: i64, lz0: i64, lz1: i64) -> i64 |
| 1208 | func wc_edit(base: i64, x: i64, y: i64, z: i64, b: i64) -> i64 |
| 1218 | func vsolid(base: i64, x: i64, y: i64, z: i64) -> i64 |
| 1227 | func whash(x: i64, z: i64, sd: i64) -> i64 |
| 1235 | func wnoise(x: i64, z: i64, sc: i64, sd: i64) -> i64 |
| 1252 | func wc_dune_relief_q(sp: *i64, x: i64, z: i64, sd: i64) -> i64 |
| 1262 | func wheight_raw(base:i64,x:i64,z:i64,sd:i64)->i64 |
| 1331 | func wheight_q(base: i64, x: i64, z: i64, sd: i64) -> i64 |
| 1343 | func wc_er_flux(d: i64, t: i64) -> i64 |
| 1353 | func wc_er_talus(base: i64, sd: i64) -> i64 |
| 1383 | func wc_er_arm(base: i64, sd: i64) -> i64 |
| 1393 | func wc_er1(base: i64, x: i64, z: i64, sd: i64, t: i64) -> i64 |
| 1402 | func wc_er2(base: i64, x: i64, z: i64, sd: i64, t: i64) -> i64 |
| 1411 | func wc_er3(base: i64, x: i64, z: i64, sd: i64, t: i64) -> i64 |
| 1424 | func wheight(base: i64, x: i64, z: i64, sd: i64) -> i64 |
| 1439 | func wheight_qe(base: i64, x: i64, z: i64, sd: i64) -> i64 |
| 1454 | func wsp_beach_ocean_q(sp: *i64, ax: i64, az: i64, hq: i64) -> i64 |
| 1467 | func hq_get(base: i64, x: i64, z: i64) -> i64 |
| 1475 | func hq_set(base: i64, x: i64, z: i64, v: i64) -> i64 |
| 1480 | func hq_off() -> i64 { return O_HQ } |
| 1484 | func wc_surface_source(base: i64, pxq: i64, pzq: i64) -> i64 |
| 1501 | func wterrain(b: i64) -> i64 |
| 1513 | func wnoise3(x: i64, y: i64, z: i64, sc: i64, sd: i64) -> i64 |
| 1537 | func wc_wmax(base: i64) -> i64 |
| 1559 | func wsp_ocean_d(sp: *i64, ax: i64, az: i64) -> i64 |
| 1574 | func wsp_sea_yaw(sp: *i64) -> i64 |
| 1593 | func wsp_beach_ocean(sp: *i64, ax: i64, az: i64, h: i64) -> i64 |
| 1609 | func wc_player_position_clear(base: i64, x: i64, y: i64, z: i64) -> i64 |
| 1649 | func wc_move_reset(base: i64) -> i64 |
| 1656 | func wc_move_valid(mode: i64, grav: i64, launch: i64, walk: i64, |
| 1671 | func wc_move_commit_validated(base: i64, mode: i64, grav: i64, launch: i64, walk: i64, |
| 1682 | func wc_move_set(base: i64, mode: i64, grav: i64, launch: i64, walk: i64, |
| 1694 | func wc_move_boot(base: i64, world: i64) -> i64 |
| 1700 | func wc_move_horizontal(base: i64, axis: i64, direction: i64) -> i64 |
| 1711 | func wc_move_vertical_request(base: i64, jump: i64) -> i64 |
| 1730 | func movement_profile_set(mode: i64, grav_mm_s2: i64, jump_mm_s: i64, |
| 1734 | func movement_profile_field(field: i64) -> i64 |
| 1738 | func movement_tick_hz() -> i64 { return WC_MOVE_HZ } |
| 1739 | func movement_velocity_denominator() -> i64 { return WC_MOVE_DEN } |
| 1741 | func wc_player_recover(base: i64) -> i64 |
| 1767 | func player_position_clear() -> i64 |
| 1771 | func player_recover() -> i64 { return wc_player_recover(0) } |
| 1774 | func wc_hq_column(base: i64, x: i64, z: i64, ax: i64, az: i64, sd: i64) -> i64 |
| 1779 | func wc_hq_restore(base: i64) -> i64 |
| 1794 | func gencol(base: i64, x: i64, z: i64, ax: i64, az: i64, sd: i64) -> i64 |
| 1831 | func vset_box(base: i64, x: i64, y: i64, z: i64, b: i64, lx0: i64, lx1: i64, lz0: i64, lz1: i64) -> i64 |
| 1853 | func wsp_palm_shape(base: i64, sp: *i64, tx: i64, tz: i64, h2: i64, th9: i64, cr9: i64, |
| 1910 | func gentrees(base: i64, lx0: i64, lx1: i64, lz0: i64, lz1: i64, sd: i64) -> i64 |
| 2096 | func igfloor(a: i64, b: i64) -> i64 |
| 2101 | func ig_rotx(r: i64, x: i64, z: i64) -> i64 |
| 2107 | func ig_rotz(r: i64, x: i64, z: i64) -> i64 |
| 2113 | func genbuildings(base: i64, lx0: i64, lx1: i64, lz0: i64, lz1: i64, sd: i64) -> i64 |
| 2252 | func genworld(base: i64, sd: i64) -> i64 |
| 2275 | func wc_hq_shift(base: i64, dx: i64, dz: i64) -> i64 |
| 2298 | func wc_shift(base: i64, dx: i64, dz: i64) -> i64 |
| 2407 | func wray_surf_origin(base: i64, dx: i64, dy: i64, dz: i64, maxsteps: i64, out: *i64, view: i64) -> i64 |
| 2485 | func wray_surf(base: i64, dx: i64, dy: i64, dz: i64, maxsteps: i64, out: *i64) -> i64 {return wray_surf_origin(base,dx,dy,dz,maxsteps,out,0)} |
| 2487 | func wray2_origin(base: i64, dx: i64, dy: i64, dz: i64, maxsteps: i64, out: *i64, skipw: i64, view: i64) -> i64 |
| 2514 | func wray2(base: i64, dx: i64, dy: i64, dz: i64, maxsteps: i64, out: *i64, skipw: i64) -> i64 {return wray2_origin(base,dx,dy,dz,maxsteps,out,skipw,0)} |
| 2516 | func wray3_origin(base: i64, dx: i64, dy: i64, dz: i64, maxsteps: i64, out: *i64, skipw: i64, skipt: i64, view: i64) -> i64 |
| 2605 | func wray3(base: i64, dx: i64, dy: i64, dz: i64, maxsteps: i64, out: *i64, skipw: i64, skipt: i64) -> i64 {return wray3_origin(base,dx,dy,dz,maxsteps,out,skipw,skipt,0)} |
| 2607 | func wray(base: i64, dx: i64, dy: i64, dz: i64, maxsteps: i64, out: *i64) -> i64 |
| 2612 | func wcol(base: i64, b: i64) -> i64 |
| 2620 | func sel_block(sel: i64) -> i64 |
| 2630 | func wface_l(face: i64) -> i64 |
| 2638 | func wsky(base: i64, syy: i64) -> i64 |
| 2662 | func wcloud(camx: i64, camy: i64, camz: i64, dx: i64, dy: i64, dz: i64, t: i64) -> i64 |
| 2676 | func wsky2(base: i64, syy: i64, px: i64, py: i64, sunx: i64, suny: i64, sunon: i64) -> i64 |
| 2701 | func wao(base: i64, cx2: i64, cy2b: i64, cz2: i64, face: i64, u: i64, v: i64) -> i64 |
| 2757 | func wshade2(base: i64, b0: i64, face: i64, steps: i64, syy: i64, hpx: i64, hpy: i64, hpz: i64, t2: i64, clx: i64, cly: i64, clz: i64) -> i64 |
| 2852 | func wc_spec(base: i64, v: i64) -> i64 |
| 3106 | func genmobs(base: i64, sd: i64) -> i64 |
| 3149 | func wc_spawn_bush(base: i64, forward: i64, lateral: i64, radius: i64, height: i64, material: i64) -> i64 |
| 3203 | func wc_dune_preflight(base: i64, v: i64) -> i64 |
| 3231 | func init_impl_v(base: i64, v: i64, seed: i64) -> i64 |
| 3350 | func init_impl(base: i64, seed: i64) -> i64 { return init_impl_v(base, 0, seed) } |
| 3353 | func wc_respawn(base: i64) -> i64 |
| 3365 | func wground(base: i64, x: i64, z: i64) -> i64 |
| 3375 | func wc_contact_floor_below_q(base: i64, xq: i64, zq: i64, top: i64, ceiling: i64) -> i64 |
| 3402 | func wc_contact_floor_q(base: i64, xq: i64, zq: i64, top: i64) -> i64 |
| 3407 | func wstand(base: i64, nxq: i64, nzq: i64, cyq: i64) -> i64 |
| 3425 | func wstand_here(base: i64, xq: i64, zq: i64) -> i64 |
| 3451 | func mob_solid2(base: i64, x: i64, g: i64, z: i64) -> i64 |
| 3456 | func mob_clear_x(base: i64, nx: i64, nz: i64, g: i64) -> i64 |
| 3465 | func mob_clear_z(base: i64, nx: i64, nz: i64, g: i64) -> i64 |
| 3474 | func mob_fits(base: i64, x: i64, g: i64, z: i64) -> i64 |
| 3480 | func mob_ground(base: i64, x: i64, ytop: i64, z: i64) -> i64 |
| 3500 | func mob_step_gait(vyp: *i64, k: i64, cy0: i64, ng: i64) -> i64 |
| 3523 | func npc_pick(base: i64, fx: i64, fy: i64, fz: i64) -> i64 |
| 3554 | func cal_dayt(base: i64) -> i64 |
| 3560 | func cal_day(base: i64) -> i64 |
| 3566 | func cal_season(base: i64) -> i64 |
| 3572 | func cal_night(base: i64) -> i64 |
| 3578 | func cal_sunel(base: i64) -> i64 |
| 3587 | func cal_rain(base: i64) -> i64 |
| 3602 | func wc_weather_tick(base: i64) -> i64 |
| 3622 | func dg_bst(dg: i64, b: i64) -> i64 { return dg - ((dg >> 3) & 7)*8 + b*8 } |
| 3629 | func wc_grow_set_indexed(base: i64, index: *i64, lx: i64, ly: i64, lz: i64, b: i64) -> i64 |
| 3637 | func wc_grow_set(base: i64, lx: i64, ly: i64, lz: i64, b: i64) -> i64 |
| 3643 | func wc_wet_near(base: i64, lx: i64, ly: i64, lz: i64) -> i64 |
| 3656 | func wc_farm_tick(base: i64) -> i64 |
| 3717 | func wc_soft_seat_all(base: i64) -> i64 |
| 3729 | func passp(base: i64) -> *i64 { return (base + O_PASS) as *i64 } |
| 3730 | func wc_pass_ck(p: *i64) -> i64 |
| 3733 | func wc_party_count(base: i64) -> i64 |
| 3746 | func wc_pass_sync(base: i64) -> i64 |
| 3802 | func wc_pass_apply(base: i64) -> i64 |
| 3845 | func pass_level_of(base: i64) -> i64 |
| 3853 | func party_of(base: i64) -> i64 |
| 3882 | func mob_pose(base: i64, k: i64) -> i64 |
| 3890 | func mobpose(k: i64) -> i64 { return mob_pose(0, k) } |
| 3907 | func wc_mob_in_water(base: i64, k: i64) -> i64 |
| 3913 | func wc_outfit(base: i64, k: i64) -> i64 |
| 3947 | func mob_outfit(base: i64, k: i64) -> i64 |
| 3953 | func mob_outfit_v1(base: i64, k: i64) -> i64 |
| 3967 | func wc_need_seed(base: i64) -> i64 |
| 3983 | func mindp(base: i64) -> *i64 { return (base + O_MIND) as *i64 } |
| 3984 | func wc_mind_zero(base: i64) -> i64 |
| 3991 | func th_add(base: i64, k: i64, id: i64, mag: i64, ttl: i64) -> i64 |
| 4014 | func th_mood(base: i64, k: i64) -> i64 |
| 4029 | func go_add(base: i64, k: i64, subj: i64, pred: i64, conf: i64) -> i64 |
| 4052 | func go_newest(base: i64, k: i64) -> i64 |
| 4070 | func wc_ddeg(d: i64) -> i64 { return d*IT_PI/WC_DDEG_HALFTURN } |
| 4073 | func wc_amp_ddeg(range_ddeg: i64) -> i64 { return wc_ddeg(range_ddeg)/2 } |
| 4092 | func wc_stride_ang(g_q8: i64) -> i64 { return g_q8*2*IT_PI/WC_STRIDE_Q8 } |
| 4094 | func wc_angwrap(d: i64) -> i64 |
| 4117 | func wc_hdg_budget(hdg: i64, dx: i64, dz: i64, budget: i64) -> i64 |
| 4141 | func wc_steer_reset(base:i64)->i64 |
| 4150 | func wc_nxa_locomotion(base:i64,mode:i64)->i64 |
| 4160 | func nxa_locomotion(mode:i64)->i64 {return wc_nxa_locomotion(0,mode)} |
| 4161 | func wc_forward_policy(base:i64,k:i64)->i64 |
| 4168 | func wc_motion_step(base:i64,k:i64,heading:i64,dx:i64,dz:i64)->*i64 |
| 4175 | func wc_forward_steer(base:i64,k:i64,heading:i64,dx:i64,dz:i64)->*i64 |
| 4189 | func wc_hdg_step(hdg: i64, dx: i64, dz: i64) -> i64 |
| 4193 | func wc_facing_step(hdg: i64, dx: i64, dz: i64, player_dx: i64, player_dz: i64, radius: i64, budget: i64) -> i64 |
| 4199 | func wc_hdg_of(base: i64, k: i64) -> i64 { let hp: *i64 = (base + O_MOBHDG) as *i64; return hp[k] } |
| 4200 | func wc_set_facing_policy(base: i64, radius: i64, gain: i64) -> i64 |
| 4207 | func set_facing_policy(radius: i64, gain: i64) -> i64 { return wc_set_facing_policy(0,radius,gain) } |
| 4208 | func mob_heading(k: i64) -> i64 |
| 4213 | func wc_mob_sph(base: i64, k: i64) -> i64 |
| 4225 | func wc_gp_pelvis(sph: i64) -> i64 { return wc_amp_ddeg(WC_PELVIS_ROT_DDEG)*it_sin4096(sph % (2*IT_PI))/WATER_MAGIC_4096 } |
| 4226 | func wc_gp_thorax(sph: i64) -> i64 { return wc_amp_ddeg(WC_THORAX_ROT_DDEG)*it_sin4096(sph % (2*IT_PI))/WATER_MAGIC_4096 } |
| 4227 | func wc_gp_leg(sph: i64) -> i64 { return it_sin4096(sph % (2*IT_PI))*(IT_PI/6)/WATER_MAGIC_4096 } |
| 4228 | func wc_gp_arm(sph: i64) -> i64 { return it_sin4096(sph % (2*IT_PI))*(IT_PI/12)/WATER_MAGIC_4096 } |
| 4231 | func wc_gp_elbow(sph: i64) -> i64 { return wc_ddeg(WC_ELBOW_ROM_DDEG)*(WATER_MAGIC_4096 - it_cos4096(sph % (2*IT_PI)))/(2*WATER_MAGIC_4096) } |
| 4237 | func wc_mob_resident(base: i64, h: i64) -> i64 |
| 4245 | func mob_resident(k: i64) -> i64 |
| 4250 | func wc_warden_target(base:i64,hw:i64,night:i64)->i64 |
| 4274 | func mob_tick(base: i64) -> i64 |