cyberia 3.1.3 → 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 (377) hide show
  1. package/.env.example +0 -2
  2. package/.github/workflows/engine-cyberia.cd.yml +10 -8
  3. package/.github/workflows/engine-cyberia.ci.yml +12 -29
  4. package/.github/workflows/ghpkg.ci.yml +4 -4
  5. package/.github/workflows/npmpkg.ci.yml +28 -11
  6. package/.github/workflows/publish.ci.yml +21 -2
  7. package/.github/workflows/pwa-microservices-template-page.cd.yml +4 -5
  8. package/.github/workflows/pwa-microservices-template-test.ci.yml +3 -3
  9. package/.github/workflows/release.cd.yml +14 -10
  10. package/CHANGELOG.md +783 -1
  11. package/CLI-HELP.md +95 -18
  12. package/Dockerfile +0 -2
  13. package/README.md +290 -220
  14. package/bin/build.js +24 -7
  15. package/bin/cyberia.js +2838 -252
  16. package/bin/deploy.js +747 -125
  17. package/bin/file.js +9 -0
  18. package/bin/index.js +2838 -252
  19. package/bin/vs.js +1 -1
  20. package/conf.js +99 -65
  21. package/deployment.yaml +18 -164
  22. package/hardhat/hardhat.config.js +13 -13
  23. package/hardhat/ignition/modules/ObjectLayerToken.js +1 -1
  24. package/hardhat/package-lock.json +2559 -5864
  25. package/hardhat/package.json +14 -23
  26. package/hardhat/scripts/deployObjectLayerToken.js +1 -1
  27. package/hardhat/test/ObjectLayerToken.js +4 -2
  28. package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
  29. package/hardhat/types/ethers-contracts/common.ts +92 -0
  30. package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
  31. package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
  32. package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
  33. package/hardhat/types/ethers-contracts/index.ts +6 -0
  34. package/jsconfig.json +1 -1
  35. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +6 -5
  36. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +6 -5
  37. package/manifests/deployment/dd-cyberia-development/deployment.yaml +18 -164
  38. package/manifests/deployment/dd-cyberia-development/proxy.yaml +7 -79
  39. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  40. package/manifests/deployment/dd-test-development/deployment.yaml +112 -28
  41. package/manifests/deployment/dd-test-development/proxy.yaml +46 -1
  42. package/manifests/deployment/playwright/deployment.yaml +1 -1
  43. package/nodemon.json +1 -1
  44. package/package.json +39 -24
  45. package/proxy.yaml +7 -79
  46. package/scripts/k3s-node-setup.sh +2 -2
  47. package/scripts/nat-iptables.sh +103 -18
  48. package/scripts/rhel-grpc-setup.sh +56 -0
  49. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +58 -14
  50. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +23 -14
  51. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
  52. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +148 -20
  53. package/src/api/core/core.controller.js +10 -10
  54. package/src/api/core/core.service.js +10 -10
  55. package/src/api/crypto/crypto.controller.js +8 -8
  56. package/src/api/crypto/crypto.service.js +8 -8
  57. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  58. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  59. package/src/api/cyberia-action/cyberia-action.router.js +27 -0
  60. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  61. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +93 -0
  62. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
  63. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +29 -0
  64. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +51 -0
  65. package/src/api/cyberia-entity/cyberia-entity.controller.js +74 -0
  66. package/src/api/cyberia-entity/cyberia-entity.model.js +24 -0
  67. package/src/api/cyberia-entity/cyberia-entity.router.js +27 -0
  68. package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
  69. package/src/api/cyberia-instance/cyberia-fallback-world.js +178 -0
  70. package/src/api/cyberia-instance/cyberia-instance.controller.js +92 -0
  71. package/src/api/cyberia-instance/cyberia-instance.model.js +87 -0
  72. package/src/api/cyberia-instance/cyberia-instance.router.js +63 -0
  73. package/src/api/cyberia-instance/cyberia-instance.service.js +156 -0
  74. package/src/api/cyberia-instance/cyberia-portal-connector.js +260 -0
  75. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  76. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +74 -0
  77. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +574 -0
  78. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +231 -0
  79. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +27 -0
  80. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +46 -0
  81. package/src/api/cyberia-map/cyberia-map.controller.js +79 -0
  82. package/src/api/cyberia-map/cyberia-map.model.js +30 -0
  83. package/src/api/cyberia-map/cyberia-map.router.js +40 -0
  84. package/src/api/cyberia-map/cyberia-map.service.js +74 -0
  85. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  86. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  87. package/src/api/cyberia-quest/cyberia-quest.router.js +27 -0
  88. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  89. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  90. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  91. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +27 -0
  92. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  93. package/src/api/default/default.controller.js +10 -10
  94. package/src/api/default/default.service.js +10 -10
  95. package/src/api/document/document.controller.js +12 -12
  96. package/src/api/document/document.model.js +10 -16
  97. package/src/api/file/file.controller.js +8 -8
  98. package/src/api/file/file.model.js +10 -10
  99. package/src/api/file/file.ref.json +18 -0
  100. package/src/api/file/file.service.js +36 -36
  101. package/src/api/instance/instance.controller.js +10 -10
  102. package/src/api/instance/instance.model.js +4 -10
  103. package/src/api/instance/instance.service.js +10 -10
  104. package/src/api/ipfs/ipfs.controller.js +15 -36
  105. package/src/api/ipfs/ipfs.model.js +47 -47
  106. package/src/api/ipfs/ipfs.router.js +8 -13
  107. package/src/api/ipfs/ipfs.service.js +67 -129
  108. package/src/api/object-layer/object-layer.controller.js +12 -12
  109. package/src/api/object-layer/object-layer.model.js +4 -17
  110. package/src/api/object-layer/object-layer.router.js +30 -0
  111. package/src/api/object-layer/object-layer.service.js +126 -43
  112. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  113. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  114. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +18 -14
  115. package/src/api/test/test.controller.js +8 -8
  116. package/src/api/test/test.service.js +8 -8
  117. package/src/api/user/guest.service.js +99 -0
  118. package/src/api/user/user.controller.js +6 -6
  119. package/src/api/user/user.model.js +8 -13
  120. package/src/api/user/user.service.js +11 -27
  121. package/src/cli/cluster.js +68 -21
  122. package/src/cli/db.js +753 -825
  123. package/src/cli/deploy.js +215 -125
  124. package/src/cli/env.js +29 -0
  125. package/src/cli/fs.js +82 -8
  126. package/src/cli/image.js +43 -1
  127. package/src/cli/index.js +74 -3
  128. package/src/cli/kubectl.js +211 -0
  129. package/src/cli/release.js +340 -0
  130. package/src/cli/repository.js +475 -74
  131. package/src/cli/run.js +582 -43
  132. package/src/cli/secrets.js +73 -0
  133. package/src/cli/ssh.js +1 -1
  134. package/src/cli/static.js +43 -115
  135. package/src/cli/test.js +3 -3
  136. package/src/client/Cryptokoyn.index.js +18 -22
  137. package/src/client/CyberiaPortal.index.js +19 -24
  138. package/src/client/Default.index.js +21 -34
  139. package/src/client/Itemledger.index.js +20 -27
  140. package/src/client/Underpost.index.js +19 -24
  141. package/src/client/components/core/404.js +4 -4
  142. package/src/client/components/core/500.js +4 -4
  143. package/src/client/components/core/Account.js +73 -60
  144. package/src/client/components/core/AgGrid.js +23 -33
  145. package/src/client/components/core/Alert.js +12 -13
  146. package/src/client/components/core/AppStore.js +69 -0
  147. package/src/client/components/core/Auth.js +35 -37
  148. package/src/client/components/core/Badge.js +7 -13
  149. package/src/client/components/core/BtnIcon.js +15 -17
  150. package/src/client/components/core/CalendarCore.js +43 -64
  151. package/src/client/components/core/Chat.js +13 -15
  152. package/src/client/components/core/ClientEvents.js +87 -0
  153. package/src/client/components/core/ColorPaletteElement.js +309 -0
  154. package/src/client/components/core/Content.js +17 -14
  155. package/src/client/components/core/Css.js +15 -71
  156. package/src/client/components/core/CssCore.js +12 -16
  157. package/src/client/components/core/D3Chart.js +4 -4
  158. package/src/client/components/core/Docs.js +64 -91
  159. package/src/client/components/core/DropDown.js +194 -96
  160. package/src/client/components/core/EventBus.js +92 -0
  161. package/src/client/components/core/EventsUI.js +14 -17
  162. package/src/client/components/core/FileExplorer.js +96 -228
  163. package/src/client/components/core/FullScreen.js +47 -75
  164. package/src/client/components/core/Input.js +24 -69
  165. package/src/client/components/core/Keyboard.js +26 -19
  166. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  167. package/src/client/components/core/LoadingAnimation.js +25 -31
  168. package/src/client/components/core/LogIn.js +43 -43
  169. package/src/client/components/core/LogOut.js +25 -16
  170. package/src/client/components/core/Modal.js +462 -179
  171. package/src/client/components/core/NotificationManager.js +14 -18
  172. package/src/client/components/core/Panel.js +54 -51
  173. package/src/client/components/core/PanelForm.js +44 -144
  174. package/src/client/components/core/Polyhedron.js +110 -214
  175. package/src/client/components/core/PublicProfile.js +39 -32
  176. package/src/client/components/core/Recover.js +48 -44
  177. package/src/client/components/core/Responsive.js +88 -32
  178. package/src/client/components/core/RichText.js +9 -18
  179. package/src/client/components/core/Router.js +24 -3
  180. package/src/client/components/core/SearchBox.js +37 -37
  181. package/src/client/components/core/SignUp.js +39 -30
  182. package/src/client/components/core/SocketIo.js +112 -30
  183. package/src/client/components/core/SocketIoHandler.js +75 -0
  184. package/src/client/components/core/Stream.js +143 -95
  185. package/src/client/components/core/ToggleSwitch.js +8 -20
  186. package/src/client/components/core/ToolTip.js +5 -17
  187. package/src/client/components/core/Translate.js +56 -59
  188. package/src/client/components/core/Validator.js +26 -16
  189. package/src/client/components/core/Wallet.js +15 -26
  190. package/src/client/components/core/Webhook.js +40 -7
  191. package/src/client/components/core/Worker.js +163 -27
  192. package/src/client/components/core/windowGetDimensions.js +7 -7
  193. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +59 -59
  194. package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
  195. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  196. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +9 -7
  197. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +8 -6
  198. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  199. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  200. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  201. package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +3 -51
  202. package/src/client/components/cyberia/InstanceEngineCyberia.js +781 -0
  203. package/src/client/components/cyberia/MapEngineCyberia.js +1836 -2
  204. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  205. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1220 -99
  206. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +252 -316
  207. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +136 -103
  208. package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
  209. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +462 -32
  210. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  211. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +9 -7
  212. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +8 -6
  213. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  214. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  215. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  216. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  217. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +3 -49
  218. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -4
  219. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +91 -91
  220. package/src/client/components/default/AppStoreDefault.js +5 -0
  221. package/src/client/components/default/CssDefault.js +12 -12
  222. package/src/client/components/default/LogInDefault.js +9 -7
  223. package/src/client/components/default/LogOutDefault.js +8 -6
  224. package/src/client/components/default/RouterDefault.js +47 -0
  225. package/src/client/components/default/SettingsDefault.js +4 -4
  226. package/src/client/components/default/SignUpDefault.js +6 -4
  227. package/src/client/components/default/SocketIoDefault.js +3 -51
  228. package/src/client/components/default/TranslateDefault.js +3 -3
  229. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +59 -59
  230. package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
  231. package/src/client/components/itemledger/CssItemledger.js +15 -15
  232. package/src/client/components/itemledger/LogInItemledger.js +9 -7
  233. package/src/client/components/itemledger/LogOutItemledger.js +8 -6
  234. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  235. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  236. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  237. package/src/client/components/itemledger/SocketIoItemledger.js +3 -51
  238. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  239. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +92 -92
  240. package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
  241. package/src/client/components/underpost/CssUnderpost.js +14 -14
  242. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  243. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  244. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  245. package/src/client/components/underpost/LogInUnderpost.js +9 -7
  246. package/src/client/components/underpost/LogOutUnderpost.js +8 -6
  247. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  248. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  249. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  250. package/src/client/components/underpost/SocketIoUnderpost.js +3 -51
  251. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  252. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  253. package/src/client/public/cyberia-docs/ARCHITECTURE.md +443 -0
  254. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
  255. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
  256. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -0
  257. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  258. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  259. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  260. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  261. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  262. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  263. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  264. package/src/client/services/core/core.service.js +35 -55
  265. package/src/client/services/crypto/crypto.service.js +8 -13
  266. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  267. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +99 -0
  268. package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
  269. package/src/client/services/cyberia-entity/cyberia-entity.service.js +99 -0
  270. package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
  271. package/src/client/services/cyberia-instance/cyberia-instance.service.js +116 -0
  272. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +99 -0
  273. package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
  274. package/src/client/services/cyberia-map/cyberia-map.service.js +120 -0
  275. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  276. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  277. package/src/client/services/default/default.management.js +159 -267
  278. package/src/client/services/default/default.service.js +10 -16
  279. package/src/client/services/document/document.service.js +14 -19
  280. package/src/client/services/file/file.service.js +8 -13
  281. package/src/client/services/instance/instance.management.js +6 -6
  282. package/src/client/services/instance/instance.service.js +10 -15
  283. package/src/client/services/ipfs/ipfs.service.js +14 -40
  284. package/src/client/services/object-layer/object-layer.management.js +14 -14
  285. package/src/client/services/object-layer/object-layer.service.js +39 -24
  286. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  287. package/src/client/services/test/test.service.js +8 -13
  288. package/src/client/services/user/guest.service.js +86 -0
  289. package/src/client/services/user/user.management.js +6 -6
  290. package/src/client/services/user/user.service.js +14 -20
  291. package/src/client/ssr/body/404.js +3 -3
  292. package/src/client/ssr/body/500.js +3 -3
  293. package/src/client/ssr/body/CacheControl.js +5 -2
  294. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  295. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  296. package/src/client/ssr/head/PwaItemledger.js +197 -60
  297. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  298. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  299. package/src/client/ssr/offline/Maintenance.js +12 -11
  300. package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
  301. package/src/client/ssr/pages/CyberiaServerMetrics.js +1 -1
  302. package/src/client/ssr/pages/Test.js +2 -2
  303. package/src/client/sw/core.sw.js +212 -0
  304. package/src/grpc/cyberia/grpc-server.js +642 -0
  305. package/src/index.js +24 -1
  306. package/src/runtime/cyberia-client/Dockerfile +80 -0
  307. package/src/runtime/cyberia-server/Dockerfile +37 -0
  308. package/src/runtime/express/Dockerfile +5 -1
  309. package/src/runtime/express/Express.js +18 -1
  310. package/src/runtime/lampp/Dockerfile +17 -5
  311. package/src/runtime/lampp/Lampp.js +27 -4
  312. package/src/runtime/wp/Dockerfile +62 -0
  313. package/src/runtime/wp/Wp.js +639 -0
  314. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  315. package/src/server/auth.js +24 -1
  316. package/src/server/backup.js +37 -9
  317. package/src/server/client-build-docs.js +52 -46
  318. package/src/server/client-build.js +356 -82
  319. package/src/server/client-formatted.js +140 -57
  320. package/src/server/conf.js +29 -13
  321. package/src/server/cron.js +25 -23
  322. package/src/server/data-query.js +32 -20
  323. package/src/server/dns.js +24 -1
  324. package/src/server/ipfs-client.js +253 -89
  325. package/src/server/object-layer.js +150 -114
  326. package/src/server/peer.js +8 -0
  327. package/src/server/process.js +13 -27
  328. package/src/server/runtime.js +25 -1
  329. package/src/server/semantic-layer-generator-floor.js +319 -0
  330. package/src/server/semantic-layer-generator-resource.js +259 -0
  331. package/src/server/semantic-layer-generator-skin.js +1164 -0
  332. package/src/server/semantic-layer-generator.js +211 -542
  333. package/src/server/shape-generator.js +108 -0
  334. package/src/server/start.js +19 -5
  335. package/src/server/valkey.js +141 -235
  336. package/src/ws/IoInterface.js +1 -10
  337. package/src/ws/IoServer.js +14 -33
  338. package/src/ws/core/channels/core.ws.chat.js +65 -20
  339. package/src/ws/core/channels/core.ws.mailer.js +113 -32
  340. package/src/ws/core/channels/core.ws.stream.js +90 -31
  341. package/src/ws/core/core.ws.connection.js +12 -33
  342. package/src/ws/core/core.ws.emit.js +10 -26
  343. package/src/ws/core/core.ws.server.js +25 -58
  344. package/src/ws/default/channels/default.ws.main.js +53 -12
  345. package/src/ws/default/default.ws.connection.js +26 -13
  346. package/src/ws/default/default.ws.server.js +30 -12
  347. package/tsconfig.docs.json +15 -0
  348. package/typedoc.dd-cyberia.json +29 -0
  349. package/typedoc.json +29 -0
  350. package/WHITE-PAPER.md +0 -1540
  351. package/hardhat/README.md +0 -531
  352. package/hardhat/WHITE-PAPER.md +0 -1540
  353. package/jsdoc.dd-cyberia.json +0 -59
  354. package/jsdoc.json +0 -59
  355. package/src/api/object-layer/README.md +0 -347
  356. package/src/client/components/core/ColorPalette.js +0 -5267
  357. package/src/client/components/core/JoyStick.js +0 -80
  358. package/src/client/components/cryptokoyn/CommonCryptokoyn.js +0 -29
  359. package/src/client/components/cryptokoyn/ElementsCryptokoyn.js +0 -38
  360. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  361. package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +0 -38
  362. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -58
  363. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  364. package/src/client/components/default/ElementsDefault.js +0 -38
  365. package/src/client/components/default/RoutesDefault.js +0 -49
  366. package/src/client/components/itemledger/CommonItemledger.js +0 -29
  367. package/src/client/components/itemledger/ElementsItemledger.js +0 -38
  368. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  369. package/src/client/components/underpost/CommonUnderpost.js +0 -29
  370. package/src/client/components/underpost/ElementsUnderpost.js +0 -38
  371. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  372. package/src/client/sw/default.sw.js +0 -127
  373. package/src/client/sw/template.sw.js +0 -84
  374. package/src/ws/core/management/core.ws.chat.js +0 -8
  375. package/src/ws/core/management/core.ws.mailer.js +0 -16
  376. package/src/ws/core/management/core.ws.stream.js +0 -8
  377. package/src/ws/default/management/default.ws.main.js +0 -8
