cyberia 3.2.9 → 3.2.22

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 (184) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +7 -0
  2. package/.github/workflows/engine-cyberia.ci.yml +14 -2
  3. package/.github/workflows/ghpkg.ci.yml +1 -0
  4. package/.github/workflows/npmpkg.ci.yml +10 -5
  5. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  6. package/.github/workflows/release.cd.yml +1 -0
  7. package/.vscode/extensions.json +9 -9
  8. package/.vscode/settings.json +20 -4
  9. package/CHANGELOG.md +363 -1
  10. package/CLI-HELP.md +975 -1061
  11. package/README.md +190 -348
  12. package/bin/build.js +102 -125
  13. package/bin/build.template.js +33 -0
  14. package/bin/cyberia.js +238 -56
  15. package/bin/deploy.js +16 -3
  16. package/bin/index.js +238 -56
  17. package/bump.config.js +26 -0
  18. package/conf.js +131 -24
  19. package/deployment.yaml +76 -2
  20. package/hardhat/package-lock.json +113 -144
  21. package/hardhat/package.json +4 -3
  22. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  23. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  24. package/manifests/deployment/dd-cyberia-development/deployment.yaml +76 -2
  25. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  26. package/manifests/kind-config-dev.yaml +8 -0
  27. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  28. package/manifests/mongodb/pv-pvc.yaml +44 -8
  29. package/manifests/mongodb/statefulset.yaml +55 -68
  30. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  31. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  32. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  33. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  34. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  35. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  36. package/manifests/valkey/statefulset.yaml +1 -1
  37. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  38. package/package.json +31 -19
  39. package/scripts/ipxe-setup.sh +52 -49
  40. package/scripts/k3s-node-setup.sh +81 -46
  41. package/scripts/link-local-underpost-cli.sh +6 -0
  42. package/scripts/lxd-vm-setup.sh +193 -8
  43. package/scripts/maas-nat-firewalld.sh +145 -0
  44. package/scripts/test-monitor.sh +250 -0
  45. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  46. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +16 -16
  47. package/src/api/core/core.router.js +19 -14
  48. package/src/api/core/core.service.js +5 -5
  49. package/src/api/crypto/crypto.router.js +18 -12
  50. package/src/api/crypto/crypto.service.js +3 -3
  51. package/src/api/cyberia-action/cyberia-action.model.js +1 -1
  52. package/src/api/cyberia-action/cyberia-action.router.js +22 -18
  53. package/src/api/cyberia-action/cyberia-action.service.js +5 -5
  54. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  55. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  56. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  57. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  58. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  59. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +6 -6
  60. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  61. package/src/api/cyberia-entity/cyberia-entity.service.js +5 -5
  62. package/src/api/cyberia-instance/cyberia-fallback-world.js +79 -4
  63. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  64. package/src/api/cyberia-instance/cyberia-instance.service.js +10 -10
  65. package/src/api/cyberia-instance/cyberia-world-generator.js +3 -3
  66. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +14 -48
  67. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  68. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +5 -5
  69. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  70. package/src/api/cyberia-map/cyberia-map.service.js +7 -7
  71. package/src/api/cyberia-quest/cyberia-quest.model.js +1 -1
  72. package/src/api/cyberia-quest/cyberia-quest.router.js +22 -18
  73. package/src/api/cyberia-quest/cyberia-quest.service.js +5 -5
  74. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +22 -18
  75. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +5 -5
  76. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +458 -0
  77. package/src/api/default/default.router.js +22 -18
  78. package/src/api/default/default.service.js +5 -5
  79. package/src/api/document/document.router.js +28 -23
  80. package/src/api/document/document.service.js +100 -23
  81. package/src/api/file/file.router.js +19 -13
  82. package/src/api/file/file.service.js +9 -7
  83. package/src/api/instance/instance.router.js +29 -24
  84. package/src/api/instance/instance.service.js +6 -6
  85. package/src/api/ipfs/ipfs.router.js +21 -16
  86. package/src/api/ipfs/ipfs.service.js +8 -8
  87. package/src/api/object-layer/object-layer.router.js +512 -507
  88. package/src/api/object-layer/object-layer.service.js +17 -14
  89. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  90. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +5 -5
  91. package/src/api/test/test.router.js +17 -12
  92. package/src/api/types.js +24 -0
  93. package/src/api/user/guest.service.js +5 -4
  94. package/src/api/user/user.router.js +297 -288
  95. package/src/api/user/user.service.js +100 -35
  96. package/src/cli/baremetal.js +132 -101
  97. package/src/cli/cluster.js +700 -232
  98. package/src/cli/db.js +59 -60
  99. package/src/cli/deploy.js +291 -294
  100. package/src/cli/env.js +1 -4
  101. package/src/cli/fs.js +13 -3
  102. package/src/cli/image.js +58 -4
  103. package/src/cli/index.js +127 -15
  104. package/src/cli/ipfs.js +4 -6
  105. package/src/cli/kubectl.js +4 -1
  106. package/src/cli/lxd.js +1099 -223
  107. package/src/cli/monitor.js +396 -9
  108. package/src/cli/release.js +355 -146
  109. package/src/cli/repository.js +169 -30
  110. package/src/cli/run.js +347 -117
  111. package/src/cli/secrets.js +11 -2
  112. package/src/cli/test.js +9 -3
  113. package/src/client/Default.index.js +9 -3
  114. package/src/client/components/core/Auth.js +5 -0
  115. package/src/client/components/core/ClientEvents.js +76 -0
  116. package/src/client/components/core/EventBus.js +4 -0
  117. package/src/client/components/core/Modal.js +82 -41
  118. package/src/client/components/core/PanelForm.js +14 -10
  119. package/src/client/components/core/Worker.js +162 -363
  120. package/src/client/components/cyberia/MapEngineCyberia.js +1 -1
  121. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  122. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +55 -1
  123. package/src/client/public/cyberia-docs/ARCHITECTURE.md +223 -361
  124. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +114 -327
  125. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +200 -222
  126. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +212 -185
  127. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  128. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +2 -2
  129. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +23 -1
  130. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  131. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  132. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  133. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  134. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  135. package/src/client/sw/core.sw.js +174 -112
  136. package/src/db/DataBaseProvider.js +115 -15
  137. package/src/db/mariadb/MariaDB.js +2 -1
  138. package/src/db/mongo/MongoBootstrap.js +657 -0
  139. package/src/db/mongo/MongooseDB.js +130 -21
  140. package/src/grpc/cyberia/grpc-server.js +25 -57
  141. package/src/index.js +1 -1
  142. package/src/runtime/cyberia-client/Dockerfile +10 -7
  143. package/src/runtime/cyberia-client/Dockerfile.dev +67 -0
  144. package/src/runtime/cyberia-server/Dockerfile +11 -6
  145. package/src/runtime/cyberia-server/Dockerfile.dev +47 -0
  146. package/src/runtime/express/Express.js +2 -2
  147. package/src/runtime/wp/Dockerfile +3 -3
  148. package/src/runtime/wp/Wp.js +8 -5
  149. package/src/server/auth.js +2 -2
  150. package/src/server/catalog-underpost.js +61 -0
  151. package/src/server/catalog.js +77 -0
  152. package/src/server/client-build-docs.js +1 -1
  153. package/src/server/client-build.js +94 -129
  154. package/src/server/conf.js +496 -135
  155. package/src/server/ipfs-client.js +5 -3
  156. package/src/server/process.js +180 -19
  157. package/src/server/proxy.js +9 -2
  158. package/src/server/runtime-status.js +235 -0
  159. package/src/server/runtime.js +1 -1
  160. package/src/server/start.js +44 -11
  161. package/src/server/valkey.js +2 -0
  162. package/src/ws/IoInterface.js +16 -16
  163. package/src/ws/core/channels/core.ws.chat.js +11 -11
  164. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  165. package/src/ws/core/channels/core.ws.stream.js +19 -19
  166. package/src/ws/core/core.ws.connection.js +8 -8
  167. package/src/ws/core/core.ws.server.js +6 -5
  168. package/src/ws/default/channels/default.ws.main.js +10 -10
  169. package/src/ws/default/default.ws.connection.js +4 -4
  170. package/src/ws/default/default.ws.server.js +4 -3
  171. package/test/deploy-monitor.test.js +251 -0
  172. package/bin/file.js +0 -202
  173. package/bin/vs.js +0 -74
  174. package/bin/zed.js +0 -84
  175. package/manifests/deployment/dd-test-development/deployment.yaml +0 -254
  176. package/manifests/deployment/dd-test-development/proxy.yaml +0 -102
  177. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -574
  178. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -467
  179. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  180. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  181. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  182. /package/src/client/ssr/{offline → views}/Maintenance.js +0 -0
  183. /package/src/client/ssr/{offline → views}/NoNetworkConnection.js +0 -0
  184. /package/src/client/ssr/{pages → views}/Test.js +0 -0
