@wildshard/shard-format 0.0.0 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (746) hide show
  1. package/corpus/brasscap-mesa/blobs/bin/02da0052111419cdff3a29f1c6d0ff0d223e0b53a956c16c65ed63d87928b3b9.bin +0 -0
  2. package/corpus/brasscap-mesa/blobs/bin/068a121cd780a2a9164416f6e4fde44834f2d2f3a5ed65c174e480b7a2d3f627.bin +0 -0
  3. package/corpus/brasscap-mesa/blobs/bin/07d5a061cd338618e528747d61eb2b17709510550ef0ba40a58b67761b200f3f.bin +0 -0
  4. package/corpus/brasscap-mesa/blobs/bin/086e3706070555baca863f6ecf9dbca09c084afa501d92d4246d896b09546f36.bin +0 -0
  5. package/corpus/brasscap-mesa/blobs/bin/08b1b9ab7c732d7dbe8f961f1fc40e84042d1fe42544f55c9ee89f04dffe3d5e.bin +0 -0
  6. package/corpus/brasscap-mesa/blobs/bin/18bdbdc704cb8aac93435d208dfe0e9a44374efb73afa3bc58c631650e0a2995.bin +0 -0
  7. package/corpus/brasscap-mesa/blobs/bin/1a210fcddcb9749ecb1c244837e8e37ea69b038faae191dee6bbbde228d31a18.bin +0 -0
  8. package/corpus/brasscap-mesa/blobs/bin/264ab9ede386504a5ff9814b0a620b879cb29f3f45a80bcfc0c80b8ee236e364.bin +0 -0
  9. package/corpus/brasscap-mesa/blobs/bin/2b6fbea4c846a23cf4802ebdb1804e128896c8dd87e5d23509db6729e5b1be4e.bin +0 -0
  10. package/corpus/brasscap-mesa/blobs/bin/2d755cc635dee90b0f3958272855a821e2dd605a189a5ffcd480a325155fe84f.bin +0 -0
  11. package/corpus/brasscap-mesa/blobs/bin/2d76c6829fe77fb55cc2541e4aca5ce5d18b68508dcdf3fa957fe4a83b9c887a.bin +0 -0
  12. package/corpus/brasscap-mesa/blobs/bin/32c15d55a4548501740593807c5007217c72dbc10a21f4613ef5e0cee0b90d1d.bin +0 -0
  13. package/corpus/brasscap-mesa/blobs/bin/3539b362cf3a61a79e92e113ebf8f255d0b25ec2d2edd816498879de831fa912.bin +0 -0
  14. package/corpus/brasscap-mesa/blobs/bin/3af38a2377bc89f6c6c82ee1e83df674efa2793db932b50a23bbce7ec9cd7941.bin +0 -0
  15. package/corpus/brasscap-mesa/blobs/bin/3c176a7a0d0850fdcee790ed2641216fc3d1cba025928de3d7784262bb9b6f4a.bin +0 -0
  16. package/corpus/brasscap-mesa/blobs/bin/3fb37e488aa81a64c997b3dd09794e988994c6ee3476c6d653ced1670888dd8e.bin +0 -0
  17. package/corpus/brasscap-mesa/blobs/bin/424dcc7b320317bf3f2c62c8f19bc80564035127eb38ab811e460934d57ea38c.bin +0 -0
  18. package/corpus/brasscap-mesa/blobs/bin/45cea35fab6bb06051a3286fca2307944850c7f9ed7aa89b7c24fafef28efda6.bin +0 -0
  19. package/corpus/brasscap-mesa/blobs/bin/499cc7863851f97d79dbfc64e76f9e6978894199184a0d80ebdca13066a8fa78.bin +0 -0
  20. package/corpus/brasscap-mesa/blobs/bin/4b7217644763b00c6ee6ae3f176c726914966fb791654a385c0638bb998b6dd2.bin +0 -0
  21. package/corpus/brasscap-mesa/blobs/bin/4cf11c7177bb082f335e5bc7a037ef00d09355c5ad8263e284a96a92630ff9ae.bin +0 -0
  22. package/corpus/brasscap-mesa/blobs/bin/536b37cab5a1edd6a68a71d122aab6898e44c68a5470a4ca8a9a72c57c02e034.bin +0 -0
  23. package/corpus/brasscap-mesa/blobs/bin/55d3628b27e0fcea383df86c434a69761439f51a013359f0829675b07ee2b616.bin +0 -0
  24. package/corpus/brasscap-mesa/blobs/bin/5652ba90fbd8146edaf42660329cc81798752f2f60b8d03956714460d5ba75ef.bin +0 -0
  25. package/corpus/brasscap-mesa/blobs/bin/57459ab5e2ac6cec65ef5e59789dd82b9666d8573df41c4a398df603f1fa456f.bin +0 -0
  26. package/corpus/brasscap-mesa/blobs/bin/5915b6aed21bba49b841b45574f44f60d26b44810bd68ac70b22f3f3b0dab072.bin +0 -0
  27. package/corpus/brasscap-mesa/blobs/bin/5c4a5c7a8e99253561105c5fa3faf14326cf0c23adc32bfe7f8aea4dbf4b05f9.bin +0 -0
  28. package/corpus/brasscap-mesa/blobs/bin/61822a412cfd461f4f7ae50bc13f242a0fca6c5c58fca72247b596ab037a1c85.bin +0 -0
  29. package/corpus/brasscap-mesa/blobs/bin/673b7712908966718341508469b39cd49e6461f690ca3c23d4621ea7eba0cc30.bin +0 -0
  30. package/corpus/brasscap-mesa/blobs/bin/69394a49520f84f6dccc1655f1c89eedc913ac53a7e48ac5dc1bff4141639bb4.bin +0 -0
  31. package/corpus/brasscap-mesa/blobs/bin/6e58a53a6c2acd50f9f80fd270ca034c54421df8a587e181101b4b75b952ac5d.bin +0 -0
  32. package/corpus/brasscap-mesa/blobs/bin/75dc9f23ee71e11a3a0c67eb77275d741a281c3398808fb42efd52b9973d5d04.bin +0 -0
  33. package/corpus/brasscap-mesa/blobs/bin/76c6a403293a68ed3d6ad14e9dd27b555c3a1ef4a3cae12a2bd2ab3e67c5ad02.bin +0 -0
  34. package/corpus/brasscap-mesa/blobs/bin/82b73ce3a18e47092840fc029177861887aa2867b007248ac79ffa20895a4491.bin +0 -0
  35. package/corpus/brasscap-mesa/blobs/bin/8430d9bbfb4e2b678c54595ad95555c3c73d0e1b144a4d6e29664ccb4371baf0.bin +0 -0
  36. package/corpus/brasscap-mesa/blobs/bin/848d4492508689f5c4a224079dca8809e872e33b8f2635c9f16da5dc21beed16.bin +0 -0
  37. package/corpus/brasscap-mesa/blobs/bin/84941ac387a0d245ea20bd663ff4ee78c5315bedfa058ada0961765aff61acaf.bin +0 -0
  38. package/corpus/brasscap-mesa/blobs/bin/859b7bbcf048a4525db0548b8f5afef83bfc4870914767153f44c05e83436ec5.bin +0 -0
  39. package/corpus/brasscap-mesa/blobs/bin/87b68b45680a57c796eed9183211b03335a6ad6737372b3ef476c2cf42efa631.bin +0 -0
  40. package/corpus/brasscap-mesa/blobs/bin/8cef94308af8d09670e4c99a3b6c3d9280b7a27d386653a3bd7d482b2cdf2b65.bin +0 -0
  41. package/corpus/brasscap-mesa/blobs/bin/8e564bce3f352c2186ae09ed7fbca9739c10abc46fd5f6893c68cb47178bd2b4.bin +0 -0
  42. package/corpus/brasscap-mesa/blobs/bin/8f89e79d0fb9b04d48c7b5719e1d024161c6a2119835b18dcb193ff51123a9be.bin +0 -0
  43. package/corpus/brasscap-mesa/blobs/bin/8fe511ad48656a0b10801100b9100edab1be605a8a182dc5c834d298bf0d9166.bin +0 -0
  44. package/corpus/brasscap-mesa/blobs/bin/900bda6562d06fafda54c495e325d57dbb7931813178ee207449c5519d89d537.bin +0 -0
  45. package/corpus/brasscap-mesa/blobs/bin/997b1b7d9210bfa77dc71f16a57c6bd66bc7c648686dc2a2666044c95042978a.bin +0 -0
  46. package/corpus/brasscap-mesa/blobs/bin/a111bb4c6cec536bcf57dddc744b871ac9f3d094ce459c16243adca19020db77.bin +0 -0
  47. package/corpus/brasscap-mesa/blobs/bin/a2208bf899e6c84942eef9fbab569d597f574551afae5864f1953c6a517af068.bin +0 -0
  48. package/corpus/brasscap-mesa/blobs/bin/a302ddb2598a72ece53780094b64ad861dc68e6913d8a1ea08f5d141736e2986.bin +0 -0
  49. package/corpus/brasscap-mesa/blobs/bin/afcbc671326d0dac14e460662c1f793335877ba53cc965f67c0306833b087e7c.bin +0 -0
  50. package/corpus/brasscap-mesa/blobs/bin/b657159e6a28c801a211024f96a7ef60e388ce928a7b41ae3d7555a6f8fd2e3e.bin +0 -0
  51. package/corpus/brasscap-mesa/blobs/bin/be6bbc6cd15ba525790075252ba0ed0b28dae5cfbfa118c00dfb9ea1ab95e668.bin +0 -0
  52. package/corpus/brasscap-mesa/blobs/bin/c1360e3cbe6b3dc8894bc66c359853854c2e5adeac9c7cd5ba63f5db448be601.bin +0 -0
  53. package/corpus/brasscap-mesa/blobs/bin/c7983018dbf8e384ddf73191f526075bd0b29907061ab17642ecdc18ea7b9897.bin +0 -0
  54. package/corpus/brasscap-mesa/blobs/bin/cea66f27ca60ea173ee0a2bcd91964dc2638eb5657250fe3aa5bd3e41faf8730.bin +0 -0
  55. package/corpus/brasscap-mesa/blobs/bin/d052be571a0f3ab69926951f3a4c9d63f05da2ca6d91e5963dd63e04ecb515de.bin +0 -0
  56. package/corpus/brasscap-mesa/blobs/bin/d162a993a60dd682c8c21dd111429d84d8d30413a000cf481cf98d06ca83e706.bin +0 -0
  57. package/corpus/brasscap-mesa/blobs/bin/d238c3d3d054911714ebe30dafc99e6ad13925b7a600ba9f8d532d0f515f3f5a.bin +0 -0
  58. package/corpus/brasscap-mesa/blobs/bin/d9a98cfe2865a9bb0e94f35c735a570b0625b58f890a6b1f6e14fab2401f0af2.bin +0 -0
  59. package/corpus/brasscap-mesa/blobs/bin/dc27ae954b7b8a13a9459d6ca6ef2997f662715ff5f5453ea0da169f141748b8.bin +0 -0
  60. package/corpus/brasscap-mesa/blobs/bin/e3ff1fd41cf76668b8e1927c0c2e4056b63a293ebbd300a8f1b1d27d87786271.bin +0 -0
  61. package/corpus/brasscap-mesa/blobs/bin/e45b7344d373b3ef4a94f560cf4e17b1eb3b8cd89d1e552fc9be11d6b7b546f0.bin +0 -0
  62. package/corpus/brasscap-mesa/blobs/bin/eb14eb898224d5d81d1012bec54f2b79f9377dc60fa1d01e49b4c3e148292d77.bin +0 -0
  63. package/corpus/brasscap-mesa/blobs/bin/ed0e0101a3d91a3a615f9e78ef36f7deb8bb0eab0f133241d621925d0b596599.bin +0 -0
  64. package/corpus/brasscap-mesa/blobs/bin/f722e3a3b1f0a3d7b9f7d7c66c46d8c87245de5f8eece055daf95c7086f8c267.bin +0 -0
  65. package/corpus/brasscap-mesa/blobs/bin/f76013aedfd810f136fa689a151024bcb942687ef42ae7edf1fd3513ac4e22c7.bin +0 -0
  66. package/corpus/brasscap-mesa/blobs/glb/0547e63693282614673b13bade4c08eb772020757b131b7c80f2077873aab70e.glb +0 -0
  67. package/corpus/brasscap-mesa/blobs/glb/0cf89e9b1824440d213c8e9e33fb357734b7241b4c7eedaba3df7f8306e05425.glb +0 -0
  68. package/corpus/brasscap-mesa/blobs/glb/0e01060e3a507ffff6461c50b5c565c71380a6a67d9760cdd7a09afd3e30b584.glb +0 -0
  69. package/corpus/brasscap-mesa/blobs/glb/0ef326c5cf5292cd15b48b851460ee8156f51e0a5b62457c8f1f3c53c41665a3.glb +0 -0
  70. package/corpus/brasscap-mesa/blobs/glb/1112ff4a3f69db3b62c6d2d6ae021e7c43ce0ca1feb1d3130376881decb3c6b0.glb +0 -0
  71. package/corpus/brasscap-mesa/blobs/glb/11357cb8a0670fdc9a03780dd79a31e0aa7a0537786cbf66491bae1722d6feb3.glb +0 -0
  72. package/corpus/brasscap-mesa/blobs/glb/11dbecc73bd343c375bd4b79db8dbda2272e76a6b8426ac29e90f2b1272ccfc2.glb +0 -0
  73. package/corpus/brasscap-mesa/blobs/glb/133f639cfa837bc5da7915121c71fd32281660c2aaa0248bd59bde47e7faf8bc.glb +0 -0
  74. package/corpus/brasscap-mesa/blobs/glb/16812a090136b6678633aa4db03e4187920ae0aca776ad6da373c600cd341972.glb +0 -0
  75. package/corpus/brasscap-mesa/blobs/glb/17e63980d7934cfe1d2823d78652af338fe9f0c2170106cd4506a2c4e7f4716f.glb +0 -0
  76. package/corpus/brasscap-mesa/blobs/glb/199224cafc86904bdefec8f01d131d7ca3e076a22b689bfc6a26dd20373cf286.glb +0 -0
  77. package/corpus/brasscap-mesa/blobs/glb/1a5c8cf223a2f64715ea5eaf14d97a0131f9ebdef4388dc4823dcfa57817724c.glb +0 -0
  78. package/corpus/brasscap-mesa/blobs/glb/1b0ec09ad6718149d7ca514136cee09b04c96425f03af0559fd097112aa0daa5.glb +0 -0
  79. package/corpus/brasscap-mesa/blobs/glb/1e5024bbb1284b2ed39bbca2d0ade3acb5be2a2c6ba643291f269b76098c7f79.glb +0 -0
  80. package/corpus/brasscap-mesa/blobs/glb/1e7635972e13468ffcbb1608f1d12559b066b4533912be2c35e3db07fd4a679d.glb +0 -0
  81. package/corpus/brasscap-mesa/blobs/glb/1f03db3a38a21b8d4d02f8ede30e1303cd8d4c426815326a88f45a268b17a492.glb +0 -0
  82. package/corpus/brasscap-mesa/blobs/glb/2624abb7bf45618be40f8c3221445179fca44f7321baff415fdf7ddd5e0afc6f.glb +0 -0
  83. package/corpus/brasscap-mesa/blobs/glb/27fc3bad6db6e2b5ade5d242867d882362482ddf19c647edef821afc27d52dc2.glb +0 -0
  84. package/corpus/brasscap-mesa/blobs/glb/29959bdb5b04a9180e88ec1ed976bae55424d3dc50985f13c0f85bae11ae79ee.glb +0 -0
  85. package/corpus/brasscap-mesa/blobs/glb/308cbce2b1b6360f9a2dc275d0bc28be1966fc3ff5e0a58844405ba867f3f668.glb +0 -0
  86. package/corpus/brasscap-mesa/blobs/glb/3674d7be969755aaffa368e57b8d1bb743bc98e766a57948859d54fdc7d2c066.glb +0 -0
  87. package/corpus/brasscap-mesa/blobs/glb/3736ca95c9c40b30e21302ae6c89148d8ac09264dfbb7e5764b08c265a73ba3c.glb +0 -0
  88. package/corpus/brasscap-mesa/blobs/glb/3bc90e1dc9411d249697e4ec352baa4886f91cacfe4940ac43aed879f60966c9.glb +0 -0
  89. package/corpus/brasscap-mesa/blobs/glb/3f519c7c7482307cae908b27602dcb7716e2da4b651eff39c4c37103998d18fa.glb +0 -0
  90. package/corpus/brasscap-mesa/blobs/glb/4767636d5554b60c94b447b87b77fc1456a2b9af42bfe08585389d27f306dd5e.glb +0 -0
  91. package/corpus/brasscap-mesa/blobs/glb/4a3242773b3a73a73ee746a0cdf30c8d6d904bb4406dfdf9822dcd535d6ae308.glb +0 -0
  92. package/corpus/brasscap-mesa/blobs/glb/4c7bf3788cba151442d85c3f76553c2e356edf8566ae8243d0a535c9bcde51d0.glb +0 -0
  93. package/corpus/brasscap-mesa/blobs/glb/4f3b9f4c818ed6d375947e9603dd058c539e14ff05aa193fb5054d899dbb82a2.glb +0 -0
  94. package/corpus/brasscap-mesa/blobs/glb/4fdf7ee67d12de1cd30c3c2bbd9409032dcab5feb3a7d3977b92c50b1d161afe.glb +0 -0
  95. package/corpus/brasscap-mesa/blobs/glb/5821f33aa00e9acd2f4c0a29129978ee7006a879d163ce1463ae476031bfabcf.glb +0 -0
  96. package/corpus/brasscap-mesa/blobs/glb/5a986c3e44fc686a2efe7648c3945bb7b51cf303918381383f21f898dd312cad.glb +0 -0
  97. package/corpus/brasscap-mesa/blobs/glb/5c32fc1de6d198ed606d3e8c3264319acdd950dab18e8b723fc6332bf2f56aea.glb +0 -0
  98. package/corpus/brasscap-mesa/blobs/glb/602ce4e8b00a0afbc1a894b65641e48d362ec834a559b9d97a4801473bb01da7.glb +0 -0
  99. package/corpus/brasscap-mesa/blobs/glb/6180f9f96167522d8cab4de1d52598cecee8d7ee042f48e41669c98cf61c19c3.glb +0 -0
  100. package/corpus/brasscap-mesa/blobs/glb/6205973ba63f7a554662ba05010d25131bed2d9656de422e2067ca54709d5b3c.glb +0 -0
  101. package/corpus/brasscap-mesa/blobs/glb/693e556f2165232e8a38b1b2d68676f235ece5705c564992cfa7731426f4d376.glb +0 -0
  102. package/corpus/brasscap-mesa/blobs/glb/6a46175438bec5527c281b577bd220b6badedf3c74266b997d39e596f83b8853.glb +0 -0
  103. package/corpus/brasscap-mesa/blobs/glb/6ca1bcad7ea053a259b7f9fc5a7ec388a4cd29d44391d93386ea8b1143d94c21.glb +0 -0
  104. package/corpus/brasscap-mesa/blobs/glb/6f9bc99656b611890d6acc76ee416f6222ca2d5f62167840b4216a21e020a4c8.glb +0 -0
  105. package/corpus/brasscap-mesa/blobs/glb/6fb1e7857996662233ab5314fc13f8aa30703f91c04542e352ec17f9dc4fc054.glb +0 -0
  106. package/corpus/brasscap-mesa/blobs/glb/7028ec39712143a7e9d09d2e1477282b654d0470102ca9d272ac82b23604cb21.glb +0 -0
  107. package/corpus/brasscap-mesa/blobs/glb/73af65ac86efa61099178f3e7075dcd26d389ee9b9aa3546c18dede10c3dfda1.glb +0 -0
  108. package/corpus/brasscap-mesa/blobs/glb/73b992b71bd3165ff7701ab1430c075cb5ba9b74e6363d24640377b1011ddc93.glb +0 -0
  109. package/corpus/brasscap-mesa/blobs/glb/7471261d4df59979ba41a622d93779b66ebecd50353ad433862e603ee65f8748.glb +0 -0
  110. package/corpus/brasscap-mesa/blobs/glb/76e9a3fcca962c2f900cf79dc1a0851840bd405dc11231f629f784adbcb69d23.glb +0 -0
  111. package/corpus/brasscap-mesa/blobs/glb/79d2d29e8cd8b642386b5f31429b39bc4d6f13e53107dda00ebc463abf80c79d.glb +0 -0
  112. package/corpus/brasscap-mesa/blobs/glb/7de66fcfffe4ff108510cbe6bebec44e28ab4b78e98e9c1a38466db5b81881f7.glb +0 -0
  113. package/corpus/brasscap-mesa/blobs/glb/811fa798cb81ea99488db98e3d3ddea815aac8f6e7493ad04d0176f603978678.glb +0 -0
  114. package/corpus/brasscap-mesa/blobs/glb/89b277f1636be220ff5658ff1f1c62efe14079d6e1f42efb373fbf0246801533.glb +0 -0
  115. package/corpus/brasscap-mesa/blobs/glb/905c5fe666d9f6174e987382e47d3f325c5696cf8792d7a4a1dd120a438b8270.glb +0 -0
  116. package/corpus/brasscap-mesa/blobs/glb/90efe3e05370ee853c0130b98ee82f00b86f7c7104e96b094715187fa49ac16f.glb +0 -0
  117. package/corpus/brasscap-mesa/blobs/glb/968a7c5cb13014bce00a29d43b344bd6943ff00ae2908abbc6b40a994f1172a1.glb +0 -0
  118. package/corpus/brasscap-mesa/blobs/glb/9a955b4e69dfa5b38f071099053c1a3684cf85ec2d346420de2853c61768f8cc.glb +0 -0
  119. package/corpus/brasscap-mesa/blobs/glb/9da2781216a2e482dd8a6ada5ebb43bcf48e0169430e787ac277559cb2ade19a.glb +0 -0
  120. package/corpus/brasscap-mesa/blobs/glb/9db02aab14a3b52463deadefbf4ba771809941e7fcb137c905955bdc80ec23bd.glb +0 -0
  121. package/corpus/brasscap-mesa/blobs/glb/a3fe1788cf5d7f260249c722f0e0695a4d55744d1b14be44122377147a296256.glb +0 -0
  122. package/corpus/brasscap-mesa/blobs/glb/a5c75af8f090d3c95fa46d2be49be5031138d7cd1bae234ae028edf717bf299e.glb +0 -0
  123. package/corpus/brasscap-mesa/blobs/glb/a771abd40bd337a464c1bd19f841b62e290124faa89b19ec50e85ab36bc740a5.glb +0 -0
  124. package/corpus/brasscap-mesa/blobs/glb/a94a2ad2ed463a47cdda117df25b06b3cf6be37ddac08594bc5f5d76c7237730.glb +0 -0
  125. package/corpus/brasscap-mesa/blobs/glb/ad434e4a6490e495994b25f7574a5847a9f7d9c2ca5a2b229a9dfdd2e5e2bb72.glb +0 -0
  126. package/corpus/brasscap-mesa/blobs/glb/aeae7b05404b852008a7897689e58aacef44a2c3bc0e87d2519ecdb4cb1e3ff5.glb +0 -0
  127. package/corpus/brasscap-mesa/blobs/glb/b0c0c8a4985f92be3b358a8e703c67957427501882aeee05b4ccd3c7880930d4.glb +0 -0
  128. package/corpus/brasscap-mesa/blobs/glb/b25174c3cd13eea6e1d9c3104ee5197dc6330129b2f0f7676e8a429900999d9b.glb +0 -0
  129. package/corpus/brasscap-mesa/blobs/glb/b3eecdec571df96338edf690443394ff859383b4c94f4cf33d42c240006f8543.glb +0 -0
  130. package/corpus/brasscap-mesa/blobs/glb/b7aa0c61ff9e7411535c7b7b8e587849a92bad00d431171ab16ad47d55db0a53.glb +0 -0
  131. package/corpus/brasscap-mesa/blobs/glb/b9deef944c22331bc05220d1d6e46412e3cb1246ef041a4405d0cbbd90c2d624.glb +0 -0
  132. package/corpus/brasscap-mesa/blobs/glb/ba9376e4ac39b809133ab717edb4c88b5219118766db492d7c97534ce119c2ec.glb +0 -0
  133. package/corpus/brasscap-mesa/blobs/glb/baf338e9c272158b905fb58a712e29410c657a45be2764f1c6c43ca87fd1db48.glb +0 -0
  134. package/corpus/brasscap-mesa/blobs/glb/bd442ac9fbe52b9f2e4ba586670017c3f2d9fedf1cbdec77ef24e9f8b3a183c8.glb +0 -0
  135. package/corpus/brasscap-mesa/blobs/glb/c142adcf253be43b66f23ede8cea1e8fcfa256ebf53054a1068ace04745718a6.glb +0 -0
  136. package/corpus/brasscap-mesa/blobs/glb/c6d7cbdc4b2ee9d416edf4d736a4f374f08aea98ca395ad371a50a1853744cfc.glb +0 -0
  137. package/corpus/brasscap-mesa/blobs/glb/cfb165a7675d15cee2c490b31095a58f73bace50ccc1e0fdf2c8dc4400f1df27.glb +0 -0
  138. package/corpus/brasscap-mesa/blobs/glb/d40f2ee59612473e9f687f17a0e203fdb4ba54c7185b05a8d81a433b04f24134.glb +0 -0
  139. package/corpus/brasscap-mesa/blobs/glb/d50ce95411156a6b6cf386aefa5ee58db659811813f74be74f323e7c5795056f.glb +0 -0
  140. package/corpus/brasscap-mesa/blobs/glb/d6af418bbde39b4fc7d22a61401d416be7a3fc1214ea2d3f42b4549c392d22ca.glb +0 -0
  141. package/corpus/brasscap-mesa/blobs/glb/de7222ceeb1f72693dfb7fd1f343798659e03772d77f2b498fd8ebece2d5550a.glb +0 -0
  142. package/corpus/brasscap-mesa/blobs/glb/e26975b198127ac3b6b4f5c4bc08ad47d6691398feee777743285391cd36d502.glb +0 -0
  143. package/corpus/brasscap-mesa/blobs/glb/ea428490cd5f2672676a2776a598b819b08246871e76de94b7196f9643144986.glb +0 -0
  144. package/corpus/brasscap-mesa/blobs/glb/eb96567a266d24be188cb5b08021112f2fad311cbead939d53c5565da11f6265.glb +0 -0
  145. package/corpus/brasscap-mesa/blobs/glb/ecf66230bf7b68050c0827c2e4caf3de90e46859d291b794faa0dd3816d9dac6.glb +0 -0
  146. package/corpus/brasscap-mesa/blobs/glb/ed8f067763a4a8adb83d80c8324b2a9668f1061f5f5352f21295e6cc5132386f.glb +0 -0
  147. package/corpus/brasscap-mesa/blobs/glb/ee507a38772865467736d370791fe73c6aa4d83fe3e7ff4baa156b9cb2894c1c.glb +0 -0
  148. package/corpus/brasscap-mesa/blobs/glb/eedc5b62dc6f27d4a089e9f5b282f626129236d3f1689b001e04f8748bf8859c.glb +0 -0
  149. package/corpus/brasscap-mesa/blobs/glb/f4119b9c6c23435619682b5d247743459e76584b9b0d6c5cb689d8e156906695.glb +0 -0
  150. package/corpus/brasscap-mesa/blobs/glb/f576047267a0bf9bd4bfc47072ea3d11066345b839953546292da678d1cb4722.glb +0 -0
  151. package/corpus/brasscap-mesa/blobs/glb/f8cdfb11997d4ccabea88bcdd3924cc8b621b33618b18fe5fbfd286edfc1d87e.glb +0 -0
  152. package/corpus/brasscap-mesa/blobs/glb/fce95ecc5db24c903bd46f338e366e2715411465a5efac180e2f0f46397e59de.glb +0 -0
  153. package/corpus/brasscap-mesa/blobs/image/0579557f9344df6f2c4b1225e6252e53ab86d417a4c9b504b5c714a08a388e47.jpg +0 -0
  154. package/corpus/brasscap-mesa/blobs/image/9e18816a2ec16fbbb1f00f4a39c73ac2cbf6a8cdc17b4c96b1eba4cc9a754dc7.jpg +0 -0
  155. package/corpus/brasscap-mesa/blobs/image/eb453c71cfb1f9441eb00b32281f98e226e49d9dcf75c231455575fcdc652222.jpg +0 -0
  156. package/corpus/brasscap-mesa/blobs/json/e0072ed82115c519b891f53a194ea3b28fff7d3826d8ddf23460d6f21b7728d9.json +1 -0
  157. package/corpus/brasscap-mesa/blobs/json/ffb0e08eaaa7188db1f55931c9b6330937316091cc7463ed2eff6767bbfa33de.json +1 -0
  158. package/corpus/brasscap-mesa/blobs/wasm/1d6ace79610c4d510b60ad0c52915e42b57797d91f1ef292f60d8a3daec03dd6.wasm +0 -0
  159. package/corpus/brasscap-mesa/blobs/wasm/24a4d4c1292677b1c984b5c0d3497ae2929528bf511df475f80cc20945bb08ec.wasm +0 -0
  160. package/corpus/brasscap-mesa/blobs/wasm/b86d8afcc269fb063ebf64768fc3787635b65a7409a571115b07be2e4da39733.wasm +0 -0
  161. package/corpus/brasscap-mesa/cook.json +1 -0
  162. package/corpus/brasscap-mesa/mounts/shardfiles/brasscap-mesa/discovery.json +1 -0
  163. package/corpus/brasscap-mesa/sections/actors/creatures.json +1 -0
  164. package/corpus/brasscap-mesa/sections/actors/crowds.json +1 -0
  165. package/corpus/brasscap-mesa/sections/actors/species.json +1 -0
  166. package/corpus/brasscap-mesa/sections/audio/audio.json +1 -0
  167. package/corpus/brasscap-mesa/sections/combat/encounters.json +1 -0
  168. package/corpus/brasscap-mesa/sections/combat/items.json +1 -0
  169. package/corpus/brasscap-mesa/sections/combat/strikes.json +1 -0
  170. package/corpus/brasscap-mesa/sections/economy/ledger.json +1 -0
  171. package/corpus/brasscap-mesa/sections/economy/loot.json +1 -0
  172. package/corpus/brasscap-mesa/sections/look/look.json +1 -0
  173. package/corpus/brasscap-mesa/sections/look/materials.json +1 -0
  174. package/corpus/brasscap-mesa/sections/quests/quests.json +1 -0
  175. package/corpus/brasscap-mesa/sections/sim/client-scripts.json +1 -0
  176. package/corpus/brasscap-mesa/sections/sim/hooks.json +1 -0
  177. package/corpus/brasscap-mesa/sections/sim/plumbing.json +1 -0
  178. package/corpus/brasscap-mesa/sections/sim/scripts.json +1 -0
  179. package/corpus/brasscap-mesa/sections/sim/sim.json +1 -0
  180. package/corpus/brasscap-mesa/sections/state/migrations.json +1 -0
  181. package/corpus/brasscap-mesa/sections/state/state.json +1 -0
  182. package/corpus/brasscap-mesa/sections/ui/card.json +1 -0
  183. package/corpus/brasscap-mesa/sections/ui/compendium.json +1 -0
  184. package/corpus/brasscap-mesa/sections/ui/level.json +1 -0
  185. package/corpus/brasscap-mesa/sections/ui/ui.json +1 -0
  186. package/corpus/brasscap-mesa/sections/world/collision.json +1 -0
  187. package/corpus/brasscap-mesa/sections/world/days.json +1 -0
  188. package/corpus/brasscap-mesa/sections/world/edge.json +1 -0
  189. package/corpus/brasscap-mesa/sections/world/movers.json +1 -0
  190. package/corpus/brasscap-mesa/sections/world/navigation.json +1 -0
  191. package/corpus/brasscap-mesa/sections/world/props.json +1 -0
  192. package/corpus/brasscap-mesa/sections/world/spawn.json +1 -0
  193. package/corpus/brasscap-mesa/sections/world/terrain.json +1 -0
  194. package/corpus/brasscap-mesa/sections/world/tiles.json +1 -0
  195. package/corpus/brasscap-mesa/sections/world/traversal.json +1 -0
  196. package/corpus/brasscap-mesa/sections/world/water.json +1 -0
  197. package/corpus/brasscap-mesa/sections/world/weather.json +1 -0
  198. package/corpus/brasscap-mesa/shard.json +1 -0
  199. package/corpus/brasscap-mesa/validation.json +1 -0
  200. package/corpus/handwritten/blobs/bin/027822f6ae9c374ce1ced851f2227cb9acb03077e5cc6b7fecb245c31f021abd.bin +0 -0
  201. package/corpus/handwritten/blobs/bin/0377ce182bd604bcf4d501f14bf954c434ea64ad856ad9d71c502d1045612703.bin +0 -0
  202. package/corpus/handwritten/blobs/bin/05ad93d239eeeb5d9afa09b00d90c56098d88e8850e5b5e691fcaa7520dec3cd.bin +0 -0
  203. package/corpus/handwritten/blobs/bin/0c8980141e6e394ea473df1eb11c347ba617a1a9a4b39b3fa1871b5d15b97d87.bin +0 -0
  204. package/corpus/handwritten/blobs/bin/14eb11f8d809320e0a68b1edea7837d7a5b4a3da71f1ce4f54068e0afe0b039b.bin +0 -0
  205. package/corpus/handwritten/blobs/bin/16590066c039ac71e5038a9866a53ccb95e21af13db29cb655b379c4fcfef7bb.bin +0 -0
  206. package/corpus/handwritten/blobs/bin/1795b5147ad52482445d2414ee22823b947c43a917b6e96fd9ec017f17000912.bin +0 -0
  207. package/corpus/handwritten/blobs/bin/18f2e24ecc1ed1b1d12ae1c89732a5a1a618ab6e973d4ff0332cf9ecc4e4f4a6.bin +0 -0
  208. package/corpus/handwritten/blobs/bin/1a18ade01095f1a9ebe75650127861ef27dda0bb17c2b91bde057ec88ef2e98a.bin +0 -0
  209. package/corpus/handwritten/blobs/bin/1dba017cddb874bc147efb00c55418846ffa344a696f4df702bbabeea55034d0.bin +0 -0
  210. package/corpus/handwritten/blobs/bin/248c703537e4687ddd2b69a40d1ef3936da718626289d6867ce0a6866f562ba4.bin +0 -0
  211. package/corpus/handwritten/blobs/bin/2612d9fd4727f8c349f2dbfb7b1650bb7a752d0798a4966ac22cf2b6cdd9fcef.bin +0 -0
  212. package/corpus/handwritten/blobs/bin/28c54c766e90e3b046a2377b9fa015b0ce45cf3da4420f2b10553251f86c06aa.bin +0 -0
  213. package/corpus/handwritten/blobs/bin/30866b4807b12579f50218f6525c3db00919fbd43c97921daf47b3244b25dca6.bin +0 -0
  214. package/corpus/handwritten/blobs/bin/3d14fae85d77406a9b8c59f2e973cdae9587d49108ea92fb460679ca860196b8.bin +0 -0
  215. package/corpus/handwritten/blobs/bin/3f2201a53c441abcfb52089fe9bbb01f26fac8744099d3fb6668452885c2fa11.bin +0 -0
  216. package/corpus/handwritten/blobs/bin/42f270a99367fc4cc901518ccaa344ab595e265f113be944510da745c11f69d1.bin +0 -0
  217. package/corpus/handwritten/blobs/bin/43fd4327fedd51a586684ac611bcad4a8b9d62e51e03967de71fb42c9bf0f6e1.bin +0 -0
  218. package/corpus/handwritten/blobs/bin/484adda0898a881b6f095dad447f6a619bf0933f65efe940b72f1ab7f3630c22.bin +0 -0
  219. package/corpus/handwritten/blobs/bin/4a38cd49e8797429ce76265c3d8972195d5b0a02a35fc05fc513eab11240f415.bin +0 -0
  220. package/corpus/handwritten/blobs/bin/4fe636237bbbd4f836b0816bc61702f4c224d4cb91fbd94f244c731e24a1b945.bin +0 -0
  221. package/corpus/handwritten/blobs/bin/51b1cff782dc7ebb382bc429ee965023d4cdb52c7b3e37d6ffff5ef55c1c2813.bin +0 -0
  222. package/corpus/handwritten/blobs/bin/52561f02071ecaa98432fab5e8ece407a8e8f733a01f8eb7c543d1efe02614da.bin +0 -0
  223. package/corpus/handwritten/blobs/bin/556d6333923afea9641c4738741a41d6a46ae28a508288b9a49a749a344c1398.bin +0 -0
  224. package/corpus/handwritten/blobs/bin/5caeb97f32c7f31e1029eebdf31131f879f781bb5e3a225206a646710d83fd75.bin +0 -0
  225. package/corpus/handwritten/blobs/bin/5d1131e42a045083225105b640ff72e02c7f353ee6285545ac264d01bea26b1b.bin +0 -0
  226. package/corpus/handwritten/blobs/bin/5d80b30eee9f8342a92f6756fd0d84fb9d2d2ce994d222627641e584ad45d2a8.bin +0 -0
  227. package/corpus/handwritten/blobs/bin/5e0f9f7f2a85abe11a0a61ede853c9b9942b4494c3eb9943785cf6ae221e40e3.bin +0 -0
  228. package/corpus/handwritten/blobs/bin/5fdc5485343bba8201185c9bae862ad8618498ab5ce63b53514e4e0226fa7bdb.bin +0 -0
  229. package/corpus/handwritten/blobs/bin/6623dcb0b31c9ca0be342f6dca6b9e607ec3c12ff82068fa6030c142c2df77f7.bin +0 -0
  230. package/corpus/handwritten/blobs/bin/6887131a04175edbd1989aa95e8749d1703e7f2d0b8464e85f6bad28d6964125.bin +0 -0
  231. package/corpus/handwritten/blobs/bin/6cf89771d998486cad9049e6f4fc177d742a18ad79fafa4596814ff9d3cf1952.bin +0 -0
  232. package/corpus/handwritten/blobs/bin/74bbb0fc219e8476cd5550014a357ee18abc981ff3fe787ae3e60d4593705ec5.bin +0 -0
  233. package/corpus/handwritten/blobs/bin/76784a7f519ac43ce113a0c9365881839b75f66f96aa009fe8d3c8ab539ef283.bin +0 -0
  234. package/corpus/handwritten/blobs/bin/79a2f693ee2da546bb551f8b641b9c3affd2b8bfb5632ed7f417daba9d900af9.bin +0 -0
  235. package/corpus/handwritten/blobs/bin/7b593b0f9eefb957fb9d58b316d9836971203038d7c8127284bba44ccb3090bb.bin +0 -0
  236. package/corpus/handwritten/blobs/bin/7bb8e518ca5606de78972a6c648b57623f8bc12d7e06b4bbf43c60ac419a9bbd.bin +0 -0
  237. package/corpus/handwritten/blobs/bin/7c6133f3350147257fa501f41269cb77cb11d8ed96d351e873333b079cee524a.bin +0 -0
  238. package/corpus/handwritten/blobs/bin/7f5acf1893828995256f5b2c54948f80ba21e53de72db26ea72ce2479f5b0682.bin +0 -0
  239. package/corpus/handwritten/blobs/bin/836516253cf0f3e6e79537609fdbe6331c8c5c974f9ec4d3fbe4a7db48cf123d.bin +0 -0
  240. package/corpus/handwritten/blobs/bin/89900344f82d5c1474d2a163f8d29903447bac64e9c9775123ef499be70c2380.bin +0 -0
  241. package/corpus/handwritten/blobs/bin/95d76a9273c3edd98b3643c54e2e7989800bdcaf6f815230ef09f601e760330f.bin +0 -0
  242. package/corpus/handwritten/blobs/bin/a7b5a5fe053a38c93eed899bde5051cddd80e0a3f3c82b6fd814869097f0944b.bin +0 -0
  243. package/corpus/handwritten/blobs/bin/b29be84df0bfd1bc97a1464fd5ea068130947bfed3328e167640c81326eb45d7.bin +0 -0
  244. package/corpus/handwritten/blobs/bin/b6518dc352be03332a256f1cd9d1149da262fe6829e87ba43364f19c687ca7c9.bin +0 -0
  245. package/corpus/handwritten/blobs/bin/b7edb8095beeb158adb61ae3caa1653773757afbcd8fb2764c94b975a43fe9e2.bin +0 -0
  246. package/corpus/handwritten/blobs/bin/b86d617ae7fa397df51ff7af87cd89fa113ac19abd3840ea8f3a086d6c82905c.bin +0 -0
  247. package/corpus/handwritten/blobs/bin/bb860b5c67ee7f2fafd67588822152228d6f6c9de1231123eeafa4844732b18b.bin +0 -0
  248. package/corpus/handwritten/blobs/bin/bf8c3971bbb224075d488ffa9cfc20e322c61f9ca0c59c356838415f6778014b.bin +0 -0
  249. package/corpus/handwritten/blobs/bin/c2edd52ee14ebdc9fcc01d38c15d6ab3379df7a20098c260c546551898959cd1.bin +0 -0
  250. package/corpus/handwritten/blobs/bin/c3de13c551c5b45270143dcbb9fc9a31651f6012355823c0709c2fe6cafda940.bin +0 -0
  251. package/corpus/handwritten/blobs/bin/c57a8d9da18b1289afd16de00dd1ec75027048b8dcf7dd218da36bc3276ff035.bin +0 -0
  252. package/corpus/handwritten/blobs/bin/cc2975c9dea4c31b1bf380623a8f44059423004653f9cae4f603d374174323b7.bin +0 -0
  253. package/corpus/handwritten/blobs/bin/d476abba2e1c63ad3c7527617559173484ee837a5be2744d968466d5527c286b.bin +0 -0
  254. package/corpus/handwritten/blobs/bin/db242f89115c878cf0c3b976a1647e9cdeb6a1a51813b1dacaf1188715603294.bin +0 -0
  255. package/corpus/handwritten/blobs/bin/dcc4b9b3bc4ca777d11c494ae5478f17ad7cf2efa18dcba30def872d55355bc3.bin +0 -0
  256. package/corpus/handwritten/blobs/bin/dd99da483f385327d6b8319d6e2e9000b580280069353718aa0fda2230707e8b.bin +0 -0
  257. package/corpus/handwritten/blobs/bin/dfc139dba26f1789e16f72602e654636f2d99bcd41e3f10454da74b3a6a64dda.bin +0 -0
  258. package/corpus/handwritten/blobs/bin/e15ab3cc9f60657321cfe8d9751e086f025734f4e7068271e0baf6066a686f18.bin +0 -0
  259. package/corpus/handwritten/blobs/bin/e16a83a71213db6f804ce1d53981a2308062752c85c440022d9eeb7605fd37c8.bin +0 -0
  260. package/corpus/handwritten/blobs/bin/e7355876487f660ac9f25c9d9dfcd66eaf432e1e1669eb89d12ce8267a8d3e86.bin +0 -0
  261. package/corpus/handwritten/blobs/bin/e81a632e2da0f6a4d801f18aadfe2c6e640401cc1178935a9099ebb8e3af6cc1.bin +0 -0
  262. package/corpus/handwritten/blobs/bin/f0721c60d0b1046579d8c587fac8482a70822f0b39a85f9acc0cfc31f82b7dd2.bin +0 -0
  263. package/corpus/handwritten/blobs/bin/f301cf574de6d84030f839098ca44705dca115f9d3e4ee848e0b35fff3deaf77.bin +0 -0
  264. package/corpus/handwritten/blobs/bin/f7797f295a7570c437bf7020a1ddf208fea2a7aab595333320a6396c1608d360.bin +0 -0
  265. package/corpus/handwritten/blobs/glb/08de0bb2439ac812adef528b4b073bdb954bbeada972a2f3afb1757bd0540396.glb +0 -0
  266. package/corpus/handwritten/blobs/glb/153681171c35d2898569324e21ebe734b8418d4122833618a1e64ea326be1e5e.glb +0 -0
  267. package/corpus/handwritten/blobs/glb/1df5ce0b6cae72ec4cf3c41510681ba70ebb474f9745d536ebd4f03e8fc82de9.glb +0 -0
  268. package/corpus/handwritten/blobs/glb/262031e2fa710bd8d586eafce1019ca1434a2170e407567741aac1d99fc9c5ab.glb +0 -0
  269. package/corpus/handwritten/blobs/glb/27466efb180fb5b5074b40e424bd0b8d78f7ff0f5f3663748e014daeeeb5bedd.glb +0 -0
  270. package/corpus/handwritten/blobs/glb/2d2f6d00a14c89a4efb7f679b371118f564f258797ed8b8b42baf4ae60902ea6.glb +0 -0
  271. package/corpus/handwritten/blobs/glb/31f327d215ed7ef422e2169172f3869769e9816c9da979616844081e74f2eb09.glb +0 -0
  272. package/corpus/handwritten/blobs/glb/3bfe0e9ca18077ffee9c284ef40fed9f2fc354f7495612c785a6f980b5966559.glb +0 -0
  273. package/corpus/handwritten/blobs/glb/3db43042b3eeb1dee7ce9de1cc00322cefc348aa18c37d168b0858e6af6ca7a4.glb +0 -0
  274. package/corpus/handwritten/blobs/glb/46460a50da44fb8e792b48a646ec9ce025bb309d315dbcf67d2e9598591750de.glb +0 -0
  275. package/corpus/handwritten/blobs/glb/4902213556fedaf269fba6f0f195e424b2e49973ab45dcb8b69e34d253d9d8ff.glb +0 -0
  276. package/corpus/handwritten/blobs/glb/4dda463c9cd4bf339e5611871d4ba2fe16fe1487389a88b2888e96bc55e45d93.glb +0 -0
  277. package/corpus/handwritten/blobs/glb/4ed23469bd2b6b73183564cfc80a1ebcd0ffe2666a90a556752af0ca147fd2f7.glb +0 -0
  278. package/corpus/handwritten/blobs/glb/4fe74a1bed6b67129885b90cfcae01b5ca82e23e6d40507e280f02fca7fda54f.glb +0 -0
  279. package/corpus/handwritten/blobs/glb/50521bb3a50cc7199d324a0b25bc167c2e9d69770cb500490428efefc81ce3ea.glb +0 -0
  280. package/corpus/handwritten/blobs/glb/5ecca36d1e503edc092af0ef42f139cdcad99b8c2008318eb6ad337023d57296.glb +0 -0
  281. package/corpus/handwritten/blobs/glb/60fc036925852568cdb1b9fb85218dc43a8bf2ed86d3971a221ad942ece203a7.glb +0 -0
  282. package/corpus/handwritten/blobs/glb/611633cee0e5822b744486e6dff5414ad5b159eaabffe1c0ba0bb68be794bfa1.glb +0 -0
  283. package/corpus/handwritten/blobs/glb/67c7f983a0bcb9f84425378acac121a53f30795dce3181643bc1b763d0ae80b5.glb +0 -0
  284. package/corpus/handwritten/blobs/glb/6ecc0d307030943727484b49b1872643479c55ccc92252fca06e9e3cbe98fa90.glb +0 -0
  285. package/corpus/handwritten/blobs/glb/774b366df4de56cb6f9e3c904f02ec98016ac2ec489dc9e214b09220fca2f8e5.glb +0 -0
  286. package/corpus/handwritten/blobs/glb/785bae514ffc029e611d602259db7d37cbef589409a0814b9d37175d8b6c0a45.glb +0 -0
  287. package/corpus/handwritten/blobs/glb/79e79524efb2830e90af3c945c5b36ef07c1a38f2da2958112203a99eac52a16.glb +0 -0
  288. package/corpus/handwritten/blobs/glb/7bebdcdaf0be30d9f8d21bde72af68c32d825d12dc668f48109223ed7ff71c9f.glb +0 -0
  289. package/corpus/handwritten/blobs/glb/7d8b5ec9326a11362b3f9fa3409cb59d11b99f549cc304319c63c1ec55cbf5ab.glb +0 -0
  290. package/corpus/handwritten/blobs/glb/82e886f826315e4bf962363165fadadd3d93f85132c1909095045e0a7ccc0b34.glb +0 -0
  291. package/corpus/handwritten/blobs/glb/84b4ef190c3994ae7ca1b1f7a936526d1d20ad7deac13f949e3fe6bb7ba139ed.glb +0 -0
  292. package/corpus/handwritten/blobs/glb/85b7153e943fbe8c659bd6e4b323511dc6f6e2c7a3a1185e7a9a29ea6ddfdfa6.glb +0 -0
  293. package/corpus/handwritten/blobs/glb/85cf2d2be91cedbaf454ca42ad53c0c17b311088528d274695dbcea490d6c684.glb +0 -0
  294. package/corpus/handwritten/blobs/glb/8662b4cdc626c61a45e63f71dc866746c083cd0d4644b817a373105f936a7047.glb +0 -0
  295. package/corpus/handwritten/blobs/glb/8a4d33bfbb17d865e5deb0a0bdf3de67fc2312950a7568ed2635c22fbe4b1ecf.glb +0 -0
  296. package/corpus/handwritten/blobs/glb/8b11171d41c9027411ca8b87797d9ec70355471bdd3a247c114c49b8b781bbd9.glb +0 -0
  297. package/corpus/handwritten/blobs/glb/9026e1c4f0250832b69a989e69fe3071e5cad72adfe9c22ce11c409b18bb3357.glb +0 -0
  298. package/corpus/handwritten/blobs/glb/945b946f17b6393ea040230641c3083678bb6ab42e1d7239aeb9c950d0e7d5bb.glb +0 -0
  299. package/corpus/handwritten/blobs/glb/9afab455d603f1f8a38074c5a6cbed26d7d7f2cfd8a531820bd165d4b37399ee.glb +0 -0
  300. package/corpus/handwritten/blobs/glb/a6d702fb1be1095517625bfb2a2383f5f9638775059fd7e0d093d2044651b848.glb +0 -0
  301. package/corpus/handwritten/blobs/glb/aae479c2f99848998a1b499bbcad815d971349c2442bc363786aef63baad4337.glb +0 -0
  302. package/corpus/handwritten/blobs/glb/b155bd41f260d5303e293d691b657e0fb9b9c8b2f8aa589a0187061baa033eb7.glb +0 -0
  303. package/corpus/handwritten/blobs/glb/b1e8b770d99e8ca4396f21fd512f632c587149fc13db69deba388f702a46982f.glb +0 -0
  304. package/corpus/handwritten/blobs/glb/b382c318a5baac35da59a7b99ebaad6992e30c4bac327e85851ce0b2f89aa58b.glb +0 -0
  305. package/corpus/handwritten/blobs/glb/ba4478198696802808262af9bbfc224fe37e24e3f8c13de91debc87d3e1a9d41.glb +0 -0
  306. package/corpus/handwritten/blobs/glb/baf02cd967d1bf3c6a2ae878f4ca4ed34d0c39302ca2b8b6e3560a4e87b5c16f.glb +0 -0
  307. package/corpus/handwritten/blobs/glb/bc14dd152815ea6ed39458dcf89f2d69173d61d6e2b57be99d31ce2da64ccf67.glb +0 -0
  308. package/corpus/handwritten/blobs/glb/bc4e4d3bcf7ace855183efec0fbf242d444a32714d8b2fd8a45fa7b539ef2c73.glb +0 -0
  309. package/corpus/handwritten/blobs/glb/bc53475e2aa2fc9c2c0574b36a449fd57259c462d771e2b360def5c338d37c26.glb +0 -0
  310. package/corpus/handwritten/blobs/glb/c35d9e50f392c29f2587e3a6eb4f21143ba08e48d76a53b9de62d3b5be46c1a5.glb +0 -0
  311. package/corpus/handwritten/blobs/glb/c6911e059d3ac6aea75bc0ad3dd8b220704bfbba8ba98b57705e7aa3ecbe0050.glb +0 -0
  312. package/corpus/handwritten/blobs/glb/c84d88b6ed878490bcf9fa985b5e6a7a683de8ee7808ee4151a3b6a898fbe4f2.glb +0 -0
  313. package/corpus/handwritten/blobs/glb/c9d5d02ef0e38ac2898d3e6ecbc2ea0a6d2bd04531118550ab54b5e83293d7ec.glb +0 -0
  314. package/corpus/handwritten/blobs/glb/cd9d04e361e4c3d0aeb82f8682d71114ff8318b8fc4980bccee3c5e5c16afc27.glb +0 -0
  315. package/corpus/handwritten/blobs/glb/d32499928422a0cd1a32b1afaeacc31d2d84d74876f6805b36218dc04402a921.glb +0 -0
  316. package/corpus/handwritten/blobs/glb/dc7ea629fcddeba445599d73a5d721f4d5004e056c3c140baa3e6817393c6462.glb +0 -0
  317. package/corpus/handwritten/blobs/glb/dce79b59c85ca5a7f9fc25e585d253b15558f8f5d8497a76923c9071601de8b1.glb +0 -0
  318. package/corpus/handwritten/blobs/glb/e7fa1b02bae6c8d19ace0e8db44810beab9a1be9f8172d5816324760267d6d11.glb +0 -0
  319. package/corpus/handwritten/blobs/glb/eb664feed0fdcc3ac73cecbe737109994fe5dfad8a33997de88598965fa936ba.glb +0 -0
  320. package/corpus/handwritten/blobs/glb/ec6a771ca852b0b69e55a12df9d347384d01e611c8c6151ea771910f1601605d.glb +0 -0
  321. package/corpus/handwritten/blobs/glb/ede05013f575b4216d2b4b3f8a14d611ef28756f952f702bb169529c8ab02eff.glb +0 -0
  322. package/corpus/handwritten/blobs/glb/fec21fa96950340a1a031b31b37407468361ab0a7645c683e0d7773c18591a26.glb +0 -0
  323. package/corpus/handwritten/blobs/glb/ff21ea082bb00b01006900e7dbbb85220f31f45c144405c840a70872f9e09cb9.glb +0 -0
  324. package/corpus/handwritten/blobs/image/248fe9601e921305ffb35421414bc5f03e9f1b3dba15bf9b5c3387d8f255da17.png +0 -0
  325. package/corpus/handwritten/blobs/image/4b47420aff1ded28c9c6cf1eb92d6e2d7b01d057f2654654405445ff8d562e55.webp +0 -0
  326. package/corpus/handwritten/blobs/image/5dbc818ed0be692e6ba3df87898fd623280a2686eed5a538333e1325764b238d.png +0 -0
  327. package/corpus/handwritten/blobs/image/d5ae692911bbc2b60b5fdde239b70aad4ce9be0d7665c4a91b438de6077e21e3.jpg +0 -0
  328. package/corpus/handwritten/blobs/ktx2/df0dd2e8adc1d9479148bb198cb750471df454680cf0c9ffd6dc85d6262ed676.ktx2 +0 -0
  329. package/corpus/handwritten/blobs/wasm/ecc886d8bbebcf190298ff9162b6bb364f2125606f5bdc8cc220ea28044f96ea.wasm +0 -0
  330. package/corpus/handwritten/cook.json +1 -0
  331. package/corpus/handwritten/mounts/shardfiles/blender-template/discovery.json +1 -0
  332. package/corpus/handwritten/sections/actors/creatures.json +1 -0
  333. package/corpus/handwritten/sections/actors/crowds.json +1 -0
  334. package/corpus/handwritten/sections/actors/species.json +1 -0
  335. package/corpus/handwritten/sections/audio/audio.json +1 -0
  336. package/corpus/handwritten/sections/client/plan.json +1 -0
  337. package/corpus/handwritten/sections/combat/encounters.json +1 -0
  338. package/corpus/handwritten/sections/combat/items.json +1 -0
  339. package/corpus/handwritten/sections/combat/strikes.json +1 -0
  340. package/corpus/handwritten/sections/economy/ledger.json +1 -0
  341. package/corpus/handwritten/sections/economy/loot.json +1 -0
  342. package/corpus/handwritten/sections/look/look.json +1 -0
  343. package/corpus/handwritten/sections/look/map.json +1 -0
  344. package/corpus/handwritten/sections/look/materials.json +1 -0
  345. package/corpus/handwritten/sections/quests/quests.json +1 -0
  346. package/corpus/handwritten/sections/sim/client-scripts.json +1 -0
  347. package/corpus/handwritten/sections/sim/hooks.json +1 -0
  348. package/corpus/handwritten/sections/sim/plumbing.json +1 -0
  349. package/corpus/handwritten/sections/sim/sim.json +1 -0
  350. package/corpus/handwritten/sections/state/migrations.json +1 -0
  351. package/corpus/handwritten/sections/state/state.json +1 -0
  352. package/corpus/handwritten/sections/ui/card.json +1 -0
  353. package/corpus/handwritten/sections/ui/compendium.json +1 -0
  354. package/corpus/handwritten/sections/ui/level.json +1 -0
  355. package/corpus/handwritten/sections/ui/ui.json +1 -0
  356. package/corpus/handwritten/sections/world/collision.json +1 -0
  357. package/corpus/handwritten/sections/world/days.json +1 -0
  358. package/corpus/handwritten/sections/world/edge.json +1 -0
  359. package/corpus/handwritten/sections/world/movers.json +1 -0
  360. package/corpus/handwritten/sections/world/navigation.json +1 -0
  361. package/corpus/handwritten/sections/world/props.json +1 -0
  362. package/corpus/handwritten/sections/world/spawn.json +1 -0
  363. package/corpus/handwritten/sections/world/terrain.json +1 -0
  364. package/corpus/handwritten/sections/world/tiles.json +1 -0
  365. package/corpus/handwritten/sections/world/traversal.json +1 -0
  366. package/corpus/handwritten/sections/world/water.json +1 -0
  367. package/corpus/handwritten/sections/world/weather.json +1 -0
  368. package/corpus/handwritten/shard.json +1 -0
  369. package/corpus/handwritten/validation.json +1 -0
  370. package/package.json +511 -4
  371. package/packages/wire/src/net-command.ts +150 -0
  372. package/src/cli/bin.mjs +9 -0
  373. package/src/cli/main.ts +148 -0
  374. package/src/cli/pack.ts +262 -0
  375. package/src/cli/validate.ts +210 -0
  376. package/src/cli/version.ts +13 -0
  377. package/src/format/aacIndex.ts +160 -0
  378. package/src/format/accent.ts +35 -0
  379. package/src/format/achievementCounters.ts +22 -0
  380. package/src/format/actorMoves.ts +615 -0
  381. package/src/format/actorProjectionV2.ts +93 -0
  382. package/src/format/admissionControl.ts +66 -0
  383. package/src/format/admissionLate.ts +22 -0
  384. package/src/format/admissionLimits.ts +11 -0
  385. package/src/format/admissionServer.ts +30 -0
  386. package/src/format/ambientLife.ts +123 -0
  387. package/src/format/arenaRoomDocument.ts +114 -0
  388. package/src/format/arenaScriptRows.ts +107 -0
  389. package/src/format/arenaView.ts +30 -0
  390. package/src/format/assetAdmission.ts +279 -0
  391. package/src/format/audio-measure.ts +184 -0
  392. package/src/format/audio-mp4.ts +234 -0
  393. package/src/format/audio-rules.ts +271 -0
  394. package/src/format/audio-waiver.ts +55 -0
  395. package/src/format/audio.ts +463 -0
  396. package/src/format/audioBank.ts +37 -0
  397. package/src/format/audioProfiles.ts +501 -0
  398. package/src/format/audioRouting.ts +67 -0
  399. package/src/format/audioScene.ts +342 -0
  400. package/src/format/bakedTerrainBytes.ts +35 -0
  401. package/src/format/bakedTerrainSampling.ts +66 -0
  402. package/src/format/bakedTiles.ts +407 -0
  403. package/src/format/binarySource.ts +32 -0
  404. package/src/format/bodySlots.ts +90 -0
  405. package/src/format/bossEncounter.ts +354 -0
  406. package/src/format/bossProfiles.ts +709 -0
  407. package/src/format/bossSocketRig.ts +92 -0
  408. package/src/format/bowVariantRows.ts +68 -0
  409. package/src/format/brains.ts +252 -0
  410. package/src/format/budget.ts +214 -0
  411. package/src/format/buildings.ts +496 -0
  412. package/src/format/builtIndexes.ts +26 -0
  413. package/src/format/catalogueEconomy.ts +65 -0
  414. package/src/format/caveInterior.ts +225 -0
  415. package/src/format/cellBounds.ts +47 -0
  416. package/src/format/cellField.ts +98 -0
  417. package/src/format/chapterDirector.ts +193 -0
  418. package/src/format/clientChannels.ts +450 -0
  419. package/src/format/clientCues.ts +34 -0
  420. package/src/format/clientNative.ts +358 -0
  421. package/src/format/clientOwnership.ts +43 -0
  422. package/src/format/clientPlan.ts +306 -0
  423. package/src/format/clientScripts.ts +116 -0
  424. package/src/format/clientState.ts +273 -0
  425. package/src/format/clientTrails.ts +56 -0
  426. package/src/format/collectionDisplay.ts +232 -0
  427. package/src/format/colourFunction.ts +44 -0
  428. package/src/format/colourLut.ts +4 -0
  429. package/src/format/commonsCosts.ts +28 -0
  430. package/src/format/compendiumRows.ts +151 -0
  431. package/src/format/compendiumSketches.ts +23 -0
  432. package/src/format/completion.ts +83 -0
  433. package/src/format/contentBounds.ts +76 -0
  434. package/src/format/contentCost.ts +50 -0
  435. package/src/format/contracts.ts +305 -0
  436. package/src/format/cook-data.ts +148 -0
  437. package/src/format/cook-preparation.ts +241 -0
  438. package/src/format/coverAppearance.ts +53 -0
  439. package/src/format/creatures.ts +175 -0
  440. package/src/format/crowdPresentation.ts +87 -0
  441. package/src/format/crowds.ts +46 -0
  442. package/src/format/cueDirector.ts +134 -0
  443. package/src/format/dayCycle.ts +28 -0
  444. package/src/format/dayLook.ts +44 -0
  445. package/src/format/decisionBindings.ts +80 -0
  446. package/src/format/decisionPublication.ts +35 -0
  447. package/src/format/decisionScripts.ts +327 -0
  448. package/src/format/declaredQuestPage.ts +101 -0
  449. package/src/format/deviceMemoryCost.ts +50 -0
  450. package/src/format/director.ts +52 -0
  451. package/src/format/directorProduct.ts +27 -0
  452. package/src/format/directorStages.ts +165 -0
  453. package/src/format/directorWhen.ts +78 -0
  454. package/src/format/discoveryValues.ts +416 -0
  455. package/src/format/easedFields.ts +48 -0
  456. package/src/format/edgeProfiles.ts +40 -0
  457. package/src/format/eliteContinuation.ts +110 -0
  458. package/src/format/eliteEntryRows.ts +351 -0
  459. package/src/format/eliteFeature.ts +605 -0
  460. package/src/format/eliteScripts.ts +60 -0
  461. package/src/format/encounterRows.ts +1030 -0
  462. package/src/format/encounters.ts +65 -0
  463. package/src/format/engine-music.ts +42 -0
  464. package/src/format/entryClearance.ts +86 -0
  465. package/src/format/entryCoverage.ts +61 -0
  466. package/src/format/entryGeometry.ts +56 -0
  467. package/src/format/entryLanding.ts +83 -0
  468. package/src/format/entryReads.ts +45 -0
  469. package/src/format/entrywayAssets.ts +33 -0
  470. package/src/format/entryways.ts +58 -0
  471. package/src/format/exchange.ts +25 -0
  472. package/src/format/explorerCatalogue.ts +312 -0
  473. package/src/format/feature-sides.ts +233 -0
  474. package/src/format/fieldPresentation.ts +62 -0
  475. package/src/format/figures.ts +437 -0
  476. package/src/format/findsCatalogue.ts +67 -0
  477. package/src/format/fixedDraws.ts +24 -0
  478. package/src/format/flyers.ts +226 -0
  479. package/src/format/forestNativeInputs.ts +37 -0
  480. package/src/format/forestPage.ts +285 -0
  481. package/src/format/forestWeather.ts +333 -0
  482. package/src/format/geometryPack.ts +136 -0
  483. package/src/format/glbBuffers.ts +77 -0
  484. package/src/format/glbCost.ts +212 -0
  485. package/src/format/glbImages.ts +95 -0
  486. package/src/format/glbTriangles.ts +95 -0
  487. package/src/format/graphArmsRows.ts +200 -0
  488. package/src/format/grapple.ts +123 -0
  489. package/src/format/grazers.ts +164 -0
  490. package/src/format/grid-catalogue.ts +247 -0
  491. package/src/format/gridReadiness.ts +49 -0
  492. package/src/format/groupBrains.ts +249 -0
  493. package/src/format/heldArms.ts +576 -0
  494. package/src/format/heldEquipment.ts +78 -0
  495. package/src/format/heldFinishes.ts +415 -0
  496. package/src/format/heldGear.ts +68 -0
  497. package/src/format/heldJianDocument.ts +75 -0
  498. package/src/format/heldMelee.ts +866 -0
  499. package/src/format/heldView.ts +26 -0
  500. package/src/format/heldWeaponDocuments.ts +36 -0
  501. package/src/format/herdShelter.ts +58 -0
  502. package/src/format/hooks.ts +45 -0
  503. package/src/format/immutable.ts +59 -0
  504. package/src/format/inputDeclarations.ts +157 -0
  505. package/src/format/islandLibrary.ts +51 -0
  506. package/src/format/items.ts +229 -0
  507. package/src/format/json.ts +143 -0
  508. package/src/format/keyedSky.ts +314 -0
  509. package/src/format/kitFigure.ts +68 -0
  510. package/src/format/ktx2Cost.ts +47 -0
  511. package/src/format/ledger.ts +56 -0
  512. package/src/format/liftApproach.ts +75 -0
  513. package/src/format/liftRider.ts +10 -0
  514. package/src/format/lightEmitters.ts +105 -0
  515. package/src/format/lights.ts +135 -0
  516. package/src/format/limbCollision.ts +136 -0
  517. package/src/format/limbPopulation.ts +33 -0
  518. package/src/format/limbRig.ts +202 -0
  519. package/src/format/loadout.ts +156 -0
  520. package/src/format/look-light.ts +153 -0
  521. package/src/format/lootBag.ts +145 -0
  522. package/src/format/lootEconomy.ts +235 -0
  523. package/src/format/materialFamilies.ts +565 -0
  524. package/src/format/materialGraph.ts +1220 -0
  525. package/src/format/materials.ts +449 -0
  526. package/src/format/memoryAdmission.ts +84 -0
  527. package/src/format/memoryGates.json +7 -0
  528. package/src/format/meshCollision.ts +56 -0
  529. package/src/format/meshCollisionAssets.ts +19 -0
  530. package/src/format/meshCollisionBytes.ts +102 -0
  531. package/src/format/meshEntryways.ts +54 -0
  532. package/src/format/meshopt-decoder.wasm +0 -0
  533. package/src/format/meshopt-module.ts +177 -0
  534. package/src/format/meshopt-static.mjs +11 -0
  535. package/src/format/meshopt-wasm.ts +61 -0
  536. package/src/format/migrations.ts +209 -0
  537. package/src/format/minimap.ts +1052 -0
  538. package/src/format/mixedPopulation.ts +222 -0
  539. package/src/format/modes.ts +304 -0
  540. package/src/format/mountedSpecimenRows.ts +64 -0
  541. package/src/format/moverLifecycle.ts +34 -0
  542. package/src/format/moverMotion.ts +271 -0
  543. package/src/format/movers.ts +224 -0
  544. package/src/format/namedJsonContracts.ts +423 -0
  545. package/src/format/nativeActors.ts +45 -0
  546. package/src/format/nativeAssembly.ts +141 -0
  547. package/src/format/nativeGround.ts +37 -0
  548. package/src/format/nativeGroundAssets.ts +35 -0
  549. package/src/format/nativeItems.ts +184 -0
  550. package/src/format/nativePhysics.ts +140 -0
  551. package/src/format/nativeQuestComposition.ts +398 -0
  552. package/src/format/nativeRiding.ts +103 -0
  553. package/src/format/nativeRuntimePlan.ts +89 -0
  554. package/src/format/navigation.ts +99 -0
  555. package/src/format/navigationBytes.ts +111 -0
  556. package/src/format/nearPlaceholder.ts +111 -0
  557. package/src/format/nearPlaceholderAssets.ts +23 -0
  558. package/src/format/netCommand.ts +11 -0
  559. package/src/format/npcs.ts +546 -0
  560. package/src/format/outputAddress.ts +11 -0
  561. package/src/format/outputDownload.ts +34 -0
  562. package/src/format/outputFields.ts +123 -0
  563. package/src/format/outputIndex.ts +352 -0
  564. package/src/format/overdraw.ts +41 -0
  565. package/src/format/pageLife.ts +303 -0
  566. package/src/format/pagePreparation.ts +60 -0
  567. package/src/format/paintedLook.ts +55 -0
  568. package/src/format/paintedResources.ts +158 -0
  569. package/src/format/panelTemplate.ts +139 -0
  570. package/src/format/placeholderSource.ts +209 -0
  571. package/src/format/platformDataSections.ts +146 -0
  572. package/src/format/platformFileFamilies.ts +299 -0
  573. package/src/format/plumbing.ts +165 -0
  574. package/src/format/populationEnvironment.ts +210 -0
  575. package/src/format/populationKeeper.ts +163 -0
  576. package/src/format/populationProjection.ts +496 -0
  577. package/src/format/populationRespawn.ts +48 -0
  578. package/src/format/populationRoster.ts +158 -0
  579. package/src/format/portalFloor.ts +56 -0
  580. package/src/format/portalLink.ts +112 -0
  581. package/src/format/portalLinkAssets.ts +42 -0
  582. package/src/format/portalRide.ts +22 -0
  583. package/src/format/postGraphDocument.ts +36 -0
  584. package/src/format/postGraphLook.ts +477 -0
  585. package/src/format/postStack.ts +114 -0
  586. package/src/format/practiceCourseRows.ts +466 -0
  587. package/src/format/preflight.ts +155 -0
  588. package/src/format/presentation.ts +33 -0
  589. package/src/format/product-audio.ts +76 -0
  590. package/src/format/product-reads.ts +178 -0
  591. package/src/format/product-stream-admit.ts +100 -0
  592. package/src/format/product-stream-assets.ts +493 -0
  593. package/src/format/product-stream-facts.ts +208 -0
  594. package/src/format/product-stream-miss.ts +12 -0
  595. package/src/format/product-stream-node.ts +47 -0
  596. package/src/format/product-stream-packs.ts +242 -0
  597. package/src/format/product-stream-rows.ts +202 -0
  598. package/src/format/product-stream-tar.ts +192 -0
  599. package/src/format/product-stream.ts +284 -0
  600. package/src/format/product.ts +358 -0
  601. package/src/format/productValidation.ts +205 -0
  602. package/src/format/propMaterials.ts +254 -0
  603. package/src/format/props.ts +137 -0
  604. package/src/format/questContinuation.ts +42 -0
  605. package/src/format/questFigures.ts +227 -0
  606. package/src/format/questGraph.ts +30 -0
  607. package/src/format/questHost.ts +314 -0
  608. package/src/format/questInteractionSource.ts +57 -0
  609. package/src/format/questInteractions.ts +642 -0
  610. package/src/format/questPageComposition.ts +92 -0
  611. package/src/format/questPageFacets.ts +121 -0
  612. package/src/format/questRuntime.ts +118 -0
  613. package/src/format/questSteps.ts +182 -0
  614. package/src/format/questStory.ts +512 -0
  615. package/src/format/questStoryBindings.ts +43 -0
  616. package/src/format/questWorld.ts +36 -0
  617. package/src/format/quests.ts +333 -0
  618. package/src/format/rainPresentation.ts +131 -0
  619. package/src/format/rangedPage.ts +117 -0
  620. package/src/format/receipt-cost.ts +71 -0
  621. package/src/format/registeredJson.ts +530 -0
  622. package/src/format/returnProgramDocument.ts +40 -0
  623. package/src/format/returnProjectionV2.ts +84 -0
  624. package/src/format/riding.ts +377 -0
  625. package/src/format/riggedHulls.ts +160 -0
  626. package/src/format/roamingBossProjection.ts +178 -0
  627. package/src/format/roamingCombat.ts +22 -0
  628. package/src/format/ropeDeckSite.ts +148 -0
  629. package/src/format/rows.ts +86 -0
  630. package/src/format/runtime.ts +38 -0
  631. package/src/format/runtimeBinds.ts +49 -0
  632. package/src/format/runtimeCost.ts +80 -0
  633. package/src/format/runtimeSpawns.ts +73 -0
  634. package/src/format/scalarChannel.ts +38 -0
  635. package/src/format/scaledPost.ts +27 -0
  636. package/src/format/scaledPostContract.ts +51 -0
  637. package/src/format/sceneBuffers.ts +122 -0
  638. package/src/format/sceneDraws.ts +89 -0
  639. package/src/format/sceneDressing.ts +247 -0
  640. package/src/format/sceneInstances.ts +192 -0
  641. package/src/format/sceneMotion.ts +122 -0
  642. package/src/format/sceneRefs.ts +71 -0
  643. package/src/format/sceneSources.ts +730 -0
  644. package/src/format/script-side-grandfather.ts +62 -0
  645. package/src/format/script-sides.ts +289 -0
  646. package/src/format/scriptAbi.ts +14 -0
  647. package/src/format/scriptAbiV1.ts +56 -0
  648. package/src/format/scriptActionsV2.ts +101 -0
  649. package/src/format/scriptAdmission.ts +165 -0
  650. package/src/format/scriptAdmissionV2.ts +126 -0
  651. package/src/format/scriptContract.ts +170 -0
  652. package/src/format/scriptFuelV2.ts +124 -0
  653. package/src/format/scriptGroupBankV2.ts +54 -0
  654. package/src/format/scriptGroupStepV2.ts +165 -0
  655. package/src/format/scriptInputStateV2.ts +52 -0
  656. package/src/format/scriptLimits.ts +5 -0
  657. package/src/format/scriptMemoryV2.ts +17 -0
  658. package/src/format/scriptModuleV2.ts +116 -0
  659. package/src/format/scriptObservationColumnsV2.ts +226 -0
  660. package/src/format/scriptQueriesV2.ts +164 -0
  661. package/src/format/scriptQueryStateV2.ts +40 -0
  662. package/src/format/scriptRngV2.ts +52 -0
  663. package/src/format/scriptWireV2.ts +106 -0
  664. package/src/format/scripts.ts +31 -0
  665. package/src/format/sections.ts +140 -0
  666. package/src/format/shardSchema.ts +632 -0
  667. package/src/format/shardSections.ts +383 -0
  668. package/src/format/sketch.ts +79 -0
  669. package/src/format/skin-materials.ts +172 -0
  670. package/src/format/skinAssets.ts +107 -0
  671. package/src/format/skinData.ts +110 -0
  672. package/src/format/skinLayers.ts +90 -0
  673. package/src/format/skins.ts +37 -0
  674. package/src/format/socketLift.ts +58 -0
  675. package/src/format/socketLiftAssets.ts +81 -0
  676. package/src/format/socketRigCreature.ts +66 -0
  677. package/src/format/sourceResidency.ts +16 -0
  678. package/src/format/spawnCombat.ts +26 -0
  679. package/src/format/spawnScriptV2.ts +145 -0
  680. package/src/format/spawnScripts.ts +229 -0
  681. package/src/format/spawnTables.ts +46 -0
  682. package/src/format/spawnView.ts +26 -0
  683. package/src/format/speciesActorsFile.ts +86 -0
  684. package/src/format/speciesBookRows.ts +84 -0
  685. package/src/format/speciesBrain.ts +96 -0
  686. package/src/format/speciesLooks.ts +1021 -0
  687. package/src/format/speciesPrograms.ts +97 -0
  688. package/src/format/speciesScripts.ts +45 -0
  689. package/src/format/specimenCatalogue.ts +94 -0
  690. package/src/format/splatTerrain.ts +192 -0
  691. package/src/format/standalone-catalogue.ts +144 -0
  692. package/src/format/standaloneControl.ts +44 -0
  693. package/src/format/state.ts +61 -0
  694. package/src/format/stateLineage.ts +71 -0
  695. package/src/format/stealth.ts +106 -0
  696. package/src/format/stillImage.ts +135 -0
  697. package/src/format/streamedCover.ts +105 -0
  698. package/src/format/surfaceLooks.ts +50 -0
  699. package/src/format/tar-fields.ts +54 -0
  700. package/src/format/tar-paths.ts +103 -0
  701. package/src/format/tar-source.ts +13 -0
  702. package/src/format/tar-write.ts +152 -0
  703. package/src/format/tar.ts +203 -0
  704. package/src/format/targets.ts +217 -0
  705. package/src/format/terrain.ts +241 -0
  706. package/src/format/terrainTileBytes.ts +104 -0
  707. package/src/format/tierSelection.ts +195 -0
  708. package/src/format/toonLighting.ts +32 -0
  709. package/src/format/toonLook.ts +332 -0
  710. package/src/format/trail.ts +17 -0
  711. package/src/format/traversal.ts +13 -0
  712. package/src/format/treeSetRows.ts +93 -0
  713. package/src/format/ui.ts +90 -0
  714. package/src/format/uiStrings.ts +17 -0
  715. package/src/format/uniformRows.ts +31 -0
  716. package/src/format/upload-wire.ts +184 -0
  717. package/src/format/validationReceipt.ts +142 -0
  718. package/src/format/version.ts +9 -0
  719. package/src/format/vertexWear.ts +45 -0
  720. package/src/format/viewProgram.ts +329 -0
  721. package/src/format/voicePatches.ts +47 -0
  722. package/src/format/water.ts +247 -0
  723. package/src/format/waterWaves.ts +7 -0
  724. package/src/format/waterWorld.ts +34 -0
  725. package/src/format/weaponProfiles.ts +1315 -0
  726. package/src/format/weatherBundle.ts +36 -0
  727. package/src/format/weatherEffects.ts +78 -0
  728. package/src/format/weatherProgram.ts +422 -0
  729. package/src/format/wildlifePopulation.ts +210 -0
  730. package/src/format/wireLimits.ts +9 -0
  731. package/src/format/worldAssembly.ts +104 -0
  732. package/src/format/worldEntry.ts +151 -0
  733. package/src/format/worldPhysics.ts +292 -0
  734. package/src/format/worldSceneBatch.ts +106 -0
  735. package/src/format/worldSceneModels.ts +79 -0
  736. package/src/format/worldScenePages.ts +89 -0
  737. package/src/format/worldScenePlacement.ts +191 -0
  738. package/src/format/worldSceneSlabs.ts +43 -0
  739. package/src/format/worldSceneSurface.ts +113 -0
  740. package/src/format/worldSceneWeld.ts +702 -0
  741. package/src/format/worldScenes.ts +184 -0
  742. package/src/format/worldTargets.ts +111 -0
  743. package/src/format/worldUpdates.ts +229 -0
  744. package/src/hook/format-hook.d.mts +2 -0
  745. package/src/hook/format-hook.mjs +47 -0
  746. package/README.md +0 -6
