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.
- package/.github/workflows/engine-cyberia.cd.yml +2 -2
- package/.github/workflows/release.cd.yml +1 -2
- package/CHANGELOG.md +351 -1
- package/CLI-HELP.md +40 -13
- package/Dockerfile +0 -4
- package/README.md +242 -497
- package/bin/build.js +19 -5
- package/bin/cyberia.js +1149 -240
- package/bin/deploy.js +570 -1
- package/bin/file.js +6 -0
- package/bin/index.js +1149 -240
- package/bin/vs.js +1 -1
- package/conf.js +67 -89
- package/deployment.yaml +4 -222
- package/hardhat/package-lock.json +32 -32
- package/hardhat/package.json +3 -3
- package/jsconfig.json +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +4 -222
- package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
- package/manifests/deployment/dd-test-development/deployment.yaml +136 -66
- package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
- package/package.json +23 -14
- package/proxy.yaml +10 -118
- package/scripts/k3s-node-setup.sh +2 -2
- package/scripts/nat-iptables.sh +103 -18
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +76 -21
- package/src/api/core/core.controller.js +10 -10
- package/src/api/core/core.service.js +10 -10
- package/src/api/crypto/crypto.controller.js +8 -8
- package/src/api/crypto/crypto.service.js +8 -8
- package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
- package/src/api/cyberia-action/cyberia-action.model.js +87 -0
- package/src/api/cyberia-action/cyberia-action.router.js +27 -0
- package/src/api/cyberia-action/cyberia-action.service.js +42 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +16 -16
- package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
- package/src/api/cyberia-entity/cyberia-entity.service.js +10 -10
- package/src/api/cyberia-instance/cyberia-fallback-world.js +19 -209
- package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
- package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
- package/src/api/cyberia-instance/cyberia-instance.service.js +22 -57
- package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
- package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +216 -55
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +4 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +18 -14
- package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
- package/src/api/cyberia-map/cyberia-map.service.js +10 -10
- package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
- package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +27 -0
- package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +27 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
- package/src/api/default/default.controller.js +10 -10
- package/src/api/default/default.service.js +10 -10
- package/src/api/document/document.controller.js +12 -12
- package/src/api/document/document.model.js +10 -16
- package/src/api/file/file.controller.js +8 -8
- package/src/api/file/file.model.js +10 -10
- package/src/api/file/file.service.js +36 -36
- package/src/api/instance/instance.controller.js +10 -10
- package/src/api/instance/instance.model.js +4 -10
- package/src/api/instance/instance.service.js +10 -10
- package/src/api/ipfs/ipfs.controller.js +12 -12
- package/src/api/ipfs/ipfs.model.js +4 -13
- package/src/api/ipfs/ipfs.service.js +14 -28
- package/src/api/object-layer/object-layer.controller.js +12 -12
- package/src/api/object-layer/object-layer.model.js +4 -17
- package/src/api/object-layer/object-layer.service.js +12 -12
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
- package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +18 -14
- package/src/api/test/test.controller.js +8 -8
- package/src/api/test/test.service.js +8 -8
- package/src/api/user/guest.service.js +99 -0
- package/src/api/user/user.controller.js +6 -6
- package/src/api/user/user.model.js +8 -13
- package/src/api/user/user.service.js +3 -20
- package/src/cli/cluster.js +61 -14
- package/src/cli/db.js +47 -2
- package/src/cli/deploy.js +67 -35
- package/src/cli/fs.js +79 -8
- package/src/cli/image.js +43 -1
- package/src/cli/index.js +26 -1
- package/src/cli/release.js +57 -1
- package/src/cli/repository.js +69 -31
- package/src/cli/run.js +415 -36
- package/src/cli/ssh.js +1 -1
- package/src/cli/static.js +43 -115
- package/src/client/Cryptokoyn.index.js +18 -21
- package/src/client/CyberiaPortal.index.js +19 -23
- package/src/client/Default.index.js +21 -33
- package/src/client/Itemledger.index.js +20 -26
- package/src/client/Underpost.index.js +19 -23
- package/src/client/components/core/404.js +4 -4
- package/src/client/components/core/500.js +4 -4
- package/src/client/components/core/Account.js +73 -60
- package/src/client/components/core/AgGrid.js +23 -33
- package/src/client/components/core/Alert.js +12 -13
- package/src/client/components/core/AppStore.js +1 -1
- package/src/client/components/core/Auth.js +35 -37
- package/src/client/components/core/Badge.js +7 -13
- package/src/client/components/core/BtnIcon.js +15 -17
- package/src/client/components/core/CalendarCore.js +42 -63
- package/src/client/components/core/Chat.js +13 -15
- package/src/client/components/core/ClientEvents.js +87 -0
- package/src/client/components/core/ColorPaletteElement.js +309 -0
- package/src/client/components/core/Content.js +17 -14
- package/src/client/components/core/Css.js +15 -71
- package/src/client/components/core/CssCore.js +12 -16
- package/src/client/components/core/D3Chart.js +4 -4
- package/src/client/components/core/Docs.js +64 -91
- package/src/client/components/core/DropDown.js +69 -91
- package/src/client/components/core/EventBus.js +92 -0
- package/src/client/components/core/EventsUI.js +14 -17
- package/src/client/components/core/FileExplorer.js +96 -228
- package/src/client/components/core/FullScreen.js +47 -75
- package/src/client/components/core/Input.js +24 -69
- package/src/client/components/core/Keyboard.js +25 -18
- package/src/client/components/core/KeyboardAvoidance.js +145 -0
- package/src/client/components/core/LoadingAnimation.js +25 -31
- package/src/client/components/core/LogIn.js +41 -41
- package/src/client/components/core/LogOut.js +23 -14
- package/src/client/components/core/Modal.js +462 -178
- package/src/client/components/core/NotificationManager.js +14 -18
- package/src/client/components/core/Panel.js +54 -50
- package/src/client/components/core/PanelForm.js +25 -125
- package/src/client/components/core/Polyhedron.js +110 -214
- package/src/client/components/core/PublicProfile.js +39 -32
- package/src/client/components/core/Recover.js +48 -44
- package/src/client/components/core/Responsive.js +88 -32
- package/src/client/components/core/RichText.js +9 -18
- package/src/client/components/core/Router.js +24 -3
- package/src/client/components/core/SearchBox.js +37 -37
- package/src/client/components/core/SignUp.js +39 -30
- package/src/client/components/core/SocketIo.js +31 -2
- package/src/client/components/core/SocketIoHandler.js +6 -6
- package/src/client/components/core/ToggleSwitch.js +8 -20
- package/src/client/components/core/ToolTip.js +5 -17
- package/src/client/components/core/Translate.js +56 -59
- package/src/client/components/core/Validator.js +26 -16
- package/src/client/components/core/Wallet.js +15 -26
- package/src/client/components/core/Worker.js +163 -27
- package/src/client/components/core/windowGetDimensions.js +7 -7
- package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
- package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
- package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
- package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
- package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
- package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
- package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
- package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +305 -61
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
- package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
- package/src/client/components/default/CssDefault.js +12 -12
- package/src/client/components/default/LogInDefault.js +6 -4
- package/src/client/components/default/LogOutDefault.js +6 -4
- package/src/client/components/default/RouterDefault.js +47 -0
- package/src/client/components/default/SettingsDefault.js +4 -4
- package/src/client/components/default/SignUpDefault.js +6 -4
- package/src/client/components/default/TranslateDefault.js +3 -3
- package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
- package/src/client/components/itemledger/CssItemledger.js +15 -15
- package/src/client/components/itemledger/LogInItemledger.js +6 -4
- package/src/client/components/itemledger/LogOutItemledger.js +6 -4
- package/src/client/components/itemledger/RouterItemledger.js +38 -0
- package/src/client/components/itemledger/SettingsItemledger.js +4 -4
- package/src/client/components/itemledger/SignUpItemledger.js +6 -4
- package/src/client/components/itemledger/TranslateItemledger.js +3 -3
- package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
- package/src/client/components/underpost/CssUnderpost.js +14 -14
- package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
- package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
- package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
- package/src/client/components/underpost/LogInUnderpost.js +6 -4
- package/src/client/components/underpost/LogOutUnderpost.js +6 -4
- package/src/client/components/underpost/RouterUnderpost.js +45 -0
- package/src/client/components/underpost/SettingsUnderpost.js +4 -4
- package/src/client/components/underpost/SignUpUnderpost.js +6 -4
- package/src/client/components/underpost/TranslateUnderpost.js +4 -4
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +443 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -0
- package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
- package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
- package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
- package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
- package/src/client/services/core/core.service.js +17 -49
- package/src/client/services/crypto/crypto.service.js +8 -13
- package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
- package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
- package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
- package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
- package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
- package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
- package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
- package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
- package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
- package/src/client/services/default/default.management.js +159 -267
- package/src/client/services/default/default.service.js +10 -16
- package/src/client/services/document/document.service.js +14 -19
- package/src/client/services/file/file.service.js +8 -13
- package/src/client/services/instance/instance.management.js +5 -5
- package/src/client/services/instance/instance.service.js +10 -15
- package/src/client/services/ipfs/ipfs.service.js +12 -18
- package/src/client/services/object-layer/object-layer.management.js +12 -12
- package/src/client/services/object-layer/object-layer.service.js +20 -26
- package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
- package/src/client/services/test/test.service.js +8 -13
- package/src/client/services/user/guest.service.js +86 -0
- package/src/client/services/user/user.management.js +5 -5
- package/src/client/services/user/user.service.js +14 -20
- package/src/client/ssr/body/404.js +3 -3
- package/src/client/ssr/body/500.js +3 -3
- package/src/client/ssr/body/CacheControl.js +5 -2
- package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
- package/src/client/ssr/head/PwaItemledger.js +197 -60
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
- package/src/client/ssr/offline/Maintenance.js +12 -11
- package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
- package/src/client/ssr/pages/Test.js +2 -2
- package/src/client/sw/core.sw.js +212 -0
- package/src/grpc/cyberia/grpc-server.js +179 -67
- package/src/index.js +1 -1
- package/src/runtime/cyberia-client/Dockerfile +80 -0
- package/src/runtime/cyberia-server/Dockerfile +37 -0
- package/src/runtime/express/Dockerfile +4 -4
- package/src/runtime/lampp/Dockerfile +8 -7
- package/src/runtime/wp/Dockerfile +11 -17
- package/src/server/atlas-sprite-sheet-generator.js +4 -2
- package/src/server/client-build-docs.js +45 -46
- package/src/server/client-build.js +334 -60
- package/src/server/client-formatted.js +47 -16
- package/src/server/conf.js +5 -4
- package/src/server/data-query.js +32 -20
- package/src/server/dns.js +22 -0
- package/src/server/ipfs-client.js +232 -91
- package/src/server/object-layer.js +1 -6
- package/src/server/process.js +13 -27
- package/src/server/semantic-layer-generator-floor.js +11 -51
- package/src/server/semantic-layer-generator-resource.js +259 -0
- package/src/server/semantic-layer-generator-skin.js +41 -171
- package/src/server/semantic-layer-generator.js +122 -14
- package/src/server/shape-generator.js +108 -0
- package/src/server/start.js +17 -3
- package/src/server/valkey.js +141 -235
- package/tsconfig.docs.json +15 -0
- package/typedoc.dd-cyberia.json +29 -0
- package/typedoc.json +29 -0
- package/WHITE-PAPER.md +0 -1540
- package/hardhat/README.md +0 -531
- package/hardhat/WHITE-PAPER.md +0 -1540
- package/jsdoc.dd-cyberia.json +0 -68
- package/jsdoc.json +0 -68
- package/src/api/object-layer/README.md +0 -672
- package/src/client/components/core/ColorPalette.js +0 -5267
- package/src/client/components/core/JoyStick.js +0 -80
- package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
- package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
- package/src/client/components/default/RoutesDefault.js +0 -49
- package/src/client/components/itemledger/RoutesItemledger.js +0 -40
- package/src/client/components/underpost/RoutesUnderpost.js +0 -47
- package/src/client/sw/default.sw.js +0 -127
- package/src/client/sw/template.sw.js +0 -84
- package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
- 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
|
-
|
|
434
|
-
|
|
435
|
-
const
|
|
436
|
-
|
|
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,
|
|
463
|
-
|
|
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,
|
|
467
|
-
|
|
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 {
|
|
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} */
|
package/src/server/start.js
CHANGED
|
@@ -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 = {
|
|
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
|
|
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.
|