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,223 +1,467 @@
1
- const CyberiaDependencies = {
2
- 'maxrects-packer': '^2.7.3',
3
- pngjs: '^7.0.0',
4
- jimp: '^1.6.0',
5
- sharp: '^0.34.5',
6
- ethers: '~6.16.0',
7
- };
8
-
1
+ /**
2
+ * Shared Cyberia plain-data module.
3
+ * Keep this file free of runtime-specific imports so the same registry can be
4
+ * consumed by client, server, and CLI code.
5
+ */
6
+ const ITEM_TYPES = Object.freeze({
7
+ skin: 'skin',
8
+ breastplate: 'breastplate',
9
+ weapon: 'weapon',
10
+ skill: 'skill',
11
+ coin: 'coin',
12
+ floor: 'floor',
13
+ obstacle: 'obstacle',
14
+ portal: 'portal',
15
+ foreground: 'foreground',
16
+ resource: 'resource',
17
+ });
18
+ const ENTITY_TYPES = Object.freeze({
19
+ player: 'player',
20
+ other_player: 'other_player',
21
+ bot: 'bot',
22
+ skill: 'skill',
23
+ coin: 'coin',
24
+ floor: 'floor',
25
+ obstacle: 'obstacle',
26
+ portal: 'portal',
27
+ foreground: 'foreground',
28
+ resource: 'resource',
29
+ });
30
+ const QUEST_STEPS_TYPES = Object.freeze(['collect', 'talk', 'kill']);
31
+ const CYBERIA_ACTION_TYPES = Object.freeze(['craft', 'shop', 'storage', 'quest-talk']);
32
+ const ENTITY_TYPE_TO_ITEM_TYPES = Object.freeze({
33
+ [ENTITY_TYPES.player]: Object.freeze([ITEM_TYPES.skin, ITEM_TYPES.breastplate, ITEM_TYPES.weapon]),
34
+ [ENTITY_TYPES.other_player]: Object.freeze([ITEM_TYPES.skin, ITEM_TYPES.breastplate, ITEM_TYPES.weapon]),
35
+ [ENTITY_TYPES.bot]: Object.freeze([ITEM_TYPES.skin, ITEM_TYPES.weapon]),
36
+ [ENTITY_TYPES.skill]: Object.freeze([ITEM_TYPES.skill]),
37
+ [ENTITY_TYPES.coin]: Object.freeze([ITEM_TYPES.coin]),
38
+ [ENTITY_TYPES.floor]: Object.freeze([ITEM_TYPES.floor]),
39
+ [ENTITY_TYPES.obstacle]: Object.freeze([ITEM_TYPES.obstacle]),
40
+ [ENTITY_TYPES.portal]: Object.freeze([ITEM_TYPES.portal]),
41
+ [ENTITY_TYPES.foreground]: Object.freeze([ITEM_TYPES.foreground]),
42
+ [ENTITY_TYPES.resource]: Object.freeze([ITEM_TYPES.resource]),
43
+ });
44
+ class CyberiaDependencies {
45
+ static 'maxrects-packer' = '^2.7.3';
46
+ static pngjs = '^7.0.0';
47
+ static jimp = '^1.6.0';
48
+ static sharp = '^0.34.5';
49
+ static ethers = '~6.16.0';
50
+ }
9
51
  const DefaultCyberiaItems = [
10
- { item: { id: 'coin', type: 'coin' } },
52
+ { item: { id: 'coin', type: ITEM_TYPES.coin } },
11
53
  // { item: { id: 'red-power', type: 'skill' } },
12
54
  // { item: { id: 'heal', type: 'skill' } },
13
- // { item: { id: 'hatchet-skill', type: 'skill' } },
55
+ { item: { id: 'hatchet-skill', type: ITEM_TYPES.skill } },
14
56
  // { item: { id: 'green-power', type: 'skill' } },
15
57
  // { item: { id: 'blood', type: 'skill' } },
16
- { item: { id: 'atlas_pistol_mk2', type: 'weapon' } },
17
- { item: { id: 'atlas_pistol_mk2_bullet', type: 'skill' } },
18
- // { item: { id: 'tim-knife', type: 'weapon' } },
19
- { item: { id: 'hatchet', type: 'weapon' } },
20
- { item: { id: 'wason', type: 'skin' } },
21
- { item: { id: 'scp-2040', type: 'skin' } },
22
- { item: { id: 'purple', type: 'skin' } },
23
- { item: { id: 'punk', type: 'skin' } },
58
+ { item: { id: 'atlas_pistol_mk2', type: ITEM_TYPES.weapon } },
59
+ { item: { id: 'atlas_pistol_mk2_bullet', type: ITEM_TYPES.skill } },
60
+ { item: { id: 'tim-knife', type: ITEM_TYPES.weapon } },
61
+ { item: { id: 'hatchet', type: ITEM_TYPES.weapon } },
62
+ { item: { id: 'wason', type: ITEM_TYPES.skin } },
63
+ { item: { id: 'scp-2040', type: ITEM_TYPES.skin } },
64
+ { item: { id: 'purple', type: ITEM_TYPES.skin } },
65
+ { item: { id: 'punk', type: ITEM_TYPES.skin } },
24
66
  // { item: { id: 'marciano', type: 'skin' } },
25
- { item: { id: 'lain', type: 'skin' } },
26
- { item: { id: 'kaneki', type: 'skin' } },
27
- { item: { id: 'junko', type: 'skin' } },
28
- { item: { id: 'ghost', type: 'skin' } },
29
- { item: { id: 'eiri', type: 'skin' } },
30
- { item: { id: 'anon', type: 'skin' } },
31
- { item: { id: 'alex', type: 'skin' } },
32
- { item: { id: 'agent', type: 'skin' } },
33
- { item: { id: 'grass', type: 'floor' } },
67
+ { item: { id: 'lain', type: ITEM_TYPES.skin } },
68
+ { item: { id: 'kaneki', type: ITEM_TYPES.skin } },
69
+ { item: { id: 'junko', type: ITEM_TYPES.skin } },
70
+ { item: { id: 'ghost', type: ITEM_TYPES.skin } },
71
+ { item: { id: 'eiri', type: ITEM_TYPES.skin } },
72
+ { item: { id: 'anon', type: ITEM_TYPES.skin } },
73
+ { item: { id: 'alex', type: ITEM_TYPES.skin } },
74
+ { item: { id: 'agent', type: ITEM_TYPES.skin } },
75
+ { item: { id: 'grass', type: ITEM_TYPES.floor } },
34
76
  ];
