cyberia 3.0.3 → 3.2.5

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 (296) hide show
  1. package/{.env.production → .env.example} +20 -4
  2. package/.github/workflows/engine-cyberia.cd.yml +43 -10
  3. package/.github/workflows/engine-cyberia.ci.yml +48 -26
  4. package/.github/workflows/ghpkg.ci.yml +5 -5
  5. package/.github/workflows/gitlab.ci.yml +1 -1
  6. package/.github/workflows/hardhat.ci.yml +82 -0
  7. package/.github/workflows/npmpkg.ci.yml +60 -14
  8. package/.github/workflows/publish.ci.yml +26 -7
  9. package/.github/workflows/publish.cyberia.ci.yml +5 -5
  10. package/.github/workflows/pwa-microservices-template-page.cd.yml +6 -7
  11. package/.github/workflows/pwa-microservices-template-test.ci.yml +4 -4
  12. package/.github/workflows/release.cd.yml +14 -8
  13. package/.vscode/extensions.json +9 -8
  14. package/.vscode/settings.json +3 -2
  15. package/CHANGELOG.md +643 -1
  16. package/CLI-HELP.md +132 -57
  17. package/Dockerfile +4 -2
  18. package/README.md +347 -22
  19. package/WHITE-PAPER.md +1540 -0
  20. package/bin/build.js +21 -12
  21. package/bin/cyberia.js +2640 -106
  22. package/bin/deploy.js +258 -372
  23. package/bin/file.js +5 -1
  24. package/bin/index.js +2640 -106
  25. package/bin/vs.js +3 -3
  26. package/conf.js +169 -105
  27. package/deployment.yaml +236 -20
  28. package/hardhat/.env.example +31 -0
  29. package/hardhat/README.md +531 -0
  30. package/hardhat/WHITE-PAPER.md +1540 -0
  31. package/hardhat/contracts/ObjectLayerToken.sol +391 -0
  32. package/hardhat/deployments/.gitkeep +0 -0
  33. package/hardhat/deployments/hardhat-ObjectLayerToken.json +11 -0
  34. package/hardhat/hardhat.config.js +136 -0
  35. package/hardhat/ignition/modules/ObjectLayerToken.js +21 -0
  36. package/hardhat/networks/besu-object-layer.network.json +138 -0
  37. package/hardhat/package-lock.json +4323 -0
  38. package/hardhat/package.json +36 -0
  39. package/hardhat/scripts/deployObjectLayerToken.js +98 -0
  40. package/hardhat/test/ObjectLayerToken.js +592 -0
  41. package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
  42. package/hardhat/types/ethers-contracts/common.ts +92 -0
  43. package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
  44. package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
  45. package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
  46. package/hardhat/types/ethers-contracts/index.ts +6 -0
  47. package/jsdoc.dd-cyberia.json +68 -0
  48. package/jsdoc.json +65 -49
  49. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +5 -4
  50. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +5 -4
  51. package/manifests/deployment/dd-cyberia-development/deployment.yaml +562 -0
  52. package/manifests/deployment/dd-cyberia-development/proxy.yaml +297 -0
  53. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +132 -0
  54. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  55. package/manifests/deployment/dd-test-development/deployment.yaml +88 -74
  56. package/manifests/deployment/dd-test-development/proxy.yaml +13 -4
  57. package/manifests/deployment/playwright/deployment.yaml +1 -1
  58. package/manifests/pv-pvc-dd.yaml +1 -1
  59. package/nodemon.json +1 -1
  60. package/package.json +60 -48
  61. package/proxy.yaml +118 -10
  62. package/pv-pvc.yaml +132 -0
  63. package/scripts/k3s-node-setup.sh +1 -1
  64. package/scripts/ports-ls.sh +2 -0
  65. package/scripts/rhel-grpc-setup.sh +56 -0
  66. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +47 -1
  67. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +17 -2
  68. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
  69. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +80 -7
  70. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +93 -0
  71. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
  72. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +29 -0
  73. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +51 -0
  74. package/src/api/cyberia-entity/cyberia-entity.controller.js +74 -0
  75. package/src/api/cyberia-entity/cyberia-entity.model.js +24 -0
  76. package/src/api/cyberia-entity/cyberia-entity.router.js +27 -0
  77. package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
  78. package/src/api/cyberia-instance/cyberia-fallback-world.js +368 -0
  79. package/src/api/cyberia-instance/cyberia-instance.controller.js +92 -0
  80. package/src/api/cyberia-instance/cyberia-instance.model.js +84 -0
  81. package/src/api/cyberia-instance/cyberia-instance.router.js +63 -0
  82. package/src/api/cyberia-instance/cyberia-instance.service.js +191 -0
  83. package/src/api/cyberia-instance/cyberia-portal-connector.js +486 -0
  84. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +74 -0
  85. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +413 -0
  86. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +228 -0
  87. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +27 -0
  88. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +42 -0
  89. package/src/api/cyberia-map/cyberia-map.controller.js +79 -0
  90. package/src/api/cyberia-map/cyberia-map.model.js +30 -0
  91. package/src/api/cyberia-map/cyberia-map.router.js +40 -0
  92. package/src/api/cyberia-map/cyberia-map.service.js +74 -0
  93. package/src/api/document/document.service.js +1 -1
  94. package/src/api/file/file.controller.js +3 -1
  95. package/src/api/file/file.ref.json +18 -0
  96. package/src/api/file/file.service.js +28 -5
  97. package/src/api/ipfs/ipfs.controller.js +4 -25
  98. package/src/api/ipfs/ipfs.model.js +43 -34
  99. package/src/api/ipfs/ipfs.router.js +8 -13
  100. package/src/api/ipfs/ipfs.service.js +56 -104
  101. package/src/api/object-layer/README.md +347 -22
  102. package/src/api/object-layer/object-layer.controller.js +6 -2
  103. package/src/api/object-layer/object-layer.model.js +12 -8
  104. package/src/api/object-layer/object-layer.router.js +698 -42
  105. package/src/api/object-layer/object-layer.service.js +119 -37
  106. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +1 -2
  107. package/src/api/user/user.router.js +10 -5
  108. package/src/api/user/user.service.js +15 -14
  109. package/src/cli/baremetal.js +6 -10
  110. package/src/cli/cloud-init.js +0 -3
  111. package/src/cli/cluster.js +7 -7
  112. package/src/cli/db.js +723 -857
  113. package/src/cli/deploy.js +215 -105
  114. package/src/cli/env.js +34 -5
  115. package/src/cli/fs.js +5 -4
  116. package/src/cli/image.js +0 -3
  117. package/src/cli/index.js +83 -15
  118. package/src/cli/kubectl.js +211 -0
  119. package/src/cli/monitor.js +5 -6
  120. package/src/cli/release.js +284 -0
  121. package/src/cli/repository.js +708 -62
  122. package/src/cli/run.js +371 -151
  123. package/src/cli/secrets.js +73 -2
  124. package/src/cli/ssh.js +1 -1
  125. package/src/cli/test.js +3 -3
  126. package/src/client/Cryptokoyn.index.js +3 -4
  127. package/src/client/CyberiaPortal.index.js +3 -4
  128. package/src/client/Default.index.js +3 -4
  129. package/src/client/Itemledger.index.js +4 -963
  130. package/src/client/Underpost.index.js +3 -4
  131. package/src/client/components/core/AgGrid.js +20 -5
  132. package/src/client/components/core/Alert.js +2 -2
  133. package/src/client/components/core/AppStore.js +69 -0
  134. package/src/client/components/core/CalendarCore.js +2 -2
  135. package/src/client/components/core/Content.js +22 -3
  136. package/src/client/components/core/Docs.js +30 -6
  137. package/src/client/components/core/DropDown.js +137 -17
  138. package/src/client/components/core/FileExplorer.js +71 -4
  139. package/src/client/components/core/Input.js +1 -1
  140. package/src/client/components/core/Keyboard.js +2 -2
  141. package/src/client/components/core/LogIn.js +2 -2
  142. package/src/client/components/core/LogOut.js +2 -2
  143. package/src/client/components/core/Modal.js +20 -7
  144. package/src/client/components/core/Panel.js +0 -1
  145. package/src/client/components/core/PanelForm.js +19 -19
  146. package/src/client/components/core/RichText.js +1 -2
  147. package/src/client/components/core/SocketIo.js +82 -29
  148. package/src/client/components/core/SocketIoHandler.js +75 -0
  149. package/src/client/components/core/Stream.js +143 -95
  150. package/src/client/components/core/Webhook.js +40 -7
  151. package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
  152. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +3 -3
  153. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +2 -2
  154. package/src/client/components/cryptokoyn/MenuCryptokoyn.js +3 -3
  155. package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +3 -51
  156. package/src/client/components/cyberia/InstanceEngineCyberia.js +700 -0
  157. package/src/client/components/cyberia/MapEngineCyberia.js +1359 -2
  158. package/src/client/components/cyberia/ObjectLayerEngineModal.js +17 -6
  159. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +92 -54
  160. package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
  161. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +217 -30
  162. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +44 -2
  163. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +3 -4
  164. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +2 -2
  165. package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +104 -9
  166. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +5 -0
  167. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +3 -49
  168. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
  169. package/src/client/components/default/AppStoreDefault.js +5 -0
  170. package/src/client/components/default/LogInDefault.js +3 -3
  171. package/src/client/components/default/LogOutDefault.js +2 -2
  172. package/src/client/components/default/MenuDefault.js +5 -5
  173. package/src/client/components/default/SocketIoDefault.js +3 -51
  174. package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
  175. package/src/client/components/itemledger/LogInItemledger.js +3 -3
  176. package/src/client/components/itemledger/LogOutItemledger.js +2 -2
  177. package/src/client/components/itemledger/MenuItemledger.js +3 -3
  178. package/src/client/components/itemledger/SocketIoItemledger.js +3 -51
  179. package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
  180. package/src/client/components/underpost/CssUnderpost.js +59 -0
  181. package/src/client/components/underpost/LogInUnderpost.js +6 -3
  182. package/src/client/components/underpost/LogOutUnderpost.js +4 -2
  183. package/src/client/components/underpost/MenuUnderpost.js +104 -18
  184. package/src/client/components/underpost/RoutesUnderpost.js +2 -0
  185. package/src/client/components/underpost/SocketIoUnderpost.js +3 -51
  186. package/src/client/public/cryptokoyn/assets/logo/base-icon.png +0 -0
  187. package/src/client/public/cryptokoyn/browserconfig.xml +12 -0
  188. package/src/client/public/cryptokoyn/microdata.json +85 -0
  189. package/src/client/public/cryptokoyn/site.webmanifest +57 -0
  190. package/src/client/public/cryptokoyn/sitemap +3 -3
  191. package/src/client/public/default/sitemap +3 -3
  192. package/src/client/public/itemledger/browserconfig.xml +2 -2
  193. package/src/client/public/itemledger/manifest.webmanifest +4 -4
  194. package/src/client/public/itemledger/microdata.json +71 -0
  195. package/src/client/public/itemledger/sitemap +3 -3
  196. package/src/client/public/itemledger/yandex-browser-manifest.json +2 -2
  197. package/src/client/public/test/sitemap +3 -3
  198. package/src/client/services/core/core.service.js +20 -8
  199. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +105 -0
  200. package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
  201. package/src/client/services/cyberia-entity/cyberia-entity.service.js +105 -0
  202. package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
  203. package/src/client/services/cyberia-instance/cyberia-instance.service.js +122 -0
  204. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +105 -0
  205. package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
  206. package/src/client/services/cyberia-map/cyberia-map.service.js +126 -0
  207. package/src/client/services/instance/instance.management.js +2 -2
  208. package/src/client/services/ipfs/ipfs.service.js +3 -23
  209. package/src/client/services/object-layer/object-layer.management.js +3 -3
  210. package/src/client/services/object-layer/object-layer.service.js +21 -0
  211. package/src/client/services/user/user.management.js +2 -2
  212. package/src/client/ssr/body/404.js +15 -11
  213. package/src/client/ssr/body/500.js +15 -11
  214. package/src/client/ssr/body/SwaggerDarkMode.js +285 -0
  215. package/src/client/ssr/head/PwaItemledger.js +60 -0
  216. package/src/client/ssr/offline/NoNetworkConnection.js +11 -10
  217. package/src/client/ssr/pages/CyberiaServerMetrics.js +1 -1
  218. package/src/client/ssr/pages/Test.js +11 -10
  219. package/src/client.build.js +0 -3
  220. package/src/client.dev.js +0 -3
  221. package/src/db/DataBaseProvider.js +17 -2
  222. package/src/db/mariadb/MariaDB.js +14 -9
  223. package/src/db/mongo/MongooseDB.js +17 -1
  224. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +305 -0
  225. package/src/grpc/cyberia/README.md +326 -0
  226. package/src/grpc/cyberia/grpc-server.js +530 -0
  227. package/src/index.js +24 -1
  228. package/src/proxy.js +0 -3
  229. package/src/runtime/express/Dockerfile +4 -0
  230. package/src/runtime/express/Express.js +33 -10
  231. package/src/runtime/lampp/Dockerfile +13 -2
  232. package/src/runtime/lampp/Lampp.js +33 -17
  233. package/src/runtime/wp/Dockerfile +68 -0
  234. package/src/runtime/wp/Wp.js +639 -0
  235. package/src/server/auth.js +36 -15
  236. package/src/server/backup.js +39 -12
  237. package/src/server/besu-genesis-generator.js +1630 -0
  238. package/src/server/client-build-docs.js +133 -17
  239. package/src/server/client-build-live.js +9 -18
  240. package/src/server/client-build.js +229 -101
  241. package/src/server/client-dev-server.js +14 -13
  242. package/src/server/client-formatted.js +109 -57
  243. package/src/server/conf.js +391 -164
  244. package/src/server/cron.js +27 -24
  245. package/src/server/dns.js +29 -12
  246. package/src/server/downloader.js +0 -2
  247. package/src/server/ipfs-client.js +24 -1
  248. package/src/server/logger.js +27 -9
  249. package/src/server/object-layer.js +217 -103
  250. package/src/server/peer.js +8 -2
  251. package/src/server/process.js +1 -50
  252. package/src/server/proxy.js +4 -8
  253. package/src/server/runtime.js +30 -9
  254. package/src/server/semantic-layer-generator-floor.js +359 -0
  255. package/src/server/semantic-layer-generator-skin.js +1294 -0
  256. package/src/server/semantic-layer-generator.js +116 -555
  257. package/src/server/ssr.js +0 -3
  258. package/src/server/start.js +19 -12
  259. package/src/server/tls.js +0 -2
  260. package/src/server.js +0 -4
  261. package/src/ws/IoInterface.js +1 -10
  262. package/src/ws/IoServer.js +14 -33
  263. package/src/ws/core/channels/core.ws.chat.js +65 -20
  264. package/src/ws/core/channels/core.ws.mailer.js +113 -32
  265. package/src/ws/core/channels/core.ws.stream.js +90 -31
  266. package/src/ws/core/core.ws.connection.js +12 -33
  267. package/src/ws/core/core.ws.emit.js +10 -26
  268. package/src/ws/core/core.ws.server.js +25 -58
  269. package/src/ws/default/channels/default.ws.main.js +53 -12
  270. package/src/ws/default/default.ws.connection.js +26 -13
  271. package/src/ws/default/default.ws.server.js +30 -12
  272. package/.env.development +0 -43
  273. package/.env.test +0 -43
  274. package/hardhat/contracts/CryptoKoyn.sol +0 -59
  275. package/hardhat/contracts/ItemLedger.sol +0 -73
  276. package/hardhat/contracts/Lock.sol +0 -34
  277. package/hardhat/hardhat.config.cjs +0 -45
  278. package/hardhat/ignition/modules/Lock.js +0 -18
  279. package/hardhat/networks/cryptokoyn-itemledger.network.json +0 -29
  280. package/hardhat/scripts/deployCryptokoyn.cjs +0 -25
  281. package/hardhat/scripts/deployItemledger.cjs +0 -25
  282. package/hardhat/test/Lock.js +0 -126
  283. package/hardhat/white-paper.md +0 -581
  284. package/src/client/components/cryptokoyn/CommonCryptokoyn.js +0 -29
  285. package/src/client/components/cryptokoyn/ElementsCryptokoyn.js +0 -38
  286. package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +0 -38
  287. package/src/client/components/default/ElementsDefault.js +0 -38
  288. package/src/client/components/itemledger/CommonItemledger.js +0 -29
  289. package/src/client/components/itemledger/ElementsItemledger.js +0 -38
  290. package/src/client/components/underpost/CommonUnderpost.js +0 -29
  291. package/src/client/components/underpost/ElementsUnderpost.js +0 -38
  292. package/src/ws/core/management/core.ws.chat.js +0 -8
  293. package/src/ws/core/management/core.ws.mailer.js +0 -16
  294. package/src/ws/core/management/core.ws.stream.js +0 -8
  295. package/src/ws/default/management/default.ws.main.js +0 -8
  296. package/white-paper.md +0 -581
