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
@@ -23,6 +23,7 @@ import { loggerFactory } from './logger.js';
23
23
 
24
24
  import { registerFloorSemantics } from './semantic-layer-generator-floor.js';
25
25
  import { registerSkinSemantics } from './semantic-layer-generator-skin.js';
26
+ import { registerResourceSemantics } from './semantic-layer-generator-resource.js';
26
27
 
27
28
  const logger = loggerFactory(import.meta);
28
29
 
@@ -81,6 +82,64 @@ function deriveFrameSeed(layerSeed, frameIndex) {
81
82
  return hashString(`${layerSeed}:${frameIndex}`);
82
83
  }
83
84
 
85
+ /* ═══════════════════════════════════════════════════════════════════════════
86
+ * BIOME COLOUR PALETTES (canonical source — shared by floor + resource)
87
+ * ═══════════════════════════════════════════════════════════════════════════ */
88
+
89
+ /** @type {Object<string, number[][]>} */
90
+ const BIOME_PALETTES = {
91
+ desert: [
92
+ [210, 180, 120, 255],
93
+ [194, 160, 100, 255],
94
+ [230, 205, 150, 255],
95
+ [180, 140, 80, 255],
96
+ [160, 120, 70, 255],
97
+ [120, 90, 55, 255],
98
+ [100, 80, 50, 255],
99
+ [240, 220, 175, 255],
100
+ ],
101
+ grass: [
102
+ [80, 140, 60, 255],
103
+ [60, 120, 45, 255],
104
+ [110, 170, 80, 255],
105
+ [90, 130, 55, 255],
106
+ [130, 100, 65, 255],
107
+ [70, 110, 40, 255],
108
+ [150, 190, 100, 255],
109
+ [100, 85, 50, 255],
110
+ ],
111
+ water: [
112
+ [40, 100, 180, 255],
113
+ [60, 130, 200, 255],
114
+ [90, 160, 220, 255],
115
+ [120, 190, 230, 255],
116
+ [30, 80, 150, 255],
117
+ [70, 140, 210, 255],
118
+ [150, 210, 240, 255],
119
+ [20, 60, 120, 255],
120
+ ],
121
+ stone: [
122
+ [140, 140, 145, 255],
123
+ [120, 118, 125, 255],
124
+ [165, 165, 170, 255],
125
+ [100, 98, 105, 255],
126
+ [180, 180, 185, 255],
127
+ [90, 85, 80, 255],
128
+ [155, 150, 148, 255],
129
+ [110, 108, 115, 255],
130
+ ],
131
+ lava: [
132
+ [200, 50, 20, 255],
133
+ [230, 100, 30, 255],
134
+ [255, 180, 50, 255],
135
+ [160, 30, 10, 255],
136
+ [80, 20, 10, 255],
137
+ [50, 15, 8, 255],
138
+ [240, 140, 40, 255],
139
+ [120, 25, 12, 255],
140
+ ],
141
+ };
142
+
84
143
  /* ═══════════════════════════════════════════════════════════════════════════
85
144
  * SEMANTIC REGISTRY
86
145
  * ═══════════════════════════════════════════════════════════════════════════ */