35
-
77
+ const DEFAULT_CYBERIA_ITEM_BY_ID = Object.freeze(
78
+ DefaultCyberiaItems.reduce((acc, entry) => {
79
+ acc[entry.item.id] = entry;
80
+ return acc;
81
+ }, {}),
82
+ );
83
+ const getDefaultCyberiaItemById = (itemId) => DEFAULT_CYBERIA_ITEM_BY_ID[itemId] || null;
84
+ const getDefaultCyberiaItemsByItemType = (itemType) =>
85
+ DefaultCyberiaItems.filter((entry) => entry.item.type === itemType);
86
+ const getDefaultCyberiaItemsByEntityType = (entityType) => {
87
+ const allowedTypes = ENTITY_TYPE_TO_ITEM_TYPES[entityType] || [];
88
+ return DefaultCyberiaItems.filter((entry) => allowedTypes.includes(entry.item.type));
89
+ };
36
90
  const DefaultSkillConfig = [
37
91
  // { triggerItemId: 'anon', logicEventIds: ['doppelganger'] },
38
92
  {
39
93
  triggerItemId: 'atlas_pistol_mk2',
40
- logicEventIds: ['atlas_pistol_mk2_logic'],
94
+ logicEventIds: ['projectile'],
41
95
  },
42
96
  { triggerItemId: 'coin', logicEventIds: ['coin_drop_or_transaction'] },
43
97
  // { triggerItemId: 'purple', logicEventIds: ['doppelganger'] },
44
98
  // { triggerItemId: 'atlas_pistol_mk2_bullet', logicEventIds: ['doppelganger'] },
45
99
  ];
