@v12-engine/engine 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.
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","names":["checkpointEvent"],"sources":["../../src/session/local.ts"],"sourcesContent":["import { checkpoint as checkpointEvent } from '#engine/engineEvents'\nimport { minesFor } from '#engine/systems/economy'\nimport { paceOf, savesOf } from './can'\nimport { sameEntity } from './delta'\nimport type { Logger } from '#engine/log'\nimport type { MapCamera, MapDoodad, MapEnvironment, MapPath, MapRegion } from '#engine/map'\nimport { names } from '#engine/names'\nimport { campsFor } from '#engine/camps'\nimport { type Lane, lanesOf } from '#engine/lanes'\nimport { assertPlainData } from '#engine/debug'\nimport type { Entity, EntityId, PlayerId } from '#engine/entity'\nimport { heroSummaries } from '#engine/hero'\nimport type { Vec2 } from '#engine/math'\nimport { formationPreview, type FormationUnit } from '#engine/formation'\nimport { canPlaceStructure, placementCells } from '#engine/orders/build'\nimport type { Registry } from '#engine/registry'\nimport { decidedAvailability, decidedUnlocks, techOf } from '#engine/tech'\nimport type { Terrain } from '#engine/terrain'\nimport type { World } from '#engine/world'\nimport type {\n\tCampInfo,\n\tEntityState,\n\tFogState,\n\tGameSession,\n\tMineInfo,\n\tPlayerCommand,\n\tPlayerState,\n\tSessionEvent,\n\tSnapshot,\n\tSessionCan,\n\tSessionDebug\n} from './protocol'\nimport type { Message } from '#engine/messages'\nimport { saveWorld, type WorldSave } from '#engine/save'\nimport type { TeamMemory } from './memory'\nimport { LocalDebug } from './debug'\nimport { deposit } from '../entity'\nimport { SessionView, type SnapshotField } from '#engine/replication'\nimport { checkTold, commonEntityState, commonStillTold, hasOnePlayersPart, playerEntityState, sharedStillTold, type Told } from './entityState'\nimport { shownFx } from '#engine/effects'\n\n/**\n * A seat at a world running in the same page. It does the job a server will do later:\n * run the simulation, and hand the player only what their team is allowed to know.\n */\n/** The effects of the rules a player was shown that are kept, for a stop to be told to them: the latest so many */\nconst MOST_EFFECTS = 1024\n\n/**\n * The events a computer player's seat hears (`forComputer`): the facts a brain reads and a save keeps for it (deaths,\n * damage, healing, pings, chat, the game's own events) and the answers to its commands. The rest is for a screen (an\n * attack's swing, a shot, a buff, a hammer blow, a line said), and a computer's seat is spared hearing it\n *\n * @beta\n */\nexport const COMPUTER_EVENTS: ReadonlySet<SessionEvent['type']> = new Set(['death', 'damage', 'heal', 'ping', 'chat', 'game', 'command'])\n\n/**\n * What is told of each entity this round, for every session of a world, while a host sends to its seats\n * (`shareCaptures`), none otherwise: what everyone is told (`common`, by entity), and what the seats of one side are\n * (`sides`: by the side's key, `LocalSession.sideKey`, then by entity) where nothing of it is one player's\n */\ninterface Round {\n\treadonly common: Map<EntityId, EntityState>\n\treadonly sides: Map<string, Side>\n}\n\n/**\n * What the seats of a side are told this round, by entity: what nothing of is one player's (`all`), and of what is, the\n * first seat's (`alike`), which a seat told the very same takes as it is, so that the side's frames share their objects\n */\ninterface Side {\n\treadonly all: Map<EntityId, EntityState>\n\treadonly alike: Map<EntityId, EntityState>\n\t/** What its first seat saw (`LocalSession.capture`): the others of the side see the same, but what may be theirs alone */\n\tseen?: SideSeen\n}\n\n/**\n * What the first seat of a side saw this round: its entities, those of them in sight, and where in the list are those\n * whose description may be one player's (`LocalSession.isOnePlayers`), to be described again for each seat\n */\ninterface SideSeen {\n\treadonly entities: readonly EntityState[]\n\treadonly inSight: ReadonlySet<EntityId>\n\treadonly mine: readonly number[]\n}\nconst SHARED = new WeakMap<World, Round>()\n\n/**\n * From here until `endSharedCaptures`, the sessions of the world describe each entity once between them (what\n * everyone is told; what is one player's goes on a copy): for a host's round of sending, where every seat is captured\n * from the same world. Not while the world changes: what was described is said again\n *\n * @internal\n */\nexport function shareCaptures(world: World): void {\n\tSHARED.set(world, { common: new Map(), sides: new Map() })\n}\n\n/** @internal */\nexport function endSharedCaptures(world: World): void {\n\tSHARED.delete(world)\n}\n\n/**\n * A `GameSession` over a world in the same process: steps it from real time, takes a player's snapshots of it and sends their commands into it\n *\n * @beta\n */\nexport class LocalSession implements GameSession {\n\t/** The ground of the world, for the client to draw and ask about */\n\treadonly terrain: Terrain\n\t/** The map's look (sky, mist, light), when the world was made from a map that has one */\n\treadonly environment?: MapEnvironment\n\t/** The map's scenery objects, which have no life at runtime */\n\treadonly doodads: readonly MapDoodad[]\n\t/** The map's named regions */\n\treadonly regions: readonly MapRegion[]\n\t/** The map's named camera positions */\n\treadonly cameras: readonly MapCamera[]\n\t/** The map's named paths */\n\treadonly paths: readonly MapPath[]\n\t/** The definitions of the game the world runs: unit types, abilities, orders and the rest */\n\treadonly registry: Registry\n\t/** Simulation ticks per second of the world */\n\treadonly tickRate: number\n\t/** How far, 0..1, the time is between the last tick and the next, for the client to blend its drawing by; 1 when paused */\n\talpha = 1\n\t/** What the world says (`World.log`): a session in the page has it, and the client shows it with its own */\n\tget log(): Logger {\n\t\treturn this.world.log\n\t}\n\t/** Why the game ended on an error, once it has (`World.failure`) */\n\tget failure(): { message: string } | null {\n\t\treturn this.world.failure\n\t}\n\t/** Simulation speed multiplier, 0 pauses. A debug control, a real server sets the pace itself */\n\tspeed = 1\n\n\tprivate accumulator = 0\n\t/** Whether the team saw the whole map at the last snapshot (the debug switch): what it saw then only is forgotten after */\n\tprivate wasRevealed = false\n\t/** What the player's team remembers, or an observer's own (`SessionView.memory`) */\n\tprivate get memory(): TeamMemory {\n\t\treturn this.view.memory\n\t}\n\t/** Ids of what made it into the snapshot being put together as in sight. Kept to be cleared, not made anew */\n\tprivate readonly inSight = new Set<EntityId>()\n\t/** The names the map or the rules gave entities, by id, as of the snapshot being put together (`world.named`) */\n\tprivate readonly namesNow = new Map<EntityId, string>()\n\tprivate readonly disposers: (() => void)[] = []\n\tprivate pendingCheckpoint?: Message\n\t/** The label and save taken at the last tick that a checkpoint was asked for, for the game to be taken back to */\n\tcheckpoint?: { label: Message; save: WorldSave }\n\t/** The debug tools over this session's world */\n\treadonly debug: LocalDebug\n\t/** Its pace, saves of its world, the debug tools' view, and what a computer player's brain reads (`SessionCan`) */\n\treadonly can: SessionCan = {\n\t\tpace: paceOf(this),\n\t\tsaves: savesOf(this),\n\t\tinspect: undefined,\n\t\tcomputer: {\n\t\t\tmines: () => this.mines(),\n\t\t\tlanes: () => this.lanes(),\n\t\t\tpendingEvents: () => this.pendingEvents(),\n\t\t\trestoreEvents: (events) => this.restoreEvents(events)\n\t\t}\n\t}\n\t/**\n\t * Who only watches, and sees everything: every entity, the whole map, every player's resources and heroes. From\n\t * `playerId`'s side all the same (who is an ally, an enemy). For a server's watchers, whose commands go nowhere\n\t */\n\treadonly observer: boolean\n\t/**\n\t * Whose seat is a computer player's (`forComputer`): its snapshots leave out projectiles, missiles, corpses, reveals\n\t * and the events a brain never reads, and it listens for none of those, so twelve computers cost the world less\n\t */\n\treadonly forComputer: boolean\n\t/** The seat's side of the world: whose it is, what they may know, what was told to them since the last snapshot */\n\treadonly view: SessionView\n\n\tconstructor(\n\t\t/** For tools and tests. Clients have no business here, they go through the session */\n\t\treadonly world: World,\n\t\t/** The player whose seat this is, from whose side the snapshots are taken */\n\t\treadonly playerId: PlayerId,\n\t\t/**\n\t\t * `debug`: the player may use the debug commands (see `world.debugPlayers`). `ownsWorld`: the world is the\n\t\t * session's, and goes with it (`dispose`): for a game played in the page, where the session is all the screen\n\t\t * holds of it. Not for a world others play too, or one that goes on after this session (a host's seats, the computer's).\n\t\t * `forComputer`: the seat is a computer player's, and its snapshots carry what a brain reads and none of what a\n\t\t * screen needs (`COMPUTER_EVENTS`): cheaper to take, and fewer of the world's events to hear.\n\t\t * `mostEffects` (`@beta`): how many of the effects the rules play are kept for their stop, 1024 when left out\n\t\t */\n\t\toptions: { observer?: boolean; debug?: boolean; ownsWorld?: boolean; forComputer?: boolean; mostEffects?: number } = {}\n\t) {\n\t\tthis.observer = options.observer ?? false\n\t\tthis.ownsWorld = options.ownsWorld ?? false\n\t\tthis.forComputer = options.forComputer ?? false\n\t\tthis.view = new SessionView(world, playerId, {\n\t\t\tobserver: this.observer,\n\t\t\tforComputer: this.forComputer,\n\t\t\tmostEffects: options.mostEffects ?? MOST_EFFECTS\n\t\t})\n\t\tif (options.debug) world.debugPlayers.add(playerId)\n\t\tthis.terrain = world.terrain\n\t\tthis.environment = world.map.environment\n\t\tthis.doodads = world.map.doodads\n\t\tthis.regions = world.map.regions\n\t\tthis.cameras = world.map.cameras\n\t\tthis.paths = world.map.paths\n\t\tthis.registry = world.registry\n\t\tthis.tickRate = world.tickRate\n\t\tthis.debug = new LocalDebug(world)\n\t\t;(this.can as { inspect?: SessionDebug }).inspect = this.debug\n\n\t\tconst { events } = world\n\t\tconst { view } = this\n\t\t// what the seat hears of the world, each told as what emits it says (`replicateEvent`): a computer's seat only what\n\t\t// a brain reads (`COMPUTER_EVENTS`), so that it is told of nothing it throws away, and the world's events have fewer\n\t\t// listeners for each computer seated\n\t\tfor (const replication of world.registry.replications) {\n\t\t\tif (!this.hears(replication.as)) continue\n\t\t\tthis.disposers.push(\n\t\t\t\tevents.on(replication.event as never, (payload: unknown) => {\n\t\t\t\t\tconst said = replication.tell(payload, view)\n\t\t\t\t\tif (said) view.events.push(said)\n\t\t\t\t})\n\t\t\t)\n\t\t}\n\t\t// saved once the tick is over, with everything in it settled\n\t\tthis.disposers.push(events.on(checkpointEvent, ({ label }) => (this.pendingCheckpoint = label)))\n\t\t// the game's own, to whom it says: those of this world's game (`Rules.events`), whichever they turn out to be\n\t\tif (this.hears('game'))\n\t\t\tthis.disposers.push(\n\t\t\t\tevents.watch((type, payload) => {\n\t\t\t\t\tif (typeof type !== 'string') return\n\t\t\t\t\tconst audience = world.registry.event(type)?.replicate\n\t\t\t\t\tif (!audience) return\n\t\t\t\t\tif (audience !== 'everyone' && !audience(payload, view)) return\n\t\t\t\t\tif (this.world.checks.events) assertPlainData(payload, `Event \"${type}\"`)\n\t\t\t\t\tview.events.push({ type: 'game', event: type, payload })\n\t\t\t\t})\n\t\t\t)\n\t}\n\n\t/** Whether the seat is told of events of a kind: a player's seat of all of them, a computer's of what a brain reads */\n\tprivate hears(kind: SessionEvent['type']): boolean {\n\t\treturn !this.forComputer || COMPUTER_EVENTS.has(kind)\n\t}\n\n\t/** The player's team: theirs now, as the rules may move them to another (`setTeam`) */\n\tget team(): number {\n\t\treturn this.view.team\n\t}\n\n\tprivate isAlly(owner: PlayerId): boolean {\n\t\treturn this.view.isAlly(owner)\n\t}\n\n\t/** Whether the player's team sees a spot of the map right now: an observer sees all of it */\n\tprivate sees(x: number, z: number): boolean {\n\t\treturn this.view.sees(x, z)\n\t}\n\n\t/**\n\t * How many effects of the rules are kept for their stop to be told (`mostEffects`), for a test of the bound\n\t *\n\t * @internal\n\t */\n\tget keptEffects(): number {\n\t\treturn shownFx(this.view).size\n\t}\n\n\t/** Whether the player's team can see the entity right now */\n\tprivate knows(entity: Entity): boolean {\n\t\treturn this.view.knows(entity)\n\t}\n\n\t/**\n\t * What everyone in sight of an entity is told of it this tick, the same for every seat: worked out once for all\n\t * the sessions of a world while a host's round of sending is on (`shareCaptures`), else for this session alone\n\t */\n\tprivate common(entity: Entity): EntityState {\n\t\tconst shared = SHARED.get(this.world)?.common\n\t\tconst known = shared?.get(entity.id)\n\t\tif (known) return known\n\t\tconst name = this.namesNow.get(entity.id)\n\t\t// what was told last, as long as it still says the truth of it: most of what is in sight stands as it stood\n\t\tconst { told } = entity\n\t\tconst state = told && commonStillTold(this.world, entity, told, name) ? told : (entity.told = commonEntityState(this.world, entity, name))\n\t\tshared?.set(entity.id, state)\n\t\treturn state\n\t}\n\n\t/**\n\t * What this player was told of each entity last (`Told`), to be told again while it holds (`tell`): with the entity,\n\t * gone with it\n\t */\n\tprivate readonly told = new WeakMap<Entity, Told>()\n\n\t/**\n\t * What this player is told of an entity: what everyone is (`common`, shared between the seats of a host), and on a\n\t * copy of it what is this player's to know: an illusion's lifetime on its own side, the components replicated to it\n\t * and what they make of themselves for it, and its own part (`own`) for an ally's. Last time's objects wherever\n\t * nothing changed (`playerEntityState`)\n\t */\n\tprivate tell(entity: Entity): EntityState {\n\t\tconst shared = this.common(entity)\n\t\tconst before = this.told.get(entity)\n\t\tconst state = playerEntityState(this.view, entity, shared, before)\n\t\tif (this.world.checks.snapshots) checkTold(this.view, entity, state, this.namesNow.get(entity.id))\n\t\tthis.keep(entity, shared, state)\n\t\treturn state\n\t}\n\n\t/** Remembers what the player was told of an entity (`told`) */\n\tprivate keep(entity: Entity, shared: EntityState, state: EntityState): void {\n\t\tconst told = this.told.get(entity)\n\t\tif (!told) this.told.set(entity, { shared, state })\n\t\telse {\n\t\t\ttold.shared = shared\n\t\t\ttold.state = state\n\t\t}\n\t}\n\n\t/**\n\t * What this player is told of an entity (`tell`), once for the seats of a side told the same while a host's round\n\t * of sending is on (`Round.sides`): the side's object, which this seat remembers as its own, is this seat's too\n\t */\n\tprivate describe(entity: Entity): EntityState {\n\t\tconst side = this.sideNow\n\t\tif (!side) return this.tell(entity)\n\t\tif (this.isOnePlayers(entity)) {\n\t\t\tconst state = this.tell(entity)\n\t\t\tconst first = side.alike.get(entity.id)\n\t\t\tif (!first) side.alike.set(entity.id, state)\n\t\t\telse if (first !== state && sameEntity(first, state)) {\n\t\t\t\tthis.keep(entity, this.common(entity), first)\n\t\t\t\treturn first\n\t\t\t}\n\t\t\treturn state\n\t\t}\n\t\tconst known = side.all.get(entity.id)\n\t\tif (known) {\n\t\t\tthis.keep(entity, this.common(entity), known)\n\t\t\treturn known\n\t\t}\n\t\tconst state = this.tell(entity)\n\t\tside.all.set(entity.id, state)\n\t\treturn state\n\t}\n\n\t/**\n\t * What the seats of this one's side are told alike this round (`Round.sides`), by entity: none outside a host's round.\n\t * Set as the capture starts (`capture`)\n\t */\n\tprivate sideNow: Side | undefined\n\n\t/**\n\t * Which seats are told the same of an entity where nothing of it is one player's: an observer's, or a team's with the\n\t * same allies among the players (relations are a pair of players', not a team's)\n\t */\n\tprivate sideKey(): string {\n\t\tif (this.observer) return 'observer'\n\t\tlet key = `team ${this.team}:`\n\t\tfor (const player of this.world.players.keys()) key += this.isAlly(player) ? '1' : '0'\n\t\treturn key\n\t}\n\n\t/**\n\t * Whether what this player is told of an entity is theirs alone, not their side's: a component replicated to its owner\n\t * or shaping itself for each player (`Component.snapshot`), or control of another's unit shared with this player\n\t */\n\tprivate isOnePlayers(entity: Entity): boolean {\n\t\tif (hasOnePlayersPart(this.world, entity)) return true\n\t\treturn entity.owner !== this.playerId && !this.observer && this.isAlly(entity.owner) && this.world.mayCommand(this.playerId, entity)\n\t}\n\n\t/** Where in the list being captured are those that may be one player's (`SideSeen.mine`): while the first seat of a side captures */\n\tprivate mineNow: number[] | undefined\n\n\t/**\n\t * What the team remembers of a structure is every teammate's to be told, not this seat's: without the parts of the\n\t * description shaped for one player (components replicated to the owner, or made by their `snapshot` for whoever is\n\t * told), which the seat that happened to see it first would otherwise give to the whole team\n\t */\n\tprivate forTeam(entity: Entity, state: EntityState): EntityState {\n\t\tif (!state.components || !hasOnePlayersPart(this.world, entity)) return state\n\t\tconst components: Record<string, unknown> = {}\n\t\tfor (const [id, part] of Object.entries(state.components)) {\n\t\t\tconst component = this.world.registry.component(id)\n\t\t\tif (component?.replicate === 'owner' || (component?.replicate && component.snapshot)) continue\n\t\t\tcomponents[id] = part\n\t\t}\n\t\treturn { ...state, components }\n\t}\n\n\t/** Adds what the player sees of an entity in sight to the snapshot, and remembers structures for when they are out of sight */\n\tprivate see(entity: Entity, out: EntityState[], remembered: Record<EntityId, EntityState>): void {\n\t\tconst before = remembered[entity.id]\n\t\t// trees and mines rarely change: what was said about them last time is said again, as it is (a tree that burns\n\t\t// is told again as its fire changes: `sharedStillTold`)\n\t\tconst kept = entity.isResource && before?.visible && before.resource === entity.get(deposit)?.amount && sharedStillTold(entity, before)\n\t\tconst state = kept ? before : this.describe(entity)\n\t\tif (!kept && this.mineNow && (this.isAlly(entity.owner) || hasOnePlayersPart(this.world, entity))) this.mineNow.push(out.length)\n\t\tout.push(state)\n\t\tthis.inSight.add(entity.id)\n\t\tif (entity.isStructure && !this.isAlly(entity.owner)) {\n\t\t\tif (state !== before) remembered[entity.id] = this.forTeam(entity, state)\n\t\t} else if (before) delete remembered[entity.id]\n\t}\n\n\t/** Throws when what was taken to be in sight is not what testing every entity gives. See `debugChecks` */\n\tprivate checkSight(): void {\n\t\tfor (const entity of this.world.entities.values()) {\n\t\t\tif (!entity.alive || this.knows(entity) === this.inSight.has(entity.id)) continue\n\t\t\tconst said = this.inSight.has(entity.id) ? 'in sight' : 'out of sight'\n\t\t\tthrow new Error(`Snapshot for player ${this.playerId} has ${entity.def.id}#${entity.id} ${said}, it is not`)\n\t\t}\n\t}\n\n\t/** The scenery the player's team sees right now */\n\tprivate *sceneryInSight(): Iterable<Entity> {\n\t\tconst { world } = this\n\t\t// a team that sees the whole map sees all of it. Only for players who are out and a debug switch\n\t\tif (this.observer || world.fog.isRevealed(this.team)) {\n\t\t\tfor (const entity of world.entities.values()) if (entity.scenery) yield entity\n\t\t} else yield* world.sceneryInSight.get(this.team) ?? []\n\t}\n\n\t/**\n\t * On a map explored from the start, what stands on it and belongs to no player (trees, mines, rocks, neutral\n\t * buildings, the creeps' own) known to the team from the first snapshot, as it stands, out of sight: the genre's melee\n\t * maps. Once for a team (`TeamMemory.startKnown`); units, and players' buildings, only once seen\n\t */\n\tprivate knowStart(remembered: Record<EntityId, EntityState>): void {\n\t\tconst { world } = this\n\t\tif (this.observer || !world.fog.exploredFromStart) return\n\t\tconst memory = this.memory\n\t\tif (memory.startKnown) return\n\t\tmemory.startKnown = true\n\t\tfor (const entity of world.entities.values()) {\n\t\t\tif (!entity.alive || !entity.isStructure || this.inSight.has(entity.id) || remembered[entity.id]) continue\n\t\t\tconst owner = world.players.get(entity.owner)\n\t\t\tif (!owner?.neutral && !owner?.creeps) continue\n\t\t\tremembered[entity.id] = { ...this.forTeam(entity, this.describe(entity)), visible: false }\n\t\t}\n\t}\n\n\tprivate capture(): Snapshot {\n\t\tconst { world } = this\n\t\tconst round = SHARED.get(world)\n\t\tif (round) {\n\t\t\tconst key = this.sideKey()\n\t\t\tlet side = round.sides.get(key)\n\t\t\tif (!side) round.sides.set(key, (side = { all: new Map(), alike: new Map() }))\n\t\t\tthis.sideNow = side\n\t\t} else this.sideNow = undefined\n\t\tconst remembered = this.memory.structures\n\t\t// what is named, by id, for `describe`: the names are few, and looked up for every entity in sight\n\t\tthis.namesNow.clear()\n\t\tif (world.states.has(names)) for (const [name, id] of Object.entries(world.state(names))) this.namesNow.set(id, name)\n\t\tconst seen = this.sideNow?.seen\n\t\tconst entities = seen ? this.seeAsSide(seen) : this.seeAll(remembered)\n\t\tif (this.world.checks.sight) this.checkSight()\n\t\tif (seen) return this.finish(entities)\n\t\tthis.knowStart(remembered)\n\t\t// the fog back after it was lifted: what was seen only while it was (ground never explored) is not known after all\n\t\tconst revealed = this.observer || world.fog.isRevealed(this.team)\n\t\tif (this.wasRevealed && !revealed) {\n\t\t\tfor (const [key, state] of Object.entries(remembered)) {\n\t\t\t\tif (!this.inSight.has(Number(key)) && !world.fog.isExplored(this.team, state.x, state.z)) delete remembered[Number(key)]\n\t\t\t}\n\t\t}\n\t\tthis.wasRevealed = revealed\n\t\t// Structures that are not in sight are shown the way they were last seen. That goes for the ones that were\n\t\t// destroyed out of sight too: they stay on the map until someone looks at the spot again. Where the rules keep\n\t\t// nothing of what was seen (`FogSettings.explored: 'nothing'`), out of sight is forgotten\n\t\tconst forget = world.settings.fog?.explored === 'nothing' && !revealed\n\t\tfor (const [key, state] of Object.entries(remembered)) {\n\t\t\tconst id = Number(key)\n\t\t\tif (this.inSight.has(id)) continue\n\t\t\tif (forget) {\n\t\t\t\tdelete remembered[id]\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!world.get(id) && this.sees(state.x, state.z)) {\n\t\t\t\tdelete remembered[id]\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// made once, when it leaves the view\n\t\t\tconst memory = state.visible ? { ...state, visible: false } : state\n\t\t\tif (memory !== state) remembered[id] = memory\n\t\t\tentities.push(memory)\n\t\t}\n\t\tif (this.sideNow) this.sideNow.seen = { entities: [...entities], inSight: new Set(this.inSight), mine: this.mineNow ?? [] }\n\t\tthis.mineNow = undefined\n\t\treturn this.finish(entities)\n\t}\n\n\t/** The entities in sight, and what the side remembers out of it, as the first seat of a side (or a seat on its own) sees them */\n\tprivate seeAll(remembered: Record<EntityId, EntityState>): EntityState[] {\n\t\tconst { world } = this\n\t\tconst entities: EntityState[] = []\n\t\tthis.inSight.clear()\n\t\tthis.mineNow = this.sideNow ? [] : undefined\n\t\t// what acts or changes by itself is looked at one by one\n\t\tfor (const entity of world.units.values()) {\n\t\t\tif (entity.alive && this.knows(entity)) this.see(entity, entities, remembered)\n\t\t}\n\t\t// Scenery (a map can have thousands of trees) never moves, so it only comes into sight or goes out of it when\n\t\t// the fog is worked out again. The fog system keeps what each team sees of it, instead of every tree being tested here\n\t\tfor (const entity of this.sceneryInSight()) {\n\t\t\tif (entity.alive && entity.scenery) this.see(entity, entities, remembered)\n\t\t}\n\t\treturn entities\n\t}\n\n\t/**\n\t * What another seat of the side saw this round, as this one sees it: the same, but what may be this player's alone\n\t * described again for them. The side's memory is the first seat's to keep\n\t */\n\tprivate seeAsSide(seen: SideSeen): EntityState[] {\n\t\tconst entities = [...seen.entities]\n\t\tthis.inSight.clear()\n\t\tfor (const id of seen.inSight) this.inSight.add(id)\n\t\tfor (const at of seen.mine) entities[at] = this.describe(this.world.get(entities[at].id)!)\n\t\t// as the first seat did, what was seen only while the fog was lifted is no longer known\n\t\tthis.wasRevealed = this.observer || this.world.fog.isRevealed(this.team)\n\t\treturn entities\n\t}\n\n\t/** The rest of a snapshot, round its entities: the players, and every feature's part (`SnapshotField`) */\n\tprivate finish(entities: EntityState[]): Snapshot {\n\t\tconst { world } = this\n\t\tconst players: PlayerState[] = []\n\t\tfor (const player of world.players.values()) {\n\t\t\tconst state: PlayerState = {\n\t\t\t\tid: player.id,\n\t\t\t\tname: player.name,\n\t\t\t\tteam: player.team,\n\t\t\t\tcolor: player.color,\n\t\t\t\tneutral: player.neutral,\n\t\t\t\tcreeps: player.creeps || undefined,\n\t\t\t\t...(player.race !== undefined && { race: player.race }),\n\t\t\t\tdefeated: player.defeated,\n\t\t\t\trelation:\n\t\t\t\t\tplayer.id === this.playerId\n\t\t\t\t\t\t? 'self'\n\t\t\t\t\t\t: world.areAllies(this.playerId, player.id)\n\t\t\t\t\t\t\t? 'ally'\n\t\t\t\t\t\t\t: world.areEnemies(this.playerId, player.id)\n\t\t\t\t\t\t\t\t? 'enemy'\n\t\t\t\t\t\t\t\t: 'neutral'\n\t\t\t}\n\t\t\tif (state.relation === 'ally' && !player.neutral && !this.observer) {\n\t\t\t\tconst me = world.player(this.playerId)\n\t\t\t\tstate.shared = {\n\t\t\t\t\tcontrol: world.sides.controlOf(this.playerId).includes(player.id),\n\t\t\t\t\tvision: me.team === player.team || world.sides.visionOf(me.team).includes(player.team)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// an observer is told every player's\n\t\t\tif (player.id === this.playerId || (this.observer && !player.neutral)) {\n\t\t\t\tstate.own = {\n\t\t\t\t\tresources: { ...player.resources },\n\t\t\t\t\tsupplyUsed: player.supplyUsed,\n\t\t\t\t\tsupplyCap: player.supplyCap,\n\t\t\t\t\t...(Object.keys(player.supplies).length > 0 && { supplies: structuredClone(player.supplies) }),\n\t\t\t\t\tupkeep: world.settings.economy.upkeep(world, player.id),\n\t\t\t\t\tupgrades: Object.fromEntries(player.upgrades),\n\t\t\t\t\tresearching: [...player.researching],\n\t\t\t\t\ttech: [...techOf(world, player.id)],\n\t\t\t\t\theroes: heroSummaries(world, player.id),\n\t\t\t\t\t// copies: the snapshot is the player's to keep, and the objectives go on changing\n\t\t\t\t\tobjectives: world.objectives.of(player.id).map((objective) => structuredClone(objective)),\n\t\t\t\t\t...(world.timers.shownTo(player.id).length && { timers: world.timers.shownTo(player.id) })\n\t\t\t\t}\n\t\t\t\tif (world.hooks.has('requirement') && player.id === this.playerId) state.own.unlocks = decidedUnlocks(world, player.id)\n\t\t\t\tif (world.hooks.has('available') && player.id === this.playerId) {\n\t\t\t\t\tconst availability = decidedAvailability(world, player.id)\n\t\t\t\t\tif (availability) state.own.availability = availability\n\t\t\t\t}\n\t\t\t}\n\t\t\tplayers.push(state)\n\t\t}\n\n\t\t// the rest is each feature's to say (`SnapshotField`): before the entities where it says, the rest after the players\n\t\tconst { view } = this\n\t\tconst snapshot = { tick: world.tick } as Snapshot\n\t\tconst parts = world.registry.snapshotFields\n\t\tconst take = (part: SnapshotField) => {\n\t\t\tconst value = part.capture(view)\n\t\t\tif (value !== undefined) (snapshot as unknown as Record<string, unknown>)[part.key] = value\n\t\t}\n\t\tfor (const part of parts) if (part.head) take(part)\n\t\tsnapshot.entities = entities\n\t\tsnapshot.players = players\n\t\tfor (const part of parts) if (!part.head) take(part)\n\t\treturn snapshot\n\t}\n\n\t/** Takes a snapshot of the world as the seat sees it now, without stepping */\n\tsnapshot(): Snapshot {\n\t\treturn this.capture()\n\t}\n\n\t/**\n\t * Moves the game on by `ticks` at the next update, however fast it goes: a step of a paused game (`speed` 0), as\n\t * an editor's Step does. Ticks asked for while it runs are taken on top of its pace\n\t */\n\tadvance(ticks = 1): void {\n\t\tthis.accumulator += this.world.dt * Math.max(0, Math.floor(ticks))\n\t}\n\n\t/** A save of the world as it stands (`saveWorld`): at once, as a promise for what a session elsewhere answers later */\n\tsave(): Promise<WorldSave> {\n\t\ttry {\n\t\t\treturn Promise.resolve(saveWorld(this.world))\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error)\n\t\t}\n\t}\n\n\t/**\n\t * Runs the game on by itself, a tick at a time, as fast as the page can, until `until` holds of the world, `most`\n\t * ticks have run, the game is over, or `deadline` (`performance.now()`'s) is past: what an editor's \"Play to\" does a\n\t * slice a frame, its pace and `advance` aside. The ticks are the same ticks the game runs at its own pace, so the\n\t * same game comes to the same moment. What happened in them is in the next snapshot (`update`), as after a slow frame.\n\t * `until` is asked before the first tick too: what holds already runs none\n\t */\n\trunUntil(until: (world: World) => boolean, options: { most?: number; deadline?: number } = {}): { ticks: number; reached: boolean; over: boolean } {\n\t\tconst { world } = this\n\t\tconst most = options.most ?? Infinity\n\t\tconst deadline = options.deadline ?? Infinity\n\t\tlet ticks = 0\n\t\tconst over = () => world.failure !== null || world.winner !== null\n\t\twhile (!until(world)) {\n\t\t\tif (ticks >= most || over()) return this.ran(ticks, false, over())\n\t\t\t// the clock looked at every few ticks: a tick is a fraction of a millisecond, a look is not free\n\t\t\tif (ticks % 8 === 7 && performance.now() > deadline) return this.ran(ticks, false, false)\n\t\t\tthis.tickOnce()\n\t\t\tticks++\n\t\t}\n\t\treturn this.ran(ticks, true, over())\n\t}\n\n\t/** What `runUntil` gives back, the debug tools' view brought up to date where it ran */\n\tprivate ran(ticks: number, reached: boolean, over: boolean): { ticks: number; reached: boolean; over: boolean } {\n\t\tif (ticks) {\n\t\t\tthis.debug.refresh()\n\t\t\tthis.ranOn = true\n\t\t}\n\t\treturn { ticks, reached, over }\n\t}\n\n\t/** Whether `runUntil` ran ticks since the last update: its next snapshot describes them, paused or not */\n\tprivate ranOn = false\n\n\t/** A tick of the world, and the checkpoint it marked saved as the world stood at its end, not at the end of the frame */\n\tprivate tickOnce(): void {\n\t\tthis.world.step()\n\t\tif (this.pendingCheckpoint) {\n\t\t\tthis.checkpoint = { label: this.pendingCheckpoint, save: saveWorld(this.world) }\n\t\t\tthis.pendingCheckpoint = undefined\n\t\t}\n\t}\n\n\t/** Adds `dt` real seconds (scaled by `speed`) and steps the world one tick for each tick's worth; returns a snapshot of how it stands after, or none when nothing happened */\n\tupdate(dt: number): Snapshot[] {\n\t\tconst { world } = this\n\t\tlet stepped = this.ranOn\n\t\tthis.ranOn = false\n\t\t// slowed down or paused here (tests, tools), and by the game's speed (`debug.speed`)\n\t\tthis.accumulator += dt * this.speed * world.cheats.speed\n\t\tif (world.cheats.speed === 0 && this.speed > 0 && world.debugWaiting) this.accumulator += world.dt\n\t\twhile (this.accumulator >= world.dt) {\n\t\t\tthis.tickOnce()\n\t\t\tthis.accumulator -= world.dt\n\t\t\tstepped = true\n\t\t}\n\t\tthis.alpha = this.speed * world.cheats.speed > 0 ? this.accumulator / world.dt : 1\n\t\t// When a slow frame had several ticks to catch up on, only how things stand after the last one is described:\n\t\t// the client would throw the ones in between away. What happened in them is in the events, which pile up until then.\n\t\t// With no tick, what was said between ticks (talk, carried out at once: RV14) goes in a snapshot of the same tick\n\t\tif (!stepped) return this.view.events.length ? [this.capture()] : []\n\t\tthis.debug.refresh()\n\t\treturn [this.capture()]\n\t}\n\n\t/** Sends a command. `seq` is the sender's own number for it, for a host passing on what a remote player numbered */\n\tsend(command: PlayerCommand, seq = ++this.lastSeq): number {\n\t\t// the seat decides who is speaking, whatever the message claims\n\t\tthis.world.issue({ ...command, player: this.playerId, seq } as Parameters<World['issue']>[0])\n\t\treturn seq\n\t}\n\n\t/**\n\t * The number of the last command sent: a computer's seat keeps it through a save, so the commands it sends after a\n\t * load are numbered as they would have been\n\t *\n\t * @beta\n\t */\n\tlastSeq = 0\n\n\t/** The seat's team's fog as cells, visible and explored */\n\tfog(): FogState {\n\t\tconst { fog } = this.world\n\t\tconst cells = fog.cells(this.team)\n\t\treturn {\n\t\t\twidth: fog.width,\n\t\t\tdepth: fog.depth,\n\t\t\tversion: fog.version,\n\t\t\trevealed: this.observer || fog.isRevealed(this.team) || !cells,\n\t\t\tvisible: cells?.visible ?? new Uint8Array(0),\n\t\t\texplored: cells?.explored ?? new Uint8Array(0)\n\t\t}\n\t}\n\n\t/** Where the game's money is mined, as the map shows it, seen or not (`GameSession.mines`, `minesFor`) */\n\tmines(): readonly MineInfo[] {\n\t\treturn minesFor(this.view)\n\t}\n\n\t/** The lanes of the map, as the map shows them (`GameSession.lanes`) */\n\tlanes(): readonly Lane[] {\n\t\treturn lanesOf(this.world)\n\t}\n\n\t/** The camps as the player knows them (`GameSession.camps`, `campsFor`): worked out once a tick */\n\tcamps(): readonly CampInfo[] {\n\t\treturn campsFor(this.view)\n\t}\n\n\t/** Whether the player could place a building of this type at the point now, seen as their team sees the ground */\n\tcanPlace(unitType: string, point: Vec2): boolean {\n\t\treturn this.registry.units.has(unitType) && canPlaceStructure(this.world, this.registry.unit(unitType), point, this.playerId, true)\n\t}\n\n\t/** Which cells of a building's ground are in the way for the player: taken, or not explored by their team (`placementCells`) */\n\tplaceCells(unitType: string, point: Vec2): readonly boolean[] | undefined {\n\t\tif (!this.registry.units.has(unitType)) return undefined\n\t\tconst { world } = this\n\t\tconst { team } = world.player(this.playerId)\n\t\treturn placementCells(\n\t\t\tthis.registry.unit(unitType),\n\t\t\tpoint,\n\t\t\t(x, z) => world.grid.canPlace(x, z, 1, 1),\n\t\t\t(x, z) => world.fog.isExplored(team, x + 0.5, z + 0.5)\n\t\t)\n\t}\n\n\t/** Where a group would stand sent to a point in a formation, the rules' own pick when none is named (`GameSession.formationPlaces`) */\n\tformationPlaces(units: readonly (FormationUnit & { readonly flying?: boolean })[], point: Vec2, facing?: number, formation?: string): Map<EntityId, Vec2> {\n\t\tconst { world } = this\n\t\tconst id = formation ?? world.settings.movement.formation(world, units.flatMap((unit) => world.get(unit.id) ?? []), { type: 'move', point })\n\t\treturn formationPreview(this.registry, units, point, world, id, facing)\n\t}\n\n\t/** A path between two points on the ground, or in the air when `flying`; null when there is none */\n\tfindPath(from: Vec2, to: Vec2, flying = false): Vec2[] | null {\n\t\treturn (flying ? this.world.air : this.world.nav).findPath(from, to)\n\t}\n\n\t/** What happened since the last snapshot, not yet given in one: a copy, for a computer's save */\n\tpendingEvents(): SessionEvent[] {\n\t\treturn structuredClone(this.view.events)\n\t}\n\n\t/** Takes back what `pendingEvents` gave, ahead of what has happened since: in a game loaded from a save */\n\trestoreEvents(events: readonly SessionEvent[]): void {\n\t\tthis.view.events = [...structuredClone(events), ...this.view.events]\n\t}\n\n\t/** Whether the world goes with the session */\n\tprivate readonly ownsWorld: boolean\n\n\t/** Stops the session's listeners and debug tools, and the world too when the session owns it */\n\tdispose(): void {\n\t\tfor (const dispose of this.disposers.splice(0)) dispose()\n\t\tthis.debug.dispose()\n\t\tif (this.ownsWorld) this.world.dispose()\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA8CA,IAAM,eAAe;;;;;;;;AASrB,IAAa,kCAAqD,IAAI,IAAI;CAAC;CAAS;CAAU;CAAQ;CAAQ;CAAQ;CAAQ;AAAS,CAAC;AAgCxI,IAAM,yBAAS,IAAI,QAAsB;;;;;;;;AASzC,SAAgB,cAAc,OAAoB;CACjD,OAAO,IAAI,OAAO;EAAE,wBAAQ,IAAI,IAAI;EAAG,uBAAO,IAAI,IAAI;CAAE,CAAC;AAC1D;;AAGA,SAAgB,kBAAkB,OAAoB;CACrD,OAAO,OAAO,KAAK;AACpB;;;;;;AAOA,IAAa,eAAb,MAAiD;CA0EtC;CAEA;;CA1EV;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA,QAAQ;;CAER,IAAI,MAAc;EACjB,OAAO,KAAK,MAAM;CACnB;;CAEA,IAAI,UAAsC;EACzC,OAAO,KAAK,MAAM;CACnB;;CAEA,QAAQ;CAER,cAAsB;;CAEtB,cAAsB;;CAEtB,IAAY,SAAqB;EAChC,OAAO,KAAK,KAAK;CAClB;;CAEA,0BAA2B,IAAI,IAAc;;CAE7C,2BAA4B,IAAI,IAAsB;CACtD,YAA6C,CAAC;CAC9C;;CAEA;;CAEA;;CAEA,MAA2B;EAC1B,MAAM,OAAO,IAAI;EACjB,OAAO,QAAQ,IAAI;EACnB,SAAS,KAAA;EACT,UAAU;GACT,aAAa,KAAK,MAAM;GACxB,aAAa,KAAK,MAAM;GACxB,qBAAqB,KAAK,cAAc;GACxC,gBAAgB,WAAW,KAAK,cAAc,MAAM;EACrD;CACD;;;;;CAKA;;;;;CAKA;;CAEA;CAEA,YAEC,OAEA,UASA,UAAqH,CAAC,GACrH;EAZQ,KAAA,QAAA;EAEA,KAAA,WAAA;EAWT,KAAK,WAAW,QAAQ,YAAY;EACpC,KAAK,YAAY,QAAQ,aAAa;EACtC,KAAK,cAAc,QAAQ,eAAe;EAC1C,KAAK,OAAO,IAAI,YAAY,OAAO,UAAU;GAC5C,UAAU,KAAK;GACf,aAAa,KAAK;GAClB,aAAa,QAAQ,eAAe;EACrC,CAAC;EACD,IAAI,QAAQ,OAAO,MAAM,aAAa,IAAI,QAAQ;EAClD,KAAK,UAAU,MAAM;EACrB,KAAK,cAAc,MAAM,IAAI;EAC7B,KAAK,UAAU,MAAM,IAAI;EACzB,KAAK,UAAU,MAAM,IAAI;EACzB,KAAK,UAAU,MAAM,IAAI;EACzB,KAAK,QAAQ,MAAM,IAAI;EACvB,KAAK,WAAW,MAAM;EACtB,KAAK,WAAW,MAAM;EACtB,KAAK,QAAQ,IAAI,WAAW,KAAK;EAChC,KAAM,IAAmC,UAAU,KAAK;EAEzD,MAAM,EAAE,WAAW;EACnB,MAAM,EAAE,SAAS;EAIjB,KAAK,MAAM,eAAe,MAAM,SAAS,cAAc;GACtD,IAAI,CAAC,KAAK,MAAM,YAAY,EAAE,GAAG;GACjC,KAAK,UAAU,KACd,OAAO,GAAG,YAAY,QAAiB,YAAqB;IAC3D,MAAM,OAAO,YAAY,KAAK,SAAS,IAAI;IAC3C,IAAI,MAAM,KAAK,OAAO,KAAK,IAAI;GAChC,CAAC,CACF;EACD;EAEA,KAAK,UAAU,KAAK,OAAO,GAAGA,aAAkB,EAAE,YAAa,KAAK,oBAAoB,KAAM,CAAC;EAE/F,IAAI,KAAK,MAAM,MAAM,GACpB,KAAK,UAAU,KACd,OAAO,OAAO,MAAM,YAAY;GAC/B,IAAI,OAAO,SAAS,UAAU;GAC9B,MAAM,WAAW,MAAM,SAAS,MAAM,IAAI,CAAC,EAAE;GAC7C,IAAI,CAAC,UAAU;GACf,IAAI,aAAa,cAAc,CAAC,SAAS,SAAS,IAAI,GAAG;GACzD,IAAI,KAAK,MAAM,OAAO,QAAQ,gBAAgB,SAAS,UAAU,KAAK,EAAE;GACxE,KAAK,OAAO,KAAK;IAAE,MAAM;IAAQ,OAAO;IAAM;GAAQ,CAAC;EACxD,CAAC,CACF;CACF;;CAGA,MAAc,MAAqC;EAClD,OAAO,CAAC,KAAK,eAAe,gBAAgB,IAAI,IAAI;CACrD;;CAGA,IAAI,OAAe;EAClB,OAAO,KAAK,KAAK;CAClB;CAEA,OAAe,OAA0B;EACxC,OAAO,KAAK,KAAK,OAAO,KAAK;CAC9B;;CAGA,KAAa,GAAW,GAAoB;EAC3C,OAAO,KAAK,KAAK,KAAK,GAAG,CAAC;CAC3B;;;;;;CAOA,IAAI,cAAsB;EACzB,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC;CAC3B;;CAGA,MAAc,QAAyB;EACtC,OAAO,KAAK,KAAK,MAAM,MAAM;CAC9B;;;;;CAMA,OAAe,QAA6B;EAC3C,MAAM,SAAS,OAAO,IAAI,KAAK,KAAK,CAAC,EAAE;EACvC,MAAM,QAAQ,QAAQ,IAAI,OAAO,EAAE;EACnC,IAAI,OAAO,OAAO;EAClB,MAAM,OAAO,KAAK,SAAS,IAAI,OAAO,EAAE;EAExC,MAAM,EAAE,SAAS;EACjB,MAAM,QAAQ,QAAQ,gBAAgB,KAAK,OAAO,QAAQ,MAAM,IAAI,IAAI,OAAQ,OAAO,OAAO,kBAAkB,KAAK,OAAO,QAAQ,IAAI;EACxI,QAAQ,IAAI,OAAO,IAAI,KAAK;EAC5B,OAAO;CACR;;;;;CAMA,uBAAwB,IAAI,QAAsB;;;;;;;CAQlD,KAAa,QAA6B;EACzC,MAAM,SAAS,KAAK,OAAO,MAAM;EACjC,MAAM,SAAS,KAAK,KAAK,IAAI,MAAM;EACnC,MAAM,QAAQ,kBAAkB,KAAK,MAAM,QAAQ,QAAQ,MAAM;EACjE,IAAI,KAAK,MAAM,OAAO,WAAW,UAAU,KAAK,MAAM,QAAQ,OAAO,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;EACjG,KAAK,KAAK,QAAQ,QAAQ,KAAK;EAC/B,OAAO;CACR;;CAGA,KAAa,QAAgB,QAAqB,OAA0B;EAC3E,MAAM,OAAO,KAAK,KAAK,IAAI,MAAM;EACjC,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,QAAQ;GAAE;GAAQ;EAAM,CAAC;OAC7C;GACJ,KAAK,SAAS;GACd,KAAK,QAAQ;EACd;CACD;;;;;CAMA,SAAiB,QAA6B;EAC7C,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MAAM,OAAO,KAAK,KAAK,MAAM;EAClC,IAAI,KAAK,aAAa,MAAM,GAAG;GAC9B,MAAM,QAAQ,KAAK,KAAK,MAAM;GAC9B,MAAM,QAAQ,KAAK,MAAM,IAAI,OAAO,EAAE;GACtC,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,OAAO,IAAI,KAAK;QACtC,IAAI,UAAU,SAAS,WAAW,OAAO,KAAK,GAAG;IACrD,KAAK,KAAK,QAAQ,KAAK,OAAO,MAAM,GAAG,KAAK;IAC5C,OAAO;GACR;GACA,OAAO;EACR;EACA,MAAM,QAAQ,KAAK,IAAI,IAAI,OAAO,EAAE;EACpC,IAAI,OAAO;GACV,KAAK,KAAK,QAAQ,KAAK,OAAO,MAAM,GAAG,KAAK;GAC5C,OAAO;EACR;EACA,MAAM,QAAQ,KAAK,KAAK,MAAM;EAC9B,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK;EAC7B,OAAO;CACR;;;;;CAMA;;;;;CAMA,UAA0B;EACzB,IAAI,KAAK,UAAU,OAAO;EAC1B,IAAI,MAAM,QAAQ,KAAK,KAAK;EAC5B,KAAK,MAAM,UAAU,KAAK,MAAM,QAAQ,KAAK,GAAG,OAAO,KAAK,OAAO,MAAM,IAAI,MAAM;EACnF,OAAO;CACR;;;;;CAMA,aAAqB,QAAyB;EAC7C,IAAI,kBAAkB,KAAK,OAAO,MAAM,GAAG,OAAO;EAClD,OAAO,OAAO,UAAU,KAAK,YAAY,CAAC,KAAK,YAAY,KAAK,OAAO,OAAO,KAAK,KAAK,KAAK,MAAM,WAAW,KAAK,UAAU,MAAM;CACpI;;CAGA;;;;;;CAOA,QAAgB,QAAgB,OAAiC;EAChE,IAAI,CAAC,MAAM,cAAc,CAAC,kBAAkB,KAAK,OAAO,MAAM,GAAG,OAAO;EACxE,MAAM,aAAsC,CAAC;EAC7C,KAAK,MAAM,CAAC,IAAI,SAAS,OAAO,QAAQ,MAAM,UAAU,GAAG;GAC1D,MAAM,YAAY,KAAK,MAAM,SAAS,UAAU,EAAE;GAClD,IAAI,WAAW,cAAc,WAAY,WAAW,aAAa,UAAU,UAAW;GACtF,WAAW,MAAM;EAClB;EACA,OAAO;GAAE,GAAG;GAAO;EAAW;CAC/B;;CAGA,IAAY,QAAgB,KAAoB,YAAiD;EAChG,MAAM,SAAS,WAAW,OAAO;EAGjC,MAAM,OAAO,OAAO,cAAc,QAAQ,WAAW,OAAO,aAAa,OAAO,IAAI,OAAO,CAAC,EAAE,UAAU,gBAAgB,QAAQ,MAAM;EACtI,MAAM,QAAQ,OAAO,SAAS,KAAK,SAAS,MAAM;EAClD,IAAI,CAAC,QAAQ,KAAK,YAAY,KAAK,OAAO,OAAO,KAAK,KAAK,kBAAkB,KAAK,OAAO,MAAM,IAAI,KAAK,QAAQ,KAAK,IAAI,MAAM;EAC/H,IAAI,KAAK,KAAK;EACd,KAAK,QAAQ,IAAI,OAAO,EAAE;EAC1B,IAAI,OAAO,eAAe,CAAC,KAAK,OAAO,OAAO,KAAK,GAC9C;OAAA,UAAU,QAAQ,WAAW,OAAO,MAAM,KAAK,QAAQ,QAAQ,KAAK;EAAA,OAClE,IAAI,QAAQ,OAAO,WAAW,OAAO;CAC7C;;CAGA,aAA2B;EAC1B,KAAK,MAAM,UAAU,KAAK,MAAM,SAAS,OAAO,GAAG;GAClD,IAAI,CAAC,OAAO,SAAS,KAAK,MAAM,MAAM,MAAM,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG;GACzE,MAAM,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,IAAI,aAAa;GACxD,MAAM,IAAI,MAAM,uBAAuB,KAAK,SAAS,OAAO,OAAO,IAAI,GAAG,GAAG,OAAO,GAAG,GAAG,KAAK,YAAY;EAC5G;CACD;;CAGA,CAAS,iBAAmC;EAC3C,MAAM,EAAE,UAAU;EAElB,IAAI,KAAK,YAAY,MAAM,IAAI,WAAW,KAAK,IAAI,GAC7C;QAAA,MAAM,UAAU,MAAM,SAAS,OAAO,GAAG,IAAI,OAAO,SAAS,MAAM;EAAA,OAClE,OAAO,MAAM,eAAe,IAAI,KAAK,IAAI,KAAK,CAAC;CACvD;;;;;;CAOA,UAAkB,YAAiD;EAClE,MAAM,EAAE,UAAU;EAClB,IAAI,KAAK,YAAY,CAAC,MAAM,IAAI,mBAAmB;EACnD,MAAM,SAAS,KAAK;EACpB,IAAI,OAAO,YAAY;EACvB,OAAO,aAAa;EACpB,KAAK,MAAM,UAAU,MAAM,SAAS,OAAO,GAAG;GAC7C,IAAI,CAAC,OAAO,SAAS,CAAC,OAAO,eAAe,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,WAAW,OAAO,KAAK;GAClG,MAAM,QAAQ,MAAM,QAAQ,IAAI,OAAO,KAAK;GAC5C,IAAI,CAAC,OAAO,WAAW,CAAC,OAAO,QAAQ;GACvC,WAAW,OAAO,MAAM;IAAE,GAAG,KAAK,QAAQ,QAAQ,KAAK,SAAS,MAAM,CAAC;IAAG,SAAS;GAAM;EAC1F;CACD;CAEA,UAA4B;EAC3B,MAAM,EAAE,UAAU;EAClB,MAAM,QAAQ,OAAO,IAAI,KAAK;EAC9B,IAAI,OAAO;GACV,MAAM,MAAM,KAAK,QAAQ;GACzB,IAAI,OAAO,MAAM,MAAM,IAAI,GAAG;GAC9B,IAAI,CAAC,MAAM,MAAM,MAAM,IAAI,KAAM,OAAO;IAAE,qBAAK,IAAI,IAAI;IAAG,uBAAO,IAAI,IAAI;GAAE,CAAE;GAC7E,KAAK,UAAU;EAChB,OAAO,KAAK,UAAU,KAAA;EACtB,MAAM,aAAa,KAAK,OAAO;EAE/B,KAAK,SAAS,MAAM;EACpB,IAAI,MAAM,OAAO,IAAI,KAAK,GAAG,KAAK,MAAM,CAAC,MAAM,OAAO,OAAO,QAAQ,MAAM,MAAM,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,IAAI;EACpH,MAAM,OAAO,KAAK,SAAS;EAC3B,MAAM,WAAW,OAAO,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,UAAU;EACrE,IAAI,KAAK,MAAM,OAAO,OAAO,KAAK,WAAW;EAC7C,IAAI,MAAM,OAAO,KAAK,OAAO,QAAQ;EACrC,KAAK,UAAU,UAAU;EAEzB,MAAM,WAAW,KAAK,YAAY,MAAM,IAAI,WAAW,KAAK,IAAI;EAChE,IAAI,KAAK,eAAe,CAAC,UACnB;QAAA,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,GACnD,IAAI,CAAC,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,WAAW,KAAK,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,WAAW,OAAO,GAAG;EAAA;EAGxH,KAAK,cAAc;EAInB,MAAM,SAAS,MAAM,SAAS,KAAK,aAAa,aAAa,CAAC;EAC9D,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,GAAG;GACtD,MAAM,KAAK,OAAO,GAAG;GACrB,IAAI,KAAK,QAAQ,IAAI,EAAE,GAAG;GAC1B,IAAI,QAAQ;IACX,OAAO,WAAW;IAClB;GACD;GACA,IAAI,CAAC,MAAM,IAAI,EAAE,KAAK,KAAK,KAAK,MAAM,GAAG,MAAM,CAAC,GAAG;IAClD,OAAO,WAAW;IAClB;GACD;GAEA,MAAM,SAAS,MAAM,UAAU;IAAE,GAAG;IAAO,SAAS;GAAM,IAAI;GAC9D,IAAI,WAAW,OAAO,WAAW,MAAM;GACvC,SAAS,KAAK,MAAM;EACrB;EACA,IAAI,KAAK,SAAS,KAAK,QAAQ,OAAO;GAAE,UAAU,CAAC,GAAG,QAAQ;GAAG,SAAS,IAAI,IAAI,KAAK,OAAO;GAAG,MAAM,KAAK,WAAW,CAAC;EAAE;EAC1H,KAAK,UAAU,KAAA;EACf,OAAO,KAAK,OAAO,QAAQ;CAC5B;;CAGA,OAAe,YAA0D;EACxE,MAAM,EAAE,UAAU;EAClB,MAAM,WAA0B,CAAC;EACjC,KAAK,QAAQ,MAAM;EACnB,KAAK,UAAU,KAAK,UAAU,CAAC,IAAI,KAAA;EAEnC,KAAK,MAAM,UAAU,MAAM,MAAM,OAAO,GACvC,IAAI,OAAO,SAAS,KAAK,MAAM,MAAM,GAAG,KAAK,IAAI,QAAQ,UAAU,UAAU;EAI9E,KAAK,MAAM,UAAU,KAAK,eAAe,GACxC,IAAI,OAAO,SAAS,OAAO,SAAS,KAAK,IAAI,QAAQ,UAAU,UAAU;EAE1E,OAAO;CACR;;;;;CAMA,UAAkB,MAA+B;EAChD,MAAM,WAAW,CAAC,GAAG,KAAK,QAAQ;EAClC,KAAK,QAAQ,MAAM;EACnB,KAAK,MAAM,MAAM,KAAK,SAAS,KAAK,QAAQ,IAAI,EAAE;EAClD,KAAK,MAAM,MAAM,KAAK,MAAM,SAAS,MAAM,KAAK,SAAS,KAAK,MAAM,IAAI,SAAS,GAAG,CAAC,EAAE,CAAE;EAEzF,KAAK,cAAc,KAAK,YAAY,KAAK,MAAM,IAAI,WAAW,KAAK,IAAI;EACvE,OAAO;CACR;;CAGA,OAAe,UAAmC;EACjD,MAAM,EAAE,UAAU;EAClB,MAAM,UAAyB,CAAC;EAChC,KAAK,MAAM,UAAU,MAAM,QAAQ,OAAO,GAAG;GAC5C,MAAM,QAAqB;IAC1B,IAAI,OAAO;IACX,MAAM,OAAO;IACb,MAAM,OAAO;IACb,OAAO,OAAO;IACd,SAAS,OAAO;IAChB,QAAQ,OAAO,UAAU,KAAA;IACzB,GAAI,OAAO,SAAS,KAAA,KAAa,EAAE,MAAM,OAAO,KAAK;IACrD,UAAU,OAAO;IACjB,UACC,OAAO,OAAO,KAAK,WAChB,SACA,MAAM,UAAU,KAAK,UAAU,OAAO,EAAE,IACvC,SACA,MAAM,WAAW,KAAK,UAAU,OAAO,EAAE,IACxC,UACA;GACP;GACA,IAAI,MAAM,aAAa,UAAU,CAAC,OAAO,WAAW,CAAC,KAAK,UAAU;IACnE,MAAM,KAAK,MAAM,OAAO,KAAK,QAAQ;IACrC,MAAM,SAAS;KACd,SAAS,MAAM,MAAM,UAAU,KAAK,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE;KAChE,QAAQ,GAAG,SAAS,OAAO,QAAQ,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,SAAS,OAAO,IAAI;IACtF;GACD;GAEA,IAAI,OAAO,OAAO,KAAK,YAAa,KAAK,YAAY,CAAC,OAAO,SAAU;IACtE,MAAM,MAAM;KACX,WAAW,EAAE,GAAG,OAAO,UAAU;KACjC,YAAY,OAAO;KACnB,WAAW,OAAO;KAClB,GAAI,OAAO,KAAK,OAAO,QAAQ,CAAC,CAAC,SAAS,KAAK,EAAE,UAAU,gBAAgB,OAAO,QAAQ,EAAE;KAC5F,QAAQ,MAAM,SAAS,QAAQ,OAAO,OAAO,OAAO,EAAE;KACtD,UAAU,OAAO,YAAY,OAAO,QAAQ;KAC5C,aAAa,CAAC,GAAG,OAAO,WAAW;KACnC,MAAM,CAAC,GAAG,OAAO,OAAO,OAAO,EAAE,CAAC;KAClC,QAAQ,cAAc,OAAO,OAAO,EAAE;KAEtC,YAAY,MAAM,WAAW,GAAG,OAAO,EAAE,CAAC,CAAC,KAAK,cAAc,gBAAgB,SAAS,CAAC;KACxF,GAAI,MAAM,OAAO,QAAQ,OAAO,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ,MAAM,OAAO,QAAQ,OAAO,EAAE,EAAE;IACzF;IACA,IAAI,MAAM,MAAM,IAAI,aAAa,KAAK,OAAO,OAAO,KAAK,UAAU,MAAM,IAAI,UAAU,eAAe,OAAO,OAAO,EAAE;IACtH,IAAI,MAAM,MAAM,IAAI,WAAW,KAAK,OAAO,OAAO,KAAK,UAAU;KAChE,MAAM,eAAe,oBAAoB,OAAO,OAAO,EAAE;KACzD,IAAI,cAAc,MAAM,IAAI,eAAe;IAC5C;GACD;GACA,QAAQ,KAAK,KAAK;EACnB;EAGA,MAAM,EAAE,SAAS;EACjB,MAAM,WAAW,EAAE,MAAM,MAAM,KAAK;EACpC,MAAM,QAAQ,MAAM,SAAS;EAC7B,MAAM,QAAQ,SAAwB;GACrC,MAAM,QAAQ,KAAK,QAAQ,IAAI;GAC/B,IAAI,UAAU,KAAA,GAAW,SAAiD,KAAK,OAAO;EACvF;EACA,KAAK,MAAM,QAAQ,OAAO,IAAI,KAAK,MAAM,KAAK,IAAI;EAClD,SAAS,WAAW;EACpB,SAAS,UAAU;EACnB,KAAK,MAAM,QAAQ,OAAO,IAAI,CAAC,KAAK,MAAM,KAAK,IAAI;EACnD,OAAO;CACR;;CAGA,WAAqB;EACpB,OAAO,KAAK,QAAQ;CACrB;;;;;CAMA,QAAQ,QAAQ,GAAS;EACxB,KAAK,eAAe,KAAK,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;CAClE;;CAGA,OAA2B;EAC1B,IAAI;GACH,OAAO,QAAQ,QAAQ,UAAU,KAAK,KAAK,CAAC;EAC7C,SAAS,OAAO;GACf,OAAO,QAAQ,OAAO,KAAK;EAC5B;CACD;;;;;;;;CASA,SAAS,OAAkC,UAAgD,CAAC,GAAuD;EAClJ,MAAM,EAAE,UAAU;EAClB,MAAM,OAAO,QAAQ,QAAQ;EAC7B,MAAM,WAAW,QAAQ,YAAY;EACrC,IAAI,QAAQ;EACZ,MAAM,aAAa,MAAM,YAAY,QAAQ,MAAM,WAAW;EAC9D,OAAO,CAAC,MAAM,KAAK,GAAG;GACrB,IAAI,SAAS,QAAQ,KAAK,GAAG,OAAO,KAAK,IAAI,OAAO,OAAO,KAAK,CAAC;GAEjE,IAAI,QAAQ,MAAM,KAAK,YAAY,IAAI,IAAI,UAAU,OAAO,KAAK,IAAI,OAAO,OAAO,KAAK;GACxF,KAAK,SAAS;GACd;EACD;EACA,OAAO,KAAK,IAAI,OAAO,MAAM,KAAK,CAAC;CACpC;;CAGA,IAAY,OAAe,SAAkB,MAAmE;EAC/G,IAAI,OAAO;GACV,KAAK,MAAM,QAAQ;GACnB,KAAK,QAAQ;EACd;EACA,OAAO;GAAE;GAAO;GAAS;EAAK;CAC/B;;CAGA,QAAgB;;CAGhB,WAAyB;EACxB,KAAK,MAAM,KAAK;EAChB,IAAI,KAAK,mBAAmB;GAC3B,KAAK,aAAa;IAAE,OAAO,KAAK;IAAmB,MAAM,UAAU,KAAK,KAAK;GAAE;GAC/E,KAAK,oBAAoB,KAAA;EAC1B;CACD;;CAGA,OAAO,IAAwB;EAC9B,MAAM,EAAE,UAAU;EAClB,IAAI,UAAU,KAAK;EACnB,KAAK,QAAQ;EAEb,KAAK,eAAe,KAAK,KAAK,QAAQ,MAAM,OAAO;EACnD,IAAI,MAAM,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,MAAM,cAAc,KAAK,eAAe,MAAM;EAChG,OAAO,KAAK,eAAe,MAAM,IAAI;GACpC,KAAK,SAAS;GACd,KAAK,eAAe,MAAM;GAC1B,UAAU;EACX;EACA,KAAK,QAAQ,KAAK,QAAQ,MAAM,OAAO,QAAQ,IAAI,KAAK,cAAc,MAAM,KAAK;EAIjF,IAAI,CAAC,SAAS,OAAO,KAAK,KAAK,OAAO,SAAS,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC;EACnE,KAAK,MAAM,QAAQ;EACnB,OAAO,CAAC,KAAK,QAAQ,CAAC;CACvB;;CAGA,KAAK,SAAwB,MAAM,EAAE,KAAK,SAAiB;EAE1D,KAAK,MAAM,MAAM;GAAE,GAAG;GAAS,QAAQ,KAAK;GAAU;EAAI,CAAkC;EAC5F,OAAO;CACR;;;;;;;CAQA,UAAU;;CAGV,MAAgB;EACf,MAAM,EAAE,QAAQ,KAAK;EACrB,MAAM,QAAQ,IAAI,MAAM,KAAK,IAAI;EACjC,OAAO;GACN,OAAO,IAAI;GACX,OAAO,IAAI;GACX,SAAS,IAAI;GACb,UAAU,KAAK,YAAY,IAAI,WAAW,KAAK,IAAI,KAAK,CAAC;GACzD,SAAS,OAAO,2BAAW,IAAI,WAAW,CAAC;GAC3C,UAAU,OAAO,4BAAY,IAAI,WAAW,CAAC;EAC9C;CACD;;CAGA,QAA6B;EAC5B,OAAO,SAAS,KAAK,IAAI;CAC1B;;CAGA,QAAyB;EACxB,OAAO,QAAQ,KAAK,KAAK;CAC1B;;CAGA,QAA6B;EAC5B,OAAO,SAAS,KAAK,IAAI;CAC1B;;CAGA,SAAS,UAAkB,OAAsB;EAChD,OAAO,KAAK,SAAS,MAAM,IAAI,QAAQ,KAAK,kBAAkB,KAAK,OAAO,KAAK,SAAS,KAAK,QAAQ,GAAG,OAAO,KAAK,UAAU,IAAI;CACnI;;CAGA,WAAW,UAAkB,OAA6C;EACzE,IAAI,CAAC,KAAK,SAAS,MAAM,IAAI,QAAQ,GAAG,OAAO,KAAA;EAC/C,MAAM,EAAE,UAAU;EAClB,MAAM,EAAE,SAAS,MAAM,OAAO,KAAK,QAAQ;EAC3C,OAAO,eACN,KAAK,SAAS,KAAK,QAAQ,GAC3B,QACC,GAAG,MAAM,MAAM,KAAK,SAAS,GAAG,GAAG,GAAG,CAAC,IACvC,GAAG,MAAM,MAAM,IAAI,WAAW,MAAM,IAAI,IAAK,IAAI,EAAG,CACtD;CACD;;CAGA,gBAAgB,OAAmE,OAAa,QAAiB,WAAyC;EACzJ,MAAM,EAAE,UAAU;EAClB,MAAM,KAAK,aAAa,MAAM,SAAS,SAAS,UAAU,OAAO,MAAM,SAAS,SAAS,MAAM,IAAI,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG;GAAE,MAAM;GAAQ;EAAM,CAAC;EAC3I,OAAO,iBAAiB,KAAK,UAAU,OAAO,OAAO,OAAO,IAAI,MAAM;CACvE;;CAGA,SAAS,MAAY,IAAU,SAAS,OAAsB;EAC7D,QAAQ,SAAS,KAAK,MAAM,MAAM,KAAK,MAAM,IAAA,CAAK,SAAS,MAAM,EAAE;CACpE;;CAGA,gBAAgC;EAC/B,OAAO,gBAAgB,KAAK,KAAK,MAAM;CACxC;;CAGA,cAAc,QAAuC;EACpD,KAAK,KAAK,SAAS,CAAC,GAAG,gBAAgB,MAAM,GAAG,GAAG,KAAK,KAAK,MAAM;CACpE;;CAGA;;CAGA,UAAgB;EACf,KAAK,MAAM,WAAW,KAAK,UAAU,OAAO,CAAC,GAAG,QAAQ;EACxD,KAAK,MAAM,QAAQ;EACnB,IAAI,KAAK,WAAW,KAAK,MAAM,QAAQ;CACxC;AACD"}
|
package/dist/session/memory.d.ts
CHANGED
|
@@ -19,9 +19,27 @@ export interface TeamMemory {
|
|
|
19
19
|
startKnown?: boolean;
|
|
20
20
|
/**
|
|
21
21
|
* Cells of the game's layers the rules changed out of the team's sight (`world.setCells`), as the team last knew
|
|
22
|
-
* them
|
|
22
|
+
* them, by layer (`CellMemory`, read with `rememberedCells`). Told as they are now when they come into sight
|
|
23
|
+
* (`cellsSeen`), and gone from here. A save keeps each layer as the value by cell
|
|
23
24
|
*
|
|
24
25
|
* @beta
|
|
25
26
|
*/
|
|
26
|
-
cells?: Record<string,
|
|
27
|
+
cells?: Record<string, CellMemory>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* What a team remembers of one layer's cells changed out of its sight (`TeamMemory.cells`), as the engine keeps it
|
|
31
|
+
* while the game runs: what the team last knew of each cell, a byte a cell of the map, and whether it remembers it, a
|
|
32
|
+
* bit a cell. Made at the map's size the first time a cell of the layer is to be remembered and never grown, so that a
|
|
33
|
+
* fire changing thousands of cells out of sight makes nothing as it goes. Read with `rememberedCells`; gone through in
|
|
34
|
+
* order of the cells. A save keeps it as the value by cell, as it always has (`teamMemory`)
|
|
35
|
+
*
|
|
36
|
+
* @beta
|
|
37
|
+
*/
|
|
38
|
+
export declare class CellMemory {
|
|
39
|
+
/** How many cells it remembers */
|
|
40
|
+
count: number;
|
|
41
|
+
/** What a save said, until the map's size is known (`ready`) */
|
|
42
|
+
private saved;
|
|
43
|
+
/** The value by cell, in order of the cells: as a save keeps it */
|
|
44
|
+
toRecord(): Record<number, number>;
|
|
27
45
|
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { defineComponent } from "../components.js";
|
|
2
|
+
//#region src/session/memory.ts
|
|
3
|
+
/**
|
|
4
|
+
* What each team remembers of the map (`teamMemory`): kept in the world for a player who comes back and a game loaded
|
|
5
|
+
* from a save, written by the sessions that show the map (`session/local.ts`), read by the debug tools and the
|
|
6
|
+
* determinism check. Of nothing but components, so that what reads it loads nothing of a session
|
|
7
|
+
*/
|
|
8
|
+
var NO_BYTES = /* @__PURE__ */ new Uint8Array(0);
|
|
9
|
+
var NO_WORDS = /* @__PURE__ */ new Uint32Array(0);
|
|
10
|
+
/**
|
|
11
|
+
* What a team remembers of one layer's cells changed out of its sight (`TeamMemory.cells`), as the engine keeps it
|
|
12
|
+
* while the game runs: what the team last knew of each cell, a byte a cell of the map, and whether it remembers it, a
|
|
13
|
+
* bit a cell. Made at the map's size the first time a cell of the layer is to be remembered and never grown, so that a
|
|
14
|
+
* fire changing thousands of cells out of sight makes nothing as it goes. Read with `rememberedCells`; gone through in
|
|
15
|
+
* order of the cells. A save keeps it as the value by cell, as it always has (`teamMemory`)
|
|
16
|
+
*
|
|
17
|
+
* @beta
|
|
18
|
+
*/
|
|
19
|
+
var CellMemory = class CellMemory {
|
|
20
|
+
/** How many cells it remembers */
|
|
21
|
+
count = 0;
|
|
22
|
+
/** What the team last knew of each cell, by cell: of those `held` says it remembers @internal */
|
|
23
|
+
known = NO_BYTES;
|
|
24
|
+
/** Whether it remembers each cell, a bit a cell, 32 to a word, the lowest bit first @internal */
|
|
25
|
+
held = NO_WORDS;
|
|
26
|
+
/** What a save said, until the map's size is known (`ready`) */
|
|
27
|
+
saved;
|
|
28
|
+
/** Of what a save keeps (`toRecord`): made at the map's size when first used @internal */
|
|
29
|
+
static of(saved) {
|
|
30
|
+
const memory = new CellMemory();
|
|
31
|
+
memory.saved = saved;
|
|
32
|
+
for (const _ in saved) memory.count++;
|
|
33
|
+
return memory;
|
|
34
|
+
}
|
|
35
|
+
/** Made at the map's size, `size` cells, the first time (what a save said put in): itself @internal */
|
|
36
|
+
ready(size) {
|
|
37
|
+
if (this.known.length === size) return this;
|
|
38
|
+
const { saved } = this;
|
|
39
|
+
const before = this.saved ? void 0 : this.toRecord();
|
|
40
|
+
this.known = new Uint8Array(size);
|
|
41
|
+
this.held = new Uint32Array(size + 31 >>> 5);
|
|
42
|
+
this.saved = void 0;
|
|
43
|
+
this.count = 0;
|
|
44
|
+
for (const record of [saved, before]) if (record) {
|
|
45
|
+
for (const at in record) if (Number(at) < size) this.remember(Number(at), record[at]);
|
|
46
|
+
}
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
/** Whether it remembers a cell @internal */
|
|
50
|
+
has(cell) {
|
|
51
|
+
return (this.held[cell >>> 5] & 1 << (cell & 31)) !== 0;
|
|
52
|
+
}
|
|
53
|
+
/** Remembers a cell as the team knew it @internal */
|
|
54
|
+
remember(cell, value) {
|
|
55
|
+
const word = cell >>> 5;
|
|
56
|
+
const bit = 1 << (cell & 31);
|
|
57
|
+
if ((this.held[word] & bit) === 0) {
|
|
58
|
+
this.held[word] |= bit;
|
|
59
|
+
this.count++;
|
|
60
|
+
}
|
|
61
|
+
this.known[cell] = value;
|
|
62
|
+
}
|
|
63
|
+
/** Forgets a cell: whether it remembered it @internal */
|
|
64
|
+
forget(cell) {
|
|
65
|
+
const word = cell >>> 5;
|
|
66
|
+
const bit = 1 << (cell & 31);
|
|
67
|
+
if ((this.held[word] & bit) === 0) return false;
|
|
68
|
+
this.held[word] &= ~bit;
|
|
69
|
+
this.count--;
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
/** The cells it remembers, each with what the team knew of it, in order of the cells @internal */
|
|
73
|
+
forEach(each) {
|
|
74
|
+
if (this.saved) {
|
|
75
|
+
for (const at in this.saved) each(Number(at), this.saved[at]);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const { held, known } = this;
|
|
79
|
+
for (let word = 0; word < held.length; word++) {
|
|
80
|
+
let bits = held[word];
|
|
81
|
+
while (bits !== 0) {
|
|
82
|
+
const low = bits & -bits;
|
|
83
|
+
const cell = (word << 5) + 31 - Math.clz32(low);
|
|
84
|
+
bits ^= low;
|
|
85
|
+
each(cell, known[cell]);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** The value by cell, in order of the cells: as a save keeps it */
|
|
90
|
+
toRecord() {
|
|
91
|
+
const record = {};
|
|
92
|
+
this.forEach((cell, value) => record[cell] = value);
|
|
93
|
+
return record;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* What each team remembers of the map, by team. Kept in the world, not in a player's connection: a player who comes
|
|
98
|
+
* back to their seat, or a game loaded from a save, remembers what was seen before. Plain data but the cells
|
|
99
|
+
* (`CellMemory`), which a save keeps as the value by cell, in the order of the layers as the team came to remember
|
|
100
|
+
* them: the save of before this was kept so, to the byte
|
|
101
|
+
*
|
|
102
|
+
* @internal
|
|
103
|
+
*/
|
|
104
|
+
var teamMemory = defineComponent({
|
|
105
|
+
id: "core.memory",
|
|
106
|
+
default: () => ({}),
|
|
107
|
+
save: (memories) => {
|
|
108
|
+
const saved = {};
|
|
109
|
+
for (const team in memories) {
|
|
110
|
+
const { cells, ...rest } = memories[team];
|
|
111
|
+
saved[team] = cells ? {
|
|
112
|
+
...memories[team],
|
|
113
|
+
cells: Object.fromEntries(Object.entries(cells).map(([layer, memory]) => [layer, memory.toRecord()]))
|
|
114
|
+
} : rest;
|
|
115
|
+
}
|
|
116
|
+
return saved;
|
|
117
|
+
},
|
|
118
|
+
load: (saved) => {
|
|
119
|
+
const memories = saved;
|
|
120
|
+
const loaded = saved;
|
|
121
|
+
for (const team in memories) {
|
|
122
|
+
const { cells } = memories[team];
|
|
123
|
+
if (cells) loaded[team].cells = Object.fromEntries(Object.entries(cells).map(([layer, record]) => [layer, CellMemory.of(record)]));
|
|
124
|
+
}
|
|
125
|
+
return loaded;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
//#endregion
|
|
129
|
+
export { CellMemory, teamMemory };
|
|
130
|
+
|
|
131
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","names":[],"sources":["../../src/session/memory.ts"],"sourcesContent":["/**\n * What each team remembers of the map (`teamMemory`): kept in the world for a player who comes back and a game loaded\n * from a save, written by the sessions that show the map (`session/local.ts`), read by the debug tools and the\n * determinism check. Of nothing but components, so that what reads it loads nothing of a session\n */\nimport { defineComponent } from '#engine/components'\nimport type { EntityId } from '#engine/entity'\nimport type { EntityState } from './protocol'\n\n/**\n * What a team remembers of the map: enemy structures out of sight as they were last seen, and camps found empty\n *\n * @beta\n */\nexport interface TeamMemory {\n\t/** Structures out of sight, the way they looked when last seen, by id */\n\tstructures: Record<EntityId, EntityState>\n\t/** The camps the team has seen empty, by id */\n\tcleared: number[]\n\t/**\n\t * Whether what stands on a map explored from the start and is no player's (trees, mines, neutral buildings) has been\n\t * put among `structures`, as it stood when the team first looked (`FogOfWar.exploredFromStart`)\n\t *\n\t * @beta\n\t */\n\tstartKnown?: boolean\n\t/**\n\t * Cells of the game's layers the rules changed out of the team's sight (`world.setCells`), as the team last knew\n\t * them, by layer (`CellMemory`, read with `rememberedCells`). Told as they are now when they come into sight\n\t * (`cellsSeen`), and gone from here. A save keeps each layer as the value by cell\n\t *\n\t * @beta\n\t */\n\tcells?: Record<string, CellMemory>\n}\n\nconst NO_BYTES = new Uint8Array(0)\nconst NO_WORDS = new Uint32Array(0)\n\n/**\n * What a team remembers of one layer's cells changed out of its sight (`TeamMemory.cells`), as the engine keeps it\n * while the game runs: what the team last knew of each cell, a byte a cell of the map, and whether it remembers it, a\n * bit a cell. Made at the map's size the first time a cell of the layer is to be remembered and never grown, so that a\n * fire changing thousands of cells out of sight makes nothing as it goes. Read with `rememberedCells`; gone through in\n * order of the cells. A save keeps it as the value by cell, as it always has (`teamMemory`)\n *\n * @beta\n */\nexport class CellMemory {\n\t/** How many cells it remembers */\n\tcount = 0\n\t/** What the team last knew of each cell, by cell: of those `held` says it remembers @internal */\n\tknown: Uint8Array = NO_BYTES\n\t/** Whether it remembers each cell, a bit a cell, 32 to a word, the lowest bit first @internal */\n\theld: Uint32Array = NO_WORDS\n\t/** What a save said, until the map's size is known (`ready`) */\n\tprivate saved: Record<number, number> | undefined\n\n\t/** Of what a save keeps (`toRecord`): made at the map's size when first used @internal */\n\tstatic of(saved: Record<number, number>): CellMemory {\n\t\tconst memory = new CellMemory()\n\t\tmemory.saved = saved\n\t\tfor (const _ in saved) memory.count++\n\t\treturn memory\n\t}\n\n\t/** Made at the map's size, `size` cells, the first time (what a save said put in): itself @internal */\n\tready(size: number): this {\n\t\tif (this.known.length === size) return this\n\t\tconst { saved } = this\n\t\tconst before = this.saved ? undefined : this.toRecord()\n\t\tthis.known = new Uint8Array(size)\n\t\tthis.held = new Uint32Array((size + 31) >>> 5)\n\t\tthis.saved = undefined\n\t\tthis.count = 0\n\t\tfor (const record of [saved, before]) if (record) for (const at in record) if (Number(at) < size) this.remember(Number(at), record[at])\n\t\treturn this\n\t}\n\n\t/** Whether it remembers a cell @internal */\n\thas(cell: number): boolean {\n\t\treturn (this.held[cell >>> 5] & (1 << (cell & 31))) !== 0\n\t}\n\n\t/** Remembers a cell as the team knew it @internal */\n\tremember(cell: number, value: number): void {\n\t\tconst word = cell >>> 5\n\t\tconst bit = 1 << (cell & 31)\n\t\tif ((this.held[word] & bit) === 0) {\n\t\t\tthis.held[word] |= bit\n\t\t\tthis.count++\n\t\t}\n\t\tthis.known[cell] = value\n\t}\n\n\t/** Forgets a cell: whether it remembered it @internal */\n\tforget(cell: number): boolean {\n\t\tconst word = cell >>> 5\n\t\tconst bit = 1 << (cell & 31)\n\t\tif ((this.held[word] & bit) === 0) return false\n\t\tthis.held[word] &= ~bit\n\t\tthis.count--\n\t\treturn true\n\t}\n\n\t/** The cells it remembers, each with what the team knew of it, in order of the cells @internal */\n\tforEach(each: (cell: number, value: number) => void): void {\n\t\tif (this.saved) {\n\t\t\tfor (const at in this.saved) each(Number(at), this.saved[at])\n\t\t\treturn\n\t\t}\n\t\tconst { held, known } = this\n\t\tfor (let word = 0; word < held.length; word++) {\n\t\t\tlet bits = held[word]\n\t\t\twhile (bits !== 0) {\n\t\t\t\tconst low = bits & -bits\n\t\t\t\tconst cell = (word << 5) + 31 - Math.clz32(low)\n\t\t\t\tbits ^= low\n\t\t\t\teach(cell, known[cell])\n\t\t\t}\n\t\t}\n\t}\n\n\t/** The value by cell, in order of the cells: as a save keeps it */\n\ttoRecord(): Record<number, number> {\n\t\tconst record: Record<number, number> = {}\n\t\tthis.forEach((cell, value) => (record[cell] = value))\n\t\treturn record\n\t}\n}\n\n/** What a save keeps of what a team remembers: each layer's cells as the value by cell */\ntype SavedTeamMemory = Omit<TeamMemory, 'cells'> & { cells?: Record<string, Record<number, number>> }\n\n/**\n * What each team remembers of the map, by team. Kept in the world, not in a player's connection: a player who comes\n * back to their seat, or a game loaded from a save, remembers what was seen before. Plain data but the cells\n * (`CellMemory`), which a save keeps as the value by cell, in the order of the layers as the team came to remember\n * them: the save of before this was kept so, to the byte\n *\n * @internal\n */\nexport const teamMemory = defineComponent<Record<number, TeamMemory>>({\n\tid: 'core.memory',\n\tdefault: () => ({}),\n\tsave: (memories) => {\n\t\tconst saved: Record<number, SavedTeamMemory> = {}\n\t\tfor (const team in memories) {\n\t\t\tconst { cells, ...rest } = memories[team]\n\t\t\t// `cells` where it is among the fields, as the plain memory had it\n\t\t\tsaved[team] = cells\n\t\t\t\t? { ...memories[team], cells: Object.fromEntries(Object.entries(cells).map(([layer, memory]) => [layer, memory.toRecord()])) }\n\t\t\t\t: rest\n\t\t}\n\t\treturn saved\n\t},\n\tload: (saved) => {\n\t\t// in place: the save's copy is the world's from here (`restoreWorld`)\n\t\tconst memories = saved as Record<number, SavedTeamMemory>\n\t\tconst loaded = saved as Record<number, TeamMemory>\n\t\tfor (const team in memories) {\n\t\t\tconst { cells } = memories[team]\n\t\t\tif (cells) loaded[team].cells = Object.fromEntries(Object.entries(cells).map(([layer, record]) => [layer, CellMemory.of(record)]))\n\t\t}\n\t\treturn loaded\n\t}\n})\n"],"mappings":"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"}
|