@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,92 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { LimbCollisionBake } from './limbCollision.ts';
|
|
3
|
+
import { isJsonData } from './json.ts';
|
|
4
|
+
|
|
5
|
+
const n = v.pipe(v.number(), v.finite()), id = v.pipe(v.string(), v.minLength(1), v.maxLength(256));
|
|
6
|
+
const xyz = v.tuple([n, n, n]);
|
|
7
|
+
const part = v.strictObject({ id, geometry: id, material: id });
|
|
8
|
+
/** Client-only attachments, weak-point query and affine opening channels. */
|
|
9
|
+
export const BossSocketRigSchema: v.GenericSchema<BossSocketRigRowsInput, BossSocketRigRows> = v.pipe(v.unknown(), v.check(isJsonData, 'Socket rig requires JSON rows'), v.strictObject({
|
|
10
|
+
id, pool: v.strictObject({ url: id, parts: v.pipe(v.array(id), v.maxLength(8)) }), collision: v.strictObject({ joints: LimbCollisionBake.entries.joints, volumes: LimbCollisionBake.entries.volumes }),
|
|
11
|
+
materials: v.pipe(v.array(v.strictObject({ id, colour: xyz, emissive: xyz, gain: n, roughness: n, metalness: n, lit: v.boolean(), fog: v.boolean() })), v.maxLength(8)),
|
|
12
|
+
attachments: v.pipe(v.array(v.strictObject({ id, name: id, socket: id, at: xyz, meshes: v.pipe(v.array(part), v.maxLength(4)) })), v.maxLength(9)),
|
|
13
|
+
hazards: v.pipe(v.array(id), v.maxLength(8)), focus: id, radius: n,
|
|
14
|
+
glow: v.pipe(v.array(v.strictObject({ material: id, gain: n })), v.maxLength(8)),
|
|
15
|
+
opening: v.pipe(v.array(v.strictObject({ part: id, scale: xyz, breathe: xyz, frequency: n })), v.maxLength(8)),
|
|
16
|
+
emission: v.pipe(v.array(v.strictObject({ material: id, base: n, open: n })), v.maxLength(8)),
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
21
|
+
export type BossSocketRigRowsInput = unknown;
|
|
22
|
+
interface BossSocketRigRowsFields {
|
|
23
|
+
id: string;
|
|
24
|
+
pool: {
|
|
25
|
+
url: string;
|
|
26
|
+
parts: (string)[];
|
|
27
|
+
};
|
|
28
|
+
collision: {
|
|
29
|
+
joints: v.InferOutput<(typeof LimbCollisionBake)['entries']['joints']>;
|
|
30
|
+
volumes: v.InferOutput<(typeof LimbCollisionBake)['entries']['volumes']>;
|
|
31
|
+
};
|
|
32
|
+
materials: ({
|
|
33
|
+
id: string;
|
|
34
|
+
colour: [
|
|
35
|
+
number,
|
|
36
|
+
number,
|
|
37
|
+
number
|
|
38
|
+
];
|
|
39
|
+
emissive: [
|
|
40
|
+
number,
|
|
41
|
+
number,
|
|
42
|
+
number
|
|
43
|
+
];
|
|
44
|
+
gain: number;
|
|
45
|
+
roughness: number;
|
|
46
|
+
metalness: number;
|
|
47
|
+
lit: boolean;
|
|
48
|
+
fog: boolean;
|
|
49
|
+
})[];
|
|
50
|
+
attachments: ({
|
|
51
|
+
id: string;
|
|
52
|
+
name: string;
|
|
53
|
+
socket: string;
|
|
54
|
+
at: [
|
|
55
|
+
number,
|
|
56
|
+
number,
|
|
57
|
+
number
|
|
58
|
+
];
|
|
59
|
+
meshes: ({
|
|
60
|
+
id: string;
|
|
61
|
+
geometry: string;
|
|
62
|
+
material: string;
|
|
63
|
+
})[];
|
|
64
|
+
})[];
|
|
65
|
+
hazards: (string)[];
|
|
66
|
+
focus: string;
|
|
67
|
+
radius: number;
|
|
68
|
+
glow: ({
|
|
69
|
+
material: string;
|
|
70
|
+
gain: number;
|
|
71
|
+
})[];
|
|
72
|
+
opening: ({
|
|
73
|
+
part: string;
|
|
74
|
+
scale: [
|
|
75
|
+
number,
|
|
76
|
+
number,
|
|
77
|
+
number
|
|
78
|
+
];
|
|
79
|
+
breathe: [
|
|
80
|
+
number,
|
|
81
|
+
number,
|
|
82
|
+
number
|
|
83
|
+
];
|
|
84
|
+
frequency: number;
|
|
85
|
+
})[];
|
|
86
|
+
emission: ({
|
|
87
|
+
material: string;
|
|
88
|
+
base: number;
|
|
89
|
+
open: number;
|
|
90
|
+
})[];
|
|
91
|
+
}
|
|
92
|
+
export type BossSocketRigRows = { [Key in keyof BossSocketRigRowsFields]: BossSocketRigRowsFields[Key] };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import {isJsonData} from './json.ts';
|
|
3
|
+
import {ReturnProgramSchema} from './namedJsonContracts.ts';
|
|
4
|
+
import {ProjectedTrailSchema} from './clientTrails.ts';
|
|
5
|
+
|
|
6
|
+
const text=v.pipe(v.string(),v.minLength(1),v.maxLength(512)),finite=v.pipe(v.number(),v.finite()),positive=v.pipe(finite,v.minValue(0));
|
|
7
|
+
const tag=v.custom<`${string}.${string}`>(input=>typeof input==='string'&&/^[^.]+\..+$/u.test(input));
|
|
8
|
+
const tags=v.pipe(v.array(tag),v.maxLength(64));
|
|
9
|
+
const weapon=v.custom<`weapon.${string}`>(input=>typeof input==='string'&&/^weapon\.[a-z0-9.-]+$/u.test(input));
|
|
10
|
+
/** Original source rules are evaluated only by the variant baker. */
|
|
11
|
+
export const BowSourceMultipliersSchema: v.GenericSchema<BowSourceMultipliersRowsInput, BowSourceMultipliersRows>=v.pipe(v.array(v.strictObject({id:text,when:v.strictObject({sourceTags:v.exactOptional(tags),targetTags:v.exactOptional(tags),weaponTags:v.exactOptional(tags),targetState:v.exactOptional(tags)}),mul:positive})),v.maxLength(128));
|
|
12
|
+
const scales=v.strictTuple([positive,positive]);
|
|
13
|
+
/** Build-only admission of the held variant; its native bow and actor owner stay charged. */
|
|
14
|
+
export const BowVariantSchema: v.GenericSchema<BowVariantRowsInput, BowVariantRows> & { readonly pipe: readonly [unknown, unknown, { readonly entries: { readonly id: v.GenericSchema<BowVariantRows['id'], BowVariantRows['id']>; readonly sourceTag: v.GenericSchema<BowVariantRows['sourceTag'], BowVariantRows['sourceTag']> } }] }=v.pipe(v.unknown(),v.check(isJsonData),v.strictObject({
|
|
15
|
+
id:weapon,name:text,style:v.picklist(['recurve','golden','sky-wolf']),drawSpeed:v.pipe(positive,v.minValue(.001)),
|
|
16
|
+
program:ReturnProgramSchema,signal:text,threshold:positive,pierce:positive,crush:positive,crushKinds:v.pipe(v.array(text),v.maxLength(32)),
|
|
17
|
+
sourceTag:tag,damageScale:v.strictObject({base:scales,kinds:v.record(text,scales)}),
|
|
18
|
+
flight:v.strictObject({base:positive,draw:positive,offset:positive,step:v.pipe(positive,v.minValue(.001)),from:positive,gap:v.pipe(positive,v.minValue(.001))}),
|
|
19
|
+
trail:ProjectedTrailSchema,
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
24
|
+
export type BowSourceMultipliersRowsInput = BowSourceMultipliersRows;
|
|
25
|
+
export type BowSourceMultipliersRows = ({
|
|
26
|
+
id: string;
|
|
27
|
+
when: {
|
|
28
|
+
sourceTags?: (`${string}.${string}`)[];
|
|
29
|
+
targetTags?: (`${string}.${string}`)[];
|
|
30
|
+
weaponTags?: (`${string}.${string}`)[];
|
|
31
|
+
targetState?: (`${string}.${string}`)[];
|
|
32
|
+
};
|
|
33
|
+
mul: number;
|
|
34
|
+
})[];
|
|
35
|
+
export type BowVariantRowsInput = unknown;
|
|
36
|
+
interface BowVariantRowsFields {
|
|
37
|
+
id: `weapon.${string}`;
|
|
38
|
+
name: string;
|
|
39
|
+
style: 'recurve' | 'golden' | 'sky-wolf';
|
|
40
|
+
drawSpeed: number;
|
|
41
|
+
program: v.InferOutput<typeof ReturnProgramSchema>;
|
|
42
|
+
signal: string;
|
|
43
|
+
threshold: number;
|
|
44
|
+
pierce: number;
|
|
45
|
+
crush: number;
|
|
46
|
+
crushKinds: (string)[];
|
|
47
|
+
sourceTag: `${string}.${string}`;
|
|
48
|
+
damageScale: {
|
|
49
|
+
base: [
|
|
50
|
+
number,
|
|
51
|
+
number
|
|
52
|
+
];
|
|
53
|
+
kinds: Record<string, [
|
|
54
|
+
number,
|
|
55
|
+
number
|
|
56
|
+
]>;
|
|
57
|
+
};
|
|
58
|
+
flight: {
|
|
59
|
+
base: number;
|
|
60
|
+
draw: number;
|
|
61
|
+
offset: number;
|
|
62
|
+
step: number;
|
|
63
|
+
from: number;
|
|
64
|
+
gap: number;
|
|
65
|
+
};
|
|
66
|
+
trail: v.InferOutput<typeof ProjectedTrailSchema>;
|
|
67
|
+
}
|
|
68
|
+
export type BowVariantRows = { [Key in keyof BowVariantRowsFields]: BowVariantRowsFields[Key] };
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
|
|
3
|
+
const key = v.pipe(v.string(), v.regex(/^[a-z][a-z0-9.:-]*$/u), v.maxLength(128));
|
|
4
|
+
const cue = v.pipe(v.string(), v.regex(/^[a-z][a-z0-9_.:-]*$/u), v.maxLength(128));
|
|
5
|
+
const radius = v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(600));
|
|
6
|
+
const cadence = v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(60), v.check(n => 60 % n === 0, 'Brain divisor divides 60')), 6);
|
|
7
|
+
const duration = v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(600));
|
|
8
|
+
/** Circling melee policy data; the host retains navigation, attack tokens, strike clocks and random streams. */
|
|
9
|
+
export const SkirmisherSchema: v.SchemaWithPipe<readonly [v.StrictObjectSchema<{ readonly id: v.GenericSchema<ShardSkirmisherInput['id'], ShardSkirmisher['id']>; readonly kind: v.GenericSchema<ShardSkirmisherInput['kind'], ShardSkirmisher['kind']>; readonly thinkDivisor: v.OptionalSchema<v.GenericSchema<Exclude<ShardSkirmisherInput['thinkDivisor'], undefined>, Exclude<ShardSkirmisher['thinkDivisor'], undefined>>, 6>; readonly awareRadius: v.GenericSchema<ShardSkirmisherInput['awareRadius'], ShardSkirmisher['awareRadius']>; readonly shyRadius: v.GenericSchema<ShardSkirmisherInput['shyRadius'], ShardSkirmisher['shyRadius']>; readonly disengageRadius: v.GenericSchema<ShardSkirmisherInput['disengageRadius'], ShardSkirmisher['disengageRadius']>; readonly holdRadius: v.GenericSchema<ShardSkirmisherInput['holdRadius'], ShardSkirmisher['holdRadius']>; readonly attackRadius: v.GenericSchema<ShardSkirmisherInput['attackRadius'], ShardSkirmisher['attackRadius']>; readonly attackDuration: v.GenericSchema<ShardSkirmisherInput['attackDuration'], ShardSkirmisher['attackDuration']>; readonly attackCooldown: v.GenericSchema<ShardSkirmisherInput['attackCooldown'], ShardSkirmisher['attackCooldown']>; readonly alertCooldown: v.GenericSchema<ShardSkirmisherInput['alertCooldown'], ShardSkirmisher['alertCooldown']>; readonly fleeSpeed: v.GenericSchema<ShardSkirmisherInput['fleeSpeed'], ShardSkirmisher['fleeSpeed']>; readonly subordinateVariant: v.GenericSchema<ShardSkirmisherInput['subordinateVariant'], ShardSkirmisher['subordinateVariant']>; readonly leaderVariant: v.GenericSchema<ShardSkirmisherInput['leaderVariant'], ShardSkirmisher['leaderVariant']>; readonly noticeCue: v.GenericSchema<ShardSkirmisherInput['noticeCue'], ShardSkirmisher['noticeCue']>; }, undefined>, v.CheckAction<{ [K in keyof ShardSkirmisher]: ShardSkirmisher[K] }, 'Ordered skirmisher perception and strike radii'>]> = v.pipe(v.strictObject({
|
|
10
|
+
id: key, kind: v.literal('skirmisher'), thinkDivisor: cadence, awareRadius: radius, shyRadius: radius, disengageRadius: radius,
|
|
11
|
+
holdRadius: radius, attackRadius: radius, attackDuration: v.pipe(duration, v.minValue(Number.MIN_VALUE)),
|
|
12
|
+
attackCooldown: duration, alertCooldown: duration,
|
|
13
|
+
fleeSpeed: v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(15)),
|
|
14
|
+
subordinateVariant: key, leaderVariant: key, noticeCue: cue,
|
|
15
|
+
}), v.check((row) => row.shyRadius <= row.awareRadius && row.awareRadius <= row.disengageRadius
|
|
16
|
+
&& row.attackRadius <= row.awareRadius, 'Ordered skirmisher perception and strike radii'));
|
|
17
|
+
/** Admitted archetype parameters, identified independently from a particular creature spawn. */
|
|
18
|
+
|
|
19
|
+
/** Reject unknown fields, nonfinite tuning and invalid radii before installing an actor policy. */
|
|
20
|
+
export function parseSkirmisher(data: unknown): ShardSkirmisher { return v.parse(SkirmisherSchema, data); }
|
|
21
|
+
|
|
22
|
+
/** Custom author policy over bounded host queries; actor identity and observation provenance are injected by the loader. */
|
|
23
|
+
export const ScriptBrainSchema: v.SchemaWithPipe<readonly [v.StrictObjectSchema<{ readonly id: v.GenericSchema<ShardScriptBrainInput['id'], ShardScriptBrain['id']>; readonly kind: v.GenericSchema<ShardScriptBrainInput['kind'], ShardScriptBrain['kind']>; readonly module: v.GenericSchema<ShardScriptBrainInput['module'], ShardScriptBrain['module']>; readonly thinkDivisor: v.GenericSchema<ShardScriptBrainInput['thinkDivisor'], ShardScriptBrain['thinkDivisor']>; readonly maxSpeed: v.GenericSchema<ShardScriptBrainInput['maxSpeed'], ShardScriptBrain['maxSpeed']>; readonly maxStrafe: v.GenericSchema<ShardScriptBrainInput['maxStrafe'], ShardScriptBrain['maxStrafe']>; readonly maxTurnRate: v.GenericSchema<ShardScriptBrainInput['maxTurnRate'], ShardScriptBrain['maxTurnRate']>; readonly parameters: v.GenericSchema<ShardScriptBrainInput['parameters'], ShardScriptBrain['parameters']>; readonly strikes: v.GenericSchema<ShardScriptBrainInput['strikes'], ShardScriptBrain['strikes']>; }, undefined>, v.CheckAction<{ [K in keyof ShardScriptBrain]: ShardScriptBrain[K] }, 'Unique declared brain strike events'>]> = v.pipe(v.strictObject({
|
|
24
|
+
id: key, kind: v.literal('script'), module: v.pipe(v.string(), v.regex(/^[a-f0-9]{64}$/u)),
|
|
25
|
+
thinkDivisor: v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(60), v.check(n => 60 % n === 0, 'Brain divisor divides 60')),
|
|
26
|
+
maxSpeed: v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(15)),
|
|
27
|
+
maxStrafe: v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(15)),
|
|
28
|
+
maxTurnRate: v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(30)),
|
|
29
|
+
parameters: v.pipe(v.array(v.pipe(v.number(), v.finite(), v.minValue(-10000), v.maxValue(10000))), v.maxLength(64)),
|
|
30
|
+
strikes: v.pipe(v.array(v.strictObject({ event: v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(0x7fffffff)), strike: key })), v.maxLength(32)),
|
|
31
|
+
}), v.check(row => new Set(row.strikes.map(strike => strike.event)).size === row.strikes.length, 'Unique declared brain strike events'));
|
|
32
|
+
/** Validated script policy; only named admitted strikes may be requested and motion stays within its declared bounds. */
|
|
33
|
+
|
|
34
|
+
/** Validate a custom policy before module admission, trusted actor binding or physics allocation. */
|
|
35
|
+
export function parseScriptBrain(data: unknown): ShardScriptBrain { return v.parse(ScriptBrainSchema, data); }
|
|
36
|
+
|
|
37
|
+
/** Interior guardian policy; native floor and rise/sink recipes publish completion through trusted ports. */
|
|
38
|
+
export const GuardianSchema: v.SchemaWithPipe<readonly [v.StrictObjectSchema<{ readonly id: v.GenericSchema<ShardGuardianInput['id'], ShardGuardian['id']>; readonly kind: v.GenericSchema<ShardGuardianInput['kind'], ShardGuardian['kind']>; readonly thinkDivisor: v.OptionalSchema<v.GenericSchema<Exclude<ShardGuardianInput['thinkDivisor'], undefined>, Exclude<ShardGuardian['thinkDivisor'], undefined>>, 6>; readonly wakeRadius: v.GenericSchema<ShardGuardianInput['wakeRadius'], ShardGuardian['wakeRadius']>; readonly guardRadius: v.GenericSchema<ShardGuardianInput['guardRadius'], ShardGuardian['guardRadius']>; readonly approachRadius: v.GenericSchema<ShardGuardianInput['approachRadius'], ShardGuardian['approachRadius']>; readonly swingRadius: v.GenericSchema<ShardGuardianInput['swingRadius'], ShardGuardian['swingRadius']>; readonly swingDuration: v.GenericSchema<ShardGuardianInput['swingDuration'], ShardGuardian['swingDuration']>; readonly speed: v.GenericSchema<ShardGuardianInput['speed'], ShardGuardian['speed']>; readonly holdRadius: v.GenericSchema<ShardGuardianInput['holdRadius'], ShardGuardian['holdRadius']>; readonly sideSpeed: v.GenericSchema<ShardGuardianInput['sideSpeed'], ShardGuardian['sideSpeed']>; readonly sideFlipSeconds: v.GenericSchema<ShardGuardianInput['sideFlipSeconds'], ShardGuardian['sideFlipSeconds']>; readonly sinkAfterSeconds: v.GenericSchema<ShardGuardianInput['sinkAfterSeconds'], ShardGuardian['sinkAfterSeconds']>; readonly cooldownSeconds: v.GenericSchema<ShardGuardianInput['cooldownSeconds'], ShardGuardian['cooldownSeconds']>; readonly hideOffset: v.GenericSchema<ShardGuardianInput['hideOffset'], ShardGuardian['hideOffset']>; readonly noticeCue: v.GenericSchema<ShardGuardianInput['noticeCue'], ShardGuardian['noticeCue']>; }, undefined>, v.CheckAction<{ [K in keyof ShardGuardian]: ShardGuardian[K] }, 'Ordered guardian radii'>]> = v.pipe(v.strictObject({
|
|
39
|
+
id: key, kind: v.literal('guardian'), thinkDivisor: cadence, wakeRadius: radius, guardRadius: radius, approachRadius: radius,
|
|
40
|
+
swingRadius: radius, swingDuration: v.pipe(duration, v.minValue(Number.MIN_VALUE)),
|
|
41
|
+
speed: v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(15)), holdRadius: radius,
|
|
42
|
+
sideSpeed: v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(15)),
|
|
43
|
+
sideFlipSeconds: duration, sinkAfterSeconds: duration, cooldownSeconds: duration,
|
|
44
|
+
hideOffset: v.pipe(v.number(), v.finite(), v.minValue(-15), v.maxValue(15)), noticeCue: cue,
|
|
45
|
+
}), v.check(row => row.wakeRadius <= row.guardRadius && row.swingRadius <= row.approachRadius, 'Ordered guardian radii'));
|
|
46
|
+
/** Admitted interior guardian tuning, independent from a native rig or floor recipe. */
|
|
47
|
+
|
|
48
|
+
/** Validate guardian decisions before selecting the existing native motion and strike recipes. */
|
|
49
|
+
export function parseGuardian(data: unknown): ShardGuardian { return v.parse(GuardianSchema, data); }
|
|
50
|
+
|
|
51
|
+
/** Perch hunting decisions; native perch selection, vertical completion and shared attack RNG remain trusted host ports. */
|
|
52
|
+
export const PerchHunterSchema: v.SchemaWithPipe<readonly [v.StrictObjectSchema<{ readonly id: v.GenericSchema<ShardPerchHunterInput['id'], ShardPerchHunter['id']>; readonly kind: v.GenericSchema<ShardPerchHunterInput['kind'], ShardPerchHunter['kind']>; readonly thinkDivisor: v.OptionalSchema<v.GenericSchema<Exclude<ShardPerchHunterInput['thinkDivisor'], undefined>, Exclude<ShardPerchHunter['thinkDivisor'], undefined>>, 6>; readonly throwRadius: v.GenericSchema<ShardPerchHunterInput['throwRadius'], ShardPerchHunter['throwRadius']>; readonly throwDuration: v.GenericSchema<ShardPerchHunterInput['throwDuration'], ShardPerchHunter['throwDuration']>; readonly biteRadius: v.GenericSchema<ShardPerchHunterInput['biteRadius'], ShardPerchHunter['biteRadius']>; readonly biteDuration: v.GenericSchema<ShardPerchHunterInput['biteDuration'], ShardPerchHunter['biteDuration']>; readonly underRadius: v.GenericSchema<ShardPerchHunterInput['underRadius'], ShardPerchHunter['underRadius']>; readonly underSeconds: v.GenericSchema<ShardPerchHunterInput['underSeconds'], ShardPerchHunter['underSeconds']>; readonly holdRadius: v.GenericSchema<ShardPerchHunterInput['holdRadius'], ShardPerchHunter['holdRadius']>; readonly runSpeed: v.GenericSchema<ShardPerchHunterInput['runSpeed'], ShardPerchHunter['runSpeed']>; readonly activeGroundSeconds: v.GenericSchema<ShardPerchHunterInput['activeGroundSeconds'], ShardPerchHunter['activeGroundSeconds']>; readonly biteCooldown: v.GenericSchema<ShardPerchHunterInput['biteCooldown'], ShardPerchHunter['biteCooldown']>; readonly throwCooldownMin: v.GenericSchema<ShardPerchHunterInput['throwCooldownMin'], ShardPerchHunter['throwCooldownMin']>; readonly throwCooldownMax: v.GenericSchema<ShardPerchHunterInput['throwCooldownMax'], ShardPerchHunter['throwCooldownMax']>; readonly alertCue: v.GenericSchema<ShardPerchHunterInput['alertCue'], ShardPerchHunter['alertCue']>; readonly noticeCue: v.GenericSchema<ShardPerchHunterInput['noticeCue'], ShardPerchHunter['noticeCue']>; }, undefined>, v.CheckAction<{ [K in keyof ShardPerchHunter]: ShardPerchHunter[K] }, 'Ordered perch attack ranges and cooldowns'>]> = v.pipe(v.strictObject({
|
|
53
|
+
id: key, kind: v.literal('perch-hunter'), thinkDivisor: cadence, throwRadius: radius, throwDuration: v.pipe(duration, v.minValue(Number.MIN_VALUE)),
|
|
54
|
+
biteRadius: radius, biteDuration: v.pipe(duration, v.minValue(Number.MIN_VALUE)), underRadius: radius, underSeconds: duration,
|
|
55
|
+
holdRadius: radius, runSpeed: v.pipe(v.number(), v.finite(), v.minValue(0), v.maxValue(15)), activeGroundSeconds: duration,
|
|
56
|
+
biteCooldown: duration, throwCooldownMin: duration, throwCooldownMax: duration, alertCue: cue, noticeCue: cue,
|
|
57
|
+
}), v.check(row => row.biteRadius <= row.throwRadius && row.throwCooldownMin <= row.throwCooldownMax, 'Ordered perch attack ranges and cooldowns'));
|
|
58
|
+
/** Admitted ranged-perch and ground-attack policy parameters. */
|
|
59
|
+
|
|
60
|
+
/** Validate policy data while retaining the loader's authority over perches, projectiles and tokens. */
|
|
61
|
+
export function parsePerchHunter(data: unknown): ShardPerchHunter { return v.parse(PerchHunterSchema, data); }
|
|
62
|
+
|
|
63
|
+
/** One home/perch guardian archetype; each branch keeps the exact legacy bounds, defaults and predicate. */
|
|
64
|
+
export const GuardianPatternsSchema: v.VariantSchema<'pattern', readonly [
|
|
65
|
+
v.StrictObjectSchema<(typeof GuardianSchema)['pipe'][0]['entries'] & { readonly pattern: v.LiteralSchema<'interior', undefined> }, undefined>,
|
|
66
|
+
v.StrictObjectSchema<Omit<(typeof PerchHunterSchema)['pipe'][0]['entries'], 'kind'> & { readonly kind: v.LiteralSchema<'guardian', undefined>; readonly pattern: v.LiteralSchema<'perch', undefined> }, undefined>
|
|
67
|
+
], undefined> = v.variant('pattern', [
|
|
68
|
+
v.pipe(v.strictObject({ ...GuardianSchema.pipe[0].entries, pattern: v.literal('interior') }),
|
|
69
|
+
v.check(row => GuardianSchema.pipe[1].requirement(row), 'Ordered guardian radii')),
|
|
70
|
+
v.pipe(v.strictObject({ ...PerchHunterSchema.pipe[0].entries, kind: v.literal('guardian'), pattern: v.literal('perch') }),
|
|
71
|
+
v.check(row => PerchHunterSchema.pipe[1].requirement({ ...row, kind: 'perch-hunter' }), 'Ordered perch attack ranges and cooldowns')),
|
|
72
|
+
]);
|
|
73
|
+
/** Admitted guardian pattern data; native floor/perch/body/RNG ports retain gameplay authority. */
|
|
74
|
+
|
|
75
|
+
/** Validate a pattern without allocating an actor or executing its native recipes. */
|
|
76
|
+
export function parseGuardianPattern(data: unknown): ShardGuardianPattern { return v.parse(GuardianPatternsSchema, data); }
|
|
77
|
+
/** Canonical old row, including parsed field order, for existing native adapters and saved policy strings. */
|
|
78
|
+
export function guardianPreset(data: ShardGuardianPattern): ShardGuardian | ShardPerchHunter {
|
|
79
|
+
const { pattern: _pattern, ...row } = data;
|
|
80
|
+
return data.pattern === 'interior' ? parseGuardian(row) : parsePerchHunter({ ...row, kind: 'perch-hunter' });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Circling melee pattern of the stalker archetype, retaining exact legacy bounds and cadence. */
|
|
84
|
+
export const StalkerSchema: v.SchemaWithPipe<readonly [v.StrictObjectSchema<{ readonly id: v.GenericSchema<ShardStalkerInput['id'], ShardStalker['id']>; readonly kind: v.GenericSchema<ShardStalkerInput['kind'], ShardStalker['kind']>; readonly thinkDivisor: v.OptionalSchema<v.GenericSchema<Exclude<ShardStalkerInput['thinkDivisor'], undefined>, Exclude<ShardStalker['thinkDivisor'], undefined>>, 6>; readonly awareRadius: v.GenericSchema<ShardStalkerInput['awareRadius'], ShardStalker['awareRadius']>; readonly shyRadius: v.GenericSchema<ShardStalkerInput['shyRadius'], ShardStalker['shyRadius']>; readonly disengageRadius: v.GenericSchema<ShardStalkerInput['disengageRadius'], ShardStalker['disengageRadius']>; readonly holdRadius: v.GenericSchema<ShardStalkerInput['holdRadius'], ShardStalker['holdRadius']>; readonly attackRadius: v.GenericSchema<ShardStalkerInput['attackRadius'], ShardStalker['attackRadius']>; readonly attackDuration: v.GenericSchema<ShardStalkerInput['attackDuration'], ShardStalker['attackDuration']>; readonly attackCooldown: v.GenericSchema<ShardStalkerInput['attackCooldown'], ShardStalker['attackCooldown']>; readonly alertCooldown: v.GenericSchema<ShardStalkerInput['alertCooldown'], ShardStalker['alertCooldown']>; readonly fleeSpeed: v.GenericSchema<ShardStalkerInput['fleeSpeed'], ShardStalker['fleeSpeed']>; readonly subordinateVariant: v.GenericSchema<ShardStalkerInput['subordinateVariant'], ShardStalker['subordinateVariant']>; readonly leaderVariant: v.GenericSchema<ShardStalkerInput['leaderVariant'], ShardStalker['leaderVariant']>; readonly noticeCue: v.GenericSchema<ShardStalkerInput['noticeCue'], ShardStalker['noticeCue']>; readonly pattern: v.GenericSchema<ShardStalkerInput['pattern'], ShardStalker['pattern']>; }, undefined>, v.CheckAction<{ [K in keyof ShardStalker]: ShardStalker[K] }, 'Ordered skirmisher perception and strike radii'>]> = v.pipe(v.strictObject({ ...SkirmisherSchema.pipe[0].entries,
|
|
85
|
+
kind: v.literal('stalker'), pattern: v.literal('skirmish') }),
|
|
86
|
+
v.check(row => SkirmisherSchema.pipe[1].requirement({ ...row, kind: 'skirmisher' }), 'Ordered skirmisher perception and strike radii'));
|
|
87
|
+
/** Admitted stalker pattern data; native body, attack tokens and RNG remain host-owned. */
|
|
88
|
+
|
|
89
|
+
/** Admit a stalker row before any actor, native recipe or callback is allocated. */
|
|
90
|
+
export function parseStalker(data: unknown): ShardStalker { return v.parse(StalkerSchema, data); }
|
|
91
|
+
/** Canonical legacy row, including parsed key order, for native adapters and existing saved policy strings. */
|
|
92
|
+
export function stalkerPreset(data: ShardStalker): ShardSkirmisher {
|
|
93
|
+
const { pattern: _pattern, ...row } = data;
|
|
94
|
+
return parseSkirmisher({ ...row, kind: 'skirmisher' });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
98
|
+
interface ShardSkirmisherInputFields {
|
|
99
|
+
id: string;
|
|
100
|
+
kind: 'skirmisher';
|
|
101
|
+
thinkDivisor?: number | undefined;
|
|
102
|
+
awareRadius: number;
|
|
103
|
+
shyRadius: number;
|
|
104
|
+
disengageRadius: number;
|
|
105
|
+
holdRadius: number;
|
|
106
|
+
attackRadius: number;
|
|
107
|
+
attackDuration: number;
|
|
108
|
+
attackCooldown: number;
|
|
109
|
+
alertCooldown: number;
|
|
110
|
+
fleeSpeed: number;
|
|
111
|
+
subordinateVariant: string;
|
|
112
|
+
leaderVariant: string;
|
|
113
|
+
noticeCue: string;
|
|
114
|
+
}
|
|
115
|
+
export type ShardSkirmisherInput = { [Key in keyof ShardSkirmisherInputFields]: ShardSkirmisherInputFields[Key] };
|
|
116
|
+
interface ShardSkirmisherFields {
|
|
117
|
+
id: string;
|
|
118
|
+
kind: 'skirmisher';
|
|
119
|
+
thinkDivisor: number;
|
|
120
|
+
awareRadius: number;
|
|
121
|
+
shyRadius: number;
|
|
122
|
+
disengageRadius: number;
|
|
123
|
+
holdRadius: number;
|
|
124
|
+
attackRadius: number;
|
|
125
|
+
attackDuration: number;
|
|
126
|
+
attackCooldown: number;
|
|
127
|
+
alertCooldown: number;
|
|
128
|
+
fleeSpeed: number;
|
|
129
|
+
subordinateVariant: string;
|
|
130
|
+
leaderVariant: string;
|
|
131
|
+
noticeCue: string;
|
|
132
|
+
}
|
|
133
|
+
export type ShardSkirmisher = { [Key in keyof ShardSkirmisherFields]: ShardSkirmisherFields[Key] };
|
|
134
|
+
export type ShardScriptBrainInput = ShardScriptBrain;
|
|
135
|
+
interface ShardScriptBrainFields {
|
|
136
|
+
id: string;
|
|
137
|
+
kind: 'script';
|
|
138
|
+
module: string;
|
|
139
|
+
thinkDivisor: number;
|
|
140
|
+
maxSpeed: number;
|
|
141
|
+
maxStrafe: number;
|
|
142
|
+
maxTurnRate: number;
|
|
143
|
+
parameters: (number)[];
|
|
144
|
+
strikes: ({
|
|
145
|
+
event: number;
|
|
146
|
+
strike: string;
|
|
147
|
+
})[];
|
|
148
|
+
}
|
|
149
|
+
export type ShardScriptBrain = { [Key in keyof ShardScriptBrainFields]: ShardScriptBrainFields[Key] };
|
|
150
|
+
interface ShardGuardianInputFields {
|
|
151
|
+
id: string;
|
|
152
|
+
kind: 'guardian';
|
|
153
|
+
thinkDivisor?: number | undefined;
|
|
154
|
+
wakeRadius: number;
|
|
155
|
+
guardRadius: number;
|
|
156
|
+
approachRadius: number;
|
|
157
|
+
swingRadius: number;
|
|
158
|
+
swingDuration: number;
|
|
159
|
+
speed: number;
|
|
160
|
+
holdRadius: number;
|
|
161
|
+
sideSpeed: number;
|
|
162
|
+
sideFlipSeconds: number;
|
|
163
|
+
sinkAfterSeconds: number;
|
|
164
|
+
cooldownSeconds: number;
|
|
165
|
+
hideOffset: number;
|
|
166
|
+
noticeCue: string;
|
|
167
|
+
}
|
|
168
|
+
export type ShardGuardianInput = { [Key in keyof ShardGuardianInputFields]: ShardGuardianInputFields[Key] };
|
|
169
|
+
interface ShardGuardianFields {
|
|
170
|
+
id: string;
|
|
171
|
+
kind: 'guardian';
|
|
172
|
+
thinkDivisor: number;
|
|
173
|
+
wakeRadius: number;
|
|
174
|
+
guardRadius: number;
|
|
175
|
+
approachRadius: number;
|
|
176
|
+
swingRadius: number;
|
|
177
|
+
swingDuration: number;
|
|
178
|
+
speed: number;
|
|
179
|
+
holdRadius: number;
|
|
180
|
+
sideSpeed: number;
|
|
181
|
+
sideFlipSeconds: number;
|
|
182
|
+
sinkAfterSeconds: number;
|
|
183
|
+
cooldownSeconds: number;
|
|
184
|
+
hideOffset: number;
|
|
185
|
+
noticeCue: string;
|
|
186
|
+
}
|
|
187
|
+
export type ShardGuardian = { [Key in keyof ShardGuardianFields]: ShardGuardianFields[Key] };
|
|
188
|
+
interface ShardPerchHunterInputFields {
|
|
189
|
+
id: string;
|
|
190
|
+
kind: 'perch-hunter';
|
|
191
|
+
thinkDivisor?: number | undefined;
|
|
192
|
+
throwRadius: number;
|
|
193
|
+
throwDuration: number;
|
|
194
|
+
biteRadius: number;
|
|
195
|
+
biteDuration: number;
|
|
196
|
+
underRadius: number;
|
|
197
|
+
underSeconds: number;
|
|
198
|
+
holdRadius: number;
|
|
199
|
+
runSpeed: number;
|
|
200
|
+
activeGroundSeconds: number;
|
|
201
|
+
biteCooldown: number;
|
|
202
|
+
throwCooldownMin: number;
|
|
203
|
+
throwCooldownMax: number;
|
|
204
|
+
alertCue: string;
|
|
205
|
+
noticeCue: string;
|
|
206
|
+
}
|
|
207
|
+
export type ShardPerchHunterInput = { [Key in keyof ShardPerchHunterInputFields]: ShardPerchHunterInputFields[Key] };
|
|
208
|
+
interface ShardPerchHunterFields {
|
|
209
|
+
id: string;
|
|
210
|
+
kind: 'perch-hunter';
|
|
211
|
+
thinkDivisor: number;
|
|
212
|
+
throwRadius: number;
|
|
213
|
+
throwDuration: number;
|
|
214
|
+
biteRadius: number;
|
|
215
|
+
biteDuration: number;
|
|
216
|
+
underRadius: number;
|
|
217
|
+
underSeconds: number;
|
|
218
|
+
holdRadius: number;
|
|
219
|
+
runSpeed: number;
|
|
220
|
+
activeGroundSeconds: number;
|
|
221
|
+
biteCooldown: number;
|
|
222
|
+
throwCooldownMin: number;
|
|
223
|
+
throwCooldownMax: number;
|
|
224
|
+
alertCue: string;
|
|
225
|
+
noticeCue: string;
|
|
226
|
+
}
|
|
227
|
+
export type ShardPerchHunter = { [Key in keyof ShardPerchHunterFields]: ShardPerchHunterFields[Key] };
|
|
228
|
+
export type ShardGuardianPattern = (Omit<v.InferOutput<(typeof GuardianSchema)['pipe'][0]>, keyof ({
|
|
229
|
+
pattern: 'interior';
|
|
230
|
+
})> & {
|
|
231
|
+
pattern: 'interior';
|
|
232
|
+
}) | (Omit<v.InferOutput<(typeof PerchHunterSchema)['pipe'][0]>, keyof ({
|
|
233
|
+
kind: 'guardian';
|
|
234
|
+
pattern: 'perch';
|
|
235
|
+
})> & {
|
|
236
|
+
kind: 'guardian';
|
|
237
|
+
pattern: 'perch';
|
|
238
|
+
});
|
|
239
|
+
export type ShardStalkerInput = Omit<v.InferInput<(typeof SkirmisherSchema)['pipe'][0]>, keyof ({
|
|
240
|
+
kind: 'stalker';
|
|
241
|
+
pattern: 'skirmish';
|
|
242
|
+
})> & {
|
|
243
|
+
kind: 'stalker';
|
|
244
|
+
pattern: 'skirmish';
|
|
245
|
+
};
|
|
246
|
+
export type ShardStalker = Omit<v.InferOutput<(typeof SkirmisherSchema)['pipe'][0]>, keyof ({
|
|
247
|
+
kind: 'stalker';
|
|
248
|
+
pattern: 'skirmish';
|
|
249
|
+
})> & {
|
|
250
|
+
kind: 'stalker';
|
|
251
|
+
pattern: 'skirmish';
|
|
252
|
+
};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { CONTENT_CAPS as C } from './contentBounds.ts';
|
|
2
|
+
import { contentCost } from './contentCost.ts';
|
|
3
|
+
import type { Shardfile } from './shardSchema.ts';
|
|
4
|
+
import { NEAR_PLACEHOLDER_LIMITS, nearPlaceholderCost } from './nearPlaceholder.ts';
|
|
5
|
+
|
|
6
|
+
/** Category resident targets are tradeable warnings; only the complete playing/loading totals refuse memory. */
|
|
7
|
+
export function memoryTargetWarnings(shard: Shardfile): { category: string; bytes: number; target: number }[] {
|
|
8
|
+
const warnings: { category: string; bytes: number; target: number }[] = [];
|
|
9
|
+
const check = (category: string, bytes: number, target: number): void => {
|
|
10
|
+
if (bytes > target) warnings.push({ category, bytes, target });
|
|
11
|
+
};
|
|
12
|
+
check('library', shard.budgets.library.resident, C.library.resident);
|
|
13
|
+
check('simulation', shard.budgets.sim.resident, C.sim.resident);
|
|
14
|
+
check('overlap', shard.budgets.overlap, C.overlap);
|
|
15
|
+
check('server simulation', shard.serverBudget.memory, C.sim.resident);
|
|
16
|
+
for (const tile of shard.tiles) check(`tile ${tile.lod}/${tile.x}/${tile.z}`, tile.decoded + tile.gpu, (tile.lod === 0 ? C.l0 : C.l1).resident);
|
|
17
|
+
if (shard.far !== null) check('far', shard.far.decoded + shard.far.gpu, C.far.resident);
|
|
18
|
+
return warnings;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Each L0 tile's resident bytes beyond what the shard's library already charges: a tile whose files the library holds
|
|
23
|
+
* (Nine Dragon draws its whole L0 city from its library) is charged once there, never again as a resident tile. A
|
|
24
|
+
* tile's declared bytes less its library files' bytes, never below zero; other tiles are unchanged.
|
|
25
|
+
*/
|
|
26
|
+
function ownTileBytes(shard: Shardfile): (tile: Shardfile['tiles'][number]) => number {
|
|
27
|
+
const files = new Map(shard.files.map(file => [file.hash, file]));
|
|
28
|
+
const closure = (roots: readonly string[]): Set<string> => {
|
|
29
|
+
const seen = new Set<string>(), pending = [...roots];
|
|
30
|
+
for (let ref = pending.pop(); ref !== undefined; ref = pending.pop()) if (!seen.has(ref)) { seen.add(ref); pending.push(...files.get(ref)?.dependencies ?? []); }
|
|
31
|
+
return seen;
|
|
32
|
+
};
|
|
33
|
+
const library = closure(shard.library);
|
|
34
|
+
return tile => {
|
|
35
|
+
let shared = 0;
|
|
36
|
+
if (library.size > 0) for (const ref of closure(tile.files)) {
|
|
37
|
+
const file = library.has(ref) ? files.get(ref) : undefined;
|
|
38
|
+
if (file !== undefined) shared += file.decoded + file.gpu;
|
|
39
|
+
}
|
|
40
|
+
return Math.max(0, tile.decoded + tile.gpu - shared);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const distance2 = (x: number, z: number, x0: number, z0: number, x1: number, z1: number): number => {
|
|
45
|
+
const dx = Math.max(x0 - x, x - x1, 0), dz = Math.max(z0 - z, z - z1, 0); return dx * dx + dz * dz;
|
|
46
|
+
};
|
|
47
|
+
type LocationCost = ReturnType<typeof contentCost> & { location: [number, number] };
|
|
48
|
+
const GRID_STEP = 5;
|
|
49
|
+
const RADIUS2 = (C.nearRadius + Math.SQRT2 * GRID_STEP / 2) ** 2;
|
|
50
|
+
|
|
51
|
+
/** One synthetic-neighbour model of the location cost: `accounted` alone (no allocation, the worst-disc scan's hot loop)
|
|
52
|
+
* and the whole `cost`. `playing` never falls as `accounted` rises, so a location whose accounted bytes do not exceed
|
|
53
|
+
* the worst found so far cannot beat it. */
|
|
54
|
+
interface LocationModel {
|
|
55
|
+
/** the three synthetic neighbour cells' centres this model charges */
|
|
56
|
+
neighbours: readonly (readonly [number, number])[];
|
|
57
|
+
/** accounted bytes that do not depend on the location (everything but L0 and libraries) */
|
|
58
|
+
fixed: number;
|
|
59
|
+
cost: (x: number, z: number) => LocationCost;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function locationModels(shard: Shardfile, commons: number): LocationModel[] {
|
|
63
|
+
const bytesOf = ownTileBytes(shard), own = shard.tiles.filter(tile => tile.lod === 0).map(tile => {
|
|
64
|
+
const bounds = tile.drawBounds ?? tile.bounds;
|
|
65
|
+
return { x0: bounds.min[0], z0: bounds.min[2], x1: bounds.max[0], z1: bounds.max[2], bytes: bytesOf(tile) };
|
|
66
|
+
});
|
|
67
|
+
const coarseExcess = shard.tiles.filter(tile => tile.lod === 1).reduce((sum, tile) => sum + Math.max(0, tile.decoded + tile.gpu - C.l1.resident), 0);
|
|
68
|
+
const models: LocationModel[] = [];
|
|
69
|
+
const nearBytes = shard.near === undefined ? 0 : nearPlaceholderCost(shard.near, shard).total.resident +
|
|
70
|
+
(NEAR_PLACEHOLDER_LIMITS.cells - 1) * (NEAR_PLACEHOLDER_LIMITS.terrainBytes + NEAR_PLACEHOLDER_LIMITS.contentBytes);
|
|
71
|
+
const l1 = C.l1Count * C.l1.resident + coarseExcess, far = (C.farCount - 1) * C.far.resident + (shard.far === null ? 0 : shard.far.decoded + shard.far.gpu);
|
|
72
|
+
const sims = Math.max(shard.budgets.sim.resident, shard.serverBudget.memory) + 3 * C.sim.resident, overlap = Math.max(C.overlap, shard.budgets.overlap);
|
|
73
|
+
// each neighbour's 8 x 8 synthetic tiles by column and row (the tile at column i, row j spans x0 ... x0 + 62.5)
|
|
74
|
+
const edges = (centre: number): Float64Array => Float64Array.from({ length: 8 }, (_, i) => centre - 250 + i * 62.5);
|
|
75
|
+
const dx2 = new Float64Array(8), dz2 = new Float64Array(8);
|
|
76
|
+
for (const sx of [-1, 1]) for (const sz of [-1, 1]) {
|
|
77
|
+
const neighbours = ([[sx * C.pitch, 0], [0, sz * C.pitch], [sx * C.pitch, sz * C.pitch]] as const).map(([cx, cz]) => ({ cx, cz, xs: edges(cx), zs: edges(cz) }));
|
|
78
|
+
// the last location's library bytes, beside its returned l0 (no object a location)
|
|
79
|
+
let libraries = 0;
|
|
80
|
+
const l0At = (x: number, z: number): number => {
|
|
81
|
+
let active = 0;
|
|
82
|
+
for (const { cx, cz } of neighbours) if (distance2(x, z, cx - 250, cz - 250, cx + 250, cz + 250) <= RADIUS2) active++;
|
|
83
|
+
const ownActive = distance2(x, z, -250, -250, 250, 250) <= RADIUS2;
|
|
84
|
+
// Eight heading lookahead slots charged at target, even when the project is empty.
|
|
85
|
+
let l0 = 8 * C.l0.resident;
|
|
86
|
+
for (const tile of own) if (distance2(x, z, tile.x0, tile.z0, tile.x1, tile.z1) <= RADIUS2) l0 += tile.bytes;
|
|
87
|
+
for (const { xs, zs } of neighbours) {
|
|
88
|
+
for (let i = 0; i < 8; i++) { const a = xs[i] ?? 0, d = Math.max(a - x, x - (a + 62.5), 0); dx2[i] = d * d; }
|
|
89
|
+
for (let j = 0; j < 8; j++) { const a = zs[j] ?? 0, d = Math.max(a - z, z - (a + 62.5), 0); dz2[j] = d * d; }
|
|
90
|
+
for (let j = 0; j < 8; j++) for (let i = 0; i < 8; i++) if ((dx2[i] ?? 0) + (dz2[j] ?? 0) <= RADIUS2) l0 += C.l0.resident;
|
|
91
|
+
}
|
|
92
|
+
libraries = (ownActive ? shard.budgets.library.resident : 0) + active * C.library.resident;
|
|
93
|
+
return l0;
|
|
94
|
+
};
|
|
95
|
+
models.push({
|
|
96
|
+
neighbours: neighbours.map(({ cx, cz }) => [cx, cz] as const), fixed: l1 + far + sims + commons + nearBytes,
|
|
97
|
+
cost: (x, z) => {
|
|
98
|
+
const l0 = l0At(x, z);
|
|
99
|
+
return { ...contentCost({ l0, l1, far, libraries, sims, commons, near: nearBytes, overlap }), location: [x, z] };
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return models;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Conservative total around an actual player location, using the same neighbour assumptions as admission. */
|
|
107
|
+
export function nearbyContentCost(shard: Shardfile, x: number, z: number, commons = 0): LocationCost {
|
|
108
|
+
if (![x, z, commons].every(Number.isFinite) || commons < 0) throw new Error('Invalid memory estimate location');
|
|
109
|
+
let worst: LocationCost = { playing: 0, loading: 0, accounted: 0, location: [x, z] };
|
|
110
|
+
for (const model of locationModels(shard, commons)) { const cost = model.cost(x, z); if (cost.playing > worst.playing) worst = cost; }
|
|
111
|
+
return worst;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const worstCache = new Map<string, LocationCost>();
|
|
115
|
+
/** A synthetic neighbour cell's per-location grids (how many of its 8 x 8 target tiles, and whether the cell, lie within
|
|
116
|
+
* near radius) depend on its offset alone, never the shard: built once a page, not per admission (a phone-4x Nine
|
|
117
|
+
* drive rebuilt all eight, 512 tile sweeps, for each product it admitted). */
|
|
118
|
+
const syntheticCells = new Map<string, { l0: Uint8Array; active: Uint8Array }>();
|
|
119
|
+
|
|
120
|
+
/** Worst disc with three synthetic neighbours at the platform targets; grid padding covers unsampled gaps. */
|
|
121
|
+
export function worstContentCost(shard: Shardfile, commons = 0): LocationCost {
|
|
122
|
+
const steps = worstContentCostSteps(shard, commons);
|
|
123
|
+
for (;;) { const step = steps.next(); if (step.done === true) return step.value; }
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** `worstContentCost` in steps, one per own tile and synthetic neighbour tile the grids sum, then one per scanned row:
|
|
127
|
+
* a live admission paints between them (Pine's activation spent ~90 ms of a frame in this scan at 4x CPU). */
|
|
128
|
+
export function* worstContentCostSteps(shard: Shardfile, commons = 0): Generator<void, LocationCost> {
|
|
129
|
+
const bytesOf = ownTileBytes(shard);
|
|
130
|
+
// The cache key is the JSON of every tile's [lod, bytes, x0, z0, x1, z1] and the shard's budgets, written row by row
|
|
131
|
+
// (the same text, without an array per tile).
|
|
132
|
+
const json = (n: number): string => Number.isFinite(n) ? String(n) : 'null';
|
|
133
|
+
let rows = '';
|
|
134
|
+
for (let i = 0; i < shard.tiles.length; i++) {
|
|
135
|
+
const tile = shard.tiles[i]; if (tile === undefined) continue;
|
|
136
|
+
const bounds = tile.drawBounds ?? tile.bounds;
|
|
137
|
+
rows += `${i > 0 ? ',' : ''}[${json(tile.lod)},${json(bytesOf(tile))},${json(bounds.min[0])},${json(bounds.min[2])},${json(bounds.max[0])},${json(bounds.max[2])}]`;
|
|
138
|
+
}
|
|
139
|
+
const key = `[[${rows}],${JSON.stringify([shard.far === null ? null : [shard.far.decoded, shard.far.gpu], shard.budgets.library.resident, shard.budgets.sim.resident, shard.budgets.overlap, shard.serverBudget.memory, commons,
|
|
140
|
+
shard.near === undefined ? 0 : nearPlaceholderCost(shard.near, shard).total.resident]).slice(1)}`;
|
|
141
|
+
const cached = worstCache.get(key);
|
|
142
|
+
if (cached !== undefined) return { ...cached, location: [...cached.location] };
|
|
143
|
+
let worst: LocationCost = { playing: 0, loading: 0, accounted: 0, location: [0, 0] };
|
|
144
|
+
// O14: the scan's ~51k locations sum their accounted bytes from per-location grids built once (own tiles, each
|
|
145
|
+
// synthetic neighbour cell's tiles); only a location whose bytes exceed the worst so far gets its whole cost (all
|
|
146
|
+
// bytes are naturals, so the sums are exact in any order and `playing` never falls as they rise)
|
|
147
|
+
const steps: number[] = []; for (let v = -280; v <= 280; v += GRID_STEP) steps.push(v);
|
|
148
|
+
const n = steps.length, at = (xi: number, zi: number): number => xi * n + zi;
|
|
149
|
+
const square = (lo: number, hi: number, v: number): number => { const d = Math.max(lo - v, v - hi, 0); return d * d; };
|
|
150
|
+
// One scratch row shared by every near() call. Cells retain their original
|
|
151
|
+
// column/row order; circular cross-sections avoid rejected inner-loop cells.
|
|
152
|
+
const dx = new Float64Array(n);
|
|
153
|
+
// Only the index window within the radius of a box (one step of margin; the exact test below decides) is visited: a
|
|
154
|
+
// tile far off this grid costs a few comparisons, not n x n.
|
|
155
|
+
const reach = Math.sqrt(RADIUS2), first = steps[0] ?? 0;
|
|
156
|
+
const below = (v: number): number => Math.max(0, Math.floor((v - reach - first) / GRID_STEP) - 1);
|
|
157
|
+
const above = (v: number): number => Math.min(n - 1, Math.ceil((v + reach - first) / GRID_STEP) + 1);
|
|
158
|
+
const near = (x0: number, z0: number, x1: number, z1: number, cells: Float64Array | Uint8Array, add: number, set = false): void => {
|
|
159
|
+
const xa = below(x0), xb = above(x1), za = below(z0), zb = above(z1);
|
|
160
|
+
for (let i = xa; i <= xb; i++) dx[i] = square(x0, x1, steps[i] ?? 0);
|
|
161
|
+
for (let xi = xa; xi <= xb; xi++) {
|
|
162
|
+
const ex = dx[xi] ?? 0; if (ex > RADIUS2) continue;
|
|
163
|
+
// A box's circular cross-section is one contiguous interval in z.
|
|
164
|
+
// Round outwards with one grid step, then use the original predicate
|
|
165
|
+
// at both ends so floating-point boundary membership stays exact.
|
|
166
|
+
const radius = Math.sqrt(RADIUS2 - ex);
|
|
167
|
+
let lo = Math.max(za, Math.ceil((z0 - radius - first) / GRID_STEP) - 1);
|
|
168
|
+
let hi = Math.min(zb, Math.floor((z1 + radius - first) / GRID_STEP) + 1);
|
|
169
|
+
while (lo <= hi && ex + square(z0, z1, steps[lo] ?? 0) > RADIUS2) lo++;
|
|
170
|
+
while (hi >= lo && ex + square(z0, z1, steps[hi] ?? 0) > RADIUS2) hi--;
|
|
171
|
+
if (lo > hi) continue;
|
|
172
|
+
const start = at(xi, lo), end = at(xi, hi) + 1;
|
|
173
|
+
if (set) cells.fill(add, start, end);
|
|
174
|
+
else for (let cell = start; cell < end; cell++) cells[cell] = (cells[cell] ?? 0) + add;
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
const ownL0 = new Float64Array(n * n).fill(8 * C.l0.resident), ownActive = new Uint8Array(n * n);
|
|
178
|
+
for (const tile of shard.tiles) if (tile.lod === 0) {
|
|
179
|
+
const bounds = tile.drawBounds ?? tile.bounds, bytes = bytesOf(tile);
|
|
180
|
+
near(bounds.min[0], bounds.min[2], bounds.max[0], bounds.max[2], ownL0, bytes);
|
|
181
|
+
yield;
|
|
182
|
+
}
|
|
183
|
+
near(-250, -250, 250, 250, ownActive, 1, true);
|
|
184
|
+
const cellOf = function* cellOf([cx, cz]: readonly [number, number]): Generator<void, { l0: Uint8Array; active: Uint8Array }> {
|
|
185
|
+
const id = `${cx},${cz}`, known = syntheticCells.get(id); if (known !== undefined) return known;
|
|
186
|
+
const made = { l0: new Uint8Array(n * n), active: new Uint8Array(n * n) };
|
|
187
|
+
for (let i = 0; i < 64; i++) {
|
|
188
|
+
const x0 = cx - 250 + (i % 8) * 62.5, z0 = cz - 250 + Math.floor(i / 8) * 62.5;
|
|
189
|
+
near(x0, z0, x0 + 62.5, z0 + 62.5, made.l0, 1);
|
|
190
|
+
yield;
|
|
191
|
+
}
|
|
192
|
+
near(cx - 250, cz - 250, cx + 250, cz + 250, made.active, 1, true);
|
|
193
|
+
syntheticCells.set(id, made); return made;
|
|
194
|
+
};
|
|
195
|
+
let worstAccounted = Number.NEGATIVE_INFINITY;
|
|
196
|
+
for (const model of locationModels(shard, commons)) {
|
|
197
|
+
const found: { l0: Uint8Array; active: Uint8Array }[] = [];
|
|
198
|
+
for (const neighbour of model.neighbours) found.push(yield* cellOf(neighbour));
|
|
199
|
+
const [a, b, c] = found;
|
|
200
|
+
if (a === undefined || b === undefined || c === undefined) throw new Error('Location model requires three neighbours');
|
|
201
|
+
for (let xi = 0; xi < n; xi++) for (let zi = 0; zi < n; zi++) {
|
|
202
|
+
const cell = at(xi, zi), active = (a.active[cell] ?? 0) + (b.active[cell] ?? 0) + (c.active[cell] ?? 0);
|
|
203
|
+
const libraries = (ownActive[cell] === 1 ? shard.budgets.library.resident : 0) + active * C.library.resident;
|
|
204
|
+
const accounted = (ownL0[cell] ?? 0) + ((a.l0[cell] ?? 0) + (b.l0[cell] ?? 0) + (c.l0[cell] ?? 0)) * C.l0.resident + libraries + model.fixed;
|
|
205
|
+
if (accounted <= worstAccounted) continue;
|
|
206
|
+
const cost = model.cost(steps[xi] ?? 0, steps[zi] ?? 0);
|
|
207
|
+
if (cost.playing > worst.playing) { worst = cost; worstAccounted = accounted; }
|
|
208
|
+
}
|
|
209
|
+
yield;
|
|
210
|
+
}
|
|
211
|
+
if (worstCache.size >= 8) { const oldest = worstCache.keys().next().value; if (oldest !== undefined) worstCache.delete(oldest); }
|
|
212
|
+
worstCache.set(key, worst);
|
|
213
|
+
return { ...worst, location: [...worst.location] };
|
|
214
|
+
}
|