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,443 @@
1
+ # Cyberia Online — System Architecture
2
+
3
+ **Version:** 3.0.3 | **Status:** Current
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Cyberia Online is a real-time tap-based sandbox MMORPG built on three independent service layers communicating through well-defined binary and gRPC protocols. The system separates concerns across:
10
+
11
+ 1. **Engine-Cyberia** (Node.js) — data persistence, gRPC data service, REST API, CI/CD tooling.
12
+ 2. **cyberia-server** (Go) — real-time multiplayer game logic, binary WebSocket AOI protocol.
13
+ 3. **cyberia-client** (C/WASM) — game rendering client compiled to WebAssembly.
14
+
15
+ ---
16
+
17
+ ## High-Level System Diagram
18
+
19
+ ```mermaid
20
+ graph TB
21
+ subgraph Client["cyberia-client (C/WASM)"]
22
+ SDL["SDL2 + OpenGL ES2\nRendering Pipeline"]
23
+ BinDecoder["Binary AOI Decoder"]
24
+ OLEngine["Object Layer Engine\nAtlas Sprite Compositor"]
25
+ Input["Tap/Click Input Handler"]
26
+ end
27
+
28
+ subgraph GoServer["cyberia-server (Go)"]
29
+ WS["WebSocket Server :8081\nBinary AOI Protocol"]
30
+ AOI["Area of Interest (AOI)\nSpatial Filtering"]
31
+ PathFinding["A* Pathfinding\n(Bot Navigation)"]
32
+ Skills["Skill Dispatcher\nProjectile · Doppelganger"]
33
+ Economy["Economy Module\nFountain & Sink"]
34
+ gRPCClient["gRPC Client\nWorld Builder"]
35
+ end
36
+
37
+ subgraph Engine["engine-cyberia (Node.js)"]
38
+ Express["Express REST API\n:4005–4014"]
39
+ gRPCServer["gRPC Server :50051\nCyberiaDataService"]
40
+ MongoDB["MongoDB\nMongoose ORM"]
41
+ Valkey["Valkey\n(Redis-compatible)"]
42
+ IPFS["IPFS Cluster + Kubo\nAsset Pinning"]
43
+ end
44
+
45
+ subgraph Blockchain["Hyperledger Besu :8545"]
46
+ OLT["ObjectLayerToken\nERC-1155 Contract"]
47
+ end
48
+
49
+ Client <-->|"WS binary messages\n(little-endian)"| GoServer
50
+ Client <-->|"REST: atlas PNG\nmetadata JSON"| Engine
51
+ GoServer <-->|"gRPC :50051\nGetFullInstance\nGetObjectLayerBatch\nGetMapData · Ping"| Engine
52
+ Engine <-->|"ethers.js\nEIP-712 + ERC-1155"| Blockchain
53
+ Engine <-->|"IPFS API"| IPFS
54
+ Engine <-->|"mongoose"| MongoDB
55
+ ```
56
+
57
+ ---
58
+
59
+ ## Component Details
60
+
61
+ ### Engine-Cyberia (Node.js)
62
+
63
+ The authoritative backend providing all persistent game data through two transport layers:
64
+
65
+ **REST APIs (Express):**
66
+
67
+ | API | Description |
68
+ | ---------------------------- | --------------------------------------------------- |
69
+ | `object-layer` | CRUD for ObjectLayer documents (AtomicPrefab) |
70
+ | `object-layer-render-frames` | Atlas frame matrix and color palette documents |
71
+ | `atlas-sprite-sheet` | Consolidated atlas PNG + metadata |
72
+ | `cyberia-instance` | Instance graph (maps + portal topology) |
73
+ | `cyberia-map` | Map grid, entity placements, metadata |
74
+ | `cyberia-entity` | Entity definitions |
75
+ | `cyberia-instance-conf` | Instance configuration (skills, economy, equipment) |
76
+ | `cyberia-quest` | Quest definitions |
77
+ | `cyberia-quest-progress` | Per-player quest progress |
78
+ | `cyberia-action` | NPC action definitions |
79
+ | `cyberia-dialogue` | Dialogue lines |
80
+
81
+ **gRPC Service (`CyberiaDataService`):**
82
+
83
+ | RPC | Description |
84
+ | ------------------------------- | ---------------------------------------------------------------- |
85
+ | `GetFullInstance(instanceCode)` | Instance graph + maps + entities + ObjectLayers + InstanceConfig |
86
+ | `GetMapData(mapCode)` | Single map grid and entity data |
87
+ | `GetObjectLayerBatch()` | Stream all ObjectLayers (cache warm-up) |
88
+ | `GetObjectLayer(itemId)` | Single ObjectLayer by item ID |
89
+ | `GetObjectLayerManifest()` | All `itemId + sha256` pairs (hot-reload diff) |
90
+ | `Ping()` | Engine liveness check |
91
+
92
+ **Fallback Instance:** When `GetFullInstance` is called with an unknown instance code, the Engine returns a minimal playable fallback (1 empty 64×64 map, no bots, no ObjectLayers) instead of `NOT_FOUND`.
93
+
94
+ ---
95
+
96
+ ### cyberia-server (Go)
97
+
98
+ Real-time multiplayer game server. Consumes gRPC data at startup, then runs independently:
99
+
100
+ ```mermaid
101
+ graph LR
102
+ A["gRPC\nGetFullInstance"] --> B["BuildWorldFromInstance\ninstance_loader.go"]
103
+ B --> C["Maps + Portals\n+ Entity Registry"]
104
+ C --> D["Game Loop\nserver.go"]
105
+ D --> E["AOI Ticks\naoi_binary.go"]
106
+ E --> F["Binary WS Messages\nto C clients"]
107
+ ```
108
+
109
+ **Key source files:**
110
+
111
+ | File | Responsibility |
112
+ | ----------------------- | ----------------------------------------------------- |
113
+ | `server.go` | WebSocket lifecycle, game loop, player registry |
114
+ | `aoi_binary.go` | Binary AOI wire format encoder/decoder |
115
+ | `object_layer.go` | ObjectLayer Go types mirroring the MongoDB schema |
116
+ | `collision.go` | Grid collision detection, portal transitions |
117
+ | `pathfinding.go` | A\* pathfinding for bot navigation |
118
+ | `skill.go` | Skill entry points: tap action trigger, on-kill hooks |
119
+ | `skill_dispatcher.go` | Skill registry: `InitSkills`, `DispatchSkill` |
120
+ | `skill_projectile.go` | Projectile skill handler |
121
+ | `skill_doppelganger.go` | Doppelganger skill handler |
122
+ | `economy.go` | Fountain & Sink coin economy |
123
+ | `frozen_state.go` | FrozenInteractionState (modal protection) |
124
+ | `entity_status.go` | Entity Status Indicator (ESI) computation |
125
+ | `life_regen.go` | HP regeneration loop |
126
+ | `ai.go` | Bot AI behavior (hostile/passive) |
127
+ | `stats.go` | Stat aggregation and sum-stats limit enforcement |
128
+ | `instance_loader.go` | World reconstruction from gRPC data |
129
+ | `handlers.go` | WebSocket message handlers |
130
+ | `grpcclient/` | gRPC client implementation |
131
+
132
+ ---
133
+
134
+ ### cyberia-client (C/WASM)
135
+
136
+ Game client compiled to WebAssembly with Emscripten. Runs in the browser.
137
+
138
+ **Key source files:**
139
+
140
+ | File | Responsibility |
141
+ | ---------------------------- | --------------------------------------- |
142
+ | `main.c` | Entry point, game loop |
143
+ | `game_render.c` | Main rendering pipeline |
144
+ | `game_state.c` | Client-side game state management |
145
+ | `network.c` | WebSocket connection + message dispatch |
146
+ | `binary_aoi_decoder.c` | Binary AOI message parser |
147
+ | `object_layer.c` | ObjectLayer metadata store |
148
+ | `object_layers_management.c` | Multi-layer management per entity |
149
+ | `entity_render.c` | Per-entity layer compositing |
150
+ | `layer_z_order.c` | Z-order sorting for rendering |
151
+ | `ol_as_animated_ico.c` | Animated Object Layer rendering |
152
+ | `ol_stack_ico.c` | Stacked icon rendering |
153
+ | `texture_manager.c` | Atlas texture loading and caching |
154
+ | `input.c` | Tap/click input handling |
155
+ | `floating_combat_text.c` | FCT event rendering |
156
+ | `inventory_bar.c` | Bottom inventory bar UI |
157
+ | `inventory_modal.c` | Full inventory modal |
158
+ | `entity_overhead_ui.c` | Nameplate + status icon rendering |
159
+ | `interaction_bubble.c` | NPC interaction prompt bubble |
160
+ | `tap_effect.c` | Tap visual feedback animation |
161
+ | `modal_dialogue.c` | NPC dialogue modal |
162
+ | `modal_player.c` | Player info modal |
163
+ | `message_parser.c` | Server message routing |
164
+
165
+ **Build system:**
166
+
167
+ ```bash
168
+ # Development build
169
+ make -f Web.mk clean && make -f Web.mk web
170
+
171
+ # Production / release build
172
+ make -f Web.mk clean && make -f Web.mk web BUILD_MODE=RELEASE
173
+ ```
174
+
175
+ ---
176
+
177
+ ## Binary AOI Wire Protocol
178
+
179
+ The Go server and C client communicate via a custom little-endian binary WebSocket protocol. Only render-essential data is transmitted; atlas binaries are fetched from the Engine REST API independently.
180
+
181
+ ```
182
+ Header (5 bytes):
183
+ [0] u8 msgType
184
+ 0x01 = aoi_update (partial delta update)
185
+ 0x02 = init_data (full game config on connect)
186
+ 0x03 = full_aoi (complete world snapshot)
187
+ 0x04 = FCT (Floating Combat Text, 14 bytes fixed)
188
+ 0x05 = ItemFCT (Item quantity FCT, variable)
189
+ [1..2] u16 reserved (0)
190
+ [3..4] u16 entityCount
191
+
192
+ Per-entity block (variable):
193
+ [0] u8 flags
194
+ bits 0-2: entity type (0=player, 1=bot, 2=floor, 3=obstacle, 4=portal, 5=foreground)
195
+ bit 3: removed (entity left AOI)
196
+ bit 4: has life data
197
+ bit 5: has respawn timer
198
+ bit 6: has behavior string
199
+ bit 7: has color data (RGBA)
200
+ [1..36] 36B entity UUID (zero-padded)
201
+ -- if not removed: --
202
+ f32 posX, posY, dimW, dimH
203
+ u8 direction (0–8: UP, UP_RIGHT, RIGHT, DOWN_RIGHT, DOWN, DOWN_LEFT, LEFT, UP_LEFT, NONE)
204
+ u8 mode (0=idle, 1=walking, 2=teleporting)
205
+ -- if bit 4: f32 life, f32 maxLife --
206
+ -- if bit 5: f32 respawnIn --
207
+ -- if bit 6: u8 behaviorLen + str behavior --
208
+ -- if bit 7: u8 r, g, b, a --
209
+ -- item ID stack: --
210
+ u8 itemIdCount
211
+ per item: u8 len + str itemId
212
+
213
+ Self-player section (appended after entity blocks):
214
+ <entity block fields>
215
+ f32 aoiMinX, aoiMinY, aoiMaxX, aoiMaxY
216
+ u8 onPortal
217
+ u16 sumStatsLimit
218
+ u16 activeStatsSum
219
+ u8+str mapCode
220
+ u8 pathLen
221
+ per path point: i16 x, i16 y
222
+ i16 targetPosX, targetPosY
223
+ u8+str activePortalID
224
+ u32 coinBalance
225
+ <full inventory>
226
+ u8 frozen (FrozenInteractionState)
227
+ ```
228
+
229
+ **FCT message (14 bytes fixed):**
230
+
231
+ | `fctType` | Constant | Color | Display |
232
+ | --------- | ----------------- | ------ | -------------- |
233
+ | `0x00` | `FCTTypeDamage` | Red | `-N` HP lost |
234
+ | `0x01` | `FCTTypeRegen` | Green | `+N` HP gained |
235
+ | `0x02` | `FCTTypeCoinGain` | Yellow | `+N` coins |
236
+ | `0x03` | `FCTTypeCoinLoss` | Yellow | `-N` coins |
237
+ | `0x04` | `FCTTypeItemGain` | Cyan | `+N ItemID` |
238
+ | `0x05` | `FCTTypeItemLoss` | Purple | `-N ItemID` |
239
+
240
+ ---
241
+
242
+ ## gRPC Data Pipeline
243
+
244
+ ```mermaid
245
+ graph LR
246
+ Engine["Node.js Engine\nMongoDB + Express\ngrpc-server.js :50051"]
247
+ GoServer["Go Game Server\ncyberia-server\ngrpcclient/"]
248
+
249
+ Engine -->|"GetFullInstance\nGetObjectLayerBatch\nGetMapData · Ping\nGetObjectLayerManifest"| GoServer
250
+ ```
251
+
252
+ **Data flow:**
253
+
254
+ ```
255
+ MongoDB (CyberiaInstance + CyberiaMap + ObjectLayer)
256
+
257
+
258
+ Node.js Engine (grpc-server.js)
259
+ │ GetFullInstance → instance graph + maps + entities + ObjectLayers + InstanceConfig
260
+ │ GetObjectLayerBatch → stream all ObjectLayers
261
+ │ GetObjectLayerManifest → itemId + sha256 pairs (hot-reload diffing)
262
+ │ Ping → liveness check
263
+
264
+ Go Game Server (world_builder.go → instance_loader.go → server.go)
265
+ │ ApplyInstanceConfig → sets all game parameters from gRPC
266
+ │ BuildWorldFromInstance → builds maps, entities, portals
267
+ │ ReplaceObjectLayerCache → caches ObjectLayer metadata
268
+
269
+ C/WASM Client (WebSocket binary AOI protocol)
270
+ │ init_data → game config, player state, grid dimensions
271
+ │ metadata → ObjectLayer cache (delivered once after connect)
272
+ │ aoi_update → binary-encoded entity positions, directions, modes, colors, item stacks
273
+ ```
274
+
275
+ ---
276
+
277
+ ## Instance Topology
278
+
279
+ A `CyberiaInstance` is a directed graph:
280
+
281
+ - **Vertices** = `CyberiaMap` documents (grid-based maps).
282
+ - **Edges** = `PortalEdge` records connecting source cell → target map/cell.
283
+
284
+ **Portal modes:**
285
+
286
+ | Mode | Behavior |
287
+ | -------------- | ------------------------------------------- |
288
+ | `inter-portal` | Teleport to specific cell on target map |
289
+ | `inter-random` | Teleport to random valid cell on target map |
290
+ | `intra-portal` | Teleport within same map to specific cell |
291
+ | `intra-random` | Teleport within same map to random cell |
292
+
293
+ **Topology modes:** `linear`, `hub-spoke`, `open`, `grid`.
294
+
295
+ ---
296
+
297
+ ## Entity Types and Status Indicators
298
+
299
+ ### Entity Types
300
+
301
+ | Type | Behavior | Description |
302
+ | -------------- | --------------------- | --------------------------- |
303
+ | `player` | interactive | Local player (self) |
304
+ | `other_player` | interactive | Remote players in AOI |
305
+ | `bot` | `hostile` / `passive` | AI-controlled entities |
306
+ | `skill` | `skill` | Runtime-spawned projectile |
307
+ | `coin` | `coin` | Runtime-spawned collectible |
308
+ | `floor` | static | Terrain tile |
309
+ | `obstacle` | static | Collision tile |
310
+ | `portal` | static | Zone transition trigger |
311
+ | `foreground` | static | Foreground decoration |
312
+ | `resource` | extractable | Exploitable world object |
313
+
314
+ ### Entity Status Indicator (ESI)
315
+
316
+ The Go server computes a status `u8` per entity on each AOI tick. The C client renders the corresponding icon above the entity nameplate:
317
+
318
+ | `id` | Name | Icon | Description |
319
+ | ---- | -------------------- | --------------- | -------------------------------- |
320
+ | 0 | `none` | — | Skill/coin bots, world objects |
321
+ | 1 | `passive` | arrow-down-gray | Non-aggressive bot |
322
+ | 2 | `hostile` | arrow-down-red | Aggressive bot (will aggro) |
323
+ | 3 | `frozen` | chat | Player in FrozenInteractionState |
324
+ | 4 | `player` | arrow-down | Normal alive player |
325
+ | 5 | `dead` | skull | Dead / respawning entity |
326
+ | 6 | `resource` | arrow-down-gray | Static exploitable resource |
327
+ | 7 | `resource-extracted` | clock | Depleted resource (respawning) |
328
+ | 8 | `action-provider` | chat (bounce) | NPC with available actions |
329
+
330
+ ---
331
+
332
+ ## FrozenInteractionState
333
+
334
+ When a player opens a modal (dialogue, inventory, shop, craft), they enter **FrozenInteractionState**:
335
+
336
+ - Cannot deal or receive damage.
337
+ - Cannot send or receive movement events.
338
+ - The rest of the world continues normally.
339
+ - Managed exclusively by `FreezePlayer` / `ThawPlayer` in `frozen_state.go`.
340
+
341
+ ---
342
+
343
+ ## Skill System
344
+
345
+ ### Item → Skill Mapping
346
+
347
+ ```
348
+ CyberiaInstanceConf.skillConfig[]:
349
+ triggerItemId: "atlas_pistol_mk2" ← item in player's active object layers
350
+ logicEventIds: ["projectile"] ← ordered handler keys executed in sequence
351
+ ```
352
+
353
+ ### Skill Handlers
354
+
355
+ | `logicEventId` | Handler | Description |
356
+ | -------------------------- | ---------------------------- | ------------------------------------------------ |
357
+ | `projectile` | `executeProjectileSkill()` | Spawn a directional projectile entity |
358
+ | `doppelganger` | `executeDoppelgangerSkill()` | Spawn a temporary allied duplicate |
359
+ | `coin_drop_or_transaction` | economy handler | Spawn a coin entity at target position (economy) |
360
+
361
+ ### Skill Parameters (SkillRules)
362
+
363
+ | Parameter | Description |
364
+ | --------------------------------- | ------------------------------------------------ |
365
+ | `projectileSpawnChance` | Probability of spawning a projectile per trigger |
366
+ | `projectileLifetimeMs` | Projectile lifetime in milliseconds |
367
+ | `projectileWidth/Height` | Projectile entity dimensions |
368
+ | `projectileSpeedMultiplier` | Speed relative to base entity speed |
369
+ | `doppelgangerSpawnChance` | Probability of spawning a doppelganger |
370
+ | `doppelgangerLifetimeMs` | Doppelganger lifetime |
371
+ | `doppelgangerSpawnRadius` | Max spawn distance from player |
372
+ | `doppelgangerInitialLifeFraction` | Initial HP as fraction of player max HP |
373
+
374
+ ---
375
+
376
+ ## Development Setup
377
+
378
+ ```bash
379
+ # Terminal 1: Engine (Node.js)
380
+ cd /home/dd/engine
381
+ npm run dev
382
+ # Starts Express :4005+, gRPC :50051, connects to MongoDB
383
+
384
+ # Terminal 2: Go game server
385
+ cd /home/dd/engine/cyberia-server
386
+ cat > .env << 'EOF'
387
+ ENGINE_GRPC_ADDRESS=localhost:50051
388
+ INSTANCE_CODE=cyberia-main
389
+ ENGINE_API_BASE_URL=http://localhost:4005
390
+ SERVER_PORT=8081
391
+ EOF
392
+ go run main.go
393
+
394
+ # Terminal 3: C/WASM client
395
+ cd /home/dd/engine/cyberia-client
396
+ # Edit src/config.h: WS_URL="ws://localhost:8081/ws", API_BASE_URL="http://localhost:4005"
397
+ source ~/.emsdk/emsdk_env.sh
398
+ make -f Web.mk clean && make -f Web.mk web
399
+ make -f Web.mk serve-development # http://localhost:8082
400
+ ```
401
+
402
+ **Startup order is required:** Engine must start before the Go server dials gRPC; Go server must be running before the C client connects.
403
+
404
+ ### Dev Port Summary
405
+
406
+ | Component | Port | Protocol |
407
+ | ------------------- | ----- | --------- |
408
+ | Engine Express | 4005+ | HTTP/REST |
409
+ | Engine gRPC | 50051 | gRPC |
410
+ | Go server | 8081 | HTTP + WS |
411
+ | C client dev server | 8082 | HTTP |
412
+
413
+ ---
414
+
415
+ ## Production Deployment
416
+
417
+ ### Kubernetes Deployment Order
418
+
419
+ ```
420
+ 1. Engine (dd-cyberia) ← Express :4005–4014, gRPC :50051 (cluster-internal)
421
+ 2. Go server (mmo-server) ← ENGINE_GRPC_ADDRESS=<engine-clusterIP>:50051
422
+ 3. C client (mmo-client) ← static WASM files served on :8082
423
+ ```
424
+
425
+ ### Environment Variables
426
+
427
+ **Go Server:**
428
+
429
+ | Variable | Default | Description |
430
+ | --------------------------------- | ----------------- | ------------------------------------------------------------------------- |
431
+ | `ENGINE_GRPC_ADDRESS` | `localhost:50051` | Engine gRPC address (required) |
432
+ | `INSTANCE_CODE` | `default` | Instance code to load on startup |
433
+ | `SERVER_PORT` | `8081` | WebSocket + HTTP server listen port |
434
+ | `STATIC_DIR` | `./public` | Directory for static WASM client files |
435
+ | `ENGINE_GRPC_RELOAD_INTERVAL_SEC` | _(disabled)_ | ObjectLayer hot-reload polling interval |
436
+ | `READY_CMD` | _(empty)_ | Shell command to run after server starts (orchestration readiness signal) |
437
+
438
+ **C Client (compile-time, `src/config.h`):**
439
+
440
+ | Constant | Development | Production |
441
+ | -------------- | ------------------------ | ----------------------------------- |
442
+ | `WS_URL` | `ws://localhost:8081/ws` | `wss://server.cyberiaonline.com/ws` |
443
+ | `API_BASE_URL` | `http://localhost:4005` | `https://www.cyberiaonline.com` |