@@ -0,0 +1,565 @@
1
+ /**
2
+ * Material families v1 (SHARD-PLATFORM SF10a, G4 / G32): the renderer-neutral parameters. Plain data, no three.js, so the
3
+ * shardfile's look and material entries can reference them and validate them in Node. A family is an engine-owned shader
4
+ * (the mechanism, `toon.ts` / `pbr.ts` / `painterly.ts` / `emissive.ts`); its parameters are all a shard says about a surface.
5
+ *
6
+ * Two levels:
7
+ * - **look** parameters are shared by every material of one family under one look (one shard's toon lighting); a runtime
8
+ * adapter (the day clock) may move them every frame, and they are uniforms, never program changes (the one exception:
9
+ * whether a painterly look grades at all is fixed for its life).
10
+ * - **material** parameters belong to one surface. Only `vertexColours`, `faceted`, `doubleSided`, `alphaCutoff`, a map's
11
+ * presence, an emissive surface's `blend` / `tube` / `sky` and a PBR surface's `ground` layer change a program;
12
+ * everything else is a uniform, so a family compiles to a handful of programs.
13
+ *
14
+ * Colour conventions: `colour` is sRGB in [0, 1] (what an artist picks); light terms (`lift`, `rim`, `terminator`) are
15
+ * linear and may exceed 1. Texture references are opaque strings (a shardfile file hash, `commons:<hash>`, or an asset
16
+ * path during the transition) resolved by the caller; textures follow glTF's UV convention (no vertical flip).
17
+ */
18
+ import * as v from 'valibot';
19
+
20
+ const unit = v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(1));
21
+ const nonNegative = v.pipe(v.number(), v.finite(), v.minValue(0));
22
+ const srgb = v.tuple([unit, unit, unit]);
23
+ const linear = v.tuple([nonNegative, nonNegative, nonNegative]);
24
+ /** an ordered [low, high] smoothstep edge pair in [0, 1] */
25
+ const edge = v.pipe(v.tuple([unit, unit]), v.check((e) => e[0] < e[1], 'edge low < high'));
26
+ const textureRef = v.pipe(v.string(), v.minLength(1), v.maxLength(256));
27
+
28
+ /** The families v1 knows. */
29
+ export const FAMILY_IDS = ['toon', 'pbr', 'painterly', 'emissive'] as const;
30
+
31
+ /** An sRGB or linear colour as three numbers. */
32
+ export type Rgb = readonly [number, number, number];
33
+
34
+ /**
35
+ * The toon family's look: a two-band ramp with coloured shade, a terminator band and a banded rim, plus the environment
36
+ * inputs (drifting cloud shade, caustics under a water level) a runtime adapter feeds.
37
+ */
38
+ export const ToonLookSchema: v.GenericSchema<ToonLookParamsInput, ToonLookParams> = v.strictObject({
39
+ /** N·L edge of the lit band (a facet is lit or in shade) */
40
+ faceEdge: v.optional(edge, [0.14, 0.2]),
41
+ /** cast-shadow edge (soft, so a dithered penumbra does not speckle) */
42
+ shadowEdge: v.optional(edge, [0.25, 0.75]),
43
+ /** how much of N·L the lit band keeps (0 = flat toon, 0.2 = a faint facet grade) */
44
+ litGrade: v.optional(unit, 0.2),
45
+ /** how much of the sun's facet grade the shade band keeps (0 = flat shade) */
46
+ shadeGrade: v.optional(unit, 0),
47
+ /** added to the shade band (linear × albedo): shadow is coloured, never black */
48
+ lift: v.optional(linear, [0.07, 0.035, 0.2]),
49
+ /** rim colour × strength (linear), on the lit side of vertical-ish faces */
50
+ rim: v.optional(linear, [1.3, 0.95, 0.6]),
51
+ /** terminator band colour × strength (linear), where a facet turns from the sun */
52
+ terminator: v.optional(linear, [0.4, 0.16, 0.06]),
53
+ /** surfaces rougher than this get no sun specular (a Lambert, not a GGX, on the phone) */
54
+ glossBelow: v.optional(unit, 0.72),
55
+ /** drifting cloud shade over the lit band: strength 0..1 (0 = off), feature size (m), wind (m/s, xz) */
56
+ cloudShade: v.optional(v.strictObject({ strength: unit, scale: v.pipe(v.number(), v.finite(), v.minValue(1)), wind: v.tuple([v.pipe(v.number(), v.finite()), v.pipe(v.number(), v.finite())]) }), { strength: 0.6, scale: 60, wind: [3.2, 1.4] }),
57
+ /** sunlight caustics under a water level: level (m; null = no water) and strength */
58
+ caustics: v.optional(v.strictObject({ level: v.nullable(v.pipe(v.number(), v.finite())), strength: nonNegative }), { level: null, strength: 0.5 }),
59
+ });
60
+ /** A toon look with every default filled. */
61
+
62
+
63
+ /** One toon surface: flat-shaded, vertex-coloured facets by default (no textures). */
64
+ export const ToonMaterialSchema: v.StrictObjectSchema<{ readonly family: v.GenericSchema<ToonMaterialParamsInput['family'], ToonMaterialParams['family']>; readonly colour: v.OptionalSchema<v.GenericSchema<Exclude<ToonMaterialParamsInput['colour'], undefined>, ToonMaterialParams['colour']>, MaterialSchemaDefault<Exclude<ToonMaterialParamsInput['colour'], undefined>>>; readonly vertexColours: v.OptionalSchema<v.GenericSchema<Exclude<ToonMaterialParamsInput['vertexColours'], undefined>, ToonMaterialParams['vertexColours']>, MaterialSchemaDefault<Exclude<ToonMaterialParamsInput['vertexColours'], undefined>>>; readonly faceted: v.OptionalSchema<v.GenericSchema<Exclude<ToonMaterialParamsInput['faceted'], undefined>, ToonMaterialParams['faceted']>, MaterialSchemaDefault<Exclude<ToonMaterialParamsInput['faceted'], undefined>>>; readonly doubleSided: v.OptionalSchema<v.GenericSchema<Exclude<ToonMaterialParamsInput['doubleSided'], undefined>, ToonMaterialParams['doubleSided']>, MaterialSchemaDefault<Exclude<ToonMaterialParamsInput['doubleSided'], undefined>>>; readonly roughness: v.OptionalSchema<v.GenericSchema<Exclude<ToonMaterialParamsInput['roughness'], undefined>, ToonMaterialParams['roughness']>, MaterialSchemaDefault<Exclude<ToonMaterialParamsInput['roughness'], undefined>>>; readonly metalness: v.OptionalSchema<v.GenericSchema<Exclude<ToonMaterialParamsInput['metalness'], undefined>, ToonMaterialParams['metalness']>, MaterialSchemaDefault<Exclude<ToonMaterialParamsInput['metalness'], undefined>>>; }, undefined> = v.strictObject({
65
+ family: v.literal('toon'),
66
+ /** sRGB, multiplies the vertex colours */
67
+ colour: v.optional(srgb, [1, 1, 1]),
68
+ vertexColours: v.optional(v.boolean(), true),
69
+ /** flat-shaded facets (one normal per triangle) */
70
+ faceted: v.optional(v.boolean(), true),
71
+ doubleSided: v.optional(v.boolean(), true),
72
+ roughness: v.optional(unit, 0.88),
73
+ metalness: v.optional(unit, 0),
74
+ });
75
+ /** A toon material entry with every default filled. */
76
+
77
+
78
+ const finite = v.pipe(v.number(), v.finite());
79
+ const positive = v.pipe(v.number(), v.finite(), v.minValue(1e-3));
80
+ /** a world-space rectangle on the ground: [x0, z0, x1, z1] (metres, x0 < x1, z0 < z1) */
81
+ const rect = v.pipe(v.tuple([finite, finite, finite, finite]), v.check((r) => r[0] < r[2] && r[1] < r[3], 'rect x0 < x1 and z0 < z1'));
82
+ /** an ordered pair of non-negative numbers (a distance or angle window: from, to) */
83
+ const span = v.pipe(v.tuple([nonNegative, nonNegative]), v.check((e) => e[0] < e[1], 'span low < high'));
84
+
85
+ /**
86
+ * The PBR family's ground layer (SF10a part 2, Signal Dunes' sand): wind ripples in two octaves, grain, broad albedo
87
+ * drifts and streaks, an optional trail mask, and the terrain light shaping a stylised ground wants (a baked key shadow,
88
+ * a crisp terminator, a grazing crest band, a sheen, a coloured shade fill and a light-saturation split). Every number is
89
+ * a uniform; a runtime adapter (Signal Dunes' dusk) may move them with `updateGround`. The key is the scene's first
90
+ * directional light. The defaults are Signal Dunes' sand at the first dusk step.
91
+ */
92
+ export const GroundLayerSchema: v.GenericSchema<GroundLayerParamsInput, GroundLayerParams> = v.strictObject({
93
+ /** the wind's direction over the ground (x, z; normalised when compiled): ripples run across it */
94
+ wind: v.optional(v.tuple([finite, finite]), [1, 0]),
95
+ /** the ripples' and the megaripples' wavelengths (m) */
96
+ wavelength: v.optional(v.tuple([positive, positive]), [(2 * Math.PI) / 7, (2 * Math.PI) / 3.93]),
97
+ /** how much the coarse mottle bends the ripple crests (radians of phase) */
98
+ lump: v.optional(nonNegative, 4.5),
99
+ /** albedo modulation of the ripples and the megaripples */
100
+ depth: v.optional(v.tuple([nonNegative, nonNegative]), [0.62, 0.05]),
101
+ /** normal tilt of the ripples near and at middle distance, and of the megaripples */
102
+ relief: v.optional(v.tuple([nonNegative, nonNegative, nonNegative]), [0.14, 0.2, 0.05]),
103
+ /** ripple contrast near the camera and past the near window (m), and an overall strength (an adapter dims it) */
104
+ contrast: v.optional(v.strictObject({ near: nonNegative, far: nonNegative, window: span, strength: nonNegative }), { near: 0.52, far: 0.26, window: [4, 26], strength: 1 }),
105
+ /** distance (m) over which the ripples fade out (the far ground is smooth) */
106
+ fade: v.optional(span, [35, 110]),
107
+ /** slope window (normal y) where ripples stop (slip faces avalanche smooth) */
108
+ slip: v.optional(edge, [0.8, 0.9]),
109
+ /** slope window (normal y) counted as flat (the megaripples live there) */
110
+ flat: v.optional(edge, [0.78, 0.96]),
111
+ /** the ripple patches' floor (0 = bare swales between fields, 1 = rippled everywhere), the always-rippled share near the camera and its window (m) */
112
+ patches: v.optional(v.strictObject({ floor: unit, near: unit, window: span }), { floor: 0.12, near: 0.8, window: [6, 30] }),
113
+ /** the grain tile (R albedo, G / B bump slope), its means (subtracted: grain never shifts brightness) and a strength */
114
+ grain: v.optional(v.strictObject({ map: v.nullable(textureRef), mean: unit, glintMean: v.pipe(v.number(), v.finite(), v.minValue(-1), v.maxValue(1)), strength: nonNegative }), { map: null, mean: 0.5, glintMean: 0, strength: 1 }),
115
+ /** broad albedo at the dunes' scale: × low … × high by a slow noise (linear multipliers) */
116
+ macro: v.optional(v.tuple([linear, linear]), [[0.9, 0.92, 0.96], [1.1, 1.04, 0.98]]),
117
+ /** the albedo's overall gain (an adapter may move it) */
118
+ albedo: v.optional(nonNegative, 0.8),
119
+ /** pale wind streaks: tint (linear multiplier) and amount */
120
+ streaks: v.optional(v.strictObject({ tint: linear, amount: unit }), { tint: [1.18, 1.12, 1.02], amount: 0.55 }),
121
+ /** a trail mask (R: 1 on the trodden bed) over a ground rect: the share of ripples kept, the bed's tint and amount */
122
+ trail: v.optional(v.nullable(v.strictObject({ map: textureRef, rect, ripples: unit, tint: linear, amount: unit })), null),
123
+ /** a baked key-light visibility map (R) over a ground rect, its soft edge and the share of key kept in cast shade */
124
+ keyShadow: v.optional(v.nullable(v.strictObject({ map: textureRef, rect, edge, floor: unit })), null),
125
+ /** the key's terminator ramp on the ground's own normal (N·L): short = a crisp light / shade line */
126
+ terminator: v.optional(v.pipe(nonNegative, v.maxValue(1)), 0.045),
127
+ /** a brighter band where the key grazes the ground (N·L window) and its gain */
128
+ crest: v.optional(v.strictObject({ band: edge, gain: nonNegative }), { band: [0.08, 0.22], gain: 0.9 }),
129
+ /** a grazing-view sheen on lit faces with the key behind or beside the viewer */
130
+ sheen: v.optional(nonNegative, 0.35),
131
+ /** the shade fill where the key does not reach: the sky light × tint × gain + lift (linear), by amount; edge = the N·L of full key; floor = a lift everywhere */
132
+ shade: v.optional(v.strictObject({ tint: linear, gain: nonNegative, lift: linear, amount: unit, edge: unit, floor: linear }), { tint: [0.95, 0.9, 1.3], gain: 1.05, lift: [0.016, 0.013, 0.02], amount: 0.9, edge: 0.14, floor: [0, 0, 0] }),
133
+ /** the light-saturation split: the key's light saturated (flat ground … a face turned into the key), the sky's cooled toward a tint and kept by `keep` */
134
+ saturation: v.optional(v.strictObject({ flat: nonNegative, facing: nonNegative, coolTint: linear, keep: unit }), { flat: 1.2, facing: 2.2, coolTint: [0.9, 0.9, 1.28], keep: 0.4 }),
135
+ /** faces turned from a glow direction (x, z) fall dark by amount (an adapter raises it as the light goes) */
136
+ away: v.optional(v.strictObject({ from: v.tuple([finite, finite]), amount: unit }), { from: [0, -1], amount: 0 }),
137
+ /**
138
+ * up to four light pools on the ground (campfires, lanterns): each adds the albedo × its colour × its strength × gain ×
139
+ * (1 − d / radius)³ to the sky light; a pool weaker than `split` takes `low` (a lamp), from it `high` (a fire). The points
140
+ * and strengths read the declared emitter source when present; null = none.
141
+ */
142
+ pools: v.optional(v.nullable(v.strictObject({ low: linear, high: linear, split: unit, radius: positive, gain: nonNegative, source: v.exactOptional(v.pipe(v.string(), v.minLength(1), v.maxLength(128))) })), null),
143
+ });
144
+ /** A ground layer with every default filled. */
145
+
146
+
147
+ const metres = (max: number) => v.pipe(v.number(), v.finite(), v.minValue(1e-3), v.maxValue(max));
148
+ /** One unit value per measure role: [structure, trim, floor]. */
149
+ const roles = v.tuple([unit, unit, unit]);
150
+ /** The largest grain a measure finish takes (m). */
151
+ const GRAIN_MAX_METRES = 8;
152
+ const grainSize = metres(GRAIN_MAX_METRES);
153
+ /** The measure finish's grain: an amount per role and one size (m). */
154
+ const measureGrain = v.strictObject({ amount: roles, size: grainSize });
155
+ /**
156
+ * The PBR family's measure layer (SHARD-PLATFORM SF56, G152): a blockout "dev map" look drawn by the shader, no texture.
157
+ * Every surface is coloured by its role, crossed by a 1 m grid with a lighter sub-grid, and a structure or trim face of at
158
+ * least 1 m × 1 m carries its size in metres ("4×3") in its top-left corner. The role, the face's own metres and its size
159
+ * ride in the surface's first UV set (`measureUv`, written by a generator); a surface with no such UV (terrain, a plain
160
+ * prop) is floor, gridded in world space on the plane its normal faces. A surface that declares the layer always draws it
161
+ * (G163: Jake picked the dev map).
162
+ */
163
+ export const MeasureLayerSchema: v.GenericSchema<MeasureLayerParamsInput, MeasureLayerParams> = v.strictObject({
164
+ /** sRGB: walls, structures and props (role 1) */
165
+ structure: v.optional(srgb, [1, 0.58, 0.12]),
166
+ /** sRGB: structural surfaces and trim (role 2) */
167
+ trim: v.optional(srgb, [0.45, 0.45, 0.46]),
168
+ /** sRGB: the floor (no role) */
169
+ floor: v.optional(srgb, [0.75, 0.74, 0.71]),
170
+ /** the 1 m lines: sRGB colour, opacity on a role surface and on the floor, half-width (m) */
171
+ line: v.optional(v.strictObject({ colour: srgb, alpha: unit, floorAlpha: unit, width: metres(0.1) }), { colour: [1, 1, 1], alpha: 0.7, floorAlpha: 0.55, width: 0.011 }),
172
+ /** the sub-grid: step (m, divides 1) and opacity */
173
+ sub: v.optional(v.strictObject({ step: metres(0.5), alpha: unit }), { step: 0.25, alpha: 0.12 }),
174
+ /** the size label: sRGB colour and glyph height (m) */
175
+ label: v.optional(v.strictObject({ colour: srgb, height: metres(2) }), { colour: [1, 1, 1], height: 0.36 }),
176
+ /** the share of the role colour that glows (unlit), so a face turned from the sun stays readable */
177
+ lift: v.optional(unit, 0.4),
178
+ // The finish (meta TEMPLATE-E2E LF1-1): three optional knobs, each a triple per role [structure, trim, floor]. Absent is
179
+ // off (tint 0, grain 0, grid 1), so a layer that names none of them draws exactly as before. No default is filled: a
180
+ // product built before the knobs parses to the same bytes, so its declared source hash still holds.
181
+ /**
182
+ * Per role, the share of the surface's own colour (its vertex colour × `colour`; needs `vertexColours` and a mesh that
183
+ * carries colours) that replaces the role colour: 0 = the flat role colour, 1 = the mesh's colour. Two stone tones and a
184
+ * moss cap baked into one mesh keep their difference inside the role
185
+ */
186
+ tint: v.exactOptional(roles),
187
+ /** A grain: value noise in world space, `size` metres across, that shades each role's colour by up to ± `amount` */
188
+ grain: v.exactOptional(measureGrain),
189
+ /** Per role, a multiplier on the 1 m lines' and the sub-grid's opacity, down to 0 (no grid on that role) */
190
+ grid: v.exactOptional(roles),
191
+ });
192
+ /** A measure layer with every default filled. */
193
+
194
+ /** The measure layer's surface roles: 1 = structure (orange), 2 = trim (grey). */
195
+ export type MeasureRole = 1 | 2;
196
+ /** the UV slot a measure UV packs into: role and size sit in multiples of it, the face's own metres (+1) below it */
197
+ export const MEASURE_SLOT = 64;
198
+ /**
199
+ * The first-UV pair a measure-layer surface carries at one vertex: `role`, the vertex's metres across (`u`) and up
200
+ * (`up`) its face from the face's bottom-left corner as seen from outside, and the face's size `w` × `h` (m). A size is labelled
201
+ * when it is a whole or half metre up to 31.5 m (other faces are gridded, not labelled: a label never rounds); a face may span at most 62 m.
202
+ */
203
+ export function measureUv(role: MeasureRole, u: number, up: number, w: number, h: number): [number, number] {
204
+ if (!(w > 0 && h > 0 && w <= 62 && h <= 62 && u >= -1e-6 && up >= -1e-6 && u <= w + 1e-6 && up <= h + 1e-6)) throw new Error('measureUv: a face within 62 m, its point on it');
205
+ const half = (d: number): number => (d <= 31.5 && Math.abs(d * 2 - Math.round(d * 2)) < 0.02 ? Math.round(d * 2) : 0);
206
+ return [MEASURE_SLOT * (role + 4 * half(w)) + 1 + u, MEASURE_SLOT * half(h) + 1 + up];
207
+ }
208
+
209
+ /** One PBR surface: metal / rough with colour, normal and packed ORM maps (occlusion r, roughness g, metalness b). */
210
+ export const PbrMaterialSchema: v.StrictObjectSchema<{ readonly family: v.GenericSchema<PbrMaterialParamsInput['family'], PbrMaterialParams['family']>; readonly colour: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['colour'], undefined>, PbrMaterialParams['colour']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['colour'], undefined>>>; readonly roughness: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['roughness'], undefined>, PbrMaterialParams['roughness']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['roughness'], undefined>>>; readonly metalness: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['metalness'], undefined>, PbrMaterialParams['metalness']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['metalness'], undefined>>>; readonly maps: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['maps'], undefined>, PbrMaterialParams['maps']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['maps'], undefined>>>; readonly normalScale: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['normalScale'], undefined>, PbrMaterialParams['normalScale']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['normalScale'], undefined>>>; readonly occlusion: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['occlusion'], undefined>, PbrMaterialParams['occlusion']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['occlusion'], undefined>>>; readonly envStrength: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['envStrength'], undefined>, PbrMaterialParams['envStrength']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['envStrength'], undefined>>>; readonly vertexColours: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['vertexColours'], undefined>, PbrMaterialParams['vertexColours']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['vertexColours'], undefined>>>; readonly faceted: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['faceted'], undefined>, PbrMaterialParams['faceted']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['faceted'], undefined>>>; readonly doubleSided: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['doubleSided'], undefined>, PbrMaterialParams['doubleSided']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['doubleSided'], undefined>>>; readonly alphaCutoff: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['alphaCutoff'], undefined>, PbrMaterialParams['alphaCutoff']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['alphaCutoff'], undefined>>>; readonly ground: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['ground'], undefined>, PbrMaterialParams['ground']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['ground'], undefined>>>; readonly measure: v.OptionalSchema<v.GenericSchema<Exclude<PbrMaterialParamsInput['measure'], undefined>, PbrMaterialParams['measure']>, MaterialSchemaDefault<Exclude<PbrMaterialParamsInput['measure'], undefined>>>; }, undefined> = v.strictObject({
211
+ family: v.literal('pbr'),
212
+ /** sRGB, multiplies the colour map */
213
+ colour: v.optional(srgb, [1, 1, 1]),
214
+ /** multiplies the ORM map's roughness */
215
+ roughness: v.optional(unit, 1),
216
+ /** multiplies the ORM map's metalness */
217
+ metalness: v.optional(unit, 1),
218
+ maps: v.optional(v.strictObject({ colour: v.nullable(textureRef), normal: v.nullable(textureRef), orm: v.nullable(textureRef) }), { colour: null, normal: null, orm: null }),
219
+ normalScale: v.optional(v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(4)), 1),
220
+ /** how much of the ORM map's occlusion applies (0 = none) */
221
+ occlusion: v.optional(unit, 1),
222
+ /** image-based light strength */
223
+ envStrength: v.optional(v.pipe(nonNegative, v.maxValue(8)), 1),
224
+ vertexColours: v.optional(v.boolean(), false),
225
+ /** flat-shaded facets (one normal per triangle: a low-poly prop, the template's terrain); false = smooth normals */
226
+ faceted: v.optional(v.boolean(), false),
227
+ doubleSided: v.optional(v.boolean(), false),
228
+ /** alpha test threshold (0 = opaque) */
229
+ alphaCutoff: v.optional(unit, 0),
230
+ /** a procedural ground layer (wind ripples, grain, terrain light shaping); null = a plain surface */
231
+ ground: v.optional(v.nullable(GroundLayerSchema), null),
232
+ /** a procedural measure layer (SF56: the dev-map look, always drawn when declared); null = none */
233
+ measure: v.optional(v.nullable(MeasureLayerSchema), null),
234
+ });
235
+ /** A PBR material entry with every default filled. */
236
+
237
+
238
+ /**
239
+ * The display grade a painterly look applies per pixel, in the material (no full-screen pass): a gentle filmic shoulder
240
+ * `x(1 + x/shoulder)/(1 + x)` on gain × exposure, saturation, a cool-shadow / warm-light split by luminance and a mild
241
+ * S-curve, then the hour's saturation on top. The defaults are Nalati Grasslands' grade.
242
+ */
243
+ export const GradeSchema: v.GenericSchema<GradeParamsInput, GradeParams> = v.strictObject({
244
+ exposure: v.optional(v.pipe(nonNegative, v.maxValue(16)), 1),
245
+ /** the fixed pre-gain on exposure */
246
+ gain: v.optional(v.pipe(nonNegative, v.maxValue(16)), 1.12),
247
+ /** the shoulder's knee (larger = a longer straight stretch before the roll-off) */
248
+ shoulder: v.optional(v.pipe(v.number(), v.finite(), v.minValue(0.5), v.maxValue(100)), 9),
249
+ saturation: v.optional(v.pipe(nonNegative, v.maxValue(4)), 1.05),
250
+ /** multipliers on the shadows and on the lights (linear), blended by luminance over `split` */
251
+ shadowTint: v.optional(linear, [0.92, 0.96, 1.05]),
252
+ lightTint: v.optional(linear, [1.07, 0.99, 0.84]),
253
+ split: v.optional(edge, [0.05, 0.6]),
254
+ /** the S-curve's share (0 = none) */
255
+ contrast: v.optional(unit, 0.35),
256
+ /** the hour's saturation, applied last (night greys out) */
257
+ lookSaturation: v.optional(v.pipe(nonNegative, v.maxValue(4)), 1),
258
+ });
259
+ /** A grade with every default filled. */
260
+
261
+
262
+ const DEFAULT_GRADE: GradeParams = { exposure: 1, gain: 1.12, shoulder: 9, saturation: 1.05, shadowTint: [0.92, 0.96, 1.05], lightTint: [1.07, 0.99, 0.84], split: [0.05, 0.6], contrast: 0.35, lookSaturation: 1 };
263
+
264
+ /**
265
+ * The painterly family's look (Nalati Grasslands, style B): soft cel bands, shade painted with a sky tint, a warm
266
+ * terminator, a painted floor that keeps dark paint off black, wetness, wind for swaying foliage, and the per-pixel grade.
267
+ */
268
+ export const PainterlyLookSchema: v.GenericSchema<PainterlyLookParamsInput, PainterlyLookParams> = v.strictObject({
269
+ /** the colour painted into the shadow side (linear, added × albedo where the sun does not reach) */
270
+ shade: v.optional(linear, [0.1, 0.14, 0.3]),
271
+ /** rim light colour (linear, HDR allowed) */
272
+ rim: v.optional(linear, [1.4, 1.2, 0.9]),
273
+ /** the warm band just past the terminator (0 = off) */
274
+ warm: v.optional(v.pipe(nonNegative, v.maxValue(4)), 0.8),
275
+ /** the painted floor: dark albedo lifted toward 0.22 by the shade tint × this (0 = off) */
276
+ floor: v.optional(v.pipe(nonNegative, v.maxValue(16)), 3),
277
+ /** wetness 0 (dry) … 1 (soaked): darker, glossier paint on what faces the sky */
278
+ wet: v.optional(unit, 0),
279
+ /** world wind direction (x, z; normalised) and strength, for a material's `sway` */
280
+ wind: v.optional(v.strictObject({ direction: v.tuple([finite, finite]), strength: nonNegative }), { direction: [0.8, 0.6], strength: 1 }),
281
+ /** the per-pixel display grade (null = the renderer's tone mapping instead); present or null for the look's whole life */
282
+ grade: v.optional(v.nullable(GradeSchema), DEFAULT_GRADE),
283
+ });
284
+ /** A painterly look with every default filled. */
285
+
286
+
287
+ /*
288
+ * The painterly family's painted-terrain layer (SHARD-PLATFORM G227; the mechanism is `paintedTerrain.ts`). A painted
289
+ * terrain is a vertex-coloured painterly ground (the vertex colour is the macro painting) with five painted tileable
290
+ * layers on top, per pixel: the base detail (luminance-preserving), a track laid along the nearest track's direction,
291
+ * gravel (wet below a margin height), triplanar rock and snow; three zone weights tint the ground and paint a cold ring
292
+ * (scree, granite, snowfields, an optional ice tongue). Every world-specific number is a parameter here; the style's own
293
+ * constants live in the shader. The per-vertex masks are the custom attributes `PAINTED_TERRAIN_ATTRIBUTES` names; the
294
+ * baked key-light visibility and contact shade arrive as live uniforms (`bindPaintedTerrainBake`).
295
+ */
296
+ const ptMetres = v.pipe(v.number(), v.finite(), v.minValue(0.05), v.maxValue(256));
297
+ const ptPositive = v.pipe(v.number(), v.finite(), v.minValue(1e-3));
298
+ const ptPositiveLinear = v.tuple([ptPositive, ptPositive, ptPositive]);
299
+ const ptXz = v.tuple([finite, finite]);
300
+
301
+ /** The five painted layers, in their uniform order. */
302
+ export const PAINTED_TERRAIN_LAYERS = ['base', 'track', 'gravel', 'rock', 'snow'] as const;
303
+
304
+ /**
305
+ * The per-vertex inputs a painted-terrain mesh carries besides position, normal and colour (a baked tile keeps them
306
+ * exactly; a mesh without them is filled with `fill`, plain base ground). The names are what three's GLTFLoader gives the
307
+ * native GLB channels `_SURF` / `_RDIR` / `_ZONE` (custom semantics, lowercased):
308
+ * - `mask` (vec4): signed metres across the nearest track (|x| ≥ 5.5 = no track; bakes write 9), gravel 0..1, snow 0..1, rock 0..1;
309
+ * - `track` (vec2): the nearest track's unit direction (x, z), along which the track layer is laid;
310
+ * - `zone` (vec3): the zone weights: zone A, zone B, the cold ring.
311
+ */
312
+ export const PAINTED_TERRAIN_ATTRIBUTES = {
313
+ mask: { name: '_surf', size: 4, fill: [9, 0, 0, 0] },
314
+ track: { name: '_rdir', size: 2, fill: [1, 0] },
315
+ zone: { name: '_zone', size: 3, fill: [0, 0, 0] },
316
+ } as const;
317
+
318
+ const zoneTint = v.strictObject({ tint: linear, amount: unit });
319
+
320
+ /** The painted-terrain layer of a painterly surface. */
321
+ export const PaintedTerrainSchema: v.GenericSchema<PaintedTerrainParamsInput, PaintedTerrainParams> = v.strictObject({
322
+ /** the five painted tileable textures (sRGB colour), by layer */
323
+ maps: v.strictObject({ base: textureRef, track: textureRef, gravel: textureRef, rock: textureRef, snow: textureRef }),
324
+ /** the metres one repeat of each texture spans on the ground */
325
+ metres: v.strictObject({ base: ptMetres, track: ptMetres, gravel: ptMetres, rock: ptMetres, snow: ptMetres }),
326
+ /** the base and rock textures' mean colours (linear, after the sRGB decode): detail divides by them, so it never shifts brightness */
327
+ means: v.strictObject({ base: ptPositiveLinear, rock: ptPositiveLinear }),
328
+ /** the snow line (m): the cold ring's flatter facets catch snow from 10 m below it; `high` is the height window over which the peaks go white and ribbed */
329
+ snow: v.strictObject({ line: finite, high: v.pipe(ptXz, v.check((h) => h[0] < h[1], 'snow high low < high')) }),
330
+ /** the gravel's wet margin: wet from the first height down to fully wet at the second (m) */
331
+ wet: v.pipe(ptXz, v.check((w) => w[0] > w[1], 'wet margin runs downward')),
332
+ /** an ice tongue in the cold ring, flowing from `from` to `to` (x, z), `half` metres either side of its line; null = none */
333
+ ice: v.optional(v.nullable(v.strictObject({ from: ptXz, to: ptXz, half: v.pipe(v.number(), v.finite(), v.minValue(1)) })), null),
334
+ /** the zone A and zone B tints (linear multipliers) and how much of each a full zone weight takes */
335
+ zones: v.optional(v.strictObject({ a: zoneTint, b: zoneTint }), { a: { tint: [0.86, 1.1, 0.8], amount: 0.55 }, b: { tint: [1.2, 1.02, 0.6], amount: 0.65 } }),
336
+ /** where the key light on the ground is shadowed by the baked visibility (the static casters left out of the realtime map): on phones, always or never */
337
+ bakeKeyLight: v.optional(v.picklist(['phone', 'always', 'never']), 'phone'),
338
+ });
339
+ /** A painted-terrain layer with every default filled. */
340
+
341
+
342
+ /** Validate a painted-terrain layer and fill its defaults; throws a readable error on bad data. */
343
+ export function parsePaintedTerrain(input: unknown): PaintedTerrainParams {
344
+ const r = v.safeParse(PaintedTerrainSchema, input);
345
+ if (!r.success) throw new Error(`painted terrain: ${r.issues.map((i) => `${v.getDotPath(i) ?? '(root)'}: ${i.message}`).join('; ')}`);
346
+ return r.output;
347
+ }
348
+
349
+ /** The painted layer's five texture references, in layer order. */
350
+ export function paintedTerrainTextureRefs(params: PaintedTerrainParams): string[] {
351
+ return PAINTED_TERRAIN_LAYERS.map((layer) => params.maps[layer]);
352
+ }
353
+
354
+ /** One painterly surface: vertex-coloured, no specular, a per-surface rim, cel strength, shade share and sway. */
355
+ export const PainterlyMaterialSchema: v.StrictObjectSchema<{ readonly family: v.GenericSchema<PainterlyMaterialParamsInput['family'], PainterlyMaterialParams['family']>; readonly colour: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['colour'], undefined>, PainterlyMaterialParams['colour']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['colour'], undefined>>>; readonly rim: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['rim'], undefined>, PainterlyMaterialParams['rim']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['rim'], undefined>>>; readonly bands: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['bands'], undefined>, PainterlyMaterialParams['bands']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['bands'], undefined>>>; readonly shade: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['shade'], undefined>, PainterlyMaterialParams['shade']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['shade'], undefined>>>; readonly floor: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['floor'], undefined>, PainterlyMaterialParams['floor']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['floor'], undefined>>>; readonly sway: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['sway'], undefined>, PainterlyMaterialParams['sway']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['sway'], undefined>>>; readonly emissive: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['emissive'], undefined>, PainterlyMaterialParams['emissive']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['emissive'], undefined>>>; readonly emissiveIntensity: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['emissiveIntensity'], undefined>, PainterlyMaterialParams['emissiveIntensity']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['emissiveIntensity'], undefined>>>; readonly map: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['map'], undefined>, PainterlyMaterialParams['map']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['map'], undefined>>>; readonly vertexColours: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['vertexColours'], undefined>, PainterlyMaterialParams['vertexColours']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['vertexColours'], undefined>>>; readonly doubleSided: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['doubleSided'], undefined>, PainterlyMaterialParams['doubleSided']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['doubleSided'], undefined>>>; readonly alphaCutoff: v.OptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['alphaCutoff'], undefined>, PainterlyMaterialParams['alphaCutoff']>, MaterialSchemaDefault<Exclude<PainterlyMaterialParamsInput['alphaCutoff'], undefined>>>; readonly terrain: v.ExactOptionalSchema<v.GenericSchema<Exclude<PainterlyMaterialParamsInput['terrain'], undefined>, Exclude<PainterlyMaterialParams['terrain'], undefined>>, undefined>; }, undefined> = v.strictObject({
356
+ family: v.literal('painterly'),
357
+ /** sRGB, multiplies the vertex colours (and the map) */
358
+ colour: v.optional(srgb, [1, 1, 1]),
359
+ /** rim-light strength (0 = none … 1 = strong) */
360
+ rim: v.optional(unit, 0.35),
361
+ /** cel strength (0 = plain Lambert … 1 = the full three-band ramp) */
362
+ bands: v.optional(unit, 0.8),
363
+ /** how much of the painted shade tint this surface takes */
364
+ shade: v.optional(unit, 1),
365
+ /** this surface's share of the painted floor */
366
+ floor: v.optional(unit, 1),
367
+ /** wind sway in metres per (local metre above the origin)² (foliage, flags; 0 = rigid) */
368
+ sway: v.optional(v.pipe(nonNegative, v.maxValue(1)), 0),
369
+ /** self-light colour (sRGB) and its strength: a lantern, embers, eyes */
370
+ emissive: v.optional(srgb, [0, 0, 0]),
371
+ emissiveIntensity: v.optional(v.pipe(nonNegative, v.maxValue(64)), 1),
372
+ /** a base-colour texture (sRGB) × colour × vertex colours */
373
+ map: v.optional(v.nullable(textureRef), null),
374
+ vertexColours: v.optional(v.boolean(), true),
375
+ doubleSided: v.optional(v.boolean(), false),
376
+ /** alpha test threshold (0 = opaque) */
377
+ alphaCutoff: v.optional(unit, 0),
378
+ /** a painted-terrain layer (G227: five painted tileable layers over the vertex-coloured macro painting, `PaintedTerrainSchema` above); absent = a plain surface */
379
+ terrain: v.exactOptional(PaintedTerrainSchema),
380
+ });
381
+ /** A painterly material entry with every default filled. */
382
+
383
+
384
+ /** The emissive family's look: one gain over every emitter (exposure by the hour) and the stage blend a sky reads. */
385
+ export const EmissiveLookSchema: v.GenericSchema<EmissiveLookParamsInput, EmissiveLookParams> = v.strictObject({
386
+ /** multiplies every emitter under this look */
387
+ gain: v.optional(v.pipe(nonNegative, v.maxValue(64)), 1),
388
+ /** 0 … 1: a sky's blend from its first map to its second (a runtime adapter feeds it: Signal Dunes' dusk) */
389
+ blend: v.optional(unit, 0),
390
+ });
391
+ /** An emissive look with every default filled. */
392
+
393
+
394
+ /**
395
+ * A neon tube drawn from a distance field (R: the glyph's fill, 0.5 on its edge; G: the distance to its skeleton): a
396
+ * whitened core, a darker glass rim, an optional seam and a short halo, all in em (the field's cell height = 1).
397
+ */
398
+ export const NeonTubeSchema: v.GenericSchema<NeonTubeParamsInput, NeonTubeParams> = v.strictObject({
399
+ field: textureRef,
400
+ /** em of fill distance one unit of R spans either side of 0.5, and em per unit of G */
401
+ fillSpread: positive,
402
+ skeletonSpread: positive,
403
+ /** 0 = brush fill … 1 = monoline tube round the skeleton */
404
+ mono: v.optional(unit, 0),
405
+ radius: v.optional(nonNegative, 0.05),
406
+ rim: v.optional(nonNegative, 0.024),
407
+ thicken: v.optional(v.pipe(v.number(), v.finite(), v.minValue(-1), v.maxValue(1)), 0.022),
408
+ seam: v.optional(unit, 0),
409
+ seamWidth: v.optional(nonNegative, 0.008),
410
+ haloReach: v.optional(nonNegative, 0.12),
411
+ haloGain: v.optional(nonNegative, 0.22),
412
+ /** how far the core whitens (0 = the tint) and how dark the rim's glass is (× tint) */
413
+ core: v.optional(unit, 0.5),
414
+ rimShade: v.optional(unit, 0.62),
415
+ /** the uv size of one field cell (an atlas laid out on a grid from 0): the halo fades out at each cell's border, so a glyph quad never cuts it hard; null = no fade */
416
+ cell: v.optional(v.nullable(v.tuple([v.pipe(positive, v.maxValue(1)), v.pipe(positive, v.maxValue(1))])), null),
417
+ });
418
+
419
+ /**
420
+ * A sky dome at infinity from one or two seamless 360° panorama strips (x = heading clockwise from -z, the strip spanning
421
+ * `elevation` degrees), blended by the look's `blend`; under `hold` degrees the colour is averaged round the heading (the
422
+ * 3-D horizon owns the silhouette); over the top it eases into the strip's top row; crisp stars where the sky is dark.
423
+ */
424
+ export const SkyDomeSchema: v.GenericSchema<SkyDomeParamsInput, SkyDomeParams> = v.strictObject({
425
+ maps: v.tuple([textureRef, v.nullable(textureRef)]),
426
+ /** the strip's bottom and top elevation (degrees) */
427
+ elevation: v.optional(v.pipe(v.tuple([v.pipe(finite, v.minValue(-90)), v.pipe(finite, v.maxValue(90))]), v.check((e) => e[0] < e[1], 'elevation low < high')), [-8, 45]),
428
+ /** the blend window over the look's `blend` (the first map up to low, the second from high) */
429
+ window: v.optional(edge, [0, 1]),
430
+ /** gain on the first map low in the sky and from 30° up (a re-coloured early stage) */
431
+ firstGain: v.optional(v.tuple([nonNegative, nonNegative]), [1, 1]),
432
+ /** degrees under which the sky holds and averages round the heading */
433
+ hold: v.optional(v.pipe(nonNegative, v.maxValue(30)), 2.5),
434
+ /** stars: density (share of cells lit), gain, the elevation window (degrees) they fade in over, the blend window they appear over */
435
+ stars: v.optional(v.strictObject({ density: unit, gain: nonNegative, elevation: span, appear: edge }), { density: 0.0045, gain: 0.5, elevation: [8, 20], appear: [0.45, 0.7] }),
436
+ /** ± dither added (linear), so a dark gradient never bands */
437
+ dither: v.optional(v.pipe(nonNegative, v.maxValue(0.1)), 0.004),
438
+ });
439
+
440
+ /**
441
+ * One emissive surface: unlit light. `colour` × `intensity` (HDR) × the vertex colours × an optional map, flickering by a
442
+ * seed, fogged at a share of the fog. With `tube` it draws a neon glyph from a distance field; with `sky`, a sky dome.
443
+ */
444
+ export const EmissiveMaterialSchema: v.StrictObjectSchema<{ readonly family: v.GenericSchema<EmissiveMaterialParamsInput['family'], EmissiveMaterialParams['family']>; readonly colour: v.OptionalSchema<v.GenericSchema<Exclude<EmissiveMaterialParamsInput['colour'], undefined>, EmissiveMaterialParams['colour']>, MaterialSchemaDefault<Exclude<EmissiveMaterialParamsInput['colour'], undefined>>>; readonly intensity: v.OptionalSchema<v.GenericSchema<Exclude<EmissiveMaterialParamsInput['intensity'], undefined>, EmissiveMaterialParams['intensity']>, MaterialSchemaDefault<Exclude<EmissiveMaterialParamsInput['intensity'], undefined>>>; readonly vertexColours: v.OptionalSchema<v.GenericSchema<Exclude<EmissiveMaterialParamsInput['vertexColours'], undefined>, EmissiveMaterialParams['vertexColours']>, MaterialSchemaDefault<Exclude<EmissiveMaterialParamsInput['vertexColours'], undefined>>>; readonly map: v.OptionalSchema<v.GenericSchema<Exclude<EmissiveMaterialParamsInput['map'], undefined>, EmissiveMaterialParams['map']>, MaterialSchemaDefault<Exclude<EmissiveMaterialParamsInput['map'], undefined>>>; readonly blend: v.OptionalSchema<v.GenericSchema<Exclude<EmissiveMaterialParamsInput['blend'], undefined>, EmissiveMaterialParams['blend']>, MaterialSchemaDefault<Exclude<EmissiveMaterialParamsInput['blend'], undefined>>>; readonly doubleSided: v.OptionalSchema<v.GenericSchema<Exclude<EmissiveMaterialParamsInput['doubleSided'], undefined>, EmissiveMaterialParams['doubleSided']>, MaterialSchemaDefault<Exclude<EmissiveMaterialParamsInput['doubleSided'], undefined>>>; readonly fog: v.OptionalSchema<v.GenericSchema<Exclude<EmissiveMaterialParamsInput['fog'], undefined>, EmissiveMaterialParams['fog']>, MaterialSchemaDefault<Exclude<EmissiveMaterialParamsInput['fog'], undefined>>>; readonly flicker: v.OptionalSchema<v.GenericSchema<Exclude<EmissiveMaterialParamsInput['flicker'], undefined>, EmissiveMaterialParams['flicker']>, MaterialSchemaDefault<Exclude<EmissiveMaterialParamsInput['flicker'], undefined>>>; readonly tube: v.OptionalSchema<v.GenericSchema<Exclude<EmissiveMaterialParamsInput['tube'], undefined>, EmissiveMaterialParams['tube']>, MaterialSchemaDefault<Exclude<EmissiveMaterialParamsInput['tube'], undefined>>>; readonly sky: v.OptionalSchema<v.GenericSchema<Exclude<EmissiveMaterialParamsInput['sky'], undefined>, EmissiveMaterialParams['sky']>, MaterialSchemaDefault<Exclude<EmissiveMaterialParamsInput['sky'], undefined>>>; }, undefined> = v.strictObject({
445
+ family: v.literal('emissive'),
446
+ /** sRGB tint */
447
+ colour: v.optional(srgb, [1, 1, 1]),
448
+ /** linear gain (neon runs at ~4) */
449
+ intensity: v.optional(v.pipe(nonNegative, v.maxValue(64)), 1),
450
+ vertexColours: v.optional(v.boolean(), false),
451
+ /** an sRGB colour map × tint */
452
+ map: v.optional(v.nullable(textureRef), null),
453
+ /** 'additive' adds light over what is behind it (no depth write); 'opaque' is a surface lit from within */
454
+ blend: v.optional(v.picklist(['opaque', 'additive']), 'opaque'),
455
+ doubleSided: v.optional(v.boolean(), false),
456
+ /** how much of the fog it takes: transmittance ^ fog (0 = cuts through, 1 = fogged like any surface) */
457
+ fog: v.optional(unit, 1),
458
+ /** 0 = steady; else the seed of a stuttering tube (dark for a few beats now and then) */
459
+ flicker: v.optional(v.pipe(nonNegative, v.maxValue(1000)), 0),
460
+ tube: v.optional(v.nullable(NeonTubeSchema), null),
461
+ sky: v.optional(v.nullable(SkyDomeSchema), null),
462
+ });
463
+ /** An emissive material entry with every default filled. */
464
+
465
+
466
+ /** Any family's material entry, discriminated by `family` (an emissive surface is a tube or a sky, never both). */
467
+ export const FamilyMaterialSchema: v.GenericSchema<FamilyMaterialParamsInput, FamilyMaterialParams> = v.pipe(
468
+ v.variant('family', [ToonMaterialSchema, PbrMaterialSchema, PainterlyMaterialSchema, EmissiveMaterialSchema]),
469
+ v.check((m) => m.family !== 'emissive' || m.tube === null || m.sky === null, 'an emissive surface is a tube or a sky, not both'),
470
+ );
471
+ /** Any family's validated material entry (what a compiler receives). */
472
+
473
+
474
+ /** the preset reference version a material names (`{ family: "graph", preset, version }`); another version is refused */
475
+ export const GRAPH_PRESET_VERSION = 1;
476
+ /**
477
+ * Why a family entry has no built-in graph preset (SF59), or null when it has one: the one rule admission and the
478
+ * engine's preset door (`graph/presets.ts` `familyPresetGraph`) share. IR version 1 cannot express a PBR surface other than
479
+ * the measure layer alone (maps or a ground layer), a painted terrain, an emissive sky, an additive blend or a fog share
480
+ * other than 1.
481
+ */
482
+ export function presetRefusal(entry: FamilyMaterialParams): string | null {
483
+ if (entry.family === 'painterly' && entry.terrain !== undefined) return 'painterly preset: a painted terrain is not expressible in IR version 1';
484
+ if (entry.family === 'pbr' && (entry.measure === null || entry.ground !== null || entry.maps.colour !== null || entry.maps.normal !== null || entry.maps.orm !== null || entry.measure.tint !== undefined || entry.measure.grain !== undefined || entry.measure.grid !== undefined)) return 'pbr preset: IR version 1 expresses the measure layer alone (no maps, no ground layer, no finish: tint, grain, grid)';
485
+ if (entry.family === 'emissive') {
486
+ const missing: string[] = [];
487
+ if (entry.sky !== null) missing.push('a sky (atan / asin, a screen-position input, back-face depth-off unfogged render state)');
488
+ if (entry.blend === 'additive') missing.push('an additive blend (no blend mode)');
489
+ if (entry.fog !== 1) missing.push(`a fog share of ${entry.fog} (the fog epilogue is not a stage)`);
490
+ if (missing.length > 0) return `emissive preset: IR version 1 cannot express ${missing.join('; ')}`;
491
+ }
492
+ return null;
493
+ }
494
+
495
+ /** Validate a material entry and fill the family's defaults; throws a readable error on bad data. */
496
+ export function parseFamilyMaterial(input: unknown): FamilyMaterialParams {
497
+ const r = v.safeParse(FamilyMaterialSchema, input);
498
+ if (!r.success) throw new Error(`material family: ${r.issues.map((i) => `${v.getDotPath(i) ?? '(root)'}: ${i.message}`).join('; ')}`);
499
+ return r.output;
500
+ }
501
+
502
+ /** Validate the toon look and fill its defaults. */
503
+ export function parseToonLook(input: unknown): ToonLookParams {
504
+ const r = v.safeParse(ToonLookSchema, input);
505
+ if (!r.success) throw new Error(`toon look: ${r.issues.map((i) => `${v.getDotPath(i) ?? '(root)'}: ${i.message}`).join('; ')}`);
506
+ return r.output;
507
+ }
508
+
509
+ /** Validate the painterly look and fill its defaults. */
510
+ export function parsePainterlyLook(input: unknown): PainterlyLookParams {
511
+ const r = v.safeParse(PainterlyLookSchema, input);
512
+ if (!r.success) throw new Error(`painterly look: ${r.issues.map((i) => `${v.getDotPath(i) ?? '(root)'}: ${i.message}`).join('; ')}`);
513
+ return r.output;
514
+ }
515
+
516
+ /** Validate the emissive look and fill its defaults. */
517
+ export function parseEmissiveLook(input: unknown): EmissiveLookParams {
518
+ const r = v.safeParse(EmissiveLookSchema, input);
519
+ if (!r.success) throw new Error(`emissive look: ${r.issues.map((i) => `${v.getDotPath(i) ?? '(root)'}: ${i.message}`).join('; ')}`);
520
+ return r.output;
521
+ }
522
+
523
+ /** Validate a ground layer and fill its defaults. */
524
+ export function parseGroundLayer(input: unknown): GroundLayerParams {
525
+ const r = v.safeParse(GroundLayerSchema, input);
526
+ if (!r.success) throw new Error(`ground layer: ${r.issues.map((i) => `${v.getDotPath(i) ?? '(root)'}: ${i.message}`).join('; ')}`);
527
+ return r.output;
528
+ }
529
+
530
+ /** Data defaults retain Valibot's readonly tuple/object inputs without admitting an undefined result. */
531
+ type MaterialSchemaDefault<T> = Exclude<v.Default<v.GenericSchema<T>, undefined>, undefined | ((...args: never[]) => unknown)>;
532
+
533
+ /** Admitted material data independent of validator implementation metadata. */
534
+ export interface ToonLookParamsInput { faceEdge?: [number, number] | undefined; shadowEdge?: [number, number] | undefined; litGrade?: number | undefined; shadeGrade?: number | undefined; lift?: [number, number, number] | undefined; rim?: [number, number, number] | undefined; terminator?: [number, number, number] | undefined; glossBelow?: number | undefined; cloudShade?: { strength: number; scale: number; wind: [number, number]; } | undefined; caustics?: { level: (number) | null; strength: number; } | undefined; }
535
+ export interface ToonLookParams { faceEdge: [number, number]; shadowEdge: [number, number]; litGrade: number; shadeGrade: number; lift: [number, number, number]; rim: [number, number, number]; terminator: [number, number, number]; glossBelow: number; cloudShade: { strength: number; scale: number; wind: [number, number]; }; caustics: { level: (number) | null; strength: number; }; }
536
+ export interface ToonMaterialParamsInput { family: 'toon'; colour?: [number, number, number] | undefined; vertexColours?: boolean | undefined; faceted?: boolean | undefined; doubleSided?: boolean | undefined; roughness?: number | undefined; metalness?: number | undefined; }
537
+ // oxlint-disable-next-line typescript/consistent-type-definitions -- Graph admission requires the material alias's implicit dictionary compatibility.
538
+ export type ToonMaterialParams = { family: 'toon'; colour: [number, number, number]; vertexColours: boolean; faceted: boolean; doubleSided: boolean; roughness: number; metalness: number; };
539
+ export interface GroundLayerParamsInput { wind?: [number, number] | undefined; wavelength?: [number, number] | undefined; lump?: number | undefined; depth?: [number, number] | undefined; relief?: [number, number, number] | undefined; contrast?: { near: number; far: number; window: [number, number]; strength: number; } | undefined; fade?: [number, number] | undefined; slip?: [number, number] | undefined; flat?: [number, number] | undefined; patches?: { floor: number; near: number; window: [number, number]; } | undefined; grain?: { map: (string) | null; mean: number; glintMean: number; strength: number; } | undefined; macro?: [[number, number, number], [number, number, number]] | undefined; albedo?: number | undefined; streaks?: { tint: [number, number, number]; amount: number; } | undefined; trail?: ({ map: string; rect: [number, number, number, number]; ripples: number; tint: [number, number, number]; amount: number; }) | null | undefined; keyShadow?: ({ map: string; rect: [number, number, number, number]; edge: [number, number]; floor: number; }) | null | undefined; terminator?: number | undefined; crest?: { band: [number, number]; gain: number; } | undefined; sheen?: number | undefined; shade?: { tint: [number, number, number]; gain: number; lift: [number, number, number]; amount: number; edge: number; floor: [number, number, number]; } | undefined; saturation?: { flat: number; facing: number; coolTint: [number, number, number]; keep: number; } | undefined; away?: { from: [number, number]; amount: number; } | undefined; pools?: ({ low: [number, number, number]; high: [number, number, number]; split: number; radius: number; gain: number; source?: string; }) | null | undefined; }
540
+ export interface GroundLayerParams { wind: [number, number]; wavelength: [number, number]; lump: number; depth: [number, number]; relief: [number, number, number]; contrast: { near: number; far: number; window: [number, number]; strength: number; }; fade: [number, number]; slip: [number, number]; flat: [number, number]; patches: { floor: number; near: number; window: [number, number]; }; grain: { map: (string) | null; mean: number; glintMean: number; strength: number; }; macro: [[number, number, number], [number, number, number]]; albedo: number; streaks: { tint: [number, number, number]; amount: number; }; trail: ({ map: string; rect: [number, number, number, number]; ripples: number; tint: [number, number, number]; amount: number; }) | null; keyShadow: ({ map: string; rect: [number, number, number, number]; edge: [number, number]; floor: number; }) | null; terminator: number; crest: { band: [number, number]; gain: number; }; sheen: number; shade: { tint: [number, number, number]; gain: number; lift: [number, number, number]; amount: number; edge: number; floor: [number, number, number]; }; saturation: { flat: number; facing: number; coolTint: [number, number, number]; keep: number; }; away: { from: [number, number]; amount: number; }; pools: ({ low: [number, number, number]; high: [number, number, number]; split: number; radius: number; gain: number; source?: string; }) | null; }
541
+ export interface MeasureLayerParamsInput { structure?: [number, number, number] | undefined; trim?: [number, number, number] | undefined; floor?: [number, number, number] | undefined; line?: { colour: [number, number, number]; alpha: number; floorAlpha: number; width: number; } | undefined; sub?: { step: number; alpha: number; } | undefined; label?: { colour: [number, number, number]; height: number; } | undefined; lift?: number | undefined; tint?: [number, number, number]; grain?: { amount: [number, number, number]; size: number; }; grid?: [number, number, number]; }
542
+ export interface MeasureLayerParams { structure: [number, number, number]; trim: [number, number, number]; floor: [number, number, number]; line: { colour: [number, number, number]; alpha: number; floorAlpha: number; width: number; }; sub: { step: number; alpha: number; }; label: { colour: [number, number, number]; height: number; }; lift: number; tint?: [number, number, number]; grain?: { amount: [number, number, number]; size: number; }; grid?: [number, number, number]; }
543
+ export interface PbrMaterialParamsInput { family: 'pbr'; colour?: [number, number, number] | undefined; roughness?: number | undefined; metalness?: number | undefined; maps?: { colour: (string) | null; normal: (string) | null; orm: (string) | null; } | undefined; normalScale?: number | undefined; occlusion?: number | undefined; envStrength?: number | undefined; vertexColours?: boolean | undefined; faceted?: boolean | undefined; doubleSided?: boolean | undefined; alphaCutoff?: number | undefined; ground?: (GroundLayerParamsInput) | null | undefined; measure?: (MeasureLayerParamsInput) | null | undefined; }
544
+ // oxlint-disable-next-line typescript/consistent-type-definitions -- Graph admission requires the material alias's implicit dictionary compatibility.
545
+ export type PbrMaterialParams = { family: 'pbr'; colour: [number, number, number]; roughness: number; metalness: number; maps: { colour: (string) | null; normal: (string) | null; orm: (string) | null; }; normalScale: number; occlusion: number; envStrength: number; vertexColours: boolean; faceted: boolean; doubleSided: boolean; alphaCutoff: number; ground: (GroundLayerParams) | null; measure: (MeasureLayerParams) | null; };
546
+ export interface GradeParamsInput { exposure?: number | undefined; gain?: number | undefined; shoulder?: number | undefined; saturation?: number | undefined; shadowTint?: [number, number, number] | undefined; lightTint?: [number, number, number] | undefined; split?: [number, number] | undefined; contrast?: number | undefined; lookSaturation?: number | undefined; }
547
+ export interface GradeParams { exposure: number; gain: number; shoulder: number; saturation: number; shadowTint: [number, number, number]; lightTint: [number, number, number]; split: [number, number]; contrast: number; lookSaturation: number; }
548
+ export interface PainterlyLookParamsInput { shade?: [number, number, number] | undefined; rim?: [number, number, number] | undefined; warm?: number | undefined; floor?: number | undefined; wet?: number | undefined; wind?: { direction: [number, number]; strength: number; } | undefined; grade?: (GradeParamsInput) | null | undefined; }
549
+ export interface PainterlyLookParams { shade: [number, number, number]; rim: [number, number, number]; warm: number; floor: number; wet: number; wind: { direction: [number, number]; strength: number; }; grade: (GradeParams) | null; }
550
+ export interface PaintedTerrainParamsInput { maps: { base: string; track: string; gravel: string; rock: string; snow: string; }; metres: { base: number; track: number; gravel: number; rock: number; snow: number; }; means: { base: [number, number, number]; rock: [number, number, number]; }; snow: { line: number; high: [number, number]; }; wet: [number, number]; ice?: ({ from: [number, number]; to: [number, number]; half: number; }) | null | undefined; zones?: { a: { tint: [number, number, number]; amount: number; }; b: { tint: [number, number, number]; amount: number; }; } | undefined; bakeKeyLight?: 'phone' | 'always' | 'never' | undefined; }
551
+ export interface PaintedTerrainParams { maps: { base: string; track: string; gravel: string; rock: string; snow: string; }; metres: { base: number; track: number; gravel: number; rock: number; snow: number; }; means: { base: [number, number, number]; rock: [number, number, number]; }; snow: { line: number; high: [number, number]; }; wet: [number, number]; ice: ({ from: [number, number]; to: [number, number]; half: number; }) | null; zones: { a: { tint: [number, number, number]; amount: number; }; b: { tint: [number, number, number]; amount: number; }; }; bakeKeyLight: 'phone' | 'always' | 'never'; }
552
+ export interface PainterlyMaterialParamsInput { family: 'painterly'; colour?: [number, number, number] | undefined; rim?: number | undefined; bands?: number | undefined; shade?: number | undefined; floor?: number | undefined; sway?: number | undefined; emissive?: [number, number, number] | undefined; emissiveIntensity?: number | undefined; map?: (string) | null | undefined; vertexColours?: boolean | undefined; doubleSided?: boolean | undefined; alphaCutoff?: number | undefined; terrain?: PaintedTerrainParamsInput; }
553
+ // oxlint-disable-next-line typescript/consistent-type-definitions -- Graph admission requires the material alias's implicit dictionary compatibility.
554
+ export type PainterlyMaterialParams = { family: 'painterly'; colour: [number, number, number]; rim: number; bands: number; shade: number; floor: number; sway: number; emissive: [number, number, number]; emissiveIntensity: number; map: (string) | null; vertexColours: boolean; doubleSided: boolean; alphaCutoff: number; terrain?: PaintedTerrainParams; };
555
+ export interface EmissiveLookParamsInput { gain?: number | undefined; blend?: number | undefined; }
556
+ export interface EmissiveLookParams { gain: number; blend: number; }
557
+ export interface NeonTubeParamsInput { field: string; fillSpread: number; skeletonSpread: number; mono?: number | undefined; radius?: number | undefined; rim?: number | undefined; thicken?: number | undefined; seam?: number | undefined; seamWidth?: number | undefined; haloReach?: number | undefined; haloGain?: number | undefined; core?: number | undefined; rimShade?: number | undefined; cell?: ([number, number]) | null | undefined; }
558
+ export interface NeonTubeParams { field: string; fillSpread: number; skeletonSpread: number; mono: number; radius: number; rim: number; thicken: number; seam: number; seamWidth: number; haloReach: number; haloGain: number; core: number; rimShade: number; cell: ([number, number]) | null; }
559
+ export interface SkyDomeParamsInput { maps: [string, (string) | null]; elevation?: [number, number] | undefined; window?: [number, number] | undefined; firstGain?: [number, number] | undefined; hold?: number | undefined; stars?: { density: number; gain: number; elevation: [number, number]; appear: [number, number]; } | undefined; dither?: number | undefined; }
560
+ export interface SkyDomeParams { maps: [string, (string) | null]; elevation: [number, number]; window: [number, number]; firstGain: [number, number]; hold: number; stars: { density: number; gain: number; elevation: [number, number]; appear: [number, number]; }; dither: number; }
561
+ export interface EmissiveMaterialParamsInput { family: 'emissive'; colour?: [number, number, number] | undefined; intensity?: number | undefined; vertexColours?: boolean | undefined; map?: (string) | null | undefined; blend?: 'opaque' | 'additive' | undefined; doubleSided?: boolean | undefined; fog?: number | undefined; flicker?: number | undefined; tube?: (NeonTubeParamsInput) | null | undefined; sky?: (SkyDomeParamsInput) | null | undefined; }
562
+ // oxlint-disable-next-line typescript/consistent-type-definitions -- Graph admission requires the material alias's implicit dictionary compatibility.
563
+ export type EmissiveMaterialParams = { family: 'emissive'; colour: [number, number, number]; intensity: number; vertexColours: boolean; map: (string) | null; blend: 'opaque' | 'additive'; doubleSided: boolean; fog: number; flicker: number; tube: (NeonTubeParams) | null; sky: (SkyDomeParams) | null; };
564
+ export type FamilyMaterialParamsInput = (ToonMaterialParamsInput) | (PbrMaterialParamsInput) | (PainterlyMaterialParamsInput) | (EmissiveMaterialParamsInput);
565
+ export type FamilyMaterialParams = (ToonMaterialParams) | (PbrMaterialParams) | (PainterlyMaterialParams) | (EmissiveMaterialParams);