@@ -0,0 +1,74 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaInstanceConfService } from './cyberia-instance-conf.service.js';
3
+
4
+ const logger = loggerFactory(import.meta);
5
+
6
+ const CyberiaInstanceConfController = {
7
+ post: async (req, res, options) => {
8
+ try {
9
+ const result = await CyberiaInstanceConfService.post(req, res, options);
10
+ return res.status(200).json({
11
+ status: 'success',
12
+ data: result,
13
+ });
14
+ } catch (error) {
15
+ logger.error(error, error.stack);
16
+ return res.status(400).json({
17
+ status: 'error',
18
+ message: error.message,
19
+ });
20
+ }
21
+ },
22
+ get: async (req, res, options) => {
23
+ try {
24
+ const { page, limit } = req.query;
25
+ const result = await CyberiaInstanceConfService.get(
26
+ { ...req, query: { ...req.query, page: parseInt(page), limit: parseInt(limit) } },
27
+ res,
28
+ options,
29
+ );
30
+ return res.status(200).json({
31
+ status: 'success',
32
+ data: result,
33
+ });
34
+ } catch (error) {
35
+ logger.error(error, error.stack);
36
+ return res.status(400).json({
37
+ status: 'error',
38
+ message: error.message,
39
+ });
40
+ }
41
+ },
42
+ put: async (req, res, options) => {
43
+ try {
44
+ const result = await CyberiaInstanceConfService.put(req, res, options);
45
+ return res.status(200).json({
46
+ status: 'success',
47
+ data: result,
48
+ });
49
+ } catch (error) {
50
+ logger.error(error, error.stack);
51
+ return res.status(400).json({
52
+ status: 'error',
53
+ message: error.message,
54
+ });
55
+ }
56
+ },
57
+ delete: async (req, res, options) => {
58
+ try {
59
+ const result = await CyberiaInstanceConfService.delete(req, res, options);
60
+ return res.status(200).json({
61
+ status: 'success',
62
+ data: result,
63
+ });
64
+ } catch (error) {
65
+ logger.error(error, error.stack);
66
+ return res.status(400).json({
67
+ status: 'error',
68
+ message: error.message,
69
+ });
70
+ }
71
+ },
72
+ };
73
+
74
+ export { CyberiaInstanceConfController };
@@ -0,0 +1,413 @@
1
+ /**
2
+ * Canonical default values and type definitions for a CyberiaInstanceConf document.
3
+ *
4
+ * Single source of truth used by:
5
+ * - cyberia-instance-conf.model.js — Mongoose schema `default:` declarations
6
+ * - grpc-server.js — FALLBACK_CONFIG_DEFAULTS for missing instances
7
+ * - bin/cyberia.js — imports ITEM_TYPES for asset type enumeration
8
+ *
9
+ * @module src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js
10
+ */
11
+
12
+ // ── Item type registry ───────────────────────────────────────────────────────
13
+ /**
14
+ * Canonical set of ObjectLayer item type names, used as asset directory names
15
+ * and as the `data.item.type` discriminator on ObjectLayer documents.
16
+ *
17
+ * Values intentionally equal their keys — the object is an enum of valid
18
+ * strings, NOT an integer→z-index map. Render layer ordering (z-order) is
19
+ * determined separately by `get_priority_for_type()` in entity_render.c.
20
+ *
21
+ * @constant
22
+ * @type {Readonly<{floor:string, skin:string, breastplate:string, weapon:string, skill:string, coin:string}>}
23
+ */
24
+ export const ITEM_TYPES = Object.freeze({
25
+ floor: 'floor',
26
+ skin: 'skin',
27
+ breastplate: 'breastplate',
28
+ weapon: 'weapon',
29
+ skill: 'skill',
30
+ coin: 'coin',
31
+ });
32
+
33
+ // ── Entity Status Indicator (ESI) registry ───────────────────────────────────
34
+ /**
35
+ * Canonical mapping of server-computed entity status icon IDs to the ui-icon
36
+ * filename stem served from /assets/ui-icons/{iconId}.png.
37
+ *
38
+ * The Go server assigns a status u8 per entity each AOI tick. The C client
39
+ * receives this mapping dynamically via init_data.statusIcons and uses it to
40
+ * resolve the u8 to an icon filename at runtime. This JS-side copy is the
41
+ * configuration source of truth; it supports instance-specific icon overrides.
42
+ *
43
+ * Industry standard name: "Overhead Status Indicator" (OSI).
44
+ * WoW: nameplate colour + debuff icons
45
+ * FFXIV: enmity/claim icons (red ◆, yellow ●)
46
+ * UO: skull for murderers, shield for invulnerables
47
+ *
48
+ * IMPORTANT: The numeric IDs MUST stay in sync with:
49
+ * - Go: cyberia-server/src/entity_status.go (StatusNone … StatusDead)
50
+ *
51
+ * @constant
52
+ */
53
+ export const STATUS_ICONS = Object.freeze([
54
+ {
55
+ id: 0,
56
+ name: 'none',
57
+ iconId: null,
58
+ bounce: false,
59
+ borderColor: { r: 70, g: 70, b: 120, a: 200 },
60
+ description: 'No icon (skill/coin bots, world objects)',
61
+ },
62
+ {
63
+ id: 1,
64
+ name: 'passive',
65
+ iconId: 'arrow-down-gray',
66
+ bounce: false,
67
+ borderColor: { r: 130, g: 140, b: 160, a: 200 },
68
+ description: 'Passive bot — no weapon, non-aggressive',
69
+ },
70
+ {
71
+ id: 2,
72
+ name: 'hostile',
73
+ iconId: 'arrow-down-red',
74
+ bounce: true,
75
+ borderColor: { r: 210, g: 50, b: 50, a: 240 },
76
+ description: 'Hostile bot — has weapon, will aggro',
77
+ },
78
+ {
79
+ id: 3,
80
+ name: 'frozen',
81
+ iconId: 'chat',
82
+ bounce: true,
83
+ borderColor: { r: 80, g: 160, b: 220, a: 240 },
84
+ description: 'Player in FrozenInteractionState (modal open)',
85
+ },
86
+ {
87
+ id: 4,
88
+ name: 'player',
89
+ iconId: 'arrow-down',
90
+ bounce: false,
91
+ borderColor: { r: 60, g: 190, b: 90, a: 240 },
92
+ description: 'Normal player — alive, not frozen',
93
+ },
94
+ {
95
+ id: 5,
96
+ name: 'dead',
97
+ iconId: 'skull',
98
+ bounce: false,
99
+ borderColor: { r: 160, g: 130, b: 200, a: 200 },
100
+ description: 'Entity is dead / respawning',
101
+ },
102
+ ]);
103
+
104
+ // ── Equipment rules ──────────────────────────────────────────────────────────
105
+ /**
106
+ * Equipment rules govern which ObjectLayer item types can be simultaneously
107
+ * active on a character entity and enforce the one-active-per-type constraint.
108
+ *
109
+ * The server validates every item_activation request against these rules:
110
+ * 1. Only item types listed in `activeItemTypes` may be activated.
111
+ * 2. When `onePerType` is true (default), activating an item of a given type
112
+ * automatically deactivates any other active item of the same type.
113
+ * 3. When `requireSkin` is true, the player must always have at least one
114
+ * active skin if they own any skin-type items.
115
+ *
116
+ * Item types NOT listed in `activeItemTypes` (e.g. 'coin', 'floor') are
117
+ * considered non-activable and their activation requests are rejected.
118
+ *
119
+ * @constant
120
+ * @type {Readonly<{activeItemTypes:string[], onePerType:boolean, requireSkin:boolean}>}
121
+ */
122
+ export const EQUIPMENT_RULES_DEFAULTS = Object.freeze({
123
+ // Item types that players are allowed to activate (equip).
124
+ // Types not in this list are non-activable (coins, floors, etc.).
125
+ activeItemTypes: ['skin', 'breastplate', 'weapon'],
126
+ // Enforce at most one active item per item type.
127
+ onePerType: true,
128
+ // Require at least one active skin when the player owns any skin.
129
+ requireSkin: true,
130
+ });
131
+
132
+ // ── Entity type defaults ─────────────────────────────────────────────────────
133
+ /**
134
+ * Per-entity-type rendering defaults.
135
+ *
136
+ * Each entry defines the canonical visual configuration for ONE entity type:
137
+ *
138
+ * entityType — string used by the Go server and C client to identify the
139
+ * entity category (matches entity_type_str in game_render.c
140
+ * and Behavior for bot sub-types).
141
+ * liveItemIds — Array of ObjectLayer item IDs applied when the entity is
142
+ * alive/active and no explicit items are assigned. Empty array =
143
+ * no OL fallback, rely on colorKey solid fill.
144
+ * deadItemIds — Array of ObjectLayer item IDs for the dead / ghost / respawning
145
+ * state. Empty array = no dead-state OL; same solid fill as live.
146
+ * Replaces the old flat ghostItemId field for players.
147
+ * colorKey — Named palette colour key (see colors in CYBERIA_INSTANCE_CONF_DEFAULTS).
148
+ * Used as solid-colour fallback when the entity carries NO active
149
+ * ObjectLayer items, or while atlas textures are still loading.
150
+ * The Go server stamps this colour on every newly spawned entity
151
+ * so the binary AOI stream always carries the correct RGBA.
152
+ *
153
+ * Character entity types:
154
+ * player — the local (self) player
155
+ * other_player — remote players in the AOI
156
+ * bot — AI-controlled entities (behavior: hostile / passive)
157
+ * skill — skill-spawned projectile bot (behavior = "skill");
158
+ * NOT placed in maps — created at runtime by skill_projectile.go
159
+ * when a player/bot triggers a projectile skill.
160
+ * liveItemIds carries the skill-type OL (the projectile sprite).
161
+ * coin — skill-spawned collectible bot (behavior = "coin");
162
+ * NOT placed in maps — dropped at runtime on entity death.
163
+ *
164
+ * World object entity types:
165
+ * floor / obstacle / portal / foreground
166
+ *
167
+ * @constant
168
+ * @type {ReadonlyArray<{entityType:string, liveItemIds:string[], deadItemIds:string[], colorKey:string}>}
169
+ */
170
+ export const ENTITY_TYPE_DEFAULTS = Object.freeze([
171
+ // ── Characters ─────────────────────────────────────────────────────────
172
+ {
173
+ entityType: 'player',
174
+ liveItemIds: ['anon', 'atlas_pistol_mk2'],
175
+ deadItemIds: ['ghost'],
176
+ colorKey: 'PLAYER',
177
+ // Full default ObjectLayer inventory for newly spawned players.
178
+ // active:false items appear in the inventory bar but are not worn.
179
+ // The coin slot is always active:false — coins are non-activable.
180
+ defaultObjectLayers: [
181
+ { itemId: 'anon', active: true, quantity: 1 },
182
+ { itemId: 'atlas_pistol_mk2', active: true, quantity: 1 },
183
+ { itemId: 'purple', active: false, quantity: 1 },
184
+ { itemId: 'ghost', active: false, quantity: 1 },
185
+ { itemId: 'atlas_pistol_mk2_bullet', active: false, quantity: 5 },
186
+ { itemId: 'lain', active: false, quantity: 1 },
187
+ { itemId: 'hatchet', active: false, quantity: 1 },
188
+ { itemId: 'wason', active: false, quantity: 1 },
189
+ { itemId: 'scp-2040', active: false, quantity: 1 },
190
+ { itemId: 'punk', active: false, quantity: 1 },
191
+ { itemId: 'kaneki', active: false, quantity: 1 },
192
+ { itemId: 'junko', active: false, quantity: 1 },
193
+ { itemId: 'eiri', active: false, quantity: 1 },
194
+ { itemId: 'alex', active: false, quantity: 1 },
195
+ { itemId: 'agent', active: false, quantity: 1 },
196
+ { itemId: 'coin', active: false, quantity: 0 },
197
+ ],
198
+ },
199
+ {
200
+ entityType: 'other_player',
201
+ liveItemIds: ['anon', 'atlas_pistol_mk2'],
202
+ deadItemIds: ['ghost'],
203
+ colorKey: 'OTHER_PLAYER',
204
+ defaultObjectLayers: [
205
+ { itemId: 'anon', active: true, quantity: 1 },
206
+ { itemId: 'atlas_pistol_mk2', active: true, quantity: 1 },
207
+ { itemId: 'purple', active: false, quantity: 1 },
208
+ { itemId: 'ghost', active: false, quantity: 1 },
209
+ { itemId: 'atlas_pistol_mk2_bullet', active: false, quantity: 5 },
210
+ { itemId: 'lain', active: false, quantity: 1 },
211
+ { itemId: 'hatchet', active: false, quantity: 1 },
212
+ { itemId: 'wason', active: false, quantity: 1 },
213
+ { itemId: 'scp-2040', active: false, quantity: 1 },
214
+ { itemId: 'punk', active: false, quantity: 1 },
215
+ { itemId: 'kaneki', active: false, quantity: 1 },
216
+ { itemId: 'junko', active: false, quantity: 1 },
217
+ { itemId: 'eiri', active: false, quantity: 1 },
218
+ { itemId: 'alex', active: false, quantity: 1 },
219
+ { itemId: 'agent', active: false, quantity: 1 },
220
+ { itemId: 'coin', active: false, quantity: 0 },
221
+ ],
222
+ },
223
+ {
224
+ entityType: 'bot',
225
+ liveItemIds: ['purple'],
226
+ deadItemIds: ['ghost'],
227
+ colorKey: 'BOT',
228
+ defaultObjectLayers: [
229
+ { itemId: 'purple', active: true, quantity: 1 },
230
+ { itemId: 'coin', active: false, quantity: 0 },
231
+ ],
232
+ },
233
+ {
234
+ entityType: 'skill',
235
+ liveItemIds: ['atlas_pistol_mk2_bullet'],
236
+ deadItemIds: [],
237
+ colorKey: 'SKILL',
238
+ defaultObjectLayers: [{ itemId: 'atlas_pistol_mk2_bullet', active: true, quantity: 1 }],
239
+ },
240
+ {
241
+ entityType: 'coin',
242
+ liveItemIds: ['coin'],
243
+ deadItemIds: [],
244
+ colorKey: 'COIN',
245
+ defaultObjectLayers: [{ itemId: 'coin', active: true, quantity: 1 }],
246
+ },
247
+ // ── World objects ───────────────────────────────────────────────────────
248
+ { entityType: 'floor', liveItemIds: ['grass'], deadItemIds: [], colorKey: 'FLOOR', defaultObjectLayers: [] },
249
+ { entityType: 'obstacle', liveItemIds: [], deadItemIds: [], colorKey: 'OBSTACLE', defaultObjectLayers: [] },
250
+ { entityType: 'portal', liveItemIds: [], deadItemIds: [], colorKey: 'PORTAL', defaultObjectLayers: [] },
251
+ { entityType: 'portal', liveItemIds: [], deadItemIds: [], colorKey: 'PORTAL_INTER_PORTAL', defaultObjectLayers: [] },
252
+ { entityType: 'portal', liveItemIds: [], deadItemIds: [], colorKey: 'PORTAL_INTER_RANDOM', defaultObjectLayers: [] },
253
+ { entityType: 'portal', liveItemIds: [], deadItemIds: [], colorKey: 'PORTAL_INTRA_RANDOM', defaultObjectLayers: [] },
254
+ { entityType: 'portal', liveItemIds: [], deadItemIds: [], colorKey: 'PORTAL_INTRA_PORTAL', defaultObjectLayers: [] },
255
+ { entityType: 'foreground', liveItemIds: [], deadItemIds: [], colorKey: 'FOREGROUND', defaultObjectLayers: [] },
256
+ ]);
257
+
258
+ // ── Instance configuration defaults ─────────────────────────────────────────
259
+ export const CYBERIA_INSTANCE_CONF_DEFAULTS = {
260
+ // ── Rendering / camera ─────────────────────────────────────────────
261
+ cellSize: 45,
262
+ fps: 60,
263
+ interpolationMs: 100,
264
+ defaultObjWidth: 1,
265
+ defaultObjHeight: 1,
266
+ cameraSmoothing: 0.1,
267
+ cameraZoom: 1.0,
268
+ defaultWidthScreenFactor: 1,
269
+ defaultHeightScreenFactor: 1,
270
+ devUi: false,
271
+
272
+ /**
273
+ * Named colour palette forwarded to Go server and C client via the WebSocket
274
+ * init payload. Entity colour keys (PLAYER, BOT, SKILL, …) are consumed via
275
+ * entityDefaults[n].colorKey as the solid fallback for that entity type when
276
+ * no ObjectLayer items are assigned.
277
+ * The WEAPON key is kept for UI use (weapon-stat highlights) only.
278
+ */
279
+ colors: [
280
+ // ── World ─────────────────────────────────────────────────────
281
+ { key: 'BACKGROUND', r: 30, g: 30, b: 30, a: 255 }, // rgba(30, 30, 30, 1)
282
+ { key: 'FLOOR_BACKGROUND', r: 45, g: 45, b: 45, a: 255 }, // rgba(45, 45, 45, 1)
283
+ { key: 'FLOOR', r: 60, g: 60, b: 60, a: 255 }, // rgba(60, 60, 60, 1)
284
+ { key: 'OBSTACLE', r: 80, g: 80, b: 80, a: 255 }, // rgba(80, 80, 80, 1)
285
+ { key: 'PORTAL', r: 0, g: 200, b: 200, a: 255 }, // rgba(0, 200, 200, 1) — generic fallback
286
+ { key: 'PORTAL_INTER_PORTAL', r: 0, g: 200, b: 200, a: 255 }, // cyan — to portal on another map
287
+ { key: 'PORTAL_INTER_RANDOM', r: 80, g: 130, b: 255, a: 255 }, // blue — to random pos on another map
288
+ { key: 'PORTAL_INTRA_RANDOM', r: 220, g: 200, b: 50, a: 255 }, // yellow — to random pos on same map
289
+ { key: 'PORTAL_INTRA_PORTAL', r: 200, g: 80, b: 200, a: 255 }, // magenta — to portal on same map
290
+ { key: 'FOREGROUND', r: 255, g: 255, b: 255, a: 189 }, // rgba(255, 255, 255, 0.73)
291
+ // ── Entity solid-colour fallbacks (matched by entityDefaults[n].colorKey) ──
292
+ { key: 'PLAYER', r: 0, g: 255, b: 0, a: 255 }, // rgba(0, 255, 0, 1)
293
+ { key: 'OTHER_PLAYER', r: 128, g: 128, b: 255, a: 255 }, // rgba(128, 128, 255, 1)
294
+ { key: 'BOT', r: 255, g: 128, b: 0, a: 255 }, // rgba(255, 128, 0, 1)
295
+ { key: 'GHOST', r: 200, g: 200, b: 255, a: 100 }, // rgba(200, 200, 255, 0.39)
296
+ { key: 'COIN', r: 255, g: 215, b: 0, a: 255 }, // rgba(255, 215, 0, 1)
297
+ { key: 'SKILL', r: 255, g: 255, b: 50, a: 255 }, // rgba(255, 255, 50, 1)
298
+ // ── UI-only ────────────────────────────────────────────────────
299
+ { key: 'WEAPON', r: 180, g: 50, b: 50, a: 255 }, // rgba(180, 50, 50, 1)
300
+ // ── Interaction overlay — self-player bubble/panel border ──────
301
+ { key: 'SELF_BORDER', r: 220, g: 190, b: 60, a: 240 }, // rgba(220, 190, 60, 0.94) — gold
302
+ ],
303
+
304
+ // ── World / AOI ────────────────────────────────────────────────────
305
+ aoiRadius: 10,
306
+ portalHoldTimeMs: 1000,
307
+ portalSpawnRadius: 3,
308
+
309
+ // ── Entity base stats ──────────────────────────────────────────────
310
+ entityBaseSpeed: 5,
311
+ entityBaseMaxLife: 100,
312
+ entityBaseActionCooldownMs: 500,
313
+ entityBaseMinActionCooldownMs: 100,
314
+
315
+ // ── Bot defaults ───────────────────────────────────────────────────
316
+ botAggroRange: 10,
317
+
318
+ // ── Player defaults ────────────────────────────────────────────────
319
+ defaultPlayerWidth: 2,
320
+ defaultPlayerHeight: 2,
321
+ playerBaseLifeRegenMin: 0.5,
322
+ playerBaseLifeRegenMax: 1.5,
323
+ sumStatsLimit: 500,
324
+ maxActiveLayers: 4,
325
+ initialLifeFraction: 1.0,
326
+
327
+ // ── Combat / death ─────────────────────────────────────────────────
328
+ respawnDurationMs: 3000,
329
+ collisionLifeLoss: 10,
330
+
331
+ // ── Economy — Fountain & Sink Model ────────────────────────────────
332
+ //
333
+ // All economy parameters live under a single `economyRules` sub-document,
334
+ // mirroring the `skillRules` pattern used by the skill system.
335
+ //
336
+ // This system follows the Fountain & Sink model used by industry-standard
337
+ // MMORPGs (Ultima Online, EverQuest, WoW, EVE Online).
338
+ // Fountains — inject new coins into the economy on spawn events.
339
+ // Kill Transfer — zero-sum redistribution between kill participants.
340
+ // Sinks — destroy coins permanently (alpha: all disabled / 0).
341
+ //
342
+ // On-chain bridge (future):
343
+ // Off-chain coins map 1-to-1 with the CKY token (token ID 0) of the
344
+ // ObjectLayerToken ERC-1155 contract on Hyperledger Besu. On auth the
345
+ // server credits the on-chain balance and this wallet becomes a hot cache.
346
+ // See hardhat/WHITE-PAPER.md §7 "Tokenomics" and OFF_CHAIN_ECONOMY.md.
347
+ economyRules: {
348
+ // ── Fountains ────────────────────────────────────────────────────
349
+ // Coins bots carry at spawn and on every respawn (infinite mint).
350
+ // Bots always reset to this value so the PvE reward loop never dries up.
351
+ botSpawnCoins: 50,
352
+ // Player starting wallet. No persistence — resets on reconnect (guest mode).
353
+ // Persists only when authenticated with an on-chain wallet (future).
354
+ playerSpawnCoins: 50,
355
+
356
+ // ── Kill Transfer (zero-sum redistribution) ───────────────────────
357
+ // Fraction [0,1] of victim coins taken per kill when killing a bot (PvE).
358
+ coinKillPercentVsBot: 0.4,
359
+ // Fraction [0,1] of victim coins taken in PvP — intentionally gentler.
360
+ coinKillPercentVsPlayer: 0.15,
361
+ // Hard floor per kill: guarantees at least this many coins per successful kill.
362
+ coinKillMinAmount: 10,
363
+
364
+ // ── Sinks (alpha stubs — all disabled by default) ─────────────────
365
+ // Fraction [0,1] of dead player's coins burned on respawn (0 = disabled).
366
+ respawnCostPercent: 0.0,
367
+ // Flat coins burned per portal use — travel tax (0 = disabled).
368
+ portalFee: 0,
369
+ // Fraction [0,1] of item value burned per crafting action (0 = disabled).
370
+ craftingFeePercent: 0.0,
371
+ },
372
+
373
+ // ── Regen ──────────────────────────────────────────────────────────
374
+ lifeRegenChance: 300,
375
+ maxChance: 10000,
376
+
377
+ // ── Entity type rendering defaults ─────────────────────────────────
378
+ // Replaces flat fields: userDefaultItemId, botDefaultItemId, ghostItemId,
379
+ // coinItemId, defaultFloorItemId, weaponDefaultItemId.
380
+ // See ENTITY_TYPE_DEFAULTS for documentation of each field.
381
+ // liveItemIds / deadItemIds are arrays of ObjectLayer item IDs.
382
+ entityDefaults: ENTITY_TYPE_DEFAULTS.map((e) => ({ ...e })),
383
+
384
+ // ── Entity Status Indicators (ESI) ─────────────────────────────────
385
+ // Overhead icon mapping — documents the u8→icon relationship.
386
+ // Stored in config for future instance-specific overrides.
387
+ // See STATUS_ICONS constant for documentation.
388
+ statusIcons: STATUS_ICONS.map((s) => ({ ...s })),
389
+
390
+ // ── Skill system ───────────────────────────────────────────────────
391
+ skillConfig: [
392
+ { triggerItemId: 'atlas_pistol_mk2', logicEventIds: ['atlas_pistol_mk2_logic'] },
393
+ { triggerItemId: 'coin', logicEventIds: ['coin_drop_or_transaction'] },
394
+ { triggerItemId: 'anon', logicEventIds: ['doppelganger'] },
395
+ ],
396
+
397
+ skillRules: {
398
+ projectileSpawnChance: 0.5,
399
+ projectileLifetimeMs: 2000,
400
+ projectileWidth: 1,
401
+ projectileHeight: 1,
402
+ projectileSpeedMultiplier: 3,
403
+ doppelgangerSpawnChance: 0.5,
404
+ doppelgangerLifetimeMs: 5000,
405
+ doppelgangerSpawnRadius: 3,
406
+ doppelgangerInitialLifeFraction: 1.0,
407
+ },
408
+
409
+ // ── Equipment Rules ────────────────────────────────────────────────
410
+ // Governs which item types can be equipped (activated) and enforces
411
+ // the one-active-per-type constraint. See EQUIPMENT_RULES_DEFAULTS.
412
+ equipmentRules: { ...EQUIPMENT_RULES_DEFAULTS },
413
+ };