@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.
- package/corpus/brasscap-mesa/blobs/bin/02da0052111419cdff3a29f1c6d0ff0d223e0b53a956c16c65ed63d87928b3b9.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/068a121cd780a2a9164416f6e4fde44834f2d2f3a5ed65c174e480b7a2d3f627.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/07d5a061cd338618e528747d61eb2b17709510550ef0ba40a58b67761b200f3f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/086e3706070555baca863f6ecf9dbca09c084afa501d92d4246d896b09546f36.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/08b1b9ab7c732d7dbe8f961f1fc40e84042d1fe42544f55c9ee89f04dffe3d5e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/18bdbdc704cb8aac93435d208dfe0e9a44374efb73afa3bc58c631650e0a2995.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/1a210fcddcb9749ecb1c244837e8e37ea69b038faae191dee6bbbde228d31a18.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/264ab9ede386504a5ff9814b0a620b879cb29f3f45a80bcfc0c80b8ee236e364.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2b6fbea4c846a23cf4802ebdb1804e128896c8dd87e5d23509db6729e5b1be4e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2d755cc635dee90b0f3958272855a821e2dd605a189a5ffcd480a325155fe84f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2d76c6829fe77fb55cc2541e4aca5ce5d18b68508dcdf3fa957fe4a83b9c887a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/32c15d55a4548501740593807c5007217c72dbc10a21f4613ef5e0cee0b90d1d.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3539b362cf3a61a79e92e113ebf8f255d0b25ec2d2edd816498879de831fa912.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3af38a2377bc89f6c6c82ee1e83df674efa2793db932b50a23bbce7ec9cd7941.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3c176a7a0d0850fdcee790ed2641216fc3d1cba025928de3d7784262bb9b6f4a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3fb37e488aa81a64c997b3dd09794e988994c6ee3476c6d653ced1670888dd8e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/424dcc7b320317bf3f2c62c8f19bc80564035127eb38ab811e460934d57ea38c.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/45cea35fab6bb06051a3286fca2307944850c7f9ed7aa89b7c24fafef28efda6.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/499cc7863851f97d79dbfc64e76f9e6978894199184a0d80ebdca13066a8fa78.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/4b7217644763b00c6ee6ae3f176c726914966fb791654a385c0638bb998b6dd2.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/4cf11c7177bb082f335e5bc7a037ef00d09355c5ad8263e284a96a92630ff9ae.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/536b37cab5a1edd6a68a71d122aab6898e44c68a5470a4ca8a9a72c57c02e034.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/55d3628b27e0fcea383df86c434a69761439f51a013359f0829675b07ee2b616.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5652ba90fbd8146edaf42660329cc81798752f2f60b8d03956714460d5ba75ef.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/57459ab5e2ac6cec65ef5e59789dd82b9666d8573df41c4a398df603f1fa456f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5915b6aed21bba49b841b45574f44f60d26b44810bd68ac70b22f3f3b0dab072.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5c4a5c7a8e99253561105c5fa3faf14326cf0c23adc32bfe7f8aea4dbf4b05f9.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/61822a412cfd461f4f7ae50bc13f242a0fca6c5c58fca72247b596ab037a1c85.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/673b7712908966718341508469b39cd49e6461f690ca3c23d4621ea7eba0cc30.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/69394a49520f84f6dccc1655f1c89eedc913ac53a7e48ac5dc1bff4141639bb4.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/6e58a53a6c2acd50f9f80fd270ca034c54421df8a587e181101b4b75b952ac5d.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/75dc9f23ee71e11a3a0c67eb77275d741a281c3398808fb42efd52b9973d5d04.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/76c6a403293a68ed3d6ad14e9dd27b555c3a1ef4a3cae12a2bd2ab3e67c5ad02.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/82b73ce3a18e47092840fc029177861887aa2867b007248ac79ffa20895a4491.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8430d9bbfb4e2b678c54595ad95555c3c73d0e1b144a4d6e29664ccb4371baf0.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/848d4492508689f5c4a224079dca8809e872e33b8f2635c9f16da5dc21beed16.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/84941ac387a0d245ea20bd663ff4ee78c5315bedfa058ada0961765aff61acaf.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/859b7bbcf048a4525db0548b8f5afef83bfc4870914767153f44c05e83436ec5.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/87b68b45680a57c796eed9183211b03335a6ad6737372b3ef476c2cf42efa631.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8cef94308af8d09670e4c99a3b6c3d9280b7a27d386653a3bd7d482b2cdf2b65.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8e564bce3f352c2186ae09ed7fbca9739c10abc46fd5f6893c68cb47178bd2b4.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8f89e79d0fb9b04d48c7b5719e1d024161c6a2119835b18dcb193ff51123a9be.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8fe511ad48656a0b10801100b9100edab1be605a8a182dc5c834d298bf0d9166.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/900bda6562d06fafda54c495e325d57dbb7931813178ee207449c5519d89d537.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/997b1b7d9210bfa77dc71f16a57c6bd66bc7c648686dc2a2666044c95042978a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a111bb4c6cec536bcf57dddc744b871ac9f3d094ce459c16243adca19020db77.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a2208bf899e6c84942eef9fbab569d597f574551afae5864f1953c6a517af068.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a302ddb2598a72ece53780094b64ad861dc68e6913d8a1ea08f5d141736e2986.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/afcbc671326d0dac14e460662c1f793335877ba53cc965f67c0306833b087e7c.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/b657159e6a28c801a211024f96a7ef60e388ce928a7b41ae3d7555a6f8fd2e3e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/be6bbc6cd15ba525790075252ba0ed0b28dae5cfbfa118c00dfb9ea1ab95e668.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/c1360e3cbe6b3dc8894bc66c359853854c2e5adeac9c7cd5ba63f5db448be601.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/c7983018dbf8e384ddf73191f526075bd0b29907061ab17642ecdc18ea7b9897.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/cea66f27ca60ea173ee0a2bcd91964dc2638eb5657250fe3aa5bd3e41faf8730.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d052be571a0f3ab69926951f3a4c9d63f05da2ca6d91e5963dd63e04ecb515de.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d162a993a60dd682c8c21dd111429d84d8d30413a000cf481cf98d06ca83e706.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d238c3d3d054911714ebe30dafc99e6ad13925b7a600ba9f8d532d0f515f3f5a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d9a98cfe2865a9bb0e94f35c735a570b0625b58f890a6b1f6e14fab2401f0af2.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/dc27ae954b7b8a13a9459d6ca6ef2997f662715ff5f5453ea0da169f141748b8.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/e3ff1fd41cf76668b8e1927c0c2e4056b63a293ebbd300a8f1b1d27d87786271.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/e45b7344d373b3ef4a94f560cf4e17b1eb3b8cd89d1e552fc9be11d6b7b546f0.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/eb14eb898224d5d81d1012bec54f2b79f9377dc60fa1d01e49b4c3e148292d77.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/ed0e0101a3d91a3a615f9e78ef36f7deb8bb0eab0f133241d621925d0b596599.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/f722e3a3b1f0a3d7b9f7d7c66c46d8c87245de5f8eece055daf95c7086f8c267.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/f76013aedfd810f136fa689a151024bcb942687ef42ae7edf1fd3513ac4e22c7.bin +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0547e63693282614673b13bade4c08eb772020757b131b7c80f2077873aab70e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0cf89e9b1824440d213c8e9e33fb357734b7241b4c7eedaba3df7f8306e05425.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0e01060e3a507ffff6461c50b5c565c71380a6a67d9760cdd7a09afd3e30b584.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0ef326c5cf5292cd15b48b851460ee8156f51e0a5b62457c8f1f3c53c41665a3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1112ff4a3f69db3b62c6d2d6ae021e7c43ce0ca1feb1d3130376881decb3c6b0.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/11357cb8a0670fdc9a03780dd79a31e0aa7a0537786cbf66491bae1722d6feb3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/11dbecc73bd343c375bd4b79db8dbda2272e76a6b8426ac29e90f2b1272ccfc2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/133f639cfa837bc5da7915121c71fd32281660c2aaa0248bd59bde47e7faf8bc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/16812a090136b6678633aa4db03e4187920ae0aca776ad6da373c600cd341972.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/17e63980d7934cfe1d2823d78652af338fe9f0c2170106cd4506a2c4e7f4716f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/199224cafc86904bdefec8f01d131d7ca3e076a22b689bfc6a26dd20373cf286.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1a5c8cf223a2f64715ea5eaf14d97a0131f9ebdef4388dc4823dcfa57817724c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1b0ec09ad6718149d7ca514136cee09b04c96425f03af0559fd097112aa0daa5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1e5024bbb1284b2ed39bbca2d0ade3acb5be2a2c6ba643291f269b76098c7f79.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1e7635972e13468ffcbb1608f1d12559b066b4533912be2c35e3db07fd4a679d.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1f03db3a38a21b8d4d02f8ede30e1303cd8d4c426815326a88f45a268b17a492.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/2624abb7bf45618be40f8c3221445179fca44f7321baff415fdf7ddd5e0afc6f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/27fc3bad6db6e2b5ade5d242867d882362482ddf19c647edef821afc27d52dc2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/29959bdb5b04a9180e88ec1ed976bae55424d3dc50985f13c0f85bae11ae79ee.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/308cbce2b1b6360f9a2dc275d0bc28be1966fc3ff5e0a58844405ba867f3f668.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3674d7be969755aaffa368e57b8d1bb743bc98e766a57948859d54fdc7d2c066.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3736ca95c9c40b30e21302ae6c89148d8ac09264dfbb7e5764b08c265a73ba3c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3bc90e1dc9411d249697e4ec352baa4886f91cacfe4940ac43aed879f60966c9.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3f519c7c7482307cae908b27602dcb7716e2da4b651eff39c4c37103998d18fa.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4767636d5554b60c94b447b87b77fc1456a2b9af42bfe08585389d27f306dd5e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4a3242773b3a73a73ee746a0cdf30c8d6d904bb4406dfdf9822dcd535d6ae308.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4c7bf3788cba151442d85c3f76553c2e356edf8566ae8243d0a535c9bcde51d0.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4f3b9f4c818ed6d375947e9603dd058c539e14ff05aa193fb5054d899dbb82a2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4fdf7ee67d12de1cd30c3c2bbd9409032dcab5feb3a7d3977b92c50b1d161afe.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5821f33aa00e9acd2f4c0a29129978ee7006a879d163ce1463ae476031bfabcf.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5a986c3e44fc686a2efe7648c3945bb7b51cf303918381383f21f898dd312cad.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5c32fc1de6d198ed606d3e8c3264319acdd950dab18e8b723fc6332bf2f56aea.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/602ce4e8b00a0afbc1a894b65641e48d362ec834a559b9d97a4801473bb01da7.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6180f9f96167522d8cab4de1d52598cecee8d7ee042f48e41669c98cf61c19c3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6205973ba63f7a554662ba05010d25131bed2d9656de422e2067ca54709d5b3c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/693e556f2165232e8a38b1b2d68676f235ece5705c564992cfa7731426f4d376.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6a46175438bec5527c281b577bd220b6badedf3c74266b997d39e596f83b8853.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6ca1bcad7ea053a259b7f9fc5a7ec388a4cd29d44391d93386ea8b1143d94c21.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6f9bc99656b611890d6acc76ee416f6222ca2d5f62167840b4216a21e020a4c8.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6fb1e7857996662233ab5314fc13f8aa30703f91c04542e352ec17f9dc4fc054.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7028ec39712143a7e9d09d2e1477282b654d0470102ca9d272ac82b23604cb21.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/73af65ac86efa61099178f3e7075dcd26d389ee9b9aa3546c18dede10c3dfda1.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/73b992b71bd3165ff7701ab1430c075cb5ba9b74e6363d24640377b1011ddc93.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7471261d4df59979ba41a622d93779b66ebecd50353ad433862e603ee65f8748.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/76e9a3fcca962c2f900cf79dc1a0851840bd405dc11231f629f784adbcb69d23.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/79d2d29e8cd8b642386b5f31429b39bc4d6f13e53107dda00ebc463abf80c79d.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7de66fcfffe4ff108510cbe6bebec44e28ab4b78e98e9c1a38466db5b81881f7.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/811fa798cb81ea99488db98e3d3ddea815aac8f6e7493ad04d0176f603978678.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/89b277f1636be220ff5658ff1f1c62efe14079d6e1f42efb373fbf0246801533.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/905c5fe666d9f6174e987382e47d3f325c5696cf8792d7a4a1dd120a438b8270.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/90efe3e05370ee853c0130b98ee82f00b86f7c7104e96b094715187fa49ac16f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/968a7c5cb13014bce00a29d43b344bd6943ff00ae2908abbc6b40a994f1172a1.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9a955b4e69dfa5b38f071099053c1a3684cf85ec2d346420de2853c61768f8cc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9da2781216a2e482dd8a6ada5ebb43bcf48e0169430e787ac277559cb2ade19a.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9db02aab14a3b52463deadefbf4ba771809941e7fcb137c905955bdc80ec23bd.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a3fe1788cf5d7f260249c722f0e0695a4d55744d1b14be44122377147a296256.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a5c75af8f090d3c95fa46d2be49be5031138d7cd1bae234ae028edf717bf299e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a771abd40bd337a464c1bd19f841b62e290124faa89b19ec50e85ab36bc740a5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a94a2ad2ed463a47cdda117df25b06b3cf6be37ddac08594bc5f5d76c7237730.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ad434e4a6490e495994b25f7574a5847a9f7d9c2ca5a2b229a9dfdd2e5e2bb72.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/aeae7b05404b852008a7897689e58aacef44a2c3bc0e87d2519ecdb4cb1e3ff5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b0c0c8a4985f92be3b358a8e703c67957427501882aeee05b4ccd3c7880930d4.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b25174c3cd13eea6e1d9c3104ee5197dc6330129b2f0f7676e8a429900999d9b.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b3eecdec571df96338edf690443394ff859383b4c94f4cf33d42c240006f8543.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b7aa0c61ff9e7411535c7b7b8e587849a92bad00d431171ab16ad47d55db0a53.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b9deef944c22331bc05220d1d6e46412e3cb1246ef041a4405d0cbbd90c2d624.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ba9376e4ac39b809133ab717edb4c88b5219118766db492d7c97534ce119c2ec.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/baf338e9c272158b905fb58a712e29410c657a45be2764f1c6c43ca87fd1db48.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/bd442ac9fbe52b9f2e4ba586670017c3f2d9fedf1cbdec77ef24e9f8b3a183c8.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/c142adcf253be43b66f23ede8cea1e8fcfa256ebf53054a1068ace04745718a6.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/c6d7cbdc4b2ee9d416edf4d736a4f374f08aea98ca395ad371a50a1853744cfc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/cfb165a7675d15cee2c490b31095a58f73bace50ccc1e0fdf2c8dc4400f1df27.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d40f2ee59612473e9f687f17a0e203fdb4ba54c7185b05a8d81a433b04f24134.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d50ce95411156a6b6cf386aefa5ee58db659811813f74be74f323e7c5795056f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d6af418bbde39b4fc7d22a61401d416be7a3fc1214ea2d3f42b4549c392d22ca.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/de7222ceeb1f72693dfb7fd1f343798659e03772d77f2b498fd8ebece2d5550a.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/e26975b198127ac3b6b4f5c4bc08ad47d6691398feee777743285391cd36d502.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ea428490cd5f2672676a2776a598b819b08246871e76de94b7196f9643144986.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/eb96567a266d24be188cb5b08021112f2fad311cbead939d53c5565da11f6265.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ecf66230bf7b68050c0827c2e4caf3de90e46859d291b794faa0dd3816d9dac6.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ed8f067763a4a8adb83d80c8324b2a9668f1061f5f5352f21295e6cc5132386f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ee507a38772865467736d370791fe73c6aa4d83fe3e7ff4baa156b9cb2894c1c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/eedc5b62dc6f27d4a089e9f5b282f626129236d3f1689b001e04f8748bf8859c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f4119b9c6c23435619682b5d247743459e76584b9b0d6c5cb689d8e156906695.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f576047267a0bf9bd4bfc47072ea3d11066345b839953546292da678d1cb4722.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f8cdfb11997d4ccabea88bcdd3924cc8b621b33618b18fe5fbfd286edfc1d87e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/fce95ecc5db24c903bd46f338e366e2715411465a5efac180e2f0f46397e59de.glb +0 -0
- package/corpus/brasscap-mesa/blobs/image/0579557f9344df6f2c4b1225e6252e53ab86d417a4c9b504b5c714a08a388e47.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/image/9e18816a2ec16fbbb1f00f4a39c73ac2cbf6a8cdc17b4c96b1eba4cc9a754dc7.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/image/eb453c71cfb1f9441eb00b32281f98e226e49d9dcf75c231455575fcdc652222.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/json/e0072ed82115c519b891f53a194ea3b28fff7d3826d8ddf23460d6f21b7728d9.json +1 -0
- package/corpus/brasscap-mesa/blobs/json/ffb0e08eaaa7188db1f55931c9b6330937316091cc7463ed2eff6767bbfa33de.json +1 -0
- package/corpus/brasscap-mesa/blobs/wasm/1d6ace79610c4d510b60ad0c52915e42b57797d91f1ef292f60d8a3daec03dd6.wasm +0 -0
- package/corpus/brasscap-mesa/blobs/wasm/24a4d4c1292677b1c984b5c0d3497ae2929528bf511df475f80cc20945bb08ec.wasm +0 -0
- package/corpus/brasscap-mesa/blobs/wasm/b86d8afcc269fb063ebf64768fc3787635b65a7409a571115b07be2e4da39733.wasm +0 -0
- package/corpus/brasscap-mesa/cook.json +1 -0
- package/corpus/brasscap-mesa/mounts/shardfiles/brasscap-mesa/discovery.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/creatures.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/crowds.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/species.json +1 -0
- package/corpus/brasscap-mesa/sections/audio/audio.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/encounters.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/items.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/strikes.json +1 -0
- package/corpus/brasscap-mesa/sections/economy/ledger.json +1 -0
- package/corpus/brasscap-mesa/sections/economy/loot.json +1 -0
- package/corpus/brasscap-mesa/sections/look/look.json +1 -0
- package/corpus/brasscap-mesa/sections/look/materials.json +1 -0
- package/corpus/brasscap-mesa/sections/quests/quests.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/client-scripts.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/hooks.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/plumbing.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/scripts.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/sim.json +1 -0
- package/corpus/brasscap-mesa/sections/state/migrations.json +1 -0
- package/corpus/brasscap-mesa/sections/state/state.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/card.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/compendium.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/level.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/ui.json +1 -0
- package/corpus/brasscap-mesa/sections/world/collision.json +1 -0
- package/corpus/brasscap-mesa/sections/world/days.json +1 -0
- package/corpus/brasscap-mesa/sections/world/edge.json +1 -0
- package/corpus/brasscap-mesa/sections/world/movers.json +1 -0
- package/corpus/brasscap-mesa/sections/world/navigation.json +1 -0
- package/corpus/brasscap-mesa/sections/world/props.json +1 -0
- package/corpus/brasscap-mesa/sections/world/spawn.json +1 -0
- package/corpus/brasscap-mesa/sections/world/terrain.json +1 -0
- package/corpus/brasscap-mesa/sections/world/tiles.json +1 -0
- package/corpus/brasscap-mesa/sections/world/traversal.json +1 -0
- package/corpus/brasscap-mesa/sections/world/water.json +1 -0
- package/corpus/brasscap-mesa/sections/world/weather.json +1 -0
- package/corpus/brasscap-mesa/shard.json +1 -0
- package/corpus/brasscap-mesa/validation.json +1 -0
- package/corpus/handwritten/blobs/bin/027822f6ae9c374ce1ced851f2227cb9acb03077e5cc6b7fecb245c31f021abd.bin +0 -0
- package/corpus/handwritten/blobs/bin/0377ce182bd604bcf4d501f14bf954c434ea64ad856ad9d71c502d1045612703.bin +0 -0
- package/corpus/handwritten/blobs/bin/05ad93d239eeeb5d9afa09b00d90c56098d88e8850e5b5e691fcaa7520dec3cd.bin +0 -0
- package/corpus/handwritten/blobs/bin/0c8980141e6e394ea473df1eb11c347ba617a1a9a4b39b3fa1871b5d15b97d87.bin +0 -0
- package/corpus/handwritten/blobs/bin/14eb11f8d809320e0a68b1edea7837d7a5b4a3da71f1ce4f54068e0afe0b039b.bin +0 -0
- package/corpus/handwritten/blobs/bin/16590066c039ac71e5038a9866a53ccb95e21af13db29cb655b379c4fcfef7bb.bin +0 -0
- package/corpus/handwritten/blobs/bin/1795b5147ad52482445d2414ee22823b947c43a917b6e96fd9ec017f17000912.bin +0 -0
- package/corpus/handwritten/blobs/bin/18f2e24ecc1ed1b1d12ae1c89732a5a1a618ab6e973d4ff0332cf9ecc4e4f4a6.bin +0 -0
- package/corpus/handwritten/blobs/bin/1a18ade01095f1a9ebe75650127861ef27dda0bb17c2b91bde057ec88ef2e98a.bin +0 -0
- package/corpus/handwritten/blobs/bin/1dba017cddb874bc147efb00c55418846ffa344a696f4df702bbabeea55034d0.bin +0 -0
- package/corpus/handwritten/blobs/bin/248c703537e4687ddd2b69a40d1ef3936da718626289d6867ce0a6866f562ba4.bin +0 -0
- package/corpus/handwritten/blobs/bin/2612d9fd4727f8c349f2dbfb7b1650bb7a752d0798a4966ac22cf2b6cdd9fcef.bin +0 -0
- package/corpus/handwritten/blobs/bin/28c54c766e90e3b046a2377b9fa015b0ce45cf3da4420f2b10553251f86c06aa.bin +0 -0
- package/corpus/handwritten/blobs/bin/30866b4807b12579f50218f6525c3db00919fbd43c97921daf47b3244b25dca6.bin +0 -0
- package/corpus/handwritten/blobs/bin/3d14fae85d77406a9b8c59f2e973cdae9587d49108ea92fb460679ca860196b8.bin +0 -0
- package/corpus/handwritten/blobs/bin/3f2201a53c441abcfb52089fe9bbb01f26fac8744099d3fb6668452885c2fa11.bin +0 -0
- package/corpus/handwritten/blobs/bin/42f270a99367fc4cc901518ccaa344ab595e265f113be944510da745c11f69d1.bin +0 -0
- package/corpus/handwritten/blobs/bin/43fd4327fedd51a586684ac611bcad4a8b9d62e51e03967de71fb42c9bf0f6e1.bin +0 -0
- package/corpus/handwritten/blobs/bin/484adda0898a881b6f095dad447f6a619bf0933f65efe940b72f1ab7f3630c22.bin +0 -0
- package/corpus/handwritten/blobs/bin/4a38cd49e8797429ce76265c3d8972195d5b0a02a35fc05fc513eab11240f415.bin +0 -0
- package/corpus/handwritten/blobs/bin/4fe636237bbbd4f836b0816bc61702f4c224d4cb91fbd94f244c731e24a1b945.bin +0 -0
- package/corpus/handwritten/blobs/bin/51b1cff782dc7ebb382bc429ee965023d4cdb52c7b3e37d6ffff5ef55c1c2813.bin +0 -0
- package/corpus/handwritten/blobs/bin/52561f02071ecaa98432fab5e8ece407a8e8f733a01f8eb7c543d1efe02614da.bin +0 -0
- package/corpus/handwritten/blobs/bin/556d6333923afea9641c4738741a41d6a46ae28a508288b9a49a749a344c1398.bin +0 -0
- package/corpus/handwritten/blobs/bin/5caeb97f32c7f31e1029eebdf31131f879f781bb5e3a225206a646710d83fd75.bin +0 -0
- package/corpus/handwritten/blobs/bin/5d1131e42a045083225105b640ff72e02c7f353ee6285545ac264d01bea26b1b.bin +0 -0
- package/corpus/handwritten/blobs/bin/5d80b30eee9f8342a92f6756fd0d84fb9d2d2ce994d222627641e584ad45d2a8.bin +0 -0
- package/corpus/handwritten/blobs/bin/5e0f9f7f2a85abe11a0a61ede853c9b9942b4494c3eb9943785cf6ae221e40e3.bin +0 -0
- package/corpus/handwritten/blobs/bin/5fdc5485343bba8201185c9bae862ad8618498ab5ce63b53514e4e0226fa7bdb.bin +0 -0
- package/corpus/handwritten/blobs/bin/6623dcb0b31c9ca0be342f6dca6b9e607ec3c12ff82068fa6030c142c2df77f7.bin +0 -0
- package/corpus/handwritten/blobs/bin/6887131a04175edbd1989aa95e8749d1703e7f2d0b8464e85f6bad28d6964125.bin +0 -0
- package/corpus/handwritten/blobs/bin/6cf89771d998486cad9049e6f4fc177d742a18ad79fafa4596814ff9d3cf1952.bin +0 -0
- package/corpus/handwritten/blobs/bin/74bbb0fc219e8476cd5550014a357ee18abc981ff3fe787ae3e60d4593705ec5.bin +0 -0
- package/corpus/handwritten/blobs/bin/76784a7f519ac43ce113a0c9365881839b75f66f96aa009fe8d3c8ab539ef283.bin +0 -0
- package/corpus/handwritten/blobs/bin/79a2f693ee2da546bb551f8b641b9c3affd2b8bfb5632ed7f417daba9d900af9.bin +0 -0
- package/corpus/handwritten/blobs/bin/7b593b0f9eefb957fb9d58b316d9836971203038d7c8127284bba44ccb3090bb.bin +0 -0
- package/corpus/handwritten/blobs/bin/7bb8e518ca5606de78972a6c648b57623f8bc12d7e06b4bbf43c60ac419a9bbd.bin +0 -0
- package/corpus/handwritten/blobs/bin/7c6133f3350147257fa501f41269cb77cb11d8ed96d351e873333b079cee524a.bin +0 -0
- package/corpus/handwritten/blobs/bin/7f5acf1893828995256f5b2c54948f80ba21e53de72db26ea72ce2479f5b0682.bin +0 -0
- package/corpus/handwritten/blobs/bin/836516253cf0f3e6e79537609fdbe6331c8c5c974f9ec4d3fbe4a7db48cf123d.bin +0 -0
- package/corpus/handwritten/blobs/bin/89900344f82d5c1474d2a163f8d29903447bac64e9c9775123ef499be70c2380.bin +0 -0
- package/corpus/handwritten/blobs/bin/95d76a9273c3edd98b3643c54e2e7989800bdcaf6f815230ef09f601e760330f.bin +0 -0
- package/corpus/handwritten/blobs/bin/a7b5a5fe053a38c93eed899bde5051cddd80e0a3f3c82b6fd814869097f0944b.bin +0 -0
- package/corpus/handwritten/blobs/bin/b29be84df0bfd1bc97a1464fd5ea068130947bfed3328e167640c81326eb45d7.bin +0 -0
- package/corpus/handwritten/blobs/bin/b6518dc352be03332a256f1cd9d1149da262fe6829e87ba43364f19c687ca7c9.bin +0 -0
- package/corpus/handwritten/blobs/bin/b7edb8095beeb158adb61ae3caa1653773757afbcd8fb2764c94b975a43fe9e2.bin +0 -0
- package/corpus/handwritten/blobs/bin/b86d617ae7fa397df51ff7af87cd89fa113ac19abd3840ea8f3a086d6c82905c.bin +0 -0
- package/corpus/handwritten/blobs/bin/bb860b5c67ee7f2fafd67588822152228d6f6c9de1231123eeafa4844732b18b.bin +0 -0
- package/corpus/handwritten/blobs/bin/bf8c3971bbb224075d488ffa9cfc20e322c61f9ca0c59c356838415f6778014b.bin +0 -0
- package/corpus/handwritten/blobs/bin/c2edd52ee14ebdc9fcc01d38c15d6ab3379df7a20098c260c546551898959cd1.bin +0 -0
- package/corpus/handwritten/blobs/bin/c3de13c551c5b45270143dcbb9fc9a31651f6012355823c0709c2fe6cafda940.bin +0 -0
- package/corpus/handwritten/blobs/bin/c57a8d9da18b1289afd16de00dd1ec75027048b8dcf7dd218da36bc3276ff035.bin +0 -0
- package/corpus/handwritten/blobs/bin/cc2975c9dea4c31b1bf380623a8f44059423004653f9cae4f603d374174323b7.bin +0 -0
- package/corpus/handwritten/blobs/bin/d476abba2e1c63ad3c7527617559173484ee837a5be2744d968466d5527c286b.bin +0 -0
- package/corpus/handwritten/blobs/bin/db242f89115c878cf0c3b976a1647e9cdeb6a1a51813b1dacaf1188715603294.bin +0 -0
- package/corpus/handwritten/blobs/bin/dcc4b9b3bc4ca777d11c494ae5478f17ad7cf2efa18dcba30def872d55355bc3.bin +0 -0
- package/corpus/handwritten/blobs/bin/dd99da483f385327d6b8319d6e2e9000b580280069353718aa0fda2230707e8b.bin +0 -0
- package/corpus/handwritten/blobs/bin/dfc139dba26f1789e16f72602e654636f2d99bcd41e3f10454da74b3a6a64dda.bin +0 -0
- package/corpus/handwritten/blobs/bin/e15ab3cc9f60657321cfe8d9751e086f025734f4e7068271e0baf6066a686f18.bin +0 -0
- package/corpus/handwritten/blobs/bin/e16a83a71213db6f804ce1d53981a2308062752c85c440022d9eeb7605fd37c8.bin +0 -0
- package/corpus/handwritten/blobs/bin/e7355876487f660ac9f25c9d9dfcd66eaf432e1e1669eb89d12ce8267a8d3e86.bin +0 -0
- package/corpus/handwritten/blobs/bin/e81a632e2da0f6a4d801f18aadfe2c6e640401cc1178935a9099ebb8e3af6cc1.bin +0 -0
- package/corpus/handwritten/blobs/bin/f0721c60d0b1046579d8c587fac8482a70822f0b39a85f9acc0cfc31f82b7dd2.bin +0 -0
- package/corpus/handwritten/blobs/bin/f301cf574de6d84030f839098ca44705dca115f9d3e4ee848e0b35fff3deaf77.bin +0 -0
- package/corpus/handwritten/blobs/bin/f7797f295a7570c437bf7020a1ddf208fea2a7aab595333320a6396c1608d360.bin +0 -0
- package/corpus/handwritten/blobs/glb/08de0bb2439ac812adef528b4b073bdb954bbeada972a2f3afb1757bd0540396.glb +0 -0
- package/corpus/handwritten/blobs/glb/153681171c35d2898569324e21ebe734b8418d4122833618a1e64ea326be1e5e.glb +0 -0
- package/corpus/handwritten/blobs/glb/1df5ce0b6cae72ec4cf3c41510681ba70ebb474f9745d536ebd4f03e8fc82de9.glb +0 -0
- package/corpus/handwritten/blobs/glb/262031e2fa710bd8d586eafce1019ca1434a2170e407567741aac1d99fc9c5ab.glb +0 -0
- package/corpus/handwritten/blobs/glb/27466efb180fb5b5074b40e424bd0b8d78f7ff0f5f3663748e014daeeeb5bedd.glb +0 -0
- package/corpus/handwritten/blobs/glb/2d2f6d00a14c89a4efb7f679b371118f564f258797ed8b8b42baf4ae60902ea6.glb +0 -0
- package/corpus/handwritten/blobs/glb/31f327d215ed7ef422e2169172f3869769e9816c9da979616844081e74f2eb09.glb +0 -0
- package/corpus/handwritten/blobs/glb/3bfe0e9ca18077ffee9c284ef40fed9f2fc354f7495612c785a6f980b5966559.glb +0 -0
- package/corpus/handwritten/blobs/glb/3db43042b3eeb1dee7ce9de1cc00322cefc348aa18c37d168b0858e6af6ca7a4.glb +0 -0
- package/corpus/handwritten/blobs/glb/46460a50da44fb8e792b48a646ec9ce025bb309d315dbcf67d2e9598591750de.glb +0 -0
- package/corpus/handwritten/blobs/glb/4902213556fedaf269fba6f0f195e424b2e49973ab45dcb8b69e34d253d9d8ff.glb +0 -0
- package/corpus/handwritten/blobs/glb/4dda463c9cd4bf339e5611871d4ba2fe16fe1487389a88b2888e96bc55e45d93.glb +0 -0
- package/corpus/handwritten/blobs/glb/4ed23469bd2b6b73183564cfc80a1ebcd0ffe2666a90a556752af0ca147fd2f7.glb +0 -0
- package/corpus/handwritten/blobs/glb/4fe74a1bed6b67129885b90cfcae01b5ca82e23e6d40507e280f02fca7fda54f.glb +0 -0
- package/corpus/handwritten/blobs/glb/50521bb3a50cc7199d324a0b25bc167c2e9d69770cb500490428efefc81ce3ea.glb +0 -0
- package/corpus/handwritten/blobs/glb/5ecca36d1e503edc092af0ef42f139cdcad99b8c2008318eb6ad337023d57296.glb +0 -0
- package/corpus/handwritten/blobs/glb/60fc036925852568cdb1b9fb85218dc43a8bf2ed86d3971a221ad942ece203a7.glb +0 -0
- package/corpus/handwritten/blobs/glb/611633cee0e5822b744486e6dff5414ad5b159eaabffe1c0ba0bb68be794bfa1.glb +0 -0
- package/corpus/handwritten/blobs/glb/67c7f983a0bcb9f84425378acac121a53f30795dce3181643bc1b763d0ae80b5.glb +0 -0
- package/corpus/handwritten/blobs/glb/6ecc0d307030943727484b49b1872643479c55ccc92252fca06e9e3cbe98fa90.glb +0 -0
- package/corpus/handwritten/blobs/glb/774b366df4de56cb6f9e3c904f02ec98016ac2ec489dc9e214b09220fca2f8e5.glb +0 -0
- package/corpus/handwritten/blobs/glb/785bae514ffc029e611d602259db7d37cbef589409a0814b9d37175d8b6c0a45.glb +0 -0
- package/corpus/handwritten/blobs/glb/79e79524efb2830e90af3c945c5b36ef07c1a38f2da2958112203a99eac52a16.glb +0 -0
- package/corpus/handwritten/blobs/glb/7bebdcdaf0be30d9f8d21bde72af68c32d825d12dc668f48109223ed7ff71c9f.glb +0 -0
- package/corpus/handwritten/blobs/glb/7d8b5ec9326a11362b3f9fa3409cb59d11b99f549cc304319c63c1ec55cbf5ab.glb +0 -0
- package/corpus/handwritten/blobs/glb/82e886f826315e4bf962363165fadadd3d93f85132c1909095045e0a7ccc0b34.glb +0 -0
- package/corpus/handwritten/blobs/glb/84b4ef190c3994ae7ca1b1f7a936526d1d20ad7deac13f949e3fe6bb7ba139ed.glb +0 -0
- package/corpus/handwritten/blobs/glb/85b7153e943fbe8c659bd6e4b323511dc6f6e2c7a3a1185e7a9a29ea6ddfdfa6.glb +0 -0
- package/corpus/handwritten/blobs/glb/85cf2d2be91cedbaf454ca42ad53c0c17b311088528d274695dbcea490d6c684.glb +0 -0
- package/corpus/handwritten/blobs/glb/8662b4cdc626c61a45e63f71dc866746c083cd0d4644b817a373105f936a7047.glb +0 -0
- package/corpus/handwritten/blobs/glb/8a4d33bfbb17d865e5deb0a0bdf3de67fc2312950a7568ed2635c22fbe4b1ecf.glb +0 -0
- package/corpus/handwritten/blobs/glb/8b11171d41c9027411ca8b87797d9ec70355471bdd3a247c114c49b8b781bbd9.glb +0 -0
- package/corpus/handwritten/blobs/glb/9026e1c4f0250832b69a989e69fe3071e5cad72adfe9c22ce11c409b18bb3357.glb +0 -0
- package/corpus/handwritten/blobs/glb/945b946f17b6393ea040230641c3083678bb6ab42e1d7239aeb9c950d0e7d5bb.glb +0 -0
- package/corpus/handwritten/blobs/glb/9afab455d603f1f8a38074c5a6cbed26d7d7f2cfd8a531820bd165d4b37399ee.glb +0 -0
- package/corpus/handwritten/blobs/glb/a6d702fb1be1095517625bfb2a2383f5f9638775059fd7e0d093d2044651b848.glb +0 -0
- package/corpus/handwritten/blobs/glb/aae479c2f99848998a1b499bbcad815d971349c2442bc363786aef63baad4337.glb +0 -0
- package/corpus/handwritten/blobs/glb/b155bd41f260d5303e293d691b657e0fb9b9c8b2f8aa589a0187061baa033eb7.glb +0 -0
- package/corpus/handwritten/blobs/glb/b1e8b770d99e8ca4396f21fd512f632c587149fc13db69deba388f702a46982f.glb +0 -0
- package/corpus/handwritten/blobs/glb/b382c318a5baac35da59a7b99ebaad6992e30c4bac327e85851ce0b2f89aa58b.glb +0 -0
- package/corpus/handwritten/blobs/glb/ba4478198696802808262af9bbfc224fe37e24e3f8c13de91debc87d3e1a9d41.glb +0 -0
- package/corpus/handwritten/blobs/glb/baf02cd967d1bf3c6a2ae878f4ca4ed34d0c39302ca2b8b6e3560a4e87b5c16f.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc14dd152815ea6ed39458dcf89f2d69173d61d6e2b57be99d31ce2da64ccf67.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc4e4d3bcf7ace855183efec0fbf242d444a32714d8b2fd8a45fa7b539ef2c73.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc53475e2aa2fc9c2c0574b36a449fd57259c462d771e2b360def5c338d37c26.glb +0 -0
- package/corpus/handwritten/blobs/glb/c35d9e50f392c29f2587e3a6eb4f21143ba08e48d76a53b9de62d3b5be46c1a5.glb +0 -0
- package/corpus/handwritten/blobs/glb/c6911e059d3ac6aea75bc0ad3dd8b220704bfbba8ba98b57705e7aa3ecbe0050.glb +0 -0
- package/corpus/handwritten/blobs/glb/c84d88b6ed878490bcf9fa985b5e6a7a683de8ee7808ee4151a3b6a898fbe4f2.glb +0 -0
- package/corpus/handwritten/blobs/glb/c9d5d02ef0e38ac2898d3e6ecbc2ea0a6d2bd04531118550ab54b5e83293d7ec.glb +0 -0
- package/corpus/handwritten/blobs/glb/cd9d04e361e4c3d0aeb82f8682d71114ff8318b8fc4980bccee3c5e5c16afc27.glb +0 -0
- package/corpus/handwritten/blobs/glb/d32499928422a0cd1a32b1afaeacc31d2d84d74876f6805b36218dc04402a921.glb +0 -0
- package/corpus/handwritten/blobs/glb/dc7ea629fcddeba445599d73a5d721f4d5004e056c3c140baa3e6817393c6462.glb +0 -0
- package/corpus/handwritten/blobs/glb/dce79b59c85ca5a7f9fc25e585d253b15558f8f5d8497a76923c9071601de8b1.glb +0 -0
- package/corpus/handwritten/blobs/glb/e7fa1b02bae6c8d19ace0e8db44810beab9a1be9f8172d5816324760267d6d11.glb +0 -0
- package/corpus/handwritten/blobs/glb/eb664feed0fdcc3ac73cecbe737109994fe5dfad8a33997de88598965fa936ba.glb +0 -0
- package/corpus/handwritten/blobs/glb/ec6a771ca852b0b69e55a12df9d347384d01e611c8c6151ea771910f1601605d.glb +0 -0
- package/corpus/handwritten/blobs/glb/ede05013f575b4216d2b4b3f8a14d611ef28756f952f702bb169529c8ab02eff.glb +0 -0
- package/corpus/handwritten/blobs/glb/fec21fa96950340a1a031b31b37407468361ab0a7645c683e0d7773c18591a26.glb +0 -0
- package/corpus/handwritten/blobs/glb/ff21ea082bb00b01006900e7dbbb85220f31f45c144405c840a70872f9e09cb9.glb +0 -0
- package/corpus/handwritten/blobs/image/248fe9601e921305ffb35421414bc5f03e9f1b3dba15bf9b5c3387d8f255da17.png +0 -0
- package/corpus/handwritten/blobs/image/4b47420aff1ded28c9c6cf1eb92d6e2d7b01d057f2654654405445ff8d562e55.webp +0 -0
- package/corpus/handwritten/blobs/image/5dbc818ed0be692e6ba3df87898fd623280a2686eed5a538333e1325764b238d.png +0 -0
- package/corpus/handwritten/blobs/image/d5ae692911bbc2b60b5fdde239b70aad4ce9be0d7665c4a91b438de6077e21e3.jpg +0 -0
- package/corpus/handwritten/blobs/ktx2/df0dd2e8adc1d9479148bb198cb750471df454680cf0c9ffd6dc85d6262ed676.ktx2 +0 -0
- package/corpus/handwritten/blobs/wasm/ecc886d8bbebcf190298ff9162b6bb364f2125606f5bdc8cc220ea28044f96ea.wasm +0 -0
- package/corpus/handwritten/cook.json +1 -0
- package/corpus/handwritten/mounts/shardfiles/blender-template/discovery.json +1 -0
- package/corpus/handwritten/sections/actors/creatures.json +1 -0
- package/corpus/handwritten/sections/actors/crowds.json +1 -0
- package/corpus/handwritten/sections/actors/species.json +1 -0
- package/corpus/handwritten/sections/audio/audio.json +1 -0
- package/corpus/handwritten/sections/client/plan.json +1 -0
- package/corpus/handwritten/sections/combat/encounters.json +1 -0
- package/corpus/handwritten/sections/combat/items.json +1 -0
- package/corpus/handwritten/sections/combat/strikes.json +1 -0
- package/corpus/handwritten/sections/economy/ledger.json +1 -0
- package/corpus/handwritten/sections/economy/loot.json +1 -0
- package/corpus/handwritten/sections/look/look.json +1 -0
- package/corpus/handwritten/sections/look/map.json +1 -0
- package/corpus/handwritten/sections/look/materials.json +1 -0
- package/corpus/handwritten/sections/quests/quests.json +1 -0
- package/corpus/handwritten/sections/sim/client-scripts.json +1 -0
- package/corpus/handwritten/sections/sim/hooks.json +1 -0
- package/corpus/handwritten/sections/sim/plumbing.json +1 -0
- package/corpus/handwritten/sections/sim/sim.json +1 -0
- package/corpus/handwritten/sections/state/migrations.json +1 -0
- package/corpus/handwritten/sections/state/state.json +1 -0
- package/corpus/handwritten/sections/ui/card.json +1 -0
- package/corpus/handwritten/sections/ui/compendium.json +1 -0
- package/corpus/handwritten/sections/ui/level.json +1 -0
- package/corpus/handwritten/sections/ui/ui.json +1 -0
- package/corpus/handwritten/sections/world/collision.json +1 -0
- package/corpus/handwritten/sections/world/days.json +1 -0
- package/corpus/handwritten/sections/world/edge.json +1 -0
- package/corpus/handwritten/sections/world/movers.json +1 -0
- package/corpus/handwritten/sections/world/navigation.json +1 -0
- package/corpus/handwritten/sections/world/props.json +1 -0
- package/corpus/handwritten/sections/world/spawn.json +1 -0
- package/corpus/handwritten/sections/world/terrain.json +1 -0
- package/corpus/handwritten/sections/world/tiles.json +1 -0
- package/corpus/handwritten/sections/world/traversal.json +1 -0
- package/corpus/handwritten/sections/world/water.json +1 -0
- package/corpus/handwritten/sections/world/weather.json +1 -0
- package/corpus/handwritten/shard.json +1 -0
- package/corpus/handwritten/validation.json +1 -0
- package/package.json +511 -4
- package/packages/wire/src/net-command.ts +150 -0
- package/src/cli/bin.mjs +9 -0
- package/src/cli/main.ts +148 -0
- package/src/cli/pack.ts +262 -0
- package/src/cli/validate.ts +210 -0
- package/src/cli/version.ts +13 -0
- package/src/format/aacIndex.ts +160 -0
- package/src/format/accent.ts +35 -0
- package/src/format/achievementCounters.ts +22 -0
- package/src/format/actorMoves.ts +615 -0
- package/src/format/actorProjectionV2.ts +93 -0
- package/src/format/admissionControl.ts +66 -0
- package/src/format/admissionLate.ts +22 -0
- package/src/format/admissionLimits.ts +11 -0
- package/src/format/admissionServer.ts +30 -0
- package/src/format/ambientLife.ts +123 -0
- package/src/format/arenaRoomDocument.ts +114 -0
- package/src/format/arenaScriptRows.ts +107 -0
- package/src/format/arenaView.ts +30 -0
- package/src/format/assetAdmission.ts +279 -0
- package/src/format/audio-measure.ts +184 -0
- package/src/format/audio-mp4.ts +234 -0
- package/src/format/audio-rules.ts +271 -0
- package/src/format/audio-waiver.ts +55 -0
- package/src/format/audio.ts +463 -0
- package/src/format/audioBank.ts +37 -0
- package/src/format/audioProfiles.ts +501 -0
- package/src/format/audioRouting.ts +67 -0
- package/src/format/audioScene.ts +342 -0
- package/src/format/bakedTerrainBytes.ts +35 -0
- package/src/format/bakedTerrainSampling.ts +66 -0
- package/src/format/bakedTiles.ts +407 -0
- package/src/format/binarySource.ts +32 -0
- package/src/format/bodySlots.ts +90 -0
- package/src/format/bossEncounter.ts +354 -0
- package/src/format/bossProfiles.ts +709 -0
- package/src/format/bossSocketRig.ts +92 -0
- package/src/format/bowVariantRows.ts +68 -0
- package/src/format/brains.ts +252 -0
- package/src/format/budget.ts +214 -0
- package/src/format/buildings.ts +496 -0
- package/src/format/builtIndexes.ts +26 -0
- package/src/format/catalogueEconomy.ts +65 -0
- package/src/format/caveInterior.ts +225 -0
- package/src/format/cellBounds.ts +47 -0
- package/src/format/cellField.ts +98 -0
- package/src/format/chapterDirector.ts +193 -0
- package/src/format/clientChannels.ts +450 -0
- package/src/format/clientCues.ts +34 -0
- package/src/format/clientNative.ts +358 -0
- package/src/format/clientOwnership.ts +43 -0
- package/src/format/clientPlan.ts +306 -0
- package/src/format/clientScripts.ts +116 -0
- package/src/format/clientState.ts +273 -0
- package/src/format/clientTrails.ts +56 -0
- package/src/format/collectionDisplay.ts +232 -0
- package/src/format/colourFunction.ts +44 -0
- package/src/format/colourLut.ts +4 -0
- package/src/format/commonsCosts.ts +28 -0
- package/src/format/compendiumRows.ts +151 -0
- package/src/format/compendiumSketches.ts +23 -0
- package/src/format/completion.ts +83 -0
- package/src/format/contentBounds.ts +76 -0
- package/src/format/contentCost.ts +50 -0
- package/src/format/contracts.ts +305 -0
- package/src/format/cook-data.ts +148 -0
- package/src/format/cook-preparation.ts +241 -0
- package/src/format/coverAppearance.ts +53 -0
- package/src/format/creatures.ts +175 -0
- package/src/format/crowdPresentation.ts +87 -0
- package/src/format/crowds.ts +46 -0
- package/src/format/cueDirector.ts +134 -0
- package/src/format/dayCycle.ts +28 -0
- package/src/format/dayLook.ts +44 -0
- package/src/format/decisionBindings.ts +80 -0
- package/src/format/decisionPublication.ts +35 -0
- package/src/format/decisionScripts.ts +327 -0
- package/src/format/declaredQuestPage.ts +101 -0
- package/src/format/deviceMemoryCost.ts +50 -0
- package/src/format/director.ts +52 -0
- package/src/format/directorProduct.ts +27 -0
- package/src/format/directorStages.ts +165 -0
- package/src/format/directorWhen.ts +78 -0
- package/src/format/discoveryValues.ts +416 -0
- package/src/format/easedFields.ts +48 -0
- package/src/format/edgeProfiles.ts +40 -0
- package/src/format/eliteContinuation.ts +110 -0
- package/src/format/eliteEntryRows.ts +351 -0
- package/src/format/eliteFeature.ts +605 -0
- package/src/format/eliteScripts.ts +60 -0
- package/src/format/encounterRows.ts +1030 -0
- package/src/format/encounters.ts +65 -0
- package/src/format/engine-music.ts +42 -0
- package/src/format/entryClearance.ts +86 -0
- package/src/format/entryCoverage.ts +61 -0
- package/src/format/entryGeometry.ts +56 -0
- package/src/format/entryLanding.ts +83 -0
- package/src/format/entryReads.ts +45 -0
- package/src/format/entrywayAssets.ts +33 -0
- package/src/format/entryways.ts +58 -0
- package/src/format/exchange.ts +25 -0
- package/src/format/explorerCatalogue.ts +312 -0
- package/src/format/feature-sides.ts +233 -0
- package/src/format/fieldPresentation.ts +62 -0
- package/src/format/figures.ts +437 -0
- package/src/format/findsCatalogue.ts +67 -0
- package/src/format/fixedDraws.ts +24 -0
- package/src/format/flyers.ts +226 -0
- package/src/format/forestNativeInputs.ts +37 -0
- package/src/format/forestPage.ts +285 -0
- package/src/format/forestWeather.ts +333 -0
- package/src/format/geometryPack.ts +136 -0
- package/src/format/glbBuffers.ts +77 -0
- package/src/format/glbCost.ts +212 -0
- package/src/format/glbImages.ts +95 -0
- package/src/format/glbTriangles.ts +95 -0
- package/src/format/graphArmsRows.ts +200 -0
- package/src/format/grapple.ts +123 -0
- package/src/format/grazers.ts +164 -0
- package/src/format/grid-catalogue.ts +247 -0
- package/src/format/gridReadiness.ts +49 -0
- package/src/format/groupBrains.ts +249 -0
- package/src/format/heldArms.ts +576 -0
- package/src/format/heldEquipment.ts +78 -0
- package/src/format/heldFinishes.ts +415 -0
- package/src/format/heldGear.ts +68 -0
- package/src/format/heldJianDocument.ts +75 -0
- package/src/format/heldMelee.ts +866 -0
- package/src/format/heldView.ts +26 -0
- package/src/format/heldWeaponDocuments.ts +36 -0
- package/src/format/herdShelter.ts +58 -0
- package/src/format/hooks.ts +45 -0
- package/src/format/immutable.ts +59 -0
- package/src/format/inputDeclarations.ts +157 -0
- package/src/format/islandLibrary.ts +51 -0
- package/src/format/items.ts +229 -0
- package/src/format/json.ts +143 -0
- package/src/format/keyedSky.ts +314 -0
- package/src/format/kitFigure.ts +68 -0
- package/src/format/ktx2Cost.ts +47 -0
- package/src/format/ledger.ts +56 -0
- package/src/format/liftApproach.ts +75 -0
- package/src/format/liftRider.ts +10 -0
- package/src/format/lightEmitters.ts +105 -0
- package/src/format/lights.ts +135 -0
- package/src/format/limbCollision.ts +136 -0
- package/src/format/limbPopulation.ts +33 -0
- package/src/format/limbRig.ts +202 -0
- package/src/format/loadout.ts +156 -0
- package/src/format/look-light.ts +153 -0
- package/src/format/lootBag.ts +145 -0
- package/src/format/lootEconomy.ts +235 -0
- package/src/format/materialFamilies.ts +565 -0
- package/src/format/materialGraph.ts +1220 -0
- package/src/format/materials.ts +449 -0
- package/src/format/memoryAdmission.ts +84 -0
- package/src/format/memoryGates.json +7 -0
- package/src/format/meshCollision.ts +56 -0
- package/src/format/meshCollisionAssets.ts +19 -0
- package/src/format/meshCollisionBytes.ts +102 -0
- package/src/format/meshEntryways.ts +54 -0
- package/src/format/meshopt-decoder.wasm +0 -0
- package/src/format/meshopt-module.ts +177 -0
- package/src/format/meshopt-static.mjs +11 -0
- package/src/format/meshopt-wasm.ts +61 -0
- package/src/format/migrations.ts +209 -0
- package/src/format/minimap.ts +1052 -0
- package/src/format/mixedPopulation.ts +222 -0
- package/src/format/modes.ts +304 -0
- package/src/format/mountedSpecimenRows.ts +64 -0
- package/src/format/moverLifecycle.ts +34 -0
- package/src/format/moverMotion.ts +271 -0
- package/src/format/movers.ts +224 -0
- package/src/format/namedJsonContracts.ts +423 -0
- package/src/format/nativeActors.ts +45 -0
- package/src/format/nativeAssembly.ts +141 -0
- package/src/format/nativeGround.ts +37 -0
- package/src/format/nativeGroundAssets.ts +35 -0
- package/src/format/nativeItems.ts +184 -0
- package/src/format/nativePhysics.ts +140 -0
- package/src/format/nativeQuestComposition.ts +398 -0
- package/src/format/nativeRiding.ts +103 -0
- package/src/format/nativeRuntimePlan.ts +89 -0
- package/src/format/navigation.ts +99 -0
- package/src/format/navigationBytes.ts +111 -0
- package/src/format/nearPlaceholder.ts +111 -0
- package/src/format/nearPlaceholderAssets.ts +23 -0
- package/src/format/netCommand.ts +11 -0
- package/src/format/npcs.ts +546 -0
- package/src/format/outputAddress.ts +11 -0
- package/src/format/outputDownload.ts +34 -0
- package/src/format/outputFields.ts +123 -0
- package/src/format/outputIndex.ts +352 -0
- package/src/format/overdraw.ts +41 -0
- package/src/format/pageLife.ts +303 -0
- package/src/format/pagePreparation.ts +60 -0
- package/src/format/paintedLook.ts +55 -0
- package/src/format/paintedResources.ts +158 -0
- package/src/format/panelTemplate.ts +139 -0
- package/src/format/placeholderSource.ts +209 -0
- package/src/format/platformDataSections.ts +146 -0
- package/src/format/platformFileFamilies.ts +299 -0
- package/src/format/plumbing.ts +165 -0
- package/src/format/populationEnvironment.ts +210 -0
- package/src/format/populationKeeper.ts +163 -0
- package/src/format/populationProjection.ts +496 -0
- package/src/format/populationRespawn.ts +48 -0
- package/src/format/populationRoster.ts +158 -0
- package/src/format/portalFloor.ts +56 -0
- package/src/format/portalLink.ts +112 -0
- package/src/format/portalLinkAssets.ts +42 -0
- package/src/format/portalRide.ts +22 -0
- package/src/format/postGraphDocument.ts +36 -0
- package/src/format/postGraphLook.ts +477 -0
- package/src/format/postStack.ts +114 -0
- package/src/format/practiceCourseRows.ts +466 -0
- package/src/format/preflight.ts +155 -0
- package/src/format/presentation.ts +33 -0
- package/src/format/product-audio.ts +76 -0
- package/src/format/product-reads.ts +178 -0
- package/src/format/product-stream-admit.ts +100 -0
- package/src/format/product-stream-assets.ts +493 -0
- package/src/format/product-stream-facts.ts +208 -0
- package/src/format/product-stream-miss.ts +12 -0
- package/src/format/product-stream-node.ts +47 -0
- package/src/format/product-stream-packs.ts +242 -0
- package/src/format/product-stream-rows.ts +202 -0
- package/src/format/product-stream-tar.ts +192 -0
- package/src/format/product-stream.ts +284 -0
- package/src/format/product.ts +358 -0
- package/src/format/productValidation.ts +205 -0
- package/src/format/propMaterials.ts +254 -0
- package/src/format/props.ts +137 -0
- package/src/format/questContinuation.ts +42 -0
- package/src/format/questFigures.ts +227 -0
- package/src/format/questGraph.ts +30 -0
- package/src/format/questHost.ts +314 -0
- package/src/format/questInteractionSource.ts +57 -0
- package/src/format/questInteractions.ts +642 -0
- package/src/format/questPageComposition.ts +92 -0
- package/src/format/questPageFacets.ts +121 -0
- package/src/format/questRuntime.ts +118 -0
- package/src/format/questSteps.ts +182 -0
- package/src/format/questStory.ts +512 -0
- package/src/format/questStoryBindings.ts +43 -0
- package/src/format/questWorld.ts +36 -0
- package/src/format/quests.ts +333 -0
- package/src/format/rainPresentation.ts +131 -0
- package/src/format/rangedPage.ts +117 -0
- package/src/format/receipt-cost.ts +71 -0
- package/src/format/registeredJson.ts +530 -0
- package/src/format/returnProgramDocument.ts +40 -0
- package/src/format/returnProjectionV2.ts +84 -0
- package/src/format/riding.ts +377 -0
- package/src/format/riggedHulls.ts +160 -0
- package/src/format/roamingBossProjection.ts +178 -0
- package/src/format/roamingCombat.ts +22 -0
- package/src/format/ropeDeckSite.ts +148 -0
- package/src/format/rows.ts +86 -0
- package/src/format/runtime.ts +38 -0
- package/src/format/runtimeBinds.ts +49 -0
- package/src/format/runtimeCost.ts +80 -0
- package/src/format/runtimeSpawns.ts +73 -0
- package/src/format/scalarChannel.ts +38 -0
- package/src/format/scaledPost.ts +27 -0
- package/src/format/scaledPostContract.ts +51 -0
- package/src/format/sceneBuffers.ts +122 -0
- package/src/format/sceneDraws.ts +89 -0
- package/src/format/sceneDressing.ts +247 -0
- package/src/format/sceneInstances.ts +192 -0
- package/src/format/sceneMotion.ts +122 -0
- package/src/format/sceneRefs.ts +71 -0
- package/src/format/sceneSources.ts +730 -0
- package/src/format/script-side-grandfather.ts +62 -0
- package/src/format/script-sides.ts +289 -0
- package/src/format/scriptAbi.ts +14 -0
- package/src/format/scriptAbiV1.ts +56 -0
- package/src/format/scriptActionsV2.ts +101 -0
- package/src/format/scriptAdmission.ts +165 -0
- package/src/format/scriptAdmissionV2.ts +126 -0
- package/src/format/scriptContract.ts +170 -0
- package/src/format/scriptFuelV2.ts +124 -0
- package/src/format/scriptGroupBankV2.ts +54 -0
- package/src/format/scriptGroupStepV2.ts +165 -0
- package/src/format/scriptInputStateV2.ts +52 -0
- package/src/format/scriptLimits.ts +5 -0
- package/src/format/scriptMemoryV2.ts +17 -0
- package/src/format/scriptModuleV2.ts +116 -0
- package/src/format/scriptObservationColumnsV2.ts +226 -0
- package/src/format/scriptQueriesV2.ts +164 -0
- package/src/format/scriptQueryStateV2.ts +40 -0
- package/src/format/scriptRngV2.ts +52 -0
- package/src/format/scriptWireV2.ts +106 -0
- package/src/format/scripts.ts +31 -0
- package/src/format/sections.ts +140 -0
- package/src/format/shardSchema.ts +632 -0
- package/src/format/shardSections.ts +383 -0
- package/src/format/sketch.ts +79 -0
- package/src/format/skin-materials.ts +172 -0
- package/src/format/skinAssets.ts +107 -0
- package/src/format/skinData.ts +110 -0
- package/src/format/skinLayers.ts +90 -0
- package/src/format/skins.ts +37 -0
- package/src/format/socketLift.ts +58 -0
- package/src/format/socketLiftAssets.ts +81 -0
- package/src/format/socketRigCreature.ts +66 -0
- package/src/format/sourceResidency.ts +16 -0
- package/src/format/spawnCombat.ts +26 -0
- package/src/format/spawnScriptV2.ts +145 -0
- package/src/format/spawnScripts.ts +229 -0
- package/src/format/spawnTables.ts +46 -0
- package/src/format/spawnView.ts +26 -0
- package/src/format/speciesActorsFile.ts +86 -0
- package/src/format/speciesBookRows.ts +84 -0
- package/src/format/speciesBrain.ts +96 -0
- package/src/format/speciesLooks.ts +1021 -0
- package/src/format/speciesPrograms.ts +97 -0
- package/src/format/speciesScripts.ts +45 -0
- package/src/format/specimenCatalogue.ts +94 -0
- package/src/format/splatTerrain.ts +192 -0
- package/src/format/standalone-catalogue.ts +144 -0
- package/src/format/standaloneControl.ts +44 -0
- package/src/format/state.ts +61 -0
- package/src/format/stateLineage.ts +71 -0
- package/src/format/stealth.ts +106 -0
- package/src/format/stillImage.ts +135 -0
- package/src/format/streamedCover.ts +105 -0
- package/src/format/surfaceLooks.ts +50 -0
- package/src/format/tar-fields.ts +54 -0
- package/src/format/tar-paths.ts +103 -0
- package/src/format/tar-source.ts +13 -0
- package/src/format/tar-write.ts +152 -0
- package/src/format/tar.ts +203 -0
- package/src/format/targets.ts +217 -0
- package/src/format/terrain.ts +241 -0
- package/src/format/terrainTileBytes.ts +104 -0
- package/src/format/tierSelection.ts +195 -0
- package/src/format/toonLighting.ts +32 -0
- package/src/format/toonLook.ts +332 -0
- package/src/format/trail.ts +17 -0
- package/src/format/traversal.ts +13 -0
- package/src/format/treeSetRows.ts +93 -0
- package/src/format/ui.ts +90 -0
- package/src/format/uiStrings.ts +17 -0
- package/src/format/uniformRows.ts +31 -0
- package/src/format/upload-wire.ts +184 -0
- package/src/format/validationReceipt.ts +142 -0
- package/src/format/version.ts +9 -0
- package/src/format/vertexWear.ts +45 -0
- package/src/format/viewProgram.ts +329 -0
- package/src/format/voicePatches.ts +47 -0
- package/src/format/water.ts +247 -0
- package/src/format/waterWaves.ts +7 -0
- package/src/format/waterWorld.ts +34 -0
- package/src/format/weaponProfiles.ts +1315 -0
- package/src/format/weatherBundle.ts +36 -0
- package/src/format/weatherEffects.ts +78 -0
- package/src/format/weatherProgram.ts +422 -0
- package/src/format/wildlifePopulation.ts +210 -0
- package/src/format/wireLimits.ts +9 -0
- package/src/format/worldAssembly.ts +104 -0
- package/src/format/worldEntry.ts +151 -0
- package/src/format/worldPhysics.ts +292 -0
- package/src/format/worldSceneBatch.ts +106 -0
- package/src/format/worldSceneModels.ts +79 -0
- package/src/format/worldScenePages.ts +89 -0
- package/src/format/worldScenePlacement.ts +191 -0
- package/src/format/worldSceneSlabs.ts +43 -0
- package/src/format/worldSceneSurface.ts +113 -0
- package/src/format/worldSceneWeld.ts +702 -0
- package/src/format/worldScenes.ts +184 -0
- package/src/format/worldTargets.ts +111 -0
- package/src/format/worldUpdates.ts +229 -0
- package/src/hook/format-hook.d.mts +2 -0
- package/src/hook/format-hook.mjs +47 -0
- package/README.md +0 -6
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/** ABI-v2 query wire. Requests resolve local handles into stable identities
|
|
2
|
+
* before leaving guest memory; pending work never saves a transient handle. */
|
|
3
|
+
import { SCRIPT_V1_LISTS } from './scriptAbiV1.ts';
|
|
4
|
+
import { relativeTickV2,type V2Layout } from './scriptWireV2.ts';
|
|
5
|
+
|
|
6
|
+
export const V2_QUERY_OPS: Readonly<{ walkable: 4; path: 5; ray: 8; overlap: 9; nearest: 10; sight: 11; grass: 12; normal: 13; }> = Object.freeze({ walkable: SCRIPT_V1_LISTS.nearestWalkable,path: SCRIPT_V1_LISTS.path,ray: 8,overlap: 9,nearest: 10,sight: 11,grass: 12,normal: 13 });
|
|
7
|
+
export type V2QueryOperation = typeof V2_QUERY_OPS[keyof typeof V2_QUERY_OPS];
|
|
8
|
+
type Vec2 = readonly [number,number];
|
|
9
|
+
type Vec3 = readonly [number,number,number];
|
|
10
|
+
type Values = readonly [number,number,number,number,number,number,number];
|
|
11
|
+
export interface V2QueryBinding {
|
|
12
|
+
readonly identity: string; readonly handle: number; readonly observed: ReadonlyMap<number,string>;
|
|
13
|
+
readonly operations: ReadonlySet<V2QueryOperation>;
|
|
14
|
+
}
|
|
15
|
+
export interface V2QueryRequest {
|
|
16
|
+
readonly binding: string; readonly id: number; readonly op: V2QueryOperation;
|
|
17
|
+
readonly target: string | null; readonly atTick: number; readonly values: Values;
|
|
18
|
+
/** Detached points; only list operations 12/13 carry this bounded payload. */
|
|
19
|
+
readonly points?: readonly Vec2[];
|
|
20
|
+
}
|
|
21
|
+
export type V2QueryAnswer = { readonly status: 2 | 3 } | { readonly status: 1 } & (
|
|
22
|
+
{ readonly kind: 'walkable'; readonly point: Vec3 }
|
|
23
|
+
| { readonly kind: 'path'; readonly points: readonly Vec3[] }
|
|
24
|
+
| { readonly kind: 'overlap'; readonly bodies: readonly string[] }
|
|
25
|
+
| { readonly kind: 'nearest'; readonly actor: null | { readonly id: string; readonly point: Vec3; readonly distance: number } }
|
|
26
|
+
| { readonly kind: 'sight'; readonly visible: boolean }
|
|
27
|
+
| { readonly kind: 'grass' | 'normal'; readonly samples: readonly number[] }
|
|
28
|
+
| { readonly kind: 'ray'; readonly hit: null | { readonly point: Vec3; readonly normal: Vec3; readonly distance: number; readonly body: string | null } }
|
|
29
|
+
);
|
|
30
|
+
export interface V2QueryReply { readonly request: V2QueryRequest; readonly atTick: number; readonly answer: V2QueryAnswer }
|
|
31
|
+
function operation(value: number): value is V2QueryOperation { return value === 4 || value === 5 || value === 8 || value === 9 || value === 10 || value === 11 || value === 12 || value === 13; }
|
|
32
|
+
function finite(value: number): number { if (!Number.isFinite(value)) throw new Error('Non-finite v2 query value');return value; }
|
|
33
|
+
function uint(value: number): number { if (!Number.isInteger(value) || value < 1 || value > 0xffffffff) throw new Error('Invalid v2 request id');return value; }
|
|
34
|
+
function bindingHandle(binding: V2QueryBinding): number { uint(binding.handle);if (binding.handle > 0x7fffffff || binding.identity.length === 0) throw new Error('Invalid v2 query binding');return binding.handle; }
|
|
35
|
+
function pose(values: Vec3): Vec3 { return [finite(values[0]),finite(values[1]),finite(values[2])]; }
|
|
36
|
+
/** Shared by wire intake and continuation restore; saved input cannot bypass
|
|
37
|
+
* the same argument/operation/clock law by avoiding guest memory. */
|
|
38
|
+
export function validateV2QueryRequest(request: V2QueryRequest): void {
|
|
39
|
+
const { op,target,values,atTick } = request;uint(request.id);relativeTickV2(atTick,atTick);
|
|
40
|
+
if (!operation(op) || request.binding.length === 0 || target?.length === 0) throw new Error('Invalid v2 stable query identity');values.forEach(value => { finite(value); });
|
|
41
|
+
if (op === 12 || op === 13) {
|
|
42
|
+
const points = request.points;
|
|
43
|
+
if (target !== null || points === undefined || points.length === 0 || points.length > 16 || points.length !== values[0]
|
|
44
|
+
|| values.slice(1).some(value => !Object.is(value, 0))) throw new Error('Invalid v2 point-list arguments');
|
|
45
|
+
for (const point of points) { finite(point[0]);finite(point[1]); }
|
|
46
|
+
} else if (request.points !== undefined) throw new Error('Unexpected v2 query points');
|
|
47
|
+
if ((op === 4 && (target !== null || values[3] < 0 || values[4] !== 0 || values[5] !== 0 || values[6] !== 0))
|
|
48
|
+
|| (op === 5 && (target !== null || values[6] < 0))
|
|
49
|
+
|| (op === 8 && (values[6] < 0 || Math.abs(Math.hypot(values[3],values[4],values[5])-1) > 1e-6))
|
|
50
|
+
|| (op === 9 && (values[3] <= 0 || values[4] !== 0 || values[5] !== 0 || values[6] !== 0))
|
|
51
|
+
|| (op === 10 && (target !== null || values[3] < 0 || !Number.isInteger(values[4]) || values[4] < 1 || values[4] > 0x7fffffff || values[5] !== 0 || values[6] !== 0))
|
|
52
|
+
|| (op === 11 && (target !== null || values[6] < 0))) throw new Error('Invalid v2 query arguments');
|
|
53
|
+
}
|
|
54
|
+
export function validateV2QueryAnswer(request: V2QueryRequest,answer: V2QueryAnswer): void {
|
|
55
|
+
if (answer.status !== 1) { if (![2,3].includes(answer.status)) throw new Error('Unknown v2 query status');return; }
|
|
56
|
+
if (V2_QUERY_OPS[answer.kind] !== request.op) throw new Error('Mismatched v2 query answer');
|
|
57
|
+
switch (answer.kind) {
|
|
58
|
+
case 'walkable': pose(answer.point);break;
|
|
59
|
+
case 'grass': case 'normal':
|
|
60
|
+
if (request.points === undefined || answer.samples.length !== request.points.length) throw new Error('Incomplete v2 point-list answer');
|
|
61
|
+
for (const value of answer.samples) { finite(value);if (answer.kind === 'normal' && (value < -1 || value > 1)) throw new Error('Invalid v2 normal component'); }
|
|
62
|
+
break;
|
|
63
|
+
case 'sight': if (typeof answer.visible !== 'boolean') throw new Error('Invalid v2 sight answer');break;
|
|
64
|
+
case 'nearest': if (answer.actor !== null) {
|
|
65
|
+
pose(answer.actor.point);finite(answer.actor.distance);
|
|
66
|
+
if (answer.actor.id.length === 0 || answer.actor.distance < 0 || answer.actor.distance >= request.values[3]) throw new Error('Invalid v2 nearest answer');
|
|
67
|
+
}break;
|
|
68
|
+
case 'path': answer.points.forEach(point => { pose(point); });break;
|
|
69
|
+
case 'overlap': if (new Set(answer.bodies).size !== answer.bodies.length || answer.bodies.some(id => id.length === 0)) throw new Error('Invalid v2 overlap identities');break;
|
|
70
|
+
case 'ray': if (answer.hit !== null) {
|
|
71
|
+
pose(answer.hit.point);pose(answer.hit.normal);finite(answer.hit.distance);
|
|
72
|
+
if (answer.hit.distance < 0 || answer.hit.distance > request.values[6] || answer.hit.body?.length === 0) throw new Error('Invalid v2 ray answer');
|
|
73
|
+
}break;
|
|
74
|
+
default: throw new Error('Unknown v2 query answer');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Call after whole-frame validation. Metadata and the authoritative tick come
|
|
78
|
+
* from the host, never from guest-written descriptors or a guest clock. */
|
|
79
|
+
export function readV2QueryRequests(view: DataView,layout: V2Layout,count: number,tick: number,bindings: ReadonlyMap<number,V2QueryBinding>): readonly V2QueryRequest[] {
|
|
80
|
+
const region = layout.regions[10];if (region === undefined || view.byteLength !== layout.pages*65536 || !Number.isSafeInteger(count) || count < 0 || count > region.capacity) throw new Error('Invalid v2 query ring length');
|
|
81
|
+
const origin = Math.floor(tick/2**30)*2**30, relative = relativeTickV2(tick,origin), seen = new Set<string>(), rows: V2QueryRequest[] = [];
|
|
82
|
+
for (let i = 0; i < count; i++) {
|
|
83
|
+
const at = layout.io+region.offset+i*80, local = view.getUint32(at,true), binding = bindings.get(local), id = uint(view.getUint32(at+4,true)), op = view.getUint32(at+8,true), target = view.getUint32(at+20,true);
|
|
84
|
+
if (binding === undefined || !operation(op) || !binding.operations.has(op) || view.getUint32(at+12,true) !== 0 || view.getInt32(at+16,true) !== relative) throw new Error('Undeclared v2 query or issue tick');
|
|
85
|
+
if (bindingHandle(binding) !== local || target > 0x7fffffff) throw new Error('Invalid v2 query handle');
|
|
86
|
+
const stable = target === 0 ? null : binding.observed.get(target);if (stable === undefined || stable?.length === 0) throw new Error('Stale v2 query target');
|
|
87
|
+
const value = (j: number): number => finite(view.getFloat64(at+24+j*8,true));
|
|
88
|
+
const values: Values = [value(0),value(1),value(2),value(3),value(4),value(5),value(6)];
|
|
89
|
+
const key = JSON.stringify([binding.identity,id]);if (seen.has(key)) throw new Error('Duplicate v2 request id');seen.add(key);
|
|
90
|
+
let points: readonly Vec2[] | undefined;
|
|
91
|
+
if (op === 12 || op === 13) {
|
|
92
|
+
const size = values[0], blocks = Math.ceil(size / 3);
|
|
93
|
+
if (!Number.isInteger(size) || size < 1 || size > 16 || blocks > count - i - 1) throw new Error('Incomplete v2 point-list payload');
|
|
94
|
+
const copied: Vec2[] = [];
|
|
95
|
+
for (let block = 0; block < blocks; block++) {
|
|
96
|
+
const payload = layout.io + region.offset + (++i) * 80;
|
|
97
|
+
if (view.getUint32(payload, true) !== local || view.getUint32(payload + 4, true) !== id
|
|
98
|
+
|| view.getUint32(payload + 8, true) !== op || view.getUint32(payload + 12, true) !== 1
|
|
99
|
+
|| view.getInt32(payload + 16, true) !== relative || view.getUint32(payload + 20, true) !== 0)
|
|
100
|
+
throw new Error('Foreign v2 point-list payload');
|
|
101
|
+
const words = Array.from({ length: 7 }, (_, j) => finite(view.getFloat64(payload + 24 + j * 8, true)));
|
|
102
|
+
const used = Math.min(3, size - copied.length) * 2;
|
|
103
|
+
if (words.slice(used).some(operand => !Object.is(operand, 0))) throw new Error('Invalid v2 point-list padding');
|
|
104
|
+
for (let j = 0; j < used; j += 2) {
|
|
105
|
+
const x = words[j], z = words[j + 1];
|
|
106
|
+
if (x === undefined || z === undefined) throw new Error('Missing v2 query point');
|
|
107
|
+
copied.push(Object.freeze([x, z]));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
points = Object.freeze(copied);
|
|
111
|
+
}
|
|
112
|
+
const request = Object.freeze({ binding: binding.identity,id,op,target: stable,atTick: tick,values: Object.freeze(values),
|
|
113
|
+
...(points === undefined ? {} : { points }) });validateV2QueryRequest(request);rows.push(request);
|
|
114
|
+
}
|
|
115
|
+
return Object.freeze(rows);
|
|
116
|
+
}
|
|
117
|
+
/** Resolve replies against this entry's observed identities. Any stale body,
|
|
118
|
+
* invalid result or full bank refuses the entire batch, without a prefix. The
|
|
119
|
+
* returned banks own their bytes and can be passed to SimBatchV2.extra. */
|
|
120
|
+
export function prepareV2QueryReplies(layout: V2Layout,tick: number,replies: readonly V2QueryReply[],bindings: ReadonlyMap<string,V2QueryBinding>): readonly { readonly kind: number; readonly count: number; readonly bytes: Uint8Array }[] {
|
|
121
|
+
const records = layout.regions[11], scalars = layout.regions[12];
|
|
122
|
+
if (records === undefined || scalars === undefined || replies.length > records.capacity) throw new Error('V2 reply ring full');
|
|
123
|
+
const origin = Math.floor(tick/2**30)*2**30;relativeTickV2(tick,origin);
|
|
124
|
+
const rows: { readonly binding: number; readonly id: number; readonly stamp: number; readonly status: number; readonly values: readonly number[]; readonly data: readonly number[] }[] = [], seen = new Set<string>();let dataCount = 0;
|
|
125
|
+
for (const reply of replies) {
|
|
126
|
+
const request = reply.request, binding = bindings.get(request.binding), answer = reply.answer, key = JSON.stringify([request.binding,request.id]);
|
|
127
|
+
if (binding === undefined || !binding.operations.has(request.op) || seen.has(key) || reply.atTick < request.atTick || reply.atTick >= tick) throw new Error('Invalid v2 reply identity or delivery tick');seen.add(key);uint(request.id);
|
|
128
|
+
if (request.op === 10 || request.op === 11 || request.op === 12 || request.op === 13) { validateV2QueryRequest(request);validateV2QueryAnswer(request,answer); }
|
|
129
|
+
const body = (identity: string | null): number => {
|
|
130
|
+
if (identity === null) return 0;
|
|
131
|
+
const matches = [...binding.observed].filter(([,value]) => value === identity);const value = matches[0]?.[0];
|
|
132
|
+
if (matches.length !== 1 || value === undefined || !Number.isInteger(value) || value < 1 || value > 0x7fffffff) throw new Error('Stale v2 reply body');return value;
|
|
133
|
+
};
|
|
134
|
+
let values: readonly number[] = [0,0,0,0,0], data: readonly number[] = [];
|
|
135
|
+
if (answer.status === 1) {
|
|
136
|
+
if (V2_QUERY_OPS[answer.kind] !== request.op) throw new Error('Mismatched v2 query answer');
|
|
137
|
+
switch (answer.kind) {
|
|
138
|
+
case 'walkable': values = [...pose(answer.point),0,0];break;
|
|
139
|
+
case 'grass': case 'normal': values = [answer.samples.length,0,0,0,0];data = [...answer.samples];break;
|
|
140
|
+
case 'sight': values = [Number(answer.visible),0,0,0,0];break;
|
|
141
|
+
case 'nearest': if (answer.actor !== null) values = [body(answer.actor.id),...pose(answer.actor.point),answer.actor.distance];break;
|
|
142
|
+
case 'path':
|
|
143
|
+
if (answer.points.length > Math.floor((scalars.capacity-dataCount)/3)) throw new Error('V2 reply data ring full');
|
|
144
|
+
values = [answer.points.length,0,0,0,0];data = answer.points.flatMap(value => [...pose(value)]);break;
|
|
145
|
+
case 'overlap':
|
|
146
|
+
if (answer.bodies.length > scalars.capacity-dataCount || new Set(answer.bodies).size !== answer.bodies.length) throw new Error('V2 overlap reply full or duplicated');
|
|
147
|
+
values = [answer.bodies.length,0,0,0,0];data = answer.bodies.map(body);break;
|
|
148
|
+
case 'ray': if (answer.hit !== null) {
|
|
149
|
+
const hit = answer.hit;finite(hit.distance);if (hit.distance < 0 || hit.distance > request.values[6]) throw new Error('Invalid v2 ray distance');
|
|
150
|
+
values = [1,...pose(hit.point),hit.distance];data = [...pose(hit.normal),body(hit.body)];
|
|
151
|
+
}break;
|
|
152
|
+
default: throw new Error('Unknown v2 reply kind');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (data.length > scalars.capacity-dataCount) throw new Error('V2 reply data ring full');dataCount += data.length;
|
|
156
|
+
rows.push({ binding: bindingHandle(binding),id: request.id,stamp: relativeTickV2(reply.atTick,origin),status: answer.status,values,data });
|
|
157
|
+
}
|
|
158
|
+
const bytes = new Uint8Array(rows.length*64), dataBytes = new Uint8Array(dataCount*8), out = new DataView(bytes.buffer), dataOut = new DataView(dataBytes.buffer);let base = 0;
|
|
159
|
+
for (const [i,row] of rows.entries()) {
|
|
160
|
+
const at = i*64;[row.binding,row.id,row.status,row.data.length].forEach((value,j) => out.setUint32(at+j*4,value,true));out.setInt32(at+16,row.stamp,true);out.setUint32(at+20,base,true);
|
|
161
|
+
row.values.forEach((value,j) => out.setFloat64(at+24+j*8,value,true));row.data.forEach((value,j) => dataOut.setFloat64((base+j)*8,value,true));base += row.data.length;
|
|
162
|
+
}
|
|
163
|
+
return Object.freeze([{ kind: 12,count: rows.length,bytes },{ kind: 13,count: dataCount,bytes: dataBytes }]);
|
|
164
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Strict stable-id continuation for ABI-v2 queries. Array limits come from
|
|
2
|
+
* admitted fixed-memory capacities; this never executes or replays a query. */
|
|
3
|
+
import * as v from 'valibot';
|
|
4
|
+
import type { V2QueryRequest,V2QueryAnswer } from './scriptQueriesV2.ts';
|
|
5
|
+
|
|
6
|
+
export interface V2QuerySnapshot {
|
|
7
|
+
readonly phase: number;
|
|
8
|
+
readonly highWater: readonly { readonly binding: string; readonly id: number }[];
|
|
9
|
+
readonly entries: readonly { readonly request: V2QueryRequest; readonly reply: null | { readonly atTick: number; readonly answer: V2QueryAnswer } }[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function schemas(scalars: number) {
|
|
13
|
+
const number = v.pipe(v.number(),v.finite()), natural = v.pipe(number,v.integer(),v.minValue(0),v.maxValue(Number.MAX_SAFE_INTEGER));
|
|
14
|
+
const id = v.pipe(v.string(),v.minLength(1)), point = v.strictTuple([number,number,number]);
|
|
15
|
+
const request = v.strictObject({ binding: id,id: v.pipe(natural,v.minValue(1),v.maxValue(0xffffffff)),op: v.union([v.literal(4),v.literal(5),v.literal(8),v.literal(9),v.literal(10),v.literal(11),v.literal(12),v.literal(13)]),target: v.nullable(id),atTick: natural,values: v.strictTuple([number,number,number,number,number,number,number]),points: v.exactOptional(v.pipe(v.array(v.strictTuple([number,number])),v.minLength(1),v.maxLength(16))) });
|
|
16
|
+
const answer = v.union([
|
|
17
|
+
v.strictObject({ status: v.union([v.literal(2),v.literal(3)]) }),
|
|
18
|
+
v.strictObject({ status: v.literal(1),kind: v.literal('walkable'),point }),
|
|
19
|
+
v.strictObject({ status: v.literal(1),kind: v.literal('sight'),visible: v.boolean() }),
|
|
20
|
+
v.strictObject({ status: v.literal(1),kind: v.picklist(['grass','normal']),samples: v.pipe(v.array(number),v.minLength(1),v.maxLength(Math.min(16,scalars))) }),
|
|
21
|
+
v.strictObject({ status: v.literal(1),kind: v.literal('nearest'),actor: v.nullable(v.strictObject({ id,point,distance: v.pipe(number,v.minValue(0)) })) }),
|
|
22
|
+
v.strictObject({ status: v.literal(1),kind: v.literal('path'),points: v.pipe(v.array(point),v.maxLength(Math.floor(scalars/3))) }),
|
|
23
|
+
v.strictObject({ status: v.literal(1),kind: v.literal('overlap'),bodies: v.pipe(v.array(id),v.maxLength(scalars)) }),
|
|
24
|
+
v.strictObject({ status: v.literal(1),kind: v.literal('ray'),hit: v.nullable(v.strictObject({ point,normal: point,distance: v.pipe(number,v.minValue(0)),body: v.nullable(id) })) }),
|
|
25
|
+
]);
|
|
26
|
+
return { request,answer,natural,id };
|
|
27
|
+
}
|
|
28
|
+
export function parseV2QueryAnswer(input: unknown,scalars: number): V2QueryAnswer { return v.parse(schemas(scalars).answer,input); }
|
|
29
|
+
/** Defining strict continuation grammar, reused by the original owner's envelope. */
|
|
30
|
+
export function createV2QuerySnapshotSchema(limits: { readonly bindings: number; readonly requests: number; readonly scalars: number }): v.GenericSchema<unknown,V2QuerySnapshot> {
|
|
31
|
+
const { request,answer,natural,id } = schemas(limits.scalars);
|
|
32
|
+
return v.strictObject({
|
|
33
|
+
phase: v.pipe(v.number(),v.integer(),v.minValue(-1),v.maxValue(Number.MAX_SAFE_INTEGER)),
|
|
34
|
+
highWater: v.pipe(v.array(v.strictObject({ binding: id,id: v.pipe(natural,v.maxValue(0xffffffff)) })),v.maxLength(limits.bindings)),
|
|
35
|
+
entries: v.pipe(v.array(v.strictObject({ request,reply: v.nullable(v.strictObject({ atTick: natural,answer })) })),v.maxLength(limits.requests)),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
export function parseV2QuerySnapshot(input: unknown,limits: { readonly bindings: number; readonly requests: number; readonly scalars: number }): V2QuerySnapshot {
|
|
39
|
+
return v.parse(createV2QuerySnapshotSchema(limits),input);
|
|
40
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** ABI-v2 random continuations. Preparing/copying a bank never advances its
|
|
2
|
+
* owner; the owner commits the checked candidate with the rest of the call. */
|
|
3
|
+
import type { V2Layout } from './scriptWireV2.ts';
|
|
4
|
+
|
|
5
|
+
type State = readonly [number,number,number,number,number,number];
|
|
6
|
+
export interface V2RngInput {
|
|
7
|
+
readonly binding: number; readonly stream: number; readonly algorithm: 1 | 2;
|
|
8
|
+
readonly state: State;
|
|
9
|
+
}
|
|
10
|
+
export interface V2RngCandidate extends V2RngInput { readonly draws: number }
|
|
11
|
+
const u32 = (value: number | undefined): boolean => typeof value === 'number' && Number.isInteger(value) && value >= 0 && value <= 0xffffffff;
|
|
12
|
+
const safe = (value: number | undefined): boolean => typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
|
|
13
|
+
const bit = (value: number | undefined): boolean => value === 0 || value === 1;
|
|
14
|
+
function validate(row: { readonly binding: number; readonly stream: number; readonly algorithm: number; readonly state: readonly number[] }): void {
|
|
15
|
+
const s = row.state;
|
|
16
|
+
if (!Number.isInteger(row.binding) || row.binding < 1 || row.binding > 0x7fffffff || !u32(row.stream) || row.stream === 0
|
|
17
|
+
|| s.length !== 6
|
|
18
|
+
|| (row.algorithm === 1 ? !u32(s[0]) || !u32(s[1]) || !bit(s[2]) || s[3] !== 0 || s[4] !== 0 || s[5] !== 0
|
|
19
|
+
: row.algorithm !== 2 || !u32(s[0]) || !u32(s[1]) || !safe(s[2]) || !safe(s[3]) || !safe(s[4]) || s[5] !== 0)) throw new Error('Invalid v2 RNG continuation');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Native metadata, not a guest count, bounds the complete bank and binds each
|
|
23
|
+
* continuation to its admitted binding/stream/algorithm. */
|
|
24
|
+
export function prepareV2Rng(layout: V2Layout,input: readonly V2RngInput[]): {
|
|
25
|
+
readonly count: number; readonly bytes: Uint8Array;
|
|
26
|
+
readonly readCandidate: (view: DataView,count: number,due: ReadonlySet<number>) => readonly V2RngCandidate[];
|
|
27
|
+
} {
|
|
28
|
+
const source = layout.regions[20], target = layout.regions[21];
|
|
29
|
+
if (source === undefined || target === undefined || input.length > source.capacity || input.length > target.capacity) throw new Error('Oversized v2 RNG bank');
|
|
30
|
+
const rows = input.map(row => { validate(row);return { ...row,state: [...row.state] as const }; }).sort((a,b) => a.binding-b.binding || a.stream-b.stream);
|
|
31
|
+
if (rows.length > 1 && new Set(rows.map(row => `${row.binding}:${row.stream}`)).size !== rows.length) throw new Error('Duplicate v2 RNG stream');
|
|
32
|
+
const bytes = new Uint8Array(rows.length*64), packed = new DataView(bytes.buffer);
|
|
33
|
+
for(let i=0;i<rows.length;i++){
|
|
34
|
+
const row=rows[i];if(row===undefined)continue;
|
|
35
|
+
const at = i*64;packed.setUint32(at,row.binding,true);packed.setUint32(at+4,row.stream,true);packed.setUint32(at+8,row.algorithm,true);
|
|
36
|
+
for(let j=0;j<row.state.length;j++)packed.setFloat64(at+16+j*8,row.state[j]??Number.NaN,true);
|
|
37
|
+
}
|
|
38
|
+
return { count: rows.length,bytes,readCandidate: (view,count,due) => {
|
|
39
|
+
if (view.byteLength !== layout.pages*65536 || count !== rows.length) throw new Error('Incomplete v2 RNG candidate');
|
|
40
|
+
return rows.map((row,i): V2RngCandidate => {
|
|
41
|
+
const at = layout.io+target.offset+i*64, draws = view.getUint32(at+12,true);
|
|
42
|
+
if (view.getUint32(at,true) !== row.binding || view.getUint32(at+4,true) !== row.stream || view.getUint32(at+8,true) !== row.algorithm || (!due.has(row.binding) && draws !== 0)) throw new Error('Forged v2 RNG owner or draw count');
|
|
43
|
+
const state: State = [view.getFloat64(at+16,true),view.getFloat64(at+24,true),view.getFloat64(at+32,true),view.getFloat64(at+40,true),view.getFloat64(at+48,true),view.getFloat64(at+56,true)];
|
|
44
|
+
const next = { binding: row.binding,stream: row.stream,algorithm: row.algorithm,state,draws };validate(next);
|
|
45
|
+
const changed = row.algorithm === 1 ? 0 : 2;
|
|
46
|
+
const expected = draws === 0 ? row.state[changed] : row.algorithm === 1 ? (row.state[0]+Math.imul(draws,0x6d2b79f5)) >>> 0 : row.state[2]+draws;
|
|
47
|
+
if (!Number.isSafeInteger(expected) || !Object.is(state[changed],expected)) throw new Error('Invalid v2 RNG advance');
|
|
48
|
+
for(let j=0;j<state.length;j++)if(j!==changed&&!Object.is(state[j],row.state[j]))throw new Error('Invalid v2 RNG advance');
|
|
49
|
+
return next;
|
|
50
|
+
});
|
|
51
|
+
} };
|
|
52
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/** ABI v2 host-owned layout and immutable call envelope. No guest pointer or
|
|
2
|
+
* count can enlarge these capacities. The record validators own their domains. */
|
|
3
|
+
export const V2_REGION_STRIDES: readonly number[] = Object.freeze([64,8,8,8,96,16,80,32,56,64,80,64,8,1,32,8,80,8,48,16,64,64]);
|
|
4
|
+
export const V2_HEADER_BYTES = 128, V2_DIRECTORY_ENTRY_BYTES = 24, V2_DIRECTORY_BYTES: number = 22*24;
|
|
5
|
+
const outputKinds = new Set([3,10,11,17,18,20,22]);
|
|
6
|
+
export interface V2Region { readonly kind: number; readonly offset: number; readonly stride: number; readonly capacity: number }
|
|
7
|
+
export interface V2Layout { readonly io: number; readonly pages: number; readonly bytes: number; readonly regions: readonly V2Region[] }
|
|
8
|
+
const natural = (value: number): boolean => Number.isSafeInteger(value) && value >= 0;
|
|
9
|
+
function unsigned(value: number): boolean { return natural(value) && value <= 0xffffffff; }
|
|
10
|
+
function handle(value: number): boolean { return Number.isInteger(value) && value > 0 && value <= 0x7fffffff; }
|
|
11
|
+
/** Build the complete 22-kind directory outside Wasm, checking arithmetic before
|
|
12
|
+
* multiplying or coercing to u32. Empty kinds retain their specified stride. */
|
|
13
|
+
export function layoutV2(io: number,pages: number,capacities: ReadonlyMap<number,number>): V2Layout {
|
|
14
|
+
if (!natural(io) || io%8 !== 0 || !Number.isInteger(pages) || pages < 1 || pages > 4 || io > pages*65536-656) throw new Error('Invalid v2 layout base/pages');
|
|
15
|
+
for (const [kind,capacity] of capacities) if (!Number.isInteger(kind) || kind < 1 || kind > 22 || !natural(capacity)) throw new Error('Unknown v2 region or capacity');
|
|
16
|
+
let end = io+656; const regions: V2Region[] = [];
|
|
17
|
+
for (const [index,stride] of V2_REGION_STRIDES.entries()) {
|
|
18
|
+
const kind = index+1, capacity = capacities.get(kind) ?? 0; end = Math.ceil(end/16)*16;
|
|
19
|
+
if (capacity > Math.floor((pages*65536-end)/stride)) throw new Error('V2 layout exceeds fixed memory');
|
|
20
|
+
regions.push(Object.freeze({ kind,offset: end-io,stride,capacity })); end += capacity*stride;
|
|
21
|
+
}
|
|
22
|
+
return Object.freeze({ io,pages,bytes: end-io,regions: Object.freeze(regions) });
|
|
23
|
+
}
|
|
24
|
+
/** Relative i32 stamps retain exact f64 absolute ticks across epoch boundaries. */
|
|
25
|
+
export function relativeTickV2(tick: number,origin: number): number {
|
|
26
|
+
if (!natural(tick) || !natural(origin)) throw new Error('Invalid v2 absolute tick');
|
|
27
|
+
const relative = tick-origin; if (relative < -0x80000000 || relative > 0x7fffffff) throw new Error('V2 tick stamp outside i32 epoch'); return relative;
|
|
28
|
+
}
|
|
29
|
+
interface BaseFrame { readonly module: number; readonly sequence: number; readonly tick: number; readonly due: number }
|
|
30
|
+
export type V2Frame = BaseFrame & ({ readonly lane: 1 | 2 } | { readonly lane: 3; readonly dt: number; readonly alpha: number; readonly frame: number });
|
|
31
|
+
export interface V2FrameAuthority { readonly header: Uint8Array; readonly counts: readonly number[] }
|
|
32
|
+
/** Write only header/directory, retaining view scratch between frames. Capture
|
|
33
|
+
* the host envelope for output validation; sim has no view clock/tier fields. */
|
|
34
|
+
export function writeV2Frame(view: DataView,layout: V2Layout,frame: V2Frame,counts: ReadonlyMap<number,number>): V2FrameAuthority {
|
|
35
|
+
return writeFrame(view,layout,frame,counts);
|
|
36
|
+
}
|
|
37
|
+
/** Reuse the last immutable count shape within one existing owner. Every call
|
|
38
|
+
* validates current counts and captures a fresh detached header; no caller
|
|
39
|
+
* authority or mutable input is retained as a trusted template. */
|
|
40
|
+
export function createV2FrameWriter(layout: V2Layout): (view: DataView,frame: V2Frame,counts: ReadonlyMap<number,number>) => V2FrameAuthority {
|
|
41
|
+
let previous: readonly number[] | undefined;
|
|
42
|
+
let available: number[] | undefined;
|
|
43
|
+
return (view,frame,counts) => {
|
|
44
|
+
const scratch=available??[];available=undefined;
|
|
45
|
+
try {
|
|
46
|
+
const authority = writeFrame(view,layout,frame,counts,previous,scratch);
|
|
47
|
+
previous = authority.counts;return authority;
|
|
48
|
+
} finally { available=scratch; }
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function writeFrame(view: DataView,layout: V2Layout,frame: V2Frame,counts: ReadonlyMap<number,number>,previous?: readonly number[],scratch?: number[]): V2FrameAuthority {
|
|
52
|
+
if (view.byteLength !== layout.pages*65536 || !handle(frame.module) || !unsigned(frame.sequence) || !natural(frame.tick) || !natural(frame.due)) throw new Error('Invalid v2 call envelope');
|
|
53
|
+
if (frame.lane !== 1 && frame.lane !== 2 && frame.lane !== 3) throw new Error('Unknown v2 lane');
|
|
54
|
+
for (const [kind,count] of counts) if (!Number.isInteger(kind) || kind < 1 || kind > 22 || !natural(count)) throw new Error('Unknown v2 input count');
|
|
55
|
+
const actual=scratch??[];actual.length=layout.regions.length;
|
|
56
|
+
for(let index=0;index<layout.regions.length;index++){
|
|
57
|
+
const region=layout.regions[index];if(region===undefined)throw new Error('Missing v2 region metadata');
|
|
58
|
+
const count = counts.get(region.kind) ?? (region.kind === 17 ? region.capacity : 0);
|
|
59
|
+
if (count > region.capacity || (outputKinds.has(region.kind) && count !== (region.kind === 17 ? region.capacity : 0))) throw new Error('Invalid v2 initial output/input count'); actual[index]=count;
|
|
60
|
+
}
|
|
61
|
+
if (frame.due > (actual[0] ?? 0)) throw new Error('V2 due count exceeds bindings');
|
|
62
|
+
const at = layout.io, origin = Math.floor(frame.tick/2**30)*2**30;
|
|
63
|
+
new Uint8Array(view.buffer,view.byteOffset+at,656).fill(0);
|
|
64
|
+
view.setUint32(at,0x32565357,true); view.setUint16(at+4,2,true); view.setUint32(at+8,128,true); view.setUint32(at+12,layout.bytes,true);
|
|
65
|
+
view.setUint32(at+16,frame.module,true); view.setUint32(at+20,frame.lane,true); view.setUint32(at+24,frame.sequence,true); view.setInt32(at+28,relativeTickV2(frame.tick,origin),true);
|
|
66
|
+
view.setUint32(at+36,actual[6] ?? 0,true);view.setUint32(at+40,actual[8] ?? 0,true);view.setUint32(at+44,actual[7] ?? 0,true);
|
|
67
|
+
view.setUint32(at+48,actual[11] ?? 0,true);view.setUint32(at+52,actual[18] ?? 0,true);view.setUint32(at+68,actual[12] ?? 0,true);
|
|
68
|
+
view.setUint32(at+32,frame.due,true); view.setUint32(at+96,22,true); view.setUint32(at+100,128,true); view.setFloat64(at+104,origin,true);
|
|
69
|
+
if (frame.lane === 3) {
|
|
70
|
+
if (!Number.isFinite(frame.dt) || frame.dt < 0 || !Number.isFinite(frame.alpha) || frame.alpha < 0 || frame.alpha > 1 || !unsigned(frame.frame)) throw new Error('Invalid v2 view clock');
|
|
71
|
+
view.setFloat64(at+80,frame.dt,true); view.setFloat64(at+88,frame.alpha,true); view.setUint32(at+112,frame.frame,true);
|
|
72
|
+
}
|
|
73
|
+
for (let index = 0; index < layout.regions.length; index++) {
|
|
74
|
+
const region = layout.regions[index];if (region === undefined) throw new Error('Missing v2 region metadata');
|
|
75
|
+
const entry = at+128+index*24;
|
|
76
|
+
view.setUint32(entry,region.kind,true);view.setUint32(entry+4,region.offset,true);view.setUint32(entry+8,region.stride,true);
|
|
77
|
+
view.setUint32(entry+12,region.capacity,true);view.setUint32(entry+16,actual[index] ?? 0,true);
|
|
78
|
+
if (region.kind === 17) for (let i = 0; i < region.capacity; i++) view.setUint32(at+region.offset+i*80+12,0,true);
|
|
79
|
+
}
|
|
80
|
+
let same = previous !== undefined && previous.length === actual.length;
|
|
81
|
+
for (let index = 0; same && index < actual.length; index++) if (!Object.is(previous?.[index],actual[index])) same = false;
|
|
82
|
+
return { header: new Uint8Array(view.buffer,view.byteOffset+at,128).slice(),counts: same && previous !== undefined ? previous : Object.freeze(scratch===undefined?actual:actual.slice()) };
|
|
83
|
+
}
|
|
84
|
+
/** Validate the entire envelope before trusting a single output count. Domain
|
|
85
|
+
* IDs, numeric columns, RNG and command authority are checked by their owners. */
|
|
86
|
+
export function validateV2Frame(view: DataView,layout: V2Layout,authority: V2FrameAuthority): readonly number[] {
|
|
87
|
+
const at = layout.io;
|
|
88
|
+
if (view.byteLength !== layout.pages*65536 || authority.header.length !== 128 || authority.counts.length !== 22) throw new Error('Invalid v2 frame authority');
|
|
89
|
+
const header = new Uint8Array(view.buffer,view.byteOffset+at,128);
|
|
90
|
+
for (let i = 0; i < 128; i++) if (!(i >= 56 && i < 68 || i >= 72 && i < 80) && header[i] !== authority.header[i]) throw new Error('Guest changed the v2 call envelope');
|
|
91
|
+
const counts: number[] = [];
|
|
92
|
+
for (let index = 0; index < layout.regions.length; index++) {
|
|
93
|
+
const region = layout.regions[index];if (region === undefined) throw new Error('Missing v2 region metadata');
|
|
94
|
+
const entry = at+128+index*24, count = view.getUint32(entry+16,true);
|
|
95
|
+
if (view.getUint32(entry,true) !== region.kind || view.getUint32(entry+4,true) !== region.offset || view.getUint32(entry+8,true) !== region.stride || view.getUint32(entry+12,true) !== region.capacity || view.getUint32(entry+20,true) !== 0 || count > region.capacity
|
|
96
|
+
|| (!outputKinds.has(region.kind) && count !== authority.counts[index])) throw new Error('Guest changed the v2 region directory'); counts.push(count);
|
|
97
|
+
}
|
|
98
|
+
const lane = new DataView(authority.header.buffer,authority.header.byteOffset,128).getUint32(20,true);
|
|
99
|
+
if (lane === 3 && ((counts[9] ?? 0) > 0 || (counts[10] ?? 0) > 0)) throw new Error('V2 view cannot publish sim commands or queries');
|
|
100
|
+
if (view.getUint32(at+56,true) !== counts[9] || view.getUint32(at+60,true) !== counts[10]) throw new Error('V2 output count mismatch');
|
|
101
|
+
const transforms = layout.regions[16], channels = layout.regions[17]; if (transforms === undefined || channels === undefined) throw new Error('Missing v2 view regions');
|
|
102
|
+
if (counts[16] !== transforms.capacity || (counts[17] !== 0 && counts[17] !== channels.capacity) || view.getUint32(at+76,true) !== counts[17]) throw new Error('Incomplete v2 view output bank');
|
|
103
|
+
let changed = 0;
|
|
104
|
+
for (let i = 0; i < transforms.capacity; i++) { const flag = view.getUint32(at+transforms.offset+i*80+12,true); if (flag > 1) throw new Error('Unknown v2 transform changed flag'); changed += flag; }
|
|
105
|
+
if (view.getUint32(at+72,true) !== changed) throw new Error('V2 changed transform count mismatch'); return counts;
|
|
106
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
|
|
3
|
+
const positive = v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(0x7fffffff));
|
|
4
|
+
const moduleRef = v.pipe(v.string(), v.regex(/^(?:commons:)?[a-f0-9]{64}$/u));
|
|
5
|
+
/** Numeric entity handles and an optional host-verified actor id bind an admitted module to local sim work. */
|
|
6
|
+
export const ScriptBindingsSchema: v.GenericSchema<ShardScriptBindingsInput, ShardScriptBindings> = v.pipe(v.array(v.strictObject({ module: moduleRef, entity: positive, actorId: v.nullable(v.pipe(v.string(), v.minLength(1), v.maxLength(128))), kind: v.picklist(['server', 'entity']) })), v.maxLength(10000));
|
|
7
|
+
/** A validated v0 script binding list. */
|
|
8
|
+
|
|
9
|
+
/** Reference/identity checks; both actor-bound server logic and actor-free director logic run authoritatively. */
|
|
10
|
+
export function scriptBindingRules(bindings: readonly ShardScriptBindings[number][], scripts: readonly string[]): string[] {
|
|
11
|
+
const errors: string[] = [], keys = new Set<string>(), actors = new Map<number, string | null>();
|
|
12
|
+
for (const binding of bindings) {
|
|
13
|
+
const key = `${binding.module}:${binding.entity}`;
|
|
14
|
+
if (!scripts.includes(binding.module)) errors.push('binding module declared in sim.scripts');
|
|
15
|
+
if (keys.has(key)) errors.push('unique script binding'); keys.add(key);
|
|
16
|
+
if (actors.has(binding.entity) && actors.get(binding.entity) !== binding.actorId) errors.push('consistent entity actor binding');
|
|
17
|
+
actors.set(binding.entity, binding.actorId);
|
|
18
|
+
}
|
|
19
|
+
return [...new Set(errors)];
|
|
20
|
+
}
|
|
21
|
+
/** Format-owned field ids/defaults, with optional authored lower-only bounds. */
|
|
22
|
+
export interface ShardScriptField { id: number; name: string; type: 'bool' | 'i32' | 'f64' | 'string'; privacy: 'public' | 'owner' | 'host'; default: boolean | number | string; min?: number | undefined; max?: number | undefined }
|
|
23
|
+
|
|
24
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
25
|
+
export type ShardScriptBindingsInput = ShardScriptBindings;
|
|
26
|
+
export type ShardScriptBindings = ({
|
|
27
|
+
module: string;
|
|
28
|
+
entity: number;
|
|
29
|
+
actorId: (string) | null;
|
|
30
|
+
kind: 'server' | 'entity';
|
|
31
|
+
})[];
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { CollectionDisplaysRows } from './collectionDisplay.ts';
|
|
2
|
+
import type { ResolvedIslandLibraryRows } from './islandLibrary.ts';
|
|
3
|
+
import type {StealthRows} from './stealth.ts';
|
|
4
|
+
import type { ColourFunctionBook } from './colourFunction.ts';
|
|
5
|
+
import type { PaintedLookRow } from './paintedLook.ts';
|
|
6
|
+
import type { ExplorerCatalogue } from './explorerCatalogue.ts';
|
|
7
|
+
import type { RiggedHullBook } from './riggedHulls.ts';
|
|
8
|
+
import type { HullLookBookRows } from './speciesLooks.ts';
|
|
9
|
+
import type { ToonLookRow } from './toonLook.ts';
|
|
10
|
+
import type { KeyedSkyStyle } from './keyedSky.ts';
|
|
11
|
+
import type { SpawnScriptRows } from './spawnScripts.ts';
|
|
12
|
+
import type { ClientPlan } from './clientPlan.ts';
|
|
13
|
+
import type { ReturnModuleRow, ViewModuleRow } from './scriptContract.ts';
|
|
14
|
+
import type { WorldScenesSection } from './worldScenes.ts';
|
|
15
|
+
import type { TreeSetRows } from './treeSetRows.ts';
|
|
16
|
+
import type { HeldArmsRows } from './heldArms.ts';
|
|
17
|
+
import type { HeldGearRows } from './heldGear.ts';
|
|
18
|
+
import type { HeldFinishesRows } from './heldFinishes.ts';
|
|
19
|
+
import type { LoadoutRows } from './loadout.ts';
|
|
20
|
+
import type { HeldEquipmentRows } from './heldEquipment.ts';
|
|
21
|
+
import type { CompletionRows } from './completion.ts';
|
|
22
|
+
import type { SpeciesPrograms } from './speciesPrograms.ts';
|
|
23
|
+
import type { Shardfile } from './shardSchema.ts';
|
|
24
|
+
import type { DeclaredBodyOpsRows } from './bodySlots.ts';
|
|
25
|
+
import type { CreatureStrikes } from './creatures.ts';
|
|
26
|
+
import type { ActorMoves } from './actorMoves.ts';
|
|
27
|
+
import type { DecisionScriptRow } from './decisionScripts.ts';
|
|
28
|
+
import type { WorldPhysics } from './worldPhysics.ts';
|
|
29
|
+
import type { WorldTargets } from './worldTargets.ts';
|
|
30
|
+
import type { NativeRuntimePlanData } from './nativeRuntimePlan.ts';
|
|
31
|
+
|
|
32
|
+
type Rows = Shardfile['rows'];
|
|
33
|
+
type Spawns = NonNullable<NonNullable<Shardfile['runtime']>['spawns']>;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The platform sections of a built shard (shardfile format 2, `out/<slug>/sections/<name>.json`) and the value each file
|
|
37
|
+
* holds: the type contract shared by the output writer (P1, `OUTPUT_SECTIONS`), the loader and the runtime data API
|
|
38
|
+
* (`ShardProduct.section`, `@wildshard/game/shardfile/shardProduct`; spec progress/shard-platform/p2a-runtime-data-api/).
|
|
39
|
+
*
|
|
40
|
+
* A section that slices today's `Shardfile` is a root-key envelope (`{ quests: … }`, `{ rows: { strikes: … } }`), so an
|
|
41
|
+
* optional field keeps its absence and the loader reassembles the unchanged `Shardfile` for every host. A section added
|
|
42
|
+
* after format 2 (marked "new") is a plain value and is not part of `Shardfile`: the runtime reads it with `section()` and
|
|
43
|
+
* hands it to its host as an argument. A section file holds its schema's output, validated at build time; the runtime
|
|
44
|
+
* trusts it. Adding a platform section = one entry here, its schema in this package and its row in the writer's table.
|
|
45
|
+
*/
|
|
46
|
+
export interface PlatformSections {
|
|
47
|
+
/** Complete client display catalogue and native keepsake rows. */
|
|
48
|
+
'collections/displays': CollectionDisplaysRows;
|
|
49
|
+
/** Synchronous product-owned fixed draws, figures and collection slots. */
|
|
50
|
+
'models/island-library': ResolvedIslandLibraryRows;
|
|
51
|
+
'player/stealth':StealthRows;
|
|
52
|
+
'view/modules': ViewModuleRow[];
|
|
53
|
+
/** Client-only ordered model references, ignored by simulation. */
|
|
54
|
+
'explore/catalogue': ExplorerCatalogue;
|
|
55
|
+
'look/rigged-hulls': RiggedHullBook;
|
|
56
|
+
'look/hull-book': HullLookBookRows;
|
|
57
|
+
'look/toon': ToonLookRow;
|
|
58
|
+
'look/painted': PaintedLookRow;
|
|
59
|
+
'look/colour-functions': ColourFunctionBook;
|
|
60
|
+
'look/keyed-sky': KeyedSkyStyle;
|
|
61
|
+
/** Client-only compiled feature declarations; ignored by the authoritative simulation. */
|
|
62
|
+
'client/plan': ClientPlan;
|
|
63
|
+
'held/arms': HeldArmsRows;
|
|
64
|
+
'held/gear': HeldGearRows;
|
|
65
|
+
'held/finishes': HeldFinishesRows;
|
|
66
|
+
'held/loadout': LoadoutRows;
|
|
67
|
+
'held/equipment': HeldEquipmentRows;
|
|
68
|
+
'ui/completion': CompletionRows;
|
|
69
|
+
/** Existing native owners selected by admitted data, never client runtime code. */
|
|
70
|
+
'sim/runtime-plan': NativeRuntimePlanData;
|
|
71
|
+
'world/tiles': Pick<Shardfile, 'tiles' | 'far' | 'near' | 'ring'>;
|
|
72
|
+
'world/terrain': Pick<Shardfile, 'terrain' | 'nativeGround'>;
|
|
73
|
+
'world/edge': Pick<Shardfile, 'edge' | 'entryways'>;
|
|
74
|
+
'world/collision': Pick<Shardfile, 'meshCollision'>;
|
|
75
|
+
'world/navigation': Pick<Shardfile, 'navigation'>;
|
|
76
|
+
'world/props': Pick<Shardfile, 'props'>;
|
|
77
|
+
'world/water': Pick<Shardfile, 'water'>;
|
|
78
|
+
'world/movers': Pick<Shardfile, 'movers'>;
|
|
79
|
+
'world/traversal': Pick<Shardfile, 'traversal'>;
|
|
80
|
+
'world/spawn': Pick<Shardfile, 'spawn'>;
|
|
81
|
+
/** new (P2b): common raw native physics, read alongside owner metadata */
|
|
82
|
+
'world/physics': WorldPhysics;
|
|
83
|
+
/** new (KA6): immutable strike targets and named movement/perch points. */
|
|
84
|
+
'world/targets': WorldTargets;
|
|
85
|
+
'world/scenes': WorldScenesSection;
|
|
86
|
+
/** Client-only baked forest tree set (game models/treeSet): a manifest's `trees.treeSet` and a forest page draw it. */
|
|
87
|
+
'world/trees': TreeSetRows;
|
|
88
|
+
'world/days': { readonly rows: Pick<Rows, 'days'> };
|
|
89
|
+
'world/weather': { readonly rows: Pick<Rows, 'weather'> };
|
|
90
|
+
'look/look': Pick<Shardfile, 'look' | 'presentation'>;
|
|
91
|
+
'look/map': Pick<Shardfile, 'map'>;
|
|
92
|
+
'look/materials': { readonly rows: Pick<Rows, 'looks'> };
|
|
93
|
+
/** new (KA5): sim-side steering mechanics, independently selected by decisions. */
|
|
94
|
+
'actors/moves': ActorMoves;
|
|
95
|
+
'actors/spawn-scripts': SpawnScriptRows[];
|
|
96
|
+
/** Stateless return-policy modules are admitted but never auto-scheduled. */
|
|
97
|
+
'actors/return-scripts': ReturnModuleRow[];
|
|
98
|
+
/** Callback-free gameplay species, in each owning world's original registration order. */
|
|
99
|
+
'actors/species-programs': SpeciesPrograms;
|
|
100
|
+
'actors/creatures': Pick<Shardfile, 'creatures'>;
|
|
101
|
+
'actors/crowds': Pick<Shardfile, 'crowds'>;
|
|
102
|
+
'actors/npcs': Pick<Shardfile, 'questNpcs'>;
|
|
103
|
+
'actors/species': { readonly rows: Pick<Rows, 'species'> };
|
|
104
|
+
'actors/spawns': { readonly runtime: { readonly spawns: Spawns } };
|
|
105
|
+
/** new (P2b): the creature strike table species programs name by id (Sky's Roc rows), `CreatureStrikeSchema` rows */
|
|
106
|
+
'actors/strikes': Readonly<CreatureStrikes>;
|
|
107
|
+
'combat/items': Pick<Shardfile, 'items'>;
|
|
108
|
+
'combat/encounters': Pick<Shardfile, 'encounters'>;
|
|
109
|
+
'combat/strikes': { readonly rows: Pick<Rows, 'strikes'> };
|
|
110
|
+
'quests/quests': Pick<Shardfile, 'quests'>;
|
|
111
|
+
'quests/host': Pick<Shardfile, 'questHost'>;
|
|
112
|
+
'quests/directors': Pick<Shardfile, 'directors'>;
|
|
113
|
+
'economy/ledger': Pick<Shardfile, 'ledger'>;
|
|
114
|
+
'economy/loot': { readonly rows: Pick<Rows, 'loot'> };
|
|
115
|
+
'state/state': Pick<Shardfile, 'state'>;
|
|
116
|
+
'state/migrations': Pick<Shardfile, 'migrations'>;
|
|
117
|
+
'state/modes': Pick<Shardfile, 'modes'>;
|
|
118
|
+
/** new (KA1): admitted v1 decisions, independent of the retained v0 hash/binding envelope */
|
|
119
|
+
'sim/scripts': readonly DecisionScriptRow[];
|
|
120
|
+
/** G566: declared bodies the shard's decision scripts own */
|
|
121
|
+
'sim/bodies': DeclaredBodyOpsRows;
|
|
122
|
+
'sim/sim': Pick<Shardfile, 'sim'>;
|
|
123
|
+
'sim/hooks': Pick<Shardfile, 'hooks'>;
|
|
124
|
+
'sim/client-scripts': Pick<Shardfile, 'clientScripts'>;
|
|
125
|
+
'sim/client-channels': Pick<Shardfile, 'clientChannels'>;
|
|
126
|
+
'sim/plumbing': Pick<Shardfile, 'plumbing'>;
|
|
127
|
+
'audio/audio': Pick<Shardfile, 'audio'>;
|
|
128
|
+
'ui/card': Pick<Shardfile, 'accent'>;
|
|
129
|
+
/** Plain manifest metadata for admitted data-client discovery. */
|
|
130
|
+
'ui/level': { readonly manifest: NonNullable<Shardfile['manifest']> };
|
|
131
|
+
'ui/ui': Pick<Shardfile, 'ui' | 'targets'>;
|
|
132
|
+
'ui/compendium': { readonly rows: Pick<Rows, 'compendiums'> };
|
|
133
|
+
/** new (P2b): the shard's player-facing strings, key → text, read through `ShardProduct.strings(keys)` */
|
|
134
|
+
'ui/strings': Readonly<Record<string, string>>;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** A platform section's name, as the index lists it (`<group>/<name>`). */
|
|
138
|
+
export type PlatformSectionName = keyof PlatformSections;
|
|
139
|
+
/** Every admitted section is defined by the platform. */
|
|
140
|
+
export type SectionName = PlatformSectionName;
|