@faiber/faiber-game-sdk 0.5.0
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/README.md +14 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/assets.d.ts +14 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +3 -0
- package/dist/assets.js.map +1 -0
- package/dist/ecs.d.ts +22 -0
- package/dist/ecs.d.ts.map +1 -0
- package/dist/ecs.js +25 -0
- package/dist/ecs.js.map +1 -0
- package/dist/engine.d.ts +35 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +43 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/quality.d.ts +37 -0
- package/dist/quality.d.ts.map +1 -0
- package/dist/quality.js +16 -0
- package/dist/quality.js.map +1 -0
- package/dist/renderer.d.ts +40 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +36 -0
- package/dist/renderer.js.map +1 -0
- package/dist/state.d.ts +18 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +18 -0
- package/dist/state.js.map +1 -0
- package/dist/wasm.d.ts +13 -0
- package/dist/wasm.d.ts.map +1 -0
- package/dist/wasm.js +3 -0
- package/dist/wasm.js.map +1 -0
- package/package.json +21 -0
package/README.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# @faiber/faiber-game-sdk
|
|
2
|
+
|
|
3
|
+
Portable TypeScript/WebAssembly game runtime designed to scale from a small 2D web game to a cross-platform 3D title.
|
|
4
|
+
|
|
5
|
+
The first foundation includes an ECS world, fixed-step game loop, pluggable renderer and physics systems, WebAssembly game plugins, adaptive device quality, automatic texture variant selection, WebGL 2/headless backends, and direct Infera State replication bindings.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
const game = new FaiberGame({ canvas, tickRate: 60, autoResize: true });
|
|
9
|
+
game.use(movementSystem);
|
|
10
|
+
game.use(new StateReplicationSystem(realtime, stateBinding).connect());
|
|
11
|
+
await game.start();
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
WebGPU, native GPU backends, Bevy component interchange, 2D/3D physics, editor tooling, shader graph, ray tracing, mobile/desktop packaging, asset cooking, and platform certification are adapter-level roadmap items. The capability detector never claims unsupported ray tracing and always selects a runnable fallback for the device.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/quality.ts","../src/assets.ts","../src/ecs.ts","../src/renderer.ts","../src/wasm.ts","../src/engine.ts","../../../node_modules/axios/index.d.ts","../../core/dist/types.d.ts","../../core/dist/env.d.ts","../../core/dist/auth.d.ts","../../core/dist/client.d.ts","../../core/dist/resource.d.ts","../../core/dist/openapi.d.ts","../../core/dist/index.d.ts","../../state/dist/types.d.ts","../../state/dist/api.d.ts","../../state/dist/prediction.d.ts","../../state/dist/realtime.d.ts","../../state/dist/index.d.ts","../src/state.ts","../src/index.ts"],"fileIdsList":[[67],[66,67],[66,67,68,69,70,71,72],[66,67,70],[66],[60],[60,62,63,64],[60,61,62,63,64,65,79],[62,78],[66,73,74],[74,75,76,77],[74],[73]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"70a86301ba2f10267c11a80a76585c7254883c88000d589f88e1274f5871281a","signature":"aa45f1f199125148caec9c75d83bcef7668b9dabb38ae227486b79955fa90e70","impliedFormat":99},{"version":"753c8f945a828b35b774c71176e492a4eb95190d17647e1ab164b159ac21c7ef","signature":"5902ef794dcf3ce4cb3ce4c9f24874f72e58ff70d7af05259fe99aece6e3eadc","impliedFormat":99},{"version":"1d248b56c0bc5f4f3ec80b7797927aae1768df4e89251a397a5b0308d0a10775","signature":"e6f800d42f5cd4844debec2bcf7d7a3241dd6ba39ce9364953f8489f9226081f","impliedFormat":99},{"version":"5f6dfdc8419f235f569fcf56a133294480480054874c6b4abecd0a9bf0c4c139","signature":"bf4a577f04568ce81d92309a4169eab9e91c216edd96416ed4d67218bfa1aaf4","impliedFormat":99},{"version":"bfc9a8733dcfd107c104a5162e4e7e1623fe07600b4cde11b8b2a72b1f5b8570","signature":"ebc91b1043172804c4607840ab03624d44daab3b7ab96121602f507ed564c72d","impliedFormat":99},{"version":"3aa82c610142b02519e93f0334c1121a19b8407a522bc7cf43260aecbca9b16c","signature":"14702125c72e25cf309570c5360965245df8511de7918cdef46199e53e0e55a6","impliedFormat":99},{"version":"2343ec253c90c370449755739733f5f429f58cffdb51a50977bb4a042012fa8f","impliedFormat":99},{"version":"a1d3c689841a395bb512e3504118ccf0aa7436df9b9ac17e41d3fb3d79c57ed7","impliedFormat":99},{"version":"82065c5512d8d6f81b26cf13ea9ecd3e558be9560f7b5c62260858219ecd87f7","impliedFormat":99},{"version":"ed17ed1b2bcf384c88bc6cec6b427989b98db99fc7ad35a50605501a463bbc53","impliedFormat":99},{"version":"82bf4efcca8ab8764a91ac126c0af605ab6717ee94b2316461b5fa388b27e165","impliedFormat":99},{"version":"82ffc9a1d95766c8f6f6bb4316b1d83e9d6a1d4ec41057d1a897cca70176bfc1","impliedFormat":99},{"version":"3f5eeb0a84713ccf640b9a6af4629e006f59d7629abc3fc95af2efb062fd0b83","impliedFormat":99},{"version":"66a0cb4d019dd780c2fb5c2942778929ec55715bb5a0f3b80aac4c0b92e35d16","impliedFormat":99},{"version":"b107ce9c9d9e532f04a994de49b3988ece2beecb270ee1e77d5c8fb1e0e81235","impliedFormat":99},{"version":"b2e8c703155f9dca0f9743408f2c3b90d7120297f8016e9171311b057c6c8f6f","impliedFormat":99},{"version":"9960b39e2a2cf4d4b3b843ce69c83ed77a89cab83ade288d57c1677baf18fbab","impliedFormat":99},{"version":"6d4dea0a46463c93a6a7b918af4e93b6374e3aa8f948e26a16efc744335a355c","impliedFormat":99},{"version":"5762fc28bc25857ea9b54907f1cd6c38cb48fed4c0dd5efc4d8edaaefec55d0a","impliedFormat":99},{"version":"900765ef84d59cabfc06366de0437485c9912232166807abb6be79ba5ca72abf","signature":"77ed5a3ba05aaa918ee7c00ff90eb2645980d3fffe0857903df7606fe8fd1150","impliedFormat":99},{"version":"ece7dc34157387a084eabdb428c2b603f412d8a76cface98dc478bcf878c01b1","impliedFormat":99}],"root":[[60,65],79,80],"options":{"composite":true,"declaration":true,"declarationMap":true,"exactOptionalPropertyTypes":true,"module":199,"noUncheckedIndexedAccess":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo","verbatimModuleSyntax":true},"referencedMap":[[69,1],[70,2],[68,1],[73,3],[72,4],[71,4],[67,5],[61,6],[65,7],[80,8],[63,6],[79,9],[75,10],[78,11],[76,12],[77,12],[74,13]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
|
package/dist/assets.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { QualityProfile } from "./quality.js";
|
|
2
|
+
export interface TextureVariant {
|
|
3
|
+
url: string;
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
format?: "avif" | "webp" | "png" | "ktx2";
|
|
7
|
+
bytes?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function selectTexture(variants: TextureVariant[], quality: QualityProfile, displayPixels: number): TextureVariant;
|
|
10
|
+
export interface AssetLoader {
|
|
11
|
+
loadTexture(variants: TextureVariant[], displayPixels: number): Promise<unknown>;
|
|
12
|
+
preload(urls: string[]): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,MAAM,WAAW,cAAc;IAAC,GAAG,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,MAAM,CAAC,EAAC,MAAM,GAAC,MAAM,GAAC,KAAK,GAAC,MAAM,CAAC;IAAA,KAAK,CAAC,EAAC,MAAM,CAAA;CAAC;AACvH,wBAAgB,aAAa,CAAC,QAAQ,EAAC,cAAc,EAAE,EAAC,OAAO,EAAC,cAAc,EAAC,aAAa,EAAC,MAAM,GAAE,cAAc,CAAkT;AACra,MAAM,WAAW,WAAW;IAAC,WAAW,CAAC,QAAQ,EAAC,cAAc,EAAE,EAAC,aAAa,EAAC,MAAM,GAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAAA,OAAO,CAAC,IAAI,EAAC,MAAM,EAAE,GAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAC"}
|
package/dist/assets.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export function selectTexture(variants, quality, displayPixels) { if (!variants.length)
|
|
2
|
+
throw new Error("At least one texture variant is required"); const target = Math.min(quality.capabilities.maxTextureSize, displayPixels * quality.features.textureScale); return [...variants].sort((a, b) => a.width - b.width).find(v => v.width >= target) ?? [...variants].sort((a, b) => b.width - a.width)[0]; }
|
|
3
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,QAAyB,EAAC,OAAsB,EAAC,aAAoB,IAAiB,IAAG,CAAC,QAAQ,CAAC,MAAM;IAAC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAA,MAAM,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,EAAC,aAAa,GAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAA,OAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,CAAA,CAAC,CAAC,KAAK,GAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,KAAK,IAAE,MAAM,CAAC,IAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,CAAA,CAAC,CAAC,KAAK,GAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAC"}
|
package/dist/ecs.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type EntityId = number;
|
|
2
|
+
export type ComponentType<T extends object> = symbol & {
|
|
3
|
+
readonly __component?: T;
|
|
4
|
+
};
|
|
5
|
+
export declare function component<T extends object>(name: string): ComponentType<T>;
|
|
6
|
+
export declare class World {
|
|
7
|
+
private next;
|
|
8
|
+
private alive;
|
|
9
|
+
private stores;
|
|
10
|
+
spawn(): EntityId;
|
|
11
|
+
despawn(entity: EntityId): void;
|
|
12
|
+
add<T extends object>(entity: EntityId, type: ComponentType<T>, value: T): T;
|
|
13
|
+
get<T extends object>(entity: EntityId, type: ComponentType<T>): T | undefined;
|
|
14
|
+
remove<T extends object>(entity: EntityId, type: ComponentType<T>): boolean;
|
|
15
|
+
query<A extends object>(a: ComponentType<A>): IterableIterator<[EntityId, A]>;
|
|
16
|
+
query2<A extends object, B extends object>(a: ComponentType<A>, b: ComponentType<B>): IterableIterator<[EntityId, A, B]>;
|
|
17
|
+
}
|
|
18
|
+
export interface GameSystem {
|
|
19
|
+
readonly name?: string;
|
|
20
|
+
update(world: World, deltaSeconds: number): void | Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=ecs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecs.d.ts","sourceRoot":"","sources":["../src/ecs.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAC,MAAM,CAAC;AAC5B,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,IAAE,MAAM,GAAC;IAAC,QAAQ,CAAC,WAAW,CAAC,EAAC,CAAC,CAAA;CAAC,CAAC;AAC7E,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAC,MAAM,GAAE,aAAa,CAAC,CAAC,CAAC,CAAyC;AAClH,qBAAa,KAAK;IAChB,OAAO,CAAC,IAAI,CAAG;IAAA,OAAO,CAAC,KAAK,CAAqB;IAAA,OAAO,CAAC,MAAM,CAAuD;IACtH,KAAK,IAAG,QAAQ;IAChB,OAAO,CAAC,MAAM,EAAC,QAAQ,GAAE,IAAI;IAC7B,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAC,QAAQ,EAAC,IAAI,EAAC,aAAa,CAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,GAAE,CAAC;IACtE,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAC,QAAQ,EAAC,IAAI,EAAC,aAAa,CAAC,CAAC,CAAC,GAAE,CAAC,GAAC,SAAS;IACxE,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAC,QAAQ,EAAC,IAAI,EAAC,aAAa,CAAC,CAAC,CAAC,GAAE,OAAO;IACtE,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAC,aAAa,CAAC,CAAC,CAAC,GAAE,gBAAgB,CAAC,CAAC,QAAQ,EAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,CAAC,CAAC,SAAS,MAAM,EAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAC,aAAa,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,aAAa,CAAC,CAAC,CAAC,GAAE,gBAAgB,CAAC,CAAC,QAAQ,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;CACnH;AACD,MAAM,WAAW,UAAU;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAC,MAAM,CAAC;IAAA,MAAM,CAAC,KAAK,EAAC,KAAK,EAAC,YAAY,EAAC,MAAM,GAAE,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAA;CAAC"}
|
package/dist/ecs.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function component(name) { return Symbol(name); }
|
|
2
|
+
export class World {
|
|
3
|
+
next = 1;
|
|
4
|
+
alive = new Set();
|
|
5
|
+
stores = new Map();
|
|
6
|
+
spawn() { const entity = this.next++; this.alive.add(entity); return entity; }
|
|
7
|
+
despawn(entity) { this.alive.delete(entity); for (const store of this.stores.values())
|
|
8
|
+
store.delete(entity); }
|
|
9
|
+
add(entity, type, value) { if (!this.alive.has(entity))
|
|
10
|
+
throw new Error(`Entity ${entity} is not alive`); let store = this.stores.get(type); if (!store) {
|
|
11
|
+
store = new Map();
|
|
12
|
+
this.stores.set(type, store);
|
|
13
|
+
} store.set(entity, value); return value; }
|
|
14
|
+
get(entity, type) { return this.stores.get(type)?.get(entity); }
|
|
15
|
+
remove(entity, type) { return this.stores.get(type)?.delete(entity) ?? false; }
|
|
16
|
+
*query(a) { for (const [entity, value] of this.stores.get(a) ?? [])
|
|
17
|
+
if (this.alive.has(entity))
|
|
18
|
+
yield [entity, value]; }
|
|
19
|
+
*query2(a, b) { for (const [entity, value] of this.query(a)) {
|
|
20
|
+
const second = this.get(entity, b);
|
|
21
|
+
if (second)
|
|
22
|
+
yield [entity, value, second];
|
|
23
|
+
} }
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ecs.js.map
|
package/dist/ecs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecs.js","sourceRoot":"","sources":["../src/ecs.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CAAmB,IAAW,IAAmB,OAAO,MAAM,CAAC,IAAI,CAAqB,CAAA,CAAA,CAAC;AAClH,MAAM,OAAO,KAAK;IACR,IAAI,GAAC,CAAC,CAAC;IAAQ,KAAK,GAAC,IAAI,GAAG,EAAY,CAAC;IAAQ,MAAM,GAAC,IAAI,GAAG,EAA8C,CAAC;IACtH,KAAK,KAAY,MAAM,MAAM,GAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA,OAAO,MAAM,CAAA,CAAA,CAAC;IAC/E,OAAO,CAAC,MAAe,IAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA,KAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;QAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA,CAAA,CAAC;IACrH,GAAG,CAAmB,MAAe,EAAC,IAAqB,EAAC,KAAO,IAAI,IAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,eAAe,CAAC,CAAC,CAAA,IAAI,KAAK,GAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAA6B,CAAC,CAAC,CAAA,IAAG,CAAC,KAAK,EAAC,CAAC;QAAA,KAAK,GAAC,IAAI,GAAG,EAAE,CAAC;QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAA6B,EAAC,KAAK,CAAC,CAAA;IAAA,CAAC,CAAA,KAAK,CAAC,GAAG,CAAC,MAAM,EAAC,KAAK,CAAC,CAAC,CAAA,OAAO,KAAK,CAAA,CAAA,CAAC;IACjU,GAAG,CAAmB,MAAe,EAAC,IAAqB,IAAc,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAA6B,CAAC,EAAE,GAAG,CAAC,MAAM,CAAgB,CAAA,CAAA,CAAC;IAC3J,MAAM,CAAmB,MAAe,EAAC,IAAqB,IAAU,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAA6B,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAE,KAAK,CAAA,CAAA,CAAC;IACrJ,CAAC,KAAK,CAAmB,CAAkB,IAAiC,KAAI,MAAM,CAAC,MAAM,EAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAA0B,CAAC,IAAE,EAAE;QAAC,IAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAAC,MAAK,CAAC,MAAM,EAAC,KAAU,CAAC,CAAA,CAAA,CAAC;IAC3M,CAAC,MAAM,CAAoC,CAAkB,EAAC,CAAkB,IAAmC,KAAI,MAAK,CAAC,MAAM,EAAC,KAAK,CAAC,IAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC,CAAC;QAAA,MAAM,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAC,CAAC,CAAC,CAAC;QAAA,IAAG,MAAM;YAAC,MAAK,CAAC,MAAM,EAAC,KAAK,EAAC,MAAM,CAAC,CAAA;IAAA,CAAC,CAAA,CAAC;CACnO"}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { World, type GameSystem } from "./ecs.js";
|
|
2
|
+
import { AdaptiveQualityController, type QualityProfile, type QualityTier } from "./quality.js";
|
|
3
|
+
import { type Renderer, type RendererFactory, type RendererKind } from "./renderer.js";
|
|
4
|
+
import type { WasmGamePlugin } from "./wasm.js";
|
|
5
|
+
export interface GameConfig {
|
|
6
|
+
canvas?: HTMLCanvasElement;
|
|
7
|
+
tickRate?: number;
|
|
8
|
+
maxFrameDelta?: number;
|
|
9
|
+
quality?: QualityTier;
|
|
10
|
+
renderer?: RendererKind;
|
|
11
|
+
rendererFactory?: RendererFactory;
|
|
12
|
+
autoResize?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class FaiberGame {
|
|
15
|
+
readonly config: GameConfig;
|
|
16
|
+
readonly world: World;
|
|
17
|
+
readonly systems: GameSystem[];
|
|
18
|
+
readonly plugins: WasmGamePlugin[];
|
|
19
|
+
renderer?: Renderer;
|
|
20
|
+
quality?: AdaptiveQualityController;
|
|
21
|
+
private running;
|
|
22
|
+
private previous;
|
|
23
|
+
private accumulator;
|
|
24
|
+
private frame;
|
|
25
|
+
constructor(config?: GameConfig);
|
|
26
|
+
use(system: GameSystem): this;
|
|
27
|
+
useWasm(plugin: WasmGamePlugin): this;
|
|
28
|
+
start(): Promise<void>;
|
|
29
|
+
stop(): void;
|
|
30
|
+
resize(): void;
|
|
31
|
+
private loop;
|
|
32
|
+
private createRenderer;
|
|
33
|
+
}
|
|
34
|
+
export type { QualityProfile };
|
|
35
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAqC,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACnI,OAAO,EAAoE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACzJ,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,MAAM,WAAW,UAAU;IAAC,MAAM,CAAC,EAAC,iBAAiB,CAAC;IAAA,QAAQ,CAAC,EAAC,MAAM,CAAC;IAAA,aAAa,CAAC,EAAC,MAAM,CAAC;IAAA,OAAO,CAAC,EAAC,WAAW,CAAC;IAAA,QAAQ,CAAC,EAAC,YAAY,CAAC;IAAA,eAAe,CAAC,EAAC,eAAe,CAAC;IAAA,UAAU,CAAC,EAAC,OAAO,CAAA;CAAC;AAC9L,qBAAa,UAAU;IAET,QAAQ,CAAC,MAAM,EAAC,UAAU;IADtC,QAAQ,CAAC,KAAK,QAAa;IAAA,QAAQ,CAAC,OAAO,EAAC,UAAU,EAAE,CAAI;IAAA,QAAQ,CAAC,OAAO,EAAC,cAAc,EAAE,CAAI;IAAA,QAAQ,CAAC,EAAC,QAAQ,CAAC;IAAA,OAAO,CAAC,EAAC,yBAAyB,CAAC;IAAA,OAAO,CAAC,OAAO,CAAO;IAAA,OAAO,CAAC,QAAQ,CAAG;IAAA,OAAO,CAAC,WAAW,CAAG;IAAA,OAAO,CAAC,KAAK,CAAG;gBACjN,MAAM,GAAC,UAAa;IACzC,GAAG,CAAC,MAAM,EAAC,UAAU;IAAwC,OAAO,CAAC,MAAM,EAAC,cAAc;IACpF,KAAK;IACX,IAAI;IACJ,MAAM;IACN,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,cAAc;CACvB;AACD,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
package/dist/engine.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { World } from "./ecs.js";
|
|
2
|
+
import { AdaptiveQualityController, detectCapabilities, selectQuality } from "./quality.js";
|
|
3
|
+
import { chooseRenderer, HeadlessRenderer, WebGl2Renderer, WebGpuRenderer } from "./renderer.js";
|
|
4
|
+
export class FaiberGame {
|
|
5
|
+
config;
|
|
6
|
+
world = new World();
|
|
7
|
+
systems = [];
|
|
8
|
+
plugins = [];
|
|
9
|
+
renderer;
|
|
10
|
+
quality;
|
|
11
|
+
running = false;
|
|
12
|
+
previous = 0;
|
|
13
|
+
accumulator = 0;
|
|
14
|
+
frame = 0;
|
|
15
|
+
constructor(config = {}) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
use(system) { this.systems.push(system); return this; }
|
|
19
|
+
useWasm(plugin) { this.plugins.push(plugin); return this; }
|
|
20
|
+
async start() { if (this.running)
|
|
21
|
+
return; const canvas = this.config.canvas; const capabilities = detectCapabilities(canvas); const profile = selectQuality(capabilities, this.config.quality); this.quality = new AdaptiveQualityController(profile); const kind = chooseRenderer(profile, this.config.renderer); this.renderer = this.createRenderer(kind); if (canvas)
|
|
22
|
+
await this.renderer.initialize(canvas, profile); for (const plugin of this.plugins)
|
|
23
|
+
plugin.start(); this.running = true; this.previous = performance.now(); this.frame = requestAnimationFrame(time => this.loop(time)); if (canvas && this.config.autoResize !== false)
|
|
24
|
+
this.resize(); }
|
|
25
|
+
stop() { this.running = false; cancelAnimationFrame(this.frame); for (const plugin of this.plugins)
|
|
26
|
+
plugin.stop(); this.renderer?.dispose(); }
|
|
27
|
+
resize() { const canvas = this.config.canvas; if (!canvas || !this.renderer || !this.quality)
|
|
28
|
+
return; const scale = this.quality.profile.features.resolutionScale; const ratio = Math.min(devicePixelRatio || 1, 2) * scale; canvas.width = Math.floor(canvas.clientWidth * ratio); canvas.height = Math.floor(canvas.clientHeight * ratio); this.renderer.resize(canvas.clientWidth, canvas.clientHeight, ratio); }
|
|
29
|
+
loop(time) { if (!this.running)
|
|
30
|
+
return; const started = performance.now(); const fixed = 1 / (this.config.tickRate ?? 60); const elapsed = Math.min((time - this.previous) / 1000, this.config.maxFrameDelta ?? .1); this.previous = time; this.accumulator += elapsed; while (this.accumulator >= fixed) {
|
|
31
|
+
for (const system of this.systems)
|
|
32
|
+
void system.update(this.world, fixed);
|
|
33
|
+
for (const plugin of this.plugins)
|
|
34
|
+
plugin.update(fixed);
|
|
35
|
+
this.accumulator -= fixed;
|
|
36
|
+
} this.renderer?.render({ alpha: this.accumulator / fixed, time }); const changed = this.quality?.sampleFrame(performance.now() - started); if (changed)
|
|
37
|
+
this.frame = requestAnimationFrame(value => this.loop(value)); }
|
|
38
|
+
createRenderer(kind) { if (this.config.rendererFactory)
|
|
39
|
+
return this.config.rendererFactory(kind); if (kind === "webgpu")
|
|
40
|
+
return new WebGpuRenderer(); if (kind === "webgl2")
|
|
41
|
+
return new WebGl2Renderer(); return new HeadlessRenderer(); }
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type QualityTier = "low" | "medium" | "high" | "ultra";
|
|
2
|
+
export interface GraphicsFeatures {
|
|
3
|
+
resolutionScale: number;
|
|
4
|
+
textureScale: number;
|
|
5
|
+
shadowMapSize: number;
|
|
6
|
+
antiAliasing: "none" | "fxaa" | "msaa4";
|
|
7
|
+
fog: boolean;
|
|
8
|
+
bloom: boolean;
|
|
9
|
+
ambientOcclusion: boolean;
|
|
10
|
+
rayTracing: boolean;
|
|
11
|
+
targetFps: 30 | 60 | 120;
|
|
12
|
+
}
|
|
13
|
+
export interface DeviceCapabilities {
|
|
14
|
+
mobile: boolean;
|
|
15
|
+
memoryGb: number;
|
|
16
|
+
logicalCores: number;
|
|
17
|
+
webgpu: boolean;
|
|
18
|
+
webgl2: boolean;
|
|
19
|
+
maxTextureSize: number;
|
|
20
|
+
rayTracing: boolean;
|
|
21
|
+
devicePixelRatio: number;
|
|
22
|
+
}
|
|
23
|
+
export interface QualityProfile {
|
|
24
|
+
tier: QualityTier;
|
|
25
|
+
features: GraphicsFeatures;
|
|
26
|
+
capabilities: DeviceCapabilities;
|
|
27
|
+
}
|
|
28
|
+
export declare function detectCapabilities(canvas?: HTMLCanvasElement): DeviceCapabilities;
|
|
29
|
+
export declare function selectQuality(capabilities: DeviceCapabilities, override?: QualityTier): QualityProfile;
|
|
30
|
+
export declare class AdaptiveQualityController {
|
|
31
|
+
profile: QualityProfile;
|
|
32
|
+
private samples;
|
|
33
|
+
constructor(profile: QualityProfile);
|
|
34
|
+
sampleFrame(milliseconds: number): QualityProfile;
|
|
35
|
+
private degrade;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../src/quality.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAC,KAAK,GAAC,QAAQ,GAAC,MAAM,GAAC,OAAO,CAAC;AACtD,MAAM,WAAW,gBAAgB;IAAC,eAAe,EAAC,MAAM,CAAC;IAAA,YAAY,EAAC,MAAM,CAAC;IAAA,aAAa,EAAC,MAAM,CAAC;IAAA,YAAY,EAAC,MAAM,GAAC,MAAM,GAAC,OAAO,CAAC;IAAA,GAAG,EAAC,OAAO,CAAC;IAAA,KAAK,EAAC,OAAO,CAAC;IAAA,gBAAgB,EAAC,OAAO,CAAC;IAAA,UAAU,EAAC,OAAO,CAAC;IAAA,SAAS,EAAC,EAAE,GAAC,EAAE,GAAC,GAAG,CAAA;CAAC;AAC/N,MAAM,WAAW,kBAAkB;IAAC,MAAM,EAAC,OAAO,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,YAAY,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,OAAO,CAAC;IAAA,MAAM,EAAC,OAAO,CAAC;IAAA,cAAc,EAAC,MAAM,CAAC;IAAA,UAAU,EAAC,OAAO,CAAC;IAAA,gBAAgB,EAAC,MAAM,CAAA;CAAC;AACtL,MAAM,WAAW,cAAc;IAAC,IAAI,EAAC,WAAW,CAAC;IAAA,QAAQ,EAAC,gBAAgB,CAAC;IAAA,YAAY,EAAC,kBAAkB,CAAA;CAAC;AAE3G,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAC,iBAAiB,GAAE,kBAAkB,CAAid;AACjiB,wBAAgB,aAAa,CAAC,YAAY,EAAC,kBAAkB,EAAC,QAAQ,CAAC,EAAC,WAAW,GAAE,cAAc,CAAiiC;AACpoC,qBAAa,yBAAyB;IAAgD,OAAO,EAAC,cAAc;IAArE,OAAO,CAAC,OAAO,CAAa;gBAAmB,OAAO,EAAC,cAAc;IAAG,WAAW,CAAC,YAAY,EAAC,MAAM;IAAgT,OAAO,CAAC,OAAO;CAAmN"}
|
package/dist/quality.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function detectCapabilities(canvas) { const nav = globalThis.navigator; const mobile = typeof nav?.userAgent === "string" && /Android|iPhone|iPad|Mobile/i.test(nav.userAgent); const gl = canvas?.getContext("webgl2") ?? null; return { mobile, memoryGb: nav?.deviceMemory ?? 4, logicalCores: nav?.hardwareConcurrency ?? 4, webgpu: Boolean(nav?.gpu), webgl2: Boolean(gl), maxTextureSize: gl?.getParameter(gl.MAX_TEXTURE_SIZE) || 4096, rayTracing: false, devicePixelRatio: globalThis.devicePixelRatio ?? 1 }; }
|
|
2
|
+
export function selectQuality(capabilities, override) { const score = (capabilities.mobile ? -2 : 0) + (capabilities.memoryGb >= 8 ? 2 : capabilities.memoryGb <= 2 ? -2 : 0) + (capabilities.logicalCores >= 8 ? 2 : capabilities.logicalCores <= 2 ? -2 : 0) + (capabilities.webgpu ? 2 : 0); const tier = override ?? (score >= 5 ? "ultra" : score >= 2 ? "high" : score >= -1 ? "medium" : "low"); const features = { low: { resolutionScale: .7, textureScale: .5, shadowMapSize: 512, antiAliasing: "none", fog: false, bloom: false, ambientOcclusion: false, rayTracing: false, targetFps: 30 }, medium: { resolutionScale: .85, textureScale: .75, shadowMapSize: 1024, antiAliasing: "fxaa", fog: true, bloom: false, ambientOcclusion: false, rayTracing: false, targetFps: 60 }, high: { resolutionScale: 1, textureScale: 1, shadowMapSize: 2048, antiAliasing: "msaa4", fog: true, bloom: true, ambientOcclusion: true, rayTracing: false, targetFps: 60 }, ultra: { resolutionScale: Math.min(1.25, capabilities.devicePixelRatio), textureScale: 1, shadowMapSize: 4096, antiAliasing: "msaa4", fog: true, bloom: true, ambientOcclusion: true, rayTracing: capabilities.rayTracing, targetFps: 120 } }; return { tier, features: features[tier], capabilities }; }
|
|
3
|
+
export class AdaptiveQualityController {
|
|
4
|
+
profile;
|
|
5
|
+
samples = [];
|
|
6
|
+
constructor(profile) {
|
|
7
|
+
this.profile = profile;
|
|
8
|
+
}
|
|
9
|
+
sampleFrame(milliseconds) { this.samples.push(milliseconds); if (this.samples.length > 120)
|
|
10
|
+
this.samples.shift(); if (this.samples.length < 60)
|
|
11
|
+
return this.profile; const average = this.samples.reduce((a, b) => a + b, 0) / this.samples.length; const target = 1000 / this.profile.features.targetFps; if (average > target * 1.25)
|
|
12
|
+
this.degrade(); return this.profile; }
|
|
13
|
+
degrade() { const order = ["low", "medium", "high", "ultra"]; const index = order.indexOf(this.profile.tier); if (index <= 0)
|
|
14
|
+
return; this.profile = selectQuality(this.profile.capabilities, order[index - 1]); this.samples = []; }
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.js","sourceRoot":"","sources":["../src/quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { QualityProfile } from "./quality.js";
|
|
2
|
+
export type RendererKind = "webgpu" | "webgl2" | "headless";
|
|
3
|
+
export interface RenderFrame {
|
|
4
|
+
alpha: number;
|
|
5
|
+
time: number;
|
|
6
|
+
}
|
|
7
|
+
export interface Renderer {
|
|
8
|
+
readonly kind: RendererKind;
|
|
9
|
+
initialize(canvas: HTMLCanvasElement, quality: QualityProfile): Promise<void>;
|
|
10
|
+
resize(width: number, height: number, pixelRatio: number): void;
|
|
11
|
+
render(frame: RenderFrame): void;
|
|
12
|
+
dispose(): void;
|
|
13
|
+
}
|
|
14
|
+
export type RendererFactory = (kind: RendererKind) => Renderer;
|
|
15
|
+
export declare function chooseRenderer(profile: QualityProfile, preferred?: RendererKind): RendererKind;
|
|
16
|
+
export declare class WebGl2Renderer implements Renderer {
|
|
17
|
+
readonly kind = "webgl2";
|
|
18
|
+
private gl;
|
|
19
|
+
initialize(canvas: HTMLCanvasElement, quality: QualityProfile): Promise<void>;
|
|
20
|
+
resize(width: number, height: number, pixelRatio: number): void;
|
|
21
|
+
render(): void;
|
|
22
|
+
dispose(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare class WebGpuRenderer implements Renderer {
|
|
25
|
+
readonly kind = "webgpu";
|
|
26
|
+
private device;
|
|
27
|
+
private context;
|
|
28
|
+
initialize(canvas: HTMLCanvasElement, quality: QualityProfile): Promise<void>;
|
|
29
|
+
resize(): void;
|
|
30
|
+
render(): void;
|
|
31
|
+
dispose(): void;
|
|
32
|
+
}
|
|
33
|
+
export declare class HeadlessRenderer implements Renderer {
|
|
34
|
+
readonly kind = "headless";
|
|
35
|
+
initialize(): Promise<void>;
|
|
36
|
+
resize(): void;
|
|
37
|
+
render(): void;
|
|
38
|
+
dispose(): void;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,MAAM,MAAM,YAAY,GAAC,QAAQ,GAAC,QAAQ,GAAC,UAAU,CAAC;AACtD,MAAM,WAAW,WAAW;IAAC,KAAK,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,MAAM,CAAA;CAAC;AACtD,MAAM,WAAW,QAAQ;IAAC,QAAQ,CAAC,IAAI,EAAC,YAAY,CAAC;IAAA,UAAU,CAAC,MAAM,EAAC,iBAAiB,EAAC,OAAO,EAAC,cAAc,GAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAAA,MAAM,CAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,UAAU,EAAC,MAAM,GAAE,IAAI,CAAC;IAAA,MAAM,CAAC,KAAK,EAAC,WAAW,GAAE,IAAI,CAAC;IAAA,OAAO,IAAG,IAAI,CAAA;CAAC;AACvO,MAAM,MAAM,eAAe,GAAC,CAAC,IAAI,EAAC,YAAY,KAAG,QAAQ,CAAC;AAC1D,wBAAgB,cAAc,CAAC,OAAO,EAAC,cAAc,EAAC,SAAS,CAAC,EAAC,YAAY,GAAE,YAAY,CAAqS;AAChY,qBAAa,cAAe,YAAW,QAAQ;IAAC,QAAQ,CAAC,IAAI,YAAU;IAAA,OAAO,CAAC,EAAE,CAAkC;IAAM,UAAU,CAAC,MAAM,EAAC,iBAAiB,EAAC,OAAO,EAAC,cAAc;IAA2N,MAAM,CAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,UAAU,EAAC,MAAM;IAA8F,MAAM;IAAqE,OAAO;CAAsB;AAIvoB,qBAAa,cAAe,YAAW,QAAQ;IAAC,QAAQ,CAAC,IAAI,YAAU;IAAA,OAAO,CAAC,MAAM,CAAqB;IAAA,OAAO,CAAC,OAAO,CAAsB;IAAM,UAAU,CAAC,MAAM,EAAC,iBAAiB,EAAC,OAAO,EAAC,cAAc;IAAke,MAAM;IAAI,MAAM;IAAoU,OAAO;CAAiD;AAC7jC,qBAAa,gBAAiB,YAAW,QAAQ;IAAC,QAAQ,CAAC,IAAI,cAAY;IAAM,UAAU;IAAI,MAAM;IAAI,MAAM;IAAI,OAAO;CAAK"}
|
package/dist/renderer.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function chooseRenderer(profile, preferred) { if (preferred === "headless")
|
|
2
|
+
return preferred; if (preferred === "webgpu" && profile.capabilities.webgpu)
|
|
3
|
+
return preferred; if (preferred === "webgl2" && profile.capabilities.webgl2)
|
|
4
|
+
return preferred; if (profile.capabilities.webgpu)
|
|
5
|
+
return "webgpu"; if (profile.capabilities.webgl2)
|
|
6
|
+
return "webgl2"; return "headless"; }
|
|
7
|
+
export class WebGl2Renderer {
|
|
8
|
+
kind = "webgl2";
|
|
9
|
+
gl;
|
|
10
|
+
async initialize(canvas, quality) { const gl = canvas.getContext("webgl2", { antialias: quality.features.antiAliasing === "msaa4", powerPreference: quality.tier === "low" ? "low-power" : "high-performance" }); if (!gl)
|
|
11
|
+
throw new Error("WebGL 2 is unavailable"); this.gl = gl; }
|
|
12
|
+
resize(width, height, pixelRatio) { if (this.gl)
|
|
13
|
+
this.gl.viewport(0, 0, Math.floor(width * pixelRatio), Math.floor(height * pixelRatio)); }
|
|
14
|
+
render() { this.gl?.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT); }
|
|
15
|
+
dispose() { this.gl = undefined; }
|
|
16
|
+
}
|
|
17
|
+
export class WebGpuRenderer {
|
|
18
|
+
kind = "webgpu";
|
|
19
|
+
device;
|
|
20
|
+
context;
|
|
21
|
+
async initialize(canvas, quality) { const gpu = navigator.gpu; if (!gpu)
|
|
22
|
+
throw new Error("WebGPU is unavailable"); const adapter = await gpu.requestAdapter({ powerPreference: quality.tier === "low" ? "low-power" : "high-performance" }); if (!adapter)
|
|
23
|
+
throw new Error("No WebGPU adapter is available"); this.device = await adapter.requestDevice(); this.context = canvas.getContext("webgpu"); this.context.configure({ device: this.device, format: gpu.getPreferredCanvasFormat(), alphaMode: "premultiplied" }); }
|
|
24
|
+
resize() { }
|
|
25
|
+
render() { if (!this.device || !this.context)
|
|
26
|
+
return; const encoder = this.device.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [{ view: this.context.getCurrentTexture().createView(), clearValue: { r: .015, g: .025, b: .06, a: 1 }, loadOp: "clear", storeOp: "store" }] }); pass.end(); this.device.queue.submit([encoder.finish()]); }
|
|
27
|
+
dispose() { this.device = undefined; this.context = undefined; }
|
|
28
|
+
}
|
|
29
|
+
export class HeadlessRenderer {
|
|
30
|
+
kind = "headless";
|
|
31
|
+
async initialize() { }
|
|
32
|
+
resize() { }
|
|
33
|
+
render() { }
|
|
34
|
+
dispose() { }
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/state.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StatePatch, StateRealtimeClient } from "@faiber/faiber-state-sdk";
|
|
2
|
+
import type { EntityId, GameSystem, World } from "./ecs.js";
|
|
3
|
+
export interface StateBinding {
|
|
4
|
+
resolveEntity(remoteId: string, world: World): EntityId;
|
|
5
|
+
applyPatch(entity: EntityId, patch: StatePatch, world: World): void;
|
|
6
|
+
}
|
|
7
|
+
export declare class StateReplicationSystem implements GameSystem {
|
|
8
|
+
private readonly client;
|
|
9
|
+
private readonly binding;
|
|
10
|
+
readonly name = "faiber-state-replication";
|
|
11
|
+
private patches;
|
|
12
|
+
private unsubscribe?;
|
|
13
|
+
constructor(client: StateRealtimeClient, binding: StateBinding);
|
|
14
|
+
connect(): this;
|
|
15
|
+
update(world: World): void;
|
|
16
|
+
dispose(): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAC5D,MAAM,WAAW,YAAY;IAAC,aAAa,CAAC,QAAQ,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,GAAE,QAAQ,CAAC;IAAA,UAAU,CAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,UAAU,EAAC,KAAK,EAAC,KAAK,GAAE,IAAI,CAAA;CAAC;AAChJ,qBAAa,sBAAuB,YAAW,UAAU;IAAoH,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAqB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAvL,QAAQ,CAAC,IAAI,8BAA4B;IAAA,OAAO,CAAC,OAAO,CAAiB;IAAA,OAAO,CAAC,WAAW,CAAC,CAAU;gBAA6B,MAAM,EAAC,mBAAmB,EAAkB,OAAO,EAAC,YAAY;IAAG,OAAO;IAAwF,MAAM,CAAC,KAAK,EAAC,KAAK;IAAyJ,OAAO;CAAyB"}
|
package/dist/state.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class StateReplicationSystem {
|
|
2
|
+
client;
|
|
3
|
+
binding;
|
|
4
|
+
name = "faiber-state-replication";
|
|
5
|
+
patches = [];
|
|
6
|
+
unsubscribe;
|
|
7
|
+
constructor(client, binding) {
|
|
8
|
+
this.client = client;
|
|
9
|
+
this.binding = binding;
|
|
10
|
+
}
|
|
11
|
+
connect() { this.unsubscribe = this.client.on("patch", patch => this.patches.push(patch)); return this; }
|
|
12
|
+
update(world) { for (const patch of this.patches.splice(0)) {
|
|
13
|
+
const entity = this.binding.resolveEntity(patch.entity_id, world);
|
|
14
|
+
this.binding.applyPatch(entity, patch, world);
|
|
15
|
+
} }
|
|
16
|
+
dispose() { this.unsubscribe?.(); }
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,sBAAsB;IAA2J;IAA4C;IAAvK,IAAI,GAAC,0BAA0B,CAAC;IAAQ,OAAO,GAAc,EAAE,CAAC;IAAQ,WAAW,CAAW;IAAA,YAA6B,MAA0B,EAAkB,OAAoB;QAAhE,WAAM,GAAN,MAAM,CAAoB;QAAkB,YAAO,GAAP,OAAO,CAAa;IAAE,CAAC;IAAA,OAAO,KAAG,IAAI,CAAC,WAAW,GAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAC,KAAK,CAAA,EAAE,CAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,OAAO,IAAI,CAAA,CAAA,CAAC;IAAA,MAAM,CAAC,KAAW,IAAE,KAAI,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,CAAC;QAAA,MAAM,MAAM,GAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,EAAC,KAAK,CAAC,CAAC;QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAC,KAAK,EAAC,KAAK,CAAC,CAAA;IAAA,CAAC,CAAA,CAAC;IAAA,OAAO,KAAG,IAAI,CAAC,WAAW,EAAE,EAAE,CAAA,CAAA,CAAC;CAAC"}
|
package/dist/wasm.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface WasmGameImports {
|
|
2
|
+
log?: (level: number, value: number) => void;
|
|
3
|
+
random?: () => number;
|
|
4
|
+
now?: () => number;
|
|
5
|
+
}
|
|
6
|
+
export interface WasmGamePlugin {
|
|
7
|
+
instance: WebAssembly.Instance;
|
|
8
|
+
update(deltaSeconds: number): void;
|
|
9
|
+
start(): void;
|
|
10
|
+
stop(): void;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadWasmGame(source: BufferSource | WebAssembly.Module, imports?: WasmGameImports): Promise<WasmGamePlugin>;
|
|
13
|
+
//# sourceMappingURL=wasm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../src/wasm.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,KAAG,IAAI,CAAC;IAAA,MAAM,CAAC,EAAC,MAAI,MAAM,CAAC;IAAA,GAAG,CAAC,EAAC,MAAI,MAAM,CAAA;CAAC;AAC3G,MAAM,WAAW,cAAc;IAAC,QAAQ,EAAC,WAAW,CAAC,QAAQ,CAAC;IAAA,MAAM,CAAC,YAAY,EAAC,MAAM,GAAE,IAAI,CAAC;IAAA,KAAK,IAAG,IAAI,CAAC;IAAA,IAAI,IAAG,IAAI,CAAA;CAAC;AACxH,wBAAsB,YAAY,CAAC,MAAM,EAAC,YAAY,GAAC,WAAW,CAAC,MAAM,EAAC,OAAO,GAAC,eAAkB,GAAE,OAAO,CAAC,cAAc,CAAC,CAAitB"}
|
package/dist/wasm.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export async function loadWasmGame(source, imports = {}) { const env = { faiber_log: imports.log ?? (() => { }), faiber_random: imports.random ?? Math.random, faiber_now: imports.now ?? (() => performance.now()) }; const result = source instanceof WebAssembly.Module ? await WebAssembly.instantiate(source, { faiber_game: env }) : await WebAssembly.instantiate(source, { faiber_game: env }); const instance = result instanceof WebAssembly.Instance ? result : result.instance; const exported = instance.exports; const call = (name, ...args) => { const fn = exported[name]; if (typeof fn === "function")
|
|
2
|
+
return fn(...args); }; return { instance, start: () => { call("faiber_start"); }, update: delta => { call("faiber_update", delta); }, stop: () => { call("faiber_stop"); } }; }
|
|
3
|
+
//# sourceMappingURL=wasm.js.map
|
package/dist/wasm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm.js","sourceRoot":"","sources":["../src/wasm.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAsC,EAAC,UAAwB,EAAE,IAA0B,MAAM,GAAG,GAAC,EAAC,UAAU,EAAC,OAAO,CAAC,GAAG,IAAE,CAAC,GAAE,EAAE,GAAC,CAAC,CAAC,EAAC,aAAa,EAAC,OAAO,CAAC,MAAM,IAAE,IAAI,CAAC,MAAM,EAAC,UAAU,EAAC,OAAO,CAAC,GAAG,IAAE,CAAC,GAAE,EAAE,CAAA,WAAW,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAA,MAAM,MAAM,GAAC,MAAM,YAAY,WAAW,CAAC,MAAM,CAAA,CAAC,CAAA,MAAM,WAAW,CAAC,WAAW,CAAC,MAAM,EAAC,EAAC,WAAW,EAAC,GAAG,EAAC,CAAC,CAAA,CAAC,CAAA,MAAM,WAAW,CAAC,WAAW,CAAC,MAAM,EAAC,EAAC,WAAW,EAAC,GAAG,EAAC,CAAC,CAAC,CAAA,MAAM,QAAQ,GAAC,MAAM,YAAY,WAAW,CAAC,QAAQ,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,MAAM,CAAC,QAAQ,CAAC,CAAA,MAAM,QAAQ,GAAC,QAAQ,CAAC,OAAiD,CAAC,CAAA,MAAM,IAAI,GAAC,CAAC,IAAW,EAAC,GAAG,IAAa,EAAC,EAAE,GAAC,MAAM,EAAE,GAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA,IAAG,OAAO,EAAE,KAAG,UAAU;IAAC,OAAO,EAAmC,CAAC,GAAG,IAAI,CAAC,CAAA,CAAA,CAAC,CAAC,CAAA,OAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,GAAE,EAAE,GAAC,IAAI,CAAC,cAAc,CAAC,CAAA,CAAA,CAAC,EAAC,MAAM,EAAC,KAAK,CAAA,EAAE,GAAC,IAAI,CAAC,eAAe,EAAC,KAAK,CAAC,CAAA,CAAA,CAAC,EAAC,IAAI,EAAC,GAAE,EAAE,GAAC,IAAI,CAAC,aAAa,CAAC,CAAA,CAAA,CAAC,EAAC,CAAA,CAAA,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@faiber/faiber-game-sdk",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"sideEffects": false,
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@faiber/faiber-state-sdk": "0.5.0"
|
|
20
|
+
}
|
|
21
|
+
}
|