46
-
47
100
  /**
48
101
  * Default dialogue seeds for every non-commented entry in DefaultCyberiaItems.
49
- * Each item maps to an array of dialogue records following the CyberiaDialogue
50
- * model schema: { itemId, order, speaker, text, mood }.
102
+ * Each entry follows the CyberiaDialogue model schema:
103
+ * { code, order, speaker, text, mood }
104
+ *
105
+ * `code` is the primary grouping key (e.g. "default-lain"). The C client
106
+ * fetches all lines for a code with GET /api/cyberia-dialogue/code/:code.
51
107
  *
52
108
  * Used by the seed/migration script to populate the database on first boot.
53
- * The C client fetches these at runtime via GET /api/cyberia-dialogue?...
54
109
  */
55
110
  const DefaultCyberiaDialogues = [
56
111
  {
57
- itemId: 'coin',
112
+ code: 'default-coin',
58
113
  order: 0,
59
114
  speaker: 'Coin',
60
115
  text: 'A standard unit of exchange in the cyberia network.',
61
116
  mood: 'neutral',
62
117
  },
63
118
  {
64
- itemId: 'atlas_pistol_mk2',
119
+ code: 'default-atlas_pistol_mk2',
65
120
  order: 0,
66
121
  speaker: 'Atlas Pistol MK2',
67
122
  text: 'Military-grade sidearm. Fires energy projectiles.',
68
123
  mood: 'neutral',
69
124
  },
70
125
  {
71
- itemId: 'atlas_pistol_mk2_bullet',
126
+ code: 'default-atlas_pistol_mk2_bullet',
72
127
  order: 0,
73
128
  speaker: 'MK2 Bullet',
74
129
  text: 'High-velocity energy round. Dissipates on impact.',
75
130
  mood: 'neutral',
76
131
  },
77
132
  {
78
- itemId: 'hatchet',
133
+ code: 'default-hatchet',
79
134
  order: 0,
80
135
  speaker: 'Hatchet',
81
136
  text: 'A crude but reliable melee tool. Good for close quarters.',
82
137
  mood: 'neutral',
83
138
  },
84
139
  {
85
- itemId: 'wason',
140
+ code: 'default-wason',
86
141
  order: 0,
87
142
  speaker: 'Wason',
88
143
  text: 'They say I am just a wandering merchant... but I have seen things.',
89
144
  mood: 'neutral',
90
145
  },
91
146
  {
92
- itemId: 'wason',
147
+ code: 'default-wason',
93
148
  order: 1,
94
149
  speaker: 'Wason',
95
150
  text: 'The network was not always like this. There was a time before the portals.',
96
151
  mood: 'sad',
97
152
  },
98
153
  {
99
- itemId: 'scp-2040',
154
+ code: 'default-scp-2040',
100
155
  order: 0,
101
156
  speaker: 'SCP-2040',
102
157
  text: 'CONTAINMENT PROTOCOL ACTIVE. Do not make direct eye contact.',
103
158
  mood: 'angry',
104
159
  },
105
160
  {
106
- itemId: 'scp-2040',
161
+ code: 'default-scp-2040',
107
162
  order: 1,
108
163
  speaker: 'SCP-2040',
109
164
  text: 'I remember everything. Every iteration. Every reset.',
110
165
  mood: 'sad',
111
166
  },
112
167
  {
113
- itemId: 'purple',
168
+ code: 'default-purple',
114
169
  order: 0,
115
170
  speaker: 'Purple',
116
171
  text: 'The void between nodes is not empty — it is alive.',
117
172
  mood: 'neutral',
118
173
  },
119
174
  {
120
- itemId: 'punk',
175
+ code: 'default-punk',
121
176
  order: 0,
122
177
  speaker: 'Punk',
123
178
  text: 'Rules are just code someone else wrote. I write my own.',
124
179
  mood: 'happy',
125
180
  },
126
181
  {
127
- itemId: 'lain',
182
+ code: 'default-lain',
128
183
  order: 0,
129
184
  speaker: 'Lain',
130
185
  text: 'No matter where you go, everyone is connected.',
131
186
  mood: 'neutral',
132
187
  },
133
188
  {
134
- itemId: 'lain',
189
+ code: 'default-lain',
135
190
  order: 1,
136
191
  speaker: 'Lain',
137
192
  text: 'If you are not remembered, then you never existed.',
138
193
  mood: 'sad',
139
194
  },
140
195
  {
141
- itemId: 'lain',
196
+ code: 'default-lain',
142
197
  order: 2,
143
198
  speaker: 'Lain',
144
199
  text: 'The wired is not a separate world. It is layered over this one.',
145
200
  mood: 'neutral',
146
201
  },
147
202
  {
148
- itemId: 'kaneki',
203
+ code: 'default-kaneki',
149
204
  order: 0,
150
205
  speaker: 'Kaneki',
151
206
  text: 'I am not the protagonist of a novel. I am just... me.',
152
207
  mood: 'sad',
153
208
  },
154
- { itemId: 'kaneki', order: 1, speaker: 'Kaneki', text: 'What is 1000 minus 7?', mood: 'angry' },
155
- { itemId: 'junko', order: 0, speaker: 'Junko', text: 'Despair is the seed from which hope blooms!', mood: 'happy' },
156
209
  {
157
- itemId: 'junko',
210
+ code: 'default-kaneki',
211
+ order: 1,
212
+ speaker: 'Kaneki',
213
+ text: 'What is 1000 minus 7?',
214
+ mood: 'angry',
215
+ },
216
+ {
217
+ code: 'default-junko',
218
+ order: 0,
219
+ speaker: 'Junko',
220
+ text: 'Despair is the seed from which hope blooms!',
221
+ mood: 'happy',
222
+ },
223
+ {
224
+ code: 'default-junko',
158
225
  order: 1,
159
226
  speaker: 'Junko',
160
227
  text: 'How boring... nothing ever surprises me anymore.',
161
228
  mood: 'sad',
162
229
  },
163
- { itemId: 'ghost', order: 0, speaker: 'Ghost', text: '...', mood: 'neutral' },
230
+ { code: 'default-ghost', order: 0, speaker: 'Ghost', text: '...', mood: 'neutral' },
164
231
  {
165
- itemId: 'eiri',
232
+ code: 'default-eiri',
166
233
  order: 0,
167
234
  speaker: 'Eiri',
168
235
  text: 'I am the god of the wired. I designed the protocol.',
169
236
  mood: 'neutral',
170
237
  },
171
238
  {
172
- itemId: 'eiri',
239
+ code: 'default-eiri',
173
240
  order: 1,
174
241
  speaker: 'Eiri',
175
242
  text: 'Flesh is just hardware. Consciousness is the only software that matters.',
176
243
  mood: 'neutral',
177
244
  },
178
- { itemId: 'anon', order: 0, speaker: '???', text: 'You should not be here. Turn back.', mood: 'angry' },
179
245
  {
180
- itemId: 'anon',
246
+ code: 'default-anon',
247
+ order: 0,
248
+ speaker: '???',
249
+ text: 'You should not be here. Turn back.',
250
+ mood: 'angry',
251
+ },
252
+ {
253
+ code: 'default-anon',
181
254
  order: 1,
182
255
  speaker: '???',
183
256
  text: 'Or stay. It does not matter. Nothing leaves this place.',
184
257
  mood: 'neutral',
185
258
  },
186
259
  {
187
- itemId: 'alex',
260
+ code: 'default-alex',
188
261
  order: 0,
189
262
  speaker: 'Alex',
190
263
  text: 'I have been mapping the portal network. Something does not add up.',
191
264
  mood: 'neutral',
192
265
  },
193
266
  {
194
- itemId: 'alex',
267
+ code: 'default-alex',
195
268
  order: 1,
196
269
  speaker: 'Alex',
197
270
  text: 'There are nodes that exist in the registry but have no physical anchor.',
198
271
  mood: 'neutral',
199
272
  },
200
273
  {
201
- itemId: 'agent',
274
+ code: 'default-agent',
202
275
  order: 0,
203
276
  speaker: 'Agent',
204
277
  text: 'Civilian, this area is restricted. State your business.',
205
278
  mood: 'neutral',
206
279
  },
207
280
  {
208
- itemId: 'agent',
281
+ code: 'default-agent',
209
282
  order: 1,
210
283
  speaker: 'Agent',
211
284
  text: 'Hmm. Proceed, but know that you are being watched.',
212
285
  mood: 'neutral',
213
286
  },
214
287
  {
215
- itemId: 'grass',
288
+ code: 'default-grass',
216
289
  order: 0,
217
290
  speaker: 'Grass',
218
291
  text: 'A patch of synthetic grass. It sways gently despite no wind.',
219
292
  mood: 'neutral',
220
293
  },
294
+ // ── Quest-talk dialogue lines ────────────────────────────────────────────
295
+ {
296
+ code: 'quest-talk-wason',
297
+ order: 0,
298
+ speaker: 'Wason',
299
+ text: 'Wanderer! Glad you stopped by. I need a favor — nothing dangerous... mostly.',
300
+ mood: 'happy',
301
+ },
302
+ {
303
+ code: 'quest-talk-wason',
304
+ order: 1,
305
+ speaker: 'Wason',
306
+ text: "First, find Alex — she's been surveying the nodes east of here. Then gather a hatchet for me.",
307
+ mood: 'neutral',
308
+ },
309
+ {
310
+ code: 'quest-talk-wason',
311
+ order: 2,
312
+ speaker: 'Wason',
313
+ text: 'And one more thing: the SCP-2040 anomalies are overrunning my trade routes. Deal with two of them.',
314
+ mood: 'sad',
315
+ },
316
+ {
317
+ code: 'quest-talk-alex',
318
+ order: 0,
319
+ speaker: 'Alex',
320
+ text: "Wason sent you? Good. The portal anomalies are getting worse. I've logged what I can.",
321
+ mood: 'neutral',
322
+ },
323
+ {
324
+ code: 'quest-talk-alex',
325
+ order: 1,
326
+ speaker: 'Alex',
327
+ text: 'Tell Wason: the source is somewhere in the deeper nodes. The registry does not lie.',
328
+ mood: 'neutral',
329
+ },
330
+ ];
331
+
332
+ /**
333
+ * Default action catalog — provide base metadata default actions,
334
+ * this provide for entities dynamicaale match when init instance init x and init y
335
+ * positions of entitie for the fallback world or custom instance, and seed dialogue
336
+ * for quest-talk actions.
337
+ *
338
+ * type values: 'quest-talk' | 'shop' | 'craft' | 'storage'
339
+ * dialogCode: General-purpose default dialogue opened for this action
340
+ * (any action type). Used as the immediate greeting/intro.
341
+ * questDialogueCodes: Ordered list of CyberiaDialogue codes that must be
342
+ * completed (in sequence) to satisfy quest-talk step
343
+ * validation. Distinct from dialogCode — for simple
344
+ * actions they may overlap; for multi-stage quests they
345
+ * can diverge.
346
+ * is completed. Empty string = no quest granted.
347
+ */
348
+ const DefaultCyberiaActions = [
349
+ {
350
+ code: 'wason-quest-intro',
351
+ type: 'quest-talk',
352
+ label: 'Quest',
353
+ provideItemId: 'wason',
354
+ grantQuestCode: 'fallback-intro-quest',
355
+ dialogCode: 'quest-talk-wason',
356
+ questDialogueCodes: ['quest-talk-wason'],
357
+ },
358
+ {
359
+ code: 'alex-quest-talk',
360
+ type: 'quest-talk',
361
+ label: 'Quest Talk',
362
+ provideItemId: 'alex',
363
+ grantQuestCode: '',
364
+ dialogCode: 'quest-talk-alex',
365
+ questDialogueCodes: ['quest-talk-alex'],
366
+ },
367
+ {
368
+ code: 'agent-mission-brief',
369
+ type: 'quest-talk',
370
+ label: 'Mission Brief',
371
+ provideItemId: 'agent',
372
+ grantQuestCode: 'bounty-quest-alpha',
373
+ dialogCode: 'default-agent',
374
+ questDialogueCodes: ['default-agent'],
375
+ },
376
+ {
377
+ code: 'wason-bounty-brief',
378
+ type: 'quest-talk',
379
+ label: 'Bounty Brief',
380
+ provideItemId: 'wason',
381
+ grantQuestCode: '',
382
+ dialogCode: 'quest-talk-wason',
383
+ questDialogueCodes: ['quest-talk-wason'],
384
+ },
385
+ ];
386
+
387
+ /**
388
+ * Default quest definitions for the fallback world.
389
+ * Mirrors the CyberiaQuestSchema.
390
+ *
391
+ * Objective types:
392
+ * 'talk' — itemId = provideItemId of the NPC to interact with
393
+ * 'collect' — itemId = item to receive in inventory; quantity = amount
394
+ * 'kill' — itemId = entity skin itemId; quantity = kill count
395
+ *
396
+ */
397
+ const DefaultCyberiaQuests = [
398
+ {
399
+ code: 'fallback-intro-quest',
400
+ title: "The Wanderer's Task",
401
+ description: 'Help Wason restore order to the fractured nodes.',
402
+ prerequisiteCodes: [],
403
+ unlocksQuestCodes: ['bounty-quest-alpha'],
404
+ steps: [
405
+ {
406
+ id: 'step-talk-alex',
407
+ description: 'Find Alex and hear her report on the portal anomalies.',
408
+ objectives: [{ type: 'talk', itemId: 'alex', quantity: 1 }],
409
+ },
410
+ {
411
+ id: 'step-collect-hatchet',
412
+ description: 'Obtain a hatchet for Wason.',
413
+ objectives: [{ type: 'collect', itemId: 'hatchet', quantity: 1 }],
414
+ },
415
+ {
416
+ id: 'step-kill-scp',
417
+ description: 'Eliminate SCP-2040 anomalies threatening the trade routes.',
418
+ objectives: [{ type: 'kill', itemId: 'scp-2040', quantity: 2 }],
419
+ },
420
+ ],
421
+ rewards: [{ itemId: 'coin', quantity: 50 }],
422
+ },
423
+ {
424
+ // Second quest: exercises all step types in a different order (kill → collect → talk).
425
+ // Unlocked automatically after completing fallback-intro-quest.
426
+ code: 'bounty-quest-alpha',
427
+ title: 'Alpha Bounty',
428
+ description: 'A field test: eliminate a threat, claim your reward, then report back.',
429
+ prerequisiteCodes: ['fallback-intro-quest'],
430
+ unlocksQuestCodes: [],
431
+ steps: [
432
+ {
433
+ id: 'step-kill-first',
434
+ description: 'Eliminate the SCP-2040 threat.',
435
+ objectives: [{ type: 'kill', itemId: 'scp-2040', quantity: 1 }],
436
+ },
437
+ {
438
+ id: 'step-collect-reward',
439
+ description: 'Collect the bounty coin drop.',
440
+ objectives: [{ type: 'collect', itemId: 'coin', quantity: 10 }],
441
+ },
442
+ {
443
+ id: 'step-report-wason',
444
+ description: 'Report back to Wason.',
445
+ objectives: [{ type: 'talk', itemId: 'wason', quantity: 1 }],
446
+ },
447
+ ],
448
+ rewards: [{ itemId: 'hatchet', quantity: 1 }],
449
+ },
221
450
  ];
