@wildshard/shard-format 0.0.1 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/brasscap-mesa/blobs/bin/02da0052111419cdff3a29f1c6d0ff0d223e0b53a956c16c65ed63d87928b3b9.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/068a121cd780a2a9164416f6e4fde44834f2d2f3a5ed65c174e480b7a2d3f627.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/07d5a061cd338618e528747d61eb2b17709510550ef0ba40a58b67761b200f3f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/086e3706070555baca863f6ecf9dbca09c084afa501d92d4246d896b09546f36.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/08b1b9ab7c732d7dbe8f961f1fc40e84042d1fe42544f55c9ee89f04dffe3d5e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/18bdbdc704cb8aac93435d208dfe0e9a44374efb73afa3bc58c631650e0a2995.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/1a210fcddcb9749ecb1c244837e8e37ea69b038faae191dee6bbbde228d31a18.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/264ab9ede386504a5ff9814b0a620b879cb29f3f45a80bcfc0c80b8ee236e364.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2b6fbea4c846a23cf4802ebdb1804e128896c8dd87e5d23509db6729e5b1be4e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2d755cc635dee90b0f3958272855a821e2dd605a189a5ffcd480a325155fe84f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2d76c6829fe77fb55cc2541e4aca5ce5d18b68508dcdf3fa957fe4a83b9c887a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/32c15d55a4548501740593807c5007217c72dbc10a21f4613ef5e0cee0b90d1d.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3539b362cf3a61a79e92e113ebf8f255d0b25ec2d2edd816498879de831fa912.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3af38a2377bc89f6c6c82ee1e83df674efa2793db932b50a23bbce7ec9cd7941.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3c176a7a0d0850fdcee790ed2641216fc3d1cba025928de3d7784262bb9b6f4a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3fb37e488aa81a64c997b3dd09794e988994c6ee3476c6d653ced1670888dd8e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/424dcc7b320317bf3f2c62c8f19bc80564035127eb38ab811e460934d57ea38c.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/45cea35fab6bb06051a3286fca2307944850c7f9ed7aa89b7c24fafef28efda6.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/499cc7863851f97d79dbfc64e76f9e6978894199184a0d80ebdca13066a8fa78.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/4b7217644763b00c6ee6ae3f176c726914966fb791654a385c0638bb998b6dd2.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/4cf11c7177bb082f335e5bc7a037ef00d09355c5ad8263e284a96a92630ff9ae.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/536b37cab5a1edd6a68a71d122aab6898e44c68a5470a4ca8a9a72c57c02e034.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/55d3628b27e0fcea383df86c434a69761439f51a013359f0829675b07ee2b616.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5652ba90fbd8146edaf42660329cc81798752f2f60b8d03956714460d5ba75ef.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/57459ab5e2ac6cec65ef5e59789dd82b9666d8573df41c4a398df603f1fa456f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5915b6aed21bba49b841b45574f44f60d26b44810bd68ac70b22f3f3b0dab072.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5c4a5c7a8e99253561105c5fa3faf14326cf0c23adc32bfe7f8aea4dbf4b05f9.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/61822a412cfd461f4f7ae50bc13f242a0fca6c5c58fca72247b596ab037a1c85.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/673b7712908966718341508469b39cd49e6461f690ca3c23d4621ea7eba0cc30.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/69394a49520f84f6dccc1655f1c89eedc913ac53a7e48ac5dc1bff4141639bb4.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/6e58a53a6c2acd50f9f80fd270ca034c54421df8a587e181101b4b75b952ac5d.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/75dc9f23ee71e11a3a0c67eb77275d741a281c3398808fb42efd52b9973d5d04.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/76c6a403293a68ed3d6ad14e9dd27b555c3a1ef4a3cae12a2bd2ab3e67c5ad02.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/82b73ce3a18e47092840fc029177861887aa2867b007248ac79ffa20895a4491.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8430d9bbfb4e2b678c54595ad95555c3c73d0e1b144a4d6e29664ccb4371baf0.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/848d4492508689f5c4a224079dca8809e872e33b8f2635c9f16da5dc21beed16.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/84941ac387a0d245ea20bd663ff4ee78c5315bedfa058ada0961765aff61acaf.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/859b7bbcf048a4525db0548b8f5afef83bfc4870914767153f44c05e83436ec5.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/87b68b45680a57c796eed9183211b03335a6ad6737372b3ef476c2cf42efa631.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8cef94308af8d09670e4c99a3b6c3d9280b7a27d386653a3bd7d482b2cdf2b65.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8e564bce3f352c2186ae09ed7fbca9739c10abc46fd5f6893c68cb47178bd2b4.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8f89e79d0fb9b04d48c7b5719e1d024161c6a2119835b18dcb193ff51123a9be.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8fe511ad48656a0b10801100b9100edab1be605a8a182dc5c834d298bf0d9166.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/900bda6562d06fafda54c495e325d57dbb7931813178ee207449c5519d89d537.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/997b1b7d9210bfa77dc71f16a57c6bd66bc7c648686dc2a2666044c95042978a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a111bb4c6cec536bcf57dddc744b871ac9f3d094ce459c16243adca19020db77.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a2208bf899e6c84942eef9fbab569d597f574551afae5864f1953c6a517af068.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a302ddb2598a72ece53780094b64ad861dc68e6913d8a1ea08f5d141736e2986.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/afcbc671326d0dac14e460662c1f793335877ba53cc965f67c0306833b087e7c.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/b657159e6a28c801a211024f96a7ef60e388ce928a7b41ae3d7555a6f8fd2e3e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/be6bbc6cd15ba525790075252ba0ed0b28dae5cfbfa118c00dfb9ea1ab95e668.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/c1360e3cbe6b3dc8894bc66c359853854c2e5adeac9c7cd5ba63f5db448be601.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/c7983018dbf8e384ddf73191f526075bd0b29907061ab17642ecdc18ea7b9897.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/cea66f27ca60ea173ee0a2bcd91964dc2638eb5657250fe3aa5bd3e41faf8730.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d052be571a0f3ab69926951f3a4c9d63f05da2ca6d91e5963dd63e04ecb515de.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d162a993a60dd682c8c21dd111429d84d8d30413a000cf481cf98d06ca83e706.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d238c3d3d054911714ebe30dafc99e6ad13925b7a600ba9f8d532d0f515f3f5a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d9a98cfe2865a9bb0e94f35c735a570b0625b58f890a6b1f6e14fab2401f0af2.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/dc27ae954b7b8a13a9459d6ca6ef2997f662715ff5f5453ea0da169f141748b8.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/e3ff1fd41cf76668b8e1927c0c2e4056b63a293ebbd300a8f1b1d27d87786271.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/e45b7344d373b3ef4a94f560cf4e17b1eb3b8cd89d1e552fc9be11d6b7b546f0.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/eb14eb898224d5d81d1012bec54f2b79f9377dc60fa1d01e49b4c3e148292d77.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/ed0e0101a3d91a3a615f9e78ef36f7deb8bb0eab0f133241d621925d0b596599.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/f722e3a3b1f0a3d7b9f7d7c66c46d8c87245de5f8eece055daf95c7086f8c267.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/f76013aedfd810f136fa689a151024bcb942687ef42ae7edf1fd3513ac4e22c7.bin +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0547e63693282614673b13bade4c08eb772020757b131b7c80f2077873aab70e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0cf89e9b1824440d213c8e9e33fb357734b7241b4c7eedaba3df7f8306e05425.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0e01060e3a507ffff6461c50b5c565c71380a6a67d9760cdd7a09afd3e30b584.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0ef326c5cf5292cd15b48b851460ee8156f51e0a5b62457c8f1f3c53c41665a3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1112ff4a3f69db3b62c6d2d6ae021e7c43ce0ca1feb1d3130376881decb3c6b0.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/11357cb8a0670fdc9a03780dd79a31e0aa7a0537786cbf66491bae1722d6feb3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/11dbecc73bd343c375bd4b79db8dbda2272e76a6b8426ac29e90f2b1272ccfc2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/133f639cfa837bc5da7915121c71fd32281660c2aaa0248bd59bde47e7faf8bc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/16812a090136b6678633aa4db03e4187920ae0aca776ad6da373c600cd341972.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/17e63980d7934cfe1d2823d78652af338fe9f0c2170106cd4506a2c4e7f4716f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/199224cafc86904bdefec8f01d131d7ca3e076a22b689bfc6a26dd20373cf286.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1a5c8cf223a2f64715ea5eaf14d97a0131f9ebdef4388dc4823dcfa57817724c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1b0ec09ad6718149d7ca514136cee09b04c96425f03af0559fd097112aa0daa5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1e5024bbb1284b2ed39bbca2d0ade3acb5be2a2c6ba643291f269b76098c7f79.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1e7635972e13468ffcbb1608f1d12559b066b4533912be2c35e3db07fd4a679d.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1f03db3a38a21b8d4d02f8ede30e1303cd8d4c426815326a88f45a268b17a492.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/2624abb7bf45618be40f8c3221445179fca44f7321baff415fdf7ddd5e0afc6f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/27fc3bad6db6e2b5ade5d242867d882362482ddf19c647edef821afc27d52dc2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/29959bdb5b04a9180e88ec1ed976bae55424d3dc50985f13c0f85bae11ae79ee.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/308cbce2b1b6360f9a2dc275d0bc28be1966fc3ff5e0a58844405ba867f3f668.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3674d7be969755aaffa368e57b8d1bb743bc98e766a57948859d54fdc7d2c066.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3736ca95c9c40b30e21302ae6c89148d8ac09264dfbb7e5764b08c265a73ba3c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3bc90e1dc9411d249697e4ec352baa4886f91cacfe4940ac43aed879f60966c9.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3f519c7c7482307cae908b27602dcb7716e2da4b651eff39c4c37103998d18fa.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4767636d5554b60c94b447b87b77fc1456a2b9af42bfe08585389d27f306dd5e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4a3242773b3a73a73ee746a0cdf30c8d6d904bb4406dfdf9822dcd535d6ae308.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4c7bf3788cba151442d85c3f76553c2e356edf8566ae8243d0a535c9bcde51d0.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4f3b9f4c818ed6d375947e9603dd058c539e14ff05aa193fb5054d899dbb82a2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4fdf7ee67d12de1cd30c3c2bbd9409032dcab5feb3a7d3977b92c50b1d161afe.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5821f33aa00e9acd2f4c0a29129978ee7006a879d163ce1463ae476031bfabcf.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5a986c3e44fc686a2efe7648c3945bb7b51cf303918381383f21f898dd312cad.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5c32fc1de6d198ed606d3e8c3264319acdd950dab18e8b723fc6332bf2f56aea.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/602ce4e8b00a0afbc1a894b65641e48d362ec834a559b9d97a4801473bb01da7.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6180f9f96167522d8cab4de1d52598cecee8d7ee042f48e41669c98cf61c19c3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6205973ba63f7a554662ba05010d25131bed2d9656de422e2067ca54709d5b3c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/693e556f2165232e8a38b1b2d68676f235ece5705c564992cfa7731426f4d376.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6a46175438bec5527c281b577bd220b6badedf3c74266b997d39e596f83b8853.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6ca1bcad7ea053a259b7f9fc5a7ec388a4cd29d44391d93386ea8b1143d94c21.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6f9bc99656b611890d6acc76ee416f6222ca2d5f62167840b4216a21e020a4c8.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6fb1e7857996662233ab5314fc13f8aa30703f91c04542e352ec17f9dc4fc054.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7028ec39712143a7e9d09d2e1477282b654d0470102ca9d272ac82b23604cb21.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/73af65ac86efa61099178f3e7075dcd26d389ee9b9aa3546c18dede10c3dfda1.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/73b992b71bd3165ff7701ab1430c075cb5ba9b74e6363d24640377b1011ddc93.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7471261d4df59979ba41a622d93779b66ebecd50353ad433862e603ee65f8748.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/76e9a3fcca962c2f900cf79dc1a0851840bd405dc11231f629f784adbcb69d23.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/79d2d29e8cd8b642386b5f31429b39bc4d6f13e53107dda00ebc463abf80c79d.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7de66fcfffe4ff108510cbe6bebec44e28ab4b78e98e9c1a38466db5b81881f7.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/811fa798cb81ea99488db98e3d3ddea815aac8f6e7493ad04d0176f603978678.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/89b277f1636be220ff5658ff1f1c62efe14079d6e1f42efb373fbf0246801533.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/905c5fe666d9f6174e987382e47d3f325c5696cf8792d7a4a1dd120a438b8270.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/90efe3e05370ee853c0130b98ee82f00b86f7c7104e96b094715187fa49ac16f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/968a7c5cb13014bce00a29d43b344bd6943ff00ae2908abbc6b40a994f1172a1.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9a955b4e69dfa5b38f071099053c1a3684cf85ec2d346420de2853c61768f8cc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9da2781216a2e482dd8a6ada5ebb43bcf48e0169430e787ac277559cb2ade19a.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9db02aab14a3b52463deadefbf4ba771809941e7fcb137c905955bdc80ec23bd.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a3fe1788cf5d7f260249c722f0e0695a4d55744d1b14be44122377147a296256.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a5c75af8f090d3c95fa46d2be49be5031138d7cd1bae234ae028edf717bf299e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a771abd40bd337a464c1bd19f841b62e290124faa89b19ec50e85ab36bc740a5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a94a2ad2ed463a47cdda117df25b06b3cf6be37ddac08594bc5f5d76c7237730.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ad434e4a6490e495994b25f7574a5847a9f7d9c2ca5a2b229a9dfdd2e5e2bb72.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/aeae7b05404b852008a7897689e58aacef44a2c3bc0e87d2519ecdb4cb1e3ff5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b0c0c8a4985f92be3b358a8e703c67957427501882aeee05b4ccd3c7880930d4.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b25174c3cd13eea6e1d9c3104ee5197dc6330129b2f0f7676e8a429900999d9b.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b3eecdec571df96338edf690443394ff859383b4c94f4cf33d42c240006f8543.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b7aa0c61ff9e7411535c7b7b8e587849a92bad00d431171ab16ad47d55db0a53.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b9deef944c22331bc05220d1d6e46412e3cb1246ef041a4405d0cbbd90c2d624.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ba9376e4ac39b809133ab717edb4c88b5219118766db492d7c97534ce119c2ec.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/baf338e9c272158b905fb58a712e29410c657a45be2764f1c6c43ca87fd1db48.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/bd442ac9fbe52b9f2e4ba586670017c3f2d9fedf1cbdec77ef24e9f8b3a183c8.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/c142adcf253be43b66f23ede8cea1e8fcfa256ebf53054a1068ace04745718a6.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/c6d7cbdc4b2ee9d416edf4d736a4f374f08aea98ca395ad371a50a1853744cfc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/cfb165a7675d15cee2c490b31095a58f73bace50ccc1e0fdf2c8dc4400f1df27.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d40f2ee59612473e9f687f17a0e203fdb4ba54c7185b05a8d81a433b04f24134.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d50ce95411156a6b6cf386aefa5ee58db659811813f74be74f323e7c5795056f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d6af418bbde39b4fc7d22a61401d416be7a3fc1214ea2d3f42b4549c392d22ca.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/de7222ceeb1f72693dfb7fd1f343798659e03772d77f2b498fd8ebece2d5550a.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/e26975b198127ac3b6b4f5c4bc08ad47d6691398feee777743285391cd36d502.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ea428490cd5f2672676a2776a598b819b08246871e76de94b7196f9643144986.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/eb96567a266d24be188cb5b08021112f2fad311cbead939d53c5565da11f6265.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ecf66230bf7b68050c0827c2e4caf3de90e46859d291b794faa0dd3816d9dac6.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ed8f067763a4a8adb83d80c8324b2a9668f1061f5f5352f21295e6cc5132386f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ee507a38772865467736d370791fe73c6aa4d83fe3e7ff4baa156b9cb2894c1c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/eedc5b62dc6f27d4a089e9f5b282f626129236d3f1689b001e04f8748bf8859c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f4119b9c6c23435619682b5d247743459e76584b9b0d6c5cb689d8e156906695.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f576047267a0bf9bd4bfc47072ea3d11066345b839953546292da678d1cb4722.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f8cdfb11997d4ccabea88bcdd3924cc8b621b33618b18fe5fbfd286edfc1d87e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/fce95ecc5db24c903bd46f338e366e2715411465a5efac180e2f0f46397e59de.glb +0 -0
- package/corpus/brasscap-mesa/blobs/image/0579557f9344df6f2c4b1225e6252e53ab86d417a4c9b504b5c714a08a388e47.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/image/9e18816a2ec16fbbb1f00f4a39c73ac2cbf6a8cdc17b4c96b1eba4cc9a754dc7.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/image/eb453c71cfb1f9441eb00b32281f98e226e49d9dcf75c231455575fcdc652222.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/json/e0072ed82115c519b891f53a194ea3b28fff7d3826d8ddf23460d6f21b7728d9.json +1 -0
- package/corpus/brasscap-mesa/blobs/json/ffb0e08eaaa7188db1f55931c9b6330937316091cc7463ed2eff6767bbfa33de.json +1 -0
- package/corpus/brasscap-mesa/blobs/wasm/1d6ace79610c4d510b60ad0c52915e42b57797d91f1ef292f60d8a3daec03dd6.wasm +0 -0
- package/corpus/brasscap-mesa/blobs/wasm/24a4d4c1292677b1c984b5c0d3497ae2929528bf511df475f80cc20945bb08ec.wasm +0 -0
- package/corpus/brasscap-mesa/blobs/wasm/b86d8afcc269fb063ebf64768fc3787635b65a7409a571115b07be2e4da39733.wasm +0 -0
- package/corpus/brasscap-mesa/cook.json +1 -0
- package/corpus/brasscap-mesa/mounts/shardfiles/brasscap-mesa/discovery.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/creatures.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/crowds.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/species.json +1 -0
- package/corpus/brasscap-mesa/sections/audio/audio.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/encounters.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/items.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/strikes.json +1 -0
- package/corpus/brasscap-mesa/sections/economy/ledger.json +1 -0
- package/corpus/brasscap-mesa/sections/economy/loot.json +1 -0
- package/corpus/brasscap-mesa/sections/look/look.json +1 -0
- package/corpus/brasscap-mesa/sections/look/materials.json +1 -0
- package/corpus/brasscap-mesa/sections/quests/quests.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/client-scripts.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/hooks.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/plumbing.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/scripts.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/sim.json +1 -0
- package/corpus/brasscap-mesa/sections/state/migrations.json +1 -0
- package/corpus/brasscap-mesa/sections/state/state.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/card.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/compendium.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/level.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/ui.json +1 -0
- package/corpus/brasscap-mesa/sections/world/collision.json +1 -0
- package/corpus/brasscap-mesa/sections/world/days.json +1 -0
- package/corpus/brasscap-mesa/sections/world/edge.json +1 -0
- package/corpus/brasscap-mesa/sections/world/movers.json +1 -0
- package/corpus/brasscap-mesa/sections/world/navigation.json +1 -0
- package/corpus/brasscap-mesa/sections/world/props.json +1 -0
- package/corpus/brasscap-mesa/sections/world/spawn.json +1 -0
- package/corpus/brasscap-mesa/sections/world/terrain.json +1 -0
- package/corpus/brasscap-mesa/sections/world/tiles.json +1 -0
- package/corpus/brasscap-mesa/sections/world/traversal.json +1 -0
- package/corpus/brasscap-mesa/sections/world/water.json +1 -0
- package/corpus/brasscap-mesa/sections/world/weather.json +1 -0
- package/corpus/brasscap-mesa/shard.json +1 -0
- package/corpus/brasscap-mesa/validation.json +1 -0
- package/corpus/handwritten/blobs/bin/027822f6ae9c374ce1ced851f2227cb9acb03077e5cc6b7fecb245c31f021abd.bin +0 -0
- package/corpus/handwritten/blobs/bin/0377ce182bd604bcf4d501f14bf954c434ea64ad856ad9d71c502d1045612703.bin +0 -0
- package/corpus/handwritten/blobs/bin/05ad93d239eeeb5d9afa09b00d90c56098d88e8850e5b5e691fcaa7520dec3cd.bin +0 -0
- package/corpus/handwritten/blobs/bin/0c8980141e6e394ea473df1eb11c347ba617a1a9a4b39b3fa1871b5d15b97d87.bin +0 -0
- package/corpus/handwritten/blobs/bin/14eb11f8d809320e0a68b1edea7837d7a5b4a3da71f1ce4f54068e0afe0b039b.bin +0 -0
- package/corpus/handwritten/blobs/bin/16590066c039ac71e5038a9866a53ccb95e21af13db29cb655b379c4fcfef7bb.bin +0 -0
- package/corpus/handwritten/blobs/bin/1795b5147ad52482445d2414ee22823b947c43a917b6e96fd9ec017f17000912.bin +0 -0
- package/corpus/handwritten/blobs/bin/18f2e24ecc1ed1b1d12ae1c89732a5a1a618ab6e973d4ff0332cf9ecc4e4f4a6.bin +0 -0
- package/corpus/handwritten/blobs/bin/1a18ade01095f1a9ebe75650127861ef27dda0bb17c2b91bde057ec88ef2e98a.bin +0 -0
- package/corpus/handwritten/blobs/bin/1dba017cddb874bc147efb00c55418846ffa344a696f4df702bbabeea55034d0.bin +0 -0
- package/corpus/handwritten/blobs/bin/248c703537e4687ddd2b69a40d1ef3936da718626289d6867ce0a6866f562ba4.bin +0 -0
- package/corpus/handwritten/blobs/bin/2612d9fd4727f8c349f2dbfb7b1650bb7a752d0798a4966ac22cf2b6cdd9fcef.bin +0 -0
- package/corpus/handwritten/blobs/bin/28c54c766e90e3b046a2377b9fa015b0ce45cf3da4420f2b10553251f86c06aa.bin +0 -0
- package/corpus/handwritten/blobs/bin/30866b4807b12579f50218f6525c3db00919fbd43c97921daf47b3244b25dca6.bin +0 -0
- package/corpus/handwritten/blobs/bin/3d14fae85d77406a9b8c59f2e973cdae9587d49108ea92fb460679ca860196b8.bin +0 -0
- package/corpus/handwritten/blobs/bin/3f2201a53c441abcfb52089fe9bbb01f26fac8744099d3fb6668452885c2fa11.bin +0 -0
- package/corpus/handwritten/blobs/bin/42f270a99367fc4cc901518ccaa344ab595e265f113be944510da745c11f69d1.bin +0 -0
- package/corpus/handwritten/blobs/bin/43fd4327fedd51a586684ac611bcad4a8b9d62e51e03967de71fb42c9bf0f6e1.bin +0 -0
- package/corpus/handwritten/blobs/bin/484adda0898a881b6f095dad447f6a619bf0933f65efe940b72f1ab7f3630c22.bin +0 -0
- package/corpus/handwritten/blobs/bin/4a38cd49e8797429ce76265c3d8972195d5b0a02a35fc05fc513eab11240f415.bin +0 -0
- package/corpus/handwritten/blobs/bin/4fe636237bbbd4f836b0816bc61702f4c224d4cb91fbd94f244c731e24a1b945.bin +0 -0
- package/corpus/handwritten/blobs/bin/51b1cff782dc7ebb382bc429ee965023d4cdb52c7b3e37d6ffff5ef55c1c2813.bin +0 -0
- package/corpus/handwritten/blobs/bin/52561f02071ecaa98432fab5e8ece407a8e8f733a01f8eb7c543d1efe02614da.bin +0 -0
- package/corpus/handwritten/blobs/bin/556d6333923afea9641c4738741a41d6a46ae28a508288b9a49a749a344c1398.bin +0 -0
- package/corpus/handwritten/blobs/bin/5caeb97f32c7f31e1029eebdf31131f879f781bb5e3a225206a646710d83fd75.bin +0 -0
- package/corpus/handwritten/blobs/bin/5d1131e42a045083225105b640ff72e02c7f353ee6285545ac264d01bea26b1b.bin +0 -0
- package/corpus/handwritten/blobs/bin/5d80b30eee9f8342a92f6756fd0d84fb9d2d2ce994d222627641e584ad45d2a8.bin +0 -0
- package/corpus/handwritten/blobs/bin/5e0f9f7f2a85abe11a0a61ede853c9b9942b4494c3eb9943785cf6ae221e40e3.bin +0 -0
- package/corpus/handwritten/blobs/bin/5fdc5485343bba8201185c9bae862ad8618498ab5ce63b53514e4e0226fa7bdb.bin +0 -0
- package/corpus/handwritten/blobs/bin/6623dcb0b31c9ca0be342f6dca6b9e607ec3c12ff82068fa6030c142c2df77f7.bin +0 -0
- package/corpus/handwritten/blobs/bin/6887131a04175edbd1989aa95e8749d1703e7f2d0b8464e85f6bad28d6964125.bin +0 -0
- package/corpus/handwritten/blobs/bin/6cf89771d998486cad9049e6f4fc177d742a18ad79fafa4596814ff9d3cf1952.bin +0 -0
- package/corpus/handwritten/blobs/bin/74bbb0fc219e8476cd5550014a357ee18abc981ff3fe787ae3e60d4593705ec5.bin +0 -0
- package/corpus/handwritten/blobs/bin/76784a7f519ac43ce113a0c9365881839b75f66f96aa009fe8d3c8ab539ef283.bin +0 -0
- package/corpus/handwritten/blobs/bin/79a2f693ee2da546bb551f8b641b9c3affd2b8bfb5632ed7f417daba9d900af9.bin +0 -0
- package/corpus/handwritten/blobs/bin/7b593b0f9eefb957fb9d58b316d9836971203038d7c8127284bba44ccb3090bb.bin +0 -0
- package/corpus/handwritten/blobs/bin/7bb8e518ca5606de78972a6c648b57623f8bc12d7e06b4bbf43c60ac419a9bbd.bin +0 -0
- package/corpus/handwritten/blobs/bin/7c6133f3350147257fa501f41269cb77cb11d8ed96d351e873333b079cee524a.bin +0 -0
- package/corpus/handwritten/blobs/bin/7f5acf1893828995256f5b2c54948f80ba21e53de72db26ea72ce2479f5b0682.bin +0 -0
- package/corpus/handwritten/blobs/bin/836516253cf0f3e6e79537609fdbe6331c8c5c974f9ec4d3fbe4a7db48cf123d.bin +0 -0
- package/corpus/handwritten/blobs/bin/89900344f82d5c1474d2a163f8d29903447bac64e9c9775123ef499be70c2380.bin +0 -0
- package/corpus/handwritten/blobs/bin/95d76a9273c3edd98b3643c54e2e7989800bdcaf6f815230ef09f601e760330f.bin +0 -0
- package/corpus/handwritten/blobs/bin/a7b5a5fe053a38c93eed899bde5051cddd80e0a3f3c82b6fd814869097f0944b.bin +0 -0
- package/corpus/handwritten/blobs/bin/b29be84df0bfd1bc97a1464fd5ea068130947bfed3328e167640c81326eb45d7.bin +0 -0
- package/corpus/handwritten/blobs/bin/b6518dc352be03332a256f1cd9d1149da262fe6829e87ba43364f19c687ca7c9.bin +0 -0
- package/corpus/handwritten/blobs/bin/b7edb8095beeb158adb61ae3caa1653773757afbcd8fb2764c94b975a43fe9e2.bin +0 -0
- package/corpus/handwritten/blobs/bin/b86d617ae7fa397df51ff7af87cd89fa113ac19abd3840ea8f3a086d6c82905c.bin +0 -0
- package/corpus/handwritten/blobs/bin/bb860b5c67ee7f2fafd67588822152228d6f6c9de1231123eeafa4844732b18b.bin +0 -0
- package/corpus/handwritten/blobs/bin/bf8c3971bbb224075d488ffa9cfc20e322c61f9ca0c59c356838415f6778014b.bin +0 -0
- package/corpus/handwritten/blobs/bin/c2edd52ee14ebdc9fcc01d38c15d6ab3379df7a20098c260c546551898959cd1.bin +0 -0
- package/corpus/handwritten/blobs/bin/c3de13c551c5b45270143dcbb9fc9a31651f6012355823c0709c2fe6cafda940.bin +0 -0
- package/corpus/handwritten/blobs/bin/c57a8d9da18b1289afd16de00dd1ec75027048b8dcf7dd218da36bc3276ff035.bin +0 -0
- package/corpus/handwritten/blobs/bin/cc2975c9dea4c31b1bf380623a8f44059423004653f9cae4f603d374174323b7.bin +0 -0
- package/corpus/handwritten/blobs/bin/d476abba2e1c63ad3c7527617559173484ee837a5be2744d968466d5527c286b.bin +0 -0
- package/corpus/handwritten/blobs/bin/db242f89115c878cf0c3b976a1647e9cdeb6a1a51813b1dacaf1188715603294.bin +0 -0
- package/corpus/handwritten/blobs/bin/dcc4b9b3bc4ca777d11c494ae5478f17ad7cf2efa18dcba30def872d55355bc3.bin +0 -0
- package/corpus/handwritten/blobs/bin/dd99da483f385327d6b8319d6e2e9000b580280069353718aa0fda2230707e8b.bin +0 -0
- package/corpus/handwritten/blobs/bin/dfc139dba26f1789e16f72602e654636f2d99bcd41e3f10454da74b3a6a64dda.bin +0 -0
- package/corpus/handwritten/blobs/bin/e15ab3cc9f60657321cfe8d9751e086f025734f4e7068271e0baf6066a686f18.bin +0 -0
- package/corpus/handwritten/blobs/bin/e16a83a71213db6f804ce1d53981a2308062752c85c440022d9eeb7605fd37c8.bin +0 -0
- package/corpus/handwritten/blobs/bin/e7355876487f660ac9f25c9d9dfcd66eaf432e1e1669eb89d12ce8267a8d3e86.bin +0 -0
- package/corpus/handwritten/blobs/bin/e81a632e2da0f6a4d801f18aadfe2c6e640401cc1178935a9099ebb8e3af6cc1.bin +0 -0
- package/corpus/handwritten/blobs/bin/f0721c60d0b1046579d8c587fac8482a70822f0b39a85f9acc0cfc31f82b7dd2.bin +0 -0
- package/corpus/handwritten/blobs/bin/f301cf574de6d84030f839098ca44705dca115f9d3e4ee848e0b35fff3deaf77.bin +0 -0
- package/corpus/handwritten/blobs/bin/f7797f295a7570c437bf7020a1ddf208fea2a7aab595333320a6396c1608d360.bin +0 -0
- package/corpus/handwritten/blobs/glb/08de0bb2439ac812adef528b4b073bdb954bbeada972a2f3afb1757bd0540396.glb +0 -0
- package/corpus/handwritten/blobs/glb/153681171c35d2898569324e21ebe734b8418d4122833618a1e64ea326be1e5e.glb +0 -0
- package/corpus/handwritten/blobs/glb/1df5ce0b6cae72ec4cf3c41510681ba70ebb474f9745d536ebd4f03e8fc82de9.glb +0 -0
- package/corpus/handwritten/blobs/glb/262031e2fa710bd8d586eafce1019ca1434a2170e407567741aac1d99fc9c5ab.glb +0 -0
- package/corpus/handwritten/blobs/glb/27466efb180fb5b5074b40e424bd0b8d78f7ff0f5f3663748e014daeeeb5bedd.glb +0 -0
- package/corpus/handwritten/blobs/glb/2d2f6d00a14c89a4efb7f679b371118f564f258797ed8b8b42baf4ae60902ea6.glb +0 -0
- package/corpus/handwritten/blobs/glb/31f327d215ed7ef422e2169172f3869769e9816c9da979616844081e74f2eb09.glb +0 -0
- package/corpus/handwritten/blobs/glb/3bfe0e9ca18077ffee9c284ef40fed9f2fc354f7495612c785a6f980b5966559.glb +0 -0
- package/corpus/handwritten/blobs/glb/3db43042b3eeb1dee7ce9de1cc00322cefc348aa18c37d168b0858e6af6ca7a4.glb +0 -0
- package/corpus/handwritten/blobs/glb/46460a50da44fb8e792b48a646ec9ce025bb309d315dbcf67d2e9598591750de.glb +0 -0
- package/corpus/handwritten/blobs/glb/4902213556fedaf269fba6f0f195e424b2e49973ab45dcb8b69e34d253d9d8ff.glb +0 -0
- package/corpus/handwritten/blobs/glb/4dda463c9cd4bf339e5611871d4ba2fe16fe1487389a88b2888e96bc55e45d93.glb +0 -0
- package/corpus/handwritten/blobs/glb/4ed23469bd2b6b73183564cfc80a1ebcd0ffe2666a90a556752af0ca147fd2f7.glb +0 -0
- package/corpus/handwritten/blobs/glb/4fe74a1bed6b67129885b90cfcae01b5ca82e23e6d40507e280f02fca7fda54f.glb +0 -0
- package/corpus/handwritten/blobs/glb/50521bb3a50cc7199d324a0b25bc167c2e9d69770cb500490428efefc81ce3ea.glb +0 -0
- package/corpus/handwritten/blobs/glb/5ecca36d1e503edc092af0ef42f139cdcad99b8c2008318eb6ad337023d57296.glb +0 -0
- package/corpus/handwritten/blobs/glb/60fc036925852568cdb1b9fb85218dc43a8bf2ed86d3971a221ad942ece203a7.glb +0 -0
- package/corpus/handwritten/blobs/glb/611633cee0e5822b744486e6dff5414ad5b159eaabffe1c0ba0bb68be794bfa1.glb +0 -0
- package/corpus/handwritten/blobs/glb/67c7f983a0bcb9f84425378acac121a53f30795dce3181643bc1b763d0ae80b5.glb +0 -0
- package/corpus/handwritten/blobs/glb/6ecc0d307030943727484b49b1872643479c55ccc92252fca06e9e3cbe98fa90.glb +0 -0
- package/corpus/handwritten/blobs/glb/774b366df4de56cb6f9e3c904f02ec98016ac2ec489dc9e214b09220fca2f8e5.glb +0 -0
- package/corpus/handwritten/blobs/glb/785bae514ffc029e611d602259db7d37cbef589409a0814b9d37175d8b6c0a45.glb +0 -0
- package/corpus/handwritten/blobs/glb/79e79524efb2830e90af3c945c5b36ef07c1a38f2da2958112203a99eac52a16.glb +0 -0
- package/corpus/handwritten/blobs/glb/7bebdcdaf0be30d9f8d21bde72af68c32d825d12dc668f48109223ed7ff71c9f.glb +0 -0
- package/corpus/handwritten/blobs/glb/7d8b5ec9326a11362b3f9fa3409cb59d11b99f549cc304319c63c1ec55cbf5ab.glb +0 -0
- package/corpus/handwritten/blobs/glb/82e886f826315e4bf962363165fadadd3d93f85132c1909095045e0a7ccc0b34.glb +0 -0
- package/corpus/handwritten/blobs/glb/84b4ef190c3994ae7ca1b1f7a936526d1d20ad7deac13f949e3fe6bb7ba139ed.glb +0 -0
- package/corpus/handwritten/blobs/glb/85b7153e943fbe8c659bd6e4b323511dc6f6e2c7a3a1185e7a9a29ea6ddfdfa6.glb +0 -0
- package/corpus/handwritten/blobs/glb/85cf2d2be91cedbaf454ca42ad53c0c17b311088528d274695dbcea490d6c684.glb +0 -0
- package/corpus/handwritten/blobs/glb/8662b4cdc626c61a45e63f71dc866746c083cd0d4644b817a373105f936a7047.glb +0 -0
- package/corpus/handwritten/blobs/glb/8a4d33bfbb17d865e5deb0a0bdf3de67fc2312950a7568ed2635c22fbe4b1ecf.glb +0 -0
- package/corpus/handwritten/blobs/glb/8b11171d41c9027411ca8b87797d9ec70355471bdd3a247c114c49b8b781bbd9.glb +0 -0
- package/corpus/handwritten/blobs/glb/9026e1c4f0250832b69a989e69fe3071e5cad72adfe9c22ce11c409b18bb3357.glb +0 -0
- package/corpus/handwritten/blobs/glb/945b946f17b6393ea040230641c3083678bb6ab42e1d7239aeb9c950d0e7d5bb.glb +0 -0
- package/corpus/handwritten/blobs/glb/9afab455d603f1f8a38074c5a6cbed26d7d7f2cfd8a531820bd165d4b37399ee.glb +0 -0
- package/corpus/handwritten/blobs/glb/a6d702fb1be1095517625bfb2a2383f5f9638775059fd7e0d093d2044651b848.glb +0 -0
- package/corpus/handwritten/blobs/glb/aae479c2f99848998a1b499bbcad815d971349c2442bc363786aef63baad4337.glb +0 -0
- package/corpus/handwritten/blobs/glb/b155bd41f260d5303e293d691b657e0fb9b9c8b2f8aa589a0187061baa033eb7.glb +0 -0
- package/corpus/handwritten/blobs/glb/b1e8b770d99e8ca4396f21fd512f632c587149fc13db69deba388f702a46982f.glb +0 -0
- package/corpus/handwritten/blobs/glb/b382c318a5baac35da59a7b99ebaad6992e30c4bac327e85851ce0b2f89aa58b.glb +0 -0
- package/corpus/handwritten/blobs/glb/ba4478198696802808262af9bbfc224fe37e24e3f8c13de91debc87d3e1a9d41.glb +0 -0
- package/corpus/handwritten/blobs/glb/baf02cd967d1bf3c6a2ae878f4ca4ed34d0c39302ca2b8b6e3560a4e87b5c16f.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc14dd152815ea6ed39458dcf89f2d69173d61d6e2b57be99d31ce2da64ccf67.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc4e4d3bcf7ace855183efec0fbf242d444a32714d8b2fd8a45fa7b539ef2c73.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc53475e2aa2fc9c2c0574b36a449fd57259c462d771e2b360def5c338d37c26.glb +0 -0
- package/corpus/handwritten/blobs/glb/c35d9e50f392c29f2587e3a6eb4f21143ba08e48d76a53b9de62d3b5be46c1a5.glb +0 -0
- package/corpus/handwritten/blobs/glb/c6911e059d3ac6aea75bc0ad3dd8b220704bfbba8ba98b57705e7aa3ecbe0050.glb +0 -0
- package/corpus/handwritten/blobs/glb/c84d88b6ed878490bcf9fa985b5e6a7a683de8ee7808ee4151a3b6a898fbe4f2.glb +0 -0
- package/corpus/handwritten/blobs/glb/c9d5d02ef0e38ac2898d3e6ecbc2ea0a6d2bd04531118550ab54b5e83293d7ec.glb +0 -0
- package/corpus/handwritten/blobs/glb/cd9d04e361e4c3d0aeb82f8682d71114ff8318b8fc4980bccee3c5e5c16afc27.glb +0 -0
- package/corpus/handwritten/blobs/glb/d32499928422a0cd1a32b1afaeacc31d2d84d74876f6805b36218dc04402a921.glb +0 -0
- package/corpus/handwritten/blobs/glb/dc7ea629fcddeba445599d73a5d721f4d5004e056c3c140baa3e6817393c6462.glb +0 -0
- package/corpus/handwritten/blobs/glb/dce79b59c85ca5a7f9fc25e585d253b15558f8f5d8497a76923c9071601de8b1.glb +0 -0
- package/corpus/handwritten/blobs/glb/e7fa1b02bae6c8d19ace0e8db44810beab9a1be9f8172d5816324760267d6d11.glb +0 -0
- package/corpus/handwritten/blobs/glb/eb664feed0fdcc3ac73cecbe737109994fe5dfad8a33997de88598965fa936ba.glb +0 -0
- package/corpus/handwritten/blobs/glb/ec6a771ca852b0b69e55a12df9d347384d01e611c8c6151ea771910f1601605d.glb +0 -0
- package/corpus/handwritten/blobs/glb/ede05013f575b4216d2b4b3f8a14d611ef28756f952f702bb169529c8ab02eff.glb +0 -0
- package/corpus/handwritten/blobs/glb/fec21fa96950340a1a031b31b37407468361ab0a7645c683e0d7773c18591a26.glb +0 -0
- package/corpus/handwritten/blobs/glb/ff21ea082bb00b01006900e7dbbb85220f31f45c144405c840a70872f9e09cb9.glb +0 -0
- package/corpus/handwritten/blobs/image/248fe9601e921305ffb35421414bc5f03e9f1b3dba15bf9b5c3387d8f255da17.png +0 -0
- package/corpus/handwritten/blobs/image/4b47420aff1ded28c9c6cf1eb92d6e2d7b01d057f2654654405445ff8d562e55.webp +0 -0
- package/corpus/handwritten/blobs/image/5dbc818ed0be692e6ba3df87898fd623280a2686eed5a538333e1325764b238d.png +0 -0
- package/corpus/handwritten/blobs/image/d5ae692911bbc2b60b5fdde239b70aad4ce9be0d7665c4a91b438de6077e21e3.jpg +0 -0
- package/corpus/handwritten/blobs/ktx2/df0dd2e8adc1d9479148bb198cb750471df454680cf0c9ffd6dc85d6262ed676.ktx2 +0 -0
- package/corpus/handwritten/blobs/wasm/ecc886d8bbebcf190298ff9162b6bb364f2125606f5bdc8cc220ea28044f96ea.wasm +0 -0
- package/corpus/handwritten/cook.json +1 -0
- package/corpus/handwritten/mounts/shardfiles/blender-template/discovery.json +1 -0
- package/corpus/handwritten/sections/actors/creatures.json +1 -0
- package/corpus/handwritten/sections/actors/crowds.json +1 -0
- package/corpus/handwritten/sections/actors/species.json +1 -0
- package/corpus/handwritten/sections/audio/audio.json +1 -0
- package/corpus/handwritten/sections/client/plan.json +1 -0
- package/corpus/handwritten/sections/combat/encounters.json +1 -0
- package/corpus/handwritten/sections/combat/items.json +1 -0
- package/corpus/handwritten/sections/combat/strikes.json +1 -0
- package/corpus/handwritten/sections/economy/ledger.json +1 -0
- package/corpus/handwritten/sections/economy/loot.json +1 -0
- package/corpus/handwritten/sections/look/look.json +1 -0
- package/corpus/handwritten/sections/look/map.json +1 -0
- package/corpus/handwritten/sections/look/materials.json +1 -0
- package/corpus/handwritten/sections/quests/quests.json +1 -0
- package/corpus/handwritten/sections/sim/client-scripts.json +1 -0
- package/corpus/handwritten/sections/sim/hooks.json +1 -0
- package/corpus/handwritten/sections/sim/plumbing.json +1 -0
- package/corpus/handwritten/sections/sim/sim.json +1 -0
- package/corpus/handwritten/sections/state/migrations.json +1 -0
- package/corpus/handwritten/sections/state/state.json +1 -0
- package/corpus/handwritten/sections/ui/card.json +1 -0
- package/corpus/handwritten/sections/ui/compendium.json +1 -0
- package/corpus/handwritten/sections/ui/level.json +1 -0
- package/corpus/handwritten/sections/ui/ui.json +1 -0
- package/corpus/handwritten/sections/world/collision.json +1 -0
- package/corpus/handwritten/sections/world/days.json +1 -0
- package/corpus/handwritten/sections/world/edge.json +1 -0
- package/corpus/handwritten/sections/world/movers.json +1 -0
- package/corpus/handwritten/sections/world/navigation.json +1 -0
- package/corpus/handwritten/sections/world/props.json +1 -0
- package/corpus/handwritten/sections/world/spawn.json +1 -0
- package/corpus/handwritten/sections/world/terrain.json +1 -0
- package/corpus/handwritten/sections/world/tiles.json +1 -0
- package/corpus/handwritten/sections/world/traversal.json +1 -0
- package/corpus/handwritten/sections/world/water.json +1 -0
- package/corpus/handwritten/sections/world/weather.json +1 -0
- package/corpus/handwritten/shard.json +1 -0
- package/corpus/handwritten/validation.json +1 -0
- package/package.json +504 -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 +271 -0
- package/src/format/audio-waiver.ts +55 -0
- package/src/format/audio.ts +463 -0
- package/src/format/audioBank.ts +37 -0
- package/src/format/audioProfiles.ts +501 -0
- package/src/format/audioRouting.ts +67 -0
- package/src/format/audioScene.ts +342 -0
- package/src/format/bakedTerrainBytes.ts +35 -0
- package/src/format/bakedTerrainSampling.ts +66 -0
- package/src/format/bakedTiles.ts +407 -0
- package/src/format/binarySource.ts +32 -0
- package/src/format/bodySlots.ts +90 -0
- package/src/format/bossEncounter.ts +354 -0
- package/src/format/bossProfiles.ts +709 -0
- package/src/format/bossSocketRig.ts +92 -0
- package/src/format/bowVariantRows.ts +68 -0
- package/src/format/brains.ts +252 -0
- package/src/format/budget.ts +214 -0
- package/src/format/buildings.ts +496 -0
- package/src/format/builtIndexes.ts +26 -0
- package/src/format/catalogueEconomy.ts +65 -0
- package/src/format/caveInterior.ts +225 -0
- package/src/format/cellBounds.ts +47 -0
- package/src/format/cellField.ts +98 -0
- package/src/format/chapterDirector.ts +193 -0
- package/src/format/clientChannels.ts +450 -0
- package/src/format/clientCues.ts +34 -0
- package/src/format/clientNative.ts +358 -0
- package/src/format/clientOwnership.ts +43 -0
- package/src/format/clientPlan.ts +306 -0
- package/src/format/clientScripts.ts +116 -0
- package/src/format/clientState.ts +273 -0
- package/src/format/clientTrails.ts +56 -0
- package/src/format/collectionDisplay.ts +232 -0
- package/src/format/colourFunction.ts +44 -0
- package/src/format/colourLut.ts +4 -0
- package/src/format/commonsCosts.ts +28 -0
- package/src/format/compendiumRows.ts +151 -0
- package/src/format/compendiumSketches.ts +23 -0
- package/src/format/completion.ts +83 -0
- package/src/format/contentBounds.ts +76 -0
- package/src/format/contentCost.ts +50 -0
- package/src/format/contracts.ts +305 -0
- package/src/format/cook-data.ts +148 -0
- package/src/format/cook-preparation.ts +241 -0
- package/src/format/coverAppearance.ts +53 -0
- package/src/format/creatures.ts +175 -0
- package/src/format/crowdPresentation.ts +87 -0
- package/src/format/crowds.ts +46 -0
- package/src/format/cueDirector.ts +134 -0
- package/src/format/dayCycle.ts +28 -0
- package/src/format/dayLook.ts +44 -0
- package/src/format/decisionBindings.ts +80 -0
- package/src/format/decisionPublication.ts +35 -0
- package/src/format/decisionScripts.ts +327 -0
- package/src/format/declaredQuestPage.ts +101 -0
- package/src/format/deviceMemoryCost.ts +50 -0
- package/src/format/director.ts +52 -0
- package/src/format/directorProduct.ts +27 -0
- package/src/format/directorStages.ts +165 -0
- package/src/format/directorWhen.ts +78 -0
- package/src/format/discoveryValues.ts +416 -0
- package/src/format/easedFields.ts +48 -0
- package/src/format/edgeProfiles.ts +40 -0
- package/src/format/eliteContinuation.ts +110 -0
- package/src/format/eliteEntryRows.ts +351 -0
- package/src/format/eliteFeature.ts +605 -0
- package/src/format/eliteScripts.ts +60 -0
- package/src/format/encounterRows.ts +1030 -0
- package/src/format/encounters.ts +65 -0
- package/src/format/engine-music.ts +42 -0
- package/src/format/entryClearance.ts +86 -0
- package/src/format/entryCoverage.ts +61 -0
- package/src/format/entryGeometry.ts +56 -0
- package/src/format/entryLanding.ts +83 -0
- package/src/format/entryReads.ts +45 -0
- package/src/format/entrywayAssets.ts +33 -0
- package/src/format/entryways.ts +58 -0
- package/src/format/exchange.ts +25 -0
- package/src/format/explorerCatalogue.ts +312 -0
- package/src/format/feature-sides.ts +233 -0
- package/src/format/fieldPresentation.ts +62 -0
- package/src/format/figures.ts +437 -0
- package/src/format/findsCatalogue.ts +67 -0
- package/src/format/fixedDraws.ts +24 -0
- package/src/format/flyers.ts +226 -0
- package/src/format/forestNativeInputs.ts +37 -0
- package/src/format/forestPage.ts +285 -0
- package/src/format/forestWeather.ts +333 -0
- package/src/format/geometryPack.ts +136 -0
- package/src/format/glbBuffers.ts +77 -0
- package/src/format/glbCost.ts +212 -0
- package/src/format/glbImages.ts +95 -0
- package/src/format/glbTriangles.ts +95 -0
- package/src/format/graphArmsRows.ts +200 -0
- package/src/format/grapple.ts +123 -0
- package/src/format/grazers.ts +164 -0
- package/src/format/grid-catalogue.ts +247 -0
- package/src/format/gridReadiness.ts +49 -0
- package/src/format/groupBrains.ts +249 -0
- package/src/format/heldArms.ts +576 -0
- package/src/format/heldEquipment.ts +78 -0
- package/src/format/heldFinishes.ts +415 -0
- package/src/format/heldGear.ts +68 -0
- package/src/format/heldJianDocument.ts +75 -0
- package/src/format/heldMelee.ts +866 -0
- package/src/format/heldView.ts +26 -0
- package/src/format/heldWeaponDocuments.ts +36 -0
- package/src/format/herdShelter.ts +58 -0
- package/src/format/hooks.ts +45 -0
- package/src/format/immutable.ts +59 -0
- package/src/format/inputDeclarations.ts +157 -0
- package/src/format/islandLibrary.ts +51 -0
- package/src/format/items.ts +229 -0
- package/src/format/json.ts +143 -0
- package/src/format/keyedSky.ts +314 -0
- package/src/format/kitFigure.ts +68 -0
- package/src/format/ktx2Cost.ts +47 -0
- package/src/format/ledger.ts +56 -0
- package/src/format/liftApproach.ts +75 -0
- package/src/format/liftRider.ts +10 -0
- package/src/format/lightEmitters.ts +105 -0
- package/src/format/lights.ts +135 -0
- package/src/format/limbCollision.ts +136 -0
- package/src/format/limbPopulation.ts +33 -0
- package/src/format/limbRig.ts +202 -0
- package/src/format/loadout.ts +156 -0
- package/src/format/look-light.ts +153 -0
- package/src/format/lootBag.ts +145 -0
- package/src/format/lootEconomy.ts +235 -0
- package/src/format/materialFamilies.ts +565 -0
- package/src/format/materialGraph.ts +1220 -0
- package/src/format/materials.ts +449 -0
- package/src/format/memoryAdmission.ts +84 -0
- package/src/format/memoryGates.json +7 -0
- package/src/format/meshCollision.ts +56 -0
- package/src/format/meshCollisionAssets.ts +19 -0
- package/src/format/meshCollisionBytes.ts +102 -0
- package/src/format/meshEntryways.ts +54 -0
- package/src/format/meshopt-decoder.wasm +0 -0
- package/src/format/meshopt-module.ts +177 -0
- package/src/format/meshopt-static.mjs +11 -0
- package/src/format/meshopt-wasm.ts +61 -0
- package/src/format/migrations.ts +209 -0
- package/src/format/minimap.ts +1052 -0
- package/src/format/mixedPopulation.ts +222 -0
- package/src/format/modes.ts +304 -0
- package/src/format/mountedSpecimenRows.ts +64 -0
- package/src/format/moverLifecycle.ts +34 -0
- package/src/format/moverMotion.ts +271 -0
- package/src/format/movers.ts +224 -0
- package/src/format/namedJsonContracts.ts +423 -0
- package/src/format/nativeActors.ts +45 -0
- package/src/format/nativeAssembly.ts +141 -0
- package/src/format/nativeGround.ts +37 -0
- package/src/format/nativeGroundAssets.ts +35 -0
- package/src/format/nativeItems.ts +184 -0
- package/src/format/nativePhysics.ts +140 -0
- package/src/format/nativeQuestComposition.ts +398 -0
- package/src/format/nativeRiding.ts +103 -0
- package/src/format/nativeRuntimePlan.ts +89 -0
- package/src/format/navigation.ts +99 -0
- package/src/format/navigationBytes.ts +111 -0
- package/src/format/nearPlaceholder.ts +111 -0
- package/src/format/nearPlaceholderAssets.ts +23 -0
- package/src/format/netCommand.ts +11 -0
- package/src/format/npcs.ts +546 -0
- package/src/format/outputAddress.ts +11 -0
- package/src/format/outputDownload.ts +34 -0
- package/src/format/outputFields.ts +123 -0
- package/src/format/outputIndex.ts +352 -0
- package/src/format/overdraw.ts +41 -0
- package/src/format/pageLife.ts +303 -0
- package/src/format/pagePreparation.ts +60 -0
- package/src/format/paintedLook.ts +55 -0
- package/src/format/paintedResources.ts +158 -0
- package/src/format/panelTemplate.ts +139 -0
- package/src/format/placeholderSource.ts +209 -0
- package/src/format/platformDataSections.ts +146 -0
- package/src/format/platformFileFamilies.ts +299 -0
- package/src/format/plumbing.ts +165 -0
- package/src/format/populationEnvironment.ts +210 -0
- package/src/format/populationKeeper.ts +163 -0
- package/src/format/populationProjection.ts +496 -0
- package/src/format/populationRespawn.ts +48 -0
- package/src/format/populationRoster.ts +158 -0
- package/src/format/portalFloor.ts +56 -0
- package/src/format/portalLink.ts +112 -0
- package/src/format/portalLinkAssets.ts +42 -0
- package/src/format/portalRide.ts +22 -0
- package/src/format/postGraphDocument.ts +36 -0
- package/src/format/postGraphLook.ts +477 -0
- package/src/format/postStack.ts +114 -0
- package/src/format/practiceCourseRows.ts +466 -0
- package/src/format/preflight.ts +155 -0
- package/src/format/presentation.ts +33 -0
- package/src/format/product-audio.ts +76 -0
- package/src/format/product-reads.ts +178 -0
- package/src/format/product-stream-admit.ts +100 -0
- package/src/format/product-stream-assets.ts +493 -0
- package/src/format/product-stream-facts.ts +208 -0
- package/src/format/product-stream-miss.ts +12 -0
- package/src/format/product-stream-node.ts +47 -0
- package/src/format/product-stream-packs.ts +242 -0
- package/src/format/product-stream-rows.ts +202 -0
- package/src/format/product-stream-tar.ts +192 -0
- package/src/format/product-stream.ts +284 -0
- package/src/format/product.ts +358 -0
- package/src/format/productValidation.ts +205 -0
- package/src/format/propMaterials.ts +254 -0
- package/src/format/props.ts +137 -0
- package/src/format/questContinuation.ts +42 -0
- package/src/format/questFigures.ts +227 -0
- package/src/format/questGraph.ts +30 -0
- package/src/format/questHost.ts +314 -0
- package/src/format/questInteractionSource.ts +57 -0
- package/src/format/questInteractions.ts +642 -0
- package/src/format/questPageComposition.ts +92 -0
- package/src/format/questPageFacets.ts +121 -0
- package/src/format/questRuntime.ts +118 -0
- package/src/format/questSteps.ts +182 -0
- package/src/format/questStory.ts +512 -0
- package/src/format/questStoryBindings.ts +43 -0
- package/src/format/questWorld.ts +36 -0
- package/src/format/quests.ts +333 -0
- package/src/format/rainPresentation.ts +131 -0
- package/src/format/rangedPage.ts +117 -0
- package/src/format/receipt-cost.ts +71 -0
- package/src/format/registeredJson.ts +530 -0
- package/src/format/returnProgramDocument.ts +40 -0
- package/src/format/returnProjectionV2.ts +84 -0
- package/src/format/riding.ts +377 -0
- package/src/format/riggedHulls.ts +160 -0
- package/src/format/roamingBossProjection.ts +178 -0
- package/src/format/roamingCombat.ts +22 -0
- package/src/format/ropeDeckSite.ts +148 -0
- package/src/format/rows.ts +86 -0
- package/src/format/runtime.ts +38 -0
- package/src/format/runtimeBinds.ts +49 -0
- package/src/format/runtimeCost.ts +80 -0
- package/src/format/runtimeSpawns.ts +73 -0
- package/src/format/scalarChannel.ts +38 -0
- package/src/format/scaledPost.ts +27 -0
- package/src/format/scaledPostContract.ts +51 -0
- package/src/format/sceneBuffers.ts +122 -0
- package/src/format/sceneDraws.ts +89 -0
- package/src/format/sceneDressing.ts +247 -0
- package/src/format/sceneInstances.ts +192 -0
- package/src/format/sceneMotion.ts +122 -0
- package/src/format/sceneRefs.ts +71 -0
- package/src/format/sceneSources.ts +730 -0
- package/src/format/script-side-grandfather.ts +62 -0
- package/src/format/script-sides.ts +289 -0
- package/src/format/scriptAbi.ts +14 -0
- package/src/format/scriptAbiV1.ts +56 -0
- package/src/format/scriptActionsV2.ts +101 -0
- package/src/format/scriptAdmission.ts +165 -0
- package/src/format/scriptAdmissionV2.ts +126 -0
- package/src/format/scriptContract.ts +170 -0
- package/src/format/scriptFuelV2.ts +124 -0
- package/src/format/scriptGroupBankV2.ts +54 -0
- package/src/format/scriptGroupStepV2.ts +165 -0
- package/src/format/scriptInputStateV2.ts +52 -0
- package/src/format/scriptLimits.ts +5 -0
- package/src/format/scriptMemoryV2.ts +17 -0
- package/src/format/scriptModuleV2.ts +116 -0
- package/src/format/scriptObservationColumnsV2.ts +226 -0
- package/src/format/scriptQueriesV2.ts +164 -0
- package/src/format/scriptQueryStateV2.ts +40 -0
- package/src/format/scriptRngV2.ts +52 -0
- package/src/format/scriptWireV2.ts +106 -0
- package/src/format/scripts.ts +31 -0
- package/src/format/sections.ts +140 -0
- package/src/format/shardSchema.ts +632 -0
- package/src/format/shardSections.ts +383 -0
- package/src/format/sketch.ts +79 -0
- package/src/format/skin-materials.ts +172 -0
- package/src/format/skinAssets.ts +107 -0
- package/src/format/skinData.ts +110 -0
- package/src/format/skinLayers.ts +90 -0
- package/src/format/skins.ts +37 -0
- package/src/format/socketLift.ts +58 -0
- package/src/format/socketLiftAssets.ts +81 -0
- package/src/format/socketRigCreature.ts +66 -0
- package/src/format/sourceResidency.ts +16 -0
- package/src/format/spawnCombat.ts +26 -0
- package/src/format/spawnScriptV2.ts +145 -0
- package/src/format/spawnScripts.ts +229 -0
- package/src/format/spawnTables.ts +46 -0
- package/src/format/spawnView.ts +26 -0
- package/src/format/speciesActorsFile.ts +86 -0
- package/src/format/speciesBookRows.ts +84 -0
- package/src/format/speciesBrain.ts +96 -0
- package/src/format/speciesLooks.ts +1021 -0
- package/src/format/speciesPrograms.ts +97 -0
- package/src/format/speciesScripts.ts +45 -0
- package/src/format/specimenCatalogue.ts +94 -0
- package/src/format/splatTerrain.ts +192 -0
- package/src/format/standalone-catalogue.ts +144 -0
- package/src/format/standaloneControl.ts +44 -0
- package/src/format/state.ts +61 -0
- package/src/format/stateLineage.ts +71 -0
- package/src/format/stealth.ts +106 -0
- package/src/format/stillImage.ts +135 -0
- package/src/format/streamedCover.ts +105 -0
- package/src/format/surfaceLooks.ts +50 -0
- package/src/format/tar-fields.ts +54 -0
- package/src/format/tar-paths.ts +103 -0
- package/src/format/tar-source.ts +13 -0
- package/src/format/tar-write.ts +152 -0
- package/src/format/tar.ts +203 -0
- package/src/format/targets.ts +217 -0
- package/src/format/terrain.ts +241 -0
- package/src/format/terrainTileBytes.ts +104 -0
- package/src/format/tierSelection.ts +195 -0
- package/src/format/toonLighting.ts +32 -0
- package/src/format/toonLook.ts +332 -0
- package/src/format/trail.ts +17 -0
- package/src/format/traversal.ts +13 -0
- package/src/format/treeSetRows.ts +93 -0
- package/src/format/ui.ts +90 -0
- package/src/format/uiStrings.ts +17 -0
- package/src/format/uniformRows.ts +31 -0
- package/src/format/upload-wire.ts +184 -0
- package/src/format/validationReceipt.ts +142 -0
- package/src/format/version.ts +9 -0
- package/src/format/vertexWear.ts +45 -0
- package/src/format/viewProgram.ts +329 -0
- package/src/format/voicePatches.ts +47 -0
- package/src/format/water.ts +247 -0
- package/src/format/waterWaves.ts +7 -0
- package/src/format/waterWorld.ts +34 -0
- package/src/format/weaponProfiles.ts +1315 -0
- package/src/format/weatherBundle.ts +36 -0
- package/src/format/weatherEffects.ts +78 -0
- package/src/format/weatherProgram.ts +422 -0
- package/src/format/wildlifePopulation.ts +210 -0
- package/src/format/wireLimits.ts +9 -0
- package/src/format/worldAssembly.ts +104 -0
- package/src/format/worldEntry.ts +151 -0
- package/src/format/worldPhysics.ts +292 -0
- package/src/format/worldSceneBatch.ts +106 -0
- package/src/format/worldSceneModels.ts +79 -0
- package/src/format/worldScenePages.ts +89 -0
- package/src/format/worldScenePlacement.ts +191 -0
- package/src/format/worldSceneSlabs.ts +43 -0
- package/src/format/worldSceneSurface.ts +113 -0
- package/src/format/worldSceneWeld.ts +702 -0
- package/src/format/worldScenes.ts +184 -0
- package/src/format/worldTargets.ts +111 -0
- package/src/format/worldUpdates.ts +229 -0
- package/src/hook/format-hook.d.mts +2 -0
- package/src/hook/format-hook.mjs +47 -0
- package/README.md +0 -8
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { parseWorldScenes } from './worldScenes.ts';
|
|
2
|
+
import { stringsSteps } from './tierSelection.ts';
|
|
3
|
+
import type { OutputIndex } from './outputIndex.ts';
|
|
4
|
+
import { materialTextureRefs } from './materials.ts';
|
|
5
|
+
import { propMaterialsOf, propMaterialTextureRefs } from './propMaterials.ts';
|
|
6
|
+
import { splatTerrainOf, splatTextureRefs } from './splatTerrain.ts';
|
|
7
|
+
import type { Shardfile } from './shardSchema.ts';
|
|
8
|
+
|
|
9
|
+
/** Exact required transport roots and their dependencies, shared by pack emission and phone admission.
|
|
10
|
+
* Late is a scheduling hint: commons, critical flags, manifest images/navigation and the global LUT still win. */
|
|
11
|
+
export function controlFileHashes(source: Pick<Shardfile, 'files' | 'critical' | 'library' | 'late' | 'presentation' | 'navigation' | 'map' | 'look' | 'requires' | 'props'>): ReadonlySet<string> {
|
|
12
|
+
const card = source.presentation?.card, late = new Set((source.late ?? []).map(row => row.hash));
|
|
13
|
+
const graphFiles = Object.values(source.look.materials).flatMap(material => material.family === 'graph' && 'file' in material ? [material.file] : []);
|
|
14
|
+
const materialFiles = [...materialTextureRefs(source.look.materials), ...graphFiles, ...source.props?.textures.map(row => row.colour) ?? [],
|
|
15
|
+
...propMaterialTextureRefs(source.props === null ? undefined : propMaterialsOf(source.props)),
|
|
16
|
+
...splatTextureRefs(source.props === null ? undefined : splatTerrainOf(source.props))];
|
|
17
|
+
const pending = [...materialFiles, ...source.requires.commons, ...source.critical, ...source.library.filter(hash => !late.has(hash)),
|
|
18
|
+
...source.files.filter(file => file.critical).map(file => file.hash),
|
|
19
|
+
...source.navigation === null ? [] : [source.navigation.file], ...source.map === undefined ? [] : [source.map.image],
|
|
20
|
+
...card === undefined ? [] : [card.thumb, card.portrait, card.landscape], ...source.look.grade.lut === null ? [] : [source.look.grade.lut]];
|
|
21
|
+
const needed = new Set<string>(), files = new Map(source.files.map(file => [file.hash, file]));
|
|
22
|
+
while (pending.length > 0) {
|
|
23
|
+
const ref = pending.pop(); if (ref === undefined) break;
|
|
24
|
+
const hash = ref.replace(/^commons:/u, ''); if (needed.has(hash)) continue;
|
|
25
|
+
needed.add(hash);
|
|
26
|
+
const file = files.get(hash);
|
|
27
|
+
if (file === undefined) {
|
|
28
|
+
if (!source.requires.commons.includes(hash)) throw new Error('Control file is not declared');
|
|
29
|
+
} else pending.push(...file.dependencies);
|
|
30
|
+
}
|
|
31
|
+
return needed;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Exclusive cold Explorer libraries and retained whole-source reconstructions, projected identically for admission and packs.
|
|
35
|
+
* Critical, dependency, tile and any other played reader keep their complete roots. */
|
|
36
|
+
export function* playLibrarySteps(source: Shardfile, descriptor: { readonly index: Pick<OutputIndex, 'files'>; readonly sections: ReadonlyMap<string, unknown> }): Generator<void, ReadonlySet<string>> {
|
|
37
|
+
const input = descriptor.sections.get('world/scenes');
|
|
38
|
+
if (input === undefined) return new Set();
|
|
39
|
+
const scenes = parseWorldScenes(input), names = new Map<string, string>();
|
|
40
|
+
for (const file of descriptor.index.files) for (const name of [file.hash, file.path, `/shardfiles/${source.identity.slug}/${file.path}`, ...file.name === undefined ? [] : [file.name]]) names.set(name, file.hash);
|
|
41
|
+
const eligible = new Set<string>(), other = new Set<string>([...source.critical, ...source.files.filter(file => file.critical).map(file => file.hash)]);
|
|
42
|
+
for (const row of scenes.libraries) if (row.kind === 'whole' && !('storage' in row)) {
|
|
43
|
+
for (const model of row.models) for (const ref of model.files) { const hash = names.get(ref) ?? ref; (row.load === 'explorer' ? eligible : other).add(hash); }
|
|
44
|
+
}
|
|
45
|
+
const into = (text: string): void => { const hash = names.get(text); if (hash !== undefined) other.add(hash); };
|
|
46
|
+
const plan: unknown = descriptor.sections.get('client/plan'), features: unknown = typeof plan === 'object' && plan !== null ? Reflect.get(plan, 'features') : undefined;
|
|
47
|
+
const islands = Array.isArray(features) && features.some((row: unknown) => typeof row === 'object' && row !== null && Reflect.get(row, 'kind') === 'world.assembly' && Reflect.get(row, 'library') !== undefined);
|
|
48
|
+
// A tiled world's retained whole-source list is a cold reconstruction port,
|
|
49
|
+
// not a live draw. Explicit scene/ground/tile readers below still win. Island
|
|
50
|
+
// assemblies consume the list in play and retain their original admission.
|
|
51
|
+
if (!islands) for (const ref of source.props?.wholeLibrary ?? []) eligible.add(names.get(ref) ?? ref);
|
|
52
|
+
if (eligible.size === 0) return eligible;
|
|
53
|
+
const { files: _files, library: _library, critical: _critical, late: _late, props, ...rest } = source;
|
|
54
|
+
const fields = islands || props === null ? { ...rest, props } : { ...rest, props: { ...props, wholeLibrary: [] } };
|
|
55
|
+
const { libraries: _libraries, ...world } = scenes, sections: unknown[] = [world];
|
|
56
|
+
for (const [name, section] of descriptor.sections) {
|
|
57
|
+
if (name === 'world/scenes') continue;
|
|
58
|
+
// the props section carries the same whole-library list as `props` (its `props` row)
|
|
59
|
+
const row: unknown = typeof section === 'object' && section !== null ? Reflect.get(section, 'props') : undefined;
|
|
60
|
+
sections.push(!islands && name === 'world/props' && typeof section === 'object' && section !== null && typeof row === 'object' && row !== null
|
|
61
|
+
? { ...section, props: { ...row, wholeLibrary: [] } } : section);
|
|
62
|
+
}
|
|
63
|
+
yield* stringsSteps([fields, ...sections], into);
|
|
64
|
+
for (const file of source.files) for (const ref of file.dependencies) other.add(ref);
|
|
65
|
+
return new Set([...eligible].filter(hash => !other.has(hash)));
|
|
66
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { ShardHashSchema } from './shardSections.ts';
|
|
3
|
+
import { SHARDFILE_ADMISSION_LIMITS } from './admissionLimits.ts';
|
|
4
|
+
import { WIRE_CELL } from './wireLimits.ts';
|
|
5
|
+
|
|
6
|
+
/** A declared library root which may warm after control. A required reader can demand it earlier.
|
|
7
|
+
* Cell-local x/z is an ordering hint; no position means after positioned files. Full costs and inventory stay declared. */
|
|
8
|
+
export interface LateFile { hash: string; at?: [number, number] }
|
|
9
|
+
export type AdmissionLate = LateFile[];
|
|
10
|
+
const coordinate = v.pipe(v.number(), v.finite(), v.minValue(-WIRE_CELL.half), v.maxValue(WIRE_CELL.half));
|
|
11
|
+
/** Optional additive admission metadata; duplicate, out-of-cell or undeclared roots refuse instead of changing a guard. */
|
|
12
|
+
export const AdmissionLateSchema: v.GenericSchema<AdmissionLate, AdmissionLate> = v.pipe(
|
|
13
|
+
v.array(v.strictObject({ hash: ShardHashSchema, at: v.exactOptional(v.tuple([coordinate, coordinate])) })),
|
|
14
|
+
v.maxLength(SHARDFILE_ADMISSION_LIMITS.files), v.check(rows => new Set(rows.map(row => row.hash)).size === rows.length, 'unique late file hashes'),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
/** Exact local library membership shared by source, output-index and project assembly boundaries.
|
|
19
|
+
* Schema validation owns shape/uniqueness; aliases and commons names never replace the declared local hash. */
|
|
20
|
+
export function lateLibraryRootsValid(rows: readonly LateFile[], files: Pick<ReadonlySet<string>, 'has'>, library: Pick<ReadonlySet<string>, 'has'>): boolean {
|
|
21
|
+
return rows.every(row => files.has(row.hash) && library.has(row.hash));
|
|
22
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Shared manifest admission ceilings, checked before immutable assets or a simulation are opened. */
|
|
2
|
+
export const SHARDFILE_ADMISSION_LIMITS: Readonly<{ sourceBytes: 2000000; files: 4096; commons: 1024; stateFields: 128; waterBodies: 64; idCharacters: 128; textCharacters: 4096; wireBytes: 256000000; }> = Object.freeze({
|
|
3
|
+
sourceBytes: 2_000_000,
|
|
4
|
+
files: 4096,
|
|
5
|
+
commons: 1024,
|
|
6
|
+
stateFields: 128,
|
|
7
|
+
waterBodies: 64,
|
|
8
|
+
idCharacters: 128,
|
|
9
|
+
textCharacters: 4096,
|
|
10
|
+
wireBytes: 256_000_000,
|
|
11
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { ShardHashSchema, ShardNaturalSchema } from './shardSections.ts';
|
|
3
|
+
|
|
4
|
+
/** J91: the extensions a server-class file is written with, by kind. */
|
|
5
|
+
const SERVER_EXTENSIONS = { json: 'json', bin: 'bin', tile: 'wtt' } as const;
|
|
6
|
+
/** One server-class file: named, hashed and validated like any product file, but held apart from `index.files`. */
|
|
7
|
+
export interface ServerFile { name: string; path: string; hash: string; bytes: number; kind: keyof typeof SERVER_EXTENSIONS; schema?: string }
|
|
8
|
+
export type AdmissionServer = ServerFile[];
|
|
9
|
+
const name = v.pipe(v.string(), v.maxLength(240), v.regex(/^server\/[a-z0-9][a-z0-9.-]*(?:\/[a-z0-9][a-z0-9.-]*)*$/u));
|
|
10
|
+
/**
|
|
11
|
+
* J91's fourth admission class, beside `critical`, `late` and `library`. The rows sit in `index.admission.server` and
|
|
12
|
+
* nowhere else: never in `index.files`, so no client walk (fetch list, prefetch, tier selection, residency) can see
|
|
13
|
+
* them, and no pack can hold one. Its bytes live under `server/`, which the app publisher does not copy.
|
|
14
|
+
* A JSON row names the defining schema of its registered platform family; a binary row has none.
|
|
15
|
+
*/
|
|
16
|
+
export const AdmissionServerSchema: v.GenericSchema<AdmissionServer, AdmissionServer> = v.pipe(
|
|
17
|
+
v.array(v.strictObject({ name, path: v.pipe(v.string(), v.maxLength(240)), hash: ShardHashSchema, bytes: ShardNaturalSchema,
|
|
18
|
+
kind: v.picklist(['json', 'bin', 'tile']), schema: v.exactOptional(v.pipe(v.string(), v.minLength(1), v.maxLength(240))) })),
|
|
19
|
+
v.maxLength(256),
|
|
20
|
+
v.check(rows => rows.every(row => row.path === serverFilePath(row.kind, row.hash)), 'server files live at their kind and hash under server/'),
|
|
21
|
+
v.check(rows => rows.every(row => (row.kind === 'json') === (row.schema !== undefined)), 'server JSON alone names a defining schema'),
|
|
22
|
+
v.check(rows => new Set(rows.map(row => row.name)).size === rows.length && new Set(rows.map(row => row.hash)).size === rows.length, 'unique server files'),
|
|
23
|
+
);
|
|
24
|
+
/** Where a server-class file is written, relative to its product. */
|
|
25
|
+
export function serverFilePath(kind: ServerFile['kind'], hash: string): string { return `server/${kind}/${hash}.${SERVER_EXTENSIONS[kind]}`; }
|
|
26
|
+
/** The server class is exclusive: a file a client may read is that file's client class, never both. */
|
|
27
|
+
export function serverFilesExclusive(rows: readonly ServerFile[], files: readonly { readonly hash: string; readonly name?: string }[]): boolean {
|
|
28
|
+
const hashes = new Set(files.map(file => file.hash)), names = new Set(files.flatMap(file => file.name === undefined ? [] : [file.name]));
|
|
29
|
+
return rows.every(row => !hashes.has(row.hash) && !names.has(row.name));
|
|
30
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
|
|
3
|
+
const id=v.pipe(v.string(),v.minLength(1),v.maxLength(128));
|
|
4
|
+
const finite=v.pipe(v.number(),v.finite());
|
|
5
|
+
const positive=v.pipe(finite,v.minValue(0.001),v.maxValue(100000));
|
|
6
|
+
const count=v.pipe(v.number(),v.integer(),v.minValue(1),v.maxValue(256));
|
|
7
|
+
const model=v.pipe(v.number(),v.integer(),v.minValue(0),v.maxValue(31));
|
|
8
|
+
const range=v.pipe(v.tuple([finite,finite]),v.check(pair=>pair[0]<=pair[1]));
|
|
9
|
+
const burst=v.strictObject({phase:v.pipe(v.array(positive),v.minLength(2),v.maxLength(3)),amplitude:finite,foldPhase:finite,foldAmplitude:finite,rest:v.tuple([finite,finite]),rates:v.tuple([positive,positive]),glide:range,beats:v.pipe(v.tuple([count,count]),v.check(pair=>pair[0]<=pair[1]&&pair[1]<=64))});
|
|
10
|
+
const posture=v.tuple([finite,finite,finite,finite,finite,finite]);
|
|
11
|
+
/** One ambient forager row (G466 H6, `@wildshard/engine/ai/ambientForager`): grazing gait, scare radii, sentries and the
|
|
12
|
+
* escape (zig-zag bounds away, or a run home and down the burrow). Posture rows: [sit, rate, head pitch, rate, ears, rate]. */
|
|
13
|
+
export const ForagerPolicySchema: v.GenericSchema<ForagerPolicyRows> =v.strictObject({
|
|
14
|
+
scare:range,crouched:v.exactOptional(positive),alertMargin:finite,releaseMargin:finite,alertPause:range,grazePause:range,settlePause:range,turn:range,
|
|
15
|
+
grazing:v.variant('gait',[v.strictObject({gait:v.literal('hop'),chance:v.pipe(finite,v.minValue(0),v.maxValue(1)),length:range,duration:positive,height:positive}),v.strictObject({gait:v.literal('walk'),speed:positive,wander:range})]),
|
|
16
|
+
escape:v.variant('to',[v.strictObject({to:v.literal('away'),distance:range,pause:range,length:positive,duration:positive,height:positive,zigSteps:v.tuple([count,count]),spread:range,steer:positive}),
|
|
17
|
+
v.strictObject({to:v.literal('home'),speed:positive,reach:positive,hide:range,emerge:positive,sink:positive})]),
|
|
18
|
+
/** where a forager may step (null: anywhere): chunk margin, height above water, pond / cabin mask ceilings, creeks, min normal y, trunk clearance */
|
|
19
|
+
ground:v.nullable(v.strictObject({margin:finite,aboveWater:finite,pond:finite,cabin:finite,stream:v.boolean(),slope:finite,trunk:finite})),
|
|
20
|
+
sentry:v.nullable(v.strictObject({chance:v.pipe(finite,v.minValue(0),v.maxValue(1)),duration:range,sight:positive,alarm:v.boolean()})),
|
|
21
|
+
posture:v.strictObject({graze:posture,alert:posture,flee:posture,sentry:v.exactOptional(posture),hide:v.exactOptional(posture)}),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
/** One forager population (`@wildshard/engine/ai/ambientForager#ForagerPopulation`): `count` rows at most, clock ids
|
|
25
|
+
* `<id>:<n>`, placed as `colonies` round burrow sites (size per site, ring radius, home offset, first timer) or `roam`ing
|
|
26
|
+
* round the viewer (seat / re-seat rings, draw range, visible range, re-seat retry, view cosines [draw, seat], blind range). */
|
|
27
|
+
export const ForagerPopulationSchema: v.StrictObjectSchema<{
|
|
28
|
+
readonly id: v.GenericSchema<string>;
|
|
29
|
+
readonly count: v.GenericSchema<number>;
|
|
30
|
+
readonly policy: typeof ForagerPolicySchema;
|
|
31
|
+
readonly place: v.GenericSchema<ForagerPopulationRows['place']>;
|
|
32
|
+
}, undefined> =v.strictObject({id,count,policy:ForagerPolicySchema,place:v.variant('kind',[
|
|
33
|
+
v.strictObject({kind:v.literal('colonies'),size:v.tuple([count,count]),radius:range,home:finite,timer:range}),
|
|
34
|
+
v.strictObject({kind:v.literal('roam'),seat:range,reseat:range,range:positive,visibleRange:positive,retry:positive,view:v.tuple([finite,finite,positive])})])});
|
|
35
|
+
/** Native forager view: prepared model book, material tuning and body projection. */
|
|
36
|
+
export const ForagerDrawSchema: v.GenericSchema<ForagerDrawRows> =v.strictObject({name:id,books:v.strictObject({phone:id,desktop:id}),model:id,
|
|
37
|
+
rim:finite,bands:finite,tilt:finite,sink:finite});
|
|
38
|
+
|
|
39
|
+
const uint=v.pipe(v.number(),v.integer(),v.minValue(0),v.maxValue(0xffffffff)),frame=v.pipe(v.number(),v.integer(),v.minValue(-1)),nonneg=v.pipe(finite,v.minValue(0));
|
|
40
|
+
const clock=v.strictObject({elapsed:nonneg,credit:nonneg,frame,dt:nonneg,last:finite,due:v.boolean(),tickFrame:frame});
|
|
41
|
+
/** A population's saved state: rows (state 0 graze, 1 sentry / alert, 2 flee, 3 hide), its Rng and band clocks. */
|
|
42
|
+
export const ForagerContinuation: v.GenericSchema<ForagerSnapshot> =v.strictObject({
|
|
43
|
+
retired:v.exactOptional(v.pipe(v.array(v.pipe(uint,v.maxValue(255))),v.maxLength(256))),
|
|
44
|
+
rows:v.pipe(v.array(v.strictObject({x:finite,z:finite,bx:finite,bz:finite,yaw:finite,stand:finite,sink:finite,state:v.picklist([0,1,2,3]),t:finite,tx:finite,tz:finite})),v.maxLength(256)),acc:nonneg,
|
|
45
|
+
rng:v.strictObject({version:v.literal(1),state:uint,initial:uint,scrambledFork:v.boolean()}),
|
|
46
|
+
bands:v.strictObject({rates:uint,time:nonneg,frame:v.pipe(v.number(),v.integer(),v.minValue(0)),frameDt:nonneg,
|
|
47
|
+
rows:v.pipe(v.array(v.strictObject({id:v.string(),rate:v.literal('fx'),brain:clock,body:clock})),v.maxLength(256))})});
|
|
48
|
+
|
|
49
|
+
const share=v.pipe(finite,v.minValue(0),v.maxValue(1));
|
|
50
|
+
const offset=v.tuple([finite,finite,finite]);
|
|
51
|
+
const channel=v.union([v.picklist(['flap','fold','head','legs','peck','body']),finite]);
|
|
52
|
+
const depart=v.strictObject({distance:finite,up:range,speed:positive,lift:finite,spread:finite});
|
|
53
|
+
/** One ambient flock (G466 H6): perched, wheeling, flushed and guiding flyers as rows; the platform owns the frame. */
|
|
54
|
+
export const AmbientFlockSchema: v.GenericSchema<AmbientFlockData> =v.strictObject({
|
|
55
|
+
seed:v.pipe(v.number(),v.integer(),v.minValue(0),v.maxValue(0xffffffff)),count,scale:positive,foot:finite,wingbeat:id,
|
|
56
|
+
/** Optional presentation gates. Light is the night fraction; weather names numeric channels, never shard code. */
|
|
57
|
+
when:v.exactOptional(v.strictObject({light:v.exactOptional(range),weather:v.exactOptional(v.pipe(v.record(id,range),v.check(rows=>Object.keys(rows).length<=16)))})),
|
|
58
|
+
flight:v.strictObject({wave:finite,amplitude:finite,pitch:finite,pitchRate:positive,bank:finite,bankLimit:positive,bankRate:positive,directionEpsilon:v.exactOptional(v.pipe(finite,v.minValue(1e-9),v.maxValue(1)))}),
|
|
59
|
+
wingbeats:v.pipe(v.record(id,burst),v.check(rows=>Object.keys(rows).length<=16)),
|
|
60
|
+
/** null: idle birds are hidden until a guide pass borrows them */
|
|
61
|
+
wheeling:v.nullable(v.strictObject({centre:v.strictObject({x:finite,z:finite}),radius:positive,loops:v.pipe(v.array(v.tuple([finite,finite])),v.minLength(1),v.maxLength(8)),loopRadius:range,speed:range,altitude:range,bodyScale:range,bodyAltitude:range,perchAfter:range,bank:finite,
|
|
62
|
+
wheel:v.strictObject({xAmplitude:finite,xFrequency:finite,zScale:finite,zAmplitude:finite,zFrequency:finite,altitudeFrequency:finite,altitudeAmplitude:finite,detailFrequency:finite,detailAmplitude:finite})})),
|
|
63
|
+
perch:v.nullable(v.strictObject({share,flush:positive,flushJitter:range,settle:finite,clear:finite,idle:range,every:range,hop:v.strictObject({chance:share,duration:positive,height:finite,turn:finite}),head:v.strictObject({rate:finite,range:finite,duration:range}),
|
|
64
|
+
takeoff:v.strictObject({duration:positive,out:finite,up:finite,beats:count,bank:finite}),landing:v.strictObject({speed:positive,minimum:positive,rise:finite,flare:share,bank:finite})})),
|
|
65
|
+
guide:v.nullable(v.strictObject({speed:positive,borrow:finite,start:offset,pass:offset,end:v.strictObject({min:positive,max:positive,up:finite}),formation:v.pipe(v.array(offset),v.minLength(1),v.maxLength(8)),stagger:finite,call:v.nullable(share),bank:finite,
|
|
66
|
+
/** null: the pass ends hidden; else on along the heading and up, back into a loop */
|
|
67
|
+
after:v.nullable(v.strictObject({ahead:finite,up:finite,speed:positive}))})),
|
|
68
|
+
call:v.nullable(v.strictObject({cue:id,every:range,first:finite})),
|
|
69
|
+
/** null: no sites. `gather` borrows hidden birds to a kill: they arrive, circle, land round it and feed, lift when flushed, leave fed */
|
|
70
|
+
scavenge:v.nullable(v.strictObject({arrive:v.strictObject({far:range,up:range,near:finite,height:finite,speed:positive,lift:finite}),
|
|
71
|
+
circle:v.strictObject({radius:range,low:range,high:range,speed:range,timer:range,beat:finite,call:finite}),
|
|
72
|
+
land:v.strictObject({speed:positive,lift:finite,ring:range,stand:finite,pause:range,pitch:finite}),
|
|
73
|
+
feed:v.strictObject({pecks:v.tuple([count,count]),pause:range,hop:share,squabble:share,rate:positive,time:range,leave:positive,reland:finite,look:v.tuple([finite,finite]),wings:v.tuple([finite,finite]),peck:v.tuple([finite,finite,finite]),hopTime:positive,hopHeight:finite}),
|
|
74
|
+
/** flush radius walking, fast; the lift back up to circling */
|
|
75
|
+
flush:v.tuple([positive,positive]),lift:v.strictObject({up:range,side:finite,speed:positive,lift:finite}),depart,
|
|
76
|
+
voices:v.strictObject({call:id,pair:id,flap:id,gain:finite,flapGain:finite,gap:range,flapGap:finite})})),
|
|
77
|
+
/** null: no visitor. One bird to a perch near the player while `light` is in `enter`, until it leaves `stay` */
|
|
78
|
+
visit:v.nullable(v.strictObject({enter:range,stay:range,every:positive,near:range,
|
|
79
|
+
from:v.variant('kind',[v.strictObject({kind:v.literal('behind'),back:finite,up:finite}),v.strictObject({kind:v.literal('beyond'),back:finite,up:finite})]),
|
|
80
|
+
speed:positive,lift:finite,approach:v.tuple([finite,finite]),cling:finite,sag:finite,
|
|
81
|
+
pose:v.strictObject({pitch:finite,body:finite,legs:finite,stand:finite,peck:finite}),sway:finite,stare:finite,stareTurn:finite,look:v.tuple([finite,finite]),
|
|
82
|
+
within:finite,callCue:v.nullable(id),flushCall:v.boolean(),gain:finite,call:v.nullable(v.strictObject({cue:id,every:range,first:range,within:finite})),
|
|
83
|
+
acts:v.nullable(v.strictObject({first:range,every:range,hitch:v.tuple([share,finite]),call:share,
|
|
84
|
+
drum:v.nullable(v.strictObject({cue:id,length:range,voiced:positive,within:finite,rate:positive,peck:v.tuple([finite,finite])}))})),
|
|
85
|
+
flush:finite,flushLegs:finite,relocate:range,aim:v.boolean(),leave:finite,leaveWait:finite,depart})),
|
|
86
|
+
/** the posed draw's per-instance channels: a pose name or a constant, four per vec4 */
|
|
87
|
+
channels:v.tuple([v.tuple([channel,channel,channel,channel]),v.nullable(v.tuple([channel,channel,channel,channel]))]),
|
|
88
|
+
attributes:v.tuple([id,v.nullable(id)]),
|
|
89
|
+
system:v.strictObject({id,after:v.pipe(v.array(id),v.maxLength(16)),before:v.pipe(v.array(id),v.maxLength(16))}),
|
|
90
|
+
});
|
|
91
|
+
/** Numeric spawn/perch sites for an ambient group. Radius selects bark-clinging
|
|
92
|
+
* arrival; weight biases site selection. No runtime function may cross the row. */
|
|
93
|
+
export const AmbientPerchesSchema: v.GenericSchema<AmbientPerches> =v.pipe(v.array(v.strictObject({x:finite,y:finite,z:finite,r:v.exactOptional(positive),w:v.exactOptional(positive)})),v.maxLength(4096));
|
|
94
|
+
|
|
95
|
+
export function parseAmbientPerches(value:unknown):AmbientPerches {return v.parse(AmbientPerchesSchema,value);}
|
|
96
|
+
|
|
97
|
+
export function parseAmbientFlock(value:unknown):AmbientFlockData {return v.parse(AmbientFlockSchema,value);}
|
|
98
|
+
/** Ambient populations borrow actual models and world owners. No resources or callbacks are encoded in rows. */
|
|
99
|
+
export const ForestLifeSchema: v.GenericSchema<AmbientLifeData> =v.pipe(v.strictObject({kind:v.literal('forest-community'),seed:v.pipe(v.number(),v.integer(),v.minValue(0),v.maxValue(0xffffffff)),
|
|
100
|
+
/** the kill's ravens: a scavenge flock; visitors per species, the body's half width, when they come, how far you may be */
|
|
101
|
+
scavenger:v.strictObject({flock:AmbientFlockSchema,arrival:range,visitors:v.record(id,count),defaultVisitors:count,bodyWidths:v.record(id,positive),giveUp:positive,reach:positive}),
|
|
102
|
+
/** visit flocks and their baked perches: the night sentinel on snag tops, the day trunk forager on bark sections (r, weight w) */
|
|
103
|
+
sentinel:v.strictObject({flock:AmbientFlockSchema,perches:v.pipe(v.array(v.strictObject({x:finite,y:finite,z:finite})),v.maxLength(4096))}),
|
|
104
|
+
trunkForager:v.strictObject({flock:AmbientFlockSchema,perches:v.pipe(v.array(v.strictObject({x:finite,y:finite,z:finite,r:positive,w:positive})),v.maxLength(4096))}),
|
|
105
|
+
forager:v.strictObject({model,scale:positive,...ForagerPopulationSchema.entries}),
|
|
106
|
+
guide:v.strictObject({flock:AmbientFlockSchema,policy:v.strictObject({distance:v.literal('centre'),min:positive,max:positive,schedule:v.strictObject({kind:v.literal('periodic'),initial:finite,period:range})})}),
|
|
107
|
+
harvest:v.strictObject({len:positive,kneelIn:positive,cuts:v.pipe(v.array(positive),v.maxLength(8)),rise:positive}),
|
|
108
|
+
system:v.strictObject({id,ambient:id,after:v.pipe(v.array(id),v.maxLength(16)),before:v.pipe(v.array(id),v.maxLength(16))}),
|
|
109
|
+
debug:v.strictObject({id,window:id}),sounds:v.strictObject({pair:id,call:id,flap:id,hoot:id,foragerCall:id,drum:id,cutA:id,cutB:id})}),
|
|
110
|
+
v.check(row=>row.scavenger.flock.count+row.forager.count+2<=512,'bounded ambient population'),
|
|
111
|
+
v.check(row=>row.harvest.kneelIn<row.harvest.rise&&row.harvest.rise<row.harvest.len&&row.harvest.cuts.every((value,index)=>value<row.harvest.len&&(index===0||value>(row.harvest.cuts[index-1]??0))),'ordered harvest timeline'));
|
|
112
|
+
|
|
113
|
+
export function parseAmbientLife(value:unknown):AmbientLifeData {return v.parse(ForestLifeSchema,value);}
|
|
114
|
+
|
|
115
|
+
/** Validated ambient data independent of validator implementation metadata. */
|
|
116
|
+
export interface ForagerPolicyRows { scare: [number, number]; crouched?: number; alertMargin: number; releaseMargin: number; alertPause: [number, number]; grazePause: [number, number]; settlePause: [number, number]; turn: [number, number]; grazing: ({ gait: 'hop'; chance: number; length: [number, number]; duration: number; height: number; }) | ({ gait: 'walk'; speed: number; wander: [number, number]; }); escape: ({ to: 'away'; distance: [number, number]; pause: [number, number]; length: number; duration: number; height: number; zigSteps: [number, number]; spread: [number, number]; steer: number; }) | ({ to: 'home'; speed: number; reach: number; hide: [number, number]; emerge: number; sink: number; }); ground: ({ margin: number; aboveWater: number; pond: number; cabin: number; stream: boolean; slope: number; trunk: number; }) | null; sentry: ({ chance: number; duration: [number, number]; sight: number; alarm: boolean; }) | null; posture: { graze: [number, number, number, number, number, number]; alert: [number, number, number, number, number, number]; flee: [number, number, number, number, number, number]; sentry?: [number, number, number, number, number, number]; hide?: [number, number, number, number, number, number]; }; }
|
|
117
|
+
export interface ForagerPopulationRows { id: string; count: number; policy: ForagerPolicyRows; place: ({ kind: 'colonies'; size: [number, number]; radius: [number, number]; home: number; timer: [number, number]; }) | ({ kind: 'roam'; seat: [number, number]; reseat: [number, number]; range: number; visibleRange: number; retry: number; view: [number, number, number]; }); }
|
|
118
|
+
export interface ForagerDrawRows { name: string; books: { phone: string; desktop: string; }; model: string; rim: number; bands: number; tilt: number; sink: number; }
|
|
119
|
+
// oxlint-disable-next-line typescript/consistent-type-definitions -- The alias retains the implicit dictionary signature required by SimValue snapshots.
|
|
120
|
+
export type ForagerSnapshot = { retired?: (number)[]; rows: ({ x: number; z: number; bx: number; bz: number; yaw: number; stand: number; sink: number; state: 0 | 1 | 2 | 3; t: number; tx: number; tz: number; })[]; acc: number; rng: { version: 1; state: number; initial: number; scrambledFork: boolean; }; bands: { rates: number; time: number; frame: number; frameDt: number; rows: ({ id: string; rate: 'fx'; brain: { elapsed: number; credit: number; frame: number; dt: number; last: number; due: boolean; tickFrame: number; }; body: { elapsed: number; credit: number; frame: number; dt: number; last: number; due: boolean; tickFrame: number; }; })[]; }; };
|
|
121
|
+
export interface AmbientFlockData { seed: number; count: number; scale: number; foot: number; wingbeat: string; when?: { light?: [number, number]; weather?: Record<string, [number, number]>; }; flight: { wave: number; amplitude: number; pitch: number; pitchRate: number; bank: number; bankLimit: number; bankRate: number; directionEpsilon?: number; }; wingbeats: Record<string, { phase: (number)[]; amplitude: number; foldPhase: number; foldAmplitude: number; rest: [number, number]; rates: [number, number]; glide: [number, number]; beats: [number, number]; }>; wheeling: ({ centre: { x: number; z: number; }; radius: number; loops: ([number, number])[]; loopRadius: [number, number]; speed: [number, number]; altitude: [number, number]; bodyScale: [number, number]; bodyAltitude: [number, number]; perchAfter: [number, number]; bank: number; wheel: { xAmplitude: number; xFrequency: number; zScale: number; zAmplitude: number; zFrequency: number; altitudeFrequency: number; altitudeAmplitude: number; detailFrequency: number; detailAmplitude: number; }; }) | null; perch: ({ share: number; flush: number; flushJitter: [number, number]; settle: number; clear: number; idle: [number, number]; every: [number, number]; hop: { chance: number; duration: number; height: number; turn: number; }; head: { rate: number; range: number; duration: [number, number]; }; takeoff: { duration: number; out: number; up: number; beats: number; bank: number; }; landing: { speed: number; minimum: number; rise: number; flare: number; bank: number; }; }) | null; guide: ({ speed: number; borrow: number; start: [number, number, number]; pass: [number, number, number]; end: { min: number; max: number; up: number; }; formation: ([number, number, number])[]; stagger: number; call: (number) | null; bank: number; after: ({ ahead: number; up: number; speed: number; }) | null; }) | null; call: ({ cue: string; every: [number, number]; first: number; }) | null; scavenge: ({ arrive: { far: [number, number]; up: [number, number]; near: number; height: number; speed: number; lift: number; }; circle: { radius: [number, number]; low: [number, number]; high: [number, number]; speed: [number, number]; timer: [number, number]; beat: number; call: number; }; land: { speed: number; lift: number; ring: [number, number]; stand: number; pause: [number, number]; pitch: number; }; feed: { pecks: [number, number]; pause: [number, number]; hop: number; squabble: number; rate: number; time: [number, number]; leave: number; reland: number; look: [number, number]; wings: [number, number]; peck: [number, number, number]; hopTime: number; hopHeight: number; }; flush: [number, number]; lift: { up: [number, number]; side: number; speed: number; lift: number; }; depart: { distance: number; up: [number, number]; speed: number; lift: number; spread: number; }; voices: { call: string; pair: string; flap: string; gain: number; flapGain: number; gap: [number, number]; flapGap: number; }; }) | null; visit: ({ enter: [number, number]; stay: [number, number]; every: number; near: [number, number]; from: ({ kind: 'behind'; back: number; up: number; }) | ({ kind: 'beyond'; back: number; up: number; }); speed: number; lift: number; approach: [number, number]; cling: number; sag: number; pose: { pitch: number; body: number; legs: number; stand: number; peck: number; }; sway: number; stare: number; stareTurn: number; look: [number, number]; within: number; callCue: (string) | null; flushCall: boolean; gain: number; call: ({ cue: string; every: [number, number]; first: [number, number]; within: number; }) | null; acts: ({ first: [number, number]; every: [number, number]; hitch: [number, number]; call: number; drum: ({ cue: string; length: [number, number]; voiced: number; within: number; rate: number; peck: [number, number]; }) | null; }) | null; flush: number; flushLegs: number; relocate: [number, number]; aim: boolean; leave: number; leaveWait: number; depart: { distance: number; up: [number, number]; speed: number; lift: number; spread: number; }; }) | null; channels: [[('flap' | 'fold' | 'head' | 'legs' | 'peck' | 'body') | (number), ('flap' | 'fold' | 'head' | 'legs' | 'peck' | 'body') | (number), ('flap' | 'fold' | 'head' | 'legs' | 'peck' | 'body') | (number), ('flap' | 'fold' | 'head' | 'legs' | 'peck' | 'body') | (number)], ([('flap' | 'fold' | 'head' | 'legs' | 'peck' | 'body') | (number), ('flap' | 'fold' | 'head' | 'legs' | 'peck' | 'body') | (number), ('flap' | 'fold' | 'head' | 'legs' | 'peck' | 'body') | (number), ('flap' | 'fold' | 'head' | 'legs' | 'peck' | 'body') | (number)]) | null]; attributes: [string, (string) | null]; system: { id: string; after: (string)[]; before: (string)[]; }; }
|
|
122
|
+
export type AmbientPerches = ({ x: number; y: number; z: number; r?: number; w?: number; })[];
|
|
123
|
+
export interface AmbientLifeData { kind: 'forest-community'; seed: number; scavenger: { flock: AmbientFlockData; arrival: [number, number]; visitors: Record<string, number>; defaultVisitors: number; bodyWidths: Record<string, number>; giveUp: number; reach: number; }; sentinel: { flock: AmbientFlockData; perches: ({ x: number; y: number; z: number; })[]; }; trunkForager: { flock: AmbientFlockData; perches: ({ x: number; y: number; z: number; r: number; w: number; })[]; }; forager: { model: number; scale: number; } & ForagerPopulationRows; guide: { flock: AmbientFlockData; policy: { distance: 'centre'; min: number; max: number; schedule: { kind: 'periodic'; initial: number; period: [number, number]; }; }; }; harvest: { len: number; kneelIn: number; cuts: (number)[]; rise: number; }; system: { id: string; ambient: string; after: (string)[]; before: (string)[]; }; debug: { id: string; window: string; }; sounds: { pair: string; call: string; flap: string; hoot: string; foragerCall: string; drum: string; cutA: string; cutB: string; }; }
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { isJsonData } from './json.ts';
|
|
2
|
+
/** Complete room and encounter documents; the existing native owners still construct and admit every resource. */
|
|
3
|
+
import * as v from 'valibot';
|
|
4
|
+
import { PrivateSceneSchema } from './clientChannels.ts';
|
|
5
|
+
import { BossProfileSchema } from './bossProfiles.ts';
|
|
6
|
+
import { BossEncounterDefinitionSchema, BossEncounterPresentationSchema } from './bossEncounter.ts';
|
|
7
|
+
import { CreatureStrikeSchema } from './creatures.ts';
|
|
8
|
+
import { ReturnProgramSchema } from './namedJsonContracts.ts';
|
|
9
|
+
import { ReturnProgramDocumentSchema, type ReturnProgramDocument } from './returnProgramDocument.ts';
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
interface RoomPoint { x: number; z: number }
|
|
13
|
+
interface ColliderAt { x: number; y: number; z: number; yaw?: number; rot?: { x: number; y: number; z: number; w: number }; surface?: 'wood' | 'stone' | 'metal' | 'sand' }
|
|
14
|
+
type RoomCollider = ({ kind: 'box'; hx: number; hy: number; hz: number } | { kind: 'capsule'; halfHeight: number; radius: number }) & ColliderAt;
|
|
15
|
+
interface ArenaPortalRows {
|
|
16
|
+
signal: string; spawn: { x: number; z: number; yaw: number }; end: number; exitOffset: number; slow: number;
|
|
17
|
+
fade: { out: number; hold: number; in: number }; keep: string; near: number; floor: { tolerance: number; depth: number };
|
|
18
|
+
}
|
|
19
|
+
interface ArenaFightRows {
|
|
20
|
+
profile: v.InferOutput<typeof BossProfileSchema>; body: string; identity: 'runtime' | 'declared';
|
|
21
|
+
add: { kind: string; variant: string; memory: Record<string, number> }; damageTag: string;
|
|
22
|
+
maxZ: number; reward: [number, number, number]; respawn: [number, number, number]; yaw: number;
|
|
23
|
+
presentation: { reach: number; ringMax: number; beamRadius: number };
|
|
24
|
+
cuts: v.InferOutput<typeof CreatureStrikeSchema>[]; hazards: Record<string, v.InferOutput<typeof CreatureStrikeSchema>>;
|
|
25
|
+
}
|
|
26
|
+
/** Complete native King metadata, including retained source fields. */
|
|
27
|
+
export interface ArenaKingRows {
|
|
28
|
+
client: { light: { colour: number; drop: number }; prewarm: { kind: string; variant: string }; system: string; debugZ: number };
|
|
29
|
+
portal: ArenaPortalRows; profile: v.InferOutput<typeof BossProfileSchema>; encounter: v.InferOutput<typeof BossEncounterDefinitionSchema>;
|
|
30
|
+
reward: v.InferOutput<typeof BossEncounterPresentationSchema.entries.reward>;
|
|
31
|
+
tuning: { strikeDamage: number[]; reach: number; sunburstDamage: number; ringSpeed: number; ringMax: number;
|
|
32
|
+
beamRadius: number; beamHitRadius: number; beamDamage: number; beamToKing: number; headdressHp: number; shieldOffset: number; drifts: [number, number, number][] };
|
|
33
|
+
page: ArenaFightRows;
|
|
34
|
+
}
|
|
35
|
+
/** Full chamber, scenes and original collider policy. */
|
|
36
|
+
export interface ArenaRoomDocumentRows {
|
|
37
|
+
id: string; name: string; file: string; sealId: string; sealName: string;
|
|
38
|
+
origin: { x: number; y: number; z: number }; halfWidth: number; corridorHalfWidth: number; corridorEnd: number;
|
|
39
|
+
doorHalfWidth: number; doorHeight: number; sandCells: number; sandColor: string; triangles: number;
|
|
40
|
+
cover: { x: number; z: number; wid: number; len: number; plinthH: number; h: number }; pedestal: RoomPoint;
|
|
41
|
+
beams: { a: RoomPoint; b: RoomPoint; r: number }[];
|
|
42
|
+
collision: { boxes: { x: number; z: number; hw: number; hd: number; rot: number; yTop: number; yBottom: number }[]; descs: RoomCollider[] };
|
|
43
|
+
glowColor: [number, number, number]; beamTop: [number, number, number];
|
|
44
|
+
coverMotion: { closed: [number, number, number]; slide: [number, number, number]; tip: [number, number, number]; slideRotation: [number, number, number]; tipRotation: [number, number, number] };
|
|
45
|
+
markers: string[]; shafts: { id: string; base: number }[]; streams: { id: string; tell: string; x: number; z: number }[];
|
|
46
|
+
lid: string; heap: string; sand: string; flames: string; rings: string[]; beam: string; line: string; dome: string; arc: string; seal: string;
|
|
47
|
+
view: { scene: v.InferOutput<typeof PrivateSceneSchema>; static: v.InferOutput<typeof PrivateSceneSchema>;
|
|
48
|
+
fx: { id: string; mode: number; color: [number, number, number]; alpha: number; additive: boolean; depthTest: boolean; p: [number, number, number, number] }[] };
|
|
49
|
+
}
|
|
50
|
+
/** Streamed room and King document, before native construction. */
|
|
51
|
+
export interface ArenaRoomDocument {
|
|
52
|
+
room: ArenaRoomDocumentRows;
|
|
53
|
+
encounter: ArenaKingRows & { definition: v.InferOutput<typeof BossEncounterDefinitionSchema>; program: ReturnProgramDocument };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const returnProgram: v.GenericSchema<unknown, ReturnProgramDocument> = v.pipe(v.unknown(), v.check(isJsonData), v.intersect([ReturnProgramSchema, ReturnProgramDocumentSchema]));
|
|
57
|
+
|
|
58
|
+
const finite = v.pipe(v.number(), v.finite());
|
|
59
|
+
const positive = v.pipe(finite, v.minValue(Number.MIN_VALUE));
|
|
60
|
+
const id = v.pipe(v.string(), v.minLength(1), v.maxLength(512));
|
|
61
|
+
const triple = v.tuple([finite, finite, finite]);
|
|
62
|
+
const point = v.strictObject({ x: finite, z: finite });
|
|
63
|
+
const list = <S extends v.GenericSchema>(schema: S) => v.pipe(v.array(schema), v.maxLength(256));
|
|
64
|
+
const surface = v.exactOptional(v.picklist(['wood', 'stone', 'metal', 'sand']));
|
|
65
|
+
const at = { x: finite, y: finite, z: finite, yaw: v.exactOptional(finite),
|
|
66
|
+
rot: v.exactOptional(v.strictObject({ x: finite, y: finite, z: finite, w: finite })), surface };
|
|
67
|
+
// Same two shape kinds and surface policy as BossArenaRoom's readColliderRows call.
|
|
68
|
+
const collider = v.variant('kind', [
|
|
69
|
+
v.strictObject({ kind: v.literal('box'), ...at, hx: finite, hy: finite, hz: finite }),
|
|
70
|
+
v.strictObject({ kind: v.literal('capsule'), ...at, halfHeight: finite, radius: finite }),
|
|
71
|
+
]);
|
|
72
|
+
const portal = v.strictObject({ signal: id, spawn: v.strictObject({ x: finite, z: finite, yaw: finite }), end: finite,
|
|
73
|
+
exitOffset: finite, slow: v.pipe(finite, v.minValue(0), v.maxValue(1)),
|
|
74
|
+
fade: v.strictObject({ out: finite, hold: finite, in: finite }), keep: id, near: finite,
|
|
75
|
+
floor: v.strictObject({ tolerance: finite, depth: finite }) });
|
|
76
|
+
const fight = v.strictObject({ profile: BossProfileSchema, body: id, identity: v.picklist(['runtime', 'declared']),
|
|
77
|
+
add: v.strictObject({ kind: id, variant: id, memory: v.record(id, finite) }),
|
|
78
|
+
damageTag: v.pipe(v.string(), v.regex(/^[a-z][a-zA-Z0-9.-]*\.[a-zA-Z0-9.*-]+$/u)),
|
|
79
|
+
maxZ: finite, reward: triple, respawn: triple, yaw: finite,
|
|
80
|
+
presentation: v.strictObject({ reach: finite, ringMax: finite, beamRadius: finite }),
|
|
81
|
+
cuts: v.pipe(v.array(CreatureStrikeSchema), v.minLength(1), v.maxLength(16)), hazards: v.record(id, CreatureStrikeSchema) });
|
|
82
|
+
const tuning = v.strictObject({ strikeDamage: list(finite), reach: finite, sunburstDamage: finite, ringSpeed: finite, ringMax: finite,
|
|
83
|
+
beamRadius: finite, beamHitRadius: finite, beamDamage: finite, beamToKing: finite, headdressHp: finite, shieldOffset: finite, drifts: list(triple) });
|
|
84
|
+
const client = v.strictObject({ light: v.strictObject({ colour: finite, drop: finite }),
|
|
85
|
+
prewarm: v.strictObject({ kind: id, variant: id }), system: id, debugZ: finite });
|
|
86
|
+
const king = v.strictObject({ client, portal, profile: BossProfileSchema, encounter: BossEncounterDefinitionSchema,
|
|
87
|
+
reward: BossEncounterPresentationSchema.entries.reward, tuning, page: fight });
|
|
88
|
+
const room = v.strictObject({
|
|
89
|
+
id, name: id, file: id, sealId: id, sealName: id,
|
|
90
|
+
origin: v.strictObject({ x: finite, y: finite, z: finite }),
|
|
91
|
+
halfWidth: positive, corridorHalfWidth: positive, corridorEnd: positive, doorHalfWidth: positive, doorHeight: positive,
|
|
92
|
+
sandCells: v.pipe(positive, v.integer(), v.maxValue(256)), sandColor: id, triangles: finite,
|
|
93
|
+
cover: v.strictObject({ x: finite, z: finite, wid: positive, len: positive, plinthH: finite, h: finite }), pedestal: point,
|
|
94
|
+
beams: list(v.strictObject({ a: point, b: point, r: positive })),
|
|
95
|
+
collision: v.strictObject({ boxes: list(v.strictObject({ x: finite, z: finite, hw: finite, hd: finite, rot: finite, yTop: finite, yBottom: finite })), descs: list(collider) }),
|
|
96
|
+
glowColor: triple, beamTop: triple,
|
|
97
|
+
coverMotion: v.strictObject({ closed: triple, slide: triple, tip: triple, slideRotation: triple, tipRotation: triple }),
|
|
98
|
+
markers: list(id), shafts: list(v.strictObject({ id, base: finite })), streams: list(v.strictObject({ id, tell: id, x: finite, z: finite })),
|
|
99
|
+
lid: id, heap: id, sand: id, flames: id, rings: list(id), beam: id, line: id, dome: id, arc: id, seal: id,
|
|
100
|
+
view: v.strictObject({ scene: PrivateSceneSchema, static: PrivateSceneSchema,
|
|
101
|
+
fx: list(v.strictObject({ id, mode: finite, color: triple, alpha: finite, additive: v.boolean(), depthTest: v.boolean(), p: v.tuple([finite, finite, finite, finite]) })) }),
|
|
102
|
+
});
|
|
103
|
+
const document = v.strictObject({ room, encounter: v.strictObject({ ...king.entries,
|
|
104
|
+
definition: BossEncounterDefinitionSchema, program: returnProgram }) });
|
|
105
|
+
|
|
106
|
+
/** Existing complete King metadata, including fields its entered adapter does not read. */
|
|
107
|
+
|
|
108
|
+
export const ArenaKingRowsSchema: v.GenericSchema<unknown, ArenaKingRows> = king;
|
|
109
|
+
/** Full chamber, private scene, static scene and collider document. */
|
|
110
|
+
|
|
111
|
+
export const ArenaRoomDocumentRowsSchema: v.GenericSchema<unknown, ArenaRoomDocumentRows> = room;
|
|
112
|
+
/** The unchanged streamed room/King envelope, before either native constructor runs. */
|
|
113
|
+
|
|
114
|
+
export const ArenaRoomDocumentSchema: v.GenericSchema<unknown, ArenaRoomDocument> = document;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { isJsonData } from './json.ts';
|
|
2
|
+
import * as v from 'valibot';
|
|
3
|
+
import { BossEncounterDefinitionSchema,BossEncounterPresentationSchema } from './bossEncounter.ts';
|
|
4
|
+
import { CellFieldSchema } from './cellField.ts';
|
|
5
|
+
import { ReturnProgramSchema } from './namedJsonContracts.ts';
|
|
6
|
+
import { ReturnProgramDocumentSchema, type ReturnProgramDocument } from './returnProgramDocument.ts';
|
|
7
|
+
import { CreatureStrikeSchema } from './creatures.ts';
|
|
8
|
+
import { ArenaEncounterSchema,CoupledEncounterRowsSchema,ArenaWhirlsSchema,ArenaFireSchema,CloudBodySchema,ArenaSceneSchema } from './encounterRows.ts';
|
|
9
|
+
import { ClientChannelsSchema } from './clientChannels.ts';
|
|
10
|
+
import { WeatherGeometrySchema } from './weatherEffects.ts';
|
|
11
|
+
import { ArenaRoomDocumentRowsSchema, ArenaKingRowsSchema } from './arenaRoomDocument.ts';
|
|
12
|
+
|
|
13
|
+
/** Build-only validation; runtime readers import the inferred types only. */
|
|
14
|
+
const returnProgram: v.GenericSchema<unknown, ReturnProgramDocument> = v.pipe(v.unknown(), v.check(isJsonData), v.intersect([ReturnProgramSchema, ReturnProgramDocumentSchema]));
|
|
15
|
+
|
|
16
|
+
const arenaNumber=v.pipe(v.number(),v.finite(),v.minValue(-1e6),v.maxValue(1e6));
|
|
17
|
+
const arenaKey=v.pipe(v.string(),v.minLength(1),v.maxLength(512));
|
|
18
|
+
/** The boss host owns retained values and cadence; an admitted AS module owns
|
|
19
|
+
* lifecycle, phase, damage and boundary policy. No authored ports are lent. */
|
|
20
|
+
export const ArenaScriptBossProfileSchema: v.GenericSchema<ArenaScriptBossProfileRowsInput, ArenaScriptBossProfileRows> = v.strictObject({
|
|
21
|
+
kind: v.literal('boss'), pattern: v.literal('arena-script'), fight: v.strictObject({
|
|
22
|
+
initial: v.pipe(v.record(arenaKey, arenaNumber), v.maxEntries(64)),
|
|
23
|
+
parameters: v.pipe(v.record(arenaKey, arenaNumber), v.maxEntries(32)),
|
|
24
|
+
signals: v.pipe(v.record(arenaKey, arenaKey), v.maxEntries(16)),
|
|
25
|
+
retain: v.pipe(v.record(arenaKey, arenaKey), v.maxEntries(32)),
|
|
26
|
+
retainEvents: v.strictObject({
|
|
27
|
+
step: v.strictObject({enter:arenaKey,mask:arenaKey,shield:arenaKey,show:arenaKey,active:arenaKey,arm:arenaKey,spread:arenaKey,weapon:arenaKey,dome:arenaKey}),
|
|
28
|
+
tell: v.strictObject({chainRadius:arenaKey,chainAlpha:arenaKey,tell:arenaKey,ringRadius:arenaKey,ringAlpha:arenaKey,forkRadius:arenaKey,forkAlpha:arenaKey,bend:arenaKey,bendRate:arenaKey,raise:arenaKey,raiseRate:arenaKey,castL:arenaKey,struck:arenaKey,alpha:arenaKey}),
|
|
29
|
+
intro: v.strictObject({rise:arenaKey,kneel:arenaKey,alpha:arenaKey}),introClock:v.strictObject({zzzzIntroT:arenaKey,zzzzIntroTick:arenaKey}),
|
|
30
|
+
}),
|
|
31
|
+
}),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const finite = v.pipe(v.number(),v.finite()), label = v.pipe(v.string(),v.minLength(1));
|
|
35
|
+
const point = v.strictObject({ x: finite,z: finite });
|
|
36
|
+
const pose = v.strictObject({ rise: finite,bend: finite,kneel: finite,raise: finite,castL: finite,stride: finite,heartOpen: finite });
|
|
37
|
+
const tuning = v.strictObject({ spearDamage: finite,spearRadius: finite,spearAim: finite,spearLock: finite,spearStuck: finite,
|
|
38
|
+
whirlDamage: finite,whirlRadius: finite,riderHp: finite,riderChip: finite,chargeDamage: finite,laneSeconds: finite,flankSeconds: finite,stunSeconds: finite,
|
|
39
|
+
cell: finite,burnSeconds: finite,fireDps: finite,maxFlames: finite,chainDamage: finite,chainRadius: finite,chainLand: finite,fullDraw: finite,fullDrawMul: finite });
|
|
40
|
+
const lines = v.strictObject({ kneels: label,grassFire: label,immuneDome: label,immuneSpear: label,spearStuck: label,riderBreaks: label,lastRider: label,
|
|
41
|
+
burning: label,chain: label,wall: label,tie: label,tieOnFoot: label,tieQuiet: label,wantsRider: label,quiet: label,wakes: label,spear: label,charge: label,whirl: label });
|
|
42
|
+
/** Declared resources and effect bindings for an AS arena script. Named-file
|
|
43
|
+
* admission checks bounded field, support and clock rows before allocation. */
|
|
44
|
+
export const ArenaScriptRowsSchema: v.StrictObjectSchema<{ readonly script: v.GenericSchema<ArenaScriptRowsInput['script'], ArenaScriptRows['script']>; readonly commands: v.GenericSchema<ArenaScriptRowsInput['commands'], ArenaScriptRows['commands']>; readonly clocks: v.GenericSchema<ArenaScriptRowsInput['clocks'], ArenaScriptRows['clocks']>; readonly field: v.GenericSchema<ArenaScriptRowsInput['field'], ArenaScriptRows['field']>; readonly support: v.GenericSchema<ArenaScriptRowsInput['support'], ArenaScriptRows['support']>; readonly whirls: v.GenericSchema<ArenaScriptRowsInput['whirls'], ArenaScriptRows['whirls']>; readonly arenaFire: v.GenericSchema<ArenaScriptRowsInput['arenaFire'], ArenaScriptRows['arenaFire']>; readonly programs: v.GenericSchema<ArenaScriptRowsInput['programs'], ArenaScriptRows['programs']>; readonly supportSites: v.GenericSchema<ArenaScriptRowsInput['supportSites'], ArenaScriptRows['supportSites']>; readonly arena: v.GenericSchema<ArenaScriptRowsInput['arena'], ArenaScriptRows['arena']>; readonly place: v.GenericSchema<ArenaScriptRowsInput['place'], ArenaScriptRows['place']>; readonly phases: v.GenericSchema<ArenaScriptRowsInput['phases'], ArenaScriptRows['phases']>; readonly definition: v.GenericSchema<ArenaScriptRowsInput['definition'], ArenaScriptRows['definition']>; readonly reward: v.GenericSchema<ArenaScriptRowsInput['reward'], ArenaScriptRows['reward']>; readonly skin: v.GenericSchema<ArenaScriptRowsInput['skin'], ArenaScriptRows['skin']>; readonly lines: v.GenericSchema<ArenaScriptRowsInput['lines'], ArenaScriptRows['lines']>; readonly tuning: v.GenericSchema<ArenaScriptRowsInput['tuning'], ArenaScriptRows['tuning']>; readonly boundary: v.GenericSchema<ArenaScriptRowsInput['boundary'], ArenaScriptRows['boundary']>; readonly phaseLines: v.GenericSchema<ArenaScriptRowsInput['phaseLines'], ArenaScriptRows['phaseLines']>; readonly tieLines: v.GenericSchema<ArenaScriptRowsInput['tieLines'], ArenaScriptRows['tieLines']>; readonly immuneLines: v.GenericSchema<ArenaScriptRowsInput['immuneLines'], ArenaScriptRows['immuneLines']>; readonly seeds: v.GenericSchema<ArenaScriptRowsInput['seeds'], ArenaScriptRows['seeds']>; readonly pose: v.GenericSchema<ArenaScriptRowsInput['pose'], ArenaScriptRows['pose']>; readonly contacts: v.GenericSchema<ArenaScriptRowsInput['contacts'], ArenaScriptRows['contacts']>; readonly whole: v.GenericSchema<ArenaScriptRowsInput['whole'], ArenaScriptRows['whole']>; readonly view: v.GenericSchema<ArenaScriptRowsInput['view'], ArenaScriptRows['view']>; readonly weather: v.GenericSchema<ArenaScriptRowsInput['weather'], ArenaScriptRows['weather']>; readonly record: v.GenericSchema<ArenaScriptRowsInput['record'], ArenaScriptRows['record']>; }, undefined> = v.strictObject({
|
|
45
|
+
script: ArenaScriptBossProfileSchema,commands:v.strictObject({ignite:arenaKey,dismount:arenaKey}),clocks: ArenaEncounterSchema,field: CellFieldSchema,support: CoupledEncounterRowsSchema,whirls: ArenaWhirlsSchema,arenaFire: ArenaFireSchema,
|
|
46
|
+
programs: v.strictObject({ attack: returnProgram,wind: returnProgram }),
|
|
47
|
+
supportSites: v.pipe(v.array(v.strictObject({ x: finite,z: finite,theta: finite })),v.maxLength(8)),
|
|
48
|
+
arena: v.strictObject({ center: point,body: point,anchor: point,ground: point }),place: v.strictObject({ arenaRadius: finite,heartHp: finite }),
|
|
49
|
+
phases: v.pipe(v.array(v.strictObject({ at: finite,caption: v.string(),name: label })),v.maxLength(16)),
|
|
50
|
+
definition: BossEncounterDefinitionSchema,reward: BossEncounterPresentationSchema.entries.reward,
|
|
51
|
+
skin: v.strictObject({ id: label,toast: label }),lines,tuning,boundary: v.strictObject({ x: finite,z: finite,radius: finite }),
|
|
52
|
+
phaseLines: v.array(v.string()),tieLines: v.array(v.string()),immuneLines: v.array(v.string()),seeds: v.pipe(v.array(point),v.maxLength(16)),
|
|
53
|
+
pose,contacts: v.record(label,CreatureStrikeSchema),whole: v.pipe(v.array(label),v.maxLength(8)),
|
|
54
|
+
view: v.strictObject({ group: label,dome: label,bodyRoot: label,quietVariant: label,remaining: label,debug: label,
|
|
55
|
+
notice: finite,promptLift: finite,wallDamage: finite,target: v.strictObject({ damage: finite,open: finite,closed: finite,range: finite }),
|
|
56
|
+
light: v.strictObject({ colour: finite,y: finite }),
|
|
57
|
+
reward: v.strictObject({ distance: finite,lift: finite }),respawn: v.strictObject({ distance: finite,yaw: finite,steed: finite }),
|
|
58
|
+
introBolt: point }),
|
|
59
|
+
weather: v.strictObject({ strike: label,clearing: label,storm: label }),record: v.strictObject({ kind: label,variant: label }),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const tier = v.strictObject({ flames: WeatherGeometrySchema,puffs: CloudBodySchema.entries.puffs.entries.rows });
|
|
63
|
+
export const ArenaScriptGeometrySchema: v.GenericSchema<ArenaScriptGeometryRowsInput, ArenaScriptGeometryRows> = v.strictObject({ body: v.strictObject({ ...v.omit(CloudBodySchema,['poses','puffs']).entries,puffs: v.omit(CloudBodySchema.entries.puffs,['rows']) }),
|
|
64
|
+
eyes: WeatherGeometrySchema,poses: ClientChannelsSchema,phone: tier,desktop: tier,arena: ArenaSceneSchema });
|
|
65
|
+
export type ArenaScriptData = ArenaScriptRows & { geometry: v.InferOutput<typeof ArenaScriptGeometrySchema> };
|
|
66
|
+
/** Complete fight wire, including the room and King rows retained by its native owners. */
|
|
67
|
+
export const ArenaScriptFightFileSchema: v.GenericSchema<ArenaScriptFightFileInput, ArenaScriptFightFile> =v.strictObject({
|
|
68
|
+
arenaScript:v.omit(ArenaScriptRowsSchema,['programs','arenaFire']),
|
|
69
|
+
programs:ArenaScriptRowsSchema.entries.programs,arenaFire:ArenaFireSchema,
|
|
70
|
+
arenaRoom:ArenaRoomDocumentRowsSchema,king:ArenaKingRowsSchema,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
/** Build and focused scenario readers use the same defining schemas. */
|
|
74
|
+
export function parseArenaScriptData(input:unknown,geometry:unknown):ArenaScriptData {
|
|
75
|
+
const root=v.parse(ArenaScriptFightFileSchema,input);
|
|
76
|
+
return {...root.arenaScript,programs:root.programs,arenaFire:root.arenaFire,geometry:v.parse(ArenaScriptGeometrySchema,geometry)};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Admitted arena rows independent of validator implementation metadata. */
|
|
80
|
+
export type ArenaScriptBossProfileRowsInput = ArenaScriptBossProfileRows;
|
|
81
|
+
export interface ArenaScriptBossProfileRows { kind: 'boss'; pattern: 'arena-script'; fight: { initial: Record<string, number>; parameters: Record<string, number>; signals: Record<string, string>; retain: Record<string, string>; retainEvents: { step: { enter: string; mask: string; shield: string; show: string; active: string; arm: string; spread: string; weapon: string; dome: string; }; tell: { chainRadius: string; chainAlpha: string; tell: string; ringRadius: string; ringAlpha: string; forkRadius: string; forkAlpha: string; bend: string; bendRate: string; raise: string; raiseRate: string; castL: string; struck: string; alpha: string; }; intro: { rise: string; kneel: string; alpha: string; }; introClock: { zzzzIntroT: string; zzzzIntroTick: string; }; }; }; }
|
|
82
|
+
export interface ArenaScriptRowsInput { script: ArenaScriptBossProfileRowsInput; commands: { ignite: string; dismount: string; }; clocks: v.InferInput<typeof ArenaEncounterSchema>; field: v.InferInput<typeof CellFieldSchema>; support: v.InferInput<typeof CoupledEncounterRowsSchema>; whirls: v.InferInput<typeof ArenaWhirlsSchema>; arenaFire: v.InferInput<typeof ArenaFireSchema>; programs: { attack: unknown; wind: unknown; }; supportSites: ({ x: number; z: number; theta: number; })[]; arena: { center: { x: number; z: number; }; body: { x: number; z: number; }; anchor: { x: number; z: number; }; ground: { x: number; z: number; }; }; place: { arenaRadius: number; heartHp: number; }; phases: ({ at: number; caption: string; name: string; })[]; definition: v.InferInput<typeof BossEncounterDefinitionSchema>; reward: v.InferInput<typeof BossEncounterPresentationSchema.entries.reward>; skin: { id: string; toast: string; }; lines: { kneels: string; grassFire: string; immuneDome: string; immuneSpear: string; spearStuck: string; riderBreaks: string; lastRider: string; burning: string; chain: string; wall: string; tie: string; tieOnFoot: string; tieQuiet: string; wantsRider: string; quiet: string; wakes: string; spear: string; charge: string; whirl: string; }; tuning: { spearDamage: number; spearRadius: number; spearAim: number; spearLock: number; spearStuck: number; whirlDamage: number; whirlRadius: number; riderHp: number; riderChip: number; chargeDamage: number; laneSeconds: number; flankSeconds: number; stunSeconds: number; cell: number; burnSeconds: number; fireDps: number; maxFlames: number; chainDamage: number; chainRadius: number; chainLand: number; fullDraw: number; fullDrawMul: number; }; boundary: { x: number; z: number; radius: number; }; phaseLines: (string)[]; tieLines: (string)[]; immuneLines: (string)[]; seeds: ({ x: number; z: number; })[]; pose: { rise: number; bend: number; kneel: number; raise: number; castL: number; stride: number; heartOpen: number; }; contacts: Record<string, v.InferInput<typeof CreatureStrikeSchema>>; whole: (string)[]; view: { group: string; dome: string; bodyRoot: string; quietVariant: string; remaining: string; debug: string; notice: number; promptLift: number; wallDamage: number; target: { damage: number; open: number; closed: number; range: number; }; light: { colour: number; y: number; }; reward: { distance: number; lift: number; }; respawn: { distance: number; yaw: number; steed: number; }; introBolt: { x: number; z: number; }; }; weather: { strike: string; clearing: string; storm: string; }; record: { kind: string; variant: string; }; }
|
|
83
|
+
export interface ArenaScriptRows { script: ArenaScriptBossProfileRows; commands: { ignite: string; dismount: string; }; clocks: v.InferOutput<typeof ArenaEncounterSchema>; field: v.InferOutput<typeof CellFieldSchema>; support: v.InferOutput<typeof CoupledEncounterRowsSchema>; whirls: v.InferOutput<typeof ArenaWhirlsSchema>; arenaFire: v.InferOutput<typeof ArenaFireSchema>; programs: { attack: ReturnProgramDocument; wind: ReturnProgramDocument; }; supportSites: ({ x: number; z: number; theta: number; })[]; arena: { center: { x: number; z: number; }; body: { x: number; z: number; }; anchor: { x: number; z: number; }; ground: { x: number; z: number; }; }; place: { arenaRadius: number; heartHp: number; }; phases: ({ at: number; caption: string; name: string; })[]; definition: v.InferOutput<typeof BossEncounterDefinitionSchema>; reward: v.InferOutput<typeof BossEncounterPresentationSchema.entries.reward>; skin: { id: string; toast: string; }; lines: { kneels: string; grassFire: string; immuneDome: string; immuneSpear: string; spearStuck: string; riderBreaks: string; lastRider: string; burning: string; chain: string; wall: string; tie: string; tieOnFoot: string; tieQuiet: string; wantsRider: string; quiet: string; wakes: string; spear: string; charge: string; whirl: string; }; tuning: { spearDamage: number; spearRadius: number; spearAim: number; spearLock: number; spearStuck: number; whirlDamage: number; whirlRadius: number; riderHp: number; riderChip: number; chargeDamage: number; laneSeconds: number; flankSeconds: number; stunSeconds: number; cell: number; burnSeconds: number; fireDps: number; maxFlames: number; chainDamage: number; chainRadius: number; chainLand: number; fullDraw: number; fullDrawMul: number; }; boundary: { x: number; z: number; radius: number; }; phaseLines: (string)[]; tieLines: (string)[]; immuneLines: (string)[]; seeds: ({ x: number; z: number; })[]; pose: { rise: number; bend: number; kneel: number; raise: number; castL: number; stride: number; heartOpen: number; }; contacts: Record<string, v.InferOutput<typeof CreatureStrikeSchema>>; whole: (string)[]; view: { group: string; dome: string; bodyRoot: string; quietVariant: string; remaining: string; debug: string; notice: number; promptLift: number; wallDamage: number; target: { damage: number; open: number; closed: number; range: number; }; light: { colour: number; y: number; }; reward: { distance: number; lift: number; }; respawn: { distance: number; yaw: number; steed: number; }; introBolt: { x: number; z: number; }; }; weather: { strike: string; clearing: string; storm: string; }; record: { kind: string; variant: string; }; }
|
|
84
|
+
export interface ArenaScriptGeometryRowsInput {
|
|
85
|
+
body: { puffs: Omit<v.InferInput<typeof CloudBodySchema.entries.puffs>, 'rows'> } & Omit<v.InferInput<typeof CloudBodySchema>, 'poses' | 'puffs'>;
|
|
86
|
+
eyes: v.InferInput<typeof WeatherGeometrySchema>; poses: v.InferInput<typeof ClientChannelsSchema>;
|
|
87
|
+
phone: { flames: v.InferInput<typeof WeatherGeometrySchema>; puffs: v.InferInput<typeof CloudBodySchema.entries.puffs.entries.rows> };
|
|
88
|
+
desktop: { flames: v.InferInput<typeof WeatherGeometrySchema>; puffs: v.InferInput<typeof CloudBodySchema.entries.puffs.entries.rows> };
|
|
89
|
+
arena: v.InferInput<typeof ArenaSceneSchema>;
|
|
90
|
+
}
|
|
91
|
+
export interface ArenaScriptGeometryRows {
|
|
92
|
+
body: { puffs: Omit<v.InferOutput<typeof CloudBodySchema.entries.puffs>, 'rows'> } & Omit<v.InferOutput<typeof CloudBodySchema>, 'poses' | 'puffs'>;
|
|
93
|
+
eyes: v.InferOutput<typeof WeatherGeometrySchema>; poses: v.InferOutput<typeof ClientChannelsSchema>;
|
|
94
|
+
phone: { flames: v.InferOutput<typeof WeatherGeometrySchema>; puffs: v.InferOutput<typeof CloudBodySchema.entries.puffs.entries.rows> };
|
|
95
|
+
desktop: { flames: v.InferOutput<typeof WeatherGeometrySchema>; puffs: v.InferOutput<typeof CloudBodySchema.entries.puffs.entries.rows> };
|
|
96
|
+
arena: v.InferOutput<typeof ArenaSceneSchema>;
|
|
97
|
+
}
|
|
98
|
+
export interface ArenaScriptFightFileInput {
|
|
99
|
+
arenaScript: Omit<ArenaScriptRowsInput, 'programs' | 'arenaFire'>;
|
|
100
|
+
programs: v.InferInput<typeof ArenaScriptRowsSchema.entries.programs>; arenaFire: v.InferInput<typeof ArenaFireSchema>;
|
|
101
|
+
arenaRoom: v.InferInput<typeof ArenaRoomDocumentRowsSchema>; king: v.InferInput<typeof ArenaKingRowsSchema>;
|
|
102
|
+
}
|
|
103
|
+
export interface ArenaScriptFightFile {
|
|
104
|
+
arenaScript: Omit<ArenaScriptRows, 'programs' | 'arenaFire'>;
|
|
105
|
+
programs: v.InferOutput<typeof ArenaScriptRowsSchema.entries.programs>; arenaFire: v.InferOutput<typeof ArenaFireSchema>;
|
|
106
|
+
arenaRoom: v.InferOutput<typeof ArenaRoomDocumentRowsSchema>; king: v.InferOutput<typeof ArenaKingRowsSchema>;
|
|
107
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nalati zero R6: what an arena-script fight (game/boss/arenaScript) lends its entered view program (G600 L7) at its
|
|
3
|
+
* frame slot, and what that program writes back. Values (read once a frame, never written back): `life` (the fight's
|
|
4
|
+
* retained snapshot fields by name), `clocks` (its clock bank by name), `pose` (the body pose's current bend, raise and
|
|
5
|
+
* castL) and `spear` (the spear's x and z). Cells the fight reads after the frame: the eased pose and the aim's struck
|
|
6
|
+
* and alpha. Ground tells the program draws: the spear and fork rings and one ring per chain landing.
|
|
7
|
+
*/
|
|
8
|
+
export const ARENA_VIEW = {
|
|
9
|
+
slot: 'arena.frame',
|
|
10
|
+
sources: { life: 'arena.life', clocks: 'arena.clocks', pose: 'arena.pose', spear: 'arena.spear' },
|
|
11
|
+
pose: ['bend', 'raise', 'castL'],
|
|
12
|
+
spear: ['x', 'z'],
|
|
13
|
+
cells: { bend: 'arena.pose.bend', raise: 'arena.pose.raise', castL: 'arena.pose.castL', struck: 'arena.aim.struck', alpha: 'arena.aim.alpha' },
|
|
14
|
+
tells: { spear: 'arena.spear', fork: 'arena.fork' },
|
|
15
|
+
/** the grass fire's own slot (its field steps first): values (on, a reset's clear, the wind, the tier's smoke copies and
|
|
16
|
+
* rate), the field's arrays (cell modes, lifetimes, the ground under each cell, then this frame's burnt-out cells: a
|
|
17
|
+
* count and cell indices) and the instanced draws it writes (flames, smoke, scorch decals) */
|
|
18
|
+
fire: { slot: 'arena.fire', values: 'arena.fire', fields: ['on', 'clear', 'windX', 'windZ', 'windSpeed', 'smokeCap', 'smokeRate', 'scorchCap'],
|
|
19
|
+
arrays: { modes: 'arena.field.modes', lifetimes: 'arena.field.lifetimes', ground: 'arena.field.ground', burnt: 'arena.field.burnt' },
|
|
20
|
+
draws: { flames: 'arena.flames', smoke: 'arena.smoke', scorch: 'arena.scorch' } },
|
|
21
|
+
/** the whirlwinds' own slot (after their laws): per whirlwind i the values k{i}, shown{i}, x{i}, y{i} (the ground) and
|
|
22
|
+
* z{i}; its funnel the entered object `arenaFunnel(i)`; their debris one instanced draw */
|
|
23
|
+
whirls: { slot: 'arena.whirls', values: 'arena.whirls', fields: ['k', 'shown', 'x', 'y', 'z'], draws: { debris: 'arena.debris' } },
|
|
24
|
+
} as const;
|
|
25
|
+
/** The entered object a whirlwind's funnel is lent as (whirlwind `index`, 0 based). */
|
|
26
|
+
export const arenaFunnel = (index: number): string => `arena.funnel.${String(index)}`;
|
|
27
|
+
/** The burnt-out cells one fire frame takes (the rest wait for the next frame). */
|
|
28
|
+
export const ARENA_BURNT_PER_FRAME = 64;
|
|
29
|
+
/** The ground tell a chain landing's ring draws on (landing `index`, 0 based). */
|
|
30
|
+
export const arenaChainTell = (index: number): string => `arena.chain.${String(index)}`;
|