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
@@ -0,0 +1,240 @@
1
+ # Cyberia Online — Development Roadmap
2
+
3
+ **Current version:** 3.0.3 | **Target milestone:** Open Alpha
4
+
5
+ ---
6
+
7
+ ## Project Context
8
+
9
+ Cyberia Online is a real-time tap-based sandbox MMORPG built on three layers:
10
+
11
+ - **cyberia-client** (C/WASM) — browser-based game client
12
+ - **cyberia-server** (Go) — authoritative real-time game server (binary WebSocket AOI)
13
+ - **engine-cyberia** (Node.js) — data persistence, gRPC data service, REST API, content pipeline
14
+
15
+ The **Cyberia CLI** (`cyberia`) is an extension of the **Underpost CLI** specifically for this ecosystem. Underpost is the end-to-end bare-metal infrastructure platform; `cyberia` adds the game's content pipeline, economy toolchain, and MMO engine management. Unrecognized commands pass through to `underpost` for general infrastructure operations.
16
+
17
+ ---
18
+
19
+ ## Core Design Principle: Item ID as the Universal Identity
20
+
21
+ The central data-transmission primitive is the **item ID (`data.item.id`)** — a human-readable string slug (e.g. `hatchet`, `skin-dark-001`, `floor-desert`) that identifies an Object Layer entity.
22
+
23
+ **Why item IDs, not ObjectIds or hashes:**
24
+
25
+ - The Go server and C client never transmit full ObjectLayer documents over the game wire.
26
+ - The binary AOI protocol sends only item ID strings per entity in the AOI update packets.
27
+ - The C client uses these item IDs to independently request visual data and atlas metadata from the Engine REST API (`GET /api/object-layer/{itemId}`, `GET /api/atlas-sprite-sheet/{cid}`).
28
+ - This creates a clean separation: the **Go server** manages authoritative game state (positions, HP, coin balances, equipment activation); the **Engine REST API** manages and serves asset/metadata resolution; the **C client** handles all rendering and compositing.
29
+
30
+ ```
31
+ Go Server (binary AOI)
32
+ → sends entity itemId stack per AOI tick
33
+ → C client decodes itemIds
34
+ → C client independently fetches ObjectLayer metadata from Engine REST API
35
+ → C client fetches atlas CID blobs from Engine REST API
36
+ → C client composites layers + renders
37
+ ```
38
+
39
+ **gRPC is used only at startup** for world reconstruction (maps, entities, instance config, ObjectLayer cache warm-up). At runtime, the Go server holds all game state in memory and communicates with clients exclusively over binary WebSocket.
40
+
41
+ ---
42
+
43
+ ## Server Types (Production Topology)
44
+
45
+ Three server modes are planned, addressing different user needs and scaling properties:
46
+
47
+ | Mode | Session Persistence | Auth | Inventory | Economy |
48
+ | ------------------------- | ------------------------------------------- | -------------------------------- | ----------------------------------- | --------------------------------- |
49
+ | **Anonymous Off-Chain** | Ephemeral (in-memory, resets on disconnect) | None | itemId-based in-memory | Off-chain only |
50
+ | **Centralized Off-Chain** | Persistent (MongoDB via gRPC) | Username / password (User model) | Server-authoritative MongoDB | Off-chain only |
51
+ | **On-Chain** | Decentralized (Hyperledger Besu + IPFS) | secp256k1 ETH keys (EIP-712) | ObjectLayerToken ERC-1155 ownership | On-chain: CKY + NFT/semi-fungible |
52
+
53
+ ---
54
+
55
+ ## Release Policy
56
+
57
+ All release versions have **publicly available features** with no paywalled content. If a server's player capacity is reached, a **queue system** is implemented rather than hard-blocking users.
58
+
59
+ **Queue system standard:** Token-bucket or FIFO queue with estimated wait time displayed to the user, following the pattern used by major MMOs (World of Warcraft realm queues, FFXIV login queues). The queue is server-side; clients poll a lightweight `/api/v1/queue-status` endpoint. A server-sent event (SSE) or WebSocket notification fires when the slot is granted.
60
+
61
+ ---
62
+
63
+ ## Phase 1 — Pre-Alpha: Anonymous Off-Chain (Ephemeral Sessions)
64
+
65
+ **Status:** In progress — core game loop functional; action/quest systems pending.
66
+
67
+ ### What works today
68
+
69
+ - Binary WebSocket AOI protocol (entity movement, combat, HP, FCT)
70
+ - Object Layer item equip/unequip (`item_activation`) with equipment rules enforced
71
+ - Fountain & Sink coin economy (bot spawn coins, kill transfer, coin collect)
72
+ - Skill system: projectile, doppelganger, coin drop/transaction
73
+ - Bot AI: hostile/passive behavior, A\* pathfinding, aggro, respawn
74
+ - FrozenInteractionState entry/exit (`freeze_start`/`freeze_end`)
75
+ - ObjectLayer hot-reload via gRPC manifest diff (incremental update without restart)
76
+ - Go server metrics REST API (`/api/v1/metrics*`)
77
+ - Procedural content pipeline: floor, skin, resource semantic generators
78
+ - CLI toolchain: `cyberia ol`, `cyberia instance`, `cyberia run-workflow`
79
+
80
+ ### Remaining work for Pre-Alpha checkpoint
81
+
82
+ All items below target selected-user testing with **ephemeral, in-memory sessions** (state resets on disconnect):
83
+
84
+ | Task | Component | Notes |
85
+ | ------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
86
+ | NPC action routing in Go server | `cyberia-server` | Tap NPC entity → look up `CyberiaAction` from gRPC-loaded data; dispatch to action handler |
87
+ | Dialogue system integration | `cyberia-server` + `cyberia-client` | `freeze_start` → client shows dialogue modal; server validates talk objectives |
88
+ | Shop transaction handler | `cyberia-server` | Deduct coin balance, grant item to inventory (in-memory only) |
89
+ | Craft transaction handler | `cyberia-server` | Consume ingredients from in-memory inventory, grant output items |
90
+ | Quest tracking (in-memory) | `cyberia-server` | `CyberiaQuestProgress` lives only in player session struct; no persistence |
91
+ | Quest objective evaluation | `cyberia-server` | Intercept kill/collect/talk events; update in-memory progress |
92
+ | Quest reward delivery | `cyberia-server` | On step/quest completion: grant items + coins via FCT |
93
+ | Action/quest data via gRPC | `proto + engine + go` | Extend `GetFullInstanceResponse` with `CyberiaAction[]` and `CyberiaQuest[]` |
94
+ | Portal transitions | `cyberia-server` | Implement inter-map portal traversal (`portal` entity type collision) |
95
+ | Player capacity queue | `cyberia-server` | FIFO queue with `/api/v1/queue-status` SSE; deny connect when at capacity |
96
+
97
+ ### Pre-Alpha data contract
98
+
99
+ ```
100
+ Player session (in-memory Go struct only):
101
+ PlayerState {
102
+ ID: string // ephemeral UUID per connect
103
+ ObjectLayers: []ObjectLayerState // equipped item IDs + active flags
104
+ CoinBalance: uint32 // Fountain/Sink coin wallet
105
+ QuestProgress: []QuestProgress // ephemeral quest state (no persistence)
106
+ Frozen: bool
107
+ MapCode: string
108
+ Pos: Vec2
109
+ Life: float64
110
+ }
111
+ ```
112
+
113
+ No account, no persistent identity, no cross-session carry-over.
114
+
115
+ ---
116
+
117
+ ## Phase 2 — Alpha: Centralized Off-Chain (Persistent Sessions)
118
+
119
+ **Target:** Persistent player identity, inventory, and progress stored in MongoDB via gRPC.
120
+
121
+ ### Architecture additions
122
+
123
+ ```
124
+ cyberia-server (Go)
125
+ ↕ gRPC (new RPCs: GetPlayerState, SavePlayerState, CreateSession, etc.)
126
+ engine-cyberia (Node.js)
127
+ ↕ MongoDB
128
+ User (src/api/user) — account: email, username, password, sessions
129
+ PlayerState (new model) — per-player: inventory, coin balance, quest progress
130
+ ```
131
+
132
+ ### Milestone goals
133
+
134
+ | Task | Component | Notes |
135
+ | -------------------------- | ---------------- | -------------------------------------------------------------------- |
136
+ | `GetPlayerState` gRPC RPC | `proto + engine` | Returns saved inventory + coin balance + quest progress for a userId |
137
+ | `SavePlayerState` gRPC RPC | `proto + engine` | Persists player state on clean disconnect or periodic checkpoint |
138
+ | User model integration | `engine-cyberia` | Existing `src/api/user` (email/username/password + session tokens) |
139
+ | Player state model | `engine-cyberia` | New `src/api/player-state` Mongoose model linked to User |
140
+ | Go server session auth | `cyberia-server` | On connect: verify session token with Engine, load persistent state |
141
+ | Go server state checkpoint | `cyberia-server` | Periodic or on-disconnect `SavePlayerState` gRPC call |
142
+ | Alpha gRPC contract | `proto` | New service or new RPCs within `CyberiaDataService` |
143
+
144
+ ### Data contract (alpha)
145
+
146
+ ```
147
+ User (MongoDB):
148
+ email, username, passwordHash, role, activeSessions[]
149
+
150
+ PlayerState (MongoDB):
151
+ userId: ObjectId → User
152
+ instanceCode: string
153
+ coinBalance: uint32
154
+ inventory: [{ itemId: string, active: bool, quantity: int }]
155
+ questProgress: [{ questCode: string, stepId: string, objectives: [...] }]
156
+ ```
157
+
158
+ ---
159
+
160
+ ## Phase 3 — Beta: On-Chain (Decentralized, ETH-Key Sessions)
161
+
162
+ **Target:** Frictionless, zero-gas transactions directly with Ethereum secp256k1 keys on Hyperledger Besu. Full Object Layer ownership, interoperability, and decentralized player progress sync.
163
+
164
+ ### Architecture additions
165
+
166
+ ```
167
+ cyberia-client (C/WASM)
168
+ → EIP-712 sign-on: sign { domain, address, timestamp } with ETH private key
169
+ → session token = EIP-712 signature (no password)
170
+ → Engine verifies signature against ObjectLayerToken deployer / public address
171
+ → Go server loads on-chain inventory from ERC-1155 balances
172
+
173
+ Hyperledger Besu (IBFT2/QBFT, chainId 777771, gasPrice 0)
174
+ ObjectLayerToken (ERC-1155)
175
+ Token 0: CKY fungible (10M initial supply, 18 decimals)
176
+ Token IDs ≥ 1: Object Layer items (NFT supply=1, semi-fungible supply>1)
177
+ ```
178
+
179
+ ### Key properties
180
+
181
+ - **Zero-gas transactions** — Besu permissioned network, `gasPrice: 0` for all players.
182
+ - **secp256k1 key = player identity** — same key pair authenticates across all three domains (`cryptokoyn.net`, `itemledger.com`, `cyberiaonline.com`).
183
+ - **Inventory = ERC-1155 balances** — `balanceOf(playerAddress, tokenId)` is the authoritative inventory.
184
+ - **No server-side wallet custody** — player holds their own key; the server validates on-chain state.
185
+ - **Interoperability** — items owned on-chain can be used in any Cyberia instance that queries `ObjectLayerToken`.
186
+ - **Decentralized progress sync** — quest progress and equipment state checkpointed to Besu events.
187
+
188
+ ### EIP-712 domain
189
+
190
+ ```json
191
+ {
192
+ "name": "CyberiaObjectLayer",
193
+ "version": "1",
194
+ "chainId": 777771,
195
+ "verifyingContract": "<ObjectLayerToken address>"
196
+ }
197
+ ```
198
+
199
+ ### Milestone goals
200
+
201
+ | Task | Component | Notes |
202
+ | -------------------------------- | --------------------- | ---------------------------------------------------------------------------------------------- |
203
+ | EIP-712 sign-on in C client | `cyberia-client` | JS bridge calls `ethers.signTypedData` (MetaMask or injected key) |
204
+ | Signature verification in Engine | `engine-cyberia` | REST endpoint verifies EIP-712 sig; returns session token |
205
+ | On-chain inventory read | `engine-cyberia` | `balanceOf` query on ObjectLayerToken per item type for player address |
206
+ | On-chain inventory → gRPC | `proto + engine + go` | `GetPlayerState` returns on-chain balances as inventory |
207
+ | CKY transfer via Go server | `cyberia-server` | Kill transfer calls Engine which calls `ObjectLayerToken.safeTransferFrom` via gasless relayer |
208
+ | Gasless relayer | `engine-cyberia` | Engine holds the coinbase key; signs and submits Besu transactions on behalf of players |
209
+ | Item registration pipeline | `cyberia chain` CLI | `cyberia chain register` / `batch-register` to publish ObjectLayer items on-chain |
210
+ | ItemFCT on-chain binding | `cyberia-server` | ItemGain/Loss FCT events trigger Engine relayer to mint/burn on Besu |
211
+
212
+ ---
213
+
214
+ ## Domain Architecture
215
+
216
+ | Domain | Role | Smart Contract |
217
+ | ------------------- | -------------------------- | ------------------------------ |
218
+ | `cryptokoyn.net` | CKY fungible token hub | ObjectLayerToken Token ID 0 |
219
+ | `itemledger.com` | Object Layer item registry | ObjectLayerToken Token IDs ≥ 1 |
220
+ | `cyberiaonline.com` | Game runtime | Uses both token domains |
221
+
222
+ ---
223
+
224
+ ## Technology Stack Summary
225
+
226
+ | Layer | Technology | Purpose |
227
+ | ---------------- | -------------------------------- | --------------------------- |
228
+ | Game client | C / WASM / Emscripten / Raylib | In-browser rendering |
229
+ | Game server | Go / chi / gorilla WS | Real-time AOI |
230
+ | Engine | Node.js / Express / Mongoose | Data persistence + gRPC |
231
+ | Database | MongoDB (StatefulSet) | Game world data |
232
+ | Cache | Valkey | Session cache |
233
+ | Asset storage | IPFS + Kubo + IPFS Cluster | Content-addressed assets |
234
+ | Inter-service | gRPC + Protobuf | Go ↔ Node.js data pipeline |
235
+ | Blockchain | Hyperledger Besu (IBFT2/QBFT) | Permissioned EVM |
236
+ | Smart contracts | Solidity 0.8.27 / OpenZeppelin 5 | ERC-1155 ObjectLayerToken |
237
+ | Contract tooling | Hardhat 3.x + Ethers v6 | Compile, test, deploy |
238
+ | Infrastructure | Kubernetes (kubeadm / kind) | Container orchestration |
239
+ | Infra CLI | Underpost CLI | Bare-metal automation |
240
+ | Game CLI | Cyberia CLI (extends Underpost) | Content + economy toolchain |