cyberia 3.2.5 → 3.2.12
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/.github/workflows/engine-cyberia.cd.yml +8 -2
- package/.github/workflows/npmpkg.ci.yml +1 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
- package/.github/workflows/release.cd.yml +2 -2
- package/.vscode/extensions.json +9 -9
- package/.vscode/settings.json +20 -4
- package/CHANGELOG.md +563 -1
- package/CLI-HELP.md +130 -34
- package/Dockerfile +0 -4
- package/README.md +194 -607
- package/bin/build.js +42 -12
- package/bin/build.template.js +187 -0
- package/bin/cyberia.js +1367 -281
- package/bin/deploy.js +582 -3
- package/bin/index.js +1367 -281
- package/bump.config.js +26 -0
- package/conf.js +195 -111
- package/deployment.yaml +6 -222
- package/hardhat/package-lock.json +118 -149
- package/hardhat/package.json +5 -4
- package/jsconfig.json +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
- package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
- package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
- package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
- package/manifests/kind-config-dev.yaml +8 -0
- package/manifests/lxd/lxd-admin-profile.yaml +12 -3
- package/manifests/mongodb/pv-pvc.yaml +44 -8
- package/manifests/mongodb/statefulset.yaml +55 -68
- package/manifests/mongodb-4.4/headless-service.yaml +10 -0
- package/manifests/mongodb-4.4/kustomization.yaml +3 -1
- package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
- package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
- package/manifests/mongodb-4.4/statefulset.yaml +79 -0
- package/manifests/mongodb-4.4/storage-class.yaml +9 -0
- package/manifests/valkey/statefulset.yaml +1 -1
- package/manifests/valkey/valkey-nodeport.yaml +17 -0
- package/package.json +45 -24
- package/proxy.yaml +10 -118
- package/scripts/ipxe-setup.sh +52 -49
- package/scripts/k3s-node-setup.sh +83 -48
- package/scripts/lxd-vm-setup.sh +193 -8
- package/scripts/maas-nat-firewalld.sh +145 -0
- package/scripts/nat-iptables.sh +103 -18
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
- package/src/api/core/core.controller.js +10 -10
- package/src/api/core/core.router.js +19 -14
- package/src/api/core/core.service.js +15 -15
- package/src/api/crypto/crypto.controller.js +8 -8
- package/src/api/crypto/crypto.router.js +18 -12
- package/src/api/crypto/crypto.service.js +11 -11
- package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
- package/src/api/cyberia-action/cyberia-action.model.js +87 -0
- package/src/api/cyberia-action/cyberia-action.router.js +31 -0
- package/src/api/cyberia-action/cyberia-action.service.js +42 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
- package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
- package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
- package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
- package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
- package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
- package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
- package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
- package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
- package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
- package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
- package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
- package/src/api/cyberia-map/cyberia-map.router.js +35 -30
- package/src/api/cyberia-map/cyberia-map.service.js +17 -17
- package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
- package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +31 -0
- package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +31 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
- package/src/api/default/default.controller.js +10 -10
- package/src/api/default/default.router.js +22 -18
- package/src/api/default/default.service.js +15 -15
- package/src/api/document/document.controller.js +12 -12
- package/src/api/document/document.model.js +10 -16
- package/src/api/document/document.router.js +28 -23
- package/src/api/document/document.service.js +100 -23
- package/src/api/file/file.controller.js +8 -8
- package/src/api/file/file.model.js +10 -10
- package/src/api/file/file.router.js +19 -13
- package/src/api/file/file.service.js +45 -43
- package/src/api/instance/instance.controller.js +10 -10
- package/src/api/instance/instance.model.js +4 -10
- package/src/api/instance/instance.router.js +29 -24
- package/src/api/instance/instance.service.js +16 -16
- package/src/api/ipfs/ipfs.controller.js +12 -12
- package/src/api/ipfs/ipfs.model.js +4 -13
- package/src/api/ipfs/ipfs.router.js +21 -16
- package/src/api/ipfs/ipfs.service.js +22 -36
- package/src/api/object-layer/object-layer.controller.js +12 -12
- package/src/api/object-layer/object-layer.model.js +4 -17
- package/src/api/object-layer/object-layer.router.js +512 -507
- package/src/api/object-layer/object-layer.service.js +29 -26
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
- package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
- package/src/api/test/test.controller.js +8 -8
- package/src/api/test/test.router.js +17 -12
- package/src/api/test/test.service.js +8 -8
- package/src/api/types.js +24 -0
- package/src/api/user/guest.service.js +100 -0
- package/src/api/user/user.controller.js +6 -6
- package/src/api/user/user.model.js +8 -13
- package/src/api/user/user.router.js +297 -288
- package/src/api/user/user.service.js +103 -55
- package/src/cli/baremetal.js +132 -101
- package/src/cli/cluster.js +732 -217
- package/src/cli/db.js +106 -62
- package/src/cli/deploy.js +260 -149
- package/src/cli/fs.js +90 -9
- package/src/cli/image.js +43 -1
- package/src/cli/index.js +106 -16
- package/src/cli/ipfs.js +4 -6
- package/src/cli/kubectl.js +4 -1
- package/src/cli/lxd.js +1099 -223
- package/src/cli/monitor.js +9 -3
- package/src/cli/release.js +336 -86
- package/src/cli/repository.js +136 -53
- package/src/cli/run.js +599 -76
- package/src/cli/secrets.js +11 -2
- package/src/cli/ssh.js +1 -1
- package/src/cli/static.js +43 -115
- package/src/cli/test.js +9 -3
- package/src/client/Cryptokoyn.index.js +18 -21
- package/src/client/CyberiaPortal.index.js +19 -23
- package/src/client/Default.index.js +30 -36
- package/src/client/Itemledger.index.js +20 -26
- package/src/client/Underpost.index.js +19 -23
- package/src/client/components/core/404.js +4 -4
- package/src/client/components/core/500.js +4 -4
- package/src/client/components/core/Account.js +73 -60
- package/src/client/components/core/AgGrid.js +23 -33
- package/src/client/components/core/Alert.js +12 -13
- package/src/client/components/core/AppStore.js +1 -1
- package/src/client/components/core/Auth.js +40 -37
- package/src/client/components/core/Badge.js +7 -13
- package/src/client/components/core/BtnIcon.js +15 -17
- package/src/client/components/core/CalendarCore.js +42 -63
- package/src/client/components/core/Chat.js +13 -15
- package/src/client/components/core/ClientEvents.js +163 -0
- package/src/client/components/core/ColorPaletteElement.js +309 -0
- package/src/client/components/core/Content.js +17 -14
- package/src/client/components/core/Css.js +15 -71
- package/src/client/components/core/CssCore.js +12 -16
- package/src/client/components/core/D3Chart.js +4 -4
- package/src/client/components/core/Docs.js +64 -91
- package/src/client/components/core/DropDown.js +69 -91
- package/src/client/components/core/EventBus.js +96 -0
- package/src/client/components/core/EventsUI.js +14 -17
- package/src/client/components/core/FileExplorer.js +96 -228
- package/src/client/components/core/FullScreen.js +47 -75
- package/src/client/components/core/Input.js +24 -69
- package/src/client/components/core/Keyboard.js +25 -18
- package/src/client/components/core/KeyboardAvoidance.js +145 -0
- package/src/client/components/core/LoadingAnimation.js +25 -31
- package/src/client/components/core/LogIn.js +41 -41
- package/src/client/components/core/LogOut.js +23 -14
- package/src/client/components/core/Modal.js +544 -219
- package/src/client/components/core/NotificationManager.js +14 -18
- package/src/client/components/core/Panel.js +54 -50
- package/src/client/components/core/PanelForm.js +81 -177
- package/src/client/components/core/Polyhedron.js +110 -214
- package/src/client/components/core/PublicProfile.js +39 -32
- package/src/client/components/core/Recover.js +48 -44
- package/src/client/components/core/Responsive.js +88 -32
- package/src/client/components/core/RichText.js +9 -18
- package/src/client/components/core/Router.js +24 -3
- package/src/client/components/core/SearchBox.js +37 -37
- package/src/client/components/core/SignUp.js +39 -30
- package/src/client/components/core/SocketIo.js +31 -2
- package/src/client/components/core/SocketIoHandler.js +6 -6
- package/src/client/components/core/ToggleSwitch.js +8 -20
- package/src/client/components/core/ToolTip.js +5 -17
- package/src/client/components/core/Translate.js +56 -59
- package/src/client/components/core/Validator.js +26 -16
- package/src/client/components/core/Wallet.js +15 -26
- package/src/client/components/core/Worker.js +211 -276
- package/src/client/components/core/windowGetDimensions.js +7 -7
- package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
- package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
- package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
- package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
- package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
- package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
- package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
- package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
- package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
- package/src/client/components/default/CssDefault.js +12 -12
- package/src/client/components/default/LogInDefault.js +6 -4
- package/src/client/components/default/LogOutDefault.js +6 -4
- package/src/client/components/default/RouterDefault.js +47 -0
- package/src/client/components/default/SettingsDefault.js +4 -4
- package/src/client/components/default/SignUpDefault.js +6 -4
- package/src/client/components/default/TranslateDefault.js +3 -3
- package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
- package/src/client/components/itemledger/CssItemledger.js +15 -15
- package/src/client/components/itemledger/LogInItemledger.js +6 -4
- package/src/client/components/itemledger/LogOutItemledger.js +6 -4
- package/src/client/components/itemledger/RouterItemledger.js +38 -0
- package/src/client/components/itemledger/SettingsItemledger.js +4 -4
- package/src/client/components/itemledger/SignUpItemledger.js +6 -4
- package/src/client/components/itemledger/TranslateItemledger.js +3 -3
- package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
- package/src/client/components/underpost/CssUnderpost.js +14 -14
- package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
- package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
- package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
- package/src/client/components/underpost/LogInUnderpost.js +6 -4
- package/src/client/components/underpost/LogOutUnderpost.js +6 -4
- package/src/client/components/underpost/RouterUnderpost.js +45 -0
- package/src/client/components/underpost/SettingsUnderpost.js +4 -4
- package/src/client/components/underpost/SignUpUnderpost.js +6 -4
- package/src/client/components/underpost/TranslateUnderpost.js +4 -4
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
- package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
- package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
- package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
- package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
- package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
- package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
- package/src/client/services/core/core.service.js +17 -49
- package/src/client/services/crypto/crypto.service.js +8 -13
- package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
- package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
- package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
- package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
- package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
- package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
- package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
- package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
- package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
- package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
- package/src/client/services/default/default.management.js +159 -267
- package/src/client/services/default/default.service.js +10 -16
- package/src/client/services/document/document.service.js +14 -19
- package/src/client/services/file/file.service.js +8 -13
- package/src/client/services/instance/instance.management.js +5 -5
- package/src/client/services/instance/instance.service.js +10 -15
- package/src/client/services/ipfs/ipfs.service.js +12 -18
- package/src/client/services/object-layer/object-layer.management.js +12 -12
- package/src/client/services/object-layer/object-layer.service.js +20 -26
- package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
- package/src/client/services/test/test.service.js +8 -13
- package/src/client/services/user/guest.service.js +86 -0
- package/src/client/services/user/user.management.js +5 -5
- package/src/client/services/user/user.service.js +14 -20
- package/src/client/ssr/body/404.js +3 -3
- package/src/client/ssr/body/500.js +3 -3
- package/src/client/ssr/body/CacheControl.js +5 -2
- package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
- package/src/client/ssr/head/PwaItemledger.js +197 -60
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
- package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
- package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
- package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
- package/src/client/ssr/{pages → views}/Test.js +2 -2
- package/src/client/sw/core.sw.js +274 -0
- package/src/db/DataBaseProvider.js +115 -15
- package/src/db/mariadb/MariaDB.js +2 -1
- package/src/db/mongo/MongoBootstrap.js +657 -0
- package/src/db/mongo/MongooseDB.js +129 -21
- package/src/grpc/cyberia/grpc-server.js +185 -105
- package/src/index.js +1 -1
- package/src/runtime/cyberia-client/Dockerfile +101 -0
- package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
- package/src/runtime/cyberia-server/Dockerfile +62 -0
- package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
- package/src/runtime/express/Dockerfile +4 -4
- package/src/runtime/express/Express.js +2 -2
- package/src/runtime/lampp/Dockerfile +8 -7
- package/src/runtime/wp/Dockerfile +11 -17
- package/src/runtime/wp/Wp.js +8 -5
- package/src/server/atlas-sprite-sheet-generator.js +4 -2
- package/src/server/auth.js +2 -2
- package/src/server/client-build-docs.js +46 -47
- package/src/server/client-build.js +371 -132
- package/src/server/client-formatted.js +47 -16
- package/src/server/conf.js +91 -87
- package/src/server/data-query.js +32 -20
- package/src/server/dns.js +22 -0
- package/src/server/ipfs-client.js +232 -91
- package/src/server/object-layer.js +1 -6
- package/src/server/process.js +192 -45
- package/src/server/proxy.js +9 -2
- package/src/server/runtime.js +1 -1
- package/src/server/semantic-layer-generator-floor.js +11 -51
- package/src/server/semantic-layer-generator-resource.js +259 -0
- package/src/server/semantic-layer-generator-skin.js +41 -171
- package/src/server/semantic-layer-generator.js +122 -14
- package/src/server/shape-generator.js +108 -0
- package/src/server/start.js +34 -8
- package/src/server/valkey.js +143 -235
- package/src/ws/IoInterface.js +16 -16
- package/src/ws/core/channels/core.ws.chat.js +11 -11
- package/src/ws/core/channels/core.ws.mailer.js +29 -29
- package/src/ws/core/channels/core.ws.stream.js +19 -19
- package/src/ws/core/core.ws.connection.js +8 -8
- package/src/ws/core/core.ws.server.js +6 -5
- package/src/ws/default/channels/default.ws.main.js +10 -10
- package/src/ws/default/default.ws.connection.js +4 -4
- package/src/ws/default/default.ws.server.js +4 -3
- package/tsconfig.docs.json +15 -0
- package/typedoc.dd-cyberia.json +29 -0
- package/typedoc.json +29 -0
- package/WHITE-PAPER.md +0 -1540
- package/bin/file.js +0 -196
- package/bin/vs.js +0 -74
- package/bin/zed.js +0 -84
- package/hardhat/README.md +0 -531
- package/hardhat/WHITE-PAPER.md +0 -1540
- package/jsdoc.dd-cyberia.json +0 -68
- package/jsdoc.json +0 -68
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
- package/src/api/object-layer/README.md +0 -672
- package/src/client/components/core/ColorPalette.js +0 -5267
- package/src/client/components/core/JoyStick.js +0 -80
- package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
- package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
- package/src/client/components/default/RoutesDefault.js +0 -49
- package/src/client/components/itemledger/RoutesItemledger.js +0 -40
- package/src/client/components/underpost/RoutesUnderpost.js +0 -47
- package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
- package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
- package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
- package/src/client/sw/default.sw.js +0 -127
- package/src/client/sw/template.sw.js +0 -84
- package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
- package/src/grpc/cyberia/README.md +0 -326
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
|
|
2
2
|
import { loggerFactory } from '../../server/logger.js';
|
|
3
3
|
import { DataQuery } from '../../server/data-query.js';
|
|
4
|
-
import { connectPortals
|
|
4
|
+
import { connectPortals } from './cyberia-portal-connector.js';
|
|
5
5
|
import { generateFallbackWorld } from './cyberia-fallback-world.js';
|
|
6
|
-
import { CYBERIA_INSTANCE_CONF_DEFAULTS } from '../cyberia-instance-conf/cyberia-instance-conf.defaults.js';
|
|
7
6
|
|
|
8
7
|
const logger = loggerFactory(import.meta);
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
post
|
|
9
|
+
class CyberiaInstanceService {
|
|
10
|
+
static post = async (req, res, options) => {
|
|
12
11
|
/** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
|
|
13
|
-
const CyberiaInstance =
|
|
12
|
+
const CyberiaInstance = DataBaseProviderService.getModel("CyberiaInstance", options);
|
|
14
13
|
const CyberiaInstanceConf =
|
|
15
|
-
|
|
14
|
+
DataBaseProviderService.getModel("CyberiaInstanceConf", options);
|
|
16
15
|
if (req.auth && req.auth.user) req.body.creator = req.auth.user._id;
|
|
17
16
|
const instance = await new CyberiaInstance(req.body).save();
|
|
18
17
|
|
|
@@ -23,7 +22,7 @@ const CyberiaInstanceService = {
|
|
|
23
22
|
const conf = await CyberiaInstanceConf.findOneAndUpdate(
|
|
24
23
|
{ instanceCode: instance.code },
|
|
25
24
|
{ $setOnInsert: { instanceCode: instance.code } },
|
|
26
|
-
{ upsert: true,
|
|
25
|
+
{ upsert: true, returnDocument: 'after' },
|
|
27
26
|
);
|
|
28
27
|
if (conf && !instance.conf) {
|
|
29
28
|
await CyberiaInstance.findByIdAndUpdate(instance._id, { conf: conf._id });
|
|
@@ -35,10 +34,10 @@ const CyberiaInstanceService = {
|
|
|
35
34
|
}
|
|
36
35
|
|
|
37
36
|
return instance;
|
|
38
|
-
}
|
|
39
|
-
get
|
|
37
|
+
};
|
|
38
|
+
static get = async (req, res, options) => {
|
|
40
39
|
/** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
|
|
41
|
-
const CyberiaInstance =
|
|
40
|
+
const CyberiaInstance = DataBaseProviderService.getModel("CyberiaInstance", options);
|
|
42
41
|
const populateCreator = { path: 'creator', model: 'User', select: '_id username' };
|
|
43
42
|
if (req.params.id) return await CyberiaInstance.findById(req.params.id).populate(populateCreator);
|
|
44
43
|
|
|
@@ -52,20 +51,20 @@ const CyberiaInstanceService = {
|
|
|
52
51
|
|
|
53
52
|
const totalPages = Math.ceil(total / limit);
|
|
54
53
|
return { data, total, page, totalPages };
|
|
55
|
-
}
|
|
56
|
-
put
|
|
54
|
+
};
|
|
55
|
+
static put = async (req, res, options) => {
|
|
57
56
|
/** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
|
|
58
|
-
const CyberiaInstance =
|
|
57
|
+
const CyberiaInstance = DataBaseProviderService.getModel("CyberiaInstance", options);
|
|
59
58
|
const instance = await CyberiaInstance.findById(req.params.id);
|
|
60
59
|
if (!instance) throw new Error('instance not found');
|
|
61
60
|
if (req.auth.user.role !== 'admin' && String(instance.creator) !== String(req.auth.user._id))
|
|
62
61
|
throw new Error('insufficient permission');
|
|
63
62
|
if (req.body.thumbnail && instance.thumbnail && String(req.body.thumbnail) !== String(instance.thumbnail)) {
|
|
64
|
-
const File =
|
|
63
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
65
64
|
await File.findByIdAndDelete(instance.thumbnail);
|
|
66
65
|
}
|
|
67
66
|
return await CyberiaInstance.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
|
|
68
|
-
}
|
|
67
|
+
};
|
|
69
68
|
/**
|
|
70
69
|
* Central portal connector endpoint.
|
|
71
70
|
*
|
|
@@ -73,16 +72,16 @@ const CyberiaInstanceService = {
|
|
|
73
72
|
* from cyberia-portal-connector.js so the same logic can be used by the
|
|
74
73
|
* GUI without a DB dependency.
|
|
75
74
|
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* ?persist=true
|
|
75
|
+
* Builds a minimal ring connecting all maps and assigns random portal
|
|
76
|
+
* subtypes to remaining portals. Does NOT generate procedural entities —
|
|
77
|
+
* entity generation is handled exclusively by the fallback world logic
|
|
78
|
+
* (cyberia-world-generator.js).
|
|
79
|
+
*
|
|
80
|
+
* ?persist=true — save generated portals to DB
|
|
82
81
|
*/
|
|
83
|
-
portalConnect
|
|
84
|
-
const CyberiaInstance =
|
|
85
|
-
const CyberiaMap =
|
|
82
|
+
static portalConnect = async (req, res, options) => {
|
|
83
|
+
const CyberiaInstance = DataBaseProviderService.getModel("CyberiaInstance", options);
|
|
84
|
+
const CyberiaMap = DataBaseProviderService.getModel("CyberiaMap", options);
|
|
86
85
|
|
|
87
86
|
const instance = await CyberiaInstance.findById(req.params.id).lean();
|
|
88
87
|
if (!instance) throw new Error('instance not found');
|
|
@@ -103,67 +102,33 @@ const CyberiaInstanceService = {
|
|
|
103
102
|
// ── Portal topology (pure function) ──────────────────────────────────
|
|
104
103
|
const result = connectPortals(mapCodes, mapDocs);
|
|
105
104
|
|
|
106
|
-
// ── Procedural entity generation (optional) ──────────────────────────
|
|
107
|
-
const colors = CYBERIA_INSTANCE_CONF_DEFAULTS.colors;
|
|
108
|
-
const wantEntities = req.query?.generateEntities === 'true';
|
|
109
|
-
const obstacleCount = req.query?.obstacleCount ? parseInt(req.query.obstacleCount, 10) : undefined;
|
|
110
|
-
const foregroundCount = req.query?.foregroundCount ? parseInt(req.query.foregroundCount, 10) : undefined;
|
|
111
|
-
const seed = instance.seed || '';
|
|
112
|
-
|
|
113
|
-
const generatedEntities = {};
|
|
114
|
-
if (wantEntities) {
|
|
115
|
-
for (const doc of mapDocs) {
|
|
116
|
-
const hasObstacles = (doc.entities || []).some((e) => e.entityType === 'obstacle');
|
|
117
|
-
const hasForeground = (doc.entities || []).some((e) => e.entityType === 'foreground');
|
|
118
|
-
if (!hasObstacles || !hasForeground) {
|
|
119
|
-
const mapSeed = seed ? `${seed}:${doc.code}` : doc.code;
|
|
120
|
-
const generated = generateProceduralEntities({ gridX: doc.gridX || 16, gridY: doc.gridY || 16 }, colors, {
|
|
121
|
-
obstacleCount,
|
|
122
|
-
foregroundCount,
|
|
123
|
-
seed: mapSeed,
|
|
124
|
-
});
|
|
125
|
-
generatedEntities[doc.code] = {
|
|
126
|
-
obstacles: hasObstacles ? [] : generated.obstacles,
|
|
127
|
-
foreground: hasForeground ? [] : generated.foreground,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
105
|
// ── Persist to DB when requested ─────────────────────────────────────
|
|
134
106
|
const persist = req.query?.persist === 'true';
|
|
135
107
|
if (persist) {
|
|
136
108
|
await CyberiaInstance.findByIdAndUpdate(req.params.id, { portals: result.portals });
|
|
137
|
-
for (const [mapCode, ents] of Object.entries(generatedEntities)) {
|
|
138
|
-
const toAdd = [...ents.obstacles, ...ents.foreground];
|
|
139
|
-
if (toAdd.length > 0) {
|
|
140
|
-
await CyberiaMap.findOneAndUpdate({ code: mapCode }, { $push: { entities: { $each: toAdd } } });
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
109
|
}
|
|
144
110
|
|
|
145
111
|
return {
|
|
146
112
|
...result,
|
|
147
|
-
...(wantEntities ? { generatedEntities } : {}),
|
|
148
113
|
persisted: persist,
|
|
149
114
|
};
|
|
150
|
-
}
|
|
115
|
+
};
|
|
151
116
|
|
|
152
|
-
delete
|
|
117
|
+
static delete = async (req, res, options) => {
|
|
153
118
|
/** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
|
|
154
|
-
const CyberiaInstance =
|
|
119
|
+
const CyberiaInstance = DataBaseProviderService.getModel("CyberiaInstance", options);
|
|
155
120
|
if (req.params.id) {
|
|
156
121
|
const instance = await CyberiaInstance.findById(req.params.id);
|
|
157
122
|
if (!instance) throw new Error('instance not found');
|
|
158
123
|
if (req.auth.user.role !== 'admin' && String(instance.creator) !== String(req.auth.user._id))
|
|
159
124
|
throw new Error('insufficient permission');
|
|
160
125
|
if (instance.thumbnail) {
|
|
161
|
-
const File =
|
|
126
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
162
127
|
await File.findByIdAndDelete(instance.thumbnail);
|
|
163
128
|
}
|
|
164
129
|
return await CyberiaInstance.findByIdAndDelete(req.params.id);
|
|
165
130
|
} else return await CyberiaInstance.deleteMany();
|
|
166
|
-
}
|
|
131
|
+
};
|
|
167
132
|
|
|
168
133
|
/**
|
|
169
134
|
* Return an in-memory procedural fallback world.
|
|
@@ -177,7 +142,7 @@ const CyberiaInstanceService = {
|
|
|
177
142
|
* ?obstacleCount=<number> — obstacles per map (random 12–20 if omitted)
|
|
178
143
|
* ?foregroundCount=<number>— foreground per map (random 6–12 if omitted)
|
|
179
144
|
*/
|
|
180
|
-
fallbackWorld
|
|
145
|
+
static fallbackWorld = async (req) => {
|
|
181
146
|
const q = req.query || {};
|
|
182
147
|
return generateFallbackWorld({
|
|
183
148
|
mapCount: q.mapCount ? parseInt(q.mapCount, 10) : undefined,
|
|
@@ -185,7 +150,7 @@ const CyberiaInstanceService = {
|
|
|
185
150
|
obstacleCount: q.obstacleCount ? parseInt(q.obstacleCount, 10) : undefined,
|
|
186
151
|
foregroundCount: q.foregroundCount ? parseInt(q.foregroundCount, 10) : undefined,
|
|
187
152
|
});
|
|
188
|
-
}
|
|
189
|
-
}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
190
155
|
|
|
191
156
|
export { CyberiaInstanceService };
|
|
@@ -1,126 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Central Portal Connector — pure-function module.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Sole responsibility: build, validate, and connect portal topology
|
|
5
|
+
* for a CyberiaInstance. Given map documents with portal entities,
|
|
6
|
+
* produces a minimal ring that guarantees full reachability, then
|
|
7
|
+
* assigns random portal behaviour to every remaining (unconnected)
|
|
8
|
+
* portal.
|
|
7
9
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
10
|
+
* Shared by the backend (CyberiaInstanceService.portalConnect) and the
|
|
11
|
+
* GUI (Instance Engine "Portal Connector" button) so the same logic
|
|
12
|
+
* runs everywhere without a DB dependency.
|
|
13
|
+
*
|
|
14
|
+
* This module does NOT generate procedural entities (obstacles,
|
|
15
|
+
* foreground, resources, bots, etc.). For that, see
|
|
16
|
+
* cyberia-world-generator.js.
|
|
17
|
+
*
|
|
18
|
+
* All exported functions are stateless and synchronous.
|
|
11
19
|
*
|
|
12
20
|
* @module src/api/cyberia-instance/cyberia-portal-connector
|
|
13
21
|
*/
|
|
14
22
|
|
|
15
|
-
// ──
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Convert a { r, g, b, a } palette entry to an `rgba(…)` CSS string.
|
|
19
|
-
* @param {{ r: number, g: number, b: number, a: number }} c
|
|
20
|
-
* @returns {string}
|
|
21
|
-
*/
|
|
22
|
-
const colorToRgba = (c) => `rgba(${c.r}, ${c.g}, ${c.b}, ${c.a / 255})`;
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Look up a palette entry by key from a colours array.
|
|
26
|
-
* @param {Array<{ key: string, r: number, g: number, b: number, a: number }>} colors
|
|
27
|
-
* @param {string} key
|
|
28
|
-
* @returns {{ r: number, g: number, b: number, a: number } | undefined}
|
|
29
|
-
*/
|
|
30
|
-
const findColor = (colors, key) => colors.find((c) => c.key === key);
|
|
31
|
-
|
|
32
|
-
// ── Random helpers ───────────────────────────────────────────────────────────
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Return a random integer in [min, max] (inclusive).
|
|
36
|
-
* @param {number} min
|
|
37
|
-
* @param {number} max
|
|
38
|
-
* @returns {number}
|
|
39
|
-
*/
|
|
40
|
-
const randInt = (min, max) => min + Math.floor(Math.random() * (max - min + 1));
|
|
41
|
-
|
|
42
|
-
// ── Occupancy grid ───────────────────────────────────────────────────────────
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 2D boolean grid that tracks which cells are blocked (obstacle / placed entity).
|
|
46
|
-
* Used to find valid walkable positions when placing portals and bots.
|
|
47
|
-
*/
|
|
48
|
-
class OccupancyGrid {
|
|
49
|
-
/**
|
|
50
|
-
* @param {number} width Grid columns.
|
|
51
|
-
* @param {number} height Grid rows.
|
|
52
|
-
*/
|
|
53
|
-
constructor(width, height) {
|
|
54
|
-
this.width = width;
|
|
55
|
-
this.height = height;
|
|
56
|
-
// false = walkable, true = blocked
|
|
57
|
-
this.cells = Array.from({ length: height }, () => new Array(width).fill(false));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Mark a rectangular region as blocked.
|
|
62
|
-
* @param {number} x
|
|
63
|
-
* @param {number} y
|
|
64
|
-
* @param {number} w
|
|
65
|
-
* @param {number} h
|
|
66
|
-
*/
|
|
67
|
-
block(x, y, w, h) {
|
|
68
|
-
for (let row = y; row < y + h && row < this.height; row++) {
|
|
69
|
-
for (let col = x; col < x + w && col < this.width; col++) {
|
|
70
|
-
if (row >= 0 && col >= 0) this.cells[row][col] = true;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Check whether a rectangle fits entirely within walkable (unblocked) cells.
|
|
77
|
-
* @param {number} x
|
|
78
|
-
* @param {number} y
|
|
79
|
-
* @param {number} w
|
|
80
|
-
* @param {number} h
|
|
81
|
-
* @returns {boolean}
|
|
82
|
-
*/
|
|
83
|
-
fits(x, y, w, h) {
|
|
84
|
-
if (x < 0 || y < 0 || x + w > this.width || y + h > this.height) return false;
|
|
85
|
-
for (let row = y; row < y + h; row++) {
|
|
86
|
-
for (let col = x; col < x + w; col++) {
|
|
87
|
-
if (this.cells[row][col]) return false;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Find a random walkable position for a rectangle of given dimensions.
|
|
95
|
-
* Tries up to `maxAttempts` random positions before giving up.
|
|
96
|
-
* @param {number} w
|
|
97
|
-
* @param {number} h
|
|
98
|
-
* @param {number} [maxAttempts=200]
|
|
99
|
-
* @returns {{ x: number, y: number } | null} Position or null if no fit found.
|
|
100
|
-
*/
|
|
101
|
-
findPosition(w, h, maxAttempts = 200) {
|
|
102
|
-
const maxX = Math.max(0, this.width - w);
|
|
103
|
-
const maxY = Math.max(0, this.height - h);
|
|
104
|
-
for (let i = 0; i < maxAttempts; i++) {
|
|
105
|
-
const x = randInt(0, maxX);
|
|
106
|
-
const y = randInt(0, maxY);
|
|
107
|
-
if (this.fits(x, y, w, h)) return { x, y };
|
|
108
|
-
}
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Populate the grid from an array of obstacle entities.
|
|
114
|
-
* @param {Array<{ initCellX: number, initCellY: number, dimX: number, dimY: number }>} obstacles
|
|
115
|
-
*/
|
|
116
|
-
addObstacles(obstacles) {
|
|
117
|
-
for (const o of obstacles) {
|
|
118
|
-
this.block(o.initCellX, o.initCellY, o.dimX, o.dimY);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// ── Portal topology builders ─────────────────────────────────────────────────
|
|
23
|
+
// ── Portal mode constants ────────────────────────────────────────────────────
|
|
124
24
|
|
|
125
25
|
/**
|
|
126
26
|
* Canonical portal mode strings.
|
|
@@ -157,6 +57,8 @@ const PORTAL_MODE_COLOR_KEY = Object.freeze({
|
|
|
157
57
|
*/
|
|
158
58
|
const EXTRA_PORTAL_MODES = [PORTAL_MODES.INTRA_PORTAL, PORTAL_MODES.INTRA_RANDOM, PORTAL_MODES.INTER_RANDOM];
|
|
159
59
|
|
|
60
|
+
// ── Portal topology builders ─────────────────────────────────────────────────
|
|
61
|
+
|
|
160
62
|
/**
|
|
161
63
|
* Extract all portal-type entities from each map document and build
|
|
162
64
|
* a lookup: `{ [mapCode]: portalEntity[] }`.
|
|
@@ -247,7 +149,9 @@ function buildTopologyFromSubtypes(orderedCodes, portalIndex) {
|
|
|
247
149
|
const remaining = allOnMap.filter((e) => !usedInRing.has(e));
|
|
248
150
|
|
|
249
151
|
for (const srcEnt of remaining) {
|
|
250
|
-
|
|
152
|
+
// If the entity already has an explicit subtype, honour it;
|
|
153
|
+
// otherwise assign a random mode (matching fallback-world behaviour).
|
|
154
|
+
const sub = srcEnt.portalSubtype || PORTAL_MODE_LIST[Math.floor(Math.random() * PORTAL_MODE_LIST.length)];
|
|
251
155
|
|
|
252
156
|
switch (sub) {
|
|
253
157
|
case PORTAL_MODES.INTER_PORTAL: {
|
|
@@ -341,119 +245,6 @@ function connectPortals(mapCodes, maps) {
|
|
|
341
245
|
return { portals, topology, mapCount: ordered.length };
|
|
342
246
|
}
|
|
343
247
|
|
|
344
|
-
// ── Procedural entity generators ─────────────────────────────────────────────
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* Generate procedural obstacle entities for a map.
|
|
348
|
-
*
|
|
349
|
-
* Obstacles use empty `objectLayerItemIds` so they render as a solid colour
|
|
350
|
-
* from the OBSTACLE palette entry. Count, dimensions, and positions are
|
|
351
|
-
* all fully random within the declared ranges.
|
|
352
|
-
*
|
|
353
|
-
* @param {{ gridX: number, gridY: number }} mapDims Map grid dimensions.
|
|
354
|
-
* @param {Array<{ key: string, r: number, g: number, b: number, a: number }>} colors Palette.
|
|
355
|
-
* @param {object} [opts]
|
|
356
|
-
* @param {number} [opts.count] Override count (ignores range).
|
|
357
|
-
* @param {number} [opts.minDim=1] Minimum obstacle width/height (cells).
|
|
358
|
-
* @param {number} [opts.maxDim=4] Maximum obstacle width/height (cells).
|
|
359
|
-
* @returns {object[]} Array of CyberiaEntity plain objects.
|
|
360
|
-
*/
|
|
361
|
-
function generateObstacles(mapDims, colors, opts = {}) {
|
|
362
|
-
const { minDim = 1, maxDim = 4 } = opts;
|
|
363
|
-
const count = opts.count ?? randInt(OBSTACLE_RANGE[0], OBSTACLE_RANGE[1]);
|
|
364
|
-
const { gridX, gridY } = mapDims;
|
|
365
|
-
|
|
366
|
-
const obstacleColor = findColor(colors, 'OBSTACLE');
|
|
367
|
-
const rgba = obstacleColor ? colorToRgba(obstacleColor) : 'rgba(80, 80, 80, 1)';
|
|
368
|
-
|
|
369
|
-
const entities = [];
|
|
370
|
-
for (let i = 0; i < count; i++) {
|
|
371
|
-
const dimX = randInt(minDim, maxDim);
|
|
372
|
-
const dimY = randInt(minDim, maxDim);
|
|
373
|
-
const maxX = Math.max(0, gridX - dimX);
|
|
374
|
-
const maxY = Math.max(0, gridY - dimY);
|
|
375
|
-
entities.push({
|
|
376
|
-
entityType: 'obstacle',
|
|
377
|
-
initCellX: randInt(0, maxX),
|
|
378
|
-
initCellY: randInt(0, maxY),
|
|
379
|
-
dimX,
|
|
380
|
-
dimY,
|
|
381
|
-
color: rgba,
|
|
382
|
-
objectLayerItemIds: [],
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
return entities;
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
/**
|
|
389
|
-
* Generate procedural foreground entities for a map.
|
|
390
|
-
*
|
|
391
|
-
* Foregrounds use empty `objectLayerItemIds` and a semi-transparent colour
|
|
392
|
-
* from the FOREGROUND palette entry. Count, dimensions, and positions are
|
|
393
|
-
* all fully random within the declared ranges.
|
|
394
|
-
*
|
|
395
|
-
* @param {{ gridX: number, gridY: number }} mapDims Map grid dimensions.
|
|
396
|
-
* @param {Array<{ key: string, r: number, g: number, b: number, a: number }>} colors Palette.
|
|
397
|
-
* @param {object} [opts]
|
|
398
|
-
* @param {number} [opts.count] Override count (ignores range).
|
|
399
|
-
* @param {number} [opts.minDim=2] Minimum foreground width/height (cells).
|
|
400
|
-
* @param {number} [opts.maxDim=6] Maximum foreground width/height (cells).
|
|
401
|
-
* @returns {object[]} Array of CyberiaEntity plain objects.
|
|
402
|
-
*/
|
|
403
|
-
function generateForeground(mapDims, colors, opts = {}) {
|
|
404
|
-
const { minDim = 2, maxDim = 6 } = opts;
|
|
405
|
-
const count = opts.count ?? randInt(FOREGROUND_RANGE[0], FOREGROUND_RANGE[1]);
|
|
406
|
-
const { gridX, gridY } = mapDims;
|
|
407
|
-
|
|
408
|
-
const fgColor = findColor(colors, 'FOREGROUND');
|
|
409
|
-
const rgba = fgColor ? colorToRgba(fgColor) : 'rgba(200, 200, 200, 0.31)';
|
|
410
|
-
|
|
411
|
-
const entities = [];
|
|
412
|
-
for (let i = 0; i < count; i++) {
|
|
413
|
-
const dimX = randInt(minDim, maxDim);
|
|
414
|
-
const dimY = randInt(minDim, maxDim);
|
|
415
|
-
const maxX = Math.max(0, gridX - dimX);
|
|
416
|
-
const maxY = Math.max(0, gridY - dimY);
|
|
417
|
-
entities.push({
|
|
418
|
-
entityType: 'foreground',
|
|
419
|
-
initCellX: randInt(0, maxX),
|
|
420
|
-
initCellY: randInt(0, maxY),
|
|
421
|
-
dimX,
|
|
422
|
-
dimY,
|
|
423
|
-
color: rgba,
|
|
424
|
-
objectLayerItemIds: [],
|
|
425
|
-
});
|
|
426
|
-
}
|
|
427
|
-
return entities;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
/**
|
|
431
|
-
* Generate all procedural fallback entities (obstacles + foreground) for a map.
|
|
432
|
-
*
|
|
433
|
-
* @param {{ gridX: number, gridY: number }} mapDims
|
|
434
|
-
* @param {Array<{ key: string, r: number, g: number, b: number, a: number }>} colors
|
|
435
|
-
* @param {object} [opts]
|
|
436
|
-
* @param {number} [opts.obstacleCount]
|
|
437
|
-
* @param {number} [opts.foregroundCount]
|
|
438
|
-
* @returns {{ obstacles: object[], foreground: object[] }}
|
|
439
|
-
*/
|
|
440
|
-
function generateProceduralEntities(mapDims, colors, opts = {}) {
|
|
441
|
-
return {
|
|
442
|
-
obstacles: generateObstacles(mapDims, colors, { count: opts.obstacleCount }),
|
|
443
|
-
foreground: generateForeground(mapDims, colors, { count: opts.foregroundCount }),
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
// ── Entity count ranges ──────────────────────────────────────────────────────
|
|
448
|
-
// [min, max] — actual count is random within range on each generation call.
|
|
449
|
-
|
|
450
|
-
const OBSTACLE_RANGE = [20, 35];
|
|
451
|
-
const FOREGROUND_RANGE = [10, 20];
|
|
452
|
-
const BOT_RANGE = [8, 16];
|
|
453
|
-
const BOT_WEAPON_CHANCE = 0.6;
|
|
454
|
-
const PORTAL_DIM_RANGE = [2, 3];
|
|
455
|
-
const PORTAL_COUNT_RANGE = [2, 4];
|
|
456
|
-
|
|
457
248
|
// ── Public API ───────────────────────────────────────────────────────────────
|
|
458
249
|
|
|
459
250
|
export {
|
|
@@ -466,21 +257,4 @@ export {
|
|
|
466
257
|
PORTAL_MODE_LIST,
|
|
467
258
|
PORTAL_MODE_COLOR_KEY,
|
|
468
259
|
EXTRA_PORTAL_MODES,
|
|
469
|
-
// Procedural entities
|
|
470
|
-
generateObstacles,
|
|
471
|
-
generateForeground,
|
|
472
|
-
generateProceduralEntities,
|
|
473
|
-
// Placement
|
|
474
|
-
OccupancyGrid,
|
|
475
|
-
// Helpers
|
|
476
|
-
colorToRgba,
|
|
477
|
-
findColor,
|
|
478
|
-
randInt,
|
|
479
|
-
// Ranges
|
|
480
|
-
OBSTACLE_RANGE,
|
|
481
|
-
FOREGROUND_RANGE,
|
|
482
|
-
BOT_RANGE,
|
|
483
|
-
BOT_WEAPON_CHANCE,
|
|
484
|
-
PORTAL_DIM_RANGE,
|
|
485
|
-
PORTAL_COUNT_RANGE,
|
|
486
260
|
};
|