@v12-engine/create 0.1.1 → 0.4.0

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 (263) hide show
  1. package/README.md +4 -1
  2. package/base/_gitignore +5 -0
  3. package/base/package.json +3 -3
  4. package/base/src/main.ts +36 -10
  5. package/base/src/navigation.worker.ts +7 -0
  6. package/base/vite.config.ts +24 -2
  7. package/cli.mjs +21 -6
  8. package/index.mjs +27 -7
  9. package/layers/desktop/electron/app.mjs +237 -0
  10. package/layers/desktop/electron/config.mjs +16 -0
  11. package/layers/desktop/electron/dev.mjs +63 -0
  12. package/layers/desktop/electron/files.mjs +86 -0
  13. package/layers/desktop/electron/icons/icon.icns +0 -0
  14. package/layers/desktop/electron/icons/icon.png +0 -0
  15. package/layers/desktop/electron/main.mjs +12 -0
  16. package/layers/desktop/electron/package.mjs +75 -0
  17. package/layers/desktop/electron/preload.cjs +41 -0
  18. package/layers/desktop/electron/presentation.m +87 -0
  19. package/layers/desktop/electron/serve.mjs +76 -0
  20. package/layers/desktop/electron/tools.mjs +63 -0
  21. package/layers/desktop/electron/updates.mjs +71 -0
  22. package/layers/desktop/package.json +13 -0
  23. package/layers/desktop/src/desktop.ts +175 -0
  24. package/layers/desktop/src/shell.ts +279 -0
  25. package/layers/desktop/tests/main.test.ts +189 -0
  26. package/layers/desktop/tests/shell.test.ts +152 -0
  27. package/layers/rooms/server.ts +13 -10
  28. package/layers/server/server.ts +4 -5
  29. package/layers/source/vite.config.ts +21 -1
  30. package/package.json +1 -1
  31. package/starters/campaign/README.md +9 -2
  32. package/starters/campaign/layers/rooms/server.ts +3 -3
  33. package/starters/campaign/layers/server/server.ts +3 -5
  34. package/starters/campaign/layers/tests/tests/rules.test.ts +40 -21
  35. package/starters/campaign/src/campaign/game.ts +26 -5
  36. package/starters/campaign/src/campaign/index.ts +104 -68
  37. package/starters/campaign/src/campaign/kills.ts +1 -1
  38. package/starters/campaign/src/campaign/missions/homecoming.ts +7 -7
  39. package/starters/campaign/src/campaign/missions/siege.ts +6 -6
  40. package/starters/campaign/src/campaign/missions/warlord.ts +13 -14
  41. package/starters/campaign/src/campaign/scenes.ts +8 -7
  42. package/starters/campaign/src/campaign/units.ts +59 -20
  43. package/starters/campaign/src/campaign/view/attacks.ts +19 -0
  44. package/starters/campaign/src/campaign/view/fire.ts +2 -2
  45. package/starters/campaign/src/campaign/view/index.ts +54 -43
  46. package/starters/campaign/src/campaign/waves.ts +18 -17
  47. package/starters/campaign/src/game.ts +8 -1
  48. package/starters/campaign/src/main.ts +38 -19
  49. package/starters/campaign/src/maps/fort.names.ts +2 -2
  50. package/starters/campaign/src/maps/fort.vgmap.json +102 -2
  51. package/starters/campaign/src/maps/homestead.names.ts +2 -2
  52. package/starters/campaign/src/maps/homestead.vgmap.json +85 -1
  53. package/starters/campaign/src/maps/pass.names.ts +2 -2
  54. package/starters/campaign/src/maps/pass.vgmap.json +69 -1
  55. package/starters/campaign/src/waves-panel.ts +2 -1
  56. package/starters/empty/README.md +18 -10
  57. package/starters/empty/layers/tests/tests/rules.test.ts +16 -17
  58. package/starters/empty/src/game.ts +11 -75
  59. package/starters/empty/src/generate.worker.ts +5 -5
  60. package/starters/empty/src/rules.ts +83 -25
  61. package/starters/empty/src/view.ts +82 -0
  62. package/starters/examples/README.md +83 -0
  63. package/starters/examples/layers/tests/tests/examples.test.ts +30 -0
  64. package/starters/examples/package.json +5 -0
  65. package/starters/examples/src/examples/abilities/areas.ts +165 -0
  66. package/starters/examples/src/examples/abilities/areasLooks.ts +30 -0
  67. package/starters/examples/src/examples/abilities/buffs.ts +287 -0
  68. package/starters/examples/src/examples/abilities/buffsLooks.ts +46 -0
  69. package/starters/examples/src/examples/abilities/changing.ts +228 -0
  70. package/starters/examples/src/examples/abilities/changingLooks.ts +61 -0
  71. package/starters/examples/src/examples/abilities/control.ts +158 -0
  72. package/starters/examples/src/examples/abilities/controlLooks.ts +78 -0
  73. package/starters/examples/src/examples/abilities/damage.ts +156 -0
  74. package/starters/examples/src/examples/abilities/damageLooks.ts +37 -0
  75. package/starters/examples/src/examples/abilities/family.ts +29 -0
  76. package/starters/examples/src/examples/abilities/index.ts +32 -0
  77. package/starters/examples/src/examples/abilities/kit.ts +179 -0
  78. package/starters/examples/src/examples/abilities/lookKit.ts +71 -0
  79. package/starters/examples/src/examples/abilities/looks.ts +47 -0
  80. package/starters/examples/src/examples/abilities/missiles.ts +203 -0
  81. package/starters/examples/src/examples/abilities/missilesLooks.ts +38 -0
  82. package/starters/examples/src/examples/abilities/moves.ts +206 -0
  83. package/starters/examples/src/examples/abilities/movesLooks.ts +52 -0
  84. package/starters/examples/src/examples/abilities/recasts.ts +181 -0
  85. package/starters/examples/src/examples/abilities/recastsLooks.ts +41 -0
  86. package/starters/examples/src/examples/abilities/resources.ts +166 -0
  87. package/starters/examples/src/examples/abilities/resourcesLooks.ts +42 -0
  88. package/starters/examples/src/examples/abilities/summons.ts +296 -0
  89. package/starters/examples/src/examples/abilities/summonsLooks.ts +115 -0
  90. package/starters/examples/src/examples/abilities/triggers.ts +204 -0
  91. package/starters/examples/src/examples/abilities/triggersLooks.ts +53 -0
  92. package/starters/examples/src/examples/abilities/vision.ts +137 -0
  93. package/starters/examples/src/examples/abilities/visionLooks.ts +50 -0
  94. package/starters/examples/src/examples/animation/index.ts +235 -0
  95. package/starters/examples/src/examples/animation/looks.ts +444 -0
  96. package/starters/examples/src/examples/catalog.ts +52 -0
  97. package/starters/examples/src/examples/cinematics/index.ts +217 -0
  98. package/starters/examples/src/examples/cinematics/looks.ts +476 -0
  99. package/starters/examples/src/examples/cinematics/tour.json +43 -0
  100. package/starters/examples/src/examples/cinematics/village.ts +88 -0
  101. package/starters/examples/src/examples/common/looks.ts +65 -0
  102. package/starters/examples/src/examples/common/units.ts +70 -0
  103. package/starters/examples/src/examples/construction/index.ts +329 -0
  104. package/starters/examples/src/examples/construction/looks.ts +275 -0
  105. package/starters/examples/src/examples/custom-animation/bones.ts +92 -0
  106. package/starters/examples/src/examples/custom-animation/index.ts +190 -0
  107. package/starters/examples/src/examples/custom-animation/looks.ts +523 -0
  108. package/starters/examples/src/examples/custom-animation/runes.ts +82 -0
  109. package/starters/examples/src/examples/custom-fx/glaive.look.ts +110 -0
  110. package/starters/examples/src/examples/custom-fx/glaive.ts +40 -0
  111. package/starters/examples/src/examples/custom-fx/gpu.look.ts +145 -0
  112. package/starters/examples/src/examples/custom-fx/gpu.ts +22 -0
  113. package/starters/examples/src/examples/custom-fx/index.ts +25 -0
  114. package/starters/examples/src/examples/custom-fx/lights.look.ts +144 -0
  115. package/starters/examples/src/examples/custom-fx/lights.ts +25 -0
  116. package/starters/examples/src/examples/custom-fx/looks.ts +36 -0
  117. package/starters/examples/src/examples/custom-fx/meteor.look.ts +133 -0
  118. package/starters/examples/src/examples/custom-fx/meteor.ts +26 -0
  119. package/starters/examples/src/examples/custom-fx/parts.look.ts +193 -0
  120. package/starters/examples/src/examples/custom-fx/parts.ts +21 -0
  121. package/starters/examples/src/examples/custom-fx/portal.look.ts +193 -0
  122. package/starters/examples/src/examples/custom-fx/portal.ts +48 -0
  123. package/starters/examples/src/examples/custom-fx/renderer.look.ts +139 -0
  124. package/starters/examples/src/examples/custom-fx/renderer.ts +18 -0
  125. package/starters/examples/src/examples/custom-fx/ribbons.look.ts +151 -0
  126. package/starters/examples/src/examples/custom-fx/ribbons.ts +22 -0
  127. package/starters/examples/src/examples/custom-fx/shader.ts +42 -0
  128. package/starters/examples/src/examples/custom-fx/shield.look.ts +226 -0
  129. package/starters/examples/src/examples/custom-fx/shield.ts +43 -0
  130. package/starters/examples/src/examples/define.ts +86 -0
  131. package/starters/examples/src/examples/destruction/index.ts +570 -0
  132. package/starters/examples/src/examples/destruction/looks.ts +447 -0
  133. package/starters/examples/src/examples/dialogs/index.ts +383 -0
  134. package/starters/examples/src/examples/dialogs/looks.ts +546 -0
  135. package/starters/examples/src/examples/dynamic-map/index.ts +603 -0
  136. package/starters/examples/src/examples/dynamic-map/looks.ts +301 -0
  137. package/starters/examples/src/examples/fx/blood.look.ts +62 -0
  138. package/starters/examples/src/examples/fx/blood.ts +59 -0
  139. package/starters/examples/src/examples/fx/feel.look.ts +86 -0
  140. package/starters/examples/src/examples/fx/feel.ts +57 -0
  141. package/starters/examples/src/examples/fx/fight.ts +28 -0
  142. package/starters/examples/src/examples/fx/floats.look.ts +108 -0
  143. package/starters/examples/src/examples/fx/floats.ts +24 -0
  144. package/starters/examples/src/examples/fx/gallery.look.ts +168 -0
  145. package/starters/examples/src/examples/fx/gallery.ts +23 -0
  146. package/starters/examples/src/examples/fx/index.ts +30 -0
  147. package/starters/examples/src/examples/fx/links.look.ts +83 -0
  148. package/starters/examples/src/examples/fx/links.ts +49 -0
  149. package/starters/examples/src/examples/fx/looks.ts +55 -0
  150. package/starters/examples/src/examples/fx/map.look.ts +93 -0
  151. package/starters/examples/src/examples/fx/map.ts +33 -0
  152. package/starters/examples/src/examples/fx/marks.look.ts +100 -0
  153. package/starters/examples/src/examples/fx/marks.ts +36 -0
  154. package/starters/examples/src/examples/fx/shots.look.ts +92 -0
  155. package/starters/examples/src/examples/fx/shots.ts +71 -0
  156. package/starters/examples/src/examples/fx/spells.look.ts +87 -0
  157. package/starters/examples/src/examples/fx/spells.ts +122 -0
  158. package/starters/examples/src/examples/fx/stage.ts +31 -0
  159. package/starters/examples/src/examples/gui/babylonScreen.ts +167 -0
  160. package/starters/examples/src/examples/gui/babylonWorld.ts +191 -0
  161. package/starters/examples/src/examples/gui/htmlPart.ts +95 -0
  162. package/starters/examples/src/examples/gui/index.ts +143 -0
  163. package/starters/examples/src/examples/gui/keys.ts +91 -0
  164. package/starters/examples/src/examples/gui/layout.ts +42 -0
  165. package/starters/examples/src/examples/gui/looks.ts +270 -0
  166. package/starters/examples/src/examples/gui/minimap.ts +127 -0
  167. package/starters/examples/src/examples/gui/ownInterface.ts +129 -0
  168. package/starters/examples/src/examples/gui/plates.ts +87 -0
  169. package/starters/examples/src/examples/gui/radial.ts +104 -0
  170. package/starters/examples/src/examples/gui/solidPart.ts +107 -0
  171. package/starters/examples/src/examples/looks.ts +45 -0
  172. package/starters/examples/src/examples/mechanics/battle.ts +51 -0
  173. package/starters/examples/src/examples/mechanics/damage.ts +80 -0
  174. package/starters/examples/src/examples/mechanics/flying.ts +93 -0
  175. package/starters/examples/src/examples/mechanics/formations.ts +58 -0
  176. package/starters/examples/src/examples/mechanics/highGround.ts +82 -0
  177. package/starters/examples/src/examples/mechanics/index.ts +44 -0
  178. package/starters/examples/src/examples/mechanics/looks.ts +289 -0
  179. package/starters/examples/src/examples/mechanics/maze.ts +119 -0
  180. package/starters/examples/src/examples/mechanics/orders.ts +68 -0
  181. package/starters/examples/src/examples/mechanics/selection.ts +30 -0
  182. package/starters/examples/src/examples/moba/index.ts +377 -0
  183. package/starters/examples/src/examples/moba/looks.ts +349 -0
  184. package/starters/examples/src/examples/moba/maps.ts +69 -0
  185. package/starters/examples/src/examples/moba/spells.ts +34 -0
  186. package/starters/examples/src/examples/moba/units.ts +196 -0
  187. package/starters/examples/src/examples/nature/camera.ts +15 -0
  188. package/starters/examples/src/examples/nature/grass.ts +64 -0
  189. package/starters/examples/src/examples/nature/index.ts +327 -0
  190. package/starters/examples/src/examples/nature/land.ts +173 -0
  191. package/starters/examples/src/examples/nature/looks.ts +577 -0
  192. package/starters/examples/src/examples/nature/maps.ts +370 -0
  193. package/starters/examples/src/examples/nature/skies.ts +324 -0
  194. package/starters/examples/src/examples/nature/weather.ts +80 -0
  195. package/starters/examples/src/examples/performance/index.ts +263 -0
  196. package/starters/examples/src/examples/performance/looks.ts +372 -0
  197. package/starters/examples/src/examples/performance/meter.ts +158 -0
  198. package/starters/examples/src/examples/post/grades.ts +86 -0
  199. package/starters/examples/src/examples/post/index.ts +202 -0
  200. package/starters/examples/src/examples/post/looks.ts +884 -0
  201. package/starters/examples/src/examples/post/passes.ts +213 -0
  202. package/starters/examples/src/examples/rts/ai.ts +49 -0
  203. package/starters/examples/src/examples/rts/airlift.ts +43 -0
  204. package/starters/examples/src/examples/rts/base.ts +129 -0
  205. package/starters/examples/src/examples/rts/build.ts +65 -0
  206. package/starters/examples/src/examples/rts/camps.ts +36 -0
  207. package/starters/examples/src/examples/rts/carry.ts +103 -0
  208. package/starters/examples/src/examples/rts/creeps.ts +61 -0
  209. package/starters/examples/src/examples/rts/data.ts +406 -0
  210. package/starters/examples/src/examples/rts/ferry.ts +41 -0
  211. package/starters/examples/src/examples/rts/garrison.ts +50 -0
  212. package/starters/examples/src/examples/rts/harvest.ts +29 -0
  213. package/starters/examples/src/examples/rts/hero.ts +67 -0
  214. package/starters/examples/src/examples/rts/index.ts +77 -0
  215. package/starters/examples/src/examples/rts/looks.ts +721 -0
  216. package/starters/examples/src/examples/rts/shop.ts +46 -0
  217. package/starters/examples/src/examples/rts/tech.ts +39 -0
  218. package/starters/examples/src/examples/rts/train.ts +48 -0
  219. package/starters/examples/src/examples/rts/waterside.ts +185 -0
  220. package/starters/examples/src/examples/showcase/index.ts +714 -0
  221. package/starters/examples/src/examples/showcase/looks.ts +238 -0
  222. package/starters/examples/src/game.ts +17 -0
  223. package/starters/examples/src/main.ts +82 -0
  224. package/starters/examples/src/rules.ts +31 -0
  225. package/starters/examples/src/shell/look.ts +79 -0
  226. package/starters/examples/src/shell/registry.ts +7 -0
  227. package/starters/examples/src/shell/scenes.ts +178 -0
  228. package/starters/examples/src/shell/shell.ts +290 -0
  229. package/starters/examples/src/shell/style.ts +202 -0
  230. package/starters/examples/src/view.ts +50 -0
  231. package/starters/melee/README.md +12 -3
  232. package/starters/melee/layers/tests/tests/heroes.test.ts +402 -0
  233. package/starters/melee/layers/tests/tests/rules.test.ts +10 -8
  234. package/starters/melee/src/game.ts +32 -2
  235. package/starters/melee/src/maps/bay.names.ts +2 -2
  236. package/starters/melee/src/maps/bay.vgmap.json +198 -1
  237. package/starters/melee/src/maps.ts +11 -9
  238. package/starters/melee/src/melee/abilities.ts +1 -194
  239. package/starters/melee/src/melee/blight.ts +7 -7
  240. package/starters/melee/src/melee/cellLayers.json +3 -3
  241. package/starters/melee/src/melee/data.json +1 -18
  242. package/starters/melee/src/melee/game.ts +6 -4
  243. package/starters/melee/src/melee/heroes.ts +1025 -0
  244. package/starters/melee/src/melee/index.ts +64 -61
  245. package/starters/melee/src/melee/items.ts +15 -362
  246. package/starters/melee/src/melee/languages/he.json +14 -2
  247. package/starters/melee/src/melee/pings.ts +5 -6
  248. package/starters/melee/src/melee/saves.ts +1 -1
  249. package/starters/melee/src/melee/undead.ts +15 -230
  250. package/starters/melee/src/melee/units.ts +37 -171
  251. package/starters/melee/src/melee/view/attacks.ts +19 -0
  252. package/starters/melee/src/melee/view/heroSpellLooks.ts +39 -8
  253. package/starters/melee/src/melee/view/index.ts +56 -52
  254. package/starters/melee/src/melee/view/looks.ts +86 -63
  255. package/starters/melee/src/melee/view/undeadLooks.ts +70 -31
  256. package/starters/melee/src/melee/view/walls.ts +1 -1
  257. package/starters.mjs +6 -0
  258. package/v12.mjs +14 -15
  259. package/starters/campaign/src/rules.ts +0 -20
  260. package/starters/empty/src/maps.ts +0 -44
  261. package/starters/empty/src/tiles.ts +0 -12
  262. package/starters/melee/src/melee/heroSpells.ts +0 -38
  263. package/starters/melee/src/rules.ts +0 -24
