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,241 @@
1
+ # Entity Profile
2
+
3
+ **Module:** `src/api/cyberia-entity` · `src/api/cyberia-instance-conf`
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ An **Entity** is any object in the Cyberia Online game world — players, bots, NPCs, resource nodes, terrain tiles, portals, and skill-spawned projectiles. Every entity is represented as an ordered stack of **Object Layer** item IDs, a position on the grid, a type discriminator, and a runtime state.
10
+
11
+ ---
12
+
13
+ ## CyberiaEntity Schema (MongoDB)
14
+
15
+ ```
16
+ CyberiaEntity {
17
+ entityType: String // see Entity Type Registry below
18
+ initCellX: Number // initial grid column
19
+ initCellY: Number // initial grid row
20
+ dimX: Number // width in cells (default: 1)
21
+ dimY: Number // height in cells (default: 1)
22
+ color: String // RGBA fallback color (no active OL texture)
23
+ objectLayerItemIds: [String] // ordered list of ObjectLayer item IDs
24
+
25
+ // Bot-specific (ignored for non-bot entities)
26
+ spawnRadius: Number // max wander / respawn radius in cells
27
+ aggroRange: Number // attack range in cells (0 = passive)
28
+ maxLife: Number // maximum HP (0 = immortal)
29
+ lifeRegen: Number // HP regeneration per tick
30
+ }
31
+ ```
32
+
33
+ ---
34
+
35
+ ## Entity Type Registry
36
+
37
+ | `entityType` | Behavior | Map-placed | Description |
38
+ | -------------- | --------------------- | ---------- | ----------------------------------------------------- |
39
+ | `player` | interactive | no | Local (self) player |
40
+ | `other_player` | interactive | no | Remote players in AOI |
41
+ | `bot` | `hostile` / `passive` | yes | AI-controlled bot |
42
+ | `skill` | `skill` | no | Runtime-spawned projectile (created by skill system) |
43
+ | `coin` | `coin` | no | Runtime-spawned collectible (dropped on entity death) |
44
+ | `floor` | static | yes | Terrain tile (walkable) |
45
+ | `obstacle` | static | yes | Collision tile (blocks movement) |
46
+ | `portal` | static | yes | Zone transition trigger |
47
+ | `foreground` | static | yes | Foreground decoration layer |
48
+ | `resource` | extractable | yes | Exploitable world object (drops items on extraction) |
49
+
50
+ ---
51
+
52
+ ## Runtime PlayerState (Go)
53
+
54
+ ```go
55
+ type PlayerState struct {
56
+ ID string // Go server player UUID
57
+ MapCode string // current map
58
+ Pos Point // world position (float64 X, Y)
59
+ Dims Dimensions // entity size
60
+ Color ColorRGBA // fallback solid color
61
+ Direction Direction // UP, UP_RIGHT, RIGHT, DOWN_RIGHT, DOWN, DOWN_LEFT, LEFT, UP_LEFT, NONE
62
+ Mode ObjectLayerMode // IDLE, WALKING, TELEPORTING
63
+ ObjectLayers []ObjectLayerState // active OL stack: { ItemID, Active, Quantity }
64
+ MaxLife float64
65
+ Life float64
66
+ LifeRegen float64
67
+ Coins uint32 // flat coin balance (single source of truth)
68
+ Frozen bool // FrozenInteractionState active
69
+ FreezeReason string // "dialogue" | "inventory" | ...
70
+ Path []PointI // A* path (for smooth movement)
71
+ AOI Rectangle // current area-of-interest bounds
72
+ SumStatsLimit int // max aggregate stat sum (equipment rules)
73
+ }
74
+ ```
75
+
76
+ ---
77
+
78
+ ## ObjectLayer State
79
+
80
+ Each entity carries an ordered stack of `ObjectLayerState` entries:
81
+
82
+ ```go
83
+ type ObjectLayerState struct {
84
+ ItemID string // references ObjectLayer.data.item.id
85
+ Active bool // equipped/activated (only activable types can be true)
86
+ Quantity int // inventory quantity (for stackable items)
87
+ }
88
+ ```
89
+
90
+ The **active layers** determine the entity's rendered appearance and mechanical stats. The `Active` field is managed by the equipment rules.
91
+
92
+ ---
93
+
94
+ ## Equipment Rules
95
+
96
+ Equipment rules govern which item types may be simultaneously active on a character:
97
+
98
+ ```javascript
99
+ EQUIPMENT_RULES_DEFAULTS = {
100
+ activeItemTypes: ['skin', 'breastplate', 'weapon'], // only these types may be activated
101
+ onePerType: true, // at most one active item per type
102
+ requireSkin: true, // player must always have an active skin if they own any
103
+ };
104
+ ```
105
+
106
+ **Validation on `item_activation` request:**
107
+
108
+ 1. Reject if `item.type` not in `activeItemTypes`.
109
+ 2. If `onePerType`, deactivate any currently active item of the same type before activating the new one.
110
+ 3. If `requireSkin`, ensure a skin remains active after the change.
111
+
112
+ ---
113
+
114
+ ## Z-Order Rendering
115
+
116
+ The C client composites layers bottom-to-top by `item.type`:
117
+
118
+ ```
119
+ z-order type
120
+ ────── ───────────────────
121
+ 0 floor / obstacle / portal / foreground
122
+ 1 skin (base character body)
123
+ 2 breastplate (armor overlay)
124
+ 3 weapon (weapon overlay)
125
+ ```
126
+
127
+ `get_priority_for_type()` in `entity_render.c` maps item type → z-order integer. Multiple layers of the same type are rendered in declared order within that z-level.
128
+
129
+ ---
130
+
131
+ ## Stat Aggregation
132
+
133
+ Stats are aggregated across all **active** Object Layers on an entity. The server enforces a `sumStatsLimit` — the maximum sum of all stat values allowed for the player. Attempting to equip items that would exceed this limit is rejected.
134
+
135
+ **Active stats sum:**
136
+
137
+ $$\text{activeStatsSum} = \sum_{\text{active layers}} (\text{effect} + \text{resistance} + \text{agility} + \text{range} + \text{intelligence} + \text{utility})$$
138
+
139
+ The `sumStatsLimit` and `activeStatsSum` are sent to the client on each AOI update so the inventory UI can show remaining equip budget.
140
+
141
+ ---
142
+
143
+ ## Entity Status Indicator (ESI)
144
+
145
+ The Go server computes a status `u8` per entity each AOI tick. The C client renders the corresponding icon above the entity nameplate.
146
+
147
+ ```go
148
+ // Status constants (entity_status.go) — MUST stay in sync with JS STATUS_ICONS array
149
+ StatusNone = 0 // skill/coin bots, world objects
150
+ StatusPassive = 1 // passive bot
151
+ StatusHostile = 2 // hostile bot
152
+ StatusFrozen = 3 // player in FrozenInteractionState
153
+ StatusPlayer = 4 // normal alive player
154
+ StatusDead = 5 // dead / respawning entity
155
+ StatusResource = 6 // static exploitable resource
156
+ StatusResourceExtracted = 7 // depleted resource (respawning)
157
+ StatusActionProvider = 8 // NPC with available actions (bouncing chat icon)
158
+ ```
159
+
160
+ ---
161
+
162
+ ## Per-EntityType Defaults
163
+
164
+ Instance configuration (`CyberiaInstanceConf`) defines canonical defaults per entity type:
165
+
166
+ | Field | Description |
167
+ | ------------- | --------------------------------------------------------------------------------- |
168
+ | `liveItemIds` | ObjectLayer item IDs applied when entity is alive with no explicit items assigned |
169
+ | `deadItemIds` | ObjectLayer item IDs for dead/ghost/respawning state |
170
+ | `dropItemIds` | Items granted to the extractor when a resource entity is depleted |
171
+ | `colorKey` | Named palette color used as solid fallback when no active OL texture is available |
172
+
173
+ ---
174
+
175
+ ## Bot Entity Profile
176
+
177
+ Bot entities extend the base schema with runtime AI state:
178
+
179
+ ```go
180
+ type BotState struct {
181
+ // Inherits all PlayerState fields
182
+ Behavior string // "hostile" | "passive" | "skill" | "coin"
183
+ SpawnRadius int // wander / respawn radius
184
+ AggroRange int // attack range (0 = passive)
185
+ SpawnPoint PointI // original spawn cell
186
+ RespawnTimer time.Time // next respawn timestamp
187
+ }
188
+ ```
189
+
190
+ **Bot behaviors:**
191
+
192
+ | Behavior | AI Actions | Description |
193
+ | --------- | --------------------------------------- | ------------------------ |
194
+ | `hostile` | pathfind to player, attack | Aggressive enemy bot |
195
+ | `passive` | random wander | Non-aggressive world NPC |
196
+ | `skill` | move in direction, despawn on collision | Projectile entity |
197
+ | `coin` | static, collectible | Coin drop entity |
198
+
199
+ ---
200
+
201
+ ## Resource Entity Profile
202
+
203
+ Resource entities have a specific lifecycle:
204
+
205
+ ```
206
+ Alive (StatusResource)
207
+ → Player extracts (tap interaction)
208
+ → dropItemIds granted to player inventory
209
+ → Entity transitions to StatusResourceExtracted
210
+ → Respawn timer starts
211
+ → Entity returns to StatusResource
212
+ ```
213
+
214
+ ---
215
+
216
+ ## Entity Lifecycle Diagram
217
+
218
+ ```mermaid
219
+ stateDiagram-v2
220
+ [*] --> Alive : Spawned by instance_loader
221
+ Alive --> Dead : Life reaches 0 (combat/skill)
222
+ Alive --> ResourceExtracted : Player extracts (resource type)
223
+ Dead --> Alive : Respawn timer elapsed
224
+ ResourceExtracted --> Alive : Respawn timer elapsed
225
+ Alive --> Frozen : Player opens modal (FrozenInteractionState)
226
+ Frozen --> Alive : Player closes modal
227
+ Alive --> [*] : Entity removed from AOI
228
+ ```
229
+
230
+ ---
231
+
232
+ ## Coin Balance Architecture
233
+
234
+ Coins use a **flat + display split** design to avoid O(N) inventory traversal:
235
+
236
+ | Field | Type | Purpose |
237
+ | ----------------------------- | ------------------ | -------------------------------------------------------------------------------------------------- |
238
+ | `entity.Coins` | `uint32` | **Single source of truth** — all economy operations read/write this field O(1) |
239
+ | `coinItemId ObjectLayer slot` | `ObjectLayerState` | **Display only** — `Active: false`, `Quantity = Coins`, synced by `syncCoinOL()` on every mutation |
240
+
241
+ The `coin` item type is never activable. The inventory UI automatically renders it with a lock indicator.
@@ -0,0 +1,300 @@
1
+ # Hardhat Module
2
+
3
+ **Path:** `hardhat/`
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ The Hardhat module is the smart contract development, testing, and deployment environment for the **ObjectLayerToken** ERC-1155 contract — the on-chain economic reality layer of the Object Layer Protocol. It targets Hyperledger Besu private networks (IBFT2/QBFT) running on Kubernetes.
10
+
11
+ ---
12
+
13
+ ## Directory Structure
14
+
15
+ ```
16
+ hardhat/
17
+ hardhat.config.js Main Hardhat configuration
18
+ package.json
19
+ contracts/
20
+ ObjectLayerToken.sol ERC-1155 multi-token contract
21
+ scripts/
22
+ deployObjectLayerToken.js Deployment script
23
+ test/ Contract tests (Mocha + ethers v6)
24
+ deployments/ Deployment artifacts (auto-generated)
25
+ ignition/ Hardhat Ignition modules (optional)
26
+ networks/ Network-specific genesis configs
27
+ ```
28
+
29
+ ---
30
+
31
+ ## ObjectLayerToken Contract
32
+
33
+ ### Inheritance Chain
34
+
35
+ ```
36
+ ObjectLayerToken
37
+ └─ ERC1155 (OpenZeppelin 5.x — core multi-token standard)
38
+ └─ ERC1155Burnable (holders can burn their tokens)
39
+ └─ ERC1155Pausable (owner can freeze all transfers)
40
+ └─ ERC1155Supply (on-chain total supply per token ID)
41
+ └─ Ownable (mint, register, pause restricted to owner)
42
+ ```
43
+
44
+ ### Token ID Semantics
45
+
46
+ | Token ID | Semantic | Supply | Managed By |
47
+ | ---------------- | ------------------------------------------------ | ------------------------------------ | -------------- |
48
+ | `0` (CRYPTOKOYN) | Fungible in-game currency (CKY) | 10,000,000 × 10^18 | cryptokoyn.net |
49
+ | `≥ 1` | Object Layer item (weapon, skin, resource, etc.) | 1 = non-fungible; >1 = semi-fungible | itemledger.com |
50
+
51
+ ### Token ID Derivation
52
+
53
+ Token IDs ≥ 1 use a deterministic namespace-scoped derivation:
54
+
55
+ ```solidity
56
+ // computeTokenId(itemId) = uint256(keccak256(abi.encodePacked(namespace, itemId)))
57
+ // namespace = "cyberia.object-layer:"
58
+ uint256 tokenId = uint256(keccak256(abi.encodePacked("cyberia.object-layer:", itemId)));
59
+ ```
60
+
61
+ This guarantees:
62
+
63
+ - The same `itemId` always produces the same `tokenId`.
64
+ - Token IDs are collision-resistant across different item namespaces.
65
+ - Any party can independently verify a `tokenId` from an `itemId`.
66
+
67
+ ### Key State Variables
68
+
69
+ ```solidity
70
+ uint256 public constant CRYPTOKOYN = 0;
71
+ uint256 public constant INITIAL_CRYPTOKOYN_SUPPLY = 10_000_000 * 1e18;
72
+
73
+ mapping(uint256 => string) private _tokenCIDs; // tokenId → canonical IPFS CID
74
+ mapping(uint256 => string) private _itemIds; // tokenId → itemId string
75
+ mapping(bytes32 => uint256) private _itemIdToTokenId; // keccak256(itemId) → tokenId
76
+ ```
77
+
78
+ ### Events
79
+
80
+ | Event | Description |
81
+ | -------------------------------------------------------------------- | --------------------------------- |
82
+ | `ObjectLayerRegistered(tokenId, itemId, metadataCid, initialSupply)` | New item type registered on-chain |
83
+ | `MetadataUpdated(tokenId, metadataCid)` | Item metadata CID updated |
84
+ | `TransferSingle(operator, from, to, id, value)` | Single token transfer |
85
+ | `TransferBatch(operator, from, to, ids, values)` | Batch token transfer |
86
+ | `Paused(account)` | All transfers frozen |
87
+ | `Unpaused(account)` | Transfers resumed |
88
+
89
+ ### Key Functions
90
+
91
+ | Function | Access | Description |
92
+ | ------------------------------------------------------------ | ----------- | ----------------------------------------- |
93
+ | `registerObjectLayer(to, itemId, metadataCid, supply, data)` | `onlyOwner` | Register a new item + mint initial supply |
94
+ | `batchRegisterObjectLayers(to, items[])` | `onlyOwner` | Batch registration + mint |
95
+ | `mint(to, tokenId, amount, data)` | `onlyOwner` | Mint additional supply for existing token |
96
+ | `mintBatch(to, ids[], amounts[], data)` | `onlyOwner` | Batch mint |
97
+ | `burn(from, tokenId, amount)` | holder | Burn tokens |
98
+ | `burnBatch(from, ids[], amounts[])` | holder | Batch burn |
99
+ | `setTokenMetadataCID(tokenId, metadataCid)` | `onlyOwner` | Update IPFS metadata CID |
100
+ | `pause()` / `unpause()` | `onlyOwner` | Emergency transfer freeze |
101
+ | `computeTokenId(itemId)` | pure | Deterministic token ID computation |
102
+ | `getItemId(tokenId)` | view | Reverse lookup tokenId → itemId |
103
+ | `getTokenCID(tokenId)` | view | Get canonical IPFS CID for token |
104
+
105
+ ### URI Resolution
106
+
107
+ ```solidity
108
+ // uri(tokenId) returns: {baseTokenURI}{_tokenCIDs[tokenId]}
109
+ // e.g.: "ipfs://bafkrei...json"
110
+ // The returned URI resolves to the full ObjectLayer data JSON (AtomicPrefab)
111
+ ```
112
+
113
+ ---
114
+
115
+ ## Networks
116
+
117
+ ### Network Configuration (`hardhat.config.js`)
118
+
119
+ | Network | URL | Chain ID | Use Case |
120
+ | ------------ | ----------------------------------------------- | -------- | --------------------- |
121
+ | `hardhat` | in-process | - | Local testing |
122
+ | `besu-ibft2` | `BESU_IBFT2_RPC_URL` or `http://127.0.0.1:8545` | 777771 | Direct Besu IBFT2 RPC |
123
+ | `besu-qbft` | `BESU_QBFT_RPC_URL` or `http://127.0.0.1:8545` | 777771 | Direct Besu QBFT RPC |
124
+ | `besu-k8s` | `BESU_K8S_RPC_URL` or `http://127.0.0.1:30545` | 777771 | Kubernetes NodePort |
125
+
126
+ All Besu networks: `gasPrice: 0` (permissioned network, gasless model).
127
+
128
+ ### Coinbase Key Management
129
+
130
+ The deployment uses a coinbase private key read from `engine-private/eth-networks/besu/coinbase`:
131
+
132
+ ```javascript
133
+ const coinbaseKey = readPrivateKey('../engine-private/eth-networks/besu/coinbase');
134
+ ```
135
+
136
+ If the key file does not exist, the config falls back to a dummy key (safe for compilation-only workflows).
137
+
138
+ ---
139
+
140
+ ## Deployment
141
+
142
+ ### Prerequisites
143
+
144
+ ```bash
145
+ cd hardhat
146
+ npm install
147
+ ```
148
+
149
+ ### Compile Contracts
150
+
151
+ ```bash
152
+ npx hardhat compile
153
+ # Artifacts written to hardhat/artifacts/
154
+ ```
155
+
156
+ ### Deploy to Besu
157
+
158
+ ```bash
159
+ # Deploy to IBFT2 network
160
+ npx hardhat run scripts/deployObjectLayerToken.js --network besu-ibft2
161
+
162
+ # Deploy to QBFT network
163
+ npx hardhat run scripts/deployObjectLayerToken.js --network besu-qbft
164
+
165
+ # Deploy to Kubernetes cluster (via NodePort :30545)
166
+ npx hardhat run scripts/deployObjectLayerToken.js --network besu-k8s
167
+ ```
168
+
169
+ **Deployment script actions:**
170
+
171
+ 1. Connect to Besu RPC using the coinbase secp256k1 key.
172
+ 2. Deploy `ObjectLayerToken` contract.
173
+ 3. Mint `INITIAL_CRYPTOKOYN_SUPPLY` (10M CKY) to the deployer address.
174
+ 4. Verify initial state: total supply, deployer balance.
175
+ 5. Write deployment artifact to `hardhat/deployments/{network}/ObjectLayerToken.json`.
176
+
177
+ **Deployment artifact structure:**
178
+
179
+ ```json
180
+ {
181
+ "address": "0x...",
182
+ "abi": [...],
183
+ "txHash": "0x...",
184
+ "blockNumber": 42,
185
+ "deployer": "0x...",
186
+ "network": "besu-ibft2",
187
+ "chainId": 777771,
188
+ "timestamp": "2026-01-01T00:00:00.000Z"
189
+ }
190
+ ```
191
+
192
+ The artifact is consumed by:
193
+
194
+ - `bin/cyberia.js` CLI (`cyberia chain` subcommands).
195
+ - Engine gRPC server for contract address resolution.
196
+ - itemledger.com and cryptokoyn.net API servers.
197
+
198
+ ---
199
+
200
+ ## Running Tests
201
+
202
+ ```bash
203
+ cd hardhat
204
+ npx hardhat test
205
+
206
+ # With gas report
207
+ REPORT_GAS=true npx hardhat test
208
+ ```
209
+
210
+ Tests use **Mocha + ethers v6** via `@nomicfoundation/hardhat-toolbox-mocha-ethers`. The `hardhat` in-process network simulates Besu behavior.
211
+
212
+ ---
213
+
214
+ ## Cyberia CLI Integration
215
+
216
+ The Cyberia CLI (`bin/cyberia.js`) exposes the full Besu chain and contract lifecycle:
217
+
218
+ ### Key Management
219
+
220
+ ```bash
221
+ # Generate new Ethereum secp256k1 key pair
222
+ cyberia chain key-gen
223
+ # Save key pair to default paths
224
+ cyberia chain key-gen --save
225
+
226
+ # Set the coinbase deployer key from hex
227
+ cyberia chain set-coinbase --private-key 0xYOUR_PRIVATE_KEY_HEX
228
+ # Set from saved key file
229
+ cyberia chain set-coinbase --from-file ./engine-private/eth-networks/besu/<address>.key.json
230
+ ```
231
+
232
+ ### Network Lifecycle
233
+
234
+ ```bash
235
+ # Deploy Besu network to Kubernetes
236
+ cyberia chain deploy
237
+ cyberia chain deploy --consensus qbft
238
+
239
+ # Remove Besu network
240
+ cyberia chain remove
241
+ ```
242
+
243
+ ### Contract Lifecycle
244
+
245
+ ```bash
246
+ # Compile contracts
247
+ cyberia chain compile
248
+
249
+ # Deploy ObjectLayerToken (mints 10M CKY to deployer)
250
+ cyberia chain deploy-contract --network besu-ibft2
251
+
252
+ # Run contract tests
253
+ cyberia chain test
254
+ ```
255
+
256
+ ### Token Operations
257
+
258
+ ```bash
259
+ # Register a non-fungible unique item (uses canonical CID from MongoDB)
260
+ cyberia chain register --item-id legendary-hatchet --from-db --supply 1
261
+
262
+ # Register semi-fungible stackable resource
263
+ cyberia chain register --item-id gold-ore --from-db --supply 1000000
264
+
265
+ # Manual CID override
266
+ cyberia chain register --item-id legendary-hatchet --metadata-cid bafkrei... --supply 1
267
+
268
+ # Batch-register multiple items
269
+ cyberia chain batch-register --from-db --items '[{"itemId":"wood","supply":500000},{"itemId":"stone","supply":500000}]'
270
+
271
+ # Mint additional CKY
272
+ cyberia chain mint --token-id 0 --to 0xABCD...1234 --amount 1000000000000000000000
273
+
274
+ # Query balance
275
+ cyberia chain balance --address 0xABCD...1234 --token-id 0
276
+
277
+ # Transfer
278
+ cyberia chain transfer --from 0x... --to 0x... --token-id 0 --amount 1000
279
+
280
+ # Burn
281
+ cyberia chain burn --token-id 0 --amount 500 --address 0x...
282
+
283
+ # Status and governance
284
+ cyberia chain status
285
+ cyberia chain pause
286
+ cyberia chain unpause
287
+ ```
288
+
289
+ ---
290
+
291
+ ## Environment Variables
292
+
293
+ | Variable | Default | Description |
294
+ | --------------------- | ------------------------ | ----------------------------------- |
295
+ | `BESU_IBFT2_RPC_URL` | `http://127.0.0.1:8545` | Besu IBFT2 JSON-RPC URL |
296
+ | `BESU_QBFT_RPC_URL` | `http://127.0.0.1:8545` | Besu QBFT JSON-RPC URL |
297
+ | `BESU_K8S_RPC_URL` | `http://127.0.0.1:30545` | Kubernetes NodePort RPC URL |
298
+ | `BESU_IBFT2_CHAIN_ID` | `777771` | Chain ID override for IBFT2 |
299
+ | `REPORT_GAS` | `false` | Enable gas usage reporting in tests |
300
+ | `GAS_REPORT_FILE` | _(stdout)_ | Path for gas report output file |