@v12-engine/engine 0.1.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abilities/amounts.d.ts +28 -0
- package/dist/abilities/amounts.js +74 -0
- package/dist/abilities/amounts.js.map +1 -0
- package/dist/abilities/buffs.d.ts +106 -6
- package/dist/abilities/buffs.js +443 -0
- package/dist/abilities/buffs.js.map +1 -0
- package/dist/abilities/castTold.d.ts +2 -0
- package/dist/abilities/castTold.js +66 -0
- package/dist/abilities/castTold.js.map +1 -0
- package/dist/abilities/chance.d.ts +38 -0
- package/dist/abilities/chance.js +77 -0
- package/dist/abilities/chance.js.map +1 -0
- package/dist/abilities/charges.d.ts +18 -0
- package/dist/abilities/charges.js +101 -0
- package/dist/abilities/charges.js.map +1 -0
- package/dist/abilities/control.d.ts +28 -0
- package/dist/abilities/control.js +113 -0
- package/dist/abilities/control.js.map +1 -0
- package/dist/abilities/dispel.js +51 -0
- package/dist/abilities/dispel.js.map +1 -0
- package/dist/abilities/effectFields.d.ts +1 -1
- package/dist/abilities/effectFields.js +676 -0
- package/dist/abilities/effectFields.js.map +1 -0
- package/dist/abilities/effectIndex.d.ts +27 -0
- package/dist/abilities/effectIndex.js +64 -0
- package/dist/abilities/effectIndex.js.map +1 -0
- package/dist/abilities/effects/buff.d.ts +9 -3
- package/dist/abilities/effects/buff.js +84 -0
- package/dist/abilities/effects/buff.js.map +1 -0
- package/dist/abilities/effects/conditions.d.ts +2 -0
- package/dist/abilities/effects/conditions.js +41 -0
- package/dist/abilities/effects/conditions.js.map +1 -0
- package/dist/abilities/effects/core.js +54 -0
- package/dist/abilities/effects/core.js.map +1 -0
- package/dist/abilities/effects/damage.d.ts +1 -1
- package/dist/abilities/effects/damage.js +43 -0
- package/dist/abilities/effects/damage.js.map +1 -0
- package/dist/abilities/effects/heal.d.ts +2 -2
- package/dist/abilities/effects/heal.js +51 -0
- package/dist/abilities/effects/heal.js.map +1 -0
- package/dist/abilities/effects/missile.d.ts +13 -1
- package/dist/abilities/effects/missile.js +104 -0
- package/dist/abilities/effects/missile.js.map +1 -0
- package/dist/abilities/effects/morph.d.ts +5 -0
- package/dist/abilities/effects/morph.js +43 -0
- package/dist/abilities/effects/morph.js.map +1 -0
- package/dist/abilities/effects/moves.d.ts +16 -4
- package/dist/abilities/effects/moves.js +212 -0
- package/dist/abilities/effects/moves.js.map +1 -0
- package/dist/abilities/effects/passives.d.ts +19 -9
- package/dist/abilities/effects/passives.js +131 -0
- package/dist/abilities/effects/passives.js.map +1 -0
- package/dist/abilities/effects/proxy.d.ts +5 -0
- package/dist/abilities/effects/proxy.js +60 -0
- package/dist/abilities/effects/proxy.js.map +1 -0
- package/dist/abilities/effects/sight.d.ts +2 -2
- package/dist/abilities/effects/sight.js +39 -0
- package/dist/abilities/effects/sight.js.map +1 -0
- package/dist/abilities/effects/spawn.d.ts +5 -2
- package/dist/abilities/effects/spawn.js +40 -0
- package/dist/abilities/effects/spawn.js.map +1 -0
- package/dist/abilities/effects/timed.d.ts +2 -2
- package/dist/abilities/effects/timed.js +96 -0
- package/dist/abilities/effects/timed.js.map +1 -0
- package/dist/abilities/effects/trade.d.ts +1 -1
- package/dist/abilities/effects/trade.js +25 -0
- package/dist/abilities/effects/trade.js.map +1 -0
- package/dist/abilities/effects.d.ts +97 -23
- package/dist/abilities/effects.js +860 -0
- package/dist/abilities/effects.js.map +1 -0
- package/dist/abilities/land.d.ts +38 -4
- package/dist/abilities/land.js +189 -0
- package/dist/abilities/land.js.map +1 -0
- package/dist/abilities/recast.d.ts +45 -0
- package/dist/abilities/recast.js +118 -0
- package/dist/abilities/recast.js.map +1 -0
- package/dist/abilities/scaled.js +40 -0
- package/dist/abilities/scaled.js.map +1 -0
- package/dist/abilities/screen.d.ts +6 -0
- package/dist/abilities/screen.js +83 -0
- package/dist/abilities/screen.js.map +1 -0
- package/dist/abilities/shapes.d.ts +66 -0
- package/dist/abilities/shapes.js +122 -0
- package/dist/abilities/shapes.js.map +1 -0
- package/dist/abilities/text.d.ts +14 -2
- package/dist/abilities/text.js +204 -0
- package/dist/abilities/text.js.map +1 -0
- package/dist/abilities/triggers.d.ts +98 -0
- package/dist/abilities/triggers.js +351 -0
- package/dist/abilities/triggers.js.map +1 -0
- package/dist/abilityChanges.d.ts +131 -0
- package/dist/abilityChanges.js +345 -0
- package/dist/abilityChanges.js.map +1 -0
- package/dist/ai/area.d.ts +4 -1
- package/dist/ai/brain.d.ts +4 -1
- package/dist/ai/brain.js +844 -0
- package/dist/ai/brain.js.map +1 -0
- package/dist/ai/budget.js +74 -0
- package/dist/ai/budget.js.map +1 -0
- package/dist/ai/checks.d.ts +9 -1
- package/dist/ai/checks.js +242 -0
- package/dist/ai/checks.js.map +1 -0
- package/dist/ai/computer.d.ts +11 -4
- package/dist/ai/computer.js +251 -0
- package/dist/ai/computer.js.map +1 -0
- package/dist/ai/defence.d.ts +4 -0
- package/dist/ai/defence.js +430 -0
- package/dist/ai/defence.js.map +1 -0
- package/dist/ai/define.d.ts +3 -2
- package/dist/ai/define.js +31 -0
- package/dist/ai/define.js.map +1 -0
- package/dist/ai/economy.d.ts +10 -7
- package/dist/ai/economy.js +780 -0
- package/dist/ai/economy.js.map +1 -0
- package/dist/ai/geometry.js +38 -0
- package/dist/ai/geometry.js.map +1 -0
- package/dist/ai/goals.d.ts +1 -0
- package/dist/ai/goals.js +560 -0
- package/dist/ai/goals.js.map +1 -0
- package/dist/ai/knowledge.d.ts +72 -7
- package/dist/ai/knowledge.js +804 -0
- package/dist/ai/knowledge.js.map +1 -0
- package/dist/ai/lanes.d.ts +10 -2
- package/dist/ai/lanes.js +715 -0
- package/dist/ai/lanes.js.map +1 -0
- package/dist/ai/melee/build.js +264 -0
- package/dist/ai/melee/build.js.map +1 -0
- package/dist/ai/melee/goals.d.ts +7 -0
- package/dist/ai/melee/goals.js +720 -0
- package/dist/ai/melee/goals.js.map +1 -0
- package/dist/ai/melee/heroes.js +68 -0
- package/dist/ai/melee/heroes.js.map +1 -0
- package/dist/ai/melee/index.d.ts +1 -1
- package/dist/ai/melee/index.js +51 -0
- package/dist/ai/melee/index.js.map +1 -0
- package/dist/ai/melee/production.js +29 -0
- package/dist/ai/melee/production.js.map +1 -0
- package/dist/ai/melee/surrender.js +64 -0
- package/dist/ai/melee/surrender.js.map +1 -0
- package/dist/ai/micro.d.ts +9 -0
- package/dist/ai/micro.js +1316 -0
- package/dist/ai/micro.js.map +1 -0
- package/dist/ai/mission.d.ts +9 -2
- package/dist/ai/mission.js +538 -0
- package/dist/ai/mission.js.map +1 -0
- package/dist/ai/missionRules.d.ts +1 -1
- package/dist/ai/missionRules.js +26 -0
- package/dist/ai/missionRules.js.map +1 -0
- package/dist/ai/module.d.ts +6 -2
- package/dist/ai/module.js +37 -0
- package/dist/ai/module.js.map +1 -0
- package/dist/ai/options.d.ts +3 -3
- package/dist/ai/plans/build.d.ts +20 -1
- package/dist/ai/plans/build.js +608 -0
- package/dist/ai/plans/build.js.map +1 -0
- package/dist/ai/plans/placement.d.ts +4 -1
- package/dist/ai/plans/placement.js +295 -0
- package/dist/ai/plans/placement.js.map +1 -0
- package/dist/ai/plans/plans.d.ts +9 -0
- package/dist/ai/plans/plans.js +110 -0
- package/dist/ai/plans/plans.js.map +1 -0
- package/dist/ai/plans/production.d.ts +14 -2
- package/dist/ai/plans/production.js +434 -0
- package/dist/ai/plans/production.js.map +1 -0
- package/dist/ai/plans/purse.d.ts +6 -3
- package/dist/ai/plans/purse.js +139 -0
- package/dist/ai/plans/purse.js.map +1 -0
- package/dist/ai/plans/tech.d.ts +6 -0
- package/dist/ai/plans/tech.js +122 -0
- package/dist/ai/plans/tech.js.map +1 -0
- package/dist/ai/profiles.d.ts +4 -4
- package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
- package/dist/ai/profiles.js.map +1 -0
- package/dist/ai/reach.js +54 -0
- package/dist/ai/reach.js.map +1 -0
- package/dist/ai/report.d.ts +8 -0
- package/dist/ai/report.js +87 -0
- package/dist/ai/report.js.map +1 -0
- package/dist/ai/roles.d.ts +4 -0
- package/dist/ai/roles.js +207 -0
- package/dist/ai/roles.js.map +1 -0
- package/dist/ai/rules.d.ts +8 -2
- package/dist/ai/rules.js +416 -0
- package/dist/ai/rules.js.map +1 -0
- package/dist/ai/scouting.d.ts +6 -0
- package/dist/ai/scouting.js +324 -0
- package/dist/ai/scouting.js.map +1 -0
- package/dist/ai/settings.js +99 -0
- package/dist/ai/settings.js.map +1 -0
- package/dist/ai/squads.d.ts +21 -2
- package/dist/ai/squads.js +916 -0
- package/dist/ai/squads.js.map +1 -0
- package/dist/ai/strength.js +320 -0
- package/dist/ai/strength.js.map +1 -0
- package/dist/ai/task.d.ts +3 -1
- package/dist/ai/task.js +17 -0
- package/dist/ai/task.js.map +1 -0
- package/dist/ai/tasks/attack.js +24 -0
- package/dist/ai/tasks/attack.js.map +1 -0
- package/dist/ai/tasks/capture.d.ts +3 -3
- package/dist/ai/tasks/capture.js +37 -0
- package/dist/ai/tasks/capture.js.map +1 -0
- package/dist/ai/tasks/creep.js +29 -0
- package/dist/ai/tasks/creep.js.map +1 -0
- package/dist/ai/tasks/defend.js +61 -0
- package/dist/ai/tasks/defend.js.map +1 -0
- package/dist/ai/tasks/drop.js +81 -0
- package/dist/ai/tasks/drop.js.map +1 -0
- package/dist/ai/tasks/escort.js +59 -0
- package/dist/ai/tasks/escort.js.map +1 -0
- package/dist/ai/tasks/gather.js +48 -0
- package/dist/ai/tasks/gather.js.map +1 -0
- package/dist/ai/tasks/harass.js +39 -0
- package/dist/ai/tasks/harass.js.map +1 -0
- package/dist/ai/tasks/hold.js +32 -0
- package/dist/ai/tasks/hold.js.map +1 -0
- package/dist/ai/tasks/index.js +34 -0
- package/dist/ai/tasks/index.js.map +1 -0
- package/dist/ai/tasks/move.js +26 -0
- package/dist/ai/tasks/move.js.map +1 -0
- package/dist/ai/tasks/patrol.js +59 -0
- package/dist/ai/tasks/patrol.js.map +1 -0
- package/dist/ai/tasks/retreat.js +28 -0
- package/dist/ai/tasks/retreat.js.map +1 -0
- package/dist/ai/tasks/scout.js +73 -0
- package/dist/ai/tasks/scout.js.map +1 -0
- package/dist/ai/tasks/shared.d.ts +1 -1
- package/dist/ai/tasks/shared.js +137 -0
- package/dist/ai/tasks/shared.js.map +1 -0
- package/dist/ai/team.d.ts +18 -1
- package/dist/ai/team.js +492 -0
- package/dist/ai/team.js.map +1 -0
- package/dist/ai/threat.d.ts +6 -0
- package/dist/ai/threat.js +206 -0
- package/dist/ai/threat.js.map +1 -0
- package/dist/ai/view.d.ts +21 -7
- package/dist/ai/view.js +677 -0
- package/dist/ai/view.js.map +1 -0
- package/dist/ai/waves.d.ts +6 -0
- package/dist/ai/waves.js +410 -0
- package/dist/ai/waves.js.map +1 -0
- package/dist/ai.js +54 -6239
- package/dist/aiTesting.d.ts +6 -3
- package/dist/aiTesting.js +229 -0
- package/dist/aiTesting.js.map +1 -0
- package/dist/areas.d.ts +4 -1
- package/dist/areas.js +295 -0
- package/dist/areas.js.map +1 -0
- package/dist/attacks.d.ts +3 -3
- package/dist/attacks.js +127 -0
- package/dist/attacks.js.map +1 -0
- package/dist/burning.d.ts +267 -0
- package/dist/burning.js +795 -0
- package/dist/burning.js.map +1 -0
- package/dist/bytes.js +21 -0
- package/dist/bytes.js.map +1 -0
- package/dist/callings.d.ts +71 -0
- package/dist/callings.js +157 -0
- package/dist/callings.js.map +1 -0
- package/dist/cameraOrders.d.ts +78 -0
- package/dist/cameraOrders.js +114 -0
- package/dist/cameraOrders.js.map +1 -0
- package/dist/camps.d.ts +70 -4
- package/dist/camps.js +501 -0
- package/dist/camps.js.map +1 -0
- package/dist/capture.d.ts +15 -3
- package/dist/capture.js +304 -0
- package/dist/capture.js.map +1 -0
- package/dist/cellLayers.d.ts +78 -13
- package/dist/cellLayers.js +275 -0
- package/dist/cellLayers.js.map +1 -0
- package/dist/cellPatches.d.ts +24 -0
- package/dist/cellPatches.js +73 -0
- package/dist/cellPatches.js.map +1 -0
- package/dist/cinematics.d.ts +10 -5
- package/dist/cinematics.js +161 -0
- package/dist/cinematics.js.map +1 -0
- package/dist/clock.d.ts +2 -2
- package/dist/clock.js +78 -0
- package/dist/clock.js.map +1 -0
- package/dist/commands.d.ts +36 -4
- package/dist/commands.js +636 -0
- package/dist/commands.js.map +1 -0
- package/dist/components.d.ts +31 -10
- package/dist/components.js +74 -0
- package/dist/components.js.map +1 -0
- package/dist/computers.d.ts +4 -4
- package/dist/computers.js +194 -0
- package/dist/computers.js.map +1 -0
- package/dist/concealment.d.ts +25 -2
- package/dist/concealment.js +409 -0
- package/dist/concealment.js.map +1 -0
- package/dist/coreComponents.js +130 -0
- package/dist/coreComponents.js.map +1 -0
- package/dist/createGame.d.ts +306 -0
- package/dist/createGame.js +405 -0
- package/dist/createGame.js.map +1 -0
- package/dist/dashing.d.ts +18 -2
- package/dist/dashing.js +41 -0
- package/dist/dashing.js.map +1 -0
- package/dist/debug.d.ts +8 -0
- package/dist/debug.js +5 -3
- package/dist/debug2.js +76 -0
- package/dist/debug2.js.map +1 -0
- package/dist/debugCommands.d.ts +6 -6
- package/dist/debugCommands.js +537 -0
- package/dist/debugCommands.js.map +1 -0
- package/dist/debugging.d.ts +1 -0
- package/dist/defaultSets.d.ts +183 -0
- package/dist/defaultSets.js +216 -0
- package/dist/defaultSets.js.map +1 -0
- package/dist/definitions.d.ts +6 -0
- package/dist/definitions.js +78 -0
- package/dist/definitions.js.map +1 -0
- package/dist/defs.d.ts +1895 -165
- package/dist/defs.js +380 -0
- package/dist/defs.js.map +1 -0
- package/dist/denying.d.ts +4 -4
- package/dist/denying.js +106 -0
- package/dist/denying.js.map +1 -0
- package/dist/destructibles.d.ts +2 -2
- package/dist/destructibles.js +36 -0
- package/dist/destructibles.js.map +1 -0
- package/dist/determinism.d.ts +4 -4
- package/dist/determinism.js +247 -0
- package/dist/determinism.js.map +1 -0
- package/dist/dialog.d.ts +17 -2
- package/dist/dialog.js +108 -0
- package/dist/dialog.js.map +1 -0
- package/dist/effectRefs.js +28 -0
- package/dist/effectRefs.js.map +1 -0
- package/dist/effects.d.ts +27 -11
- package/dist/effects.js +110 -0
- package/dist/effects.js.map +1 -0
- package/dist/endings.d.ts +1 -1
- package/dist/endings.js +78 -0
- package/dist/endings.js.map +1 -0
- package/dist/engagement.d.ts +40 -6
- package/dist/engagement.js +530 -0
- package/dist/engagement.js.map +1 -0
- package/dist/engineEvents.d.ts +72 -9
- package/dist/engineEvents.js +520 -0
- package/dist/engineEvents.js.map +1 -0
- package/dist/entity.d.ts +275 -26
- package/dist/entity.js +441 -0
- package/dist/entity.js.map +1 -0
- package/dist/entityIndex.d.ts +10 -3
- package/dist/entityIndex.js +149 -0
- package/dist/entityIndex.js.map +1 -0
- package/dist/errors.d.ts +6 -2
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +11 -5
- package/dist/events.js +158 -0
- package/dist/events.js.map +1 -0
- package/dist/exactMath.js +273 -0
- package/dist/exactMath.js.map +1 -0
- package/dist/features.d.ts +1 -1
- package/dist/features.js +127 -0
- package/dist/features.js.map +1 -0
- package/dist/fields.d.ts +25 -5
- package/dist/fields.js +140 -0
- package/dist/fields.js.map +1 -0
- package/dist/fixture.d.ts +3 -3
- package/dist/fixture.js +512 -0
- package/dist/fixture.js.map +1 -0
- package/dist/fog.d.ts +26 -3
- package/dist/fog.js +333 -0
- package/dist/fog.js.map +1 -0
- package/dist/foliage.d.ts +476 -0
- package/dist/foliage.js +1478 -0
- package/dist/foliage.js.map +1 -0
- package/dist/foliageDebug.d.ts +57 -0
- package/dist/foliageDebug.js +172 -0
- package/dist/foliageDebug.js.map +1 -0
- package/dist/foliageRegrowth.d.ts +20 -0
- package/dist/foliageRegrowth.js +332 -0
- package/dist/foliageRegrowth.js.map +1 -0
- package/dist/formState.d.ts +67 -0
- package/dist/formState.js +65 -0
- package/dist/formState.js.map +1 -0
- package/dist/formation.d.ts +46 -8
- package/dist/formation.js +297 -0
- package/dist/formation.js.map +1 -0
- package/dist/forms.d.ts +58 -0
- package/dist/forms.js +146 -0
- package/dist/forms.js.map +1 -0
- package/dist/friendlyFire.d.ts +2 -2
- package/dist/friendlyFire.js +37 -0
- package/dist/friendlyFire.js.map +1 -0
- package/dist/game.d.ts +141 -48
- package/dist/game.js +834 -0
- package/dist/game.js.map +1 -0
- package/dist/gameData.d.ts +96 -22
- package/dist/gameData.js +1690 -0
- package/dist/gameData.js.map +1 -0
- package/dist/gameFiles.d.ts +3 -3
- package/dist/gameFiles.js +14 -0
- package/dist/gameFiles.js.map +1 -0
- package/dist/gates.js +92 -0
- package/dist/gates.js.map +1 -0
- package/dist/generate.d.ts +28 -1
- package/dist/generate.js +1062 -0
- package/dist/generate.js.map +1 -0
- package/dist/generateWorker.d.ts +7 -3
- package/dist/generateWorker.js +86 -0
- package/dist/generateWorker.js.map +1 -0
- package/dist/grid.d.ts +9 -0
- package/dist/grid.js +102 -0
- package/dist/grid.js.map +1 -0
- package/dist/ground.d.ts +17 -1
- package/dist/ground.js +375 -0
- package/dist/ground.js.map +1 -0
- package/dist/groundObjects.d.ts +70 -0
- package/dist/groundObjects.js +371 -0
- package/dist/groundObjects.js.map +1 -0
- package/dist/groundSpeed.d.ts +20 -3
- package/dist/groundSpeed.js +117 -0
- package/dist/groundSpeed.js.map +1 -0
- package/dist/hero.d.ts +126 -10
- package/dist/hero.js +432 -0
- package/dist/hero.js.map +1 -0
- package/dist/holds.d.ts +94 -0
- package/dist/holds.js +305 -0
- package/dist/holds.js.map +1 -0
- package/dist/home.d.ts +1 -1
- package/dist/home.js +30 -0
- package/dist/home.js.map +1 -0
- package/dist/hooks.d.ts +339 -57
- package/dist/hooks.js +105 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hotReload.d.ts +6 -5
- package/dist/hotReload.js +145 -0
- package/dist/hotReload.js.map +1 -0
- package/dist/ids.d.ts +3 -3
- package/dist/ids.js +30 -0
- package/dist/ids.js.map +1 -0
- package/dist/idsFile.d.ts +36 -0
- package/dist/idsFile.js +134 -0
- package/dist/idsFile.js.map +1 -0
- package/dist/index.d.ts +105 -68
- package/dist/index.js +194 -4701
- package/dist/inspect.d.ts +29 -2
- package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
- package/dist/inspect.js.map +1 -0
- package/dist/inventory.d.ts +14 -1
- package/dist/inventory.js +84 -0
- package/dist/inventory.js.map +1 -0
- package/dist/items.d.ts +136 -8
- package/dist/items.js +585 -0
- package/dist/items.js.map +1 -0
- package/dist/lanes.d.ts +12 -3
- package/dist/lanes.js +496 -0
- package/dist/lanes.js.map +1 -0
- package/dist/life.d.ts +6 -2
- package/dist/life.js +287 -0
- package/dist/life.js.map +1 -0
- package/dist/log.d.ts +26 -3
- package/dist/log.js +192 -0
- package/dist/log.js.map +1 -0
- package/dist/manaBurn.d.ts +2 -2
- package/dist/manaBurn.js +75 -0
- package/dist/manaBurn.js.map +1 -0
- package/dist/map/file.d.ts +56 -3
- package/dist/map/file.js +264 -0
- package/dist/map/file.js.map +1 -0
- package/dist/map/images.js +61 -0
- package/dist/map/images.js.map +1 -0
- package/dist/map/look.d.ts +1 -1
- package/dist/map/look.js +30 -0
- package/dist/map/look.js.map +1 -0
- package/dist/map/pathProfile.js +183 -0
- package/dist/map/pathProfile.js.map +1 -0
- package/dist/map/resize.d.ts +4 -0
- package/dist/map/resize.js +136 -0
- package/dist/map/resize.js.map +1 -0
- package/dist/map/schema.js +257 -0
- package/dist/map/schema.js.map +1 -0
- package/dist/map/terrain.js +214 -0
- package/dist/map/terrain.js.map +1 -0
- package/dist/map/types.d.ts +92 -13
- package/dist/map/types.js +251 -0
- package/dist/map/types.js.map +1 -0
- package/dist/mapCheck/cells.js +94 -0
- package/dist/mapCheck/cells.js.map +1 -0
- package/dist/mapCheck/rules/foliage.d.ts +9 -0
- package/dist/mapCheck/rules/foliage.js +83 -0
- package/dist/mapCheck/rules/foliage.js.map +1 -0
- package/dist/mapCheck/rules/names.js +39 -0
- package/dist/mapCheck/rules/names.js.map +1 -0
- package/dist/mapCheck/rules/objects.d.ts +1 -1
- package/dist/mapCheck/rules/objects.js +56 -0
- package/dist/mapCheck/rules/objects.js.map +1 -0
- package/dist/mapCheck/rules/paths.js +32 -0
- package/dist/mapCheck/rules/paths.js.map +1 -0
- package/dist/mapCheck/rules/players.js +20 -0
- package/dist/mapCheck/rules/players.js.map +1 -0
- package/dist/mapCheck/rules/races.js +56 -0
- package/dist/mapCheck/rules/races.js.map +1 -0
- package/dist/mapCheck/rules/random.js +47 -0
- package/dist/mapCheck/rules/random.js.map +1 -0
- package/dist/mapCheck/rules/regions.js +30 -0
- package/dist/mapCheck/rules/regions.js.map +1 -0
- package/dist/mapCheck/rules/targets.js +31 -0
- package/dist/mapCheck/rules/targets.js.map +1 -0
- package/dist/mapCheck/rules/walking.js +45 -0
- package/dist/mapCheck/rules/walking.js.map +1 -0
- package/dist/mapCheck.d.ts +2 -2
- package/dist/mapCheck.js +63 -0
- package/dist/mapCheck.js.map +1 -0
- package/dist/mapFields.d.ts +25 -2
- package/dist/mapFields.js +134 -0
- package/dist/mapFields.js.map +1 -0
- package/dist/mapFile.js +176 -0
- package/dist/mapFile.js.map +1 -0
- package/dist/mapMeasure.d.ts +8 -0
- package/dist/mapMeasure.js +283 -0
- package/dist/mapMeasure.js.map +1 -0
- package/dist/mapMerge.d.ts +1 -0
- package/dist/mapMerge.js +172 -0
- package/dist/mapMerge.js.map +1 -0
- package/dist/mapObjectives.js +138 -0
- package/dist/mapObjectives.js.map +1 -0
- package/dist/mapObjects.js +80 -0
- package/dist/mapObjects.js.map +1 -0
- package/dist/math.d.ts +37 -7
- package/dist/math.js +155 -0
- package/dist/math.js.map +1 -0
- package/dist/messages.d.ts +71 -4
- package/dist/messages.js +29 -0
- package/dist/messages.js.map +1 -0
- package/dist/missionRules.d.ts +10 -2
- package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
- package/dist/missionRules.js.map +1 -0
- package/dist/mods.d.ts +39 -20
- package/dist/mods.js +271 -0
- package/dist/mods.js.map +1 -0
- package/dist/moves.d.ts +87 -0
- package/dist/moves.js +539 -0
- package/dist/moves.js.map +1 -0
- package/dist/names.d.ts +7 -0
- package/dist/names.js +122 -0
- package/dist/names.js.map +1 -0
- package/dist/navigation/agentParams.js +14 -0
- package/dist/navigation/agentParams.js.map +1 -0
- package/dist/navigation/air.d.ts +7 -3
- package/dist/navigation/air.js +401 -0
- package/dist/navigation/air.js.map +1 -0
- package/dist/navigation/builds.d.ts +34 -2
- package/dist/navigation/builds.js +287 -0
- package/dist/navigation/builds.js.map +1 -0
- package/dist/navigation/groundAreas.d.ts +59 -1
- package/dist/navigation/groundAreas.js +407 -0
- package/dist/navigation/groundAreas.js.map +1 -0
- package/dist/navigation/navigation.d.ts +98 -9
- package/dist/navigation/recast.d.ts +194 -18
- package/dist/navigation/recast.js +1379 -0
- package/dist/navigation/recast.js.map +1 -0
- package/dist/navigation/sidePaths.d.ts +8 -3
- package/dist/navigation/sidePaths.js +241 -0
- package/dist/navigation/sidePaths.js.map +1 -0
- package/dist/navigation/sized.js +243 -0
- package/dist/navigation/sized.js.map +1 -0
- package/dist/nearest.js +32 -0
- package/dist/nearest.js.map +1 -0
- package/dist/noise.js +59 -0
- package/dist/noise.js.map +1 -0
- package/dist/objectives.d.ts +12 -3
- package/dist/objectives.js +144 -0
- package/dist/objectives.js.map +1 -0
- package/dist/orders/basic.d.ts +5 -5
- package/dist/orders/basic.js +417 -0
- package/dist/orders/basic.js.map +1 -0
- package/dist/orders/build.js +278 -0
- package/dist/orders/build.js.map +1 -0
- package/dist/orders/cast.d.ts +13 -3
- package/dist/orders/cast.js +558 -0
- package/dist/orders/cast.js.map +1 -0
- package/dist/orders/facts.js +16 -0
- package/dist/orders/facts.js.map +1 -0
- package/dist/orders/harvest.d.ts +21 -5
- package/dist/orders/harvest.js +540 -0
- package/dist/orders/harvest.js.map +1 -0
- package/dist/orders/idle.d.ts +3 -1
- package/dist/orders/idle.js +234 -0
- package/dist/orders/idle.js.map +1 -0
- package/dist/orders/items.js +92 -0
- package/dist/orders/items.js.map +1 -0
- package/dist/orders/queue.js +108 -0
- package/dist/orders/queue.js.map +1 -0
- package/dist/orders/waiting.d.ts +39 -0
- package/dist/orders/waiting.js +149 -0
- package/dist/orders/waiting.js.map +1 -0
- package/dist/pack.schema.js +13 -0
- package/dist/pack.schema.js.map +1 -0
- package/dist/pack.schema.json +7622 -841
- package/dist/packs/director/index.d.ts +13 -5
- package/dist/packs/director/index.js +204 -0
- package/dist/packs/director/index.js.map +1 -0
- package/dist/packs/heroes/campaign.d.ts +3 -2
- package/dist/packs/heroes/campaign.js +241 -0
- package/dist/packs/heroes/campaign.js.map +1 -0
- package/dist/packs/heroes/carry.d.ts +6 -0
- package/dist/packs/heroes/carry.js +112 -0
- package/dist/packs/heroes/carry.js.map +1 -0
- package/dist/packs/heroes/commands.js +115 -0
- package/dist/packs/heroes/commands.js.map +1 -0
- package/dist/packs/heroes/fallen.d.ts +43 -0
- package/dist/packs/heroes/fallen.js +61 -0
- package/dist/packs/heroes/fallen.js.map +1 -0
- package/dist/packs/heroes/hire.js +60 -0
- package/dist/packs/heroes/hire.js.map +1 -0
- package/dist/packs/heroes/index.d.ts +7 -6
- package/dist/packs/heroes/index.js +130 -0
- package/dist/packs/heroes/index.js.map +1 -0
- package/dist/packs/heroes/loop.d.ts +95 -0
- package/dist/packs/heroes/loop.js +250 -0
- package/dist/packs/heroes/loop.js.map +1 -0
- package/dist/packs/heroes/making.d.ts +6 -3
- package/dist/packs/heroes/making.js +55 -0
- package/dist/packs/heroes/making.js.map +1 -0
- package/dist/packs/heroes/respawn.d.ts +3 -3
- package/dist/packs/heroes/respawn.js +87 -0
- package/dist/packs/heroes/respawn.js.map +1 -0
- package/dist/packs/heroes/sets.d.ts +32 -0
- package/dist/packs/heroes/sets.js +51 -0
- package/dist/packs/heroes/sets.js.map +1 -0
- package/dist/packs/heroes/spells.d.ts +16 -0
- package/dist/packs/heroes/spells.js +269 -0
- package/dist/packs/heroes/spells.js.map +1 -0
- package/dist/packs/items/defaults.d.ts +43 -0
- package/dist/packs/items/defaults.js +1504 -0
- package/dist/packs/items/defaults.js.map +1 -0
- package/dist/packs/items/index.d.ts +27 -0
- package/dist/packs/items/index.js +214 -0
- package/dist/packs/items/index.js.map +1 -0
- package/dist/packs/moba/index.d.ts +3 -3
- package/dist/packs/moba/index.js +174 -0
- package/dist/packs/moba/index.js.map +1 -0
- package/dist/packs/pack.d.ts +15 -15
- package/dist/packs/pack.js +14 -0
- package/dist/packs/pack.js.map +1 -0
- package/dist/packs.d.ts +15 -7
- package/dist/packs.js +222 -0
- package/dist/packs.js.map +1 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.js +109 -0
- package/dist/paths.js.map +1 -0
- package/dist/plain.js +57 -0
- package/dist/plain.js.map +1 -0
- package/dist/player.d.ts +33 -10
- package/dist/player.js +159 -0
- package/dist/player.js.map +1 -0
- package/dist/portals.d.ts +1 -1
- package/dist/portals.js +194 -0
- package/dist/portals.js.map +1 -0
- package/dist/prefabs.d.ts +25 -2
- package/dist/prefabs.js +239 -0
- package/dist/prefabs.js.map +1 -0
- package/dist/presetBuildings.js +58 -0
- package/dist/presetBuildings.js.map +1 -0
- package/dist/presetFoliage.d.ts +27 -0
- package/dist/presetFoliage.js +98 -0
- package/dist/presetFoliage.js.map +1 -0
- package/dist/presetGround.js +65 -0
- package/dist/presetGround.js.map +1 -0
- package/dist/proxies.d.ts +12 -0
- package/dist/proxies.js +79 -0
- package/dist/proxies.js.map +1 -0
- package/dist/query.d.ts +56 -0
- package/dist/query.js +88 -0
- package/dist/query.js.map +1 -0
- package/dist/races.d.ts +15 -14
- package/dist/races.js +172 -0
- package/dist/races.js.map +1 -0
- package/dist/randomGroups.js +91 -0
- package/dist/randomGroups.js.map +1 -0
- package/dist/registry.d.ts +117 -53
- package/dist/registry.js +323 -0
- package/dist/registry.js.map +1 -0
- package/dist/remains.d.ts +11 -9
- package/dist/remains.js +188 -0
- package/dist/remains.js.map +1 -0
- package/dist/replication.d.ts +12 -7
- package/dist/replication.js +100 -0
- package/dist/replication.js.map +1 -0
- package/dist/rng.d.ts +2 -0
- package/dist/rng.js +40 -0
- package/dist/rng.js.map +1 -0
- package/dist/rules.d.ts +186 -99
- package/dist/rules.js +179 -0
- package/dist/rules.js.map +1 -0
- package/dist/rulesCheck.d.ts +5 -4
- package/dist/rulesCheck.js +693 -0
- package/dist/rulesCheck.js.map +1 -0
- package/dist/runes.d.ts +2 -2
- package/dist/runes.js +80 -0
- package/dist/runes.js.map +1 -0
- package/dist/save.d.ts +37 -12
- package/dist/save.js +532 -0
- package/dist/save.js.map +1 -0
- package/dist/scenario.d.ts +2 -2
- package/dist/scenario.js +99 -0
- package/dist/scenario.js.map +1 -0
- package/dist/scheduler.d.ts +3 -0
- package/dist/scheduler.js +156 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/score.d.ts +19 -19
- package/dist/score.js +709 -0
- package/dist/score.js.map +1 -0
- package/dist/sequences.d.ts +10 -6
- package/dist/sequences.js +206 -0
- package/dist/sequences.js.map +1 -0
- package/dist/server/doorman.js +154 -0
- package/dist/server/doorman.js.map +1 -0
- package/dist/server/gameServer.d.ts +16 -1
- package/dist/server/gameServer.js +643 -0
- package/dist/server/gameServer.js.map +1 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/lobby.js +199 -0
- package/dist/server/lobby.js.map +1 -0
- package/dist/server/log.js +18 -0
- package/dist/server/log.js.map +1 -0
- package/dist/server/match.js +267 -0
- package/dist/server/match.js.map +1 -0
- package/dist/server/mode.d.ts +18 -9
- package/dist/server/mode.js +220 -0
- package/dist/server/mode.js.map +1 -0
- package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
- package/dist/server/navigation-worker.js.map +1 -0
- package/dist/server/navigation.js +39 -0
- package/dist/server/navigation.js.map +1 -0
- package/dist/server/ops.d.ts +4 -0
- package/dist/server/ops.js +137 -0
- package/dist/server/ops.js.map +1 -0
- package/dist/server/packs.d.ts +3 -3
- package/dist/server/packs.js +32 -0
- package/dist/server/packs.js.map +1 -0
- package/dist/server/ratings.d.ts +5 -0
- package/dist/server/ratings.js +104 -0
- package/dist/server/ratings.js.map +1 -0
- package/dist/server/relay.d.ts +12 -2
- package/dist/server/relay.js +144 -0
- package/dist/server/relay.js.map +1 -0
- package/dist/server/rooms.d.ts +9 -2
- package/dist/server/rooms.js +442 -0
- package/dist/server/rooms.js.map +1 -0
- package/dist/server/seat.js +116 -0
- package/dist/server/seat.js.map +1 -0
- package/dist/server/seatSettings.d.ts +3 -3
- package/dist/server/seatSettings.js +63 -0
- package/dist/server/seatSettings.js.map +1 -0
- package/dist/server/secret.js +13 -0
- package/dist/server/secret.js.map +1 -0
- package/dist/server/start.d.ts +13 -6
- package/dist/server/start.js +76 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/websocket.d.ts +9 -1
- package/dist/server/websocket.js +306 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/server.js +15 -2861
- package/dist/session/can.js +26 -0
- package/dist/session/can.js.map +1 -0
- package/dist/session/commandReplay.d.ts +8 -2
- package/dist/session/commandReplay.js +293 -0
- package/dist/session/commandReplay.js.map +1 -0
- package/dist/session/debug.js +151 -0
- package/dist/session/debug.js.map +1 -0
- package/dist/session/delay.js +62 -0
- package/dist/session/delay.js.map +1 -0
- package/dist/session/delta.d.ts +14 -1
- package/dist/session/delta.js +407 -0
- package/dist/session/delta.js.map +1 -0
- package/dist/session/entityState.js +415 -0
- package/dist/session/entityState.js.map +1 -0
- package/dist/session/local.d.ts +47 -5
- package/dist/session/local.js +670 -0
- package/dist/session/local.js.map +1 -0
- package/dist/session/memory.d.ts +20 -2
- package/dist/session/memory.js +131 -0
- package/dist/session/memory.js.map +1 -0
- package/dist/session/protocol.d.ts +325 -31
- package/dist/session/protocol.js +55 -0
- package/dist/session/protocol.js.map +1 -0
- package/dist/session/remote.d.ts +74 -12
- package/dist/session/remote.js +1394 -0
- package/dist/session/remote.js.map +1 -0
- package/dist/session/replay.d.ts +11 -2
- package/dist/session/replay.js +160 -0
- package/dist/session/replay.js.map +1 -0
- package/dist/session/seed.js +12 -0
- package/dist/session/seed.js.map +1 -0
- package/dist/session/share.d.ts +5 -1
- package/dist/session/share.js +94 -0
- package/dist/session/share.js.map +1 -0
- package/dist/session/socket.d.ts +1 -1
- package/dist/session/socket.js +29 -0
- package/dist/session/socket.js.map +1 -0
- package/dist/session/wire.d.ts +5 -0
- package/dist/session/wire.js +84 -0
- package/dist/session/wire.js.map +1 -0
- package/dist/session/worker.d.ts +77 -12
- package/dist/session/worker.js +499 -0
- package/dist/session/worker.js.map +1 -0
- package/dist/shared.d.ts +31 -5
- package/dist/shared.js +166 -0
- package/dist/shared.js.map +1 -0
- package/dist/sides.d.ts +9 -3
- package/dist/sides.js +149 -0
- package/dist/sides.js.map +1 -0
- package/dist/sight.js +85 -0
- package/dist/sight.js.map +1 -0
- package/dist/simulate-worker.js +1 -1
- package/dist/simulate.d.ts +12 -8
- package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
- package/dist/simulate.js.map +1 -0
- package/dist/smart.js +77 -0
- package/dist/smart.js.map +1 -0
- package/dist/spatial.d.ts +32 -16
- package/dist/spatial.js +234 -0
- package/dist/spatial.js.map +1 -0
- package/dist/spawning.d.ts +1 -0
- package/dist/spawning.js +224 -0
- package/dist/spawning.js.map +1 -0
- package/dist/stances.d.ts +6 -3
- package/dist/stances.js +169 -0
- package/dist/stances.js.map +1 -0
- package/dist/start.d.ts +10 -10
- package/dist/start.js +75 -0
- package/dist/start.js.map +1 -0
- package/dist/stats.d.ts +42 -16
- package/dist/stats.js +290 -0
- package/dist/stats.js.map +1 -0
- package/dist/summoned.d.ts +52 -0
- package/dist/summoned.js +38 -0
- package/dist/summoned.js.map +1 -0
- package/dist/summons.d.ts +10 -13
- package/dist/summons.js +271 -0
- package/dist/summons.js.map +1 -0
- package/dist/systems/abilities.js +224 -0
- package/dist/systems/abilities.js.map +1 -0
- package/dist/systems/combat.d.ts +35 -1
- package/dist/systems/combat.js +677 -0
- package/dist/systems/combat.js.map +1 -0
- package/dist/systems/combatTold.d.ts +3 -1
- package/dist/systems/combatTold.js +85 -0
- package/dist/systems/combatTold.js.map +1 -0
- package/dist/systems/construction.js +80 -0
- package/dist/systems/construction.js.map +1 -0
- package/dist/systems/economy.d.ts +0 -6
- package/dist/systems/economy.js +128 -0
- package/dist/systems/economy.js.map +1 -0
- package/dist/systems/fog.d.ts +1 -1
- package/dist/systems/fog.js +120 -0
- package/dist/systems/fog.js.map +1 -0
- package/dist/systems/life.js +32 -0
- package/dist/systems/life.js.map +1 -0
- package/dist/systems/movement.d.ts +24 -12
- package/dist/systems/movement.js +1247 -0
- package/dist/systems/movement.js.map +1 -0
- package/dist/systems/orders.js +64 -0
- package/dist/systems/orders.js.map +1 -0
- package/dist/systems/production.js +322 -0
- package/dist/systems/production.js.map +1 -0
- package/dist/systems/productionQueue.js +120 -0
- package/dist/systems/productionQueue.js.map +1 -0
- package/dist/systems/victory.d.ts +1 -1
- package/dist/systems/victory.js +56 -0
- package/dist/systems/victory.js.map +1 -0
- package/dist/talk.d.ts +6 -6
- package/dist/talk.js +153 -0
- package/dist/talk.js.map +1 -0
- package/dist/targeting.d.ts +142 -0
- package/dist/targeting.js +49 -0
- package/dist/targeting.js.map +1 -0
- package/dist/tech.d.ts +20 -3
- package/dist/tech.js +239 -0
- package/dist/tech.js.map +1 -0
- package/dist/techTree.d.ts +7 -0
- package/dist/techTree.js +90 -0
- package/dist/techTree.js.map +1 -0
- package/dist/terrain.d.ts +59 -7
- package/dist/terrain.js +389 -0
- package/dist/terrain.js.map +1 -0
- package/dist/terrainSave.d.ts +6 -0
- package/dist/terrainSave.js +74 -0
- package/dist/terrainSave.js.map +1 -0
- package/dist/testing.d.ts +8 -7
- package/dist/testing.js +13 -739
- package/dist/testing.js.map +1 -1
- package/dist/tiles.d.ts +1 -1
- package/dist/tiles.js +43 -0
- package/dist/tiles.js.map +1 -0
- package/dist/timers.d.ts +29 -4
- package/dist/timers.js +242 -0
- package/dist/timers.js.map +1 -0
- package/dist/tomes.d.ts +4 -4
- package/dist/tomes.js +94 -0
- package/dist/tomes.js.map +1 -0
- package/dist/trade.js +103 -0
- package/dist/trade.js.map +1 -0
- package/dist/transport.d.ts +6 -1
- package/dist/transport.js +281 -0
- package/dist/transport.js.map +1 -0
- package/dist/tunables.d.ts +10 -3
- package/dist/tunables.js +56 -0
- package/dist/tunables.js.map +1 -0
- package/dist/unitResources.d.ts +67 -0
- package/dist/unitResources.js +266 -0
- package/dist/unitResources.js.map +1 -0
- package/dist/upkeep.d.ts +6 -1
- package/dist/upkeep.js +26 -0
- package/dist/upkeep.js.map +1 -0
- package/dist/veterancy.d.ts +8 -3
- package/dist/veterancy.js +131 -0
- package/dist/veterancy.js.map +1 -0
- package/dist/vision.d.ts +36 -0
- package/dist/vision.js +133 -0
- package/dist/vision.js.map +1 -0
- package/dist/walls.d.ts +1 -1
- package/dist/walls.js +278 -0
- package/dist/walls.js.map +1 -0
- package/dist/world.d.ts +606 -88
- package/dist/world.js +1263 -0
- package/dist/world.js.map +1 -0
- package/package.json +2 -2
- package/dist/ai.js.map +0 -1
- package/dist/attributes.d.ts +0 -66
- package/dist/brain-BvVdUhX8.js +0 -7659
- package/dist/brain-BvVdUhX8.js.map +0 -1
- package/dist/builds-C6LfgvEU.js +0 -460
- package/dist/builds-C6LfgvEU.js.map +0 -1
- package/dist/coreComponents-syuh2fPG.js +0 -5149
- package/dist/coreComponents-syuh2fPG.js.map +0 -1
- package/dist/debugCommands-CzjrSm66.js +0 -14739
- package/dist/debugCommands-CzjrSm66.js.map +0 -1
- package/dist/determinism-BCymQwiE.js +0 -518
- package/dist/determinism-BCymQwiE.js.map +0 -1
- package/dist/game-DiJEN-Ks.js +0 -5800
- package/dist/game-DiJEN-Ks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/inspect-D9dWHmZ0.js.map +0 -1
- package/dist/local-Dkovq42k.js +0 -1379
- package/dist/local-Dkovq42k.js.map +0 -1
- package/dist/missionRules-C-bGxm0Q.js.map +0 -1
- package/dist/navigation-worker.js.map +0 -1
- package/dist/packs-g5thvmGn.js +0 -3199
- package/dist/packs-g5thvmGn.js.map +0 -1
- package/dist/profiles-B3NS9jwk.js.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/simulate-oXBiw1Ff.js.map +0 -1
package/dist/ai/brain.js
ADDED
|
@@ -0,0 +1,844 @@
|
|
|
1
|
+
import { plainParts } from "../plain.js";
|
|
2
|
+
import { debugChecks } from "../debug2.js";
|
|
3
|
+
import { rootLogger } from "../log.js";
|
|
4
|
+
import { Rng } from "../rng.js";
|
|
5
|
+
import { order } from "../scheduler.js";
|
|
6
|
+
import { AI_PHASES } from "./module.js";
|
|
7
|
+
import { ThinkBudget } from "./budget.js";
|
|
8
|
+
import { Decisions, explainGoal } from "./report.js";
|
|
9
|
+
import { AiView } from "./view.js";
|
|
10
|
+
import { Goals } from "./goals.js";
|
|
11
|
+
import { Knowledge } from "./knowledge.js";
|
|
12
|
+
import { Plans } from "./plans/plans.js";
|
|
13
|
+
import { Purse } from "./plans/purse.js";
|
|
14
|
+
import { resolveSettings } from "./settings.js";
|
|
15
|
+
import { resolveProfile } from "./profiles.js";
|
|
16
|
+
import { checkBrain, orderKey } from "./checks.js";
|
|
17
|
+
import { Squads } from "./squads.js";
|
|
18
|
+
//#region src/ai/brain.ts
|
|
19
|
+
/** A module definition's id, where it is known before the module is made: an object's, or a `defineModule`'s */
|
|
20
|
+
var idOf = (def) => typeof def === "function" ? def.id : def.id;
|
|
21
|
+
/**
|
|
22
|
+
* What of what its seat heard since it last thought a save keeps (`BrainMemory.heard`): the facts a brain reads (deaths,
|
|
23
|
+
* damage, healing, pings, chat, the game's own events). What is for the screen is left out: a builder's hammer blow
|
|
24
|
+
* comes of a timer no save keeps, and the answers to its own commands name the seat's numbering of them, which a loaded
|
|
25
|
+
* game's seat starts afresh
|
|
26
|
+
*/
|
|
27
|
+
var HEARD = /* @__PURE__ */ new Set([
|
|
28
|
+
"death",
|
|
29
|
+
"damage",
|
|
30
|
+
"heal",
|
|
31
|
+
"ping",
|
|
32
|
+
"chat",
|
|
33
|
+
"game"
|
|
34
|
+
]);
|
|
35
|
+
/** How much of each new think goes into a module's averaged time. Small: the panel shows a steady number */
|
|
36
|
+
var SMOOTHING = .1;
|
|
37
|
+
/** A timing averaged over thinks, the new one weighed in: the first stands as it is */
|
|
38
|
+
var averaged = (before, took) => before === void 0 ? took : before + (took - before) * SMOOTHING;
|
|
39
|
+
/**
|
|
40
|
+
* A computer player made of modules (`defineBrain`), seated at a world (`world.computers.seat`). What
|
|
41
|
+
* a module is handed as it thinks (`ai`): the picture of the game (`snapshot`), the seat it plays through (`session`),
|
|
42
|
+
* its options, its numbers (`rng`), its log, and `send` for its commands. A brain is a `ComputerPlayer`: `think`, and
|
|
43
|
+
* `save` and `restore` for what it remembers
|
|
44
|
+
*
|
|
45
|
+
* @beta
|
|
46
|
+
*/
|
|
47
|
+
var Brain = class {
|
|
48
|
+
def;
|
|
49
|
+
session;
|
|
50
|
+
options;
|
|
51
|
+
/** Its modules, in the order they run */
|
|
52
|
+
modules;
|
|
53
|
+
/**
|
|
54
|
+
* Its own numbers, for whatever it leaves to chance (which base to scout first): seeded from the world's and the
|
|
55
|
+
* player's, kept in its memory, so that the same game plays the same way. Never `Math.random`
|
|
56
|
+
*/
|
|
57
|
+
rng;
|
|
58
|
+
/** Where it says what it does: the world's log, with the player it plays and its brain on each line */
|
|
59
|
+
log;
|
|
60
|
+
/** Whether it sits still (`world.computers.pause`). Kept in a save */
|
|
61
|
+
paused = false;
|
|
62
|
+
/**
|
|
63
|
+
* What it sees, as of its last think: the snapshot of its seat, plain data, and the only input a brain has. Taken once
|
|
64
|
+
* a think: every module of the think reads the same picture
|
|
65
|
+
*/
|
|
66
|
+
snapshot;
|
|
67
|
+
/**
|
|
68
|
+
* Its reading of the picture (`AiView`): the snapshot indexed once a think and asked as sets (`view.mine.idle()`,
|
|
69
|
+
* `view.enemies.near(home, 20)`), with what unit types are for (`view.roles`) and the map's facts. What a module
|
|
70
|
+
* reads the game through
|
|
71
|
+
*/
|
|
72
|
+
view;
|
|
73
|
+
/**
|
|
74
|
+
* What it remembers of the enemy, the map and itself, with when (`Knowledge`): their bases and army as last seen,
|
|
75
|
+
* when each place was last looked at, its own losses and income. Brought up to date as each think begins, after the
|
|
76
|
+
* view; kept in a save
|
|
77
|
+
*/
|
|
78
|
+
knowledge;
|
|
79
|
+
/**
|
|
80
|
+
* What it could do (`Goals`): its goals scored each think from their considerations, the best given what they
|
|
81
|
+
* claim of its units and money, each run while it holds its claim. Its definition's goals and the seat's; a module
|
|
82
|
+
* adds its own (`ai.goals.add`). Picked by the `goals()` module, or by one of the brain's own in its place
|
|
83
|
+
*/
|
|
84
|
+
goals;
|
|
85
|
+
/**
|
|
86
|
+
* What it has to spend this think (`Purse`): its resources less what builders on their way will pay and what is
|
|
87
|
+
* held (a goal's money claim, a want saving up), rebuilt from the picture as each think begins. The one ledger:
|
|
88
|
+
* everything that spends, spends through it. `view.me.purse` is what is free
|
|
89
|
+
*/
|
|
90
|
+
purse;
|
|
91
|
+
/**
|
|
92
|
+
* Its plans (`Plans`): the build plan (`plans.build`: wants, the steps to each through the tech tree, spots,
|
|
93
|
+
* builders, saving up), the production plan (`plans.production`: the composition, counters, supply ahead,
|
|
94
|
+
* research), the game's build order over both, and `plans.want` to add to them. Run by the `build()` and
|
|
95
|
+
* `production()` modules, or by one of the brain's own
|
|
96
|
+
*/
|
|
97
|
+
plans;
|
|
98
|
+
/**
|
|
99
|
+
* Its squads (`Squads`): named groups of its units, each with a task (attack there, defend here, gather and go), made
|
|
100
|
+
* by its goals, rules and modules out of what they hold, and watched by the `squads()` module think after think:
|
|
101
|
+
* orders sent once and watched, regroups, retreats on the odds, reinforcements. Kept in a save
|
|
102
|
+
*/
|
|
103
|
+
squads;
|
|
104
|
+
/**
|
|
105
|
+
* How it plays (`AiProfile`), resolved (`resolveProfile`): how well it plays (the engine's, the game's, the
|
|
106
|
+
* difficulty's, the personality's, the seat's `every` and `budget`) and its settings, the brain's, the game's, the
|
|
107
|
+
* difficulty's, the personality's, the map's and the seat's each over the one before (a flag's function left out)
|
|
108
|
+
*/
|
|
109
|
+
profile;
|
|
110
|
+
/** Its settings' layers, lowest first (`ResolvedProfile.layers`): what `settings` is worked out from */
|
|
111
|
+
layers;
|
|
112
|
+
/** How many times it has thought */
|
|
113
|
+
thinks = 0;
|
|
114
|
+
/**
|
|
115
|
+
* What it decided, the last fifty (`decide`): the goals picked and stopped, with the reason that weighed most, and
|
|
116
|
+
* what its modules write down. Kept in a save
|
|
117
|
+
*/
|
|
118
|
+
decisions = new Decisions();
|
|
119
|
+
/** The board of its team, shared by its team's computers: what its seat was given (`BrainContext.team`), for its team play */
|
|
120
|
+
teamBoard;
|
|
121
|
+
/** Its areas, in the order they were made (`area`) */
|
|
122
|
+
areaList = [];
|
|
123
|
+
/** What a save remembered of areas not made yet, by id: taken by each as a module first asks for it */
|
|
124
|
+
waiting = {};
|
|
125
|
+
/** What was worked out for this think, by key (`cache`): thrown away with the picture */
|
|
126
|
+
memo = /* @__PURE__ */ new Map();
|
|
127
|
+
/**
|
|
128
|
+
* How strong things are (`Strength`): a unit, a group, one force against another (`odds`), what answers what
|
|
129
|
+
* (`counterFor`). The view's: the kit's formula unless the brain or the seat was given one
|
|
130
|
+
*/
|
|
131
|
+
get strength() {
|
|
132
|
+
return this.view.strength;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Where the strength is (`ThreatMap`): the friendly and the enemy strength that reaches each cell of a coarse grid
|
|
136
|
+
* over the map, by layer. Made from the think's picture when first asked; `threat.at(undefined)` is all zeros
|
|
137
|
+
*/
|
|
138
|
+
get threat() {
|
|
139
|
+
return this.view.threat;
|
|
140
|
+
}
|
|
141
|
+
/** Commands it sent this think */
|
|
142
|
+
sent = 0;
|
|
143
|
+
/** Commands it would have sent this think past what its profile lets a think send (`commandsPerThink`): not sent */
|
|
144
|
+
held = 0;
|
|
145
|
+
/**
|
|
146
|
+
* What its play adds up to since it was seated (`AiStats`): commands sent, held and refused, seconds its fighters
|
|
147
|
+
* stood idle, orders sent again for the same thing, seconds its building waited on money. For the report and
|
|
148
|
+
* `simulate`, never for a decision; not kept in a save
|
|
149
|
+
*/
|
|
150
|
+
stats = {
|
|
151
|
+
commands: 0,
|
|
152
|
+
held: 0,
|
|
153
|
+
refused: 0,
|
|
154
|
+
idleArmySeconds: 0,
|
|
155
|
+
churn: 0,
|
|
156
|
+
blockedOnMoney: 0,
|
|
157
|
+
thinks: 0
|
|
158
|
+
};
|
|
159
|
+
/** The tick of the think before, for what is counted by the seconds between thinks */
|
|
160
|
+
lastThink;
|
|
161
|
+
/** The last order each unit was sent, with the tick: what an order sent again for the same thing is counted against (`AiStats.churn`) */
|
|
162
|
+
lastOrders = /* @__PURE__ */ new Map();
|
|
163
|
+
/** The tick each unit was last told to cast: an order told again after a cast between is not counted as churn */
|
|
164
|
+
castAt = /* @__PURE__ */ new Map();
|
|
165
|
+
/**
|
|
166
|
+
* How much of a think one tick may do (`ThinkBudget`): so many modules, so many units looked at as the modules say
|
|
167
|
+
* (`budget.spent(n)`), the think going on at the next tick from where it stopped (`budget.later()`). Counted in work,
|
|
168
|
+
* never in milliseconds, so that the game is the same on every machine. What the seat was given (`BrainContext.budget`)
|
|
169
|
+
*/
|
|
170
|
+
budget;
|
|
171
|
+
/** Milliseconds each module took, averaged over thinks, by id: while the world profiles (`BrainContext.profiling`) */
|
|
172
|
+
moduleTiming = {};
|
|
173
|
+
/** The most milliseconds each module took in one pass, by id: always, as the warning (`ThinkBudgetOptions.warnAfterMs`) is */
|
|
174
|
+
moduleLongest = {};
|
|
175
|
+
/** Milliseconds taking the picture of the game took (the seat's `snapshot()`), averaged: while the world profiles */
|
|
176
|
+
snapshotTiming;
|
|
177
|
+
/** Milliseconds reading the picture into the view took (`AiView`, the ledger with it), averaged: while the world profiles */
|
|
178
|
+
viewTiming;
|
|
179
|
+
/** Milliseconds bringing the knowledge up to date took, averaged: while the world profiles */
|
|
180
|
+
knowledgeTiming;
|
|
181
|
+
/** Ticks the last think took, all its passes: 1 unless its budget sliced it */
|
|
182
|
+
thinkTicks = 0;
|
|
183
|
+
/** Ticks of the think under way so far */
|
|
184
|
+
ticksSoFar = 0;
|
|
185
|
+
/** The modules the log has warned of taking over `warnAfterMs`, once each */
|
|
186
|
+
warned = /* @__PURE__ */ new Set();
|
|
187
|
+
/**
|
|
188
|
+
* The passes of the think under way: each module run, with the units the tick had looked at before it. What a save in
|
|
189
|
+
* the middle of the think keeps (`BrainMemory.thinking`), kept only where the budget may slice
|
|
190
|
+
*/
|
|
191
|
+
passes = [];
|
|
192
|
+
heard = [];
|
|
193
|
+
/** Who follows its play from outside (`watch`): none in a game, so nothing is paid for it there */
|
|
194
|
+
watchers = [];
|
|
195
|
+
/** The module a think under way goes on from, at the next tick: none between thinks (`budget`) */
|
|
196
|
+
slice;
|
|
197
|
+
/**
|
|
198
|
+
* What it remembered as the think under way began, for a think sliced across ticks: what a save taken before the
|
|
199
|
+
* think ends keeps, with how far it got (`BrainMemory.thinking`)
|
|
200
|
+
*/
|
|
201
|
+
began;
|
|
202
|
+
/** The words told it since the think under way began: a save taken before it ends keeps them beside what it began with */
|
|
203
|
+
toldDuring = [];
|
|
204
|
+
/** A think a save was taken in the middle of: run again to where it was, then on, at the next tick (`restore`) */
|
|
205
|
+
resume;
|
|
206
|
+
/** While the modules a loaded game had run already are run again: nothing is sent, said or watched */
|
|
207
|
+
replaying = false;
|
|
208
|
+
/** While a pass is run again: how many of the words it was told the pass had heard then, the rest told it after */
|
|
209
|
+
replayHeard;
|
|
210
|
+
profiling;
|
|
211
|
+
constructor(def, session, options, context = {}) {
|
|
212
|
+
this.def = def;
|
|
213
|
+
this.session = session;
|
|
214
|
+
this.options = options;
|
|
215
|
+
this.rng = new Rng(context.seed ?? 1);
|
|
216
|
+
this.log = (session.log ?? rootLogger).child(() => ({ fields: {
|
|
217
|
+
ai: session.playerId,
|
|
218
|
+
brain: def.id
|
|
219
|
+
} }));
|
|
220
|
+
this.snapshot = session.snapshot();
|
|
221
|
+
const race = this.snapshot.players.find((player) => player.id === session.playerId)?.race;
|
|
222
|
+
const { profile, layers, unknown } = resolveProfile(options, session.registry, def.settings, race);
|
|
223
|
+
this.profile = profile;
|
|
224
|
+
this.layers = layers;
|
|
225
|
+
if (unknown.length) this.log.warn("ai", `the computer player is seated with a ${unknown.join(" and a ")} the game does not have: the defaults stand in`);
|
|
226
|
+
this.budget = new ThinkBudget(context.budget);
|
|
227
|
+
this.profiling = context.profiling ?? (() => false);
|
|
228
|
+
this.view = new AiView(this.snapshot, session, {
|
|
229
|
+
roles: options.roles,
|
|
230
|
+
strength: options.strength ?? def.strength
|
|
231
|
+
});
|
|
232
|
+
this.knowledge = new Knowledge(def.knowledge || {}, session.terrain, def.knowledge !== false);
|
|
233
|
+
this.goals = new Goals(this, def.picking);
|
|
234
|
+
this.goals.add(...def.goals ?? []);
|
|
235
|
+
this.purse = new Purse(session.registry);
|
|
236
|
+
this.purse.begin(this.view);
|
|
237
|
+
this.plans = new Plans(this, profile.plans ?? {});
|
|
238
|
+
this.squads = new Squads(this, profile.squads?.tasks);
|
|
239
|
+
this.teamBoard = context.team;
|
|
240
|
+
for (const area of [
|
|
241
|
+
this.knowledge,
|
|
242
|
+
this.goals,
|
|
243
|
+
this.plans,
|
|
244
|
+
this.squads
|
|
245
|
+
]) this.register(area);
|
|
246
|
+
this.goals.add(...options.goals ?? []);
|
|
247
|
+
const left = new Set(def.without ?? []);
|
|
248
|
+
const kept = def.modules.filter((module) => {
|
|
249
|
+
const id = idOf(module);
|
|
250
|
+
return id === void 0 || !left.has(id);
|
|
251
|
+
});
|
|
252
|
+
for (const id of left) if (!def.modules.some((module) => idOf(module) === id)) this.log.warn("ai", `the brain "${def.id}" leaves out a module "${id}" it does not have`);
|
|
253
|
+
const made = kept.map((module) => typeof module === "function" ? module(this) : module);
|
|
254
|
+
const ids = /* @__PURE__ */ new Set();
|
|
255
|
+
for (const module of made) {
|
|
256
|
+
if (ids.has(module.id)) throw new Error(`The brain "${def.id}" has two modules called "${module.id}"`);
|
|
257
|
+
ids.add(module.id);
|
|
258
|
+
}
|
|
259
|
+
let phase = 0;
|
|
260
|
+
const phased = made.map((module, listed) => {
|
|
261
|
+
if (module.phase) phase = AI_PHASES.indexOf(module.phase);
|
|
262
|
+
return {
|
|
263
|
+
module,
|
|
264
|
+
phase,
|
|
265
|
+
listed
|
|
266
|
+
};
|
|
267
|
+
});
|
|
268
|
+
phased.sort((a, b) => a.phase - b.phase || a.listed - b.listed);
|
|
269
|
+
this.modules = order(phased.map(({ module }) => ({
|
|
270
|
+
name: module.id,
|
|
271
|
+
before: module.before,
|
|
272
|
+
after: module.after,
|
|
273
|
+
module
|
|
274
|
+
}))).map((each) => each.module);
|
|
275
|
+
if (context.checks ?? debugChecks.ai) checkBrain(this);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* An area of its (`AiArea`): its economy (`ai.area(Economy)`), its scouting, a game's own (`defineArea`), made the
|
|
279
|
+
* first time it is asked for, with what a save remembered of it. What its modules share beyond what every module
|
|
280
|
+
* does (`knowledge`, `goals`, `plans`, `squads`, `purse`)
|
|
281
|
+
*/
|
|
282
|
+
area(key) {
|
|
283
|
+
const known = this.areaList.find((area) => area.id === key.id);
|
|
284
|
+
if (known) return known;
|
|
285
|
+
const made = key.make(this);
|
|
286
|
+
if (made.id !== key.id) throw new Error(`The area "${key.id}" made an area called "${made.id}"`);
|
|
287
|
+
this.register(made);
|
|
288
|
+
return made;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* An area made already, by id: none where no module has asked for it. For a part of the kit that reads another's
|
|
292
|
+
* area where there is one and needs nothing of it where there is none (whether a squad's fights are the micro's)
|
|
293
|
+
*/
|
|
294
|
+
made(id) {
|
|
295
|
+
return this.areaList.find((area) => area.id === id);
|
|
296
|
+
}
|
|
297
|
+
/** Its areas, in the order they were made: what its memory and its report are made of */
|
|
298
|
+
areas() {
|
|
299
|
+
return this.areaList;
|
|
300
|
+
}
|
|
301
|
+
/** Puts an area among its own, with what a save remembered of it */
|
|
302
|
+
register(area) {
|
|
303
|
+
this.areaList.push(area);
|
|
304
|
+
if (!(area.id in this.waiting)) return;
|
|
305
|
+
const memory = this.waiting[area.id];
|
|
306
|
+
delete this.waiting[area.id];
|
|
307
|
+
if (!area.restore(memory)) this.log.info("ai", area.afresh ?? `the save remembers the computer player's ${area.id} in a shape this brain does not read: it starts afresh`);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Follows its play from outside (`BrainWatcher`): the commands it sends, its thinks as each ends, what it decides.
|
|
311
|
+
* Returns the way to stop. What `watchComputer` and `recordDecisions` of `@v12-engine/engine/testing` stand on
|
|
312
|
+
*/
|
|
313
|
+
watch(watcher) {
|
|
314
|
+
this.watchers = [...this.watchers, watcher];
|
|
315
|
+
return () => {
|
|
316
|
+
this.watchers = this.watchers.filter((each) => each !== watcher);
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
/** The player it plays */
|
|
320
|
+
get playerId() {
|
|
321
|
+
return this.session.playerId;
|
|
322
|
+
}
|
|
323
|
+
/** The game's definitions, as the seat has them */
|
|
324
|
+
get registry() {
|
|
325
|
+
return this.session.registry;
|
|
326
|
+
}
|
|
327
|
+
/** The tick of its picture of the game */
|
|
328
|
+
get tick() {
|
|
329
|
+
return this.snapshot.tick;
|
|
330
|
+
}
|
|
331
|
+
/** Seconds into the game, as of its picture of it */
|
|
332
|
+
get time() {
|
|
333
|
+
return this.snapshot.tick / this.session.tickRate;
|
|
334
|
+
}
|
|
335
|
+
/** The player it plays, as its picture shows them: resources, supply, tech (`own`). Nothing once out of the game. `view.me` is the same, never nothing */
|
|
336
|
+
get me() {
|
|
337
|
+
return this.view.player(this.session.playerId);
|
|
338
|
+
}
|
|
339
|
+
module(key) {
|
|
340
|
+
const id = typeof key === "string" ? key : key.id;
|
|
341
|
+
return this.modules.find((module) => module.id === id);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* What its areas play by this think (`AiSettings`): its settings' layers worked out, a flag that is a function of the
|
|
345
|
+
* brain asked now. Each area reads its own (`ai.settings.economy`), over what its module was made with
|
|
346
|
+
*/
|
|
347
|
+
get settings() {
|
|
348
|
+
return this.cache("settings", () => resolveSettings(this.layers, this));
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* What was worked out once for this think, by key: a consideration asked by several goals, a set a few modules
|
|
352
|
+
* read (`ai.cache('intruders', () => ...)`). Thrown away as the next think takes its picture
|
|
353
|
+
*/
|
|
354
|
+
cache(key, compute) {
|
|
355
|
+
if (this.memo.has(key)) return this.memo.get(key);
|
|
356
|
+
const value = compute();
|
|
357
|
+
this.memo.set(key, value);
|
|
358
|
+
return value;
|
|
359
|
+
}
|
|
360
|
+
/** Whether a think is under way across ticks (`budget`): the seat asks it to think on at the next tick */
|
|
361
|
+
get busy() {
|
|
362
|
+
return this.slice !== void 0 || this.resume !== void 0;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* One think, or one tick of it. A new picture of the game is taken, and the modules run over it in their order, as
|
|
366
|
+
* many a tick as the budget allows (`budget`): so many modules, so many units looked at as they say. A module's error
|
|
367
|
+
* is the seat's to catch, as a system's is
|
|
368
|
+
*/
|
|
369
|
+
think() {
|
|
370
|
+
if (this.paused) return;
|
|
371
|
+
const resume = this.resume;
|
|
372
|
+
this.resume = void 0;
|
|
373
|
+
if (this.slice === void 0) {
|
|
374
|
+
const timed = this.profiling();
|
|
375
|
+
const start = timed ? performance.now() : 0;
|
|
376
|
+
const snapshot = resume?.snapshot ?? this.session.snapshot();
|
|
377
|
+
const taken = timed ? performance.now() : 0;
|
|
378
|
+
if (timed) this.snapshotTiming = averaged(this.snapshotTiming, taken - start);
|
|
379
|
+
if (snapshot.outcome !== "playing") return;
|
|
380
|
+
this.snapshot = snapshot;
|
|
381
|
+
this.memo.clear();
|
|
382
|
+
const before = this.view;
|
|
383
|
+
this.view = new AiView(snapshot, this.session, {
|
|
384
|
+
before,
|
|
385
|
+
roles: this.options.roles,
|
|
386
|
+
strength: this.options.strength ?? this.def.strength
|
|
387
|
+
});
|
|
388
|
+
const read = timed ? performance.now() : 0;
|
|
389
|
+
if (this.def.knowledge !== false) {
|
|
390
|
+
if (resume) this.knowledge.resume(this.view);
|
|
391
|
+
else this.knowledge.update(this.view, before);
|
|
392
|
+
this.view.me.income = this.knowledge.own.incomes();
|
|
393
|
+
}
|
|
394
|
+
const remembered = timed ? performance.now() : 0;
|
|
395
|
+
if (timed && this.def.knowledge !== false) this.knowledgeTiming = averaged(this.knowledgeTiming, remembered - read);
|
|
396
|
+
this.purse.begin(this.view);
|
|
397
|
+
const holds = this.goals.all();
|
|
398
|
+
for (const id in holds) if (holds[id].money) this.purse.reserve(id, holds[id].money);
|
|
399
|
+
this.view.me.purse = this.purse.free;
|
|
400
|
+
if (!resume) {
|
|
401
|
+
this.thinks++;
|
|
402
|
+
this.count();
|
|
403
|
+
}
|
|
404
|
+
this.sent = 0;
|
|
405
|
+
this.held = 0;
|
|
406
|
+
this.slice = 0;
|
|
407
|
+
this.passes = [];
|
|
408
|
+
this.ticksSoFar = 0;
|
|
409
|
+
if (timed) this.viewTiming = averaged(this.viewTiming, read - taken + (performance.now() - remembered));
|
|
410
|
+
if (this.budget.slices) {
|
|
411
|
+
this.began = this.memory();
|
|
412
|
+
this.toldDuring = [];
|
|
413
|
+
}
|
|
414
|
+
if (resume) {
|
|
415
|
+
this.replaying = true;
|
|
416
|
+
try {
|
|
417
|
+
for (const [module, units, heard] of resume.passes) {
|
|
418
|
+
this.slice = module;
|
|
419
|
+
this.budget.begin(units);
|
|
420
|
+
this.replayHeard = heard;
|
|
421
|
+
this.pass(module);
|
|
422
|
+
}
|
|
423
|
+
} finally {
|
|
424
|
+
this.replaying = false;
|
|
425
|
+
this.replayHeard = void 0;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
this.ticksSoFar++;
|
|
430
|
+
this.budget.begin();
|
|
431
|
+
let ran = 0;
|
|
432
|
+
let at = this.slice;
|
|
433
|
+
while (at < this.modules.length && ran < this.budget.modulesPerTick && this.budget.room) {
|
|
434
|
+
const module = this.modules[at];
|
|
435
|
+
const every = module.everyThinks ?? 1;
|
|
436
|
+
if (every !== 1 && (this.thinks - 1) % every !== (module.offset ?? 0) % every) {
|
|
437
|
+
at++;
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
ran++;
|
|
441
|
+
const more = this.pass(at);
|
|
442
|
+
at = this.slice;
|
|
443
|
+
if (!more) break;
|
|
444
|
+
}
|
|
445
|
+
this.slice = at;
|
|
446
|
+
if (at >= this.modules.length) {
|
|
447
|
+
this.slice = void 0;
|
|
448
|
+
this.began = void 0;
|
|
449
|
+
this.passes = [];
|
|
450
|
+
this.thinkTicks = this.ticksSoFar;
|
|
451
|
+
if (this.plans.build.savingFor !== void 0) this.stats.blockedOnMoney += this.sinceLastThink();
|
|
452
|
+
this.lastThink = this.tick;
|
|
453
|
+
for (const watcher of this.watchers) watcher.thought?.(this);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* One pass of a module: run once, timed, and the think moved on past it, unless it stopped for the tick with more to
|
|
458
|
+
* do (`budget.later()`), in which case it is where the think goes on at the next tick. Gives whether the think may go
|
|
459
|
+
* on this tick
|
|
460
|
+
*/
|
|
461
|
+
pass(index) {
|
|
462
|
+
const module = this.modules[index];
|
|
463
|
+
const { budget } = this;
|
|
464
|
+
const before = budget.units;
|
|
465
|
+
if (budget.slices) this.passes.push([
|
|
466
|
+
index,
|
|
467
|
+
before,
|
|
468
|
+
this.heard.length
|
|
469
|
+
]);
|
|
470
|
+
budget.deferred = false;
|
|
471
|
+
const start = performance.now();
|
|
472
|
+
module.think(this);
|
|
473
|
+
const took = performance.now() - start;
|
|
474
|
+
if (!(took <= (this.moduleLongest[module.id] ?? 0))) this.moduleLongest[module.id] = took;
|
|
475
|
+
if (this.profiling()) this.moduleTiming[module.id] = averaged(this.moduleTiming[module.id], took);
|
|
476
|
+
if (budget.warnAfterMs !== void 0 && took > budget.warnAfterMs && !this.warned.has(module.id) && !this.replaying) {
|
|
477
|
+
this.warned.add(module.id);
|
|
478
|
+
this.log.warn("ai", `the module "${module.id}" took ${took.toFixed(1)} ms, over ${budget.warnAfterMs}: said once`, {
|
|
479
|
+
module: module.id,
|
|
480
|
+
ms: Math.round(took * 100) / 100
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
if (budget.deferred) {
|
|
484
|
+
if (budget.units > before) return false;
|
|
485
|
+
if (!this.replaying && !this.warned.has(`later:${module.id}`)) {
|
|
486
|
+
this.warned.add(`later:${module.id}`);
|
|
487
|
+
this.log.warn("ai", `the module "${module.id}" asked to go on at the next tick having looked at nothing: taken to be done, said once`, { module: module.id });
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
this.slice = index + 1;
|
|
491
|
+
return budget.room;
|
|
492
|
+
}
|
|
493
|
+
/** Seconds between the think before and this one's picture: 0 for the first think */
|
|
494
|
+
sinceLastThink() {
|
|
495
|
+
return this.lastThink === void 0 ? 0 : (this.tick - this.lastThink) / this.session.tickRate;
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Counts, as a think begins, what its play adds up to (`stats`): the fighters that stood idle since the last think,
|
|
499
|
+
* the commands the game refused since, and the orders it no longer needs to remember for the churn
|
|
500
|
+
*/
|
|
501
|
+
count() {
|
|
502
|
+
const { stats, view } = this;
|
|
503
|
+
stats.thinks++;
|
|
504
|
+
const seconds = this.sinceLastThink();
|
|
505
|
+
if (seconds > 0) stats.idleArmySeconds += view.mine.fighters().idle().length * seconds;
|
|
506
|
+
for (const event of view.events.of("command")) if (event.refusal) stats.refused++;
|
|
507
|
+
const forgotten = this.tick - 5 * this.session.tickRate;
|
|
508
|
+
for (const [id, last] of this.lastOrders) if (last.tick < forgotten || !view.mine.has(id)) this.lastOrders.delete(id);
|
|
509
|
+
for (const [id, tick] of this.castAt) if (tick < forgotten || !view.mine.has(id)) this.castAt.delete(id);
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Sends a command, as the player would: counted (`sent`), carried out at the next tick. Returns the command's number;
|
|
513
|
+
* -1 for one past what its profile lets a think send (`commandsPerThink`, a person's hands), which is not sent
|
|
514
|
+
*/
|
|
515
|
+
send(command) {
|
|
516
|
+
if (this.replaying) {
|
|
517
|
+
this.sent++;
|
|
518
|
+
this.churn(command);
|
|
519
|
+
return -1;
|
|
520
|
+
}
|
|
521
|
+
const cap = this.profile.commandsPerThink;
|
|
522
|
+
if (cap !== void 0 && this.sent >= cap) {
|
|
523
|
+
this.held++;
|
|
524
|
+
this.stats.held++;
|
|
525
|
+
return -1;
|
|
526
|
+
}
|
|
527
|
+
this.sent++;
|
|
528
|
+
this.stats.commands++;
|
|
529
|
+
this.churn(command);
|
|
530
|
+
for (const watcher of this.watchers) watcher.sent?.(command, this);
|
|
531
|
+
return this.session.send(command);
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Counts an order sent to a unit for the same thing as its last within a few seconds (`AiStats.churn`): a unit told
|
|
535
|
+
* to attack-move there every think never arrives, it stops and starts. The squads send an order once and watch it;
|
|
536
|
+
* this is how a test or `simulate` sees that they do
|
|
537
|
+
*/
|
|
538
|
+
churn(command) {
|
|
539
|
+
const key = orderKey(command);
|
|
540
|
+
if (command.queue) return;
|
|
541
|
+
if (key === void 0) {
|
|
542
|
+
if (command.type === "cast") for (const id of command.entities) this.castAt.set(id, this.tick);
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
const window = 5 * this.session.tickRate;
|
|
546
|
+
for (const id of command.entities) {
|
|
547
|
+
const last = this.lastOrders.get(id);
|
|
548
|
+
const cast = this.castAt.get(id);
|
|
549
|
+
if (last && last.key === key && this.tick - last.tick <= window && !(cast !== void 0 && cast >= last.tick)) this.stats.churn++;
|
|
550
|
+
this.lastOrders.set(id, {
|
|
551
|
+
key,
|
|
552
|
+
tick: this.tick
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* The last order it sent a unit lately (within a few seconds), as a key (`orderKey`: its kind, its target, its
|
|
558
|
+
* place to the cell) with the tick: what keeps a module from telling a unit again what it is already doing, when the
|
|
559
|
+
* unit changed hands (a squad of another goal) since. None for a unit told nothing lately
|
|
560
|
+
*/
|
|
561
|
+
sentTo(unit) {
|
|
562
|
+
const last = this.lastOrders.get(unit);
|
|
563
|
+
return last && this.tick - last.tick <= 5 * this.session.tickRate ? last : void 0;
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* The words the game told it and no module has taken yet (`world.computers.tell`), oldest first; those of one word
|
|
567
|
+
* where given. Reading them takes nothing: `takeTold` does, as a told rule (`when.told`) does when it fires
|
|
568
|
+
*/
|
|
569
|
+
told(word) {
|
|
570
|
+
const heard = this.replayHeard === void 0 ? this.heard : this.heard.slice(0, this.replayHeard);
|
|
571
|
+
return word === void 0 ? heard : heard.filter((told) => told.word === word);
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Writes down a decision (`decisions`), with the reason that weighed most, in words: what the report's log and the
|
|
575
|
+
* debug panel show, and the world's log at its `debug` level. `kind` says what it is about (`army`, `build`)
|
|
576
|
+
*/
|
|
577
|
+
decide(line, about = {}) {
|
|
578
|
+
if (this.replaying) return;
|
|
579
|
+
const decision = {
|
|
580
|
+
tick: this.tick,
|
|
581
|
+
kind: about.kind ?? "other",
|
|
582
|
+
line,
|
|
583
|
+
...about.goal !== void 0 && { goal: about.goal }
|
|
584
|
+
};
|
|
585
|
+
this.decisions.add(decision);
|
|
586
|
+
for (const watcher of this.watchers) watcher.decided?.(decision, this);
|
|
587
|
+
if (this.log.says("debug")) this.log.debug("ai", line, {
|
|
588
|
+
player: this.playerId,
|
|
589
|
+
kind: decision.kind,
|
|
590
|
+
...about.goal !== void 0 && { goal: about.goal }
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* What it is thinking, as plain data (`AiReport`): its goals with their considerations, what it knows, its roles,
|
|
595
|
+
* its economy, what it was told, what it decided, and each module's section. Made when asked: nothing in a think
|
|
596
|
+
* waits for it. What `inspect` gives, and the debug panel's AI tab draws
|
|
597
|
+
*/
|
|
598
|
+
report() {
|
|
599
|
+
const { view } = this;
|
|
600
|
+
const me = view.me;
|
|
601
|
+
const sections = {};
|
|
602
|
+
const report = {
|
|
603
|
+
v: 1,
|
|
604
|
+
brain: this.def.id,
|
|
605
|
+
player: this.playerId,
|
|
606
|
+
tick: this.tick,
|
|
607
|
+
time: this.time,
|
|
608
|
+
tickRate: this.session.tickRate,
|
|
609
|
+
thinks: this.thinks,
|
|
610
|
+
...this.paused && { paused: true },
|
|
611
|
+
profile: plainParts(this.options).kept,
|
|
612
|
+
playing: plainParts(this.profile).kept,
|
|
613
|
+
...this.goals.best !== void 0 && { goal: this.goals.best },
|
|
614
|
+
goals: this.goals.report(),
|
|
615
|
+
...this.def.knowledge !== false && { knowledge: this.knowledge.inspect() },
|
|
616
|
+
roles: view.inspect().roles,
|
|
617
|
+
economy: {
|
|
618
|
+
resources: { ...me.resources },
|
|
619
|
+
income: { ...me.income ?? {} },
|
|
620
|
+
supply: [me.supplyUsed, me.supplyCap]
|
|
621
|
+
},
|
|
622
|
+
plans: this.plans.report(),
|
|
623
|
+
squads: this.squads.report(),
|
|
624
|
+
threat: threatOf(view.threat),
|
|
625
|
+
told: this.heard.map((told) => ({
|
|
626
|
+
word: told.word,
|
|
627
|
+
tick: told.tick
|
|
628
|
+
})),
|
|
629
|
+
sent: this.sent,
|
|
630
|
+
...this.held && { held: this.held },
|
|
631
|
+
...this.budget.slices && { budget: {
|
|
632
|
+
...this.budget.report(),
|
|
633
|
+
ticks: this.thinkTicks
|
|
634
|
+
} },
|
|
635
|
+
stats: { ...this.stats },
|
|
636
|
+
decisions: this.decisions.save(),
|
|
637
|
+
sections
|
|
638
|
+
};
|
|
639
|
+
for (const area of this.areaList) area.reportTo?.(report);
|
|
640
|
+
for (const module of this.modules) {
|
|
641
|
+
module.report?.(report);
|
|
642
|
+
const what = module.inspect?.();
|
|
643
|
+
if (what !== void 0) sections[module.id] = what;
|
|
644
|
+
}
|
|
645
|
+
return report;
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* A goal's row of the report as a sentence: what it scored and why, whether it runs and with what, or what kept it
|
|
649
|
+
* from running. Nothing for a goal the brain does not have
|
|
650
|
+
*/
|
|
651
|
+
explain(goal) {
|
|
652
|
+
const row = this.goals.report().find((each) => each.id === goal);
|
|
653
|
+
return row && explainGoal(row, (tick) => tick / this.session.tickRate, this.time);
|
|
654
|
+
}
|
|
655
|
+
/** Takes in a word from the game: a module takes it with `takeTold`. What the seat calls for `world.computers.tell` */
|
|
656
|
+
tell(word, data, tick) {
|
|
657
|
+
if (word === "resume" && this.paused) {
|
|
658
|
+
this.paused = false;
|
|
659
|
+
this.decide("resumes: told to", { kind: "word" });
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
this.heard.push({
|
|
663
|
+
word,
|
|
664
|
+
...data !== void 0 && { data },
|
|
665
|
+
tick
|
|
666
|
+
});
|
|
667
|
+
if (this.slice !== void 0 && this.began) this.toldDuring.push({
|
|
668
|
+
word,
|
|
669
|
+
...data !== void 0 && { data },
|
|
670
|
+
tick
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
/** Takes the words of one kind out of what it was told, oldest first, as many as `count` (all when left out): they are heard no more */
|
|
674
|
+
takeTold(word, count = Infinity) {
|
|
675
|
+
const taken = [];
|
|
676
|
+
const among = this.replayHeard ?? Infinity;
|
|
677
|
+
this.heard = this.heard.filter((told, index) => {
|
|
678
|
+
if (index >= among || told.word !== word || taken.length >= count) return true;
|
|
679
|
+
taken.push(told);
|
|
680
|
+
return false;
|
|
681
|
+
});
|
|
682
|
+
if (this.replayHeard !== void 0) this.replayHeard -= taken.length;
|
|
683
|
+
return taken;
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* What it remembers, for a save: its numbers, each module's memory with its version, what it was told. A think under
|
|
687
|
+
* way (`budget`) is kept as it began, with how far it got and its picture (`BrainMemory.thinking`): the game loaded
|
|
688
|
+
* from the save runs it on to its end as the saved game does
|
|
689
|
+
*/
|
|
690
|
+
save() {
|
|
691
|
+
const heard = this.session.can.computer?.pendingEvents().filter((event) => HEARD.has(event.type));
|
|
692
|
+
if (this.slice !== void 0 && this.began) return {
|
|
693
|
+
...this.began,
|
|
694
|
+
told: [...this.began.told, ...this.toldDuring.map((told) => ({ ...told }))],
|
|
695
|
+
...heard?.length && { heard },
|
|
696
|
+
...this.decisions.list().length > 0 && { decisions: this.decisions.save() },
|
|
697
|
+
thinking: {
|
|
698
|
+
snapshot: this.snapshot,
|
|
699
|
+
passes: this.passes.map((pass) => [...pass])
|
|
700
|
+
}
|
|
701
|
+
};
|
|
702
|
+
return {
|
|
703
|
+
...this.memory(),
|
|
704
|
+
...heard?.length && { heard }
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
/** What its areas remember, by id: those that remember anything, and what a save had of areas not made since */
|
|
708
|
+
areaMemories() {
|
|
709
|
+
const areas = { ...this.waiting };
|
|
710
|
+
for (const area of this.areaList) if (area.remembers()) areas[area.id] = area.save();
|
|
711
|
+
return areas;
|
|
712
|
+
}
|
|
713
|
+
/** What it remembers, but what its seat heard since it last thought */
|
|
714
|
+
memory() {
|
|
715
|
+
const modules = {};
|
|
716
|
+
for (const module of this.modules) {
|
|
717
|
+
const data = module.save?.();
|
|
718
|
+
if (data !== void 0) modules[module.id] = {
|
|
719
|
+
v: module.version ?? 1,
|
|
720
|
+
data
|
|
721
|
+
};
|
|
722
|
+
}
|
|
723
|
+
return {
|
|
724
|
+
v: 2,
|
|
725
|
+
rng: this.rng.save(),
|
|
726
|
+
thinks: this.thinks,
|
|
727
|
+
...this.paused && { paused: true },
|
|
728
|
+
told: this.heard.map((told) => ({ ...told })),
|
|
729
|
+
modules,
|
|
730
|
+
areas: this.areaMemories(),
|
|
731
|
+
...this.decisions.list().length > 0 && { decisions: this.decisions.save() },
|
|
732
|
+
...this.lastOrders.size > 0 && { orders: [...this.lastOrders].map(([unit, last]) => ({
|
|
733
|
+
unit,
|
|
734
|
+
...last
|
|
735
|
+
})) }
|
|
736
|
+
};
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* Takes back what `save` gave. A module's memory of another version goes through its `migrate`; without one, or with
|
|
740
|
+
* nothing in the save for it, the module starts afresh, and the log says so once. Memory of a module the brain no
|
|
741
|
+
* longer has is dropped, said too
|
|
742
|
+
*/
|
|
743
|
+
restore(memory) {
|
|
744
|
+
if (!memory || typeof memory !== "object" || memory.v !== 2) {
|
|
745
|
+
this.log.warn("ai", "the save remembers the computer player in a shape this brain does not read: it starts afresh", { brain: this.def.id });
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
748
|
+
this.rng.restore(memory.rng);
|
|
749
|
+
this.thinks = memory.thinks ?? 0;
|
|
750
|
+
this.resume = memory.thinking && {
|
|
751
|
+
snapshot: memory.thinking.snapshot,
|
|
752
|
+
passes: memory.thinking.passes ?? Array.from({ length: memory.thinking.slice ?? 0 }, (_, module) => [
|
|
753
|
+
module,
|
|
754
|
+
0,
|
|
755
|
+
(memory.told ?? []).length
|
|
756
|
+
])
|
|
757
|
+
};
|
|
758
|
+
this.paused = !!memory.paused;
|
|
759
|
+
this.heard = (memory.told ?? []).map((told) => ({ ...told }));
|
|
760
|
+
this.decisions.restore(memory.decisions);
|
|
761
|
+
this.lastOrders.clear();
|
|
762
|
+
for (const order of memory.orders ?? []) this.lastOrders.set(order.unit, {
|
|
763
|
+
key: order.key,
|
|
764
|
+
tick: order.tick
|
|
765
|
+
});
|
|
766
|
+
if (memory.heard?.length) this.session.can.computer?.restoreEvents(memory.heard);
|
|
767
|
+
this.waiting = { ...memory.areas };
|
|
768
|
+
for (const area of [...this.areaList]) {
|
|
769
|
+
if (!(area.id in this.waiting)) continue;
|
|
770
|
+
const kept = this.waiting[area.id];
|
|
771
|
+
delete this.waiting[area.id];
|
|
772
|
+
if (!area.restore(kept)) this.log.info("ai", area.afresh ?? `the save remembers the computer player's ${area.id} in a shape this brain does not read: it starts afresh`);
|
|
773
|
+
}
|
|
774
|
+
const read = /* @__PURE__ */ new Set();
|
|
775
|
+
for (const module of this.modules) {
|
|
776
|
+
let kept = memory.modules?.[module.id];
|
|
777
|
+
if (kept) read.add(module.id);
|
|
778
|
+
else for (const was of module.wasCalled ?? []) {
|
|
779
|
+
kept = memory.modules?.[was];
|
|
780
|
+
if (!kept) continue;
|
|
781
|
+
read.add(was);
|
|
782
|
+
this.log.info("ai", `the module "${module.id}" reads what the save kept as "${was}"`, {
|
|
783
|
+
module: module.id,
|
|
784
|
+
was
|
|
785
|
+
});
|
|
786
|
+
break;
|
|
787
|
+
}
|
|
788
|
+
if (!kept) {
|
|
789
|
+
if (module.save) this.log.info("ai", `the save has nothing for the module "${module.id}": it starts afresh`, { module: module.id });
|
|
790
|
+
continue;
|
|
791
|
+
}
|
|
792
|
+
const version = module.version ?? 1;
|
|
793
|
+
let data = kept.data;
|
|
794
|
+
if (kept.v !== version) {
|
|
795
|
+
data = module.migrate?.(kept.data, kept.v);
|
|
796
|
+
if (data === void 0) {
|
|
797
|
+
this.log.info("ai", `the module "${module.id}" saved version ${kept.v} and reads ${version}: it starts afresh`, {
|
|
798
|
+
module: module.id,
|
|
799
|
+
from: kept.v
|
|
800
|
+
});
|
|
801
|
+
continue;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
module.restore?.(data);
|
|
805
|
+
}
|
|
806
|
+
for (const id of Object.keys(memory.modules ?? {})) if (!this.module(id) && !read.has(id)) this.log.info("ai", `the save remembers a module "${id}" this brain does not have: dropped`, { module: id });
|
|
807
|
+
}
|
|
808
|
+
/** What it is thinking, for the debug tools: its report (`report`) */
|
|
809
|
+
inspect() {
|
|
810
|
+
return this.report();
|
|
811
|
+
}
|
|
812
|
+
/** Lets its modules go of what they hold outside the brain */
|
|
813
|
+
dispose() {
|
|
814
|
+
for (const module of this.modules) module.dispose?.();
|
|
815
|
+
}
|
|
816
|
+
};
|
|
817
|
+
/**
|
|
818
|
+
* Makes a brain from its definition for a seat: the session it plays through, the options it is seated with. What
|
|
819
|
+
* a brain's seat does (`createBrainSystem`); for a seat made another way (`createComputerSystem`'s `make`)
|
|
820
|
+
*
|
|
821
|
+
* @beta
|
|
822
|
+
*/
|
|
823
|
+
function createBrain(def, session, options, context = {}) {
|
|
824
|
+
return new Brain(def, session, options, context);
|
|
825
|
+
}
|
|
826
|
+
/** The threat map as the report has it: its cells with something in them, on the ground, what it remembers counted */
|
|
827
|
+
function threatOf(map) {
|
|
828
|
+
const round = (x) => Math.round(x * 10) / 10;
|
|
829
|
+
return {
|
|
830
|
+
cell: map.cell,
|
|
831
|
+
cols: map.cols,
|
|
832
|
+
rows: map.rows,
|
|
833
|
+
cells: map.cells({ remembered: true }).map((cell) => [
|
|
834
|
+
cell.col,
|
|
835
|
+
cell.row,
|
|
836
|
+
round(cell.friendly),
|
|
837
|
+
round(cell.enemy)
|
|
838
|
+
])
|
|
839
|
+
};
|
|
840
|
+
}
|
|
841
|
+
//#endregion
|
|
842
|
+
export { Brain, createBrain };
|
|
843
|
+
|
|
844
|
+
//# sourceMappingURL=brain.js.map
|