@@ -1,23 +1,21 @@
1
1
  import {
2
2
  type AbilityLooks,
3
+ foliage,
3
4
  FX_FILE,
4
5
  type GameView,
5
6
  hotView,
6
7
  type HudClient,
7
- type HudPartDef,
8
+ type HudWidgetDef,
8
9
  layFiles,
9
10
  type ModelDef,
10
- presetBuffMarker,
11
+ presetFoliage,
11
12
  presetFx,
12
- presetRallyFlag,
13
- presetSpellStyles,
14
- presetWeather,
13
+ presetView,
15
14
  readCinematic,
16
15
  type StatusLine,
17
- TILE_LOOKS,
18
16
  viewListener,
19
17
  type UnitLooks,
20
- withHeroesView
18
+ heroesViewPack
21
19
  } from '@v12-engine/client'
22
20
  import { LOOKS_FILE } from '@v12-engine/client/looks-file'
23
21
  import looksFile from '../looks.json'
@@ -32,6 +30,7 @@ import { holyFire } from './fire'
32
30
  import { bossName, towerKills } from './labels'
33
31
  import { rubble } from './rubble'
34
32
  import { waveLane } from './waveLane'
33
+ import { ONE_HANDED, TWO_HANDED } from './attacks'
35
34
 
36
35
  /**
37
36
  * How the campaign looks: its own view, next to its rules in `..`. Every unit and building is a model of the shared
@@ -76,81 +75,91 @@ const person = (height: number, body: [number, number, number] | 'team') => [
76
75
  const TREES = ['common_tree_1', 'common_tree_2', 'common_tree_3', 'common_tree_5', 'pine_1', 'pine_2', 'pine_3', 'pine_5']
77
76
 
78
77
  export const looks: UnitLooks<CampaignUnit> = {
79
- peasant: { height: 1.5, model: character('barbarian', 0.58, { hold: [hold('axe_1handed')] }), parts: person(1.5, 'team') },
80
- footman: { height: 1.8, model: character('knight', 0.7, { hold: [hold('sword_1handed'), hold('shield_round', 'l')] }), parts: person(1.8, 'team') },
78
+ peasant: { height: 1.5, model: character('barbarian', 0.58, { hold: [hold('axe_1handed')] }), attacks: [ONE_HANDED], shapes: person(1.5, 'team') },
79
+ footman: {
80
+ height: 1.8,
81
+ model: character('knight', 0.7, { hold: [hold('sword_1handed'), hold('shield_round', 'l')] }),
82
+ // its swings in turn, never the same twice running (`./attacks`): as the knight's, the Red Hand's
83
+ attacks: [ONE_HANDED],
84
+ shapes: person(1.8, 'team')
85
+ },
81
86
  archer: {
82
87
  height: 1.7,
83
88
  model: character('ranger', 0.68, { hold: [hold('bow')], animations: { attack: 'Ranged_2H_Shoot' } }),
84
89
  shot: { color: [0.85, 0.75, 0.55], size: 0.2 },
85
- parts: person(1.7, 'team')
90
+ shapes: person(1.7, 'team')
86
91
  },
87
92
  knight: {
88
93
  height: 2.2,
89
94
  model: character('knight', 0.9, { hold: [hold('sword_2handed')], animations: { attack: 'Melee_2H_Attack_Chop' } }),
90
- parts: person(2.2, 'team')
95
+ attacks: [TWO_HANDED],
96
+ shapes: person(2.2, 'team')
91
97
  },
92
98
  hall: {
93
99
  height: 4.4,
94
100
  model: building('rts/castle.glb', [6.31, 2.81, 5.87], 4.4),
95
- parts: [{ shape: 'box', size: [3.8, 2.6, 3.8], offset: [0, 1.3, 0], color: STONE }]
101
+ shapes: [{ shape: 'box', size: [3.8, 2.6, 3.8], offset: [0, 1.3, 0], color: STONE }]
96
102
  },
97
103
  farm: {
98
104
  height: 2.2,
99
105
  model: building('rts/small_farm.glb', [5.437, 3.211, 3.33], 2.6),
100
- parts: [{ shape: 'box', size: [1.8, 1.4, 1.8], offset: [0, 0.7, 0], color: WOOD }]
106
+ shapes: [{ shape: 'box', size: [1.8, 1.4, 1.8], offset: [0, 0.7, 0], color: WOOD }]
101
107
  },
102
108
  barracks: {
103
109
  height: 3.2,
104
110
  model: building('rts/barracks.glb', [3.029, 2.158, 3.234], 3.2),
105
- parts: [{ shape: 'box', size: [2.8, 2, 2.8], offset: [0, 1, 0], color: WOOD }]
111
+ shapes: [{ shape: 'box', size: [2.8, 2, 2.8], offset: [0, 1, 0], color: WOOD }]
106
112
  },
107
113
  tower: {
108
114
  height: 4.8,
109
115
  model: building('rts/watch_tower.glb', [1.515, 4.388, 1.558], 1.7, { points: { launch: { offset: [0, 3.6, 0] } } }),
110
116
  shot: { color: [0.85, 0.75, 0.55], size: 0.25 },
111
- parts: [{ shape: 'cylinder', size: [1.5, 3.5, 1.5], offset: [0, 1.75, 0], color: STONE }]
117
+ shapes: [{ shape: 'cylinder', size: [1.5, 3.5, 1.5], offset: [0, 1.75, 0], color: STONE }]
112
118
  },
113
119
  wall: {
114
120
  height: 1.4,
115
121
  model: building('rts/stone_wall.glb', [4.681, 1.338, 0.74], 2.2),
116
122
  death: { collapse: { look: 'crumble', pieces: 8, dust: true } },
117
- parts: [{ shape: 'box', size: [2, 1.2, 0.7], offset: [0, 0.6, 0], color: STONE }]
123
+ shapes: [{ shape: 'box', size: [2, 1.2, 0.7], offset: [0, 0.6, 0], color: STONE }]
118
124
  },
119
125
  trader: {
120
126
  height: 2.4,
121
127
  model: building('village/market_stand.glb', [0.776, 1.563, 1.731], 2.2),
122
- parts: [{ shape: 'box', size: [1.8, 1.6, 1.8], offset: [0, 0.8, 0], color: [0.7, 0.55, 0.3] }]
128
+ shapes: [{ shape: 'box', size: [1.8, 1.6, 1.8], offset: [0, 0.8, 0], color: [0.7, 0.55, 0.3] }]
123
129
  },
124
130
  raider: {
125
131
  height: 1.8,
126
132
  model: character('barbarian', 0.72, { hold: [hold('axe_1handed'), hold('shield_round_barbarian', 'l')] }),
127
- parts: person(1.8, RED)
133
+ attacks: [ONE_HANDED],
134
+ shapes: person(1.8, RED)
128
135
  },
129
136
  warlock: {
130
137
  height: 1.8,
131
138
  model: character('mage', 0.72, { hold: [hold('staff')] }),
132
139
  shot: { color: [1, 0.45, 0.15], size: 0.3 },
133
- parts: person(1.8, RED)
140
+ shapes: person(1.8, RED)
134
141
  },
135
142
  brute: {
136
143
  height: 2.5,
137
144
  model: character('barbarian', 1.05, { hold: [hold('axe_2handed')], animations: { attack: 'Melee_2H_Attack_Chop' } }),
138
- parts: person(2.5, RED)
145
+ attacks: [TWO_HANDED],
146
+ shapes: person(2.5, RED)
139
147
  },
140
148
  warlord: {
141
149
  height: 2.8,
142
150
  model: character('barbarian', 1.2, { hold: [hold('sword_2handed')], animations: { attack: 'Melee_2H_Attack_Chop' } }),
151
+ attacks: [TWO_HANDED],
143
152
  unitHud: { show: 'always', items: [{ text: 'Varga', size: 13, color: 'owner' }] },
144
- parts: person(2.8, RED)
153
+ shapes: person(2.8, RED)
145
154
  },
146
- gnoll: { height: 1.6, model: character('rogue_hooded', 0.62, { hold: [hold('dagger')] }), parts: person(1.6, [0.45, 0.4, 0.3]) },
147
- prisoner: { height: 1.6, model: character('rogue', 0.62), parts: person(1.6, [0.5, 0.5, 0.5]) },
155
+ gnoll: { height: 1.6, model: character('rogue_hooded', 0.62, { hold: [hold('dagger')] }), attacks: [ONE_HANDED], shapes: person(1.6, [0.45, 0.4, 0.3]) },
156
+ prisoner: { height: 1.6, model: character('rogue', 0.62), shapes: person(1.6, [0.5, 0.5, 0.5]) },
148
157
  tree: {
149
158
  height: 3,
150
159
  looks: Object.fromEntries(TREES.map((look) => [look, { src: `forest/${look}.glb`, scale: 0.85 }])),
151
160
  mix: TREES,
152
161
  vary: { scale: 0.25, lean: 0.07 },
153
- parts: [
162
+ shapes: [
154
163
  { shape: 'cylinder', size: [0.3, 1, 0.3], offset: [0, 0.5, 0], color: [0.36, 0.25, 0.15] },
155
164
  { shape: 'cone', size: [1.5, 1.8, 1.5], offset: [0, 1.7, 0], color: [0.15, 0.38, 0.18] }
156
165
  ]
@@ -158,7 +167,7 @@ export const looks: UnitLooks<CampaignUnit> = {
158
167
  goldmine: {
159
168
  height: 3.2,
160
169
  model: building('rts/mine.glb', [3.853, 3.508, 4.084], 3.9),
161
- parts: [
170
+ shapes: [
162
171
  { shape: 'box', size: [3.5, 2, 3.5], offset: [0, 1, 0], color: [0.4, 0.38, 0.35] },
163
172
  { shape: 'sphere', size: [1, 1, 1], offset: [0, 2.4, 0], color: GOLD }
164
173
  ]
@@ -171,7 +180,11 @@ export const effects: AbilityLooks = {
171
180
  rallied: { color: [1, 0.6, 0.2], aura: 'glow' },
172
181
  // drawn by a style of the game's own (`styles` below, made in fire.ts)
173
182
  judgement: { color: [1, 0.85, 0.35], style: 'campaign.holyFire' },
174
- drinkPotion: { color: [0.4, 1, 0.5] }
183
+ drinkPotion: { color: [0.4, 1, 0.5] },
184
+ // the engine's hero spells the knight brings, and the buffs they put on
185
+ barrier: { color: GOLD, style: 'burst', aura: 'glow', options: { count: 36, shape: 'shell' } },
186
+ purify: { color: [1, 1, 1], style: 'burst', options: { count: 40, shape: 'shell' } },
187
+ purified: { color: [1, 1, 1], aura: 'glow' }
175
188
  }
176
189
 
177
190
  /** The lines on the HUD, from what the game reports: the wave, when the next one comes, who is still coming */