@@ -111,6 +170,12 @@ function deriveFrameSeed(layerSeed, frameIndex) {
111
170
  * @property {number} [frameJitter]
112
171
  * @property {number} [frameRotation]
113
172
  * @property {number} [frameScale]
173
+ * @property {boolean} [fill] When true, shapes are scanline-filled (solid silhouettes).
174
+ * @property {Object} [shapeParams] Extra parameters forwarded to generateShape (e.g. {sides, closed, a, rangeX}).
175
+ * @property {number} [scaleBase=0.15] Base scale for stamped shapes (0..1 fraction of GRID_DIM).
176
+ * @property {number} [scaleRange=0.25] Random range added on top of scaleBase.
177
+ * @property {number} [rotationBase=0] Fixed rotation offset in degrees applied before random variance.
178
+ * @property {number} [centerBias=0] 0..1 factor pulling element positions toward the tile centre.
114
179
  * @memberof SemanticLayerGenerator
115
180
  */
116
181
 
@@ -153,6 +218,7 @@ export function lookupSemantic(itemId) {
153
218
  /* ── Load category submodules at startup ────────────────────────────────── */
154
219
  registerFloorSemantics(registerSemantic);
155
220
  registerSkinSemantics(registerSemantic);
221
+ registerResourceSemantics(registerSemantic);
156
222
 
157
223
  /* ═══════════════════════════════════════════════════════════════════════════
158
224
  * COLOR UTILITIES
@@ -262,9 +328,19 @@ function generateNoiseFieldLayer(palette, layerSeedInt, frameIndex, spec, densit
262
328
 
263
329
  /**
264
330
  * Stamps a parametric shape onto a frame matrix at a given position/scale.
331
+ * @param {number[][]} frameMatrix
332
+ * @param {number[][]} colors
333
+ * @param {string} shapeKey
334
+ * @param {Object} transform
335
+ * @param {number[]} color
336
+ * @param {number} noiseLevel
337
+ * @param {number} detailLevel
338
+ * @param {string|number} seed
339
+ * @param {boolean} [fill]
340
+ * @param {Object} [shapeParams] Extra parameters forwarded to generateShape (e.g. sides, closed, a, rangeX).
265
341
  * @memberof SemanticLayerGenerator
266
342
  */
267
- function stampShape(frameMatrix, colors, shapeKey, transform, color, noiseLevel, detailLevel, seed) {
343
+ function stampShape(frameMatrix, colors, shapeKey, transform, color, noiseLevel, detailLevel, seed, fill, shapeParams) {
268
344
  const gridSize = Math.max(4, Math.round(GRID_DIM * transform.scale));
269
345
  const result = generateShape(shapeKey, {
270
346
  intCoords: [gridSize, gridSize],
@@ -272,6 +348,8 @@ function stampShape(frameMatrix, colors, shapeKey, transform, color, noiseLevel,
272
348
  rotation: transform.rotation,
273
349
  seed,
274
350
  count: Math.round(80 * detailLevel),
351
+ fill: !!fill,
352
+ ...shapeParams,
275
353
  });
276
354
 
277
355
  const existingIdx = colors.findIndex(
@@ -430,10 +508,17 @@ export function generateFrame(options) {
430
508
  const shapeKey = pickShape(spec.shapes, preferredShapes, createRng(layerSeedInt + ei * 97));
431
509
 
432
510
  const baseRng = createRng(layerSeedInt + ei * 31 + 17);
433
- const baseX = baseRng();
434
- const baseY = baseRng();
435
- const baseScale = 0.15 + baseRng() * 0.25 + (baseRng() * 2 - 1) * spec.scaleVariance * 0.15;
436
- const baseRotation = (baseRng() * 2 - 1) * spec.rotationVariance;
511
+ let baseX = baseRng();
512
+ let baseY = baseRng();
513
+ const cb = spec.centerBias ?? 0;
514
+ if (cb > 0) {
515
+ baseX = baseX + (0.5 - baseX) * cb;
516
+ baseY = baseY + (0.5 - baseY) * cb;
517
+ }
518
+ const sBase = spec.scaleBase ?? 0.15;
519
+ const sRange = spec.scaleRange ?? 0.25;
520
+ const baseScale = sBase + baseRng() * sRange + (baseRng() * 2 - 1) * spec.scaleVariance * 0.15;
521
+ const baseRotation = (spec.rotationBase ?? 0) + (baseRng() * 2 - 1) * spec.rotationVariance;
437
522
 
438
523
  const fj = spec.frameJitter || 0;
439
524
  const fr = spec.frameRotation || 0;
@@ -459,12 +544,28 @@ export function generateFrame(options) {
459
544
  const shapeSeed = `${seed}:${itemId}:${layerKey}:${ei}`;
460
545
 
461
546
  stampShape(
462
- compositeMatrix, compositeColors, shapeKey, transform, color,
463
- spec.noiseLevel * (spec.jitter + 0.5), spec.detailLevel, shapeSeed,
547
+ compositeMatrix,
548
+ compositeColors,
549
+ shapeKey,
550
+ transform,
551
+ color,
552
+ spec.noiseLevel * (spec.jitter + 0.5),
553
+ spec.detailLevel,
554
+ shapeSeed,
555
+ spec.fill,
556
+ spec.shapeParams,
464
557
  );
465
558
  stampShape(
466
- layerMatrix, layerColors, shapeKey, transform, color,
467
- spec.noiseLevel * 0.5, spec.detailLevel, shapeSeed,
559
+ layerMatrix,
560
+ layerColors,
561
+ shapeKey,
562
+ transform,
563
+ color,
564
+ spec.noiseLevel * 0.5,
565
+ spec.detailLevel,
566
+ shapeSeed,
567
+ spec.fill,
568
+ spec.shapeParams,
468
569
  );
469
570
 
470
571
  layerEntries.push({ type: 'shape', shapeKey, transform, color, shapeSeed });
@@ -553,9 +654,7 @@ export function generateMultiFrame(options) {
553
654
  const mapping = {};
554
655
  for (let ci = 0; ci < frame.compositeColors.length; ci++) {
555
656
  const c = frame.compositeColors[ci];
556
- let found = globalColors.findIndex(
557
- (gc) => gc[0] === c[0] && gc[1] === c[1] && gc[2] === c[2] && gc[3] === c[3],
558
- );
657
+ let found = globalColors.findIndex((gc) => gc[0] === c[0] && gc[1] === c[1] && gc[2] === c[2] && gc[3] === c[3]);
559
658
  if (found < 0) {
560
659
  globalColors.push([...c]);
561
660
  found = globalColors.length - 1;
@@ -572,7 +671,6 @@ export function generateMultiFrame(options) {
572
671
 
573
672
  const objectLayerRenderFramesData = {
574
673
  frame_duration: frameDuration,
575
- is_stateless: descriptor.itemType === 'floor',
576
674
  frames: {},
577
675
  colors: globalColors,
578
676
  };
@@ -642,4 +740,14 @@ function hashMod(str, mod) {
642
740
  * EXPORTS
643
741
  * ═══════════════════════════════════════════════════════════════════════════ */
644
742
 
645
- export { hashString, deriveLayerSeed, deriveFrameSeed, pickColor, pickShape, seedToUUIDv4, GRID_DIM, semanticRegistry };
743
+ export {
744
+ hashString,
745
+ deriveLayerSeed,
746
+ deriveFrameSeed,
747
+ pickColor,
748
+ pickShape,
749
+ seedToUUIDv4,
750
+ GRID_DIM,
751
+ semanticRegistry,
752
+ BIOME_PALETTES,
753
+ };
@@ -155,6 +155,26 @@ registerShape('parabola', (t, params) => {
155
155
  return { x, y: a * x * x };
156
156
  });
157
157
 
158
+ registerShape('thick-parabola', (t, params) => {
159
+ // Closed parabolic band — traces the outer curve forward then the inner
160
+ // curve backward, producing a thick filled crescent when rasterized.
161
+ // `a` controls curvature, `rangeX` controls horizontal span, and
162
+ // `thickness` controls band width (vertical gap between outer/inner).
163
+ const a = params.a ?? 0.6;
164
+ const rangeX = params.rangeX ?? 1.3;
165
+ const thickness = params.thickness ?? 0.35;
166
+ if (t <= 0.5) {
167
+ // Outer parabola (forward: left → right)
168
+ const u = t * 2;
169
+ const xNorm = -rangeX + 2 * rangeX * u;
170
+ return { x: xNorm, y: a * xNorm * xNorm };
171
+ }
172
+ // Inner parabola (reverse: right → left, shifted up by thickness)
173
+ const u = 1 - (t - 0.5) * 2;
174
+ const xNorm = -rangeX + 2 * rangeX * u;
175
+ return { x: xNorm, y: a * xNorm * xNorm + thickness };
176
+ });
177
+
158
178
  registerShape('heart', (t) => {
159
179
  const angle = t * Math.PI * 2;
160
180
  const x = 16 * Math.pow(Math.sin(angle), 3);
@@ -408,6 +428,42 @@ registerShape('bezier-path', (t, params) => {
408
428
  return { x, y };
409
429
  });
410
430
 
431
+ registerShape('regular-polygon', (t, params) => {
432
+ // Regular convex polygon with `sides` edges.
433
+ // Traces straight vertex-to-vertex segments for perfect geometric figures.
434
+ const sides = Math.max(3, params.sides ?? 4);
435
+ const r = params.r ?? 1;
436
+ const segAngle = (2 * Math.PI) / sides;
437
+ const angle = t * Math.PI * 2;
438
+ // Which segment are we in?
439
+ const seg = Math.floor(angle / segAngle);
440
+ const frac = (angle - seg * segAngle) / segAngle;
441
+ // Offset: -π/2 puts first vertex at top (flat bottom for odd-sided).
442
+ // For even-sided polygons, shift by half a segment so edges are axis-aligned.
443
+ const offset = -Math.PI / 2 + (sides % 2 === 0 ? Math.PI / sides : 0);
444
+ const a0 = seg * segAngle + offset;
445
+ const a1 = (seg + 1) * segAngle + offset;
446
+ const x = r * ((1 - frac) * Math.cos(a0) + frac * Math.cos(a1));
447
+ const y = r * ((1 - frac) * Math.sin(a0) + frac * Math.sin(a1));
448
+ return { x, y };
449
+ });
450
+
451
+ registerShape('rectangle', (t, params) => {
452
+ // Axis-aligned rectangle with configurable aspect ratio.
453
+ // `width` and `height` control proportions (default: 1.4 × 1.0).
454
+ const w = params.width ?? 1.4;
455
+ const h = params.height ?? 1.0;
456
+ const hw = w / 2,
457
+ hh = h / 2;
458
+ const perim = 2 * (w + h);
459
+ const d = t * perim;
460
+ // Traverse: bottom-left → bottom-right → top-right → top-left
461
+ if (d < w) return { x: -hw + d, y: hh };
462
+ if (d < w + h) return { x: hw, y: hh - (d - w) };
463
+ if (d < 2 * w + h) return { x: hw - (d - w - h), y: -hh };
464
+ return { x: -hw, y: -hh + (d - 2 * w - h) };
465
+ });
466
+
411
467
  /* ═══════════════════════════════════════════════════════════════════════════
412
468
  * GEOMETRY HELPERS
413
469
  * ═══════════════════════════════════════════════════════════════════════════ */
@@ -677,6 +733,49 @@ function rasterizeContour(normalizedPoints, gridW, gridH, closed) {
677
733
  return unique;
678
734
  }
679
735
 
736
+ /**
737
+ * Scanline-fills the interior of a closed contour on an integer grid.
738
+ * Takes the contour points produced by `rasterizeContour` and returns a
739
+ * new array containing both the contour AND all interior cells.
740
+ *
741
+ * Uses the standard even-odd scanline algorithm: for each row, find the
742
+ * leftmost and rightmost contour cell then fill everything in between.
743
+ *
744
+ * @param {ShapePoint[]} contourPoints - Contour cells from rasterizeContour.
745
+ * @param {number} gridW - Grid width.
746
+ * @param {number} gridH - Grid height.
747
+ * @returns {ShapePoint[]} All unique filled cells (contour + interior).
748
+ * @memberof ShapeGenerator
749
+ */
750
+ function scanlineFill(contourPoints, gridW, gridH) {
751
+ // Build per-row min/max from contour
752
+ const rowBounds = new Map();
753
+ for (const p of contourPoints) {
754
+ const b = rowBounds.get(p.y);
755
+ if (b) {
756
+ if (p.x < b.min) b.min = p.x;
757
+ if (p.x > b.max) b.max = p.x;
758
+ } else {
759
+ rowBounds.set(p.y, { min: p.x, max: p.x });
760
+ }
761
+ }
762
+
763
+ const seen = new Set();
764
+ const filled = [];
765
+
766
+ for (const [y, { min, max }] of rowBounds) {
767
+ for (let x = min; x <= max; x++) {
768
+ const k = x * 100000 + y;
769
+ if (!seen.has(k)) {
770
+ seen.add(k);
771
+ filled.push({ x, y });
772
+ }
773
+ }
774
+ }
775
+
776
+ return filled;
777
+ }
778
+
680
779
  /**
681
780
  * Renders an integer-coordinate ShapeResult as an ASCII grid string.
682
781
  * Useful for quick visual verification of pixel-art shapes.
@@ -738,6 +837,9 @@ export function renderGrid(shapeResult, opts = {}) {
738
837
  * with Bresenham rasterization so that even on a 16×16 grid the full contour
739
838
  * is visible as a connected set of cells. `count` is ignored in this mode;
740
839
  * the number of output points equals the number of unique rasterized cells.
840
+ * @property {boolean} [fill=false] - When true (and intCoords is enabled),
841
+ * scanline-fills the interior of the closed contour, producing a solid
842
+ * silhouette instead of an outline-only shape.
741
843
  * @memberof ShapeGenerator
742
844
  */
743
845
 
@@ -810,6 +912,7 @@ export function generateShape(key, options = {}) {
810
912
  closed = true,
811
913
  normalize = true,
812
914
  intCoords = false,
915
+ fill = false,
813
916
  color,
814
917
  ...extraParams
815
918
  } = options;
@@ -896,6 +999,11 @@ export function generateShape(key, options = {}) {
896
999
  if (useIntCoords) {
897
1000
  points = rasterizeContour(points, gridW, gridH, closed);
898
1001
 
1002
+ // ---- Scanline fill (solid silhouette) -----------------------------------
1003
+ if (fill && closed) {
1004
+ points = scanlineFill(points, gridW, gridH);
1005
+ }
1006
+
899
1007
  // Build metadata for integer grid mode
900
1008
  const bbox = computeBbox(points);
901
1009
  /** @type {ShapeMetadata} */
@@ -131,11 +131,21 @@ class UnderpostStartUp {
131
131
  * @param {boolean} options.build - Whether to build the deployment.
132
132
  * @param {boolean} options.run - Whether to run the deployment.
133
133
  * @param {boolean} options.underpostQuicklyInstall - Whether to use underpost quickly install.
134
+ * @param {boolean} options.skipPullBase - Whether to skip pulling the base code.
135
+ * @param {boolean} options.skipFullBuild - Whether to skip building the full client bundle.
136
+ * @param {boolean} options.pullBundle - When true, download pre-built client bundle from Cloudinary via pull-bundle before starting.
134
137
  */
135
138
  async callback(
136
139
  deployId = 'dd-default',
137
140
  env = 'development',
138
- options = { build: false, run: false, underpostQuicklyInstall: false },
141
+ options = {
142
+ build: false,
143
+ run: false,
144
+ underpostQuicklyInstall: false,
145
+ skipPullBase: false,
146
+ skipFullBuild: false,
147
+ pullBundle: false,
148
+ },
139
149
  ) {
140
150
  Underpost.env.set('container-status', `${deployId}-${env}-build-deployment`);
141
151
  if (options.build === true) await Underpost.start.build(deployId, env, options);
@@ -149,12 +159,15 @@ class UnderpostStartUp {
149
159
  * @param {Object} options - Options for the build.
150
160
  * @param {boolean} options.skipPullBase - Whether to skip pulling the base code and use the current workspace code directly.
151
161
  * @param {boolean} options.underpostQuicklyInstall - Whether to use underpost quickly install.
162
+ * @param {boolean} options.skipFullBuild - Whether to skip building the full client bundle.
163
+ * @param {boolean} options.pullBundle - When true, download pre-built client bundle from Cloudinary via pull-bundle (must be pushed first with push-bundle).
164
+ * This flag is independent of skipFullBuild: it can be combined with skipFullBuild or used alone.
152
165
  * @memberof UnderpostStartUp
153
166
  */
154
167
  async build(
155
168
  deployId = 'dd-default',
156
169
  env = 'development',
157
- options = { underpostQuicklyInstall: false, skipPullBase: false },
170
+ options = { underpostQuicklyInstall: false, skipPullBase: false, skipFullBuild: false, pullBundle: false },
158
171
  ) {
159
172
  const buildBasePath = `/home/dd`;
160
173
  const repoName = `engine-${deployId.split('-')[1]}`;
@@ -173,7 +186,8 @@ class UnderpostStartUp {
173
186
  for (const itcScript of itcScripts)
174
187
  if (itcScript.match(deployId)) shellExec(`node ./engine-private/itc-scripts/${itcScript}`);
175
188
  }
176
- shellExec(`node bin client ${deployId}`);
189
+ if (options.pullBundle === true) shellExec(`node bin run pull-bundle --deploy-id ${deployId}`);
190
+ else if (!options.skipFullBuild) shellExec(`node bin client ${deployId}`);
177
191
  },
178
192
  /**
179
193
  * Runs a deployment.