@wildshard/shard-format 0.0.1 → 0.4.6
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 +508 -2
- 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 +295 -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/issue-codes.ts +262 -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 +114 -0
- package/src/format/product-stream-assets.ts +511 -0
- package/src/format/product-stream-facts.ts +208 -0
- package/src/format/product-stream-miss.ts +15 -0
- package/src/format/product-stream-node.ts +47 -0
- package/src/format/product-stream-packs.ts +247 -0
- package/src/format/product-stream-rows.ts +234 -0
- package/src/format/product-stream-tar.ts +204 -0
- package/src/format/product-stream.ts +297 -0
- package/src/format/product.ts +366 -0
- package/src/format/productValidation.ts +236 -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 +104 -0
- package/src/format/tar-source.ts +13 -0
- package/src/format/tar-write.ts +152 -0
- package/src/format/tar.ts +204 -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/src/tools/runtime-hosts.json +497 -0
- package/README.md +0 -8
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { graphUsesMeshMap } from './materialGraph.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Named prop materials (SHARD-PLATFORM SF55, G211): the data half of the GLB material adapter for authored (Blender)
|
|
4
|
+
* worlds. Without it, every declared prop mesh draws with `props.family` and one per-model colour texture (the default
|
|
5
|
+
* path, unchanged). With it, `props.materials` maps each baked GLB `material.name` (the source glTF material's exact name,
|
|
6
|
+
* which the world bake keeps) to an admitted `look.materials` ID (or a platform family default) plus that surface's KTX2
|
|
7
|
+
* texture slots and their glTF samplers: colour, normal (with its scale), metallic-roughness, occlusion (with its strength)
|
|
8
|
+
* and emissive.
|
|
9
|
+
*
|
|
10
|
+
* - **No silent slot:** a mapped name whose material family cannot draw a slot is refused here (painterly reads no
|
|
11
|
+
* metallic-roughness; emissive reads only colour), and a graph material takes a slot only into its own texture param of
|
|
12
|
+
* the same name. A GLB material name absent from the map refuses its install (`checkPropMaterialNames`, and the engine
|
|
13
|
+
* installer at parse time).
|
|
14
|
+
* - **Charged by the tiles:** every slot file is a KTX2 dependency of a declared props GLB, so the tile (or library) claim
|
|
15
|
+
* that leases the GLB already carries its textures.
|
|
16
|
+
* - **One sampler per file:** a texture file is one GPU texture; two bindings may share a file only with equal samplers, and
|
|
17
|
+
* a slot file is never also a `look.materials` texture (whose sampler is the platform's default).
|
|
18
|
+
*
|
|
19
|
+
* The schema lives here, outside the format file (format ownership: sp-x5 wires `materials: v.exactOptional(PropMaterialsSchema)`
|
|
20
|
+
* into `PropsSchema` and calls `validatePropMaterials` from the props reference check).
|
|
21
|
+
*/
|
|
22
|
+
import * as v from 'valibot';
|
|
23
|
+
import { FAMILY_IDS } from './materialFamilies.ts';
|
|
24
|
+
import { materialGraphIr, materialTextureRefs, type MaterialsSchema } from './materials.ts';
|
|
25
|
+
|
|
26
|
+
const ref = v.pipe(v.string(), v.regex(/^[a-f0-9]{64}$/u));
|
|
27
|
+
const id = v.pipe(v.string(), v.regex(/^[a-z][a-z0-9.-]*$/u), v.maxLength(128));
|
|
28
|
+
/** A glTF material name as Blender exports it: exact, case-sensitive, spaces and numeric suffixes kept. */
|
|
29
|
+
const glbName = v.pipe(v.string(), v.minLength(1), v.maxLength(128), v.regex(/^\P{Cc}+$/u, 'no control characters'), v.check((name) => name.trim() === name, 'no edge whitespace'), v.check((name) => !['__proto__', 'prototype', 'constructor'].includes(name), 'reserved name'));
|
|
30
|
+
/** glTF sampler enums (WebGL constants), as the world normalizer admits them. */
|
|
31
|
+
const wrap = v.picklist([33071, 33648, 10497]);
|
|
32
|
+
/** `anisotropy` (G227): the texture's anisotropic filtering samples, 1 (off) to 16, capped by the device (a hero prop's 4) */
|
|
33
|
+
const sampler = { file: ref, wrapS: v.optional(wrap, 10497), wrapT: v.optional(wrap, 10497), minFilter: v.optional(v.nullable(v.picklist([9728, 9729, 9984, 9985, 9986, 9987])), null), magFilter: v.optional(v.nullable(v.picklist([9728, 9729])), null), anisotropy: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(16)), 1) };
|
|
34
|
+
const slot = v.strictObject(sampler);
|
|
35
|
+
const finite = v.pipe(v.number(), v.finite());
|
|
36
|
+
/** The texture slots a named prop material may bind. */
|
|
37
|
+
export const PROP_MATERIAL_SLOTS = ['colour', 'normal', 'metallicRoughness', 'occlusion', 'emissive'] as const;
|
|
38
|
+
/** One texture slot name. */
|
|
39
|
+
export type PropMaterialSlot = (typeof PROP_MATERIAL_SLOTS)[number];
|
|
40
|
+
const binding = v.strictObject({
|
|
41
|
+
id,
|
|
42
|
+
colour: v.optional(v.nullable(slot), null),
|
|
43
|
+
normal: v.optional(v.nullable(v.strictObject({ ...sampler, scale: v.optional(v.pipe(finite, v.minValue(0), v.maxValue(4)), 1) })), null),
|
|
44
|
+
metallicRoughness: v.optional(v.nullable(slot), null),
|
|
45
|
+
occlusion: v.optional(v.nullable(v.strictObject({ ...sampler, strength: v.optional(v.pipe(finite, v.minValue(0), v.maxValue(1)), 1) })), null),
|
|
46
|
+
emissive: v.optional(v.nullable(slot), null),
|
|
47
|
+
});
|
|
48
|
+
/** `props.materials`: baked GLB material name → admitted material ID and its texture slots (1–256 names). */
|
|
49
|
+
export const PropMaterialsSchema: v.GenericSchema<PropMaterialsInput, PropMaterials> = v.pipe(v.record(glbName, binding), v.check((rows) => { const n = Object.keys(rows).length; return n >= 1 && n <= 256; }, '1–256 named prop materials'));
|
|
50
|
+
/** Admitted named prop materials. */
|
|
51
|
+
|
|
52
|
+
/** One admitted binding. */
|
|
53
|
+
export type PropMaterialBinding = PropMaterials[string];
|
|
54
|
+
/** One admitted texture slot with its sampler (and the normal scale / occlusion strength where the slot has one). */
|
|
55
|
+
export type PropTextureSlot = NonNullable<PropMaterialBinding['colour']> & { readonly scale?: number; readonly strength?: number };
|
|
56
|
+
|
|
57
|
+
const read = new WeakMap<object, PropMaterials | undefined>();
|
|
58
|
+
/**
|
|
59
|
+
* A props section's named materials, admitted (undefined: the one-family path). Reads the additive `materials` field
|
|
60
|
+
* whether or not the format's `PropsSchema` declares it yet, and validates it once per props object.
|
|
61
|
+
*/
|
|
62
|
+
export function propMaterialsOf(props: object): PropMaterials | undefined {
|
|
63
|
+
if (read.has(props)) return read.get(props);
|
|
64
|
+
const raw: unknown = 'materials' in props ? props.materials : undefined;
|
|
65
|
+
const value = raw === undefined ? undefined : v.parse(PropMaterialsSchema, raw);
|
|
66
|
+
read.set(props, value); return value;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** A binding's filled slots, in slot order. */
|
|
70
|
+
export function propMaterialSlots(row: PropMaterialBinding): [PropMaterialSlot, PropTextureSlot][] {
|
|
71
|
+
return PROP_MATERIAL_SLOTS.flatMap((name): [PropMaterialSlot, PropTextureSlot][] => { const value = row[name]; return value === null ? [] : [[name, value]]; });
|
|
72
|
+
}
|
|
73
|
+
/** Every texture file the named prop materials bind (the client transcodes them with the catalogue). */
|
|
74
|
+
export function propMaterialTextureRefs(materials: PropMaterials | undefined): string[] {
|
|
75
|
+
return materials === undefined ? [] : [...new Set(Object.values(materials).flatMap((row) => propMaterialSlots(row).map(([, value]) => value.file)))];
|
|
76
|
+
}
|
|
77
|
+
/** How a slot's texels are read: colour and emissive are sRGB, the rest numeric data. */
|
|
78
|
+
export function propSlotUse(name: PropMaterialSlot): 'colour' | 'data' { return name === 'colour' || name === 'emissive' ? 'colour' : 'data'; }
|
|
79
|
+
|
|
80
|
+
/** The slots each material family can draw; a graph draws a slot only through its own texture param of that name. */
|
|
81
|
+
const FAMILY_SLOTS: Readonly<Record<string, readonly PropMaterialSlot[]>> = {
|
|
82
|
+
pbr: PROP_MATERIAL_SLOTS, toon: PROP_MATERIAL_SLOTS, painterly: ['colour', 'normal', 'occlusion', 'emissive'], emissive: ['colour'],
|
|
83
|
+
};
|
|
84
|
+
const samplerKey = (s: PropTextureSlot): string => `${s.wrapS}/${s.wrapT}/${s.minFilter ?? '-'}/${s.magFilter ?? '-'}/${s.anisotropy}`;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Check named prop materials against the look catalogue and the admitted files: each ID resolves (an authored entry or a
|
|
88
|
+
* family default), each slot is one its family draws, each file is a KTX2 dependency of a declared props GLB in one
|
|
89
|
+
* colour / data role with one sampler, and never also a catalogue texture; `props.textures` stays empty (`models` is
|
|
90
|
+
* every declared props GLB: tiles, panels, models and the far proxy). Throws the first refusal, naming it.
|
|
91
|
+
*/
|
|
92
|
+
export function validatePropMaterials(materials: PropMaterials, context: {
|
|
93
|
+
look: v.InferOutput<typeof MaterialsSchema>; models: readonly string[]; textures: readonly { model: string }[];
|
|
94
|
+
files: readonly { hash: string; kind: string; dependencies: readonly string[] }[];
|
|
95
|
+
/** a graph file's bytes (product admission); without it a graph file's slots are checked there (D74) */
|
|
96
|
+
graphFile?: (hash: string) => Uint8Array | undefined;
|
|
97
|
+
}): void {
|
|
98
|
+
// the per-model colour texture is the one-family path's; with named materials every texture is a slot
|
|
99
|
+
if (context.textures.length > 0) throw new Error('props.materials replaces props.textures: bind each texture as a named material slot');
|
|
100
|
+
const files = new Map(context.files.map((file) => [file.hash, file]));
|
|
101
|
+
const declared = new Set(context.models.flatMap((model) => files.get(model)?.dependencies ?? []));
|
|
102
|
+
const catalogue = new Set(materialTextureRefs(context.look)), roles = new Map<string, string>(), samplers = new Map<string, string>();
|
|
103
|
+
for (const [name, row] of Object.entries(materials)) {
|
|
104
|
+
const entry = Object.hasOwn(context.look, row.id) ? context.look[row.id] : undefined;
|
|
105
|
+
const family = entry?.family ?? FAMILY_IDS.find((f) => f === row.id);
|
|
106
|
+
if (family === undefined) throw new Error(`props material "${name}": ${row.id} is not an admitted material ID`);
|
|
107
|
+
for (const [slotName, value] of propMaterialSlots(row)) {
|
|
108
|
+
if (family === 'graph') {
|
|
109
|
+
if (entry?.family === 'graph' && 'preset' in entry) throw new Error(`props material "${name}": its texture slots bind a graph, not a preset reference`);
|
|
110
|
+
const graphFile = context.graphFile, graph = entry?.family !== 'graph' ? undefined : !('file' in entry) ? entry.graph : graphFile === undefined ? null : materialGraphIr(entry, graphFile);
|
|
111
|
+
const param = graph === null ? undefined : graph?.params?.[slotName];
|
|
112
|
+
if (graph !== null && param?.type !== 'texture' && !(slotName === 'colour' && graph !== undefined && graphUsesMeshMap(graph))) throw new Error(`props material "${name}": graph ${row.id} has no texture param "${slotName}" for its ${slotName} slot`);
|
|
113
|
+
} else if (!(FAMILY_SLOTS[family] ?? []).includes(slotName)) throw new Error(`props material "${name}": the ${family} family draws no ${slotName} slot`);
|
|
114
|
+
const file = files.get(value.file);
|
|
115
|
+
if (file?.kind !== 'ktx2' || !declared.has(value.file)) throw new Error(`props material "${name}": its ${slotName} texture must be a KTX2 dependency of a declared props GLB`);
|
|
116
|
+
if (catalogue.has(value.file)) throw new Error(`props material "${name}": its ${slotName} texture is also a look.materials texture (one sampler per file)`);
|
|
117
|
+
// a graph reads every texture param in the colour role (clientGraphs): its slots take that role
|
|
118
|
+
const role = family === 'graph' ? 'colour' : propSlotUse(slotName), seenRole = roles.get(value.file);
|
|
119
|
+
if (seenRole !== undefined && seenRole !== role) throw new Error(`props material "${name}": one texture cannot mix colour and numeric data roles`);
|
|
120
|
+
roles.set(value.file, role);
|
|
121
|
+
const key = samplerKey(value), seenSampler = samplers.get(value.file);
|
|
122
|
+
if (seenSampler !== undefined && seenSampler !== key) throw new Error(`props material "${name}": one texture file takes one sampler`);
|
|
123
|
+
samplers.set(value.file, key);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** An admitted GLB's JSON document (its JSON chunk only; run after the bounded GLB parser admitted the bytes). */
|
|
129
|
+
function glbDocument(bytes: Uint8Array): object {
|
|
130
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
131
|
+
if (bytes.length < 20 || view.getUint32(0, true) !== 0x46546c67 || view.getUint32(16, true) !== 0x4e4f534a) throw new Error('invalid GLB header');
|
|
132
|
+
const doc: unknown = JSON.parse(new TextDecoder().decode(bytes.subarray(20, 20 + view.getUint32(12, true))));
|
|
133
|
+
if (typeof doc !== 'object' || doc === null) throw new Error('invalid GLB JSON');
|
|
134
|
+
return doc;
|
|
135
|
+
}
|
|
136
|
+
const rowsOf = (value: unknown, key: string): unknown[] => { const rows: unknown = typeof value === 'object' && value !== null ? Reflect.get(value, key) : undefined; return Array.isArray(rows) ? rows : []; };
|
|
137
|
+
/** The material names an admitted self-contained GLB declares ('' for an unnamed one). */
|
|
138
|
+
export function glbMaterialNames(bytes: Uint8Array): string[] {
|
|
139
|
+
return rowsOf(glbDocument(bytes), 'materials').map((row) => { const name: unknown = typeof row === 'object' && row !== null ? Reflect.get(row, 'name') : undefined; return typeof name === 'string' ? name : ''; });
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Refuse a props GLB that names (or leaves unnamed) a material the map does not carry, or has a primitive without a
|
|
143
|
+
* material: with named materials on, nothing draws a guessed surface.
|
|
144
|
+
*/
|
|
145
|
+
export function checkPropMaterialNames(materials: PropMaterials, bytes: Uint8Array): void {
|
|
146
|
+
for (const name of glbMaterialNames(bytes)) if (!Object.hasOwn(materials, name)) throw new Error(`props GLB material "${name || '(unnamed)'}" is not in props.materials`);
|
|
147
|
+
for (const mesh of rowsOf(glbDocument(bytes), 'meshes')) for (const primitive of rowsOf(mesh, 'primitives')) {
|
|
148
|
+
if (typeof primitive !== 'object' || primitive === null || typeof Reflect.get(primitive, 'material') !== 'number') throw new Error('props GLB primitive has no material');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
153
|
+
export type PropMaterialsInput = Record<string, {
|
|
154
|
+
id: string;
|
|
155
|
+
colour?: ({
|
|
156
|
+
file: string;
|
|
157
|
+
wrapS?: 33071 | 33648 | 10497 | undefined;
|
|
158
|
+
wrapT?: 33071 | 33648 | 10497 | undefined;
|
|
159
|
+
minFilter?: (9728 | 9729 | 9984 | 9985 | 9986 | 9987) | null | undefined;
|
|
160
|
+
magFilter?: (9728 | 9729) | null | undefined;
|
|
161
|
+
anisotropy?: number | undefined;
|
|
162
|
+
}) | null | undefined;
|
|
163
|
+
normal?: (Omit<{
|
|
164
|
+
file: string;
|
|
165
|
+
wrapS?: 33071 | 33648 | 10497 | undefined;
|
|
166
|
+
wrapT?: 33071 | 33648 | 10497 | undefined;
|
|
167
|
+
minFilter?: (9728 | 9729 | 9984 | 9985 | 9986 | 9987) | null | undefined;
|
|
168
|
+
magFilter?: (9728 | 9729) | null | undefined;
|
|
169
|
+
anisotropy?: number | undefined;
|
|
170
|
+
}, keyof ({
|
|
171
|
+
scale?: number | undefined;
|
|
172
|
+
})> & {
|
|
173
|
+
scale?: number | undefined;
|
|
174
|
+
}) | null | undefined;
|
|
175
|
+
metallicRoughness?: ({
|
|
176
|
+
file: string;
|
|
177
|
+
wrapS?: 33071 | 33648 | 10497 | undefined;
|
|
178
|
+
wrapT?: 33071 | 33648 | 10497 | undefined;
|
|
179
|
+
minFilter?: (9728 | 9729 | 9984 | 9985 | 9986 | 9987) | null | undefined;
|
|
180
|
+
magFilter?: (9728 | 9729) | null | undefined;
|
|
181
|
+
anisotropy?: number | undefined;
|
|
182
|
+
}) | null | undefined;
|
|
183
|
+
occlusion?: (Omit<{
|
|
184
|
+
file: string;
|
|
185
|
+
wrapS?: 33071 | 33648 | 10497 | undefined;
|
|
186
|
+
wrapT?: 33071 | 33648 | 10497 | undefined;
|
|
187
|
+
minFilter?: (9728 | 9729 | 9984 | 9985 | 9986 | 9987) | null | undefined;
|
|
188
|
+
magFilter?: (9728 | 9729) | null | undefined;
|
|
189
|
+
anisotropy?: number | undefined;
|
|
190
|
+
}, keyof ({
|
|
191
|
+
strength?: number | undefined;
|
|
192
|
+
})> & {
|
|
193
|
+
strength?: number | undefined;
|
|
194
|
+
}) | null | undefined;
|
|
195
|
+
emissive?: ({
|
|
196
|
+
file: string;
|
|
197
|
+
wrapS?: 33071 | 33648 | 10497 | undefined;
|
|
198
|
+
wrapT?: 33071 | 33648 | 10497 | undefined;
|
|
199
|
+
minFilter?: (9728 | 9729 | 9984 | 9985 | 9986 | 9987) | null | undefined;
|
|
200
|
+
magFilter?: (9728 | 9729) | null | undefined;
|
|
201
|
+
anisotropy?: number | undefined;
|
|
202
|
+
}) | null | undefined;
|
|
203
|
+
}>;
|
|
204
|
+
export type PropMaterials = Record<string, {
|
|
205
|
+
id: string;
|
|
206
|
+
colour: ({
|
|
207
|
+
file: string;
|
|
208
|
+
wrapS: 33071 | 33648 | 10497;
|
|
209
|
+
wrapT: 33071 | 33648 | 10497;
|
|
210
|
+
minFilter: (9728 | 9729 | 9984 | 9985 | 9986 | 9987) | null;
|
|
211
|
+
magFilter: (9728 | 9729) | null;
|
|
212
|
+
anisotropy: number;
|
|
213
|
+
}) | null;
|
|
214
|
+
normal: (Omit<{
|
|
215
|
+
file: string;
|
|
216
|
+
wrapS: 33071 | 33648 | 10497;
|
|
217
|
+
wrapT: 33071 | 33648 | 10497;
|
|
218
|
+
minFilter: (9728 | 9729 | 9984 | 9985 | 9986 | 9987) | null;
|
|
219
|
+
magFilter: (9728 | 9729) | null;
|
|
220
|
+
anisotropy: number;
|
|
221
|
+
}, keyof ({
|
|
222
|
+
scale: number;
|
|
223
|
+
})> & {
|
|
224
|
+
scale: number;
|
|
225
|
+
}) | null;
|
|
226
|
+
metallicRoughness: ({
|
|
227
|
+
file: string;
|
|
228
|
+
wrapS: 33071 | 33648 | 10497;
|
|
229
|
+
wrapT: 33071 | 33648 | 10497;
|
|
230
|
+
minFilter: (9728 | 9729 | 9984 | 9985 | 9986 | 9987) | null;
|
|
231
|
+
magFilter: (9728 | 9729) | null;
|
|
232
|
+
anisotropy: number;
|
|
233
|
+
}) | null;
|
|
234
|
+
occlusion: (Omit<{
|
|
235
|
+
file: string;
|
|
236
|
+
wrapS: 33071 | 33648 | 10497;
|
|
237
|
+
wrapT: 33071 | 33648 | 10497;
|
|
238
|
+
minFilter: (9728 | 9729 | 9984 | 9985 | 9986 | 9987) | null;
|
|
239
|
+
magFilter: (9728 | 9729) | null;
|
|
240
|
+
anisotropy: number;
|
|
241
|
+
}, keyof ({
|
|
242
|
+
strength: number;
|
|
243
|
+
})> & {
|
|
244
|
+
strength: number;
|
|
245
|
+
}) | null;
|
|
246
|
+
emissive: ({
|
|
247
|
+
file: string;
|
|
248
|
+
wrapS: 33071 | 33648 | 10497;
|
|
249
|
+
wrapT: 33071 | 33648 | 10497;
|
|
250
|
+
minFilter: (9728 | 9729 | 9984 | 9985 | 9986 | 9987) | null;
|
|
251
|
+
magFilter: (9728 | 9729) | null;
|
|
252
|
+
anisotropy: number;
|
|
253
|
+
}) | null;
|
|
254
|
+
}>;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { CELL_ABOVE, CELL_BELOW } from './contentBounds.ts';
|
|
3
|
+
import { isJsonData } from './json.ts';
|
|
4
|
+
import { PropMaterialsSchema, propMaterialTextureRefs, validatePropMaterials } from './propMaterials.ts';
|
|
5
|
+
import { SplatTerrainSchema, validateSplatTerrain } from './splatTerrain.ts';
|
|
6
|
+
import { glbPoint, glbTransform } from './glbTriangles.ts';
|
|
7
|
+
|
|
8
|
+
const ref = v.pipe(v.string(), v.regex(/^[a-f0-9]{64}$/u));
|
|
9
|
+
const id = v.pipe(v.string(), v.regex(/^[a-z][a-z0-9.-]*$/u), v.maxLength(128));
|
|
10
|
+
const address = v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(7));
|
|
11
|
+
const named = v.strictObject({ id, file: ref });
|
|
12
|
+
const coord = v.pipe(v.number(), v.finite(), v.minValue(-250), v.maxValue(250));
|
|
13
|
+
const height = v.pipe(v.number(), v.finite(), v.minValue(-CELL_BELOW), v.maxValue(CELL_ABOVE));
|
|
14
|
+
const finite = v.pipe(v.number(), v.finite());
|
|
15
|
+
const extent = v.pipe(finite, v.minValue(0.005), v.maxValue(250));
|
|
16
|
+
const point = v.strictObject({ x: coord, y: height, z: coord });
|
|
17
|
+
const surface = v.optional(v.picklist(['wood', 'stone', 'grass', 'sand', 'rock', 'metal', 'earth', 'felt']));
|
|
18
|
+
const rotation = v.pipe(v.strictObject({ x: finite, y: finite, z: finite, w: finite }), v.check((q) => Math.abs(q.x ** 2 + q.y ** 2 + q.z ** 2 + q.w ** 2 - 1) < 1e-5, 'unit collider rotation'));
|
|
19
|
+
const boxData = v.strictObject({ kind: v.literal('box'), x: coord, y: height, z: coord, hx: extent, hy: extent, hz: extent, yaw: v.optional(finite), rot: v.optional(rotation), surface });
|
|
20
|
+
function boxWithinCell(b: v.InferOutput<typeof boxData>): boolean {
|
|
21
|
+
const q = b.rot ?? { x: 0, y: Math.sin((b.yaw ?? 0) / 2), z: 0, w: Math.cos((b.yaw ?? 0) / 2) };
|
|
22
|
+
const transform = glbTransform({ translation: [b.x, b.y, b.z], rotation: [q.x, q.y, q.z, q.w] });
|
|
23
|
+
return Array.from({ length: 8 }, (_unused, index) => glbPoint(transform, {
|
|
24
|
+
x: (index & 1) === 0 ? -b.hx : b.hx, y: (index & 2) === 0 ? -b.hy : b.hy, z: (index & 4) === 0 ? -b.hz : b.hz,
|
|
25
|
+
})).every(vertex => Math.abs(vertex.x) <= 250 && Math.abs(vertex.z) <= 250 && vertex.y >= -CELL_BELOW && vertex.y <= CELL_ABOVE);
|
|
26
|
+
}
|
|
27
|
+
const box = v.pipe(boxData, v.check(boxWithinCell, 'collider within cell'));
|
|
28
|
+
const treads = v.pipe(v.strictObject({ kind: v.literal('treads'), from: point, to: point, width: extent, count: v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(256)), surface }), v.check((t) => Math.hypot(t.to.x - t.from.x, t.to.z - t.from.z) > 0 && t.to.y >= t.from.y && [t.from, t.to].every((p) => Math.abs(p.x) + t.width / 2 <= 250 && Math.abs(p.z) + t.width / 2 <= 250), 'bounded nondegenerate stair'));
|
|
29
|
+
const collider = v.strictObject({ id, panel: v.nullable(id), initialActive: v.boolean(), shapes: v.pipe(v.array(v.variant('kind', [box, treads])), v.minLength(1), v.maxLength(256)) });
|
|
30
|
+
/** Declared self-contained GLBs: merged tile meshes, EXT_mesh_gpu_instancing lists, far proxy and script-addressable panels. */
|
|
31
|
+
export const PropsSchema: v.GenericSchema<PropsDataInput, PropsData> = v.pipe(v.unknown(), v.check(isJsonData, 'JSON-only props'), v.strictObject({ version: v.literal(1), family: id,
|
|
32
|
+
materials: v.exactOptional(PropMaterialsSchema),
|
|
33
|
+
/** Explicit visual-only edge allowance in metres; absent preserves the fixed-cell refusal. */
|
|
34
|
+
overhang: v.exactOptional(v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(1))),
|
|
35
|
+
/** Exact whole source draws in ordinary library GLBs, installed only by a props-bound runtime. */
|
|
36
|
+
wholeLibrary: v.exactOptional(v.pipe(v.array(ref), v.minLength(1), v.maxLength(512), v.check(rows => new Set(rows).size === rows.length, 'unique whole library refs'))),
|
|
37
|
+
splat: v.exactOptional(SplatTerrainSchema),
|
|
38
|
+
tiles: v.pipe(v.array(v.strictObject({ lod: v.picklist([0, 1]), x: address, z: address, file: ref,
|
|
39
|
+
additionalFiles: v.exactOptional(v.pipe(v.array(ref), v.minLength(1), v.maxLength(128))) })), v.maxLength(80)),
|
|
40
|
+
panels: v.pipe(v.array(v.strictObject({ id, file: ref, visible: v.optional(v.boolean(), true) })), v.maxLength(64)), models: v.pipe(v.array(named), v.maxLength(64)), far: v.nullable(ref),
|
|
41
|
+
colliders: v.optional(v.pipe(v.array(collider), v.maxLength(1024)), []),
|
|
42
|
+
textures: v.pipe(v.array(v.strictObject({ model: ref, colour: ref })), v.maxLength(256)),
|
|
43
|
+
}), v.check((s) => new Set(s.tiles.map((t) => `${t.lod}/${t.x}/${t.z}`)).size === s.tiles.length && s.tiles.every((t) => t.x < (t.lod === 0 ? 8 : 4) && t.z < (t.lod === 0 ? 8 : 4)) && new Set([...s.panels, ...s.models].map((p) => p.id)).size === s.panels.length + s.models.length && new Set(s.textures.map((t) => t.model)).size === s.textures.length && new Set(s.colliders.map((c) => c.id)).size === s.colliders.length && s.colliders.reduce((n, c) => n + c.shapes.reduce((m, shape) => m + (shape.kind === 'treads' ? shape.count : 1), 0), 0) <= 2048 && s.colliders.every((c) => c.panel === null || s.panels.some((p) => p.id === c.panel)), 'unique props addresses and ids'));
|
|
44
|
+
/** Validated data for the props renderer; no callbacks, URLs or generator code enter this section. */
|
|
45
|
+
export type ShardProps = v.InferOutput<typeof PropsSchema>;
|
|
46
|
+
/** Check every render binding against ordinary admitted file, tile and library rows before allocating content. */
|
|
47
|
+
export function validatePropsReferences(props: ShardProps, content: { files: readonly { hash: string; kind: string; dependencies: readonly string[] }[]; tiles: readonly { lod: number; x: number; z: number; files: readonly string[] }[]; library: readonly string[]; far: { files: readonly string[] } | null; look?: { materials: Parameters<typeof validatePropMaterials>[1]['look'] } }): void {
|
|
48
|
+
const files = new Map(content.files.map((f) => [f.hash, f]));
|
|
49
|
+
const model = (hash: string) => { if (files.get(hash)?.kind !== 'glb') throw new Error('Prop model must reference an admitted GLB'); };
|
|
50
|
+
for (const tile of props.tiles) {
|
|
51
|
+
const refs = [tile.file, ...tile.additionalFiles ?? []];
|
|
52
|
+
if (new Set(refs).size !== refs.length) throw new Error('Props tile repeats a file');
|
|
53
|
+
for (const hash of refs) { model(hash); if (!content.tiles.find((t) => t.lod === tile.lod && t.x === tile.x && t.z === tile.z)?.files.includes(hash)) throw new Error('Props tile disagrees with tile files'); }
|
|
54
|
+
}
|
|
55
|
+
for (const hash of props.wholeLibrary ?? []) { model(hash); if (!content.library.includes(hash)) throw new Error('Whole geometry must belong to the library'); }
|
|
56
|
+
for (const entry of [...props.panels, ...props.models]) { model(entry.file); if (!content.library.includes(entry.file)) throw new Error('Prop panel/model must belong to the library'); }
|
|
57
|
+
if (props.far !== null) { model(props.far); if (!content.far?.files.includes(props.far)) throw new Error('Props far proxy disagrees with far files'); }
|
|
58
|
+
const refs = new Set([...props.tiles.flatMap((t) => [t.file, ...t.additionalFiles ?? []]), ...props.panels.map((p) => p.file), ...props.models.map((p) => p.file), ...(props.far === null ? [] : [props.far])]);
|
|
59
|
+
for (const texture of props.textures) if (!refs.has(texture.model) || files.get(texture.colour)?.kind !== 'ktx2' || !files.get(texture.model)?.dependencies.includes(texture.colour)) throw new Error('Prop texture must be a declared KTX2 dependency');
|
|
60
|
+
if (props.materials !== undefined) validatePropMaterials(props.materials, { look: content.look?.materials ?? {}, models: [...refs], textures: props.textures, files: content.files });
|
|
61
|
+
if (props.splat !== undefined) {
|
|
62
|
+
if (props.materials !== undefined && Object.hasOwn(props.materials, props.splat.material)) throw new Error('Splat terrain material cannot also name a prop material');
|
|
63
|
+
validateSplatTerrain(props.splat, { look: content.look?.materials ?? {}, tiles: props.tiles.map(tile => tile.file),
|
|
64
|
+
propTextures: [...props.textures.map(texture => texture.colour), ...propMaterialTextureRefs(props.materials)], files: content.files });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
70
|
+
export type PropsDataInput = unknown;
|
|
71
|
+
interface PropsDataFields {
|
|
72
|
+
version: 1;
|
|
73
|
+
family: string;
|
|
74
|
+
materials?: v.InferOutput<typeof PropMaterialsSchema>;
|
|
75
|
+
overhang?: number;
|
|
76
|
+
wholeLibrary?: (string)[];
|
|
77
|
+
splat?: v.InferOutput<typeof SplatTerrainSchema>;
|
|
78
|
+
tiles: ({
|
|
79
|
+
lod: 0 | 1;
|
|
80
|
+
x: number;
|
|
81
|
+
z: number;
|
|
82
|
+
file: string;
|
|
83
|
+
additionalFiles?: (string)[];
|
|
84
|
+
})[];
|
|
85
|
+
panels: ({
|
|
86
|
+
id: string;
|
|
87
|
+
file: string;
|
|
88
|
+
visible: boolean;
|
|
89
|
+
})[];
|
|
90
|
+
models: ({
|
|
91
|
+
id: string;
|
|
92
|
+
file: string;
|
|
93
|
+
})[];
|
|
94
|
+
far: (string) | null;
|
|
95
|
+
colliders: ({
|
|
96
|
+
id: string;
|
|
97
|
+
panel: (string) | null;
|
|
98
|
+
initialActive: boolean;
|
|
99
|
+
shapes: (({
|
|
100
|
+
kind: 'box';
|
|
101
|
+
x: number;
|
|
102
|
+
y: number;
|
|
103
|
+
z: number;
|
|
104
|
+
hx: number;
|
|
105
|
+
hy: number;
|
|
106
|
+
hz: number;
|
|
107
|
+
yaw?: number | undefined;
|
|
108
|
+
rot?: {
|
|
109
|
+
x: number;
|
|
110
|
+
y: number;
|
|
111
|
+
z: number;
|
|
112
|
+
w: number;
|
|
113
|
+
} | undefined;
|
|
114
|
+
surface?: 'wood' | 'stone' | 'grass' | 'sand' | 'rock' | 'metal' | 'earth' | 'felt' | undefined;
|
|
115
|
+
}) | ({
|
|
116
|
+
kind: 'treads';
|
|
117
|
+
from: {
|
|
118
|
+
x: number;
|
|
119
|
+
y: number;
|
|
120
|
+
z: number;
|
|
121
|
+
};
|
|
122
|
+
to: {
|
|
123
|
+
x: number;
|
|
124
|
+
y: number;
|
|
125
|
+
z: number;
|
|
126
|
+
};
|
|
127
|
+
width: number;
|
|
128
|
+
count: number;
|
|
129
|
+
surface?: 'wood' | 'stone' | 'grass' | 'sand' | 'rock' | 'metal' | 'earth' | 'felt' | undefined;
|
|
130
|
+
}))[];
|
|
131
|
+
})[];
|
|
132
|
+
textures: ({
|
|
133
|
+
model: string;
|
|
134
|
+
colour: string;
|
|
135
|
+
})[];
|
|
136
|
+
}
|
|
137
|
+
export type PropsData = { [Key in keyof PropsDataFields]: PropsDataFields[Key] };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { isJsonData } from './json.ts';
|
|
3
|
+
import { LootBagSchema } from './lootBag.ts';
|
|
4
|
+
|
|
5
|
+
const id = v.pipe(v.string(), v.minLength(1), v.maxLength(256));
|
|
6
|
+
/** Client-only continuation over entered quest and collection owners. Every
|
|
7
|
+
* model, economy and scheduling choice is an admitted data identity. */
|
|
8
|
+
export const QuestContinuationSchema: v.GenericSchema<QuestContinuationRowsInput, QuestContinuationRows> = v.pipe(v.unknown(), v.check(isJsonData, 'Quest continuation requires JSON rows'), v.strictObject({
|
|
9
|
+
quest: id, collection: id,
|
|
10
|
+
collections: v.literal('collections/displays'),
|
|
11
|
+
cosmetics: v.strictObject({ file: id, models: v.pipe(v.record(id, id), v.maxEntries(32)) }),
|
|
12
|
+
loot: v.strictObject({ bag: v.exactOptional(LootBagSchema), id, shop: id, minimap: v.boolean(), before: v.pipe(v.array(id), v.maxLength(64)) }),
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
/** Read standalone rows or the fixed resource field of an admitted quest page.
|
|
16
|
+
* The field is compiled here; documents cannot provide a selector or callback. */
|
|
17
|
+
export function parseQuestContinuationDocument(input: unknown): v.InferOutput<typeof QuestContinuationSchema> {
|
|
18
|
+
const rows = v.parse(v.pipe(v.unknown(), v.check(isJsonData, 'Quest document requires JSON rows'), v.union([
|
|
19
|
+
QuestContinuationSchema, v.object({ entryResources: v.object({ continuation: QuestContinuationSchema }) }),
|
|
20
|
+
])), input);
|
|
21
|
+
return 'entryResources' in rows ? rows.entryResources.continuation : rows;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
25
|
+
export type QuestContinuationRowsInput = unknown;
|
|
26
|
+
interface QuestContinuationRowsFields {
|
|
27
|
+
quest: string;
|
|
28
|
+
collection: string;
|
|
29
|
+
collections: 'collections/displays';
|
|
30
|
+
cosmetics: {
|
|
31
|
+
file: string;
|
|
32
|
+
models: Record<string, string>;
|
|
33
|
+
};
|
|
34
|
+
loot: {
|
|
35
|
+
bag?: v.InferOutput<typeof LootBagSchema>;
|
|
36
|
+
id: string;
|
|
37
|
+
shop: string;
|
|
38
|
+
minimap: boolean;
|
|
39
|
+
before: (string)[];
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export type QuestContinuationRows = { [Key in keyof QuestContinuationRowsFields]: QuestContinuationRowsFields[Key] };
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/** A quest page's placed kit figures (`quest.composition` `figures.file`, G571): each figure's kit and catalogue rows by
|
|
2
|
+
* id, where it stands (composition places), its part geometry and extra objects by scene resource id, what it
|
|
3
|
+
* publishes, and its pose system; a trader figure adds its counter model and live owners. Numbers and ids only. */
|
|
4
|
+
import * as v from 'valibot';
|
|
5
|
+
import { isJsonData } from './json.ts';
|
|
6
|
+
import { SpecimenModelMetadataSchema } from './specimenCatalogue.ts';
|
|
7
|
+
import { FigureGroupSchema } from './figures.ts';
|
|
8
|
+
|
|
9
|
+
const id = v.pipe(v.string(), v.minLength(1), v.maxLength(128)), n = v.pipe(v.number(), v.finite()), triple = v.tuple([n, n, n]);
|
|
10
|
+
const place = v.strictObject({ poi: id, x: n, z: n, y: v.exactOptional(n), dy: v.exactOptional(n), yaw: v.exactOptional(n), anchor: v.exactOptional(id) });
|
|
11
|
+
/** where an object sits in the figure's frame: its feet (origin), or the fire turned into that frame */
|
|
12
|
+
const at = v.picklist(['feet', 'fire']);
|
|
13
|
+
const object = v.variant('kind', [
|
|
14
|
+
/** an unlit vertex-coloured mesh (a fire's flames: colour > 1 blooms) */
|
|
15
|
+
v.strictObject({ kind: v.literal('basic-mesh'), id, name: id, draw: id, colour: triple, vertexColors: v.boolean(), at, lift: n }),
|
|
16
|
+
/** a building cloud (smoke) in a lent look: hidden, on an empty draw, until its draw and look are both lent */
|
|
17
|
+
v.strictObject({ kind: v.literal('cloud'), id, name: id, draw: id, look: id, at, center: triple, radius: n, order: n, seeds: v.boolean() }),
|
|
18
|
+
]);
|
|
19
|
+
const system = v.strictObject({ id, before: v.pipe(v.array(id), v.maxLength(8)) });
|
|
20
|
+
const ids = v.pipe(v.record(id, id), v.maxEntries(16));
|
|
21
|
+
export const QuestFigureSchema: v.GenericSchema<QuestFigureRowsInput, QuestFigureRows> = v.strictObject({
|
|
22
|
+
id, kit: id, feet: place, fire: v.exactOptional(place),
|
|
23
|
+
/** each kit part's fixed draw slot; campAt 'fire' moves the camp part to the fire */
|
|
24
|
+
parts: ids, campAt: v.exactOptional(v.literal('fire')),
|
|
25
|
+
objects: v.optional(v.pipe(v.array(object), v.maxLength(8)), []),
|
|
26
|
+
publish: v.optional(v.pipe(v.array(v.strictObject({ id, draw: id })), v.maxLength(8)), []),
|
|
27
|
+
/** a placed trader: its registry piece and name, the catalogue model whose static card is its specimen, and the counter
|
|
28
|
+
* model ahead metres in front of its feet */
|
|
29
|
+
piece: v.exactOptional(id), card: v.exactOptional(id), name: v.exactOptional(id),
|
|
30
|
+
counter: v.exactOptional(v.strictObject({ model: id, ahead: n, piece: id, name: id, solidFloor: v.boolean() })),
|
|
31
|
+
system,
|
|
32
|
+
});
|
|
33
|
+
/** One live figure per kit: a kit's catalogue rows name its part sources (`<kit>.<part>.source`) and its attention
|
|
34
|
+
* programs (`npc.<kit>`), so two rows reusing a kit would collide in the page's resources; ids are unique too. A page
|
|
35
|
+
* may instead declare one merged figure group (format/figures `FigureGroupSchema`: its figures drawn as one atlas skin),
|
|
36
|
+
* never beside kit figures. */
|
|
37
|
+
export const QuestFiguresSchema: v.GenericSchema<QuestFiguresRowsInput, QuestFiguresRows> = v.pipe(v.unknown(), v.check(isJsonData, 'plain JSON figures'),
|
|
38
|
+
v.strictObject({ figures: v.pipe(v.array(QuestFigureSchema), v.maxLength(8),
|
|
39
|
+
v.check(rows => new Set(rows.map(row => row.kit)).size === rows.length && new Set(rows.map(row => row.id)).size === rows.length, 'one figure per kit, unique ids')),
|
|
40
|
+
group: v.exactOptional(FigureGroupSchema) }), v.check(rows => rows.group === undefined || rows.figures.length === 0, 'a merged figure group stands alone'));
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
/** Cold Explorer kit cards reuse the live figure rows; their model has no
|
|
46
|
+
* ignored params or variants and their source selects one fixed field only. */
|
|
47
|
+
export const KitFigureCardsSchema: v.GenericSchema<KitFigureCardsRowsInput, KitFigureCardsRows> = v.pipe(v.unknown(), v.check(isJsonData, 'Kit figure cards require plain JSON'), v.strictObject({
|
|
48
|
+
catalogue: id, draws: v.literal('models/island-library'),
|
|
49
|
+
cards: v.pipe(v.record(id, v.strictObject({
|
|
50
|
+
model: v.strictObject({ ...v.pick(SpecimenModelMetadataSchema, ['id', 'name', 'file', 'category', 'pipeline', 'surface']).entries, defaults: v.strictObject({}) }),
|
|
51
|
+
figure: QuestFigureSchema,
|
|
52
|
+
})), v.maxEntries(64), v.check(rows => Object.keys(rows).length > 0, 'at least one kit figure card')),
|
|
53
|
+
}));
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
/** Read standalone rows or the fixed resource field of an admitted quest page.
|
|
57
|
+
* The field is compiled here; documents cannot provide a selector or callback. */
|
|
58
|
+
export function parseQuestFiguresDocument(input: unknown): QuestFiguresRows {
|
|
59
|
+
const rows = v.parse(v.pipe(v.unknown(), v.check(isJsonData, 'Quest document requires JSON rows'), v.union([
|
|
60
|
+
QuestFiguresSchema, v.object({ entryResources: v.object({ figures: QuestFiguresSchema }) }),
|
|
61
|
+
])), input);
|
|
62
|
+
return 'entryResources' in rows ? rows.entryResources.figures : rows;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
66
|
+
interface QuestFigureRowsInputFields {
|
|
67
|
+
id: string;
|
|
68
|
+
kit: string;
|
|
69
|
+
feet: {
|
|
70
|
+
poi: string;
|
|
71
|
+
x: number;
|
|
72
|
+
z: number;
|
|
73
|
+
y?: number;
|
|
74
|
+
dy?: number;
|
|
75
|
+
yaw?: number;
|
|
76
|
+
anchor?: string;
|
|
77
|
+
};
|
|
78
|
+
fire?: {
|
|
79
|
+
poi: string;
|
|
80
|
+
x: number;
|
|
81
|
+
z: number;
|
|
82
|
+
y?: number;
|
|
83
|
+
dy?: number;
|
|
84
|
+
yaw?: number;
|
|
85
|
+
anchor?: string;
|
|
86
|
+
};
|
|
87
|
+
parts: Record<string, string>;
|
|
88
|
+
campAt?: 'fire';
|
|
89
|
+
objects?: (({
|
|
90
|
+
kind: 'basic-mesh';
|
|
91
|
+
id: string;
|
|
92
|
+
name: string;
|
|
93
|
+
draw: string;
|
|
94
|
+
colour: [
|
|
95
|
+
number,
|
|
96
|
+
number,
|
|
97
|
+
number
|
|
98
|
+
];
|
|
99
|
+
vertexColors: boolean;
|
|
100
|
+
at: 'feet' | 'fire';
|
|
101
|
+
lift: number;
|
|
102
|
+
}) | ({
|
|
103
|
+
kind: 'cloud';
|
|
104
|
+
id: string;
|
|
105
|
+
name: string;
|
|
106
|
+
draw: string;
|
|
107
|
+
look: string;
|
|
108
|
+
at: 'feet' | 'fire';
|
|
109
|
+
center: [
|
|
110
|
+
number,
|
|
111
|
+
number,
|
|
112
|
+
number
|
|
113
|
+
];
|
|
114
|
+
radius: number;
|
|
115
|
+
order: number;
|
|
116
|
+
seeds: boolean;
|
|
117
|
+
}))[] | undefined;
|
|
118
|
+
publish?: ({
|
|
119
|
+
id: string;
|
|
120
|
+
draw: string;
|
|
121
|
+
})[] | undefined;
|
|
122
|
+
piece?: string;
|
|
123
|
+
card?: string;
|
|
124
|
+
name?: string;
|
|
125
|
+
counter?: {
|
|
126
|
+
model: string;
|
|
127
|
+
ahead: number;
|
|
128
|
+
piece: string;
|
|
129
|
+
name: string;
|
|
130
|
+
solidFloor: boolean;
|
|
131
|
+
};
|
|
132
|
+
system: {
|
|
133
|
+
id: string;
|
|
134
|
+
before: (string)[];
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
export type QuestFigureRowsInput = { [Key in keyof QuestFigureRowsInputFields]: QuestFigureRowsInputFields[Key] };
|
|
138
|
+
interface QuestFigureRowsFields {
|
|
139
|
+
id: string;
|
|
140
|
+
kit: string;
|
|
141
|
+
feet: {
|
|
142
|
+
poi: string;
|
|
143
|
+
x: number;
|
|
144
|
+
z: number;
|
|
145
|
+
y?: number;
|
|
146
|
+
dy?: number;
|
|
147
|
+
yaw?: number;
|
|
148
|
+
anchor?: string;
|
|
149
|
+
};
|
|
150
|
+
fire?: {
|
|
151
|
+
poi: string;
|
|
152
|
+
x: number;
|
|
153
|
+
z: number;
|
|
154
|
+
y?: number;
|
|
155
|
+
dy?: number;
|
|
156
|
+
yaw?: number;
|
|
157
|
+
anchor?: string;
|
|
158
|
+
};
|
|
159
|
+
parts: Record<string, string>;
|
|
160
|
+
campAt?: 'fire';
|
|
161
|
+
objects: (({
|
|
162
|
+
kind: 'basic-mesh';
|
|
163
|
+
id: string;
|
|
164
|
+
name: string;
|
|
165
|
+
draw: string;
|
|
166
|
+
colour: [
|
|
167
|
+
number,
|
|
168
|
+
number,
|
|
169
|
+
number
|
|
170
|
+
];
|
|
171
|
+
vertexColors: boolean;
|
|
172
|
+
at: 'feet' | 'fire';
|
|
173
|
+
lift: number;
|
|
174
|
+
}) | ({
|
|
175
|
+
kind: 'cloud';
|
|
176
|
+
id: string;
|
|
177
|
+
name: string;
|
|
178
|
+
draw: string;
|
|
179
|
+
look: string;
|
|
180
|
+
at: 'feet' | 'fire';
|
|
181
|
+
center: [
|
|
182
|
+
number,
|
|
183
|
+
number,
|
|
184
|
+
number
|
|
185
|
+
];
|
|
186
|
+
radius: number;
|
|
187
|
+
order: number;
|
|
188
|
+
seeds: boolean;
|
|
189
|
+
}))[];
|
|
190
|
+
publish: ({
|
|
191
|
+
id: string;
|
|
192
|
+
draw: string;
|
|
193
|
+
})[];
|
|
194
|
+
piece?: string;
|
|
195
|
+
card?: string;
|
|
196
|
+
name?: string;
|
|
197
|
+
counter?: {
|
|
198
|
+
model: string;
|
|
199
|
+
ahead: number;
|
|
200
|
+
piece: string;
|
|
201
|
+
name: string;
|
|
202
|
+
solidFloor: boolean;
|
|
203
|
+
};
|
|
204
|
+
system: {
|
|
205
|
+
id: string;
|
|
206
|
+
before: (string)[];
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
export type QuestFigureRows = { [Key in keyof QuestFigureRowsFields]: QuestFigureRowsFields[Key] };
|
|
210
|
+
export type QuestFiguresRowsInput = unknown;
|
|
211
|
+
interface QuestFiguresRowsFields {
|
|
212
|
+
figures: (QuestFigureRows)[];
|
|
213
|
+
group?: v.InferOutput<typeof FigureGroupSchema>;
|
|
214
|
+
}
|
|
215
|
+
export type QuestFiguresRows = { [Key in keyof QuestFiguresRowsFields]: QuestFiguresRowsFields[Key] };
|
|
216
|
+
export type KitFigureCardsRowsInput = unknown;
|
|
217
|
+
interface KitFigureCardsRowsFields {
|
|
218
|
+
catalogue: string;
|
|
219
|
+
draws: 'models/island-library';
|
|
220
|
+
cards: Record<string, {
|
|
221
|
+
model: {
|
|
222
|
+
defaults: Record<never, never>;
|
|
223
|
+
} & Pick<v.InferOutput<typeof SpecimenModelMetadataSchema>, 'id' | 'name' | 'file' | 'category' | 'pipeline' | 'surface'>;
|
|
224
|
+
figure: QuestFigureRows;
|
|
225
|
+
}>;
|
|
226
|
+
}
|
|
227
|
+
export type KitFigureCardsRows = { [Key in keyof KitFigureCardsRowsFields]: KitFigureCardsRowsFields[Key] };
|