222
451
 
223
- export { CyberiaDependencies, DefaultCyberiaItems, DefaultSkillConfig, DefaultCyberiaDialogues };
452
+ export {
453
+ ITEM_TYPES,
454
+ ENTITY_TYPES,
455
+ ENTITY_TYPE_TO_ITEM_TYPES,
456
+ QUEST_STEPS_TYPES,
457
+ CYBERIA_ACTION_TYPES,
458
+ getDefaultCyberiaItemById,
459
+ getDefaultCyberiaItemsByItemType,
460
+ getDefaultCyberiaItemsByEntityType,
461
+ CyberiaDependencies,
462
+ DefaultCyberiaItems,
463
+ DefaultSkillConfig,
464
+ DefaultCyberiaDialogues,
465
+ DefaultCyberiaActions,
466
+ DefaultCyberiaQuests,
467
+ };
@@ -195,11 +195,11 @@ const CssCommonCyberia = async () => {
195
195
  <div class="ag-grid-style"></div>`;
196
196
  };
197
197
 
198
- const CssCyberiaDark = {
199
- theme: 'cyberia-dark',
200
- dark: true,
201
- barButtonsIconTheme: 'img',
202
- render: async () => {
198
+ class CssCyberiaDark {
199
+ static theme = 'cyberia-dark';
200
+ static dark = true;
201
+ static barButtonsIconTheme = 'img';
202
+ static render = async () => {
203
203
  return (
204
204
  (await CssCommonCyberia()) +
205
205
  html`
@@ -219,14 +219,14 @@ const CssCyberiaDark = {
219
219
  ${borderChar(2, `#ffcc00`, ['.default-slide-menu-top-bar-fix-title-container-text'])}
220
220
  `
221
221
  );
222
- },
223
- };
224
-
225
- const CssCyberiaLight = {
226
- theme: 'cyberia-light',
227
- dark: false,
228
- barButtonsIconTheme: 'img',
229
- render: async () => {
222
+ };
223
+ }
224
+
225
+ class CssCyberiaLight {
226
+ static theme = 'cyberia-light';
227
+ static dark = false;
228
+ static barButtonsIconTheme = 'img';
229
+ static render = async () => {
230
230
  return (
231
231
  (await CssCommonCyberia()) +
232
232
  html`
@@ -248,7 +248,7 @@ const CssCyberiaLight = {
248
248
  ${borderChar(1, `#010101`, ['button', '.a-btn'], true)}
249
249
  `
250
250
  );
251
- },
252
- };
251
+ };
252
+ }
253
253
 
254
254
  export { CssCyberiaDark, CssCommonCyberia, CssCyberiaLight };
@@ -4,16 +4,18 @@ import { s } from '../core/VanillaJs.js';
4
4
  import { AppStoreCyberiaPortal } from './AppStoreCyberiaPortal.js';
5
5
  import { ObjectLayerManagement } from '../../services/object-layer/object-layer.management.js';
6
6
 
7
- const LogInCyberiaPortal = async function () {
8
- LogIn.Event['LogInCyberiaPortal'] = async (options) => {
7
+ class LogInCyberiaPortal {
8
+ static async instance() {
9
+ LogIn.onLogin(async (options) => {
9
10
  const { token, user } = options;
10
11
 
11
12
  AppStoreCyberiaPortal.Data.user.main.model.user = user;
12
13
 
13
14
  await ObjectLayerManagement.Reload('viewer');
14
- };
15
+ }, { key: 'LogInCyberiaPortal' });
15
16
  const { user } = await Auth.sessionIn();
16
17
  AppStoreCyberiaPortal.Data.user.main.model.user = user;
17
- };
18
+ }
19
+ }
18
20
 
19
21
  export { LogInCyberiaPortal };
@@ -3,12 +3,14 @@ import { s } from '../core/VanillaJs.js';
3
3
  import { AppStoreCyberiaPortal } from './AppStoreCyberiaPortal.js';
4
4
  import { ObjectLayerManagement } from '../../services/object-layer/object-layer.management.js';
5
5
 
6
- const LogOutCyberiaPortal = async function () {
7
- LogOut.Event['LogOutCyberiaPortal'] = async (result = { user: { _id: '' } }) => {
6
+ class LogOutCyberiaPortal {
7
+ static async instance() {
8
+ LogOut.onLogout(async (result = { user: { _id: '' } }) => {
8
9
  AppStoreCyberiaPortal.Data.user.main.model.user = result.user;
9
10
  s(`.main-btn-admin`).classList.add('hide');
10
11
  await ObjectLayerManagement.Reload('viewer');
11
- };
12
- };
12
+ }, { key: 'LogOutCyberiaPortal' });
13
+ }
14
+ }
13
15
 
14
16
  export { LogOutCyberiaPortal };
@@ -3,8 +3,8 @@ import { EventsUI } from '../core/EventsUI.js';
3
3
  import { getProxyPath } from '../core/Router.js';
4
4
  import { htmls, s } from '../core/VanillaJs.js';
5
5
 
6
- const MainBodyCyberiaPortal = {
7
- Render: async function () {
6
+ class MainBodyCyberiaPortal {
7
+ static async instance() {
8
8
  setTimeout(() => {
9
9
  EventsUI.onClick('.cta-button', () => {
10
10
  console.log('Enter the world button clicked');
@@ -280,7 +280,7 @@ const MainBodyCyberiaPortal = {
280
280
  </footer>
281
281
  </div>
282
282
  `;
283
- },
284
- };
283
+ }
284
+ }
285
285
 
286
286
  export { MainBodyCyberiaPortal };