@@ -186,7 +199,7 @@ function status(report: Record<string, unknown>): StatusLine[] {
186
199
  }
187
200
 
188
201
  /** A panel of the campaign's own: what the next wave brings, while the player waits for it (the siege) */
189
- const nextWavePanel: HudPartDef = {
202
+ const nextWavePanel: HudWidgetDef = {
190
203
  id: 'campaign.nextWave',
191
204
  place: 'top-right',
192
205
  mount(element: HTMLElement, client: HudClient) {
@@ -206,7 +219,9 @@ const nextWavePanel: HudPartDef = {
206
219
  }
207
220
 
208
221
  export const campaignView: GameView<CampaignUnit, CampaignResource, CampaignMessage> = layFiles(
209
- {
222
+ // the client's ready-made looks it draws none of by itself: the rain and snow, the abilities' styles, a building's
223
+ // rally flag, the glow over a unit with a buff and the looks of the engine's tiles, under what the view says of its own
224
+ presetView({
210
225
  files: {
211
226
  // its own folder of files (public/games/campaign, with an assets.json saying what is in it): where the editor puts
212
227
  // what is taken in for the game
@@ -229,10 +244,10 @@ export const campaignView: GameView<CampaignUnit, CampaignResource, CampaignMess
229
244
  },
230
245
  // what the screen does as a wave sets out, besides the flare the rules fire: the camera feels it
231
246
  on: [viewListener(waveComing, ({ x, z }, client) => client.camera.shake(x, z, 0.3))],
232
- // the HUD's half of the heroes the rules take (`withHeroes`): the hero's panel, the heroes' portraits, the shop
233
- packs: [withHeroesView()],
247
+ // the HUD's half of the heroes the rules take (`heroesPack`): the hero's panel, the heroes' portraits, the shop
248
+ packs: [heroesViewPack()],
234
249
  hud: {
235
- parts: [nextWavePanel],
250
+ widgets: [nextWavePanel],
236
251
  resources: { gold: { chip: 'background: radial-gradient(circle at 35% 30%, #fff3b8, var(--vg-gold) 45%, #9c6f12)' } },
237
252
  status,
238
253
  messages: {
@@ -284,29 +299,25 @@ export const campaignView: GameView<CampaignUnit, CampaignResource, CampaignMess
284
299
  renderers: [towerKills, bossName, rubble],
285
300
  fx: {
286
301
  abilities: {
287
- // spell styles of its own, by the names the effects' looks give (`effects` above)
288
- styles: { ...presetSpellStyles(), 'campaign.holyFire': holyFire },
302
+ // a spell style of its own beside the ready-made ones, by the name the effects' looks give (`effects` above)
303
+ styles: { 'campaign.holyFire': holyFire },
289
304
  looks: effects
290
305
  },
291
306
  // the ready-made effects the maps and the rules use; what the editor's FX panel wrote is laid over them (`fx.json`)
292
307
  defs: presetFx(['campfire', 'torch', 'dust', 'puff', 'spark-burst', 'explosion', 'glow'])
293
308
  },
294
- scene: {
295
- // the ready-made rain and snow, a building's rally flag, the glow over a unit with a buff: the client draws none
296
- // of them by itself
297
- weather: presetWeather(),
309
+ world: {
298
310
  // trees and scenery in front of the player's own units faded out
299
311
  seeThrough: {}
300
312
  },
313
+ ground: {
314
+ // the maps' grass (the rules' `grass` layer): a meadow with flowers in it, the tall grass of the same name
315
+ cellLayers: { grass: foliage({ ...presetFoliage.meadow, styles: { 2: presetFoliage.tallGrass } }) }
316
+ },
301
317
  units: {
302
- rallyFlag: presetRallyFlag(),
303
- buffMarker: presetBuffMarker(),
304
318
  // what the editor's model setup wrote is laid over these (`looks.json`)
305
319
  looks
306
320
  },
307
- ground: {
308
- tiles: TILE_LOOKS
309
- },
310
321
  input: {
311
322
  keys: {
312
323
  actions: {
@@ -322,7 +333,7 @@ export const campaignView: GameView<CampaignUnit, CampaignResource, CampaignMess
322
333
  }
323
334
  }
324
335
  }
325
- },
336
+ }),
326
337
  // the files the editor writes next to the code, laid over what it says above
327
338
  [
328
339
  [LOOKS_FILE, looksFile],
@@ -15,7 +15,7 @@ import wavesData from './waves.json'
15
15
 
16
16
  /*
17
17
  * The waves of the siege (mission two): who comes out of the war camp, how often, and what beating a wave pays. They
18
- * are the file `waves.json`, a file of the game's own (`wavesFile`, in `GameModule.files`): each world's registry holds
18
+ * are the file `waves.json`, a file of the game's own (`wavesFile`, in `Rules.files`): each world's registry holds
19
19
  * what it plays (`siegeWaves(world)`), which the editor's Waves panel changes as it writes the file (saved with the
20
20
  * map, undone like the rest). They go by timers and events: nothing looks at them every tick
21
21
  */
@@ -29,8 +29,8 @@ export interface Wave {
29
29
  bonus: number
30
30
  }
31
31
 
32
- /** The waves' file, a file of the game's own: what the game lists (`GameModule.files`), read as waves */
33
- export const wavesFile = defineGameFile('waves.json', wavesData, readWaves)
32
+ /** The waves' file, a file of the game's own: what the game lists (`Rules.files`), read as waves */
33
+ export const wavesFile = defineGameFile({ id: 'waves.json', data: wavesData, read: readWaves })
34
34
 
35
35
  /** The waves a world, a screen or the editor plays, in order: its registry's (`registry.file`) */
36
36
  export const siegeWaves = (of: { readonly registry: Registry }): Wave[] => of.registry.file(wavesFile)
@@ -79,7 +79,7 @@ interface WaveState {
79
79
  * The state of the waves, kept in the world: what the waves remember belongs to the world, not to the game module,
80
80
  * which every world shares. As world state it goes into a save, and so do the timers it waits for
81
81
  */
82
- export const waves = defineComponent<WaveState>('campaign.waves', { default: () => ({ wave: 0, phase: 'idle', timer: 0, queue: [] }) })
82
+ export const waves = defineComponent<WaveState>({ id: 'campaign.waves', default: () => ({ wave: 0, phase: 'idle', timer: 0, queue: [] }) })
83
83
 
84
84
  export const wavesOf = (world: World): WaveState => world.state(waves)
85
85
 
@@ -91,12 +91,12 @@ function raiders(world: World): number {
91
91
  }
92
92
 
93
93
  /** A wave was beaten: how many are, now. For whoever keeps count, like the mission */
94
- export const waveBeaten = defineEvent<{ wave: number }>('campaign.waveBeaten')
94
+ export const waveBeaten = defineEvent<{ wave: number }>({ id: 'campaign.waveBeaten' })
95
95
  /** A wave is coming out of the camp: for the mission (the gate shuts) and the screen (the horn, the flare) */
96
- export const waveComing = defineEvent<{ wave: number; x: number; z: number }>('campaign.waveComing', { replicate: 'everyone' })
96
+ export const waveComing = defineEvent<{ wave: number; x: number; z: number }>({ id: 'campaign.waveComing', replicate: 'everyone' })
97
97
 
98
98
  /** The next wave is due: its raiders come out of the camp, one every so often */
99
- const waveComes = defineTimer('campaign.waveComes', (world) => {
99
+ const waveComes = defineTimer({ id: 'campaign.waveComes', run: (world) => {
100
100
  if (world.winner !== null) return
101
101
  const state = wavesOf(world)
102
102
  const { units, interval } = siegeWaves(world)[state.wave]
@@ -108,15 +108,15 @@ const waveComes = defineTimer('campaign.waveComes', (world) => {
108
108
  const camp = world.map.point(WAR_CAMP)
109
109
  world.events.emit(waveComing, { wave: state.wave + 1, x: camp.x, z: camp.z })
110
110
  world.message(PLAYER, { key: MSG.waveComing, params: { wave: state.wave + 1 } }, 'info')
111
- })
111
+ } })
112
112
 
113
113
  /** The next raider of the wave comes out, and goes for the hall. After the last, the wave is fought */
114
- const raiderComes = defineTimer('campaign.raiderComes', (world, _data, { left }) => {
114
+ const raiderComes = defineTimer({ id: 'campaign.raiderComes', run: (world, _data, { left }) => {
115
115
  if (world.winner !== null) return
116
116
  const state = wavesOf(world)
117
117
  comeOut(world, state.queue.shift()!)
118
118
  if (left === 0) state.phase = 'fighting'
119
- })
119
+ } })
120
120
 
121
121
  /** The last raider of a wave died: the wave is beaten, for gold, and the next one is set to come */
122
122
  const lastOfTheWave = defineListener({
@@ -145,15 +145,16 @@ function waitForWave(world: World, seconds: number): void {
145
145
  /** Sets the first wave to come. Called once, as the siege begins */
146
146
  export const startWaves = (world: World) => waitForWave(world, FIRST_WAIT)
147
147
 
148
- /** A raider comes out of the camp and goes for the hall: the order goes in as a command, the way every order does */
148
+ /**
149
+ * A raider comes out of the camp and goes for the hall: `raider.order` goes in as a command of its owner's, the way
150
+ * every order does
151
+ */
149
152
  function comeOut(world: World, type: string): void {
150
153
  const camp = world.map.point(WAR_CAMP)
151
- const raider = world.spawn(type, ENEMY, camp, { facing: camp.facing })
154
+ const raider = world.spawn(type, { at: camp, owner: ENEMY, facing: camp.facing })
152
155
  const hall = world.named(HALL)
153
- const order = hall?.alive
154
- ? { type: 'attack', target: hall.id }
155
- : { type: 'move', point: { x: world.terrain.width / 2, z: world.terrain.depth / 2 } }
156
- world.issue({ type: 'order', player: ENEMY, entities: [raider.id], order })
156
+ if (hall?.alive) raider.order('attack', hall)
157
+ else raider.order('move', { x: world.terrain.width / 2, z: world.terrain.depth / 2 })
157
158
  }
158
159
 
159
160
  /** Brings the next wave on now, instead of waiting for it. The seconds that were left are paid out in gold */
@@ -169,7 +170,7 @@ export const nextWave = defineCommand('nextWave', {}, (world, player) => {
169
170
  export const waveTimers = [waveComes, raiderComes]
170
171
  export const waveListeners = [lastOfTheWave]
171
172
 
172
- /** What the player is told about the waves, for the HUD: see `GameModule.report`. Nothing until a mission starts them */
173
+ /** What the player is told about the waves, for the HUD: see `Rules.report`. Nothing until a mission starts them */
173
174
  export function reportWaves(world: World): Record<string, unknown> {
174
175
  const state = wavesOf(world)
175
176
  if (state.phase === 'idle') return {}
@@ -1,2 +1,9 @@
1
- /** The game, whole: the campaign's rules and how it looks (`src/campaign/game.ts`, its view in `src/campaign/view`) */
1
+ /**
2
+ * The game, whole, as every part of the project takes it (`createGame`): the campaign's (`src/campaign/game.ts`): its
3
+ * rules (`src/campaign`), its look (`src/campaign/view`, fetched as the page first plays it), its maps and the mission
4
+ * of a map given as a game of it starts. The page, the server, the editor and the tests all take this
5
+ */
2
6
  export { campaignGame as game } from './campaign/game'
7
+ export { ENEMY, PLAYER, UNIT } from './campaign'
8
+ // (saved while it runs, the campaign's rules and its look take their new versions with no new page:
9
+ // `src/campaign/index.ts` and `src/campaign/view/index.ts` say so)
@@ -14,7 +14,12 @@
14
14
  * screen otherwise. The debug panel (🐞 on the top bar, Alt+Shift+D) and its cheats are in the game while developing
15
15
  * (`npm run dev`), not in a built page: `debug` says otherwise
16
16
  */
17
- import { appScenes, type MenuScene, sceneAsked, startApp } from '@v12-engine/client/app'
17
+ // @if !desktop
18
+ import { appScenes, sceneAsked, startApp } from '@v12-engine/client/app'
19
+ // @end
20
+ // @if desktop
21
+ import { appScenes, exitButton, sceneAsked, startApp } from '@v12-engine/client/app'
22
+ // @end
18
23
  import '@v12-engine/client/styles.css'
19
24
  // the theme's typefaces come with the client: the page's own font stays what it was
20
25
  import '@v12-engine/client/fonts.css'
@@ -22,17 +27,20 @@ import { theLongRoad } from './campaign/scenes'
22
27
  // @if editor
23
28
  import { editor } from './editor'
24
29
  // @end
25
- import { DEFAULT_MAP, maps } from './maps'
26
- import { rules, start } from './rules'
30
+ import { game } from './game'
31
+ // @if desktop
32
+ // what the desktop app adds: its shell's stores, the game saved as the window closes, an error log, updates, Exit
33
+ import { desktop } from './desktop'
34
+ // @end
27
35
 
36
+ // @if desktop
37
+ const shell = desktop()
38
+
39
+ // @end
28
40
  const scenes = appScenes({
29
- // the game's code (its looks, and the client that draws them) fetched as a scene first plays it: the start screen
30
- // shows at once, its rules telling it what to say of the game
31
- game: () => import('./game').then((module) => module.game),
32
- rules,
33
- maps,
34
- map: DEFAULT_MAP,
35
- start,
41
+ // the game (`src/game.ts`): its rules say what the start screen shows, its maps and its start are the scenes', and its
42
+ // look (and the client that draws it) is fetched as a scene first plays it, so that the start screen shows at once
43
+ game,
36
44
  // @if editor
37
45
  editor,
38
46
  // @end
@@ -42,6 +50,17 @@ const scenes = appScenes({
42
50
  // @if rooms
43
51
  server: { rooms: true },
44
52
  // @end
53
+ // the campaign's menu, its button first on the start screen, and its missions among the scenes
54
+ home: {
55
+ buttons: [{ label: 'Campaign', scene: theLongRoad.menu }],
56
+ // @if desktop
57
+ // Exit, last on the start screen: in the shell alone, as a page cannot close its tab
58
+ after: [exitButton(shell)]
59
+ // @end
60
+ },
61
+ extra: theLongRoad.scenes,
62
+ // the game on its own is Free play: a map with its mission's rules, nothing carried or kept
63
+ scenes: { play: { name: 'Free play' } },
45
64
  menu: {
46
65
  description: 'A campaign made with V12: three missions, a hero carried from one to the next.',
47
66
  details: [{ label: 'Missions', value: 'three, played in order' }]
@@ -55,16 +74,16 @@ const scenes = appScenes({
55
74
  }
56
75
  })
57
76
 
58
- // the campaign's menu and missions among the scenes, its button first on the start screen
59
- scenes.push(...theLongRoad.scenes)
60
- const home = scenes.find((scene) => scene.id === 'home') as MenuScene
61
- home.buttons.unshift({ label: 'Campaign', scene: theLongRoad.menu })
62
- // the game on its own is Free play: a map with its mission's rules, nothing carried or kept
63
- for (const scene of scenes) if (scene.id === 'play') scene.name = 'Free play'
64
- for (const button of home.buttons) if (button.scene?.id === 'play') button.label = 'Free play'
65
-
66
77
  /** The ground's textures made in a worker of the page's (`src/ground.worker.ts`), made at the first texture: the page goes on while they are made */
67
78
  const groundWorker = () => new Worker(new URL('./ground.worker.ts', import.meta.url), { type: 'module' })
79
+ /** The navigations of its worlds built in another (`src/navigation.worker.ts`), made at the first build */
80
+ const navigationWorker = () => new Worker(new URL('./navigation.worker.ts', import.meta.url), { type: 'module' })
68
81
 
69
- const app = startApp({ target: '#game', title: rules.name, scenes, start: sceneAsked(scenes, 'home'), groundWorker })
82
+ // @if !desktop
83
+ const app = startApp({ target: '#game', game, scenes, start: sceneAsked(scenes, 'home'), groundWorker, navigationWorker })
84
+ // @end
85
+ // @if desktop
86
+ const app = startApp({ target: '#game', game, scenes, start: sceneAsked(scenes, 'home'), groundWorker, navigationWorker, ...shell.options })
87
+ shell.started(app)
88
+ // @end
70
89
  Object.assign(window, { app })
@@ -23,8 +23,8 @@ export type FortPaths =
23
23
  export type FortLights =
24
24
  | 'bonfire'
25
25
 
26
- /** The effects of the map that are named, for `client.mapEffects.named(...)` */
27
- export type FortEffects =
26
+ /** The effects of the map that are named, for `client.mapFx.named(...)` */
27
+ export type FortFx =
28
28
  | 'bonfire'
29
29
 
30
30
  /** The ids of the regions, points and paths by name: what a field that names one keeps (it is handed the name) */
@@ -20,7 +20,7 @@
20
20
  { "id": 20, "name": "gate", "x": 48, "z": 42, "scale": [0.68,1,1], "gate": true, "model": "rts/castle_gate.glb", "open": true, "radius": 2, "yaw": 0 },
21
21
  { "id": 31, "x": 48, "z": 8, "scale": [2,2,2], "model": "village/bonfire.glb", "yaw": 0 }
22
22
  ],
23
- "environment": {"clouds":{"cover":0.6,"speed":1.2},"light":{"sunAround":220,"sunUp":20,"night":{"ambient":0.35,"ambientColor":[0.5,0.55,0.8]}},"fog":{"start":40,"end":150,"color":[0.08,0.09,0.14]},"lights":[{"id":1000,"x":45.5,"z":41,"height":2.6,"color":[1,0.7,0.4],"intensity":1.6,"range":9,"when":"night","flicker":0.3},{"id":1002,"x":50.5,"z":41,"height":2.6,"color":[1,0.7,0.4],"intensity":1.6,"range":9,"when":"night","flicker":0.3},{"id":1004,"x":34,"z":40,"height":2.6,"color":[1,0.7,0.4],"intensity":1.6,"range":9,"when":"night","flicker":0.3},{"id":1006,"x":62,"z":40,"height":2.6,"color":[1,0.7,0.4],"intensity":1.6,"range":9,"when":"night","flicker":0.3},{"id":1009,"x":48,"z":52,"height":1.5,"color":[1,0.6,0.3],"intensity":2,"range":12,"when":"night","flicker":0.4,"name":"bonfire"}],"effects":[{"id":1001,"fx":"torch","x":45.5,"z":41,"height":2.2,"when":"night"},{"id":1003,"fx":"torch","x":50.5,"z":41,"height":2.2,"when":"night"},{"id":1005,"fx":"torch","x":34,"z":40,"height":2.2,"when":"night"},{"id":1007,"fx":"torch","x":62,"z":40,"height":2.2,"when":"night"},{"id":1008,"fx":"campfire","x":48,"z":52,"name":"bonfire"}]},
23
+ "environment": {"clouds":{"cover":0.6,"speed":1.2},"light":{"sunAround":220,"sunUp":20,"night":{"ambient":0.35,"ambientColor":[0.5,0.55,0.8]}},"fog":{"start":40,"end":150,"color":[0.08,0.09,0.14]},"lights":[{"id":1000,"x":45.5,"z":41,"height":2.6,"color":[1,0.7,0.4],"intensity":1.6,"range":9,"when":"night","flicker":0.3},{"id":1002,"x":50.5,"z":41,"height":2.6,"color":[1,0.7,0.4],"intensity":1.6,"range":9,"when":"night","flicker":0.3},{"id":1004,"x":34,"z":40,"height":2.6,"color":[1,0.7,0.4],"intensity":1.6,"range":9,"when":"night","flicker":0.3},{"id":1006,"x":62,"z":40,"height":2.6,"color":[1,0.7,0.4],"intensity":1.6,"range":9,"when":"night","flicker":0.3},{"id":1009,"x":48,"z":52,"height":1.5,"color":[1,0.6,0.3],"intensity":2,"range":12,"when":"night","flicker":0.4,"name":"bonfire"}],"fx":[{"id":1001,"fx":"torch","x":45.5,"z":41,"height":2.2,"when":"night"},{"id":1003,"fx":"torch","x":50.5,"z":41,"height":2.2,"when":"night"},{"id":1005,"fx":"torch","x":34,"z":40,"height":2.2,"when":"night"},{"id":1007,"fx":"torch","x":62,"z":40,"height":2.2,"when":"night"},{"id":1008,"fx":"campfire","x":48,"z":52,"name":"bonfire"}]},
24
24
  "day": {"start":22,"still":true},
25
25
  "camps": [],
26
26
  "objects": [
@@ -1158,5 +1158,105 @@
1158
1158
  "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1159
1159
  "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1160
1160
  "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
1161
- ]
1161
+ ],
1162
+ "cells": {
1163
+ "grass": [
1164
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1165
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1166
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1167
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1168
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1169
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1170
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1171
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1172
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1173
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1174
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1175
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1176
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1177
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1178
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1179
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1180
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1181
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1182
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1183
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1184
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1185
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1186
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1187
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1188
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1189
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1190
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1191
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1192
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1193
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1194
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1195
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1196
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1197
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1198
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1199
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1200
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1201
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1202
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1203
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1204
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1205
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1206
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1207
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1208
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1209
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1210
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1211
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1212
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1213
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1214
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1215
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1216
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1217
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1218
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1219
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1220
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1221
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1222
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1223
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1224
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1225
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1226
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1227
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1228
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1229
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1230
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1231
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1232
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1233
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1234
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1235
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1236
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1237
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1238
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1239
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1240
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1241
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1242
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1243
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1244
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1245
+ "AAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAA",
1246
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1247
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1248
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1249
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1250
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1251
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1252
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1253
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1254
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1255
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1256
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1257
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1258
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1259
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
1260
+ ]
1261
+ }
1162
1262
  }
@@ -29,8 +29,8 @@ export type HomesteadPaths = never
29
29
  /** The lights of the map that are named, for `client.lights.named(...)` */
30
30
  export type HomesteadLights = never
31
31
 
32
- /** The effects of the map that are named, for `client.mapEffects.named(...)` */
33
- export type HomesteadEffects = never
32
+ /** The effects of the map that are named, for `client.mapFx.named(...)` */
33
+ export type HomesteadFx = never
34
34
 
35
35
  /** The ids of the regions, points and paths by name: what a field that names one keeps (it is handed the name) */
36
36
  export const HomesteadIds = { regions: { "ford": 12, "caravan": 13, "redHandCamp": 20 }, points: { "outpost": 11, "camp": 19 }, paths: { } } as const