cyberia 3.2.5 → 3.2.9
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 +2 -2
- package/.github/workflows/release.cd.yml +1 -2
- package/CHANGELOG.md +351 -1
- package/CLI-HELP.md +40 -13
- package/Dockerfile +0 -4
- package/README.md +242 -497
- package/bin/build.js +19 -5
- package/bin/cyberia.js +1149 -240
- package/bin/deploy.js +570 -1
- package/bin/file.js +6 -0
- package/bin/index.js +1149 -240
- package/bin/vs.js +1 -1
- package/conf.js +67 -89
- package/deployment.yaml +4 -222
- package/hardhat/package-lock.json +32 -32
- package/hardhat/package.json +3 -3
- 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 +4 -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 +136 -66
- package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
- package/package.json +23 -14
- package/proxy.yaml +10 -118
- package/scripts/k3s-node-setup.sh +2 -2
- 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.service.js +76 -21
- package/src/api/core/core.controller.js +10 -10
- package/src/api/core/core.service.js +10 -10
- package/src/api/crypto/crypto.controller.js +8 -8
- package/src/api/crypto/crypto.service.js +8 -8
- 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 +27 -0
- package/src/api/cyberia-action/cyberia-action.service.js +42 -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 +2 -2
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +16 -16
- package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
- package/src/api/cyberia-entity/cyberia-entity.service.js +10 -10
- package/src/api/cyberia-instance/cyberia-fallback-world.js +19 -209
- 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.service.js +22 -57
- 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.defaults.js +216 -55
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +4 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +18 -14
- package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
- package/src/api/cyberia-map/cyberia-map.service.js +10 -10
- 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 +27 -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 +27 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
- package/src/api/default/default.controller.js +10 -10
- package/src/api/default/default.service.js +10 -10
- package/src/api/document/document.controller.js +12 -12
- package/src/api/document/document.model.js +10 -16
- package/src/api/file/file.controller.js +8 -8
- package/src/api/file/file.model.js +10 -10
- package/src/api/file/file.service.js +36 -36
- package/src/api/instance/instance.controller.js +10 -10
- package/src/api/instance/instance.model.js +4 -10
- package/src/api/instance/instance.service.js +10 -10
- package/src/api/ipfs/ipfs.controller.js +12 -12
- package/src/api/ipfs/ipfs.model.js +4 -13
- package/src/api/ipfs/ipfs.service.js +14 -28
- 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.service.js +12 -12
- 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.service.js +18 -14
- package/src/api/test/test.controller.js +8 -8
- package/src/api/test/test.service.js +8 -8
- package/src/api/user/guest.service.js +99 -0
- package/src/api/user/user.controller.js +6 -6
- package/src/api/user/user.model.js +8 -13
- package/src/api/user/user.service.js +3 -20
- package/src/cli/cluster.js +61 -14
- package/src/cli/db.js +47 -2
- package/src/cli/deploy.js +67 -35
- package/src/cli/fs.js +79 -8
- package/src/cli/image.js +43 -1
- package/src/cli/index.js +26 -1
- package/src/cli/release.js +57 -1
- package/src/cli/repository.js +69 -31
- package/src/cli/run.js +415 -36
- package/src/cli/ssh.js +1 -1
- package/src/cli/static.js +43 -115
- package/src/client/Cryptokoyn.index.js +18 -21
- package/src/client/CyberiaPortal.index.js +19 -23
- package/src/client/Default.index.js +21 -33
- 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 +35 -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 +87 -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 +92 -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 +462 -178
- 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 +25 -125
- 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 +163 -27
- 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-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +305 -61
- 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 +443 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -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/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-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/offline/Maintenance.js +12 -11
- package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
- package/src/client/ssr/pages/Test.js +2 -2
- package/src/client/sw/core.sw.js +212 -0
- package/src/grpc/cyberia/grpc-server.js +179 -67
- package/src/index.js +1 -1
- package/src/runtime/cyberia-client/Dockerfile +80 -0
- package/src/runtime/cyberia-server/Dockerfile +37 -0
- package/src/runtime/express/Dockerfile +4 -4
- package/src/runtime/lampp/Dockerfile +8 -7
- package/src/runtime/wp/Dockerfile +11 -17
- package/src/server/atlas-sprite-sheet-generator.js +4 -2
- package/src/server/client-build-docs.js +45 -46
- package/src/server/client-build.js +334 -60
- package/src/server/client-formatted.js +47 -16
- package/src/server/conf.js +5 -4
- 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 +13 -27
- 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 +17 -3
- package/src/server/valkey.js +141 -235
- 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/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/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/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/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,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
|
};
|