@@ -0,0 +1,574 @@
1
+ /**
2
+ * Canonical default values and type definitions for a CyberiaInstanceConf document.
3
+ *
4
+ * Canonical config defaults used by:
5
+ * - cyberia-instance-conf.model.js — Mongoose schema `default:` declarations
6
+ * - grpc-server.js — FALLBACK_CONFIG_DEFAULTS for missing instances
7
+ *
8
+ * The canonical entity-type ↔ item-type relationship lives in:
9
+ * - src/client/components/cyberia-portal/CommonCyberiaPortal.js
10
+ *
11
+ * This file derives its item/entity type enums from that shared module.
12
+ *
13
+ * @module src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js
14
+ */
15
+
16
+ import {
17
+ ITEM_TYPES as SHARED_ITEM_TYPES,
18
+ ENTITY_TYPES as SHARED_ENTITY_TYPES,
19
+ } from '../../client/components/cyberia-portal/CommonCyberiaPortal.js';
20
+
21
+ // ── Item type registry ───────────────────────────────────────────────────────
22
+ /**
23
+ * Canonical set of ObjectLayer item type names, used as asset directory names
24
+ * and as the `data.item.type` discriminator on ObjectLayer documents.
25
+ *
26
+ * Values intentionally equal their keys — the object is an enum of valid
27
+ * strings, NOT an integer→z-index map. Render layer ordering (z-order) is
28
+ * determined separately by `get_priority_for_type()` in entity_render.c.
29
+ *
30
+ * @constant
31
+ * @type {Readonly<Record<string, string>>}
32
+ */
33
+ export const ITEM_TYPES = SHARED_ITEM_TYPES;
34
+ export const ENTITY_TYPES = SHARED_ENTITY_TYPES;
35
+
36
+ // ── Entity Status Indicator (ESI) registry ───────────────────────────────────
37
+ /**
38
+ * Canonical mapping of server-computed entity status icon IDs to the ui-icon
39
+ * filename stem served from /assets/ui-icons/{iconId}.png.
40
+ *
41
+ * The Go server assigns a status u8 per entity each AOI tick. The C client
42
+ * receives this mapping dynamically via init_data.statusIcons and uses it to
43
+ * resolve the u8 to an icon filename at runtime. This JS-side copy is the
44
+ * configuration source of truth; it supports instance-specific icon overrides.
45
+ *
46
+ * Industry standard name: "Overhead Status Indicator" (OSI).
47
+ * WoW: nameplate colour + debuff icons
48
+ * FFXIV: enmity/claim icons (red ◆, yellow ●)
49
+ * UO: skull for murderers, shield for invulnerables
50
+ *
51
+ * IMPORTANT: The numeric IDs MUST stay in sync with:
52
+ * - Go: cyberia-server/src/entity_status.go (StatusNone … StatusResourceExtracted)
53
+ *
54
+ * @constant
55
+ */
56
+ export const STATUS_ICONS = Object.freeze([
57
+ {
58
+ id: 0,
59
+ name: 'none',
60
+ iconId: null,
61
+ bounce: false,
62
+ borderColor: { r: 70, g: 70, b: 120, a: 200 },
63
+ description: 'No icon (skill/coin bots, world objects)',
64
+ },
65
+ {
66
+ id: 1,
67
+ name: 'passive',
68
+ iconId: 'arrow-down-gray',
69
+ bounce: false,
70
+ borderColor: { r: 130, g: 140, b: 160, a: 200 },
71
+ description: 'Passive bot — no weapon, non-aggressive',
72
+ },
73
+ {
74
+ id: 2,
75
+ name: 'hostile',
76
+ iconId: 'arrow-down-red',
77
+ bounce: true,
78
+ borderColor: { r: 210, g: 50, b: 50, a: 240 },
79
+ description: 'Hostile bot — has weapon, will aggro',
80
+ },
81
+ {
82
+ id: 3,
83
+ name: 'frozen',
84
+ iconId: 'chat',
85
+ bounce: true,
86
+ borderColor: { r: 80, g: 160, b: 220, a: 240 },
87
+ description: 'Player in FrozenInteractionState (modal open)',
88
+ },
89
+ {
90
+ id: 4,
91
+ name: 'player',
92
+ iconId: 'arrow-down',
93
+ bounce: false,
94
+ borderColor: { r: 60, g: 190, b: 90, a: 240 },
95
+ description: 'Normal player — alive, not frozen',
96
+ },
97
+ {
98
+ id: 5,
99
+ name: 'dead',
100
+ iconId: 'skull',
101
+ bounce: false,
102
+ borderColor: { r: 160, g: 130, b: 200, a: 200 },
103
+ description: 'Entity is dead / respawning',
104
+ },
105
+ {
106
+ id: 6,
107
+ name: 'resource',
108
+ iconId: 'arrow-down-gray',
109
+ bounce: false,
110
+ borderColor: { r: 100, g: 180, b: 80, a: 220 },
111
+ description: 'Resource entity — static, exploitable (wood, minerals, etc.)',
112
+ },
113
+ {
114
+ id: 7,
115
+ name: 'resource-extracted',
116
+ iconId: 'clock',
117
+ bounce: false,
118
+ borderColor: { r: 160, g: 130, b: 200, a: 200 },
119
+ description: 'Resource entity extracted/depleted (dead state)',
120
+ },
121
+ {
122
+ id: 8,
123
+ name: 'action-provider',
124
+ iconId: 'chat',
125
+ bounce: true,
126
+ borderColor: { r: 220, g: 190, b: 60, a: 240 },
127
+ description: 'Bot with available quest-talk/shop/storage/craft actions',
128
+ },
129
+ ]);
130
+
131
+ // ── Equipment rules ──────────────────────────────────────────────────────────
132
+ /**
133
+ * Equipment rules govern which ObjectLayer item types can be simultaneously
134
+ * active on a character entity and enforce the one-active-per-type constraint.
135
+ *
136
+ * The server validates every item_activation request against these rules:
137
+ * 1. Only item types listed in `activeItemTypes` may be activated.
138
+ * 2. When `onePerType` is true (default), activating an item of a given type
139
+ * automatically deactivates any other active item of the same type.
140
+ * 3. When `requireSkin` is true, the player must always have at least one
141
+ * active skin if they own any skin-type items.
142
+ *
143
+ * Item types NOT listed in `activeItemTypes` (e.g. 'coin', 'floor') are
144
+ * considered non-activable and their activation requests are rejected.
145
+ *
146
+ * @constant
147
+ * @type {Readonly<{activeItemTypes:string[], onePerType:boolean, requireSkin:boolean}>}
148
+ */
149
+ export const EQUIPMENT_RULES_DEFAULTS = Object.freeze({
150
+ // Item types that players are allowed to activate (equip).
151
+ // Types not in this list are non-activable (coins, floors, etc.).
152
+ activeItemTypes: [ITEM_TYPES.skin, ITEM_TYPES.breastplate, ITEM_TYPES.weapon],
153
+ // Enforce at most one active item per item type.
154
+ onePerType: true,
155
+ // Require at least one active skin when the player owns any skin.
156
+ requireSkin: true,
157
+ });
158
+
159
+ // ── Entity type defaults ─────────────────────────────────────────────────────
160
+ /**
161
+ * Per-entity-type rendering defaults.
162
+ *
163
+ * Each entry defines the canonical visual configuration for ONE entity type:
164
+ *
165
+ * entityType — string used by the Go server and C client to identify the
166
+ * entity category (matches entity_type_str in game_render.c
167
+ * and Behavior for bot sub-types).
168
+ * liveItemIds — Array of ObjectLayer item IDs applied when the entity is
169
+ * alive/active and no explicit items are assigned. Empty array =
170
+ * no OL fallback, rely on colorKey solid fill.
171
+ * deadItemIds — Array of ObjectLayer item IDs for the dead / ghost / respawning
172
+ * state. Empty array = no dead-state OL; same solid fill as live.
173
+ * Replaces the old flat ghostItemId field for players.
174
+ * dropItemIds — Array of ObjectLayer item IDs granted to the extractor when
175
+ * a resource-type entity is depleted. These are inventory/drop
176
+ * items only and are NOT auto-activated on the entity itself.
177
+ * colorKey — Named palette colour key (see colors in CYBERIA_INSTANCE_CONF_DEFAULTS).
178
+ * Used as solid-colour fallback when the entity carries NO active
179
+ * ObjectLayer items, or while atlas textures are still loading.
180
+ * The Go server stamps this colour on every newly spawned entity
181
+ * so the binary AOI stream always carries the correct RGBA.
182
+ *
183
+ * Character entity types:
184
+ * player — the local (self) player
185
+ * other_player — remote players in the AOI
186
+ * bot — AI-controlled entities (behavior: hostile / passive)
187
+ * skill — skill-spawned projectile bot (behavior = "skill");
188
+ * NOT placed in maps — created at runtime by skill_projectile.go
189
+ * when a player/bot triggers a projectile skill.
190
+ * liveItemIds carries the skill-type OL (the projectile sprite).
191
+ * coin — skill-spawned collectible bot (behavior = "coin");
192
+ * NOT placed in maps — dropped at runtime on entity death.
193
+ *
194
+ * World object entity types:
195
+ * floor / obstacle / portal / foreground
196
+ *
197
+ * @constant
198
+ * @type {ReadonlyArray<{entityType:string, liveItemIds:string[], deadItemIds:string[], dropItemIds:string[], colorKey:string}>}
199
+ */
200
+ export const RESOURCE_ENTITY_TYPE_DEFAULTS = Object.freeze([
201
+ Object.freeze({
202
+ entityType: ENTITY_TYPES.resource,
203
+ liveItemIds: ['wood-1'],
204
+ deadItemIds: ['wood-extracted-1'],
205
+ // Until dedicated resource-drop OLs are authored, reuse the wood stack item.
206
+ dropItemIds: ['wood-drop-1'],
207
+ colorKey: 'RESOURCE',
208
+ defaultObjectLayers: [],
209
+ }),
210
+ Object.freeze({
211
+ entityType: ENTITY_TYPES.resource,
212
+ liveItemIds: ['wood-2'],
213
+ deadItemIds: ['wood-extracted-2'],
214
+ dropItemIds: ['wood-drop-2'],
215
+ colorKey: 'RESOURCE',
216
+ defaultObjectLayers: [],
217
+ }),
218
+ ]);
219
+
220
+ export const RESOURCE_ENTITY_TYPE_DEFAULT = RESOURCE_ENTITY_TYPE_DEFAULTS[0];
221
+
222
+ export const ENTITY_TYPE_DEFAULTS = Object.freeze([
223
+ // ── Characters ─────────────────────────────────────────────────────────
224
+ {
225
+ entityType: ENTITY_TYPES.player,
226
+ liveItemIds: ['anon', 'atlas_pistol_mk2'],
227
+ deadItemIds: ['ghost'],
228
+ colorKey: 'PLAYER',
229
+ // Full default ObjectLayer inventory for newly spawned players.
230
+ // active:false items appear in the inventory bar but are not worn.
231
+ // The coin slot is always active:false — coins are non-activable.
232
+ defaultObjectLayers: [
233
+ { itemId: 'anon', active: true, quantity: 1 },
234
+ { itemId: 'atlas_pistol_mk2', active: true, quantity: 1 },
235
+ // { itemId: 'purple', active: false, quantity: 1 },
236
+ { itemId: 'ghost', active: false, quantity: 1 },
237
+ // { itemId: 'gp1', active: false, quantity: 1 },
238
+ // { itemId: 'gp2', active: false, quantity: 1 },
239
+ // { itemId: 'lain', active: false, quantity: 1 },
240
+ // { itemId: 'hatchet', active: false, quantity: 1 },
241
+ // { itemId: 'wason', active: false, quantity: 1 },
242
+ // { itemId: 'scp-2040', active: false, quantity: 1 },
243
+ // { itemId: 'punk', active: false, quantity: 1 },
244
+ // { itemId: 'kaneki', active: false, quantity: 1 },
245
+ // { itemId: 'junko', active: false, quantity: 1 },
246
+ // { itemId: 'eiri', active: false, quantity: 1 },
247
+ // { itemId: 'alex', active: false, quantity: 1 },
248
+ // { itemId: 'agent', active: false, quantity: 1 },
249
+ { itemId: 'coin', active: false, quantity: 0 },
250
+ ],
251
+ },
252
+ {
253
+ entityType: ENTITY_TYPES.other_player,
254
+ liveItemIds: ['anon', 'atlas_pistol_mk2'],
255
+ deadItemIds: ['ghost'],
256
+ colorKey: 'OTHER_PLAYER',
257
+ defaultObjectLayers: [
258
+ { itemId: 'anon', active: true, quantity: 1 },
259
+ { itemId: 'atlas_pistol_mk2', active: true, quantity: 1 },
260
+ // { itemId: 'purple', active: false, quantity: 1 },
261
+ { itemId: 'ghost', active: false, quantity: 1 },
262
+ // { itemId: 'gp1', active: false, quantity: 1 },
263
+ // { itemId: 'gp2', active: false, quantity: 1 },
264
+ // { itemId: 'lain', active: false, quantity: 1 },
265
+ // { itemId: 'hatchet', active: false, quantity: 1 },
266
+ // { itemId: 'wason', active: false, quantity: 1 },
267
+ // { itemId: 'scp-2040', active: false, quantity: 1 },
268
+ // { itemId: 'punk', active: false, quantity: 1 },
269
+ // { itemId: 'kaneki', active: false, quantity: 1 },
270
+ // { itemId: 'junko', active: false, quantity: 1 },
271
+ // { itemId: 'eiri', active: false, quantity: 1 },
272
+ // { itemId: 'alex', active: false, quantity: 1 },
273
+ // { itemId: 'agent', active: false, quantity: 1 },
274
+ { itemId: 'coin', active: false, quantity: 0 },
275
+ ],
276
+ },
277
+ {
278
+ entityType: ENTITY_TYPES.bot,
279
+ liveItemIds: ['purple'],
280
+ deadItemIds: ['ghost'],
281
+ colorKey: 'BOT',
282
+ defaultObjectLayers: [
283
+ { itemId: 'purple', active: true, quantity: 1 },
284
+ { itemId: 'coin', active: false, quantity: 0 },
285
+ ],
286
+ },
287
+ {
288
+ entityType: ENTITY_TYPES.skill,
289
+ liveItemIds: ['atlas_pistol_mk2_bullet'],
290
+ deadItemIds: [],
291
+ colorKey: 'SKILL',
292
+ defaultObjectLayers: [{ itemId: 'atlas_pistol_mk2_bullet', active: true, quantity: 1 }],
293
+ },
294
+ {
295
+ entityType: ENTITY_TYPES.coin,
296
+ liveItemIds: ['coin'],
297
+ deadItemIds: [],
298
+ colorKey: 'COIN',
299
+ defaultObjectLayers: [{ itemId: 'coin', active: true, quantity: 1 }],
300
+ },
301
+ // ── World objects ───────────────────────────────────────────────────────
302
+ {
303
+ entityType: ENTITY_TYPES.floor,
304
+ liveItemIds: ['grass'],
305
+ deadItemIds: [],
306
+ dropItemIds: [],
307
+ colorKey: 'FLOOR',
308
+ defaultObjectLayers: [],
309
+ },
310
+ {
311
+ entityType: ENTITY_TYPES.obstacle,
312
+ liveItemIds: [],
313
+ deadItemIds: [],
314
+ dropItemIds: [],
315
+ colorKey: 'OBSTACLE',
316
+ defaultObjectLayers: [],
317
+ },
318
+ {
319
+ entityType: ENTITY_TYPES.portal,
320
+ liveItemIds: [],
321
+ deadItemIds: [],
322
+ dropItemIds: [],
323
+ colorKey: 'PORTAL',
324
+ defaultObjectLayers: [],
325
+ },
326
+ {
327
+ entityType: ENTITY_TYPES.portal,
328
+ liveItemIds: [],
329
+ deadItemIds: [],
330
+ dropItemIds: [],
331
+ colorKey: 'PORTAL_INTER_PORTAL',
332
+ defaultObjectLayers: [],
333
+ },
334
+ {
335
+ entityType: ENTITY_TYPES.portal,
336
+ liveItemIds: [],
337
+ deadItemIds: [],
338
+ dropItemIds: [],
339
+ colorKey: 'PORTAL_INTER_RANDOM',
340
+ defaultObjectLayers: [],
341
+ },
342
+ {
343
+ entityType: ENTITY_TYPES.portal,
344
+ liveItemIds: [],
345
+ deadItemIds: [],
346
+ dropItemIds: [],
347
+ colorKey: 'PORTAL_INTRA_RANDOM',
348
+ defaultObjectLayers: [],
349
+ },
350
+ {
351
+ entityType: 'portal',
352
+ liveItemIds: [],
353
+ deadItemIds: [],
354
+ dropItemIds: [],
355
+ colorKey: 'PORTAL_INTRA_PORTAL',
356
+ defaultObjectLayers: [],
357
+ },
358
+ {
359
+ entityType: ENTITY_TYPES.foreground,
360
+ liveItemIds: [],
361
+ deadItemIds: [],
362
+ dropItemIds: [],
363
+ colorKey: 'FOREGROUND',
364
+ defaultObjectLayers: [],
365
+ },
366
+ // ── Resource entities ────────────────────────────────────────────
367
+ // Static, exploitable map objects (wood, minerals, organic matter, etc.).
368
+ // liveItemIds render while alive, deadItemIds while depleted, and dropItemIds
369
+ // are transferred to the extractor. On respawn, original live OLs are restored.
370
+ ...RESOURCE_ENTITY_TYPE_DEFAULTS,
371
+ ]);
372
+
373
+ // ── Instance configuration defaults ─────────────────────────────────────────
374
+ export const CYBERIA_INSTANCE_CONF_DEFAULTS = {
375
+ // ── Rendering / camera ─────────────────────────────────────────────
376
+ cellSize: 45,
377
+ fps: 60,
378
+ interpolationMs: 100,
379
+ defaultObjWidth: 1,
380
+ defaultObjHeight: 1,
381
+ cameraSmoothing: 0.1,
382
+ cameraZoom: 1.0,
383
+ defaultWidthScreenFactor: 1,
384
+ defaultHeightScreenFactor: 1,
385
+ devUi: false,
386
+
387
+ /**
388
+ * Named colour palette forwarded to Go server and C client via the WebSocket
389
+ * init payload. Entity colour keys (PLAYER, BOT, SKILL, …) are consumed via
390
+ * entityDefaults[n].colorKey as the solid fallback for that entity type when
391
+ * no ObjectLayer items are assigned.
392
+ * The WEAPON key is kept for UI use (weapon-stat highlights) only.
393
+ */
394
+ colors: [
395
+ // ── World ─────────────────────────────────────────────────────
396
+ { key: 'BACKGROUND', r: 30, g: 30, b: 30, a: 255 }, // rgba(30, 30, 30, 1)
397
+ { key: 'FLOOR_BACKGROUND', r: 45, g: 45, b: 45, a: 255 }, // rgba(45, 45, 45, 1)
398
+ { key: 'FLOOR', r: 60, g: 60, b: 60, a: 255 }, // rgba(60, 60, 60, 1)
399
+ { key: 'OBSTACLE', r: 80, g: 80, b: 80, a: 255 }, // rgba(80, 80, 80, 1)
400
+ { key: 'PORTAL', r: 0, g: 200, b: 200, a: 255 }, // rgba(0, 200, 200, 1) — generic fallback
401
+ { key: 'PORTAL_INTER_PORTAL', r: 0, g: 200, b: 200, a: 255 }, // cyan — to portal on another map
402
+ { key: 'PORTAL_INTER_RANDOM', r: 80, g: 130, b: 255, a: 255 }, // blue — to random pos on another map
403
+ { key: 'PORTAL_INTRA_RANDOM', r: 220, g: 200, b: 50, a: 255 }, // yellow — to random pos on same map
404
+ { key: 'PORTAL_INTRA_PORTAL', r: 200, g: 80, b: 200, a: 255 }, // magenta — to portal on same map
405
+ { key: 'FOREGROUND', r: 255, g: 255, b: 255, a: 189 }, // rgba(255, 255, 255, 0.73)
406
+ // ── Entity solid-colour fallbacks (matched by entityDefaults[n].colorKey) ──
407
+ { key: 'PLAYER', r: 0, g: 255, b: 0, a: 255 }, // rgba(0, 255, 0, 1)
408
+ { key: 'OTHER_PLAYER', r: 128, g: 128, b: 255, a: 255 }, // rgba(128, 128, 255, 1)
409
+ { key: 'BOT', r: 255, g: 128, b: 0, a: 255 }, // rgba(255, 128, 0, 1)
410
+ { key: 'GHOST', r: 200, g: 200, b: 255, a: 100 }, // rgba(200, 200, 255, 0.39)
411
+ { key: 'COIN', r: 255, g: 215, b: 0, a: 255 }, // rgba(255, 215, 0, 1)
412
+ { key: 'SKILL', r: 255, g: 255, b: 50, a: 255 }, // rgba(255, 255, 50, 1)
413
+ { key: 'RESOURCE', r: 100, g: 180, b: 80, a: 255 }, // rgba(100, 180, 80, 1)
414
+ // ── UI-only ────────────────────────────────────────────────────
415
+ { key: 'WEAPON', r: 180, g: 50, b: 50, a: 255 }, // rgba(180, 50, 50, 1)
416
+ // ── Interaction overlay — self-player bubble/panel border ──────
417
+ { key: 'SELF_BORDER', r: 220, g: 190, b: 60, a: 240 }, // rgba(220, 190, 60, 0.94) — gold
418
+ ],
419
+
420
+ // ── World / AOI ────────────────────────────────────────────────────
421
+ aoiRadius: 10,
422
+ portalHoldTimeMs: 1000,
423
+ portalSpawnRadius: 3,
424
+
425
+ // ── Entity base stats ──────────────────────────────────────────────
426
+ entityBaseSpeed: 5,
427
+ entityBaseMaxLife: 100,
428
+ entityBaseActionCooldownMs: 500,
429
+ entityBaseMinActionCooldownMs: 100,
430
+
431
+ // ── Bot defaults ───────────────────────────────────────────────────
432
+ botAggroRange: 10,
433
+
434
+ // ── Player defaults ────────────────────────────────────────────────
435
+ defaultPlayerWidth: 2,
436
+ defaultPlayerHeight: 2,
437
+ playerBaseLifeRegenMin: 0.5,
438
+ playerBaseLifeRegenMax: 1.5,
439
+ sumStatsLimit: 500,
440
+ maxActiveLayers: 4,
441
+ initialLifeFraction: 1.0,
442
+
443
+ // ── Combat / death ─────────────────────────────────────────────────
444
+ respawnDurationMs: 3000,
445
+ collisionLifeLoss: 10,
446
+
447
+ // ── Economy — Fountain & Sink Model ────────────────────────────────
448
+ //
449
+ // All economy parameters live under a single `economyRules` sub-document,
450
+ // mirroring the `skillRules` pattern used by the skill system.
451
+ //
452
+ // This system follows the Fountain & Sink model used by industry-standard
453
+ // MMORPGs (Ultima Online, EverQuest, WoW, EVE Online).
454
+ // Fountains — inject new coins into the economy on spawn events.
455
+ // Kill Transfer — zero-sum redistribution between kill participants.
456
+ // Sinks — destroy coins permanently (alpha: all disabled / 0).
457
+ //
458
+ // On-chain bridge (future):
459
+ // Off-chain coins map 1-to-1 with the CKY token (token ID 0) of the
460
+ // ObjectLayerToken ERC-1155 contract on Hyperledger Besu. On auth the
461
+ // server credits the on-chain balance and this wallet becomes a hot cache.
462
+ // See hardhat/WHITE-PAPER.md §7 "Tokenomics" and OFF_CHAIN_ECONOMY.md.
463
+ economyRules: {
464
+ // ── Fountains ────────────────────────────────────────────────────
465
+ // Coins bots carry at spawn and on every respawn (infinite mint).
466
+ // Bots always reset to this value so the PvE reward loop never dries up.
467
+ botSpawnCoins: 50,
468
+ // Player starting wallet. No persistence — resets on reconnect (guest mode).
469
+ // Persists only when authenticated with an on-chain wallet (future).
470
+ playerSpawnCoins: 50,
471
+
472
+ // ── Kill Transfer (zero-sum redistribution) ───────────────────────
473
+ // Fraction [0,1] of victim coins taken per kill when killing a bot (PvE).
474
+ coinKillPercentVsBot: 0.4,
475
+ // Fraction [0,1] of victim coins taken in PvP — intentionally gentler.
476
+ coinKillPercentVsPlayer: 0.15,
477
+ // Hard floor per kill: guarantees at least this many coins per successful kill.
478
+ coinKillMinAmount: 10,
479
+
480
+ // ── Sinks (alpha stubs — all disabled by default) ─────────────────
481
+ // Fraction [0,1] of dead player's coins burned on respawn (0 = disabled).
482
+ respawnCostPercent: 0.0,
483
+ // Flat coins burned per portal use — travel tax (0 = disabled).
484
+ portalFee: 0,
485
+ // Fraction [0,1] of item value burned per crafting action (0 = disabled).
486
+ craftingFeePercent: 0.0,
487
+ },
488
+
489
+ // ── Regen ──────────────────────────────────────────────────────────
490
+ lifeRegenChance: 300,
491
+ maxChance: 10000,
492
+
493
+ // ── Entity type rendering defaults ─────────────────────────────────
494
+ // Replaces flat fields: userDefaultItemId, botDefaultItemId, ghostItemId,
495
+ // coinItemId, defaultFloorItemId, weaponDefaultItemId.
496
+ // See ENTITY_TYPE_DEFAULTS for documentation of each field.
497
+ // liveItemIds / deadItemIds / dropItemIds are arrays of ObjectLayer item IDs.
498
+ entityDefaults: ENTITY_TYPE_DEFAULTS.map((e) => ({ ...e })),
499
+
500
+ // ── Entity Status Indicators (ESI) ─────────────────────────────────
501
+ // Overhead icon mapping — documents the u8→icon relationship.
502
+ // Stored in config for future instance-specific overrides.
503
+ // See STATUS_ICONS constant for documentation.
504
+ statusIcons: STATUS_ICONS.map((s) => ({ ...s })),
505
+
506
+ // ── Skill system ───────────────────────────────────────────────────
507
+ skillConfig: [
508
+ {
509
+ triggerItemId: 'atlas_pistol_mk2',
510
+ skills: [
511
+ {
512
+ logicEventId: 'projectile',
513
+ name: 'Projectile',
514
+ description:
515
+ 'Fires a projectile in the direction of the tap. Spawn chance and lifetime scale with Intelligence and Range.',
516
+ summonedEntityItemId: 'atlas_pistol_mk2_bullet',
517
+ },
518
+ ],
519
+ },
520
+ {
521
+ triggerItemId: 'coin',
522
+ skills: [
523
+ {
524
+ logicEventId: 'coin_drop_or_transaction',
525
+ name: 'Coin Drop',
526
+ description:
527
+ 'Coins are dropped automatically when an entity is killed. Transfer amount scales with kill percent rules.',
528
+ summonedEntityItemId: 'coin',
529
+ },
530
+ ],
531
+ },
532
+ {
533
+ triggerItemId: 'anon',
534
+ skills: [
535
+ {
536
+ logicEventId: 'doppelganger',
537
+ name: 'Doppelganger',
538
+ description:
539
+ 'Summons a passive clone of yourself that wanders nearby. Spawn chance scales with Intelligence.',
540
+ summonedEntityItemId: '$active_skin',
541
+ },
542
+ ],
543
+ },
544
+ {
545
+ triggerItemId: 'hatchet',
546
+ skills: [
547
+ {
548
+ logicEventId: 'projectile',
549
+ name: 'Projectile',
550
+ description:
551
+ 'Fires a projectile in the direction of the tap. Spawn chance and lifetime scale with Intelligence and Range.',
552
+ summonedEntityItemId: 'hatchet-skill',
553
+ },
554
+ ],
555
+ },
556
+ ],
557
+
558
+ skillRules: {
559
+ projectileSpawnChance: 0.5,
560
+ projectileLifetimeMs: 2000,
561
+ projectileWidth: 1,
562
+ projectileHeight: 1,
563
+ projectileSpeedMultiplier: 3,
564
+ doppelgangerSpawnChance: 0.5,
565
+ doppelgangerLifetimeMs: 5000,
566
+ doppelgangerSpawnRadius: 3,
567
+ doppelgangerInitialLifeFraction: 1.0,
568
+ },
569
+
570
+ // ── Equipment Rules ────────────────────────────────────────────────
571
+ // Governs which item types can be equipped (activated) and enforces
572
+ // the one-active-per-type constraint. See EQUIPMENT_RULES_DEFAULTS.
573
+ equipmentRules: { ...EQUIPMENT_RULES_DEFAULTS },
574
+ };