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.
Files changed (301) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +2 -2
  2. package/.github/workflows/release.cd.yml +1 -2
  3. package/CHANGELOG.md +351 -1
  4. package/CLI-HELP.md +40 -13
  5. package/Dockerfile +0 -4
  6. package/README.md +242 -497
  7. package/bin/build.js +19 -5
  8. package/bin/cyberia.js +1149 -240
  9. package/bin/deploy.js +570 -1
  10. package/bin/file.js +6 -0
  11. package/bin/index.js +1149 -240
  12. package/bin/vs.js +1 -1
  13. package/conf.js +67 -89
  14. package/deployment.yaml +4 -222
  15. package/hardhat/package-lock.json +32 -32
  16. package/hardhat/package.json +3 -3
  17. package/jsconfig.json +1 -1
  18. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  19. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  20. package/manifests/deployment/dd-cyberia-development/deployment.yaml +4 -222
  21. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  22. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  23. package/manifests/deployment/dd-test-development/deployment.yaml +136 -66
  24. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  25. package/package.json +23 -14
  26. package/proxy.yaml +10 -118
  27. package/scripts/k3s-node-setup.sh +2 -2
  28. package/scripts/nat-iptables.sh +103 -18
  29. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  30. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  31. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +76 -21
  32. package/src/api/core/core.controller.js +10 -10
  33. package/src/api/core/core.service.js +10 -10
  34. package/src/api/crypto/crypto.controller.js +8 -8
  35. package/src/api/crypto/crypto.service.js +8 -8
  36. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  37. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  38. package/src/api/cyberia-action/cyberia-action.router.js +27 -0
  39. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  40. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  41. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  42. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
  43. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +16 -16
  44. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  45. package/src/api/cyberia-entity/cyberia-entity.service.js +10 -10
  46. package/src/api/cyberia-instance/cyberia-fallback-world.js +19 -209
  47. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  48. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  49. package/src/api/cyberia-instance/cyberia-instance.service.js +22 -57
  50. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  51. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  52. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  53. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +216 -55
  54. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +4 -1
  55. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +18 -14
  56. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  57. package/src/api/cyberia-map/cyberia-map.service.js +10 -10
  58. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  59. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  60. package/src/api/cyberia-quest/cyberia-quest.router.js +27 -0
  61. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  62. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  63. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  64. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +27 -0
  65. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  66. package/src/api/default/default.controller.js +10 -10
  67. package/src/api/default/default.service.js +10 -10
  68. package/src/api/document/document.controller.js +12 -12
  69. package/src/api/document/document.model.js +10 -16
  70. package/src/api/file/file.controller.js +8 -8
  71. package/src/api/file/file.model.js +10 -10
  72. package/src/api/file/file.service.js +36 -36
  73. package/src/api/instance/instance.controller.js +10 -10
  74. package/src/api/instance/instance.model.js +4 -10
  75. package/src/api/instance/instance.service.js +10 -10
  76. package/src/api/ipfs/ipfs.controller.js +12 -12
  77. package/src/api/ipfs/ipfs.model.js +4 -13
  78. package/src/api/ipfs/ipfs.service.js +14 -28
  79. package/src/api/object-layer/object-layer.controller.js +12 -12
  80. package/src/api/object-layer/object-layer.model.js +4 -17
  81. package/src/api/object-layer/object-layer.service.js +12 -12
  82. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  83. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  84. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +18 -14
  85. package/src/api/test/test.controller.js +8 -8
  86. package/src/api/test/test.service.js +8 -8
  87. package/src/api/user/guest.service.js +99 -0
  88. package/src/api/user/user.controller.js +6 -6
  89. package/src/api/user/user.model.js +8 -13
  90. package/src/api/user/user.service.js +3 -20
  91. package/src/cli/cluster.js +61 -14
  92. package/src/cli/db.js +47 -2
  93. package/src/cli/deploy.js +67 -35
  94. package/src/cli/fs.js +79 -8
  95. package/src/cli/image.js +43 -1
  96. package/src/cli/index.js +26 -1
  97. package/src/cli/release.js +57 -1
  98. package/src/cli/repository.js +69 -31
  99. package/src/cli/run.js +415 -36
  100. package/src/cli/ssh.js +1 -1
  101. package/src/cli/static.js +43 -115
  102. package/src/client/Cryptokoyn.index.js +18 -21
  103. package/src/client/CyberiaPortal.index.js +19 -23
  104. package/src/client/Default.index.js +21 -33
  105. package/src/client/Itemledger.index.js +20 -26
  106. package/src/client/Underpost.index.js +19 -23
  107. package/src/client/components/core/404.js +4 -4
  108. package/src/client/components/core/500.js +4 -4
  109. package/src/client/components/core/Account.js +73 -60
  110. package/src/client/components/core/AgGrid.js +23 -33
  111. package/src/client/components/core/Alert.js +12 -13
  112. package/src/client/components/core/AppStore.js +1 -1
  113. package/src/client/components/core/Auth.js +35 -37
  114. package/src/client/components/core/Badge.js +7 -13
  115. package/src/client/components/core/BtnIcon.js +15 -17
  116. package/src/client/components/core/CalendarCore.js +42 -63
  117. package/src/client/components/core/Chat.js +13 -15
  118. package/src/client/components/core/ClientEvents.js +87 -0
  119. package/src/client/components/core/ColorPaletteElement.js +309 -0
  120. package/src/client/components/core/Content.js +17 -14
  121. package/src/client/components/core/Css.js +15 -71
  122. package/src/client/components/core/CssCore.js +12 -16
  123. package/src/client/components/core/D3Chart.js +4 -4
  124. package/src/client/components/core/Docs.js +64 -91
  125. package/src/client/components/core/DropDown.js +69 -91
  126. package/src/client/components/core/EventBus.js +92 -0
  127. package/src/client/components/core/EventsUI.js +14 -17
  128. package/src/client/components/core/FileExplorer.js +96 -228
  129. package/src/client/components/core/FullScreen.js +47 -75
  130. package/src/client/components/core/Input.js +24 -69
  131. package/src/client/components/core/Keyboard.js +25 -18
  132. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  133. package/src/client/components/core/LoadingAnimation.js +25 -31
  134. package/src/client/components/core/LogIn.js +41 -41
  135. package/src/client/components/core/LogOut.js +23 -14
  136. package/src/client/components/core/Modal.js +462 -178
  137. package/src/client/components/core/NotificationManager.js +14 -18
  138. package/src/client/components/core/Panel.js +54 -50
  139. package/src/client/components/core/PanelForm.js +25 -125
  140. package/src/client/components/core/Polyhedron.js +110 -214
  141. package/src/client/components/core/PublicProfile.js +39 -32
  142. package/src/client/components/core/Recover.js +48 -44
  143. package/src/client/components/core/Responsive.js +88 -32
  144. package/src/client/components/core/RichText.js +9 -18
  145. package/src/client/components/core/Router.js +24 -3
  146. package/src/client/components/core/SearchBox.js +37 -37
  147. package/src/client/components/core/SignUp.js +39 -30
  148. package/src/client/components/core/SocketIo.js +31 -2
  149. package/src/client/components/core/SocketIoHandler.js +6 -6
  150. package/src/client/components/core/ToggleSwitch.js +8 -20
  151. package/src/client/components/core/ToolTip.js +5 -17
  152. package/src/client/components/core/Translate.js +56 -59
  153. package/src/client/components/core/Validator.js +26 -16
  154. package/src/client/components/core/Wallet.js +15 -26
  155. package/src/client/components/core/Worker.js +163 -27
  156. package/src/client/components/core/windowGetDimensions.js +7 -7
  157. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  158. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  159. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  160. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  161. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  162. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  163. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  164. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  165. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  166. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  167. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  168. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  169. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  170. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +305 -61
  171. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  172. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  173. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  174. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  175. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  176. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  177. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  178. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  179. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  180. package/src/client/components/default/CssDefault.js +12 -12
  181. package/src/client/components/default/LogInDefault.js +6 -4
  182. package/src/client/components/default/LogOutDefault.js +6 -4
  183. package/src/client/components/default/RouterDefault.js +47 -0
  184. package/src/client/components/default/SettingsDefault.js +4 -4
  185. package/src/client/components/default/SignUpDefault.js +6 -4
  186. package/src/client/components/default/TranslateDefault.js +3 -3
  187. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  188. package/src/client/components/itemledger/CssItemledger.js +15 -15
  189. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  190. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  191. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  192. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  193. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  194. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  195. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  196. package/src/client/components/underpost/CssUnderpost.js +14 -14
  197. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  198. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  199. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  200. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  201. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  202. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  203. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  204. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  205. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  206. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  207. package/src/client/public/cyberia-docs/ARCHITECTURE.md +443 -0
  208. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
  209. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
  210. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -0
  211. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  212. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  213. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  214. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  215. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  216. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  217. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  218. package/src/client/services/core/core.service.js +17 -49
  219. package/src/client/services/crypto/crypto.service.js +8 -13
  220. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  221. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  222. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  223. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  224. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  225. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  226. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  227. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  228. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  229. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  230. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  231. package/src/client/services/default/default.management.js +159 -267
  232. package/src/client/services/default/default.service.js +10 -16
  233. package/src/client/services/document/document.service.js +14 -19
  234. package/src/client/services/file/file.service.js +8 -13
  235. package/src/client/services/instance/instance.management.js +5 -5
  236. package/src/client/services/instance/instance.service.js +10 -15
  237. package/src/client/services/ipfs/ipfs.service.js +12 -18
  238. package/src/client/services/object-layer/object-layer.management.js +12 -12
  239. package/src/client/services/object-layer/object-layer.service.js +20 -26
  240. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  241. package/src/client/services/test/test.service.js +8 -13
  242. package/src/client/services/user/guest.service.js +86 -0
  243. package/src/client/services/user/user.management.js +5 -5
  244. package/src/client/services/user/user.service.js +14 -20
  245. package/src/client/ssr/body/404.js +3 -3
  246. package/src/client/ssr/body/500.js +3 -3
  247. package/src/client/ssr/body/CacheControl.js +5 -2
  248. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  249. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  250. package/src/client/ssr/head/PwaItemledger.js +197 -60
  251. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  252. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  253. package/src/client/ssr/offline/Maintenance.js +12 -11
  254. package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
  255. package/src/client/ssr/pages/Test.js +2 -2
  256. package/src/client/sw/core.sw.js +212 -0
  257. package/src/grpc/cyberia/grpc-server.js +179 -67
  258. package/src/index.js +1 -1
  259. package/src/runtime/cyberia-client/Dockerfile +80 -0
  260. package/src/runtime/cyberia-server/Dockerfile +37 -0
  261. package/src/runtime/express/Dockerfile +4 -4
  262. package/src/runtime/lampp/Dockerfile +8 -7
  263. package/src/runtime/wp/Dockerfile +11 -17
  264. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  265. package/src/server/client-build-docs.js +45 -46
  266. package/src/server/client-build.js +334 -60
  267. package/src/server/client-formatted.js +47 -16
  268. package/src/server/conf.js +5 -4
  269. package/src/server/data-query.js +32 -20
  270. package/src/server/dns.js +22 -0
  271. package/src/server/ipfs-client.js +232 -91
  272. package/src/server/object-layer.js +1 -6
  273. package/src/server/process.js +13 -27
  274. package/src/server/semantic-layer-generator-floor.js +11 -51
  275. package/src/server/semantic-layer-generator-resource.js +259 -0
  276. package/src/server/semantic-layer-generator-skin.js +41 -171
  277. package/src/server/semantic-layer-generator.js +122 -14
  278. package/src/server/shape-generator.js +108 -0
  279. package/src/server/start.js +17 -3
  280. package/src/server/valkey.js +141 -235
  281. package/tsconfig.docs.json +15 -0
  282. package/typedoc.dd-cyberia.json +29 -0
  283. package/typedoc.json +29 -0
  284. package/WHITE-PAPER.md +0 -1540
  285. package/hardhat/README.md +0 -531
  286. package/hardhat/WHITE-PAPER.md +0 -1540
  287. package/jsdoc.dd-cyberia.json +0 -68
  288. package/jsdoc.json +0 -68
  289. package/src/api/object-layer/README.md +0 -672
  290. package/src/client/components/core/ColorPalette.js +0 -5267
  291. package/src/client/components/core/JoyStick.js +0 -80
  292. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  293. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  294. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  295. package/src/client/components/default/RoutesDefault.js +0 -49
  296. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  297. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  298. package/src/client/sw/default.sw.js +0 -127
  299. package/src/client/sw/template.sw.js +0 -84
  300. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  301. 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
- * Shared by the backend (CyberiaInstanceService) and the GUI (map editor)
5
- * to build, validate, and procedurally generate portal topology and world
6
- * entities for a CyberiaInstance.
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
- * All exported functions are stateless and synchronous — they operate on
9
- * plain JS objects (lean Mongoose docs or JSON from the API) so the GUI
10
- * can call them directly without a DB dependency.
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
- // ── Color helpers ────────────────────────────────────────────────────────────
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
- const sub = srcEnt.portalSubtype || PORTAL_MODES.INTER_PORTAL;
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
  };