@v12-engine/engine 0.1.0 → 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.
- package/dist/abilities/amounts.d.ts +28 -0
- package/dist/abilities/amounts.js +74 -0
- package/dist/abilities/amounts.js.map +1 -0
- package/dist/abilities/buffs.d.ts +106 -6
- package/dist/abilities/buffs.js +443 -0
- package/dist/abilities/buffs.js.map +1 -0
- package/dist/abilities/castTold.d.ts +2 -0
- package/dist/abilities/castTold.js +66 -0
- package/dist/abilities/castTold.js.map +1 -0
- package/dist/abilities/chance.d.ts +38 -0
- package/dist/abilities/chance.js +77 -0
- package/dist/abilities/chance.js.map +1 -0
- package/dist/abilities/charges.d.ts +18 -0
- package/dist/abilities/charges.js +101 -0
- package/dist/abilities/charges.js.map +1 -0
- package/dist/abilities/control.d.ts +28 -0
- package/dist/abilities/control.js +113 -0
- package/dist/abilities/control.js.map +1 -0
- package/dist/abilities/dispel.js +51 -0
- package/dist/abilities/dispel.js.map +1 -0
- package/dist/abilities/effectFields.d.ts +1 -1
- package/dist/abilities/effectFields.js +676 -0
- package/dist/abilities/effectFields.js.map +1 -0
- package/dist/abilities/effectIndex.d.ts +27 -0
- package/dist/abilities/effectIndex.js +64 -0
- package/dist/abilities/effectIndex.js.map +1 -0
- package/dist/abilities/effects/buff.d.ts +9 -3
- package/dist/abilities/effects/buff.js +84 -0
- package/dist/abilities/effects/buff.js.map +1 -0
- package/dist/abilities/effects/conditions.d.ts +2 -0
- package/dist/abilities/effects/conditions.js +41 -0
- package/dist/abilities/effects/conditions.js.map +1 -0
- package/dist/abilities/effects/core.js +54 -0
- package/dist/abilities/effects/core.js.map +1 -0
- package/dist/abilities/effects/damage.d.ts +1 -1
- package/dist/abilities/effects/damage.js +43 -0
- package/dist/abilities/effects/damage.js.map +1 -0
- package/dist/abilities/effects/heal.d.ts +2 -2
- package/dist/abilities/effects/heal.js +51 -0
- package/dist/abilities/effects/heal.js.map +1 -0
- package/dist/abilities/effects/missile.d.ts +13 -1
- package/dist/abilities/effects/missile.js +104 -0
- package/dist/abilities/effects/missile.js.map +1 -0
- package/dist/abilities/effects/morph.d.ts +5 -0
- package/dist/abilities/effects/morph.js +43 -0
- package/dist/abilities/effects/morph.js.map +1 -0
- package/dist/abilities/effects/moves.d.ts +16 -4
- package/dist/abilities/effects/moves.js +212 -0
- package/dist/abilities/effects/moves.js.map +1 -0
- package/dist/abilities/effects/passives.d.ts +19 -9
- package/dist/abilities/effects/passives.js +131 -0
- package/dist/abilities/effects/passives.js.map +1 -0
- package/dist/abilities/effects/proxy.d.ts +5 -0
- package/dist/abilities/effects/proxy.js +60 -0
- package/dist/abilities/effects/proxy.js.map +1 -0
- package/dist/abilities/effects/sight.d.ts +2 -2
- package/dist/abilities/effects/sight.js +39 -0
- package/dist/abilities/effects/sight.js.map +1 -0
- package/dist/abilities/effects/spawn.d.ts +5 -2
- package/dist/abilities/effects/spawn.js +40 -0
- package/dist/abilities/effects/spawn.js.map +1 -0
- package/dist/abilities/effects/timed.d.ts +2 -2
- package/dist/abilities/effects/timed.js +96 -0
- package/dist/abilities/effects/timed.js.map +1 -0
- package/dist/abilities/effects/trade.d.ts +1 -1
- package/dist/abilities/effects/trade.js +25 -0
- package/dist/abilities/effects/trade.js.map +1 -0
- package/dist/abilities/effects.d.ts +97 -23
- package/dist/abilities/effects.js +860 -0
- package/dist/abilities/effects.js.map +1 -0
- package/dist/abilities/land.d.ts +38 -4
- package/dist/abilities/land.js +189 -0
- package/dist/abilities/land.js.map +1 -0
- package/dist/abilities/recast.d.ts +45 -0
- package/dist/abilities/recast.js +118 -0
- package/dist/abilities/recast.js.map +1 -0
- package/dist/abilities/scaled.js +40 -0
- package/dist/abilities/scaled.js.map +1 -0
- package/dist/abilities/screen.d.ts +6 -0
- package/dist/abilities/screen.js +83 -0
- package/dist/abilities/screen.js.map +1 -0
- package/dist/abilities/shapes.d.ts +66 -0
- package/dist/abilities/shapes.js +122 -0
- package/dist/abilities/shapes.js.map +1 -0
- package/dist/abilities/text.d.ts +14 -2
- package/dist/abilities/text.js +204 -0
- package/dist/abilities/text.js.map +1 -0
- package/dist/abilities/triggers.d.ts +98 -0
- package/dist/abilities/triggers.js +351 -0
- package/dist/abilities/triggers.js.map +1 -0
- package/dist/abilityChanges.d.ts +131 -0
- package/dist/abilityChanges.js +345 -0
- package/dist/abilityChanges.js.map +1 -0
- package/dist/ai/area.d.ts +4 -1
- package/dist/ai/brain.d.ts +4 -1
- package/dist/ai/brain.js +844 -0
- package/dist/ai/brain.js.map +1 -0
- package/dist/ai/budget.js +74 -0
- package/dist/ai/budget.js.map +1 -0
- package/dist/ai/checks.d.ts +9 -1
- package/dist/ai/checks.js +242 -0
- package/dist/ai/checks.js.map +1 -0
- package/dist/ai/computer.d.ts +11 -4
- package/dist/ai/computer.js +251 -0
- package/dist/ai/computer.js.map +1 -0
- package/dist/ai/defence.d.ts +4 -0
- package/dist/ai/defence.js +430 -0
- package/dist/ai/defence.js.map +1 -0
- package/dist/ai/define.d.ts +3 -2
- package/dist/ai/define.js +31 -0
- package/dist/ai/define.js.map +1 -0
- package/dist/ai/economy.d.ts +10 -7
- package/dist/ai/economy.js +780 -0
- package/dist/ai/economy.js.map +1 -0
- package/dist/ai/geometry.js +38 -0
- package/dist/ai/geometry.js.map +1 -0
- package/dist/ai/goals.d.ts +1 -0
- package/dist/ai/goals.js +560 -0
- package/dist/ai/goals.js.map +1 -0
- package/dist/ai/knowledge.d.ts +72 -7
- package/dist/ai/knowledge.js +804 -0
- package/dist/ai/knowledge.js.map +1 -0
- package/dist/ai/lanes.d.ts +10 -2
- package/dist/ai/lanes.js +715 -0
- package/dist/ai/lanes.js.map +1 -0
- package/dist/ai/melee/build.js +264 -0
- package/dist/ai/melee/build.js.map +1 -0
- package/dist/ai/melee/goals.d.ts +7 -0
- package/dist/ai/melee/goals.js +720 -0
- package/dist/ai/melee/goals.js.map +1 -0
- package/dist/ai/melee/heroes.js +68 -0
- package/dist/ai/melee/heroes.js.map +1 -0
- package/dist/ai/melee/index.d.ts +1 -1
- package/dist/ai/melee/index.js +51 -0
- package/dist/ai/melee/index.js.map +1 -0
- package/dist/ai/melee/production.js +29 -0
- package/dist/ai/melee/production.js.map +1 -0
- package/dist/ai/melee/surrender.js +64 -0
- package/dist/ai/melee/surrender.js.map +1 -0
- package/dist/ai/micro.d.ts +9 -0
- package/dist/ai/micro.js +1316 -0
- package/dist/ai/micro.js.map +1 -0
- package/dist/ai/mission.d.ts +9 -2
- package/dist/ai/mission.js +538 -0
- package/dist/ai/mission.js.map +1 -0
- package/dist/ai/missionRules.d.ts +1 -1
- package/dist/ai/missionRules.js +26 -0
- package/dist/ai/missionRules.js.map +1 -0
- package/dist/ai/module.d.ts +6 -2
- package/dist/ai/module.js +37 -0
- package/dist/ai/module.js.map +1 -0
- package/dist/ai/options.d.ts +3 -3
- package/dist/ai/plans/build.d.ts +20 -1
- package/dist/ai/plans/build.js +608 -0
- package/dist/ai/plans/build.js.map +1 -0
- package/dist/ai/plans/placement.d.ts +4 -1
- package/dist/ai/plans/placement.js +295 -0
- package/dist/ai/plans/placement.js.map +1 -0
- package/dist/ai/plans/plans.d.ts +9 -0
- package/dist/ai/plans/plans.js +110 -0
- package/dist/ai/plans/plans.js.map +1 -0
- package/dist/ai/plans/production.d.ts +14 -2
- package/dist/ai/plans/production.js +434 -0
- package/dist/ai/plans/production.js.map +1 -0
- package/dist/ai/plans/purse.d.ts +6 -3
- package/dist/ai/plans/purse.js +139 -0
- package/dist/ai/plans/purse.js.map +1 -0
- package/dist/ai/plans/tech.d.ts +6 -0
- package/dist/ai/plans/tech.js +122 -0
- package/dist/ai/plans/tech.js.map +1 -0
- package/dist/ai/profiles.d.ts +4 -4
- package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
- package/dist/ai/profiles.js.map +1 -0
- package/dist/ai/reach.js +54 -0
- package/dist/ai/reach.js.map +1 -0
- package/dist/ai/report.d.ts +8 -0
- package/dist/ai/report.js +87 -0
- package/dist/ai/report.js.map +1 -0
- package/dist/ai/roles.d.ts +4 -0
- package/dist/ai/roles.js +207 -0
- package/dist/ai/roles.js.map +1 -0
- package/dist/ai/rules.d.ts +8 -2
- package/dist/ai/rules.js +416 -0
- package/dist/ai/rules.js.map +1 -0
- package/dist/ai/scouting.d.ts +6 -0
- package/dist/ai/scouting.js +324 -0
- package/dist/ai/scouting.js.map +1 -0
- package/dist/ai/settings.js +99 -0
- package/dist/ai/settings.js.map +1 -0
- package/dist/ai/squads.d.ts +21 -2
- package/dist/ai/squads.js +916 -0
- package/dist/ai/squads.js.map +1 -0
- package/dist/ai/strength.js +320 -0
- package/dist/ai/strength.js.map +1 -0
- package/dist/ai/task.d.ts +3 -1
- package/dist/ai/task.js +17 -0
- package/dist/ai/task.js.map +1 -0
- package/dist/ai/tasks/attack.js +24 -0
- package/dist/ai/tasks/attack.js.map +1 -0
- package/dist/ai/tasks/capture.d.ts +3 -3
- package/dist/ai/tasks/capture.js +37 -0
- package/dist/ai/tasks/capture.js.map +1 -0
- package/dist/ai/tasks/creep.js +29 -0
- package/dist/ai/tasks/creep.js.map +1 -0
- package/dist/ai/tasks/defend.js +61 -0
- package/dist/ai/tasks/defend.js.map +1 -0
- package/dist/ai/tasks/drop.js +81 -0
- package/dist/ai/tasks/drop.js.map +1 -0
- package/dist/ai/tasks/escort.js +59 -0
- package/dist/ai/tasks/escort.js.map +1 -0
- package/dist/ai/tasks/gather.js +48 -0
- package/dist/ai/tasks/gather.js.map +1 -0
- package/dist/ai/tasks/harass.js +39 -0
- package/dist/ai/tasks/harass.js.map +1 -0
- package/dist/ai/tasks/hold.js +32 -0
- package/dist/ai/tasks/hold.js.map +1 -0
- package/dist/ai/tasks/index.js +34 -0
- package/dist/ai/tasks/index.js.map +1 -0
- package/dist/ai/tasks/move.js +26 -0
- package/dist/ai/tasks/move.js.map +1 -0
- package/dist/ai/tasks/patrol.js +59 -0
- package/dist/ai/tasks/patrol.js.map +1 -0
- package/dist/ai/tasks/retreat.js +28 -0
- package/dist/ai/tasks/retreat.js.map +1 -0
- package/dist/ai/tasks/scout.js +73 -0
- package/dist/ai/tasks/scout.js.map +1 -0
- package/dist/ai/tasks/shared.d.ts +1 -1
- package/dist/ai/tasks/shared.js +137 -0
- package/dist/ai/tasks/shared.js.map +1 -0
- package/dist/ai/team.d.ts +18 -1
- package/dist/ai/team.js +492 -0
- package/dist/ai/team.js.map +1 -0
- package/dist/ai/threat.d.ts +6 -0
- package/dist/ai/threat.js +206 -0
- package/dist/ai/threat.js.map +1 -0
- package/dist/ai/view.d.ts +21 -7
- package/dist/ai/view.js +677 -0
- package/dist/ai/view.js.map +1 -0
- package/dist/ai/waves.d.ts +6 -0
- package/dist/ai/waves.js +410 -0
- package/dist/ai/waves.js.map +1 -0
- package/dist/ai.js +54 -6239
- package/dist/aiTesting.d.ts +6 -3
- package/dist/aiTesting.js +229 -0
- package/dist/aiTesting.js.map +1 -0
- package/dist/areas.d.ts +4 -1
- package/dist/areas.js +295 -0
- package/dist/areas.js.map +1 -0
- package/dist/attacks.d.ts +3 -3
- package/dist/attacks.js +127 -0
- package/dist/attacks.js.map +1 -0
- package/dist/burning.d.ts +267 -0
- package/dist/burning.js +795 -0
- package/dist/burning.js.map +1 -0
- package/dist/bytes.js +21 -0
- package/dist/bytes.js.map +1 -0
- package/dist/callings.d.ts +71 -0
- package/dist/callings.js +157 -0
- package/dist/callings.js.map +1 -0
- package/dist/cameraOrders.d.ts +78 -0
- package/dist/cameraOrders.js +114 -0
- package/dist/cameraOrders.js.map +1 -0
- package/dist/camps.d.ts +70 -4
- package/dist/camps.js +501 -0
- package/dist/camps.js.map +1 -0
- package/dist/capture.d.ts +15 -3
- package/dist/capture.js +304 -0
- package/dist/capture.js.map +1 -0
- package/dist/cellLayers.d.ts +78 -13
- package/dist/cellLayers.js +275 -0
- package/dist/cellLayers.js.map +1 -0
- package/dist/cellPatches.d.ts +24 -0
- package/dist/cellPatches.js +73 -0
- package/dist/cellPatches.js.map +1 -0
- package/dist/cinematics.d.ts +10 -5
- package/dist/cinematics.js +161 -0
- package/dist/cinematics.js.map +1 -0
- package/dist/clock.d.ts +2 -2
- package/dist/clock.js +78 -0
- package/dist/clock.js.map +1 -0
- package/dist/commands.d.ts +36 -4
- package/dist/commands.js +636 -0
- package/dist/commands.js.map +1 -0
- package/dist/components.d.ts +31 -10
- package/dist/components.js +74 -0
- package/dist/components.js.map +1 -0
- package/dist/computers.d.ts +4 -4
- package/dist/computers.js +194 -0
- package/dist/computers.js.map +1 -0
- package/dist/concealment.d.ts +25 -2
- package/dist/concealment.js +409 -0
- package/dist/concealment.js.map +1 -0
- package/dist/coreComponents.js +130 -0
- package/dist/coreComponents.js.map +1 -0
- package/dist/createGame.d.ts +306 -0
- package/dist/createGame.js +405 -0
- package/dist/createGame.js.map +1 -0
- package/dist/dashing.d.ts +18 -2
- package/dist/dashing.js +41 -0
- package/dist/dashing.js.map +1 -0
- package/dist/debug.d.ts +8 -0
- package/dist/debug.js +5 -3
- package/dist/debug2.js +76 -0
- package/dist/debug2.js.map +1 -0
- package/dist/debugCommands.d.ts +6 -6
- package/dist/debugCommands.js +537 -0
- package/dist/debugCommands.js.map +1 -0
- package/dist/debugging.d.ts +1 -0
- package/dist/defaultSets.d.ts +183 -0
- package/dist/defaultSets.js +216 -0
- package/dist/defaultSets.js.map +1 -0
- package/dist/definitions.d.ts +6 -0
- package/dist/definitions.js +78 -0
- package/dist/definitions.js.map +1 -0
- package/dist/defs.d.ts +1895 -165
- package/dist/defs.js +380 -0
- package/dist/defs.js.map +1 -0
- package/dist/denying.d.ts +4 -4
- package/dist/denying.js +106 -0
- package/dist/denying.js.map +1 -0
- package/dist/destructibles.d.ts +2 -2
- package/dist/destructibles.js +36 -0
- package/dist/destructibles.js.map +1 -0
- package/dist/determinism.d.ts +4 -4
- package/dist/determinism.js +247 -0
- package/dist/determinism.js.map +1 -0
- package/dist/dialog.d.ts +17 -2
- package/dist/dialog.js +108 -0
- package/dist/dialog.js.map +1 -0
- package/dist/effectRefs.js +28 -0
- package/dist/effectRefs.js.map +1 -0
- package/dist/effects.d.ts +27 -11
- package/dist/effects.js +110 -0
- package/dist/effects.js.map +1 -0
- package/dist/endings.d.ts +1 -1
- package/dist/endings.js +78 -0
- package/dist/endings.js.map +1 -0
- package/dist/engagement.d.ts +40 -6
- package/dist/engagement.js +530 -0
- package/dist/engagement.js.map +1 -0
- package/dist/engineEvents.d.ts +72 -9
- package/dist/engineEvents.js +520 -0
- package/dist/engineEvents.js.map +1 -0
- package/dist/entity.d.ts +275 -26
- package/dist/entity.js +441 -0
- package/dist/entity.js.map +1 -0
- package/dist/entityIndex.d.ts +10 -3
- package/dist/entityIndex.js +149 -0
- package/dist/entityIndex.js.map +1 -0
- package/dist/errors.d.ts +6 -2
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +11 -5
- package/dist/events.js +158 -0
- package/dist/events.js.map +1 -0
- package/dist/exactMath.js +273 -0
- package/dist/exactMath.js.map +1 -0
- package/dist/features.d.ts +1 -1
- package/dist/features.js +127 -0
- package/dist/features.js.map +1 -0
- package/dist/fields.d.ts +25 -5
- package/dist/fields.js +140 -0
- package/dist/fields.js.map +1 -0
- package/dist/fixture.d.ts +3 -3
- package/dist/fixture.js +512 -0
- package/dist/fixture.js.map +1 -0
- package/dist/fog.d.ts +26 -3
- package/dist/fog.js +333 -0
- package/dist/fog.js.map +1 -0
- package/dist/foliage.d.ts +476 -0
- package/dist/foliage.js +1478 -0
- package/dist/foliage.js.map +1 -0
- package/dist/foliageDebug.d.ts +57 -0
- package/dist/foliageDebug.js +172 -0
- package/dist/foliageDebug.js.map +1 -0
- package/dist/foliageRegrowth.d.ts +20 -0
- package/dist/foliageRegrowth.js +332 -0
- package/dist/foliageRegrowth.js.map +1 -0
- package/dist/formState.d.ts +67 -0
- package/dist/formState.js +65 -0
- package/dist/formState.js.map +1 -0
- package/dist/formation.d.ts +46 -8
- package/dist/formation.js +297 -0
- package/dist/formation.js.map +1 -0
- package/dist/forms.d.ts +58 -0
- package/dist/forms.js +146 -0
- package/dist/forms.js.map +1 -0
- package/dist/friendlyFire.d.ts +2 -2
- package/dist/friendlyFire.js +37 -0
- package/dist/friendlyFire.js.map +1 -0
- package/dist/game.d.ts +141 -48
- package/dist/game.js +834 -0
- package/dist/game.js.map +1 -0
- package/dist/gameData.d.ts +96 -22
- package/dist/gameData.js +1690 -0
- package/dist/gameData.js.map +1 -0
- package/dist/gameFiles.d.ts +3 -3
- package/dist/gameFiles.js +14 -0
- package/dist/gameFiles.js.map +1 -0
- package/dist/gates.js +92 -0
- package/dist/gates.js.map +1 -0
- package/dist/generate.d.ts +28 -1
- package/dist/generate.js +1062 -0
- package/dist/generate.js.map +1 -0
- package/dist/generateWorker.d.ts +7 -3
- package/dist/generateWorker.js +86 -0
- package/dist/generateWorker.js.map +1 -0
- package/dist/grid.d.ts +9 -0
- package/dist/grid.js +102 -0
- package/dist/grid.js.map +1 -0
- package/dist/ground.d.ts +17 -1
- package/dist/ground.js +375 -0
- package/dist/ground.js.map +1 -0
- package/dist/groundObjects.d.ts +70 -0
- package/dist/groundObjects.js +371 -0
- package/dist/groundObjects.js.map +1 -0
- package/dist/groundSpeed.d.ts +20 -3
- package/dist/groundSpeed.js +117 -0
- package/dist/groundSpeed.js.map +1 -0
- package/dist/hero.d.ts +126 -10
- package/dist/hero.js +432 -0
- package/dist/hero.js.map +1 -0
- package/dist/holds.d.ts +94 -0
- package/dist/holds.js +305 -0
- package/dist/holds.js.map +1 -0
- package/dist/home.d.ts +1 -1
- package/dist/home.js +30 -0
- package/dist/home.js.map +1 -0
- package/dist/hooks.d.ts +339 -57
- package/dist/hooks.js +105 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hotReload.d.ts +6 -5
- package/dist/hotReload.js +145 -0
- package/dist/hotReload.js.map +1 -0
- package/dist/ids.d.ts +3 -3
- package/dist/ids.js +30 -0
- package/dist/ids.js.map +1 -0
- package/dist/idsFile.d.ts +36 -0
- package/dist/idsFile.js +134 -0
- package/dist/idsFile.js.map +1 -0
- package/dist/index.d.ts +105 -68
- package/dist/index.js +194 -4701
- package/dist/inspect.d.ts +29 -2
- package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
- package/dist/inspect.js.map +1 -0
- package/dist/inventory.d.ts +14 -1
- package/dist/inventory.js +84 -0
- package/dist/inventory.js.map +1 -0
- package/dist/items.d.ts +136 -8
- package/dist/items.js +585 -0
- package/dist/items.js.map +1 -0
- package/dist/lanes.d.ts +12 -3
- package/dist/lanes.js +496 -0
- package/dist/lanes.js.map +1 -0
- package/dist/life.d.ts +6 -2
- package/dist/life.js +287 -0
- package/dist/life.js.map +1 -0
- package/dist/log.d.ts +26 -3
- package/dist/log.js +192 -0
- package/dist/log.js.map +1 -0
- package/dist/manaBurn.d.ts +2 -2
- package/dist/manaBurn.js +75 -0
- package/dist/manaBurn.js.map +1 -0
- package/dist/map/file.d.ts +56 -3
- package/dist/map/file.js +264 -0
- package/dist/map/file.js.map +1 -0
- package/dist/map/images.js +61 -0
- package/dist/map/images.js.map +1 -0
- package/dist/map/look.d.ts +1 -1
- package/dist/map/look.js +30 -0
- package/dist/map/look.js.map +1 -0
- package/dist/map/pathProfile.js +183 -0
- package/dist/map/pathProfile.js.map +1 -0
- package/dist/map/resize.d.ts +4 -0
- package/dist/map/resize.js +136 -0
- package/dist/map/resize.js.map +1 -0
- package/dist/map/schema.js +257 -0
- package/dist/map/schema.js.map +1 -0
- package/dist/map/terrain.js +214 -0
- package/dist/map/terrain.js.map +1 -0
- package/dist/map/types.d.ts +92 -13
- package/dist/map/types.js +251 -0
- package/dist/map/types.js.map +1 -0
- package/dist/mapCheck/cells.js +94 -0
- package/dist/mapCheck/cells.js.map +1 -0
- package/dist/mapCheck/rules/foliage.d.ts +9 -0
- package/dist/mapCheck/rules/foliage.js +83 -0
- package/dist/mapCheck/rules/foliage.js.map +1 -0
- package/dist/mapCheck/rules/names.js +39 -0
- package/dist/mapCheck/rules/names.js.map +1 -0
- package/dist/mapCheck/rules/objects.d.ts +1 -1
- package/dist/mapCheck/rules/objects.js +56 -0
- package/dist/mapCheck/rules/objects.js.map +1 -0
- package/dist/mapCheck/rules/paths.js +32 -0
- package/dist/mapCheck/rules/paths.js.map +1 -0
- package/dist/mapCheck/rules/players.js +20 -0
- package/dist/mapCheck/rules/players.js.map +1 -0
- package/dist/mapCheck/rules/races.js +56 -0
- package/dist/mapCheck/rules/races.js.map +1 -0
- package/dist/mapCheck/rules/random.js +47 -0
- package/dist/mapCheck/rules/random.js.map +1 -0
- package/dist/mapCheck/rules/regions.js +30 -0
- package/dist/mapCheck/rules/regions.js.map +1 -0
- package/dist/mapCheck/rules/targets.js +31 -0
- package/dist/mapCheck/rules/targets.js.map +1 -0
- package/dist/mapCheck/rules/walking.js +45 -0
- package/dist/mapCheck/rules/walking.js.map +1 -0
- package/dist/mapCheck.d.ts +2 -2
- package/dist/mapCheck.js +63 -0
- package/dist/mapCheck.js.map +1 -0
- package/dist/mapFields.d.ts +25 -2
- package/dist/mapFields.js +134 -0
- package/dist/mapFields.js.map +1 -0
- package/dist/mapFile.js +176 -0
- package/dist/mapFile.js.map +1 -0
- package/dist/mapMeasure.d.ts +8 -0
- package/dist/mapMeasure.js +283 -0
- package/dist/mapMeasure.js.map +1 -0
- package/dist/mapMerge.d.ts +1 -0
- package/dist/mapMerge.js +172 -0
- package/dist/mapMerge.js.map +1 -0
- package/dist/mapObjectives.js +138 -0
- package/dist/mapObjectives.js.map +1 -0
- package/dist/mapObjects.js +80 -0
- package/dist/mapObjects.js.map +1 -0
- package/dist/math.d.ts +37 -7
- package/dist/math.js +155 -0
- package/dist/math.js.map +1 -0
- package/dist/messages.d.ts +71 -4
- package/dist/messages.js +29 -0
- package/dist/messages.js.map +1 -0
- package/dist/missionRules.d.ts +10 -2
- package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
- package/dist/missionRules.js.map +1 -0
- package/dist/mods.d.ts +39 -20
- package/dist/mods.js +271 -0
- package/dist/mods.js.map +1 -0
- package/dist/moves.d.ts +87 -0
- package/dist/moves.js +539 -0
- package/dist/moves.js.map +1 -0
- package/dist/names.d.ts +7 -0
- package/dist/names.js +122 -0
- package/dist/names.js.map +1 -0
- package/dist/navigation/agentParams.js +14 -0
- package/dist/navigation/agentParams.js.map +1 -0
- package/dist/navigation/air.d.ts +7 -3
- package/dist/navigation/air.js +401 -0
- package/dist/navigation/air.js.map +1 -0
- package/dist/navigation/builds.d.ts +34 -2
- package/dist/navigation/builds.js +287 -0
- package/dist/navigation/builds.js.map +1 -0
- package/dist/navigation/groundAreas.d.ts +59 -1
- package/dist/navigation/groundAreas.js +407 -0
- package/dist/navigation/groundAreas.js.map +1 -0
- package/dist/navigation/navigation.d.ts +98 -9
- package/dist/navigation/recast.d.ts +194 -18
- package/dist/navigation/recast.js +1379 -0
- package/dist/navigation/recast.js.map +1 -0
- package/dist/navigation/sidePaths.d.ts +8 -3
- package/dist/navigation/sidePaths.js +241 -0
- package/dist/navigation/sidePaths.js.map +1 -0
- package/dist/navigation/sized.js +243 -0
- package/dist/navigation/sized.js.map +1 -0
- package/dist/nearest.js +32 -0
- package/dist/nearest.js.map +1 -0
- package/dist/noise.js +59 -0
- package/dist/noise.js.map +1 -0
- package/dist/objectives.d.ts +12 -3
- package/dist/objectives.js +144 -0
- package/dist/objectives.js.map +1 -0
- package/dist/orders/basic.d.ts +5 -5
- package/dist/orders/basic.js +417 -0
- package/dist/orders/basic.js.map +1 -0
- package/dist/orders/build.js +278 -0
- package/dist/orders/build.js.map +1 -0
- package/dist/orders/cast.d.ts +13 -3
- package/dist/orders/cast.js +558 -0
- package/dist/orders/cast.js.map +1 -0
- package/dist/orders/facts.js +16 -0
- package/dist/orders/facts.js.map +1 -0
- package/dist/orders/harvest.d.ts +21 -5
- package/dist/orders/harvest.js +540 -0
- package/dist/orders/harvest.js.map +1 -0
- package/dist/orders/idle.d.ts +3 -1
- package/dist/orders/idle.js +234 -0
- package/dist/orders/idle.js.map +1 -0
- package/dist/orders/items.js +92 -0
- package/dist/orders/items.js.map +1 -0
- package/dist/orders/queue.js +108 -0
- package/dist/orders/queue.js.map +1 -0
- package/dist/orders/waiting.d.ts +39 -0
- package/dist/orders/waiting.js +149 -0
- package/dist/orders/waiting.js.map +1 -0
- package/dist/pack.schema.js +13 -0
- package/dist/pack.schema.js.map +1 -0
- package/dist/pack.schema.json +7622 -841
- package/dist/packs/director/index.d.ts +13 -5
- package/dist/packs/director/index.js +204 -0
- package/dist/packs/director/index.js.map +1 -0
- package/dist/packs/heroes/campaign.d.ts +3 -2
- package/dist/packs/heroes/campaign.js +241 -0
- package/dist/packs/heroes/campaign.js.map +1 -0
- package/dist/packs/heroes/carry.d.ts +6 -0
- package/dist/packs/heroes/carry.js +112 -0
- package/dist/packs/heroes/carry.js.map +1 -0
- package/dist/packs/heroes/commands.js +115 -0
- package/dist/packs/heroes/commands.js.map +1 -0
- package/dist/packs/heroes/fallen.d.ts +43 -0
- package/dist/packs/heroes/fallen.js +61 -0
- package/dist/packs/heroes/fallen.js.map +1 -0
- package/dist/packs/heroes/hire.js +60 -0
- package/dist/packs/heroes/hire.js.map +1 -0
- package/dist/packs/heroes/index.d.ts +7 -6
- package/dist/packs/heroes/index.js +130 -0
- package/dist/packs/heroes/index.js.map +1 -0
- package/dist/packs/heroes/loop.d.ts +95 -0
- package/dist/packs/heroes/loop.js +250 -0
- package/dist/packs/heroes/loop.js.map +1 -0
- package/dist/packs/heroes/making.d.ts +6 -3
- package/dist/packs/heroes/making.js +55 -0
- package/dist/packs/heroes/making.js.map +1 -0
- package/dist/packs/heroes/respawn.d.ts +3 -3
- package/dist/packs/heroes/respawn.js +87 -0
- package/dist/packs/heroes/respawn.js.map +1 -0
- package/dist/packs/heroes/sets.d.ts +32 -0
- package/dist/packs/heroes/sets.js +51 -0
- package/dist/packs/heroes/sets.js.map +1 -0
- package/dist/packs/heroes/spells.d.ts +16 -0
- package/dist/packs/heroes/spells.js +269 -0
- package/dist/packs/heroes/spells.js.map +1 -0
- package/dist/packs/items/defaults.d.ts +43 -0
- package/dist/packs/items/defaults.js +1504 -0
- package/dist/packs/items/defaults.js.map +1 -0
- package/dist/packs/items/index.d.ts +27 -0
- package/dist/packs/items/index.js +214 -0
- package/dist/packs/items/index.js.map +1 -0
- package/dist/packs/moba/index.d.ts +3 -3
- package/dist/packs/moba/index.js +174 -0
- package/dist/packs/moba/index.js.map +1 -0
- package/dist/packs/pack.d.ts +15 -15
- package/dist/packs/pack.js +14 -0
- package/dist/packs/pack.js.map +1 -0
- package/dist/packs.d.ts +15 -7
- package/dist/packs.js +222 -0
- package/dist/packs.js.map +1 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.js +109 -0
- package/dist/paths.js.map +1 -0
- package/dist/plain.js +57 -0
- package/dist/plain.js.map +1 -0
- package/dist/player.d.ts +33 -10
- package/dist/player.js +159 -0
- package/dist/player.js.map +1 -0
- package/dist/portals.d.ts +1 -1
- package/dist/portals.js +194 -0
- package/dist/portals.js.map +1 -0
- package/dist/prefabs.d.ts +25 -2
- package/dist/prefabs.js +239 -0
- package/dist/prefabs.js.map +1 -0
- package/dist/presetBuildings.js +58 -0
- package/dist/presetBuildings.js.map +1 -0
- package/dist/presetFoliage.d.ts +27 -0
- package/dist/presetFoliage.js +98 -0
- package/dist/presetFoliage.js.map +1 -0
- package/dist/presetGround.js +65 -0
- package/dist/presetGround.js.map +1 -0
- package/dist/proxies.d.ts +12 -0
- package/dist/proxies.js +79 -0
- package/dist/proxies.js.map +1 -0
- package/dist/query.d.ts +56 -0
- package/dist/query.js +88 -0
- package/dist/query.js.map +1 -0
- package/dist/races.d.ts +15 -14
- package/dist/races.js +172 -0
- package/dist/races.js.map +1 -0
- package/dist/randomGroups.js +91 -0
- package/dist/randomGroups.js.map +1 -0
- package/dist/registry.d.ts +117 -53
- package/dist/registry.js +323 -0
- package/dist/registry.js.map +1 -0
- package/dist/remains.d.ts +11 -9
- package/dist/remains.js +188 -0
- package/dist/remains.js.map +1 -0
- package/dist/replication.d.ts +12 -7
- package/dist/replication.js +100 -0
- package/dist/replication.js.map +1 -0
- package/dist/rng.d.ts +2 -0
- package/dist/rng.js +40 -0
- package/dist/rng.js.map +1 -0
- package/dist/rules.d.ts +186 -99
- package/dist/rules.js +179 -0
- package/dist/rules.js.map +1 -0
- package/dist/rulesCheck.d.ts +5 -4
- package/dist/rulesCheck.js +693 -0
- package/dist/rulesCheck.js.map +1 -0
- package/dist/runes.d.ts +2 -2
- package/dist/runes.js +80 -0
- package/dist/runes.js.map +1 -0
- package/dist/save.d.ts +37 -12
- package/dist/save.js +532 -0
- package/dist/save.js.map +1 -0
- package/dist/scenario.d.ts +2 -2
- package/dist/scenario.js +99 -0
- package/dist/scenario.js.map +1 -0
- package/dist/scheduler.d.ts +3 -0
- package/dist/scheduler.js +156 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/score.d.ts +19 -19
- package/dist/score.js +709 -0
- package/dist/score.js.map +1 -0
- package/dist/sequences.d.ts +10 -6
- package/dist/sequences.js +206 -0
- package/dist/sequences.js.map +1 -0
- package/dist/server/doorman.js +154 -0
- package/dist/server/doorman.js.map +1 -0
- package/dist/server/gameServer.d.ts +16 -1
- package/dist/server/gameServer.js +643 -0
- package/dist/server/gameServer.js.map +1 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/lobby.js +199 -0
- package/dist/server/lobby.js.map +1 -0
- package/dist/server/log.js +18 -0
- package/dist/server/log.js.map +1 -0
- package/dist/server/match.js +267 -0
- package/dist/server/match.js.map +1 -0
- package/dist/server/mode.d.ts +18 -9
- package/dist/server/mode.js +220 -0
- package/dist/server/mode.js.map +1 -0
- package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
- package/dist/server/navigation-worker.js.map +1 -0
- package/dist/server/navigation.js +39 -0
- package/dist/server/navigation.js.map +1 -0
- package/dist/server/ops.d.ts +4 -0
- package/dist/server/ops.js +137 -0
- package/dist/server/ops.js.map +1 -0
- package/dist/server/packs.d.ts +3 -3
- package/dist/server/packs.js +32 -0
- package/dist/server/packs.js.map +1 -0
- package/dist/server/ratings.d.ts +5 -0
- package/dist/server/ratings.js +104 -0
- package/dist/server/ratings.js.map +1 -0
- package/dist/server/relay.d.ts +12 -2
- package/dist/server/relay.js +144 -0
- package/dist/server/relay.js.map +1 -0
- package/dist/server/rooms.d.ts +9 -2
- package/dist/server/rooms.js +442 -0
- package/dist/server/rooms.js.map +1 -0
- package/dist/server/seat.js +116 -0
- package/dist/server/seat.js.map +1 -0
- package/dist/server/seatSettings.d.ts +3 -3
- package/dist/server/seatSettings.js +63 -0
- package/dist/server/seatSettings.js.map +1 -0
- package/dist/server/secret.js +13 -0
- package/dist/server/secret.js.map +1 -0
- package/dist/server/start.d.ts +13 -6
- package/dist/server/start.js +76 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/websocket.d.ts +9 -1
- package/dist/server/websocket.js +306 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/server.js +15 -2861
- package/dist/session/can.js +26 -0
- package/dist/session/can.js.map +1 -0
- package/dist/session/commandReplay.d.ts +8 -2
- package/dist/session/commandReplay.js +293 -0
- package/dist/session/commandReplay.js.map +1 -0
- package/dist/session/debug.js +151 -0
- package/dist/session/debug.js.map +1 -0
- package/dist/session/delay.js +62 -0
- package/dist/session/delay.js.map +1 -0
- package/dist/session/delta.d.ts +14 -1
- package/dist/session/delta.js +407 -0
- package/dist/session/delta.js.map +1 -0
- package/dist/session/entityState.js +415 -0
- package/dist/session/entityState.js.map +1 -0
- package/dist/session/local.d.ts +47 -5
- package/dist/session/local.js +670 -0
- package/dist/session/local.js.map +1 -0
- package/dist/session/memory.d.ts +20 -2
- package/dist/session/memory.js +131 -0
- package/dist/session/memory.js.map +1 -0
- package/dist/session/protocol.d.ts +325 -31
- package/dist/session/protocol.js +55 -0
- package/dist/session/protocol.js.map +1 -0
- package/dist/session/remote.d.ts +74 -12
- package/dist/session/remote.js +1394 -0
- package/dist/session/remote.js.map +1 -0
- package/dist/session/replay.d.ts +11 -2
- package/dist/session/replay.js +160 -0
- package/dist/session/replay.js.map +1 -0
- package/dist/session/seed.js +12 -0
- package/dist/session/seed.js.map +1 -0
- package/dist/session/share.d.ts +5 -1
- package/dist/session/share.js +94 -0
- package/dist/session/share.js.map +1 -0
- package/dist/session/socket.d.ts +1 -1
- package/dist/session/socket.js +29 -0
- package/dist/session/socket.js.map +1 -0
- package/dist/session/wire.d.ts +5 -0
- package/dist/session/wire.js +84 -0
- package/dist/session/wire.js.map +1 -0
- package/dist/session/worker.d.ts +77 -12
- package/dist/session/worker.js +499 -0
- package/dist/session/worker.js.map +1 -0
- package/dist/shared.d.ts +31 -5
- package/dist/shared.js +166 -0
- package/dist/shared.js.map +1 -0
- package/dist/sides.d.ts +9 -3
- package/dist/sides.js +149 -0
- package/dist/sides.js.map +1 -0
- package/dist/sight.js +85 -0
- package/dist/sight.js.map +1 -0
- package/dist/simulate-worker.js +1 -1
- package/dist/simulate.d.ts +12 -8
- package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
- package/dist/simulate.js.map +1 -0
- package/dist/smart.js +77 -0
- package/dist/smart.js.map +1 -0
- package/dist/spatial.d.ts +32 -16
- package/dist/spatial.js +234 -0
- package/dist/spatial.js.map +1 -0
- package/dist/spawning.d.ts +1 -0
- package/dist/spawning.js +224 -0
- package/dist/spawning.js.map +1 -0
- package/dist/stances.d.ts +6 -3
- package/dist/stances.js +169 -0
- package/dist/stances.js.map +1 -0
- package/dist/start.d.ts +10 -10
- package/dist/start.js +75 -0
- package/dist/start.js.map +1 -0
- package/dist/stats.d.ts +42 -16
- package/dist/stats.js +290 -0
- package/dist/stats.js.map +1 -0
- package/dist/summoned.d.ts +52 -0
- package/dist/summoned.js +38 -0
- package/dist/summoned.js.map +1 -0
- package/dist/summons.d.ts +10 -13
- package/dist/summons.js +271 -0
- package/dist/summons.js.map +1 -0
- package/dist/systems/abilities.js +224 -0
- package/dist/systems/abilities.js.map +1 -0
- package/dist/systems/combat.d.ts +35 -1
- package/dist/systems/combat.js +677 -0
- package/dist/systems/combat.js.map +1 -0
- package/dist/systems/combatTold.d.ts +3 -1
- package/dist/systems/combatTold.js +85 -0
- package/dist/systems/combatTold.js.map +1 -0
- package/dist/systems/construction.js +80 -0
- package/dist/systems/construction.js.map +1 -0
- package/dist/systems/economy.d.ts +0 -6
- package/dist/systems/economy.js +128 -0
- package/dist/systems/economy.js.map +1 -0
- package/dist/systems/fog.d.ts +1 -1
- package/dist/systems/fog.js +120 -0
- package/dist/systems/fog.js.map +1 -0
- package/dist/systems/life.js +32 -0
- package/dist/systems/life.js.map +1 -0
- package/dist/systems/movement.d.ts +24 -12
- package/dist/systems/movement.js +1247 -0
- package/dist/systems/movement.js.map +1 -0
- package/dist/systems/orders.js +64 -0
- package/dist/systems/orders.js.map +1 -0
- package/dist/systems/production.js +322 -0
- package/dist/systems/production.js.map +1 -0
- package/dist/systems/productionQueue.js +120 -0
- package/dist/systems/productionQueue.js.map +1 -0
- package/dist/systems/victory.d.ts +1 -1
- package/dist/systems/victory.js +56 -0
- package/dist/systems/victory.js.map +1 -0
- package/dist/talk.d.ts +6 -6
- package/dist/talk.js +153 -0
- package/dist/talk.js.map +1 -0
- package/dist/targeting.d.ts +142 -0
- package/dist/targeting.js +49 -0
- package/dist/targeting.js.map +1 -0
- package/dist/tech.d.ts +20 -3
- package/dist/tech.js +239 -0
- package/dist/tech.js.map +1 -0
- package/dist/techTree.d.ts +7 -0
- package/dist/techTree.js +90 -0
- package/dist/techTree.js.map +1 -0
- package/dist/terrain.d.ts +59 -7
- package/dist/terrain.js +389 -0
- package/dist/terrain.js.map +1 -0
- package/dist/terrainSave.d.ts +6 -0
- package/dist/terrainSave.js +74 -0
- package/dist/terrainSave.js.map +1 -0
- package/dist/testing.d.ts +8 -7
- package/dist/testing.js +13 -739
- package/dist/testing.js.map +1 -1
- package/dist/tiles.d.ts +1 -1
- package/dist/tiles.js +43 -0
- package/dist/tiles.js.map +1 -0
- package/dist/timers.d.ts +29 -4
- package/dist/timers.js +242 -0
- package/dist/timers.js.map +1 -0
- package/dist/tomes.d.ts +4 -4
- package/dist/tomes.js +94 -0
- package/dist/tomes.js.map +1 -0
- package/dist/trade.js +103 -0
- package/dist/trade.js.map +1 -0
- package/dist/transport.d.ts +6 -1
- package/dist/transport.js +281 -0
- package/dist/transport.js.map +1 -0
- package/dist/tunables.d.ts +10 -3
- package/dist/tunables.js +56 -0
- package/dist/tunables.js.map +1 -0
- package/dist/unitResources.d.ts +67 -0
- package/dist/unitResources.js +266 -0
- package/dist/unitResources.js.map +1 -0
- package/dist/upkeep.d.ts +6 -1
- package/dist/upkeep.js +26 -0
- package/dist/upkeep.js.map +1 -0
- package/dist/veterancy.d.ts +8 -3
- package/dist/veterancy.js +131 -0
- package/dist/veterancy.js.map +1 -0
- package/dist/vision.d.ts +36 -0
- package/dist/vision.js +133 -0
- package/dist/vision.js.map +1 -0
- package/dist/walls.d.ts +1 -1
- package/dist/walls.js +278 -0
- package/dist/walls.js.map +1 -0
- package/dist/world.d.ts +606 -88
- package/dist/world.js +1263 -0
- package/dist/world.js.map +1 -0
- package/package.json +2 -2
- package/dist/ai.js.map +0 -1
- package/dist/attributes.d.ts +0 -66
- package/dist/brain-BvVdUhX8.js +0 -7659
- package/dist/brain-BvVdUhX8.js.map +0 -1
- package/dist/builds-C6LfgvEU.js +0 -460
- package/dist/builds-C6LfgvEU.js.map +0 -1
- package/dist/coreComponents-syuh2fPG.js +0 -5149
- package/dist/coreComponents-syuh2fPG.js.map +0 -1
- package/dist/debugCommands-CzjrSm66.js +0 -14739
- package/dist/debugCommands-CzjrSm66.js.map +0 -1
- package/dist/determinism-BCymQwiE.js +0 -518
- package/dist/determinism-BCymQwiE.js.map +0 -1
- package/dist/game-DiJEN-Ks.js +0 -5800
- package/dist/game-DiJEN-Ks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/inspect-D9dWHmZ0.js.map +0 -1
- package/dist/local-Dkovq42k.js +0 -1379
- package/dist/local-Dkovq42k.js.map +0 -1
- package/dist/missionRules-C-bGxm0Q.js.map +0 -1
- package/dist/navigation-worker.js.map +0 -1
- package/dist/packs-g5thvmGn.js +0 -3199
- package/dist/packs-g5thvmGn.js.map +0 -1
- package/dist/profiles-B3NS9jwk.js.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/simulate-oXBiw1Ff.js.map +0 -1
package/dist/ground.js
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { playTileset } from "./map/look.js";
|
|
2
|
+
import { Terrain } from "./terrain.js";
|
|
3
|
+
import { mapTerrain, tilesFor } from "./map/terrain.js";
|
|
4
|
+
import { packArray, packBytes, unpackBytes } from "./bytes.js";
|
|
5
|
+
import { loadTerrain, saveTerrain } from "./terrainSave.js";
|
|
6
|
+
//#region src/ground.ts
|
|
7
|
+
var LAYERS = [
|
|
8
|
+
"heights",
|
|
9
|
+
"levels",
|
|
10
|
+
"water",
|
|
11
|
+
"waterHeights",
|
|
12
|
+
"tiles",
|
|
13
|
+
"blocked"
|
|
14
|
+
];
|
|
15
|
+
/**
|
|
16
|
+
* Whether a save's ground is the changes of a map, not the whole of it
|
|
17
|
+
*
|
|
18
|
+
* @beta
|
|
19
|
+
*/
|
|
20
|
+
var isGroundChanges = (ground) => typeof ground.map === "string";
|
|
21
|
+
/**
|
|
22
|
+
* The ground a world is made on from a map, painted as the game's tiles go, then the map's own (`MapTile`): what
|
|
23
|
+
* `createWorldFromMap` makes
|
|
24
|
+
*
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
function startingTerrain(map, game) {
|
|
28
|
+
const tileIds = playTileset((game.tiles ?? []).map((tile) => tile.id), map.environment);
|
|
29
|
+
return mapTerrain({
|
|
30
|
+
...map,
|
|
31
|
+
tiles: tilesFor(map, tileIds),
|
|
32
|
+
tileset: tileIds
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A hash of a ground, every layer of it and its size: two grounds of the same hash are the same ground
|
|
37
|
+
*
|
|
38
|
+
* @beta
|
|
39
|
+
*/
|
|
40
|
+
function groundHash(terrain) {
|
|
41
|
+
let a = 2166136261;
|
|
42
|
+
let b = 1523705862;
|
|
43
|
+
const mix = (word) => {
|
|
44
|
+
a = Math.imul(a ^ word, 16777619);
|
|
45
|
+
b = Math.imul(b ^ word, 1540483477);
|
|
46
|
+
};
|
|
47
|
+
mix(terrain.width);
|
|
48
|
+
mix(terrain.depth);
|
|
49
|
+
const layers = LAYERS.map((key) => terrain[key]);
|
|
50
|
+
for (const id of Object.keys(terrain.cells).sort()) {
|
|
51
|
+
const cells = terrain.cells[id];
|
|
52
|
+
if (!cells.some((value) => value !== 0)) continue;
|
|
53
|
+
for (let i = 0; i < id.length; i++) mix(id.charCodeAt(i));
|
|
54
|
+
layers.push(cells);
|
|
55
|
+
}
|
|
56
|
+
for (const layer of layers) {
|
|
57
|
+
const bytes = new Uint8Array(layer.buffer, layer.byteOffset, layer.byteLength);
|
|
58
|
+
const words = Math.floor(bytes.length / 4);
|
|
59
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
60
|
+
for (let i = 0; i < words; i++) mix(view.getUint32(i * 4, true));
|
|
61
|
+
for (let i = words * 4; i < bytes.length; i++) mix(bytes[i]);
|
|
62
|
+
mix(4294967295);
|
|
63
|
+
}
|
|
64
|
+
return (a >>> 0).toString(16).padStart(8, "0") + (b >>> 0).toString(16).padStart(8, "0");
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* A ground a world starts on, as a map made it, with its hash worked out when it is first asked for
|
|
68
|
+
*
|
|
69
|
+
* @internal
|
|
70
|
+
*/
|
|
71
|
+
function startedOn(map, terrain) {
|
|
72
|
+
let hash;
|
|
73
|
+
return {
|
|
74
|
+
map,
|
|
75
|
+
terrain,
|
|
76
|
+
get hash() {
|
|
77
|
+
return hash ??= groundHash(terrain);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The ground a map the game ships makes, and its hash: worked out once for each of those maps, which are not changed
|
|
83
|
+
* once given (a map being edited is, and is not one of them)
|
|
84
|
+
*/
|
|
85
|
+
var bases = /* @__PURE__ */ new WeakMap();
|
|
86
|
+
/**
|
|
87
|
+
* The ground of a map for a game, worked out once per map and tileset and kept; returns the `GroundBase` with its terrain and hash
|
|
88
|
+
*
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
function groundBase(map, game) {
|
|
92
|
+
const key = playTileset((game.tiles ?? []).map((tile) => tile.id), map.environment).join();
|
|
93
|
+
let known = bases.get(map);
|
|
94
|
+
if (!known) bases.set(map, known = /* @__PURE__ */ new Map());
|
|
95
|
+
let base = known.get(key);
|
|
96
|
+
if (!base) {
|
|
97
|
+
const terrain = startingTerrain(map, game);
|
|
98
|
+
known.set(key, base = startedOn(map.name, terrain));
|
|
99
|
+
}
|
|
100
|
+
return base;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The map of a name whose ground has a hash, among some maps: the one a save or a welcome names
|
|
104
|
+
*
|
|
105
|
+
* @internal
|
|
106
|
+
*/
|
|
107
|
+
function findGround(maps, name, hash, game) {
|
|
108
|
+
for (const map of maps) if (map.name === name && groundBase(map, game).hash === hash) return groundBase(map, game);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The ground of a world as a save keeps it: the changes since the map it started as, where the game has that map as
|
|
112
|
+
* it was (the same name and the same ground), else all of it
|
|
113
|
+
*
|
|
114
|
+
* @internal
|
|
115
|
+
*/
|
|
116
|
+
function savedGround(terrain, base, maps, game) {
|
|
117
|
+
if (!base || !maps?.length || !findGround(maps, base.map, base.hash, game)) return saveTerrain(terrain);
|
|
118
|
+
const from = base.terrain;
|
|
119
|
+
if (from.width !== terrain.width || from.depth !== terrain.depth) return saveTerrain(terrain);
|
|
120
|
+
const changes = {};
|
|
121
|
+
for (const key of LAYERS) {
|
|
122
|
+
const now = terrain[key];
|
|
123
|
+
const was = from[key];
|
|
124
|
+
const at = [];
|
|
125
|
+
for (let i = 0; i < now.length; i++) if (now[i] !== was[i]) at.push(i);
|
|
126
|
+
if (!at.length) continue;
|
|
127
|
+
const values = now instanceof Float32Array ? Float32Array.from(at, (i) => now[i]) : Uint8Array.from(at, (i) => now[i]);
|
|
128
|
+
changes[key] = {
|
|
129
|
+
count: at.length,
|
|
130
|
+
at: packArray(Int32Array.from(at)),
|
|
131
|
+
to: values instanceof Float32Array ? packArray(values) : packBytes(values)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const cells = {};
|
|
135
|
+
for (const id of /* @__PURE__ */ new Set([...Object.keys(terrain.cells), ...Object.keys(from.cells)])) {
|
|
136
|
+
const now = terrain.cells[id];
|
|
137
|
+
const was = from.cells[id];
|
|
138
|
+
const at = [];
|
|
139
|
+
for (let i = 0; i < terrain.width * terrain.depth; i++) if ((now?.[i] ?? 0) !== (was?.[i] ?? 0)) at.push(i);
|
|
140
|
+
if (at.length) cells[id] = {
|
|
141
|
+
count: at.length,
|
|
142
|
+
at: packArray(Int32Array.from(at)),
|
|
143
|
+
to: packBytes(Uint8Array.from(at, (i) => now?.[i] ?? 0))
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
map: base.map,
|
|
148
|
+
hash: base.hash,
|
|
149
|
+
width: terrain.width,
|
|
150
|
+
depth: terrain.depth,
|
|
151
|
+
changes,
|
|
152
|
+
...Object.keys(cells).length && { cells },
|
|
153
|
+
...terrain.bounds && { bounds: { ...terrain.bounds } }
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Why the ground of a save or a welcome cannot be read: the map it names is not one of the game's, as it was
|
|
158
|
+
*
|
|
159
|
+
* @internal
|
|
160
|
+
*/
|
|
161
|
+
var MissingGround = class extends Error {
|
|
162
|
+
map;
|
|
163
|
+
hash;
|
|
164
|
+
constructor(map, hash) {
|
|
165
|
+
super(`The ground is the map "${map}" as it was (${hash}), which this game does not have: it was changed or taken out since`);
|
|
166
|
+
this.map = map;
|
|
167
|
+
this.hash = hash;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* A ground back from a save or a welcome, and what it started as where it names a map: that map among `maps`, with
|
|
172
|
+
* the changes put on it. Throws `MissingGround` where none of them is that map as it was
|
|
173
|
+
*
|
|
174
|
+
* @internal
|
|
175
|
+
*/
|
|
176
|
+
function groundOf(saved, maps, game) {
|
|
177
|
+
if (!isGroundChanges(saved)) return { terrain: loadTerrain(saved) };
|
|
178
|
+
const base = maps ? findGround(maps, saved.map, saved.hash, game) : void 0;
|
|
179
|
+
if (!base) throw new MissingGround(saved.map, saved.hash);
|
|
180
|
+
return {
|
|
181
|
+
terrain: applyGroundChanges(base.terrain, saved),
|
|
182
|
+
base
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* A copy of a ground, the changes put on it
|
|
187
|
+
*
|
|
188
|
+
* @internal
|
|
189
|
+
*/
|
|
190
|
+
function applyGroundChanges(from, ground) {
|
|
191
|
+
const terrain = cloneTerrain(from);
|
|
192
|
+
for (const key of LAYERS) {
|
|
193
|
+
const change = ground.changes[key];
|
|
194
|
+
if (!change) continue;
|
|
195
|
+
const layer = terrain[key];
|
|
196
|
+
const atBytes = unpackBytes(change.at, change.count * 4);
|
|
197
|
+
const toBytes = unpackBytes(change.to, change.count * (layer instanceof Float32Array ? 4 : 1));
|
|
198
|
+
if (!atBytes || !toBytes) throw new Error(`Save: the changes of the ${key} of the ground are not what they say`);
|
|
199
|
+
const at = new Int32Array(atBytes.buffer);
|
|
200
|
+
const to = layer instanceof Float32Array ? new Float32Array(toBytes.buffer) : toBytes;
|
|
201
|
+
for (let i = 0; i < at.length; i++) {
|
|
202
|
+
if (at[i] < 0 || at[i] >= layer.length) throw new Error(`Save: a change of the ${key} is off the ground`);
|
|
203
|
+
layer[at[i]] = to[i];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
for (const [id, change] of Object.entries(ground.cells ?? {})) {
|
|
207
|
+
const layer = terrain.cellLayer(id);
|
|
208
|
+
const atBytes = unpackBytes(change.at, change.count * 4);
|
|
209
|
+
const to = unpackBytes(change.to, change.count);
|
|
210
|
+
if (!atBytes || !to) throw new Error(`Save: the changes of the cells of ${id} are not what they say`);
|
|
211
|
+
const at = new Int32Array(atBytes.buffer);
|
|
212
|
+
for (let i = 0; i < at.length; i++) {
|
|
213
|
+
if (at[i] < 0 || at[i] >= layer.length) throw new Error(`Save: a change of the cells of ${id} is off the ground`);
|
|
214
|
+
layer[at[i]] = to[i];
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
terrain.bounds = ground.bounds ? { ...ground.bounds } : void 0;
|
|
218
|
+
return terrain;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* A copy of a ground, every layer its own
|
|
222
|
+
*
|
|
223
|
+
* @internal
|
|
224
|
+
*/
|
|
225
|
+
function cloneTerrain(from) {
|
|
226
|
+
const terrain = new Terrain(from.width, from.depth, from.heights.slice(), from.levels.slice(), {
|
|
227
|
+
water: from.water.slice(),
|
|
228
|
+
waterHeights: from.waterHeights.slice(),
|
|
229
|
+
tiles: from.tiles.slice(),
|
|
230
|
+
blocked: from.blocked.slice(),
|
|
231
|
+
cells: Object.fromEntries(Object.entries(from.cells).map(([id, layer]) => [id, layer.slice()]))
|
|
232
|
+
});
|
|
233
|
+
if (from.bounds) terrain.bounds = { ...from.bounds };
|
|
234
|
+
return terrain;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* The cells of two grounds of one size that are not the same, as the smallest rectangle around them; none where they
|
|
238
|
+
* are the same. Every layer, the game's layers of cells too. Two of other sizes: all of `after`
|
|
239
|
+
*
|
|
240
|
+
* @beta
|
|
241
|
+
*/
|
|
242
|
+
function groundDifference(before, after) {
|
|
243
|
+
if (before.width !== after.width || before.depth !== after.depth) return {
|
|
244
|
+
x: 0,
|
|
245
|
+
z: 0,
|
|
246
|
+
width: after.width,
|
|
247
|
+
depth: after.depth
|
|
248
|
+
};
|
|
249
|
+
let x0 = Infinity;
|
|
250
|
+
let z0 = Infinity;
|
|
251
|
+
let x1 = -1;
|
|
252
|
+
let z1 = -1;
|
|
253
|
+
const take = (x, z) => {
|
|
254
|
+
if (x < x0) x0 = x;
|
|
255
|
+
if (z < z0) z0 = z;
|
|
256
|
+
if (x > x1) x1 = x;
|
|
257
|
+
if (z > z1) z1 = z;
|
|
258
|
+
};
|
|
259
|
+
const { width, depth, vertsX } = after;
|
|
260
|
+
for (const layer of ["heights", "waterHeights"]) {
|
|
261
|
+
const a = before[layer];
|
|
262
|
+
const b = after[layer];
|
|
263
|
+
for (let i = 0; i < b.length; i++) {
|
|
264
|
+
if (a[i] === b[i]) continue;
|
|
265
|
+
const vx = i % vertsX;
|
|
266
|
+
const vz = Math.floor(i / vertsX);
|
|
267
|
+
take(Math.min(vx, width - 1), Math.min(vz, depth - 1));
|
|
268
|
+
take(Math.max(vx - 1, 0), Math.max(vz - 1, 0));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const cellLayers = [...[
|
|
272
|
+
"levels",
|
|
273
|
+
"water",
|
|
274
|
+
"tiles",
|
|
275
|
+
"blocked"
|
|
276
|
+
].map((layer) => [before[layer], after[layer]])];
|
|
277
|
+
for (const id of /* @__PURE__ */ new Set([...Object.keys(before.cells), ...Object.keys(after.cells)])) cellLayers.push([before.cells[id] ?? new Uint8Array(width * depth), after.cells[id] ?? new Uint8Array(width * depth)]);
|
|
278
|
+
for (const [a, b] of cellLayers) for (let i = 0; i < b.length; i++) if (a[i] !== b[i]) take(i % width, Math.floor(i / width));
|
|
279
|
+
return x1 < 0 ? void 0 : {
|
|
280
|
+
x: x0,
|
|
281
|
+
z: z0,
|
|
282
|
+
width: x1 - x0 + 1,
|
|
283
|
+
depth: z1 - z0 + 1
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* A rectangle of cells of a ground as it is (`TerrainPatch`): to be put in another
|
|
288
|
+
*
|
|
289
|
+
* @beta
|
|
290
|
+
*/
|
|
291
|
+
function terrainPatch(terrain, rect) {
|
|
292
|
+
const { x, z, width, depth } = rect;
|
|
293
|
+
const vertices = (values) => {
|
|
294
|
+
const out = [];
|
|
295
|
+
for (let vz = z; vz <= z + depth; vz++) for (let vx = x; vx <= x + width; vx++) out.push(values[vz * terrain.vertsX + vx]);
|
|
296
|
+
return out;
|
|
297
|
+
};
|
|
298
|
+
const cells = (values) => {
|
|
299
|
+
const out = [];
|
|
300
|
+
for (let cz = z; cz < z + depth; cz++) for (let cx = x; cx < x + width; cx++) out.push(values[cz * terrain.width + cx]);
|
|
301
|
+
return out;
|
|
302
|
+
};
|
|
303
|
+
const layers = Object.entries(terrain.cells);
|
|
304
|
+
return {
|
|
305
|
+
x,
|
|
306
|
+
z,
|
|
307
|
+
width,
|
|
308
|
+
depth,
|
|
309
|
+
heights: vertices(terrain.heights),
|
|
310
|
+
waterHeights: vertices(terrain.waterHeights),
|
|
311
|
+
levels: cells(terrain.levels),
|
|
312
|
+
water: cells(terrain.water),
|
|
313
|
+
tiles: cells(terrain.tiles),
|
|
314
|
+
blocked: cells(terrain.blocked),
|
|
315
|
+
...layers.length > 0 && { cells: Object.fromEntries(layers.map(([id, values]) => [id, cells(values)])) }
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* What is wrong with a patch for a ground (`TerrainPatch`): out of it, or of layers of other lengths. Nothing when it fits
|
|
320
|
+
*
|
|
321
|
+
* @beta
|
|
322
|
+
*/
|
|
323
|
+
function terrainPatchProblem(terrain, patch) {
|
|
324
|
+
const { x, z, width, depth } = patch;
|
|
325
|
+
if (![
|
|
326
|
+
x,
|
|
327
|
+
z,
|
|
328
|
+
width,
|
|
329
|
+
depth
|
|
330
|
+
].every(Number.isInteger) || x < 0 || z < 0 || width < 1 || depth < 1) return "the patch is no rectangle of cells";
|
|
331
|
+
if (x + width > terrain.width || z + depth > terrain.depth) return `the patch goes past the ground, ${terrain.width} by ${terrain.depth} cells`;
|
|
332
|
+
const vertices = (width + 1) * (depth + 1);
|
|
333
|
+
const cells = width * depth;
|
|
334
|
+
if (patch.heights.length !== vertices || patch.waterHeights.length !== vertices) return `the patch has not ${vertices} heights`;
|
|
335
|
+
for (const layer of [
|
|
336
|
+
patch.levels,
|
|
337
|
+
patch.water,
|
|
338
|
+
patch.tiles,
|
|
339
|
+
patch.blocked,
|
|
340
|
+
...Object.values(patch.cells ?? {})
|
|
341
|
+
]) if (layer.length !== cells) return `a layer of the patch has not ${cells} cells`;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Puts a patch (`TerrainPatch`) in a ground, in place: its heights, water, paint and levels, and the game's layers of
|
|
345
|
+
* cells (a layer the patch has that the ground has not is made). Nothing else: what the rules make of the ground is
|
|
346
|
+
* `World.reshapeGround`'s. Throws where it does not fit (`terrainPatchProblem`)
|
|
347
|
+
*
|
|
348
|
+
* @beta
|
|
349
|
+
*/
|
|
350
|
+
function applyTerrainPatch(terrain, patch) {
|
|
351
|
+
const problem = terrainPatchProblem(terrain, patch);
|
|
352
|
+
if (problem) throw new Error(`applyTerrainPatch: ${problem}`);
|
|
353
|
+
const { x, z, width, depth } = patch;
|
|
354
|
+
let i = 0;
|
|
355
|
+
for (let vz = z; vz <= z + depth; vz++) for (let vx = x; vx <= x + width; vx++, i++) {
|
|
356
|
+
const at = vz * terrain.vertsX + vx;
|
|
357
|
+
terrain.heights[at] = patch.heights[i];
|
|
358
|
+
terrain.waterHeights[at] = patch.waterHeights[i];
|
|
359
|
+
}
|
|
360
|
+
const layers = [
|
|
361
|
+
[terrain.levels, patch.levels],
|
|
362
|
+
[terrain.water, patch.water],
|
|
363
|
+
[terrain.tiles, patch.tiles],
|
|
364
|
+
[terrain.blocked, patch.blocked],
|
|
365
|
+
...Object.entries(patch.cells ?? {}).map(([id, values]) => [terrain.cellLayer(id), values])
|
|
366
|
+
];
|
|
367
|
+
for (const [into, values] of layers) {
|
|
368
|
+
let j = 0;
|
|
369
|
+
for (let cz = z; cz < z + depth; cz++) for (let cx = x; cx < x + width; cx++, j++) into[cz * terrain.width + cx] = values[j];
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
//#endregion
|
|
373
|
+
export { MissingGround, applyGroundChanges, applyTerrainPatch, cloneTerrain, findGround, groundBase, groundDifference, groundHash, groundOf, isGroundChanges, savedGround, startedOn, startingTerrain, terrainPatch, terrainPatchProblem };
|
|
374
|
+
|
|
375
|
+
//# sourceMappingURL=ground.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ground.js","names":[],"sources":["../src/ground.ts"],"sourcesContent":["import { packArray, packBytes, unpackBytes } from './bytes'\nimport type { Rules } from './game'\nimport { type GameMap, mapTerrain, playTileset, tilesFor } from './map'\nimport { loadTerrain, saveTerrain, type TerrainSave } from './terrainSave'\nimport { Terrain } from './terrain'\n\n/*\n * The ground not in every save and welcome (S36). A world made from a map the game has (`Rules.maps`) keeps the\n * ground it started on, and a save or a welcome names that map (by its name, and a hash of the ground it makes) and\n * carries only the cells of the ground that changed since: a few bytes, where the whole ground of a map of 1024 cells\n * a side is about 15 MB. A world made from bare terrain, or from a map the game does not have, keeps all of it, as\n * before. Whoever reads it finds the map among the game's own; a player who has not got it is sent the ground once,\n * in parts (`RemoteSession`).\n */\n\n/**\n * The ground of a save or a welcome: all of it, or the map it started as and what changed of it\n *\n * @beta\n */\nexport type SavedGround = TerrainSave | GroundChanges\n\n/**\n * The ground as a map the game has, and the cells of it that changed: in a save and in a welcome\n *\n * @beta\n */\nexport interface GroundChanges {\n\t/** The map it started as, by its name (`GameMap.name`) and a hash of the ground it makes (`groundHash`) */\n\tmap: string\n\t/** A hash of the ground the map makes, which tells the ground of a save or a welcome is the one it was taken from */\n\thash: string\n\t/** The ground's width in cells */\n\twidth: number\n\t/** The ground's depth in cells */\n\tdepth: number\n\t/** For each layer that changed: which cells (packed as 32-bit numbers), and what each holds now */\n\tchanges: Partial<Record<GroundLayer, { count: number; at: string; to: string }>>\n\t/** The same for the game's layers of cells (`Terrain.cells`), by id */\n\tcells?: Record<string, { count: number; at: string; to: string }>\n\t/** The part of the map play happens in, as it is now */\n\tbounds?: { x: number; z: number; width: number; depth: number }\n}\n\nconst LAYERS = ['heights', 'levels', 'water', 'waterHeights', 'tiles', 'blocked'] as const\n/**\n * A layer of the ground that can change: `heights`, `levels`, `water`, `waterHeights`, `tiles` or `blocked`\n *\n * @beta\n */\nexport type GroundLayer = (typeof LAYERS)[number]\n\n/**\n * Whether a save's ground is the changes of a map, not the whole of it\n *\n * @beta\n */\nexport const isGroundChanges = (ground: SavedGround): ground is GroundChanges => typeof (ground as GroundChanges).map === 'string'\n\n/**\n * The ground a world is made on from a map, painted as the game's tiles go, then the map's own (`MapTile`): what\n * `createWorldFromMap` makes\n *\n * @internal\n */\nexport function startingTerrain(map: GameMap, game: Pick<Rules, 'tiles'>): Terrain {\n\tconst tileIds = playTileset(\n\t\t(game.tiles ?? []).map((tile) => tile.id),\n\t\tmap.environment\n\t)\n\treturn mapTerrain({ ...map, tiles: tilesFor(map, tileIds), tileset: tileIds })\n}\n\n/**\n * A hash of a ground, every layer of it and its size: two grounds of the same hash are the same ground\n *\n * @beta\n */\nexport function groundHash(terrain: Terrain): string {\n\tlet a = 0x811c9dc5\n\tlet b = 0x01000193 ^ 0x5bd1e995\n\tconst mix = (word: number) => {\n\t\ta = Math.imul(a ^ word, 0x01000193)\n\t\tb = Math.imul(b ^ word, 0x5bd1e995)\n\t}\n\tmix(terrain.width)\n\tmix(terrain.depth)\n\tconst layers: (Float32Array | Uint8Array)[] = LAYERS.map((key) => terrain[key])\n\t// the game's layers of cells, by id, where any cell holds something: an empty layer is no layer\n\tfor (const id of Object.keys(terrain.cells).sort()) {\n\t\tconst cells = terrain.cells[id]\n\t\tif (!cells.some((value) => value !== 0)) continue\n\t\tfor (let i = 0; i < id.length; i++) mix(id.charCodeAt(i))\n\t\tlayers.push(cells)\n\t}\n\tfor (const layer of layers) {\n\t\tconst bytes = new Uint8Array(layer.buffer, layer.byteOffset, layer.byteLength)\n\t\tconst words = Math.floor(bytes.length / 4)\n\t\tconst view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n\t\tfor (let i = 0; i < words; i++) mix(view.getUint32(i * 4, true))\n\t\tfor (let i = words * 4; i < bytes.length; i++) mix(bytes[i])\n\t\tmix(0xffffffff)\n\t}\n\treturn (a >>> 0).toString(16).padStart(8, '0') + (b >>> 0).toString(16).padStart(8, '0')\n}\n\n/**\n * The ground a world started on, from a map: kept with the world (`World.ground`), not in its save\n *\n * @beta\n */\nexport interface GroundBase {\n\t/** The name of the map the ground started as (`GameMap.name`) */\n\tmap: string\n\t/** A hash of the ground (`groundHash`): worked out the first time it is asked for */\n\treadonly hash: string\n\t/** The ground itself, with the changes of play not yet laid on it */\n\tterrain: Terrain\n}\n\n/**\n * A ground a world starts on, as a map made it, with its hash worked out when it is first asked for\n *\n * @internal\n */\nexport function startedOn(map: string, terrain: Terrain): GroundBase {\n\tlet hash: string | undefined\n\treturn {\n\t\tmap,\n\t\tterrain,\n\t\tget hash() {\n\t\t\treturn (hash ??= groundHash(terrain))\n\t\t}\n\t}\n}\n\n/**\n * The ground a map the game ships makes, and its hash: worked out once for each of those maps, which are not changed\n * once given (a map being edited is, and is not one of them)\n */\nconst bases = new WeakMap<GameMap, Map<string, GroundBase>>()\n/**\n * The ground of a map for a game, worked out once per map and tileset and kept; returns the `GroundBase` with its terrain and hash\n *\n * @internal\n */\nexport function groundBase(map: GameMap, game: Pick<Rules, 'tiles'>): GroundBase {\n\tconst key = playTileset(\n\t\t(game.tiles ?? []).map((tile) => tile.id),\n\t\tmap.environment\n\t).join()\n\tlet known = bases.get(map)\n\tif (!known) bases.set(map, (known = new Map()))\n\tlet base = known.get(key)\n\tif (!base) {\n\t\tconst terrain = startingTerrain(map, game)\n\t\tknown.set(key, (base = startedOn(map.name, terrain)))\n\t}\n\treturn base\n}\n\n/**\n * The map of a name whose ground has a hash, among some maps: the one a save or a welcome names\n *\n * @internal\n */\nexport function findGround(maps: readonly GameMap[], name: string, hash: string, game: Pick<Rules, 'tiles'>): GroundBase | undefined {\n\tfor (const map of maps) if (map.name === name && groundBase(map, game).hash === hash) return groundBase(map, game)\n\treturn undefined\n}\n\n/**\n * The ground of a world as a save keeps it: the changes since the map it started as, where the game has that map as\n * it was (the same name and the same ground), else all of it\n *\n * @internal\n */\nexport function savedGround(\n\tterrain: Terrain,\n\tbase: GroundBase | undefined,\n\tmaps: readonly GameMap[] | undefined,\n\tgame: Pick<Rules, 'tiles'>\n): SavedGround {\n\tif (!base || !maps?.length || !findGround(maps, base.map, base.hash, game)) return saveTerrain(terrain)\n\tconst from = base.terrain\n\tif (from.width !== terrain.width || from.depth !== terrain.depth) return saveTerrain(terrain)\n\tconst changes: GroundChanges['changes'] = {}\n\tfor (const key of LAYERS) {\n\t\tconst now = terrain[key]\n\t\tconst was = from[key]\n\t\tconst at: number[] = []\n\t\tfor (let i = 0; i < now.length; i++) if (now[i] !== was[i]) at.push(i)\n\t\tif (!at.length) continue\n\t\tconst values = now instanceof Float32Array ? Float32Array.from(at, (i) => now[i]) : Uint8Array.from(at, (i) => now[i])\n\t\tchanges[key] = {\n\t\t\tcount: at.length,\n\t\t\tat: packArray(Int32Array.from(at)),\n\t\t\tto: values instanceof Float32Array ? packArray(values) : packBytes(values)\n\t\t}\n\t}\n\tconst cells: NonNullable<GroundChanges['cells']> = {}\n\tfor (const id of new Set([...Object.keys(terrain.cells), ...Object.keys(from.cells)])) {\n\t\tconst now = terrain.cells[id]\n\t\tconst was = from.cells[id]\n\t\tconst at: number[] = []\n\t\tfor (let i = 0; i < terrain.width * terrain.depth; i++) if ((now?.[i] ?? 0) !== (was?.[i] ?? 0)) at.push(i)\n\t\tif (at.length) cells[id] = { count: at.length, at: packArray(Int32Array.from(at)), to: packBytes(Uint8Array.from(at, (i) => now?.[i] ?? 0)) }\n\t}\n\treturn {\n\t\tmap: base.map,\n\t\thash: base.hash,\n\t\twidth: terrain.width,\n\t\tdepth: terrain.depth,\n\t\tchanges,\n\t\t...(Object.keys(cells).length && { cells }),\n\t\t...(terrain.bounds && { bounds: { ...terrain.bounds } })\n\t}\n}\n\n/**\n * Why the ground of a save or a welcome cannot be read: the map it names is not one of the game's, as it was\n *\n * @internal\n */\nexport class MissingGround extends Error {\n\tconstructor(\n\t\t/** The name of the map the ground was taken from, as the save or welcome gave it */\n\t\treadonly map: string,\n\t\t/** The hash of that ground, which the game no longer has a map of */\n\t\treadonly hash: string\n\t) {\n\t\tsuper(`The ground is the map \"${map}\" as it was (${hash}), which this game does not have: it was changed or taken out since`)\n\t}\n}\n\n/**\n * A ground back from a save or a welcome, and what it started as where it names a map: that map among `maps`, with\n * the changes put on it. Throws `MissingGround` where none of them is that map as it was\n *\n * @internal\n */\nexport function groundOf(\n\tsaved: SavedGround,\n\tmaps: readonly GameMap[] | undefined,\n\tgame: Pick<Rules, 'tiles'>\n): { terrain: Terrain; base?: GroundBase } {\n\tif (!isGroundChanges(saved)) return { terrain: loadTerrain(saved) }\n\tconst base = maps ? findGround(maps, saved.map, saved.hash, game) : undefined\n\tif (!base) throw new MissingGround(saved.map, saved.hash)\n\treturn { terrain: applyGroundChanges(base.terrain, saved), base }\n}\n\n/**\n * A copy of a ground, the changes put on it\n *\n * @internal\n */\nexport function applyGroundChanges(from: Terrain, ground: GroundChanges): Terrain {\n\tconst terrain = cloneTerrain(from)\n\tfor (const key of LAYERS) {\n\t\tconst change = ground.changes[key]\n\t\tif (!change) continue\n\t\tconst layer = terrain[key]\n\t\tconst atBytes = unpackBytes(change.at, change.count * 4)\n\t\tconst toBytes = unpackBytes(change.to, change.count * (layer instanceof Float32Array ? 4 : 1))\n\t\tif (!atBytes || !toBytes) throw new Error(`Save: the changes of the ${key} of the ground are not what they say`)\n\t\tconst at = new Int32Array(atBytes.buffer)\n\t\tconst to = layer instanceof Float32Array ? new Float32Array(toBytes.buffer) : toBytes\n\t\tfor (let i = 0; i < at.length; i++) {\n\t\t\tif (at[i] < 0 || at[i] >= layer.length) throw new Error(`Save: a change of the ${key} is off the ground`)\n\t\t\tlayer[at[i]] = to[i]\n\t\t}\n\t}\n\tfor (const [id, change] of Object.entries(ground.cells ?? {})) {\n\t\tconst layer = terrain.cellLayer(id)\n\t\tconst atBytes = unpackBytes(change.at, change.count * 4)\n\t\tconst to = unpackBytes(change.to, change.count)\n\t\tif (!atBytes || !to) throw new Error(`Save: the changes of the cells of ${id} are not what they say`)\n\t\tconst at = new Int32Array(atBytes.buffer)\n\t\tfor (let i = 0; i < at.length; i++) {\n\t\t\tif (at[i] < 0 || at[i] >= layer.length) throw new Error(`Save: a change of the cells of ${id} is off the ground`)\n\t\t\tlayer[at[i]] = to[i]\n\t\t}\n\t}\n\tterrain.bounds = ground.bounds ? { ...ground.bounds } : undefined\n\treturn terrain\n}\n\n/**\n * A copy of a ground, every layer its own\n *\n * @internal\n */\nexport function cloneTerrain(from: Terrain): Terrain {\n\tconst terrain = new Terrain(from.width, from.depth, from.heights.slice(), from.levels.slice(), {\n\t\twater: from.water.slice(),\n\t\twaterHeights: from.waterHeights.slice(),\n\t\ttiles: from.tiles.slice(),\n\t\tblocked: from.blocked.slice(),\n\t\tcells: Object.fromEntries(Object.entries(from.cells).map(([id, layer]) => [id, layer.slice()]))\n\t})\n\tif (from.bounds) terrain.bounds = { ...from.bounds }\n\treturn terrain\n}\n\n/**\n * A part of the ground as it is, to put in another of the same size (`applyTerrainPatch`): a rectangle of cells and\n * every layer of it, the vertices at its corners included. What the editor's Play here sends of the map's ground as it\n * is edited (`debug.ground`, EQ10), and what a session is told of it (`ground`)\n *\n * @beta\n */\nexport interface TerrainPatch {\n\t/** The first cell, and how many across and down */\n\tx: number\n\t/** The patch's first cell on the z axis, in cells */\n\tz: number\n\t/** How many cells across the patch is */\n\twidth: number\n\t/** How many cells down the patch is */\n\tdepth: number\n\t/** Per vertex, row by row: `(width + 1) * (depth + 1)` of them */\n\theights: number[]\n\t/** Heights of the water at the patch's vertices, in the order of `heights` */\n\twaterHeights: number[]\n\t/** Per cell, row by row: `width * depth` of them */\n\tlevels: number[]\n\t/** Per cell, the water there (0 for none) */\n\twater: number[]\n\t/** Per cell, the tile there (an index into the game's tiles) */\n\ttiles: number[]\n\t/** Per cell, whether the cell is blocked for walking (0 for no) */\n\tblocked: number[]\n\t/** The game's layers of cells (`Terrain.cells`), by id, per cell: those in either ground */\n\tcells?: Record<string, number[]>\n}\n\n/**\n * The cells of two grounds of one size that are not the same, as the smallest rectangle around them; none where they\n * are the same. Every layer, the game's layers of cells too. Two of other sizes: all of `after`\n *\n * @beta\n */\nexport function groundDifference(before: Terrain, after: Terrain): { x: number; z: number; width: number; depth: number } | undefined {\n\tif (before.width !== after.width || before.depth !== after.depth) return { x: 0, z: 0, width: after.width, depth: after.depth }\n\tlet x0 = Infinity\n\tlet z0 = Infinity\n\tlet x1 = -1\n\tlet z1 = -1\n\tconst take = (x: number, z: number) => {\n\t\tif (x < x0) x0 = x\n\t\tif (z < z0) z0 = z\n\t\tif (x > x1) x1 = x\n\t\tif (z > z1) z1 = z\n\t}\n\tconst { width, depth, vertsX } = after\n\t// a vertex is a corner of the cells about it: the one up and left of it, where there is one, else the one there\n\tfor (const layer of ['heights', 'waterHeights'] as const) {\n\t\tconst a = before[layer]\n\t\tconst b = after[layer]\n\t\tfor (let i = 0; i < b.length; i++) {\n\t\t\tif (a[i] === b[i]) continue\n\t\t\tconst vx = i % vertsX\n\t\t\tconst vz = Math.floor(i / vertsX)\n\t\t\ttake(Math.min(vx, width - 1), Math.min(vz, depth - 1))\n\t\t\ttake(Math.max(vx - 1, 0), Math.max(vz - 1, 0))\n\t\t}\n\t}\n\tconst cellLayers = [...(['levels', 'water', 'tiles', 'blocked'] as const).map((layer) => [before[layer], after[layer]] as const)]\n\tfor (const id of new Set([...Object.keys(before.cells), ...Object.keys(after.cells)]))\n\t\tcellLayers.push([before.cells[id] ?? new Uint8Array(width * depth), after.cells[id] ?? new Uint8Array(width * depth)])\n\tfor (const [a, b] of cellLayers) {\n\t\tfor (let i = 0; i < b.length; i++) if (a[i] !== b[i]) take(i % width, Math.floor(i / width))\n\t}\n\treturn x1 < 0 ? undefined : { x: x0, z: z0, width: x1 - x0 + 1, depth: z1 - z0 + 1 }\n}\n\n/**\n * A rectangle of cells of a ground as it is (`TerrainPatch`): to be put in another\n *\n * @beta\n */\nexport function terrainPatch(terrain: Terrain, rect: { x: number; z: number; width: number; depth: number }): TerrainPatch {\n\tconst { x, z, width, depth } = rect\n\tconst vertices = (values: Float32Array) => {\n\t\tconst out: number[] = []\n\t\tfor (let vz = z; vz <= z + depth; vz++) for (let vx = x; vx <= x + width; vx++) out.push(values[vz * terrain.vertsX + vx])\n\t\treturn out\n\t}\n\tconst cells = (values: Uint8Array) => {\n\t\tconst out: number[] = []\n\t\tfor (let cz = z; cz < z + depth; cz++) for (let cx = x; cx < x + width; cx++) out.push(values[cz * terrain.width + cx])\n\t\treturn out\n\t}\n\tconst layers = Object.entries(terrain.cells)\n\treturn {\n\t\tx,\n\t\tz,\n\t\twidth,\n\t\tdepth,\n\t\theights: vertices(terrain.heights),\n\t\twaterHeights: vertices(terrain.waterHeights),\n\t\tlevels: cells(terrain.levels),\n\t\twater: cells(terrain.water),\n\t\ttiles: cells(terrain.tiles),\n\t\tblocked: cells(terrain.blocked),\n\t\t...(layers.length > 0 && { cells: Object.fromEntries(layers.map(([id, values]) => [id, cells(values)])) })\n\t}\n}\n\n/**\n * What is wrong with a patch for a ground (`TerrainPatch`): out of it, or of layers of other lengths. Nothing when it fits\n *\n * @beta\n */\nexport function terrainPatchProblem(terrain: Terrain, patch: TerrainPatch): string | undefined {\n\tconst { x, z, width, depth } = patch\n\tif (![x, z, width, depth].every(Number.isInteger) || x < 0 || z < 0 || width < 1 || depth < 1) return 'the patch is no rectangle of cells'\n\tif (x + width > terrain.width || z + depth > terrain.depth) return `the patch goes past the ground, ${terrain.width} by ${terrain.depth} cells`\n\tconst vertices = (width + 1) * (depth + 1)\n\tconst cells = width * depth\n\tif (patch.heights.length !== vertices || patch.waterHeights.length !== vertices) return `the patch has not ${vertices} heights`\n\tfor (const layer of [patch.levels, patch.water, patch.tiles, patch.blocked, ...Object.values(patch.cells ?? {})])\n\t\tif (layer.length !== cells) return `a layer of the patch has not ${cells} cells`\n\treturn undefined\n}\n\n/**\n * Puts a patch (`TerrainPatch`) in a ground, in place: its heights, water, paint and levels, and the game's layers of\n * cells (a layer the patch has that the ground has not is made). Nothing else: what the rules make of the ground is\n * `World.reshapeGround`'s. Throws where it does not fit (`terrainPatchProblem`)\n *\n * @beta\n */\nexport function applyTerrainPatch(terrain: Terrain, patch: TerrainPatch): void {\n\tconst problem = terrainPatchProblem(terrain, patch)\n\tif (problem) throw new Error(`applyTerrainPatch: ${problem}`)\n\tconst { x, z, width, depth } = patch\n\tlet i = 0\n\tfor (let vz = z; vz <= z + depth; vz++) {\n\t\tfor (let vx = x; vx <= x + width; vx++, i++) {\n\t\t\tconst at = vz * terrain.vertsX + vx\n\t\t\tterrain.heights[at] = patch.heights[i]\n\t\t\tterrain.waterHeights[at] = patch.waterHeights[i]\n\t\t}\n\t}\n\tconst layers: [Uint8Array, number[]][] = [\n\t\t[terrain.levels, patch.levels],\n\t\t[terrain.water, patch.water],\n\t\t[terrain.tiles, patch.tiles],\n\t\t[terrain.blocked, patch.blocked],\n\t\t...Object.entries(patch.cells ?? {}).map(([id, values]): [Uint8Array, number[]] => [terrain.cellLayer(id), values])\n\t]\n\tfor (const [into, values] of layers) {\n\t\tlet j = 0\n\t\tfor (let cz = z; cz < z + depth; cz++) for (let cx = x; cx < x + width; cx++, j++) into[cz * terrain.width + cx] = values[j]\n\t}\n}\n"],"mappings":";;;;;;AA4CA,IAAM,SAAS;CAAC;CAAW;CAAU;CAAS;CAAgB;CAAS;AAAS;;;;;;AAahF,IAAa,mBAAmB,WAAiD,OAAQ,OAAyB,QAAQ;;;;;;;AAQ1H,SAAgB,gBAAgB,KAAc,MAAqC;CAClF,MAAM,UAAU,aACd,KAAK,SAAS,CAAC,EAAA,CAAG,KAAK,SAAS,KAAK,EAAE,GACxC,IAAI,WACL;CACA,OAAO,WAAW;EAAE,GAAG;EAAK,OAAO,SAAS,KAAK,OAAO;EAAG,SAAS;CAAQ,CAAC;AAC9E;;;;;;AAOA,SAAgB,WAAW,SAA0B;CACpD,IAAI,IAAI;CACR,IAAI,IAAI;CACR,MAAM,OAAO,SAAiB;EAC7B,IAAI,KAAK,KAAK,IAAI,MAAM,QAAU;EAClC,IAAI,KAAK,KAAK,IAAI,MAAM,UAAU;CACnC;CACA,IAAI,QAAQ,KAAK;CACjB,IAAI,QAAQ,KAAK;CACjB,MAAM,SAAwC,OAAO,KAAK,QAAQ,QAAQ,IAAI;CAE9E,KAAK,MAAM,MAAM,OAAO,KAAK,QAAQ,KAAK,CAAC,CAAC,KAAK,GAAG;EACnD,MAAM,QAAQ,QAAQ,MAAM;EAC5B,IAAI,CAAC,MAAM,MAAM,UAAU,UAAU,CAAC,GAAG;EACzC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK,IAAI,GAAG,WAAW,CAAC,CAAC;EACxD,OAAO,KAAK,KAAK;CAClB;CACA,KAAK,MAAM,SAAS,QAAQ;EAC3B,MAAM,QAAQ,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;EAC7E,MAAM,QAAQ,KAAK,MAAM,MAAM,SAAS,CAAC;EACzC,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;EAC1E,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,IAAI,KAAK,UAAU,IAAI,GAAG,IAAI,CAAC;EAC/D,KAAK,IAAI,IAAI,QAAQ,GAAG,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,EAAE;EAC3D,IAAI,UAAU;CACf;CACA,QAAQ,MAAM,EAAA,CAAG,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,KAAK,MAAM,EAAA,CAAG,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;AACxF;;;;;;AAqBA,SAAgB,UAAU,KAAa,SAA8B;CACpE,IAAI;CACJ,OAAO;EACN;EACA;EACA,IAAI,OAAO;GACV,OAAQ,SAAS,WAAW,OAAO;EACpC;CACD;AACD;;;;;AAMA,IAAM,wBAAQ,IAAI,QAA0C;;;;;;AAM5D,SAAgB,WAAW,KAAc,MAAwC;CAChF,MAAM,MAAM,aACV,KAAK,SAAS,CAAC,EAAA,CAAG,KAAK,SAAS,KAAK,EAAE,GACxC,IAAI,WACL,CAAC,CAAC,KAAK;CACP,IAAI,QAAQ,MAAM,IAAI,GAAG;CACzB,IAAI,CAAC,OAAO,MAAM,IAAI,KAAM,wBAAQ,IAAI,IAAI,CAAE;CAC9C,IAAI,OAAO,MAAM,IAAI,GAAG;CACxB,IAAI,CAAC,MAAM;EACV,MAAM,UAAU,gBAAgB,KAAK,IAAI;EACzC,MAAM,IAAI,KAAM,OAAO,UAAU,IAAI,MAAM,OAAO,CAAE;CACrD;CACA,OAAO;AACR;;;;;;AAOA,SAAgB,WAAW,MAA0B,MAAc,MAAc,MAAoD;CACpI,KAAK,MAAM,OAAO,MAAM,IAAI,IAAI,SAAS,QAAQ,WAAW,KAAK,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,WAAW,KAAK,IAAI;AAElH;;;;;;;AAQA,SAAgB,YACf,SACA,MACA,MACA,MACc;CACd,IAAI,CAAC,QAAQ,CAAC,MAAM,UAAU,CAAC,WAAW,MAAM,KAAK,KAAK,KAAK,MAAM,IAAI,GAAG,OAAO,YAAY,OAAO;CACtG,MAAM,OAAO,KAAK;CAClB,IAAI,KAAK,UAAU,QAAQ,SAAS,KAAK,UAAU,QAAQ,OAAO,OAAO,YAAY,OAAO;CAC5F,MAAM,UAAoC,CAAC;CAC3C,KAAK,MAAM,OAAO,QAAQ;EACzB,MAAM,MAAM,QAAQ;EACpB,MAAM,MAAM,KAAK;EACjB,MAAM,KAAe,CAAC;EACtB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,IAAI,IAAI,GAAG,KAAK,CAAC;EACrE,IAAI,CAAC,GAAG,QAAQ;EAChB,MAAM,SAAS,eAAe,eAAe,aAAa,KAAK,KAAK,MAAM,IAAI,EAAE,IAAI,WAAW,KAAK,KAAK,MAAM,IAAI,EAAE;EACrH,QAAQ,OAAO;GACd,OAAO,GAAG;GACV,IAAI,UAAU,WAAW,KAAK,EAAE,CAAC;GACjC,IAAI,kBAAkB,eAAe,UAAU,MAAM,IAAI,UAAU,MAAM;EAC1E;CACD;CACA,MAAM,QAA6C,CAAC;CACpD,KAAK,MAAM,sBAAM,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,QAAQ,KAAK,GAAG,GAAG,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,GAAG;EACtF,MAAM,MAAM,QAAQ,MAAM;EAC1B,MAAM,MAAM,KAAK,MAAM;EACvB,MAAM,KAAe,CAAC;EACtB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,QAAQ,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,MAAM,MAAM,IAAI,GAAG,KAAK,CAAC;EAC1G,IAAI,GAAG,QAAQ,MAAM,MAAM;GAAE,OAAO,GAAG;GAAQ,IAAI,UAAU,WAAW,KAAK,EAAE,CAAC;GAAG,IAAI,UAAU,WAAW,KAAK,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC;EAAE;CAC7I;CACA,OAAO;EACN,KAAK,KAAK;EACV,MAAM,KAAK;EACX,OAAO,QAAQ;EACf,OAAO,QAAQ;EACf;EACA,GAAI,OAAO,KAAK,KAAK,CAAC,CAAC,UAAU,EAAE,MAAM;EACzC,GAAI,QAAQ,UAAU,EAAE,QAAQ,EAAE,GAAG,QAAQ,OAAO,EAAE;CACvD;AACD;;;;;;AAOA,IAAa,gBAAb,cAAmC,MAAM;CAG9B;CAEA;CAJV,YAEC,KAEA,MACC;EACD,MAAM,0BAA0B,IAAI,eAAe,KAAK,oEAAoE;EAJnH,KAAA,MAAA;EAEA,KAAA,OAAA;CAGV;AACD;;;;;;;AAQA,SAAgB,SACf,OACA,MACA,MAC0C;CAC1C,IAAI,CAAC,gBAAgB,KAAK,GAAG,OAAO,EAAE,SAAS,YAAY,KAAK,EAAE;CAClE,MAAM,OAAO,OAAO,WAAW,MAAM,MAAM,KAAK,MAAM,MAAM,IAAI,IAAI,KAAA;CACpE,IAAI,CAAC,MAAM,MAAM,IAAI,cAAc,MAAM,KAAK,MAAM,IAAI;CACxD,OAAO;EAAE,SAAS,mBAAmB,KAAK,SAAS,KAAK;EAAG;CAAK;AACjE;;;;;;AAOA,SAAgB,mBAAmB,MAAe,QAAgC;CACjF,MAAM,UAAU,aAAa,IAAI;CACjC,KAAK,MAAM,OAAO,QAAQ;EACzB,MAAM,SAAS,OAAO,QAAQ;EAC9B,IAAI,CAAC,QAAQ;EACb,MAAM,QAAQ,QAAQ;EACtB,MAAM,UAAU,YAAY,OAAO,IAAI,OAAO,QAAQ,CAAC;EACvD,MAAM,UAAU,YAAY,OAAO,IAAI,OAAO,SAAS,iBAAiB,eAAe,IAAI,EAAE;EAC7F,IAAI,CAAC,WAAW,CAAC,SAAS,MAAM,IAAI,MAAM,4BAA4B,IAAI,qCAAqC;EAC/G,MAAM,KAAK,IAAI,WAAW,QAAQ,MAAM;EACxC,MAAM,KAAK,iBAAiB,eAAe,IAAI,aAAa,QAAQ,MAAM,IAAI;EAC9E,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;GACnC,IAAI,GAAG,KAAK,KAAK,GAAG,MAAM,MAAM,QAAQ,MAAM,IAAI,MAAM,yBAAyB,IAAI,mBAAmB;GACxG,MAAM,GAAG,MAAM,GAAG;EACnB;CACD;CACA,KAAK,MAAM,CAAC,IAAI,WAAW,OAAO,QAAQ,OAAO,SAAS,CAAC,CAAC,GAAG;EAC9D,MAAM,QAAQ,QAAQ,UAAU,EAAE;EAClC,MAAM,UAAU,YAAY,OAAO,IAAI,OAAO,QAAQ,CAAC;EACvD,MAAM,KAAK,YAAY,OAAO,IAAI,OAAO,KAAK;EAC9C,IAAI,CAAC,WAAW,CAAC,IAAI,MAAM,IAAI,MAAM,qCAAqC,GAAG,uBAAuB;EACpG,MAAM,KAAK,IAAI,WAAW,QAAQ,MAAM;EACxC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;GACnC,IAAI,GAAG,KAAK,KAAK,GAAG,MAAM,MAAM,QAAQ,MAAM,IAAI,MAAM,kCAAkC,GAAG,mBAAmB;GAChH,MAAM,GAAG,MAAM,GAAG;EACnB;CACD;CACA,QAAQ,SAAS,OAAO,SAAS,EAAE,GAAG,OAAO,OAAO,IAAI,KAAA;CACxD,OAAO;AACR;;;;;;AAOA,SAAgB,aAAa,MAAwB;CACpD,MAAM,UAAU,IAAI,QAAQ,KAAK,OAAO,KAAK,OAAO,KAAK,QAAQ,MAAM,GAAG,KAAK,OAAO,MAAM,GAAG;EAC9F,OAAO,KAAK,MAAM,MAAM;EACxB,cAAc,KAAK,aAAa,MAAM;EACtC,OAAO,KAAK,MAAM,MAAM;EACxB,SAAS,KAAK,QAAQ,MAAM;EAC5B,OAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,MAAM,MAAM,CAAC,CAAC,CAAC;CAC/F,CAAC;CACD,IAAI,KAAK,QAAQ,QAAQ,SAAS,EAAE,GAAG,KAAK,OAAO;CACnD,OAAO;AACR;;;;;;;AAwCA,SAAgB,iBAAiB,QAAiB,OAAoF;CACrI,IAAI,OAAO,UAAU,MAAM,SAAS,OAAO,UAAU,MAAM,OAAO,OAAO;EAAE,GAAG;EAAG,GAAG;EAAG,OAAO,MAAM;EAAO,OAAO,MAAM;CAAM;CAC9H,IAAI,KAAK;CACT,IAAI,KAAK;CACT,IAAI,KAAK;CACT,IAAI,KAAK;CACT,MAAM,QAAQ,GAAW,MAAc;EACtC,IAAI,IAAI,IAAI,KAAK;EACjB,IAAI,IAAI,IAAI,KAAK;EACjB,IAAI,IAAI,IAAI,KAAK;EACjB,IAAI,IAAI,IAAI,KAAK;CAClB;CACA,MAAM,EAAE,OAAO,OAAO,WAAW;CAEjC,KAAK,MAAM,SAAS,CAAC,WAAW,cAAc,GAAY;EACzD,MAAM,IAAI,OAAO;EACjB,MAAM,IAAI,MAAM;EAChB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;GAClC,IAAI,EAAE,OAAO,EAAE,IAAI;GACnB,MAAM,KAAK,IAAI;GACf,MAAM,KAAK,KAAK,MAAM,IAAI,MAAM;GAChC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI,IAAI,QAAQ,CAAC,CAAC;GACrD,KAAK,KAAK,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;EAC9C;CACD;CACA,MAAM,aAAa,CAAC,GAAI;EAAC;EAAU;EAAS;EAAS;CAAS,CAAC,CAAW,KAAK,UAAU,CAAC,OAAO,QAAQ,MAAM,MAAM,CAAU,CAAC;CAChI,KAAK,MAAM,sBAAM,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,OAAO,KAAK,GAAG,GAAG,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC,GACnF,WAAW,KAAK,CAAC,OAAO,MAAM,OAAO,IAAI,WAAW,QAAQ,KAAK,GAAG,MAAM,MAAM,OAAO,IAAI,WAAW,QAAQ,KAAK,CAAC,CAAC;CACtH,KAAK,MAAM,CAAC,GAAG,MAAM,YACpB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC;CAE5F,OAAO,KAAK,IAAI,KAAA,IAAY;EAAE,GAAG;EAAI,GAAG;EAAI,OAAO,KAAK,KAAK;EAAG,OAAO,KAAK,KAAK;CAAE;AACpF;;;;;;AAOA,SAAgB,aAAa,SAAkB,MAA4E;CAC1H,MAAM,EAAE,GAAG,GAAG,OAAO,UAAU;CAC/B,MAAM,YAAY,WAAyB;EAC1C,MAAM,MAAgB,CAAC;EACvB,KAAK,IAAI,KAAK,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,IAAI,KAAK,GAAG,MAAM,IAAI,OAAO,MAAM,IAAI,KAAK,OAAO,KAAK,QAAQ,SAAS,GAAG;EACzH,OAAO;CACR;CACA,MAAM,SAAS,WAAuB;EACrC,MAAM,MAAgB,CAAC;EACvB,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,OAAO,MAAM,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,OAAO,MAAM,IAAI,KAAK,OAAO,KAAK,QAAQ,QAAQ,GAAG;EACtH,OAAO;CACR;CACA,MAAM,SAAS,OAAO,QAAQ,QAAQ,KAAK;CAC3C,OAAO;EACN;EACA;EACA;EACA;EACA,SAAS,SAAS,QAAQ,OAAO;EACjC,cAAc,SAAS,QAAQ,YAAY;EAC3C,QAAQ,MAAM,QAAQ,MAAM;EAC5B,OAAO,MAAM,QAAQ,KAAK;EAC1B,OAAO,MAAM,QAAQ,KAAK;EAC1B,SAAS,MAAM,QAAQ,OAAO;EAC9B,GAAI,OAAO,SAAS,KAAK,EAAE,OAAO,OAAO,YAAY,OAAO,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE;CACzG;AACD;;;;;;AAOA,SAAgB,oBAAoB,SAAkB,OAAyC;CAC9F,MAAM,EAAE,GAAG,GAAG,OAAO,UAAU;CAC/B,IAAI,CAAC;EAAC;EAAG;EAAG;EAAO;CAAK,CAAC,CAAC,MAAM,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ,KAAK,QAAQ,GAAG,OAAO;CACtG,IAAI,IAAI,QAAQ,QAAQ,SAAS,IAAI,QAAQ,QAAQ,OAAO,OAAO,mCAAmC,QAAQ,MAAM,MAAM,QAAQ,MAAM;CACxI,MAAM,YAAY,QAAQ,MAAM,QAAQ;CACxC,MAAM,QAAQ,QAAQ;CACtB,IAAI,MAAM,QAAQ,WAAW,YAAY,MAAM,aAAa,WAAW,UAAU,OAAO,qBAAqB,SAAS;CACtH,KAAK,MAAM,SAAS;EAAC,MAAM;EAAQ,MAAM;EAAO,MAAM;EAAO,MAAM;EAAS,GAAG,OAAO,OAAO,MAAM,SAAS,CAAC,CAAC;CAAC,GAC9G,IAAI,MAAM,WAAW,OAAO,OAAO,gCAAgC,MAAM;AAE3E;;;;;;;;AASA,SAAgB,kBAAkB,SAAkB,OAA2B;CAC9E,MAAM,UAAU,oBAAoB,SAAS,KAAK;CAClD,IAAI,SAAS,MAAM,IAAI,MAAM,sBAAsB,SAAS;CAC5D,MAAM,EAAE,GAAG,GAAG,OAAO,UAAU;CAC/B,IAAI,IAAI;CACR,KAAK,IAAI,KAAK,GAAG,MAAM,IAAI,OAAO,MACjC,KAAK,IAAI,KAAK,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK;EAC5C,MAAM,KAAK,KAAK,QAAQ,SAAS;EACjC,QAAQ,QAAQ,MAAM,MAAM,QAAQ;EACpC,QAAQ,aAAa,MAAM,MAAM,aAAa;CAC/C;CAED,MAAM,SAAmC;EACxC,CAAC,QAAQ,QAAQ,MAAM,MAAM;EAC7B,CAAC,QAAQ,OAAO,MAAM,KAAK;EAC3B,CAAC,QAAQ,OAAO,MAAM,KAAK;EAC3B,CAAC,QAAQ,SAAS,MAAM,OAAO;EAC/B,GAAG,OAAO,QAAQ,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,YAAoC,CAAC,QAAQ,UAAU,EAAE,GAAG,MAAM,CAAC;CACnH;CACA,KAAK,MAAM,CAAC,MAAM,WAAW,QAAQ;EACpC,IAAI,IAAI;EACR,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,OAAO,MAAM,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,OAAO,MAAM,KAAK,KAAK,KAAK,QAAQ,QAAQ,MAAM,OAAO;CAC3H;AACD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type Entity, type EntityId } from './entity';
|
|
2
|
+
import type { GamePack } from './packs/pack';
|
|
3
|
+
import type { World } from './world';
|
|
4
|
+
/**
|
|
5
|
+
* The ground objects pack's id
|
|
6
|
+
*
|
|
7
|
+
* @beta
|
|
8
|
+
*/
|
|
9
|
+
export declare const GROUND_OBJECTS = "core.groundObjects";
|
|
10
|
+
/**
|
|
11
|
+
* Who put a unit down, for one made by a `spawn` of the ground objects pack: in whose name what it does goes off (`by`),
|
|
12
|
+
* by which ability and at what level, and the others put down with it (`group`, in order: a portal's other end)
|
|
13
|
+
*
|
|
14
|
+
* @beta
|
|
15
|
+
*/
|
|
16
|
+
export interface MadeBy {
|
|
17
|
+
/** Who put it down */
|
|
18
|
+
by: EntityId;
|
|
19
|
+
/** The ability it was put down by */
|
|
20
|
+
ability: string;
|
|
21
|
+
/** The level it was cast at */
|
|
22
|
+
level: number;
|
|
23
|
+
/** Those put down with it, itself among them, in the order they were laid: where there were more than one */
|
|
24
|
+
group?: EntityId[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* What a ground object keeps of what it does (`UnitTypeDef.trigger`, `use`): seconds before it is armed, times it went
|
|
28
|
+
* off or was used, and who is within its reach now (each sets it off as it comes, not again while it stays)
|
|
29
|
+
*
|
|
30
|
+
* @beta
|
|
31
|
+
*/
|
|
32
|
+
export interface GroundObjectState {
|
|
33
|
+
/** Seconds before its trigger works */
|
|
34
|
+
arm?: number;
|
|
35
|
+
/** Times it went off, or was used */
|
|
36
|
+
went?: number;
|
|
37
|
+
/** Who is within its trigger's reach now, by id */
|
|
38
|
+
inside?: EntityId[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Who put a unit down (`MadeBy`): on what a `spawn` of the pack makes
|
|
42
|
+
*
|
|
43
|
+
* @beta
|
|
44
|
+
*/
|
|
45
|
+
export declare const madeBy: import("./components").Component<MadeBy, MadeBy>;
|
|
46
|
+
/**
|
|
47
|
+
* What a ground object keeps (`GroundObjectState`): on every unit whose type has a `trigger`, a `use`,
|
|
48
|
+
* `blocksMissiles` or a `burst`, from the moment it is made
|
|
49
|
+
*
|
|
50
|
+
* @beta
|
|
51
|
+
*/
|
|
52
|
+
export declare const groundObject: import("./components").Component<GroundObjectState, GroundObjectState>;
|
|
53
|
+
/**
|
|
54
|
+
* Uses a ground object (`UnitTypeDef.use`), as the `useObject` order does once there: its ability goes off, the user
|
|
55
|
+
* its target, and it is gone after its `times`. False where it is no such thing, or not for this one
|
|
56
|
+
*
|
|
57
|
+
* @beta
|
|
58
|
+
*/
|
|
59
|
+
export declare function useObject(world: World, user: Entity, object: Entity): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Ground objects: what a game with it (`Rules.packs`) gets for what abilities put down. Its `spawn` lays units along a
|
|
62
|
+
* `line` or round a `ring` (buildings one to a cell, standing in the way as any building does), each knowing who put it
|
|
63
|
+
* down (`madeBy`); a unit type may be a trap or a pickup (`trigger`: its ability goes off as one it is for comes near,
|
|
64
|
+
* armed after `arm`, gone after `times`), a thing others use (`use`: right-clicked, walked up to and used, the
|
|
65
|
+
* `useObject` order; `useObject` in code), a wall that stops missiles (`blocksMissiles`) or a barrel that bursts as it
|
|
66
|
+
* dies and sets off those of its kind near it (`burst`)
|
|
67
|
+
*
|
|
68
|
+
* @beta
|
|
69
|
+
*/
|
|
70
|
+
export declare function groundObjectsPack(): GamePack;
|