@@ -1,467 +0,0 @@
1
- /**
2
- * Shared Cyberia plain-data module.
3
- * Keep this file free of runtime-specific imports so the same registry can be
4
- * consumed by client, server, and CLI code.
5
- */
6
- const ITEM_TYPES = Object.freeze({
7
- skin: 'skin',
8
- breastplate: 'breastplate',
9
- weapon: 'weapon',
10
- skill: 'skill',
11
- coin: 'coin',
12
- floor: 'floor',
13
- obstacle: 'obstacle',
14
- portal: 'portal',
15
- foreground: 'foreground',
16
- resource: 'resource',
17
- });
18
- const ENTITY_TYPES = Object.freeze({
19
- player: 'player',
20
- other_player: 'other_player',
21
- bot: 'bot',
22
- skill: 'skill',
23
- coin: 'coin',
24
- floor: 'floor',
25
- obstacle: 'obstacle',
26
- portal: 'portal',
27
- foreground: 'foreground',
28
- resource: 'resource',
29
- });
30
- const QUEST_STEPS_TYPES = Object.freeze(['collect', 'talk', 'kill']);
31
- const CYBERIA_ACTION_TYPES = Object.freeze(['craft', 'shop', 'storage', 'quest-talk']);
32
- const ENTITY_TYPE_TO_ITEM_TYPES = Object.freeze({
33
- [ENTITY_TYPES.player]: Object.freeze([ITEM_TYPES.skin, ITEM_TYPES.breastplate, ITEM_TYPES.weapon]),
34
- [ENTITY_TYPES.other_player]: Object.freeze([ITEM_TYPES.skin, ITEM_TYPES.breastplate, ITEM_TYPES.weapon]),
35
- [ENTITY_TYPES.bot]: Object.freeze([ITEM_TYPES.skin, ITEM_TYPES.weapon]),
36
- [ENTITY_TYPES.skill]: Object.freeze([ITEM_TYPES.skill]),
37
- [ENTITY_TYPES.coin]: Object.freeze([ITEM_TYPES.coin]),
38
- [ENTITY_TYPES.floor]: Object.freeze([ITEM_TYPES.floor]),
39
- [ENTITY_TYPES.obstacle]: Object.freeze([ITEM_TYPES.obstacle]),
40
- [ENTITY_TYPES.portal]: Object.freeze([ITEM_TYPES.portal]),
41
- [ENTITY_TYPES.foreground]: Object.freeze([ITEM_TYPES.foreground]),
42
- [ENTITY_TYPES.resource]: Object.freeze([ITEM_TYPES.resource]),
43
- });
44
- class CyberiaDependencies {
45
- static 'maxrects-packer' = '^2.7.3';
46
- static pngjs = '^7.0.0';
47
- static jimp = '^1.6.0';
48
- static sharp = '^0.34.5';
49
- static ethers = '~6.16.0';
50
- }
51
- const DefaultCyberiaItems = [
52
- { item: { id: 'coin', type: ITEM_TYPES.coin } },
53
- // { item: { id: 'red-power', type: 'skill' } },
54
- // { item: { id: 'heal', type: 'skill' } },
55
- { item: { id: 'hatchet-skill', type: ITEM_TYPES.skill } },
56
- // { item: { id: 'green-power', type: 'skill' } },
57
- // { item: { id: 'blood', type: 'skill' } },
58
- { item: { id: 'atlas_pistol_mk2', type: ITEM_TYPES.weapon } },
59
- { item: { id: 'atlas_pistol_mk2_bullet', type: ITEM_TYPES.skill } },
60
- { item: { id: 'tim-knife', type: ITEM_TYPES.weapon } },
61
- { item: { id: 'hatchet', type: ITEM_TYPES.weapon } },
62
- { item: { id: 'wason', type: ITEM_TYPES.skin } },
63
- { item: { id: 'scp-2040', type: ITEM_TYPES.skin } },
64
- { item: { id: 'purple', type: ITEM_TYPES.skin } },
65
- { item: { id: 'punk', type: ITEM_TYPES.skin } },
66
- // { item: { id: 'marciano', type: 'skin' } },
67
- { item: { id: 'lain', type: ITEM_TYPES.skin } },
68
- { item: { id: 'kaneki', type: ITEM_TYPES.skin } },
69
- { item: { id: 'junko', type: ITEM_TYPES.skin } },
70
- { item: { id: 'ghost', type: ITEM_TYPES.skin } },
71
- { item: { id: 'eiri', type: ITEM_TYPES.skin } },
72
- { item: { id: 'anon', type: ITEM_TYPES.skin } },
73
- { item: { id: 'alex', type: ITEM_TYPES.skin } },
74
- { item: { id: 'agent', type: ITEM_TYPES.skin } },
75
- { item: { id: 'grass', type: ITEM_TYPES.floor } },
76
- ];
77
- const DEFAULT_CYBERIA_ITEM_BY_ID = Object.freeze(
78
- DefaultCyberiaItems.reduce((acc, entry) => {
79
- acc[entry.item.id] = entry;
80
- return acc;
81
- }, {}),
82
- );
83
- const getDefaultCyberiaItemById = (itemId) => DEFAULT_CYBERIA_ITEM_BY_ID[itemId] || null;
84
- const getDefaultCyberiaItemsByItemType = (itemType) =>
85
- DefaultCyberiaItems.filter((entry) => entry.item.type === itemType);
86
- const getDefaultCyberiaItemsByEntityType = (entityType) => {
87
- const allowedTypes = ENTITY_TYPE_TO_ITEM_TYPES[entityType] || [];
88
- return DefaultCyberiaItems.filter((entry) => allowedTypes.includes(entry.item.type));
89
- };
90
- const DefaultSkillConfig = [
91
- // { triggerItemId: 'anon', logicEventIds: ['doppelganger'] },
92
- {
93
- triggerItemId: 'atlas_pistol_mk2',
94
- logicEventIds: ['projectile'],
95
- },
96
- { triggerItemId: 'coin', logicEventIds: ['coin_drop_or_transaction'] },
97
- // { triggerItemId: 'purple', logicEventIds: ['doppelganger'] },
98
- // { triggerItemId: 'atlas_pistol_mk2_bullet', logicEventIds: ['doppelganger'] },
99
- ];
100
- /**
101
- * Default dialogue seeds for every non-commented entry in DefaultCyberiaItems.
102
- * Each entry follows the CyberiaDialogue model schema:
103
- * { code, order, speaker, text, mood }
104
- *
105
- * `code` is the primary grouping key (e.g. "default-lain"). The C client
106
- * fetches all lines for a code with GET /api/cyberia-dialogue/code/:code.
107
- *
108
- * Used by the seed/migration script to populate the database on first boot.
109
- */
110
- const DefaultCyberiaDialogues = [
111
- {
112
- code: 'default-coin',
113
- order: 0,
114
- speaker: 'Coin',
115
- text: 'A standard unit of exchange in the cyberia network.',
116
- mood: 'neutral',
117
- },
118
- {
119
- code: 'default-atlas_pistol_mk2',
120
- order: 0,
121
- speaker: 'Atlas Pistol MK2',
122
- text: 'Military-grade sidearm. Fires energy projectiles.',
123
- mood: 'neutral',
124
- },
125
- {
126
- code: 'default-atlas_pistol_mk2_bullet',
127
- order: 0,
128
- speaker: 'MK2 Bullet',
129
- text: 'High-velocity energy round. Dissipates on impact.',
130
- mood: 'neutral',
131
- },
132
- {
133
- code: 'default-hatchet',
134
- order: 0,
135
- speaker: 'Hatchet',
136
- text: 'A crude but reliable melee tool. Good for close quarters.',
137
- mood: 'neutral',
138
- },
139
- {
140
- code: 'default-wason',
141
- order: 0,
142
- speaker: 'Wason',
143
- text: 'They say I am just a wandering merchant... but I have seen things.',
144
- mood: 'neutral',
145
- },
146
- {
147
- code: 'default-wason',
148
- order: 1,
149
- speaker: 'Wason',
150
- text: 'The network was not always like this. There was a time before the portals.',
151
- mood: 'sad',
152
- },
153
- {
154
- code: 'default-scp-2040',
155
- order: 0,
156
- speaker: 'SCP-2040',
157
- text: 'CONTAINMENT PROTOCOL ACTIVE. Do not make direct eye contact.',
158
- mood: 'angry',
159
- },
160
- {
161
- code: 'default-scp-2040',
162
- order: 1,
163
- speaker: 'SCP-2040',
164
- text: 'I remember everything. Every iteration. Every reset.',
165
- mood: 'sad',
166
- },
167
- {
168
- code: 'default-purple',
169
- order: 0,
170
- speaker: 'Purple',
171
- text: 'The void between nodes is not empty — it is alive.',
172
- mood: 'neutral',
173
- },
174
- {
175
- code: 'default-punk',
176
- order: 0,
177
- speaker: 'Punk',
178
- text: 'Rules are just code someone else wrote. I write my own.',
179
- mood: 'happy',
180
- },
181
- {
182
- code: 'default-lain',
183
- order: 0,
184
- speaker: 'Lain',
185
- text: 'No matter where you go, everyone is connected.',
186
- mood: 'neutral',
187
- },
188
- {
189
- code: 'default-lain',
190
- order: 1,
191
- speaker: 'Lain',
192
- text: 'If you are not remembered, then you never existed.',
193
- mood: 'sad',
194
- },
195
- {
196
- code: 'default-lain',
197
- order: 2,
198
- speaker: 'Lain',
199
- text: 'The wired is not a separate world. It is layered over this one.',
200
- mood: 'neutral',
201
- },
202
- {
203
- code: 'default-kaneki',
204
- order: 0,
205
- speaker: 'Kaneki',
206
- text: 'I am not the protagonist of a novel. I am just... me.',
207
- mood: 'sad',
208
- },
209
- {
210
- code: 'default-kaneki',
211
- order: 1,
212
- speaker: 'Kaneki',
213
- text: 'What is 1000 minus 7?',
214
- mood: 'angry',
215
- },
216
- {
217
- code: 'default-junko',
218
- order: 0,
219
- speaker: 'Junko',
220
- text: 'Despair is the seed from which hope blooms!',
221
- mood: 'happy',
222
- },
223
- {
224
- code: 'default-junko',
225
- order: 1,
226
- speaker: 'Junko',
227
- text: 'How boring... nothing ever surprises me anymore.',
228
- mood: 'sad',
229
- },
230
- { code: 'default-ghost', order: 0, speaker: 'Ghost', text: '...', mood: 'neutral' },
231
- {
232
- code: 'default-eiri',
233
- order: 0,
234
- speaker: 'Eiri',
235
- text: 'I am the god of the wired. I designed the protocol.',
236
- mood: 'neutral',
237
- },
238
- {
239
- code: 'default-eiri',
240
- order: 1,
241
- speaker: 'Eiri',
242
- text: 'Flesh is just hardware. Consciousness is the only software that matters.',
243
- mood: 'neutral',
244
- },
245
- {
246
- code: 'default-anon',
247
- order: 0,
248
- speaker: '???',
249
- text: 'You should not be here. Turn back.',
250
- mood: 'angry',
251
- },
252
- {
253
- code: 'default-anon',
254
- order: 1,
255
- speaker: '???',
256
- text: 'Or stay. It does not matter. Nothing leaves this place.',
257
- mood: 'neutral',
258
- },
259
- {
260
- code: 'default-alex',
261
- order: 0,
262
- speaker: 'Alex',
263
- text: 'I have been mapping the portal network. Something does not add up.',
264
- mood: 'neutral',
265
- },
266
- {
267
- code: 'default-alex',
268
- order: 1,
269
- speaker: 'Alex',
270
- text: 'There are nodes that exist in the registry but have no physical anchor.',
271
- mood: 'neutral',
272
- },
273
- {
274
- code: 'default-agent',
275
- order: 0,
276
- speaker: 'Agent',
277
- text: 'Civilian, this area is restricted. State your business.',
278
- mood: 'neutral',
279
- },
280
- {
281
- code: 'default-agent',
282
- order: 1,
283
- speaker: 'Agent',
284
- text: 'Hmm. Proceed, but know that you are being watched.',
285
- mood: 'neutral',
286
- },
287
- {
288
- code: 'default-grass',
289
- order: 0,
290
- speaker: 'Grass',
291
- text: 'A patch of synthetic grass. It sways gently despite no wind.',
292
- mood: 'neutral',
293
- },
294
- // ── Quest-talk dialogue lines ────────────────────────────────────────────
295
- {
296
- code: 'quest-talk-wason',
297
- order: 0,
298
- speaker: 'Wason',
299
- text: 'Wanderer! Glad you stopped by. I need a favor — nothing dangerous... mostly.',
300
- mood: 'happy',
301
- },
302
- {
303
- code: 'quest-talk-wason',
304
- order: 1,
305
- speaker: 'Wason',
306
- text: "First, find Alex — she's been surveying the nodes east of here. Then gather a hatchet for me.",
307
- mood: 'neutral',
308
- },
309
- {
310
- code: 'quest-talk-wason',
311
- order: 2,
312
- speaker: 'Wason',
313
- text: 'And one more thing: the SCP-2040 anomalies are overrunning my trade routes. Deal with two of them.',
314
- mood: 'sad',
315
- },
316
- {
317
- code: 'quest-talk-alex',
318
- order: 0,
319
- speaker: 'Alex',
320
- text: "Wason sent you? Good. The portal anomalies are getting worse. I've logged what I can.",
321
- mood: 'neutral',
322
- },
323
- {
324
- code: 'quest-talk-alex',
325
- order: 1,
326
- speaker: 'Alex',
327
- text: 'Tell Wason: the source is somewhere in the deeper nodes. The registry does not lie.',
328
- mood: 'neutral',
329
- },
330
- ];
331
-
332
- /**
333
- * Default action catalog — provide base metadata default actions,
334
- * this provide for entities dynamicaale match when init instance init x and init y
335
- * positions of entitie for the fallback world or custom instance, and seed dialogue
336
- * for quest-talk actions.
337
- *
338
- * type values: 'quest-talk' | 'shop' | 'craft' | 'storage'
339
- * dialogCode: General-purpose default dialogue opened for this action
340
- * (any action type). Used as the immediate greeting/intro.
341
- * questDialogueCodes: Ordered list of CyberiaDialogue codes that must be
342
- * completed (in sequence) to satisfy quest-talk step
343
- * validation. Distinct from dialogCode — for simple
344
- * actions they may overlap; for multi-stage quests they
345
- * can diverge.
346
- * is completed. Empty string = no quest granted.
347
- */
348
- const DefaultCyberiaActions = [
349
- {
350
- code: 'wason-quest-intro',
351
- type: 'quest-talk',
352
- label: 'Quest',
353
- provideItemId: 'wason',
354
- grantQuestCode: 'fallback-intro-quest',
355
- dialogCode: 'quest-talk-wason',
356
- questDialogueCodes: ['quest-talk-wason'],
357
- },
358
- {
359
- code: 'alex-quest-talk',
360
- type: 'quest-talk',
361
- label: 'Quest Talk',
362
- provideItemId: 'alex',
363
- grantQuestCode: '',
364
- dialogCode: 'quest-talk-alex',
365
- questDialogueCodes: ['quest-talk-alex'],
366
- },
367
- {
368
- code: 'agent-mission-brief',
369
- type: 'quest-talk',
370
- label: 'Mission Brief',
371
- provideItemId: 'agent',
372
- grantQuestCode: 'bounty-quest-alpha',
373
- dialogCode: 'default-agent',
374
- questDialogueCodes: ['default-agent'],
375
- },
376
- {
377
- code: 'wason-bounty-brief',
378
- type: 'quest-talk',
379
- label: 'Bounty Brief',
380
- provideItemId: 'wason',
381
- grantQuestCode: '',
382
- dialogCode: 'quest-talk-wason',
383
- questDialogueCodes: ['quest-talk-wason'],
384
- },
385
- ];
386
-
387
- /**
388
- * Default quest definitions for the fallback world.
389
- * Mirrors the CyberiaQuestSchema.
390
- *
391
- * Objective types:
392
- * 'talk' — itemId = provideItemId of the NPC to interact with
393
- * 'collect' — itemId = item to receive in inventory; quantity = amount
394
- * 'kill' — itemId = entity skin itemId; quantity = kill count
395
- *
396
- */
397
- const DefaultCyberiaQuests = [
398
- {
399
- code: 'fallback-intro-quest',
400
- title: "The Wanderer's Task",
401
- description: 'Help Wason restore order to the fractured nodes.',
402
- prerequisiteCodes: [],
403
- unlocksQuestCodes: ['bounty-quest-alpha'],
404
- steps: [
405
- {
406
- id: 'step-talk-alex',
407
- description: 'Find Alex and hear her report on the portal anomalies.',
408
- objectives: [{ type: 'talk', itemId: 'alex', quantity: 1 }],
409
- },
410
- {
411
- id: 'step-collect-hatchet',
412
- description: 'Obtain a hatchet for Wason.',
413
- objectives: [{ type: 'collect', itemId: 'hatchet', quantity: 1 }],
414
- },
415
- {
416
- id: 'step-kill-scp',
417
- description: 'Eliminate SCP-2040 anomalies threatening the trade routes.',
418
- objectives: [{ type: 'kill', itemId: 'scp-2040', quantity: 2 }],
419
- },
420
- ],
421
- rewards: [{ itemId: 'coin', quantity: 50 }],
422
- },
423
- {
424
- // Second quest: exercises all step types in a different order (kill → collect → talk).
425
- // Unlocked automatically after completing fallback-intro-quest.
426
- code: 'bounty-quest-alpha',
427
- title: 'Alpha Bounty',
428
- description: 'A field test: eliminate a threat, claim your reward, then report back.',
429
- prerequisiteCodes: ['fallback-intro-quest'],
430
- unlocksQuestCodes: [],
431
- steps: [
432
- {
433
- id: 'step-kill-first',
434
- description: 'Eliminate the SCP-2040 threat.',
435
- objectives: [{ type: 'kill', itemId: 'scp-2040', quantity: 1 }],
436
- },
437
- {
438
- id: 'step-collect-reward',
439
- description: 'Collect the bounty coin drop.',
440
- objectives: [{ type: 'collect', itemId: 'coin', quantity: 10 }],
441
- },
442
- {
443
- id: 'step-report-wason',
444
- description: 'Report back to Wason.',
445
- objectives: [{ type: 'talk', itemId: 'wason', quantity: 1 }],
446
- },
447
- ],
448
- rewards: [{ itemId: 'hatchet', quantity: 1 }],
449
- },
450
- ];
451
-
452
- export {
453
- ITEM_TYPES,
454
- ENTITY_TYPES,
455
- ENTITY_TYPE_TO_ITEM_TYPES,
456
- QUEST_STEPS_TYPES,
457
- CYBERIA_ACTION_TYPES,
458
- getDefaultCyberiaItemById,
459
- getDefaultCyberiaItemsByItemType,
460
- getDefaultCyberiaItemsByEntityType,
461
- CyberiaDependencies,
462
- DefaultCyberiaItems,
463
- DefaultSkillConfig,
464
- DefaultCyberiaDialogues,
465
- DefaultCyberiaActions,
466
- DefaultCyberiaQuests,
467
- };
@@ -1,21 +0,0 @@
1
- SrrComponent = (render = { style: {}, renderStyle: () => '' }, options) =>
2
- html`
3
- <div style="${render.renderStyle('body')}">
4
- <div style="${render.renderStyle('.container')}">
5
- <h1 style="${render.renderStyle('h1')}">{{H1}}</h1>
6
- <p style="${render.renderStyle('p')}">{{P1}}</p>
7
- <p style="${render.renderStyle('p')}">
8
- <a href="{{RECOVER_WEB_URL}}" style="${render.renderStyle('button')}"
9
- ><img
10
- src="http${options.transport.secure ? 's' : ''}://${options.host}${options.path === '/'
11
- ? ''
12
- : options.path}/api/user/recover/{{TOKEN}}"
13
- /><br />{{RECOVER_BTN_LABEL}}</a
14
- >
15
- </p>
16
- </div>
17
- <div style="${render.renderStyle('.footer')}">
18
- <p>{{COMPANY}}</p>
19
- </div>
20
- </div>
21
- `;
@@ -1,17 +0,0 @@
1
- SrrComponent = (render = { style: {}, renderStyle: () => '' }, options) =>
2
- html`
3
- <div style="${render.renderStyle('body')}">
4
- <div style="${render.renderStyle('.container')}">
5
- <h1 style="${render.renderStyle('h1')}">{{H1}}</h1>
6
- <p style="${render.renderStyle('p')}">{{P1}}</p>
7
- <img
8
- src="http${options.transport.secure ? 's' : ''}://${options.host}${options.path === '/'
9
- ? ''
10
- : options.path}/api/user/mailer/{{TOKEN}}"
11
- />
12
- </div>
13
- <div style="${render.renderStyle('.footer')}">
14
- <p>{{COMPANY}}</p>
15
- </div>
16
- </div>
17
- `;